From a52990b794b985c0b502ddea2bda1f889b2537e6 Mon Sep 17 00:00:00 2001 From: Sushil Dubey Date: Wed, 15 Nov 2017 15:23:03 +0100 Subject: [PATCH 01/88] Implementation of the pixel raw to digi algorithm in CUDA --- .../SiPixelRawToDigi/plugins/BuildFile.xml | 3 +- .../SiPixelRawToDigi/plugins/CudaError.h | 9 + .../SiPixelRawToDigi/plugins/DetParamBits.h | 39 + .../SiPixelRawToDigi/plugins/EventInfoGPU.h | 11 + .../SiPixelRawToDigi/plugins/RawToDigiGPU.cu | 537 + .../SiPixelRawToDigi/plugins/RawToDigiGPU.h | 90 + .../SiPixelRawToDigi/plugins/RawToDigiMem.h | 33 + .../plugins/SiPixelRawToDigi.cc | 288 +- .../plugins/SiPixelRawToDigi.h | 15 + .../Pixel_Phase1_Raw2Digi_GPU_Cabling_Map.dat | 53377 ++++++++++++++++ EventFilter/SiPixelRawToDigi/test/README | 48 + .../SiPixelRawToDigi/test/RawId_moduleId.txt | 1857 + EventFilter/SiPixelRawToDigi/test/log.log | 3 + .../test/runRawToDigi_GPU_phase1.py | 75 + 14 files changed, 56268 insertions(+), 117 deletions(-) create mode 100644 EventFilter/SiPixelRawToDigi/plugins/CudaError.h create mode 100644 EventFilter/SiPixelRawToDigi/plugins/DetParamBits.h create mode 100644 EventFilter/SiPixelRawToDigi/plugins/EventInfoGPU.h create mode 100644 EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.cu create mode 100644 EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.h create mode 100644 EventFilter/SiPixelRawToDigi/plugins/RawToDigiMem.h create mode 100644 EventFilter/SiPixelRawToDigi/test/Pixel_Phase1_Raw2Digi_GPU_Cabling_Map.dat create mode 100644 EventFilter/SiPixelRawToDigi/test/README create mode 100644 EventFilter/SiPixelRawToDigi/test/RawId_moduleId.txt create mode 100644 EventFilter/SiPixelRawToDigi/test/log.log create mode 100644 EventFilter/SiPixelRawToDigi/test/runRawToDigi_GPU_phase1.py diff --git a/EventFilter/SiPixelRawToDigi/plugins/BuildFile.xml b/EventFilter/SiPixelRawToDigi/plugins/BuildFile.xml index 90fea254b67c4..c8cd3e9d29e08 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/BuildFile.xml +++ b/EventFilter/SiPixelRawToDigi/plugins/BuildFile.xml @@ -1,4 +1,5 @@ - + + diff --git a/EventFilter/SiPixelRawToDigi/plugins/CudaError.h b/EventFilter/SiPixelRawToDigi/plugins/CudaError.h new file mode 100644 index 0000000000000..cb673499700ed --- /dev/null +++ b/EventFilter/SiPixelRawToDigi/plugins/CudaError.h @@ -0,0 +1,9 @@ +/*Sushil Dubey, Shashi Dugad, TIFR +* +*/ +#ifndef CUDA_ERROR_H +#define CUDA_ERROR_H + +void checkCUDAError(const char *msg); + +#endif diff --git a/EventFilter/SiPixelRawToDigi/plugins/DetParamBits.h b/EventFilter/SiPixelRawToDigi/plugins/DetParamBits.h new file mode 100644 index 0000000000000..8cc944c3c7f25 --- /dev/null +++ b/EventFilter/SiPixelRawToDigi/plugins/DetParamBits.h @@ -0,0 +1,39 @@ +// Sushil Dubey, Shashi Dugad, TIFR +#ifndef DETPARAMBITS_H +#define DETPARAMBITS_H +typedef unsigned int uint; +//reference +//http://cmsdoxygen.web.cern.ch/cmsdoxygen/CMSSW_9_2_0/doc/html/d3/db2/PixelROC_8cc_source.html#l00197 +const uint layerStartBit_ = 20; +const uint ladderStartBit_ = 12; +const uint moduleStartBit_ = 2; + +const uint panelStartBit_ = 10; +const uint diskStartBit_ = 18; +const uint bladeStartBit_ = 12; + +const uint layerMask_ = 0xF; +const uint ladderMask_ = 0xFF; +const uint moduleMask_ = 0x3FF; +const uint panelMask_ = 0x3; +const uint diskMask_ = 0xF; +const uint bladeMask_ = 0x3F; + +// __host__ __device__ bool isBarrel(uint rawId) { +// return (1==((rawId>>25)&0x7)); +// } + +__host__ __device__ int getLayer(uint rawId) { + int layer = (rawId >> layerStartBit_) & layerMask_; + return layer; +} + +__host__ __device__ int getDisk(uint rawId) { + // int side =1; + // unsigned int panel = ((rawId>>panelStartBit_) & panelMask_); + // if(panel==1) side = -1; + unsigned int disk = int((rawId>>diskStartBit_) & diskMask_); + // return disk*side; + return disk; +} +#endif diff --git a/EventFilter/SiPixelRawToDigi/plugins/EventInfoGPU.h b/EventFilter/SiPixelRawToDigi/plugins/EventInfoGPU.h new file mode 100644 index 0000000000000..447cf32789033 --- /dev/null +++ b/EventFilter/SiPixelRawToDigi/plugins/EventInfoGPU.h @@ -0,0 +1,11 @@ +/*Sushil Dubey, Shashi Dugad, TIFR +*/ + +#ifndef EVENTINFO_GPU +#define EVENTINFO_GPU + +const int NEVENT = 128 ; //optimal number of events to run simultaneously, +// using 4 cuda stream, hence it should be multiple of 4 +const int NMODULE = 1856; // for phase 1, we have 1856 modules + +#endif diff --git a/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.cu b/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.cu new file mode 100644 index 0000000000000..fab50d47e6d78 --- /dev/null +++ b/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.cu @@ -0,0 +1,537 @@ +/* Sushil Dubey, Shashi Dugad, TIFR, July 2017 + * + * File Name: RawToDigiGPU.cu + * Description: It converts Raw data into Digi Format on GPU + * then it converts adc -> electron and + * applies the adc threshold to needed for clustering + * Finaly the Output of RawToDigi data is given to pixelClusterizer + * +**/ + +// System includes +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// CUDA runtime +#include +#include +#include "CudaError.h" +#include "EventInfoGPU.h" +#include "RawToDigiGPU.h" +#include "RawToDigiMem.h" +using namespace std; + +// // forward declaration of pixelCluster_wrapper() +// void PixelCluster_Wrapper(uint *xx_adc, uint *yy_adc, uint *adc_d,const uint wordCounter, +// const int *mIndexStart, const int *mIndexEnd); + +/* + This functions checks for cuda error + Input: debug message + Output: returns cuda error message +*/ +void checkCUDAError(const char *msg) { + cudaError_t err = cudaGetLastError(); + if( cudaSuccess != err) { + fprintf(stderr, "Cuda error: %s: %s.\n", msg, cudaGetErrorString( err) ); + exit(-1); + } +} + + +// New cabling Map +void initCablingMap() { + ifstream mapFile; + mapFile.open("Pixel_Phase1_Raw2Digi_GPU_Cabling_Map.dat"); + if(!mapFile) { + cout<<"Cabling Map file does not exist !"<> Index>>FedId>>Link>>idinLNK>>B_F>>RawID>>idinDU>>ModuleID; + Map->RawId[i] = RawID; + Map->rocInDet[i] = idinDU; + Map->moduleId[i] = ModuleID; + i++; + } + mapFile.close(); + cout<<"Cabling Map uploaded successfully!"<RawId, sizeByte); + cudaMallocManaged((void**)&Map->rocInDet, sizeByte); + cudaMallocManaged((void**)&Map->moduleId, sizeByte); + // Number of words for all the feds + uint MAX_WORD_SIZE = MAX_FED*MAX_WORD*NEVENT*sizeof(uint); + uint FSIZE = 2*MAX_FED*NEVENT*sizeof(uint)+sizeof(uint); + + int MSIZE = NMODULE*NEVENT*sizeof(int)+sizeof(int); + + cudaMalloc((void**)&eventIndex_d, (NEVENT+1)*sizeof(uint)); + + cudaMalloc((void**)&word_d, MAX_WORD_SIZE); + cudaMalloc((void**)&fedIndex_d, FSIZE); + cudaMalloc((void**)&xx_d, MAX_WORD_SIZE); // to store the x and y coordinate + cudaMalloc((void**)&yy_d, MAX_WORD_SIZE); + cudaMalloc((void**)&xx_adc, MAX_WORD_SIZE); // to store the x and y coordinate + cudaMalloc((void**)&yy_adc, MAX_WORD_SIZE); + cudaMalloc((void**)&adc_d, MAX_WORD_SIZE); + cudaMalloc((void**)&layer_d , MAX_WORD_SIZE); + + cudaMalloc((void**)&moduleId_d, MAX_WORD_SIZE); + cudaMalloc((void**)&mIndexStart_d, MSIZE); + cudaMalloc((void**)&mIndexEnd_d, MSIZE); + // create stream for RawToDigi + for(int i=0;iRawId); + cudaFree(Map->rocInDet); + cudaFree(Map->moduleId); + cudaFree(Map); + + // destroy the stream + for(int i=0;i> LINK_shift) & LINK_mask); +} + +__device__ uint getRoc(uint ww) { + return ((ww >> ROC_shift ) & ROC_mask); +} +__device__ uint getADC(uint ww) { + return ((ww >> ADC_shift) & ADC_mask); +} + +__device__ bool isBarrel(uint rawId) { + return (1==((rawId>>25)&0x7)); +} +//__device__ uint FED_START = 1200; + +__device__ DetIdGPU getRawId(const CablingMap *Map, uint fed, uint link, uint roc) { + uint index = fed * MAX_LINK* MAX_ROC + (link-1)* MAX_ROC + roc; + DetIdGPU detId = {Map->RawId[index], Map->rocInDet[index], Map->moduleId[index]}; + return detId; +} + +//reference http://cmsdoxygen.web.cern.ch/cmsdoxygen/CMSSW_9_2_0/doc/html/dd/d31/FrameConversion_8cc_source.html +//http://cmslxr.fnal.gov/source/CondFormats/SiPixelObjects/src/PixelROC.cc?v=CMSSW_9_2_0#0071 +// Convert local pixel to global pixel +__device__ Pixel frameConversion(bool bpix, int side, uint layer,uint rocIdInDetUnit, Pixel local) { + + int slopeRow = 0, slopeCol = 0; + int rowOffset = 0, colOffset = 0; + + if(bpix) { + + if(side==-1 && layer!=1) { // -Z side: 4 non-flipped modules oriented like 'dddd', except Layer 1 + if (rocIdInDetUnit <8) { + slopeRow = 1; + slopeCol = -1; + rowOffset = 0; + colOffset = (8-rocIdInDetUnit)*numColsInRoc-1; + } + else { + slopeRow = -1; + slopeCol = 1; + rowOffset = 2*numRowsInRoc-1; + colOffset = (rocIdInDetUnit-8)*numColsInRoc; + } // if roc + } + else { // +Z side: 4 non-flipped modules oriented like 'pppp', but all 8 in layer1 + if(rocIdInDetUnit <8) { + slopeRow = -1; + slopeCol = 1; + rowOffset = 2*numRowsInRoc-1; + colOffset = rocIdInDetUnit * numColsInRoc; + } + else { + slopeRow = 1; + slopeCol = -1; + rowOffset = 0; + colOffset = (16-rocIdInDetUnit)*numColsInRoc-1; + } + } + + } + else { // fpix + if(side==-1) { // pannel 1 + if (rocIdInDetUnit < 8) { + slopeRow = 1; + slopeCol = -1; + rowOffset = 0; + colOffset = (8-rocIdInDetUnit)*numColsInRoc-1; + } + else { + slopeRow = -1; + slopeCol = 1; + rowOffset = 2*numRowsInRoc-1; + colOffset = (rocIdInDetUnit-8)*numColsInRoc; + } + } + else { // pannel 2 + if (rocIdInDetUnit < 8) { + slopeRow = 1; + slopeCol = -1; + rowOffset = 0; + colOffset = (8-rocIdInDetUnit)*numColsInRoc-1; + } + else { + slopeRow = -1; + slopeCol = 1; + rowOffset = 2*numRowsInRoc-1; + colOffset = (rocIdInDetUnit-8)*numColsInRoc; + } + + } // side + + } + + uint gRow = rowOffset+slopeRow*local.row; + uint gCol = colOffset+slopeCol*local.col; + //printf("Inside frameConversion gRow: %u gCol: %u\n",gRow, gCol); + Pixel global = {gRow, gCol}; + return global; +} + + +/*---------- +* Name: applyADCthreshold_kernel() +* Desc: converts adc count to electrons and then applies the +* threshold on each channel. +* make pixel to 0 if it is below the threshold +* Input: xx_d[], yy_d[], layer_d[], wordCounter, adc[], ADCThreshold +*----------- +* Output: xx_adc[], yy_adc[] with pixel threshold applied +*/ +// kernel to apply adc threshold on the channels +__global__ void applyADCthreshold_kernel +(const uint *xx_d, const uint *yy_d, const uint *layer_d, uint *adc, const uint wordCounter, + const ADCThreshold adcThreshold, uint *xx_adc, uint *yy_adc ) { + int tid = threadIdx.x; + int gIndex = blockDim.x*blockIdx.x+tid; + if(gIndex=adcThreshold.theFirstStack_) { + if (adcThreshold.theStackADC_==1 && adcOld==1) { + adcNew = int(255*135); // Arbitrarily use overflow value. + } + if (adcThreshold.theStackADC_ >1 && adcThreshold.theStackADC_!=255 && adcOld>=1){ + adcNew = int((adcOld-1) * gain * 255/float(adcThreshold.theStackADC_-1)); + } + } + + if(adcNew >adcThreshold.thePixelThreshold ) { + xx_adc[gIndex]=xx_d[gIndex]; + yy_adc[gIndex]=yy_d[gIndex]; + } + else { + xx_adc[gIndex]=0; // 0: dead pixel + yy_adc[gIndex]=0; + } + adc[gIndex] = adcNew; + } +} + + +// Kernel to perform Raw to Digi conversion +__global__ void RawToDigi_kernel(const CablingMap *Map,const uint *Word,const uint *fedIndex, + uint *eventIndex,const uint stream, uint *XX, uint *YY, uint *moduleId, int *mIndexStart, + int *mIndexEnd, uint *ADC, uint *layerArr) +{ + uint blockId = blockIdx.x; + uint eventno = blockIdx.y + gridDim.y*stream; + + //const uint eventOffset = eventIndex[eventno]; + uint fedOffset = 2*MAX_FED*eventno; + + uint fedId = fedIndex[fedOffset+blockId]; + uint threadId = threadIdx.x; + + uint begin = fedIndex[fedOffset + MAX_FED+blockId]; + uint end = fedIndex[fedOffset + MAX_FED+blockId+1]; + + if(blockIdx.x==gridDim.x-1) { + end = eventIndex[eventno+1]; // for last fed to get the end index + } + + //if(threadId==0) printf("Event: %u blockId: %u start: %u end: %u\n", eventno, blockId, begin, end); + int no_itr = (end - begin)/blockDim.x + 1; // to deal with number of hits greater than blockDim.x + #pragma unroll + for(int i =0; i> layerStartBit_) & layerMask_; + //ladder = (rawId >> ladderStartBit_) & ladderMask_; + module = (rawId >> moduleStartBit_) & moduleMask_; + side = (module<5)? -1:1; + + } + else { + // endcap ids + layer = 0; + panel = (rawId >> panelStartBit_) & panelMask_; + //disk = (rawId >> diskStartBit_) & diskMask_ ; + side = (panel==1)? -1:1; + //blade = (rawId>>bladeStartBit_) & bladeMask_; + } + // ***special case of layer to 1 be handled here + Pixel localPix; + if(layer==1) { + uint col = (ww >> COL_shift) & COL_mask; + uint row = (ww >> ROW_shift) & ROW_mask; + localPix.row = row; + localPix.col = col; + } + else { + // ***conversion rules for dcol and pxid + uint dcol = (ww >> DCOL_shift) & DCOL_mask; + uint pxid = (ww >> PXID_shift) & PXID_mask; + uint row = numRowsInRoc - pxid/2; + uint col = dcol*2 + pxid%2; + localPix.row = row; + localPix.col = col; + } + + Pixel globalPix = frameConversion(barrel, side, layer,rocIdInDetUnit, localPix); + XX[gIndex] = globalPix.row+1 ; // origin shifting by 1 0-159 + YY[gIndex] = globalPix.col+1 ; // origin shifting by 1 0-415 + ADC[gIndex] = getADC(ww); + layerArr[gIndex] = layer; + moduleId[gIndex] = detId.moduleId; + } // end of if(gIndex < end) + } // end of for(int i =0;imoduleId[gIndex+1]) { + atomicExch(&moduleId[gIndex+1], atomicExch(&moduleId[gIndex], moduleId[gIndex+1])); + //*swap all the digi id + atomicExch(&XX[gIndex+1], atomicExch(&XX[gIndex], XX[gIndex+1])); + atomicExch(&YY[gIndex+1], atomicExch(&YY[gIndex], YY[gIndex+1])); + atomicExch(&ADC[gIndex+1], atomicExch(&ADC[gIndex], ADC[gIndex+1])); + atomicExch(&layerArr[gIndex+1], atomicExch(&layerArr[gIndex], layerArr[gIndex+1])); + } + + // moduleId== 9999 then pixel is bad with x=y=layer=adc=0 + // this bad pixel will not affect the cluster, since for cluster + // the origin is shifted at (1,1) so x=y=0 will be ignored + // assign the previous valid moduleId to this pixel to remove 9999 + // so that we can get the start & end index of module easily. + __syncthreads(); // let the swapping finish first + if(moduleId[gIndex]==9999) { + int m=gIndex; + while(moduleId[--m]==9999) {} //skip till you get the valid module + moduleId[gIndex]=moduleId[m]; + } + } // end of if(gIndex moduleId[gIndex-1] ) { + mIndexStart[moduleOffset+ moduleId[gIndex]] = gIndex; + } + } //end of if(gIndex!= begin && (gIndex<(end-1)) ... + } //end of if(gIndex >>(Map,word_d, fedIndex_d,eventIndex_d,i, xx_d, yy_d, moduleId_d, + mIndexStart_d, mIndexEnd_d, adc_d,layer_d); + } + + checkCUDAError("Error in RawToDigi_kernel"); + for (int i = 0; i>>(xx_d, yy_d,layer_d,adc_d,wordCounter,adcThreshold, xx_adc, yy_adc); + cudaDeviceSynchronize(); + checkCUDAError("Error in applying ADC threshold"); + cout << "Raw data is converted into digi for " << NEVENT << " Events" << endl; + + // copy data to host variable + // if you want to copy data after applying ADC threshold + if(convertADCtoElectrons) { + cudaMemcpy(xx_h, xx_adc, wordCounter*sizeof(uint), cudaMemcpyDeviceToHost); + cudaMemcpy(yy_h, yy_adc, wordCounter*sizeof(uint), cudaMemcpyDeviceToHost); + } + else { + cudaMemcpy(xx_h, xx_d, wordCounter*sizeof(uint), cudaMemcpyDeviceToHost); + cudaMemcpy(yy_h, yy_d, wordCounter*sizeof(uint), cudaMemcpyDeviceToHost); + } + cudaMemcpy(adc_h, adc_d, wordCounter*sizeof(uint), cudaMemcpyDeviceToHost); + + cudaMemcpy(mIndexStart_h, mIndexStart_d, NEVENT*NMODULE*sizeof(int), cudaMemcpyDeviceToHost); + cudaMemcpy(mIndexEnd_h, mIndexEnd_d, NEVENT*NMODULE*sizeof(int), cudaMemcpyDeviceToHost); + + // End of Raw2Digi and passing data for cluserisation + // PixelCluster_Wrapper(xx_adc , yy_adc, adc_d,wordCounter, mIndexStart_d, mIndexEnd_d); +} diff --git a/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.h b/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.h new file mode 100644 index 0000000000000..ede7f9f7f3583 --- /dev/null +++ b/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.h @@ -0,0 +1,90 @@ +/*Sushil Dubey, Shashi Dugad, TIFR + * + */ + +#ifndef RAWTODIGIGPU_H +#define RAWTODIGIGPU_H +//typedef unsigned long long Word64; +typedef unsigned int uint; + +const uint layerStartBit_ = 20; +const uint ladderStartBit_ = 12; +const uint moduleStartBit_ = 2; + +const uint panelStartBit_ = 10; +const uint diskStartBit_ = 18; +const uint bladeStartBit_ = 12; + +const uint layerMask_ = 0xF; +const uint ladderMask_ = 0xFF; +const uint moduleMask_ = 0x3FF; +const uint panelMask_ = 0x3; +const uint diskMask_ = 0xF; +const uint bladeMask_ = 0x3F; + +const uint LINK_bits = 6; +const uint ROC_bits = 5; +const uint DCOL_bits = 5; +const uint PXID_bits = 8; +const uint ADC_bits = 8; +// special for layer 1 +const uint LINK_bits1 = 6; +const uint ROC_bits1 = 5; +const uint COL_bits1_l1 = 6; +const uint ROW_bits1_l1 = 7; + +const uint maxROCIndex = 8; +const uint numRowsInRoc = 80; +const uint numColsInRoc = 52; + +// Maximum fed for phase1 is 150 but not all of them are filled +// Update the number FED based on maximum fed found in the cabling map + const uint MAX_FED = 150; + const uint MAX_LINK = 48; //maximum links/channels for phase1 + const uint MAX_ROC = 8; + const uint MAX_WORD = 2000;//500; + const int NSTREAM = 4; + + const uint ADC_shift = 0; + const uint PXID_shift = ADC_shift + ADC_bits; + const uint DCOL_shift = PXID_shift + PXID_bits; + const uint ROC_shift = DCOL_shift + DCOL_bits; + const uint LINK_shift = ROC_shift + ROC_bits1; +// special for layer 1 ROC + const uint ROW_shift = ADC_shift + ADC_bits; + const uint COL_shift = ROW_shift + ROW_bits1_l1; + + const uint LINK_mask = ~(~uint(0) << LINK_bits1); + const uint ROC_mask = ~(~uint(0) << ROC_bits1); + const uint COL_mask = ~(~uint(0) << COL_bits1_l1); + const uint ROW_mask = ~(~uint(0) << ROW_bits1_l1); + const uint DCOL_mask = ~(~uint(0) << DCOL_bits); + const uint PXID_mask = ~(~uint(0) << PXID_bits); + const uint ADC_mask = ~(~uint(0) << ADC_bits); + +struct DetIdGPU { + uint RawId; + uint rocInDet; + uint moduleId; +}; + +struct Pixel { + uint row; + uint col; +}; + +struct CablingMap{ + uint *RawId; + uint *rocInDet; + uint *moduleId; +}; + + //CablingMap *Map; + //GPU specific + uint *word_d, *fedIndex_d, *eventIndex_d; // Device copy of input data + uint *xx_d, *yy_d,*xx_adc, *yy_adc, *moduleId_d, *adc_d, *layer_d; // Device copy + // store the start and end index for each module (total 1856 modules-phase 1) + cudaStream_t stream[NSTREAM]; + int *mIndexStart_d, *mIndexEnd_d; + CablingMap *Map; +#endif diff --git a/EventFilter/SiPixelRawToDigi/plugins/RawToDigiMem.h b/EventFilter/SiPixelRawToDigi/plugins/RawToDigiMem.h new file mode 100644 index 0000000000000..8fa2cc2f687c1 --- /dev/null +++ b/EventFilter/SiPixelRawToDigi/plugins/RawToDigiMem.h @@ -0,0 +1,33 @@ +/* Sushil Dubey, Shashi Dugad, TIFR +* +*/ + + +#ifndef RAWTODIGI_CPU_GPU_H +#define RAWTODIGI_CPU_GPU_H + +// wrapper function to call RawToDigi on the GPU from host side +void RawToDigi_wrapper (const uint wordCounter, uint *word, const uint fedCounter, uint *fedIndex, + uint *eventIndex, bool convertADCtoElectrons, uint *xx_h, uint *yy_h, uint *adc_h, int *mIndexStart_h, + int *mIndexEnd_h); + +void initCablingMap(); +void initDeviceMemory(); +void freeMemory(); + +// reference cmssw/RecoLocalTracker/SiPixelClusterizer +// all are runtime const, should be specified in python _cfg.py +struct ADCThreshold { + const int thePixelThreshold = 1000; // default Pixel threshold in electrons + const int theSeedThreshold = 1000; //seed thershold in electrons not used in our algo + const float theClusterThreshold = 4000; // Cluster threshold in electron + const int ConversionFactor = 65; // adc to electron conversion factor + + // following are the default value + // it should be i python script + const int theStackADC_ = 255; // the maximum adc count for stack layer + const int theFirstStack_ = 5; // the index of the fits stack layer + const double theElectronPerADCGain_ = 600; //ADC to electron conversion + +}; +#endif diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigi.cc b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigi.cc index 9b93f63741df4..15fb0e2b99333 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigi.cc +++ b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigi.cc @@ -6,7 +6,8 @@ // Jan 2016 Tamas Almos Vami (Tav) (Wigner RCP) -- Cabling Map label option // Jul 2017 Viktor Veszpremi -- added PixelFEDChannel -#include "SiPixelRawToDigi.h" +// This code is an entry point for GPU based pixel track reconstruction for HLT +// Modified by Sushil and Shashi for this purpose July-2017 #include "DataFormats/Common/interface/Handle.h" #include "FWCore/Framework/interface/ESHandle.h" @@ -36,8 +37,26 @@ #include "EventFilter/SiPixelRawToDigi/interface/PixelUnpackingRegions.h" #include "FWCore/Framework/interface/ConsumesCollector.h" +#include "FWCore/PluginManager/interface/ModuleDef.h" +#include "FWCore/Framework/interface/MakerMacros.h" + #include "TH1D.h" #include "TFile.h" +#include "SiPixelRawToDigi.h" +#include +#include +#include +#include + +#include // for GPU +#include // for pinned memory +#include "EventInfoGPU.h" // Event Info +// device memory intialization for RawTodigi +#include "RawToDigiMem.h" +// // device memory initialization for CPE +// #include "CPEGPUMem.h" +// //device memory initialization for clustering +// #include "PixelClusterMem.h" using namespace std; @@ -103,7 +122,37 @@ SiPixelRawToDigi::SiPixelRawToDigi( const edm::ParameterSet& conf ) } //CablingMap could have a label //Tav cablingMapLabel = config_.getParameter ("CablingMapLabel"); - + + //GPU specific + convertADCtoElectrons = config_.getParameter("ConvertADCtoElectrons"); + const int MAX_FED = 150; + const int MAX_WORD = 2000; + int WSIZE = MAX_FED*MAX_WORD*NEVENT*sizeof(unsigned int); + int FSIZE = 2*MAX_FED*NEVENT*sizeof(unsigned int)+sizeof(unsigned int); + + //word = (unsigned int*)malloc(WSIZE); + cudaMallocHost((void**)&word, WSIZE); + //fedIndex =(unsigned int*)malloc(FSIZE); + cudaMallocHost((void**)&fedIndex, FSIZE); + eventIndex = (unsigned int*)malloc((NEVENT+1)*sizeof(unsigned int)); + eventIndex[0] =0; + // to store the output of RawToDigi + xx_h = new uint[WSIZE]; + yy_h = new uint[WSIZE]; + adc_h = new uint[WSIZE]; + + mIndexStart_h = new int[NEVENT*NMODULE +1]; + mIndexEnd_h = new int[NEVENT*NMODULE +1]; + + // allocate memory for RawToDigi on GPU + initDeviceMemory(); + + // // allocate auxilary memory for clustering + // initDeviceMemCluster(); + + // // allocate memory for CPE on GPU + // initDeviceMemCPE(); + } @@ -118,7 +167,22 @@ SiPixelRawToDigi::~SiPixelRawToDigi() { hCPU->Write(); hDigi->Write(); } - + // free(word); + cudaFreeHost(word); + // free(fedIndex); + cudaFreeHost(fedIndex); + free(eventIndex); + delete[] xx_h; + delete[] yy_h; + delete[] adc_h; + delete[] mIndexStart_h; + delete[] mIndexEnd_h; + // free device memory used for RawToDigi on GPU + freeMemory(); + // free auxilary memory used for clustering + // freeDeviceMemCluster(); + // free device memory used for CPE on GPU + // freeDeviceMemCPE(); } void @@ -152,6 +216,7 @@ SiPixelRawToDigi::fillDescriptions(edm::ConfigurationDescriptions& descriptions) desc.add("UsePhase1",false)->setComment("## Use phase1"); desc.add("CablingMapLabel","")->setComment("CablingMap label"); //Tav desc.addOptional("CheckPixelOrder"); // never used, kept for back-compatibility + desc.add("ConvertADCtoElectrons", false)->setComment("## do the calibration ADC-> Electron and apply the threshold, requried for clustering"); descriptions.add("siPixelRawToDigi",desc); } @@ -162,19 +227,20 @@ SiPixelRawToDigi::fillDescriptions(edm::ConfigurationDescriptions& descriptions) void SiPixelRawToDigi::produce( edm::Event& ev, const edm::EventSetup& es) { - const uint32_t dummydetid = 0xffffffff; - debug = edm::MessageDrop::instance()->debugEnabled; + //const uint32_t dummydetid = 0xffffffff; + //debug = edm::MessageDrop::instance()->debugEnabled; -// initialize cabling map or update if necessary + // initialize cabling map or update if necessary if (recordWatcher.check( es )) { // cabling map, which maps online address (fed->link->ROC->local pixel) to offline (DetId->global pixel) edm::ESTransientHandle cablingMap; es.get().get( cablingMapLabel, cablingMap ); //Tav fedIds = cablingMap->fedIds(); - cabling_ = cablingMap->cablingTree(); - LogDebug("map version:")<< cabling_->version(); + // cabling_ = cablingMap->cablingTree(); + // LogDebug("map version:")<< cabling_->version(); } -// initialize quality record or update if necessary + +/* // initialize quality record or update if necessary if (qualityWatcher.check( es )&&useQuality) { // quality info for dead pixel modules or ROCs edm::ESHandle qualityInfo; @@ -183,12 +249,12 @@ void SiPixelRawToDigi::produce( edm::Event& ev, if (!badPixelInfo_) { edm::LogError("SiPixelQualityNotPresent")<<" Configured to use SiPixelQuality, but SiPixelQuality not present"< buffers; ev.getByToken(tFEDRawDataCollection, buffers); -// create product (digis & errors) + /*// create product (digis & errors) auto collection = std::make_unique>(); // collection->reserve(8*1024); auto errorcollection = std::make_unique>(); @@ -212,115 +278,105 @@ void SiPixelRawToDigi::produce( edm::Event& ev, formatter.setModulesToUnpack(regions_->modulesToUnpack()); LogDebug("SiPixelRawToDigi") << "region2unpack #feds: "<nFEDs(); LogDebug("SiPixelRawToDigi") << "region2unpack #modules (BPIX,EPIX,total): "<nBarrelModules()<<" "<nForwardModules()<<" "<nModules(); - } - + }*/ + // GPU specific: Data extraction for RawToDigi GPU + static unsigned int wordCounterGPU =0; + unsigned int fedCounter = 0; + const unsigned int MAX_FED = 150; + static int eventCount = 0; + bool errorsInEvent = false; + + ErrorChecker errorcheck; for (auto aFed = fedIds.begin(); aFed != fedIds.end(); ++aFed) { int fedId = *aFed; + + // for GPU + // first 150 index stores the fedId and next 150 will store the + // start index of word in that fed + fedIndex[2*MAX_FED*eventCount+fedCounter] = fedId-1200; + fedIndex[MAX_FED + 2*MAX_FED*eventCount+fedCounter] = wordCounterGPU; // MAX_FED = 150 + fedCounter++; - if(!usePilotBlade && (fedId==40) ) continue; // skip pilot blade data - - if (regions_ && !regions_->mayUnpackFED(fedId)) continue; - - if(debug) LogDebug("SiPixelRawToDigi")<< " PRODUCE DIGI FOR FED: " << fedId << endl; - + //get event data for this fed + const FEDRawData& rawData = buffers->FEDData( fedId ); + //GPU specific PixelDataFormatter::Errors errors; + int nWords = rawData.size()/sizeof(Word64); + if(nWords==0) { + word[wordCounterGPU++] =0; + continue; + } + + // check CRC bit + const Word64* trailer = reinterpret_cast(rawData.data())+(nWords-1); + if(!errorcheck.checkCRC(errorsInEvent, fedId, trailer, errors)) { + word[wordCounterGPU++] =0; + continue; + } - //get event data for this fed - const FEDRawData& fedRawData = buffers->FEDData( fedId ); - - //convert data to digi and strip off errors - formatter.interpretRawData( errorsInEvent, fedId, fedRawData, *collection, errors); - - //pack errors into collection - if(includeErrors) { - typedef PixelDataFormatter::Errors::iterator IE; - for (IE is = errors.begin(); is != errors.end(); is++) { - uint32_t errordetid = is->first; - if (errordetid==dummydetid) { // errors given dummy detId must be sorted by Fed - nodeterrors.insert( nodeterrors.end(), errors[errordetid].begin(), errors[errordetid].end() ); - } else { - edm::DetSet& errorDetSet = errorcollection->find_or_insert(errordetid); - errorDetSet.data.insert(errorDetSet.data.end(), is->second.begin(), is->second.end()); - // Fill detid of the detectors where there is error AND the error number is listed - // in the configurable error list in the job option cfi. - // Code needs to be here, because there can be a set of errors for each - // entry in the for loop over PixelDataFormatter::Errors - - std::vector disabledChannelsDetSet; - - for (auto const& aPixelError : errorDetSet) { - // For the time being, we extend the error handling functionality with ErrorType 25 - // In the future, we should sort out how the usage of tkerrorlist can be generalized - if (aPixelError.getType()==25) { - assert(aPixelError.getFedId()==fedId); - const sipixelobjects::PixelFEDCabling* fed = cabling_->fed(fedId); - if (fed) { - cms_uint32_t linkId = formatter.linkId(aPixelError.getWord32()); - const sipixelobjects::PixelFEDLink* link = fed->link(linkId); - if (link) { - // The "offline" 0..15 numbering is fixed by definition, also, the FrameConversion depends on it - // in contrast, the ROC-in-channel numbering is determined by hardware --> better to use the "offline" scheme - PixelFEDChannel ch = {fed->id(), linkId, 25, 0}; - for (unsigned int iRoc=1; iRoc<=link->numberOfROCs(); iRoc++) { - const sipixelobjects::PixelROC * roc = link->roc(iRoc); - if (roc->idInDetUnit()idInDetUnit(); - if (roc->idInDetUnit()>ch.roc_last) ch.roc_last=roc->idInDetUnit(); - } - disabledChannelsDetSet.push_back(ch); - } - } - } else { - // fill list of detIds to be turned off by tracking - if(!tkerrorlist.empty()) { - std::vector::iterator it_find = find(tkerrorlist.begin(), tkerrorlist.end(), aPixelError.getType()); - if(it_find != tkerrorlist.end()){ - tkerror_detidcollection->push_back(errordetid); - } - } - } - - // fill list of detIds with errors to be studied - if(!usererrorlist.empty()) { - std::vector::iterator it_find = find(usererrorlist.begin(), usererrorlist.end(), aPixelError.getType()); - if(it_find != usererrorlist.end()){ - usererror_detidcollection->push_back(errordetid); - } - } - - } // loop on DetSet of errors - - if (!disabledChannelsDetSet.empty()) { - disabled_channelcollection->insert(errordetid, disabledChannelsDetSet.data(), disabledChannelsDetSet.size()); - } - - } // if error assigned to a real DetId - } // loop on errors in event for this FED - } // if errors to be included in the event - } // loop on FED data to be unpacked - - if(includeErrors) { - edm::DetSet& errorDetSet = errorcollection->find_or_insert(dummydetid); - errorDetSet.data = nodeterrors; - } - if (errorsInEvent) LogDebug("SiPixelRawToDigi") << "Error words were stored in this event"; + // check headers + const Word64* header = reinterpret_cast(rawData.data()); header--; + bool moreHeaders = true; + while (moreHeaders) { + header++; + //LogTrace("")<<"HEADER: " << print(*header); + bool headerStatus = errorcheck.checkHeader(errorsInEvent, fedId, header, errors); + moreHeaders = headerStatus; + } - if (theTimer) { - theTimer->stop(); - LogDebug("SiPixelRawToDigi") << "TIMING IS: (real)" << theTimer->realTime() ; - ndigis += formatter.nDigis(); - nwords += formatter.nWords(); - LogDebug("SiPixelRawToDigi") << " (Words/Digis) this ev: " - <Fill( theTimer->realTime() ); - hDigi->Fill(formatter.nDigis()); - } + // check trailers + bool moreTrailers = true; + trailer++; + while (moreTrailers) { + trailer--; + //LogTrace("")<<"TRAILER: " << print(*trailer); + bool trailerStatus = errorcheck.checkTrailer(errorsInEvent, fedId, nWords, trailer, errors); + moreTrailers = trailerStatus; + } - //send digis and errors back to framework - ev.put(std::move(collection)); - if(includeErrors){ - ev.put(std::move(errorcollection)); - ev.put(std::move(tkerror_detidcollection)); - ev.put(std::move(usererror_detidcollection), "UserErrorModules"); - ev.put(std::move(disabled_channelcollection)); - } -} + const Word32 * bw =(const Word32 *)(header+1); + const Word32 * ew =(const Word32 *)(trailer); + if ( *(ew-1) == 0 ) { ew--; } + for (auto ww = bw; ww < ew; ++ww) { + word[wordCounterGPU++] = *ww; + } + } // end of for loop + + // GPU specific: RawToDigi -> clustering -> CPE + eventCount++; + eventIndex[eventCount] = wordCounterGPU; + static int ec=1; + cout<<"Data read for event: "< { static void fillDescriptions(edm::ConfigurationDescriptions& descriptions); /// get data, convert to digis attach againe to Event + void produce( edm::Event&, const edm::EventSetup& ) override; private: @@ -61,5 +62,19 @@ class SiPixelRawToDigi : public edm::stream::EDProducer<> { bool usePilotBlade; bool usePhase1; std::string cablingMapLabel; + typedef cms_uint32_t Word32; + typedef cms_uint64_t Word64; + + bool convertADCtoElectrons; + unsigned int *word; // to hold input for rawtodigi + unsigned int *fedIndex; // to hold fed index inside word[] array for rawtodigi on GPU + unsigned int *eventIndex; // to store staring index of each event in word[] array + + // to store the output + // uint *word_h, *fedIndex_h, *eventIndex_h; // host copy of input data + uint *xx_h, *yy_h, *adc_h; // host copy of output + // store the start and end index for each module (total 1856 modules-phase 1) + int *mIndexStart_h, *mIndexEnd_h; + }; #endif diff --git a/EventFilter/SiPixelRawToDigi/test/Pixel_Phase1_Raw2Digi_GPU_Cabling_Map.dat b/EventFilter/SiPixelRawToDigi/test/Pixel_Phase1_Raw2Digi_GPU_Cabling_Map.dat new file mode 100644 index 0000000000000..5517740aee4cf --- /dev/null +++ b/EventFilter/SiPixelRawToDigi/test/Pixel_Phase1_Raw2Digi_GPU_Cabling_Map.dat @@ -0,0 +1,53377 @@ + Index FedID Link idinLNK B_F RawID idinDU ModuleID + 000001 1200 01 01 1 303050776 08 0021 + 000002 1200 01 02 1 303050776 09 0021 + 000003 9999 99 99 0 9999 99 9999 + 000004 9999 99 99 0 9999 99 9999 + 000005 9999 99 99 0 9999 99 9999 + 000006 9999 99 99 0 9999 99 9999 + 000007 9999 99 99 0 9999 99 9999 + 000008 9999 99 99 0 9999 99 9999 + 000009 1200 02 01 1 303050776 10 0021 + 000010 1200 02 02 1 303050776 11 0021 + 000011 9999 99 99 0 9999 99 9999 + 000012 9999 99 99 0 9999 99 9999 + 000013 9999 99 99 0 9999 99 9999 + 000014 9999 99 99 0 9999 99 9999 + 000015 9999 99 99 0 9999 99 9999 + 000016 9999 99 99 0 9999 99 9999 + 000017 1200 03 01 1 303050776 12 0021 + 000018 1200 03 02 1 303050776 13 0021 + 000019 9999 99 99 0 9999 99 9999 + 000020 9999 99 99 0 9999 99 9999 + 000021 9999 99 99 0 9999 99 9999 + 000022 9999 99 99 0 9999 99 9999 + 000023 9999 99 99 0 9999 99 9999 + 000024 9999 99 99 0 9999 99 9999 + 000025 1200 04 01 1 303050776 14 0021 + 000026 1200 04 02 1 303050776 15 0021 + 000027 9999 99 99 0 9999 99 9999 + 000028 9999 99 99 0 9999 99 9999 + 000029 9999 99 99 0 9999 99 9999 + 000030 9999 99 99 0 9999 99 9999 + 000031 9999 99 99 0 9999 99 9999 + 000032 9999 99 99 0 9999 99 9999 + 000033 1200 05 01 1 303050776 00 0021 + 000034 1200 05 02 1 303050776 01 0021 + 000035 9999 99 99 0 9999 99 9999 + 000036 9999 99 99 0 9999 99 9999 + 000037 9999 99 99 0 9999 99 9999 + 000038 9999 99 99 0 9999 99 9999 + 000039 9999 99 99 0 9999 99 9999 + 000040 9999 99 99 0 9999 99 9999 + 000041 1200 06 01 1 303050776 02 0021 + 000042 1200 06 02 1 303050776 03 0021 + 000043 9999 99 99 0 9999 99 9999 + 000044 9999 99 99 0 9999 99 9999 + 000045 9999 99 99 0 9999 99 9999 + 000046 9999 99 99 0 9999 99 9999 + 000047 9999 99 99 0 9999 99 9999 + 000048 9999 99 99 0 9999 99 9999 + 000049 1200 07 01 1 303050776 04 0021 + 000050 1200 07 02 1 303050776 05 0021 + 000051 9999 99 99 0 9999 99 9999 + 000052 9999 99 99 0 9999 99 9999 + 000053 9999 99 99 0 9999 99 9999 + 000054 9999 99 99 0 9999 99 9999 + 000055 9999 99 99 0 9999 99 9999 + 000056 9999 99 99 0 9999 99 9999 + 000057 1200 08 01 1 303050776 06 0021 + 000058 1200 08 02 1 303050776 07 0021 + 000059 9999 99 99 0 9999 99 9999 + 000060 9999 99 99 0 9999 99 9999 + 000061 9999 99 99 0 9999 99 9999 + 000062 9999 99 99 0 9999 99 9999 + 000063 9999 99 99 0 9999 99 9999 + 000064 9999 99 99 0 9999 99 9999 + 000065 1200 09 01 1 304115736 00 0149 + 000066 1200 09 02 1 304115736 01 0149 + 000067 1200 09 03 1 304115736 02 0149 + 000068 1200 09 04 1 304115736 03 0149 + 000069 9999 99 99 0 9999 99 9999 + 000070 9999 99 99 0 9999 99 9999 + 000071 9999 99 99 0 9999 99 9999 + 000072 9999 99 99 0 9999 99 9999 + 000073 1200 10 01 1 304115736 04 0149 + 000074 1200 10 02 1 304115736 05 0149 + 000075 1200 10 03 1 304115736 06 0149 + 000076 1200 10 04 1 304115736 07 0149 + 000077 9999 99 99 0 9999 99 9999 + 000078 9999 99 99 0 9999 99 9999 + 000079 9999 99 99 0 9999 99 9999 + 000080 9999 99 99 0 9999 99 9999 + 000081 1200 11 01 1 304115736 08 0149 + 000082 1200 11 02 1 304115736 09 0149 + 000083 1200 11 03 1 304115736 10 0149 + 000084 1200 11 04 1 304115736 11 0149 + 000085 9999 99 99 0 9999 99 9999 + 000086 9999 99 99 0 9999 99 9999 + 000087 9999 99 99 0 9999 99 9999 + 000088 9999 99 99 0 9999 99 9999 + 000089 1200 12 01 1 304115736 12 0149 + 000090 1200 12 02 1 304115736 13 0149 + 000091 1200 12 03 1 304115736 14 0149 + 000092 1200 12 04 1 304115736 15 0149 + 000093 9999 99 99 0 9999 99 9999 + 000094 9999 99 99 0 9999 99 9999 + 000095 9999 99 99 0 9999 99 9999 + 000096 9999 99 99 0 9999 99 9999 + 000097 1200 13 01 1 304115732 08 0148 + 000098 1200 13 02 1 304115732 09 0148 + 000099 1200 13 03 1 304115732 10 0148 + 000100 1200 13 04 1 304115732 11 0148 + 000101 9999 99 99 0 9999 99 9999 + 000102 9999 99 99 0 9999 99 9999 + 000103 9999 99 99 0 9999 99 9999 + 000104 9999 99 99 0 9999 99 9999 + 000105 1200 14 01 1 304115732 12 0148 + 000106 1200 14 02 1 304115732 13 0148 + 000107 1200 14 03 1 304115732 14 0148 + 000108 1200 14 04 1 304115732 15 0148 + 000109 9999 99 99 0 9999 99 9999 + 000110 9999 99 99 0 9999 99 9999 + 000111 9999 99 99 0 9999 99 9999 + 000112 9999 99 99 0 9999 99 9999 + 000113 1200 15 01 1 304115732 00 0148 + 000114 1200 15 02 1 304115732 01 0148 + 000115 1200 15 03 1 304115732 02 0148 + 000116 1200 15 04 1 304115732 03 0148 + 000117 9999 99 99 0 9999 99 9999 + 000118 9999 99 99 0 9999 99 9999 + 000119 9999 99 99 0 9999 99 9999 + 000120 9999 99 99 0 9999 99 9999 + 000121 1200 16 01 1 304115732 04 0148 + 000122 1200 16 02 1 304115732 05 0148 + 000123 1200 16 03 1 304115732 06 0148 + 000124 1200 16 04 1 304115732 07 0148 + 000125 9999 99 99 0 9999 99 9999 + 000126 9999 99 99 0 9999 99 9999 + 000127 9999 99 99 0 9999 99 9999 + 000128 9999 99 99 0 9999 99 9999 + 000129 1200 17 01 1 306249756 00 0798 + 000130 1200 17 02 1 306249756 01 0798 + 000131 1200 17 03 1 306249756 02 0798 + 000132 1200 17 04 1 306249756 03 0798 + 000133 1200 17 05 1 306249756 04 0798 + 000134 1200 17 06 1 306249756 05 0798 + 000135 1200 17 07 1 306249756 06 0798 + 000136 1200 17 08 1 306249756 07 0798 + 000137 1200 18 01 1 306249756 08 0798 + 000138 1200 18 02 1 306249756 09 0798 + 000139 1200 18 03 1 306249756 10 0798 + 000140 1200 18 04 1 306249756 11 0798 + 000141 1200 18 05 1 306249756 12 0798 + 000142 1200 18 06 1 306249756 13 0798 + 000143 1200 18 07 1 306249756 14 0798 + 000144 1200 18 08 1 306249756 15 0798 + 000145 1200 19 01 1 306249760 00 0799 + 000146 1200 19 02 1 306249760 01 0799 + 000147 1200 19 03 1 306249760 02 0799 + 000148 1200 19 04 1 306249760 03 0799 + 000149 1200 19 05 1 306249760 04 0799 + 000150 1200 19 06 1 306249760 05 0799 + 000151 1200 19 07 1 306249760 06 0799 + 000152 1200 19 08 1 306249760 07 0799 + 000153 1200 20 01 1 306249760 08 0799 + 000154 1200 20 02 1 306249760 09 0799 + 000155 1200 20 03 1 306249760 10 0799 + 000156 1200 20 04 1 306249760 11 0799 + 000157 1200 20 05 1 306249760 12 0799 + 000158 1200 20 06 1 306249760 13 0799 + 000159 1200 20 07 1 306249760 14 0799 + 000160 1200 20 08 1 306249760 15 0799 + 000161 1200 21 01 1 306249748 00 0796 + 000162 1200 21 02 1 306249748 01 0796 + 000163 1200 21 03 1 306249748 02 0796 + 000164 1200 21 04 1 306249748 03 0796 + 000165 1200 21 05 1 306249748 04 0796 + 000166 1200 21 06 1 306249748 05 0796 + 000167 1200 21 07 1 306249748 06 0796 + 000168 1200 21 08 1 306249748 07 0796 + 000169 1200 22 01 1 306249748 08 0796 + 000170 1200 22 02 1 306249748 09 0796 + 000171 1200 22 03 1 306249748 10 0796 + 000172 1200 22 04 1 306249748 11 0796 + 000173 1200 22 05 1 306249748 12 0796 + 000174 1200 22 06 1 306249748 13 0796 + 000175 1200 22 07 1 306249748 14 0796 + 000176 1200 22 08 1 306249748 15 0796 + 000177 1200 23 01 1 306249752 00 0797 + 000178 1200 23 02 1 306249752 01 0797 + 000179 1200 23 03 1 306249752 02 0797 + 000180 1200 23 04 1 306249752 03 0797 + 000181 1200 23 05 1 306249752 04 0797 + 000182 1200 23 06 1 306249752 05 0797 + 000183 1200 23 07 1 306249752 06 0797 + 000184 1200 23 08 1 306249752 07 0797 + 000185 1200 24 01 1 306249752 08 0797 + 000186 1200 24 02 1 306249752 09 0797 + 000187 1200 24 03 1 306249752 10 0797 + 000188 1200 24 04 1 306249752 11 0797 + 000189 1200 24 05 1 306249752 12 0797 + 000190 1200 24 06 1 306249752 13 0797 + 000191 1200 24 07 1 306249752 14 0797 + 000192 1200 24 08 1 306249752 15 0797 + 000193 1200 25 01 1 303050780 08 0022 + 000194 1200 25 02 1 303050780 09 0022 + 000195 9999 99 99 0 9999 99 9999 + 000196 9999 99 99 0 9999 99 9999 + 000197 9999 99 99 0 9999 99 9999 + 000198 9999 99 99 0 9999 99 9999 + 000199 9999 99 99 0 9999 99 9999 + 000200 9999 99 99 0 9999 99 9999 + 000201 1200 26 01 1 303050780 10 0022 + 000202 1200 26 02 1 303050780 11 0022 + 000203 9999 99 99 0 9999 99 9999 + 000204 9999 99 99 0 9999 99 9999 + 000205 9999 99 99 0 9999 99 9999 + 000206 9999 99 99 0 9999 99 9999 + 000207 9999 99 99 0 9999 99 9999 + 000208 9999 99 99 0 9999 99 9999 + 000209 1200 27 01 1 303050780 12 0022 + 000210 1200 27 02 1 303050780 13 0022 + 000211 9999 99 99 0 9999 99 9999 + 000212 9999 99 99 0 9999 99 9999 + 000213 9999 99 99 0 9999 99 9999 + 000214 9999 99 99 0 9999 99 9999 + 000215 9999 99 99 0 9999 99 9999 + 000216 9999 99 99 0 9999 99 9999 + 000217 1200 28 01 1 303050780 14 0022 + 000218 1200 28 02 1 303050780 15 0022 + 000219 9999 99 99 0 9999 99 9999 + 000220 9999 99 99 0 9999 99 9999 + 000221 9999 99 99 0 9999 99 9999 + 000222 9999 99 99 0 9999 99 9999 + 000223 9999 99 99 0 9999 99 9999 + 000224 9999 99 99 0 9999 99 9999 + 000225 1200 29 01 1 303050780 04 0022 + 000226 1200 29 02 1 303050780 05 0022 + 000227 9999 99 99 0 9999 99 9999 + 000228 9999 99 99 0 9999 99 9999 + 000229 9999 99 99 0 9999 99 9999 + 000230 9999 99 99 0 9999 99 9999 + 000231 9999 99 99 0 9999 99 9999 + 000232 9999 99 99 0 9999 99 9999 + 000233 1200 30 01 1 303050780 06 0022 + 000234 1200 30 02 1 303050780 07 0022 + 000235 9999 99 99 0 9999 99 9999 + 000236 9999 99 99 0 9999 99 9999 + 000237 9999 99 99 0 9999 99 9999 + 000238 9999 99 99 0 9999 99 9999 + 000239 9999 99 99 0 9999 99 9999 + 000240 9999 99 99 0 9999 99 9999 + 000241 1200 31 01 1 303050780 00 0022 + 000242 1200 31 02 1 303050780 01 0022 + 000243 9999 99 99 0 9999 99 9999 + 000244 9999 99 99 0 9999 99 9999 + 000245 9999 99 99 0 9999 99 9999 + 000246 9999 99 99 0 9999 99 9999 + 000247 9999 99 99 0 9999 99 9999 + 000248 9999 99 99 0 9999 99 9999 + 000249 1200 32 01 1 303050780 02 0022 + 000250 1200 32 02 1 303050780 03 0022 + 000251 9999 99 99 0 9999 99 9999 + 000252 9999 99 99 0 9999 99 9999 + 000253 9999 99 99 0 9999 99 9999 + 000254 9999 99 99 0 9999 99 9999 + 000255 9999 99 99 0 9999 99 9999 + 000256 9999 99 99 0 9999 99 9999 + 000257 1200 33 01 1 306245660 00 0790 + 000258 1200 33 02 1 306245660 01 0790 + 000259 1200 33 03 1 306245660 02 0790 + 000260 1200 33 04 1 306245660 03 0790 + 000261 1200 33 05 1 306245660 04 0790 + 000262 1200 33 06 1 306245660 05 0790 + 000263 1200 33 07 1 306245660 06 0790 + 000264 1200 33 08 1 306245660 07 0790 + 000265 1200 34 01 1 306245660 08 0790 + 000266 1200 34 02 1 306245660 09 0790 + 000267 1200 34 03 1 306245660 10 0790 + 000268 1200 34 04 1 306245660 11 0790 + 000269 1200 34 05 1 306245660 12 0790 + 000270 1200 34 06 1 306245660 13 0790 + 000271 1200 34 07 1 306245660 14 0790 + 000272 1200 34 08 1 306245660 15 0790 + 000273 1200 35 01 1 306245664 00 0791 + 000274 1200 35 02 1 306245664 01 0791 + 000275 1200 35 03 1 306245664 02 0791 + 000276 1200 35 04 1 306245664 03 0791 + 000277 1200 35 05 1 306245664 04 0791 + 000278 1200 35 06 1 306245664 05 0791 + 000279 1200 35 07 1 306245664 06 0791 + 000280 1200 35 08 1 306245664 07 0791 + 000281 1200 36 01 1 306245664 08 0791 + 000282 1200 36 02 1 306245664 09 0791 + 000283 1200 36 03 1 306245664 10 0791 + 000284 1200 36 04 1 306245664 11 0791 + 000285 1200 36 05 1 306245664 12 0791 + 000286 1200 36 06 1 306245664 13 0791 + 000287 1200 36 07 1 306245664 14 0791 + 000288 1200 36 08 1 306245664 15 0791 + 000289 1200 37 01 1 306245652 00 0788 + 000290 1200 37 02 1 306245652 01 0788 + 000291 1200 37 03 1 306245652 02 0788 + 000292 1200 37 04 1 306245652 03 0788 + 000293 1200 37 05 1 306245652 04 0788 + 000294 1200 37 06 1 306245652 05 0788 + 000295 1200 37 07 1 306245652 06 0788 + 000296 1200 37 08 1 306245652 07 0788 + 000297 1200 38 01 1 306245652 08 0788 + 000298 1200 38 02 1 306245652 09 0788 + 000299 1200 38 03 1 306245652 10 0788 + 000300 1200 38 04 1 306245652 11 0788 + 000301 1200 38 05 1 306245652 12 0788 + 000302 1200 38 06 1 306245652 13 0788 + 000303 1200 38 07 1 306245652 14 0788 + 000304 1200 38 08 1 306245652 15 0788 + 000305 1200 39 01 1 306245656 00 0789 + 000306 1200 39 02 1 306245656 01 0789 + 000307 1200 39 03 1 306245656 02 0789 + 000308 1200 39 04 1 306245656 03 0789 + 000309 1200 39 05 1 306245656 04 0789 + 000310 1200 39 06 1 306245656 05 0789 + 000311 1200 39 07 1 306245656 06 0789 + 000312 1200 39 08 1 306245656 07 0789 + 000313 1200 40 01 1 306245656 08 0789 + 000314 1200 40 02 1 306245656 09 0789 + 000315 1200 40 03 1 306245656 10 0789 + 000316 1200 40 04 1 306245656 11 0789 + 000317 1200 40 05 1 306245656 12 0789 + 000318 1200 40 06 1 306245656 13 0789 + 000319 1200 40 07 1 306245656 14 0789 + 000320 1200 40 08 1 306245656 15 0789 + 000321 1200 41 01 1 304115740 00 0150 + 000322 1200 41 02 1 304115740 01 0150 + 000323 1200 41 03 1 304115740 02 0150 + 000324 1200 41 04 1 304115740 03 0150 + 000325 9999 99 99 0 9999 99 9999 + 000326 9999 99 99 0 9999 99 9999 + 000327 9999 99 99 0 9999 99 9999 + 000328 9999 99 99 0 9999 99 9999 + 000329 1200 42 01 1 304115740 04 0150 + 000330 1200 42 02 1 304115740 05 0150 + 000331 1200 42 03 1 304115740 06 0150 + 000332 1200 42 04 1 304115740 07 0150 + 000333 9999 99 99 0 9999 99 9999 + 000334 9999 99 99 0 9999 99 9999 + 000335 9999 99 99 0 9999 99 9999 + 000336 9999 99 99 0 9999 99 9999 + 000337 1200 43 01 1 304115740 08 0150 + 000338 1200 43 02 1 304115740 09 0150 + 000339 1200 43 03 1 304115740 10 0150 + 000340 1200 43 04 1 304115740 11 0150 + 000341 9999 99 99 0 9999 99 9999 + 000342 9999 99 99 0 9999 99 9999 + 000343 9999 99 99 0 9999 99 9999 + 000344 9999 99 99 0 9999 99 9999 + 000345 1200 44 01 1 304115740 12 0150 + 000346 1200 44 02 1 304115740 13 0150 + 000347 1200 44 03 1 304115740 14 0150 + 000348 1200 44 04 1 304115740 15 0150 + 000349 9999 99 99 0 9999 99 9999 + 000350 9999 99 99 0 9999 99 9999 + 000351 9999 99 99 0 9999 99 9999 + 000352 9999 99 99 0 9999 99 9999 + 000353 1200 45 01 1 304115744 00 0151 + 000354 1200 45 02 1 304115744 01 0151 + 000355 1200 45 03 1 304115744 02 0151 + 000356 1200 45 04 1 304115744 03 0151 + 000357 9999 99 99 0 9999 99 9999 + 000358 9999 99 99 0 9999 99 9999 + 000359 9999 99 99 0 9999 99 9999 + 000360 9999 99 99 0 9999 99 9999 + 000361 1200 46 01 1 304115744 04 0151 + 000362 1200 46 02 1 304115744 05 0151 + 000363 1200 46 03 1 304115744 06 0151 + 000364 1200 46 04 1 304115744 07 0151 + 000365 9999 99 99 0 9999 99 9999 + 000366 9999 99 99 0 9999 99 9999 + 000367 9999 99 99 0 9999 99 9999 + 000368 9999 99 99 0 9999 99 9999 + 000369 1200 47 01 1 304115744 08 0151 + 000370 1200 47 02 1 304115744 09 0151 + 000371 1200 47 03 1 304115744 10 0151 + 000372 1200 47 04 1 304115744 11 0151 + 000373 9999 99 99 0 9999 99 9999 + 000374 9999 99 99 0 9999 99 9999 + 000375 9999 99 99 0 9999 99 9999 + 000376 9999 99 99 0 9999 99 9999 + 000377 1200 48 01 1 304115744 12 0151 + 000378 1200 48 02 1 304115744 13 0151 + 000379 1200 48 03 1 304115744 14 0151 + 000380 1200 48 04 1 304115744 15 0151 + 000381 9999 99 99 0 9999 99 9999 + 000382 9999 99 99 0 9999 99 9999 + 000383 9999 99 99 0 9999 99 9999 + 000384 9999 99 99 0 9999 99 9999 + 000385 1201 01 01 1 304111640 08 0141 + 000386 1201 01 02 1 304111640 09 0141 + 000387 1201 01 03 1 304111640 10 0141 + 000388 1201 01 04 1 304111640 11 0141 + 000389 9999 99 99 0 9999 99 9999 + 000390 9999 99 99 0 9999 99 9999 + 000391 9999 99 99 0 9999 99 9999 + 000392 9999 99 99 0 9999 99 9999 + 000393 1201 02 01 1 304111640 12 0141 + 000394 1201 02 02 1 304111640 13 0141 + 000395 1201 02 03 1 304111640 14 0141 + 000396 1201 02 04 1 304111640 15 0141 + 000397 9999 99 99 0 9999 99 9999 + 000398 9999 99 99 0 9999 99 9999 + 000399 9999 99 99 0 9999 99 9999 + 000400 9999 99 99 0 9999 99 9999 + 000401 1201 03 01 1 304111640 00 0141 + 000402 1201 03 02 1 304111640 01 0141 + 000403 1201 03 03 1 304111640 02 0141 + 000404 1201 03 04 1 304111640 03 0141 + 000405 9999 99 99 0 9999 99 9999 + 000406 9999 99 99 0 9999 99 9999 + 000407 9999 99 99 0 9999 99 9999 + 000408 9999 99 99 0 9999 99 9999 + 000409 1201 04 01 1 304111640 04 0141 + 000410 1201 04 02 1 304111640 05 0141 + 000411 1201 04 03 1 304111640 06 0141 + 000412 1201 04 04 1 304111640 07 0141 + 000413 9999 99 99 0 9999 99 9999 + 000414 9999 99 99 0 9999 99 9999 + 000415 9999 99 99 0 9999 99 9999 + 000416 9999 99 99 0 9999 99 9999 + 000417 1201 05 01 1 304111636 08 0140 + 000418 1201 05 02 1 304111636 09 0140 + 000419 1201 05 03 1 304111636 10 0140 + 000420 1201 05 04 1 304111636 11 0140 + 000421 9999 99 99 0 9999 99 9999 + 000422 9999 99 99 0 9999 99 9999 + 000423 9999 99 99 0 9999 99 9999 + 000424 9999 99 99 0 9999 99 9999 + 000425 1201 06 01 1 304111636 12 0140 + 000426 1201 06 02 1 304111636 13 0140 + 000427 1201 06 03 1 304111636 14 0140 + 000428 1201 06 04 1 304111636 15 0140 + 000429 9999 99 99 0 9999 99 9999 + 000430 9999 99 99 0 9999 99 9999 + 000431 9999 99 99 0 9999 99 9999 + 000432 9999 99 99 0 9999 99 9999 + 000433 1201 07 01 1 304111636 00 0140 + 000434 1201 07 02 1 304111636 01 0140 + 000435 1201 07 03 1 304111636 02 0140 + 000436 1201 07 04 1 304111636 03 0140 + 000437 9999 99 99 0 9999 99 9999 + 000438 9999 99 99 0 9999 99 9999 + 000439 9999 99 99 0 9999 99 9999 + 000440 9999 99 99 0 9999 99 9999 + 000441 1201 08 01 1 304111636 04 0140 + 000442 1201 08 02 1 304111636 05 0140 + 000443 1201 08 03 1 304111636 06 0140 + 000444 1201 08 04 1 304111636 07 0140 + 000445 9999 99 99 0 9999 99 9999 + 000446 9999 99 99 0 9999 99 9999 + 000447 9999 99 99 0 9999 99 9999 + 000448 9999 99 99 0 9999 99 9999 + 000449 1201 09 01 1 306241560 00 0781 + 000450 1201 09 02 1 306241560 01 0781 + 000451 1201 09 03 1 306241560 02 0781 + 000452 1201 09 04 1 306241560 03 0781 + 000453 1201 09 05 1 306241560 04 0781 + 000454 1201 09 06 1 306241560 05 0781 + 000455 1201 09 07 1 306241560 06 0781 + 000456 1201 09 08 1 306241560 07 0781 + 000457 1201 10 01 1 306241560 08 0781 + 000458 1201 10 02 1 306241560 09 0781 + 000459 1201 10 03 1 306241560 10 0781 + 000460 1201 10 04 1 306241560 11 0781 + 000461 1201 10 05 1 306241560 12 0781 + 000462 1201 10 06 1 306241560 13 0781 + 000463 1201 10 07 1 306241560 14 0781 + 000464 1201 10 08 1 306241560 15 0781 + 000465 1201 11 01 1 306241556 00 0780 + 000466 1201 11 02 1 306241556 01 0780 + 000467 1201 11 03 1 306241556 02 0780 + 000468 1201 11 04 1 306241556 03 0780 + 000469 1201 11 05 1 306241556 04 0780 + 000470 1201 11 06 1 306241556 05 0780 + 000471 1201 11 07 1 306241556 06 0780 + 000472 1201 11 08 1 306241556 07 0780 + 000473 1201 12 01 1 306241556 08 0780 + 000474 1201 12 02 1 306241556 09 0780 + 000475 1201 12 03 1 306241556 10 0780 + 000476 1201 12 04 1 306241556 11 0780 + 000477 1201 12 05 1 306241556 12 0780 + 000478 1201 12 06 1 306241556 13 0780 + 000479 1201 12 07 1 306241556 14 0780 + 000480 1201 12 08 1 306241556 15 0780 + 000481 1201 13 01 1 306241568 00 0783 + 000482 1201 13 02 1 306241568 01 0783 + 000483 1201 13 03 1 306241568 02 0783 + 000484 1201 13 04 1 306241568 03 0783 + 000485 1201 13 05 1 306241568 04 0783 + 000486 1201 13 06 1 306241568 05 0783 + 000487 1201 13 07 1 306241568 06 0783 + 000488 1201 13 08 1 306241568 07 0783 + 000489 1201 14 01 1 306241568 08 0783 + 000490 1201 14 02 1 306241568 09 0783 + 000491 1201 14 03 1 306241568 10 0783 + 000492 1201 14 04 1 306241568 11 0783 + 000493 1201 14 05 1 306241568 12 0783 + 000494 1201 14 06 1 306241568 13 0783 + 000495 1201 14 07 1 306241568 14 0783 + 000496 1201 14 08 1 306241568 15 0783 + 000497 1201 15 01 1 306241564 00 0782 + 000498 1201 15 02 1 306241564 01 0782 + 000499 1201 15 03 1 306241564 02 0782 + 000500 1201 15 04 1 306241564 03 0782 + 000501 1201 15 05 1 306241564 04 0782 + 000502 1201 15 06 1 306241564 05 0782 + 000503 1201 15 07 1 306241564 06 0782 + 000504 1201 15 08 1 306241564 07 0782 + 000505 1201 16 01 1 306241564 08 0782 + 000506 1201 16 02 1 306241564 09 0782 + 000507 1201 16 03 1 306241564 10 0782 + 000508 1201 16 04 1 306241564 11 0782 + 000509 1201 16 05 1 306241564 12 0782 + 000510 1201 16 06 1 306241564 13 0782 + 000511 1201 16 07 1 306241564 14 0782 + 000512 1201 16 08 1 306241564 15 0782 + 000513 1201 17 01 1 303050784 12 0023 + 000514 1201 17 02 1 303050784 13 0023 + 000515 9999 99 99 0 9999 99 9999 + 000516 9999 99 99 0 9999 99 9999 + 000517 9999 99 99 0 9999 99 9999 + 000518 9999 99 99 0 9999 99 9999 + 000519 9999 99 99 0 9999 99 9999 + 000520 9999 99 99 0 9999 99 9999 + 000521 1201 18 01 1 303050784 14 0023 + 000522 1201 18 02 1 303050784 15 0023 + 000523 9999 99 99 0 9999 99 9999 + 000524 9999 99 99 0 9999 99 9999 + 000525 9999 99 99 0 9999 99 9999 + 000526 9999 99 99 0 9999 99 9999 + 000527 9999 99 99 0 9999 99 9999 + 000528 9999 99 99 0 9999 99 9999 + 000529 1201 19 01 1 303050784 08 0023 + 000530 1201 19 02 1 303050784 09 0023 + 000531 9999 99 99 0 9999 99 9999 + 000532 9999 99 99 0 9999 99 9999 + 000533 9999 99 99 0 9999 99 9999 + 000534 9999 99 99 0 9999 99 9999 + 000535 9999 99 99 0 9999 99 9999 + 000536 9999 99 99 0 9999 99 9999 + 000537 1201 20 01 1 303050784 10 0023 + 000538 1201 20 02 1 303050784 11 0023 + 000539 9999 99 99 0 9999 99 9999 + 000540 9999 99 99 0 9999 99 9999 + 000541 9999 99 99 0 9999 99 9999 + 000542 9999 99 99 0 9999 99 9999 + 000543 9999 99 99 0 9999 99 9999 + 000544 9999 99 99 0 9999 99 9999 + 000545 1201 21 01 1 303050784 00 0023 + 000546 1201 21 02 1 303050784 01 0023 + 000547 9999 99 99 0 9999 99 9999 + 000548 9999 99 99 0 9999 99 9999 + 000549 9999 99 99 0 9999 99 9999 + 000550 9999 99 99 0 9999 99 9999 + 000551 9999 99 99 0 9999 99 9999 + 000552 9999 99 99 0 9999 99 9999 + 000553 1201 22 01 1 303050784 02 0023 + 000554 1201 22 02 1 303050784 03 0023 + 000555 9999 99 99 0 9999 99 9999 + 000556 9999 99 99 0 9999 99 9999 + 000557 9999 99 99 0 9999 99 9999 + 000558 9999 99 99 0 9999 99 9999 + 000559 9999 99 99 0 9999 99 9999 + 000560 9999 99 99 0 9999 99 9999 + 000561 1201 23 01 1 303050784 04 0023 + 000562 1201 23 02 1 303050784 05 0023 + 000563 9999 99 99 0 9999 99 9999 + 000564 9999 99 99 0 9999 99 9999 + 000565 9999 99 99 0 9999 99 9999 + 000566 9999 99 99 0 9999 99 9999 + 000567 9999 99 99 0 9999 99 9999 + 000568 9999 99 99 0 9999 99 9999 + 000569 1201 24 01 1 303050784 06 0023 + 000570 1201 24 02 1 303050784 07 0023 + 000571 9999 99 99 0 9999 99 9999 + 000572 9999 99 99 0 9999 99 9999 + 000573 9999 99 99 0 9999 99 9999 + 000574 9999 99 99 0 9999 99 9999 + 000575 9999 99 99 0 9999 99 9999 + 000576 9999 99 99 0 9999 99 9999 + 000577 1201 25 01 1 305180700 00 0406 + 000578 1201 25 02 1 305180700 01 0406 + 000579 1201 25 03 1 305180700 02 0406 + 000580 1201 25 04 1 305180700 03 0406 + 000581 1201 25 05 1 305180700 04 0406 + 000582 1201 25 06 1 305180700 05 0406 + 000583 1201 25 07 1 305180700 06 0406 + 000584 1201 25 08 1 305180700 07 0406 + 000585 1201 26 01 1 305180700 08 0406 + 000586 1201 26 02 1 305180700 09 0406 + 000587 1201 26 03 1 305180700 10 0406 + 000588 1201 26 04 1 305180700 11 0406 + 000589 1201 26 05 1 305180700 12 0406 + 000590 1201 26 06 1 305180700 13 0406 + 000591 1201 26 07 1 305180700 14 0406 + 000592 1201 26 08 1 305180700 15 0406 + 000593 1201 27 01 1 305180704 00 0407 + 000594 1201 27 02 1 305180704 01 0407 + 000595 1201 27 03 1 305180704 02 0407 + 000596 1201 27 04 1 305180704 03 0407 + 000597 1201 27 05 1 305180704 04 0407 + 000598 1201 27 06 1 305180704 05 0407 + 000599 1201 27 07 1 305180704 06 0407 + 000600 1201 27 08 1 305180704 07 0407 + 000601 1201 28 01 1 305180704 08 0407 + 000602 1201 28 02 1 305180704 09 0407 + 000603 1201 28 03 1 305180704 10 0407 + 000604 1201 28 04 1 305180704 11 0407 + 000605 1201 28 05 1 305180704 12 0407 + 000606 1201 28 06 1 305180704 13 0407 + 000607 1201 28 07 1 305180704 14 0407 + 000608 1201 28 08 1 305180704 15 0407 + 000609 1201 29 01 1 305180692 00 0404 + 000610 1201 29 02 1 305180692 01 0404 + 000611 1201 29 03 1 305180692 02 0404 + 000612 1201 29 04 1 305180692 03 0404 + 000613 1201 29 05 1 305180692 04 0404 + 000614 1201 29 06 1 305180692 05 0404 + 000615 1201 29 07 1 305180692 06 0404 + 000616 1201 29 08 1 305180692 07 0404 + 000617 1201 30 01 1 305180692 08 0404 + 000618 1201 30 02 1 305180692 09 0404 + 000619 1201 30 03 1 305180692 10 0404 + 000620 1201 30 04 1 305180692 11 0404 + 000621 1201 30 05 1 305180692 12 0404 + 000622 1201 30 06 1 305180692 13 0404 + 000623 1201 30 07 1 305180692 14 0404 + 000624 1201 30 08 1 305180692 15 0404 + 000625 1201 31 01 1 305180696 00 0405 + 000626 1201 31 02 1 305180696 01 0405 + 000627 1201 31 03 1 305180696 02 0405 + 000628 1201 31 04 1 305180696 03 0405 + 000629 1201 31 05 1 305180696 04 0405 + 000630 1201 31 06 1 305180696 05 0405 + 000631 1201 31 07 1 305180696 06 0405 + 000632 1201 31 08 1 305180696 07 0405 + 000633 1201 32 01 1 305180696 08 0405 + 000634 1201 32 02 1 305180696 09 0405 + 000635 1201 32 03 1 305180696 10 0405 + 000636 1201 32 04 1 305180696 11 0405 + 000637 1201 32 05 1 305180696 12 0405 + 000638 1201 32 06 1 305180696 13 0405 + 000639 1201 32 07 1 305180696 14 0405 + 000640 1201 32 08 1 305180696 15 0405 + 000641 1201 33 01 1 306237464 00 0773 + 000642 1201 33 02 1 306237464 01 0773 + 000643 1201 33 03 1 306237464 02 0773 + 000644 1201 33 04 1 306237464 03 0773 + 000645 1201 33 05 1 306237464 04 0773 + 000646 1201 33 06 1 306237464 05 0773 + 000647 1201 33 07 1 306237464 06 0773 + 000648 1201 33 08 1 306237464 07 0773 + 000649 1201 34 01 1 306237464 08 0773 + 000650 1201 34 02 1 306237464 09 0773 + 000651 1201 34 03 1 306237464 10 0773 + 000652 1201 34 04 1 306237464 11 0773 + 000653 1201 34 05 1 306237464 12 0773 + 000654 1201 34 06 1 306237464 13 0773 + 000655 1201 34 07 1 306237464 14 0773 + 000656 1201 34 08 1 306237464 15 0773 + 000657 1201 35 01 1 306237460 00 0772 + 000658 1201 35 02 1 306237460 01 0772 + 000659 1201 35 03 1 306237460 02 0772 + 000660 1201 35 04 1 306237460 03 0772 + 000661 1201 35 05 1 306237460 04 0772 + 000662 1201 35 06 1 306237460 05 0772 + 000663 1201 35 07 1 306237460 06 0772 + 000664 1201 35 08 1 306237460 07 0772 + 000665 1201 36 01 1 306237460 08 0772 + 000666 1201 36 02 1 306237460 09 0772 + 000667 1201 36 03 1 306237460 10 0772 + 000668 1201 36 04 1 306237460 11 0772 + 000669 1201 36 05 1 306237460 12 0772 + 000670 1201 36 06 1 306237460 13 0772 + 000671 1201 36 07 1 306237460 14 0772 + 000672 1201 36 08 1 306237460 15 0772 + 000673 1201 37 01 1 306237472 00 0775 + 000674 1201 37 02 1 306237472 01 0775 + 000675 1201 37 03 1 306237472 02 0775 + 000676 1201 37 04 1 306237472 03 0775 + 000677 1201 37 05 1 306237472 04 0775 + 000678 1201 37 06 1 306237472 05 0775 + 000679 1201 37 07 1 306237472 06 0775 + 000680 1201 37 08 1 306237472 07 0775 + 000681 1201 38 01 1 306237472 08 0775 + 000682 1201 38 02 1 306237472 09 0775 + 000683 1201 38 03 1 306237472 10 0775 + 000684 1201 38 04 1 306237472 11 0775 + 000685 1201 38 05 1 306237472 12 0775 + 000686 1201 38 06 1 306237472 13 0775 + 000687 1201 38 07 1 306237472 14 0775 + 000688 1201 38 08 1 306237472 15 0775 + 000689 1201 39 01 1 306237468 00 0774 + 000690 1201 39 02 1 306237468 01 0774 + 000691 1201 39 03 1 306237468 02 0774 + 000692 1201 39 04 1 306237468 03 0774 + 000693 1201 39 05 1 306237468 04 0774 + 000694 1201 39 06 1 306237468 05 0774 + 000695 1201 39 07 1 306237468 06 0774 + 000696 1201 39 08 1 306237468 07 0774 + 000697 1201 40 01 1 306237468 08 0774 + 000698 1201 40 02 1 306237468 09 0774 + 000699 1201 40 03 1 306237468 10 0774 + 000700 1201 40 04 1 306237468 11 0774 + 000701 1201 40 05 1 306237468 12 0774 + 000702 1201 40 06 1 306237468 13 0774 + 000703 1201 40 07 1 306237468 14 0774 + 000704 1201 40 08 1 306237468 15 0774 + 000705 1201 41 01 1 304111648 08 0143 + 000706 1201 41 02 1 304111648 09 0143 + 000707 1201 41 03 1 304111648 10 0143 + 000708 1201 41 04 1 304111648 11 0143 + 000709 9999 99 99 0 9999 99 9999 + 000710 9999 99 99 0 9999 99 9999 + 000711 9999 99 99 0 9999 99 9999 + 000712 9999 99 99 0 9999 99 9999 + 000713 1201 42 01 1 304111648 12 0143 + 000714 1201 42 02 1 304111648 13 0143 + 000715 1201 42 03 1 304111648 14 0143 + 000716 1201 42 04 1 304111648 15 0143 + 000717 9999 99 99 0 9999 99 9999 + 000718 9999 99 99 0 9999 99 9999 + 000719 9999 99 99 0 9999 99 9999 + 000720 9999 99 99 0 9999 99 9999 + 000721 1201 43 01 1 304111648 00 0143 + 000722 1201 43 02 1 304111648 01 0143 + 000723 1201 43 03 1 304111648 02 0143 + 000724 1201 43 04 1 304111648 03 0143 + 000725 9999 99 99 0 9999 99 9999 + 000726 9999 99 99 0 9999 99 9999 + 000727 9999 99 99 0 9999 99 9999 + 000728 9999 99 99 0 9999 99 9999 + 000729 1201 44 01 1 304111648 04 0143 + 000730 1201 44 02 1 304111648 05 0143 + 000731 1201 44 03 1 304111648 06 0143 + 000732 1201 44 04 1 304111648 07 0143 + 000733 9999 99 99 0 9999 99 9999 + 000734 9999 99 99 0 9999 99 9999 + 000735 9999 99 99 0 9999 99 9999 + 000736 9999 99 99 0 9999 99 9999 + 000737 1201 45 01 1 304111644 08 0142 + 000738 1201 45 02 1 304111644 09 0142 + 000739 1201 45 03 1 304111644 10 0142 + 000740 1201 45 04 1 304111644 11 0142 + 000741 9999 99 99 0 9999 99 9999 + 000742 9999 99 99 0 9999 99 9999 + 000743 9999 99 99 0 9999 99 9999 + 000744 9999 99 99 0 9999 99 9999 + 000745 1201 46 01 1 304111644 12 0142 + 000746 1201 46 02 1 304111644 13 0142 + 000747 1201 46 03 1 304111644 14 0142 + 000748 1201 46 04 1 304111644 15 0142 + 000749 9999 99 99 0 9999 99 9999 + 000750 9999 99 99 0 9999 99 9999 + 000751 9999 99 99 0 9999 99 9999 + 000752 9999 99 99 0 9999 99 9999 + 000753 1201 47 01 1 304111644 00 0142 + 000754 1201 47 02 1 304111644 01 0142 + 000755 1201 47 03 1 304111644 02 0142 + 000756 1201 47 04 1 304111644 03 0142 + 000757 9999 99 99 0 9999 99 9999 + 000758 9999 99 99 0 9999 99 9999 + 000759 9999 99 99 0 9999 99 9999 + 000760 9999 99 99 0 9999 99 9999 + 000761 1201 48 01 1 304111644 04 0142 + 000762 1201 48 02 1 304111644 05 0142 + 000763 1201 48 03 1 304111644 06 0142 + 000764 1201 48 04 1 304111644 07 0142 + 000765 9999 99 99 0 9999 99 9999 + 000766 9999 99 99 0 9999 99 9999 + 000767 9999 99 99 0 9999 99 9999 + 000768 9999 99 99 0 9999 99 9999 + 000769 1202 01 01 1 305176604 00 0398 + 000770 1202 01 02 1 305176604 01 0398 + 000771 1202 01 03 1 305176604 02 0398 + 000772 1202 01 04 1 305176604 03 0398 + 000773 1202 01 05 1 305176604 04 0398 + 000774 1202 01 06 1 305176604 05 0398 + 000775 1202 01 07 1 305176604 06 0398 + 000776 1202 01 08 1 305176604 07 0398 + 000777 1202 02 01 1 305176604 08 0398 + 000778 1202 02 02 1 305176604 09 0398 + 000779 1202 02 03 1 305176604 10 0398 + 000780 1202 02 04 1 305176604 11 0398 + 000781 1202 02 05 1 305176604 12 0398 + 000782 1202 02 06 1 305176604 13 0398 + 000783 1202 02 07 1 305176604 14 0398 + 000784 1202 02 08 1 305176604 15 0398 + 000785 1202 03 01 1 305176608 00 0399 + 000786 1202 03 02 1 305176608 01 0399 + 000787 1202 03 03 1 305176608 02 0399 + 000788 1202 03 04 1 305176608 03 0399 + 000789 1202 03 05 1 305176608 04 0399 + 000790 1202 03 06 1 305176608 05 0399 + 000791 1202 03 07 1 305176608 06 0399 + 000792 1202 03 08 1 305176608 07 0399 + 000793 1202 04 01 1 305176608 08 0399 + 000794 1202 04 02 1 305176608 09 0399 + 000795 1202 04 03 1 305176608 10 0399 + 000796 1202 04 04 1 305176608 11 0399 + 000797 1202 04 05 1 305176608 12 0399 + 000798 1202 04 06 1 305176608 13 0399 + 000799 1202 04 07 1 305176608 14 0399 + 000800 1202 04 08 1 305176608 15 0399 + 000801 1202 05 01 1 305176596 00 0396 + 000802 1202 05 02 1 305176596 01 0396 + 000803 1202 05 03 1 305176596 02 0396 + 000804 1202 05 04 1 305176596 03 0396 + 000805 1202 05 05 1 305176596 04 0396 + 000806 1202 05 06 1 305176596 05 0396 + 000807 1202 05 07 1 305176596 06 0396 + 000808 1202 05 08 1 305176596 07 0396 + 000809 1202 06 01 1 305176596 08 0396 + 000810 1202 06 02 1 305176596 09 0396 + 000811 1202 06 03 1 305176596 10 0396 + 000812 1202 06 04 1 305176596 11 0396 + 000813 1202 06 05 1 305176596 12 0396 + 000814 1202 06 06 1 305176596 13 0396 + 000815 1202 06 07 1 305176596 14 0396 + 000816 1202 06 08 1 305176596 15 0396 + 000817 1202 07 01 1 305176600 00 0397 + 000818 1202 07 02 1 305176600 01 0397 + 000819 1202 07 03 1 305176600 02 0397 + 000820 1202 07 04 1 305176600 03 0397 + 000821 1202 07 05 1 305176600 04 0397 + 000822 1202 07 06 1 305176600 05 0397 + 000823 1202 07 07 1 305176600 06 0397 + 000824 1202 07 08 1 305176600 07 0397 + 000825 1202 08 01 1 305176600 08 0397 + 000826 1202 08 02 1 305176600 09 0397 + 000827 1202 08 03 1 305176600 10 0397 + 000828 1202 08 04 1 305176600 11 0397 + 000829 1202 08 05 1 305176600 12 0397 + 000830 1202 08 06 1 305176600 13 0397 + 000831 1202 08 07 1 305176600 14 0397 + 000832 1202 08 08 1 305176600 15 0397 + 000833 9999 99 99 0 9999 99 9999 + 000834 9999 99 99 0 9999 99 9999 + 000835 9999 99 99 0 9999 99 9999 + 000836 9999 99 99 0 9999 99 9999 + 000837 9999 99 99 0 9999 99 9999 + 000838 9999 99 99 0 9999 99 9999 + 000839 9999 99 99 0 9999 99 9999 + 000840 9999 99 99 0 9999 99 9999 + 000841 9999 99 99 0 9999 99 9999 + 000842 9999 99 99 0 9999 99 9999 + 000843 9999 99 99 0 9999 99 9999 + 000844 9999 99 99 0 9999 99 9999 + 000845 9999 99 99 0 9999 99 9999 + 000846 9999 99 99 0 9999 99 9999 + 000847 9999 99 99 0 9999 99 9999 + 000848 9999 99 99 0 9999 99 9999 + 000849 9999 99 99 0 9999 99 9999 + 000850 9999 99 99 0 9999 99 9999 + 000851 9999 99 99 0 9999 99 9999 + 000852 9999 99 99 0 9999 99 9999 + 000853 9999 99 99 0 9999 99 9999 + 000854 9999 99 99 0 9999 99 9999 + 000855 9999 99 99 0 9999 99 9999 + 000856 9999 99 99 0 9999 99 9999 + 000857 9999 99 99 0 9999 99 9999 + 000858 9999 99 99 0 9999 99 9999 + 000859 9999 99 99 0 9999 99 9999 + 000860 9999 99 99 0 9999 99 9999 + 000861 9999 99 99 0 9999 99 9999 + 000862 9999 99 99 0 9999 99 9999 + 000863 9999 99 99 0 9999 99 9999 + 000864 9999 99 99 0 9999 99 9999 + 000865 9999 99 99 0 9999 99 9999 + 000866 9999 99 99 0 9999 99 9999 + 000867 9999 99 99 0 9999 99 9999 + 000868 9999 99 99 0 9999 99 9999 + 000869 9999 99 99 0 9999 99 9999 + 000870 9999 99 99 0 9999 99 9999 + 000871 9999 99 99 0 9999 99 9999 + 000872 9999 99 99 0 9999 99 9999 + 000873 9999 99 99 0 9999 99 9999 + 000874 9999 99 99 0 9999 99 9999 + 000875 9999 99 99 0 9999 99 9999 + 000876 9999 99 99 0 9999 99 9999 + 000877 9999 99 99 0 9999 99 9999 + 000878 9999 99 99 0 9999 99 9999 + 000879 9999 99 99 0 9999 99 9999 + 000880 9999 99 99 0 9999 99 9999 + 000881 9999 99 99 0 9999 99 9999 + 000882 9999 99 99 0 9999 99 9999 + 000883 9999 99 99 0 9999 99 9999 + 000884 9999 99 99 0 9999 99 9999 + 000885 9999 99 99 0 9999 99 9999 + 000886 9999 99 99 0 9999 99 9999 + 000887 9999 99 99 0 9999 99 9999 + 000888 9999 99 99 0 9999 99 9999 + 000889 9999 99 99 0 9999 99 9999 + 000890 9999 99 99 0 9999 99 9999 + 000891 9999 99 99 0 9999 99 9999 + 000892 9999 99 99 0 9999 99 9999 + 000893 9999 99 99 0 9999 99 9999 + 000894 9999 99 99 0 9999 99 9999 + 000895 9999 99 99 0 9999 99 9999 + 000896 9999 99 99 0 9999 99 9999 + 000897 9999 99 99 0 9999 99 9999 + 000898 9999 99 99 0 9999 99 9999 + 000899 9999 99 99 0 9999 99 9999 + 000900 9999 99 99 0 9999 99 9999 + 000901 9999 99 99 0 9999 99 9999 + 000902 9999 99 99 0 9999 99 9999 + 000903 9999 99 99 0 9999 99 9999 + 000904 9999 99 99 0 9999 99 9999 + 000905 9999 99 99 0 9999 99 9999 + 000906 9999 99 99 0 9999 99 9999 + 000907 9999 99 99 0 9999 99 9999 + 000908 9999 99 99 0 9999 99 9999 + 000909 9999 99 99 0 9999 99 9999 + 000910 9999 99 99 0 9999 99 9999 + 000911 9999 99 99 0 9999 99 9999 + 000912 9999 99 99 0 9999 99 9999 + 000913 9999 99 99 0 9999 99 9999 + 000914 9999 99 99 0 9999 99 9999 + 000915 9999 99 99 0 9999 99 9999 + 000916 9999 99 99 0 9999 99 9999 + 000917 9999 99 99 0 9999 99 9999 + 000918 9999 99 99 0 9999 99 9999 + 000919 9999 99 99 0 9999 99 9999 + 000920 9999 99 99 0 9999 99 9999 + 000921 9999 99 99 0 9999 99 9999 + 000922 9999 99 99 0 9999 99 9999 + 000923 9999 99 99 0 9999 99 9999 + 000924 9999 99 99 0 9999 99 9999 + 000925 9999 99 99 0 9999 99 9999 + 000926 9999 99 99 0 9999 99 9999 + 000927 9999 99 99 0 9999 99 9999 + 000928 9999 99 99 0 9999 99 9999 + 000929 9999 99 99 0 9999 99 9999 + 000930 9999 99 99 0 9999 99 9999 + 000931 9999 99 99 0 9999 99 9999 + 000932 9999 99 99 0 9999 99 9999 + 000933 9999 99 99 0 9999 99 9999 + 000934 9999 99 99 0 9999 99 9999 + 000935 9999 99 99 0 9999 99 9999 + 000936 9999 99 99 0 9999 99 9999 + 000937 9999 99 99 0 9999 99 9999 + 000938 9999 99 99 0 9999 99 9999 + 000939 9999 99 99 0 9999 99 9999 + 000940 9999 99 99 0 9999 99 9999 + 000941 9999 99 99 0 9999 99 9999 + 000942 9999 99 99 0 9999 99 9999 + 000943 9999 99 99 0 9999 99 9999 + 000944 9999 99 99 0 9999 99 9999 + 000945 9999 99 99 0 9999 99 9999 + 000946 9999 99 99 0 9999 99 9999 + 000947 9999 99 99 0 9999 99 9999 + 000948 9999 99 99 0 9999 99 9999 + 000949 9999 99 99 0 9999 99 9999 + 000950 9999 99 99 0 9999 99 9999 + 000951 9999 99 99 0 9999 99 9999 + 000952 9999 99 99 0 9999 99 9999 + 000953 9999 99 99 0 9999 99 9999 + 000954 9999 99 99 0 9999 99 9999 + 000955 9999 99 99 0 9999 99 9999 + 000956 9999 99 99 0 9999 99 9999 + 000957 9999 99 99 0 9999 99 9999 + 000958 9999 99 99 0 9999 99 9999 + 000959 9999 99 99 0 9999 99 9999 + 000960 9999 99 99 0 9999 99 9999 + 000961 1202 25 01 1 305168412 00 0382 + 000962 1202 25 02 1 305168412 01 0382 + 000963 1202 25 03 1 305168412 02 0382 + 000964 1202 25 04 1 305168412 03 0382 + 000965 1202 25 05 1 305168412 04 0382 + 000966 1202 25 06 1 305168412 05 0382 + 000967 1202 25 07 1 305168412 06 0382 + 000968 1202 25 08 1 305168412 07 0382 + 000969 1202 26 01 1 305168412 08 0382 + 000970 1202 26 02 1 305168412 09 0382 + 000971 1202 26 03 1 305168412 10 0382 + 000972 1202 26 04 1 305168412 11 0382 + 000973 1202 26 05 1 305168412 12 0382 + 000974 1202 26 06 1 305168412 13 0382 + 000975 1202 26 07 1 305168412 14 0382 + 000976 1202 26 08 1 305168412 15 0382 + 000977 1202 27 01 1 305168416 00 0383 + 000978 1202 27 02 1 305168416 01 0383 + 000979 1202 27 03 1 305168416 02 0383 + 000980 1202 27 04 1 305168416 03 0383 + 000981 1202 27 05 1 305168416 04 0383 + 000982 1202 27 06 1 305168416 05 0383 + 000983 1202 27 07 1 305168416 06 0383 + 000984 1202 27 08 1 305168416 07 0383 + 000985 1202 28 01 1 305168416 08 0383 + 000986 1202 28 02 1 305168416 09 0383 + 000987 1202 28 03 1 305168416 10 0383 + 000988 1202 28 04 1 305168416 11 0383 + 000989 1202 28 05 1 305168416 12 0383 + 000990 1202 28 06 1 305168416 13 0383 + 000991 1202 28 07 1 305168416 14 0383 + 000992 1202 28 08 1 305168416 15 0383 + 000993 1202 29 01 1 305168404 00 0380 + 000994 1202 29 02 1 305168404 01 0380 + 000995 1202 29 03 1 305168404 02 0380 + 000996 1202 29 04 1 305168404 03 0380 + 000997 1202 29 05 1 305168404 04 0380 + 000998 1202 29 06 1 305168404 05 0380 + 000999 1202 29 07 1 305168404 06 0380 + 001000 1202 29 08 1 305168404 07 0380 + 001001 1202 30 01 1 305168404 08 0380 + 001002 1202 30 02 1 305168404 09 0380 + 001003 1202 30 03 1 305168404 10 0380 + 001004 1202 30 04 1 305168404 11 0380 + 001005 1202 30 05 1 305168404 12 0380 + 001006 1202 30 06 1 305168404 13 0380 + 001007 1202 30 07 1 305168404 14 0380 + 001008 1202 30 08 1 305168404 15 0380 + 001009 1202 31 01 1 305168408 00 0381 + 001010 1202 31 02 1 305168408 01 0381 + 001011 1202 31 03 1 305168408 02 0381 + 001012 1202 31 04 1 305168408 03 0381 + 001013 1202 31 05 1 305168408 04 0381 + 001014 1202 31 06 1 305168408 05 0381 + 001015 1202 31 07 1 305168408 06 0381 + 001016 1202 31 08 1 305168408 07 0381 + 001017 1202 32 01 1 305168408 08 0381 + 001018 1202 32 02 1 305168408 09 0381 + 001019 1202 32 03 1 305168408 10 0381 + 001020 1202 32 04 1 305168408 11 0381 + 001021 1202 32 05 1 305168408 12 0381 + 001022 1202 32 06 1 305168408 13 0381 + 001023 1202 32 07 1 305168408 14 0381 + 001024 1202 32 08 1 305168408 15 0381 + 001025 1202 33 01 1 305164312 00 0373 + 001026 1202 33 02 1 305164312 01 0373 + 001027 1202 33 03 1 305164312 02 0373 + 001028 1202 33 04 1 305164312 03 0373 + 001029 1202 33 05 1 305164312 04 0373 + 001030 1202 33 06 1 305164312 05 0373 + 001031 1202 33 07 1 305164312 06 0373 + 001032 1202 33 08 1 305164312 07 0373 + 001033 1202 34 01 1 305164312 08 0373 + 001034 1202 34 02 1 305164312 09 0373 + 001035 1202 34 03 1 305164312 10 0373 + 001036 1202 34 04 1 305164312 11 0373 + 001037 1202 34 05 1 305164312 12 0373 + 001038 1202 34 06 1 305164312 13 0373 + 001039 1202 34 07 1 305164312 14 0373 + 001040 1202 34 08 1 305164312 15 0373 + 001041 1202 35 01 1 305164308 00 0372 + 001042 1202 35 02 1 305164308 01 0372 + 001043 1202 35 03 1 305164308 02 0372 + 001044 1202 35 04 1 305164308 03 0372 + 001045 1202 35 05 1 305164308 04 0372 + 001046 1202 35 06 1 305164308 05 0372 + 001047 1202 35 07 1 305164308 06 0372 + 001048 1202 35 08 1 305164308 07 0372 + 001049 1202 36 01 1 305164308 08 0372 + 001050 1202 36 02 1 305164308 09 0372 + 001051 1202 36 03 1 305164308 10 0372 + 001052 1202 36 04 1 305164308 11 0372 + 001053 1202 36 05 1 305164308 12 0372 + 001054 1202 36 06 1 305164308 13 0372 + 001055 1202 36 07 1 305164308 14 0372 + 001056 1202 36 08 1 305164308 15 0372 + 001057 1202 37 01 1 305164320 00 0375 + 001058 1202 37 02 1 305164320 01 0375 + 001059 1202 37 03 1 305164320 02 0375 + 001060 1202 37 04 1 305164320 03 0375 + 001061 1202 37 05 1 305164320 04 0375 + 001062 1202 37 06 1 305164320 05 0375 + 001063 1202 37 07 1 305164320 06 0375 + 001064 1202 37 08 1 305164320 07 0375 + 001065 1202 38 01 1 305164320 08 0375 + 001066 1202 38 02 1 305164320 09 0375 + 001067 1202 38 03 1 305164320 10 0375 + 001068 1202 38 04 1 305164320 11 0375 + 001069 1202 38 05 1 305164320 12 0375 + 001070 1202 38 06 1 305164320 13 0375 + 001071 1202 38 07 1 305164320 14 0375 + 001072 1202 38 08 1 305164320 15 0375 + 001073 1202 39 01 1 305164316 00 0374 + 001074 1202 39 02 1 305164316 01 0374 + 001075 1202 39 03 1 305164316 02 0374 + 001076 1202 39 04 1 305164316 03 0374 + 001077 1202 39 05 1 305164316 04 0374 + 001078 1202 39 06 1 305164316 05 0374 + 001079 1202 39 07 1 305164316 06 0374 + 001080 1202 39 08 1 305164316 07 0374 + 001081 1202 40 01 1 305164316 08 0374 + 001082 1202 40 02 1 305164316 09 0374 + 001083 1202 40 03 1 305164316 10 0374 + 001084 1202 40 04 1 305164316 11 0374 + 001085 1202 40 05 1 305164316 12 0374 + 001086 1202 40 06 1 305164316 13 0374 + 001087 1202 40 07 1 305164316 14 0374 + 001088 1202 40 08 1 305164316 15 0374 + 001089 9999 99 99 0 9999 99 9999 + 001090 9999 99 99 0 9999 99 9999 + 001091 9999 99 99 0 9999 99 9999 + 001092 9999 99 99 0 9999 99 9999 + 001093 9999 99 99 0 9999 99 9999 + 001094 9999 99 99 0 9999 99 9999 + 001095 9999 99 99 0 9999 99 9999 + 001096 9999 99 99 0 9999 99 9999 + 001097 9999 99 99 0 9999 99 9999 + 001098 9999 99 99 0 9999 99 9999 + 001099 9999 99 99 0 9999 99 9999 + 001100 9999 99 99 0 9999 99 9999 + 001101 9999 99 99 0 9999 99 9999 + 001102 9999 99 99 0 9999 99 9999 + 001103 9999 99 99 0 9999 99 9999 + 001104 9999 99 99 0 9999 99 9999 + 001105 9999 99 99 0 9999 99 9999 + 001106 9999 99 99 0 9999 99 9999 + 001107 9999 99 99 0 9999 99 9999 + 001108 9999 99 99 0 9999 99 9999 + 001109 9999 99 99 0 9999 99 9999 + 001110 9999 99 99 0 9999 99 9999 + 001111 9999 99 99 0 9999 99 9999 + 001112 9999 99 99 0 9999 99 9999 + 001113 9999 99 99 0 9999 99 9999 + 001114 9999 99 99 0 9999 99 9999 + 001115 9999 99 99 0 9999 99 9999 + 001116 9999 99 99 0 9999 99 9999 + 001117 9999 99 99 0 9999 99 9999 + 001118 9999 99 99 0 9999 99 9999 + 001119 9999 99 99 0 9999 99 9999 + 001120 9999 99 99 0 9999 99 9999 + 001121 9999 99 99 0 9999 99 9999 + 001122 9999 99 99 0 9999 99 9999 + 001123 9999 99 99 0 9999 99 9999 + 001124 9999 99 99 0 9999 99 9999 + 001125 9999 99 99 0 9999 99 9999 + 001126 9999 99 99 0 9999 99 9999 + 001127 9999 99 99 0 9999 99 9999 + 001128 9999 99 99 0 9999 99 9999 + 001129 9999 99 99 0 9999 99 9999 + 001130 9999 99 99 0 9999 99 9999 + 001131 9999 99 99 0 9999 99 9999 + 001132 9999 99 99 0 9999 99 9999 + 001133 9999 99 99 0 9999 99 9999 + 001134 9999 99 99 0 9999 99 9999 + 001135 9999 99 99 0 9999 99 9999 + 001136 9999 99 99 0 9999 99 9999 + 001137 9999 99 99 0 9999 99 9999 + 001138 9999 99 99 0 9999 99 9999 + 001139 9999 99 99 0 9999 99 9999 + 001140 9999 99 99 0 9999 99 9999 + 001141 9999 99 99 0 9999 99 9999 + 001142 9999 99 99 0 9999 99 9999 + 001143 9999 99 99 0 9999 99 9999 + 001144 9999 99 99 0 9999 99 9999 + 001145 9999 99 99 0 9999 99 9999 + 001146 9999 99 99 0 9999 99 9999 + 001147 9999 99 99 0 9999 99 9999 + 001148 9999 99 99 0 9999 99 9999 + 001149 9999 99 99 0 9999 99 9999 + 001150 9999 99 99 0 9999 99 9999 + 001151 9999 99 99 0 9999 99 9999 + 001152 9999 99 99 0 9999 99 9999 + 001153 1203 01 01 1 303050772 08 0020 + 001154 1203 01 02 1 303050772 09 0020 + 001155 9999 99 99 0 9999 99 9999 + 001156 9999 99 99 0 9999 99 9999 + 001157 9999 99 99 0 9999 99 9999 + 001158 9999 99 99 0 9999 99 9999 + 001159 9999 99 99 0 9999 99 9999 + 001160 9999 99 99 0 9999 99 9999 + 001161 1203 02 01 1 303050772 10 0020 + 001162 1203 02 02 1 303050772 11 0020 + 001163 9999 99 99 0 9999 99 9999 + 001164 9999 99 99 0 9999 99 9999 + 001165 9999 99 99 0 9999 99 9999 + 001166 9999 99 99 0 9999 99 9999 + 001167 9999 99 99 0 9999 99 9999 + 001168 9999 99 99 0 9999 99 9999 + 001169 1203 03 01 1 303050772 12 0020 + 001170 1203 03 02 1 303050772 13 0020 + 001171 9999 99 99 0 9999 99 9999 + 001172 9999 99 99 0 9999 99 9999 + 001173 9999 99 99 0 9999 99 9999 + 001174 9999 99 99 0 9999 99 9999 + 001175 9999 99 99 0 9999 99 9999 + 001176 9999 99 99 0 9999 99 9999 + 001177 1203 04 01 1 303050772 14 0020 + 001178 1203 04 02 1 303050772 15 0020 + 001179 9999 99 99 0 9999 99 9999 + 001180 9999 99 99 0 9999 99 9999 + 001181 9999 99 99 0 9999 99 9999 + 001182 9999 99 99 0 9999 99 9999 + 001183 9999 99 99 0 9999 99 9999 + 001184 9999 99 99 0 9999 99 9999 + 001185 1203 05 01 1 303050772 00 0020 + 001186 1203 05 02 1 303050772 01 0020 + 001187 9999 99 99 0 9999 99 9999 + 001188 9999 99 99 0 9999 99 9999 + 001189 9999 99 99 0 9999 99 9999 + 001190 9999 99 99 0 9999 99 9999 + 001191 9999 99 99 0 9999 99 9999 + 001192 9999 99 99 0 9999 99 9999 + 001193 1203 06 01 1 303050772 02 0020 + 001194 1203 06 02 1 303050772 03 0020 + 001195 9999 99 99 0 9999 99 9999 + 001196 9999 99 99 0 9999 99 9999 + 001197 9999 99 99 0 9999 99 9999 + 001198 9999 99 99 0 9999 99 9999 + 001199 9999 99 99 0 9999 99 9999 + 001200 9999 99 99 0 9999 99 9999 + 001201 1203 07 01 1 303050772 04 0020 + 001202 1203 07 02 1 303050772 05 0020 + 001203 9999 99 99 0 9999 99 9999 + 001204 9999 99 99 0 9999 99 9999 + 001205 9999 99 99 0 9999 99 9999 + 001206 9999 99 99 0 9999 99 9999 + 001207 9999 99 99 0 9999 99 9999 + 001208 9999 99 99 0 9999 99 9999 + 001209 1203 08 01 1 303050772 06 0020 + 001210 1203 08 02 1 303050772 07 0020 + 001211 9999 99 99 0 9999 99 9999 + 001212 9999 99 99 0 9999 99 9999 + 001213 9999 99 99 0 9999 99 9999 + 001214 9999 99 99 0 9999 99 9999 + 001215 9999 99 99 0 9999 99 9999 + 001216 9999 99 99 0 9999 99 9999 + 001217 1203 09 01 1 304107544 00 0133 + 001218 1203 09 02 1 304107544 01 0133 + 001219 1203 09 03 1 304107544 02 0133 + 001220 1203 09 04 1 304107544 03 0133 + 001221 9999 99 99 0 9999 99 9999 + 001222 9999 99 99 0 9999 99 9999 + 001223 9999 99 99 0 9999 99 9999 + 001224 9999 99 99 0 9999 99 9999 + 001225 1203 10 01 1 304107544 04 0133 + 001226 1203 10 02 1 304107544 05 0133 + 001227 1203 10 03 1 304107544 06 0133 + 001228 1203 10 04 1 304107544 07 0133 + 001229 9999 99 99 0 9999 99 9999 + 001230 9999 99 99 0 9999 99 9999 + 001231 9999 99 99 0 9999 99 9999 + 001232 9999 99 99 0 9999 99 9999 + 001233 1203 11 01 1 304107544 08 0133 + 001234 1203 11 02 1 304107544 09 0133 + 001235 1203 11 03 1 304107544 10 0133 + 001236 1203 11 04 1 304107544 11 0133 + 001237 9999 99 99 0 9999 99 9999 + 001238 9999 99 99 0 9999 99 9999 + 001239 9999 99 99 0 9999 99 9999 + 001240 9999 99 99 0 9999 99 9999 + 001241 1203 12 01 1 304107544 12 0133 + 001242 1203 12 02 1 304107544 13 0133 + 001243 1203 12 03 1 304107544 14 0133 + 001244 1203 12 04 1 304107544 15 0133 + 001245 9999 99 99 0 9999 99 9999 + 001246 9999 99 99 0 9999 99 9999 + 001247 9999 99 99 0 9999 99 9999 + 001248 9999 99 99 0 9999 99 9999 + 001249 1203 13 01 1 304107540 08 0132 + 001250 1203 13 02 1 304107540 09 0132 + 001251 1203 13 03 1 304107540 10 0132 + 001252 1203 13 04 1 304107540 11 0132 + 001253 9999 99 99 0 9999 99 9999 + 001254 9999 99 99 0 9999 99 9999 + 001255 9999 99 99 0 9999 99 9999 + 001256 9999 99 99 0 9999 99 9999 + 001257 1203 14 01 1 304107540 12 0132 + 001258 1203 14 02 1 304107540 13 0132 + 001259 1203 14 03 1 304107540 14 0132 + 001260 1203 14 04 1 304107540 15 0132 + 001261 9999 99 99 0 9999 99 9999 + 001262 9999 99 99 0 9999 99 9999 + 001263 9999 99 99 0 9999 99 9999 + 001264 9999 99 99 0 9999 99 9999 + 001265 1203 15 01 1 304107540 00 0132 + 001266 1203 15 02 1 304107540 01 0132 + 001267 1203 15 03 1 304107540 02 0132 + 001268 1203 15 04 1 304107540 03 0132 + 001269 9999 99 99 0 9999 99 9999 + 001270 9999 99 99 0 9999 99 9999 + 001271 9999 99 99 0 9999 99 9999 + 001272 9999 99 99 0 9999 99 9999 + 001273 1203 16 01 1 304107540 04 0132 + 001274 1203 16 02 1 304107540 05 0132 + 001275 1203 16 03 1 304107540 06 0132 + 001276 1203 16 04 1 304107540 07 0132 + 001277 9999 99 99 0 9999 99 9999 + 001278 9999 99 99 0 9999 99 9999 + 001279 9999 99 99 0 9999 99 9999 + 001280 9999 99 99 0 9999 99 9999 + 001281 1203 17 01 1 306233372 00 0766 + 001282 1203 17 02 1 306233372 01 0766 + 001283 1203 17 03 1 306233372 02 0766 + 001284 1203 17 04 1 306233372 03 0766 + 001285 1203 17 05 1 306233372 04 0766 + 001286 1203 17 06 1 306233372 05 0766 + 001287 1203 17 07 1 306233372 06 0766 + 001288 1203 17 08 1 306233372 07 0766 + 001289 1203 18 01 1 306233372 08 0766 + 001290 1203 18 02 1 306233372 09 0766 + 001291 1203 18 03 1 306233372 10 0766 + 001292 1203 18 04 1 306233372 11 0766 + 001293 1203 18 05 1 306233372 12 0766 + 001294 1203 18 06 1 306233372 13 0766 + 001295 1203 18 07 1 306233372 14 0766 + 001296 1203 18 08 1 306233372 15 0766 + 001297 1203 19 01 1 306233376 00 0767 + 001298 1203 19 02 1 306233376 01 0767 + 001299 1203 19 03 1 306233376 02 0767 + 001300 1203 19 04 1 306233376 03 0767 + 001301 1203 19 05 1 306233376 04 0767 + 001302 1203 19 06 1 306233376 05 0767 + 001303 1203 19 07 1 306233376 06 0767 + 001304 1203 19 08 1 306233376 07 0767 + 001305 1203 20 01 1 306233376 08 0767 + 001306 1203 20 02 1 306233376 09 0767 + 001307 1203 20 03 1 306233376 10 0767 + 001308 1203 20 04 1 306233376 11 0767 + 001309 1203 20 05 1 306233376 12 0767 + 001310 1203 20 06 1 306233376 13 0767 + 001311 1203 20 07 1 306233376 14 0767 + 001312 1203 20 08 1 306233376 15 0767 + 001313 1203 21 01 1 306233364 00 0764 + 001314 1203 21 02 1 306233364 01 0764 + 001315 1203 21 03 1 306233364 02 0764 + 001316 1203 21 04 1 306233364 03 0764 + 001317 1203 21 05 1 306233364 04 0764 + 001318 1203 21 06 1 306233364 05 0764 + 001319 1203 21 07 1 306233364 06 0764 + 001320 1203 21 08 1 306233364 07 0764 + 001321 1203 22 01 1 306233364 08 0764 + 001322 1203 22 02 1 306233364 09 0764 + 001323 1203 22 03 1 306233364 10 0764 + 001324 1203 22 04 1 306233364 11 0764 + 001325 1203 22 05 1 306233364 12 0764 + 001326 1203 22 06 1 306233364 13 0764 + 001327 1203 22 07 1 306233364 14 0764 + 001328 1203 22 08 1 306233364 15 0764 + 001329 1203 23 01 1 306233368 00 0765 + 001330 1203 23 02 1 306233368 01 0765 + 001331 1203 23 03 1 306233368 02 0765 + 001332 1203 23 04 1 306233368 03 0765 + 001333 1203 23 05 1 306233368 04 0765 + 001334 1203 23 06 1 306233368 05 0765 + 001335 1203 23 07 1 306233368 06 0765 + 001336 1203 23 08 1 306233368 07 0765 + 001337 1203 24 01 1 306233368 08 0765 + 001338 1203 24 02 1 306233368 09 0765 + 001339 1203 24 03 1 306233368 10 0765 + 001340 1203 24 04 1 306233368 11 0765 + 001341 1203 24 05 1 306233368 12 0765 + 001342 1203 24 06 1 306233368 13 0765 + 001343 1203 24 07 1 306233368 14 0765 + 001344 1203 24 08 1 306233368 15 0765 + 001345 1203 25 01 1 303046684 08 0014 + 001346 1203 25 02 1 303046684 09 0014 + 001347 9999 99 99 0 9999 99 9999 + 001348 9999 99 99 0 9999 99 9999 + 001349 9999 99 99 0 9999 99 9999 + 001350 9999 99 99 0 9999 99 9999 + 001351 9999 99 99 0 9999 99 9999 + 001352 9999 99 99 0 9999 99 9999 + 001353 1203 26 01 1 303046684 10 0014 + 001354 1203 26 02 1 303046684 11 0014 + 001355 9999 99 99 0 9999 99 9999 + 001356 9999 99 99 0 9999 99 9999 + 001357 9999 99 99 0 9999 99 9999 + 001358 9999 99 99 0 9999 99 9999 + 001359 9999 99 99 0 9999 99 9999 + 001360 9999 99 99 0 9999 99 9999 + 001361 1203 27 01 1 303046684 12 0014 + 001362 1203 27 02 1 303046684 13 0014 + 001363 9999 99 99 0 9999 99 9999 + 001364 9999 99 99 0 9999 99 9999 + 001365 9999 99 99 0 9999 99 9999 + 001366 9999 99 99 0 9999 99 9999 + 001367 9999 99 99 0 9999 99 9999 + 001368 9999 99 99 0 9999 99 9999 + 001369 1203 28 01 1 303046684 14 0014 + 001370 1203 28 02 1 303046684 15 0014 + 001371 9999 99 99 0 9999 99 9999 + 001372 9999 99 99 0 9999 99 9999 + 001373 9999 99 99 0 9999 99 9999 + 001374 9999 99 99 0 9999 99 9999 + 001375 9999 99 99 0 9999 99 9999 + 001376 9999 99 99 0 9999 99 9999 + 001377 1203 29 01 1 303046684 04 0014 + 001378 1203 29 02 1 303046684 05 0014 + 001379 9999 99 99 0 9999 99 9999 + 001380 9999 99 99 0 9999 99 9999 + 001381 9999 99 99 0 9999 99 9999 + 001382 9999 99 99 0 9999 99 9999 + 001383 9999 99 99 0 9999 99 9999 + 001384 9999 99 99 0 9999 99 9999 + 001385 1203 30 01 1 303046684 06 0014 + 001386 1203 30 02 1 303046684 07 0014 + 001387 9999 99 99 0 9999 99 9999 + 001388 9999 99 99 0 9999 99 9999 + 001389 9999 99 99 0 9999 99 9999 + 001390 9999 99 99 0 9999 99 9999 + 001391 9999 99 99 0 9999 99 9999 + 001392 9999 99 99 0 9999 99 9999 + 001393 1203 31 01 1 303046684 00 0014 + 001394 1203 31 02 1 303046684 01 0014 + 001395 9999 99 99 0 9999 99 9999 + 001396 9999 99 99 0 9999 99 9999 + 001397 9999 99 99 0 9999 99 9999 + 001398 9999 99 99 0 9999 99 9999 + 001399 9999 99 99 0 9999 99 9999 + 001400 9999 99 99 0 9999 99 9999 + 001401 1203 32 01 1 303046684 02 0014 + 001402 1203 32 02 1 303046684 03 0014 + 001403 9999 99 99 0 9999 99 9999 + 001404 9999 99 99 0 9999 99 9999 + 001405 9999 99 99 0 9999 99 9999 + 001406 9999 99 99 0 9999 99 9999 + 001407 9999 99 99 0 9999 99 9999 + 001408 9999 99 99 0 9999 99 9999 + 001409 1203 33 01 1 306229276 00 0758 + 001410 1203 33 02 1 306229276 01 0758 + 001411 1203 33 03 1 306229276 02 0758 + 001412 1203 33 04 1 306229276 03 0758 + 001413 1203 33 05 1 306229276 04 0758 + 001414 1203 33 06 1 306229276 05 0758 + 001415 1203 33 07 1 306229276 06 0758 + 001416 1203 33 08 1 306229276 07 0758 + 001417 1203 34 01 1 306229276 08 0758 + 001418 1203 34 02 1 306229276 09 0758 + 001419 1203 34 03 1 306229276 10 0758 + 001420 1203 34 04 1 306229276 11 0758 + 001421 1203 34 05 1 306229276 12 0758 + 001422 1203 34 06 1 306229276 13 0758 + 001423 1203 34 07 1 306229276 14 0758 + 001424 1203 34 08 1 306229276 15 0758 + 001425 1203 35 01 1 306229280 00 0759 + 001426 1203 35 02 1 306229280 01 0759 + 001427 1203 35 03 1 306229280 02 0759 + 001428 1203 35 04 1 306229280 03 0759 + 001429 1203 35 05 1 306229280 04 0759 + 001430 1203 35 06 1 306229280 05 0759 + 001431 1203 35 07 1 306229280 06 0759 + 001432 1203 35 08 1 306229280 07 0759 + 001433 1203 36 01 1 306229280 08 0759 + 001434 1203 36 02 1 306229280 09 0759 + 001435 1203 36 03 1 306229280 10 0759 + 001436 1203 36 04 1 306229280 11 0759 + 001437 1203 36 05 1 306229280 12 0759 + 001438 1203 36 06 1 306229280 13 0759 + 001439 1203 36 07 1 306229280 14 0759 + 001440 1203 36 08 1 306229280 15 0759 + 001441 1203 37 01 1 306229268 00 0756 + 001442 1203 37 02 1 306229268 01 0756 + 001443 1203 37 03 1 306229268 02 0756 + 001444 1203 37 04 1 306229268 03 0756 + 001445 1203 37 05 1 306229268 04 0756 + 001446 1203 37 06 1 306229268 05 0756 + 001447 1203 37 07 1 306229268 06 0756 + 001448 1203 37 08 1 306229268 07 0756 + 001449 1203 38 01 1 306229268 08 0756 + 001450 1203 38 02 1 306229268 09 0756 + 001451 1203 38 03 1 306229268 10 0756 + 001452 1203 38 04 1 306229268 11 0756 + 001453 1203 38 05 1 306229268 12 0756 + 001454 1203 38 06 1 306229268 13 0756 + 001455 1203 38 07 1 306229268 14 0756 + 001456 1203 38 08 1 306229268 15 0756 + 001457 1203 39 01 1 306229272 00 0757 + 001458 1203 39 02 1 306229272 01 0757 + 001459 1203 39 03 1 306229272 02 0757 + 001460 1203 39 04 1 306229272 03 0757 + 001461 1203 39 05 1 306229272 04 0757 + 001462 1203 39 06 1 306229272 05 0757 + 001463 1203 39 07 1 306229272 06 0757 + 001464 1203 39 08 1 306229272 07 0757 + 001465 1203 40 01 1 306229272 08 0757 + 001466 1203 40 02 1 306229272 09 0757 + 001467 1203 40 03 1 306229272 10 0757 + 001468 1203 40 04 1 306229272 11 0757 + 001469 1203 40 05 1 306229272 12 0757 + 001470 1203 40 06 1 306229272 13 0757 + 001471 1203 40 07 1 306229272 14 0757 + 001472 1203 40 08 1 306229272 15 0757 + 001473 1203 41 01 1 304107548 00 0134 + 001474 1203 41 02 1 304107548 01 0134 + 001475 1203 41 03 1 304107548 02 0134 + 001476 1203 41 04 1 304107548 03 0134 + 001477 9999 99 99 0 9999 99 9999 + 001478 9999 99 99 0 9999 99 9999 + 001479 9999 99 99 0 9999 99 9999 + 001480 9999 99 99 0 9999 99 9999 + 001481 1203 42 01 1 304107548 04 0134 + 001482 1203 42 02 1 304107548 05 0134 + 001483 1203 42 03 1 304107548 06 0134 + 001484 1203 42 04 1 304107548 07 0134 + 001485 9999 99 99 0 9999 99 9999 + 001486 9999 99 99 0 9999 99 9999 + 001487 9999 99 99 0 9999 99 9999 + 001488 9999 99 99 0 9999 99 9999 + 001489 1203 43 01 1 304107548 08 0134 + 001490 1203 43 02 1 304107548 09 0134 + 001491 1203 43 03 1 304107548 10 0134 + 001492 1203 43 04 1 304107548 11 0134 + 001493 9999 99 99 0 9999 99 9999 + 001494 9999 99 99 0 9999 99 9999 + 001495 9999 99 99 0 9999 99 9999 + 001496 9999 99 99 0 9999 99 9999 + 001497 1203 44 01 1 304107548 12 0134 + 001498 1203 44 02 1 304107548 13 0134 + 001499 1203 44 03 1 304107548 14 0134 + 001500 1203 44 04 1 304107548 15 0134 + 001501 9999 99 99 0 9999 99 9999 + 001502 9999 99 99 0 9999 99 9999 + 001503 9999 99 99 0 9999 99 9999 + 001504 9999 99 99 0 9999 99 9999 + 001505 1203 45 01 1 304107552 00 0135 + 001506 1203 45 02 1 304107552 01 0135 + 001507 1203 45 03 1 304107552 02 0135 + 001508 1203 45 04 1 304107552 03 0135 + 001509 9999 99 99 0 9999 99 9999 + 001510 9999 99 99 0 9999 99 9999 + 001511 9999 99 99 0 9999 99 9999 + 001512 9999 99 99 0 9999 99 9999 + 001513 1203 46 01 1 304107552 04 0135 + 001514 1203 46 02 1 304107552 05 0135 + 001515 1203 46 03 1 304107552 06 0135 + 001516 1203 46 04 1 304107552 07 0135 + 001517 9999 99 99 0 9999 99 9999 + 001518 9999 99 99 0 9999 99 9999 + 001519 9999 99 99 0 9999 99 9999 + 001520 9999 99 99 0 9999 99 9999 + 001521 1203 47 01 1 304107552 08 0135 + 001522 1203 47 02 1 304107552 09 0135 + 001523 1203 47 03 1 304107552 10 0135 + 001524 1203 47 04 1 304107552 11 0135 + 001525 9999 99 99 0 9999 99 9999 + 001526 9999 99 99 0 9999 99 9999 + 001527 9999 99 99 0 9999 99 9999 + 001528 9999 99 99 0 9999 99 9999 + 001529 1203 48 01 1 304107552 12 0135 + 001530 1203 48 02 1 304107552 13 0135 + 001531 1203 48 03 1 304107552 14 0135 + 001532 1203 48 04 1 304107552 15 0135 + 001533 9999 99 99 0 9999 99 9999 + 001534 9999 99 99 0 9999 99 9999 + 001535 9999 99 99 0 9999 99 9999 + 001536 9999 99 99 0 9999 99 9999 + 001537 1204 01 01 1 304103448 08 0125 + 001538 1204 01 02 1 304103448 09 0125 + 001539 1204 01 03 1 304103448 10 0125 + 001540 1204 01 04 1 304103448 11 0125 + 001541 9999 99 99 0 9999 99 9999 + 001542 9999 99 99 0 9999 99 9999 + 001543 9999 99 99 0 9999 99 9999 + 001544 9999 99 99 0 9999 99 9999 + 001545 1204 02 01 1 304103448 12 0125 + 001546 1204 02 02 1 304103448 13 0125 + 001547 1204 02 03 1 304103448 14 0125 + 001548 1204 02 04 1 304103448 15 0125 + 001549 9999 99 99 0 9999 99 9999 + 001550 9999 99 99 0 9999 99 9999 + 001551 9999 99 99 0 9999 99 9999 + 001552 9999 99 99 0 9999 99 9999 + 001553 1204 03 01 1 304103448 00 0125 + 001554 1204 03 02 1 304103448 01 0125 + 001555 1204 03 03 1 304103448 02 0125 + 001556 1204 03 04 1 304103448 03 0125 + 001557 9999 99 99 0 9999 99 9999 + 001558 9999 99 99 0 9999 99 9999 + 001559 9999 99 99 0 9999 99 9999 + 001560 9999 99 99 0 9999 99 9999 + 001561 1204 04 01 1 304103448 04 0125 + 001562 1204 04 02 1 304103448 05 0125 + 001563 1204 04 03 1 304103448 06 0125 + 001564 1204 04 04 1 304103448 07 0125 + 001565 9999 99 99 0 9999 99 9999 + 001566 9999 99 99 0 9999 99 9999 + 001567 9999 99 99 0 9999 99 9999 + 001568 9999 99 99 0 9999 99 9999 + 001569 1204 05 01 1 304103444 08 0124 + 001570 1204 05 02 1 304103444 09 0124 + 001571 1204 05 03 1 304103444 10 0124 + 001572 1204 05 04 1 304103444 11 0124 + 001573 9999 99 99 0 9999 99 9999 + 001574 9999 99 99 0 9999 99 9999 + 001575 9999 99 99 0 9999 99 9999 + 001576 9999 99 99 0 9999 99 9999 + 001577 1204 06 01 1 304103444 12 0124 + 001578 1204 06 02 1 304103444 13 0124 + 001579 1204 06 03 1 304103444 14 0124 + 001580 1204 06 04 1 304103444 15 0124 + 001581 9999 99 99 0 9999 99 9999 + 001582 9999 99 99 0 9999 99 9999 + 001583 9999 99 99 0 9999 99 9999 + 001584 9999 99 99 0 9999 99 9999 + 001585 1204 07 01 1 304103444 00 0124 + 001586 1204 07 02 1 304103444 01 0124 + 001587 1204 07 03 1 304103444 02 0124 + 001588 1204 07 04 1 304103444 03 0124 + 001589 9999 99 99 0 9999 99 9999 + 001590 9999 99 99 0 9999 99 9999 + 001591 9999 99 99 0 9999 99 9999 + 001592 9999 99 99 0 9999 99 9999 + 001593 1204 08 01 1 304103444 04 0124 + 001594 1204 08 02 1 304103444 05 0124 + 001595 1204 08 03 1 304103444 06 0124 + 001596 1204 08 04 1 304103444 07 0124 + 001597 9999 99 99 0 9999 99 9999 + 001598 9999 99 99 0 9999 99 9999 + 001599 9999 99 99 0 9999 99 9999 + 001600 9999 99 99 0 9999 99 9999 + 001601 1204 09 01 1 306225176 00 0749 + 001602 1204 09 02 1 306225176 01 0749 + 001603 1204 09 03 1 306225176 02 0749 + 001604 1204 09 04 1 306225176 03 0749 + 001605 1204 09 05 1 306225176 04 0749 + 001606 1204 09 06 1 306225176 05 0749 + 001607 1204 09 07 1 306225176 06 0749 + 001608 1204 09 08 1 306225176 07 0749 + 001609 1204 10 01 1 306225176 08 0749 + 001610 1204 10 02 1 306225176 09 0749 + 001611 1204 10 03 1 306225176 10 0749 + 001612 1204 10 04 1 306225176 11 0749 + 001613 1204 10 05 1 306225176 12 0749 + 001614 1204 10 06 1 306225176 13 0749 + 001615 1204 10 07 1 306225176 14 0749 + 001616 1204 10 08 1 306225176 15 0749 + 001617 1204 11 01 1 306225172 00 0748 + 001618 1204 11 02 1 306225172 01 0748 + 001619 1204 11 03 1 306225172 02 0748 + 001620 1204 11 04 1 306225172 03 0748 + 001621 1204 11 05 1 306225172 04 0748 + 001622 1204 11 06 1 306225172 05 0748 + 001623 1204 11 07 1 306225172 06 0748 + 001624 1204 11 08 1 306225172 07 0748 + 001625 1204 12 01 1 306225172 08 0748 + 001626 1204 12 02 1 306225172 09 0748 + 001627 1204 12 03 1 306225172 10 0748 + 001628 1204 12 04 1 306225172 11 0748 + 001629 1204 12 05 1 306225172 12 0748 + 001630 1204 12 06 1 306225172 13 0748 + 001631 1204 12 07 1 306225172 14 0748 + 001632 1204 12 08 1 306225172 15 0748 + 001633 1204 13 01 1 306225184 00 0751 + 001634 1204 13 02 1 306225184 01 0751 + 001635 1204 13 03 1 306225184 02 0751 + 001636 1204 13 04 1 306225184 03 0751 + 001637 1204 13 05 1 306225184 04 0751 + 001638 1204 13 06 1 306225184 05 0751 + 001639 1204 13 07 1 306225184 06 0751 + 001640 1204 13 08 1 306225184 07 0751 + 001641 1204 14 01 1 306225184 08 0751 + 001642 1204 14 02 1 306225184 09 0751 + 001643 1204 14 03 1 306225184 10 0751 + 001644 1204 14 04 1 306225184 11 0751 + 001645 1204 14 05 1 306225184 12 0751 + 001646 1204 14 06 1 306225184 13 0751 + 001647 1204 14 07 1 306225184 14 0751 + 001648 1204 14 08 1 306225184 15 0751 + 001649 1204 15 01 1 306225180 00 0750 + 001650 1204 15 02 1 306225180 01 0750 + 001651 1204 15 03 1 306225180 02 0750 + 001652 1204 15 04 1 306225180 03 0750 + 001653 1204 15 05 1 306225180 04 0750 + 001654 1204 15 06 1 306225180 05 0750 + 001655 1204 15 07 1 306225180 06 0750 + 001656 1204 15 08 1 306225180 07 0750 + 001657 1204 16 01 1 306225180 08 0750 + 001658 1204 16 02 1 306225180 09 0750 + 001659 1204 16 03 1 306225180 10 0750 + 001660 1204 16 04 1 306225180 11 0750 + 001661 1204 16 05 1 306225180 12 0750 + 001662 1204 16 06 1 306225180 13 0750 + 001663 1204 16 07 1 306225180 14 0750 + 001664 1204 16 08 1 306225180 15 0750 + 001665 1204 17 01 1 303046688 12 0015 + 001666 1204 17 02 1 303046688 13 0015 + 001667 9999 99 99 0 9999 99 9999 + 001668 9999 99 99 0 9999 99 9999 + 001669 9999 99 99 0 9999 99 9999 + 001670 9999 99 99 0 9999 99 9999 + 001671 9999 99 99 0 9999 99 9999 + 001672 9999 99 99 0 9999 99 9999 + 001673 1204 18 01 1 303046688 14 0015 + 001674 1204 18 02 1 303046688 15 0015 + 001675 9999 99 99 0 9999 99 9999 + 001676 9999 99 99 0 9999 99 9999 + 001677 9999 99 99 0 9999 99 9999 + 001678 9999 99 99 0 9999 99 9999 + 001679 9999 99 99 0 9999 99 9999 + 001680 9999 99 99 0 9999 99 9999 + 001681 1204 19 01 1 303046688 08 0015 + 001682 1204 19 02 1 303046688 09 0015 + 001683 9999 99 99 0 9999 99 9999 + 001684 9999 99 99 0 9999 99 9999 + 001685 9999 99 99 0 9999 99 9999 + 001686 9999 99 99 0 9999 99 9999 + 001687 9999 99 99 0 9999 99 9999 + 001688 9999 99 99 0 9999 99 9999 + 001689 1204 20 01 1 303046688 10 0015 + 001690 1204 20 02 1 303046688 11 0015 + 001691 9999 99 99 0 9999 99 9999 + 001692 9999 99 99 0 9999 99 9999 + 001693 9999 99 99 0 9999 99 9999 + 001694 9999 99 99 0 9999 99 9999 + 001695 9999 99 99 0 9999 99 9999 + 001696 9999 99 99 0 9999 99 9999 + 001697 1204 21 01 1 303046688 00 0015 + 001698 1204 21 02 1 303046688 01 0015 + 001699 9999 99 99 0 9999 99 9999 + 001700 9999 99 99 0 9999 99 9999 + 001701 9999 99 99 0 9999 99 9999 + 001702 9999 99 99 0 9999 99 9999 + 001703 9999 99 99 0 9999 99 9999 + 001704 9999 99 99 0 9999 99 9999 + 001705 1204 22 01 1 303046688 02 0015 + 001706 1204 22 02 1 303046688 03 0015 + 001707 9999 99 99 0 9999 99 9999 + 001708 9999 99 99 0 9999 99 9999 + 001709 9999 99 99 0 9999 99 9999 + 001710 9999 99 99 0 9999 99 9999 + 001711 9999 99 99 0 9999 99 9999 + 001712 9999 99 99 0 9999 99 9999 + 001713 1204 23 01 1 303046688 04 0015 + 001714 1204 23 02 1 303046688 05 0015 + 001715 9999 99 99 0 9999 99 9999 + 001716 9999 99 99 0 9999 99 9999 + 001717 9999 99 99 0 9999 99 9999 + 001718 9999 99 99 0 9999 99 9999 + 001719 9999 99 99 0 9999 99 9999 + 001720 9999 99 99 0 9999 99 9999 + 001721 1204 24 01 1 303046688 06 0015 + 001722 1204 24 02 1 303046688 07 0015 + 001723 9999 99 99 0 9999 99 9999 + 001724 9999 99 99 0 9999 99 9999 + 001725 9999 99 99 0 9999 99 9999 + 001726 9999 99 99 0 9999 99 9999 + 001727 9999 99 99 0 9999 99 9999 + 001728 9999 99 99 0 9999 99 9999 + 001729 1204 25 01 1 305172508 00 0390 + 001730 1204 25 02 1 305172508 01 0390 + 001731 1204 25 03 1 305172508 02 0390 + 001732 1204 25 04 1 305172508 03 0390 + 001733 1204 25 05 1 305172508 04 0390 + 001734 1204 25 06 1 305172508 05 0390 + 001735 1204 25 07 1 305172508 06 0390 + 001736 1204 25 08 1 305172508 07 0390 + 001737 1204 26 01 1 305172508 08 0390 + 001738 1204 26 02 1 305172508 09 0390 + 001739 1204 26 03 1 305172508 10 0390 + 001740 1204 26 04 1 305172508 11 0390 + 001741 1204 26 05 1 305172508 12 0390 + 001742 1204 26 06 1 305172508 13 0390 + 001743 1204 26 07 1 305172508 14 0390 + 001744 1204 26 08 1 305172508 15 0390 + 001745 1204 27 01 1 305172512 00 0391 + 001746 1204 27 02 1 305172512 01 0391 + 001747 1204 27 03 1 305172512 02 0391 + 001748 1204 27 04 1 305172512 03 0391 + 001749 1204 27 05 1 305172512 04 0391 + 001750 1204 27 06 1 305172512 05 0391 + 001751 1204 27 07 1 305172512 06 0391 + 001752 1204 27 08 1 305172512 07 0391 + 001753 1204 28 01 1 305172512 08 0391 + 001754 1204 28 02 1 305172512 09 0391 + 001755 1204 28 03 1 305172512 10 0391 + 001756 1204 28 04 1 305172512 11 0391 + 001757 1204 28 05 1 305172512 12 0391 + 001758 1204 28 06 1 305172512 13 0391 + 001759 1204 28 07 1 305172512 14 0391 + 001760 1204 28 08 1 305172512 15 0391 + 001761 1204 29 01 1 305172500 00 0388 + 001762 1204 29 02 1 305172500 01 0388 + 001763 1204 29 03 1 305172500 02 0388 + 001764 1204 29 04 1 305172500 03 0388 + 001765 1204 29 05 1 305172500 04 0388 + 001766 1204 29 06 1 305172500 05 0388 + 001767 1204 29 07 1 305172500 06 0388 + 001768 1204 29 08 1 305172500 07 0388 + 001769 1204 30 01 1 305172500 08 0388 + 001770 1204 30 02 1 305172500 09 0388 + 001771 1204 30 03 1 305172500 10 0388 + 001772 1204 30 04 1 305172500 11 0388 + 001773 1204 30 05 1 305172500 12 0388 + 001774 1204 30 06 1 305172500 13 0388 + 001775 1204 30 07 1 305172500 14 0388 + 001776 1204 30 08 1 305172500 15 0388 + 001777 1204 31 01 1 305172504 00 0389 + 001778 1204 31 02 1 305172504 01 0389 + 001779 1204 31 03 1 305172504 02 0389 + 001780 1204 31 04 1 305172504 03 0389 + 001781 1204 31 05 1 305172504 04 0389 + 001782 1204 31 06 1 305172504 05 0389 + 001783 1204 31 07 1 305172504 06 0389 + 001784 1204 31 08 1 305172504 07 0389 + 001785 1204 32 01 1 305172504 08 0389 + 001786 1204 32 02 1 305172504 09 0389 + 001787 1204 32 03 1 305172504 10 0389 + 001788 1204 32 04 1 305172504 11 0389 + 001789 1204 32 05 1 305172504 12 0389 + 001790 1204 32 06 1 305172504 13 0389 + 001791 1204 32 07 1 305172504 14 0389 + 001792 1204 32 08 1 305172504 15 0389 + 001793 1204 33 01 1 306221080 00 0741 + 001794 1204 33 02 1 306221080 01 0741 + 001795 1204 33 03 1 306221080 02 0741 + 001796 1204 33 04 1 306221080 03 0741 + 001797 1204 33 05 1 306221080 04 0741 + 001798 1204 33 06 1 306221080 05 0741 + 001799 1204 33 07 1 306221080 06 0741 + 001800 1204 33 08 1 306221080 07 0741 + 001801 1204 34 01 1 306221080 08 0741 + 001802 1204 34 02 1 306221080 09 0741 + 001803 1204 34 03 1 306221080 10 0741 + 001804 1204 34 04 1 306221080 11 0741 + 001805 1204 34 05 1 306221080 12 0741 + 001806 1204 34 06 1 306221080 13 0741 + 001807 1204 34 07 1 306221080 14 0741 + 001808 1204 34 08 1 306221080 15 0741 + 001809 1204 35 01 1 306221076 00 0740 + 001810 1204 35 02 1 306221076 01 0740 + 001811 1204 35 03 1 306221076 02 0740 + 001812 1204 35 04 1 306221076 03 0740 + 001813 1204 35 05 1 306221076 04 0740 + 001814 1204 35 06 1 306221076 05 0740 + 001815 1204 35 07 1 306221076 06 0740 + 001816 1204 35 08 1 306221076 07 0740 + 001817 1204 36 01 1 306221076 08 0740 + 001818 1204 36 02 1 306221076 09 0740 + 001819 1204 36 03 1 306221076 10 0740 + 001820 1204 36 04 1 306221076 11 0740 + 001821 1204 36 05 1 306221076 12 0740 + 001822 1204 36 06 1 306221076 13 0740 + 001823 1204 36 07 1 306221076 14 0740 + 001824 1204 36 08 1 306221076 15 0740 + 001825 1204 37 01 1 306221088 00 0743 + 001826 1204 37 02 1 306221088 01 0743 + 001827 1204 37 03 1 306221088 02 0743 + 001828 1204 37 04 1 306221088 03 0743 + 001829 1204 37 05 1 306221088 04 0743 + 001830 1204 37 06 1 306221088 05 0743 + 001831 1204 37 07 1 306221088 06 0743 + 001832 1204 37 08 1 306221088 07 0743 + 001833 1204 38 01 1 306221088 08 0743 + 001834 1204 38 02 1 306221088 09 0743 + 001835 1204 38 03 1 306221088 10 0743 + 001836 1204 38 04 1 306221088 11 0743 + 001837 1204 38 05 1 306221088 12 0743 + 001838 1204 38 06 1 306221088 13 0743 + 001839 1204 38 07 1 306221088 14 0743 + 001840 1204 38 08 1 306221088 15 0743 + 001841 1204 39 01 1 306221084 00 0742 + 001842 1204 39 02 1 306221084 01 0742 + 001843 1204 39 03 1 306221084 02 0742 + 001844 1204 39 04 1 306221084 03 0742 + 001845 1204 39 05 1 306221084 04 0742 + 001846 1204 39 06 1 306221084 05 0742 + 001847 1204 39 07 1 306221084 06 0742 + 001848 1204 39 08 1 306221084 07 0742 + 001849 1204 40 01 1 306221084 08 0742 + 001850 1204 40 02 1 306221084 09 0742 + 001851 1204 40 03 1 306221084 10 0742 + 001852 1204 40 04 1 306221084 11 0742 + 001853 1204 40 05 1 306221084 12 0742 + 001854 1204 40 06 1 306221084 13 0742 + 001855 1204 40 07 1 306221084 14 0742 + 001856 1204 40 08 1 306221084 15 0742 + 001857 1204 41 01 1 304103456 08 0127 + 001858 1204 41 02 1 304103456 09 0127 + 001859 1204 41 03 1 304103456 10 0127 + 001860 1204 41 04 1 304103456 11 0127 + 001861 9999 99 99 0 9999 99 9999 + 001862 9999 99 99 0 9999 99 9999 + 001863 9999 99 99 0 9999 99 9999 + 001864 9999 99 99 0 9999 99 9999 + 001865 1204 42 01 1 304103456 12 0127 + 001866 1204 42 02 1 304103456 13 0127 + 001867 1204 42 03 1 304103456 14 0127 + 001868 1204 42 04 1 304103456 15 0127 + 001869 9999 99 99 0 9999 99 9999 + 001870 9999 99 99 0 9999 99 9999 + 001871 9999 99 99 0 9999 99 9999 + 001872 9999 99 99 0 9999 99 9999 + 001873 1204 43 01 1 304103456 00 0127 + 001874 1204 43 02 1 304103456 01 0127 + 001875 1204 43 03 1 304103456 02 0127 + 001876 1204 43 04 1 304103456 03 0127 + 001877 9999 99 99 0 9999 99 9999 + 001878 9999 99 99 0 9999 99 9999 + 001879 9999 99 99 0 9999 99 9999 + 001880 9999 99 99 0 9999 99 9999 + 001881 1204 44 01 1 304103456 04 0127 + 001882 1204 44 02 1 304103456 05 0127 + 001883 1204 44 03 1 304103456 06 0127 + 001884 1204 44 04 1 304103456 07 0127 + 001885 9999 99 99 0 9999 99 9999 + 001886 9999 99 99 0 9999 99 9999 + 001887 9999 99 99 0 9999 99 9999 + 001888 9999 99 99 0 9999 99 9999 + 001889 1204 45 01 1 304103452 08 0126 + 001890 1204 45 02 1 304103452 09 0126 + 001891 1204 45 03 1 304103452 10 0126 + 001892 1204 45 04 1 304103452 11 0126 + 001893 9999 99 99 0 9999 99 9999 + 001894 9999 99 99 0 9999 99 9999 + 001895 9999 99 99 0 9999 99 9999 + 001896 9999 99 99 0 9999 99 9999 + 001897 1204 46 01 1 304103452 12 0126 + 001898 1204 46 02 1 304103452 13 0126 + 001899 1204 46 03 1 304103452 14 0126 + 001900 1204 46 04 1 304103452 15 0126 + 001901 9999 99 99 0 9999 99 9999 + 001902 9999 99 99 0 9999 99 9999 + 001903 9999 99 99 0 9999 99 9999 + 001904 9999 99 99 0 9999 99 9999 + 001905 1204 47 01 1 304103452 00 0126 + 001906 1204 47 02 1 304103452 01 0126 + 001907 1204 47 03 1 304103452 02 0126 + 001908 1204 47 04 1 304103452 03 0126 + 001909 9999 99 99 0 9999 99 9999 + 001910 9999 99 99 0 9999 99 9999 + 001911 9999 99 99 0 9999 99 9999 + 001912 9999 99 99 0 9999 99 9999 + 001913 1204 48 01 1 304103452 04 0126 + 001914 1204 48 02 1 304103452 05 0126 + 001915 1204 48 03 1 304103452 06 0126 + 001916 1204 48 04 1 304103452 07 0126 + 001917 9999 99 99 0 9999 99 9999 + 001918 9999 99 99 0 9999 99 9999 + 001919 9999 99 99 0 9999 99 9999 + 001920 9999 99 99 0 9999 99 9999 + 001921 1205 01 01 1 303046676 08 0012 + 001922 1205 01 02 1 303046676 09 0012 + 001923 9999 99 99 0 9999 99 9999 + 001924 9999 99 99 0 9999 99 9999 + 001925 9999 99 99 0 9999 99 9999 + 001926 9999 99 99 0 9999 99 9999 + 001927 9999 99 99 0 9999 99 9999 + 001928 9999 99 99 0 9999 99 9999 + 001929 1205 02 01 1 303046676 10 0012 + 001930 1205 02 02 1 303046676 11 0012 + 001931 9999 99 99 0 9999 99 9999 + 001932 9999 99 99 0 9999 99 9999 + 001933 9999 99 99 0 9999 99 9999 + 001934 9999 99 99 0 9999 99 9999 + 001935 9999 99 99 0 9999 99 9999 + 001936 9999 99 99 0 9999 99 9999 + 001937 1205 03 01 1 303046676 12 0012 + 001938 1205 03 02 1 303046676 13 0012 + 001939 9999 99 99 0 9999 99 9999 + 001940 9999 99 99 0 9999 99 9999 + 001941 9999 99 99 0 9999 99 9999 + 001942 9999 99 99 0 9999 99 9999 + 001943 9999 99 99 0 9999 99 9999 + 001944 9999 99 99 0 9999 99 9999 + 001945 1205 04 01 1 303046676 14 0012 + 001946 1205 04 02 1 303046676 15 0012 + 001947 9999 99 99 0 9999 99 9999 + 001948 9999 99 99 0 9999 99 9999 + 001949 9999 99 99 0 9999 99 9999 + 001950 9999 99 99 0 9999 99 9999 + 001951 9999 99 99 0 9999 99 9999 + 001952 9999 99 99 0 9999 99 9999 + 001953 1205 05 01 1 303046676 00 0012 + 001954 1205 05 02 1 303046676 01 0012 + 001955 9999 99 99 0 9999 99 9999 + 001956 9999 99 99 0 9999 99 9999 + 001957 9999 99 99 0 9999 99 9999 + 001958 9999 99 99 0 9999 99 9999 + 001959 9999 99 99 0 9999 99 9999 + 001960 9999 99 99 0 9999 99 9999 + 001961 1205 06 01 1 303046676 02 0012 + 001962 1205 06 02 1 303046676 03 0012 + 001963 9999 99 99 0 9999 99 9999 + 001964 9999 99 99 0 9999 99 9999 + 001965 9999 99 99 0 9999 99 9999 + 001966 9999 99 99 0 9999 99 9999 + 001967 9999 99 99 0 9999 99 9999 + 001968 9999 99 99 0 9999 99 9999 + 001969 1205 07 01 1 303046676 04 0012 + 001970 1205 07 02 1 303046676 05 0012 + 001971 9999 99 99 0 9999 99 9999 + 001972 9999 99 99 0 9999 99 9999 + 001973 9999 99 99 0 9999 99 9999 + 001974 9999 99 99 0 9999 99 9999 + 001975 9999 99 99 0 9999 99 9999 + 001976 9999 99 99 0 9999 99 9999 + 001977 1205 08 01 1 303046676 06 0012 + 001978 1205 08 02 1 303046676 07 0012 + 001979 9999 99 99 0 9999 99 9999 + 001980 9999 99 99 0 9999 99 9999 + 001981 9999 99 99 0 9999 99 9999 + 001982 9999 99 99 0 9999 99 9999 + 001983 9999 99 99 0 9999 99 9999 + 001984 9999 99 99 0 9999 99 9999 + 001985 1205 09 01 1 304099352 00 0117 + 001986 1205 09 02 1 304099352 01 0117 + 001987 1205 09 03 1 304099352 02 0117 + 001988 1205 09 04 1 304099352 03 0117 + 001989 9999 99 99 0 9999 99 9999 + 001990 9999 99 99 0 9999 99 9999 + 001991 9999 99 99 0 9999 99 9999 + 001992 9999 99 99 0 9999 99 9999 + 001993 1205 10 01 1 304099352 04 0117 + 001994 1205 10 02 1 304099352 05 0117 + 001995 1205 10 03 1 304099352 06 0117 + 001996 1205 10 04 1 304099352 07 0117 + 001997 9999 99 99 0 9999 99 9999 + 001998 9999 99 99 0 9999 99 9999 + 001999 9999 99 99 0 9999 99 9999 + 002000 9999 99 99 0 9999 99 9999 + 002001 1205 11 01 1 304099352 08 0117 + 002002 1205 11 02 1 304099352 09 0117 + 002003 1205 11 03 1 304099352 10 0117 + 002004 1205 11 04 1 304099352 11 0117 + 002005 9999 99 99 0 9999 99 9999 + 002006 9999 99 99 0 9999 99 9999 + 002007 9999 99 99 0 9999 99 9999 + 002008 9999 99 99 0 9999 99 9999 + 002009 1205 12 01 1 304099352 12 0117 + 002010 1205 12 02 1 304099352 13 0117 + 002011 1205 12 03 1 304099352 14 0117 + 002012 1205 12 04 1 304099352 15 0117 + 002013 9999 99 99 0 9999 99 9999 + 002014 9999 99 99 0 9999 99 9999 + 002015 9999 99 99 0 9999 99 9999 + 002016 9999 99 99 0 9999 99 9999 + 002017 1205 13 01 1 304099348 08 0116 + 002018 1205 13 02 1 304099348 09 0116 + 002019 1205 13 03 1 304099348 10 0116 + 002020 1205 13 04 1 304099348 11 0116 + 002021 9999 99 99 0 9999 99 9999 + 002022 9999 99 99 0 9999 99 9999 + 002023 9999 99 99 0 9999 99 9999 + 002024 9999 99 99 0 9999 99 9999 + 002025 1205 14 01 1 304099348 12 0116 + 002026 1205 14 02 1 304099348 13 0116 + 002027 1205 14 03 1 304099348 14 0116 + 002028 1205 14 04 1 304099348 15 0116 + 002029 9999 99 99 0 9999 99 9999 + 002030 9999 99 99 0 9999 99 9999 + 002031 9999 99 99 0 9999 99 9999 + 002032 9999 99 99 0 9999 99 9999 + 002033 1205 15 01 1 304099348 00 0116 + 002034 1205 15 02 1 304099348 01 0116 + 002035 1205 15 03 1 304099348 02 0116 + 002036 1205 15 04 1 304099348 03 0116 + 002037 9999 99 99 0 9999 99 9999 + 002038 9999 99 99 0 9999 99 9999 + 002039 9999 99 99 0 9999 99 9999 + 002040 9999 99 99 0 9999 99 9999 + 002041 1205 16 01 1 304099348 04 0116 + 002042 1205 16 02 1 304099348 05 0116 + 002043 1205 16 03 1 304099348 06 0116 + 002044 1205 16 04 1 304099348 07 0116 + 002045 9999 99 99 0 9999 99 9999 + 002046 9999 99 99 0 9999 99 9999 + 002047 9999 99 99 0 9999 99 9999 + 002048 9999 99 99 0 9999 99 9999 + 002049 1205 17 01 1 306216988 00 0734 + 002050 1205 17 02 1 306216988 01 0734 + 002051 1205 17 03 1 306216988 02 0734 + 002052 1205 17 04 1 306216988 03 0734 + 002053 1205 17 05 1 306216988 04 0734 + 002054 1205 17 06 1 306216988 05 0734 + 002055 1205 17 07 1 306216988 06 0734 + 002056 1205 17 08 1 306216988 07 0734 + 002057 1205 18 01 1 306216988 08 0734 + 002058 1205 18 02 1 306216988 09 0734 + 002059 1205 18 03 1 306216988 10 0734 + 002060 1205 18 04 1 306216988 11 0734 + 002061 1205 18 05 1 306216988 12 0734 + 002062 1205 18 06 1 306216988 13 0734 + 002063 1205 18 07 1 306216988 14 0734 + 002064 1205 18 08 1 306216988 15 0734 + 002065 1205 19 01 1 306216992 00 0735 + 002066 1205 19 02 1 306216992 01 0735 + 002067 1205 19 03 1 306216992 02 0735 + 002068 1205 19 04 1 306216992 03 0735 + 002069 1205 19 05 1 306216992 04 0735 + 002070 1205 19 06 1 306216992 05 0735 + 002071 1205 19 07 1 306216992 06 0735 + 002072 1205 19 08 1 306216992 07 0735 + 002073 1205 20 01 1 306216992 08 0735 + 002074 1205 20 02 1 306216992 09 0735 + 002075 1205 20 03 1 306216992 10 0735 + 002076 1205 20 04 1 306216992 11 0735 + 002077 1205 20 05 1 306216992 12 0735 + 002078 1205 20 06 1 306216992 13 0735 + 002079 1205 20 07 1 306216992 14 0735 + 002080 1205 20 08 1 306216992 15 0735 + 002081 1205 21 01 1 306216980 00 0732 + 002082 1205 21 02 1 306216980 01 0732 + 002083 1205 21 03 1 306216980 02 0732 + 002084 1205 21 04 1 306216980 03 0732 + 002085 1205 21 05 1 306216980 04 0732 + 002086 1205 21 06 1 306216980 05 0732 + 002087 1205 21 07 1 306216980 06 0732 + 002088 1205 21 08 1 306216980 07 0732 + 002089 1205 22 01 1 306216980 08 0732 + 002090 1205 22 02 1 306216980 09 0732 + 002091 1205 22 03 1 306216980 10 0732 + 002092 1205 22 04 1 306216980 11 0732 + 002093 1205 22 05 1 306216980 12 0732 + 002094 1205 22 06 1 306216980 13 0732 + 002095 1205 22 07 1 306216980 14 0732 + 002096 1205 22 08 1 306216980 15 0732 + 002097 1205 23 01 1 306216984 00 0733 + 002098 1205 23 02 1 306216984 01 0733 + 002099 1205 23 03 1 306216984 02 0733 + 002100 1205 23 04 1 306216984 03 0733 + 002101 1205 23 05 1 306216984 04 0733 + 002102 1205 23 06 1 306216984 05 0733 + 002103 1205 23 07 1 306216984 06 0733 + 002104 1205 23 08 1 306216984 07 0733 + 002105 1205 24 01 1 306216984 08 0733 + 002106 1205 24 02 1 306216984 09 0733 + 002107 1205 24 03 1 306216984 10 0733 + 002108 1205 24 04 1 306216984 11 0733 + 002109 1205 24 05 1 306216984 12 0733 + 002110 1205 24 06 1 306216984 13 0733 + 002111 1205 24 07 1 306216984 14 0733 + 002112 1205 24 08 1 306216984 15 0733 + 002113 1205 25 01 1 303046680 08 0013 + 002114 1205 25 02 1 303046680 09 0013 + 002115 9999 99 99 0 9999 99 9999 + 002116 9999 99 99 0 9999 99 9999 + 002117 9999 99 99 0 9999 99 9999 + 002118 9999 99 99 0 9999 99 9999 + 002119 9999 99 99 0 9999 99 9999 + 002120 9999 99 99 0 9999 99 9999 + 002121 1205 26 01 1 303046680 10 0013 + 002122 1205 26 02 1 303046680 11 0013 + 002123 9999 99 99 0 9999 99 9999 + 002124 9999 99 99 0 9999 99 9999 + 002125 9999 99 99 0 9999 99 9999 + 002126 9999 99 99 0 9999 99 9999 + 002127 9999 99 99 0 9999 99 9999 + 002128 9999 99 99 0 9999 99 9999 + 002129 1205 27 01 1 303046680 12 0013 + 002130 1205 27 02 1 303046680 13 0013 + 002131 9999 99 99 0 9999 99 9999 + 002132 9999 99 99 0 9999 99 9999 + 002133 9999 99 99 0 9999 99 9999 + 002134 9999 99 99 0 9999 99 9999 + 002135 9999 99 99 0 9999 99 9999 + 002136 9999 99 99 0 9999 99 9999 + 002137 1205 28 01 1 303046680 14 0013 + 002138 1205 28 02 1 303046680 15 0013 + 002139 9999 99 99 0 9999 99 9999 + 002140 9999 99 99 0 9999 99 9999 + 002141 9999 99 99 0 9999 99 9999 + 002142 9999 99 99 0 9999 99 9999 + 002143 9999 99 99 0 9999 99 9999 + 002144 9999 99 99 0 9999 99 9999 + 002145 1205 29 01 1 303046680 04 0013 + 002146 1205 29 02 1 303046680 05 0013 + 002147 9999 99 99 0 9999 99 9999 + 002148 9999 99 99 0 9999 99 9999 + 002149 9999 99 99 0 9999 99 9999 + 002150 9999 99 99 0 9999 99 9999 + 002151 9999 99 99 0 9999 99 9999 + 002152 9999 99 99 0 9999 99 9999 + 002153 1205 30 01 1 303046680 06 0013 + 002154 1205 30 02 1 303046680 07 0013 + 002155 9999 99 99 0 9999 99 9999 + 002156 9999 99 99 0 9999 99 9999 + 002157 9999 99 99 0 9999 99 9999 + 002158 9999 99 99 0 9999 99 9999 + 002159 9999 99 99 0 9999 99 9999 + 002160 9999 99 99 0 9999 99 9999 + 002161 1205 31 01 1 303046680 00 0013 + 002162 1205 31 02 1 303046680 01 0013 + 002163 9999 99 99 0 9999 99 9999 + 002164 9999 99 99 0 9999 99 9999 + 002165 9999 99 99 0 9999 99 9999 + 002166 9999 99 99 0 9999 99 9999 + 002167 9999 99 99 0 9999 99 9999 + 002168 9999 99 99 0 9999 99 9999 + 002169 1205 32 01 1 303046680 02 0013 + 002170 1205 32 02 1 303046680 03 0013 + 002171 9999 99 99 0 9999 99 9999 + 002172 9999 99 99 0 9999 99 9999 + 002173 9999 99 99 0 9999 99 9999 + 002174 9999 99 99 0 9999 99 9999 + 002175 9999 99 99 0 9999 99 9999 + 002176 9999 99 99 0 9999 99 9999 + 002177 1205 33 01 1 306212892 00 0726 + 002178 1205 33 02 1 306212892 01 0726 + 002179 1205 33 03 1 306212892 02 0726 + 002180 1205 33 04 1 306212892 03 0726 + 002181 1205 33 05 1 306212892 04 0726 + 002182 1205 33 06 1 306212892 05 0726 + 002183 1205 33 07 1 306212892 06 0726 + 002184 1205 33 08 1 306212892 07 0726 + 002185 1205 34 01 1 306212892 08 0726 + 002186 1205 34 02 1 306212892 09 0726 + 002187 1205 34 03 1 306212892 10 0726 + 002188 1205 34 04 1 306212892 11 0726 + 002189 1205 34 05 1 306212892 12 0726 + 002190 1205 34 06 1 306212892 13 0726 + 002191 1205 34 07 1 306212892 14 0726 + 002192 1205 34 08 1 306212892 15 0726 + 002193 1205 35 01 1 306212896 00 0727 + 002194 1205 35 02 1 306212896 01 0727 + 002195 1205 35 03 1 306212896 02 0727 + 002196 1205 35 04 1 306212896 03 0727 + 002197 1205 35 05 1 306212896 04 0727 + 002198 1205 35 06 1 306212896 05 0727 + 002199 1205 35 07 1 306212896 06 0727 + 002200 1205 35 08 1 306212896 07 0727 + 002201 1205 36 01 1 306212896 08 0727 + 002202 1205 36 02 1 306212896 09 0727 + 002203 1205 36 03 1 306212896 10 0727 + 002204 1205 36 04 1 306212896 11 0727 + 002205 1205 36 05 1 306212896 12 0727 + 002206 1205 36 06 1 306212896 13 0727 + 002207 1205 36 07 1 306212896 14 0727 + 002208 1205 36 08 1 306212896 15 0727 + 002209 1205 37 01 1 306212884 00 0724 + 002210 1205 37 02 1 306212884 01 0724 + 002211 1205 37 03 1 306212884 02 0724 + 002212 1205 37 04 1 306212884 03 0724 + 002213 1205 37 05 1 306212884 04 0724 + 002214 1205 37 06 1 306212884 05 0724 + 002215 1205 37 07 1 306212884 06 0724 + 002216 1205 37 08 1 306212884 07 0724 + 002217 1205 38 01 1 306212884 08 0724 + 002218 1205 38 02 1 306212884 09 0724 + 002219 1205 38 03 1 306212884 10 0724 + 002220 1205 38 04 1 306212884 11 0724 + 002221 1205 38 05 1 306212884 12 0724 + 002222 1205 38 06 1 306212884 13 0724 + 002223 1205 38 07 1 306212884 14 0724 + 002224 1205 38 08 1 306212884 15 0724 + 002225 1205 39 01 1 306212888 00 0725 + 002226 1205 39 02 1 306212888 01 0725 + 002227 1205 39 03 1 306212888 02 0725 + 002228 1205 39 04 1 306212888 03 0725 + 002229 1205 39 05 1 306212888 04 0725 + 002230 1205 39 06 1 306212888 05 0725 + 002231 1205 39 07 1 306212888 06 0725 + 002232 1205 39 08 1 306212888 07 0725 + 002233 1205 40 01 1 306212888 08 0725 + 002234 1205 40 02 1 306212888 09 0725 + 002235 1205 40 03 1 306212888 10 0725 + 002236 1205 40 04 1 306212888 11 0725 + 002237 1205 40 05 1 306212888 12 0725 + 002238 1205 40 06 1 306212888 13 0725 + 002239 1205 40 07 1 306212888 14 0725 + 002240 1205 40 08 1 306212888 15 0725 + 002241 1205 41 01 1 304099356 00 0118 + 002242 1205 41 02 1 304099356 01 0118 + 002243 1205 41 03 1 304099356 02 0118 + 002244 1205 41 04 1 304099356 03 0118 + 002245 9999 99 99 0 9999 99 9999 + 002246 9999 99 99 0 9999 99 9999 + 002247 9999 99 99 0 9999 99 9999 + 002248 9999 99 99 0 9999 99 9999 + 002249 1205 42 01 1 304099356 04 0118 + 002250 1205 42 02 1 304099356 05 0118 + 002251 1205 42 03 1 304099356 06 0118 + 002252 1205 42 04 1 304099356 07 0118 + 002253 9999 99 99 0 9999 99 9999 + 002254 9999 99 99 0 9999 99 9999 + 002255 9999 99 99 0 9999 99 9999 + 002256 9999 99 99 0 9999 99 9999 + 002257 1205 43 01 1 304099356 08 0118 + 002258 1205 43 02 1 304099356 09 0118 + 002259 1205 43 03 1 304099356 10 0118 + 002260 1205 43 04 1 304099356 11 0118 + 002261 9999 99 99 0 9999 99 9999 + 002262 9999 99 99 0 9999 99 9999 + 002263 9999 99 99 0 9999 99 9999 + 002264 9999 99 99 0 9999 99 9999 + 002265 1205 44 01 1 304099356 12 0118 + 002266 1205 44 02 1 304099356 13 0118 + 002267 1205 44 03 1 304099356 14 0118 + 002268 1205 44 04 1 304099356 15 0118 + 002269 9999 99 99 0 9999 99 9999 + 002270 9999 99 99 0 9999 99 9999 + 002271 9999 99 99 0 9999 99 9999 + 002272 9999 99 99 0 9999 99 9999 + 002273 1205 45 01 1 304099360 00 0119 + 002274 1205 45 02 1 304099360 01 0119 + 002275 1205 45 03 1 304099360 02 0119 + 002276 1205 45 04 1 304099360 03 0119 + 002277 9999 99 99 0 9999 99 9999 + 002278 9999 99 99 0 9999 99 9999 + 002279 9999 99 99 0 9999 99 9999 + 002280 9999 99 99 0 9999 99 9999 + 002281 1205 46 01 1 304099360 04 0119 + 002282 1205 46 02 1 304099360 05 0119 + 002283 1205 46 03 1 304099360 06 0119 + 002284 1205 46 04 1 304099360 07 0119 + 002285 9999 99 99 0 9999 99 9999 + 002286 9999 99 99 0 9999 99 9999 + 002287 9999 99 99 0 9999 99 9999 + 002288 9999 99 99 0 9999 99 9999 + 002289 1205 47 01 1 304099360 08 0119 + 002290 1205 47 02 1 304099360 09 0119 + 002291 1205 47 03 1 304099360 10 0119 + 002292 1205 47 04 1 304099360 11 0119 + 002293 9999 99 99 0 9999 99 9999 + 002294 9999 99 99 0 9999 99 9999 + 002295 9999 99 99 0 9999 99 9999 + 002296 9999 99 99 0 9999 99 9999 + 002297 1205 48 01 1 304099360 12 0119 + 002298 1205 48 02 1 304099360 13 0119 + 002299 1205 48 03 1 304099360 14 0119 + 002300 1205 48 04 1 304099360 15 0119 + 002301 9999 99 99 0 9999 99 9999 + 002302 9999 99 99 0 9999 99 9999 + 002303 9999 99 99 0 9999 99 9999 + 002304 9999 99 99 0 9999 99 9999 + 002305 1206 01 01 1 306208792 00 0717 + 002306 1206 01 02 1 306208792 01 0717 + 002307 1206 01 03 1 306208792 02 0717 + 002308 1206 01 04 1 306208792 03 0717 + 002309 1206 01 05 1 306208792 04 0717 + 002310 1206 01 06 1 306208792 05 0717 + 002311 1206 01 07 1 306208792 06 0717 + 002312 1206 01 08 1 306208792 07 0717 + 002313 1206 02 01 1 306208792 08 0717 + 002314 1206 02 02 1 306208792 09 0717 + 002315 1206 02 03 1 306208792 10 0717 + 002316 1206 02 04 1 306208792 11 0717 + 002317 1206 02 05 1 306208792 12 0717 + 002318 1206 02 06 1 306208792 13 0717 + 002319 1206 02 07 1 306208792 14 0717 + 002320 1206 02 08 1 306208792 15 0717 + 002321 1206 03 01 1 306208788 00 0716 + 002322 1206 03 02 1 306208788 01 0716 + 002323 1206 03 03 1 306208788 02 0716 + 002324 1206 03 04 1 306208788 03 0716 + 002325 1206 03 05 1 306208788 04 0716 + 002326 1206 03 06 1 306208788 05 0716 + 002327 1206 03 07 1 306208788 06 0716 + 002328 1206 03 08 1 306208788 07 0716 + 002329 1206 04 01 1 306208788 08 0716 + 002330 1206 04 02 1 306208788 09 0716 + 002331 1206 04 03 1 306208788 10 0716 + 002332 1206 04 04 1 306208788 11 0716 + 002333 1206 04 05 1 306208788 12 0716 + 002334 1206 04 06 1 306208788 13 0716 + 002335 1206 04 07 1 306208788 14 0716 + 002336 1206 04 08 1 306208788 15 0716 + 002337 1206 05 01 1 306208800 00 0719 + 002338 1206 05 02 1 306208800 01 0719 + 002339 1206 05 03 1 306208800 02 0719 + 002340 1206 05 04 1 306208800 03 0719 + 002341 1206 05 05 1 306208800 04 0719 + 002342 1206 05 06 1 306208800 05 0719 + 002343 1206 05 07 1 306208800 06 0719 + 002344 1206 05 08 1 306208800 07 0719 + 002345 1206 06 01 1 306208800 08 0719 + 002346 1206 06 02 1 306208800 09 0719 + 002347 1206 06 03 1 306208800 10 0719 + 002348 1206 06 04 1 306208800 11 0719 + 002349 1206 06 05 1 306208800 12 0719 + 002350 1206 06 06 1 306208800 13 0719 + 002351 1206 06 07 1 306208800 14 0719 + 002352 1206 06 08 1 306208800 15 0719 + 002353 1206 07 01 1 306208796 00 0718 + 002354 1206 07 02 1 306208796 01 0718 + 002355 1206 07 03 1 306208796 02 0718 + 002356 1206 07 04 1 306208796 03 0718 + 002357 1206 07 05 1 306208796 04 0718 + 002358 1206 07 06 1 306208796 05 0718 + 002359 1206 07 07 1 306208796 06 0718 + 002360 1206 07 08 1 306208796 07 0718 + 002361 1206 08 01 1 306208796 08 0718 + 002362 1206 08 02 1 306208796 09 0718 + 002363 1206 08 03 1 306208796 10 0718 + 002364 1206 08 04 1 306208796 11 0718 + 002365 1206 08 05 1 306208796 12 0718 + 002366 1206 08 06 1 306208796 13 0718 + 002367 1206 08 07 1 306208796 14 0718 + 002368 1206 08 08 1 306208796 15 0718 + 002369 1206 09 01 1 303042592 12 0007 + 002370 1206 09 02 1 303042592 13 0007 + 002371 9999 99 99 0 9999 99 9999 + 002372 9999 99 99 0 9999 99 9999 + 002373 9999 99 99 0 9999 99 9999 + 002374 9999 99 99 0 9999 99 9999 + 002375 9999 99 99 0 9999 99 9999 + 002376 9999 99 99 0 9999 99 9999 + 002377 1206 10 01 1 303042592 14 0007 + 002378 1206 10 02 1 303042592 15 0007 + 002379 9999 99 99 0 9999 99 9999 + 002380 9999 99 99 0 9999 99 9999 + 002381 9999 99 99 0 9999 99 9999 + 002382 9999 99 99 0 9999 99 9999 + 002383 9999 99 99 0 9999 99 9999 + 002384 9999 99 99 0 9999 99 9999 + 002385 1206 11 01 1 303042592 08 0007 + 002386 1206 11 02 1 303042592 09 0007 + 002387 9999 99 99 0 9999 99 9999 + 002388 9999 99 99 0 9999 99 9999 + 002389 9999 99 99 0 9999 99 9999 + 002390 9999 99 99 0 9999 99 9999 + 002391 9999 99 99 0 9999 99 9999 + 002392 9999 99 99 0 9999 99 9999 + 002393 1206 12 01 1 303042592 10 0007 + 002394 1206 12 02 1 303042592 11 0007 + 002395 9999 99 99 0 9999 99 9999 + 002396 9999 99 99 0 9999 99 9999 + 002397 9999 99 99 0 9999 99 9999 + 002398 9999 99 99 0 9999 99 9999 + 002399 9999 99 99 0 9999 99 9999 + 002400 9999 99 99 0 9999 99 9999 + 002401 1206 13 01 1 303042592 00 0007 + 002402 1206 13 02 1 303042592 01 0007 + 002403 9999 99 99 0 9999 99 9999 + 002404 9999 99 99 0 9999 99 9999 + 002405 9999 99 99 0 9999 99 9999 + 002406 9999 99 99 0 9999 99 9999 + 002407 9999 99 99 0 9999 99 9999 + 002408 9999 99 99 0 9999 99 9999 + 002409 1206 14 01 1 303042592 02 0007 + 002410 1206 14 02 1 303042592 03 0007 + 002411 9999 99 99 0 9999 99 9999 + 002412 9999 99 99 0 9999 99 9999 + 002413 9999 99 99 0 9999 99 9999 + 002414 9999 99 99 0 9999 99 9999 + 002415 9999 99 99 0 9999 99 9999 + 002416 9999 99 99 0 9999 99 9999 + 002417 1206 15 01 1 303042592 04 0007 + 002418 1206 15 02 1 303042592 05 0007 + 002419 9999 99 99 0 9999 99 9999 + 002420 9999 99 99 0 9999 99 9999 + 002421 9999 99 99 0 9999 99 9999 + 002422 9999 99 99 0 9999 99 9999 + 002423 9999 99 99 0 9999 99 9999 + 002424 9999 99 99 0 9999 99 9999 + 002425 1206 16 01 1 303042592 06 0007 + 002426 1206 16 02 1 303042592 07 0007 + 002427 9999 99 99 0 9999 99 9999 + 002428 9999 99 99 0 9999 99 9999 + 002429 9999 99 99 0 9999 99 9999 + 002430 9999 99 99 0 9999 99 9999 + 002431 9999 99 99 0 9999 99 9999 + 002432 9999 99 99 0 9999 99 9999 + 002433 1206 17 01 1 305160220 00 0366 + 002434 1206 17 02 1 305160220 01 0366 + 002435 1206 17 03 1 305160220 02 0366 + 002436 1206 17 04 1 305160220 03 0366 + 002437 1206 17 05 1 305160220 04 0366 + 002438 1206 17 06 1 305160220 05 0366 + 002439 1206 17 07 1 305160220 06 0366 + 002440 1206 17 08 1 305160220 07 0366 + 002441 1206 18 01 1 305160220 08 0366 + 002442 1206 18 02 1 305160220 09 0366 + 002443 1206 18 03 1 305160220 10 0366 + 002444 1206 18 04 1 305160220 11 0366 + 002445 1206 18 05 1 305160220 12 0366 + 002446 1206 18 06 1 305160220 13 0366 + 002447 1206 18 07 1 305160220 14 0366 + 002448 1206 18 08 1 305160220 15 0366 + 002449 1206 19 01 1 305160224 00 0367 + 002450 1206 19 02 1 305160224 01 0367 + 002451 1206 19 03 1 305160224 02 0367 + 002452 1206 19 04 1 305160224 03 0367 + 002453 1206 19 05 1 305160224 04 0367 + 002454 1206 19 06 1 305160224 05 0367 + 002455 1206 19 07 1 305160224 06 0367 + 002456 1206 19 08 1 305160224 07 0367 + 002457 1206 20 01 1 305160224 08 0367 + 002458 1206 20 02 1 305160224 09 0367 + 002459 1206 20 03 1 305160224 10 0367 + 002460 1206 20 04 1 305160224 11 0367 + 002461 1206 20 05 1 305160224 12 0367 + 002462 1206 20 06 1 305160224 13 0367 + 002463 1206 20 07 1 305160224 14 0367 + 002464 1206 20 08 1 305160224 15 0367 + 002465 1206 21 01 1 305160212 00 0364 + 002466 1206 21 02 1 305160212 01 0364 + 002467 1206 21 03 1 305160212 02 0364 + 002468 1206 21 04 1 305160212 03 0364 + 002469 1206 21 05 1 305160212 04 0364 + 002470 1206 21 06 1 305160212 05 0364 + 002471 1206 21 07 1 305160212 06 0364 + 002472 1206 21 08 1 305160212 07 0364 + 002473 1206 22 01 1 305160212 08 0364 + 002474 1206 22 02 1 305160212 09 0364 + 002475 1206 22 03 1 305160212 10 0364 + 002476 1206 22 04 1 305160212 11 0364 + 002477 1206 22 05 1 305160212 12 0364 + 002478 1206 22 06 1 305160212 13 0364 + 002479 1206 22 07 1 305160212 14 0364 + 002480 1206 22 08 1 305160212 15 0364 + 002481 1206 23 01 1 305160216 00 0365 + 002482 1206 23 02 1 305160216 01 0365 + 002483 1206 23 03 1 305160216 02 0365 + 002484 1206 23 04 1 305160216 03 0365 + 002485 1206 23 05 1 305160216 04 0365 + 002486 1206 23 06 1 305160216 05 0365 + 002487 1206 23 07 1 305160216 06 0365 + 002488 1206 23 08 1 305160216 07 0365 + 002489 1206 24 01 1 305160216 08 0365 + 002490 1206 24 02 1 305160216 09 0365 + 002491 1206 24 03 1 305160216 10 0365 + 002492 1206 24 04 1 305160216 11 0365 + 002493 1206 24 05 1 305160216 12 0365 + 002494 1206 24 06 1 305160216 13 0365 + 002495 1206 24 07 1 305160216 14 0365 + 002496 1206 24 08 1 305160216 15 0365 + 002497 1206 25 01 1 306204696 00 0709 + 002498 1206 25 02 1 306204696 01 0709 + 002499 1206 25 03 1 306204696 02 0709 + 002500 1206 25 04 1 306204696 03 0709 + 002501 1206 25 05 1 306204696 04 0709 + 002502 1206 25 06 1 306204696 05 0709 + 002503 1206 25 07 1 306204696 06 0709 + 002504 1206 25 08 1 306204696 07 0709 + 002505 1206 26 01 1 306204696 08 0709 + 002506 1206 26 02 1 306204696 09 0709 + 002507 1206 26 03 1 306204696 10 0709 + 002508 1206 26 04 1 306204696 11 0709 + 002509 1206 26 05 1 306204696 12 0709 + 002510 1206 26 06 1 306204696 13 0709 + 002511 1206 26 07 1 306204696 14 0709 + 002512 1206 26 08 1 306204696 15 0709 + 002513 1206 27 01 1 306204692 00 0708 + 002514 1206 27 02 1 306204692 01 0708 + 002515 1206 27 03 1 306204692 02 0708 + 002516 1206 27 04 1 306204692 03 0708 + 002517 1206 27 05 1 306204692 04 0708 + 002518 1206 27 06 1 306204692 05 0708 + 002519 1206 27 07 1 306204692 06 0708 + 002520 1206 27 08 1 306204692 07 0708 + 002521 1206 28 01 1 306204692 08 0708 + 002522 1206 28 02 1 306204692 09 0708 + 002523 1206 28 03 1 306204692 10 0708 + 002524 1206 28 04 1 306204692 11 0708 + 002525 1206 28 05 1 306204692 12 0708 + 002526 1206 28 06 1 306204692 13 0708 + 002527 1206 28 07 1 306204692 14 0708 + 002528 1206 28 08 1 306204692 15 0708 + 002529 1206 29 01 1 306204704 00 0711 + 002530 1206 29 02 1 306204704 01 0711 + 002531 1206 29 03 1 306204704 02 0711 + 002532 1206 29 04 1 306204704 03 0711 + 002533 1206 29 05 1 306204704 04 0711 + 002534 1206 29 06 1 306204704 05 0711 + 002535 1206 29 07 1 306204704 06 0711 + 002536 1206 29 08 1 306204704 07 0711 + 002537 1206 30 01 1 306204704 08 0711 + 002538 1206 30 02 1 306204704 09 0711 + 002539 1206 30 03 1 306204704 10 0711 + 002540 1206 30 04 1 306204704 11 0711 + 002541 1206 30 05 1 306204704 12 0711 + 002542 1206 30 06 1 306204704 13 0711 + 002543 1206 30 07 1 306204704 14 0711 + 002544 1206 30 08 1 306204704 15 0711 + 002545 1206 31 01 1 306204700 00 0710 + 002546 1206 31 02 1 306204700 01 0710 + 002547 1206 31 03 1 306204700 02 0710 + 002548 1206 31 04 1 306204700 03 0710 + 002549 1206 31 05 1 306204700 04 0710 + 002550 1206 31 06 1 306204700 05 0710 + 002551 1206 31 07 1 306204700 06 0710 + 002552 1206 31 08 1 306204700 07 0710 + 002553 1206 32 01 1 306204700 08 0710 + 002554 1206 32 02 1 306204700 09 0710 + 002555 1206 32 03 1 306204700 10 0710 + 002556 1206 32 04 1 306204700 11 0710 + 002557 1206 32 05 1 306204700 12 0710 + 002558 1206 32 06 1 306204700 13 0710 + 002559 1206 32 07 1 306204700 14 0710 + 002560 1206 32 08 1 306204700 15 0710 + 002561 1206 33 01 1 305156124 00 0358 + 002562 1206 33 02 1 305156124 01 0358 + 002563 1206 33 03 1 305156124 02 0358 + 002564 1206 33 04 1 305156124 03 0358 + 002565 1206 33 05 1 305156124 04 0358 + 002566 1206 33 06 1 305156124 05 0358 + 002567 1206 33 07 1 305156124 06 0358 + 002568 1206 33 08 1 305156124 07 0358 + 002569 1206 34 01 1 305156124 08 0358 + 002570 1206 34 02 1 305156124 09 0358 + 002571 1206 34 03 1 305156124 10 0358 + 002572 1206 34 04 1 305156124 11 0358 + 002573 1206 34 05 1 305156124 12 0358 + 002574 1206 34 06 1 305156124 13 0358 + 002575 1206 34 07 1 305156124 14 0358 + 002576 1206 34 08 1 305156124 15 0358 + 002577 1206 35 01 1 305156128 00 0359 + 002578 1206 35 02 1 305156128 01 0359 + 002579 1206 35 03 1 305156128 02 0359 + 002580 1206 35 04 1 305156128 03 0359 + 002581 1206 35 05 1 305156128 04 0359 + 002582 1206 35 06 1 305156128 05 0359 + 002583 1206 35 07 1 305156128 06 0359 + 002584 1206 35 08 1 305156128 07 0359 + 002585 1206 36 01 1 305156128 08 0359 + 002586 1206 36 02 1 305156128 09 0359 + 002587 1206 36 03 1 305156128 10 0359 + 002588 1206 36 04 1 305156128 11 0359 + 002589 1206 36 05 1 305156128 12 0359 + 002590 1206 36 06 1 305156128 13 0359 + 002591 1206 36 07 1 305156128 14 0359 + 002592 1206 36 08 1 305156128 15 0359 + 002593 1206 37 01 1 305156116 00 0356 + 002594 1206 37 02 1 305156116 01 0356 + 002595 1206 37 03 1 305156116 02 0356 + 002596 1206 37 04 1 305156116 03 0356 + 002597 1206 37 05 1 305156116 04 0356 + 002598 1206 37 06 1 305156116 05 0356 + 002599 1206 37 07 1 305156116 06 0356 + 002600 1206 37 08 1 305156116 07 0356 + 002601 1206 38 01 1 305156116 08 0356 + 002602 1206 38 02 1 305156116 09 0356 + 002603 1206 38 03 1 305156116 10 0356 + 002604 1206 38 04 1 305156116 11 0356 + 002605 1206 38 05 1 305156116 12 0356 + 002606 1206 38 06 1 305156116 13 0356 + 002607 1206 38 07 1 305156116 14 0356 + 002608 1206 38 08 1 305156116 15 0356 + 002609 1206 39 01 1 305156120 00 0357 + 002610 1206 39 02 1 305156120 01 0357 + 002611 1206 39 03 1 305156120 02 0357 + 002612 1206 39 04 1 305156120 03 0357 + 002613 1206 39 05 1 305156120 04 0357 + 002614 1206 39 06 1 305156120 05 0357 + 002615 1206 39 07 1 305156120 06 0357 + 002616 1206 39 08 1 305156120 07 0357 + 002617 1206 40 01 1 305156120 08 0357 + 002618 1206 40 02 1 305156120 09 0357 + 002619 1206 40 03 1 305156120 10 0357 + 002620 1206 40 04 1 305156120 11 0357 + 002621 1206 40 05 1 305156120 12 0357 + 002622 1206 40 06 1 305156120 13 0357 + 002623 1206 40 07 1 305156120 14 0357 + 002624 1206 40 08 1 305156120 15 0357 + 002625 1206 41 01 1 305152024 00 0349 + 002626 1206 41 02 1 305152024 01 0349 + 002627 1206 41 03 1 305152024 02 0349 + 002628 1206 41 04 1 305152024 03 0349 + 002629 1206 41 05 1 305152024 04 0349 + 002630 1206 41 06 1 305152024 05 0349 + 002631 1206 41 07 1 305152024 06 0349 + 002632 1206 41 08 1 305152024 07 0349 + 002633 1206 42 01 1 305152024 08 0349 + 002634 1206 42 02 1 305152024 09 0349 + 002635 1206 42 03 1 305152024 10 0349 + 002636 1206 42 04 1 305152024 11 0349 + 002637 1206 42 05 1 305152024 12 0349 + 002638 1206 42 06 1 305152024 13 0349 + 002639 1206 42 07 1 305152024 14 0349 + 002640 1206 42 08 1 305152024 15 0349 + 002641 1206 43 01 1 305152020 00 0348 + 002642 1206 43 02 1 305152020 01 0348 + 002643 1206 43 03 1 305152020 02 0348 + 002644 1206 43 04 1 305152020 03 0348 + 002645 1206 43 05 1 305152020 04 0348 + 002646 1206 43 06 1 305152020 05 0348 + 002647 1206 43 07 1 305152020 06 0348 + 002648 1206 43 08 1 305152020 07 0348 + 002649 1206 44 01 1 305152020 08 0348 + 002650 1206 44 02 1 305152020 09 0348 + 002651 1206 44 03 1 305152020 10 0348 + 002652 1206 44 04 1 305152020 11 0348 + 002653 1206 44 05 1 305152020 12 0348 + 002654 1206 44 06 1 305152020 13 0348 + 002655 1206 44 07 1 305152020 14 0348 + 002656 1206 44 08 1 305152020 15 0348 + 002657 1206 45 01 1 305152032 00 0351 + 002658 1206 45 02 1 305152032 01 0351 + 002659 1206 45 03 1 305152032 02 0351 + 002660 1206 45 04 1 305152032 03 0351 + 002661 1206 45 05 1 305152032 04 0351 + 002662 1206 45 06 1 305152032 05 0351 + 002663 1206 45 07 1 305152032 06 0351 + 002664 1206 45 08 1 305152032 07 0351 + 002665 1206 46 01 1 305152032 08 0351 + 002666 1206 46 02 1 305152032 09 0351 + 002667 1206 46 03 1 305152032 10 0351 + 002668 1206 46 04 1 305152032 11 0351 + 002669 1206 46 05 1 305152032 12 0351 + 002670 1206 46 06 1 305152032 13 0351 + 002671 1206 46 07 1 305152032 14 0351 + 002672 1206 46 08 1 305152032 15 0351 + 002673 1206 47 01 1 305152028 00 0350 + 002674 1206 47 02 1 305152028 01 0350 + 002675 1206 47 03 1 305152028 02 0350 + 002676 1206 47 04 1 305152028 03 0350 + 002677 1206 47 05 1 305152028 04 0350 + 002678 1206 47 06 1 305152028 05 0350 + 002679 1206 47 07 1 305152028 06 0350 + 002680 1206 47 08 1 305152028 07 0350 + 002681 1206 48 01 1 305152028 08 0350 + 002682 1206 48 02 1 305152028 09 0350 + 002683 1206 48 03 1 305152028 10 0350 + 002684 1206 48 04 1 305152028 11 0350 + 002685 1206 48 05 1 305152028 12 0350 + 002686 1206 48 06 1 305152028 13 0350 + 002687 1206 48 07 1 305152028 14 0350 + 002688 1206 48 08 1 305152028 15 0350 + 002689 1207 01 01 1 303042580 08 0004 + 002690 1207 01 02 1 303042580 09 0004 + 002691 9999 99 99 0 9999 99 9999 + 002692 9999 99 99 0 9999 99 9999 + 002693 9999 99 99 0 9999 99 9999 + 002694 9999 99 99 0 9999 99 9999 + 002695 9999 99 99 0 9999 99 9999 + 002696 9999 99 99 0 9999 99 9999 + 002697 1207 02 01 1 303042580 10 0004 + 002698 1207 02 02 1 303042580 11 0004 + 002699 9999 99 99 0 9999 99 9999 + 002700 9999 99 99 0 9999 99 9999 + 002701 9999 99 99 0 9999 99 9999 + 002702 9999 99 99 0 9999 99 9999 + 002703 9999 99 99 0 9999 99 9999 + 002704 9999 99 99 0 9999 99 9999 + 002705 1207 03 01 1 303042580 12 0004 + 002706 1207 03 02 1 303042580 13 0004 + 002707 9999 99 99 0 9999 99 9999 + 002708 9999 99 99 0 9999 99 9999 + 002709 9999 99 99 0 9999 99 9999 + 002710 9999 99 99 0 9999 99 9999 + 002711 9999 99 99 0 9999 99 9999 + 002712 9999 99 99 0 9999 99 9999 + 002713 1207 04 01 1 303042580 14 0004 + 002714 1207 04 02 1 303042580 15 0004 + 002715 9999 99 99 0 9999 99 9999 + 002716 9999 99 99 0 9999 99 9999 + 002717 9999 99 99 0 9999 99 9999 + 002718 9999 99 99 0 9999 99 9999 + 002719 9999 99 99 0 9999 99 9999 + 002720 9999 99 99 0 9999 99 9999 + 002721 1207 05 01 1 303042580 00 0004 + 002722 1207 05 02 1 303042580 01 0004 + 002723 9999 99 99 0 9999 99 9999 + 002724 9999 99 99 0 9999 99 9999 + 002725 9999 99 99 0 9999 99 9999 + 002726 9999 99 99 0 9999 99 9999 + 002727 9999 99 99 0 9999 99 9999 + 002728 9999 99 99 0 9999 99 9999 + 002729 1207 06 01 1 303042580 02 0004 + 002730 1207 06 02 1 303042580 03 0004 + 002731 9999 99 99 0 9999 99 9999 + 002732 9999 99 99 0 9999 99 9999 + 002733 9999 99 99 0 9999 99 9999 + 002734 9999 99 99 0 9999 99 9999 + 002735 9999 99 99 0 9999 99 9999 + 002736 9999 99 99 0 9999 99 9999 + 002737 1207 07 01 1 303042580 04 0004 + 002738 1207 07 02 1 303042580 05 0004 + 002739 9999 99 99 0 9999 99 9999 + 002740 9999 99 99 0 9999 99 9999 + 002741 9999 99 99 0 9999 99 9999 + 002742 9999 99 99 0 9999 99 9999 + 002743 9999 99 99 0 9999 99 9999 + 002744 9999 99 99 0 9999 99 9999 + 002745 1207 08 01 1 303042580 06 0004 + 002746 1207 08 02 1 303042580 07 0004 + 002747 9999 99 99 0 9999 99 9999 + 002748 9999 99 99 0 9999 99 9999 + 002749 9999 99 99 0 9999 99 9999 + 002750 9999 99 99 0 9999 99 9999 + 002751 9999 99 99 0 9999 99 9999 + 002752 9999 99 99 0 9999 99 9999 + 002753 1207 09 01 1 304095256 00 0109 + 002754 1207 09 02 1 304095256 01 0109 + 002755 1207 09 03 1 304095256 02 0109 + 002756 1207 09 04 1 304095256 03 0109 + 002757 9999 99 99 0 9999 99 9999 + 002758 9999 99 99 0 9999 99 9999 + 002759 9999 99 99 0 9999 99 9999 + 002760 9999 99 99 0 9999 99 9999 + 002761 1207 10 01 1 304095256 04 0109 + 002762 1207 10 02 1 304095256 05 0109 + 002763 1207 10 03 1 304095256 06 0109 + 002764 1207 10 04 1 304095256 07 0109 + 002765 9999 99 99 0 9999 99 9999 + 002766 9999 99 99 0 9999 99 9999 + 002767 9999 99 99 0 9999 99 9999 + 002768 9999 99 99 0 9999 99 9999 + 002769 1207 11 01 1 304095256 08 0109 + 002770 1207 11 02 1 304095256 09 0109 + 002771 1207 11 03 1 304095256 10 0109 + 002772 1207 11 04 1 304095256 11 0109 + 002773 9999 99 99 0 9999 99 9999 + 002774 9999 99 99 0 9999 99 9999 + 002775 9999 99 99 0 9999 99 9999 + 002776 9999 99 99 0 9999 99 9999 + 002777 1207 12 01 1 304095256 12 0109 + 002778 1207 12 02 1 304095256 13 0109 + 002779 1207 12 03 1 304095256 14 0109 + 002780 1207 12 04 1 304095256 15 0109 + 002781 9999 99 99 0 9999 99 9999 + 002782 9999 99 99 0 9999 99 9999 + 002783 9999 99 99 0 9999 99 9999 + 002784 9999 99 99 0 9999 99 9999 + 002785 1207 13 01 1 304095252 08 0108 + 002786 1207 13 02 1 304095252 09 0108 + 002787 1207 13 03 1 304095252 10 0108 + 002788 1207 13 04 1 304095252 11 0108 + 002789 9999 99 99 0 9999 99 9999 + 002790 9999 99 99 0 9999 99 9999 + 002791 9999 99 99 0 9999 99 9999 + 002792 9999 99 99 0 9999 99 9999 + 002793 1207 14 01 1 304095252 12 0108 + 002794 1207 14 02 1 304095252 13 0108 + 002795 1207 14 03 1 304095252 14 0108 + 002796 1207 14 04 1 304095252 15 0108 + 002797 9999 99 99 0 9999 99 9999 + 002798 9999 99 99 0 9999 99 9999 + 002799 9999 99 99 0 9999 99 9999 + 002800 9999 99 99 0 9999 99 9999 + 002801 1207 15 01 1 304095252 00 0108 + 002802 1207 15 02 1 304095252 01 0108 + 002803 1207 15 03 1 304095252 02 0108 + 002804 1207 15 04 1 304095252 03 0108 + 002805 9999 99 99 0 9999 99 9999 + 002806 9999 99 99 0 9999 99 9999 + 002807 9999 99 99 0 9999 99 9999 + 002808 9999 99 99 0 9999 99 9999 + 002809 1207 16 01 1 304095252 04 0108 + 002810 1207 16 02 1 304095252 05 0108 + 002811 1207 16 03 1 304095252 06 0108 + 002812 1207 16 04 1 304095252 07 0108 + 002813 9999 99 99 0 9999 99 9999 + 002814 9999 99 99 0 9999 99 9999 + 002815 9999 99 99 0 9999 99 9999 + 002816 9999 99 99 0 9999 99 9999 + 002817 1207 17 01 1 306200604 00 0702 + 002818 1207 17 02 1 306200604 01 0702 + 002819 1207 17 03 1 306200604 02 0702 + 002820 1207 17 04 1 306200604 03 0702 + 002821 1207 17 05 1 306200604 04 0702 + 002822 1207 17 06 1 306200604 05 0702 + 002823 1207 17 07 1 306200604 06 0702 + 002824 1207 17 08 1 306200604 07 0702 + 002825 1207 18 01 1 306200604 08 0702 + 002826 1207 18 02 1 306200604 09 0702 + 002827 1207 18 03 1 306200604 10 0702 + 002828 1207 18 04 1 306200604 11 0702 + 002829 1207 18 05 1 306200604 12 0702 + 002830 1207 18 06 1 306200604 13 0702 + 002831 1207 18 07 1 306200604 14 0702 + 002832 1207 18 08 1 306200604 15 0702 + 002833 1207 19 01 1 306200608 00 0703 + 002834 1207 19 02 1 306200608 01 0703 + 002835 1207 19 03 1 306200608 02 0703 + 002836 1207 19 04 1 306200608 03 0703 + 002837 1207 19 05 1 306200608 04 0703 + 002838 1207 19 06 1 306200608 05 0703 + 002839 1207 19 07 1 306200608 06 0703 + 002840 1207 19 08 1 306200608 07 0703 + 002841 1207 20 01 1 306200608 08 0703 + 002842 1207 20 02 1 306200608 09 0703 + 002843 1207 20 03 1 306200608 10 0703 + 002844 1207 20 04 1 306200608 11 0703 + 002845 1207 20 05 1 306200608 12 0703 + 002846 1207 20 06 1 306200608 13 0703 + 002847 1207 20 07 1 306200608 14 0703 + 002848 1207 20 08 1 306200608 15 0703 + 002849 1207 21 01 1 306200596 00 0700 + 002850 1207 21 02 1 306200596 01 0700 + 002851 1207 21 03 1 306200596 02 0700 + 002852 1207 21 04 1 306200596 03 0700 + 002853 1207 21 05 1 306200596 04 0700 + 002854 1207 21 06 1 306200596 05 0700 + 002855 1207 21 07 1 306200596 06 0700 + 002856 1207 21 08 1 306200596 07 0700 + 002857 1207 22 01 1 306200596 08 0700 + 002858 1207 22 02 1 306200596 09 0700 + 002859 1207 22 03 1 306200596 10 0700 + 002860 1207 22 04 1 306200596 11 0700 + 002861 1207 22 05 1 306200596 12 0700 + 002862 1207 22 06 1 306200596 13 0700 + 002863 1207 22 07 1 306200596 14 0700 + 002864 1207 22 08 1 306200596 15 0700 + 002865 1207 23 01 1 306200600 00 0701 + 002866 1207 23 02 1 306200600 01 0701 + 002867 1207 23 03 1 306200600 02 0701 + 002868 1207 23 04 1 306200600 03 0701 + 002869 1207 23 05 1 306200600 04 0701 + 002870 1207 23 06 1 306200600 05 0701 + 002871 1207 23 07 1 306200600 06 0701 + 002872 1207 23 08 1 306200600 07 0701 + 002873 1207 24 01 1 306200600 08 0701 + 002874 1207 24 02 1 306200600 09 0701 + 002875 1207 24 03 1 306200600 10 0701 + 002876 1207 24 04 1 306200600 11 0701 + 002877 1207 24 05 1 306200600 12 0701 + 002878 1207 24 06 1 306200600 13 0701 + 002879 1207 24 07 1 306200600 14 0701 + 002880 1207 24 08 1 306200600 15 0701 + 002881 1207 25 01 1 303042584 08 0005 + 002882 1207 25 02 1 303042584 09 0005 + 002883 9999 99 99 0 9999 99 9999 + 002884 9999 99 99 0 9999 99 9999 + 002885 9999 99 99 0 9999 99 9999 + 002886 9999 99 99 0 9999 99 9999 + 002887 9999 99 99 0 9999 99 9999 + 002888 9999 99 99 0 9999 99 9999 + 002889 1207 26 01 1 303042584 10 0005 + 002890 1207 26 02 1 303042584 11 0005 + 002891 9999 99 99 0 9999 99 9999 + 002892 9999 99 99 0 9999 99 9999 + 002893 9999 99 99 0 9999 99 9999 + 002894 9999 99 99 0 9999 99 9999 + 002895 9999 99 99 0 9999 99 9999 + 002896 9999 99 99 0 9999 99 9999 + 002897 1207 27 01 1 303042584 12 0005 + 002898 1207 27 02 1 303042584 13 0005 + 002899 9999 99 99 0 9999 99 9999 + 002900 9999 99 99 0 9999 99 9999 + 002901 9999 99 99 0 9999 99 9999 + 002902 9999 99 99 0 9999 99 9999 + 002903 9999 99 99 0 9999 99 9999 + 002904 9999 99 99 0 9999 99 9999 + 002905 1207 28 01 1 303042584 14 0005 + 002906 1207 28 02 1 303042584 15 0005 + 002907 9999 99 99 0 9999 99 9999 + 002908 9999 99 99 0 9999 99 9999 + 002909 9999 99 99 0 9999 99 9999 + 002910 9999 99 99 0 9999 99 9999 + 002911 9999 99 99 0 9999 99 9999 + 002912 9999 99 99 0 9999 99 9999 + 002913 1207 29 01 1 303042584 04 0005 + 002914 1207 29 02 1 303042584 05 0005 + 002915 9999 99 99 0 9999 99 9999 + 002916 9999 99 99 0 9999 99 9999 + 002917 9999 99 99 0 9999 99 9999 + 002918 9999 99 99 0 9999 99 9999 + 002919 9999 99 99 0 9999 99 9999 + 002920 9999 99 99 0 9999 99 9999 + 002921 1207 30 01 1 303042584 06 0005 + 002922 1207 30 02 1 303042584 07 0005 + 002923 9999 99 99 0 9999 99 9999 + 002924 9999 99 99 0 9999 99 9999 + 002925 9999 99 99 0 9999 99 9999 + 002926 9999 99 99 0 9999 99 9999 + 002927 9999 99 99 0 9999 99 9999 + 002928 9999 99 99 0 9999 99 9999 + 002929 1207 31 01 1 303042584 00 0005 + 002930 1207 31 02 1 303042584 01 0005 + 002931 9999 99 99 0 9999 99 9999 + 002932 9999 99 99 0 9999 99 9999 + 002933 9999 99 99 0 9999 99 9999 + 002934 9999 99 99 0 9999 99 9999 + 002935 9999 99 99 0 9999 99 9999 + 002936 9999 99 99 0 9999 99 9999 + 002937 1207 32 01 1 303042584 02 0005 + 002938 1207 32 02 1 303042584 03 0005 + 002939 9999 99 99 0 9999 99 9999 + 002940 9999 99 99 0 9999 99 9999 + 002941 9999 99 99 0 9999 99 9999 + 002942 9999 99 99 0 9999 99 9999 + 002943 9999 99 99 0 9999 99 9999 + 002944 9999 99 99 0 9999 99 9999 + 002945 1207 33 01 1 306196508 00 0694 + 002946 1207 33 02 1 306196508 01 0694 + 002947 1207 33 03 1 306196508 02 0694 + 002948 1207 33 04 1 306196508 03 0694 + 002949 1207 33 05 1 306196508 04 0694 + 002950 1207 33 06 1 306196508 05 0694 + 002951 1207 33 07 1 306196508 06 0694 + 002952 1207 33 08 1 306196508 07 0694 + 002953 1207 34 01 1 306196508 08 0694 + 002954 1207 34 02 1 306196508 09 0694 + 002955 1207 34 03 1 306196508 10 0694 + 002956 1207 34 04 1 306196508 11 0694 + 002957 1207 34 05 1 306196508 12 0694 + 002958 1207 34 06 1 306196508 13 0694 + 002959 1207 34 07 1 306196508 14 0694 + 002960 1207 34 08 1 306196508 15 0694 + 002961 1207 35 01 1 306196512 00 0695 + 002962 1207 35 02 1 306196512 01 0695 + 002963 1207 35 03 1 306196512 02 0695 + 002964 1207 35 04 1 306196512 03 0695 + 002965 1207 35 05 1 306196512 04 0695 + 002966 1207 35 06 1 306196512 05 0695 + 002967 1207 35 07 1 306196512 06 0695 + 002968 1207 35 08 1 306196512 07 0695 + 002969 1207 36 01 1 306196512 08 0695 + 002970 1207 36 02 1 306196512 09 0695 + 002971 1207 36 03 1 306196512 10 0695 + 002972 1207 36 04 1 306196512 11 0695 + 002973 1207 36 05 1 306196512 12 0695 + 002974 1207 36 06 1 306196512 13 0695 + 002975 1207 36 07 1 306196512 14 0695 + 002976 1207 36 08 1 306196512 15 0695 + 002977 1207 37 01 1 306196500 00 0692 + 002978 1207 37 02 1 306196500 01 0692 + 002979 1207 37 03 1 306196500 02 0692 + 002980 1207 37 04 1 306196500 03 0692 + 002981 1207 37 05 1 306196500 04 0692 + 002982 1207 37 06 1 306196500 05 0692 + 002983 1207 37 07 1 306196500 06 0692 + 002984 1207 37 08 1 306196500 07 0692 + 002985 1207 38 01 1 306196500 08 0692 + 002986 1207 38 02 1 306196500 09 0692 + 002987 1207 38 03 1 306196500 10 0692 + 002988 1207 38 04 1 306196500 11 0692 + 002989 1207 38 05 1 306196500 12 0692 + 002990 1207 38 06 1 306196500 13 0692 + 002991 1207 38 07 1 306196500 14 0692 + 002992 1207 38 08 1 306196500 15 0692 + 002993 1207 39 01 1 306196504 00 0693 + 002994 1207 39 02 1 306196504 01 0693 + 002995 1207 39 03 1 306196504 02 0693 + 002996 1207 39 04 1 306196504 03 0693 + 002997 1207 39 05 1 306196504 04 0693 + 002998 1207 39 06 1 306196504 05 0693 + 002999 1207 39 07 1 306196504 06 0693 + 003000 1207 39 08 1 306196504 07 0693 + 003001 1207 40 01 1 306196504 08 0693 + 003002 1207 40 02 1 306196504 09 0693 + 003003 1207 40 03 1 306196504 10 0693 + 003004 1207 40 04 1 306196504 11 0693 + 003005 1207 40 05 1 306196504 12 0693 + 003006 1207 40 06 1 306196504 13 0693 + 003007 1207 40 07 1 306196504 14 0693 + 003008 1207 40 08 1 306196504 15 0693 + 003009 1207 41 01 1 304095260 00 0110 + 003010 1207 41 02 1 304095260 01 0110 + 003011 1207 41 03 1 304095260 02 0110 + 003012 1207 41 04 1 304095260 03 0110 + 003013 9999 99 99 0 9999 99 9999 + 003014 9999 99 99 0 9999 99 9999 + 003015 9999 99 99 0 9999 99 9999 + 003016 9999 99 99 0 9999 99 9999 + 003017 1207 42 01 1 304095260 04 0110 + 003018 1207 42 02 1 304095260 05 0110 + 003019 1207 42 03 1 304095260 06 0110 + 003020 1207 42 04 1 304095260 07 0110 + 003021 9999 99 99 0 9999 99 9999 + 003022 9999 99 99 0 9999 99 9999 + 003023 9999 99 99 0 9999 99 9999 + 003024 9999 99 99 0 9999 99 9999 + 003025 1207 43 01 1 304095260 08 0110 + 003026 1207 43 02 1 304095260 09 0110 + 003027 1207 43 03 1 304095260 10 0110 + 003028 1207 43 04 1 304095260 11 0110 + 003029 9999 99 99 0 9999 99 9999 + 003030 9999 99 99 0 9999 99 9999 + 003031 9999 99 99 0 9999 99 9999 + 003032 9999 99 99 0 9999 99 9999 + 003033 1207 44 01 1 304095260 12 0110 + 003034 1207 44 02 1 304095260 13 0110 + 003035 1207 44 03 1 304095260 14 0110 + 003036 1207 44 04 1 304095260 15 0110 + 003037 9999 99 99 0 9999 99 9999 + 003038 9999 99 99 0 9999 99 9999 + 003039 9999 99 99 0 9999 99 9999 + 003040 9999 99 99 0 9999 99 9999 + 003041 1207 45 01 1 304095264 00 0111 + 003042 1207 45 02 1 304095264 01 0111 + 003043 1207 45 03 1 304095264 02 0111 + 003044 1207 45 04 1 304095264 03 0111 + 003045 9999 99 99 0 9999 99 9999 + 003046 9999 99 99 0 9999 99 9999 + 003047 9999 99 99 0 9999 99 9999 + 003048 9999 99 99 0 9999 99 9999 + 003049 1207 46 01 1 304095264 04 0111 + 003050 1207 46 02 1 304095264 05 0111 + 003051 1207 46 03 1 304095264 06 0111 + 003052 1207 46 04 1 304095264 07 0111 + 003053 9999 99 99 0 9999 99 9999 + 003054 9999 99 99 0 9999 99 9999 + 003055 9999 99 99 0 9999 99 9999 + 003056 9999 99 99 0 9999 99 9999 + 003057 1207 47 01 1 304095264 08 0111 + 003058 1207 47 02 1 304095264 09 0111 + 003059 1207 47 03 1 304095264 10 0111 + 003060 1207 47 04 1 304095264 11 0111 + 003061 9999 99 99 0 9999 99 9999 + 003062 9999 99 99 0 9999 99 9999 + 003063 9999 99 99 0 9999 99 9999 + 003064 9999 99 99 0 9999 99 9999 + 003065 1207 48 01 1 304095264 12 0111 + 003066 1207 48 02 1 304095264 13 0111 + 003067 1207 48 03 1 304095264 14 0111 + 003068 1207 48 04 1 304095264 15 0111 + 003069 9999 99 99 0 9999 99 9999 + 003070 9999 99 99 0 9999 99 9999 + 003071 9999 99 99 0 9999 99 9999 + 003072 9999 99 99 0 9999 99 9999 + 003073 1208 01 01 1 304091160 08 0101 + 003074 1208 01 02 1 304091160 09 0101 + 003075 1208 01 03 1 304091160 10 0101 + 003076 1208 01 04 1 304091160 11 0101 + 003077 9999 99 99 0 9999 99 9999 + 003078 9999 99 99 0 9999 99 9999 + 003079 9999 99 99 0 9999 99 9999 + 003080 9999 99 99 0 9999 99 9999 + 003081 1208 02 01 1 304091160 12 0101 + 003082 1208 02 02 1 304091160 13 0101 + 003083 1208 02 03 1 304091160 14 0101 + 003084 1208 02 04 1 304091160 15 0101 + 003085 9999 99 99 0 9999 99 9999 + 003086 9999 99 99 0 9999 99 9999 + 003087 9999 99 99 0 9999 99 9999 + 003088 9999 99 99 0 9999 99 9999 + 003089 1208 03 01 1 304091160 00 0101 + 003090 1208 03 02 1 304091160 01 0101 + 003091 1208 03 03 1 304091160 02 0101 + 003092 1208 03 04 1 304091160 03 0101 + 003093 9999 99 99 0 9999 99 9999 + 003094 9999 99 99 0 9999 99 9999 + 003095 9999 99 99 0 9999 99 9999 + 003096 9999 99 99 0 9999 99 9999 + 003097 1208 04 01 1 304091160 04 0101 + 003098 1208 04 02 1 304091160 05 0101 + 003099 1208 04 03 1 304091160 06 0101 + 003100 1208 04 04 1 304091160 07 0101 + 003101 9999 99 99 0 9999 99 9999 + 003102 9999 99 99 0 9999 99 9999 + 003103 9999 99 99 0 9999 99 9999 + 003104 9999 99 99 0 9999 99 9999 + 003105 1208 05 01 1 304091156 08 0100 + 003106 1208 05 02 1 304091156 09 0100 + 003107 1208 05 03 1 304091156 10 0100 + 003108 1208 05 04 1 304091156 11 0100 + 003109 9999 99 99 0 9999 99 9999 + 003110 9999 99 99 0 9999 99 9999 + 003111 9999 99 99 0 9999 99 9999 + 003112 9999 99 99 0 9999 99 9999 + 003113 1208 06 01 1 304091156 12 0100 + 003114 1208 06 02 1 304091156 13 0100 + 003115 1208 06 03 1 304091156 14 0100 + 003116 1208 06 04 1 304091156 15 0100 + 003117 9999 99 99 0 9999 99 9999 + 003118 9999 99 99 0 9999 99 9999 + 003119 9999 99 99 0 9999 99 9999 + 003120 9999 99 99 0 9999 99 9999 + 003121 1208 07 01 1 304091156 00 0100 + 003122 1208 07 02 1 304091156 01 0100 + 003123 1208 07 03 1 304091156 02 0100 + 003124 1208 07 04 1 304091156 03 0100 + 003125 9999 99 99 0 9999 99 9999 + 003126 9999 99 99 0 9999 99 9999 + 003127 9999 99 99 0 9999 99 9999 + 003128 9999 99 99 0 9999 99 9999 + 003129 1208 08 01 1 304091156 04 0100 + 003130 1208 08 02 1 304091156 05 0100 + 003131 1208 08 03 1 304091156 06 0100 + 003132 1208 08 04 1 304091156 07 0100 + 003133 9999 99 99 0 9999 99 9999 + 003134 9999 99 99 0 9999 99 9999 + 003135 9999 99 99 0 9999 99 9999 + 003136 9999 99 99 0 9999 99 9999 + 003137 1208 09 01 1 306192408 00 0685 + 003138 1208 09 02 1 306192408 01 0685 + 003139 1208 09 03 1 306192408 02 0685 + 003140 1208 09 04 1 306192408 03 0685 + 003141 1208 09 05 1 306192408 04 0685 + 003142 1208 09 06 1 306192408 05 0685 + 003143 1208 09 07 1 306192408 06 0685 + 003144 1208 09 08 1 306192408 07 0685 + 003145 1208 10 01 1 306192408 08 0685 + 003146 1208 10 02 1 306192408 09 0685 + 003147 1208 10 03 1 306192408 10 0685 + 003148 1208 10 04 1 306192408 11 0685 + 003149 1208 10 05 1 306192408 12 0685 + 003150 1208 10 06 1 306192408 13 0685 + 003151 1208 10 07 1 306192408 14 0685 + 003152 1208 10 08 1 306192408 15 0685 + 003153 1208 11 01 1 306192404 00 0684 + 003154 1208 11 02 1 306192404 01 0684 + 003155 1208 11 03 1 306192404 02 0684 + 003156 1208 11 04 1 306192404 03 0684 + 003157 1208 11 05 1 306192404 04 0684 + 003158 1208 11 06 1 306192404 05 0684 + 003159 1208 11 07 1 306192404 06 0684 + 003160 1208 11 08 1 306192404 07 0684 + 003161 1208 12 01 1 306192404 08 0684 + 003162 1208 12 02 1 306192404 09 0684 + 003163 1208 12 03 1 306192404 10 0684 + 003164 1208 12 04 1 306192404 11 0684 + 003165 1208 12 05 1 306192404 12 0684 + 003166 1208 12 06 1 306192404 13 0684 + 003167 1208 12 07 1 306192404 14 0684 + 003168 1208 12 08 1 306192404 15 0684 + 003169 1208 13 01 1 306192416 00 0687 + 003170 1208 13 02 1 306192416 01 0687 + 003171 1208 13 03 1 306192416 02 0687 + 003172 1208 13 04 1 306192416 03 0687 + 003173 1208 13 05 1 306192416 04 0687 + 003174 1208 13 06 1 306192416 05 0687 + 003175 1208 13 07 1 306192416 06 0687 + 003176 1208 13 08 1 306192416 07 0687 + 003177 1208 14 01 1 306192416 08 0687 + 003178 1208 14 02 1 306192416 09 0687 + 003179 1208 14 03 1 306192416 10 0687 + 003180 1208 14 04 1 306192416 11 0687 + 003181 1208 14 05 1 306192416 12 0687 + 003182 1208 14 06 1 306192416 13 0687 + 003183 1208 14 07 1 306192416 14 0687 + 003184 1208 14 08 1 306192416 15 0687 + 003185 1208 15 01 1 306192412 00 0686 + 003186 1208 15 02 1 306192412 01 0686 + 003187 1208 15 03 1 306192412 02 0686 + 003188 1208 15 04 1 306192412 03 0686 + 003189 1208 15 05 1 306192412 04 0686 + 003190 1208 15 06 1 306192412 05 0686 + 003191 1208 15 07 1 306192412 06 0686 + 003192 1208 15 08 1 306192412 07 0686 + 003193 1208 16 01 1 306192412 08 0686 + 003194 1208 16 02 1 306192412 09 0686 + 003195 1208 16 03 1 306192412 10 0686 + 003196 1208 16 04 1 306192412 11 0686 + 003197 1208 16 05 1 306192412 12 0686 + 003198 1208 16 06 1 306192412 13 0686 + 003199 1208 16 07 1 306192412 14 0686 + 003200 1208 16 08 1 306192412 15 0686 + 003201 1208 17 01 1 303042588 12 0006 + 003202 1208 17 02 1 303042588 13 0006 + 003203 9999 99 99 0 9999 99 9999 + 003204 9999 99 99 0 9999 99 9999 + 003205 9999 99 99 0 9999 99 9999 + 003206 9999 99 99 0 9999 99 9999 + 003207 9999 99 99 0 9999 99 9999 + 003208 9999 99 99 0 9999 99 9999 + 003209 1208 18 01 1 303042588 14 0006 + 003210 1208 18 02 1 303042588 15 0006 + 003211 9999 99 99 0 9999 99 9999 + 003212 9999 99 99 0 9999 99 9999 + 003213 9999 99 99 0 9999 99 9999 + 003214 9999 99 99 0 9999 99 9999 + 003215 9999 99 99 0 9999 99 9999 + 003216 9999 99 99 0 9999 99 9999 + 003217 1208 19 01 1 303042588 08 0006 + 003218 1208 19 02 1 303042588 09 0006 + 003219 9999 99 99 0 9999 99 9999 + 003220 9999 99 99 0 9999 99 9999 + 003221 9999 99 99 0 9999 99 9999 + 003222 9999 99 99 0 9999 99 9999 + 003223 9999 99 99 0 9999 99 9999 + 003224 9999 99 99 0 9999 99 9999 + 003225 1208 20 01 1 303042588 10 0006 + 003226 1208 20 02 1 303042588 11 0006 + 003227 9999 99 99 0 9999 99 9999 + 003228 9999 99 99 0 9999 99 9999 + 003229 9999 99 99 0 9999 99 9999 + 003230 9999 99 99 0 9999 99 9999 + 003231 9999 99 99 0 9999 99 9999 + 003232 9999 99 99 0 9999 99 9999 + 003233 1208 21 01 1 303042588 00 0006 + 003234 1208 21 02 1 303042588 01 0006 + 003235 9999 99 99 0 9999 99 9999 + 003236 9999 99 99 0 9999 99 9999 + 003237 9999 99 99 0 9999 99 9999 + 003238 9999 99 99 0 9999 99 9999 + 003239 9999 99 99 0 9999 99 9999 + 003240 9999 99 99 0 9999 99 9999 + 003241 1208 22 01 1 303042588 02 0006 + 003242 1208 22 02 1 303042588 03 0006 + 003243 9999 99 99 0 9999 99 9999 + 003244 9999 99 99 0 9999 99 9999 + 003245 9999 99 99 0 9999 99 9999 + 003246 9999 99 99 0 9999 99 9999 + 003247 9999 99 99 0 9999 99 9999 + 003248 9999 99 99 0 9999 99 9999 + 003249 1208 23 01 1 303042588 04 0006 + 003250 1208 23 02 1 303042588 05 0006 + 003251 9999 99 99 0 9999 99 9999 + 003252 9999 99 99 0 9999 99 9999 + 003253 9999 99 99 0 9999 99 9999 + 003254 9999 99 99 0 9999 99 9999 + 003255 9999 99 99 0 9999 99 9999 + 003256 9999 99 99 0 9999 99 9999 + 003257 1208 24 01 1 303042588 06 0006 + 003258 1208 24 02 1 303042588 07 0006 + 003259 9999 99 99 0 9999 99 9999 + 003260 9999 99 99 0 9999 99 9999 + 003261 9999 99 99 0 9999 99 9999 + 003262 9999 99 99 0 9999 99 9999 + 003263 9999 99 99 0 9999 99 9999 + 003264 9999 99 99 0 9999 99 9999 + 003265 1208 25 01 1 305147932 00 0342 + 003266 1208 25 02 1 305147932 01 0342 + 003267 1208 25 03 1 305147932 02 0342 + 003268 1208 25 04 1 305147932 03 0342 + 003269 1208 25 05 1 305147932 04 0342 + 003270 1208 25 06 1 305147932 05 0342 + 003271 1208 25 07 1 305147932 06 0342 + 003272 1208 25 08 1 305147932 07 0342 + 003273 1208 26 01 1 305147932 08 0342 + 003274 1208 26 02 1 305147932 09 0342 + 003275 1208 26 03 1 305147932 10 0342 + 003276 1208 26 04 1 305147932 11 0342 + 003277 1208 26 05 1 305147932 12 0342 + 003278 1208 26 06 1 305147932 13 0342 + 003279 1208 26 07 1 305147932 14 0342 + 003280 1208 26 08 1 305147932 15 0342 + 003281 1208 27 01 1 305147936 00 0343 + 003282 1208 27 02 1 305147936 01 0343 + 003283 1208 27 03 1 305147936 02 0343 + 003284 1208 27 04 1 305147936 03 0343 + 003285 1208 27 05 1 305147936 04 0343 + 003286 1208 27 06 1 305147936 05 0343 + 003287 1208 27 07 1 305147936 06 0343 + 003288 1208 27 08 1 305147936 07 0343 + 003289 1208 28 01 1 305147936 08 0343 + 003290 1208 28 02 1 305147936 09 0343 + 003291 1208 28 03 1 305147936 10 0343 + 003292 1208 28 04 1 305147936 11 0343 + 003293 1208 28 05 1 305147936 12 0343 + 003294 1208 28 06 1 305147936 13 0343 + 003295 1208 28 07 1 305147936 14 0343 + 003296 1208 28 08 1 305147936 15 0343 + 003297 1208 29 01 1 305147924 00 0340 + 003298 1208 29 02 1 305147924 01 0340 + 003299 1208 29 03 1 305147924 02 0340 + 003300 1208 29 04 1 305147924 03 0340 + 003301 1208 29 05 1 305147924 04 0340 + 003302 1208 29 06 1 305147924 05 0340 + 003303 1208 29 07 1 305147924 06 0340 + 003304 1208 29 08 1 305147924 07 0340 + 003305 1208 30 01 1 305147924 08 0340 + 003306 1208 30 02 1 305147924 09 0340 + 003307 1208 30 03 1 305147924 10 0340 + 003308 1208 30 04 1 305147924 11 0340 + 003309 1208 30 05 1 305147924 12 0340 + 003310 1208 30 06 1 305147924 13 0340 + 003311 1208 30 07 1 305147924 14 0340 + 003312 1208 30 08 1 305147924 15 0340 + 003313 1208 31 01 1 305147928 00 0341 + 003314 1208 31 02 1 305147928 01 0341 + 003315 1208 31 03 1 305147928 02 0341 + 003316 1208 31 04 1 305147928 03 0341 + 003317 1208 31 05 1 305147928 04 0341 + 003318 1208 31 06 1 305147928 05 0341 + 003319 1208 31 07 1 305147928 06 0341 + 003320 1208 31 08 1 305147928 07 0341 + 003321 1208 32 01 1 305147928 08 0341 + 003322 1208 32 02 1 305147928 09 0341 + 003323 1208 32 03 1 305147928 10 0341 + 003324 1208 32 04 1 305147928 11 0341 + 003325 1208 32 05 1 305147928 12 0341 + 003326 1208 32 06 1 305147928 13 0341 + 003327 1208 32 07 1 305147928 14 0341 + 003328 1208 32 08 1 305147928 15 0341 + 003329 1208 33 01 1 306188312 00 0677 + 003330 1208 33 02 1 306188312 01 0677 + 003331 1208 33 03 1 306188312 02 0677 + 003332 1208 33 04 1 306188312 03 0677 + 003333 1208 33 05 1 306188312 04 0677 + 003334 1208 33 06 1 306188312 05 0677 + 003335 1208 33 07 1 306188312 06 0677 + 003336 1208 33 08 1 306188312 07 0677 + 003337 1208 34 01 1 306188312 08 0677 + 003338 1208 34 02 1 306188312 09 0677 + 003339 1208 34 03 1 306188312 10 0677 + 003340 1208 34 04 1 306188312 11 0677 + 003341 1208 34 05 1 306188312 12 0677 + 003342 1208 34 06 1 306188312 13 0677 + 003343 1208 34 07 1 306188312 14 0677 + 003344 1208 34 08 1 306188312 15 0677 + 003345 1208 35 01 1 306188308 00 0676 + 003346 1208 35 02 1 306188308 01 0676 + 003347 1208 35 03 1 306188308 02 0676 + 003348 1208 35 04 1 306188308 03 0676 + 003349 1208 35 05 1 306188308 04 0676 + 003350 1208 35 06 1 306188308 05 0676 + 003351 1208 35 07 1 306188308 06 0676 + 003352 1208 35 08 1 306188308 07 0676 + 003353 1208 36 01 1 306188308 08 0676 + 003354 1208 36 02 1 306188308 09 0676 + 003355 1208 36 03 1 306188308 10 0676 + 003356 1208 36 04 1 306188308 11 0676 + 003357 1208 36 05 1 306188308 12 0676 + 003358 1208 36 06 1 306188308 13 0676 + 003359 1208 36 07 1 306188308 14 0676 + 003360 1208 36 08 1 306188308 15 0676 + 003361 1208 37 01 1 306188320 00 0679 + 003362 1208 37 02 1 306188320 01 0679 + 003363 1208 37 03 1 306188320 02 0679 + 003364 1208 37 04 1 306188320 03 0679 + 003365 1208 37 05 1 306188320 04 0679 + 003366 1208 37 06 1 306188320 05 0679 + 003367 1208 37 07 1 306188320 06 0679 + 003368 1208 37 08 1 306188320 07 0679 + 003369 1208 38 01 1 306188320 08 0679 + 003370 1208 38 02 1 306188320 09 0679 + 003371 1208 38 03 1 306188320 10 0679 + 003372 1208 38 04 1 306188320 11 0679 + 003373 1208 38 05 1 306188320 12 0679 + 003374 1208 38 06 1 306188320 13 0679 + 003375 1208 38 07 1 306188320 14 0679 + 003376 1208 38 08 1 306188320 15 0679 + 003377 1208 39 01 1 306188316 00 0678 + 003378 1208 39 02 1 306188316 01 0678 + 003379 1208 39 03 1 306188316 02 0678 + 003380 1208 39 04 1 306188316 03 0678 + 003381 1208 39 05 1 306188316 04 0678 + 003382 1208 39 06 1 306188316 05 0678 + 003383 1208 39 07 1 306188316 06 0678 + 003384 1208 39 08 1 306188316 07 0678 + 003385 1208 40 01 1 306188316 08 0678 + 003386 1208 40 02 1 306188316 09 0678 + 003387 1208 40 03 1 306188316 10 0678 + 003388 1208 40 04 1 306188316 11 0678 + 003389 1208 40 05 1 306188316 12 0678 + 003390 1208 40 06 1 306188316 13 0678 + 003391 1208 40 07 1 306188316 14 0678 + 003392 1208 40 08 1 306188316 15 0678 + 003393 1208 41 01 1 304091168 08 0103 + 003394 1208 41 02 1 304091168 09 0103 + 003395 1208 41 03 1 304091168 10 0103 + 003396 1208 41 04 1 304091168 11 0103 + 003397 9999 99 99 0 9999 99 9999 + 003398 9999 99 99 0 9999 99 9999 + 003399 9999 99 99 0 9999 99 9999 + 003400 9999 99 99 0 9999 99 9999 + 003401 1208 42 01 1 304091168 12 0103 + 003402 1208 42 02 1 304091168 13 0103 + 003403 1208 42 03 1 304091168 14 0103 + 003404 1208 42 04 1 304091168 15 0103 + 003405 9999 99 99 0 9999 99 9999 + 003406 9999 99 99 0 9999 99 9999 + 003407 9999 99 99 0 9999 99 9999 + 003408 9999 99 99 0 9999 99 9999 + 003409 1208 43 01 1 304091168 00 0103 + 003410 1208 43 02 1 304091168 01 0103 + 003411 1208 43 03 1 304091168 02 0103 + 003412 1208 43 04 1 304091168 03 0103 + 003413 9999 99 99 0 9999 99 9999 + 003414 9999 99 99 0 9999 99 9999 + 003415 9999 99 99 0 9999 99 9999 + 003416 9999 99 99 0 9999 99 9999 + 003417 1208 44 01 1 304091168 04 0103 + 003418 1208 44 02 1 304091168 05 0103 + 003419 1208 44 03 1 304091168 06 0103 + 003420 1208 44 04 1 304091168 07 0103 + 003421 9999 99 99 0 9999 99 9999 + 003422 9999 99 99 0 9999 99 9999 + 003423 9999 99 99 0 9999 99 9999 + 003424 9999 99 99 0 9999 99 9999 + 003425 1208 45 01 1 304091164 08 0102 + 003426 1208 45 02 1 304091164 09 0102 + 003427 1208 45 03 1 304091164 10 0102 + 003428 1208 45 04 1 304091164 11 0102 + 003429 9999 99 99 0 9999 99 9999 + 003430 9999 99 99 0 9999 99 9999 + 003431 9999 99 99 0 9999 99 9999 + 003432 9999 99 99 0 9999 99 9999 + 003433 1208 46 01 1 304091164 12 0102 + 003434 1208 46 02 1 304091164 13 0102 + 003435 1208 46 03 1 304091164 14 0102 + 003436 1208 46 04 1 304091164 15 0102 + 003437 9999 99 99 0 9999 99 9999 + 003438 9999 99 99 0 9999 99 9999 + 003439 9999 99 99 0 9999 99 9999 + 003440 9999 99 99 0 9999 99 9999 + 003441 1208 47 01 1 304091164 00 0102 + 003442 1208 47 02 1 304091164 01 0102 + 003443 1208 47 03 1 304091164 02 0102 + 003444 1208 47 04 1 304091164 03 0102 + 003445 9999 99 99 0 9999 99 9999 + 003446 9999 99 99 0 9999 99 9999 + 003447 9999 99 99 0 9999 99 9999 + 003448 9999 99 99 0 9999 99 9999 + 003449 1208 48 01 1 304091164 04 0102 + 003450 1208 48 02 1 304091164 05 0102 + 003451 1208 48 03 1 304091164 06 0102 + 003452 1208 48 04 1 304091164 07 0102 + 003453 9999 99 99 0 9999 99 9999 + 003454 9999 99 99 0 9999 99 9999 + 003455 9999 99 99 0 9999 99 9999 + 003456 9999 99 99 0 9999 99 9999 + 003457 1209 01 01 1 305143836 00 0334 + 003458 1209 01 02 1 305143836 01 0334 + 003459 1209 01 03 1 305143836 02 0334 + 003460 1209 01 04 1 305143836 03 0334 + 003461 1209 01 05 1 305143836 04 0334 + 003462 1209 01 06 1 305143836 05 0334 + 003463 1209 01 07 1 305143836 06 0334 + 003464 1209 01 08 1 305143836 07 0334 + 003465 1209 02 01 1 305143836 08 0334 + 003466 1209 02 02 1 305143836 09 0334 + 003467 1209 02 03 1 305143836 10 0334 + 003468 1209 02 04 1 305143836 11 0334 + 003469 1209 02 05 1 305143836 12 0334 + 003470 1209 02 06 1 305143836 13 0334 + 003471 1209 02 07 1 305143836 14 0334 + 003472 1209 02 08 1 305143836 15 0334 + 003473 1209 03 01 1 305143840 00 0335 + 003474 1209 03 02 1 305143840 01 0335 + 003475 1209 03 03 1 305143840 02 0335 + 003476 1209 03 04 1 305143840 03 0335 + 003477 1209 03 05 1 305143840 04 0335 + 003478 1209 03 06 1 305143840 05 0335 + 003479 1209 03 07 1 305143840 06 0335 + 003480 1209 03 08 1 305143840 07 0335 + 003481 1209 04 01 1 305143840 08 0335 + 003482 1209 04 02 1 305143840 09 0335 + 003483 1209 04 03 1 305143840 10 0335 + 003484 1209 04 04 1 305143840 11 0335 + 003485 1209 04 05 1 305143840 12 0335 + 003486 1209 04 06 1 305143840 13 0335 + 003487 1209 04 07 1 305143840 14 0335 + 003488 1209 04 08 1 305143840 15 0335 + 003489 1209 05 01 1 305143828 00 0332 + 003490 1209 05 02 1 305143828 01 0332 + 003491 1209 05 03 1 305143828 02 0332 + 003492 1209 05 04 1 305143828 03 0332 + 003493 1209 05 05 1 305143828 04 0332 + 003494 1209 05 06 1 305143828 05 0332 + 003495 1209 05 07 1 305143828 06 0332 + 003496 1209 05 08 1 305143828 07 0332 + 003497 1209 06 01 1 305143828 08 0332 + 003498 1209 06 02 1 305143828 09 0332 + 003499 1209 06 03 1 305143828 10 0332 + 003500 1209 06 04 1 305143828 11 0332 + 003501 1209 06 05 1 305143828 12 0332 + 003502 1209 06 06 1 305143828 13 0332 + 003503 1209 06 07 1 305143828 14 0332 + 003504 1209 06 08 1 305143828 15 0332 + 003505 1209 07 01 1 305143832 00 0333 + 003506 1209 07 02 1 305143832 01 0333 + 003507 1209 07 03 1 305143832 02 0333 + 003508 1209 07 04 1 305143832 03 0333 + 003509 1209 07 05 1 305143832 04 0333 + 003510 1209 07 06 1 305143832 05 0333 + 003511 1209 07 07 1 305143832 06 0333 + 003512 1209 07 08 1 305143832 07 0333 + 003513 1209 08 01 1 305143832 08 0333 + 003514 1209 08 02 1 305143832 09 0333 + 003515 1209 08 03 1 305143832 10 0333 + 003516 1209 08 04 1 305143832 11 0333 + 003517 1209 08 05 1 305143832 12 0333 + 003518 1209 08 06 1 305143832 13 0333 + 003519 1209 08 07 1 305143832 14 0333 + 003520 1209 08 08 1 305143832 15 0333 + 003521 1209 09 01 1 305139736 00 0325 + 003522 1209 09 02 1 305139736 01 0325 + 003523 1209 09 03 1 305139736 02 0325 + 003524 1209 09 04 1 305139736 03 0325 + 003525 1209 09 05 1 305139736 04 0325 + 003526 1209 09 06 1 305139736 05 0325 + 003527 1209 09 07 1 305139736 06 0325 + 003528 1209 09 08 1 305139736 07 0325 + 003529 1209 10 01 1 305139736 08 0325 + 003530 1209 10 02 1 305139736 09 0325 + 003531 1209 10 03 1 305139736 10 0325 + 003532 1209 10 04 1 305139736 11 0325 + 003533 1209 10 05 1 305139736 12 0325 + 003534 1209 10 06 1 305139736 13 0325 + 003535 1209 10 07 1 305139736 14 0325 + 003536 1209 10 08 1 305139736 15 0325 + 003537 1209 11 01 1 305139732 00 0324 + 003538 1209 11 02 1 305139732 01 0324 + 003539 1209 11 03 1 305139732 02 0324 + 003540 1209 11 04 1 305139732 03 0324 + 003541 1209 11 05 1 305139732 04 0324 + 003542 1209 11 06 1 305139732 05 0324 + 003543 1209 11 07 1 305139732 06 0324 + 003544 1209 11 08 1 305139732 07 0324 + 003545 1209 12 01 1 305139732 08 0324 + 003546 1209 12 02 1 305139732 09 0324 + 003547 1209 12 03 1 305139732 10 0324 + 003548 1209 12 04 1 305139732 11 0324 + 003549 1209 12 05 1 305139732 12 0324 + 003550 1209 12 06 1 305139732 13 0324 + 003551 1209 12 07 1 305139732 14 0324 + 003552 1209 12 08 1 305139732 15 0324 + 003553 1209 13 01 1 305139744 00 0327 + 003554 1209 13 02 1 305139744 01 0327 + 003555 1209 13 03 1 305139744 02 0327 + 003556 1209 13 04 1 305139744 03 0327 + 003557 1209 13 05 1 305139744 04 0327 + 003558 1209 13 06 1 305139744 05 0327 + 003559 1209 13 07 1 305139744 06 0327 + 003560 1209 13 08 1 305139744 07 0327 + 003561 1209 14 01 1 305139744 08 0327 + 003562 1209 14 02 1 305139744 09 0327 + 003563 1209 14 03 1 305139744 10 0327 + 003564 1209 14 04 1 305139744 11 0327 + 003565 1209 14 05 1 305139744 12 0327 + 003566 1209 14 06 1 305139744 13 0327 + 003567 1209 14 07 1 305139744 14 0327 + 003568 1209 14 08 1 305139744 15 0327 + 003569 1209 15 01 1 305139740 00 0326 + 003570 1209 15 02 1 305139740 01 0326 + 003571 1209 15 03 1 305139740 02 0326 + 003572 1209 15 04 1 305139740 03 0326 + 003573 1209 15 05 1 305139740 04 0326 + 003574 1209 15 06 1 305139740 05 0326 + 003575 1209 15 07 1 305139740 06 0326 + 003576 1209 15 08 1 305139740 07 0326 + 003577 1209 16 01 1 305139740 08 0326 + 003578 1209 16 02 1 305139740 09 0326 + 003579 1209 16 03 1 305139740 10 0326 + 003580 1209 16 04 1 305139740 11 0326 + 003581 1209 16 05 1 305139740 12 0326 + 003582 1209 16 06 1 305139740 13 0326 + 003583 1209 16 07 1 305139740 14 0326 + 003584 1209 16 08 1 305139740 15 0326 + 003585 9999 99 99 0 9999 99 9999 + 003586 9999 99 99 0 9999 99 9999 + 003587 9999 99 99 0 9999 99 9999 + 003588 9999 99 99 0 9999 99 9999 + 003589 9999 99 99 0 9999 99 9999 + 003590 9999 99 99 0 9999 99 9999 + 003591 9999 99 99 0 9999 99 9999 + 003592 9999 99 99 0 9999 99 9999 + 003593 9999 99 99 0 9999 99 9999 + 003594 9999 99 99 0 9999 99 9999 + 003595 9999 99 99 0 9999 99 9999 + 003596 9999 99 99 0 9999 99 9999 + 003597 9999 99 99 0 9999 99 9999 + 003598 9999 99 99 0 9999 99 9999 + 003599 9999 99 99 0 9999 99 9999 + 003600 9999 99 99 0 9999 99 9999 + 003601 9999 99 99 0 9999 99 9999 + 003602 9999 99 99 0 9999 99 9999 + 003603 9999 99 99 0 9999 99 9999 + 003604 9999 99 99 0 9999 99 9999 + 003605 9999 99 99 0 9999 99 9999 + 003606 9999 99 99 0 9999 99 9999 + 003607 9999 99 99 0 9999 99 9999 + 003608 9999 99 99 0 9999 99 9999 + 003609 9999 99 99 0 9999 99 9999 + 003610 9999 99 99 0 9999 99 9999 + 003611 9999 99 99 0 9999 99 9999 + 003612 9999 99 99 0 9999 99 9999 + 003613 9999 99 99 0 9999 99 9999 + 003614 9999 99 99 0 9999 99 9999 + 003615 9999 99 99 0 9999 99 9999 + 003616 9999 99 99 0 9999 99 9999 + 003617 9999 99 99 0 9999 99 9999 + 003618 9999 99 99 0 9999 99 9999 + 003619 9999 99 99 0 9999 99 9999 + 003620 9999 99 99 0 9999 99 9999 + 003621 9999 99 99 0 9999 99 9999 + 003622 9999 99 99 0 9999 99 9999 + 003623 9999 99 99 0 9999 99 9999 + 003624 9999 99 99 0 9999 99 9999 + 003625 9999 99 99 0 9999 99 9999 + 003626 9999 99 99 0 9999 99 9999 + 003627 9999 99 99 0 9999 99 9999 + 003628 9999 99 99 0 9999 99 9999 + 003629 9999 99 99 0 9999 99 9999 + 003630 9999 99 99 0 9999 99 9999 + 003631 9999 99 99 0 9999 99 9999 + 003632 9999 99 99 0 9999 99 9999 + 003633 9999 99 99 0 9999 99 9999 + 003634 9999 99 99 0 9999 99 9999 + 003635 9999 99 99 0 9999 99 9999 + 003636 9999 99 99 0 9999 99 9999 + 003637 9999 99 99 0 9999 99 9999 + 003638 9999 99 99 0 9999 99 9999 + 003639 9999 99 99 0 9999 99 9999 + 003640 9999 99 99 0 9999 99 9999 + 003641 9999 99 99 0 9999 99 9999 + 003642 9999 99 99 0 9999 99 9999 + 003643 9999 99 99 0 9999 99 9999 + 003644 9999 99 99 0 9999 99 9999 + 003645 9999 99 99 0 9999 99 9999 + 003646 9999 99 99 0 9999 99 9999 + 003647 9999 99 99 0 9999 99 9999 + 003648 9999 99 99 0 9999 99 9999 + 003649 9999 99 99 0 9999 99 9999 + 003650 9999 99 99 0 9999 99 9999 + 003651 9999 99 99 0 9999 99 9999 + 003652 9999 99 99 0 9999 99 9999 + 003653 9999 99 99 0 9999 99 9999 + 003654 9999 99 99 0 9999 99 9999 + 003655 9999 99 99 0 9999 99 9999 + 003656 9999 99 99 0 9999 99 9999 + 003657 9999 99 99 0 9999 99 9999 + 003658 9999 99 99 0 9999 99 9999 + 003659 9999 99 99 0 9999 99 9999 + 003660 9999 99 99 0 9999 99 9999 + 003661 9999 99 99 0 9999 99 9999 + 003662 9999 99 99 0 9999 99 9999 + 003663 9999 99 99 0 9999 99 9999 + 003664 9999 99 99 0 9999 99 9999 + 003665 9999 99 99 0 9999 99 9999 + 003666 9999 99 99 0 9999 99 9999 + 003667 9999 99 99 0 9999 99 9999 + 003668 9999 99 99 0 9999 99 9999 + 003669 9999 99 99 0 9999 99 9999 + 003670 9999 99 99 0 9999 99 9999 + 003671 9999 99 99 0 9999 99 9999 + 003672 9999 99 99 0 9999 99 9999 + 003673 9999 99 99 0 9999 99 9999 + 003674 9999 99 99 0 9999 99 9999 + 003675 9999 99 99 0 9999 99 9999 + 003676 9999 99 99 0 9999 99 9999 + 003677 9999 99 99 0 9999 99 9999 + 003678 9999 99 99 0 9999 99 9999 + 003679 9999 99 99 0 9999 99 9999 + 003680 9999 99 99 0 9999 99 9999 + 003681 9999 99 99 0 9999 99 9999 + 003682 9999 99 99 0 9999 99 9999 + 003683 9999 99 99 0 9999 99 9999 + 003684 9999 99 99 0 9999 99 9999 + 003685 9999 99 99 0 9999 99 9999 + 003686 9999 99 99 0 9999 99 9999 + 003687 9999 99 99 0 9999 99 9999 + 003688 9999 99 99 0 9999 99 9999 + 003689 9999 99 99 0 9999 99 9999 + 003690 9999 99 99 0 9999 99 9999 + 003691 9999 99 99 0 9999 99 9999 + 003692 9999 99 99 0 9999 99 9999 + 003693 9999 99 99 0 9999 99 9999 + 003694 9999 99 99 0 9999 99 9999 + 003695 9999 99 99 0 9999 99 9999 + 003696 9999 99 99 0 9999 99 9999 + 003697 9999 99 99 0 9999 99 9999 + 003698 9999 99 99 0 9999 99 9999 + 003699 9999 99 99 0 9999 99 9999 + 003700 9999 99 99 0 9999 99 9999 + 003701 9999 99 99 0 9999 99 9999 + 003702 9999 99 99 0 9999 99 9999 + 003703 9999 99 99 0 9999 99 9999 + 003704 9999 99 99 0 9999 99 9999 + 003705 9999 99 99 0 9999 99 9999 + 003706 9999 99 99 0 9999 99 9999 + 003707 9999 99 99 0 9999 99 9999 + 003708 9999 99 99 0 9999 99 9999 + 003709 9999 99 99 0 9999 99 9999 + 003710 9999 99 99 0 9999 99 9999 + 003711 9999 99 99 0 9999 99 9999 + 003712 9999 99 99 0 9999 99 9999 + 003713 9999 99 99 0 9999 99 9999 + 003714 9999 99 99 0 9999 99 9999 + 003715 9999 99 99 0 9999 99 9999 + 003716 9999 99 99 0 9999 99 9999 + 003717 9999 99 99 0 9999 99 9999 + 003718 9999 99 99 0 9999 99 9999 + 003719 9999 99 99 0 9999 99 9999 + 003720 9999 99 99 0 9999 99 9999 + 003721 9999 99 99 0 9999 99 9999 + 003722 9999 99 99 0 9999 99 9999 + 003723 9999 99 99 0 9999 99 9999 + 003724 9999 99 99 0 9999 99 9999 + 003725 9999 99 99 0 9999 99 9999 + 003726 9999 99 99 0 9999 99 9999 + 003727 9999 99 99 0 9999 99 9999 + 003728 9999 99 99 0 9999 99 9999 + 003729 9999 99 99 0 9999 99 9999 + 003730 9999 99 99 0 9999 99 9999 + 003731 9999 99 99 0 9999 99 9999 + 003732 9999 99 99 0 9999 99 9999 + 003733 9999 99 99 0 9999 99 9999 + 003734 9999 99 99 0 9999 99 9999 + 003735 9999 99 99 0 9999 99 9999 + 003736 9999 99 99 0 9999 99 9999 + 003737 9999 99 99 0 9999 99 9999 + 003738 9999 99 99 0 9999 99 9999 + 003739 9999 99 99 0 9999 99 9999 + 003740 9999 99 99 0 9999 99 9999 + 003741 9999 99 99 0 9999 99 9999 + 003742 9999 99 99 0 9999 99 9999 + 003743 9999 99 99 0 9999 99 9999 + 003744 9999 99 99 0 9999 99 9999 + 003745 9999 99 99 0 9999 99 9999 + 003746 9999 99 99 0 9999 99 9999 + 003747 9999 99 99 0 9999 99 9999 + 003748 9999 99 99 0 9999 99 9999 + 003749 9999 99 99 0 9999 99 9999 + 003750 9999 99 99 0 9999 99 9999 + 003751 9999 99 99 0 9999 99 9999 + 003752 9999 99 99 0 9999 99 9999 + 003753 9999 99 99 0 9999 99 9999 + 003754 9999 99 99 0 9999 99 9999 + 003755 9999 99 99 0 9999 99 9999 + 003756 9999 99 99 0 9999 99 9999 + 003757 9999 99 99 0 9999 99 9999 + 003758 9999 99 99 0 9999 99 9999 + 003759 9999 99 99 0 9999 99 9999 + 003760 9999 99 99 0 9999 99 9999 + 003761 9999 99 99 0 9999 99 9999 + 003762 9999 99 99 0 9999 99 9999 + 003763 9999 99 99 0 9999 99 9999 + 003764 9999 99 99 0 9999 99 9999 + 003765 9999 99 99 0 9999 99 9999 + 003766 9999 99 99 0 9999 99 9999 + 003767 9999 99 99 0 9999 99 9999 + 003768 9999 99 99 0 9999 99 9999 + 003769 9999 99 99 0 9999 99 9999 + 003770 9999 99 99 0 9999 99 9999 + 003771 9999 99 99 0 9999 99 9999 + 003772 9999 99 99 0 9999 99 9999 + 003773 9999 99 99 0 9999 99 9999 + 003774 9999 99 99 0 9999 99 9999 + 003775 9999 99 99 0 9999 99 9999 + 003776 9999 99 99 0 9999 99 9999 + 003777 9999 99 99 0 9999 99 9999 + 003778 9999 99 99 0 9999 99 9999 + 003779 9999 99 99 0 9999 99 9999 + 003780 9999 99 99 0 9999 99 9999 + 003781 9999 99 99 0 9999 99 9999 + 003782 9999 99 99 0 9999 99 9999 + 003783 9999 99 99 0 9999 99 9999 + 003784 9999 99 99 0 9999 99 9999 + 003785 9999 99 99 0 9999 99 9999 + 003786 9999 99 99 0 9999 99 9999 + 003787 9999 99 99 0 9999 99 9999 + 003788 9999 99 99 0 9999 99 9999 + 003789 9999 99 99 0 9999 99 9999 + 003790 9999 99 99 0 9999 99 9999 + 003791 9999 99 99 0 9999 99 9999 + 003792 9999 99 99 0 9999 99 9999 + 003793 9999 99 99 0 9999 99 9999 + 003794 9999 99 99 0 9999 99 9999 + 003795 9999 99 99 0 9999 99 9999 + 003796 9999 99 99 0 9999 99 9999 + 003797 9999 99 99 0 9999 99 9999 + 003798 9999 99 99 0 9999 99 9999 + 003799 9999 99 99 0 9999 99 9999 + 003800 9999 99 99 0 9999 99 9999 + 003801 9999 99 99 0 9999 99 9999 + 003802 9999 99 99 0 9999 99 9999 + 003803 9999 99 99 0 9999 99 9999 + 003804 9999 99 99 0 9999 99 9999 + 003805 9999 99 99 0 9999 99 9999 + 003806 9999 99 99 0 9999 99 9999 + 003807 9999 99 99 0 9999 99 9999 + 003808 9999 99 99 0 9999 99 9999 + 003809 9999 99 99 0 9999 99 9999 + 003810 9999 99 99 0 9999 99 9999 + 003811 9999 99 99 0 9999 99 9999 + 003812 9999 99 99 0 9999 99 9999 + 003813 9999 99 99 0 9999 99 9999 + 003814 9999 99 99 0 9999 99 9999 + 003815 9999 99 99 0 9999 99 9999 + 003816 9999 99 99 0 9999 99 9999 + 003817 9999 99 99 0 9999 99 9999 + 003818 9999 99 99 0 9999 99 9999 + 003819 9999 99 99 0 9999 99 9999 + 003820 9999 99 99 0 9999 99 9999 + 003821 9999 99 99 0 9999 99 9999 + 003822 9999 99 99 0 9999 99 9999 + 003823 9999 99 99 0 9999 99 9999 + 003824 9999 99 99 0 9999 99 9999 + 003825 9999 99 99 0 9999 99 9999 + 003826 9999 99 99 0 9999 99 9999 + 003827 9999 99 99 0 9999 99 9999 + 003828 9999 99 99 0 9999 99 9999 + 003829 9999 99 99 0 9999 99 9999 + 003830 9999 99 99 0 9999 99 9999 + 003831 9999 99 99 0 9999 99 9999 + 003832 9999 99 99 0 9999 99 9999 + 003833 9999 99 99 0 9999 99 9999 + 003834 9999 99 99 0 9999 99 9999 + 003835 9999 99 99 0 9999 99 9999 + 003836 9999 99 99 0 9999 99 9999 + 003837 9999 99 99 0 9999 99 9999 + 003838 9999 99 99 0 9999 99 9999 + 003839 9999 99 99 0 9999 99 9999 + 003840 9999 99 99 0 9999 99 9999 + 003841 9999 99 99 0 9999 99 9999 + 003842 9999 99 99 0 9999 99 9999 + 003843 9999 99 99 0 9999 99 9999 + 003844 9999 99 99 0 9999 99 9999 + 003845 9999 99 99 0 9999 99 9999 + 003846 9999 99 99 0 9999 99 9999 + 003847 9999 99 99 0 9999 99 9999 + 003848 9999 99 99 0 9999 99 9999 + 003849 9999 99 99 0 9999 99 9999 + 003850 9999 99 99 0 9999 99 9999 + 003851 9999 99 99 0 9999 99 9999 + 003852 9999 99 99 0 9999 99 9999 + 003853 9999 99 99 0 9999 99 9999 + 003854 9999 99 99 0 9999 99 9999 + 003855 9999 99 99 0 9999 99 9999 + 003856 9999 99 99 0 9999 99 9999 + 003857 9999 99 99 0 9999 99 9999 + 003858 9999 99 99 0 9999 99 9999 + 003859 9999 99 99 0 9999 99 9999 + 003860 9999 99 99 0 9999 99 9999 + 003861 9999 99 99 0 9999 99 9999 + 003862 9999 99 99 0 9999 99 9999 + 003863 9999 99 99 0 9999 99 9999 + 003864 9999 99 99 0 9999 99 9999 + 003865 9999 99 99 0 9999 99 9999 + 003866 9999 99 99 0 9999 99 9999 + 003867 9999 99 99 0 9999 99 9999 + 003868 9999 99 99 0 9999 99 9999 + 003869 9999 99 99 0 9999 99 9999 + 003870 9999 99 99 0 9999 99 9999 + 003871 9999 99 99 0 9999 99 9999 + 003872 9999 99 99 0 9999 99 9999 + 003873 9999 99 99 0 9999 99 9999 + 003874 9999 99 99 0 9999 99 9999 + 003875 9999 99 99 0 9999 99 9999 + 003876 9999 99 99 0 9999 99 9999 + 003877 9999 99 99 0 9999 99 9999 + 003878 9999 99 99 0 9999 99 9999 + 003879 9999 99 99 0 9999 99 9999 + 003880 9999 99 99 0 9999 99 9999 + 003881 9999 99 99 0 9999 99 9999 + 003882 9999 99 99 0 9999 99 9999 + 003883 9999 99 99 0 9999 99 9999 + 003884 9999 99 99 0 9999 99 9999 + 003885 9999 99 99 0 9999 99 9999 + 003886 9999 99 99 0 9999 99 9999 + 003887 9999 99 99 0 9999 99 9999 + 003888 9999 99 99 0 9999 99 9999 + 003889 9999 99 99 0 9999 99 9999 + 003890 9999 99 99 0 9999 99 9999 + 003891 9999 99 99 0 9999 99 9999 + 003892 9999 99 99 0 9999 99 9999 + 003893 9999 99 99 0 9999 99 9999 + 003894 9999 99 99 0 9999 99 9999 + 003895 9999 99 99 0 9999 99 9999 + 003896 9999 99 99 0 9999 99 9999 + 003897 9999 99 99 0 9999 99 9999 + 003898 9999 99 99 0 9999 99 9999 + 003899 9999 99 99 0 9999 99 9999 + 003900 9999 99 99 0 9999 99 9999 + 003901 9999 99 99 0 9999 99 9999 + 003902 9999 99 99 0 9999 99 9999 + 003903 9999 99 99 0 9999 99 9999 + 003904 9999 99 99 0 9999 99 9999 + 003905 9999 99 99 0 9999 99 9999 + 003906 9999 99 99 0 9999 99 9999 + 003907 9999 99 99 0 9999 99 9999 + 003908 9999 99 99 0 9999 99 9999 + 003909 9999 99 99 0 9999 99 9999 + 003910 9999 99 99 0 9999 99 9999 + 003911 9999 99 99 0 9999 99 9999 + 003912 9999 99 99 0 9999 99 9999 + 003913 9999 99 99 0 9999 99 9999 + 003914 9999 99 99 0 9999 99 9999 + 003915 9999 99 99 0 9999 99 9999 + 003916 9999 99 99 0 9999 99 9999 + 003917 9999 99 99 0 9999 99 9999 + 003918 9999 99 99 0 9999 99 9999 + 003919 9999 99 99 0 9999 99 9999 + 003920 9999 99 99 0 9999 99 9999 + 003921 9999 99 99 0 9999 99 9999 + 003922 9999 99 99 0 9999 99 9999 + 003923 9999 99 99 0 9999 99 9999 + 003924 9999 99 99 0 9999 99 9999 + 003925 9999 99 99 0 9999 99 9999 + 003926 9999 99 99 0 9999 99 9999 + 003927 9999 99 99 0 9999 99 9999 + 003928 9999 99 99 0 9999 99 9999 + 003929 9999 99 99 0 9999 99 9999 + 003930 9999 99 99 0 9999 99 9999 + 003931 9999 99 99 0 9999 99 9999 + 003932 9999 99 99 0 9999 99 9999 + 003933 9999 99 99 0 9999 99 9999 + 003934 9999 99 99 0 9999 99 9999 + 003935 9999 99 99 0 9999 99 9999 + 003936 9999 99 99 0 9999 99 9999 + 003937 9999 99 99 0 9999 99 9999 + 003938 9999 99 99 0 9999 99 9999 + 003939 9999 99 99 0 9999 99 9999 + 003940 9999 99 99 0 9999 99 9999 + 003941 9999 99 99 0 9999 99 9999 + 003942 9999 99 99 0 9999 99 9999 + 003943 9999 99 99 0 9999 99 9999 + 003944 9999 99 99 0 9999 99 9999 + 003945 9999 99 99 0 9999 99 9999 + 003946 9999 99 99 0 9999 99 9999 + 003947 9999 99 99 0 9999 99 9999 + 003948 9999 99 99 0 9999 99 9999 + 003949 9999 99 99 0 9999 99 9999 + 003950 9999 99 99 0 9999 99 9999 + 003951 9999 99 99 0 9999 99 9999 + 003952 9999 99 99 0 9999 99 9999 + 003953 9999 99 99 0 9999 99 9999 + 003954 9999 99 99 0 9999 99 9999 + 003955 9999 99 99 0 9999 99 9999 + 003956 9999 99 99 0 9999 99 9999 + 003957 9999 99 99 0 9999 99 9999 + 003958 9999 99 99 0 9999 99 9999 + 003959 9999 99 99 0 9999 99 9999 + 003960 9999 99 99 0 9999 99 9999 + 003961 9999 99 99 0 9999 99 9999 + 003962 9999 99 99 0 9999 99 9999 + 003963 9999 99 99 0 9999 99 9999 + 003964 9999 99 99 0 9999 99 9999 + 003965 9999 99 99 0 9999 99 9999 + 003966 9999 99 99 0 9999 99 9999 + 003967 9999 99 99 0 9999 99 9999 + 003968 9999 99 99 0 9999 99 9999 + 003969 9999 99 99 0 9999 99 9999 + 003970 9999 99 99 0 9999 99 9999 + 003971 9999 99 99 0 9999 99 9999 + 003972 9999 99 99 0 9999 99 9999 + 003973 9999 99 99 0 9999 99 9999 + 003974 9999 99 99 0 9999 99 9999 + 003975 9999 99 99 0 9999 99 9999 + 003976 9999 99 99 0 9999 99 9999 + 003977 9999 99 99 0 9999 99 9999 + 003978 9999 99 99 0 9999 99 9999 + 003979 9999 99 99 0 9999 99 9999 + 003980 9999 99 99 0 9999 99 9999 + 003981 9999 99 99 0 9999 99 9999 + 003982 9999 99 99 0 9999 99 9999 + 003983 9999 99 99 0 9999 99 9999 + 003984 9999 99 99 0 9999 99 9999 + 003985 9999 99 99 0 9999 99 9999 + 003986 9999 99 99 0 9999 99 9999 + 003987 9999 99 99 0 9999 99 9999 + 003988 9999 99 99 0 9999 99 9999 + 003989 9999 99 99 0 9999 99 9999 + 003990 9999 99 99 0 9999 99 9999 + 003991 9999 99 99 0 9999 99 9999 + 003992 9999 99 99 0 9999 99 9999 + 003993 9999 99 99 0 9999 99 9999 + 003994 9999 99 99 0 9999 99 9999 + 003995 9999 99 99 0 9999 99 9999 + 003996 9999 99 99 0 9999 99 9999 + 003997 9999 99 99 0 9999 99 9999 + 003998 9999 99 99 0 9999 99 9999 + 003999 9999 99 99 0 9999 99 9999 + 004000 9999 99 99 0 9999 99 9999 + 004001 9999 99 99 0 9999 99 9999 + 004002 9999 99 99 0 9999 99 9999 + 004003 9999 99 99 0 9999 99 9999 + 004004 9999 99 99 0 9999 99 9999 + 004005 9999 99 99 0 9999 99 9999 + 004006 9999 99 99 0 9999 99 9999 + 004007 9999 99 99 0 9999 99 9999 + 004008 9999 99 99 0 9999 99 9999 + 004009 9999 99 99 0 9999 99 9999 + 004010 9999 99 99 0 9999 99 9999 + 004011 9999 99 99 0 9999 99 9999 + 004012 9999 99 99 0 9999 99 9999 + 004013 9999 99 99 0 9999 99 9999 + 004014 9999 99 99 0 9999 99 9999 + 004015 9999 99 99 0 9999 99 9999 + 004016 9999 99 99 0 9999 99 9999 + 004017 9999 99 99 0 9999 99 9999 + 004018 9999 99 99 0 9999 99 9999 + 004019 9999 99 99 0 9999 99 9999 + 004020 9999 99 99 0 9999 99 9999 + 004021 9999 99 99 0 9999 99 9999 + 004022 9999 99 99 0 9999 99 9999 + 004023 9999 99 99 0 9999 99 9999 + 004024 9999 99 99 0 9999 99 9999 + 004025 9999 99 99 0 9999 99 9999 + 004026 9999 99 99 0 9999 99 9999 + 004027 9999 99 99 0 9999 99 9999 + 004028 9999 99 99 0 9999 99 9999 + 004029 9999 99 99 0 9999 99 9999 + 004030 9999 99 99 0 9999 99 9999 + 004031 9999 99 99 0 9999 99 9999 + 004032 9999 99 99 0 9999 99 9999 + 004033 9999 99 99 0 9999 99 9999 + 004034 9999 99 99 0 9999 99 9999 + 004035 9999 99 99 0 9999 99 9999 + 004036 9999 99 99 0 9999 99 9999 + 004037 9999 99 99 0 9999 99 9999 + 004038 9999 99 99 0 9999 99 9999 + 004039 9999 99 99 0 9999 99 9999 + 004040 9999 99 99 0 9999 99 9999 + 004041 9999 99 99 0 9999 99 9999 + 004042 9999 99 99 0 9999 99 9999 + 004043 9999 99 99 0 9999 99 9999 + 004044 9999 99 99 0 9999 99 9999 + 004045 9999 99 99 0 9999 99 9999 + 004046 9999 99 99 0 9999 99 9999 + 004047 9999 99 99 0 9999 99 9999 + 004048 9999 99 99 0 9999 99 9999 + 004049 9999 99 99 0 9999 99 9999 + 004050 9999 99 99 0 9999 99 9999 + 004051 9999 99 99 0 9999 99 9999 + 004052 9999 99 99 0 9999 99 9999 + 004053 9999 99 99 0 9999 99 9999 + 004054 9999 99 99 0 9999 99 9999 + 004055 9999 99 99 0 9999 99 9999 + 004056 9999 99 99 0 9999 99 9999 + 004057 9999 99 99 0 9999 99 9999 + 004058 9999 99 99 0 9999 99 9999 + 004059 9999 99 99 0 9999 99 9999 + 004060 9999 99 99 0 9999 99 9999 + 004061 9999 99 99 0 9999 99 9999 + 004062 9999 99 99 0 9999 99 9999 + 004063 9999 99 99 0 9999 99 9999 + 004064 9999 99 99 0 9999 99 9999 + 004065 9999 99 99 0 9999 99 9999 + 004066 9999 99 99 0 9999 99 9999 + 004067 9999 99 99 0 9999 99 9999 + 004068 9999 99 99 0 9999 99 9999 + 004069 9999 99 99 0 9999 99 9999 + 004070 9999 99 99 0 9999 99 9999 + 004071 9999 99 99 0 9999 99 9999 + 004072 9999 99 99 0 9999 99 9999 + 004073 9999 99 99 0 9999 99 9999 + 004074 9999 99 99 0 9999 99 9999 + 004075 9999 99 99 0 9999 99 9999 + 004076 9999 99 99 0 9999 99 9999 + 004077 9999 99 99 0 9999 99 9999 + 004078 9999 99 99 0 9999 99 9999 + 004079 9999 99 99 0 9999 99 9999 + 004080 9999 99 99 0 9999 99 9999 + 004081 9999 99 99 0 9999 99 9999 + 004082 9999 99 99 0 9999 99 9999 + 004083 9999 99 99 0 9999 99 9999 + 004084 9999 99 99 0 9999 99 9999 + 004085 9999 99 99 0 9999 99 9999 + 004086 9999 99 99 0 9999 99 9999 + 004087 9999 99 99 0 9999 99 9999 + 004088 9999 99 99 0 9999 99 9999 + 004089 9999 99 99 0 9999 99 9999 + 004090 9999 99 99 0 9999 99 9999 + 004091 9999 99 99 0 9999 99 9999 + 004092 9999 99 99 0 9999 99 9999 + 004093 9999 99 99 0 9999 99 9999 + 004094 9999 99 99 0 9999 99 9999 + 004095 9999 99 99 0 9999 99 9999 + 004096 9999 99 99 0 9999 99 9999 + 004097 9999 99 99 0 9999 99 9999 + 004098 9999 99 99 0 9999 99 9999 + 004099 9999 99 99 0 9999 99 9999 + 004100 9999 99 99 0 9999 99 9999 + 004101 9999 99 99 0 9999 99 9999 + 004102 9999 99 99 0 9999 99 9999 + 004103 9999 99 99 0 9999 99 9999 + 004104 9999 99 99 0 9999 99 9999 + 004105 9999 99 99 0 9999 99 9999 + 004106 9999 99 99 0 9999 99 9999 + 004107 9999 99 99 0 9999 99 9999 + 004108 9999 99 99 0 9999 99 9999 + 004109 9999 99 99 0 9999 99 9999 + 004110 9999 99 99 0 9999 99 9999 + 004111 9999 99 99 0 9999 99 9999 + 004112 9999 99 99 0 9999 99 9999 + 004113 9999 99 99 0 9999 99 9999 + 004114 9999 99 99 0 9999 99 9999 + 004115 9999 99 99 0 9999 99 9999 + 004116 9999 99 99 0 9999 99 9999 + 004117 9999 99 99 0 9999 99 9999 + 004118 9999 99 99 0 9999 99 9999 + 004119 9999 99 99 0 9999 99 9999 + 004120 9999 99 99 0 9999 99 9999 + 004121 9999 99 99 0 9999 99 9999 + 004122 9999 99 99 0 9999 99 9999 + 004123 9999 99 99 0 9999 99 9999 + 004124 9999 99 99 0 9999 99 9999 + 004125 9999 99 99 0 9999 99 9999 + 004126 9999 99 99 0 9999 99 9999 + 004127 9999 99 99 0 9999 99 9999 + 004128 9999 99 99 0 9999 99 9999 + 004129 9999 99 99 0 9999 99 9999 + 004130 9999 99 99 0 9999 99 9999 + 004131 9999 99 99 0 9999 99 9999 + 004132 9999 99 99 0 9999 99 9999 + 004133 9999 99 99 0 9999 99 9999 + 004134 9999 99 99 0 9999 99 9999 + 004135 9999 99 99 0 9999 99 9999 + 004136 9999 99 99 0 9999 99 9999 + 004137 9999 99 99 0 9999 99 9999 + 004138 9999 99 99 0 9999 99 9999 + 004139 9999 99 99 0 9999 99 9999 + 004140 9999 99 99 0 9999 99 9999 + 004141 9999 99 99 0 9999 99 9999 + 004142 9999 99 99 0 9999 99 9999 + 004143 9999 99 99 0 9999 99 9999 + 004144 9999 99 99 0 9999 99 9999 + 004145 9999 99 99 0 9999 99 9999 + 004146 9999 99 99 0 9999 99 9999 + 004147 9999 99 99 0 9999 99 9999 + 004148 9999 99 99 0 9999 99 9999 + 004149 9999 99 99 0 9999 99 9999 + 004150 9999 99 99 0 9999 99 9999 + 004151 9999 99 99 0 9999 99 9999 + 004152 9999 99 99 0 9999 99 9999 + 004153 9999 99 99 0 9999 99 9999 + 004154 9999 99 99 0 9999 99 9999 + 004155 9999 99 99 0 9999 99 9999 + 004156 9999 99 99 0 9999 99 9999 + 004157 9999 99 99 0 9999 99 9999 + 004158 9999 99 99 0 9999 99 9999 + 004159 9999 99 99 0 9999 99 9999 + 004160 9999 99 99 0 9999 99 9999 + 004161 9999 99 99 0 9999 99 9999 + 004162 9999 99 99 0 9999 99 9999 + 004163 9999 99 99 0 9999 99 9999 + 004164 9999 99 99 0 9999 99 9999 + 004165 9999 99 99 0 9999 99 9999 + 004166 9999 99 99 0 9999 99 9999 + 004167 9999 99 99 0 9999 99 9999 + 004168 9999 99 99 0 9999 99 9999 + 004169 9999 99 99 0 9999 99 9999 + 004170 9999 99 99 0 9999 99 9999 + 004171 9999 99 99 0 9999 99 9999 + 004172 9999 99 99 0 9999 99 9999 + 004173 9999 99 99 0 9999 99 9999 + 004174 9999 99 99 0 9999 99 9999 + 004175 9999 99 99 0 9999 99 9999 + 004176 9999 99 99 0 9999 99 9999 + 004177 9999 99 99 0 9999 99 9999 + 004178 9999 99 99 0 9999 99 9999 + 004179 9999 99 99 0 9999 99 9999 + 004180 9999 99 99 0 9999 99 9999 + 004181 9999 99 99 0 9999 99 9999 + 004182 9999 99 99 0 9999 99 9999 + 004183 9999 99 99 0 9999 99 9999 + 004184 9999 99 99 0 9999 99 9999 + 004185 9999 99 99 0 9999 99 9999 + 004186 9999 99 99 0 9999 99 9999 + 004187 9999 99 99 0 9999 99 9999 + 004188 9999 99 99 0 9999 99 9999 + 004189 9999 99 99 0 9999 99 9999 + 004190 9999 99 99 0 9999 99 9999 + 004191 9999 99 99 0 9999 99 9999 + 004192 9999 99 99 0 9999 99 9999 + 004193 9999 99 99 0 9999 99 9999 + 004194 9999 99 99 0 9999 99 9999 + 004195 9999 99 99 0 9999 99 9999 + 004196 9999 99 99 0 9999 99 9999 + 004197 9999 99 99 0 9999 99 9999 + 004198 9999 99 99 0 9999 99 9999 + 004199 9999 99 99 0 9999 99 9999 + 004200 9999 99 99 0 9999 99 9999 + 004201 9999 99 99 0 9999 99 9999 + 004202 9999 99 99 0 9999 99 9999 + 004203 9999 99 99 0 9999 99 9999 + 004204 9999 99 99 0 9999 99 9999 + 004205 9999 99 99 0 9999 99 9999 + 004206 9999 99 99 0 9999 99 9999 + 004207 9999 99 99 0 9999 99 9999 + 004208 9999 99 99 0 9999 99 9999 + 004209 9999 99 99 0 9999 99 9999 + 004210 9999 99 99 0 9999 99 9999 + 004211 9999 99 99 0 9999 99 9999 + 004212 9999 99 99 0 9999 99 9999 + 004213 9999 99 99 0 9999 99 9999 + 004214 9999 99 99 0 9999 99 9999 + 004215 9999 99 99 0 9999 99 9999 + 004216 9999 99 99 0 9999 99 9999 + 004217 9999 99 99 0 9999 99 9999 + 004218 9999 99 99 0 9999 99 9999 + 004219 9999 99 99 0 9999 99 9999 + 004220 9999 99 99 0 9999 99 9999 + 004221 9999 99 99 0 9999 99 9999 + 004222 9999 99 99 0 9999 99 9999 + 004223 9999 99 99 0 9999 99 9999 + 004224 9999 99 99 0 9999 99 9999 + 004225 9999 99 99 0 9999 99 9999 + 004226 9999 99 99 0 9999 99 9999 + 004227 9999 99 99 0 9999 99 9999 + 004228 9999 99 99 0 9999 99 9999 + 004229 9999 99 99 0 9999 99 9999 + 004230 9999 99 99 0 9999 99 9999 + 004231 9999 99 99 0 9999 99 9999 + 004232 9999 99 99 0 9999 99 9999 + 004233 9999 99 99 0 9999 99 9999 + 004234 9999 99 99 0 9999 99 9999 + 004235 9999 99 99 0 9999 99 9999 + 004236 9999 99 99 0 9999 99 9999 + 004237 9999 99 99 0 9999 99 9999 + 004238 9999 99 99 0 9999 99 9999 + 004239 9999 99 99 0 9999 99 9999 + 004240 9999 99 99 0 9999 99 9999 + 004241 9999 99 99 0 9999 99 9999 + 004242 9999 99 99 0 9999 99 9999 + 004243 9999 99 99 0 9999 99 9999 + 004244 9999 99 99 0 9999 99 9999 + 004245 9999 99 99 0 9999 99 9999 + 004246 9999 99 99 0 9999 99 9999 + 004247 9999 99 99 0 9999 99 9999 + 004248 9999 99 99 0 9999 99 9999 + 004249 9999 99 99 0 9999 99 9999 + 004250 9999 99 99 0 9999 99 9999 + 004251 9999 99 99 0 9999 99 9999 + 004252 9999 99 99 0 9999 99 9999 + 004253 9999 99 99 0 9999 99 9999 + 004254 9999 99 99 0 9999 99 9999 + 004255 9999 99 99 0 9999 99 9999 + 004256 9999 99 99 0 9999 99 9999 + 004257 9999 99 99 0 9999 99 9999 + 004258 9999 99 99 0 9999 99 9999 + 004259 9999 99 99 0 9999 99 9999 + 004260 9999 99 99 0 9999 99 9999 + 004261 9999 99 99 0 9999 99 9999 + 004262 9999 99 99 0 9999 99 9999 + 004263 9999 99 99 0 9999 99 9999 + 004264 9999 99 99 0 9999 99 9999 + 004265 9999 99 99 0 9999 99 9999 + 004266 9999 99 99 0 9999 99 9999 + 004267 9999 99 99 0 9999 99 9999 + 004268 9999 99 99 0 9999 99 9999 + 004269 9999 99 99 0 9999 99 9999 + 004270 9999 99 99 0 9999 99 9999 + 004271 9999 99 99 0 9999 99 9999 + 004272 9999 99 99 0 9999 99 9999 + 004273 9999 99 99 0 9999 99 9999 + 004274 9999 99 99 0 9999 99 9999 + 004275 9999 99 99 0 9999 99 9999 + 004276 9999 99 99 0 9999 99 9999 + 004277 9999 99 99 0 9999 99 9999 + 004278 9999 99 99 0 9999 99 9999 + 004279 9999 99 99 0 9999 99 9999 + 004280 9999 99 99 0 9999 99 9999 + 004281 9999 99 99 0 9999 99 9999 + 004282 9999 99 99 0 9999 99 9999 + 004283 9999 99 99 0 9999 99 9999 + 004284 9999 99 99 0 9999 99 9999 + 004285 9999 99 99 0 9999 99 9999 + 004286 9999 99 99 0 9999 99 9999 + 004287 9999 99 99 0 9999 99 9999 + 004288 9999 99 99 0 9999 99 9999 + 004289 9999 99 99 0 9999 99 9999 + 004290 9999 99 99 0 9999 99 9999 + 004291 9999 99 99 0 9999 99 9999 + 004292 9999 99 99 0 9999 99 9999 + 004293 9999 99 99 0 9999 99 9999 + 004294 9999 99 99 0 9999 99 9999 + 004295 9999 99 99 0 9999 99 9999 + 004296 9999 99 99 0 9999 99 9999 + 004297 9999 99 99 0 9999 99 9999 + 004298 9999 99 99 0 9999 99 9999 + 004299 9999 99 99 0 9999 99 9999 + 004300 9999 99 99 0 9999 99 9999 + 004301 9999 99 99 0 9999 99 9999 + 004302 9999 99 99 0 9999 99 9999 + 004303 9999 99 99 0 9999 99 9999 + 004304 9999 99 99 0 9999 99 9999 + 004305 9999 99 99 0 9999 99 9999 + 004306 9999 99 99 0 9999 99 9999 + 004307 9999 99 99 0 9999 99 9999 + 004308 9999 99 99 0 9999 99 9999 + 004309 9999 99 99 0 9999 99 9999 + 004310 9999 99 99 0 9999 99 9999 + 004311 9999 99 99 0 9999 99 9999 + 004312 9999 99 99 0 9999 99 9999 + 004313 9999 99 99 0 9999 99 9999 + 004314 9999 99 99 0 9999 99 9999 + 004315 9999 99 99 0 9999 99 9999 + 004316 9999 99 99 0 9999 99 9999 + 004317 9999 99 99 0 9999 99 9999 + 004318 9999 99 99 0 9999 99 9999 + 004319 9999 99 99 0 9999 99 9999 + 004320 9999 99 99 0 9999 99 9999 + 004321 9999 99 99 0 9999 99 9999 + 004322 9999 99 99 0 9999 99 9999 + 004323 9999 99 99 0 9999 99 9999 + 004324 9999 99 99 0 9999 99 9999 + 004325 9999 99 99 0 9999 99 9999 + 004326 9999 99 99 0 9999 99 9999 + 004327 9999 99 99 0 9999 99 9999 + 004328 9999 99 99 0 9999 99 9999 + 004329 9999 99 99 0 9999 99 9999 + 004330 9999 99 99 0 9999 99 9999 + 004331 9999 99 99 0 9999 99 9999 + 004332 9999 99 99 0 9999 99 9999 + 004333 9999 99 99 0 9999 99 9999 + 004334 9999 99 99 0 9999 99 9999 + 004335 9999 99 99 0 9999 99 9999 + 004336 9999 99 99 0 9999 99 9999 + 004337 9999 99 99 0 9999 99 9999 + 004338 9999 99 99 0 9999 99 9999 + 004339 9999 99 99 0 9999 99 9999 + 004340 9999 99 99 0 9999 99 9999 + 004341 9999 99 99 0 9999 99 9999 + 004342 9999 99 99 0 9999 99 9999 + 004343 9999 99 99 0 9999 99 9999 + 004344 9999 99 99 0 9999 99 9999 + 004345 9999 99 99 0 9999 99 9999 + 004346 9999 99 99 0 9999 99 9999 + 004347 9999 99 99 0 9999 99 9999 + 004348 9999 99 99 0 9999 99 9999 + 004349 9999 99 99 0 9999 99 9999 + 004350 9999 99 99 0 9999 99 9999 + 004351 9999 99 99 0 9999 99 9999 + 004352 9999 99 99 0 9999 99 9999 + 004353 9999 99 99 0 9999 99 9999 + 004354 9999 99 99 0 9999 99 9999 + 004355 9999 99 99 0 9999 99 9999 + 004356 9999 99 99 0 9999 99 9999 + 004357 9999 99 99 0 9999 99 9999 + 004358 9999 99 99 0 9999 99 9999 + 004359 9999 99 99 0 9999 99 9999 + 004360 9999 99 99 0 9999 99 9999 + 004361 9999 99 99 0 9999 99 9999 + 004362 9999 99 99 0 9999 99 9999 + 004363 9999 99 99 0 9999 99 9999 + 004364 9999 99 99 0 9999 99 9999 + 004365 9999 99 99 0 9999 99 9999 + 004366 9999 99 99 0 9999 99 9999 + 004367 9999 99 99 0 9999 99 9999 + 004368 9999 99 99 0 9999 99 9999 + 004369 9999 99 99 0 9999 99 9999 + 004370 9999 99 99 0 9999 99 9999 + 004371 9999 99 99 0 9999 99 9999 + 004372 9999 99 99 0 9999 99 9999 + 004373 9999 99 99 0 9999 99 9999 + 004374 9999 99 99 0 9999 99 9999 + 004375 9999 99 99 0 9999 99 9999 + 004376 9999 99 99 0 9999 99 9999 + 004377 9999 99 99 0 9999 99 9999 + 004378 9999 99 99 0 9999 99 9999 + 004379 9999 99 99 0 9999 99 9999 + 004380 9999 99 99 0 9999 99 9999 + 004381 9999 99 99 0 9999 99 9999 + 004382 9999 99 99 0 9999 99 9999 + 004383 9999 99 99 0 9999 99 9999 + 004384 9999 99 99 0 9999 99 9999 + 004385 9999 99 99 0 9999 99 9999 + 004386 9999 99 99 0 9999 99 9999 + 004387 9999 99 99 0 9999 99 9999 + 004388 9999 99 99 0 9999 99 9999 + 004389 9999 99 99 0 9999 99 9999 + 004390 9999 99 99 0 9999 99 9999 + 004391 9999 99 99 0 9999 99 9999 + 004392 9999 99 99 0 9999 99 9999 + 004393 9999 99 99 0 9999 99 9999 + 004394 9999 99 99 0 9999 99 9999 + 004395 9999 99 99 0 9999 99 9999 + 004396 9999 99 99 0 9999 99 9999 + 004397 9999 99 99 0 9999 99 9999 + 004398 9999 99 99 0 9999 99 9999 + 004399 9999 99 99 0 9999 99 9999 + 004400 9999 99 99 0 9999 99 9999 + 004401 9999 99 99 0 9999 99 9999 + 004402 9999 99 99 0 9999 99 9999 + 004403 9999 99 99 0 9999 99 9999 + 004404 9999 99 99 0 9999 99 9999 + 004405 9999 99 99 0 9999 99 9999 + 004406 9999 99 99 0 9999 99 9999 + 004407 9999 99 99 0 9999 99 9999 + 004408 9999 99 99 0 9999 99 9999 + 004409 9999 99 99 0 9999 99 9999 + 004410 9999 99 99 0 9999 99 9999 + 004411 9999 99 99 0 9999 99 9999 + 004412 9999 99 99 0 9999 99 9999 + 004413 9999 99 99 0 9999 99 9999 + 004414 9999 99 99 0 9999 99 9999 + 004415 9999 99 99 0 9999 99 9999 + 004416 9999 99 99 0 9999 99 9999 + 004417 9999 99 99 0 9999 99 9999 + 004418 9999 99 99 0 9999 99 9999 + 004419 9999 99 99 0 9999 99 9999 + 004420 9999 99 99 0 9999 99 9999 + 004421 9999 99 99 0 9999 99 9999 + 004422 9999 99 99 0 9999 99 9999 + 004423 9999 99 99 0 9999 99 9999 + 004424 9999 99 99 0 9999 99 9999 + 004425 9999 99 99 0 9999 99 9999 + 004426 9999 99 99 0 9999 99 9999 + 004427 9999 99 99 0 9999 99 9999 + 004428 9999 99 99 0 9999 99 9999 + 004429 9999 99 99 0 9999 99 9999 + 004430 9999 99 99 0 9999 99 9999 + 004431 9999 99 99 0 9999 99 9999 + 004432 9999 99 99 0 9999 99 9999 + 004433 9999 99 99 0 9999 99 9999 + 004434 9999 99 99 0 9999 99 9999 + 004435 9999 99 99 0 9999 99 9999 + 004436 9999 99 99 0 9999 99 9999 + 004437 9999 99 99 0 9999 99 9999 + 004438 9999 99 99 0 9999 99 9999 + 004439 9999 99 99 0 9999 99 9999 + 004440 9999 99 99 0 9999 99 9999 + 004441 9999 99 99 0 9999 99 9999 + 004442 9999 99 99 0 9999 99 9999 + 004443 9999 99 99 0 9999 99 9999 + 004444 9999 99 99 0 9999 99 9999 + 004445 9999 99 99 0 9999 99 9999 + 004446 9999 99 99 0 9999 99 9999 + 004447 9999 99 99 0 9999 99 9999 + 004448 9999 99 99 0 9999 99 9999 + 004449 9999 99 99 0 9999 99 9999 + 004450 9999 99 99 0 9999 99 9999 + 004451 9999 99 99 0 9999 99 9999 + 004452 9999 99 99 0 9999 99 9999 + 004453 9999 99 99 0 9999 99 9999 + 004454 9999 99 99 0 9999 99 9999 + 004455 9999 99 99 0 9999 99 9999 + 004456 9999 99 99 0 9999 99 9999 + 004457 9999 99 99 0 9999 99 9999 + 004458 9999 99 99 0 9999 99 9999 + 004459 9999 99 99 0 9999 99 9999 + 004460 9999 99 99 0 9999 99 9999 + 004461 9999 99 99 0 9999 99 9999 + 004462 9999 99 99 0 9999 99 9999 + 004463 9999 99 99 0 9999 99 9999 + 004464 9999 99 99 0 9999 99 9999 + 004465 9999 99 99 0 9999 99 9999 + 004466 9999 99 99 0 9999 99 9999 + 004467 9999 99 99 0 9999 99 9999 + 004468 9999 99 99 0 9999 99 9999 + 004469 9999 99 99 0 9999 99 9999 + 004470 9999 99 99 0 9999 99 9999 + 004471 9999 99 99 0 9999 99 9999 + 004472 9999 99 99 0 9999 99 9999 + 004473 9999 99 99 0 9999 99 9999 + 004474 9999 99 99 0 9999 99 9999 + 004475 9999 99 99 0 9999 99 9999 + 004476 9999 99 99 0 9999 99 9999 + 004477 9999 99 99 0 9999 99 9999 + 004478 9999 99 99 0 9999 99 9999 + 004479 9999 99 99 0 9999 99 9999 + 004480 9999 99 99 0 9999 99 9999 + 004481 9999 99 99 0 9999 99 9999 + 004482 9999 99 99 0 9999 99 9999 + 004483 9999 99 99 0 9999 99 9999 + 004484 9999 99 99 0 9999 99 9999 + 004485 9999 99 99 0 9999 99 9999 + 004486 9999 99 99 0 9999 99 9999 + 004487 9999 99 99 0 9999 99 9999 + 004488 9999 99 99 0 9999 99 9999 + 004489 9999 99 99 0 9999 99 9999 + 004490 9999 99 99 0 9999 99 9999 + 004491 9999 99 99 0 9999 99 9999 + 004492 9999 99 99 0 9999 99 9999 + 004493 9999 99 99 0 9999 99 9999 + 004494 9999 99 99 0 9999 99 9999 + 004495 9999 99 99 0 9999 99 9999 + 004496 9999 99 99 0 9999 99 9999 + 004497 9999 99 99 0 9999 99 9999 + 004498 9999 99 99 0 9999 99 9999 + 004499 9999 99 99 0 9999 99 9999 + 004500 9999 99 99 0 9999 99 9999 + 004501 9999 99 99 0 9999 99 9999 + 004502 9999 99 99 0 9999 99 9999 + 004503 9999 99 99 0 9999 99 9999 + 004504 9999 99 99 0 9999 99 9999 + 004505 9999 99 99 0 9999 99 9999 + 004506 9999 99 99 0 9999 99 9999 + 004507 9999 99 99 0 9999 99 9999 + 004508 9999 99 99 0 9999 99 9999 + 004509 9999 99 99 0 9999 99 9999 + 004510 9999 99 99 0 9999 99 9999 + 004511 9999 99 99 0 9999 99 9999 + 004512 9999 99 99 0 9999 99 9999 + 004513 9999 99 99 0 9999 99 9999 + 004514 9999 99 99 0 9999 99 9999 + 004515 9999 99 99 0 9999 99 9999 + 004516 9999 99 99 0 9999 99 9999 + 004517 9999 99 99 0 9999 99 9999 + 004518 9999 99 99 0 9999 99 9999 + 004519 9999 99 99 0 9999 99 9999 + 004520 9999 99 99 0 9999 99 9999 + 004521 9999 99 99 0 9999 99 9999 + 004522 9999 99 99 0 9999 99 9999 + 004523 9999 99 99 0 9999 99 9999 + 004524 9999 99 99 0 9999 99 9999 + 004525 9999 99 99 0 9999 99 9999 + 004526 9999 99 99 0 9999 99 9999 + 004527 9999 99 99 0 9999 99 9999 + 004528 9999 99 99 0 9999 99 9999 + 004529 9999 99 99 0 9999 99 9999 + 004530 9999 99 99 0 9999 99 9999 + 004531 9999 99 99 0 9999 99 9999 + 004532 9999 99 99 0 9999 99 9999 + 004533 9999 99 99 0 9999 99 9999 + 004534 9999 99 99 0 9999 99 9999 + 004535 9999 99 99 0 9999 99 9999 + 004536 9999 99 99 0 9999 99 9999 + 004537 9999 99 99 0 9999 99 9999 + 004538 9999 99 99 0 9999 99 9999 + 004539 9999 99 99 0 9999 99 9999 + 004540 9999 99 99 0 9999 99 9999 + 004541 9999 99 99 0 9999 99 9999 + 004542 9999 99 99 0 9999 99 9999 + 004543 9999 99 99 0 9999 99 9999 + 004544 9999 99 99 0 9999 99 9999 + 004545 9999 99 99 0 9999 99 9999 + 004546 9999 99 99 0 9999 99 9999 + 004547 9999 99 99 0 9999 99 9999 + 004548 9999 99 99 0 9999 99 9999 + 004549 9999 99 99 0 9999 99 9999 + 004550 9999 99 99 0 9999 99 9999 + 004551 9999 99 99 0 9999 99 9999 + 004552 9999 99 99 0 9999 99 9999 + 004553 9999 99 99 0 9999 99 9999 + 004554 9999 99 99 0 9999 99 9999 + 004555 9999 99 99 0 9999 99 9999 + 004556 9999 99 99 0 9999 99 9999 + 004557 9999 99 99 0 9999 99 9999 + 004558 9999 99 99 0 9999 99 9999 + 004559 9999 99 99 0 9999 99 9999 + 004560 9999 99 99 0 9999 99 9999 + 004561 9999 99 99 0 9999 99 9999 + 004562 9999 99 99 0 9999 99 9999 + 004563 9999 99 99 0 9999 99 9999 + 004564 9999 99 99 0 9999 99 9999 + 004565 9999 99 99 0 9999 99 9999 + 004566 9999 99 99 0 9999 99 9999 + 004567 9999 99 99 0 9999 99 9999 + 004568 9999 99 99 0 9999 99 9999 + 004569 9999 99 99 0 9999 99 9999 + 004570 9999 99 99 0 9999 99 9999 + 004571 9999 99 99 0 9999 99 9999 + 004572 9999 99 99 0 9999 99 9999 + 004573 9999 99 99 0 9999 99 9999 + 004574 9999 99 99 0 9999 99 9999 + 004575 9999 99 99 0 9999 99 9999 + 004576 9999 99 99 0 9999 99 9999 + 004577 9999 99 99 0 9999 99 9999 + 004578 9999 99 99 0 9999 99 9999 + 004579 9999 99 99 0 9999 99 9999 + 004580 9999 99 99 0 9999 99 9999 + 004581 9999 99 99 0 9999 99 9999 + 004582 9999 99 99 0 9999 99 9999 + 004583 9999 99 99 0 9999 99 9999 + 004584 9999 99 99 0 9999 99 9999 + 004585 9999 99 99 0 9999 99 9999 + 004586 9999 99 99 0 9999 99 9999 + 004587 9999 99 99 0 9999 99 9999 + 004588 9999 99 99 0 9999 99 9999 + 004589 9999 99 99 0 9999 99 9999 + 004590 9999 99 99 0 9999 99 9999 + 004591 9999 99 99 0 9999 99 9999 + 004592 9999 99 99 0 9999 99 9999 + 004593 9999 99 99 0 9999 99 9999 + 004594 9999 99 99 0 9999 99 9999 + 004595 9999 99 99 0 9999 99 9999 + 004596 9999 99 99 0 9999 99 9999 + 004597 9999 99 99 0 9999 99 9999 + 004598 9999 99 99 0 9999 99 9999 + 004599 9999 99 99 0 9999 99 9999 + 004600 9999 99 99 0 9999 99 9999 + 004601 9999 99 99 0 9999 99 9999 + 004602 9999 99 99 0 9999 99 9999 + 004603 9999 99 99 0 9999 99 9999 + 004604 9999 99 99 0 9999 99 9999 + 004605 9999 99 99 0 9999 99 9999 + 004606 9999 99 99 0 9999 99 9999 + 004607 9999 99 99 0 9999 99 9999 + 004608 9999 99 99 0 9999 99 9999 + 004609 1212 01 01 1 303054872 08 0029 + 004610 1212 01 02 1 303054872 09 0029 + 004611 9999 99 99 0 9999 99 9999 + 004612 9999 99 99 0 9999 99 9999 + 004613 9999 99 99 0 9999 99 9999 + 004614 9999 99 99 0 9999 99 9999 + 004615 9999 99 99 0 9999 99 9999 + 004616 9999 99 99 0 9999 99 9999 + 004617 1212 02 01 1 303054872 10 0029 + 004618 1212 02 02 1 303054872 11 0029 + 004619 9999 99 99 0 9999 99 9999 + 004620 9999 99 99 0 9999 99 9999 + 004621 9999 99 99 0 9999 99 9999 + 004622 9999 99 99 0 9999 99 9999 + 004623 9999 99 99 0 9999 99 9999 + 004624 9999 99 99 0 9999 99 9999 + 004625 1212 03 01 1 303054872 12 0029 + 004626 1212 03 02 1 303054872 13 0029 + 004627 9999 99 99 0 9999 99 9999 + 004628 9999 99 99 0 9999 99 9999 + 004629 9999 99 99 0 9999 99 9999 + 004630 9999 99 99 0 9999 99 9999 + 004631 9999 99 99 0 9999 99 9999 + 004632 9999 99 99 0 9999 99 9999 + 004633 1212 04 01 1 303054872 14 0029 + 004634 1212 04 02 1 303054872 15 0029 + 004635 9999 99 99 0 9999 99 9999 + 004636 9999 99 99 0 9999 99 9999 + 004637 9999 99 99 0 9999 99 9999 + 004638 9999 99 99 0 9999 99 9999 + 004639 9999 99 99 0 9999 99 9999 + 004640 9999 99 99 0 9999 99 9999 + 004641 1212 05 01 1 303054872 00 0029 + 004642 1212 05 02 1 303054872 01 0029 + 004643 9999 99 99 0 9999 99 9999 + 004644 9999 99 99 0 9999 99 9999 + 004645 9999 99 99 0 9999 99 9999 + 004646 9999 99 99 0 9999 99 9999 + 004647 9999 99 99 0 9999 99 9999 + 004648 9999 99 99 0 9999 99 9999 + 004649 1212 06 01 1 303054872 02 0029 + 004650 1212 06 02 1 303054872 03 0029 + 004651 9999 99 99 0 9999 99 9999 + 004652 9999 99 99 0 9999 99 9999 + 004653 9999 99 99 0 9999 99 9999 + 004654 9999 99 99 0 9999 99 9999 + 004655 9999 99 99 0 9999 99 9999 + 004656 9999 99 99 0 9999 99 9999 + 004657 1212 07 01 1 303054872 04 0029 + 004658 1212 07 02 1 303054872 05 0029 + 004659 9999 99 99 0 9999 99 9999 + 004660 9999 99 99 0 9999 99 9999 + 004661 9999 99 99 0 9999 99 9999 + 004662 9999 99 99 0 9999 99 9999 + 004663 9999 99 99 0 9999 99 9999 + 004664 9999 99 99 0 9999 99 9999 + 004665 1212 08 01 1 303054872 06 0029 + 004666 1212 08 02 1 303054872 07 0029 + 004667 9999 99 99 0 9999 99 9999 + 004668 9999 99 99 0 9999 99 9999 + 004669 9999 99 99 0 9999 99 9999 + 004670 9999 99 99 0 9999 99 9999 + 004671 9999 99 99 0 9999 99 9999 + 004672 9999 99 99 0 9999 99 9999 + 004673 1212 09 01 1 304119832 00 0157 + 004674 1212 09 02 1 304119832 01 0157 + 004675 1212 09 03 1 304119832 02 0157 + 004676 1212 09 04 1 304119832 03 0157 + 004677 9999 99 99 0 9999 99 9999 + 004678 9999 99 99 0 9999 99 9999 + 004679 9999 99 99 0 9999 99 9999 + 004680 9999 99 99 0 9999 99 9999 + 004681 1212 10 01 1 304119832 04 0157 + 004682 1212 10 02 1 304119832 05 0157 + 004683 1212 10 03 1 304119832 06 0157 + 004684 1212 10 04 1 304119832 07 0157 + 004685 9999 99 99 0 9999 99 9999 + 004686 9999 99 99 0 9999 99 9999 + 004687 9999 99 99 0 9999 99 9999 + 004688 9999 99 99 0 9999 99 9999 + 004689 1212 11 01 1 304119832 08 0157 + 004690 1212 11 02 1 304119832 09 0157 + 004691 1212 11 03 1 304119832 10 0157 + 004692 1212 11 04 1 304119832 11 0157 + 004693 9999 99 99 0 9999 99 9999 + 004694 9999 99 99 0 9999 99 9999 + 004695 9999 99 99 0 9999 99 9999 + 004696 9999 99 99 0 9999 99 9999 + 004697 1212 12 01 1 304119832 12 0157 + 004698 1212 12 02 1 304119832 13 0157 + 004699 1212 12 03 1 304119832 14 0157 + 004700 1212 12 04 1 304119832 15 0157 + 004701 9999 99 99 0 9999 99 9999 + 004702 9999 99 99 0 9999 99 9999 + 004703 9999 99 99 0 9999 99 9999 + 004704 9999 99 99 0 9999 99 9999 + 004705 1212 13 01 1 304119828 08 0156 + 004706 1212 13 02 1 304119828 09 0156 + 004707 1212 13 03 1 304119828 10 0156 + 004708 1212 13 04 1 304119828 11 0156 + 004709 9999 99 99 0 9999 99 9999 + 004710 9999 99 99 0 9999 99 9999 + 004711 9999 99 99 0 9999 99 9999 + 004712 9999 99 99 0 9999 99 9999 + 004713 1212 14 01 1 304119828 12 0156 + 004714 1212 14 02 1 304119828 13 0156 + 004715 1212 14 03 1 304119828 14 0156 + 004716 1212 14 04 1 304119828 15 0156 + 004717 9999 99 99 0 9999 99 9999 + 004718 9999 99 99 0 9999 99 9999 + 004719 9999 99 99 0 9999 99 9999 + 004720 9999 99 99 0 9999 99 9999 + 004721 1212 15 01 1 304119828 00 0156 + 004722 1212 15 02 1 304119828 01 0156 + 004723 1212 15 03 1 304119828 02 0156 + 004724 1212 15 04 1 304119828 03 0156 + 004725 9999 99 99 0 9999 99 9999 + 004726 9999 99 99 0 9999 99 9999 + 004727 9999 99 99 0 9999 99 9999 + 004728 9999 99 99 0 9999 99 9999 + 004729 1212 16 01 1 304119828 04 0156 + 004730 1212 16 02 1 304119828 05 0156 + 004731 1212 16 03 1 304119828 06 0156 + 004732 1212 16 04 1 304119828 07 0156 + 004733 9999 99 99 0 9999 99 9999 + 004734 9999 99 99 0 9999 99 9999 + 004735 9999 99 99 0 9999 99 9999 + 004736 9999 99 99 0 9999 99 9999 + 004737 1212 17 01 1 306253852 00 0806 + 004738 1212 17 02 1 306253852 01 0806 + 004739 1212 17 03 1 306253852 02 0806 + 004740 1212 17 04 1 306253852 03 0806 + 004741 1212 17 05 1 306253852 04 0806 + 004742 1212 17 06 1 306253852 05 0806 + 004743 1212 17 07 1 306253852 06 0806 + 004744 1212 17 08 1 306253852 07 0806 + 004745 1212 18 01 1 306253852 08 0806 + 004746 1212 18 02 1 306253852 09 0806 + 004747 1212 18 03 1 306253852 10 0806 + 004748 1212 18 04 1 306253852 11 0806 + 004749 1212 18 05 1 306253852 12 0806 + 004750 1212 18 06 1 306253852 13 0806 + 004751 1212 18 07 1 306253852 14 0806 + 004752 1212 18 08 1 306253852 15 0806 + 004753 1212 19 01 1 306253856 00 0807 + 004754 1212 19 02 1 306253856 01 0807 + 004755 1212 19 03 1 306253856 02 0807 + 004756 1212 19 04 1 306253856 03 0807 + 004757 1212 19 05 1 306253856 04 0807 + 004758 1212 19 06 1 306253856 05 0807 + 004759 1212 19 07 1 306253856 06 0807 + 004760 1212 19 08 1 306253856 07 0807 + 004761 1212 20 01 1 306253856 08 0807 + 004762 1212 20 02 1 306253856 09 0807 + 004763 1212 20 03 1 306253856 10 0807 + 004764 1212 20 04 1 306253856 11 0807 + 004765 1212 20 05 1 306253856 12 0807 + 004766 1212 20 06 1 306253856 13 0807 + 004767 1212 20 07 1 306253856 14 0807 + 004768 1212 20 08 1 306253856 15 0807 + 004769 1212 21 01 1 306253844 00 0804 + 004770 1212 21 02 1 306253844 01 0804 + 004771 1212 21 03 1 306253844 02 0804 + 004772 1212 21 04 1 306253844 03 0804 + 004773 1212 21 05 1 306253844 04 0804 + 004774 1212 21 06 1 306253844 05 0804 + 004775 1212 21 07 1 306253844 06 0804 + 004776 1212 21 08 1 306253844 07 0804 + 004777 1212 22 01 1 306253844 08 0804 + 004778 1212 22 02 1 306253844 09 0804 + 004779 1212 22 03 1 306253844 10 0804 + 004780 1212 22 04 1 306253844 11 0804 + 004781 1212 22 05 1 306253844 12 0804 + 004782 1212 22 06 1 306253844 13 0804 + 004783 1212 22 07 1 306253844 14 0804 + 004784 1212 22 08 1 306253844 15 0804 + 004785 1212 23 01 1 306253848 00 0805 + 004786 1212 23 02 1 306253848 01 0805 + 004787 1212 23 03 1 306253848 02 0805 + 004788 1212 23 04 1 306253848 03 0805 + 004789 1212 23 05 1 306253848 04 0805 + 004790 1212 23 06 1 306253848 05 0805 + 004791 1212 23 07 1 306253848 06 0805 + 004792 1212 23 08 1 306253848 07 0805 + 004793 1212 24 01 1 306253848 08 0805 + 004794 1212 24 02 1 306253848 09 0805 + 004795 1212 24 03 1 306253848 10 0805 + 004796 1212 24 04 1 306253848 11 0805 + 004797 1212 24 05 1 306253848 12 0805 + 004798 1212 24 06 1 306253848 13 0805 + 004799 1212 24 07 1 306253848 14 0805 + 004800 1212 24 08 1 306253848 15 0805 + 004801 1212 25 01 1 303054876 08 0030 + 004802 1212 25 02 1 303054876 09 0030 + 004803 9999 99 99 0 9999 99 9999 + 004804 9999 99 99 0 9999 99 9999 + 004805 9999 99 99 0 9999 99 9999 + 004806 9999 99 99 0 9999 99 9999 + 004807 9999 99 99 0 9999 99 9999 + 004808 9999 99 99 0 9999 99 9999 + 004809 1212 26 01 1 303054876 10 0030 + 004810 1212 26 02 1 303054876 11 0030 + 004811 9999 99 99 0 9999 99 9999 + 004812 9999 99 99 0 9999 99 9999 + 004813 9999 99 99 0 9999 99 9999 + 004814 9999 99 99 0 9999 99 9999 + 004815 9999 99 99 0 9999 99 9999 + 004816 9999 99 99 0 9999 99 9999 + 004817 1212 27 01 1 303054876 12 0030 + 004818 1212 27 02 1 303054876 13 0030 + 004819 9999 99 99 0 9999 99 9999 + 004820 9999 99 99 0 9999 99 9999 + 004821 9999 99 99 0 9999 99 9999 + 004822 9999 99 99 0 9999 99 9999 + 004823 9999 99 99 0 9999 99 9999 + 004824 9999 99 99 0 9999 99 9999 + 004825 1212 28 01 1 303054876 14 0030 + 004826 1212 28 02 1 303054876 15 0030 + 004827 9999 99 99 0 9999 99 9999 + 004828 9999 99 99 0 9999 99 9999 + 004829 9999 99 99 0 9999 99 9999 + 004830 9999 99 99 0 9999 99 9999 + 004831 9999 99 99 0 9999 99 9999 + 004832 9999 99 99 0 9999 99 9999 + 004833 1212 29 01 1 303054876 04 0030 + 004834 1212 29 02 1 303054876 05 0030 + 004835 9999 99 99 0 9999 99 9999 + 004836 9999 99 99 0 9999 99 9999 + 004837 9999 99 99 0 9999 99 9999 + 004838 9999 99 99 0 9999 99 9999 + 004839 9999 99 99 0 9999 99 9999 + 004840 9999 99 99 0 9999 99 9999 + 004841 1212 30 01 1 303054876 06 0030 + 004842 1212 30 02 1 303054876 07 0030 + 004843 9999 99 99 0 9999 99 9999 + 004844 9999 99 99 0 9999 99 9999 + 004845 9999 99 99 0 9999 99 9999 + 004846 9999 99 99 0 9999 99 9999 + 004847 9999 99 99 0 9999 99 9999 + 004848 9999 99 99 0 9999 99 9999 + 004849 1212 31 01 1 303054876 00 0030 + 004850 1212 31 02 1 303054876 01 0030 + 004851 9999 99 99 0 9999 99 9999 + 004852 9999 99 99 0 9999 99 9999 + 004853 9999 99 99 0 9999 99 9999 + 004854 9999 99 99 0 9999 99 9999 + 004855 9999 99 99 0 9999 99 9999 + 004856 9999 99 99 0 9999 99 9999 + 004857 1212 32 01 1 303054876 02 0030 + 004858 1212 32 02 1 303054876 03 0030 + 004859 9999 99 99 0 9999 99 9999 + 004860 9999 99 99 0 9999 99 9999 + 004861 9999 99 99 0 9999 99 9999 + 004862 9999 99 99 0 9999 99 9999 + 004863 9999 99 99 0 9999 99 9999 + 004864 9999 99 99 0 9999 99 9999 + 004865 1212 33 01 1 306257948 00 0814 + 004866 1212 33 02 1 306257948 01 0814 + 004867 1212 33 03 1 306257948 02 0814 + 004868 1212 33 04 1 306257948 03 0814 + 004869 1212 33 05 1 306257948 04 0814 + 004870 1212 33 06 1 306257948 05 0814 + 004871 1212 33 07 1 306257948 06 0814 + 004872 1212 33 08 1 306257948 07 0814 + 004873 1212 34 01 1 306257948 08 0814 + 004874 1212 34 02 1 306257948 09 0814 + 004875 1212 34 03 1 306257948 10 0814 + 004876 1212 34 04 1 306257948 11 0814 + 004877 1212 34 05 1 306257948 12 0814 + 004878 1212 34 06 1 306257948 13 0814 + 004879 1212 34 07 1 306257948 14 0814 + 004880 1212 34 08 1 306257948 15 0814 + 004881 1212 35 01 1 306257952 00 0815 + 004882 1212 35 02 1 306257952 01 0815 + 004883 1212 35 03 1 306257952 02 0815 + 004884 1212 35 04 1 306257952 03 0815 + 004885 1212 35 05 1 306257952 04 0815 + 004886 1212 35 06 1 306257952 05 0815 + 004887 1212 35 07 1 306257952 06 0815 + 004888 1212 35 08 1 306257952 07 0815 + 004889 1212 36 01 1 306257952 08 0815 + 004890 1212 36 02 1 306257952 09 0815 + 004891 1212 36 03 1 306257952 10 0815 + 004892 1212 36 04 1 306257952 11 0815 + 004893 1212 36 05 1 306257952 12 0815 + 004894 1212 36 06 1 306257952 13 0815 + 004895 1212 36 07 1 306257952 14 0815 + 004896 1212 36 08 1 306257952 15 0815 + 004897 1212 37 01 1 306257940 00 0812 + 004898 1212 37 02 1 306257940 01 0812 + 004899 1212 37 03 1 306257940 02 0812 + 004900 1212 37 04 1 306257940 03 0812 + 004901 1212 37 05 1 306257940 04 0812 + 004902 1212 37 06 1 306257940 05 0812 + 004903 1212 37 07 1 306257940 06 0812 + 004904 1212 37 08 1 306257940 07 0812 + 004905 1212 38 01 1 306257940 08 0812 + 004906 1212 38 02 1 306257940 09 0812 + 004907 1212 38 03 1 306257940 10 0812 + 004908 1212 38 04 1 306257940 11 0812 + 004909 1212 38 05 1 306257940 12 0812 + 004910 1212 38 06 1 306257940 13 0812 + 004911 1212 38 07 1 306257940 14 0812 + 004912 1212 38 08 1 306257940 15 0812 + 004913 1212 39 01 1 306257944 00 0813 + 004914 1212 39 02 1 306257944 01 0813 + 004915 1212 39 03 1 306257944 02 0813 + 004916 1212 39 04 1 306257944 03 0813 + 004917 1212 39 05 1 306257944 04 0813 + 004918 1212 39 06 1 306257944 05 0813 + 004919 1212 39 07 1 306257944 06 0813 + 004920 1212 39 08 1 306257944 07 0813 + 004921 1212 40 01 1 306257944 08 0813 + 004922 1212 40 02 1 306257944 09 0813 + 004923 1212 40 03 1 306257944 10 0813 + 004924 1212 40 04 1 306257944 11 0813 + 004925 1212 40 05 1 306257944 12 0813 + 004926 1212 40 06 1 306257944 13 0813 + 004927 1212 40 07 1 306257944 14 0813 + 004928 1212 40 08 1 306257944 15 0813 + 004929 1212 41 01 1 304119836 00 0158 + 004930 1212 41 02 1 304119836 01 0158 + 004931 1212 41 03 1 304119836 02 0158 + 004932 1212 41 04 1 304119836 03 0158 + 004933 9999 99 99 0 9999 99 9999 + 004934 9999 99 99 0 9999 99 9999 + 004935 9999 99 99 0 9999 99 9999 + 004936 9999 99 99 0 9999 99 9999 + 004937 1212 42 01 1 304119836 04 0158 + 004938 1212 42 02 1 304119836 05 0158 + 004939 1212 42 03 1 304119836 06 0158 + 004940 1212 42 04 1 304119836 07 0158 + 004941 9999 99 99 0 9999 99 9999 + 004942 9999 99 99 0 9999 99 9999 + 004943 9999 99 99 0 9999 99 9999 + 004944 9999 99 99 0 9999 99 9999 + 004945 1212 43 01 1 304119836 08 0158 + 004946 1212 43 02 1 304119836 09 0158 + 004947 1212 43 03 1 304119836 10 0158 + 004948 1212 43 04 1 304119836 11 0158 + 004949 9999 99 99 0 9999 99 9999 + 004950 9999 99 99 0 9999 99 9999 + 004951 9999 99 99 0 9999 99 9999 + 004952 9999 99 99 0 9999 99 9999 + 004953 1212 44 01 1 304119836 12 0158 + 004954 1212 44 02 1 304119836 13 0158 + 004955 1212 44 03 1 304119836 14 0158 + 004956 1212 44 04 1 304119836 15 0158 + 004957 9999 99 99 0 9999 99 9999 + 004958 9999 99 99 0 9999 99 9999 + 004959 9999 99 99 0 9999 99 9999 + 004960 9999 99 99 0 9999 99 9999 + 004961 1212 45 01 1 304119840 00 0159 + 004962 1212 45 02 1 304119840 01 0159 + 004963 1212 45 03 1 304119840 02 0159 + 004964 1212 45 04 1 304119840 03 0159 + 004965 9999 99 99 0 9999 99 9999 + 004966 9999 99 99 0 9999 99 9999 + 004967 9999 99 99 0 9999 99 9999 + 004968 9999 99 99 0 9999 99 9999 + 004969 1212 46 01 1 304119840 04 0159 + 004970 1212 46 02 1 304119840 05 0159 + 004971 1212 46 03 1 304119840 06 0159 + 004972 1212 46 04 1 304119840 07 0159 + 004973 9999 99 99 0 9999 99 9999 + 004974 9999 99 99 0 9999 99 9999 + 004975 9999 99 99 0 9999 99 9999 + 004976 9999 99 99 0 9999 99 9999 + 004977 1212 47 01 1 304119840 08 0159 + 004978 1212 47 02 1 304119840 09 0159 + 004979 1212 47 03 1 304119840 10 0159 + 004980 1212 47 04 1 304119840 11 0159 + 004981 9999 99 99 0 9999 99 9999 + 004982 9999 99 99 0 9999 99 9999 + 004983 9999 99 99 0 9999 99 9999 + 004984 9999 99 99 0 9999 99 9999 + 004985 1212 48 01 1 304119840 12 0159 + 004986 1212 48 02 1 304119840 13 0159 + 004987 1212 48 03 1 304119840 14 0159 + 004988 1212 48 04 1 304119840 15 0159 + 004989 9999 99 99 0 9999 99 9999 + 004990 9999 99 99 0 9999 99 9999 + 004991 9999 99 99 0 9999 99 9999 + 004992 9999 99 99 0 9999 99 9999 + 004993 1213 01 01 1 304123928 08 0165 + 004994 1213 01 02 1 304123928 09 0165 + 004995 1213 01 03 1 304123928 10 0165 + 004996 1213 01 04 1 304123928 11 0165 + 004997 9999 99 99 0 9999 99 9999 + 004998 9999 99 99 0 9999 99 9999 + 004999 9999 99 99 0 9999 99 9999 + 005000 9999 99 99 0 9999 99 9999 + 005001 1213 02 01 1 304123928 12 0165 + 005002 1213 02 02 1 304123928 13 0165 + 005003 1213 02 03 1 304123928 14 0165 + 005004 1213 02 04 1 304123928 15 0165 + 005005 9999 99 99 0 9999 99 9999 + 005006 9999 99 99 0 9999 99 9999 + 005007 9999 99 99 0 9999 99 9999 + 005008 9999 99 99 0 9999 99 9999 + 005009 1213 03 01 1 304123928 00 0165 + 005010 1213 03 02 1 304123928 01 0165 + 005011 1213 03 03 1 304123928 02 0165 + 005012 1213 03 04 1 304123928 03 0165 + 005013 9999 99 99 0 9999 99 9999 + 005014 9999 99 99 0 9999 99 9999 + 005015 9999 99 99 0 9999 99 9999 + 005016 9999 99 99 0 9999 99 9999 + 005017 1213 04 01 1 304123928 04 0165 + 005018 1213 04 02 1 304123928 05 0165 + 005019 1213 04 03 1 304123928 06 0165 + 005020 1213 04 04 1 304123928 07 0165 + 005021 9999 99 99 0 9999 99 9999 + 005022 9999 99 99 0 9999 99 9999 + 005023 9999 99 99 0 9999 99 9999 + 005024 9999 99 99 0 9999 99 9999 + 005025 1213 05 01 1 304123924 08 0164 + 005026 1213 05 02 1 304123924 09 0164 + 005027 1213 05 03 1 304123924 10 0164 + 005028 1213 05 04 1 304123924 11 0164 + 005029 9999 99 99 0 9999 99 9999 + 005030 9999 99 99 0 9999 99 9999 + 005031 9999 99 99 0 9999 99 9999 + 005032 9999 99 99 0 9999 99 9999 + 005033 1213 06 01 1 304123924 12 0164 + 005034 1213 06 02 1 304123924 13 0164 + 005035 1213 06 03 1 304123924 14 0164 + 005036 1213 06 04 1 304123924 15 0164 + 005037 9999 99 99 0 9999 99 9999 + 005038 9999 99 99 0 9999 99 9999 + 005039 9999 99 99 0 9999 99 9999 + 005040 9999 99 99 0 9999 99 9999 + 005041 1213 07 01 1 304123924 00 0164 + 005042 1213 07 02 1 304123924 01 0164 + 005043 1213 07 03 1 304123924 02 0164 + 005044 1213 07 04 1 304123924 03 0164 + 005045 9999 99 99 0 9999 99 9999 + 005046 9999 99 99 0 9999 99 9999 + 005047 9999 99 99 0 9999 99 9999 + 005048 9999 99 99 0 9999 99 9999 + 005049 1213 08 01 1 304123924 04 0164 + 005050 1213 08 02 1 304123924 05 0164 + 005051 1213 08 03 1 304123924 06 0164 + 005052 1213 08 04 1 304123924 07 0164 + 005053 9999 99 99 0 9999 99 9999 + 005054 9999 99 99 0 9999 99 9999 + 005055 9999 99 99 0 9999 99 9999 + 005056 9999 99 99 0 9999 99 9999 + 005057 1213 09 01 1 306262040 00 0821 + 005058 1213 09 02 1 306262040 01 0821 + 005059 1213 09 03 1 306262040 02 0821 + 005060 1213 09 04 1 306262040 03 0821 + 005061 1213 09 05 1 306262040 04 0821 + 005062 1213 09 06 1 306262040 05 0821 + 005063 1213 09 07 1 306262040 06 0821 + 005064 1213 09 08 1 306262040 07 0821 + 005065 1213 10 01 1 306262040 08 0821 + 005066 1213 10 02 1 306262040 09 0821 + 005067 1213 10 03 1 306262040 10 0821 + 005068 1213 10 04 1 306262040 11 0821 + 005069 1213 10 05 1 306262040 12 0821 + 005070 1213 10 06 1 306262040 13 0821 + 005071 1213 10 07 1 306262040 14 0821 + 005072 1213 10 08 1 306262040 15 0821 + 005073 1213 11 01 1 306262036 00 0820 + 005074 1213 11 02 1 306262036 01 0820 + 005075 1213 11 03 1 306262036 02 0820 + 005076 1213 11 04 1 306262036 03 0820 + 005077 1213 11 05 1 306262036 04 0820 + 005078 1213 11 06 1 306262036 05 0820 + 005079 1213 11 07 1 306262036 06 0820 + 005080 1213 11 08 1 306262036 07 0820 + 005081 1213 12 01 1 306262036 08 0820 + 005082 1213 12 02 1 306262036 09 0820 + 005083 1213 12 03 1 306262036 10 0820 + 005084 1213 12 04 1 306262036 11 0820 + 005085 1213 12 05 1 306262036 12 0820 + 005086 1213 12 06 1 306262036 13 0820 + 005087 1213 12 07 1 306262036 14 0820 + 005088 1213 12 08 1 306262036 15 0820 + 005089 1213 13 01 1 306262048 00 0823 + 005090 1213 13 02 1 306262048 01 0823 + 005091 1213 13 03 1 306262048 02 0823 + 005092 1213 13 04 1 306262048 03 0823 + 005093 1213 13 05 1 306262048 04 0823 + 005094 1213 13 06 1 306262048 05 0823 + 005095 1213 13 07 1 306262048 06 0823 + 005096 1213 13 08 1 306262048 07 0823 + 005097 1213 14 01 1 306262048 08 0823 + 005098 1213 14 02 1 306262048 09 0823 + 005099 1213 14 03 1 306262048 10 0823 + 005100 1213 14 04 1 306262048 11 0823 + 005101 1213 14 05 1 306262048 12 0823 + 005102 1213 14 06 1 306262048 13 0823 + 005103 1213 14 07 1 306262048 14 0823 + 005104 1213 14 08 1 306262048 15 0823 + 005105 1213 15 01 1 306262044 00 0822 + 005106 1213 15 02 1 306262044 01 0822 + 005107 1213 15 03 1 306262044 02 0822 + 005108 1213 15 04 1 306262044 03 0822 + 005109 1213 15 05 1 306262044 04 0822 + 005110 1213 15 06 1 306262044 05 0822 + 005111 1213 15 07 1 306262044 06 0822 + 005112 1213 15 08 1 306262044 07 0822 + 005113 1213 16 01 1 306262044 08 0822 + 005114 1213 16 02 1 306262044 09 0822 + 005115 1213 16 03 1 306262044 10 0822 + 005116 1213 16 04 1 306262044 11 0822 + 005117 1213 16 05 1 306262044 12 0822 + 005118 1213 16 06 1 306262044 13 0822 + 005119 1213 16 07 1 306262044 14 0822 + 005120 1213 16 08 1 306262044 15 0822 + 005121 1213 17 01 1 303054880 12 0031 + 005122 1213 17 02 1 303054880 13 0031 + 005123 9999 99 99 0 9999 99 9999 + 005124 9999 99 99 0 9999 99 9999 + 005125 9999 99 99 0 9999 99 9999 + 005126 9999 99 99 0 9999 99 9999 + 005127 9999 99 99 0 9999 99 9999 + 005128 9999 99 99 0 9999 99 9999 + 005129 1213 18 01 1 303054880 14 0031 + 005130 1213 18 02 1 303054880 15 0031 + 005131 9999 99 99 0 9999 99 9999 + 005132 9999 99 99 0 9999 99 9999 + 005133 9999 99 99 0 9999 99 9999 + 005134 9999 99 99 0 9999 99 9999 + 005135 9999 99 99 0 9999 99 9999 + 005136 9999 99 99 0 9999 99 9999 + 005137 1213 19 01 1 303054880 08 0031 + 005138 1213 19 02 1 303054880 09 0031 + 005139 9999 99 99 0 9999 99 9999 + 005140 9999 99 99 0 9999 99 9999 + 005141 9999 99 99 0 9999 99 9999 + 005142 9999 99 99 0 9999 99 9999 + 005143 9999 99 99 0 9999 99 9999 + 005144 9999 99 99 0 9999 99 9999 + 005145 1213 20 01 1 303054880 10 0031 + 005146 1213 20 02 1 303054880 11 0031 + 005147 9999 99 99 0 9999 99 9999 + 005148 9999 99 99 0 9999 99 9999 + 005149 9999 99 99 0 9999 99 9999 + 005150 9999 99 99 0 9999 99 9999 + 005151 9999 99 99 0 9999 99 9999 + 005152 9999 99 99 0 9999 99 9999 + 005153 1213 21 01 1 303054880 00 0031 + 005154 1213 21 02 1 303054880 01 0031 + 005155 9999 99 99 0 9999 99 9999 + 005156 9999 99 99 0 9999 99 9999 + 005157 9999 99 99 0 9999 99 9999 + 005158 9999 99 99 0 9999 99 9999 + 005159 9999 99 99 0 9999 99 9999 + 005160 9999 99 99 0 9999 99 9999 + 005161 1213 22 01 1 303054880 02 0031 + 005162 1213 22 02 1 303054880 03 0031 + 005163 9999 99 99 0 9999 99 9999 + 005164 9999 99 99 0 9999 99 9999 + 005165 9999 99 99 0 9999 99 9999 + 005166 9999 99 99 0 9999 99 9999 + 005167 9999 99 99 0 9999 99 9999 + 005168 9999 99 99 0 9999 99 9999 + 005169 1213 23 01 1 303054880 04 0031 + 005170 1213 23 02 1 303054880 05 0031 + 005171 9999 99 99 0 9999 99 9999 + 005172 9999 99 99 0 9999 99 9999 + 005173 9999 99 99 0 9999 99 9999 + 005174 9999 99 99 0 9999 99 9999 + 005175 9999 99 99 0 9999 99 9999 + 005176 9999 99 99 0 9999 99 9999 + 005177 1213 24 01 1 303054880 06 0031 + 005178 1213 24 02 1 303054880 07 0031 + 005179 9999 99 99 0 9999 99 9999 + 005180 9999 99 99 0 9999 99 9999 + 005181 9999 99 99 0 9999 99 9999 + 005182 9999 99 99 0 9999 99 9999 + 005183 9999 99 99 0 9999 99 9999 + 005184 9999 99 99 0 9999 99 9999 + 005185 1213 25 01 1 305184796 00 0414 + 005186 1213 25 02 1 305184796 01 0414 + 005187 1213 25 03 1 305184796 02 0414 + 005188 1213 25 04 1 305184796 03 0414 + 005189 1213 25 05 1 305184796 04 0414 + 005190 1213 25 06 1 305184796 05 0414 + 005191 1213 25 07 1 305184796 06 0414 + 005192 1213 25 08 1 305184796 07 0414 + 005193 1213 26 01 1 305184796 08 0414 + 005194 1213 26 02 1 305184796 09 0414 + 005195 1213 26 03 1 305184796 10 0414 + 005196 1213 26 04 1 305184796 11 0414 + 005197 1213 26 05 1 305184796 12 0414 + 005198 1213 26 06 1 305184796 13 0414 + 005199 1213 26 07 1 305184796 14 0414 + 005200 1213 26 08 1 305184796 15 0414 + 005201 1213 27 01 1 305184800 00 0415 + 005202 1213 27 02 1 305184800 01 0415 + 005203 1213 27 03 1 305184800 02 0415 + 005204 1213 27 04 1 305184800 03 0415 + 005205 1213 27 05 1 305184800 04 0415 + 005206 1213 27 06 1 305184800 05 0415 + 005207 1213 27 07 1 305184800 06 0415 + 005208 1213 27 08 1 305184800 07 0415 + 005209 1213 28 01 1 305184800 08 0415 + 005210 1213 28 02 1 305184800 09 0415 + 005211 1213 28 03 1 305184800 10 0415 + 005212 1213 28 04 1 305184800 11 0415 + 005213 1213 28 05 1 305184800 12 0415 + 005214 1213 28 06 1 305184800 13 0415 + 005215 1213 28 07 1 305184800 14 0415 + 005216 1213 28 08 1 305184800 15 0415 + 005217 1213 29 01 1 305184788 00 0412 + 005218 1213 29 02 1 305184788 01 0412 + 005219 1213 29 03 1 305184788 02 0412 + 005220 1213 29 04 1 305184788 03 0412 + 005221 1213 29 05 1 305184788 04 0412 + 005222 1213 29 06 1 305184788 05 0412 + 005223 1213 29 07 1 305184788 06 0412 + 005224 1213 29 08 1 305184788 07 0412 + 005225 1213 30 01 1 305184788 08 0412 + 005226 1213 30 02 1 305184788 09 0412 + 005227 1213 30 03 1 305184788 10 0412 + 005228 1213 30 04 1 305184788 11 0412 + 005229 1213 30 05 1 305184788 12 0412 + 005230 1213 30 06 1 305184788 13 0412 + 005231 1213 30 07 1 305184788 14 0412 + 005232 1213 30 08 1 305184788 15 0412 + 005233 1213 31 01 1 305184792 00 0413 + 005234 1213 31 02 1 305184792 01 0413 + 005235 1213 31 03 1 305184792 02 0413 + 005236 1213 31 04 1 305184792 03 0413 + 005237 1213 31 05 1 305184792 04 0413 + 005238 1213 31 06 1 305184792 05 0413 + 005239 1213 31 07 1 305184792 06 0413 + 005240 1213 31 08 1 305184792 07 0413 + 005241 1213 32 01 1 305184792 08 0413 + 005242 1213 32 02 1 305184792 09 0413 + 005243 1213 32 03 1 305184792 10 0413 + 005244 1213 32 04 1 305184792 11 0413 + 005245 1213 32 05 1 305184792 12 0413 + 005246 1213 32 06 1 305184792 13 0413 + 005247 1213 32 07 1 305184792 14 0413 + 005248 1213 32 08 1 305184792 15 0413 + 005249 1213 33 01 1 306266136 00 0829 + 005250 1213 33 02 1 306266136 01 0829 + 005251 1213 33 03 1 306266136 02 0829 + 005252 1213 33 04 1 306266136 03 0829 + 005253 1213 33 05 1 306266136 04 0829 + 005254 1213 33 06 1 306266136 05 0829 + 005255 1213 33 07 1 306266136 06 0829 + 005256 1213 33 08 1 306266136 07 0829 + 005257 1213 34 01 1 306266136 08 0829 + 005258 1213 34 02 1 306266136 09 0829 + 005259 1213 34 03 1 306266136 10 0829 + 005260 1213 34 04 1 306266136 11 0829 + 005261 1213 34 05 1 306266136 12 0829 + 005262 1213 34 06 1 306266136 13 0829 + 005263 1213 34 07 1 306266136 14 0829 + 005264 1213 34 08 1 306266136 15 0829 + 005265 1213 35 01 1 306266132 00 0828 + 005266 1213 35 02 1 306266132 01 0828 + 005267 1213 35 03 1 306266132 02 0828 + 005268 1213 35 04 1 306266132 03 0828 + 005269 1213 35 05 1 306266132 04 0828 + 005270 1213 35 06 1 306266132 05 0828 + 005271 1213 35 07 1 306266132 06 0828 + 005272 1213 35 08 1 306266132 07 0828 + 005273 1213 36 01 1 306266132 08 0828 + 005274 1213 36 02 1 306266132 09 0828 + 005275 1213 36 03 1 306266132 10 0828 + 005276 1213 36 04 1 306266132 11 0828 + 005277 1213 36 05 1 306266132 12 0828 + 005278 1213 36 06 1 306266132 13 0828 + 005279 1213 36 07 1 306266132 14 0828 + 005280 1213 36 08 1 306266132 15 0828 + 005281 1213 37 01 1 306266144 00 0831 + 005282 1213 37 02 1 306266144 01 0831 + 005283 1213 37 03 1 306266144 02 0831 + 005284 1213 37 04 1 306266144 03 0831 + 005285 1213 37 05 1 306266144 04 0831 + 005286 1213 37 06 1 306266144 05 0831 + 005287 1213 37 07 1 306266144 06 0831 + 005288 1213 37 08 1 306266144 07 0831 + 005289 1213 38 01 1 306266144 08 0831 + 005290 1213 38 02 1 306266144 09 0831 + 005291 1213 38 03 1 306266144 10 0831 + 005292 1213 38 04 1 306266144 11 0831 + 005293 1213 38 05 1 306266144 12 0831 + 005294 1213 38 06 1 306266144 13 0831 + 005295 1213 38 07 1 306266144 14 0831 + 005296 1213 38 08 1 306266144 15 0831 + 005297 1213 39 01 1 306266140 00 0830 + 005298 1213 39 02 1 306266140 01 0830 + 005299 1213 39 03 1 306266140 02 0830 + 005300 1213 39 04 1 306266140 03 0830 + 005301 1213 39 05 1 306266140 04 0830 + 005302 1213 39 06 1 306266140 05 0830 + 005303 1213 39 07 1 306266140 06 0830 + 005304 1213 39 08 1 306266140 07 0830 + 005305 1213 40 01 1 306266140 08 0830 + 005306 1213 40 02 1 306266140 09 0830 + 005307 1213 40 03 1 306266140 10 0830 + 005308 1213 40 04 1 306266140 11 0830 + 005309 1213 40 05 1 306266140 12 0830 + 005310 1213 40 06 1 306266140 13 0830 + 005311 1213 40 07 1 306266140 14 0830 + 005312 1213 40 08 1 306266140 15 0830 + 005313 1213 41 01 1 304123936 08 0167 + 005314 1213 41 02 1 304123936 09 0167 + 005315 1213 41 03 1 304123936 10 0167 + 005316 1213 41 04 1 304123936 11 0167 + 005317 9999 99 99 0 9999 99 9999 + 005318 9999 99 99 0 9999 99 9999 + 005319 9999 99 99 0 9999 99 9999 + 005320 9999 99 99 0 9999 99 9999 + 005321 1213 42 01 1 304123936 12 0167 + 005322 1213 42 02 1 304123936 13 0167 + 005323 1213 42 03 1 304123936 14 0167 + 005324 1213 42 04 1 304123936 15 0167 + 005325 9999 99 99 0 9999 99 9999 + 005326 9999 99 99 0 9999 99 9999 + 005327 9999 99 99 0 9999 99 9999 + 005328 9999 99 99 0 9999 99 9999 + 005329 1213 43 01 1 304123936 00 0167 + 005330 1213 43 02 1 304123936 01 0167 + 005331 1213 43 03 1 304123936 02 0167 + 005332 1213 43 04 1 304123936 03 0167 + 005333 9999 99 99 0 9999 99 9999 + 005334 9999 99 99 0 9999 99 9999 + 005335 9999 99 99 0 9999 99 9999 + 005336 9999 99 99 0 9999 99 9999 + 005337 1213 44 01 1 304123936 04 0167 + 005338 1213 44 02 1 304123936 05 0167 + 005339 1213 44 03 1 304123936 06 0167 + 005340 1213 44 04 1 304123936 07 0167 + 005341 9999 99 99 0 9999 99 9999 + 005342 9999 99 99 0 9999 99 9999 + 005343 9999 99 99 0 9999 99 9999 + 005344 9999 99 99 0 9999 99 9999 + 005345 1213 45 01 1 304123932 08 0166 + 005346 1213 45 02 1 304123932 09 0166 + 005347 1213 45 03 1 304123932 10 0166 + 005348 1213 45 04 1 304123932 11 0166 + 005349 9999 99 99 0 9999 99 9999 + 005350 9999 99 99 0 9999 99 9999 + 005351 9999 99 99 0 9999 99 9999 + 005352 9999 99 99 0 9999 99 9999 + 005353 1213 46 01 1 304123932 12 0166 + 005354 1213 46 02 1 304123932 13 0166 + 005355 1213 46 03 1 304123932 14 0166 + 005356 1213 46 04 1 304123932 15 0166 + 005357 9999 99 99 0 9999 99 9999 + 005358 9999 99 99 0 9999 99 9999 + 005359 9999 99 99 0 9999 99 9999 + 005360 9999 99 99 0 9999 99 9999 + 005361 1213 47 01 1 304123932 00 0166 + 005362 1213 47 02 1 304123932 01 0166 + 005363 1213 47 03 1 304123932 02 0166 + 005364 1213 47 04 1 304123932 03 0166 + 005365 9999 99 99 0 9999 99 9999 + 005366 9999 99 99 0 9999 99 9999 + 005367 9999 99 99 0 9999 99 9999 + 005368 9999 99 99 0 9999 99 9999 + 005369 1213 48 01 1 304123932 04 0166 + 005370 1213 48 02 1 304123932 05 0166 + 005371 1213 48 03 1 304123932 06 0166 + 005372 1213 48 04 1 304123932 07 0166 + 005373 9999 99 99 0 9999 99 9999 + 005374 9999 99 99 0 9999 99 9999 + 005375 9999 99 99 0 9999 99 9999 + 005376 9999 99 99 0 9999 99 9999 + 005377 1214 01 01 1 305188892 00 0422 + 005378 1214 01 02 1 305188892 01 0422 + 005379 1214 01 03 1 305188892 02 0422 + 005380 1214 01 04 1 305188892 03 0422 + 005381 1214 01 05 1 305188892 04 0422 + 005382 1214 01 06 1 305188892 05 0422 + 005383 1214 01 07 1 305188892 06 0422 + 005384 1214 01 08 1 305188892 07 0422 + 005385 1214 02 01 1 305188892 08 0422 + 005386 1214 02 02 1 305188892 09 0422 + 005387 1214 02 03 1 305188892 10 0422 + 005388 1214 02 04 1 305188892 11 0422 + 005389 1214 02 05 1 305188892 12 0422 + 005390 1214 02 06 1 305188892 13 0422 + 005391 1214 02 07 1 305188892 14 0422 + 005392 1214 02 08 1 305188892 15 0422 + 005393 1214 03 01 1 305188896 00 0423 + 005394 1214 03 02 1 305188896 01 0423 + 005395 1214 03 03 1 305188896 02 0423 + 005396 1214 03 04 1 305188896 03 0423 + 005397 1214 03 05 1 305188896 04 0423 + 005398 1214 03 06 1 305188896 05 0423 + 005399 1214 03 07 1 305188896 06 0423 + 005400 1214 03 08 1 305188896 07 0423 + 005401 1214 04 01 1 305188896 08 0423 + 005402 1214 04 02 1 305188896 09 0423 + 005403 1214 04 03 1 305188896 10 0423 + 005404 1214 04 04 1 305188896 11 0423 + 005405 1214 04 05 1 305188896 12 0423 + 005406 1214 04 06 1 305188896 13 0423 + 005407 1214 04 07 1 305188896 14 0423 + 005408 1214 04 08 1 305188896 15 0423 + 005409 1214 05 01 1 305188884 00 0420 + 005410 1214 05 02 1 305188884 01 0420 + 005411 1214 05 03 1 305188884 02 0420 + 005412 1214 05 04 1 305188884 03 0420 + 005413 1214 05 05 1 305188884 04 0420 + 005414 1214 05 06 1 305188884 05 0420 + 005415 1214 05 07 1 305188884 06 0420 + 005416 1214 05 08 1 305188884 07 0420 + 005417 1214 06 01 1 305188884 08 0420 + 005418 1214 06 02 1 305188884 09 0420 + 005419 1214 06 03 1 305188884 10 0420 + 005420 1214 06 04 1 305188884 11 0420 + 005421 1214 06 05 1 305188884 12 0420 + 005422 1214 06 06 1 305188884 13 0420 + 005423 1214 06 07 1 305188884 14 0420 + 005424 1214 06 08 1 305188884 15 0420 + 005425 1214 07 01 1 305188888 00 0421 + 005426 1214 07 02 1 305188888 01 0421 + 005427 1214 07 03 1 305188888 02 0421 + 005428 1214 07 04 1 305188888 03 0421 + 005429 1214 07 05 1 305188888 04 0421 + 005430 1214 07 06 1 305188888 05 0421 + 005431 1214 07 07 1 305188888 06 0421 + 005432 1214 07 08 1 305188888 07 0421 + 005433 1214 08 01 1 305188888 08 0421 + 005434 1214 08 02 1 305188888 09 0421 + 005435 1214 08 03 1 305188888 10 0421 + 005436 1214 08 04 1 305188888 11 0421 + 005437 1214 08 05 1 305188888 12 0421 + 005438 1214 08 06 1 305188888 13 0421 + 005439 1214 08 07 1 305188888 14 0421 + 005440 1214 08 08 1 305188888 15 0421 + 005441 9999 99 99 0 9999 99 9999 + 005442 9999 99 99 0 9999 99 9999 + 005443 9999 99 99 0 9999 99 9999 + 005444 9999 99 99 0 9999 99 9999 + 005445 9999 99 99 0 9999 99 9999 + 005446 9999 99 99 0 9999 99 9999 + 005447 9999 99 99 0 9999 99 9999 + 005448 9999 99 99 0 9999 99 9999 + 005449 9999 99 99 0 9999 99 9999 + 005450 9999 99 99 0 9999 99 9999 + 005451 9999 99 99 0 9999 99 9999 + 005452 9999 99 99 0 9999 99 9999 + 005453 9999 99 99 0 9999 99 9999 + 005454 9999 99 99 0 9999 99 9999 + 005455 9999 99 99 0 9999 99 9999 + 005456 9999 99 99 0 9999 99 9999 + 005457 9999 99 99 0 9999 99 9999 + 005458 9999 99 99 0 9999 99 9999 + 005459 9999 99 99 0 9999 99 9999 + 005460 9999 99 99 0 9999 99 9999 + 005461 9999 99 99 0 9999 99 9999 + 005462 9999 99 99 0 9999 99 9999 + 005463 9999 99 99 0 9999 99 9999 + 005464 9999 99 99 0 9999 99 9999 + 005465 9999 99 99 0 9999 99 9999 + 005466 9999 99 99 0 9999 99 9999 + 005467 9999 99 99 0 9999 99 9999 + 005468 9999 99 99 0 9999 99 9999 + 005469 9999 99 99 0 9999 99 9999 + 005470 9999 99 99 0 9999 99 9999 + 005471 9999 99 99 0 9999 99 9999 + 005472 9999 99 99 0 9999 99 9999 + 005473 9999 99 99 0 9999 99 9999 + 005474 9999 99 99 0 9999 99 9999 + 005475 9999 99 99 0 9999 99 9999 + 005476 9999 99 99 0 9999 99 9999 + 005477 9999 99 99 0 9999 99 9999 + 005478 9999 99 99 0 9999 99 9999 + 005479 9999 99 99 0 9999 99 9999 + 005480 9999 99 99 0 9999 99 9999 + 005481 9999 99 99 0 9999 99 9999 + 005482 9999 99 99 0 9999 99 9999 + 005483 9999 99 99 0 9999 99 9999 + 005484 9999 99 99 0 9999 99 9999 + 005485 9999 99 99 0 9999 99 9999 + 005486 9999 99 99 0 9999 99 9999 + 005487 9999 99 99 0 9999 99 9999 + 005488 9999 99 99 0 9999 99 9999 + 005489 9999 99 99 0 9999 99 9999 + 005490 9999 99 99 0 9999 99 9999 + 005491 9999 99 99 0 9999 99 9999 + 005492 9999 99 99 0 9999 99 9999 + 005493 9999 99 99 0 9999 99 9999 + 005494 9999 99 99 0 9999 99 9999 + 005495 9999 99 99 0 9999 99 9999 + 005496 9999 99 99 0 9999 99 9999 + 005497 9999 99 99 0 9999 99 9999 + 005498 9999 99 99 0 9999 99 9999 + 005499 9999 99 99 0 9999 99 9999 + 005500 9999 99 99 0 9999 99 9999 + 005501 9999 99 99 0 9999 99 9999 + 005502 9999 99 99 0 9999 99 9999 + 005503 9999 99 99 0 9999 99 9999 + 005504 9999 99 99 0 9999 99 9999 + 005505 9999 99 99 0 9999 99 9999 + 005506 9999 99 99 0 9999 99 9999 + 005507 9999 99 99 0 9999 99 9999 + 005508 9999 99 99 0 9999 99 9999 + 005509 9999 99 99 0 9999 99 9999 + 005510 9999 99 99 0 9999 99 9999 + 005511 9999 99 99 0 9999 99 9999 + 005512 9999 99 99 0 9999 99 9999 + 005513 9999 99 99 0 9999 99 9999 + 005514 9999 99 99 0 9999 99 9999 + 005515 9999 99 99 0 9999 99 9999 + 005516 9999 99 99 0 9999 99 9999 + 005517 9999 99 99 0 9999 99 9999 + 005518 9999 99 99 0 9999 99 9999 + 005519 9999 99 99 0 9999 99 9999 + 005520 9999 99 99 0 9999 99 9999 + 005521 9999 99 99 0 9999 99 9999 + 005522 9999 99 99 0 9999 99 9999 + 005523 9999 99 99 0 9999 99 9999 + 005524 9999 99 99 0 9999 99 9999 + 005525 9999 99 99 0 9999 99 9999 + 005526 9999 99 99 0 9999 99 9999 + 005527 9999 99 99 0 9999 99 9999 + 005528 9999 99 99 0 9999 99 9999 + 005529 9999 99 99 0 9999 99 9999 + 005530 9999 99 99 0 9999 99 9999 + 005531 9999 99 99 0 9999 99 9999 + 005532 9999 99 99 0 9999 99 9999 + 005533 9999 99 99 0 9999 99 9999 + 005534 9999 99 99 0 9999 99 9999 + 005535 9999 99 99 0 9999 99 9999 + 005536 9999 99 99 0 9999 99 9999 + 005537 9999 99 99 0 9999 99 9999 + 005538 9999 99 99 0 9999 99 9999 + 005539 9999 99 99 0 9999 99 9999 + 005540 9999 99 99 0 9999 99 9999 + 005541 9999 99 99 0 9999 99 9999 + 005542 9999 99 99 0 9999 99 9999 + 005543 9999 99 99 0 9999 99 9999 + 005544 9999 99 99 0 9999 99 9999 + 005545 9999 99 99 0 9999 99 9999 + 005546 9999 99 99 0 9999 99 9999 + 005547 9999 99 99 0 9999 99 9999 + 005548 9999 99 99 0 9999 99 9999 + 005549 9999 99 99 0 9999 99 9999 + 005550 9999 99 99 0 9999 99 9999 + 005551 9999 99 99 0 9999 99 9999 + 005552 9999 99 99 0 9999 99 9999 + 005553 9999 99 99 0 9999 99 9999 + 005554 9999 99 99 0 9999 99 9999 + 005555 9999 99 99 0 9999 99 9999 + 005556 9999 99 99 0 9999 99 9999 + 005557 9999 99 99 0 9999 99 9999 + 005558 9999 99 99 0 9999 99 9999 + 005559 9999 99 99 0 9999 99 9999 + 005560 9999 99 99 0 9999 99 9999 + 005561 9999 99 99 0 9999 99 9999 + 005562 9999 99 99 0 9999 99 9999 + 005563 9999 99 99 0 9999 99 9999 + 005564 9999 99 99 0 9999 99 9999 + 005565 9999 99 99 0 9999 99 9999 + 005566 9999 99 99 0 9999 99 9999 + 005567 9999 99 99 0 9999 99 9999 + 005568 9999 99 99 0 9999 99 9999 + 005569 1214 25 01 1 305197084 00 0438 + 005570 1214 25 02 1 305197084 01 0438 + 005571 1214 25 03 1 305197084 02 0438 + 005572 1214 25 04 1 305197084 03 0438 + 005573 1214 25 05 1 305197084 04 0438 + 005574 1214 25 06 1 305197084 05 0438 + 005575 1214 25 07 1 305197084 06 0438 + 005576 1214 25 08 1 305197084 07 0438 + 005577 1214 26 01 1 305197084 08 0438 + 005578 1214 26 02 1 305197084 09 0438 + 005579 1214 26 03 1 305197084 10 0438 + 005580 1214 26 04 1 305197084 11 0438 + 005581 1214 26 05 1 305197084 12 0438 + 005582 1214 26 06 1 305197084 13 0438 + 005583 1214 26 07 1 305197084 14 0438 + 005584 1214 26 08 1 305197084 15 0438 + 005585 1214 27 01 1 305197088 00 0439 + 005586 1214 27 02 1 305197088 01 0439 + 005587 1214 27 03 1 305197088 02 0439 + 005588 1214 27 04 1 305197088 03 0439 + 005589 1214 27 05 1 305197088 04 0439 + 005590 1214 27 06 1 305197088 05 0439 + 005591 1214 27 07 1 305197088 06 0439 + 005592 1214 27 08 1 305197088 07 0439 + 005593 1214 28 01 1 305197088 08 0439 + 005594 1214 28 02 1 305197088 09 0439 + 005595 1214 28 03 1 305197088 10 0439 + 005596 1214 28 04 1 305197088 11 0439 + 005597 1214 28 05 1 305197088 12 0439 + 005598 1214 28 06 1 305197088 13 0439 + 005599 1214 28 07 1 305197088 14 0439 + 005600 1214 28 08 1 305197088 15 0439 + 005601 1214 29 01 1 305197076 00 0436 + 005602 1214 29 02 1 305197076 01 0436 + 005603 1214 29 03 1 305197076 02 0436 + 005604 1214 29 04 1 305197076 03 0436 + 005605 1214 29 05 1 305197076 04 0436 + 005606 1214 29 06 1 305197076 05 0436 + 005607 1214 29 07 1 305197076 06 0436 + 005608 1214 29 08 1 305197076 07 0436 + 005609 1214 30 01 1 305197076 08 0436 + 005610 1214 30 02 1 305197076 09 0436 + 005611 1214 30 03 1 305197076 10 0436 + 005612 1214 30 04 1 305197076 11 0436 + 005613 1214 30 05 1 305197076 12 0436 + 005614 1214 30 06 1 305197076 13 0436 + 005615 1214 30 07 1 305197076 14 0436 + 005616 1214 30 08 1 305197076 15 0436 + 005617 1214 31 01 1 305197080 00 0437 + 005618 1214 31 02 1 305197080 01 0437 + 005619 1214 31 03 1 305197080 02 0437 + 005620 1214 31 04 1 305197080 03 0437 + 005621 1214 31 05 1 305197080 04 0437 + 005622 1214 31 06 1 305197080 05 0437 + 005623 1214 31 07 1 305197080 06 0437 + 005624 1214 31 08 1 305197080 07 0437 + 005625 1214 32 01 1 305197080 08 0437 + 005626 1214 32 02 1 305197080 09 0437 + 005627 1214 32 03 1 305197080 10 0437 + 005628 1214 32 04 1 305197080 11 0437 + 005629 1214 32 05 1 305197080 12 0437 + 005630 1214 32 06 1 305197080 13 0437 + 005631 1214 32 07 1 305197080 14 0437 + 005632 1214 32 08 1 305197080 15 0437 + 005633 1214 33 01 1 305201176 00 0445 + 005634 1214 33 02 1 305201176 01 0445 + 005635 1214 33 03 1 305201176 02 0445 + 005636 1214 33 04 1 305201176 03 0445 + 005637 1214 33 05 1 305201176 04 0445 + 005638 1214 33 06 1 305201176 05 0445 + 005639 1214 33 07 1 305201176 06 0445 + 005640 1214 33 08 1 305201176 07 0445 + 005641 1214 34 01 1 305201176 08 0445 + 005642 1214 34 02 1 305201176 09 0445 + 005643 1214 34 03 1 305201176 10 0445 + 005644 1214 34 04 1 305201176 11 0445 + 005645 1214 34 05 1 305201176 12 0445 + 005646 1214 34 06 1 305201176 13 0445 + 005647 1214 34 07 1 305201176 14 0445 + 005648 1214 34 08 1 305201176 15 0445 + 005649 1214 35 01 1 305201172 00 0444 + 005650 1214 35 02 1 305201172 01 0444 + 005651 1214 35 03 1 305201172 02 0444 + 005652 1214 35 04 1 305201172 03 0444 + 005653 1214 35 05 1 305201172 04 0444 + 005654 1214 35 06 1 305201172 05 0444 + 005655 1214 35 07 1 305201172 06 0444 + 005656 1214 35 08 1 305201172 07 0444 + 005657 1214 36 01 1 305201172 08 0444 + 005658 1214 36 02 1 305201172 09 0444 + 005659 1214 36 03 1 305201172 10 0444 + 005660 1214 36 04 1 305201172 11 0444 + 005661 1214 36 05 1 305201172 12 0444 + 005662 1214 36 06 1 305201172 13 0444 + 005663 1214 36 07 1 305201172 14 0444 + 005664 1214 36 08 1 305201172 15 0444 + 005665 1214 37 01 1 305201184 00 0447 + 005666 1214 37 02 1 305201184 01 0447 + 005667 1214 37 03 1 305201184 02 0447 + 005668 1214 37 04 1 305201184 03 0447 + 005669 1214 37 05 1 305201184 04 0447 + 005670 1214 37 06 1 305201184 05 0447 + 005671 1214 37 07 1 305201184 06 0447 + 005672 1214 37 08 1 305201184 07 0447 + 005673 1214 38 01 1 305201184 08 0447 + 005674 1214 38 02 1 305201184 09 0447 + 005675 1214 38 03 1 305201184 10 0447 + 005676 1214 38 04 1 305201184 11 0447 + 005677 1214 38 05 1 305201184 12 0447 + 005678 1214 38 06 1 305201184 13 0447 + 005679 1214 38 07 1 305201184 14 0447 + 005680 1214 38 08 1 305201184 15 0447 + 005681 1214 39 01 1 305201180 00 0446 + 005682 1214 39 02 1 305201180 01 0446 + 005683 1214 39 03 1 305201180 02 0446 + 005684 1214 39 04 1 305201180 03 0446 + 005685 1214 39 05 1 305201180 04 0446 + 005686 1214 39 06 1 305201180 05 0446 + 005687 1214 39 07 1 305201180 06 0446 + 005688 1214 39 08 1 305201180 07 0446 + 005689 1214 40 01 1 305201180 08 0446 + 005690 1214 40 02 1 305201180 09 0446 + 005691 1214 40 03 1 305201180 10 0446 + 005692 1214 40 04 1 305201180 11 0446 + 005693 1214 40 05 1 305201180 12 0446 + 005694 1214 40 06 1 305201180 13 0446 + 005695 1214 40 07 1 305201180 14 0446 + 005696 1214 40 08 1 305201180 15 0446 + 005697 9999 99 99 0 9999 99 9999 + 005698 9999 99 99 0 9999 99 9999 + 005699 9999 99 99 0 9999 99 9999 + 005700 9999 99 99 0 9999 99 9999 + 005701 9999 99 99 0 9999 99 9999 + 005702 9999 99 99 0 9999 99 9999 + 005703 9999 99 99 0 9999 99 9999 + 005704 9999 99 99 0 9999 99 9999 + 005705 9999 99 99 0 9999 99 9999 + 005706 9999 99 99 0 9999 99 9999 + 005707 9999 99 99 0 9999 99 9999 + 005708 9999 99 99 0 9999 99 9999 + 005709 9999 99 99 0 9999 99 9999 + 005710 9999 99 99 0 9999 99 9999 + 005711 9999 99 99 0 9999 99 9999 + 005712 9999 99 99 0 9999 99 9999 + 005713 9999 99 99 0 9999 99 9999 + 005714 9999 99 99 0 9999 99 9999 + 005715 9999 99 99 0 9999 99 9999 + 005716 9999 99 99 0 9999 99 9999 + 005717 9999 99 99 0 9999 99 9999 + 005718 9999 99 99 0 9999 99 9999 + 005719 9999 99 99 0 9999 99 9999 + 005720 9999 99 99 0 9999 99 9999 + 005721 9999 99 99 0 9999 99 9999 + 005722 9999 99 99 0 9999 99 9999 + 005723 9999 99 99 0 9999 99 9999 + 005724 9999 99 99 0 9999 99 9999 + 005725 9999 99 99 0 9999 99 9999 + 005726 9999 99 99 0 9999 99 9999 + 005727 9999 99 99 0 9999 99 9999 + 005728 9999 99 99 0 9999 99 9999 + 005729 9999 99 99 0 9999 99 9999 + 005730 9999 99 99 0 9999 99 9999 + 005731 9999 99 99 0 9999 99 9999 + 005732 9999 99 99 0 9999 99 9999 + 005733 9999 99 99 0 9999 99 9999 + 005734 9999 99 99 0 9999 99 9999 + 005735 9999 99 99 0 9999 99 9999 + 005736 9999 99 99 0 9999 99 9999 + 005737 9999 99 99 0 9999 99 9999 + 005738 9999 99 99 0 9999 99 9999 + 005739 9999 99 99 0 9999 99 9999 + 005740 9999 99 99 0 9999 99 9999 + 005741 9999 99 99 0 9999 99 9999 + 005742 9999 99 99 0 9999 99 9999 + 005743 9999 99 99 0 9999 99 9999 + 005744 9999 99 99 0 9999 99 9999 + 005745 9999 99 99 0 9999 99 9999 + 005746 9999 99 99 0 9999 99 9999 + 005747 9999 99 99 0 9999 99 9999 + 005748 9999 99 99 0 9999 99 9999 + 005749 9999 99 99 0 9999 99 9999 + 005750 9999 99 99 0 9999 99 9999 + 005751 9999 99 99 0 9999 99 9999 + 005752 9999 99 99 0 9999 99 9999 + 005753 9999 99 99 0 9999 99 9999 + 005754 9999 99 99 0 9999 99 9999 + 005755 9999 99 99 0 9999 99 9999 + 005756 9999 99 99 0 9999 99 9999 + 005757 9999 99 99 0 9999 99 9999 + 005758 9999 99 99 0 9999 99 9999 + 005759 9999 99 99 0 9999 99 9999 + 005760 9999 99 99 0 9999 99 9999 + 005761 1215 01 01 1 303054868 08 0028 + 005762 1215 01 02 1 303054868 09 0028 + 005763 9999 99 99 0 9999 99 9999 + 005764 9999 99 99 0 9999 99 9999 + 005765 9999 99 99 0 9999 99 9999 + 005766 9999 99 99 0 9999 99 9999 + 005767 9999 99 99 0 9999 99 9999 + 005768 9999 99 99 0 9999 99 9999 + 005769 1215 02 01 1 303054868 10 0028 + 005770 1215 02 02 1 303054868 11 0028 + 005771 9999 99 99 0 9999 99 9999 + 005772 9999 99 99 0 9999 99 9999 + 005773 9999 99 99 0 9999 99 9999 + 005774 9999 99 99 0 9999 99 9999 + 005775 9999 99 99 0 9999 99 9999 + 005776 9999 99 99 0 9999 99 9999 + 005777 1215 03 01 1 303054868 12 0028 + 005778 1215 03 02 1 303054868 13 0028 + 005779 9999 99 99 0 9999 99 9999 + 005780 9999 99 99 0 9999 99 9999 + 005781 9999 99 99 0 9999 99 9999 + 005782 9999 99 99 0 9999 99 9999 + 005783 9999 99 99 0 9999 99 9999 + 005784 9999 99 99 0 9999 99 9999 + 005785 1215 04 01 1 303054868 14 0028 + 005786 1215 04 02 1 303054868 15 0028 + 005787 9999 99 99 0 9999 99 9999 + 005788 9999 99 99 0 9999 99 9999 + 005789 9999 99 99 0 9999 99 9999 + 005790 9999 99 99 0 9999 99 9999 + 005791 9999 99 99 0 9999 99 9999 + 005792 9999 99 99 0 9999 99 9999 + 005793 1215 05 01 1 303054868 00 0028 + 005794 1215 05 02 1 303054868 01 0028 + 005795 9999 99 99 0 9999 99 9999 + 005796 9999 99 99 0 9999 99 9999 + 005797 9999 99 99 0 9999 99 9999 + 005798 9999 99 99 0 9999 99 9999 + 005799 9999 99 99 0 9999 99 9999 + 005800 9999 99 99 0 9999 99 9999 + 005801 1215 06 01 1 303054868 02 0028 + 005802 1215 06 02 1 303054868 03 0028 + 005803 9999 99 99 0 9999 99 9999 + 005804 9999 99 99 0 9999 99 9999 + 005805 9999 99 99 0 9999 99 9999 + 005806 9999 99 99 0 9999 99 9999 + 005807 9999 99 99 0 9999 99 9999 + 005808 9999 99 99 0 9999 99 9999 + 005809 1215 07 01 1 303054868 04 0028 + 005810 1215 07 02 1 303054868 05 0028 + 005811 9999 99 99 0 9999 99 9999 + 005812 9999 99 99 0 9999 99 9999 + 005813 9999 99 99 0 9999 99 9999 + 005814 9999 99 99 0 9999 99 9999 + 005815 9999 99 99 0 9999 99 9999 + 005816 9999 99 99 0 9999 99 9999 + 005817 1215 08 01 1 303054868 06 0028 + 005818 1215 08 02 1 303054868 07 0028 + 005819 9999 99 99 0 9999 99 9999 + 005820 9999 99 99 0 9999 99 9999 + 005821 9999 99 99 0 9999 99 9999 + 005822 9999 99 99 0 9999 99 9999 + 005823 9999 99 99 0 9999 99 9999 + 005824 9999 99 99 0 9999 99 9999 + 005825 1215 09 01 1 304128024 00 0173 + 005826 1215 09 02 1 304128024 01 0173 + 005827 1215 09 03 1 304128024 02 0173 + 005828 1215 09 04 1 304128024 03 0173 + 005829 9999 99 99 0 9999 99 9999 + 005830 9999 99 99 0 9999 99 9999 + 005831 9999 99 99 0 9999 99 9999 + 005832 9999 99 99 0 9999 99 9999 + 005833 1215 10 01 1 304128024 04 0173 + 005834 1215 10 02 1 304128024 05 0173 + 005835 1215 10 03 1 304128024 06 0173 + 005836 1215 10 04 1 304128024 07 0173 + 005837 9999 99 99 0 9999 99 9999 + 005838 9999 99 99 0 9999 99 9999 + 005839 9999 99 99 0 9999 99 9999 + 005840 9999 99 99 0 9999 99 9999 + 005841 1215 11 01 1 304128024 08 0173 + 005842 1215 11 02 1 304128024 09 0173 + 005843 1215 11 03 1 304128024 10 0173 + 005844 1215 11 04 1 304128024 11 0173 + 005845 9999 99 99 0 9999 99 9999 + 005846 9999 99 99 0 9999 99 9999 + 005847 9999 99 99 0 9999 99 9999 + 005848 9999 99 99 0 9999 99 9999 + 005849 1215 12 01 1 304128024 12 0173 + 005850 1215 12 02 1 304128024 13 0173 + 005851 1215 12 03 1 304128024 14 0173 + 005852 1215 12 04 1 304128024 15 0173 + 005853 9999 99 99 0 9999 99 9999 + 005854 9999 99 99 0 9999 99 9999 + 005855 9999 99 99 0 9999 99 9999 + 005856 9999 99 99 0 9999 99 9999 + 005857 1215 13 01 1 304128020 08 0172 + 005858 1215 13 02 1 304128020 09 0172 + 005859 1215 13 03 1 304128020 10 0172 + 005860 1215 13 04 1 304128020 11 0172 + 005861 9999 99 99 0 9999 99 9999 + 005862 9999 99 99 0 9999 99 9999 + 005863 9999 99 99 0 9999 99 9999 + 005864 9999 99 99 0 9999 99 9999 + 005865 1215 14 01 1 304128020 12 0172 + 005866 1215 14 02 1 304128020 13 0172 + 005867 1215 14 03 1 304128020 14 0172 + 005868 1215 14 04 1 304128020 15 0172 + 005869 9999 99 99 0 9999 99 9999 + 005870 9999 99 99 0 9999 99 9999 + 005871 9999 99 99 0 9999 99 9999 + 005872 9999 99 99 0 9999 99 9999 + 005873 1215 15 01 1 304128020 00 0172 + 005874 1215 15 02 1 304128020 01 0172 + 005875 1215 15 03 1 304128020 02 0172 + 005876 1215 15 04 1 304128020 03 0172 + 005877 9999 99 99 0 9999 99 9999 + 005878 9999 99 99 0 9999 99 9999 + 005879 9999 99 99 0 9999 99 9999 + 005880 9999 99 99 0 9999 99 9999 + 005881 1215 16 01 1 304128020 04 0172 + 005882 1215 16 02 1 304128020 05 0172 + 005883 1215 16 03 1 304128020 06 0172 + 005884 1215 16 04 1 304128020 07 0172 + 005885 9999 99 99 0 9999 99 9999 + 005886 9999 99 99 0 9999 99 9999 + 005887 9999 99 99 0 9999 99 9999 + 005888 9999 99 99 0 9999 99 9999 + 005889 1215 17 01 1 306270236 00 0838 + 005890 1215 17 02 1 306270236 01 0838 + 005891 1215 17 03 1 306270236 02 0838 + 005892 1215 17 04 1 306270236 03 0838 + 005893 1215 17 05 1 306270236 04 0838 + 005894 1215 17 06 1 306270236 05 0838 + 005895 1215 17 07 1 306270236 06 0838 + 005896 1215 17 08 1 306270236 07 0838 + 005897 1215 18 01 1 306270236 08 0838 + 005898 1215 18 02 1 306270236 09 0838 + 005899 1215 18 03 1 306270236 10 0838 + 005900 1215 18 04 1 306270236 11 0838 + 005901 1215 18 05 1 306270236 12 0838 + 005902 1215 18 06 1 306270236 13 0838 + 005903 1215 18 07 1 306270236 14 0838 + 005904 1215 18 08 1 306270236 15 0838 + 005905 1215 19 01 1 306270240 00 0839 + 005906 1215 19 02 1 306270240 01 0839 + 005907 1215 19 03 1 306270240 02 0839 + 005908 1215 19 04 1 306270240 03 0839 + 005909 1215 19 05 1 306270240 04 0839 + 005910 1215 19 06 1 306270240 05 0839 + 005911 1215 19 07 1 306270240 06 0839 + 005912 1215 19 08 1 306270240 07 0839 + 005913 1215 20 01 1 306270240 08 0839 + 005914 1215 20 02 1 306270240 09 0839 + 005915 1215 20 03 1 306270240 10 0839 + 005916 1215 20 04 1 306270240 11 0839 + 005917 1215 20 05 1 306270240 12 0839 + 005918 1215 20 06 1 306270240 13 0839 + 005919 1215 20 07 1 306270240 14 0839 + 005920 1215 20 08 1 306270240 15 0839 + 005921 1215 21 01 1 306270228 00 0836 + 005922 1215 21 02 1 306270228 01 0836 + 005923 1215 21 03 1 306270228 02 0836 + 005924 1215 21 04 1 306270228 03 0836 + 005925 1215 21 05 1 306270228 04 0836 + 005926 1215 21 06 1 306270228 05 0836 + 005927 1215 21 07 1 306270228 06 0836 + 005928 1215 21 08 1 306270228 07 0836 + 005929 1215 22 01 1 306270228 08 0836 + 005930 1215 22 02 1 306270228 09 0836 + 005931 1215 22 03 1 306270228 10 0836 + 005932 1215 22 04 1 306270228 11 0836 + 005933 1215 22 05 1 306270228 12 0836 + 005934 1215 22 06 1 306270228 13 0836 + 005935 1215 22 07 1 306270228 14 0836 + 005936 1215 22 08 1 306270228 15 0836 + 005937 1215 23 01 1 306270232 00 0837 + 005938 1215 23 02 1 306270232 01 0837 + 005939 1215 23 03 1 306270232 02 0837 + 005940 1215 23 04 1 306270232 03 0837 + 005941 1215 23 05 1 306270232 04 0837 + 005942 1215 23 06 1 306270232 05 0837 + 005943 1215 23 07 1 306270232 06 0837 + 005944 1215 23 08 1 306270232 07 0837 + 005945 1215 24 01 1 306270232 08 0837 + 005946 1215 24 02 1 306270232 09 0837 + 005947 1215 24 03 1 306270232 10 0837 + 005948 1215 24 04 1 306270232 11 0837 + 005949 1215 24 05 1 306270232 12 0837 + 005950 1215 24 06 1 306270232 13 0837 + 005951 1215 24 07 1 306270232 14 0837 + 005952 1215 24 08 1 306270232 15 0837 + 005953 1215 25 01 1 303058972 08 0038 + 005954 1215 25 02 1 303058972 09 0038 + 005955 9999 99 99 0 9999 99 9999 + 005956 9999 99 99 0 9999 99 9999 + 005957 9999 99 99 0 9999 99 9999 + 005958 9999 99 99 0 9999 99 9999 + 005959 9999 99 99 0 9999 99 9999 + 005960 9999 99 99 0 9999 99 9999 + 005961 1215 26 01 1 303058972 10 0038 + 005962 1215 26 02 1 303058972 11 0038 + 005963 9999 99 99 0 9999 99 9999 + 005964 9999 99 99 0 9999 99 9999 + 005965 9999 99 99 0 9999 99 9999 + 005966 9999 99 99 0 9999 99 9999 + 005967 9999 99 99 0 9999 99 9999 + 005968 9999 99 99 0 9999 99 9999 + 005969 1215 27 01 1 303058972 12 0038 + 005970 1215 27 02 1 303058972 13 0038 + 005971 9999 99 99 0 9999 99 9999 + 005972 9999 99 99 0 9999 99 9999 + 005973 9999 99 99 0 9999 99 9999 + 005974 9999 99 99 0 9999 99 9999 + 005975 9999 99 99 0 9999 99 9999 + 005976 9999 99 99 0 9999 99 9999 + 005977 1215 28 01 1 303058972 14 0038 + 005978 1215 28 02 1 303058972 15 0038 + 005979 9999 99 99 0 9999 99 9999 + 005980 9999 99 99 0 9999 99 9999 + 005981 9999 99 99 0 9999 99 9999 + 005982 9999 99 99 0 9999 99 9999 + 005983 9999 99 99 0 9999 99 9999 + 005984 9999 99 99 0 9999 99 9999 + 005985 1215 29 01 1 303058972 04 0038 + 005986 1215 29 02 1 303058972 05 0038 + 005987 9999 99 99 0 9999 99 9999 + 005988 9999 99 99 0 9999 99 9999 + 005989 9999 99 99 0 9999 99 9999 + 005990 9999 99 99 0 9999 99 9999 + 005991 9999 99 99 0 9999 99 9999 + 005992 9999 99 99 0 9999 99 9999 + 005993 1215 30 01 1 303058972 06 0038 + 005994 1215 30 02 1 303058972 07 0038 + 005995 9999 99 99 0 9999 99 9999 + 005996 9999 99 99 0 9999 99 9999 + 005997 9999 99 99 0 9999 99 9999 + 005998 9999 99 99 0 9999 99 9999 + 005999 9999 99 99 0 9999 99 9999 + 006000 9999 99 99 0 9999 99 9999 + 006001 1215 31 01 1 303058972 00 0038 + 006002 1215 31 02 1 303058972 01 0038 + 006003 9999 99 99 0 9999 99 9999 + 006004 9999 99 99 0 9999 99 9999 + 006005 9999 99 99 0 9999 99 9999 + 006006 9999 99 99 0 9999 99 9999 + 006007 9999 99 99 0 9999 99 9999 + 006008 9999 99 99 0 9999 99 9999 + 006009 1215 32 01 1 303058972 02 0038 + 006010 1215 32 02 1 303058972 03 0038 + 006011 9999 99 99 0 9999 99 9999 + 006012 9999 99 99 0 9999 99 9999 + 006013 9999 99 99 0 9999 99 9999 + 006014 9999 99 99 0 9999 99 9999 + 006015 9999 99 99 0 9999 99 9999 + 006016 9999 99 99 0 9999 99 9999 + 006017 1215 33 01 1 306274332 00 0846 + 006018 1215 33 02 1 306274332 01 0846 + 006019 1215 33 03 1 306274332 02 0846 + 006020 1215 33 04 1 306274332 03 0846 + 006021 1215 33 05 1 306274332 04 0846 + 006022 1215 33 06 1 306274332 05 0846 + 006023 1215 33 07 1 306274332 06 0846 + 006024 1215 33 08 1 306274332 07 0846 + 006025 1215 34 01 1 306274332 08 0846 + 006026 1215 34 02 1 306274332 09 0846 + 006027 1215 34 03 1 306274332 10 0846 + 006028 1215 34 04 1 306274332 11 0846 + 006029 1215 34 05 1 306274332 12 0846 + 006030 1215 34 06 1 306274332 13 0846 + 006031 1215 34 07 1 306274332 14 0846 + 006032 1215 34 08 1 306274332 15 0846 + 006033 1215 35 01 1 306274336 00 0847 + 006034 1215 35 02 1 306274336 01 0847 + 006035 1215 35 03 1 306274336 02 0847 + 006036 1215 35 04 1 306274336 03 0847 + 006037 1215 35 05 1 306274336 04 0847 + 006038 1215 35 06 1 306274336 05 0847 + 006039 1215 35 07 1 306274336 06 0847 + 006040 1215 35 08 1 306274336 07 0847 + 006041 1215 36 01 1 306274336 08 0847 + 006042 1215 36 02 1 306274336 09 0847 + 006043 1215 36 03 1 306274336 10 0847 + 006044 1215 36 04 1 306274336 11 0847 + 006045 1215 36 05 1 306274336 12 0847 + 006046 1215 36 06 1 306274336 13 0847 + 006047 1215 36 07 1 306274336 14 0847 + 006048 1215 36 08 1 306274336 15 0847 + 006049 1215 37 01 1 306274324 00 0844 + 006050 1215 37 02 1 306274324 01 0844 + 006051 1215 37 03 1 306274324 02 0844 + 006052 1215 37 04 1 306274324 03 0844 + 006053 1215 37 05 1 306274324 04 0844 + 006054 1215 37 06 1 306274324 05 0844 + 006055 1215 37 07 1 306274324 06 0844 + 006056 1215 37 08 1 306274324 07 0844 + 006057 1215 38 01 1 306274324 08 0844 + 006058 1215 38 02 1 306274324 09 0844 + 006059 1215 38 03 1 306274324 10 0844 + 006060 1215 38 04 1 306274324 11 0844 + 006061 1215 38 05 1 306274324 12 0844 + 006062 1215 38 06 1 306274324 13 0844 + 006063 1215 38 07 1 306274324 14 0844 + 006064 1215 38 08 1 306274324 15 0844 + 006065 1215 39 01 1 306274328 00 0845 + 006066 1215 39 02 1 306274328 01 0845 + 006067 1215 39 03 1 306274328 02 0845 + 006068 1215 39 04 1 306274328 03 0845 + 006069 1215 39 05 1 306274328 04 0845 + 006070 1215 39 06 1 306274328 05 0845 + 006071 1215 39 07 1 306274328 06 0845 + 006072 1215 39 08 1 306274328 07 0845 + 006073 1215 40 01 1 306274328 08 0845 + 006074 1215 40 02 1 306274328 09 0845 + 006075 1215 40 03 1 306274328 10 0845 + 006076 1215 40 04 1 306274328 11 0845 + 006077 1215 40 05 1 306274328 12 0845 + 006078 1215 40 06 1 306274328 13 0845 + 006079 1215 40 07 1 306274328 14 0845 + 006080 1215 40 08 1 306274328 15 0845 + 006081 1215 41 01 1 304128028 00 0174 + 006082 1215 41 02 1 304128028 01 0174 + 006083 1215 41 03 1 304128028 02 0174 + 006084 1215 41 04 1 304128028 03 0174 + 006085 9999 99 99 0 9999 99 9999 + 006086 9999 99 99 0 9999 99 9999 + 006087 9999 99 99 0 9999 99 9999 + 006088 9999 99 99 0 9999 99 9999 + 006089 1215 42 01 1 304128028 04 0174 + 006090 1215 42 02 1 304128028 05 0174 + 006091 1215 42 03 1 304128028 06 0174 + 006092 1215 42 04 1 304128028 07 0174 + 006093 9999 99 99 0 9999 99 9999 + 006094 9999 99 99 0 9999 99 9999 + 006095 9999 99 99 0 9999 99 9999 + 006096 9999 99 99 0 9999 99 9999 + 006097 1215 43 01 1 304128028 08 0174 + 006098 1215 43 02 1 304128028 09 0174 + 006099 1215 43 03 1 304128028 10 0174 + 006100 1215 43 04 1 304128028 11 0174 + 006101 9999 99 99 0 9999 99 9999 + 006102 9999 99 99 0 9999 99 9999 + 006103 9999 99 99 0 9999 99 9999 + 006104 9999 99 99 0 9999 99 9999 + 006105 1215 44 01 1 304128028 12 0174 + 006106 1215 44 02 1 304128028 13 0174 + 006107 1215 44 03 1 304128028 14 0174 + 006108 1215 44 04 1 304128028 15 0174 + 006109 9999 99 99 0 9999 99 9999 + 006110 9999 99 99 0 9999 99 9999 + 006111 9999 99 99 0 9999 99 9999 + 006112 9999 99 99 0 9999 99 9999 + 006113 1215 45 01 1 304128032 00 0175 + 006114 1215 45 02 1 304128032 01 0175 + 006115 1215 45 03 1 304128032 02 0175 + 006116 1215 45 04 1 304128032 03 0175 + 006117 9999 99 99 0 9999 99 9999 + 006118 9999 99 99 0 9999 99 9999 + 006119 9999 99 99 0 9999 99 9999 + 006120 9999 99 99 0 9999 99 9999 + 006121 1215 46 01 1 304128032 04 0175 + 006122 1215 46 02 1 304128032 05 0175 + 006123 1215 46 03 1 304128032 06 0175 + 006124 1215 46 04 1 304128032 07 0175 + 006125 9999 99 99 0 9999 99 9999 + 006126 9999 99 99 0 9999 99 9999 + 006127 9999 99 99 0 9999 99 9999 + 006128 9999 99 99 0 9999 99 9999 + 006129 1215 47 01 1 304128032 08 0175 + 006130 1215 47 02 1 304128032 09 0175 + 006131 1215 47 03 1 304128032 10 0175 + 006132 1215 47 04 1 304128032 11 0175 + 006133 9999 99 99 0 9999 99 9999 + 006134 9999 99 99 0 9999 99 9999 + 006135 9999 99 99 0 9999 99 9999 + 006136 9999 99 99 0 9999 99 9999 + 006137 1215 48 01 1 304128032 12 0175 + 006138 1215 48 02 1 304128032 13 0175 + 006139 1215 48 03 1 304128032 14 0175 + 006140 1215 48 04 1 304128032 15 0175 + 006141 9999 99 99 0 9999 99 9999 + 006142 9999 99 99 0 9999 99 9999 + 006143 9999 99 99 0 9999 99 9999 + 006144 9999 99 99 0 9999 99 9999 + 006145 1216 01 01 1 304132120 08 0181 + 006146 1216 01 02 1 304132120 09 0181 + 006147 1216 01 03 1 304132120 10 0181 + 006148 1216 01 04 1 304132120 11 0181 + 006149 9999 99 99 0 9999 99 9999 + 006150 9999 99 99 0 9999 99 9999 + 006151 9999 99 99 0 9999 99 9999 + 006152 9999 99 99 0 9999 99 9999 + 006153 1216 02 01 1 304132120 12 0181 + 006154 1216 02 02 1 304132120 13 0181 + 006155 1216 02 03 1 304132120 14 0181 + 006156 1216 02 04 1 304132120 15 0181 + 006157 9999 99 99 0 9999 99 9999 + 006158 9999 99 99 0 9999 99 9999 + 006159 9999 99 99 0 9999 99 9999 + 006160 9999 99 99 0 9999 99 9999 + 006161 1216 03 01 1 304132120 00 0181 + 006162 1216 03 02 1 304132120 01 0181 + 006163 1216 03 03 1 304132120 02 0181 + 006164 1216 03 04 1 304132120 03 0181 + 006165 9999 99 99 0 9999 99 9999 + 006166 9999 99 99 0 9999 99 9999 + 006167 9999 99 99 0 9999 99 9999 + 006168 9999 99 99 0 9999 99 9999 + 006169 1216 04 01 1 304132120 04 0181 + 006170 1216 04 02 1 304132120 05 0181 + 006171 1216 04 03 1 304132120 06 0181 + 006172 1216 04 04 1 304132120 07 0181 + 006173 9999 99 99 0 9999 99 9999 + 006174 9999 99 99 0 9999 99 9999 + 006175 9999 99 99 0 9999 99 9999 + 006176 9999 99 99 0 9999 99 9999 + 006177 1216 05 01 1 304132116 08 0180 + 006178 1216 05 02 1 304132116 09 0180 + 006179 1216 05 03 1 304132116 10 0180 + 006180 1216 05 04 1 304132116 11 0180 + 006181 9999 99 99 0 9999 99 9999 + 006182 9999 99 99 0 9999 99 9999 + 006183 9999 99 99 0 9999 99 9999 + 006184 9999 99 99 0 9999 99 9999 + 006185 1216 06 01 1 304132116 12 0180 + 006186 1216 06 02 1 304132116 13 0180 + 006187 1216 06 03 1 304132116 14 0180 + 006188 1216 06 04 1 304132116 15 0180 + 006189 9999 99 99 0 9999 99 9999 + 006190 9999 99 99 0 9999 99 9999 + 006191 9999 99 99 0 9999 99 9999 + 006192 9999 99 99 0 9999 99 9999 + 006193 1216 07 01 1 304132116 00 0180 + 006194 1216 07 02 1 304132116 01 0180 + 006195 1216 07 03 1 304132116 02 0180 + 006196 1216 07 04 1 304132116 03 0180 + 006197 9999 99 99 0 9999 99 9999 + 006198 9999 99 99 0 9999 99 9999 + 006199 9999 99 99 0 9999 99 9999 + 006200 9999 99 99 0 9999 99 9999 + 006201 1216 08 01 1 304132116 04 0180 + 006202 1216 08 02 1 304132116 05 0180 + 006203 1216 08 03 1 304132116 06 0180 + 006204 1216 08 04 1 304132116 07 0180 + 006205 9999 99 99 0 9999 99 9999 + 006206 9999 99 99 0 9999 99 9999 + 006207 9999 99 99 0 9999 99 9999 + 006208 9999 99 99 0 9999 99 9999 + 006209 1216 09 01 1 306278424 00 0853 + 006210 1216 09 02 1 306278424 01 0853 + 006211 1216 09 03 1 306278424 02 0853 + 006212 1216 09 04 1 306278424 03 0853 + 006213 1216 09 05 1 306278424 04 0853 + 006214 1216 09 06 1 306278424 05 0853 + 006215 1216 09 07 1 306278424 06 0853 + 006216 1216 09 08 1 306278424 07 0853 + 006217 1216 10 01 1 306278424 08 0853 + 006218 1216 10 02 1 306278424 09 0853 + 006219 1216 10 03 1 306278424 10 0853 + 006220 1216 10 04 1 306278424 11 0853 + 006221 1216 10 05 1 306278424 12 0853 + 006222 1216 10 06 1 306278424 13 0853 + 006223 1216 10 07 1 306278424 14 0853 + 006224 1216 10 08 1 306278424 15 0853 + 006225 1216 11 01 1 306278420 00 0852 + 006226 1216 11 02 1 306278420 01 0852 + 006227 1216 11 03 1 306278420 02 0852 + 006228 1216 11 04 1 306278420 03 0852 + 006229 1216 11 05 1 306278420 04 0852 + 006230 1216 11 06 1 306278420 05 0852 + 006231 1216 11 07 1 306278420 06 0852 + 006232 1216 11 08 1 306278420 07 0852 + 006233 1216 12 01 1 306278420 08 0852 + 006234 1216 12 02 1 306278420 09 0852 + 006235 1216 12 03 1 306278420 10 0852 + 006236 1216 12 04 1 306278420 11 0852 + 006237 1216 12 05 1 306278420 12 0852 + 006238 1216 12 06 1 306278420 13 0852 + 006239 1216 12 07 1 306278420 14 0852 + 006240 1216 12 08 1 306278420 15 0852 + 006241 1216 13 01 1 306278432 00 0855 + 006242 1216 13 02 1 306278432 01 0855 + 006243 1216 13 03 1 306278432 02 0855 + 006244 1216 13 04 1 306278432 03 0855 + 006245 1216 13 05 1 306278432 04 0855 + 006246 1216 13 06 1 306278432 05 0855 + 006247 1216 13 07 1 306278432 06 0855 + 006248 1216 13 08 1 306278432 07 0855 + 006249 1216 14 01 1 306278432 08 0855 + 006250 1216 14 02 1 306278432 09 0855 + 006251 1216 14 03 1 306278432 10 0855 + 006252 1216 14 04 1 306278432 11 0855 + 006253 1216 14 05 1 306278432 12 0855 + 006254 1216 14 06 1 306278432 13 0855 + 006255 1216 14 07 1 306278432 14 0855 + 006256 1216 14 08 1 306278432 15 0855 + 006257 1216 15 01 1 306278428 00 0854 + 006258 1216 15 02 1 306278428 01 0854 + 006259 1216 15 03 1 306278428 02 0854 + 006260 1216 15 04 1 306278428 03 0854 + 006261 1216 15 05 1 306278428 04 0854 + 006262 1216 15 06 1 306278428 05 0854 + 006263 1216 15 07 1 306278428 06 0854 + 006264 1216 15 08 1 306278428 07 0854 + 006265 1216 16 01 1 306278428 08 0854 + 006266 1216 16 02 1 306278428 09 0854 + 006267 1216 16 03 1 306278428 10 0854 + 006268 1216 16 04 1 306278428 11 0854 + 006269 1216 16 05 1 306278428 12 0854 + 006270 1216 16 06 1 306278428 13 0854 + 006271 1216 16 07 1 306278428 14 0854 + 006272 1216 16 08 1 306278428 15 0854 + 006273 1216 17 01 1 303058976 12 0039 + 006274 1216 17 02 1 303058976 13 0039 + 006275 9999 99 99 0 9999 99 9999 + 006276 9999 99 99 0 9999 99 9999 + 006277 9999 99 99 0 9999 99 9999 + 006278 9999 99 99 0 9999 99 9999 + 006279 9999 99 99 0 9999 99 9999 + 006280 9999 99 99 0 9999 99 9999 + 006281 1216 18 01 1 303058976 14 0039 + 006282 1216 18 02 1 303058976 15 0039 + 006283 9999 99 99 0 9999 99 9999 + 006284 9999 99 99 0 9999 99 9999 + 006285 9999 99 99 0 9999 99 9999 + 006286 9999 99 99 0 9999 99 9999 + 006287 9999 99 99 0 9999 99 9999 + 006288 9999 99 99 0 9999 99 9999 + 006289 1216 19 01 1 303058976 08 0039 + 006290 1216 19 02 1 303058976 09 0039 + 006291 9999 99 99 0 9999 99 9999 + 006292 9999 99 99 0 9999 99 9999 + 006293 9999 99 99 0 9999 99 9999 + 006294 9999 99 99 0 9999 99 9999 + 006295 9999 99 99 0 9999 99 9999 + 006296 9999 99 99 0 9999 99 9999 + 006297 1216 20 01 1 303058976 10 0039 + 006298 1216 20 02 1 303058976 11 0039 + 006299 9999 99 99 0 9999 99 9999 + 006300 9999 99 99 0 9999 99 9999 + 006301 9999 99 99 0 9999 99 9999 + 006302 9999 99 99 0 9999 99 9999 + 006303 9999 99 99 0 9999 99 9999 + 006304 9999 99 99 0 9999 99 9999 + 006305 1216 21 01 1 303058976 00 0039 + 006306 1216 21 02 1 303058976 01 0039 + 006307 9999 99 99 0 9999 99 9999 + 006308 9999 99 99 0 9999 99 9999 + 006309 9999 99 99 0 9999 99 9999 + 006310 9999 99 99 0 9999 99 9999 + 006311 9999 99 99 0 9999 99 9999 + 006312 9999 99 99 0 9999 99 9999 + 006313 1216 22 01 1 303058976 02 0039 + 006314 1216 22 02 1 303058976 03 0039 + 006315 9999 99 99 0 9999 99 9999 + 006316 9999 99 99 0 9999 99 9999 + 006317 9999 99 99 0 9999 99 9999 + 006318 9999 99 99 0 9999 99 9999 + 006319 9999 99 99 0 9999 99 9999 + 006320 9999 99 99 0 9999 99 9999 + 006321 1216 23 01 1 303058976 04 0039 + 006322 1216 23 02 1 303058976 05 0039 + 006323 9999 99 99 0 9999 99 9999 + 006324 9999 99 99 0 9999 99 9999 + 006325 9999 99 99 0 9999 99 9999 + 006326 9999 99 99 0 9999 99 9999 + 006327 9999 99 99 0 9999 99 9999 + 006328 9999 99 99 0 9999 99 9999 + 006329 1216 24 01 1 303058976 06 0039 + 006330 1216 24 02 1 303058976 07 0039 + 006331 9999 99 99 0 9999 99 9999 + 006332 9999 99 99 0 9999 99 9999 + 006333 9999 99 99 0 9999 99 9999 + 006334 9999 99 99 0 9999 99 9999 + 006335 9999 99 99 0 9999 99 9999 + 006336 9999 99 99 0 9999 99 9999 + 006337 1216 25 01 1 305192988 00 0430 + 006338 1216 25 02 1 305192988 01 0430 + 006339 1216 25 03 1 305192988 02 0430 + 006340 1216 25 04 1 305192988 03 0430 + 006341 1216 25 05 1 305192988 04 0430 + 006342 1216 25 06 1 305192988 05 0430 + 006343 1216 25 07 1 305192988 06 0430 + 006344 1216 25 08 1 305192988 07 0430 + 006345 1216 26 01 1 305192988 08 0430 + 006346 1216 26 02 1 305192988 09 0430 + 006347 1216 26 03 1 305192988 10 0430 + 006348 1216 26 04 1 305192988 11 0430 + 006349 1216 26 05 1 305192988 12 0430 + 006350 1216 26 06 1 305192988 13 0430 + 006351 1216 26 07 1 305192988 14 0430 + 006352 1216 26 08 1 305192988 15 0430 + 006353 1216 27 01 1 305192992 00 0431 + 006354 1216 27 02 1 305192992 01 0431 + 006355 1216 27 03 1 305192992 02 0431 + 006356 1216 27 04 1 305192992 03 0431 + 006357 1216 27 05 1 305192992 04 0431 + 006358 1216 27 06 1 305192992 05 0431 + 006359 1216 27 07 1 305192992 06 0431 + 006360 1216 27 08 1 305192992 07 0431 + 006361 1216 28 01 1 305192992 08 0431 + 006362 1216 28 02 1 305192992 09 0431 + 006363 1216 28 03 1 305192992 10 0431 + 006364 1216 28 04 1 305192992 11 0431 + 006365 1216 28 05 1 305192992 12 0431 + 006366 1216 28 06 1 305192992 13 0431 + 006367 1216 28 07 1 305192992 14 0431 + 006368 1216 28 08 1 305192992 15 0431 + 006369 1216 29 01 1 305192980 00 0428 + 006370 1216 29 02 1 305192980 01 0428 + 006371 1216 29 03 1 305192980 02 0428 + 006372 1216 29 04 1 305192980 03 0428 + 006373 1216 29 05 1 305192980 04 0428 + 006374 1216 29 06 1 305192980 05 0428 + 006375 1216 29 07 1 305192980 06 0428 + 006376 1216 29 08 1 305192980 07 0428 + 006377 1216 30 01 1 305192980 08 0428 + 006378 1216 30 02 1 305192980 09 0428 + 006379 1216 30 03 1 305192980 10 0428 + 006380 1216 30 04 1 305192980 11 0428 + 006381 1216 30 05 1 305192980 12 0428 + 006382 1216 30 06 1 305192980 13 0428 + 006383 1216 30 07 1 305192980 14 0428 + 006384 1216 30 08 1 305192980 15 0428 + 006385 1216 31 01 1 305192984 00 0429 + 006386 1216 31 02 1 305192984 01 0429 + 006387 1216 31 03 1 305192984 02 0429 + 006388 1216 31 04 1 305192984 03 0429 + 006389 1216 31 05 1 305192984 04 0429 + 006390 1216 31 06 1 305192984 05 0429 + 006391 1216 31 07 1 305192984 06 0429 + 006392 1216 31 08 1 305192984 07 0429 + 006393 1216 32 01 1 305192984 08 0429 + 006394 1216 32 02 1 305192984 09 0429 + 006395 1216 32 03 1 305192984 10 0429 + 006396 1216 32 04 1 305192984 11 0429 + 006397 1216 32 05 1 305192984 12 0429 + 006398 1216 32 06 1 305192984 13 0429 + 006399 1216 32 07 1 305192984 14 0429 + 006400 1216 32 08 1 305192984 15 0429 + 006401 1216 33 01 1 306282520 00 0861 + 006402 1216 33 02 1 306282520 01 0861 + 006403 1216 33 03 1 306282520 02 0861 + 006404 1216 33 04 1 306282520 03 0861 + 006405 1216 33 05 1 306282520 04 0861 + 006406 1216 33 06 1 306282520 05 0861 + 006407 1216 33 07 1 306282520 06 0861 + 006408 1216 33 08 1 306282520 07 0861 + 006409 1216 34 01 1 306282520 08 0861 + 006410 1216 34 02 1 306282520 09 0861 + 006411 1216 34 03 1 306282520 10 0861 + 006412 1216 34 04 1 306282520 11 0861 + 006413 1216 34 05 1 306282520 12 0861 + 006414 1216 34 06 1 306282520 13 0861 + 006415 1216 34 07 1 306282520 14 0861 + 006416 1216 34 08 1 306282520 15 0861 + 006417 1216 35 01 1 306282516 00 0860 + 006418 1216 35 02 1 306282516 01 0860 + 006419 1216 35 03 1 306282516 02 0860 + 006420 1216 35 04 1 306282516 03 0860 + 006421 1216 35 05 1 306282516 04 0860 + 006422 1216 35 06 1 306282516 05 0860 + 006423 1216 35 07 1 306282516 06 0860 + 006424 1216 35 08 1 306282516 07 0860 + 006425 1216 36 01 1 306282516 08 0860 + 006426 1216 36 02 1 306282516 09 0860 + 006427 1216 36 03 1 306282516 10 0860 + 006428 1216 36 04 1 306282516 11 0860 + 006429 1216 36 05 1 306282516 12 0860 + 006430 1216 36 06 1 306282516 13 0860 + 006431 1216 36 07 1 306282516 14 0860 + 006432 1216 36 08 1 306282516 15 0860 + 006433 1216 37 01 1 306282528 00 0863 + 006434 1216 37 02 1 306282528 01 0863 + 006435 1216 37 03 1 306282528 02 0863 + 006436 1216 37 04 1 306282528 03 0863 + 006437 1216 37 05 1 306282528 04 0863 + 006438 1216 37 06 1 306282528 05 0863 + 006439 1216 37 07 1 306282528 06 0863 + 006440 1216 37 08 1 306282528 07 0863 + 006441 1216 38 01 1 306282528 08 0863 + 006442 1216 38 02 1 306282528 09 0863 + 006443 1216 38 03 1 306282528 10 0863 + 006444 1216 38 04 1 306282528 11 0863 + 006445 1216 38 05 1 306282528 12 0863 + 006446 1216 38 06 1 306282528 13 0863 + 006447 1216 38 07 1 306282528 14 0863 + 006448 1216 38 08 1 306282528 15 0863 + 006449 1216 39 01 1 306282524 00 0862 + 006450 1216 39 02 1 306282524 01 0862 + 006451 1216 39 03 1 306282524 02 0862 + 006452 1216 39 04 1 306282524 03 0862 + 006453 1216 39 05 1 306282524 04 0862 + 006454 1216 39 06 1 306282524 05 0862 + 006455 1216 39 07 1 306282524 06 0862 + 006456 1216 39 08 1 306282524 07 0862 + 006457 1216 40 01 1 306282524 08 0862 + 006458 1216 40 02 1 306282524 09 0862 + 006459 1216 40 03 1 306282524 10 0862 + 006460 1216 40 04 1 306282524 11 0862 + 006461 1216 40 05 1 306282524 12 0862 + 006462 1216 40 06 1 306282524 13 0862 + 006463 1216 40 07 1 306282524 14 0862 + 006464 1216 40 08 1 306282524 15 0862 + 006465 1216 41 01 1 304132128 08 0183 + 006466 1216 41 02 1 304132128 09 0183 + 006467 1216 41 03 1 304132128 10 0183 + 006468 1216 41 04 1 304132128 11 0183 + 006469 9999 99 99 0 9999 99 9999 + 006470 9999 99 99 0 9999 99 9999 + 006471 9999 99 99 0 9999 99 9999 + 006472 9999 99 99 0 9999 99 9999 + 006473 1216 42 01 1 304132128 12 0183 + 006474 1216 42 02 1 304132128 13 0183 + 006475 1216 42 03 1 304132128 14 0183 + 006476 1216 42 04 1 304132128 15 0183 + 006477 9999 99 99 0 9999 99 9999 + 006478 9999 99 99 0 9999 99 9999 + 006479 9999 99 99 0 9999 99 9999 + 006480 9999 99 99 0 9999 99 9999 + 006481 1216 43 01 1 304132128 00 0183 + 006482 1216 43 02 1 304132128 01 0183 + 006483 1216 43 03 1 304132128 02 0183 + 006484 1216 43 04 1 304132128 03 0183 + 006485 9999 99 99 0 9999 99 9999 + 006486 9999 99 99 0 9999 99 9999 + 006487 9999 99 99 0 9999 99 9999 + 006488 9999 99 99 0 9999 99 9999 + 006489 1216 44 01 1 304132128 04 0183 + 006490 1216 44 02 1 304132128 05 0183 + 006491 1216 44 03 1 304132128 06 0183 + 006492 1216 44 04 1 304132128 07 0183 + 006493 9999 99 99 0 9999 99 9999 + 006494 9999 99 99 0 9999 99 9999 + 006495 9999 99 99 0 9999 99 9999 + 006496 9999 99 99 0 9999 99 9999 + 006497 1216 45 01 1 304132124 08 0182 + 006498 1216 45 02 1 304132124 09 0182 + 006499 1216 45 03 1 304132124 10 0182 + 006500 1216 45 04 1 304132124 11 0182 + 006501 9999 99 99 0 9999 99 9999 + 006502 9999 99 99 0 9999 99 9999 + 006503 9999 99 99 0 9999 99 9999 + 006504 9999 99 99 0 9999 99 9999 + 006505 1216 46 01 1 304132124 12 0182 + 006506 1216 46 02 1 304132124 13 0182 + 006507 1216 46 03 1 304132124 14 0182 + 006508 1216 46 04 1 304132124 15 0182 + 006509 9999 99 99 0 9999 99 9999 + 006510 9999 99 99 0 9999 99 9999 + 006511 9999 99 99 0 9999 99 9999 + 006512 9999 99 99 0 9999 99 9999 + 006513 1216 47 01 1 304132124 00 0182 + 006514 1216 47 02 1 304132124 01 0182 + 006515 1216 47 03 1 304132124 02 0182 + 006516 1216 47 04 1 304132124 03 0182 + 006517 9999 99 99 0 9999 99 9999 + 006518 9999 99 99 0 9999 99 9999 + 006519 9999 99 99 0 9999 99 9999 + 006520 9999 99 99 0 9999 99 9999 + 006521 1216 48 01 1 304132124 04 0182 + 006522 1216 48 02 1 304132124 05 0182 + 006523 1216 48 03 1 304132124 06 0182 + 006524 1216 48 04 1 304132124 07 0182 + 006525 9999 99 99 0 9999 99 9999 + 006526 9999 99 99 0 9999 99 9999 + 006527 9999 99 99 0 9999 99 9999 + 006528 9999 99 99 0 9999 99 9999 + 006529 1217 01 01 1 303058964 08 0036 + 006530 1217 01 02 1 303058964 09 0036 + 006531 9999 99 99 0 9999 99 9999 + 006532 9999 99 99 0 9999 99 9999 + 006533 9999 99 99 0 9999 99 9999 + 006534 9999 99 99 0 9999 99 9999 + 006535 9999 99 99 0 9999 99 9999 + 006536 9999 99 99 0 9999 99 9999 + 006537 1217 02 01 1 303058964 10 0036 + 006538 1217 02 02 1 303058964 11 0036 + 006539 9999 99 99 0 9999 99 9999 + 006540 9999 99 99 0 9999 99 9999 + 006541 9999 99 99 0 9999 99 9999 + 006542 9999 99 99 0 9999 99 9999 + 006543 9999 99 99 0 9999 99 9999 + 006544 9999 99 99 0 9999 99 9999 + 006545 1217 03 01 1 303058964 12 0036 + 006546 1217 03 02 1 303058964 13 0036 + 006547 9999 99 99 0 9999 99 9999 + 006548 9999 99 99 0 9999 99 9999 + 006549 9999 99 99 0 9999 99 9999 + 006550 9999 99 99 0 9999 99 9999 + 006551 9999 99 99 0 9999 99 9999 + 006552 9999 99 99 0 9999 99 9999 + 006553 1217 04 01 1 303058964 14 0036 + 006554 1217 04 02 1 303058964 15 0036 + 006555 9999 99 99 0 9999 99 9999 + 006556 9999 99 99 0 9999 99 9999 + 006557 9999 99 99 0 9999 99 9999 + 006558 9999 99 99 0 9999 99 9999 + 006559 9999 99 99 0 9999 99 9999 + 006560 9999 99 99 0 9999 99 9999 + 006561 1217 05 01 1 303058964 00 0036 + 006562 1217 05 02 1 303058964 01 0036 + 006563 9999 99 99 0 9999 99 9999 + 006564 9999 99 99 0 9999 99 9999 + 006565 9999 99 99 0 9999 99 9999 + 006566 9999 99 99 0 9999 99 9999 + 006567 9999 99 99 0 9999 99 9999 + 006568 9999 99 99 0 9999 99 9999 + 006569 1217 06 01 1 303058964 02 0036 + 006570 1217 06 02 1 303058964 03 0036 + 006571 9999 99 99 0 9999 99 9999 + 006572 9999 99 99 0 9999 99 9999 + 006573 9999 99 99 0 9999 99 9999 + 006574 9999 99 99 0 9999 99 9999 + 006575 9999 99 99 0 9999 99 9999 + 006576 9999 99 99 0 9999 99 9999 + 006577 1217 07 01 1 303058964 04 0036 + 006578 1217 07 02 1 303058964 05 0036 + 006579 9999 99 99 0 9999 99 9999 + 006580 9999 99 99 0 9999 99 9999 + 006581 9999 99 99 0 9999 99 9999 + 006582 9999 99 99 0 9999 99 9999 + 006583 9999 99 99 0 9999 99 9999 + 006584 9999 99 99 0 9999 99 9999 + 006585 1217 08 01 1 303058964 06 0036 + 006586 1217 08 02 1 303058964 07 0036 + 006587 9999 99 99 0 9999 99 9999 + 006588 9999 99 99 0 9999 99 9999 + 006589 9999 99 99 0 9999 99 9999 + 006590 9999 99 99 0 9999 99 9999 + 006591 9999 99 99 0 9999 99 9999 + 006592 9999 99 99 0 9999 99 9999 + 006593 1217 09 01 1 304136216 00 0189 + 006594 1217 09 02 1 304136216 01 0189 + 006595 1217 09 03 1 304136216 02 0189 + 006596 1217 09 04 1 304136216 03 0189 + 006597 9999 99 99 0 9999 99 9999 + 006598 9999 99 99 0 9999 99 9999 + 006599 9999 99 99 0 9999 99 9999 + 006600 9999 99 99 0 9999 99 9999 + 006601 1217 10 01 1 304136216 04 0189 + 006602 1217 10 02 1 304136216 05 0189 + 006603 1217 10 03 1 304136216 06 0189 + 006604 1217 10 04 1 304136216 07 0189 + 006605 9999 99 99 0 9999 99 9999 + 006606 9999 99 99 0 9999 99 9999 + 006607 9999 99 99 0 9999 99 9999 + 006608 9999 99 99 0 9999 99 9999 + 006609 1217 11 01 1 304136216 08 0189 + 006610 1217 11 02 1 304136216 09 0189 + 006611 1217 11 03 1 304136216 10 0189 + 006612 1217 11 04 1 304136216 11 0189 + 006613 9999 99 99 0 9999 99 9999 + 006614 9999 99 99 0 9999 99 9999 + 006615 9999 99 99 0 9999 99 9999 + 006616 9999 99 99 0 9999 99 9999 + 006617 1217 12 01 1 304136216 12 0189 + 006618 1217 12 02 1 304136216 13 0189 + 006619 1217 12 03 1 304136216 14 0189 + 006620 1217 12 04 1 304136216 15 0189 + 006621 9999 99 99 0 9999 99 9999 + 006622 9999 99 99 0 9999 99 9999 + 006623 9999 99 99 0 9999 99 9999 + 006624 9999 99 99 0 9999 99 9999 + 006625 1217 13 01 1 304136212 08 0188 + 006626 1217 13 02 1 304136212 09 0188 + 006627 1217 13 03 1 304136212 10 0188 + 006628 1217 13 04 1 304136212 11 0188 + 006629 9999 99 99 0 9999 99 9999 + 006630 9999 99 99 0 9999 99 9999 + 006631 9999 99 99 0 9999 99 9999 + 006632 9999 99 99 0 9999 99 9999 + 006633 1217 14 01 1 304136212 12 0188 + 006634 1217 14 02 1 304136212 13 0188 + 006635 1217 14 03 1 304136212 14 0188 + 006636 1217 14 04 1 304136212 15 0188 + 006637 9999 99 99 0 9999 99 9999 + 006638 9999 99 99 0 9999 99 9999 + 006639 9999 99 99 0 9999 99 9999 + 006640 9999 99 99 0 9999 99 9999 + 006641 1217 15 01 1 304136212 00 0188 + 006642 1217 15 02 1 304136212 01 0188 + 006643 1217 15 03 1 304136212 02 0188 + 006644 1217 15 04 1 304136212 03 0188 + 006645 9999 99 99 0 9999 99 9999 + 006646 9999 99 99 0 9999 99 9999 + 006647 9999 99 99 0 9999 99 9999 + 006648 9999 99 99 0 9999 99 9999 + 006649 1217 16 01 1 304136212 04 0188 + 006650 1217 16 02 1 304136212 05 0188 + 006651 1217 16 03 1 304136212 06 0188 + 006652 1217 16 04 1 304136212 07 0188 + 006653 9999 99 99 0 9999 99 9999 + 006654 9999 99 99 0 9999 99 9999 + 006655 9999 99 99 0 9999 99 9999 + 006656 9999 99 99 0 9999 99 9999 + 006657 1217 17 01 1 306286620 00 0870 + 006658 1217 17 02 1 306286620 01 0870 + 006659 1217 17 03 1 306286620 02 0870 + 006660 1217 17 04 1 306286620 03 0870 + 006661 1217 17 05 1 306286620 04 0870 + 006662 1217 17 06 1 306286620 05 0870 + 006663 1217 17 07 1 306286620 06 0870 + 006664 1217 17 08 1 306286620 07 0870 + 006665 1217 18 01 1 306286620 08 0870 + 006666 1217 18 02 1 306286620 09 0870 + 006667 1217 18 03 1 306286620 10 0870 + 006668 1217 18 04 1 306286620 11 0870 + 006669 1217 18 05 1 306286620 12 0870 + 006670 1217 18 06 1 306286620 13 0870 + 006671 1217 18 07 1 306286620 14 0870 + 006672 1217 18 08 1 306286620 15 0870 + 006673 1217 19 01 1 306286624 00 0871 + 006674 1217 19 02 1 306286624 01 0871 + 006675 1217 19 03 1 306286624 02 0871 + 006676 1217 19 04 1 306286624 03 0871 + 006677 1217 19 05 1 306286624 04 0871 + 006678 1217 19 06 1 306286624 05 0871 + 006679 1217 19 07 1 306286624 06 0871 + 006680 1217 19 08 1 306286624 07 0871 + 006681 1217 20 01 1 306286624 08 0871 + 006682 1217 20 02 1 306286624 09 0871 + 006683 1217 20 03 1 306286624 10 0871 + 006684 1217 20 04 1 306286624 11 0871 + 006685 1217 20 05 1 306286624 12 0871 + 006686 1217 20 06 1 306286624 13 0871 + 006687 1217 20 07 1 306286624 14 0871 + 006688 1217 20 08 1 306286624 15 0871 + 006689 1217 21 01 1 306286612 00 0868 + 006690 1217 21 02 1 306286612 01 0868 + 006691 1217 21 03 1 306286612 02 0868 + 006692 1217 21 04 1 306286612 03 0868 + 006693 1217 21 05 1 306286612 04 0868 + 006694 1217 21 06 1 306286612 05 0868 + 006695 1217 21 07 1 306286612 06 0868 + 006696 1217 21 08 1 306286612 07 0868 + 006697 1217 22 01 1 306286612 08 0868 + 006698 1217 22 02 1 306286612 09 0868 + 006699 1217 22 03 1 306286612 10 0868 + 006700 1217 22 04 1 306286612 11 0868 + 006701 1217 22 05 1 306286612 12 0868 + 006702 1217 22 06 1 306286612 13 0868 + 006703 1217 22 07 1 306286612 14 0868 + 006704 1217 22 08 1 306286612 15 0868 + 006705 1217 23 01 1 306286616 00 0869 + 006706 1217 23 02 1 306286616 01 0869 + 006707 1217 23 03 1 306286616 02 0869 + 006708 1217 23 04 1 306286616 03 0869 + 006709 1217 23 05 1 306286616 04 0869 + 006710 1217 23 06 1 306286616 05 0869 + 006711 1217 23 07 1 306286616 06 0869 + 006712 1217 23 08 1 306286616 07 0869 + 006713 1217 24 01 1 306286616 08 0869 + 006714 1217 24 02 1 306286616 09 0869 + 006715 1217 24 03 1 306286616 10 0869 + 006716 1217 24 04 1 306286616 11 0869 + 006717 1217 24 05 1 306286616 12 0869 + 006718 1217 24 06 1 306286616 13 0869 + 006719 1217 24 07 1 306286616 14 0869 + 006720 1217 24 08 1 306286616 15 0869 + 006721 1217 25 01 1 303058968 08 0037 + 006722 1217 25 02 1 303058968 09 0037 + 006723 9999 99 99 0 9999 99 9999 + 006724 9999 99 99 0 9999 99 9999 + 006725 9999 99 99 0 9999 99 9999 + 006726 9999 99 99 0 9999 99 9999 + 006727 9999 99 99 0 9999 99 9999 + 006728 9999 99 99 0 9999 99 9999 + 006729 1217 26 01 1 303058968 10 0037 + 006730 1217 26 02 1 303058968 11 0037 + 006731 9999 99 99 0 9999 99 9999 + 006732 9999 99 99 0 9999 99 9999 + 006733 9999 99 99 0 9999 99 9999 + 006734 9999 99 99 0 9999 99 9999 + 006735 9999 99 99 0 9999 99 9999 + 006736 9999 99 99 0 9999 99 9999 + 006737 1217 27 01 1 303058968 12 0037 + 006738 1217 27 02 1 303058968 13 0037 + 006739 9999 99 99 0 9999 99 9999 + 006740 9999 99 99 0 9999 99 9999 + 006741 9999 99 99 0 9999 99 9999 + 006742 9999 99 99 0 9999 99 9999 + 006743 9999 99 99 0 9999 99 9999 + 006744 9999 99 99 0 9999 99 9999 + 006745 1217 28 01 1 303058968 14 0037 + 006746 1217 28 02 1 303058968 15 0037 + 006747 9999 99 99 0 9999 99 9999 + 006748 9999 99 99 0 9999 99 9999 + 006749 9999 99 99 0 9999 99 9999 + 006750 9999 99 99 0 9999 99 9999 + 006751 9999 99 99 0 9999 99 9999 + 006752 9999 99 99 0 9999 99 9999 + 006753 1217 29 01 1 303058968 04 0037 + 006754 1217 29 02 1 303058968 05 0037 + 006755 9999 99 99 0 9999 99 9999 + 006756 9999 99 99 0 9999 99 9999 + 006757 9999 99 99 0 9999 99 9999 + 006758 9999 99 99 0 9999 99 9999 + 006759 9999 99 99 0 9999 99 9999 + 006760 9999 99 99 0 9999 99 9999 + 006761 1217 30 01 1 303058968 06 0037 + 006762 1217 30 02 1 303058968 07 0037 + 006763 9999 99 99 0 9999 99 9999 + 006764 9999 99 99 0 9999 99 9999 + 006765 9999 99 99 0 9999 99 9999 + 006766 9999 99 99 0 9999 99 9999 + 006767 9999 99 99 0 9999 99 9999 + 006768 9999 99 99 0 9999 99 9999 + 006769 1217 31 01 1 303058968 00 0037 + 006770 1217 31 02 1 303058968 01 0037 + 006771 9999 99 99 0 9999 99 9999 + 006772 9999 99 99 0 9999 99 9999 + 006773 9999 99 99 0 9999 99 9999 + 006774 9999 99 99 0 9999 99 9999 + 006775 9999 99 99 0 9999 99 9999 + 006776 9999 99 99 0 9999 99 9999 + 006777 1217 32 01 1 303058968 02 0037 + 006778 1217 32 02 1 303058968 03 0037 + 006779 9999 99 99 0 9999 99 9999 + 006780 9999 99 99 0 9999 99 9999 + 006781 9999 99 99 0 9999 99 9999 + 006782 9999 99 99 0 9999 99 9999 + 006783 9999 99 99 0 9999 99 9999 + 006784 9999 99 99 0 9999 99 9999 + 006785 1217 33 01 1 306290716 00 0878 + 006786 1217 33 02 1 306290716 01 0878 + 006787 1217 33 03 1 306290716 02 0878 + 006788 1217 33 04 1 306290716 03 0878 + 006789 1217 33 05 1 306290716 04 0878 + 006790 1217 33 06 1 306290716 05 0878 + 006791 1217 33 07 1 306290716 06 0878 + 006792 1217 33 08 1 306290716 07 0878 + 006793 1217 34 01 1 306290716 08 0878 + 006794 1217 34 02 1 306290716 09 0878 + 006795 1217 34 03 1 306290716 10 0878 + 006796 1217 34 04 1 306290716 11 0878 + 006797 1217 34 05 1 306290716 12 0878 + 006798 1217 34 06 1 306290716 13 0878 + 006799 1217 34 07 1 306290716 14 0878 + 006800 1217 34 08 1 306290716 15 0878 + 006801 1217 35 01 1 306290720 00 0879 + 006802 1217 35 02 1 306290720 01 0879 + 006803 1217 35 03 1 306290720 02 0879 + 006804 1217 35 04 1 306290720 03 0879 + 006805 1217 35 05 1 306290720 04 0879 + 006806 1217 35 06 1 306290720 05 0879 + 006807 1217 35 07 1 306290720 06 0879 + 006808 1217 35 08 1 306290720 07 0879 + 006809 1217 36 01 1 306290720 08 0879 + 006810 1217 36 02 1 306290720 09 0879 + 006811 1217 36 03 1 306290720 10 0879 + 006812 1217 36 04 1 306290720 11 0879 + 006813 1217 36 05 1 306290720 12 0879 + 006814 1217 36 06 1 306290720 13 0879 + 006815 1217 36 07 1 306290720 14 0879 + 006816 1217 36 08 1 306290720 15 0879 + 006817 1217 37 01 1 306290708 00 0876 + 006818 1217 37 02 1 306290708 01 0876 + 006819 1217 37 03 1 306290708 02 0876 + 006820 1217 37 04 1 306290708 03 0876 + 006821 1217 37 05 1 306290708 04 0876 + 006822 1217 37 06 1 306290708 05 0876 + 006823 1217 37 07 1 306290708 06 0876 + 006824 1217 37 08 1 306290708 07 0876 + 006825 1217 38 01 1 306290708 08 0876 + 006826 1217 38 02 1 306290708 09 0876 + 006827 1217 38 03 1 306290708 10 0876 + 006828 1217 38 04 1 306290708 11 0876 + 006829 1217 38 05 1 306290708 12 0876 + 006830 1217 38 06 1 306290708 13 0876 + 006831 1217 38 07 1 306290708 14 0876 + 006832 1217 38 08 1 306290708 15 0876 + 006833 1217 39 01 1 306290712 00 0877 + 006834 1217 39 02 1 306290712 01 0877 + 006835 1217 39 03 1 306290712 02 0877 + 006836 1217 39 04 1 306290712 03 0877 + 006837 1217 39 05 1 306290712 04 0877 + 006838 1217 39 06 1 306290712 05 0877 + 006839 1217 39 07 1 306290712 06 0877 + 006840 1217 39 08 1 306290712 07 0877 + 006841 1217 40 01 1 306290712 08 0877 + 006842 1217 40 02 1 306290712 09 0877 + 006843 1217 40 03 1 306290712 10 0877 + 006844 1217 40 04 1 306290712 11 0877 + 006845 1217 40 05 1 306290712 12 0877 + 006846 1217 40 06 1 306290712 13 0877 + 006847 1217 40 07 1 306290712 14 0877 + 006848 1217 40 08 1 306290712 15 0877 + 006849 1217 41 01 1 304136220 00 0190 + 006850 1217 41 02 1 304136220 01 0190 + 006851 1217 41 03 1 304136220 02 0190 + 006852 1217 41 04 1 304136220 03 0190 + 006853 9999 99 99 0 9999 99 9999 + 006854 9999 99 99 0 9999 99 9999 + 006855 9999 99 99 0 9999 99 9999 + 006856 9999 99 99 0 9999 99 9999 + 006857 1217 42 01 1 304136220 04 0190 + 006858 1217 42 02 1 304136220 05 0190 + 006859 1217 42 03 1 304136220 06 0190 + 006860 1217 42 04 1 304136220 07 0190 + 006861 9999 99 99 0 9999 99 9999 + 006862 9999 99 99 0 9999 99 9999 + 006863 9999 99 99 0 9999 99 9999 + 006864 9999 99 99 0 9999 99 9999 + 006865 1217 43 01 1 304136220 08 0190 + 006866 1217 43 02 1 304136220 09 0190 + 006867 1217 43 03 1 304136220 10 0190 + 006868 1217 43 04 1 304136220 11 0190 + 006869 9999 99 99 0 9999 99 9999 + 006870 9999 99 99 0 9999 99 9999 + 006871 9999 99 99 0 9999 99 9999 + 006872 9999 99 99 0 9999 99 9999 + 006873 1217 44 01 1 304136220 12 0190 + 006874 1217 44 02 1 304136220 13 0190 + 006875 1217 44 03 1 304136220 14 0190 + 006876 1217 44 04 1 304136220 15 0190 + 006877 9999 99 99 0 9999 99 9999 + 006878 9999 99 99 0 9999 99 9999 + 006879 9999 99 99 0 9999 99 9999 + 006880 9999 99 99 0 9999 99 9999 + 006881 1217 45 01 1 304136224 00 0191 + 006882 1217 45 02 1 304136224 01 0191 + 006883 1217 45 03 1 304136224 02 0191 + 006884 1217 45 04 1 304136224 03 0191 + 006885 9999 99 99 0 9999 99 9999 + 006886 9999 99 99 0 9999 99 9999 + 006887 9999 99 99 0 9999 99 9999 + 006888 9999 99 99 0 9999 99 9999 + 006889 1217 46 01 1 304136224 04 0191 + 006890 1217 46 02 1 304136224 05 0191 + 006891 1217 46 03 1 304136224 06 0191 + 006892 1217 46 04 1 304136224 07 0191 + 006893 9999 99 99 0 9999 99 9999 + 006894 9999 99 99 0 9999 99 9999 + 006895 9999 99 99 0 9999 99 9999 + 006896 9999 99 99 0 9999 99 9999 + 006897 1217 47 01 1 304136224 08 0191 + 006898 1217 47 02 1 304136224 09 0191 + 006899 1217 47 03 1 304136224 10 0191 + 006900 1217 47 04 1 304136224 11 0191 + 006901 9999 99 99 0 9999 99 9999 + 006902 9999 99 99 0 9999 99 9999 + 006903 9999 99 99 0 9999 99 9999 + 006904 9999 99 99 0 9999 99 9999 + 006905 1217 48 01 1 304136224 12 0191 + 006906 1217 48 02 1 304136224 13 0191 + 006907 1217 48 03 1 304136224 14 0191 + 006908 1217 48 04 1 304136224 15 0191 + 006909 9999 99 99 0 9999 99 9999 + 006910 9999 99 99 0 9999 99 9999 + 006911 9999 99 99 0 9999 99 9999 + 006912 9999 99 99 0 9999 99 9999 + 006913 1218 01 01 1 306294808 00 0885 + 006914 1218 01 02 1 306294808 01 0885 + 006915 1218 01 03 1 306294808 02 0885 + 006916 1218 01 04 1 306294808 03 0885 + 006917 1218 01 05 1 306294808 04 0885 + 006918 1218 01 06 1 306294808 05 0885 + 006919 1218 01 07 1 306294808 06 0885 + 006920 1218 01 08 1 306294808 07 0885 + 006921 1218 02 01 1 306294808 08 0885 + 006922 1218 02 02 1 306294808 09 0885 + 006923 1218 02 03 1 306294808 10 0885 + 006924 1218 02 04 1 306294808 11 0885 + 006925 1218 02 05 1 306294808 12 0885 + 006926 1218 02 06 1 306294808 13 0885 + 006927 1218 02 07 1 306294808 14 0885 + 006928 1218 02 08 1 306294808 15 0885 + 006929 1218 03 01 1 306294804 00 0884 + 006930 1218 03 02 1 306294804 01 0884 + 006931 1218 03 03 1 306294804 02 0884 + 006932 1218 03 04 1 306294804 03 0884 + 006933 1218 03 05 1 306294804 04 0884 + 006934 1218 03 06 1 306294804 05 0884 + 006935 1218 03 07 1 306294804 06 0884 + 006936 1218 03 08 1 306294804 07 0884 + 006937 1218 04 01 1 306294804 08 0884 + 006938 1218 04 02 1 306294804 09 0884 + 006939 1218 04 03 1 306294804 10 0884 + 006940 1218 04 04 1 306294804 11 0884 + 006941 1218 04 05 1 306294804 12 0884 + 006942 1218 04 06 1 306294804 13 0884 + 006943 1218 04 07 1 306294804 14 0884 + 006944 1218 04 08 1 306294804 15 0884 + 006945 1218 05 01 1 306294816 00 0887 + 006946 1218 05 02 1 306294816 01 0887 + 006947 1218 05 03 1 306294816 02 0887 + 006948 1218 05 04 1 306294816 03 0887 + 006949 1218 05 05 1 306294816 04 0887 + 006950 1218 05 06 1 306294816 05 0887 + 006951 1218 05 07 1 306294816 06 0887 + 006952 1218 05 08 1 306294816 07 0887 + 006953 1218 06 01 1 306294816 08 0887 + 006954 1218 06 02 1 306294816 09 0887 + 006955 1218 06 03 1 306294816 10 0887 + 006956 1218 06 04 1 306294816 11 0887 + 006957 1218 06 05 1 306294816 12 0887 + 006958 1218 06 06 1 306294816 13 0887 + 006959 1218 06 07 1 306294816 14 0887 + 006960 1218 06 08 1 306294816 15 0887 + 006961 1218 07 01 1 306294812 00 0886 + 006962 1218 07 02 1 306294812 01 0886 + 006963 1218 07 03 1 306294812 02 0886 + 006964 1218 07 04 1 306294812 03 0886 + 006965 1218 07 05 1 306294812 04 0886 + 006966 1218 07 06 1 306294812 05 0886 + 006967 1218 07 07 1 306294812 06 0886 + 006968 1218 07 08 1 306294812 07 0886 + 006969 1218 08 01 1 306294812 08 0886 + 006970 1218 08 02 1 306294812 09 0886 + 006971 1218 08 03 1 306294812 10 0886 + 006972 1218 08 04 1 306294812 11 0886 + 006973 1218 08 05 1 306294812 12 0886 + 006974 1218 08 06 1 306294812 13 0886 + 006975 1218 08 07 1 306294812 14 0886 + 006976 1218 08 08 1 306294812 15 0886 + 006977 1218 09 01 1 303063072 12 0047 + 006978 1218 09 02 1 303063072 13 0047 + 006979 9999 99 99 0 9999 99 9999 + 006980 9999 99 99 0 9999 99 9999 + 006981 9999 99 99 0 9999 99 9999 + 006982 9999 99 99 0 9999 99 9999 + 006983 9999 99 99 0 9999 99 9999 + 006984 9999 99 99 0 9999 99 9999 + 006985 1218 10 01 1 303063072 14 0047 + 006986 1218 10 02 1 303063072 15 0047 + 006987 9999 99 99 0 9999 99 9999 + 006988 9999 99 99 0 9999 99 9999 + 006989 9999 99 99 0 9999 99 9999 + 006990 9999 99 99 0 9999 99 9999 + 006991 9999 99 99 0 9999 99 9999 + 006992 9999 99 99 0 9999 99 9999 + 006993 1218 11 01 1 303063072 08 0047 + 006994 1218 11 02 1 303063072 09 0047 + 006995 9999 99 99 0 9999 99 9999 + 006996 9999 99 99 0 9999 99 9999 + 006997 9999 99 99 0 9999 99 9999 + 006998 9999 99 99 0 9999 99 9999 + 006999 9999 99 99 0 9999 99 9999 + 007000 9999 99 99 0 9999 99 9999 + 007001 1218 12 01 1 303063072 10 0047 + 007002 1218 12 02 1 303063072 11 0047 + 007003 9999 99 99 0 9999 99 9999 + 007004 9999 99 99 0 9999 99 9999 + 007005 9999 99 99 0 9999 99 9999 + 007006 9999 99 99 0 9999 99 9999 + 007007 9999 99 99 0 9999 99 9999 + 007008 9999 99 99 0 9999 99 9999 + 007009 1218 13 01 1 303063072 00 0047 + 007010 1218 13 02 1 303063072 01 0047 + 007011 9999 99 99 0 9999 99 9999 + 007012 9999 99 99 0 9999 99 9999 + 007013 9999 99 99 0 9999 99 9999 + 007014 9999 99 99 0 9999 99 9999 + 007015 9999 99 99 0 9999 99 9999 + 007016 9999 99 99 0 9999 99 9999 + 007017 1218 14 01 1 303063072 02 0047 + 007018 1218 14 02 1 303063072 03 0047 + 007019 9999 99 99 0 9999 99 9999 + 007020 9999 99 99 0 9999 99 9999 + 007021 9999 99 99 0 9999 99 9999 + 007022 9999 99 99 0 9999 99 9999 + 007023 9999 99 99 0 9999 99 9999 + 007024 9999 99 99 0 9999 99 9999 + 007025 1218 15 01 1 303063072 04 0047 + 007026 1218 15 02 1 303063072 05 0047 + 007027 9999 99 99 0 9999 99 9999 + 007028 9999 99 99 0 9999 99 9999 + 007029 9999 99 99 0 9999 99 9999 + 007030 9999 99 99 0 9999 99 9999 + 007031 9999 99 99 0 9999 99 9999 + 007032 9999 99 99 0 9999 99 9999 + 007033 1218 16 01 1 303063072 06 0047 + 007034 1218 16 02 1 303063072 07 0047 + 007035 9999 99 99 0 9999 99 9999 + 007036 9999 99 99 0 9999 99 9999 + 007037 9999 99 99 0 9999 99 9999 + 007038 9999 99 99 0 9999 99 9999 + 007039 9999 99 99 0 9999 99 9999 + 007040 9999 99 99 0 9999 99 9999 + 007041 1218 17 01 1 305205276 00 0454 + 007042 1218 17 02 1 305205276 01 0454 + 007043 1218 17 03 1 305205276 02 0454 + 007044 1218 17 04 1 305205276 03 0454 + 007045 1218 17 05 1 305205276 04 0454 + 007046 1218 17 06 1 305205276 05 0454 + 007047 1218 17 07 1 305205276 06 0454 + 007048 1218 17 08 1 305205276 07 0454 + 007049 1218 18 01 1 305205276 08 0454 + 007050 1218 18 02 1 305205276 09 0454 + 007051 1218 18 03 1 305205276 10 0454 + 007052 1218 18 04 1 305205276 11 0454 + 007053 1218 18 05 1 305205276 12 0454 + 007054 1218 18 06 1 305205276 13 0454 + 007055 1218 18 07 1 305205276 14 0454 + 007056 1218 18 08 1 305205276 15 0454 + 007057 1218 19 01 1 305205280 00 0455 + 007058 1218 19 02 1 305205280 01 0455 + 007059 1218 19 03 1 305205280 02 0455 + 007060 1218 19 04 1 305205280 03 0455 + 007061 1218 19 05 1 305205280 04 0455 + 007062 1218 19 06 1 305205280 05 0455 + 007063 1218 19 07 1 305205280 06 0455 + 007064 1218 19 08 1 305205280 07 0455 + 007065 1218 20 01 1 305205280 08 0455 + 007066 1218 20 02 1 305205280 09 0455 + 007067 1218 20 03 1 305205280 10 0455 + 007068 1218 20 04 1 305205280 11 0455 + 007069 1218 20 05 1 305205280 12 0455 + 007070 1218 20 06 1 305205280 13 0455 + 007071 1218 20 07 1 305205280 14 0455 + 007072 1218 20 08 1 305205280 15 0455 + 007073 1218 21 01 1 305205268 00 0452 + 007074 1218 21 02 1 305205268 01 0452 + 007075 1218 21 03 1 305205268 02 0452 + 007076 1218 21 04 1 305205268 03 0452 + 007077 1218 21 05 1 305205268 04 0452 + 007078 1218 21 06 1 305205268 05 0452 + 007079 1218 21 07 1 305205268 06 0452 + 007080 1218 21 08 1 305205268 07 0452 + 007081 1218 22 01 1 305205268 08 0452 + 007082 1218 22 02 1 305205268 09 0452 + 007083 1218 22 03 1 305205268 10 0452 + 007084 1218 22 04 1 305205268 11 0452 + 007085 1218 22 05 1 305205268 12 0452 + 007086 1218 22 06 1 305205268 13 0452 + 007087 1218 22 07 1 305205268 14 0452 + 007088 1218 22 08 1 305205268 15 0452 + 007089 1218 23 01 1 305205272 00 0453 + 007090 1218 23 02 1 305205272 01 0453 + 007091 1218 23 03 1 305205272 02 0453 + 007092 1218 23 04 1 305205272 03 0453 + 007093 1218 23 05 1 305205272 04 0453 + 007094 1218 23 06 1 305205272 05 0453 + 007095 1218 23 07 1 305205272 06 0453 + 007096 1218 23 08 1 305205272 07 0453 + 007097 1218 24 01 1 305205272 08 0453 + 007098 1218 24 02 1 305205272 09 0453 + 007099 1218 24 03 1 305205272 10 0453 + 007100 1218 24 04 1 305205272 11 0453 + 007101 1218 24 05 1 305205272 12 0453 + 007102 1218 24 06 1 305205272 13 0453 + 007103 1218 24 07 1 305205272 14 0453 + 007104 1218 24 08 1 305205272 15 0453 + 007105 1218 25 01 1 306298904 00 0893 + 007106 1218 25 02 1 306298904 01 0893 + 007107 1218 25 03 1 306298904 02 0893 + 007108 1218 25 04 1 306298904 03 0893 + 007109 1218 25 05 1 306298904 04 0893 + 007110 1218 25 06 1 306298904 05 0893 + 007111 1218 25 07 1 306298904 06 0893 + 007112 1218 25 08 1 306298904 07 0893 + 007113 1218 26 01 1 306298904 08 0893 + 007114 1218 26 02 1 306298904 09 0893 + 007115 1218 26 03 1 306298904 10 0893 + 007116 1218 26 04 1 306298904 11 0893 + 007117 1218 26 05 1 306298904 12 0893 + 007118 1218 26 06 1 306298904 13 0893 + 007119 1218 26 07 1 306298904 14 0893 + 007120 1218 26 08 1 306298904 15 0893 + 007121 1218 27 01 1 306298900 00 0892 + 007122 1218 27 02 1 306298900 01 0892 + 007123 1218 27 03 1 306298900 02 0892 + 007124 1218 27 04 1 306298900 03 0892 + 007125 1218 27 05 1 306298900 04 0892 + 007126 1218 27 06 1 306298900 05 0892 + 007127 1218 27 07 1 306298900 06 0892 + 007128 1218 27 08 1 306298900 07 0892 + 007129 1218 28 01 1 306298900 08 0892 + 007130 1218 28 02 1 306298900 09 0892 + 007131 1218 28 03 1 306298900 10 0892 + 007132 1218 28 04 1 306298900 11 0892 + 007133 1218 28 05 1 306298900 12 0892 + 007134 1218 28 06 1 306298900 13 0892 + 007135 1218 28 07 1 306298900 14 0892 + 007136 1218 28 08 1 306298900 15 0892 + 007137 1218 29 01 1 306298912 00 0895 + 007138 1218 29 02 1 306298912 01 0895 + 007139 1218 29 03 1 306298912 02 0895 + 007140 1218 29 04 1 306298912 03 0895 + 007141 1218 29 05 1 306298912 04 0895 + 007142 1218 29 06 1 306298912 05 0895 + 007143 1218 29 07 1 306298912 06 0895 + 007144 1218 29 08 1 306298912 07 0895 + 007145 1218 30 01 1 306298912 08 0895 + 007146 1218 30 02 1 306298912 09 0895 + 007147 1218 30 03 1 306298912 10 0895 + 007148 1218 30 04 1 306298912 11 0895 + 007149 1218 30 05 1 306298912 12 0895 + 007150 1218 30 06 1 306298912 13 0895 + 007151 1218 30 07 1 306298912 14 0895 + 007152 1218 30 08 1 306298912 15 0895 + 007153 1218 31 01 1 306298908 00 0894 + 007154 1218 31 02 1 306298908 01 0894 + 007155 1218 31 03 1 306298908 02 0894 + 007156 1218 31 04 1 306298908 03 0894 + 007157 1218 31 05 1 306298908 04 0894 + 007158 1218 31 06 1 306298908 05 0894 + 007159 1218 31 07 1 306298908 06 0894 + 007160 1218 31 08 1 306298908 07 0894 + 007161 1218 32 01 1 306298908 08 0894 + 007162 1218 32 02 1 306298908 09 0894 + 007163 1218 32 03 1 306298908 10 0894 + 007164 1218 32 04 1 306298908 11 0894 + 007165 1218 32 05 1 306298908 12 0894 + 007166 1218 32 06 1 306298908 13 0894 + 007167 1218 32 07 1 306298908 14 0894 + 007168 1218 32 08 1 306298908 15 0894 + 007169 1218 33 01 1 305209372 00 0462 + 007170 1218 33 02 1 305209372 01 0462 + 007171 1218 33 03 1 305209372 02 0462 + 007172 1218 33 04 1 305209372 03 0462 + 007173 1218 33 05 1 305209372 04 0462 + 007174 1218 33 06 1 305209372 05 0462 + 007175 1218 33 07 1 305209372 06 0462 + 007176 1218 33 08 1 305209372 07 0462 + 007177 1218 34 01 1 305209372 08 0462 + 007178 1218 34 02 1 305209372 09 0462 + 007179 1218 34 03 1 305209372 10 0462 + 007180 1218 34 04 1 305209372 11 0462 + 007181 1218 34 05 1 305209372 12 0462 + 007182 1218 34 06 1 305209372 13 0462 + 007183 1218 34 07 1 305209372 14 0462 + 007184 1218 34 08 1 305209372 15 0462 + 007185 1218 35 01 1 305209376 00 0463 + 007186 1218 35 02 1 305209376 01 0463 + 007187 1218 35 03 1 305209376 02 0463 + 007188 1218 35 04 1 305209376 03 0463 + 007189 1218 35 05 1 305209376 04 0463 + 007190 1218 35 06 1 305209376 05 0463 + 007191 1218 35 07 1 305209376 06 0463 + 007192 1218 35 08 1 305209376 07 0463 + 007193 1218 36 01 1 305209376 08 0463 + 007194 1218 36 02 1 305209376 09 0463 + 007195 1218 36 03 1 305209376 10 0463 + 007196 1218 36 04 1 305209376 11 0463 + 007197 1218 36 05 1 305209376 12 0463 + 007198 1218 36 06 1 305209376 13 0463 + 007199 1218 36 07 1 305209376 14 0463 + 007200 1218 36 08 1 305209376 15 0463 + 007201 1218 37 01 1 305209364 00 0460 + 007202 1218 37 02 1 305209364 01 0460 + 007203 1218 37 03 1 305209364 02 0460 + 007204 1218 37 04 1 305209364 03 0460 + 007205 1218 37 05 1 305209364 04 0460 + 007206 1218 37 06 1 305209364 05 0460 + 007207 1218 37 07 1 305209364 06 0460 + 007208 1218 37 08 1 305209364 07 0460 + 007209 1218 38 01 1 305209364 08 0460 + 007210 1218 38 02 1 305209364 09 0460 + 007211 1218 38 03 1 305209364 10 0460 + 007212 1218 38 04 1 305209364 11 0460 + 007213 1218 38 05 1 305209364 12 0460 + 007214 1218 38 06 1 305209364 13 0460 + 007215 1218 38 07 1 305209364 14 0460 + 007216 1218 38 08 1 305209364 15 0460 + 007217 1218 39 01 1 305209368 00 0461 + 007218 1218 39 02 1 305209368 01 0461 + 007219 1218 39 03 1 305209368 02 0461 + 007220 1218 39 04 1 305209368 03 0461 + 007221 1218 39 05 1 305209368 04 0461 + 007222 1218 39 06 1 305209368 05 0461 + 007223 1218 39 07 1 305209368 06 0461 + 007224 1218 39 08 1 305209368 07 0461 + 007225 1218 40 01 1 305209368 08 0461 + 007226 1218 40 02 1 305209368 09 0461 + 007227 1218 40 03 1 305209368 10 0461 + 007228 1218 40 04 1 305209368 11 0461 + 007229 1218 40 05 1 305209368 12 0461 + 007230 1218 40 06 1 305209368 13 0461 + 007231 1218 40 07 1 305209368 14 0461 + 007232 1218 40 08 1 305209368 15 0461 + 007233 1218 41 01 1 305213464 00 0469 + 007234 1218 41 02 1 305213464 01 0469 + 007235 1218 41 03 1 305213464 02 0469 + 007236 1218 41 04 1 305213464 03 0469 + 007237 1218 41 05 1 305213464 04 0469 + 007238 1218 41 06 1 305213464 05 0469 + 007239 1218 41 07 1 305213464 06 0469 + 007240 1218 41 08 1 305213464 07 0469 + 007241 1218 42 01 1 305213464 08 0469 + 007242 1218 42 02 1 305213464 09 0469 + 007243 1218 42 03 1 305213464 10 0469 + 007244 1218 42 04 1 305213464 11 0469 + 007245 1218 42 05 1 305213464 12 0469 + 007246 1218 42 06 1 305213464 13 0469 + 007247 1218 42 07 1 305213464 14 0469 + 007248 1218 42 08 1 305213464 15 0469 + 007249 1218 43 01 1 305213460 00 0468 + 007250 1218 43 02 1 305213460 01 0468 + 007251 1218 43 03 1 305213460 02 0468 + 007252 1218 43 04 1 305213460 03 0468 + 007253 1218 43 05 1 305213460 04 0468 + 007254 1218 43 06 1 305213460 05 0468 + 007255 1218 43 07 1 305213460 06 0468 + 007256 1218 43 08 1 305213460 07 0468 + 007257 1218 44 01 1 305213460 08 0468 + 007258 1218 44 02 1 305213460 09 0468 + 007259 1218 44 03 1 305213460 10 0468 + 007260 1218 44 04 1 305213460 11 0468 + 007261 1218 44 05 1 305213460 12 0468 + 007262 1218 44 06 1 305213460 13 0468 + 007263 1218 44 07 1 305213460 14 0468 + 007264 1218 44 08 1 305213460 15 0468 + 007265 1218 45 01 1 305213472 00 0471 + 007266 1218 45 02 1 305213472 01 0471 + 007267 1218 45 03 1 305213472 02 0471 + 007268 1218 45 04 1 305213472 03 0471 + 007269 1218 45 05 1 305213472 04 0471 + 007270 1218 45 06 1 305213472 05 0471 + 007271 1218 45 07 1 305213472 06 0471 + 007272 1218 45 08 1 305213472 07 0471 + 007273 1218 46 01 1 305213472 08 0471 + 007274 1218 46 02 1 305213472 09 0471 + 007275 1218 46 03 1 305213472 10 0471 + 007276 1218 46 04 1 305213472 11 0471 + 007277 1218 46 05 1 305213472 12 0471 + 007278 1218 46 06 1 305213472 13 0471 + 007279 1218 46 07 1 305213472 14 0471 + 007280 1218 46 08 1 305213472 15 0471 + 007281 1218 47 01 1 305213468 00 0470 + 007282 1218 47 02 1 305213468 01 0470 + 007283 1218 47 03 1 305213468 02 0470 + 007284 1218 47 04 1 305213468 03 0470 + 007285 1218 47 05 1 305213468 04 0470 + 007286 1218 47 06 1 305213468 05 0470 + 007287 1218 47 07 1 305213468 06 0470 + 007288 1218 47 08 1 305213468 07 0470 + 007289 1218 48 01 1 305213468 08 0470 + 007290 1218 48 02 1 305213468 09 0470 + 007291 1218 48 03 1 305213468 10 0470 + 007292 1218 48 04 1 305213468 11 0470 + 007293 1218 48 05 1 305213468 12 0470 + 007294 1218 48 06 1 305213468 13 0470 + 007295 1218 48 07 1 305213468 14 0470 + 007296 1218 48 08 1 305213468 15 0470 + 007297 1219 01 01 1 303063060 08 0044 + 007298 1219 01 02 1 303063060 09 0044 + 007299 9999 99 99 0 9999 99 9999 + 007300 9999 99 99 0 9999 99 9999 + 007301 9999 99 99 0 9999 99 9999 + 007302 9999 99 99 0 9999 99 9999 + 007303 9999 99 99 0 9999 99 9999 + 007304 9999 99 99 0 9999 99 9999 + 007305 1219 02 01 1 303063060 10 0044 + 007306 1219 02 02 1 303063060 11 0044 + 007307 9999 99 99 0 9999 99 9999 + 007308 9999 99 99 0 9999 99 9999 + 007309 9999 99 99 0 9999 99 9999 + 007310 9999 99 99 0 9999 99 9999 + 007311 9999 99 99 0 9999 99 9999 + 007312 9999 99 99 0 9999 99 9999 + 007313 1219 03 01 1 303063060 12 0044 + 007314 1219 03 02 1 303063060 13 0044 + 007315 9999 99 99 0 9999 99 9999 + 007316 9999 99 99 0 9999 99 9999 + 007317 9999 99 99 0 9999 99 9999 + 007318 9999 99 99 0 9999 99 9999 + 007319 9999 99 99 0 9999 99 9999 + 007320 9999 99 99 0 9999 99 9999 + 007321 1219 04 01 1 303063060 14 0044 + 007322 1219 04 02 1 303063060 15 0044 + 007323 9999 99 99 0 9999 99 9999 + 007324 9999 99 99 0 9999 99 9999 + 007325 9999 99 99 0 9999 99 9999 + 007326 9999 99 99 0 9999 99 9999 + 007327 9999 99 99 0 9999 99 9999 + 007328 9999 99 99 0 9999 99 9999 + 007329 1219 05 01 1 303063060 00 0044 + 007330 1219 05 02 1 303063060 01 0044 + 007331 9999 99 99 0 9999 99 9999 + 007332 9999 99 99 0 9999 99 9999 + 007333 9999 99 99 0 9999 99 9999 + 007334 9999 99 99 0 9999 99 9999 + 007335 9999 99 99 0 9999 99 9999 + 007336 9999 99 99 0 9999 99 9999 + 007337 1219 06 01 1 303063060 02 0044 + 007338 1219 06 02 1 303063060 03 0044 + 007339 9999 99 99 0 9999 99 9999 + 007340 9999 99 99 0 9999 99 9999 + 007341 9999 99 99 0 9999 99 9999 + 007342 9999 99 99 0 9999 99 9999 + 007343 9999 99 99 0 9999 99 9999 + 007344 9999 99 99 0 9999 99 9999 + 007345 1219 07 01 1 303063060 04 0044 + 007346 1219 07 02 1 303063060 05 0044 + 007347 9999 99 99 0 9999 99 9999 + 007348 9999 99 99 0 9999 99 9999 + 007349 9999 99 99 0 9999 99 9999 + 007350 9999 99 99 0 9999 99 9999 + 007351 9999 99 99 0 9999 99 9999 + 007352 9999 99 99 0 9999 99 9999 + 007353 1219 08 01 1 303063060 06 0044 + 007354 1219 08 02 1 303063060 07 0044 + 007355 9999 99 99 0 9999 99 9999 + 007356 9999 99 99 0 9999 99 9999 + 007357 9999 99 99 0 9999 99 9999 + 007358 9999 99 99 0 9999 99 9999 + 007359 9999 99 99 0 9999 99 9999 + 007360 9999 99 99 0 9999 99 9999 + 007361 1219 09 01 1 304140312 00 0197 + 007362 1219 09 02 1 304140312 01 0197 + 007363 1219 09 03 1 304140312 02 0197 + 007364 1219 09 04 1 304140312 03 0197 + 007365 9999 99 99 0 9999 99 9999 + 007366 9999 99 99 0 9999 99 9999 + 007367 9999 99 99 0 9999 99 9999 + 007368 9999 99 99 0 9999 99 9999 + 007369 1219 10 01 1 304140312 04 0197 + 007370 1219 10 02 1 304140312 05 0197 + 007371 1219 10 03 1 304140312 06 0197 + 007372 1219 10 04 1 304140312 07 0197 + 007373 9999 99 99 0 9999 99 9999 + 007374 9999 99 99 0 9999 99 9999 + 007375 9999 99 99 0 9999 99 9999 + 007376 9999 99 99 0 9999 99 9999 + 007377 1219 11 01 1 304140312 08 0197 + 007378 1219 11 02 1 304140312 09 0197 + 007379 1219 11 03 1 304140312 10 0197 + 007380 1219 11 04 1 304140312 11 0197 + 007381 9999 99 99 0 9999 99 9999 + 007382 9999 99 99 0 9999 99 9999 + 007383 9999 99 99 0 9999 99 9999 + 007384 9999 99 99 0 9999 99 9999 + 007385 1219 12 01 1 304140312 12 0197 + 007386 1219 12 02 1 304140312 13 0197 + 007387 1219 12 03 1 304140312 14 0197 + 007388 1219 12 04 1 304140312 15 0197 + 007389 9999 99 99 0 9999 99 9999 + 007390 9999 99 99 0 9999 99 9999 + 007391 9999 99 99 0 9999 99 9999 + 007392 9999 99 99 0 9999 99 9999 + 007393 1219 13 01 1 304140308 08 0196 + 007394 1219 13 02 1 304140308 09 0196 + 007395 1219 13 03 1 304140308 10 0196 + 007396 1219 13 04 1 304140308 11 0196 + 007397 9999 99 99 0 9999 99 9999 + 007398 9999 99 99 0 9999 99 9999 + 007399 9999 99 99 0 9999 99 9999 + 007400 9999 99 99 0 9999 99 9999 + 007401 1219 14 01 1 304140308 12 0196 + 007402 1219 14 02 1 304140308 13 0196 + 007403 1219 14 03 1 304140308 14 0196 + 007404 1219 14 04 1 304140308 15 0196 + 007405 9999 99 99 0 9999 99 9999 + 007406 9999 99 99 0 9999 99 9999 + 007407 9999 99 99 0 9999 99 9999 + 007408 9999 99 99 0 9999 99 9999 + 007409 1219 15 01 1 304140308 00 0196 + 007410 1219 15 02 1 304140308 01 0196 + 007411 1219 15 03 1 304140308 02 0196 + 007412 1219 15 04 1 304140308 03 0196 + 007413 9999 99 99 0 9999 99 9999 + 007414 9999 99 99 0 9999 99 9999 + 007415 9999 99 99 0 9999 99 9999 + 007416 9999 99 99 0 9999 99 9999 + 007417 1219 16 01 1 304140308 04 0196 + 007418 1219 16 02 1 304140308 05 0196 + 007419 1219 16 03 1 304140308 06 0196 + 007420 1219 16 04 1 304140308 07 0196 + 007421 9999 99 99 0 9999 99 9999 + 007422 9999 99 99 0 9999 99 9999 + 007423 9999 99 99 0 9999 99 9999 + 007424 9999 99 99 0 9999 99 9999 + 007425 1219 17 01 1 306303004 00 0902 + 007426 1219 17 02 1 306303004 01 0902 + 007427 1219 17 03 1 306303004 02 0902 + 007428 1219 17 04 1 306303004 03 0902 + 007429 1219 17 05 1 306303004 04 0902 + 007430 1219 17 06 1 306303004 05 0902 + 007431 1219 17 07 1 306303004 06 0902 + 007432 1219 17 08 1 306303004 07 0902 + 007433 1219 18 01 1 306303004 08 0902 + 007434 1219 18 02 1 306303004 09 0902 + 007435 1219 18 03 1 306303004 10 0902 + 007436 1219 18 04 1 306303004 11 0902 + 007437 1219 18 05 1 306303004 12 0902 + 007438 1219 18 06 1 306303004 13 0902 + 007439 1219 18 07 1 306303004 14 0902 + 007440 1219 18 08 1 306303004 15 0902 + 007441 1219 19 01 1 306303008 00 0903 + 007442 1219 19 02 1 306303008 01 0903 + 007443 1219 19 03 1 306303008 02 0903 + 007444 1219 19 04 1 306303008 03 0903 + 007445 1219 19 05 1 306303008 04 0903 + 007446 1219 19 06 1 306303008 05 0903 + 007447 1219 19 07 1 306303008 06 0903 + 007448 1219 19 08 1 306303008 07 0903 + 007449 1219 20 01 1 306303008 08 0903 + 007450 1219 20 02 1 306303008 09 0903 + 007451 1219 20 03 1 306303008 10 0903 + 007452 1219 20 04 1 306303008 11 0903 + 007453 1219 20 05 1 306303008 12 0903 + 007454 1219 20 06 1 306303008 13 0903 + 007455 1219 20 07 1 306303008 14 0903 + 007456 1219 20 08 1 306303008 15 0903 + 007457 1219 21 01 1 306302996 00 0900 + 007458 1219 21 02 1 306302996 01 0900 + 007459 1219 21 03 1 306302996 02 0900 + 007460 1219 21 04 1 306302996 03 0900 + 007461 1219 21 05 1 306302996 04 0900 + 007462 1219 21 06 1 306302996 05 0900 + 007463 1219 21 07 1 306302996 06 0900 + 007464 1219 21 08 1 306302996 07 0900 + 007465 1219 22 01 1 306302996 08 0900 + 007466 1219 22 02 1 306302996 09 0900 + 007467 1219 22 03 1 306302996 10 0900 + 007468 1219 22 04 1 306302996 11 0900 + 007469 1219 22 05 1 306302996 12 0900 + 007470 1219 22 06 1 306302996 13 0900 + 007471 1219 22 07 1 306302996 14 0900 + 007472 1219 22 08 1 306302996 15 0900 + 007473 1219 23 01 1 306303000 00 0901 + 007474 1219 23 02 1 306303000 01 0901 + 007475 1219 23 03 1 306303000 02 0901 + 007476 1219 23 04 1 306303000 03 0901 + 007477 1219 23 05 1 306303000 04 0901 + 007478 1219 23 06 1 306303000 05 0901 + 007479 1219 23 07 1 306303000 06 0901 + 007480 1219 23 08 1 306303000 07 0901 + 007481 1219 24 01 1 306303000 08 0901 + 007482 1219 24 02 1 306303000 09 0901 + 007483 1219 24 03 1 306303000 10 0901 + 007484 1219 24 04 1 306303000 11 0901 + 007485 1219 24 05 1 306303000 12 0901 + 007486 1219 24 06 1 306303000 13 0901 + 007487 1219 24 07 1 306303000 14 0901 + 007488 1219 24 08 1 306303000 15 0901 + 007489 1219 25 01 1 303063064 08 0045 + 007490 1219 25 02 1 303063064 09 0045 + 007491 9999 99 99 0 9999 99 9999 + 007492 9999 99 99 0 9999 99 9999 + 007493 9999 99 99 0 9999 99 9999 + 007494 9999 99 99 0 9999 99 9999 + 007495 9999 99 99 0 9999 99 9999 + 007496 9999 99 99 0 9999 99 9999 + 007497 1219 26 01 1 303063064 10 0045 + 007498 1219 26 02 1 303063064 11 0045 + 007499 9999 99 99 0 9999 99 9999 + 007500 9999 99 99 0 9999 99 9999 + 007501 9999 99 99 0 9999 99 9999 + 007502 9999 99 99 0 9999 99 9999 + 007503 9999 99 99 0 9999 99 9999 + 007504 9999 99 99 0 9999 99 9999 + 007505 1219 27 01 1 303063064 12 0045 + 007506 1219 27 02 1 303063064 13 0045 + 007507 9999 99 99 0 9999 99 9999 + 007508 9999 99 99 0 9999 99 9999 + 007509 9999 99 99 0 9999 99 9999 + 007510 9999 99 99 0 9999 99 9999 + 007511 9999 99 99 0 9999 99 9999 + 007512 9999 99 99 0 9999 99 9999 + 007513 1219 28 01 1 303063064 14 0045 + 007514 1219 28 02 1 303063064 15 0045 + 007515 9999 99 99 0 9999 99 9999 + 007516 9999 99 99 0 9999 99 9999 + 007517 9999 99 99 0 9999 99 9999 + 007518 9999 99 99 0 9999 99 9999 + 007519 9999 99 99 0 9999 99 9999 + 007520 9999 99 99 0 9999 99 9999 + 007521 1219 29 01 1 303063064 04 0045 + 007522 1219 29 02 1 303063064 05 0045 + 007523 9999 99 99 0 9999 99 9999 + 007524 9999 99 99 0 9999 99 9999 + 007525 9999 99 99 0 9999 99 9999 + 007526 9999 99 99 0 9999 99 9999 + 007527 9999 99 99 0 9999 99 9999 + 007528 9999 99 99 0 9999 99 9999 + 007529 1219 30 01 1 303063064 06 0045 + 007530 1219 30 02 1 303063064 07 0045 + 007531 9999 99 99 0 9999 99 9999 + 007532 9999 99 99 0 9999 99 9999 + 007533 9999 99 99 0 9999 99 9999 + 007534 9999 99 99 0 9999 99 9999 + 007535 9999 99 99 0 9999 99 9999 + 007536 9999 99 99 0 9999 99 9999 + 007537 1219 31 01 1 303063064 00 0045 + 007538 1219 31 02 1 303063064 01 0045 + 007539 9999 99 99 0 9999 99 9999 + 007540 9999 99 99 0 9999 99 9999 + 007541 9999 99 99 0 9999 99 9999 + 007542 9999 99 99 0 9999 99 9999 + 007543 9999 99 99 0 9999 99 9999 + 007544 9999 99 99 0 9999 99 9999 + 007545 1219 32 01 1 303063064 02 0045 + 007546 1219 32 02 1 303063064 03 0045 + 007547 9999 99 99 0 9999 99 9999 + 007548 9999 99 99 0 9999 99 9999 + 007549 9999 99 99 0 9999 99 9999 + 007550 9999 99 99 0 9999 99 9999 + 007551 9999 99 99 0 9999 99 9999 + 007552 9999 99 99 0 9999 99 9999 + 007553 1219 33 01 1 306307100 00 0910 + 007554 1219 33 02 1 306307100 01 0910 + 007555 1219 33 03 1 306307100 02 0910 + 007556 1219 33 04 1 306307100 03 0910 + 007557 1219 33 05 1 306307100 04 0910 + 007558 1219 33 06 1 306307100 05 0910 + 007559 1219 33 07 1 306307100 06 0910 + 007560 1219 33 08 1 306307100 07 0910 + 007561 1219 34 01 1 306307100 08 0910 + 007562 1219 34 02 1 306307100 09 0910 + 007563 1219 34 03 1 306307100 10 0910 + 007564 1219 34 04 1 306307100 11 0910 + 007565 1219 34 05 1 306307100 12 0910 + 007566 1219 34 06 1 306307100 13 0910 + 007567 1219 34 07 1 306307100 14 0910 + 007568 1219 34 08 1 306307100 15 0910 + 007569 1219 35 01 1 306307104 00 0911 + 007570 1219 35 02 1 306307104 01 0911 + 007571 1219 35 03 1 306307104 02 0911 + 007572 1219 35 04 1 306307104 03 0911 + 007573 1219 35 05 1 306307104 04 0911 + 007574 1219 35 06 1 306307104 05 0911 + 007575 1219 35 07 1 306307104 06 0911 + 007576 1219 35 08 1 306307104 07 0911 + 007577 1219 36 01 1 306307104 08 0911 + 007578 1219 36 02 1 306307104 09 0911 + 007579 1219 36 03 1 306307104 10 0911 + 007580 1219 36 04 1 306307104 11 0911 + 007581 1219 36 05 1 306307104 12 0911 + 007582 1219 36 06 1 306307104 13 0911 + 007583 1219 36 07 1 306307104 14 0911 + 007584 1219 36 08 1 306307104 15 0911 + 007585 1219 37 01 1 306307092 00 0908 + 007586 1219 37 02 1 306307092 01 0908 + 007587 1219 37 03 1 306307092 02 0908 + 007588 1219 37 04 1 306307092 03 0908 + 007589 1219 37 05 1 306307092 04 0908 + 007590 1219 37 06 1 306307092 05 0908 + 007591 1219 37 07 1 306307092 06 0908 + 007592 1219 37 08 1 306307092 07 0908 + 007593 1219 38 01 1 306307092 08 0908 + 007594 1219 38 02 1 306307092 09 0908 + 007595 1219 38 03 1 306307092 10 0908 + 007596 1219 38 04 1 306307092 11 0908 + 007597 1219 38 05 1 306307092 12 0908 + 007598 1219 38 06 1 306307092 13 0908 + 007599 1219 38 07 1 306307092 14 0908 + 007600 1219 38 08 1 306307092 15 0908 + 007601 1219 39 01 1 306307096 00 0909 + 007602 1219 39 02 1 306307096 01 0909 + 007603 1219 39 03 1 306307096 02 0909 + 007604 1219 39 04 1 306307096 03 0909 + 007605 1219 39 05 1 306307096 04 0909 + 007606 1219 39 06 1 306307096 05 0909 + 007607 1219 39 07 1 306307096 06 0909 + 007608 1219 39 08 1 306307096 07 0909 + 007609 1219 40 01 1 306307096 08 0909 + 007610 1219 40 02 1 306307096 09 0909 + 007611 1219 40 03 1 306307096 10 0909 + 007612 1219 40 04 1 306307096 11 0909 + 007613 1219 40 05 1 306307096 12 0909 + 007614 1219 40 06 1 306307096 13 0909 + 007615 1219 40 07 1 306307096 14 0909 + 007616 1219 40 08 1 306307096 15 0909 + 007617 1219 41 01 1 304140316 00 0198 + 007618 1219 41 02 1 304140316 01 0198 + 007619 1219 41 03 1 304140316 02 0198 + 007620 1219 41 04 1 304140316 03 0198 + 007621 9999 99 99 0 9999 99 9999 + 007622 9999 99 99 0 9999 99 9999 + 007623 9999 99 99 0 9999 99 9999 + 007624 9999 99 99 0 9999 99 9999 + 007625 1219 42 01 1 304140316 04 0198 + 007626 1219 42 02 1 304140316 05 0198 + 007627 1219 42 03 1 304140316 06 0198 + 007628 1219 42 04 1 304140316 07 0198 + 007629 9999 99 99 0 9999 99 9999 + 007630 9999 99 99 0 9999 99 9999 + 007631 9999 99 99 0 9999 99 9999 + 007632 9999 99 99 0 9999 99 9999 + 007633 1219 43 01 1 304140316 08 0198 + 007634 1219 43 02 1 304140316 09 0198 + 007635 1219 43 03 1 304140316 10 0198 + 007636 1219 43 04 1 304140316 11 0198 + 007637 9999 99 99 0 9999 99 9999 + 007638 9999 99 99 0 9999 99 9999 + 007639 9999 99 99 0 9999 99 9999 + 007640 9999 99 99 0 9999 99 9999 + 007641 1219 44 01 1 304140316 12 0198 + 007642 1219 44 02 1 304140316 13 0198 + 007643 1219 44 03 1 304140316 14 0198 + 007644 1219 44 04 1 304140316 15 0198 + 007645 9999 99 99 0 9999 99 9999 + 007646 9999 99 99 0 9999 99 9999 + 007647 9999 99 99 0 9999 99 9999 + 007648 9999 99 99 0 9999 99 9999 + 007649 1219 45 01 1 304140320 00 0199 + 007650 1219 45 02 1 304140320 01 0199 + 007651 1219 45 03 1 304140320 02 0199 + 007652 1219 45 04 1 304140320 03 0199 + 007653 9999 99 99 0 9999 99 9999 + 007654 9999 99 99 0 9999 99 9999 + 007655 9999 99 99 0 9999 99 9999 + 007656 9999 99 99 0 9999 99 9999 + 007657 1219 46 01 1 304140320 04 0199 + 007658 1219 46 02 1 304140320 05 0199 + 007659 1219 46 03 1 304140320 06 0199 + 007660 1219 46 04 1 304140320 07 0199 + 007661 9999 99 99 0 9999 99 9999 + 007662 9999 99 99 0 9999 99 9999 + 007663 9999 99 99 0 9999 99 9999 + 007664 9999 99 99 0 9999 99 9999 + 007665 1219 47 01 1 304140320 08 0199 + 007666 1219 47 02 1 304140320 09 0199 + 007667 1219 47 03 1 304140320 10 0199 + 007668 1219 47 04 1 304140320 11 0199 + 007669 9999 99 99 0 9999 99 9999 + 007670 9999 99 99 0 9999 99 9999 + 007671 9999 99 99 0 9999 99 9999 + 007672 9999 99 99 0 9999 99 9999 + 007673 1219 48 01 1 304140320 12 0199 + 007674 1219 48 02 1 304140320 13 0199 + 007675 1219 48 03 1 304140320 14 0199 + 007676 1219 48 04 1 304140320 15 0199 + 007677 9999 99 99 0 9999 99 9999 + 007678 9999 99 99 0 9999 99 9999 + 007679 9999 99 99 0 9999 99 9999 + 007680 9999 99 99 0 9999 99 9999 + 007681 1220 01 01 1 304144408 08 0205 + 007682 1220 01 02 1 304144408 09 0205 + 007683 1220 01 03 1 304144408 10 0205 + 007684 1220 01 04 1 304144408 11 0205 + 007685 9999 99 99 0 9999 99 9999 + 007686 9999 99 99 0 9999 99 9999 + 007687 9999 99 99 0 9999 99 9999 + 007688 9999 99 99 0 9999 99 9999 + 007689 1220 02 01 1 304144408 12 0205 + 007690 1220 02 02 1 304144408 13 0205 + 007691 1220 02 03 1 304144408 14 0205 + 007692 1220 02 04 1 304144408 15 0205 + 007693 9999 99 99 0 9999 99 9999 + 007694 9999 99 99 0 9999 99 9999 + 007695 9999 99 99 0 9999 99 9999 + 007696 9999 99 99 0 9999 99 9999 + 007697 1220 03 01 1 304144408 00 0205 + 007698 1220 03 02 1 304144408 01 0205 + 007699 1220 03 03 1 304144408 02 0205 + 007700 1220 03 04 1 304144408 03 0205 + 007701 9999 99 99 0 9999 99 9999 + 007702 9999 99 99 0 9999 99 9999 + 007703 9999 99 99 0 9999 99 9999 + 007704 9999 99 99 0 9999 99 9999 + 007705 1220 04 01 1 304144408 04 0205 + 007706 1220 04 02 1 304144408 05 0205 + 007707 1220 04 03 1 304144408 06 0205 + 007708 1220 04 04 1 304144408 07 0205 + 007709 9999 99 99 0 9999 99 9999 + 007710 9999 99 99 0 9999 99 9999 + 007711 9999 99 99 0 9999 99 9999 + 007712 9999 99 99 0 9999 99 9999 + 007713 1220 05 01 1 304144404 08 0204 + 007714 1220 05 02 1 304144404 09 0204 + 007715 1220 05 03 1 304144404 10 0204 + 007716 1220 05 04 1 304144404 11 0204 + 007717 9999 99 99 0 9999 99 9999 + 007718 9999 99 99 0 9999 99 9999 + 007719 9999 99 99 0 9999 99 9999 + 007720 9999 99 99 0 9999 99 9999 + 007721 1220 06 01 1 304144404 12 0204 + 007722 1220 06 02 1 304144404 13 0204 + 007723 1220 06 03 1 304144404 14 0204 + 007724 1220 06 04 1 304144404 15 0204 + 007725 9999 99 99 0 9999 99 9999 + 007726 9999 99 99 0 9999 99 9999 + 007727 9999 99 99 0 9999 99 9999 + 007728 9999 99 99 0 9999 99 9999 + 007729 1220 07 01 1 304144404 00 0204 + 007730 1220 07 02 1 304144404 01 0204 + 007731 1220 07 03 1 304144404 02 0204 + 007732 1220 07 04 1 304144404 03 0204 + 007733 9999 99 99 0 9999 99 9999 + 007734 9999 99 99 0 9999 99 9999 + 007735 9999 99 99 0 9999 99 9999 + 007736 9999 99 99 0 9999 99 9999 + 007737 1220 08 01 1 304144404 04 0204 + 007738 1220 08 02 1 304144404 05 0204 + 007739 1220 08 03 1 304144404 06 0204 + 007740 1220 08 04 1 304144404 07 0204 + 007741 9999 99 99 0 9999 99 9999 + 007742 9999 99 99 0 9999 99 9999 + 007743 9999 99 99 0 9999 99 9999 + 007744 9999 99 99 0 9999 99 9999 + 007745 1220 09 01 1 306311192 00 0917 + 007746 1220 09 02 1 306311192 01 0917 + 007747 1220 09 03 1 306311192 02 0917 + 007748 1220 09 04 1 306311192 03 0917 + 007749 1220 09 05 1 306311192 04 0917 + 007750 1220 09 06 1 306311192 05 0917 + 007751 1220 09 07 1 306311192 06 0917 + 007752 1220 09 08 1 306311192 07 0917 + 007753 1220 10 01 1 306311192 08 0917 + 007754 1220 10 02 1 306311192 09 0917 + 007755 1220 10 03 1 306311192 10 0917 + 007756 1220 10 04 1 306311192 11 0917 + 007757 1220 10 05 1 306311192 12 0917 + 007758 1220 10 06 1 306311192 13 0917 + 007759 1220 10 07 1 306311192 14 0917 + 007760 1220 10 08 1 306311192 15 0917 + 007761 1220 11 01 1 306311188 00 0916 + 007762 1220 11 02 1 306311188 01 0916 + 007763 1220 11 03 1 306311188 02 0916 + 007764 1220 11 04 1 306311188 03 0916 + 007765 1220 11 05 1 306311188 04 0916 + 007766 1220 11 06 1 306311188 05 0916 + 007767 1220 11 07 1 306311188 06 0916 + 007768 1220 11 08 1 306311188 07 0916 + 007769 1220 12 01 1 306311188 08 0916 + 007770 1220 12 02 1 306311188 09 0916 + 007771 1220 12 03 1 306311188 10 0916 + 007772 1220 12 04 1 306311188 11 0916 + 007773 1220 12 05 1 306311188 12 0916 + 007774 1220 12 06 1 306311188 13 0916 + 007775 1220 12 07 1 306311188 14 0916 + 007776 1220 12 08 1 306311188 15 0916 + 007777 1220 13 01 1 306311200 00 0919 + 007778 1220 13 02 1 306311200 01 0919 + 007779 1220 13 03 1 306311200 02 0919 + 007780 1220 13 04 1 306311200 03 0919 + 007781 1220 13 05 1 306311200 04 0919 + 007782 1220 13 06 1 306311200 05 0919 + 007783 1220 13 07 1 306311200 06 0919 + 007784 1220 13 08 1 306311200 07 0919 + 007785 1220 14 01 1 306311200 08 0919 + 007786 1220 14 02 1 306311200 09 0919 + 007787 1220 14 03 1 306311200 10 0919 + 007788 1220 14 04 1 306311200 11 0919 + 007789 1220 14 05 1 306311200 12 0919 + 007790 1220 14 06 1 306311200 13 0919 + 007791 1220 14 07 1 306311200 14 0919 + 007792 1220 14 08 1 306311200 15 0919 + 007793 1220 15 01 1 306311196 00 0918 + 007794 1220 15 02 1 306311196 01 0918 + 007795 1220 15 03 1 306311196 02 0918 + 007796 1220 15 04 1 306311196 03 0918 + 007797 1220 15 05 1 306311196 04 0918 + 007798 1220 15 06 1 306311196 05 0918 + 007799 1220 15 07 1 306311196 06 0918 + 007800 1220 15 08 1 306311196 07 0918 + 007801 1220 16 01 1 306311196 08 0918 + 007802 1220 16 02 1 306311196 09 0918 + 007803 1220 16 03 1 306311196 10 0918 + 007804 1220 16 04 1 306311196 11 0918 + 007805 1220 16 05 1 306311196 12 0918 + 007806 1220 16 06 1 306311196 13 0918 + 007807 1220 16 07 1 306311196 14 0918 + 007808 1220 16 08 1 306311196 15 0918 + 007809 1220 17 01 1 303063068 12 0046 + 007810 1220 17 02 1 303063068 13 0046 + 007811 9999 99 99 0 9999 99 9999 + 007812 9999 99 99 0 9999 99 9999 + 007813 9999 99 99 0 9999 99 9999 + 007814 9999 99 99 0 9999 99 9999 + 007815 9999 99 99 0 9999 99 9999 + 007816 9999 99 99 0 9999 99 9999 + 007817 1220 18 01 1 303063068 14 0046 + 007818 1220 18 02 1 303063068 15 0046 + 007819 9999 99 99 0 9999 99 9999 + 007820 9999 99 99 0 9999 99 9999 + 007821 9999 99 99 0 9999 99 9999 + 007822 9999 99 99 0 9999 99 9999 + 007823 9999 99 99 0 9999 99 9999 + 007824 9999 99 99 0 9999 99 9999 + 007825 1220 19 01 1 303063068 08 0046 + 007826 1220 19 02 1 303063068 09 0046 + 007827 9999 99 99 0 9999 99 9999 + 007828 9999 99 99 0 9999 99 9999 + 007829 9999 99 99 0 9999 99 9999 + 007830 9999 99 99 0 9999 99 9999 + 007831 9999 99 99 0 9999 99 9999 + 007832 9999 99 99 0 9999 99 9999 + 007833 1220 20 01 1 303063068 10 0046 + 007834 1220 20 02 1 303063068 11 0046 + 007835 9999 99 99 0 9999 99 9999 + 007836 9999 99 99 0 9999 99 9999 + 007837 9999 99 99 0 9999 99 9999 + 007838 9999 99 99 0 9999 99 9999 + 007839 9999 99 99 0 9999 99 9999 + 007840 9999 99 99 0 9999 99 9999 + 007841 1220 21 01 1 303063068 00 0046 + 007842 1220 21 02 1 303063068 01 0046 + 007843 9999 99 99 0 9999 99 9999 + 007844 9999 99 99 0 9999 99 9999 + 007845 9999 99 99 0 9999 99 9999 + 007846 9999 99 99 0 9999 99 9999 + 007847 9999 99 99 0 9999 99 9999 + 007848 9999 99 99 0 9999 99 9999 + 007849 1220 22 01 1 303063068 02 0046 + 007850 1220 22 02 1 303063068 03 0046 + 007851 9999 99 99 0 9999 99 9999 + 007852 9999 99 99 0 9999 99 9999 + 007853 9999 99 99 0 9999 99 9999 + 007854 9999 99 99 0 9999 99 9999 + 007855 9999 99 99 0 9999 99 9999 + 007856 9999 99 99 0 9999 99 9999 + 007857 1220 23 01 1 303063068 04 0046 + 007858 1220 23 02 1 303063068 05 0046 + 007859 9999 99 99 0 9999 99 9999 + 007860 9999 99 99 0 9999 99 9999 + 007861 9999 99 99 0 9999 99 9999 + 007862 9999 99 99 0 9999 99 9999 + 007863 9999 99 99 0 9999 99 9999 + 007864 9999 99 99 0 9999 99 9999 + 007865 1220 24 01 1 303063068 06 0046 + 007866 1220 24 02 1 303063068 07 0046 + 007867 9999 99 99 0 9999 99 9999 + 007868 9999 99 99 0 9999 99 9999 + 007869 9999 99 99 0 9999 99 9999 + 007870 9999 99 99 0 9999 99 9999 + 007871 9999 99 99 0 9999 99 9999 + 007872 9999 99 99 0 9999 99 9999 + 007873 1220 25 01 1 305217564 00 0478 + 007874 1220 25 02 1 305217564 01 0478 + 007875 1220 25 03 1 305217564 02 0478 + 007876 1220 25 04 1 305217564 03 0478 + 007877 1220 25 05 1 305217564 04 0478 + 007878 1220 25 06 1 305217564 05 0478 + 007879 1220 25 07 1 305217564 06 0478 + 007880 1220 25 08 1 305217564 07 0478 + 007881 1220 26 01 1 305217564 08 0478 + 007882 1220 26 02 1 305217564 09 0478 + 007883 1220 26 03 1 305217564 10 0478 + 007884 1220 26 04 1 305217564 11 0478 + 007885 1220 26 05 1 305217564 12 0478 + 007886 1220 26 06 1 305217564 13 0478 + 007887 1220 26 07 1 305217564 14 0478 + 007888 1220 26 08 1 305217564 15 0478 + 007889 1220 27 01 1 305217568 00 0479 + 007890 1220 27 02 1 305217568 01 0479 + 007891 1220 27 03 1 305217568 02 0479 + 007892 1220 27 04 1 305217568 03 0479 + 007893 1220 27 05 1 305217568 04 0479 + 007894 1220 27 06 1 305217568 05 0479 + 007895 1220 27 07 1 305217568 06 0479 + 007896 1220 27 08 1 305217568 07 0479 + 007897 1220 28 01 1 305217568 08 0479 + 007898 1220 28 02 1 305217568 09 0479 + 007899 1220 28 03 1 305217568 10 0479 + 007900 1220 28 04 1 305217568 11 0479 + 007901 1220 28 05 1 305217568 12 0479 + 007902 1220 28 06 1 305217568 13 0479 + 007903 1220 28 07 1 305217568 14 0479 + 007904 1220 28 08 1 305217568 15 0479 + 007905 1220 29 01 1 305217556 00 0476 + 007906 1220 29 02 1 305217556 01 0476 + 007907 1220 29 03 1 305217556 02 0476 + 007908 1220 29 04 1 305217556 03 0476 + 007909 1220 29 05 1 305217556 04 0476 + 007910 1220 29 06 1 305217556 05 0476 + 007911 1220 29 07 1 305217556 06 0476 + 007912 1220 29 08 1 305217556 07 0476 + 007913 1220 30 01 1 305217556 08 0476 + 007914 1220 30 02 1 305217556 09 0476 + 007915 1220 30 03 1 305217556 10 0476 + 007916 1220 30 04 1 305217556 11 0476 + 007917 1220 30 05 1 305217556 12 0476 + 007918 1220 30 06 1 305217556 13 0476 + 007919 1220 30 07 1 305217556 14 0476 + 007920 1220 30 08 1 305217556 15 0476 + 007921 1220 31 01 1 305217560 00 0477 + 007922 1220 31 02 1 305217560 01 0477 + 007923 1220 31 03 1 305217560 02 0477 + 007924 1220 31 04 1 305217560 03 0477 + 007925 1220 31 05 1 305217560 04 0477 + 007926 1220 31 06 1 305217560 05 0477 + 007927 1220 31 07 1 305217560 06 0477 + 007928 1220 31 08 1 305217560 07 0477 + 007929 1220 32 01 1 305217560 08 0477 + 007930 1220 32 02 1 305217560 09 0477 + 007931 1220 32 03 1 305217560 10 0477 + 007932 1220 32 04 1 305217560 11 0477 + 007933 1220 32 05 1 305217560 12 0477 + 007934 1220 32 06 1 305217560 13 0477 + 007935 1220 32 07 1 305217560 14 0477 + 007936 1220 32 08 1 305217560 15 0477 + 007937 1220 33 01 1 306315288 00 0925 + 007938 1220 33 02 1 306315288 01 0925 + 007939 1220 33 03 1 306315288 02 0925 + 007940 1220 33 04 1 306315288 03 0925 + 007941 1220 33 05 1 306315288 04 0925 + 007942 1220 33 06 1 306315288 05 0925 + 007943 1220 33 07 1 306315288 06 0925 + 007944 1220 33 08 1 306315288 07 0925 + 007945 1220 34 01 1 306315288 08 0925 + 007946 1220 34 02 1 306315288 09 0925 + 007947 1220 34 03 1 306315288 10 0925 + 007948 1220 34 04 1 306315288 11 0925 + 007949 1220 34 05 1 306315288 12 0925 + 007950 1220 34 06 1 306315288 13 0925 + 007951 1220 34 07 1 306315288 14 0925 + 007952 1220 34 08 1 306315288 15 0925 + 007953 1220 35 01 1 306315284 00 0924 + 007954 1220 35 02 1 306315284 01 0924 + 007955 1220 35 03 1 306315284 02 0924 + 007956 1220 35 04 1 306315284 03 0924 + 007957 1220 35 05 1 306315284 04 0924 + 007958 1220 35 06 1 306315284 05 0924 + 007959 1220 35 07 1 306315284 06 0924 + 007960 1220 35 08 1 306315284 07 0924 + 007961 1220 36 01 1 306315284 08 0924 + 007962 1220 36 02 1 306315284 09 0924 + 007963 1220 36 03 1 306315284 10 0924 + 007964 1220 36 04 1 306315284 11 0924 + 007965 1220 36 05 1 306315284 12 0924 + 007966 1220 36 06 1 306315284 13 0924 + 007967 1220 36 07 1 306315284 14 0924 + 007968 1220 36 08 1 306315284 15 0924 + 007969 1220 37 01 1 306315296 00 0927 + 007970 1220 37 02 1 306315296 01 0927 + 007971 1220 37 03 1 306315296 02 0927 + 007972 1220 37 04 1 306315296 03 0927 + 007973 1220 37 05 1 306315296 04 0927 + 007974 1220 37 06 1 306315296 05 0927 + 007975 1220 37 07 1 306315296 06 0927 + 007976 1220 37 08 1 306315296 07 0927 + 007977 1220 38 01 1 306315296 08 0927 + 007978 1220 38 02 1 306315296 09 0927 + 007979 1220 38 03 1 306315296 10 0927 + 007980 1220 38 04 1 306315296 11 0927 + 007981 1220 38 05 1 306315296 12 0927 + 007982 1220 38 06 1 306315296 13 0927 + 007983 1220 38 07 1 306315296 14 0927 + 007984 1220 38 08 1 306315296 15 0927 + 007985 1220 39 01 1 306315292 00 0926 + 007986 1220 39 02 1 306315292 01 0926 + 007987 1220 39 03 1 306315292 02 0926 + 007988 1220 39 04 1 306315292 03 0926 + 007989 1220 39 05 1 306315292 04 0926 + 007990 1220 39 06 1 306315292 05 0926 + 007991 1220 39 07 1 306315292 06 0926 + 007992 1220 39 08 1 306315292 07 0926 + 007993 1220 40 01 1 306315292 08 0926 + 007994 1220 40 02 1 306315292 09 0926 + 007995 1220 40 03 1 306315292 10 0926 + 007996 1220 40 04 1 306315292 11 0926 + 007997 1220 40 05 1 306315292 12 0926 + 007998 1220 40 06 1 306315292 13 0926 + 007999 1220 40 07 1 306315292 14 0926 + 008000 1220 40 08 1 306315292 15 0926 + 008001 1220 41 01 1 304144416 08 0207 + 008002 1220 41 02 1 304144416 09 0207 + 008003 1220 41 03 1 304144416 10 0207 + 008004 1220 41 04 1 304144416 11 0207 + 008005 9999 99 99 0 9999 99 9999 + 008006 9999 99 99 0 9999 99 9999 + 008007 9999 99 99 0 9999 99 9999 + 008008 9999 99 99 0 9999 99 9999 + 008009 1220 42 01 1 304144416 12 0207 + 008010 1220 42 02 1 304144416 13 0207 + 008011 1220 42 03 1 304144416 14 0207 + 008012 1220 42 04 1 304144416 15 0207 + 008013 9999 99 99 0 9999 99 9999 + 008014 9999 99 99 0 9999 99 9999 + 008015 9999 99 99 0 9999 99 9999 + 008016 9999 99 99 0 9999 99 9999 + 008017 1220 43 01 1 304144416 00 0207 + 008018 1220 43 02 1 304144416 01 0207 + 008019 1220 43 03 1 304144416 02 0207 + 008020 1220 43 04 1 304144416 03 0207 + 008021 9999 99 99 0 9999 99 9999 + 008022 9999 99 99 0 9999 99 9999 + 008023 9999 99 99 0 9999 99 9999 + 008024 9999 99 99 0 9999 99 9999 + 008025 1220 44 01 1 304144416 04 0207 + 008026 1220 44 02 1 304144416 05 0207 + 008027 1220 44 03 1 304144416 06 0207 + 008028 1220 44 04 1 304144416 07 0207 + 008029 9999 99 99 0 9999 99 9999 + 008030 9999 99 99 0 9999 99 9999 + 008031 9999 99 99 0 9999 99 9999 + 008032 9999 99 99 0 9999 99 9999 + 008033 1220 45 01 1 304144412 08 0206 + 008034 1220 45 02 1 304144412 09 0206 + 008035 1220 45 03 1 304144412 10 0206 + 008036 1220 45 04 1 304144412 11 0206 + 008037 9999 99 99 0 9999 99 9999 + 008038 9999 99 99 0 9999 99 9999 + 008039 9999 99 99 0 9999 99 9999 + 008040 9999 99 99 0 9999 99 9999 + 008041 1220 46 01 1 304144412 12 0206 + 008042 1220 46 02 1 304144412 13 0206 + 008043 1220 46 03 1 304144412 14 0206 + 008044 1220 46 04 1 304144412 15 0206 + 008045 9999 99 99 0 9999 99 9999 + 008046 9999 99 99 0 9999 99 9999 + 008047 9999 99 99 0 9999 99 9999 + 008048 9999 99 99 0 9999 99 9999 + 008049 1220 47 01 1 304144412 00 0206 + 008050 1220 47 02 1 304144412 01 0206 + 008051 1220 47 03 1 304144412 02 0206 + 008052 1220 47 04 1 304144412 03 0206 + 008053 9999 99 99 0 9999 99 9999 + 008054 9999 99 99 0 9999 99 9999 + 008055 9999 99 99 0 9999 99 9999 + 008056 9999 99 99 0 9999 99 9999 + 008057 1220 48 01 1 304144412 04 0206 + 008058 1220 48 02 1 304144412 05 0206 + 008059 1220 48 03 1 304144412 06 0206 + 008060 1220 48 04 1 304144412 07 0206 + 008061 9999 99 99 0 9999 99 9999 + 008062 9999 99 99 0 9999 99 9999 + 008063 9999 99 99 0 9999 99 9999 + 008064 9999 99 99 0 9999 99 9999 + 008065 1221 01 01 1 305221660 00 0486 + 008066 1221 01 02 1 305221660 01 0486 + 008067 1221 01 03 1 305221660 02 0486 + 008068 1221 01 04 1 305221660 03 0486 + 008069 1221 01 05 1 305221660 04 0486 + 008070 1221 01 06 1 305221660 05 0486 + 008071 1221 01 07 1 305221660 06 0486 + 008072 1221 01 08 1 305221660 07 0486 + 008073 1221 02 01 1 305221660 08 0486 + 008074 1221 02 02 1 305221660 09 0486 + 008075 1221 02 03 1 305221660 10 0486 + 008076 1221 02 04 1 305221660 11 0486 + 008077 1221 02 05 1 305221660 12 0486 + 008078 1221 02 06 1 305221660 13 0486 + 008079 1221 02 07 1 305221660 14 0486 + 008080 1221 02 08 1 305221660 15 0486 + 008081 1221 03 01 1 305221664 00 0487 + 008082 1221 03 02 1 305221664 01 0487 + 008083 1221 03 03 1 305221664 02 0487 + 008084 1221 03 04 1 305221664 03 0487 + 008085 1221 03 05 1 305221664 04 0487 + 008086 1221 03 06 1 305221664 05 0487 + 008087 1221 03 07 1 305221664 06 0487 + 008088 1221 03 08 1 305221664 07 0487 + 008089 1221 04 01 1 305221664 08 0487 + 008090 1221 04 02 1 305221664 09 0487 + 008091 1221 04 03 1 305221664 10 0487 + 008092 1221 04 04 1 305221664 11 0487 + 008093 1221 04 05 1 305221664 12 0487 + 008094 1221 04 06 1 305221664 13 0487 + 008095 1221 04 07 1 305221664 14 0487 + 008096 1221 04 08 1 305221664 15 0487 + 008097 1221 05 01 1 305221652 00 0484 + 008098 1221 05 02 1 305221652 01 0484 + 008099 1221 05 03 1 305221652 02 0484 + 008100 1221 05 04 1 305221652 03 0484 + 008101 1221 05 05 1 305221652 04 0484 + 008102 1221 05 06 1 305221652 05 0484 + 008103 1221 05 07 1 305221652 06 0484 + 008104 1221 05 08 1 305221652 07 0484 + 008105 1221 06 01 1 305221652 08 0484 + 008106 1221 06 02 1 305221652 09 0484 + 008107 1221 06 03 1 305221652 10 0484 + 008108 1221 06 04 1 305221652 11 0484 + 008109 1221 06 05 1 305221652 12 0484 + 008110 1221 06 06 1 305221652 13 0484 + 008111 1221 06 07 1 305221652 14 0484 + 008112 1221 06 08 1 305221652 15 0484 + 008113 1221 07 01 1 305221656 00 0485 + 008114 1221 07 02 1 305221656 01 0485 + 008115 1221 07 03 1 305221656 02 0485 + 008116 1221 07 04 1 305221656 03 0485 + 008117 1221 07 05 1 305221656 04 0485 + 008118 1221 07 06 1 305221656 05 0485 + 008119 1221 07 07 1 305221656 06 0485 + 008120 1221 07 08 1 305221656 07 0485 + 008121 1221 08 01 1 305221656 08 0485 + 008122 1221 08 02 1 305221656 09 0485 + 008123 1221 08 03 1 305221656 10 0485 + 008124 1221 08 04 1 305221656 11 0485 + 008125 1221 08 05 1 305221656 12 0485 + 008126 1221 08 06 1 305221656 13 0485 + 008127 1221 08 07 1 305221656 14 0485 + 008128 1221 08 08 1 305221656 15 0485 + 008129 1221 09 01 1 305225752 00 0493 + 008130 1221 09 02 1 305225752 01 0493 + 008131 1221 09 03 1 305225752 02 0493 + 008132 1221 09 04 1 305225752 03 0493 + 008133 1221 09 05 1 305225752 04 0493 + 008134 1221 09 06 1 305225752 05 0493 + 008135 1221 09 07 1 305225752 06 0493 + 008136 1221 09 08 1 305225752 07 0493 + 008137 1221 10 01 1 305225752 08 0493 + 008138 1221 10 02 1 305225752 09 0493 + 008139 1221 10 03 1 305225752 10 0493 + 008140 1221 10 04 1 305225752 11 0493 + 008141 1221 10 05 1 305225752 12 0493 + 008142 1221 10 06 1 305225752 13 0493 + 008143 1221 10 07 1 305225752 14 0493 + 008144 1221 10 08 1 305225752 15 0493 + 008145 1221 11 01 1 305225748 00 0492 + 008146 1221 11 02 1 305225748 01 0492 + 008147 1221 11 03 1 305225748 02 0492 + 008148 1221 11 04 1 305225748 03 0492 + 008149 1221 11 05 1 305225748 04 0492 + 008150 1221 11 06 1 305225748 05 0492 + 008151 1221 11 07 1 305225748 06 0492 + 008152 1221 11 08 1 305225748 07 0492 + 008153 1221 12 01 1 305225748 08 0492 + 008154 1221 12 02 1 305225748 09 0492 + 008155 1221 12 03 1 305225748 10 0492 + 008156 1221 12 04 1 305225748 11 0492 + 008157 1221 12 05 1 305225748 12 0492 + 008158 1221 12 06 1 305225748 13 0492 + 008159 1221 12 07 1 305225748 14 0492 + 008160 1221 12 08 1 305225748 15 0492 + 008161 1221 13 01 1 305225760 00 0495 + 008162 1221 13 02 1 305225760 01 0495 + 008163 1221 13 03 1 305225760 02 0495 + 008164 1221 13 04 1 305225760 03 0495 + 008165 1221 13 05 1 305225760 04 0495 + 008166 1221 13 06 1 305225760 05 0495 + 008167 1221 13 07 1 305225760 06 0495 + 008168 1221 13 08 1 305225760 07 0495 + 008169 1221 14 01 1 305225760 08 0495 + 008170 1221 14 02 1 305225760 09 0495 + 008171 1221 14 03 1 305225760 10 0495 + 008172 1221 14 04 1 305225760 11 0495 + 008173 1221 14 05 1 305225760 12 0495 + 008174 1221 14 06 1 305225760 13 0495 + 008175 1221 14 07 1 305225760 14 0495 + 008176 1221 14 08 1 305225760 15 0495 + 008177 1221 15 01 1 305225756 00 0494 + 008178 1221 15 02 1 305225756 01 0494 + 008179 1221 15 03 1 305225756 02 0494 + 008180 1221 15 04 1 305225756 03 0494 + 008181 1221 15 05 1 305225756 04 0494 + 008182 1221 15 06 1 305225756 05 0494 + 008183 1221 15 07 1 305225756 06 0494 + 008184 1221 15 08 1 305225756 07 0494 + 008185 1221 16 01 1 305225756 08 0494 + 008186 1221 16 02 1 305225756 09 0494 + 008187 1221 16 03 1 305225756 10 0494 + 008188 1221 16 04 1 305225756 11 0494 + 008189 1221 16 05 1 305225756 12 0494 + 008190 1221 16 06 1 305225756 13 0494 + 008191 1221 16 07 1 305225756 14 0494 + 008192 1221 16 08 1 305225756 15 0494 + 008193 9999 99 99 0 9999 99 9999 + 008194 9999 99 99 0 9999 99 9999 + 008195 9999 99 99 0 9999 99 9999 + 008196 9999 99 99 0 9999 99 9999 + 008197 9999 99 99 0 9999 99 9999 + 008198 9999 99 99 0 9999 99 9999 + 008199 9999 99 99 0 9999 99 9999 + 008200 9999 99 99 0 9999 99 9999 + 008201 9999 99 99 0 9999 99 9999 + 008202 9999 99 99 0 9999 99 9999 + 008203 9999 99 99 0 9999 99 9999 + 008204 9999 99 99 0 9999 99 9999 + 008205 9999 99 99 0 9999 99 9999 + 008206 9999 99 99 0 9999 99 9999 + 008207 9999 99 99 0 9999 99 9999 + 008208 9999 99 99 0 9999 99 9999 + 008209 9999 99 99 0 9999 99 9999 + 008210 9999 99 99 0 9999 99 9999 + 008211 9999 99 99 0 9999 99 9999 + 008212 9999 99 99 0 9999 99 9999 + 008213 9999 99 99 0 9999 99 9999 + 008214 9999 99 99 0 9999 99 9999 + 008215 9999 99 99 0 9999 99 9999 + 008216 9999 99 99 0 9999 99 9999 + 008217 9999 99 99 0 9999 99 9999 + 008218 9999 99 99 0 9999 99 9999 + 008219 9999 99 99 0 9999 99 9999 + 008220 9999 99 99 0 9999 99 9999 + 008221 9999 99 99 0 9999 99 9999 + 008222 9999 99 99 0 9999 99 9999 + 008223 9999 99 99 0 9999 99 9999 + 008224 9999 99 99 0 9999 99 9999 + 008225 9999 99 99 0 9999 99 9999 + 008226 9999 99 99 0 9999 99 9999 + 008227 9999 99 99 0 9999 99 9999 + 008228 9999 99 99 0 9999 99 9999 + 008229 9999 99 99 0 9999 99 9999 + 008230 9999 99 99 0 9999 99 9999 + 008231 9999 99 99 0 9999 99 9999 + 008232 9999 99 99 0 9999 99 9999 + 008233 9999 99 99 0 9999 99 9999 + 008234 9999 99 99 0 9999 99 9999 + 008235 9999 99 99 0 9999 99 9999 + 008236 9999 99 99 0 9999 99 9999 + 008237 9999 99 99 0 9999 99 9999 + 008238 9999 99 99 0 9999 99 9999 + 008239 9999 99 99 0 9999 99 9999 + 008240 9999 99 99 0 9999 99 9999 + 008241 9999 99 99 0 9999 99 9999 + 008242 9999 99 99 0 9999 99 9999 + 008243 9999 99 99 0 9999 99 9999 + 008244 9999 99 99 0 9999 99 9999 + 008245 9999 99 99 0 9999 99 9999 + 008246 9999 99 99 0 9999 99 9999 + 008247 9999 99 99 0 9999 99 9999 + 008248 9999 99 99 0 9999 99 9999 + 008249 9999 99 99 0 9999 99 9999 + 008250 9999 99 99 0 9999 99 9999 + 008251 9999 99 99 0 9999 99 9999 + 008252 9999 99 99 0 9999 99 9999 + 008253 9999 99 99 0 9999 99 9999 + 008254 9999 99 99 0 9999 99 9999 + 008255 9999 99 99 0 9999 99 9999 + 008256 9999 99 99 0 9999 99 9999 + 008257 9999 99 99 0 9999 99 9999 + 008258 9999 99 99 0 9999 99 9999 + 008259 9999 99 99 0 9999 99 9999 + 008260 9999 99 99 0 9999 99 9999 + 008261 9999 99 99 0 9999 99 9999 + 008262 9999 99 99 0 9999 99 9999 + 008263 9999 99 99 0 9999 99 9999 + 008264 9999 99 99 0 9999 99 9999 + 008265 9999 99 99 0 9999 99 9999 + 008266 9999 99 99 0 9999 99 9999 + 008267 9999 99 99 0 9999 99 9999 + 008268 9999 99 99 0 9999 99 9999 + 008269 9999 99 99 0 9999 99 9999 + 008270 9999 99 99 0 9999 99 9999 + 008271 9999 99 99 0 9999 99 9999 + 008272 9999 99 99 0 9999 99 9999 + 008273 9999 99 99 0 9999 99 9999 + 008274 9999 99 99 0 9999 99 9999 + 008275 9999 99 99 0 9999 99 9999 + 008276 9999 99 99 0 9999 99 9999 + 008277 9999 99 99 0 9999 99 9999 + 008278 9999 99 99 0 9999 99 9999 + 008279 9999 99 99 0 9999 99 9999 + 008280 9999 99 99 0 9999 99 9999 + 008281 9999 99 99 0 9999 99 9999 + 008282 9999 99 99 0 9999 99 9999 + 008283 9999 99 99 0 9999 99 9999 + 008284 9999 99 99 0 9999 99 9999 + 008285 9999 99 99 0 9999 99 9999 + 008286 9999 99 99 0 9999 99 9999 + 008287 9999 99 99 0 9999 99 9999 + 008288 9999 99 99 0 9999 99 9999 + 008289 9999 99 99 0 9999 99 9999 + 008290 9999 99 99 0 9999 99 9999 + 008291 9999 99 99 0 9999 99 9999 + 008292 9999 99 99 0 9999 99 9999 + 008293 9999 99 99 0 9999 99 9999 + 008294 9999 99 99 0 9999 99 9999 + 008295 9999 99 99 0 9999 99 9999 + 008296 9999 99 99 0 9999 99 9999 + 008297 9999 99 99 0 9999 99 9999 + 008298 9999 99 99 0 9999 99 9999 + 008299 9999 99 99 0 9999 99 9999 + 008300 9999 99 99 0 9999 99 9999 + 008301 9999 99 99 0 9999 99 9999 + 008302 9999 99 99 0 9999 99 9999 + 008303 9999 99 99 0 9999 99 9999 + 008304 9999 99 99 0 9999 99 9999 + 008305 9999 99 99 0 9999 99 9999 + 008306 9999 99 99 0 9999 99 9999 + 008307 9999 99 99 0 9999 99 9999 + 008308 9999 99 99 0 9999 99 9999 + 008309 9999 99 99 0 9999 99 9999 + 008310 9999 99 99 0 9999 99 9999 + 008311 9999 99 99 0 9999 99 9999 + 008312 9999 99 99 0 9999 99 9999 + 008313 9999 99 99 0 9999 99 9999 + 008314 9999 99 99 0 9999 99 9999 + 008315 9999 99 99 0 9999 99 9999 + 008316 9999 99 99 0 9999 99 9999 + 008317 9999 99 99 0 9999 99 9999 + 008318 9999 99 99 0 9999 99 9999 + 008319 9999 99 99 0 9999 99 9999 + 008320 9999 99 99 0 9999 99 9999 + 008321 9999 99 99 0 9999 99 9999 + 008322 9999 99 99 0 9999 99 9999 + 008323 9999 99 99 0 9999 99 9999 + 008324 9999 99 99 0 9999 99 9999 + 008325 9999 99 99 0 9999 99 9999 + 008326 9999 99 99 0 9999 99 9999 + 008327 9999 99 99 0 9999 99 9999 + 008328 9999 99 99 0 9999 99 9999 + 008329 9999 99 99 0 9999 99 9999 + 008330 9999 99 99 0 9999 99 9999 + 008331 9999 99 99 0 9999 99 9999 + 008332 9999 99 99 0 9999 99 9999 + 008333 9999 99 99 0 9999 99 9999 + 008334 9999 99 99 0 9999 99 9999 + 008335 9999 99 99 0 9999 99 9999 + 008336 9999 99 99 0 9999 99 9999 + 008337 9999 99 99 0 9999 99 9999 + 008338 9999 99 99 0 9999 99 9999 + 008339 9999 99 99 0 9999 99 9999 + 008340 9999 99 99 0 9999 99 9999 + 008341 9999 99 99 0 9999 99 9999 + 008342 9999 99 99 0 9999 99 9999 + 008343 9999 99 99 0 9999 99 9999 + 008344 9999 99 99 0 9999 99 9999 + 008345 9999 99 99 0 9999 99 9999 + 008346 9999 99 99 0 9999 99 9999 + 008347 9999 99 99 0 9999 99 9999 + 008348 9999 99 99 0 9999 99 9999 + 008349 9999 99 99 0 9999 99 9999 + 008350 9999 99 99 0 9999 99 9999 + 008351 9999 99 99 0 9999 99 9999 + 008352 9999 99 99 0 9999 99 9999 + 008353 9999 99 99 0 9999 99 9999 + 008354 9999 99 99 0 9999 99 9999 + 008355 9999 99 99 0 9999 99 9999 + 008356 9999 99 99 0 9999 99 9999 + 008357 9999 99 99 0 9999 99 9999 + 008358 9999 99 99 0 9999 99 9999 + 008359 9999 99 99 0 9999 99 9999 + 008360 9999 99 99 0 9999 99 9999 + 008361 9999 99 99 0 9999 99 9999 + 008362 9999 99 99 0 9999 99 9999 + 008363 9999 99 99 0 9999 99 9999 + 008364 9999 99 99 0 9999 99 9999 + 008365 9999 99 99 0 9999 99 9999 + 008366 9999 99 99 0 9999 99 9999 + 008367 9999 99 99 0 9999 99 9999 + 008368 9999 99 99 0 9999 99 9999 + 008369 9999 99 99 0 9999 99 9999 + 008370 9999 99 99 0 9999 99 9999 + 008371 9999 99 99 0 9999 99 9999 + 008372 9999 99 99 0 9999 99 9999 + 008373 9999 99 99 0 9999 99 9999 + 008374 9999 99 99 0 9999 99 9999 + 008375 9999 99 99 0 9999 99 9999 + 008376 9999 99 99 0 9999 99 9999 + 008377 9999 99 99 0 9999 99 9999 + 008378 9999 99 99 0 9999 99 9999 + 008379 9999 99 99 0 9999 99 9999 + 008380 9999 99 99 0 9999 99 9999 + 008381 9999 99 99 0 9999 99 9999 + 008382 9999 99 99 0 9999 99 9999 + 008383 9999 99 99 0 9999 99 9999 + 008384 9999 99 99 0 9999 99 9999 + 008385 9999 99 99 0 9999 99 9999 + 008386 9999 99 99 0 9999 99 9999 + 008387 9999 99 99 0 9999 99 9999 + 008388 9999 99 99 0 9999 99 9999 + 008389 9999 99 99 0 9999 99 9999 + 008390 9999 99 99 0 9999 99 9999 + 008391 9999 99 99 0 9999 99 9999 + 008392 9999 99 99 0 9999 99 9999 + 008393 9999 99 99 0 9999 99 9999 + 008394 9999 99 99 0 9999 99 9999 + 008395 9999 99 99 0 9999 99 9999 + 008396 9999 99 99 0 9999 99 9999 + 008397 9999 99 99 0 9999 99 9999 + 008398 9999 99 99 0 9999 99 9999 + 008399 9999 99 99 0 9999 99 9999 + 008400 9999 99 99 0 9999 99 9999 + 008401 9999 99 99 0 9999 99 9999 + 008402 9999 99 99 0 9999 99 9999 + 008403 9999 99 99 0 9999 99 9999 + 008404 9999 99 99 0 9999 99 9999 + 008405 9999 99 99 0 9999 99 9999 + 008406 9999 99 99 0 9999 99 9999 + 008407 9999 99 99 0 9999 99 9999 + 008408 9999 99 99 0 9999 99 9999 + 008409 9999 99 99 0 9999 99 9999 + 008410 9999 99 99 0 9999 99 9999 + 008411 9999 99 99 0 9999 99 9999 + 008412 9999 99 99 0 9999 99 9999 + 008413 9999 99 99 0 9999 99 9999 + 008414 9999 99 99 0 9999 99 9999 + 008415 9999 99 99 0 9999 99 9999 + 008416 9999 99 99 0 9999 99 9999 + 008417 9999 99 99 0 9999 99 9999 + 008418 9999 99 99 0 9999 99 9999 + 008419 9999 99 99 0 9999 99 9999 + 008420 9999 99 99 0 9999 99 9999 + 008421 9999 99 99 0 9999 99 9999 + 008422 9999 99 99 0 9999 99 9999 + 008423 9999 99 99 0 9999 99 9999 + 008424 9999 99 99 0 9999 99 9999 + 008425 9999 99 99 0 9999 99 9999 + 008426 9999 99 99 0 9999 99 9999 + 008427 9999 99 99 0 9999 99 9999 + 008428 9999 99 99 0 9999 99 9999 + 008429 9999 99 99 0 9999 99 9999 + 008430 9999 99 99 0 9999 99 9999 + 008431 9999 99 99 0 9999 99 9999 + 008432 9999 99 99 0 9999 99 9999 + 008433 9999 99 99 0 9999 99 9999 + 008434 9999 99 99 0 9999 99 9999 + 008435 9999 99 99 0 9999 99 9999 + 008436 9999 99 99 0 9999 99 9999 + 008437 9999 99 99 0 9999 99 9999 + 008438 9999 99 99 0 9999 99 9999 + 008439 9999 99 99 0 9999 99 9999 + 008440 9999 99 99 0 9999 99 9999 + 008441 9999 99 99 0 9999 99 9999 + 008442 9999 99 99 0 9999 99 9999 + 008443 9999 99 99 0 9999 99 9999 + 008444 9999 99 99 0 9999 99 9999 + 008445 9999 99 99 0 9999 99 9999 + 008446 9999 99 99 0 9999 99 9999 + 008447 9999 99 99 0 9999 99 9999 + 008448 9999 99 99 0 9999 99 9999 + 008449 9999 99 99 0 9999 99 9999 + 008450 9999 99 99 0 9999 99 9999 + 008451 9999 99 99 0 9999 99 9999 + 008452 9999 99 99 0 9999 99 9999 + 008453 9999 99 99 0 9999 99 9999 + 008454 9999 99 99 0 9999 99 9999 + 008455 9999 99 99 0 9999 99 9999 + 008456 9999 99 99 0 9999 99 9999 + 008457 9999 99 99 0 9999 99 9999 + 008458 9999 99 99 0 9999 99 9999 + 008459 9999 99 99 0 9999 99 9999 + 008460 9999 99 99 0 9999 99 9999 + 008461 9999 99 99 0 9999 99 9999 + 008462 9999 99 99 0 9999 99 9999 + 008463 9999 99 99 0 9999 99 9999 + 008464 9999 99 99 0 9999 99 9999 + 008465 9999 99 99 0 9999 99 9999 + 008466 9999 99 99 0 9999 99 9999 + 008467 9999 99 99 0 9999 99 9999 + 008468 9999 99 99 0 9999 99 9999 + 008469 9999 99 99 0 9999 99 9999 + 008470 9999 99 99 0 9999 99 9999 + 008471 9999 99 99 0 9999 99 9999 + 008472 9999 99 99 0 9999 99 9999 + 008473 9999 99 99 0 9999 99 9999 + 008474 9999 99 99 0 9999 99 9999 + 008475 9999 99 99 0 9999 99 9999 + 008476 9999 99 99 0 9999 99 9999 + 008477 9999 99 99 0 9999 99 9999 + 008478 9999 99 99 0 9999 99 9999 + 008479 9999 99 99 0 9999 99 9999 + 008480 9999 99 99 0 9999 99 9999 + 008481 9999 99 99 0 9999 99 9999 + 008482 9999 99 99 0 9999 99 9999 + 008483 9999 99 99 0 9999 99 9999 + 008484 9999 99 99 0 9999 99 9999 + 008485 9999 99 99 0 9999 99 9999 + 008486 9999 99 99 0 9999 99 9999 + 008487 9999 99 99 0 9999 99 9999 + 008488 9999 99 99 0 9999 99 9999 + 008489 9999 99 99 0 9999 99 9999 + 008490 9999 99 99 0 9999 99 9999 + 008491 9999 99 99 0 9999 99 9999 + 008492 9999 99 99 0 9999 99 9999 + 008493 9999 99 99 0 9999 99 9999 + 008494 9999 99 99 0 9999 99 9999 + 008495 9999 99 99 0 9999 99 9999 + 008496 9999 99 99 0 9999 99 9999 + 008497 9999 99 99 0 9999 99 9999 + 008498 9999 99 99 0 9999 99 9999 + 008499 9999 99 99 0 9999 99 9999 + 008500 9999 99 99 0 9999 99 9999 + 008501 9999 99 99 0 9999 99 9999 + 008502 9999 99 99 0 9999 99 9999 + 008503 9999 99 99 0 9999 99 9999 + 008504 9999 99 99 0 9999 99 9999 + 008505 9999 99 99 0 9999 99 9999 + 008506 9999 99 99 0 9999 99 9999 + 008507 9999 99 99 0 9999 99 9999 + 008508 9999 99 99 0 9999 99 9999 + 008509 9999 99 99 0 9999 99 9999 + 008510 9999 99 99 0 9999 99 9999 + 008511 9999 99 99 0 9999 99 9999 + 008512 9999 99 99 0 9999 99 9999 + 008513 9999 99 99 0 9999 99 9999 + 008514 9999 99 99 0 9999 99 9999 + 008515 9999 99 99 0 9999 99 9999 + 008516 9999 99 99 0 9999 99 9999 + 008517 9999 99 99 0 9999 99 9999 + 008518 9999 99 99 0 9999 99 9999 + 008519 9999 99 99 0 9999 99 9999 + 008520 9999 99 99 0 9999 99 9999 + 008521 9999 99 99 0 9999 99 9999 + 008522 9999 99 99 0 9999 99 9999 + 008523 9999 99 99 0 9999 99 9999 + 008524 9999 99 99 0 9999 99 9999 + 008525 9999 99 99 0 9999 99 9999 + 008526 9999 99 99 0 9999 99 9999 + 008527 9999 99 99 0 9999 99 9999 + 008528 9999 99 99 0 9999 99 9999 + 008529 9999 99 99 0 9999 99 9999 + 008530 9999 99 99 0 9999 99 9999 + 008531 9999 99 99 0 9999 99 9999 + 008532 9999 99 99 0 9999 99 9999 + 008533 9999 99 99 0 9999 99 9999 + 008534 9999 99 99 0 9999 99 9999 + 008535 9999 99 99 0 9999 99 9999 + 008536 9999 99 99 0 9999 99 9999 + 008537 9999 99 99 0 9999 99 9999 + 008538 9999 99 99 0 9999 99 9999 + 008539 9999 99 99 0 9999 99 9999 + 008540 9999 99 99 0 9999 99 9999 + 008541 9999 99 99 0 9999 99 9999 + 008542 9999 99 99 0 9999 99 9999 + 008543 9999 99 99 0 9999 99 9999 + 008544 9999 99 99 0 9999 99 9999 + 008545 9999 99 99 0 9999 99 9999 + 008546 9999 99 99 0 9999 99 9999 + 008547 9999 99 99 0 9999 99 9999 + 008548 9999 99 99 0 9999 99 9999 + 008549 9999 99 99 0 9999 99 9999 + 008550 9999 99 99 0 9999 99 9999 + 008551 9999 99 99 0 9999 99 9999 + 008552 9999 99 99 0 9999 99 9999 + 008553 9999 99 99 0 9999 99 9999 + 008554 9999 99 99 0 9999 99 9999 + 008555 9999 99 99 0 9999 99 9999 + 008556 9999 99 99 0 9999 99 9999 + 008557 9999 99 99 0 9999 99 9999 + 008558 9999 99 99 0 9999 99 9999 + 008559 9999 99 99 0 9999 99 9999 + 008560 9999 99 99 0 9999 99 9999 + 008561 9999 99 99 0 9999 99 9999 + 008562 9999 99 99 0 9999 99 9999 + 008563 9999 99 99 0 9999 99 9999 + 008564 9999 99 99 0 9999 99 9999 + 008565 9999 99 99 0 9999 99 9999 + 008566 9999 99 99 0 9999 99 9999 + 008567 9999 99 99 0 9999 99 9999 + 008568 9999 99 99 0 9999 99 9999 + 008569 9999 99 99 0 9999 99 9999 + 008570 9999 99 99 0 9999 99 9999 + 008571 9999 99 99 0 9999 99 9999 + 008572 9999 99 99 0 9999 99 9999 + 008573 9999 99 99 0 9999 99 9999 + 008574 9999 99 99 0 9999 99 9999 + 008575 9999 99 99 0 9999 99 9999 + 008576 9999 99 99 0 9999 99 9999 + 008577 9999 99 99 0 9999 99 9999 + 008578 9999 99 99 0 9999 99 9999 + 008579 9999 99 99 0 9999 99 9999 + 008580 9999 99 99 0 9999 99 9999 + 008581 9999 99 99 0 9999 99 9999 + 008582 9999 99 99 0 9999 99 9999 + 008583 9999 99 99 0 9999 99 9999 + 008584 9999 99 99 0 9999 99 9999 + 008585 9999 99 99 0 9999 99 9999 + 008586 9999 99 99 0 9999 99 9999 + 008587 9999 99 99 0 9999 99 9999 + 008588 9999 99 99 0 9999 99 9999 + 008589 9999 99 99 0 9999 99 9999 + 008590 9999 99 99 0 9999 99 9999 + 008591 9999 99 99 0 9999 99 9999 + 008592 9999 99 99 0 9999 99 9999 + 008593 9999 99 99 0 9999 99 9999 + 008594 9999 99 99 0 9999 99 9999 + 008595 9999 99 99 0 9999 99 9999 + 008596 9999 99 99 0 9999 99 9999 + 008597 9999 99 99 0 9999 99 9999 + 008598 9999 99 99 0 9999 99 9999 + 008599 9999 99 99 0 9999 99 9999 + 008600 9999 99 99 0 9999 99 9999 + 008601 9999 99 99 0 9999 99 9999 + 008602 9999 99 99 0 9999 99 9999 + 008603 9999 99 99 0 9999 99 9999 + 008604 9999 99 99 0 9999 99 9999 + 008605 9999 99 99 0 9999 99 9999 + 008606 9999 99 99 0 9999 99 9999 + 008607 9999 99 99 0 9999 99 9999 + 008608 9999 99 99 0 9999 99 9999 + 008609 9999 99 99 0 9999 99 9999 + 008610 9999 99 99 0 9999 99 9999 + 008611 9999 99 99 0 9999 99 9999 + 008612 9999 99 99 0 9999 99 9999 + 008613 9999 99 99 0 9999 99 9999 + 008614 9999 99 99 0 9999 99 9999 + 008615 9999 99 99 0 9999 99 9999 + 008616 9999 99 99 0 9999 99 9999 + 008617 9999 99 99 0 9999 99 9999 + 008618 9999 99 99 0 9999 99 9999 + 008619 9999 99 99 0 9999 99 9999 + 008620 9999 99 99 0 9999 99 9999 + 008621 9999 99 99 0 9999 99 9999 + 008622 9999 99 99 0 9999 99 9999 + 008623 9999 99 99 0 9999 99 9999 + 008624 9999 99 99 0 9999 99 9999 + 008625 9999 99 99 0 9999 99 9999 + 008626 9999 99 99 0 9999 99 9999 + 008627 9999 99 99 0 9999 99 9999 + 008628 9999 99 99 0 9999 99 9999 + 008629 9999 99 99 0 9999 99 9999 + 008630 9999 99 99 0 9999 99 9999 + 008631 9999 99 99 0 9999 99 9999 + 008632 9999 99 99 0 9999 99 9999 + 008633 9999 99 99 0 9999 99 9999 + 008634 9999 99 99 0 9999 99 9999 + 008635 9999 99 99 0 9999 99 9999 + 008636 9999 99 99 0 9999 99 9999 + 008637 9999 99 99 0 9999 99 9999 + 008638 9999 99 99 0 9999 99 9999 + 008639 9999 99 99 0 9999 99 9999 + 008640 9999 99 99 0 9999 99 9999 + 008641 9999 99 99 0 9999 99 9999 + 008642 9999 99 99 0 9999 99 9999 + 008643 9999 99 99 0 9999 99 9999 + 008644 9999 99 99 0 9999 99 9999 + 008645 9999 99 99 0 9999 99 9999 + 008646 9999 99 99 0 9999 99 9999 + 008647 9999 99 99 0 9999 99 9999 + 008648 9999 99 99 0 9999 99 9999 + 008649 9999 99 99 0 9999 99 9999 + 008650 9999 99 99 0 9999 99 9999 + 008651 9999 99 99 0 9999 99 9999 + 008652 9999 99 99 0 9999 99 9999 + 008653 9999 99 99 0 9999 99 9999 + 008654 9999 99 99 0 9999 99 9999 + 008655 9999 99 99 0 9999 99 9999 + 008656 9999 99 99 0 9999 99 9999 + 008657 9999 99 99 0 9999 99 9999 + 008658 9999 99 99 0 9999 99 9999 + 008659 9999 99 99 0 9999 99 9999 + 008660 9999 99 99 0 9999 99 9999 + 008661 9999 99 99 0 9999 99 9999 + 008662 9999 99 99 0 9999 99 9999 + 008663 9999 99 99 0 9999 99 9999 + 008664 9999 99 99 0 9999 99 9999 + 008665 9999 99 99 0 9999 99 9999 + 008666 9999 99 99 0 9999 99 9999 + 008667 9999 99 99 0 9999 99 9999 + 008668 9999 99 99 0 9999 99 9999 + 008669 9999 99 99 0 9999 99 9999 + 008670 9999 99 99 0 9999 99 9999 + 008671 9999 99 99 0 9999 99 9999 + 008672 9999 99 99 0 9999 99 9999 + 008673 9999 99 99 0 9999 99 9999 + 008674 9999 99 99 0 9999 99 9999 + 008675 9999 99 99 0 9999 99 9999 + 008676 9999 99 99 0 9999 99 9999 + 008677 9999 99 99 0 9999 99 9999 + 008678 9999 99 99 0 9999 99 9999 + 008679 9999 99 99 0 9999 99 9999 + 008680 9999 99 99 0 9999 99 9999 + 008681 9999 99 99 0 9999 99 9999 + 008682 9999 99 99 0 9999 99 9999 + 008683 9999 99 99 0 9999 99 9999 + 008684 9999 99 99 0 9999 99 9999 + 008685 9999 99 99 0 9999 99 9999 + 008686 9999 99 99 0 9999 99 9999 + 008687 9999 99 99 0 9999 99 9999 + 008688 9999 99 99 0 9999 99 9999 + 008689 9999 99 99 0 9999 99 9999 + 008690 9999 99 99 0 9999 99 9999 + 008691 9999 99 99 0 9999 99 9999 + 008692 9999 99 99 0 9999 99 9999 + 008693 9999 99 99 0 9999 99 9999 + 008694 9999 99 99 0 9999 99 9999 + 008695 9999 99 99 0 9999 99 9999 + 008696 9999 99 99 0 9999 99 9999 + 008697 9999 99 99 0 9999 99 9999 + 008698 9999 99 99 0 9999 99 9999 + 008699 9999 99 99 0 9999 99 9999 + 008700 9999 99 99 0 9999 99 9999 + 008701 9999 99 99 0 9999 99 9999 + 008702 9999 99 99 0 9999 99 9999 + 008703 9999 99 99 0 9999 99 9999 + 008704 9999 99 99 0 9999 99 9999 + 008705 9999 99 99 0 9999 99 9999 + 008706 9999 99 99 0 9999 99 9999 + 008707 9999 99 99 0 9999 99 9999 + 008708 9999 99 99 0 9999 99 9999 + 008709 9999 99 99 0 9999 99 9999 + 008710 9999 99 99 0 9999 99 9999 + 008711 9999 99 99 0 9999 99 9999 + 008712 9999 99 99 0 9999 99 9999 + 008713 9999 99 99 0 9999 99 9999 + 008714 9999 99 99 0 9999 99 9999 + 008715 9999 99 99 0 9999 99 9999 + 008716 9999 99 99 0 9999 99 9999 + 008717 9999 99 99 0 9999 99 9999 + 008718 9999 99 99 0 9999 99 9999 + 008719 9999 99 99 0 9999 99 9999 + 008720 9999 99 99 0 9999 99 9999 + 008721 9999 99 99 0 9999 99 9999 + 008722 9999 99 99 0 9999 99 9999 + 008723 9999 99 99 0 9999 99 9999 + 008724 9999 99 99 0 9999 99 9999 + 008725 9999 99 99 0 9999 99 9999 + 008726 9999 99 99 0 9999 99 9999 + 008727 9999 99 99 0 9999 99 9999 + 008728 9999 99 99 0 9999 99 9999 + 008729 9999 99 99 0 9999 99 9999 + 008730 9999 99 99 0 9999 99 9999 + 008731 9999 99 99 0 9999 99 9999 + 008732 9999 99 99 0 9999 99 9999 + 008733 9999 99 99 0 9999 99 9999 + 008734 9999 99 99 0 9999 99 9999 + 008735 9999 99 99 0 9999 99 9999 + 008736 9999 99 99 0 9999 99 9999 + 008737 9999 99 99 0 9999 99 9999 + 008738 9999 99 99 0 9999 99 9999 + 008739 9999 99 99 0 9999 99 9999 + 008740 9999 99 99 0 9999 99 9999 + 008741 9999 99 99 0 9999 99 9999 + 008742 9999 99 99 0 9999 99 9999 + 008743 9999 99 99 0 9999 99 9999 + 008744 9999 99 99 0 9999 99 9999 + 008745 9999 99 99 0 9999 99 9999 + 008746 9999 99 99 0 9999 99 9999 + 008747 9999 99 99 0 9999 99 9999 + 008748 9999 99 99 0 9999 99 9999 + 008749 9999 99 99 0 9999 99 9999 + 008750 9999 99 99 0 9999 99 9999 + 008751 9999 99 99 0 9999 99 9999 + 008752 9999 99 99 0 9999 99 9999 + 008753 9999 99 99 0 9999 99 9999 + 008754 9999 99 99 0 9999 99 9999 + 008755 9999 99 99 0 9999 99 9999 + 008756 9999 99 99 0 9999 99 9999 + 008757 9999 99 99 0 9999 99 9999 + 008758 9999 99 99 0 9999 99 9999 + 008759 9999 99 99 0 9999 99 9999 + 008760 9999 99 99 0 9999 99 9999 + 008761 9999 99 99 0 9999 99 9999 + 008762 9999 99 99 0 9999 99 9999 + 008763 9999 99 99 0 9999 99 9999 + 008764 9999 99 99 0 9999 99 9999 + 008765 9999 99 99 0 9999 99 9999 + 008766 9999 99 99 0 9999 99 9999 + 008767 9999 99 99 0 9999 99 9999 + 008768 9999 99 99 0 9999 99 9999 + 008769 9999 99 99 0 9999 99 9999 + 008770 9999 99 99 0 9999 99 9999 + 008771 9999 99 99 0 9999 99 9999 + 008772 9999 99 99 0 9999 99 9999 + 008773 9999 99 99 0 9999 99 9999 + 008774 9999 99 99 0 9999 99 9999 + 008775 9999 99 99 0 9999 99 9999 + 008776 9999 99 99 0 9999 99 9999 + 008777 9999 99 99 0 9999 99 9999 + 008778 9999 99 99 0 9999 99 9999 + 008779 9999 99 99 0 9999 99 9999 + 008780 9999 99 99 0 9999 99 9999 + 008781 9999 99 99 0 9999 99 9999 + 008782 9999 99 99 0 9999 99 9999 + 008783 9999 99 99 0 9999 99 9999 + 008784 9999 99 99 0 9999 99 9999 + 008785 9999 99 99 0 9999 99 9999 + 008786 9999 99 99 0 9999 99 9999 + 008787 9999 99 99 0 9999 99 9999 + 008788 9999 99 99 0 9999 99 9999 + 008789 9999 99 99 0 9999 99 9999 + 008790 9999 99 99 0 9999 99 9999 + 008791 9999 99 99 0 9999 99 9999 + 008792 9999 99 99 0 9999 99 9999 + 008793 9999 99 99 0 9999 99 9999 + 008794 9999 99 99 0 9999 99 9999 + 008795 9999 99 99 0 9999 99 9999 + 008796 9999 99 99 0 9999 99 9999 + 008797 9999 99 99 0 9999 99 9999 + 008798 9999 99 99 0 9999 99 9999 + 008799 9999 99 99 0 9999 99 9999 + 008800 9999 99 99 0 9999 99 9999 + 008801 9999 99 99 0 9999 99 9999 + 008802 9999 99 99 0 9999 99 9999 + 008803 9999 99 99 0 9999 99 9999 + 008804 9999 99 99 0 9999 99 9999 + 008805 9999 99 99 0 9999 99 9999 + 008806 9999 99 99 0 9999 99 9999 + 008807 9999 99 99 0 9999 99 9999 + 008808 9999 99 99 0 9999 99 9999 + 008809 9999 99 99 0 9999 99 9999 + 008810 9999 99 99 0 9999 99 9999 + 008811 9999 99 99 0 9999 99 9999 + 008812 9999 99 99 0 9999 99 9999 + 008813 9999 99 99 0 9999 99 9999 + 008814 9999 99 99 0 9999 99 9999 + 008815 9999 99 99 0 9999 99 9999 + 008816 9999 99 99 0 9999 99 9999 + 008817 9999 99 99 0 9999 99 9999 + 008818 9999 99 99 0 9999 99 9999 + 008819 9999 99 99 0 9999 99 9999 + 008820 9999 99 99 0 9999 99 9999 + 008821 9999 99 99 0 9999 99 9999 + 008822 9999 99 99 0 9999 99 9999 + 008823 9999 99 99 0 9999 99 9999 + 008824 9999 99 99 0 9999 99 9999 + 008825 9999 99 99 0 9999 99 9999 + 008826 9999 99 99 0 9999 99 9999 + 008827 9999 99 99 0 9999 99 9999 + 008828 9999 99 99 0 9999 99 9999 + 008829 9999 99 99 0 9999 99 9999 + 008830 9999 99 99 0 9999 99 9999 + 008831 9999 99 99 0 9999 99 9999 + 008832 9999 99 99 0 9999 99 9999 + 008833 9999 99 99 0 9999 99 9999 + 008834 9999 99 99 0 9999 99 9999 + 008835 9999 99 99 0 9999 99 9999 + 008836 9999 99 99 0 9999 99 9999 + 008837 9999 99 99 0 9999 99 9999 + 008838 9999 99 99 0 9999 99 9999 + 008839 9999 99 99 0 9999 99 9999 + 008840 9999 99 99 0 9999 99 9999 + 008841 9999 99 99 0 9999 99 9999 + 008842 9999 99 99 0 9999 99 9999 + 008843 9999 99 99 0 9999 99 9999 + 008844 9999 99 99 0 9999 99 9999 + 008845 9999 99 99 0 9999 99 9999 + 008846 9999 99 99 0 9999 99 9999 + 008847 9999 99 99 0 9999 99 9999 + 008848 9999 99 99 0 9999 99 9999 + 008849 9999 99 99 0 9999 99 9999 + 008850 9999 99 99 0 9999 99 9999 + 008851 9999 99 99 0 9999 99 9999 + 008852 9999 99 99 0 9999 99 9999 + 008853 9999 99 99 0 9999 99 9999 + 008854 9999 99 99 0 9999 99 9999 + 008855 9999 99 99 0 9999 99 9999 + 008856 9999 99 99 0 9999 99 9999 + 008857 9999 99 99 0 9999 99 9999 + 008858 9999 99 99 0 9999 99 9999 + 008859 9999 99 99 0 9999 99 9999 + 008860 9999 99 99 0 9999 99 9999 + 008861 9999 99 99 0 9999 99 9999 + 008862 9999 99 99 0 9999 99 9999 + 008863 9999 99 99 0 9999 99 9999 + 008864 9999 99 99 0 9999 99 9999 + 008865 9999 99 99 0 9999 99 9999 + 008866 9999 99 99 0 9999 99 9999 + 008867 9999 99 99 0 9999 99 9999 + 008868 9999 99 99 0 9999 99 9999 + 008869 9999 99 99 0 9999 99 9999 + 008870 9999 99 99 0 9999 99 9999 + 008871 9999 99 99 0 9999 99 9999 + 008872 9999 99 99 0 9999 99 9999 + 008873 9999 99 99 0 9999 99 9999 + 008874 9999 99 99 0 9999 99 9999 + 008875 9999 99 99 0 9999 99 9999 + 008876 9999 99 99 0 9999 99 9999 + 008877 9999 99 99 0 9999 99 9999 + 008878 9999 99 99 0 9999 99 9999 + 008879 9999 99 99 0 9999 99 9999 + 008880 9999 99 99 0 9999 99 9999 + 008881 9999 99 99 0 9999 99 9999 + 008882 9999 99 99 0 9999 99 9999 + 008883 9999 99 99 0 9999 99 9999 + 008884 9999 99 99 0 9999 99 9999 + 008885 9999 99 99 0 9999 99 9999 + 008886 9999 99 99 0 9999 99 9999 + 008887 9999 99 99 0 9999 99 9999 + 008888 9999 99 99 0 9999 99 9999 + 008889 9999 99 99 0 9999 99 9999 + 008890 9999 99 99 0 9999 99 9999 + 008891 9999 99 99 0 9999 99 9999 + 008892 9999 99 99 0 9999 99 9999 + 008893 9999 99 99 0 9999 99 9999 + 008894 9999 99 99 0 9999 99 9999 + 008895 9999 99 99 0 9999 99 9999 + 008896 9999 99 99 0 9999 99 9999 + 008897 9999 99 99 0 9999 99 9999 + 008898 9999 99 99 0 9999 99 9999 + 008899 9999 99 99 0 9999 99 9999 + 008900 9999 99 99 0 9999 99 9999 + 008901 9999 99 99 0 9999 99 9999 + 008902 9999 99 99 0 9999 99 9999 + 008903 9999 99 99 0 9999 99 9999 + 008904 9999 99 99 0 9999 99 9999 + 008905 9999 99 99 0 9999 99 9999 + 008906 9999 99 99 0 9999 99 9999 + 008907 9999 99 99 0 9999 99 9999 + 008908 9999 99 99 0 9999 99 9999 + 008909 9999 99 99 0 9999 99 9999 + 008910 9999 99 99 0 9999 99 9999 + 008911 9999 99 99 0 9999 99 9999 + 008912 9999 99 99 0 9999 99 9999 + 008913 9999 99 99 0 9999 99 9999 + 008914 9999 99 99 0 9999 99 9999 + 008915 9999 99 99 0 9999 99 9999 + 008916 9999 99 99 0 9999 99 9999 + 008917 9999 99 99 0 9999 99 9999 + 008918 9999 99 99 0 9999 99 9999 + 008919 9999 99 99 0 9999 99 9999 + 008920 9999 99 99 0 9999 99 9999 + 008921 9999 99 99 0 9999 99 9999 + 008922 9999 99 99 0 9999 99 9999 + 008923 9999 99 99 0 9999 99 9999 + 008924 9999 99 99 0 9999 99 9999 + 008925 9999 99 99 0 9999 99 9999 + 008926 9999 99 99 0 9999 99 9999 + 008927 9999 99 99 0 9999 99 9999 + 008928 9999 99 99 0 9999 99 9999 + 008929 9999 99 99 0 9999 99 9999 + 008930 9999 99 99 0 9999 99 9999 + 008931 9999 99 99 0 9999 99 9999 + 008932 9999 99 99 0 9999 99 9999 + 008933 9999 99 99 0 9999 99 9999 + 008934 9999 99 99 0 9999 99 9999 + 008935 9999 99 99 0 9999 99 9999 + 008936 9999 99 99 0 9999 99 9999 + 008937 9999 99 99 0 9999 99 9999 + 008938 9999 99 99 0 9999 99 9999 + 008939 9999 99 99 0 9999 99 9999 + 008940 9999 99 99 0 9999 99 9999 + 008941 9999 99 99 0 9999 99 9999 + 008942 9999 99 99 0 9999 99 9999 + 008943 9999 99 99 0 9999 99 9999 + 008944 9999 99 99 0 9999 99 9999 + 008945 9999 99 99 0 9999 99 9999 + 008946 9999 99 99 0 9999 99 9999 + 008947 9999 99 99 0 9999 99 9999 + 008948 9999 99 99 0 9999 99 9999 + 008949 9999 99 99 0 9999 99 9999 + 008950 9999 99 99 0 9999 99 9999 + 008951 9999 99 99 0 9999 99 9999 + 008952 9999 99 99 0 9999 99 9999 + 008953 9999 99 99 0 9999 99 9999 + 008954 9999 99 99 0 9999 99 9999 + 008955 9999 99 99 0 9999 99 9999 + 008956 9999 99 99 0 9999 99 9999 + 008957 9999 99 99 0 9999 99 9999 + 008958 9999 99 99 0 9999 99 9999 + 008959 9999 99 99 0 9999 99 9999 + 008960 9999 99 99 0 9999 99 9999 + 008961 9999 99 99 0 9999 99 9999 + 008962 9999 99 99 0 9999 99 9999 + 008963 9999 99 99 0 9999 99 9999 + 008964 9999 99 99 0 9999 99 9999 + 008965 9999 99 99 0 9999 99 9999 + 008966 9999 99 99 0 9999 99 9999 + 008967 9999 99 99 0 9999 99 9999 + 008968 9999 99 99 0 9999 99 9999 + 008969 9999 99 99 0 9999 99 9999 + 008970 9999 99 99 0 9999 99 9999 + 008971 9999 99 99 0 9999 99 9999 + 008972 9999 99 99 0 9999 99 9999 + 008973 9999 99 99 0 9999 99 9999 + 008974 9999 99 99 0 9999 99 9999 + 008975 9999 99 99 0 9999 99 9999 + 008976 9999 99 99 0 9999 99 9999 + 008977 9999 99 99 0 9999 99 9999 + 008978 9999 99 99 0 9999 99 9999 + 008979 9999 99 99 0 9999 99 9999 + 008980 9999 99 99 0 9999 99 9999 + 008981 9999 99 99 0 9999 99 9999 + 008982 9999 99 99 0 9999 99 9999 + 008983 9999 99 99 0 9999 99 9999 + 008984 9999 99 99 0 9999 99 9999 + 008985 9999 99 99 0 9999 99 9999 + 008986 9999 99 99 0 9999 99 9999 + 008987 9999 99 99 0 9999 99 9999 + 008988 9999 99 99 0 9999 99 9999 + 008989 9999 99 99 0 9999 99 9999 + 008990 9999 99 99 0 9999 99 9999 + 008991 9999 99 99 0 9999 99 9999 + 008992 9999 99 99 0 9999 99 9999 + 008993 9999 99 99 0 9999 99 9999 + 008994 9999 99 99 0 9999 99 9999 + 008995 9999 99 99 0 9999 99 9999 + 008996 9999 99 99 0 9999 99 9999 + 008997 9999 99 99 0 9999 99 9999 + 008998 9999 99 99 0 9999 99 9999 + 008999 9999 99 99 0 9999 99 9999 + 009000 9999 99 99 0 9999 99 9999 + 009001 9999 99 99 0 9999 99 9999 + 009002 9999 99 99 0 9999 99 9999 + 009003 9999 99 99 0 9999 99 9999 + 009004 9999 99 99 0 9999 99 9999 + 009005 9999 99 99 0 9999 99 9999 + 009006 9999 99 99 0 9999 99 9999 + 009007 9999 99 99 0 9999 99 9999 + 009008 9999 99 99 0 9999 99 9999 + 009009 9999 99 99 0 9999 99 9999 + 009010 9999 99 99 0 9999 99 9999 + 009011 9999 99 99 0 9999 99 9999 + 009012 9999 99 99 0 9999 99 9999 + 009013 9999 99 99 0 9999 99 9999 + 009014 9999 99 99 0 9999 99 9999 + 009015 9999 99 99 0 9999 99 9999 + 009016 9999 99 99 0 9999 99 9999 + 009017 9999 99 99 0 9999 99 9999 + 009018 9999 99 99 0 9999 99 9999 + 009019 9999 99 99 0 9999 99 9999 + 009020 9999 99 99 0 9999 99 9999 + 009021 9999 99 99 0 9999 99 9999 + 009022 9999 99 99 0 9999 99 9999 + 009023 9999 99 99 0 9999 99 9999 + 009024 9999 99 99 0 9999 99 9999 + 009025 9999 99 99 0 9999 99 9999 + 009026 9999 99 99 0 9999 99 9999 + 009027 9999 99 99 0 9999 99 9999 + 009028 9999 99 99 0 9999 99 9999 + 009029 9999 99 99 0 9999 99 9999 + 009030 9999 99 99 0 9999 99 9999 + 009031 9999 99 99 0 9999 99 9999 + 009032 9999 99 99 0 9999 99 9999 + 009033 9999 99 99 0 9999 99 9999 + 009034 9999 99 99 0 9999 99 9999 + 009035 9999 99 99 0 9999 99 9999 + 009036 9999 99 99 0 9999 99 9999 + 009037 9999 99 99 0 9999 99 9999 + 009038 9999 99 99 0 9999 99 9999 + 009039 9999 99 99 0 9999 99 9999 + 009040 9999 99 99 0 9999 99 9999 + 009041 9999 99 99 0 9999 99 9999 + 009042 9999 99 99 0 9999 99 9999 + 009043 9999 99 99 0 9999 99 9999 + 009044 9999 99 99 0 9999 99 9999 + 009045 9999 99 99 0 9999 99 9999 + 009046 9999 99 99 0 9999 99 9999 + 009047 9999 99 99 0 9999 99 9999 + 009048 9999 99 99 0 9999 99 9999 + 009049 9999 99 99 0 9999 99 9999 + 009050 9999 99 99 0 9999 99 9999 + 009051 9999 99 99 0 9999 99 9999 + 009052 9999 99 99 0 9999 99 9999 + 009053 9999 99 99 0 9999 99 9999 + 009054 9999 99 99 0 9999 99 9999 + 009055 9999 99 99 0 9999 99 9999 + 009056 9999 99 99 0 9999 99 9999 + 009057 9999 99 99 0 9999 99 9999 + 009058 9999 99 99 0 9999 99 9999 + 009059 9999 99 99 0 9999 99 9999 + 009060 9999 99 99 0 9999 99 9999 + 009061 9999 99 99 0 9999 99 9999 + 009062 9999 99 99 0 9999 99 9999 + 009063 9999 99 99 0 9999 99 9999 + 009064 9999 99 99 0 9999 99 9999 + 009065 9999 99 99 0 9999 99 9999 + 009066 9999 99 99 0 9999 99 9999 + 009067 9999 99 99 0 9999 99 9999 + 009068 9999 99 99 0 9999 99 9999 + 009069 9999 99 99 0 9999 99 9999 + 009070 9999 99 99 0 9999 99 9999 + 009071 9999 99 99 0 9999 99 9999 + 009072 9999 99 99 0 9999 99 9999 + 009073 9999 99 99 0 9999 99 9999 + 009074 9999 99 99 0 9999 99 9999 + 009075 9999 99 99 0 9999 99 9999 + 009076 9999 99 99 0 9999 99 9999 + 009077 9999 99 99 0 9999 99 9999 + 009078 9999 99 99 0 9999 99 9999 + 009079 9999 99 99 0 9999 99 9999 + 009080 9999 99 99 0 9999 99 9999 + 009081 9999 99 99 0 9999 99 9999 + 009082 9999 99 99 0 9999 99 9999 + 009083 9999 99 99 0 9999 99 9999 + 009084 9999 99 99 0 9999 99 9999 + 009085 9999 99 99 0 9999 99 9999 + 009086 9999 99 99 0 9999 99 9999 + 009087 9999 99 99 0 9999 99 9999 + 009088 9999 99 99 0 9999 99 9999 + 009089 9999 99 99 0 9999 99 9999 + 009090 9999 99 99 0 9999 99 9999 + 009091 9999 99 99 0 9999 99 9999 + 009092 9999 99 99 0 9999 99 9999 + 009093 9999 99 99 0 9999 99 9999 + 009094 9999 99 99 0 9999 99 9999 + 009095 9999 99 99 0 9999 99 9999 + 009096 9999 99 99 0 9999 99 9999 + 009097 9999 99 99 0 9999 99 9999 + 009098 9999 99 99 0 9999 99 9999 + 009099 9999 99 99 0 9999 99 9999 + 009100 9999 99 99 0 9999 99 9999 + 009101 9999 99 99 0 9999 99 9999 + 009102 9999 99 99 0 9999 99 9999 + 009103 9999 99 99 0 9999 99 9999 + 009104 9999 99 99 0 9999 99 9999 + 009105 9999 99 99 0 9999 99 9999 + 009106 9999 99 99 0 9999 99 9999 + 009107 9999 99 99 0 9999 99 9999 + 009108 9999 99 99 0 9999 99 9999 + 009109 9999 99 99 0 9999 99 9999 + 009110 9999 99 99 0 9999 99 9999 + 009111 9999 99 99 0 9999 99 9999 + 009112 9999 99 99 0 9999 99 9999 + 009113 9999 99 99 0 9999 99 9999 + 009114 9999 99 99 0 9999 99 9999 + 009115 9999 99 99 0 9999 99 9999 + 009116 9999 99 99 0 9999 99 9999 + 009117 9999 99 99 0 9999 99 9999 + 009118 9999 99 99 0 9999 99 9999 + 009119 9999 99 99 0 9999 99 9999 + 009120 9999 99 99 0 9999 99 9999 + 009121 9999 99 99 0 9999 99 9999 + 009122 9999 99 99 0 9999 99 9999 + 009123 9999 99 99 0 9999 99 9999 + 009124 9999 99 99 0 9999 99 9999 + 009125 9999 99 99 0 9999 99 9999 + 009126 9999 99 99 0 9999 99 9999 + 009127 9999 99 99 0 9999 99 9999 + 009128 9999 99 99 0 9999 99 9999 + 009129 9999 99 99 0 9999 99 9999 + 009130 9999 99 99 0 9999 99 9999 + 009131 9999 99 99 0 9999 99 9999 + 009132 9999 99 99 0 9999 99 9999 + 009133 9999 99 99 0 9999 99 9999 + 009134 9999 99 99 0 9999 99 9999 + 009135 9999 99 99 0 9999 99 9999 + 009136 9999 99 99 0 9999 99 9999 + 009137 9999 99 99 0 9999 99 9999 + 009138 9999 99 99 0 9999 99 9999 + 009139 9999 99 99 0 9999 99 9999 + 009140 9999 99 99 0 9999 99 9999 + 009141 9999 99 99 0 9999 99 9999 + 009142 9999 99 99 0 9999 99 9999 + 009143 9999 99 99 0 9999 99 9999 + 009144 9999 99 99 0 9999 99 9999 + 009145 9999 99 99 0 9999 99 9999 + 009146 9999 99 99 0 9999 99 9999 + 009147 9999 99 99 0 9999 99 9999 + 009148 9999 99 99 0 9999 99 9999 + 009149 9999 99 99 0 9999 99 9999 + 009150 9999 99 99 0 9999 99 9999 + 009151 9999 99 99 0 9999 99 9999 + 009152 9999 99 99 0 9999 99 9999 + 009153 9999 99 99 0 9999 99 9999 + 009154 9999 99 99 0 9999 99 9999 + 009155 9999 99 99 0 9999 99 9999 + 009156 9999 99 99 0 9999 99 9999 + 009157 9999 99 99 0 9999 99 9999 + 009158 9999 99 99 0 9999 99 9999 + 009159 9999 99 99 0 9999 99 9999 + 009160 9999 99 99 0 9999 99 9999 + 009161 9999 99 99 0 9999 99 9999 + 009162 9999 99 99 0 9999 99 9999 + 009163 9999 99 99 0 9999 99 9999 + 009164 9999 99 99 0 9999 99 9999 + 009165 9999 99 99 0 9999 99 9999 + 009166 9999 99 99 0 9999 99 9999 + 009167 9999 99 99 0 9999 99 9999 + 009168 9999 99 99 0 9999 99 9999 + 009169 9999 99 99 0 9999 99 9999 + 009170 9999 99 99 0 9999 99 9999 + 009171 9999 99 99 0 9999 99 9999 + 009172 9999 99 99 0 9999 99 9999 + 009173 9999 99 99 0 9999 99 9999 + 009174 9999 99 99 0 9999 99 9999 + 009175 9999 99 99 0 9999 99 9999 + 009176 9999 99 99 0 9999 99 9999 + 009177 9999 99 99 0 9999 99 9999 + 009178 9999 99 99 0 9999 99 9999 + 009179 9999 99 99 0 9999 99 9999 + 009180 9999 99 99 0 9999 99 9999 + 009181 9999 99 99 0 9999 99 9999 + 009182 9999 99 99 0 9999 99 9999 + 009183 9999 99 99 0 9999 99 9999 + 009184 9999 99 99 0 9999 99 9999 + 009185 9999 99 99 0 9999 99 9999 + 009186 9999 99 99 0 9999 99 9999 + 009187 9999 99 99 0 9999 99 9999 + 009188 9999 99 99 0 9999 99 9999 + 009189 9999 99 99 0 9999 99 9999 + 009190 9999 99 99 0 9999 99 9999 + 009191 9999 99 99 0 9999 99 9999 + 009192 9999 99 99 0 9999 99 9999 + 009193 9999 99 99 0 9999 99 9999 + 009194 9999 99 99 0 9999 99 9999 + 009195 9999 99 99 0 9999 99 9999 + 009196 9999 99 99 0 9999 99 9999 + 009197 9999 99 99 0 9999 99 9999 + 009198 9999 99 99 0 9999 99 9999 + 009199 9999 99 99 0 9999 99 9999 + 009200 9999 99 99 0 9999 99 9999 + 009201 9999 99 99 0 9999 99 9999 + 009202 9999 99 99 0 9999 99 9999 + 009203 9999 99 99 0 9999 99 9999 + 009204 9999 99 99 0 9999 99 9999 + 009205 9999 99 99 0 9999 99 9999 + 009206 9999 99 99 0 9999 99 9999 + 009207 9999 99 99 0 9999 99 9999 + 009208 9999 99 99 0 9999 99 9999 + 009209 9999 99 99 0 9999 99 9999 + 009210 9999 99 99 0 9999 99 9999 + 009211 9999 99 99 0 9999 99 9999 + 009212 9999 99 99 0 9999 99 9999 + 009213 9999 99 99 0 9999 99 9999 + 009214 9999 99 99 0 9999 99 9999 + 009215 9999 99 99 0 9999 99 9999 + 009216 9999 99 99 0 9999 99 9999 + 009217 1224 01 01 1 303079444 08 0076 + 009218 1224 01 02 1 303079444 09 0076 + 009219 9999 99 99 0 9999 99 9999 + 009220 9999 99 99 0 9999 99 9999 + 009221 9999 99 99 0 9999 99 9999 + 009222 9999 99 99 0 9999 99 9999 + 009223 9999 99 99 0 9999 99 9999 + 009224 9999 99 99 0 9999 99 9999 + 009225 1224 02 01 1 303079444 10 0076 + 009226 1224 02 02 1 303079444 11 0076 + 009227 9999 99 99 0 9999 99 9999 + 009228 9999 99 99 0 9999 99 9999 + 009229 9999 99 99 0 9999 99 9999 + 009230 9999 99 99 0 9999 99 9999 + 009231 9999 99 99 0 9999 99 9999 + 009232 9999 99 99 0 9999 99 9999 + 009233 1224 03 01 1 303079444 12 0076 + 009234 1224 03 02 1 303079444 13 0076 + 009235 9999 99 99 0 9999 99 9999 + 009236 9999 99 99 0 9999 99 9999 + 009237 9999 99 99 0 9999 99 9999 + 009238 9999 99 99 0 9999 99 9999 + 009239 9999 99 99 0 9999 99 9999 + 009240 9999 99 99 0 9999 99 9999 + 009241 1224 04 01 1 303079444 14 0076 + 009242 1224 04 02 1 303079444 15 0076 + 009243 9999 99 99 0 9999 99 9999 + 009244 9999 99 99 0 9999 99 9999 + 009245 9999 99 99 0 9999 99 9999 + 009246 9999 99 99 0 9999 99 9999 + 009247 9999 99 99 0 9999 99 9999 + 009248 9999 99 99 0 9999 99 9999 + 009249 1224 05 01 1 303079444 00 0076 + 009250 1224 05 02 1 303079444 01 0076 + 009251 9999 99 99 0 9999 99 9999 + 009252 9999 99 99 0 9999 99 9999 + 009253 9999 99 99 0 9999 99 9999 + 009254 9999 99 99 0 9999 99 9999 + 009255 9999 99 99 0 9999 99 9999 + 009256 9999 99 99 0 9999 99 9999 + 009257 1224 06 01 1 303079444 02 0076 + 009258 1224 06 02 1 303079444 03 0076 + 009259 9999 99 99 0 9999 99 9999 + 009260 9999 99 99 0 9999 99 9999 + 009261 9999 99 99 0 9999 99 9999 + 009262 9999 99 99 0 9999 99 9999 + 009263 9999 99 99 0 9999 99 9999 + 009264 9999 99 99 0 9999 99 9999 + 009265 1224 07 01 1 303079444 04 0076 + 009266 1224 07 02 1 303079444 05 0076 + 009267 9999 99 99 0 9999 99 9999 + 009268 9999 99 99 0 9999 99 9999 + 009269 9999 99 99 0 9999 99 9999 + 009270 9999 99 99 0 9999 99 9999 + 009271 9999 99 99 0 9999 99 9999 + 009272 9999 99 99 0 9999 99 9999 + 009273 1224 08 01 1 303079444 06 0076 + 009274 1224 08 02 1 303079444 07 0076 + 009275 9999 99 99 0 9999 99 9999 + 009276 9999 99 99 0 9999 99 9999 + 009277 9999 99 99 0 9999 99 9999 + 009278 9999 99 99 0 9999 99 9999 + 009279 9999 99 99 0 9999 99 9999 + 009280 9999 99 99 0 9999 99 9999 + 009281 1224 09 01 1 304181272 00 0277 + 009282 1224 09 02 1 304181272 01 0277 + 009283 1224 09 03 1 304181272 02 0277 + 009284 1224 09 04 1 304181272 03 0277 + 009285 9999 99 99 0 9999 99 9999 + 009286 9999 99 99 0 9999 99 9999 + 009287 9999 99 99 0 9999 99 9999 + 009288 9999 99 99 0 9999 99 9999 + 009289 1224 10 01 1 304181272 04 0277 + 009290 1224 10 02 1 304181272 05 0277 + 009291 1224 10 03 1 304181272 06 0277 + 009292 1224 10 04 1 304181272 07 0277 + 009293 9999 99 99 0 9999 99 9999 + 009294 9999 99 99 0 9999 99 9999 + 009295 9999 99 99 0 9999 99 9999 + 009296 9999 99 99 0 9999 99 9999 + 009297 1224 11 01 1 304181272 08 0277 + 009298 1224 11 02 1 304181272 09 0277 + 009299 1224 11 03 1 304181272 10 0277 + 009300 1224 11 04 1 304181272 11 0277 + 009301 9999 99 99 0 9999 99 9999 + 009302 9999 99 99 0 9999 99 9999 + 009303 9999 99 99 0 9999 99 9999 + 009304 9999 99 99 0 9999 99 9999 + 009305 1224 12 01 1 304181272 12 0277 + 009306 1224 12 02 1 304181272 13 0277 + 009307 1224 12 03 1 304181272 14 0277 + 009308 1224 12 04 1 304181272 15 0277 + 009309 9999 99 99 0 9999 99 9999 + 009310 9999 99 99 0 9999 99 9999 + 009311 9999 99 99 0 9999 99 9999 + 009312 9999 99 99 0 9999 99 9999 + 009313 1224 13 01 1 304181268 08 0276 + 009314 1224 13 02 1 304181268 09 0276 + 009315 1224 13 03 1 304181268 10 0276 + 009316 1224 13 04 1 304181268 11 0276 + 009317 9999 99 99 0 9999 99 9999 + 009318 9999 99 99 0 9999 99 9999 + 009319 9999 99 99 0 9999 99 9999 + 009320 9999 99 99 0 9999 99 9999 + 009321 1224 14 01 1 304181268 12 0276 + 009322 1224 14 02 1 304181268 13 0276 + 009323 1224 14 03 1 304181268 14 0276 + 009324 1224 14 04 1 304181268 15 0276 + 009325 9999 99 99 0 9999 99 9999 + 009326 9999 99 99 0 9999 99 9999 + 009327 9999 99 99 0 9999 99 9999 + 009328 9999 99 99 0 9999 99 9999 + 009329 1224 15 01 1 304181268 00 0276 + 009330 1224 15 02 1 304181268 01 0276 + 009331 1224 15 03 1 304181268 02 0276 + 009332 1224 15 04 1 304181268 03 0276 + 009333 9999 99 99 0 9999 99 9999 + 009334 9999 99 99 0 9999 99 9999 + 009335 9999 99 99 0 9999 99 9999 + 009336 9999 99 99 0 9999 99 9999 + 009337 1224 16 01 1 304181268 04 0276 + 009338 1224 16 02 1 304181268 05 0276 + 009339 1224 16 03 1 304181268 06 0276 + 009340 1224 16 04 1 304181268 07 0276 + 009341 9999 99 99 0 9999 99 9999 + 009342 9999 99 99 0 9999 99 9999 + 009343 9999 99 99 0 9999 99 9999 + 009344 9999 99 99 0 9999 99 9999 + 009345 1224 17 01 1 306397212 00 1086 + 009346 1224 17 02 1 306397212 01 1086 + 009347 1224 17 03 1 306397212 02 1086 + 009348 1224 17 04 1 306397212 03 1086 + 009349 1224 17 05 1 306397212 04 1086 + 009350 1224 17 06 1 306397212 05 1086 + 009351 1224 17 07 1 306397212 06 1086 + 009352 1224 17 08 1 306397212 07 1086 + 009353 1224 18 01 1 306397212 08 1086 + 009354 1224 18 02 1 306397212 09 1086 + 009355 1224 18 03 1 306397212 10 1086 + 009356 1224 18 04 1 306397212 11 1086 + 009357 1224 18 05 1 306397212 12 1086 + 009358 1224 18 06 1 306397212 13 1086 + 009359 1224 18 07 1 306397212 14 1086 + 009360 1224 18 08 1 306397212 15 1086 + 009361 1224 19 01 1 306397216 00 1087 + 009362 1224 19 02 1 306397216 01 1087 + 009363 1224 19 03 1 306397216 02 1087 + 009364 1224 19 04 1 306397216 03 1087 + 009365 1224 19 05 1 306397216 04 1087 + 009366 1224 19 06 1 306397216 05 1087 + 009367 1224 19 07 1 306397216 06 1087 + 009368 1224 19 08 1 306397216 07 1087 + 009369 1224 20 01 1 306397216 08 1087 + 009370 1224 20 02 1 306397216 09 1087 + 009371 1224 20 03 1 306397216 10 1087 + 009372 1224 20 04 1 306397216 11 1087 + 009373 1224 20 05 1 306397216 12 1087 + 009374 1224 20 06 1 306397216 13 1087 + 009375 1224 20 07 1 306397216 14 1087 + 009376 1224 20 08 1 306397216 15 1087 + 009377 1224 21 01 1 306397204 00 1084 + 009378 1224 21 02 1 306397204 01 1084 + 009379 1224 21 03 1 306397204 02 1084 + 009380 1224 21 04 1 306397204 03 1084 + 009381 1224 21 05 1 306397204 04 1084 + 009382 1224 21 06 1 306397204 05 1084 + 009383 1224 21 07 1 306397204 06 1084 + 009384 1224 21 08 1 306397204 07 1084 + 009385 1224 22 01 1 306397204 08 1084 + 009386 1224 22 02 1 306397204 09 1084 + 009387 1224 22 03 1 306397204 10 1084 + 009388 1224 22 04 1 306397204 11 1084 + 009389 1224 22 05 1 306397204 12 1084 + 009390 1224 22 06 1 306397204 13 1084 + 009391 1224 22 07 1 306397204 14 1084 + 009392 1224 22 08 1 306397204 15 1084 + 009393 1224 23 01 1 306397208 00 1085 + 009394 1224 23 02 1 306397208 01 1085 + 009395 1224 23 03 1 306397208 02 1085 + 009396 1224 23 04 1 306397208 03 1085 + 009397 1224 23 05 1 306397208 04 1085 + 009398 1224 23 06 1 306397208 05 1085 + 009399 1224 23 07 1 306397208 06 1085 + 009400 1224 23 08 1 306397208 07 1085 + 009401 1224 24 01 1 306397208 08 1085 + 009402 1224 24 02 1 306397208 09 1085 + 009403 1224 24 03 1 306397208 10 1085 + 009404 1224 24 04 1 306397208 11 1085 + 009405 1224 24 05 1 306397208 12 1085 + 009406 1224 24 06 1 306397208 13 1085 + 009407 1224 24 07 1 306397208 14 1085 + 009408 1224 24 08 1 306397208 15 1085 + 009409 1224 25 01 1 303079448 08 0077 + 009410 1224 25 02 1 303079448 09 0077 + 009411 9999 99 99 0 9999 99 9999 + 009412 9999 99 99 0 9999 99 9999 + 009413 9999 99 99 0 9999 99 9999 + 009414 9999 99 99 0 9999 99 9999 + 009415 9999 99 99 0 9999 99 9999 + 009416 9999 99 99 0 9999 99 9999 + 009417 1224 26 01 1 303079448 10 0077 + 009418 1224 26 02 1 303079448 11 0077 + 009419 9999 99 99 0 9999 99 9999 + 009420 9999 99 99 0 9999 99 9999 + 009421 9999 99 99 0 9999 99 9999 + 009422 9999 99 99 0 9999 99 9999 + 009423 9999 99 99 0 9999 99 9999 + 009424 9999 99 99 0 9999 99 9999 + 009425 1224 27 01 1 303079448 12 0077 + 009426 1224 27 02 1 303079448 13 0077 + 009427 9999 99 99 0 9999 99 9999 + 009428 9999 99 99 0 9999 99 9999 + 009429 9999 99 99 0 9999 99 9999 + 009430 9999 99 99 0 9999 99 9999 + 009431 9999 99 99 0 9999 99 9999 + 009432 9999 99 99 0 9999 99 9999 + 009433 1224 28 01 1 303079448 14 0077 + 009434 1224 28 02 1 303079448 15 0077 + 009435 9999 99 99 0 9999 99 9999 + 009436 9999 99 99 0 9999 99 9999 + 009437 9999 99 99 0 9999 99 9999 + 009438 9999 99 99 0 9999 99 9999 + 009439 9999 99 99 0 9999 99 9999 + 009440 9999 99 99 0 9999 99 9999 + 009441 1224 29 01 1 303079448 04 0077 + 009442 1224 29 02 1 303079448 05 0077 + 009443 9999 99 99 0 9999 99 9999 + 009444 9999 99 99 0 9999 99 9999 + 009445 9999 99 99 0 9999 99 9999 + 009446 9999 99 99 0 9999 99 9999 + 009447 9999 99 99 0 9999 99 9999 + 009448 9999 99 99 0 9999 99 9999 + 009449 1224 30 01 1 303079448 06 0077 + 009450 1224 30 02 1 303079448 07 0077 + 009451 9999 99 99 0 9999 99 9999 + 009452 9999 99 99 0 9999 99 9999 + 009453 9999 99 99 0 9999 99 9999 + 009454 9999 99 99 0 9999 99 9999 + 009455 9999 99 99 0 9999 99 9999 + 009456 9999 99 99 0 9999 99 9999 + 009457 1224 31 01 1 303079448 00 0077 + 009458 1224 31 02 1 303079448 01 0077 + 009459 9999 99 99 0 9999 99 9999 + 009460 9999 99 99 0 9999 99 9999 + 009461 9999 99 99 0 9999 99 9999 + 009462 9999 99 99 0 9999 99 9999 + 009463 9999 99 99 0 9999 99 9999 + 009464 9999 99 99 0 9999 99 9999 + 009465 1224 32 01 1 303079448 02 0077 + 009466 1224 32 02 1 303079448 03 0077 + 009467 9999 99 99 0 9999 99 9999 + 009468 9999 99 99 0 9999 99 9999 + 009469 9999 99 99 0 9999 99 9999 + 009470 9999 99 99 0 9999 99 9999 + 009471 9999 99 99 0 9999 99 9999 + 009472 9999 99 99 0 9999 99 9999 + 009473 1224 33 01 1 306393116 00 1078 + 009474 1224 33 02 1 306393116 01 1078 + 009475 1224 33 03 1 306393116 02 1078 + 009476 1224 33 04 1 306393116 03 1078 + 009477 1224 33 05 1 306393116 04 1078 + 009478 1224 33 06 1 306393116 05 1078 + 009479 1224 33 07 1 306393116 06 1078 + 009480 1224 33 08 1 306393116 07 1078 + 009481 1224 34 01 1 306393116 08 1078 + 009482 1224 34 02 1 306393116 09 1078 + 009483 1224 34 03 1 306393116 10 1078 + 009484 1224 34 04 1 306393116 11 1078 + 009485 1224 34 05 1 306393116 12 1078 + 009486 1224 34 06 1 306393116 13 1078 + 009487 1224 34 07 1 306393116 14 1078 + 009488 1224 34 08 1 306393116 15 1078 + 009489 1224 35 01 1 306393120 00 1079 + 009490 1224 35 02 1 306393120 01 1079 + 009491 1224 35 03 1 306393120 02 1079 + 009492 1224 35 04 1 306393120 03 1079 + 009493 1224 35 05 1 306393120 04 1079 + 009494 1224 35 06 1 306393120 05 1079 + 009495 1224 35 07 1 306393120 06 1079 + 009496 1224 35 08 1 306393120 07 1079 + 009497 1224 36 01 1 306393120 08 1079 + 009498 1224 36 02 1 306393120 09 1079 + 009499 1224 36 03 1 306393120 10 1079 + 009500 1224 36 04 1 306393120 11 1079 + 009501 1224 36 05 1 306393120 12 1079 + 009502 1224 36 06 1 306393120 13 1079 + 009503 1224 36 07 1 306393120 14 1079 + 009504 1224 36 08 1 306393120 15 1079 + 009505 1224 37 01 1 306393108 00 1076 + 009506 1224 37 02 1 306393108 01 1076 + 009507 1224 37 03 1 306393108 02 1076 + 009508 1224 37 04 1 306393108 03 1076 + 009509 1224 37 05 1 306393108 04 1076 + 009510 1224 37 06 1 306393108 05 1076 + 009511 1224 37 07 1 306393108 06 1076 + 009512 1224 37 08 1 306393108 07 1076 + 009513 1224 38 01 1 306393108 08 1076 + 009514 1224 38 02 1 306393108 09 1076 + 009515 1224 38 03 1 306393108 10 1076 + 009516 1224 38 04 1 306393108 11 1076 + 009517 1224 38 05 1 306393108 12 1076 + 009518 1224 38 06 1 306393108 13 1076 + 009519 1224 38 07 1 306393108 14 1076 + 009520 1224 38 08 1 306393108 15 1076 + 009521 1224 39 01 1 306393112 00 1077 + 009522 1224 39 02 1 306393112 01 1077 + 009523 1224 39 03 1 306393112 02 1077 + 009524 1224 39 04 1 306393112 03 1077 + 009525 1224 39 05 1 306393112 04 1077 + 009526 1224 39 06 1 306393112 05 1077 + 009527 1224 39 07 1 306393112 06 1077 + 009528 1224 39 08 1 306393112 07 1077 + 009529 1224 40 01 1 306393112 08 1077 + 009530 1224 40 02 1 306393112 09 1077 + 009531 1224 40 03 1 306393112 10 1077 + 009532 1224 40 04 1 306393112 11 1077 + 009533 1224 40 05 1 306393112 12 1077 + 009534 1224 40 06 1 306393112 13 1077 + 009535 1224 40 07 1 306393112 14 1077 + 009536 1224 40 08 1 306393112 15 1077 + 009537 1224 41 01 1 304181276 00 0278 + 009538 1224 41 02 1 304181276 01 0278 + 009539 1224 41 03 1 304181276 02 0278 + 009540 1224 41 04 1 304181276 03 0278 + 009541 9999 99 99 0 9999 99 9999 + 009542 9999 99 99 0 9999 99 9999 + 009543 9999 99 99 0 9999 99 9999 + 009544 9999 99 99 0 9999 99 9999 + 009545 1224 42 01 1 304181276 04 0278 + 009546 1224 42 02 1 304181276 05 0278 + 009547 1224 42 03 1 304181276 06 0278 + 009548 1224 42 04 1 304181276 07 0278 + 009549 9999 99 99 0 9999 99 9999 + 009550 9999 99 99 0 9999 99 9999 + 009551 9999 99 99 0 9999 99 9999 + 009552 9999 99 99 0 9999 99 9999 + 009553 1224 43 01 1 304181276 08 0278 + 009554 1224 43 02 1 304181276 09 0278 + 009555 1224 43 03 1 304181276 10 0278 + 009556 1224 43 04 1 304181276 11 0278 + 009557 9999 99 99 0 9999 99 9999 + 009558 9999 99 99 0 9999 99 9999 + 009559 9999 99 99 0 9999 99 9999 + 009560 9999 99 99 0 9999 99 9999 + 009561 1224 44 01 1 304181276 12 0278 + 009562 1224 44 02 1 304181276 13 0278 + 009563 1224 44 03 1 304181276 14 0278 + 009564 1224 44 04 1 304181276 15 0278 + 009565 9999 99 99 0 9999 99 9999 + 009566 9999 99 99 0 9999 99 9999 + 009567 9999 99 99 0 9999 99 9999 + 009568 9999 99 99 0 9999 99 9999 + 009569 1224 45 01 1 304181280 00 0279 + 009570 1224 45 02 1 304181280 01 0279 + 009571 1224 45 03 1 304181280 02 0279 + 009572 1224 45 04 1 304181280 03 0279 + 009573 9999 99 99 0 9999 99 9999 + 009574 9999 99 99 0 9999 99 9999 + 009575 9999 99 99 0 9999 99 9999 + 009576 9999 99 99 0 9999 99 9999 + 009577 1224 46 01 1 304181280 04 0279 + 009578 1224 46 02 1 304181280 05 0279 + 009579 1224 46 03 1 304181280 06 0279 + 009580 1224 46 04 1 304181280 07 0279 + 009581 9999 99 99 0 9999 99 9999 + 009582 9999 99 99 0 9999 99 9999 + 009583 9999 99 99 0 9999 99 9999 + 009584 9999 99 99 0 9999 99 9999 + 009585 1224 47 01 1 304181280 08 0279 + 009586 1224 47 02 1 304181280 09 0279 + 009587 1224 47 03 1 304181280 10 0279 + 009588 1224 47 04 1 304181280 11 0279 + 009589 9999 99 99 0 9999 99 9999 + 009590 9999 99 99 0 9999 99 9999 + 009591 9999 99 99 0 9999 99 9999 + 009592 9999 99 99 0 9999 99 9999 + 009593 1224 48 01 1 304181280 12 0279 + 009594 1224 48 02 1 304181280 13 0279 + 009595 1224 48 03 1 304181280 14 0279 + 009596 1224 48 04 1 304181280 15 0279 + 009597 9999 99 99 0 9999 99 9999 + 009598 9999 99 99 0 9999 99 9999 + 009599 9999 99 99 0 9999 99 9999 + 009600 9999 99 99 0 9999 99 9999 + 009601 1225 01 01 1 304177176 08 0269 + 009602 1225 01 02 1 304177176 09 0269 + 009603 1225 01 03 1 304177176 10 0269 + 009604 1225 01 04 1 304177176 11 0269 + 009605 9999 99 99 0 9999 99 9999 + 009606 9999 99 99 0 9999 99 9999 + 009607 9999 99 99 0 9999 99 9999 + 009608 9999 99 99 0 9999 99 9999 + 009609 1225 02 01 1 304177176 12 0269 + 009610 1225 02 02 1 304177176 13 0269 + 009611 1225 02 03 1 304177176 14 0269 + 009612 1225 02 04 1 304177176 15 0269 + 009613 9999 99 99 0 9999 99 9999 + 009614 9999 99 99 0 9999 99 9999 + 009615 9999 99 99 0 9999 99 9999 + 009616 9999 99 99 0 9999 99 9999 + 009617 1225 03 01 1 304177176 00 0269 + 009618 1225 03 02 1 304177176 01 0269 + 009619 1225 03 03 1 304177176 02 0269 + 009620 1225 03 04 1 304177176 03 0269 + 009621 9999 99 99 0 9999 99 9999 + 009622 9999 99 99 0 9999 99 9999 + 009623 9999 99 99 0 9999 99 9999 + 009624 9999 99 99 0 9999 99 9999 + 009625 1225 04 01 1 304177176 04 0269 + 009626 1225 04 02 1 304177176 05 0269 + 009627 1225 04 03 1 304177176 06 0269 + 009628 1225 04 04 1 304177176 07 0269 + 009629 9999 99 99 0 9999 99 9999 + 009630 9999 99 99 0 9999 99 9999 + 009631 9999 99 99 0 9999 99 9999 + 009632 9999 99 99 0 9999 99 9999 + 009633 1225 05 01 1 304177172 08 0268 + 009634 1225 05 02 1 304177172 09 0268 + 009635 1225 05 03 1 304177172 10 0268 + 009636 1225 05 04 1 304177172 11 0268 + 009637 9999 99 99 0 9999 99 9999 + 009638 9999 99 99 0 9999 99 9999 + 009639 9999 99 99 0 9999 99 9999 + 009640 9999 99 99 0 9999 99 9999 + 009641 1225 06 01 1 304177172 12 0268 + 009642 1225 06 02 1 304177172 13 0268 + 009643 1225 06 03 1 304177172 14 0268 + 009644 1225 06 04 1 304177172 15 0268 + 009645 9999 99 99 0 9999 99 9999 + 009646 9999 99 99 0 9999 99 9999 + 009647 9999 99 99 0 9999 99 9999 + 009648 9999 99 99 0 9999 99 9999 + 009649 1225 07 01 1 304177172 00 0268 + 009650 1225 07 02 1 304177172 01 0268 + 009651 1225 07 03 1 304177172 02 0268 + 009652 1225 07 04 1 304177172 03 0268 + 009653 9999 99 99 0 9999 99 9999 + 009654 9999 99 99 0 9999 99 9999 + 009655 9999 99 99 0 9999 99 9999 + 009656 9999 99 99 0 9999 99 9999 + 009657 1225 08 01 1 304177172 04 0268 + 009658 1225 08 02 1 304177172 05 0268 + 009659 1225 08 03 1 304177172 06 0268 + 009660 1225 08 04 1 304177172 07 0268 + 009661 9999 99 99 0 9999 99 9999 + 009662 9999 99 99 0 9999 99 9999 + 009663 9999 99 99 0 9999 99 9999 + 009664 9999 99 99 0 9999 99 9999 + 009665 1225 09 01 1 306389016 00 1069 + 009666 1225 09 02 1 306389016 01 1069 + 009667 1225 09 03 1 306389016 02 1069 + 009668 1225 09 04 1 306389016 03 1069 + 009669 1225 09 05 1 306389016 04 1069 + 009670 1225 09 06 1 306389016 05 1069 + 009671 1225 09 07 1 306389016 06 1069 + 009672 1225 09 08 1 306389016 07 1069 + 009673 1225 10 01 1 306389016 08 1069 + 009674 1225 10 02 1 306389016 09 1069 + 009675 1225 10 03 1 306389016 10 1069 + 009676 1225 10 04 1 306389016 11 1069 + 009677 1225 10 05 1 306389016 12 1069 + 009678 1225 10 06 1 306389016 13 1069 + 009679 1225 10 07 1 306389016 14 1069 + 009680 1225 10 08 1 306389016 15 1069 + 009681 1225 11 01 1 306389012 00 1068 + 009682 1225 11 02 1 306389012 01 1068 + 009683 1225 11 03 1 306389012 02 1068 + 009684 1225 11 04 1 306389012 03 1068 + 009685 1225 11 05 1 306389012 04 1068 + 009686 1225 11 06 1 306389012 05 1068 + 009687 1225 11 07 1 306389012 06 1068 + 009688 1225 11 08 1 306389012 07 1068 + 009689 1225 12 01 1 306389012 08 1068 + 009690 1225 12 02 1 306389012 09 1068 + 009691 1225 12 03 1 306389012 10 1068 + 009692 1225 12 04 1 306389012 11 1068 + 009693 1225 12 05 1 306389012 12 1068 + 009694 1225 12 06 1 306389012 13 1068 + 009695 1225 12 07 1 306389012 14 1068 + 009696 1225 12 08 1 306389012 15 1068 + 009697 1225 13 01 1 306389024 00 1071 + 009698 1225 13 02 1 306389024 01 1071 + 009699 1225 13 03 1 306389024 02 1071 + 009700 1225 13 04 1 306389024 03 1071 + 009701 1225 13 05 1 306389024 04 1071 + 009702 1225 13 06 1 306389024 05 1071 + 009703 1225 13 07 1 306389024 06 1071 + 009704 1225 13 08 1 306389024 07 1071 + 009705 1225 14 01 1 306389024 08 1071 + 009706 1225 14 02 1 306389024 09 1071 + 009707 1225 14 03 1 306389024 10 1071 + 009708 1225 14 04 1 306389024 11 1071 + 009709 1225 14 05 1 306389024 12 1071 + 009710 1225 14 06 1 306389024 13 1071 + 009711 1225 14 07 1 306389024 14 1071 + 009712 1225 14 08 1 306389024 15 1071 + 009713 1225 15 01 1 306389020 00 1070 + 009714 1225 15 02 1 306389020 01 1070 + 009715 1225 15 03 1 306389020 02 1070 + 009716 1225 15 04 1 306389020 03 1070 + 009717 1225 15 05 1 306389020 04 1070 + 009718 1225 15 06 1 306389020 05 1070 + 009719 1225 15 07 1 306389020 06 1070 + 009720 1225 15 08 1 306389020 07 1070 + 009721 1225 16 01 1 306389020 08 1070 + 009722 1225 16 02 1 306389020 09 1070 + 009723 1225 16 03 1 306389020 10 1070 + 009724 1225 16 04 1 306389020 11 1070 + 009725 1225 16 05 1 306389020 12 1070 + 009726 1225 16 06 1 306389020 13 1070 + 009727 1225 16 07 1 306389020 14 1070 + 009728 1225 16 08 1 306389020 15 1070 + 009729 1225 17 01 1 303079452 12 0078 + 009730 1225 17 02 1 303079452 13 0078 + 009731 9999 99 99 0 9999 99 9999 + 009732 9999 99 99 0 9999 99 9999 + 009733 9999 99 99 0 9999 99 9999 + 009734 9999 99 99 0 9999 99 9999 + 009735 9999 99 99 0 9999 99 9999 + 009736 9999 99 99 0 9999 99 9999 + 009737 1225 18 01 1 303079452 14 0078 + 009738 1225 18 02 1 303079452 15 0078 + 009739 9999 99 99 0 9999 99 9999 + 009740 9999 99 99 0 9999 99 9999 + 009741 9999 99 99 0 9999 99 9999 + 009742 9999 99 99 0 9999 99 9999 + 009743 9999 99 99 0 9999 99 9999 + 009744 9999 99 99 0 9999 99 9999 + 009745 1225 19 01 1 303079452 08 0078 + 009746 1225 19 02 1 303079452 09 0078 + 009747 9999 99 99 0 9999 99 9999 + 009748 9999 99 99 0 9999 99 9999 + 009749 9999 99 99 0 9999 99 9999 + 009750 9999 99 99 0 9999 99 9999 + 009751 9999 99 99 0 9999 99 9999 + 009752 9999 99 99 0 9999 99 9999 + 009753 1225 20 01 1 303079452 10 0078 + 009754 1225 20 02 1 303079452 11 0078 + 009755 9999 99 99 0 9999 99 9999 + 009756 9999 99 99 0 9999 99 9999 + 009757 9999 99 99 0 9999 99 9999 + 009758 9999 99 99 0 9999 99 9999 + 009759 9999 99 99 0 9999 99 9999 + 009760 9999 99 99 0 9999 99 9999 + 009761 1225 21 01 1 303079452 00 0078 + 009762 1225 21 02 1 303079452 01 0078 + 009763 9999 99 99 0 9999 99 9999 + 009764 9999 99 99 0 9999 99 9999 + 009765 9999 99 99 0 9999 99 9999 + 009766 9999 99 99 0 9999 99 9999 + 009767 9999 99 99 0 9999 99 9999 + 009768 9999 99 99 0 9999 99 9999 + 009769 1225 22 01 1 303079452 02 0078 + 009770 1225 22 02 1 303079452 03 0078 + 009771 9999 99 99 0 9999 99 9999 + 009772 9999 99 99 0 9999 99 9999 + 009773 9999 99 99 0 9999 99 9999 + 009774 9999 99 99 0 9999 99 9999 + 009775 9999 99 99 0 9999 99 9999 + 009776 9999 99 99 0 9999 99 9999 + 009777 1225 23 01 1 303079452 04 0078 + 009778 1225 23 02 1 303079452 05 0078 + 009779 9999 99 99 0 9999 99 9999 + 009780 9999 99 99 0 9999 99 9999 + 009781 9999 99 99 0 9999 99 9999 + 009782 9999 99 99 0 9999 99 9999 + 009783 9999 99 99 0 9999 99 9999 + 009784 9999 99 99 0 9999 99 9999 + 009785 1225 24 01 1 303079452 06 0078 + 009786 1225 24 02 1 303079452 07 0078 + 009787 9999 99 99 0 9999 99 9999 + 009788 9999 99 99 0 9999 99 9999 + 009789 9999 99 99 0 9999 99 9999 + 009790 9999 99 99 0 9999 99 9999 + 009791 9999 99 99 0 9999 99 9999 + 009792 9999 99 99 0 9999 99 9999 + 009793 1225 25 01 1 305279004 00 0598 + 009794 1225 25 02 1 305279004 01 0598 + 009795 1225 25 03 1 305279004 02 0598 + 009796 1225 25 04 1 305279004 03 0598 + 009797 1225 25 05 1 305279004 04 0598 + 009798 1225 25 06 1 305279004 05 0598 + 009799 1225 25 07 1 305279004 06 0598 + 009800 1225 25 08 1 305279004 07 0598 + 009801 1225 26 01 1 305279004 08 0598 + 009802 1225 26 02 1 305279004 09 0598 + 009803 1225 26 03 1 305279004 10 0598 + 009804 1225 26 04 1 305279004 11 0598 + 009805 1225 26 05 1 305279004 12 0598 + 009806 1225 26 06 1 305279004 13 0598 + 009807 1225 26 07 1 305279004 14 0598 + 009808 1225 26 08 1 305279004 15 0598 + 009809 1225 27 01 1 305279008 00 0599 + 009810 1225 27 02 1 305279008 01 0599 + 009811 1225 27 03 1 305279008 02 0599 + 009812 1225 27 04 1 305279008 03 0599 + 009813 1225 27 05 1 305279008 04 0599 + 009814 1225 27 06 1 305279008 05 0599 + 009815 1225 27 07 1 305279008 06 0599 + 009816 1225 27 08 1 305279008 07 0599 + 009817 1225 28 01 1 305279008 08 0599 + 009818 1225 28 02 1 305279008 09 0599 + 009819 1225 28 03 1 305279008 10 0599 + 009820 1225 28 04 1 305279008 11 0599 + 009821 1225 28 05 1 305279008 12 0599 + 009822 1225 28 06 1 305279008 13 0599 + 009823 1225 28 07 1 305279008 14 0599 + 009824 1225 28 08 1 305279008 15 0599 + 009825 1225 29 01 1 305278996 00 0596 + 009826 1225 29 02 1 305278996 01 0596 + 009827 1225 29 03 1 305278996 02 0596 + 009828 1225 29 04 1 305278996 03 0596 + 009829 1225 29 05 1 305278996 04 0596 + 009830 1225 29 06 1 305278996 05 0596 + 009831 1225 29 07 1 305278996 06 0596 + 009832 1225 29 08 1 305278996 07 0596 + 009833 1225 30 01 1 305278996 08 0596 + 009834 1225 30 02 1 305278996 09 0596 + 009835 1225 30 03 1 305278996 10 0596 + 009836 1225 30 04 1 305278996 11 0596 + 009837 1225 30 05 1 305278996 12 0596 + 009838 1225 30 06 1 305278996 13 0596 + 009839 1225 30 07 1 305278996 14 0596 + 009840 1225 30 08 1 305278996 15 0596 + 009841 1225 31 01 1 305279000 00 0597 + 009842 1225 31 02 1 305279000 01 0597 + 009843 1225 31 03 1 305279000 02 0597 + 009844 1225 31 04 1 305279000 03 0597 + 009845 1225 31 05 1 305279000 04 0597 + 009846 1225 31 06 1 305279000 05 0597 + 009847 1225 31 07 1 305279000 06 0597 + 009848 1225 31 08 1 305279000 07 0597 + 009849 1225 32 01 1 305279000 08 0597 + 009850 1225 32 02 1 305279000 09 0597 + 009851 1225 32 03 1 305279000 10 0597 + 009852 1225 32 04 1 305279000 11 0597 + 009853 1225 32 05 1 305279000 12 0597 + 009854 1225 32 06 1 305279000 13 0597 + 009855 1225 32 07 1 305279000 14 0597 + 009856 1225 32 08 1 305279000 15 0597 + 009857 1225 33 01 1 306384920 00 1061 + 009858 1225 33 02 1 306384920 01 1061 + 009859 1225 33 03 1 306384920 02 1061 + 009860 1225 33 04 1 306384920 03 1061 + 009861 1225 33 05 1 306384920 04 1061 + 009862 1225 33 06 1 306384920 05 1061 + 009863 1225 33 07 1 306384920 06 1061 + 009864 1225 33 08 1 306384920 07 1061 + 009865 1225 34 01 1 306384920 08 1061 + 009866 1225 34 02 1 306384920 09 1061 + 009867 1225 34 03 1 306384920 10 1061 + 009868 1225 34 04 1 306384920 11 1061 + 009869 1225 34 05 1 306384920 12 1061 + 009870 1225 34 06 1 306384920 13 1061 + 009871 1225 34 07 1 306384920 14 1061 + 009872 1225 34 08 1 306384920 15 1061 + 009873 1225 35 01 1 306384916 00 1060 + 009874 1225 35 02 1 306384916 01 1060 + 009875 1225 35 03 1 306384916 02 1060 + 009876 1225 35 04 1 306384916 03 1060 + 009877 1225 35 05 1 306384916 04 1060 + 009878 1225 35 06 1 306384916 05 1060 + 009879 1225 35 07 1 306384916 06 1060 + 009880 1225 35 08 1 306384916 07 1060 + 009881 1225 36 01 1 306384916 08 1060 + 009882 1225 36 02 1 306384916 09 1060 + 009883 1225 36 03 1 306384916 10 1060 + 009884 1225 36 04 1 306384916 11 1060 + 009885 1225 36 05 1 306384916 12 1060 + 009886 1225 36 06 1 306384916 13 1060 + 009887 1225 36 07 1 306384916 14 1060 + 009888 1225 36 08 1 306384916 15 1060 + 009889 1225 37 01 1 306384928 00 1063 + 009890 1225 37 02 1 306384928 01 1063 + 009891 1225 37 03 1 306384928 02 1063 + 009892 1225 37 04 1 306384928 03 1063 + 009893 1225 37 05 1 306384928 04 1063 + 009894 1225 37 06 1 306384928 05 1063 + 009895 1225 37 07 1 306384928 06 1063 + 009896 1225 37 08 1 306384928 07 1063 + 009897 1225 38 01 1 306384928 08 1063 + 009898 1225 38 02 1 306384928 09 1063 + 009899 1225 38 03 1 306384928 10 1063 + 009900 1225 38 04 1 306384928 11 1063 + 009901 1225 38 05 1 306384928 12 1063 + 009902 1225 38 06 1 306384928 13 1063 + 009903 1225 38 07 1 306384928 14 1063 + 009904 1225 38 08 1 306384928 15 1063 + 009905 1225 39 01 1 306384924 00 1062 + 009906 1225 39 02 1 306384924 01 1062 + 009907 1225 39 03 1 306384924 02 1062 + 009908 1225 39 04 1 306384924 03 1062 + 009909 1225 39 05 1 306384924 04 1062 + 009910 1225 39 06 1 306384924 05 1062 + 009911 1225 39 07 1 306384924 06 1062 + 009912 1225 39 08 1 306384924 07 1062 + 009913 1225 40 01 1 306384924 08 1062 + 009914 1225 40 02 1 306384924 09 1062 + 009915 1225 40 03 1 306384924 10 1062 + 009916 1225 40 04 1 306384924 11 1062 + 009917 1225 40 05 1 306384924 12 1062 + 009918 1225 40 06 1 306384924 13 1062 + 009919 1225 40 07 1 306384924 14 1062 + 009920 1225 40 08 1 306384924 15 1062 + 009921 1225 41 01 1 304177184 08 0271 + 009922 1225 41 02 1 304177184 09 0271 + 009923 1225 41 03 1 304177184 10 0271 + 009924 1225 41 04 1 304177184 11 0271 + 009925 9999 99 99 0 9999 99 9999 + 009926 9999 99 99 0 9999 99 9999 + 009927 9999 99 99 0 9999 99 9999 + 009928 9999 99 99 0 9999 99 9999 + 009929 1225 42 01 1 304177184 12 0271 + 009930 1225 42 02 1 304177184 13 0271 + 009931 1225 42 03 1 304177184 14 0271 + 009932 1225 42 04 1 304177184 15 0271 + 009933 9999 99 99 0 9999 99 9999 + 009934 9999 99 99 0 9999 99 9999 + 009935 9999 99 99 0 9999 99 9999 + 009936 9999 99 99 0 9999 99 9999 + 009937 1225 43 01 1 304177184 00 0271 + 009938 1225 43 02 1 304177184 01 0271 + 009939 1225 43 03 1 304177184 02 0271 + 009940 1225 43 04 1 304177184 03 0271 + 009941 9999 99 99 0 9999 99 9999 + 009942 9999 99 99 0 9999 99 9999 + 009943 9999 99 99 0 9999 99 9999 + 009944 9999 99 99 0 9999 99 9999 + 009945 1225 44 01 1 304177184 04 0271 + 009946 1225 44 02 1 304177184 05 0271 + 009947 1225 44 03 1 304177184 06 0271 + 009948 1225 44 04 1 304177184 07 0271 + 009949 9999 99 99 0 9999 99 9999 + 009950 9999 99 99 0 9999 99 9999 + 009951 9999 99 99 0 9999 99 9999 + 009952 9999 99 99 0 9999 99 9999 + 009953 1225 45 01 1 304177180 08 0270 + 009954 1225 45 02 1 304177180 09 0270 + 009955 1225 45 03 1 304177180 10 0270 + 009956 1225 45 04 1 304177180 11 0270 + 009957 9999 99 99 0 9999 99 9999 + 009958 9999 99 99 0 9999 99 9999 + 009959 9999 99 99 0 9999 99 9999 + 009960 9999 99 99 0 9999 99 9999 + 009961 1225 46 01 1 304177180 12 0270 + 009962 1225 46 02 1 304177180 13 0270 + 009963 1225 46 03 1 304177180 14 0270 + 009964 1225 46 04 1 304177180 15 0270 + 009965 9999 99 99 0 9999 99 9999 + 009966 9999 99 99 0 9999 99 9999 + 009967 9999 99 99 0 9999 99 9999 + 009968 9999 99 99 0 9999 99 9999 + 009969 1225 47 01 1 304177180 00 0270 + 009970 1225 47 02 1 304177180 01 0270 + 009971 1225 47 03 1 304177180 02 0270 + 009972 1225 47 04 1 304177180 03 0270 + 009973 9999 99 99 0 9999 99 9999 + 009974 9999 99 99 0 9999 99 9999 + 009975 9999 99 99 0 9999 99 9999 + 009976 9999 99 99 0 9999 99 9999 + 009977 1225 48 01 1 304177180 04 0270 + 009978 1225 48 02 1 304177180 05 0270 + 009979 1225 48 03 1 304177180 06 0270 + 009980 1225 48 04 1 304177180 07 0270 + 009981 9999 99 99 0 9999 99 9999 + 009982 9999 99 99 0 9999 99 9999 + 009983 9999 99 99 0 9999 99 9999 + 009984 9999 99 99 0 9999 99 9999 + 009985 1226 01 01 1 305274908 00 0590 + 009986 1226 01 02 1 305274908 01 0590 + 009987 1226 01 03 1 305274908 02 0590 + 009988 1226 01 04 1 305274908 03 0590 + 009989 1226 01 05 1 305274908 04 0590 + 009990 1226 01 06 1 305274908 05 0590 + 009991 1226 01 07 1 305274908 06 0590 + 009992 1226 01 08 1 305274908 07 0590 + 009993 1226 02 01 1 305274908 08 0590 + 009994 1226 02 02 1 305274908 09 0590 + 009995 1226 02 03 1 305274908 10 0590 + 009996 1226 02 04 1 305274908 11 0590 + 009997 1226 02 05 1 305274908 12 0590 + 009998 1226 02 06 1 305274908 13 0590 + 009999 1226 02 07 1 305274908 14 0590 + 010000 1226 02 08 1 305274908 15 0590 + 010001 1226 03 01 1 305274912 00 0591 + 010002 1226 03 02 1 305274912 01 0591 + 010003 1226 03 03 1 305274912 02 0591 + 010004 1226 03 04 1 305274912 03 0591 + 010005 1226 03 05 1 305274912 04 0591 + 010006 1226 03 06 1 305274912 05 0591 + 010007 1226 03 07 1 305274912 06 0591 + 010008 1226 03 08 1 305274912 07 0591 + 010009 1226 04 01 1 305274912 08 0591 + 010010 1226 04 02 1 305274912 09 0591 + 010011 1226 04 03 1 305274912 10 0591 + 010012 1226 04 04 1 305274912 11 0591 + 010013 1226 04 05 1 305274912 12 0591 + 010014 1226 04 06 1 305274912 13 0591 + 010015 1226 04 07 1 305274912 14 0591 + 010016 1226 04 08 1 305274912 15 0591 + 010017 1226 05 01 1 305274900 00 0588 + 010018 1226 05 02 1 305274900 01 0588 + 010019 1226 05 03 1 305274900 02 0588 + 010020 1226 05 04 1 305274900 03 0588 + 010021 1226 05 05 1 305274900 04 0588 + 010022 1226 05 06 1 305274900 05 0588 + 010023 1226 05 07 1 305274900 06 0588 + 010024 1226 05 08 1 305274900 07 0588 + 010025 1226 06 01 1 305274900 08 0588 + 010026 1226 06 02 1 305274900 09 0588 + 010027 1226 06 03 1 305274900 10 0588 + 010028 1226 06 04 1 305274900 11 0588 + 010029 1226 06 05 1 305274900 12 0588 + 010030 1226 06 06 1 305274900 13 0588 + 010031 1226 06 07 1 305274900 14 0588 + 010032 1226 06 08 1 305274900 15 0588 + 010033 1226 07 01 1 305274904 00 0589 + 010034 1226 07 02 1 305274904 01 0589 + 010035 1226 07 03 1 305274904 02 0589 + 010036 1226 07 04 1 305274904 03 0589 + 010037 1226 07 05 1 305274904 04 0589 + 010038 1226 07 06 1 305274904 05 0589 + 010039 1226 07 07 1 305274904 06 0589 + 010040 1226 07 08 1 305274904 07 0589 + 010041 1226 08 01 1 305274904 08 0589 + 010042 1226 08 02 1 305274904 09 0589 + 010043 1226 08 03 1 305274904 10 0589 + 010044 1226 08 04 1 305274904 11 0589 + 010045 1226 08 05 1 305274904 12 0589 + 010046 1226 08 06 1 305274904 13 0589 + 010047 1226 08 07 1 305274904 14 0589 + 010048 1226 08 08 1 305274904 15 0589 + 010049 9999 99 99 0 9999 99 9999 + 010050 9999 99 99 0 9999 99 9999 + 010051 9999 99 99 0 9999 99 9999 + 010052 9999 99 99 0 9999 99 9999 + 010053 9999 99 99 0 9999 99 9999 + 010054 9999 99 99 0 9999 99 9999 + 010055 9999 99 99 0 9999 99 9999 + 010056 9999 99 99 0 9999 99 9999 + 010057 9999 99 99 0 9999 99 9999 + 010058 9999 99 99 0 9999 99 9999 + 010059 9999 99 99 0 9999 99 9999 + 010060 9999 99 99 0 9999 99 9999 + 010061 9999 99 99 0 9999 99 9999 + 010062 9999 99 99 0 9999 99 9999 + 010063 9999 99 99 0 9999 99 9999 + 010064 9999 99 99 0 9999 99 9999 + 010065 9999 99 99 0 9999 99 9999 + 010066 9999 99 99 0 9999 99 9999 + 010067 9999 99 99 0 9999 99 9999 + 010068 9999 99 99 0 9999 99 9999 + 010069 9999 99 99 0 9999 99 9999 + 010070 9999 99 99 0 9999 99 9999 + 010071 9999 99 99 0 9999 99 9999 + 010072 9999 99 99 0 9999 99 9999 + 010073 9999 99 99 0 9999 99 9999 + 010074 9999 99 99 0 9999 99 9999 + 010075 9999 99 99 0 9999 99 9999 + 010076 9999 99 99 0 9999 99 9999 + 010077 9999 99 99 0 9999 99 9999 + 010078 9999 99 99 0 9999 99 9999 + 010079 9999 99 99 0 9999 99 9999 + 010080 9999 99 99 0 9999 99 9999 + 010081 9999 99 99 0 9999 99 9999 + 010082 9999 99 99 0 9999 99 9999 + 010083 9999 99 99 0 9999 99 9999 + 010084 9999 99 99 0 9999 99 9999 + 010085 9999 99 99 0 9999 99 9999 + 010086 9999 99 99 0 9999 99 9999 + 010087 9999 99 99 0 9999 99 9999 + 010088 9999 99 99 0 9999 99 9999 + 010089 9999 99 99 0 9999 99 9999 + 010090 9999 99 99 0 9999 99 9999 + 010091 9999 99 99 0 9999 99 9999 + 010092 9999 99 99 0 9999 99 9999 + 010093 9999 99 99 0 9999 99 9999 + 010094 9999 99 99 0 9999 99 9999 + 010095 9999 99 99 0 9999 99 9999 + 010096 9999 99 99 0 9999 99 9999 + 010097 9999 99 99 0 9999 99 9999 + 010098 9999 99 99 0 9999 99 9999 + 010099 9999 99 99 0 9999 99 9999 + 010100 9999 99 99 0 9999 99 9999 + 010101 9999 99 99 0 9999 99 9999 + 010102 9999 99 99 0 9999 99 9999 + 010103 9999 99 99 0 9999 99 9999 + 010104 9999 99 99 0 9999 99 9999 + 010105 9999 99 99 0 9999 99 9999 + 010106 9999 99 99 0 9999 99 9999 + 010107 9999 99 99 0 9999 99 9999 + 010108 9999 99 99 0 9999 99 9999 + 010109 9999 99 99 0 9999 99 9999 + 010110 9999 99 99 0 9999 99 9999 + 010111 9999 99 99 0 9999 99 9999 + 010112 9999 99 99 0 9999 99 9999 + 010113 9999 99 99 0 9999 99 9999 + 010114 9999 99 99 0 9999 99 9999 + 010115 9999 99 99 0 9999 99 9999 + 010116 9999 99 99 0 9999 99 9999 + 010117 9999 99 99 0 9999 99 9999 + 010118 9999 99 99 0 9999 99 9999 + 010119 9999 99 99 0 9999 99 9999 + 010120 9999 99 99 0 9999 99 9999 + 010121 9999 99 99 0 9999 99 9999 + 010122 9999 99 99 0 9999 99 9999 + 010123 9999 99 99 0 9999 99 9999 + 010124 9999 99 99 0 9999 99 9999 + 010125 9999 99 99 0 9999 99 9999 + 010126 9999 99 99 0 9999 99 9999 + 010127 9999 99 99 0 9999 99 9999 + 010128 9999 99 99 0 9999 99 9999 + 010129 9999 99 99 0 9999 99 9999 + 010130 9999 99 99 0 9999 99 9999 + 010131 9999 99 99 0 9999 99 9999 + 010132 9999 99 99 0 9999 99 9999 + 010133 9999 99 99 0 9999 99 9999 + 010134 9999 99 99 0 9999 99 9999 + 010135 9999 99 99 0 9999 99 9999 + 010136 9999 99 99 0 9999 99 9999 + 010137 9999 99 99 0 9999 99 9999 + 010138 9999 99 99 0 9999 99 9999 + 010139 9999 99 99 0 9999 99 9999 + 010140 9999 99 99 0 9999 99 9999 + 010141 9999 99 99 0 9999 99 9999 + 010142 9999 99 99 0 9999 99 9999 + 010143 9999 99 99 0 9999 99 9999 + 010144 9999 99 99 0 9999 99 9999 + 010145 9999 99 99 0 9999 99 9999 + 010146 9999 99 99 0 9999 99 9999 + 010147 9999 99 99 0 9999 99 9999 + 010148 9999 99 99 0 9999 99 9999 + 010149 9999 99 99 0 9999 99 9999 + 010150 9999 99 99 0 9999 99 9999 + 010151 9999 99 99 0 9999 99 9999 + 010152 9999 99 99 0 9999 99 9999 + 010153 9999 99 99 0 9999 99 9999 + 010154 9999 99 99 0 9999 99 9999 + 010155 9999 99 99 0 9999 99 9999 + 010156 9999 99 99 0 9999 99 9999 + 010157 9999 99 99 0 9999 99 9999 + 010158 9999 99 99 0 9999 99 9999 + 010159 9999 99 99 0 9999 99 9999 + 010160 9999 99 99 0 9999 99 9999 + 010161 9999 99 99 0 9999 99 9999 + 010162 9999 99 99 0 9999 99 9999 + 010163 9999 99 99 0 9999 99 9999 + 010164 9999 99 99 0 9999 99 9999 + 010165 9999 99 99 0 9999 99 9999 + 010166 9999 99 99 0 9999 99 9999 + 010167 9999 99 99 0 9999 99 9999 + 010168 9999 99 99 0 9999 99 9999 + 010169 9999 99 99 0 9999 99 9999 + 010170 9999 99 99 0 9999 99 9999 + 010171 9999 99 99 0 9999 99 9999 + 010172 9999 99 99 0 9999 99 9999 + 010173 9999 99 99 0 9999 99 9999 + 010174 9999 99 99 0 9999 99 9999 + 010175 9999 99 99 0 9999 99 9999 + 010176 9999 99 99 0 9999 99 9999 + 010177 1226 25 01 1 305287196 00 0614 + 010178 1226 25 02 1 305287196 01 0614 + 010179 1226 25 03 1 305287196 02 0614 + 010180 1226 25 04 1 305287196 03 0614 + 010181 1226 25 05 1 305287196 04 0614 + 010182 1226 25 06 1 305287196 05 0614 + 010183 1226 25 07 1 305287196 06 0614 + 010184 1226 25 08 1 305287196 07 0614 + 010185 1226 26 01 1 305287196 08 0614 + 010186 1226 26 02 1 305287196 09 0614 + 010187 1226 26 03 1 305287196 10 0614 + 010188 1226 26 04 1 305287196 11 0614 + 010189 1226 26 05 1 305287196 12 0614 + 010190 1226 26 06 1 305287196 13 0614 + 010191 1226 26 07 1 305287196 14 0614 + 010192 1226 26 08 1 305287196 15 0614 + 010193 1226 27 01 1 305287200 00 0615 + 010194 1226 27 02 1 305287200 01 0615 + 010195 1226 27 03 1 305287200 02 0615 + 010196 1226 27 04 1 305287200 03 0615 + 010197 1226 27 05 1 305287200 04 0615 + 010198 1226 27 06 1 305287200 05 0615 + 010199 1226 27 07 1 305287200 06 0615 + 010200 1226 27 08 1 305287200 07 0615 + 010201 1226 28 01 1 305287200 08 0615 + 010202 1226 28 02 1 305287200 09 0615 + 010203 1226 28 03 1 305287200 10 0615 + 010204 1226 28 04 1 305287200 11 0615 + 010205 1226 28 05 1 305287200 12 0615 + 010206 1226 28 06 1 305287200 13 0615 + 010207 1226 28 07 1 305287200 14 0615 + 010208 1226 28 08 1 305287200 15 0615 + 010209 1226 29 01 1 305287188 00 0612 + 010210 1226 29 02 1 305287188 01 0612 + 010211 1226 29 03 1 305287188 02 0612 + 010212 1226 29 04 1 305287188 03 0612 + 010213 1226 29 05 1 305287188 04 0612 + 010214 1226 29 06 1 305287188 05 0612 + 010215 1226 29 07 1 305287188 06 0612 + 010216 1226 29 08 1 305287188 07 0612 + 010217 1226 30 01 1 305287188 08 0612 + 010218 1226 30 02 1 305287188 09 0612 + 010219 1226 30 03 1 305287188 10 0612 + 010220 1226 30 04 1 305287188 11 0612 + 010221 1226 30 05 1 305287188 12 0612 + 010222 1226 30 06 1 305287188 13 0612 + 010223 1226 30 07 1 305287188 14 0612 + 010224 1226 30 08 1 305287188 15 0612 + 010225 1226 31 01 1 305287192 00 0613 + 010226 1226 31 02 1 305287192 01 0613 + 010227 1226 31 03 1 305287192 02 0613 + 010228 1226 31 04 1 305287192 03 0613 + 010229 1226 31 05 1 305287192 04 0613 + 010230 1226 31 06 1 305287192 05 0613 + 010231 1226 31 07 1 305287192 06 0613 + 010232 1226 31 08 1 305287192 07 0613 + 010233 1226 32 01 1 305287192 08 0613 + 010234 1226 32 02 1 305287192 09 0613 + 010235 1226 32 03 1 305287192 10 0613 + 010236 1226 32 04 1 305287192 11 0613 + 010237 1226 32 05 1 305287192 12 0613 + 010238 1226 32 06 1 305287192 13 0613 + 010239 1226 32 07 1 305287192 14 0613 + 010240 1226 32 08 1 305287192 15 0613 + 010241 1226 33 01 1 305283096 00 0605 + 010242 1226 33 02 1 305283096 01 0605 + 010243 1226 33 03 1 305283096 02 0605 + 010244 1226 33 04 1 305283096 03 0605 + 010245 1226 33 05 1 305283096 04 0605 + 010246 1226 33 06 1 305283096 05 0605 + 010247 1226 33 07 1 305283096 06 0605 + 010248 1226 33 08 1 305283096 07 0605 + 010249 1226 34 01 1 305283096 08 0605 + 010250 1226 34 02 1 305283096 09 0605 + 010251 1226 34 03 1 305283096 10 0605 + 010252 1226 34 04 1 305283096 11 0605 + 010253 1226 34 05 1 305283096 12 0605 + 010254 1226 34 06 1 305283096 13 0605 + 010255 1226 34 07 1 305283096 14 0605 + 010256 1226 34 08 1 305283096 15 0605 + 010257 1226 35 01 1 305283092 00 0604 + 010258 1226 35 02 1 305283092 01 0604 + 010259 1226 35 03 1 305283092 02 0604 + 010260 1226 35 04 1 305283092 03 0604 + 010261 1226 35 05 1 305283092 04 0604 + 010262 1226 35 06 1 305283092 05 0604 + 010263 1226 35 07 1 305283092 06 0604 + 010264 1226 35 08 1 305283092 07 0604 + 010265 1226 36 01 1 305283092 08 0604 + 010266 1226 36 02 1 305283092 09 0604 + 010267 1226 36 03 1 305283092 10 0604 + 010268 1226 36 04 1 305283092 11 0604 + 010269 1226 36 05 1 305283092 12 0604 + 010270 1226 36 06 1 305283092 13 0604 + 010271 1226 36 07 1 305283092 14 0604 + 010272 1226 36 08 1 305283092 15 0604 + 010273 1226 37 01 1 305283104 00 0607 + 010274 1226 37 02 1 305283104 01 0607 + 010275 1226 37 03 1 305283104 02 0607 + 010276 1226 37 04 1 305283104 03 0607 + 010277 1226 37 05 1 305283104 04 0607 + 010278 1226 37 06 1 305283104 05 0607 + 010279 1226 37 07 1 305283104 06 0607 + 010280 1226 37 08 1 305283104 07 0607 + 010281 1226 38 01 1 305283104 08 0607 + 010282 1226 38 02 1 305283104 09 0607 + 010283 1226 38 03 1 305283104 10 0607 + 010284 1226 38 04 1 305283104 11 0607 + 010285 1226 38 05 1 305283104 12 0607 + 010286 1226 38 06 1 305283104 13 0607 + 010287 1226 38 07 1 305283104 14 0607 + 010288 1226 38 08 1 305283104 15 0607 + 010289 1226 39 01 1 305283100 00 0606 + 010290 1226 39 02 1 305283100 01 0606 + 010291 1226 39 03 1 305283100 02 0606 + 010292 1226 39 04 1 305283100 03 0606 + 010293 1226 39 05 1 305283100 04 0606 + 010294 1226 39 06 1 305283100 05 0606 + 010295 1226 39 07 1 305283100 06 0606 + 010296 1226 39 08 1 305283100 07 0606 + 010297 1226 40 01 1 305283100 08 0606 + 010298 1226 40 02 1 305283100 09 0606 + 010299 1226 40 03 1 305283100 10 0606 + 010300 1226 40 04 1 305283100 11 0606 + 010301 1226 40 05 1 305283100 12 0606 + 010302 1226 40 06 1 305283100 13 0606 + 010303 1226 40 07 1 305283100 14 0606 + 010304 1226 40 08 1 305283100 15 0606 + 010305 9999 99 99 0 9999 99 9999 + 010306 9999 99 99 0 9999 99 9999 + 010307 9999 99 99 0 9999 99 9999 + 010308 9999 99 99 0 9999 99 9999 + 010309 9999 99 99 0 9999 99 9999 + 010310 9999 99 99 0 9999 99 9999 + 010311 9999 99 99 0 9999 99 9999 + 010312 9999 99 99 0 9999 99 9999 + 010313 9999 99 99 0 9999 99 9999 + 010314 9999 99 99 0 9999 99 9999 + 010315 9999 99 99 0 9999 99 9999 + 010316 9999 99 99 0 9999 99 9999 + 010317 9999 99 99 0 9999 99 9999 + 010318 9999 99 99 0 9999 99 9999 + 010319 9999 99 99 0 9999 99 9999 + 010320 9999 99 99 0 9999 99 9999 + 010321 9999 99 99 0 9999 99 9999 + 010322 9999 99 99 0 9999 99 9999 + 010323 9999 99 99 0 9999 99 9999 + 010324 9999 99 99 0 9999 99 9999 + 010325 9999 99 99 0 9999 99 9999 + 010326 9999 99 99 0 9999 99 9999 + 010327 9999 99 99 0 9999 99 9999 + 010328 9999 99 99 0 9999 99 9999 + 010329 9999 99 99 0 9999 99 9999 + 010330 9999 99 99 0 9999 99 9999 + 010331 9999 99 99 0 9999 99 9999 + 010332 9999 99 99 0 9999 99 9999 + 010333 9999 99 99 0 9999 99 9999 + 010334 9999 99 99 0 9999 99 9999 + 010335 9999 99 99 0 9999 99 9999 + 010336 9999 99 99 0 9999 99 9999 + 010337 9999 99 99 0 9999 99 9999 + 010338 9999 99 99 0 9999 99 9999 + 010339 9999 99 99 0 9999 99 9999 + 010340 9999 99 99 0 9999 99 9999 + 010341 9999 99 99 0 9999 99 9999 + 010342 9999 99 99 0 9999 99 9999 + 010343 9999 99 99 0 9999 99 9999 + 010344 9999 99 99 0 9999 99 9999 + 010345 9999 99 99 0 9999 99 9999 + 010346 9999 99 99 0 9999 99 9999 + 010347 9999 99 99 0 9999 99 9999 + 010348 9999 99 99 0 9999 99 9999 + 010349 9999 99 99 0 9999 99 9999 + 010350 9999 99 99 0 9999 99 9999 + 010351 9999 99 99 0 9999 99 9999 + 010352 9999 99 99 0 9999 99 9999 + 010353 9999 99 99 0 9999 99 9999 + 010354 9999 99 99 0 9999 99 9999 + 010355 9999 99 99 0 9999 99 9999 + 010356 9999 99 99 0 9999 99 9999 + 010357 9999 99 99 0 9999 99 9999 + 010358 9999 99 99 0 9999 99 9999 + 010359 9999 99 99 0 9999 99 9999 + 010360 9999 99 99 0 9999 99 9999 + 010361 9999 99 99 0 9999 99 9999 + 010362 9999 99 99 0 9999 99 9999 + 010363 9999 99 99 0 9999 99 9999 + 010364 9999 99 99 0 9999 99 9999 + 010365 9999 99 99 0 9999 99 9999 + 010366 9999 99 99 0 9999 99 9999 + 010367 9999 99 99 0 9999 99 9999 + 010368 9999 99 99 0 9999 99 9999 + 010369 1227 01 01 1 303083540 08 0084 + 010370 1227 01 02 1 303083540 09 0084 + 010371 9999 99 99 0 9999 99 9999 + 010372 9999 99 99 0 9999 99 9999 + 010373 9999 99 99 0 9999 99 9999 + 010374 9999 99 99 0 9999 99 9999 + 010375 9999 99 99 0 9999 99 9999 + 010376 9999 99 99 0 9999 99 9999 + 010377 1227 02 01 1 303083540 10 0084 + 010378 1227 02 02 1 303083540 11 0084 + 010379 9999 99 99 0 9999 99 9999 + 010380 9999 99 99 0 9999 99 9999 + 010381 9999 99 99 0 9999 99 9999 + 010382 9999 99 99 0 9999 99 9999 + 010383 9999 99 99 0 9999 99 9999 + 010384 9999 99 99 0 9999 99 9999 + 010385 1227 03 01 1 303083540 12 0084 + 010386 1227 03 02 1 303083540 13 0084 + 010387 9999 99 99 0 9999 99 9999 + 010388 9999 99 99 0 9999 99 9999 + 010389 9999 99 99 0 9999 99 9999 + 010390 9999 99 99 0 9999 99 9999 + 010391 9999 99 99 0 9999 99 9999 + 010392 9999 99 99 0 9999 99 9999 + 010393 1227 04 01 1 303083540 14 0084 + 010394 1227 04 02 1 303083540 15 0084 + 010395 9999 99 99 0 9999 99 9999 + 010396 9999 99 99 0 9999 99 9999 + 010397 9999 99 99 0 9999 99 9999 + 010398 9999 99 99 0 9999 99 9999 + 010399 9999 99 99 0 9999 99 9999 + 010400 9999 99 99 0 9999 99 9999 + 010401 1227 05 01 1 303083540 00 0084 + 010402 1227 05 02 1 303083540 01 0084 + 010403 9999 99 99 0 9999 99 9999 + 010404 9999 99 99 0 9999 99 9999 + 010405 9999 99 99 0 9999 99 9999 + 010406 9999 99 99 0 9999 99 9999 + 010407 9999 99 99 0 9999 99 9999 + 010408 9999 99 99 0 9999 99 9999 + 010409 1227 06 01 1 303083540 02 0084 + 010410 1227 06 02 1 303083540 03 0084 + 010411 9999 99 99 0 9999 99 9999 + 010412 9999 99 99 0 9999 99 9999 + 010413 9999 99 99 0 9999 99 9999 + 010414 9999 99 99 0 9999 99 9999 + 010415 9999 99 99 0 9999 99 9999 + 010416 9999 99 99 0 9999 99 9999 + 010417 1227 07 01 1 303083540 04 0084 + 010418 1227 07 02 1 303083540 05 0084 + 010419 9999 99 99 0 9999 99 9999 + 010420 9999 99 99 0 9999 99 9999 + 010421 9999 99 99 0 9999 99 9999 + 010422 9999 99 99 0 9999 99 9999 + 010423 9999 99 99 0 9999 99 9999 + 010424 9999 99 99 0 9999 99 9999 + 010425 1227 08 01 1 303083540 06 0084 + 010426 1227 08 02 1 303083540 07 0084 + 010427 9999 99 99 0 9999 99 9999 + 010428 9999 99 99 0 9999 99 9999 + 010429 9999 99 99 0 9999 99 9999 + 010430 9999 99 99 0 9999 99 9999 + 010431 9999 99 99 0 9999 99 9999 + 010432 9999 99 99 0 9999 99 9999 + 010433 1227 09 01 1 304189464 00 0293 + 010434 1227 09 02 1 304189464 01 0293 + 010435 1227 09 03 1 304189464 02 0293 + 010436 1227 09 04 1 304189464 03 0293 + 010437 9999 99 99 0 9999 99 9999 + 010438 9999 99 99 0 9999 99 9999 + 010439 9999 99 99 0 9999 99 9999 + 010440 9999 99 99 0 9999 99 9999 + 010441 1227 10 01 1 304189464 04 0293 + 010442 1227 10 02 1 304189464 05 0293 + 010443 1227 10 03 1 304189464 06 0293 + 010444 1227 10 04 1 304189464 07 0293 + 010445 9999 99 99 0 9999 99 9999 + 010446 9999 99 99 0 9999 99 9999 + 010447 9999 99 99 0 9999 99 9999 + 010448 9999 99 99 0 9999 99 9999 + 010449 1227 11 01 1 304189464 08 0293 + 010450 1227 11 02 1 304189464 09 0293 + 010451 1227 11 03 1 304189464 10 0293 + 010452 1227 11 04 1 304189464 11 0293 + 010453 9999 99 99 0 9999 99 9999 + 010454 9999 99 99 0 9999 99 9999 + 010455 9999 99 99 0 9999 99 9999 + 010456 9999 99 99 0 9999 99 9999 + 010457 1227 12 01 1 304189464 12 0293 + 010458 1227 12 02 1 304189464 13 0293 + 010459 1227 12 03 1 304189464 14 0293 + 010460 1227 12 04 1 304189464 15 0293 + 010461 9999 99 99 0 9999 99 9999 + 010462 9999 99 99 0 9999 99 9999 + 010463 9999 99 99 0 9999 99 9999 + 010464 9999 99 99 0 9999 99 9999 + 010465 1227 13 01 1 304189460 08 0292 + 010466 1227 13 02 1 304189460 09 0292 + 010467 1227 13 03 1 304189460 10 0292 + 010468 1227 13 04 1 304189460 11 0292 + 010469 9999 99 99 0 9999 99 9999 + 010470 9999 99 99 0 9999 99 9999 + 010471 9999 99 99 0 9999 99 9999 + 010472 9999 99 99 0 9999 99 9999 + 010473 1227 14 01 1 304189460 12 0292 + 010474 1227 14 02 1 304189460 13 0292 + 010475 1227 14 03 1 304189460 14 0292 + 010476 1227 14 04 1 304189460 15 0292 + 010477 9999 99 99 0 9999 99 9999 + 010478 9999 99 99 0 9999 99 9999 + 010479 9999 99 99 0 9999 99 9999 + 010480 9999 99 99 0 9999 99 9999 + 010481 1227 15 01 1 304189460 00 0292 + 010482 1227 15 02 1 304189460 01 0292 + 010483 1227 15 03 1 304189460 02 0292 + 010484 1227 15 04 1 304189460 03 0292 + 010485 9999 99 99 0 9999 99 9999 + 010486 9999 99 99 0 9999 99 9999 + 010487 9999 99 99 0 9999 99 9999 + 010488 9999 99 99 0 9999 99 9999 + 010489 1227 16 01 1 304189460 04 0292 + 010490 1227 16 02 1 304189460 05 0292 + 010491 1227 16 03 1 304189460 06 0292 + 010492 1227 16 04 1 304189460 07 0292 + 010493 9999 99 99 0 9999 99 9999 + 010494 9999 99 99 0 9999 99 9999 + 010495 9999 99 99 0 9999 99 9999 + 010496 9999 99 99 0 9999 99 9999 + 010497 1227 17 01 1 306413596 00 1118 + 010498 1227 17 02 1 306413596 01 1118 + 010499 1227 17 03 1 306413596 02 1118 + 010500 1227 17 04 1 306413596 03 1118 + 010501 1227 17 05 1 306413596 04 1118 + 010502 1227 17 06 1 306413596 05 1118 + 010503 1227 17 07 1 306413596 06 1118 + 010504 1227 17 08 1 306413596 07 1118 + 010505 1227 18 01 1 306413596 08 1118 + 010506 1227 18 02 1 306413596 09 1118 + 010507 1227 18 03 1 306413596 10 1118 + 010508 1227 18 04 1 306413596 11 1118 + 010509 1227 18 05 1 306413596 12 1118 + 010510 1227 18 06 1 306413596 13 1118 + 010511 1227 18 07 1 306413596 14 1118 + 010512 1227 18 08 1 306413596 15 1118 + 010513 1227 19 01 1 306413600 00 1119 + 010514 1227 19 02 1 306413600 01 1119 + 010515 1227 19 03 1 306413600 02 1119 + 010516 1227 19 04 1 306413600 03 1119 + 010517 1227 19 05 1 306413600 04 1119 + 010518 1227 19 06 1 306413600 05 1119 + 010519 1227 19 07 1 306413600 06 1119 + 010520 1227 19 08 1 306413600 07 1119 + 010521 1227 20 01 1 306413600 08 1119 + 010522 1227 20 02 1 306413600 09 1119 + 010523 1227 20 03 1 306413600 10 1119 + 010524 1227 20 04 1 306413600 11 1119 + 010525 1227 20 05 1 306413600 12 1119 + 010526 1227 20 06 1 306413600 13 1119 + 010527 1227 20 07 1 306413600 14 1119 + 010528 1227 20 08 1 306413600 15 1119 + 010529 1227 21 01 1 306413588 00 1116 + 010530 1227 21 02 1 306413588 01 1116 + 010531 1227 21 03 1 306413588 02 1116 + 010532 1227 21 04 1 306413588 03 1116 + 010533 1227 21 05 1 306413588 04 1116 + 010534 1227 21 06 1 306413588 05 1116 + 010535 1227 21 07 1 306413588 06 1116 + 010536 1227 21 08 1 306413588 07 1116 + 010537 1227 22 01 1 306413588 08 1116 + 010538 1227 22 02 1 306413588 09 1116 + 010539 1227 22 03 1 306413588 10 1116 + 010540 1227 22 04 1 306413588 11 1116 + 010541 1227 22 05 1 306413588 12 1116 + 010542 1227 22 06 1 306413588 13 1116 + 010543 1227 22 07 1 306413588 14 1116 + 010544 1227 22 08 1 306413588 15 1116 + 010545 1227 23 01 1 306413592 00 1117 + 010546 1227 23 02 1 306413592 01 1117 + 010547 1227 23 03 1 306413592 02 1117 + 010548 1227 23 04 1 306413592 03 1117 + 010549 1227 23 05 1 306413592 04 1117 + 010550 1227 23 06 1 306413592 05 1117 + 010551 1227 23 07 1 306413592 06 1117 + 010552 1227 23 08 1 306413592 07 1117 + 010553 1227 24 01 1 306413592 08 1117 + 010554 1227 24 02 1 306413592 09 1117 + 010555 1227 24 03 1 306413592 10 1117 + 010556 1227 24 04 1 306413592 11 1117 + 010557 1227 24 05 1 306413592 12 1117 + 010558 1227 24 06 1 306413592 13 1117 + 010559 1227 24 07 1 306413592 14 1117 + 010560 1227 24 08 1 306413592 15 1117 + 010561 1227 25 01 1 303083544 08 0085 + 010562 1227 25 02 1 303083544 09 0085 + 010563 9999 99 99 0 9999 99 9999 + 010564 9999 99 99 0 9999 99 9999 + 010565 9999 99 99 0 9999 99 9999 + 010566 9999 99 99 0 9999 99 9999 + 010567 9999 99 99 0 9999 99 9999 + 010568 9999 99 99 0 9999 99 9999 + 010569 1227 26 01 1 303083544 10 0085 + 010570 1227 26 02 1 303083544 11 0085 + 010571 9999 99 99 0 9999 99 9999 + 010572 9999 99 99 0 9999 99 9999 + 010573 9999 99 99 0 9999 99 9999 + 010574 9999 99 99 0 9999 99 9999 + 010575 9999 99 99 0 9999 99 9999 + 010576 9999 99 99 0 9999 99 9999 + 010577 1227 27 01 1 303083544 12 0085 + 010578 1227 27 02 1 303083544 13 0085 + 010579 9999 99 99 0 9999 99 9999 + 010580 9999 99 99 0 9999 99 9999 + 010581 9999 99 99 0 9999 99 9999 + 010582 9999 99 99 0 9999 99 9999 + 010583 9999 99 99 0 9999 99 9999 + 010584 9999 99 99 0 9999 99 9999 + 010585 1227 28 01 1 303083544 14 0085 + 010586 1227 28 02 1 303083544 15 0085 + 010587 9999 99 99 0 9999 99 9999 + 010588 9999 99 99 0 9999 99 9999 + 010589 9999 99 99 0 9999 99 9999 + 010590 9999 99 99 0 9999 99 9999 + 010591 9999 99 99 0 9999 99 9999 + 010592 9999 99 99 0 9999 99 9999 + 010593 1227 29 01 1 303083544 04 0085 + 010594 1227 29 02 1 303083544 05 0085 + 010595 9999 99 99 0 9999 99 9999 + 010596 9999 99 99 0 9999 99 9999 + 010597 9999 99 99 0 9999 99 9999 + 010598 9999 99 99 0 9999 99 9999 + 010599 9999 99 99 0 9999 99 9999 + 010600 9999 99 99 0 9999 99 9999 + 010601 1227 30 01 1 303083544 06 0085 + 010602 1227 30 02 1 303083544 07 0085 + 010603 9999 99 99 0 9999 99 9999 + 010604 9999 99 99 0 9999 99 9999 + 010605 9999 99 99 0 9999 99 9999 + 010606 9999 99 99 0 9999 99 9999 + 010607 9999 99 99 0 9999 99 9999 + 010608 9999 99 99 0 9999 99 9999 + 010609 1227 31 01 1 303083544 00 0085 + 010610 1227 31 02 1 303083544 01 0085 + 010611 9999 99 99 0 9999 99 9999 + 010612 9999 99 99 0 9999 99 9999 + 010613 9999 99 99 0 9999 99 9999 + 010614 9999 99 99 0 9999 99 9999 + 010615 9999 99 99 0 9999 99 9999 + 010616 9999 99 99 0 9999 99 9999 + 010617 1227 32 01 1 303083544 02 0085 + 010618 1227 32 02 1 303083544 03 0085 + 010619 9999 99 99 0 9999 99 9999 + 010620 9999 99 99 0 9999 99 9999 + 010621 9999 99 99 0 9999 99 9999 + 010622 9999 99 99 0 9999 99 9999 + 010623 9999 99 99 0 9999 99 9999 + 010624 9999 99 99 0 9999 99 9999 + 010625 1227 33 01 1 306409500 00 1110 + 010626 1227 33 02 1 306409500 01 1110 + 010627 1227 33 03 1 306409500 02 1110 + 010628 1227 33 04 1 306409500 03 1110 + 010629 1227 33 05 1 306409500 04 1110 + 010630 1227 33 06 1 306409500 05 1110 + 010631 1227 33 07 1 306409500 06 1110 + 010632 1227 33 08 1 306409500 07 1110 + 010633 1227 34 01 1 306409500 08 1110 + 010634 1227 34 02 1 306409500 09 1110 + 010635 1227 34 03 1 306409500 10 1110 + 010636 1227 34 04 1 306409500 11 1110 + 010637 1227 34 05 1 306409500 12 1110 + 010638 1227 34 06 1 306409500 13 1110 + 010639 1227 34 07 1 306409500 14 1110 + 010640 1227 34 08 1 306409500 15 1110 + 010641 1227 35 01 1 306409504 00 1111 + 010642 1227 35 02 1 306409504 01 1111 + 010643 1227 35 03 1 306409504 02 1111 + 010644 1227 35 04 1 306409504 03 1111 + 010645 1227 35 05 1 306409504 04 1111 + 010646 1227 35 06 1 306409504 05 1111 + 010647 1227 35 07 1 306409504 06 1111 + 010648 1227 35 08 1 306409504 07 1111 + 010649 1227 36 01 1 306409504 08 1111 + 010650 1227 36 02 1 306409504 09 1111 + 010651 1227 36 03 1 306409504 10 1111 + 010652 1227 36 04 1 306409504 11 1111 + 010653 1227 36 05 1 306409504 12 1111 + 010654 1227 36 06 1 306409504 13 1111 + 010655 1227 36 07 1 306409504 14 1111 + 010656 1227 36 08 1 306409504 15 1111 + 010657 1227 37 01 1 306409492 00 1108 + 010658 1227 37 02 1 306409492 01 1108 + 010659 1227 37 03 1 306409492 02 1108 + 010660 1227 37 04 1 306409492 03 1108 + 010661 1227 37 05 1 306409492 04 1108 + 010662 1227 37 06 1 306409492 05 1108 + 010663 1227 37 07 1 306409492 06 1108 + 010664 1227 37 08 1 306409492 07 1108 + 010665 1227 38 01 1 306409492 08 1108 + 010666 1227 38 02 1 306409492 09 1108 + 010667 1227 38 03 1 306409492 10 1108 + 010668 1227 38 04 1 306409492 11 1108 + 010669 1227 38 05 1 306409492 12 1108 + 010670 1227 38 06 1 306409492 13 1108 + 010671 1227 38 07 1 306409492 14 1108 + 010672 1227 38 08 1 306409492 15 1108 + 010673 1227 39 01 1 306409496 00 1109 + 010674 1227 39 02 1 306409496 01 1109 + 010675 1227 39 03 1 306409496 02 1109 + 010676 1227 39 04 1 306409496 03 1109 + 010677 1227 39 05 1 306409496 04 1109 + 010678 1227 39 06 1 306409496 05 1109 + 010679 1227 39 07 1 306409496 06 1109 + 010680 1227 39 08 1 306409496 07 1109 + 010681 1227 40 01 1 306409496 08 1109 + 010682 1227 40 02 1 306409496 09 1109 + 010683 1227 40 03 1 306409496 10 1109 + 010684 1227 40 04 1 306409496 11 1109 + 010685 1227 40 05 1 306409496 12 1109 + 010686 1227 40 06 1 306409496 13 1109 + 010687 1227 40 07 1 306409496 14 1109 + 010688 1227 40 08 1 306409496 15 1109 + 010689 1227 41 01 1 304189468 00 0294 + 010690 1227 41 02 1 304189468 01 0294 + 010691 1227 41 03 1 304189468 02 0294 + 010692 1227 41 04 1 304189468 03 0294 + 010693 9999 99 99 0 9999 99 9999 + 010694 9999 99 99 0 9999 99 9999 + 010695 9999 99 99 0 9999 99 9999 + 010696 9999 99 99 0 9999 99 9999 + 010697 1227 42 01 1 304189468 04 0294 + 010698 1227 42 02 1 304189468 05 0294 + 010699 1227 42 03 1 304189468 06 0294 + 010700 1227 42 04 1 304189468 07 0294 + 010701 9999 99 99 0 9999 99 9999 + 010702 9999 99 99 0 9999 99 9999 + 010703 9999 99 99 0 9999 99 9999 + 010704 9999 99 99 0 9999 99 9999 + 010705 1227 43 01 1 304189468 08 0294 + 010706 1227 43 02 1 304189468 09 0294 + 010707 1227 43 03 1 304189468 10 0294 + 010708 1227 43 04 1 304189468 11 0294 + 010709 9999 99 99 0 9999 99 9999 + 010710 9999 99 99 0 9999 99 9999 + 010711 9999 99 99 0 9999 99 9999 + 010712 9999 99 99 0 9999 99 9999 + 010713 1227 44 01 1 304189468 12 0294 + 010714 1227 44 02 1 304189468 13 0294 + 010715 1227 44 03 1 304189468 14 0294 + 010716 1227 44 04 1 304189468 15 0294 + 010717 9999 99 99 0 9999 99 9999 + 010718 9999 99 99 0 9999 99 9999 + 010719 9999 99 99 0 9999 99 9999 + 010720 9999 99 99 0 9999 99 9999 + 010721 1227 45 01 1 304189472 00 0295 + 010722 1227 45 02 1 304189472 01 0295 + 010723 1227 45 03 1 304189472 02 0295 + 010724 1227 45 04 1 304189472 03 0295 + 010725 9999 99 99 0 9999 99 9999 + 010726 9999 99 99 0 9999 99 9999 + 010727 9999 99 99 0 9999 99 9999 + 010728 9999 99 99 0 9999 99 9999 + 010729 1227 46 01 1 304189472 04 0295 + 010730 1227 46 02 1 304189472 05 0295 + 010731 1227 46 03 1 304189472 06 0295 + 010732 1227 46 04 1 304189472 07 0295 + 010733 9999 99 99 0 9999 99 9999 + 010734 9999 99 99 0 9999 99 9999 + 010735 9999 99 99 0 9999 99 9999 + 010736 9999 99 99 0 9999 99 9999 + 010737 1227 47 01 1 304189472 08 0295 + 010738 1227 47 02 1 304189472 09 0295 + 010739 1227 47 03 1 304189472 10 0295 + 010740 1227 47 04 1 304189472 11 0295 + 010741 9999 99 99 0 9999 99 9999 + 010742 9999 99 99 0 9999 99 9999 + 010743 9999 99 99 0 9999 99 9999 + 010744 9999 99 99 0 9999 99 9999 + 010745 1227 48 01 1 304189472 12 0295 + 010746 1227 48 02 1 304189472 13 0295 + 010747 1227 48 03 1 304189472 14 0295 + 010748 1227 48 04 1 304189472 15 0295 + 010749 9999 99 99 0 9999 99 9999 + 010750 9999 99 99 0 9999 99 9999 + 010751 9999 99 99 0 9999 99 9999 + 010752 9999 99 99 0 9999 99 9999 + 010753 1228 01 01 1 304185368 08 0285 + 010754 1228 01 02 1 304185368 09 0285 + 010755 1228 01 03 1 304185368 10 0285 + 010756 1228 01 04 1 304185368 11 0285 + 010757 9999 99 99 0 9999 99 9999 + 010758 9999 99 99 0 9999 99 9999 + 010759 9999 99 99 0 9999 99 9999 + 010760 9999 99 99 0 9999 99 9999 + 010761 1228 02 01 1 304185368 12 0285 + 010762 1228 02 02 1 304185368 13 0285 + 010763 1228 02 03 1 304185368 14 0285 + 010764 1228 02 04 1 304185368 15 0285 + 010765 9999 99 99 0 9999 99 9999 + 010766 9999 99 99 0 9999 99 9999 + 010767 9999 99 99 0 9999 99 9999 + 010768 9999 99 99 0 9999 99 9999 + 010769 1228 03 01 1 304185368 00 0285 + 010770 1228 03 02 1 304185368 01 0285 + 010771 1228 03 03 1 304185368 02 0285 + 010772 1228 03 04 1 304185368 03 0285 + 010773 9999 99 99 0 9999 99 9999 + 010774 9999 99 99 0 9999 99 9999 + 010775 9999 99 99 0 9999 99 9999 + 010776 9999 99 99 0 9999 99 9999 + 010777 1228 04 01 1 304185368 04 0285 + 010778 1228 04 02 1 304185368 05 0285 + 010779 1228 04 03 1 304185368 06 0285 + 010780 1228 04 04 1 304185368 07 0285 + 010781 9999 99 99 0 9999 99 9999 + 010782 9999 99 99 0 9999 99 9999 + 010783 9999 99 99 0 9999 99 9999 + 010784 9999 99 99 0 9999 99 9999 + 010785 1228 05 01 1 304185364 08 0284 + 010786 1228 05 02 1 304185364 09 0284 + 010787 1228 05 03 1 304185364 10 0284 + 010788 1228 05 04 1 304185364 11 0284 + 010789 9999 99 99 0 9999 99 9999 + 010790 9999 99 99 0 9999 99 9999 + 010791 9999 99 99 0 9999 99 9999 + 010792 9999 99 99 0 9999 99 9999 + 010793 1228 06 01 1 304185364 12 0284 + 010794 1228 06 02 1 304185364 13 0284 + 010795 1228 06 03 1 304185364 14 0284 + 010796 1228 06 04 1 304185364 15 0284 + 010797 9999 99 99 0 9999 99 9999 + 010798 9999 99 99 0 9999 99 9999 + 010799 9999 99 99 0 9999 99 9999 + 010800 9999 99 99 0 9999 99 9999 + 010801 1228 07 01 1 304185364 00 0284 + 010802 1228 07 02 1 304185364 01 0284 + 010803 1228 07 03 1 304185364 02 0284 + 010804 1228 07 04 1 304185364 03 0284 + 010805 9999 99 99 0 9999 99 9999 + 010806 9999 99 99 0 9999 99 9999 + 010807 9999 99 99 0 9999 99 9999 + 010808 9999 99 99 0 9999 99 9999 + 010809 1228 08 01 1 304185364 04 0284 + 010810 1228 08 02 1 304185364 05 0284 + 010811 1228 08 03 1 304185364 06 0284 + 010812 1228 08 04 1 304185364 07 0284 + 010813 9999 99 99 0 9999 99 9999 + 010814 9999 99 99 0 9999 99 9999 + 010815 9999 99 99 0 9999 99 9999 + 010816 9999 99 99 0 9999 99 9999 + 010817 1228 09 01 1 306405400 00 1101 + 010818 1228 09 02 1 306405400 01 1101 + 010819 1228 09 03 1 306405400 02 1101 + 010820 1228 09 04 1 306405400 03 1101 + 010821 1228 09 05 1 306405400 04 1101 + 010822 1228 09 06 1 306405400 05 1101 + 010823 1228 09 07 1 306405400 06 1101 + 010824 1228 09 08 1 306405400 07 1101 + 010825 1228 10 01 1 306405400 08 1101 + 010826 1228 10 02 1 306405400 09 1101 + 010827 1228 10 03 1 306405400 10 1101 + 010828 1228 10 04 1 306405400 11 1101 + 010829 1228 10 05 1 306405400 12 1101 + 010830 1228 10 06 1 306405400 13 1101 + 010831 1228 10 07 1 306405400 14 1101 + 010832 1228 10 08 1 306405400 15 1101 + 010833 1228 11 01 1 306405396 00 1100 + 010834 1228 11 02 1 306405396 01 1100 + 010835 1228 11 03 1 306405396 02 1100 + 010836 1228 11 04 1 306405396 03 1100 + 010837 1228 11 05 1 306405396 04 1100 + 010838 1228 11 06 1 306405396 05 1100 + 010839 1228 11 07 1 306405396 06 1100 + 010840 1228 11 08 1 306405396 07 1100 + 010841 1228 12 01 1 306405396 08 1100 + 010842 1228 12 02 1 306405396 09 1100 + 010843 1228 12 03 1 306405396 10 1100 + 010844 1228 12 04 1 306405396 11 1100 + 010845 1228 12 05 1 306405396 12 1100 + 010846 1228 12 06 1 306405396 13 1100 + 010847 1228 12 07 1 306405396 14 1100 + 010848 1228 12 08 1 306405396 15 1100 + 010849 1228 13 01 1 306405408 00 1103 + 010850 1228 13 02 1 306405408 01 1103 + 010851 1228 13 03 1 306405408 02 1103 + 010852 1228 13 04 1 306405408 03 1103 + 010853 1228 13 05 1 306405408 04 1103 + 010854 1228 13 06 1 306405408 05 1103 + 010855 1228 13 07 1 306405408 06 1103 + 010856 1228 13 08 1 306405408 07 1103 + 010857 1228 14 01 1 306405408 08 1103 + 010858 1228 14 02 1 306405408 09 1103 + 010859 1228 14 03 1 306405408 10 1103 + 010860 1228 14 04 1 306405408 11 1103 + 010861 1228 14 05 1 306405408 12 1103 + 010862 1228 14 06 1 306405408 13 1103 + 010863 1228 14 07 1 306405408 14 1103 + 010864 1228 14 08 1 306405408 15 1103 + 010865 1228 15 01 1 306405404 00 1102 + 010866 1228 15 02 1 306405404 01 1102 + 010867 1228 15 03 1 306405404 02 1102 + 010868 1228 15 04 1 306405404 03 1102 + 010869 1228 15 05 1 306405404 04 1102 + 010870 1228 15 06 1 306405404 05 1102 + 010871 1228 15 07 1 306405404 06 1102 + 010872 1228 15 08 1 306405404 07 1102 + 010873 1228 16 01 1 306405404 08 1102 + 010874 1228 16 02 1 306405404 09 1102 + 010875 1228 16 03 1 306405404 10 1102 + 010876 1228 16 04 1 306405404 11 1102 + 010877 1228 16 05 1 306405404 12 1102 + 010878 1228 16 06 1 306405404 13 1102 + 010879 1228 16 07 1 306405404 14 1102 + 010880 1228 16 08 1 306405404 15 1102 + 010881 1228 17 01 1 303079456 12 0079 + 010882 1228 17 02 1 303079456 13 0079 + 010883 9999 99 99 0 9999 99 9999 + 010884 9999 99 99 0 9999 99 9999 + 010885 9999 99 99 0 9999 99 9999 + 010886 9999 99 99 0 9999 99 9999 + 010887 9999 99 99 0 9999 99 9999 + 010888 9999 99 99 0 9999 99 9999 + 010889 1228 18 01 1 303079456 14 0079 + 010890 1228 18 02 1 303079456 15 0079 + 010891 9999 99 99 0 9999 99 9999 + 010892 9999 99 99 0 9999 99 9999 + 010893 9999 99 99 0 9999 99 9999 + 010894 9999 99 99 0 9999 99 9999 + 010895 9999 99 99 0 9999 99 9999 + 010896 9999 99 99 0 9999 99 9999 + 010897 1228 19 01 1 303079456 08 0079 + 010898 1228 19 02 1 303079456 09 0079 + 010899 9999 99 99 0 9999 99 9999 + 010900 9999 99 99 0 9999 99 9999 + 010901 9999 99 99 0 9999 99 9999 + 010902 9999 99 99 0 9999 99 9999 + 010903 9999 99 99 0 9999 99 9999 + 010904 9999 99 99 0 9999 99 9999 + 010905 1228 20 01 1 303079456 10 0079 + 010906 1228 20 02 1 303079456 11 0079 + 010907 9999 99 99 0 9999 99 9999 + 010908 9999 99 99 0 9999 99 9999 + 010909 9999 99 99 0 9999 99 9999 + 010910 9999 99 99 0 9999 99 9999 + 010911 9999 99 99 0 9999 99 9999 + 010912 9999 99 99 0 9999 99 9999 + 010913 1228 21 01 1 303079456 00 0079 + 010914 1228 21 02 1 303079456 01 0079 + 010915 9999 99 99 0 9999 99 9999 + 010916 9999 99 99 0 9999 99 9999 + 010917 9999 99 99 0 9999 99 9999 + 010918 9999 99 99 0 9999 99 9999 + 010919 9999 99 99 0 9999 99 9999 + 010920 9999 99 99 0 9999 99 9999 + 010921 1228 22 01 1 303079456 02 0079 + 010922 1228 22 02 1 303079456 03 0079 + 010923 9999 99 99 0 9999 99 9999 + 010924 9999 99 99 0 9999 99 9999 + 010925 9999 99 99 0 9999 99 9999 + 010926 9999 99 99 0 9999 99 9999 + 010927 9999 99 99 0 9999 99 9999 + 010928 9999 99 99 0 9999 99 9999 + 010929 1228 23 01 1 303079456 04 0079 + 010930 1228 23 02 1 303079456 05 0079 + 010931 9999 99 99 0 9999 99 9999 + 010932 9999 99 99 0 9999 99 9999 + 010933 9999 99 99 0 9999 99 9999 + 010934 9999 99 99 0 9999 99 9999 + 010935 9999 99 99 0 9999 99 9999 + 010936 9999 99 99 0 9999 99 9999 + 010937 1228 24 01 1 303079456 06 0079 + 010938 1228 24 02 1 303079456 07 0079 + 010939 9999 99 99 0 9999 99 9999 + 010940 9999 99 99 0 9999 99 9999 + 010941 9999 99 99 0 9999 99 9999 + 010942 9999 99 99 0 9999 99 9999 + 010943 9999 99 99 0 9999 99 9999 + 010944 9999 99 99 0 9999 99 9999 + 010945 1228 25 01 1 305291292 00 0622 + 010946 1228 25 02 1 305291292 01 0622 + 010947 1228 25 03 1 305291292 02 0622 + 010948 1228 25 04 1 305291292 03 0622 + 010949 1228 25 05 1 305291292 04 0622 + 010950 1228 25 06 1 305291292 05 0622 + 010951 1228 25 07 1 305291292 06 0622 + 010952 1228 25 08 1 305291292 07 0622 + 010953 1228 26 01 1 305291292 08 0622 + 010954 1228 26 02 1 305291292 09 0622 + 010955 1228 26 03 1 305291292 10 0622 + 010956 1228 26 04 1 305291292 11 0622 + 010957 1228 26 05 1 305291292 12 0622 + 010958 1228 26 06 1 305291292 13 0622 + 010959 1228 26 07 1 305291292 14 0622 + 010960 1228 26 08 1 305291292 15 0622 + 010961 1228 27 01 1 305291296 00 0623 + 010962 1228 27 02 1 305291296 01 0623 + 010963 1228 27 03 1 305291296 02 0623 + 010964 1228 27 04 1 305291296 03 0623 + 010965 1228 27 05 1 305291296 04 0623 + 010966 1228 27 06 1 305291296 05 0623 + 010967 1228 27 07 1 305291296 06 0623 + 010968 1228 27 08 1 305291296 07 0623 + 010969 1228 28 01 1 305291296 08 0623 + 010970 1228 28 02 1 305291296 09 0623 + 010971 1228 28 03 1 305291296 10 0623 + 010972 1228 28 04 1 305291296 11 0623 + 010973 1228 28 05 1 305291296 12 0623 + 010974 1228 28 06 1 305291296 13 0623 + 010975 1228 28 07 1 305291296 14 0623 + 010976 1228 28 08 1 305291296 15 0623 + 010977 1228 29 01 1 305291284 00 0620 + 010978 1228 29 02 1 305291284 01 0620 + 010979 1228 29 03 1 305291284 02 0620 + 010980 1228 29 04 1 305291284 03 0620 + 010981 1228 29 05 1 305291284 04 0620 + 010982 1228 29 06 1 305291284 05 0620 + 010983 1228 29 07 1 305291284 06 0620 + 010984 1228 29 08 1 305291284 07 0620 + 010985 1228 30 01 1 305291284 08 0620 + 010986 1228 30 02 1 305291284 09 0620 + 010987 1228 30 03 1 305291284 10 0620 + 010988 1228 30 04 1 305291284 11 0620 + 010989 1228 30 05 1 305291284 12 0620 + 010990 1228 30 06 1 305291284 13 0620 + 010991 1228 30 07 1 305291284 14 0620 + 010992 1228 30 08 1 305291284 15 0620 + 010993 1228 31 01 1 305291288 00 0621 + 010994 1228 31 02 1 305291288 01 0621 + 010995 1228 31 03 1 305291288 02 0621 + 010996 1228 31 04 1 305291288 03 0621 + 010997 1228 31 05 1 305291288 04 0621 + 010998 1228 31 06 1 305291288 05 0621 + 010999 1228 31 07 1 305291288 06 0621 + 011000 1228 31 08 1 305291288 07 0621 + 011001 1228 32 01 1 305291288 08 0621 + 011002 1228 32 02 1 305291288 09 0621 + 011003 1228 32 03 1 305291288 10 0621 + 011004 1228 32 04 1 305291288 11 0621 + 011005 1228 32 05 1 305291288 12 0621 + 011006 1228 32 06 1 305291288 13 0621 + 011007 1228 32 07 1 305291288 14 0621 + 011008 1228 32 08 1 305291288 15 0621 + 011009 1228 33 01 1 306401304 00 1093 + 011010 1228 33 02 1 306401304 01 1093 + 011011 1228 33 03 1 306401304 02 1093 + 011012 1228 33 04 1 306401304 03 1093 + 011013 1228 33 05 1 306401304 04 1093 + 011014 1228 33 06 1 306401304 05 1093 + 011015 1228 33 07 1 306401304 06 1093 + 011016 1228 33 08 1 306401304 07 1093 + 011017 1228 34 01 1 306401304 08 1093 + 011018 1228 34 02 1 306401304 09 1093 + 011019 1228 34 03 1 306401304 10 1093 + 011020 1228 34 04 1 306401304 11 1093 + 011021 1228 34 05 1 306401304 12 1093 + 011022 1228 34 06 1 306401304 13 1093 + 011023 1228 34 07 1 306401304 14 1093 + 011024 1228 34 08 1 306401304 15 1093 + 011025 1228 35 01 1 306401300 00 1092 + 011026 1228 35 02 1 306401300 01 1092 + 011027 1228 35 03 1 306401300 02 1092 + 011028 1228 35 04 1 306401300 03 1092 + 011029 1228 35 05 1 306401300 04 1092 + 011030 1228 35 06 1 306401300 05 1092 + 011031 1228 35 07 1 306401300 06 1092 + 011032 1228 35 08 1 306401300 07 1092 + 011033 1228 36 01 1 306401300 08 1092 + 011034 1228 36 02 1 306401300 09 1092 + 011035 1228 36 03 1 306401300 10 1092 + 011036 1228 36 04 1 306401300 11 1092 + 011037 1228 36 05 1 306401300 12 1092 + 011038 1228 36 06 1 306401300 13 1092 + 011039 1228 36 07 1 306401300 14 1092 + 011040 1228 36 08 1 306401300 15 1092 + 011041 1228 37 01 1 306401312 00 1095 + 011042 1228 37 02 1 306401312 01 1095 + 011043 1228 37 03 1 306401312 02 1095 + 011044 1228 37 04 1 306401312 03 1095 + 011045 1228 37 05 1 306401312 04 1095 + 011046 1228 37 06 1 306401312 05 1095 + 011047 1228 37 07 1 306401312 06 1095 + 011048 1228 37 08 1 306401312 07 1095 + 011049 1228 38 01 1 306401312 08 1095 + 011050 1228 38 02 1 306401312 09 1095 + 011051 1228 38 03 1 306401312 10 1095 + 011052 1228 38 04 1 306401312 11 1095 + 011053 1228 38 05 1 306401312 12 1095 + 011054 1228 38 06 1 306401312 13 1095 + 011055 1228 38 07 1 306401312 14 1095 + 011056 1228 38 08 1 306401312 15 1095 + 011057 1228 39 01 1 306401308 00 1094 + 011058 1228 39 02 1 306401308 01 1094 + 011059 1228 39 03 1 306401308 02 1094 + 011060 1228 39 04 1 306401308 03 1094 + 011061 1228 39 05 1 306401308 04 1094 + 011062 1228 39 06 1 306401308 05 1094 + 011063 1228 39 07 1 306401308 06 1094 + 011064 1228 39 08 1 306401308 07 1094 + 011065 1228 40 01 1 306401308 08 1094 + 011066 1228 40 02 1 306401308 09 1094 + 011067 1228 40 03 1 306401308 10 1094 + 011068 1228 40 04 1 306401308 11 1094 + 011069 1228 40 05 1 306401308 12 1094 + 011070 1228 40 06 1 306401308 13 1094 + 011071 1228 40 07 1 306401308 14 1094 + 011072 1228 40 08 1 306401308 15 1094 + 011073 1228 41 01 1 304185376 08 0287 + 011074 1228 41 02 1 304185376 09 0287 + 011075 1228 41 03 1 304185376 10 0287 + 011076 1228 41 04 1 304185376 11 0287 + 011077 9999 99 99 0 9999 99 9999 + 011078 9999 99 99 0 9999 99 9999 + 011079 9999 99 99 0 9999 99 9999 + 011080 9999 99 99 0 9999 99 9999 + 011081 1228 42 01 1 304185376 12 0287 + 011082 1228 42 02 1 304185376 13 0287 + 011083 1228 42 03 1 304185376 14 0287 + 011084 1228 42 04 1 304185376 15 0287 + 011085 9999 99 99 0 9999 99 9999 + 011086 9999 99 99 0 9999 99 9999 + 011087 9999 99 99 0 9999 99 9999 + 011088 9999 99 99 0 9999 99 9999 + 011089 1228 43 01 1 304185376 00 0287 + 011090 1228 43 02 1 304185376 01 0287 + 011091 1228 43 03 1 304185376 02 0287 + 011092 1228 43 04 1 304185376 03 0287 + 011093 9999 99 99 0 9999 99 9999 + 011094 9999 99 99 0 9999 99 9999 + 011095 9999 99 99 0 9999 99 9999 + 011096 9999 99 99 0 9999 99 9999 + 011097 1228 44 01 1 304185376 04 0287 + 011098 1228 44 02 1 304185376 05 0287 + 011099 1228 44 03 1 304185376 06 0287 + 011100 1228 44 04 1 304185376 07 0287 + 011101 9999 99 99 0 9999 99 9999 + 011102 9999 99 99 0 9999 99 9999 + 011103 9999 99 99 0 9999 99 9999 + 011104 9999 99 99 0 9999 99 9999 + 011105 1228 45 01 1 304185372 08 0286 + 011106 1228 45 02 1 304185372 09 0286 + 011107 1228 45 03 1 304185372 10 0286 + 011108 1228 45 04 1 304185372 11 0286 + 011109 9999 99 99 0 9999 99 9999 + 011110 9999 99 99 0 9999 99 9999 + 011111 9999 99 99 0 9999 99 9999 + 011112 9999 99 99 0 9999 99 9999 + 011113 1228 46 01 1 304185372 12 0286 + 011114 1228 46 02 1 304185372 13 0286 + 011115 1228 46 03 1 304185372 14 0286 + 011116 1228 46 04 1 304185372 15 0286 + 011117 9999 99 99 0 9999 99 9999 + 011118 9999 99 99 0 9999 99 9999 + 011119 9999 99 99 0 9999 99 9999 + 011120 9999 99 99 0 9999 99 9999 + 011121 1228 47 01 1 304185372 00 0286 + 011122 1228 47 02 1 304185372 01 0286 + 011123 1228 47 03 1 304185372 02 0286 + 011124 1228 47 04 1 304185372 03 0286 + 011125 9999 99 99 0 9999 99 9999 + 011126 9999 99 99 0 9999 99 9999 + 011127 9999 99 99 0 9999 99 9999 + 011128 9999 99 99 0 9999 99 9999 + 011129 1228 48 01 1 304185372 04 0286 + 011130 1228 48 02 1 304185372 05 0286 + 011131 1228 48 03 1 304185372 06 0286 + 011132 1228 48 04 1 304185372 07 0286 + 011133 9999 99 99 0 9999 99 9999 + 011134 9999 99 99 0 9999 99 9999 + 011135 9999 99 99 0 9999 99 9999 + 011136 9999 99 99 0 9999 99 9999 + 011137 1229 01 01 1 303087636 08 0092 + 011138 1229 01 02 1 303087636 09 0092 + 011139 9999 99 99 0 9999 99 9999 + 011140 9999 99 99 0 9999 99 9999 + 011141 9999 99 99 0 9999 99 9999 + 011142 9999 99 99 0 9999 99 9999 + 011143 9999 99 99 0 9999 99 9999 + 011144 9999 99 99 0 9999 99 9999 + 011145 1229 02 01 1 303087636 10 0092 + 011146 1229 02 02 1 303087636 11 0092 + 011147 9999 99 99 0 9999 99 9999 + 011148 9999 99 99 0 9999 99 9999 + 011149 9999 99 99 0 9999 99 9999 + 011150 9999 99 99 0 9999 99 9999 + 011151 9999 99 99 0 9999 99 9999 + 011152 9999 99 99 0 9999 99 9999 + 011153 1229 03 01 1 303087636 12 0092 + 011154 1229 03 02 1 303087636 13 0092 + 011155 9999 99 99 0 9999 99 9999 + 011156 9999 99 99 0 9999 99 9999 + 011157 9999 99 99 0 9999 99 9999 + 011158 9999 99 99 0 9999 99 9999 + 011159 9999 99 99 0 9999 99 9999 + 011160 9999 99 99 0 9999 99 9999 + 011161 1229 04 01 1 303087636 14 0092 + 011162 1229 04 02 1 303087636 15 0092 + 011163 9999 99 99 0 9999 99 9999 + 011164 9999 99 99 0 9999 99 9999 + 011165 9999 99 99 0 9999 99 9999 + 011166 9999 99 99 0 9999 99 9999 + 011167 9999 99 99 0 9999 99 9999 + 011168 9999 99 99 0 9999 99 9999 + 011169 1229 05 01 1 303087636 00 0092 + 011170 1229 05 02 1 303087636 01 0092 + 011171 9999 99 99 0 9999 99 9999 + 011172 9999 99 99 0 9999 99 9999 + 011173 9999 99 99 0 9999 99 9999 + 011174 9999 99 99 0 9999 99 9999 + 011175 9999 99 99 0 9999 99 9999 + 011176 9999 99 99 0 9999 99 9999 + 011177 1229 06 01 1 303087636 02 0092 + 011178 1229 06 02 1 303087636 03 0092 + 011179 9999 99 99 0 9999 99 9999 + 011180 9999 99 99 0 9999 99 9999 + 011181 9999 99 99 0 9999 99 9999 + 011182 9999 99 99 0 9999 99 9999 + 011183 9999 99 99 0 9999 99 9999 + 011184 9999 99 99 0 9999 99 9999 + 011185 1229 07 01 1 303087636 04 0092 + 011186 1229 07 02 1 303087636 05 0092 + 011187 9999 99 99 0 9999 99 9999 + 011188 9999 99 99 0 9999 99 9999 + 011189 9999 99 99 0 9999 99 9999 + 011190 9999 99 99 0 9999 99 9999 + 011191 9999 99 99 0 9999 99 9999 + 011192 9999 99 99 0 9999 99 9999 + 011193 1229 08 01 1 303087636 06 0092 + 011194 1229 08 02 1 303087636 07 0092 + 011195 9999 99 99 0 9999 99 9999 + 011196 9999 99 99 0 9999 99 9999 + 011197 9999 99 99 0 9999 99 9999 + 011198 9999 99 99 0 9999 99 9999 + 011199 9999 99 99 0 9999 99 9999 + 011200 9999 99 99 0 9999 99 9999 + 011201 1229 09 01 1 304193560 00 0301 + 011202 1229 09 02 1 304193560 01 0301 + 011203 1229 09 03 1 304193560 02 0301 + 011204 1229 09 04 1 304193560 03 0301 + 011205 9999 99 99 0 9999 99 9999 + 011206 9999 99 99 0 9999 99 9999 + 011207 9999 99 99 0 9999 99 9999 + 011208 9999 99 99 0 9999 99 9999 + 011209 1229 10 01 1 304193560 04 0301 + 011210 1229 10 02 1 304193560 05 0301 + 011211 1229 10 03 1 304193560 06 0301 + 011212 1229 10 04 1 304193560 07 0301 + 011213 9999 99 99 0 9999 99 9999 + 011214 9999 99 99 0 9999 99 9999 + 011215 9999 99 99 0 9999 99 9999 + 011216 9999 99 99 0 9999 99 9999 + 011217 1229 11 01 1 304193560 08 0301 + 011218 1229 11 02 1 304193560 09 0301 + 011219 1229 11 03 1 304193560 10 0301 + 011220 1229 11 04 1 304193560 11 0301 + 011221 9999 99 99 0 9999 99 9999 + 011222 9999 99 99 0 9999 99 9999 + 011223 9999 99 99 0 9999 99 9999 + 011224 9999 99 99 0 9999 99 9999 + 011225 1229 12 01 1 304193560 12 0301 + 011226 1229 12 02 1 304193560 13 0301 + 011227 1229 12 03 1 304193560 14 0301 + 011228 1229 12 04 1 304193560 15 0301 + 011229 9999 99 99 0 9999 99 9999 + 011230 9999 99 99 0 9999 99 9999 + 011231 9999 99 99 0 9999 99 9999 + 011232 9999 99 99 0 9999 99 9999 + 011233 1229 13 01 1 304193556 08 0300 + 011234 1229 13 02 1 304193556 09 0300 + 011235 1229 13 03 1 304193556 10 0300 + 011236 1229 13 04 1 304193556 11 0300 + 011237 9999 99 99 0 9999 99 9999 + 011238 9999 99 99 0 9999 99 9999 + 011239 9999 99 99 0 9999 99 9999 + 011240 9999 99 99 0 9999 99 9999 + 011241 1229 14 01 1 304193556 12 0300 + 011242 1229 14 02 1 304193556 13 0300 + 011243 1229 14 03 1 304193556 14 0300 + 011244 1229 14 04 1 304193556 15 0300 + 011245 9999 99 99 0 9999 99 9999 + 011246 9999 99 99 0 9999 99 9999 + 011247 9999 99 99 0 9999 99 9999 + 011248 9999 99 99 0 9999 99 9999 + 011249 1229 15 01 1 304193556 00 0300 + 011250 1229 15 02 1 304193556 01 0300 + 011251 1229 15 03 1 304193556 02 0300 + 011252 1229 15 04 1 304193556 03 0300 + 011253 9999 99 99 0 9999 99 9999 + 011254 9999 99 99 0 9999 99 9999 + 011255 9999 99 99 0 9999 99 9999 + 011256 9999 99 99 0 9999 99 9999 + 011257 1229 16 01 1 304193556 04 0300 + 011258 1229 16 02 1 304193556 05 0300 + 011259 1229 16 03 1 304193556 06 0300 + 011260 1229 16 04 1 304193556 07 0300 + 011261 9999 99 99 0 9999 99 9999 + 011262 9999 99 99 0 9999 99 9999 + 011263 9999 99 99 0 9999 99 9999 + 011264 9999 99 99 0 9999 99 9999 + 011265 1229 17 01 1 306429980 00 1150 + 011266 1229 17 02 1 306429980 01 1150 + 011267 1229 17 03 1 306429980 02 1150 + 011268 1229 17 04 1 306429980 03 1150 + 011269 1229 17 05 1 306429980 04 1150 + 011270 1229 17 06 1 306429980 05 1150 + 011271 1229 17 07 1 306429980 06 1150 + 011272 1229 17 08 1 306429980 07 1150 + 011273 1229 18 01 1 306429980 08 1150 + 011274 1229 18 02 1 306429980 09 1150 + 011275 1229 18 03 1 306429980 10 1150 + 011276 1229 18 04 1 306429980 11 1150 + 011277 1229 18 05 1 306429980 12 1150 + 011278 1229 18 06 1 306429980 13 1150 + 011279 1229 18 07 1 306429980 14 1150 + 011280 1229 18 08 1 306429980 15 1150 + 011281 1229 19 01 1 306429984 00 1151 + 011282 1229 19 02 1 306429984 01 1151 + 011283 1229 19 03 1 306429984 02 1151 + 011284 1229 19 04 1 306429984 03 1151 + 011285 1229 19 05 1 306429984 04 1151 + 011286 1229 19 06 1 306429984 05 1151 + 011287 1229 19 07 1 306429984 06 1151 + 011288 1229 19 08 1 306429984 07 1151 + 011289 1229 20 01 1 306429984 08 1151 + 011290 1229 20 02 1 306429984 09 1151 + 011291 1229 20 03 1 306429984 10 1151 + 011292 1229 20 04 1 306429984 11 1151 + 011293 1229 20 05 1 306429984 12 1151 + 011294 1229 20 06 1 306429984 13 1151 + 011295 1229 20 07 1 306429984 14 1151 + 011296 1229 20 08 1 306429984 15 1151 + 011297 1229 21 01 1 306429972 00 1148 + 011298 1229 21 02 1 306429972 01 1148 + 011299 1229 21 03 1 306429972 02 1148 + 011300 1229 21 04 1 306429972 03 1148 + 011301 1229 21 05 1 306429972 04 1148 + 011302 1229 21 06 1 306429972 05 1148 + 011303 1229 21 07 1 306429972 06 1148 + 011304 1229 21 08 1 306429972 07 1148 + 011305 1229 22 01 1 306429972 08 1148 + 011306 1229 22 02 1 306429972 09 1148 + 011307 1229 22 03 1 306429972 10 1148 + 011308 1229 22 04 1 306429972 11 1148 + 011309 1229 22 05 1 306429972 12 1148 + 011310 1229 22 06 1 306429972 13 1148 + 011311 1229 22 07 1 306429972 14 1148 + 011312 1229 22 08 1 306429972 15 1148 + 011313 1229 23 01 1 306429976 00 1149 + 011314 1229 23 02 1 306429976 01 1149 + 011315 1229 23 03 1 306429976 02 1149 + 011316 1229 23 04 1 306429976 03 1149 + 011317 1229 23 05 1 306429976 04 1149 + 011318 1229 23 06 1 306429976 05 1149 + 011319 1229 23 07 1 306429976 06 1149 + 011320 1229 23 08 1 306429976 07 1149 + 011321 1229 24 01 1 306429976 08 1149 + 011322 1229 24 02 1 306429976 09 1149 + 011323 1229 24 03 1 306429976 10 1149 + 011324 1229 24 04 1 306429976 11 1149 + 011325 1229 24 05 1 306429976 12 1149 + 011326 1229 24 06 1 306429976 13 1149 + 011327 1229 24 07 1 306429976 14 1149 + 011328 1229 24 08 1 306429976 15 1149 + 011329 1229 25 01 1 303083548 08 0086 + 011330 1229 25 02 1 303083548 09 0086 + 011331 9999 99 99 0 9999 99 9999 + 011332 9999 99 99 0 9999 99 9999 + 011333 9999 99 99 0 9999 99 9999 + 011334 9999 99 99 0 9999 99 9999 + 011335 9999 99 99 0 9999 99 9999 + 011336 9999 99 99 0 9999 99 9999 + 011337 1229 26 01 1 303083548 10 0086 + 011338 1229 26 02 1 303083548 11 0086 + 011339 9999 99 99 0 9999 99 9999 + 011340 9999 99 99 0 9999 99 9999 + 011341 9999 99 99 0 9999 99 9999 + 011342 9999 99 99 0 9999 99 9999 + 011343 9999 99 99 0 9999 99 9999 + 011344 9999 99 99 0 9999 99 9999 + 011345 1229 27 01 1 303083548 12 0086 + 011346 1229 27 02 1 303083548 13 0086 + 011347 9999 99 99 0 9999 99 9999 + 011348 9999 99 99 0 9999 99 9999 + 011349 9999 99 99 0 9999 99 9999 + 011350 9999 99 99 0 9999 99 9999 + 011351 9999 99 99 0 9999 99 9999 + 011352 9999 99 99 0 9999 99 9999 + 011353 1229 28 01 1 303083548 14 0086 + 011354 1229 28 02 1 303083548 15 0086 + 011355 9999 99 99 0 9999 99 9999 + 011356 9999 99 99 0 9999 99 9999 + 011357 9999 99 99 0 9999 99 9999 + 011358 9999 99 99 0 9999 99 9999 + 011359 9999 99 99 0 9999 99 9999 + 011360 9999 99 99 0 9999 99 9999 + 011361 1229 29 01 1 303083548 04 0086 + 011362 1229 29 02 1 303083548 05 0086 + 011363 9999 99 99 0 9999 99 9999 + 011364 9999 99 99 0 9999 99 9999 + 011365 9999 99 99 0 9999 99 9999 + 011366 9999 99 99 0 9999 99 9999 + 011367 9999 99 99 0 9999 99 9999 + 011368 9999 99 99 0 9999 99 9999 + 011369 1229 30 01 1 303083548 06 0086 + 011370 1229 30 02 1 303083548 07 0086 + 011371 9999 99 99 0 9999 99 9999 + 011372 9999 99 99 0 9999 99 9999 + 011373 9999 99 99 0 9999 99 9999 + 011374 9999 99 99 0 9999 99 9999 + 011375 9999 99 99 0 9999 99 9999 + 011376 9999 99 99 0 9999 99 9999 + 011377 1229 31 01 1 303083548 00 0086 + 011378 1229 31 02 1 303083548 01 0086 + 011379 9999 99 99 0 9999 99 9999 + 011380 9999 99 99 0 9999 99 9999 + 011381 9999 99 99 0 9999 99 9999 + 011382 9999 99 99 0 9999 99 9999 + 011383 9999 99 99 0 9999 99 9999 + 011384 9999 99 99 0 9999 99 9999 + 011385 1229 32 01 1 303083548 02 0086 + 011386 1229 32 02 1 303083548 03 0086 + 011387 9999 99 99 0 9999 99 9999 + 011388 9999 99 99 0 9999 99 9999 + 011389 9999 99 99 0 9999 99 9999 + 011390 9999 99 99 0 9999 99 9999 + 011391 9999 99 99 0 9999 99 9999 + 011392 9999 99 99 0 9999 99 9999 + 011393 1229 33 01 1 306425884 00 1142 + 011394 1229 33 02 1 306425884 01 1142 + 011395 1229 33 03 1 306425884 02 1142 + 011396 1229 33 04 1 306425884 03 1142 + 011397 1229 33 05 1 306425884 04 1142 + 011398 1229 33 06 1 306425884 05 1142 + 011399 1229 33 07 1 306425884 06 1142 + 011400 1229 33 08 1 306425884 07 1142 + 011401 1229 34 01 1 306425884 08 1142 + 011402 1229 34 02 1 306425884 09 1142 + 011403 1229 34 03 1 306425884 10 1142 + 011404 1229 34 04 1 306425884 11 1142 + 011405 1229 34 05 1 306425884 12 1142 + 011406 1229 34 06 1 306425884 13 1142 + 011407 1229 34 07 1 306425884 14 1142 + 011408 1229 34 08 1 306425884 15 1142 + 011409 1229 35 01 1 306425888 00 1143 + 011410 1229 35 02 1 306425888 01 1143 + 011411 1229 35 03 1 306425888 02 1143 + 011412 1229 35 04 1 306425888 03 1143 + 011413 1229 35 05 1 306425888 04 1143 + 011414 1229 35 06 1 306425888 05 1143 + 011415 1229 35 07 1 306425888 06 1143 + 011416 1229 35 08 1 306425888 07 1143 + 011417 1229 36 01 1 306425888 08 1143 + 011418 1229 36 02 1 306425888 09 1143 + 011419 1229 36 03 1 306425888 10 1143 + 011420 1229 36 04 1 306425888 11 1143 + 011421 1229 36 05 1 306425888 12 1143 + 011422 1229 36 06 1 306425888 13 1143 + 011423 1229 36 07 1 306425888 14 1143 + 011424 1229 36 08 1 306425888 15 1143 + 011425 1229 37 01 1 306425876 00 1140 + 011426 1229 37 02 1 306425876 01 1140 + 011427 1229 37 03 1 306425876 02 1140 + 011428 1229 37 04 1 306425876 03 1140 + 011429 1229 37 05 1 306425876 04 1140 + 011430 1229 37 06 1 306425876 05 1140 + 011431 1229 37 07 1 306425876 06 1140 + 011432 1229 37 08 1 306425876 07 1140 + 011433 1229 38 01 1 306425876 08 1140 + 011434 1229 38 02 1 306425876 09 1140 + 011435 1229 38 03 1 306425876 10 1140 + 011436 1229 38 04 1 306425876 11 1140 + 011437 1229 38 05 1 306425876 12 1140 + 011438 1229 38 06 1 306425876 13 1140 + 011439 1229 38 07 1 306425876 14 1140 + 011440 1229 38 08 1 306425876 15 1140 + 011441 1229 39 01 1 306425880 00 1141 + 011442 1229 39 02 1 306425880 01 1141 + 011443 1229 39 03 1 306425880 02 1141 + 011444 1229 39 04 1 306425880 03 1141 + 011445 1229 39 05 1 306425880 04 1141 + 011446 1229 39 06 1 306425880 05 1141 + 011447 1229 39 07 1 306425880 06 1141 + 011448 1229 39 08 1 306425880 07 1141 + 011449 1229 40 01 1 306425880 08 1141 + 011450 1229 40 02 1 306425880 09 1141 + 011451 1229 40 03 1 306425880 10 1141 + 011452 1229 40 04 1 306425880 11 1141 + 011453 1229 40 05 1 306425880 12 1141 + 011454 1229 40 06 1 306425880 13 1141 + 011455 1229 40 07 1 306425880 14 1141 + 011456 1229 40 08 1 306425880 15 1141 + 011457 1229 41 01 1 304193564 00 0302 + 011458 1229 41 02 1 304193564 01 0302 + 011459 1229 41 03 1 304193564 02 0302 + 011460 1229 41 04 1 304193564 03 0302 + 011461 9999 99 99 0 9999 99 9999 + 011462 9999 99 99 0 9999 99 9999 + 011463 9999 99 99 0 9999 99 9999 + 011464 9999 99 99 0 9999 99 9999 + 011465 1229 42 01 1 304193564 04 0302 + 011466 1229 42 02 1 304193564 05 0302 + 011467 1229 42 03 1 304193564 06 0302 + 011468 1229 42 04 1 304193564 07 0302 + 011469 9999 99 99 0 9999 99 9999 + 011470 9999 99 99 0 9999 99 9999 + 011471 9999 99 99 0 9999 99 9999 + 011472 9999 99 99 0 9999 99 9999 + 011473 1229 43 01 1 304193564 08 0302 + 011474 1229 43 02 1 304193564 09 0302 + 011475 1229 43 03 1 304193564 10 0302 + 011476 1229 43 04 1 304193564 11 0302 + 011477 9999 99 99 0 9999 99 9999 + 011478 9999 99 99 0 9999 99 9999 + 011479 9999 99 99 0 9999 99 9999 + 011480 9999 99 99 0 9999 99 9999 + 011481 1229 44 01 1 304193564 12 0302 + 011482 1229 44 02 1 304193564 13 0302 + 011483 1229 44 03 1 304193564 14 0302 + 011484 1229 44 04 1 304193564 15 0302 + 011485 9999 99 99 0 9999 99 9999 + 011486 9999 99 99 0 9999 99 9999 + 011487 9999 99 99 0 9999 99 9999 + 011488 9999 99 99 0 9999 99 9999 + 011489 1229 45 01 1 304193568 00 0303 + 011490 1229 45 02 1 304193568 01 0303 + 011491 1229 45 03 1 304193568 02 0303 + 011492 1229 45 04 1 304193568 03 0303 + 011493 9999 99 99 0 9999 99 9999 + 011494 9999 99 99 0 9999 99 9999 + 011495 9999 99 99 0 9999 99 9999 + 011496 9999 99 99 0 9999 99 9999 + 011497 1229 46 01 1 304193568 04 0303 + 011498 1229 46 02 1 304193568 05 0303 + 011499 1229 46 03 1 304193568 06 0303 + 011500 1229 46 04 1 304193568 07 0303 + 011501 9999 99 99 0 9999 99 9999 + 011502 9999 99 99 0 9999 99 9999 + 011503 9999 99 99 0 9999 99 9999 + 011504 9999 99 99 0 9999 99 9999 + 011505 1229 47 01 1 304193568 08 0303 + 011506 1229 47 02 1 304193568 09 0303 + 011507 1229 47 03 1 304193568 10 0303 + 011508 1229 47 04 1 304193568 11 0303 + 011509 9999 99 99 0 9999 99 9999 + 011510 9999 99 99 0 9999 99 9999 + 011511 9999 99 99 0 9999 99 9999 + 011512 9999 99 99 0 9999 99 9999 + 011513 1229 48 01 1 304193568 12 0303 + 011514 1229 48 02 1 304193568 13 0303 + 011515 1229 48 03 1 304193568 14 0303 + 011516 1229 48 04 1 304193568 15 0303 + 011517 9999 99 99 0 9999 99 9999 + 011518 9999 99 99 0 9999 99 9999 + 011519 9999 99 99 0 9999 99 9999 + 011520 9999 99 99 0 9999 99 9999 + 011521 1230 01 01 1 306421784 00 1133 + 011522 1230 01 02 1 306421784 01 1133 + 011523 1230 01 03 1 306421784 02 1133 + 011524 1230 01 04 1 306421784 03 1133 + 011525 1230 01 05 1 306421784 04 1133 + 011526 1230 01 06 1 306421784 05 1133 + 011527 1230 01 07 1 306421784 06 1133 + 011528 1230 01 08 1 306421784 07 1133 + 011529 1230 02 01 1 306421784 08 1133 + 011530 1230 02 02 1 306421784 09 1133 + 011531 1230 02 03 1 306421784 10 1133 + 011532 1230 02 04 1 306421784 11 1133 + 011533 1230 02 05 1 306421784 12 1133 + 011534 1230 02 06 1 306421784 13 1133 + 011535 1230 02 07 1 306421784 14 1133 + 011536 1230 02 08 1 306421784 15 1133 + 011537 1230 03 01 1 306421780 00 1132 + 011538 1230 03 02 1 306421780 01 1132 + 011539 1230 03 03 1 306421780 02 1132 + 011540 1230 03 04 1 306421780 03 1132 + 011541 1230 03 05 1 306421780 04 1132 + 011542 1230 03 06 1 306421780 05 1132 + 011543 1230 03 07 1 306421780 06 1132 + 011544 1230 03 08 1 306421780 07 1132 + 011545 1230 04 01 1 306421780 08 1132 + 011546 1230 04 02 1 306421780 09 1132 + 011547 1230 04 03 1 306421780 10 1132 + 011548 1230 04 04 1 306421780 11 1132 + 011549 1230 04 05 1 306421780 12 1132 + 011550 1230 04 06 1 306421780 13 1132 + 011551 1230 04 07 1 306421780 14 1132 + 011552 1230 04 08 1 306421780 15 1132 + 011553 1230 05 01 1 306421792 00 1135 + 011554 1230 05 02 1 306421792 01 1135 + 011555 1230 05 03 1 306421792 02 1135 + 011556 1230 05 04 1 306421792 03 1135 + 011557 1230 05 05 1 306421792 04 1135 + 011558 1230 05 06 1 306421792 05 1135 + 011559 1230 05 07 1 306421792 06 1135 + 011560 1230 05 08 1 306421792 07 1135 + 011561 1230 06 01 1 306421792 08 1135 + 011562 1230 06 02 1 306421792 09 1135 + 011563 1230 06 03 1 306421792 10 1135 + 011564 1230 06 04 1 306421792 11 1135 + 011565 1230 06 05 1 306421792 12 1135 + 011566 1230 06 06 1 306421792 13 1135 + 011567 1230 06 07 1 306421792 14 1135 + 011568 1230 06 08 1 306421792 15 1135 + 011569 1230 07 01 1 306421788 00 1134 + 011570 1230 07 02 1 306421788 01 1134 + 011571 1230 07 03 1 306421788 02 1134 + 011572 1230 07 04 1 306421788 03 1134 + 011573 1230 07 05 1 306421788 04 1134 + 011574 1230 07 06 1 306421788 05 1134 + 011575 1230 07 07 1 306421788 06 1134 + 011576 1230 07 08 1 306421788 07 1134 + 011577 1230 08 01 1 306421788 08 1134 + 011578 1230 08 02 1 306421788 09 1134 + 011579 1230 08 03 1 306421788 10 1134 + 011580 1230 08 04 1 306421788 11 1134 + 011581 1230 08 05 1 306421788 12 1134 + 011582 1230 08 06 1 306421788 13 1134 + 011583 1230 08 07 1 306421788 14 1134 + 011584 1230 08 08 1 306421788 15 1134 + 011585 1230 09 01 1 303083552 12 0087 + 011586 1230 09 02 1 303083552 13 0087 + 011587 9999 99 99 0 9999 99 9999 + 011588 9999 99 99 0 9999 99 9999 + 011589 9999 99 99 0 9999 99 9999 + 011590 9999 99 99 0 9999 99 9999 + 011591 9999 99 99 0 9999 99 9999 + 011592 9999 99 99 0 9999 99 9999 + 011593 1230 10 01 1 303083552 14 0087 + 011594 1230 10 02 1 303083552 15 0087 + 011595 9999 99 99 0 9999 99 9999 + 011596 9999 99 99 0 9999 99 9999 + 011597 9999 99 99 0 9999 99 9999 + 011598 9999 99 99 0 9999 99 9999 + 011599 9999 99 99 0 9999 99 9999 + 011600 9999 99 99 0 9999 99 9999 + 011601 1230 11 01 1 303083552 08 0087 + 011602 1230 11 02 1 303083552 09 0087 + 011603 9999 99 99 0 9999 99 9999 + 011604 9999 99 99 0 9999 99 9999 + 011605 9999 99 99 0 9999 99 9999 + 011606 9999 99 99 0 9999 99 9999 + 011607 9999 99 99 0 9999 99 9999 + 011608 9999 99 99 0 9999 99 9999 + 011609 1230 12 01 1 303083552 10 0087 + 011610 1230 12 02 1 303083552 11 0087 + 011611 9999 99 99 0 9999 99 9999 + 011612 9999 99 99 0 9999 99 9999 + 011613 9999 99 99 0 9999 99 9999 + 011614 9999 99 99 0 9999 99 9999 + 011615 9999 99 99 0 9999 99 9999 + 011616 9999 99 99 0 9999 99 9999 + 011617 1230 13 01 1 303083552 00 0087 + 011618 1230 13 02 1 303083552 01 0087 + 011619 9999 99 99 0 9999 99 9999 + 011620 9999 99 99 0 9999 99 9999 + 011621 9999 99 99 0 9999 99 9999 + 011622 9999 99 99 0 9999 99 9999 + 011623 9999 99 99 0 9999 99 9999 + 011624 9999 99 99 0 9999 99 9999 + 011625 1230 14 01 1 303083552 02 0087 + 011626 1230 14 02 1 303083552 03 0087 + 011627 9999 99 99 0 9999 99 9999 + 011628 9999 99 99 0 9999 99 9999 + 011629 9999 99 99 0 9999 99 9999 + 011630 9999 99 99 0 9999 99 9999 + 011631 9999 99 99 0 9999 99 9999 + 011632 9999 99 99 0 9999 99 9999 + 011633 1230 15 01 1 303083552 04 0087 + 011634 1230 15 02 1 303083552 05 0087 + 011635 9999 99 99 0 9999 99 9999 + 011636 9999 99 99 0 9999 99 9999 + 011637 9999 99 99 0 9999 99 9999 + 011638 9999 99 99 0 9999 99 9999 + 011639 9999 99 99 0 9999 99 9999 + 011640 9999 99 99 0 9999 99 9999 + 011641 1230 16 01 1 303083552 06 0087 + 011642 1230 16 02 1 303083552 07 0087 + 011643 9999 99 99 0 9999 99 9999 + 011644 9999 99 99 0 9999 99 9999 + 011645 9999 99 99 0 9999 99 9999 + 011646 9999 99 99 0 9999 99 9999 + 011647 9999 99 99 0 9999 99 9999 + 011648 9999 99 99 0 9999 99 9999 + 011649 1230 17 01 1 305303580 00 0646 + 011650 1230 17 02 1 305303580 01 0646 + 011651 1230 17 03 1 305303580 02 0646 + 011652 1230 17 04 1 305303580 03 0646 + 011653 1230 17 05 1 305303580 04 0646 + 011654 1230 17 06 1 305303580 05 0646 + 011655 1230 17 07 1 305303580 06 0646 + 011656 1230 17 08 1 305303580 07 0646 + 011657 1230 18 01 1 305303580 08 0646 + 011658 1230 18 02 1 305303580 09 0646 + 011659 1230 18 03 1 305303580 10 0646 + 011660 1230 18 04 1 305303580 11 0646 + 011661 1230 18 05 1 305303580 12 0646 + 011662 1230 18 06 1 305303580 13 0646 + 011663 1230 18 07 1 305303580 14 0646 + 011664 1230 18 08 1 305303580 15 0646 + 011665 1230 19 01 1 305303584 00 0647 + 011666 1230 19 02 1 305303584 01 0647 + 011667 1230 19 03 1 305303584 02 0647 + 011668 1230 19 04 1 305303584 03 0647 + 011669 1230 19 05 1 305303584 04 0647 + 011670 1230 19 06 1 305303584 05 0647 + 011671 1230 19 07 1 305303584 06 0647 + 011672 1230 19 08 1 305303584 07 0647 + 011673 1230 20 01 1 305303584 08 0647 + 011674 1230 20 02 1 305303584 09 0647 + 011675 1230 20 03 1 305303584 10 0647 + 011676 1230 20 04 1 305303584 11 0647 + 011677 1230 20 05 1 305303584 12 0647 + 011678 1230 20 06 1 305303584 13 0647 + 011679 1230 20 07 1 305303584 14 0647 + 011680 1230 20 08 1 305303584 15 0647 + 011681 1230 21 01 1 305303572 00 0644 + 011682 1230 21 02 1 305303572 01 0644 + 011683 1230 21 03 1 305303572 02 0644 + 011684 1230 21 04 1 305303572 03 0644 + 011685 1230 21 05 1 305303572 04 0644 + 011686 1230 21 06 1 305303572 05 0644 + 011687 1230 21 07 1 305303572 06 0644 + 011688 1230 21 08 1 305303572 07 0644 + 011689 1230 22 01 1 305303572 08 0644 + 011690 1230 22 02 1 305303572 09 0644 + 011691 1230 22 03 1 305303572 10 0644 + 011692 1230 22 04 1 305303572 11 0644 + 011693 1230 22 05 1 305303572 12 0644 + 011694 1230 22 06 1 305303572 13 0644 + 011695 1230 22 07 1 305303572 14 0644 + 011696 1230 22 08 1 305303572 15 0644 + 011697 1230 23 01 1 305303576 00 0645 + 011698 1230 23 02 1 305303576 01 0645 + 011699 1230 23 03 1 305303576 02 0645 + 011700 1230 23 04 1 305303576 03 0645 + 011701 1230 23 05 1 305303576 04 0645 + 011702 1230 23 06 1 305303576 05 0645 + 011703 1230 23 07 1 305303576 06 0645 + 011704 1230 23 08 1 305303576 07 0645 + 011705 1230 24 01 1 305303576 08 0645 + 011706 1230 24 02 1 305303576 09 0645 + 011707 1230 24 03 1 305303576 10 0645 + 011708 1230 24 04 1 305303576 11 0645 + 011709 1230 24 05 1 305303576 12 0645 + 011710 1230 24 06 1 305303576 13 0645 + 011711 1230 24 07 1 305303576 14 0645 + 011712 1230 24 08 1 305303576 15 0645 + 011713 1230 25 01 1 306417688 00 1125 + 011714 1230 25 02 1 306417688 01 1125 + 011715 1230 25 03 1 306417688 02 1125 + 011716 1230 25 04 1 306417688 03 1125 + 011717 1230 25 05 1 306417688 04 1125 + 011718 1230 25 06 1 306417688 05 1125 + 011719 1230 25 07 1 306417688 06 1125 + 011720 1230 25 08 1 306417688 07 1125 + 011721 1230 26 01 1 306417688 08 1125 + 011722 1230 26 02 1 306417688 09 1125 + 011723 1230 26 03 1 306417688 10 1125 + 011724 1230 26 04 1 306417688 11 1125 + 011725 1230 26 05 1 306417688 12 1125 + 011726 1230 26 06 1 306417688 13 1125 + 011727 1230 26 07 1 306417688 14 1125 + 011728 1230 26 08 1 306417688 15 1125 + 011729 1230 27 01 1 306417684 00 1124 + 011730 1230 27 02 1 306417684 01 1124 + 011731 1230 27 03 1 306417684 02 1124 + 011732 1230 27 04 1 306417684 03 1124 + 011733 1230 27 05 1 306417684 04 1124 + 011734 1230 27 06 1 306417684 05 1124 + 011735 1230 27 07 1 306417684 06 1124 + 011736 1230 27 08 1 306417684 07 1124 + 011737 1230 28 01 1 306417684 08 1124 + 011738 1230 28 02 1 306417684 09 1124 + 011739 1230 28 03 1 306417684 10 1124 + 011740 1230 28 04 1 306417684 11 1124 + 011741 1230 28 05 1 306417684 12 1124 + 011742 1230 28 06 1 306417684 13 1124 + 011743 1230 28 07 1 306417684 14 1124 + 011744 1230 28 08 1 306417684 15 1124 + 011745 1230 29 01 1 306417696 00 1127 + 011746 1230 29 02 1 306417696 01 1127 + 011747 1230 29 03 1 306417696 02 1127 + 011748 1230 29 04 1 306417696 03 1127 + 011749 1230 29 05 1 306417696 04 1127 + 011750 1230 29 06 1 306417696 05 1127 + 011751 1230 29 07 1 306417696 06 1127 + 011752 1230 29 08 1 306417696 07 1127 + 011753 1230 30 01 1 306417696 08 1127 + 011754 1230 30 02 1 306417696 09 1127 + 011755 1230 30 03 1 306417696 10 1127 + 011756 1230 30 04 1 306417696 11 1127 + 011757 1230 30 05 1 306417696 12 1127 + 011758 1230 30 06 1 306417696 13 1127 + 011759 1230 30 07 1 306417696 14 1127 + 011760 1230 30 08 1 306417696 15 1127 + 011761 1230 31 01 1 306417692 00 1126 + 011762 1230 31 02 1 306417692 01 1126 + 011763 1230 31 03 1 306417692 02 1126 + 011764 1230 31 04 1 306417692 03 1126 + 011765 1230 31 05 1 306417692 04 1126 + 011766 1230 31 06 1 306417692 05 1126 + 011767 1230 31 07 1 306417692 06 1126 + 011768 1230 31 08 1 306417692 07 1126 + 011769 1230 32 01 1 306417692 08 1126 + 011770 1230 32 02 1 306417692 09 1126 + 011771 1230 32 03 1 306417692 10 1126 + 011772 1230 32 04 1 306417692 11 1126 + 011773 1230 32 05 1 306417692 12 1126 + 011774 1230 32 06 1 306417692 13 1126 + 011775 1230 32 07 1 306417692 14 1126 + 011776 1230 32 08 1 306417692 15 1126 + 011777 1230 33 01 1 305299484 00 0638 + 011778 1230 33 02 1 305299484 01 0638 + 011779 1230 33 03 1 305299484 02 0638 + 011780 1230 33 04 1 305299484 03 0638 + 011781 1230 33 05 1 305299484 04 0638 + 011782 1230 33 06 1 305299484 05 0638 + 011783 1230 33 07 1 305299484 06 0638 + 011784 1230 33 08 1 305299484 07 0638 + 011785 1230 34 01 1 305299484 08 0638 + 011786 1230 34 02 1 305299484 09 0638 + 011787 1230 34 03 1 305299484 10 0638 + 011788 1230 34 04 1 305299484 11 0638 + 011789 1230 34 05 1 305299484 12 0638 + 011790 1230 34 06 1 305299484 13 0638 + 011791 1230 34 07 1 305299484 14 0638 + 011792 1230 34 08 1 305299484 15 0638 + 011793 1230 35 01 1 305299488 00 0639 + 011794 1230 35 02 1 305299488 01 0639 + 011795 1230 35 03 1 305299488 02 0639 + 011796 1230 35 04 1 305299488 03 0639 + 011797 1230 35 05 1 305299488 04 0639 + 011798 1230 35 06 1 305299488 05 0639 + 011799 1230 35 07 1 305299488 06 0639 + 011800 1230 35 08 1 305299488 07 0639 + 011801 1230 36 01 1 305299488 08 0639 + 011802 1230 36 02 1 305299488 09 0639 + 011803 1230 36 03 1 305299488 10 0639 + 011804 1230 36 04 1 305299488 11 0639 + 011805 1230 36 05 1 305299488 12 0639 + 011806 1230 36 06 1 305299488 13 0639 + 011807 1230 36 07 1 305299488 14 0639 + 011808 1230 36 08 1 305299488 15 0639 + 011809 1230 37 01 1 305299476 00 0636 + 011810 1230 37 02 1 305299476 01 0636 + 011811 1230 37 03 1 305299476 02 0636 + 011812 1230 37 04 1 305299476 03 0636 + 011813 1230 37 05 1 305299476 04 0636 + 011814 1230 37 06 1 305299476 05 0636 + 011815 1230 37 07 1 305299476 06 0636 + 011816 1230 37 08 1 305299476 07 0636 + 011817 1230 38 01 1 305299476 08 0636 + 011818 1230 38 02 1 305299476 09 0636 + 011819 1230 38 03 1 305299476 10 0636 + 011820 1230 38 04 1 305299476 11 0636 + 011821 1230 38 05 1 305299476 12 0636 + 011822 1230 38 06 1 305299476 13 0636 + 011823 1230 38 07 1 305299476 14 0636 + 011824 1230 38 08 1 305299476 15 0636 + 011825 1230 39 01 1 305299480 00 0637 + 011826 1230 39 02 1 305299480 01 0637 + 011827 1230 39 03 1 305299480 02 0637 + 011828 1230 39 04 1 305299480 03 0637 + 011829 1230 39 05 1 305299480 04 0637 + 011830 1230 39 06 1 305299480 05 0637 + 011831 1230 39 07 1 305299480 06 0637 + 011832 1230 39 08 1 305299480 07 0637 + 011833 1230 40 01 1 305299480 08 0637 + 011834 1230 40 02 1 305299480 09 0637 + 011835 1230 40 03 1 305299480 10 0637 + 011836 1230 40 04 1 305299480 11 0637 + 011837 1230 40 05 1 305299480 12 0637 + 011838 1230 40 06 1 305299480 13 0637 + 011839 1230 40 07 1 305299480 14 0637 + 011840 1230 40 08 1 305299480 15 0637 + 011841 1230 41 01 1 305295384 00 0629 + 011842 1230 41 02 1 305295384 01 0629 + 011843 1230 41 03 1 305295384 02 0629 + 011844 1230 41 04 1 305295384 03 0629 + 011845 1230 41 05 1 305295384 04 0629 + 011846 1230 41 06 1 305295384 05 0629 + 011847 1230 41 07 1 305295384 06 0629 + 011848 1230 41 08 1 305295384 07 0629 + 011849 1230 42 01 1 305295384 08 0629 + 011850 1230 42 02 1 305295384 09 0629 + 011851 1230 42 03 1 305295384 10 0629 + 011852 1230 42 04 1 305295384 11 0629 + 011853 1230 42 05 1 305295384 12 0629 + 011854 1230 42 06 1 305295384 13 0629 + 011855 1230 42 07 1 305295384 14 0629 + 011856 1230 42 08 1 305295384 15 0629 + 011857 1230 43 01 1 305295380 00 0628 + 011858 1230 43 02 1 305295380 01 0628 + 011859 1230 43 03 1 305295380 02 0628 + 011860 1230 43 04 1 305295380 03 0628 + 011861 1230 43 05 1 305295380 04 0628 + 011862 1230 43 06 1 305295380 05 0628 + 011863 1230 43 07 1 305295380 06 0628 + 011864 1230 43 08 1 305295380 07 0628 + 011865 1230 44 01 1 305295380 08 0628 + 011866 1230 44 02 1 305295380 09 0628 + 011867 1230 44 03 1 305295380 10 0628 + 011868 1230 44 04 1 305295380 11 0628 + 011869 1230 44 05 1 305295380 12 0628 + 011870 1230 44 06 1 305295380 13 0628 + 011871 1230 44 07 1 305295380 14 0628 + 011872 1230 44 08 1 305295380 15 0628 + 011873 1230 45 01 1 305295392 00 0631 + 011874 1230 45 02 1 305295392 01 0631 + 011875 1230 45 03 1 305295392 02 0631 + 011876 1230 45 04 1 305295392 03 0631 + 011877 1230 45 05 1 305295392 04 0631 + 011878 1230 45 06 1 305295392 05 0631 + 011879 1230 45 07 1 305295392 06 0631 + 011880 1230 45 08 1 305295392 07 0631 + 011881 1230 46 01 1 305295392 08 0631 + 011882 1230 46 02 1 305295392 09 0631 + 011883 1230 46 03 1 305295392 10 0631 + 011884 1230 46 04 1 305295392 11 0631 + 011885 1230 46 05 1 305295392 12 0631 + 011886 1230 46 06 1 305295392 13 0631 + 011887 1230 46 07 1 305295392 14 0631 + 011888 1230 46 08 1 305295392 15 0631 + 011889 1230 47 01 1 305295388 00 0630 + 011890 1230 47 02 1 305295388 01 0630 + 011891 1230 47 03 1 305295388 02 0630 + 011892 1230 47 04 1 305295388 03 0630 + 011893 1230 47 05 1 305295388 04 0630 + 011894 1230 47 06 1 305295388 05 0630 + 011895 1230 47 07 1 305295388 06 0630 + 011896 1230 47 08 1 305295388 07 0630 + 011897 1230 48 01 1 305295388 08 0630 + 011898 1230 48 02 1 305295388 09 0630 + 011899 1230 48 03 1 305295388 10 0630 + 011900 1230 48 04 1 305295388 11 0630 + 011901 1230 48 05 1 305295388 12 0630 + 011902 1230 48 06 1 305295388 13 0630 + 011903 1230 48 07 1 305295388 14 0630 + 011904 1230 48 08 1 305295388 15 0630 + 011905 1231 01 01 1 303087640 08 0093 + 011906 1231 01 02 1 303087640 09 0093 + 011907 9999 99 99 0 9999 99 9999 + 011908 9999 99 99 0 9999 99 9999 + 011909 9999 99 99 0 9999 99 9999 + 011910 9999 99 99 0 9999 99 9999 + 011911 9999 99 99 0 9999 99 9999 + 011912 9999 99 99 0 9999 99 9999 + 011913 1231 02 01 1 303087640 10 0093 + 011914 1231 02 02 1 303087640 11 0093 + 011915 9999 99 99 0 9999 99 9999 + 011916 9999 99 99 0 9999 99 9999 + 011917 9999 99 99 0 9999 99 9999 + 011918 9999 99 99 0 9999 99 9999 + 011919 9999 99 99 0 9999 99 9999 + 011920 9999 99 99 0 9999 99 9999 + 011921 1231 03 01 1 303087640 12 0093 + 011922 1231 03 02 1 303087640 13 0093 + 011923 9999 99 99 0 9999 99 9999 + 011924 9999 99 99 0 9999 99 9999 + 011925 9999 99 99 0 9999 99 9999 + 011926 9999 99 99 0 9999 99 9999 + 011927 9999 99 99 0 9999 99 9999 + 011928 9999 99 99 0 9999 99 9999 + 011929 1231 04 01 1 303087640 14 0093 + 011930 1231 04 02 1 303087640 15 0093 + 011931 9999 99 99 0 9999 99 9999 + 011932 9999 99 99 0 9999 99 9999 + 011933 9999 99 99 0 9999 99 9999 + 011934 9999 99 99 0 9999 99 9999 + 011935 9999 99 99 0 9999 99 9999 + 011936 9999 99 99 0 9999 99 9999 + 011937 1231 05 01 1 303087640 00 0093 + 011938 1231 05 02 1 303087640 01 0093 + 011939 9999 99 99 0 9999 99 9999 + 011940 9999 99 99 0 9999 99 9999 + 011941 9999 99 99 0 9999 99 9999 + 011942 9999 99 99 0 9999 99 9999 + 011943 9999 99 99 0 9999 99 9999 + 011944 9999 99 99 0 9999 99 9999 + 011945 1231 06 01 1 303087640 02 0093 + 011946 1231 06 02 1 303087640 03 0093 + 011947 9999 99 99 0 9999 99 9999 + 011948 9999 99 99 0 9999 99 9999 + 011949 9999 99 99 0 9999 99 9999 + 011950 9999 99 99 0 9999 99 9999 + 011951 9999 99 99 0 9999 99 9999 + 011952 9999 99 99 0 9999 99 9999 + 011953 1231 07 01 1 303087640 04 0093 + 011954 1231 07 02 1 303087640 05 0093 + 011955 9999 99 99 0 9999 99 9999 + 011956 9999 99 99 0 9999 99 9999 + 011957 9999 99 99 0 9999 99 9999 + 011958 9999 99 99 0 9999 99 9999 + 011959 9999 99 99 0 9999 99 9999 + 011960 9999 99 99 0 9999 99 9999 + 011961 1231 08 01 1 303087640 06 0093 + 011962 1231 08 02 1 303087640 07 0093 + 011963 9999 99 99 0 9999 99 9999 + 011964 9999 99 99 0 9999 99 9999 + 011965 9999 99 99 0 9999 99 9999 + 011966 9999 99 99 0 9999 99 9999 + 011967 9999 99 99 0 9999 99 9999 + 011968 9999 99 99 0 9999 99 9999 + 011969 1231 09 01 1 304201752 00 0317 + 011970 1231 09 02 1 304201752 01 0317 + 011971 1231 09 03 1 304201752 02 0317 + 011972 1231 09 04 1 304201752 03 0317 + 011973 9999 99 99 0 9999 99 9999 + 011974 9999 99 99 0 9999 99 9999 + 011975 9999 99 99 0 9999 99 9999 + 011976 9999 99 99 0 9999 99 9999 + 011977 1231 10 01 1 304201752 04 0317 + 011978 1231 10 02 1 304201752 05 0317 + 011979 1231 10 03 1 304201752 06 0317 + 011980 1231 10 04 1 304201752 07 0317 + 011981 9999 99 99 0 9999 99 9999 + 011982 9999 99 99 0 9999 99 9999 + 011983 9999 99 99 0 9999 99 9999 + 011984 9999 99 99 0 9999 99 9999 + 011985 1231 11 01 1 304201752 08 0317 + 011986 1231 11 02 1 304201752 09 0317 + 011987 1231 11 03 1 304201752 10 0317 + 011988 1231 11 04 1 304201752 11 0317 + 011989 9999 99 99 0 9999 99 9999 + 011990 9999 99 99 0 9999 99 9999 + 011991 9999 99 99 0 9999 99 9999 + 011992 9999 99 99 0 9999 99 9999 + 011993 1231 12 01 1 304201752 12 0317 + 011994 1231 12 02 1 304201752 13 0317 + 011995 1231 12 03 1 304201752 14 0317 + 011996 1231 12 04 1 304201752 15 0317 + 011997 9999 99 99 0 9999 99 9999 + 011998 9999 99 99 0 9999 99 9999 + 011999 9999 99 99 0 9999 99 9999 + 012000 9999 99 99 0 9999 99 9999 + 012001 1231 13 01 1 304201748 08 0316 + 012002 1231 13 02 1 304201748 09 0316 + 012003 1231 13 03 1 304201748 10 0316 + 012004 1231 13 04 1 304201748 11 0316 + 012005 9999 99 99 0 9999 99 9999 + 012006 9999 99 99 0 9999 99 9999 + 012007 9999 99 99 0 9999 99 9999 + 012008 9999 99 99 0 9999 99 9999 + 012009 1231 14 01 1 304201748 12 0316 + 012010 1231 14 02 1 304201748 13 0316 + 012011 1231 14 03 1 304201748 14 0316 + 012012 1231 14 04 1 304201748 15 0316 + 012013 9999 99 99 0 9999 99 9999 + 012014 9999 99 99 0 9999 99 9999 + 012015 9999 99 99 0 9999 99 9999 + 012016 9999 99 99 0 9999 99 9999 + 012017 1231 15 01 1 304201748 00 0316 + 012018 1231 15 02 1 304201748 01 0316 + 012019 1231 15 03 1 304201748 02 0316 + 012020 1231 15 04 1 304201748 03 0316 + 012021 9999 99 99 0 9999 99 9999 + 012022 9999 99 99 0 9999 99 9999 + 012023 9999 99 99 0 9999 99 9999 + 012024 9999 99 99 0 9999 99 9999 + 012025 1231 16 01 1 304201748 04 0316 + 012026 1231 16 02 1 304201748 05 0316 + 012027 1231 16 03 1 304201748 06 0316 + 012028 1231 16 04 1 304201748 07 0316 + 012029 9999 99 99 0 9999 99 9999 + 012030 9999 99 99 0 9999 99 9999 + 012031 9999 99 99 0 9999 99 9999 + 012032 9999 99 99 0 9999 99 9999 + 012033 1231 17 01 1 306446364 00 1182 + 012034 1231 17 02 1 306446364 01 1182 + 012035 1231 17 03 1 306446364 02 1182 + 012036 1231 17 04 1 306446364 03 1182 + 012037 1231 17 05 1 306446364 04 1182 + 012038 1231 17 06 1 306446364 05 1182 + 012039 1231 17 07 1 306446364 06 1182 + 012040 1231 17 08 1 306446364 07 1182 + 012041 1231 18 01 1 306446364 08 1182 + 012042 1231 18 02 1 306446364 09 1182 + 012043 1231 18 03 1 306446364 10 1182 + 012044 1231 18 04 1 306446364 11 1182 + 012045 1231 18 05 1 306446364 12 1182 + 012046 1231 18 06 1 306446364 13 1182 + 012047 1231 18 07 1 306446364 14 1182 + 012048 1231 18 08 1 306446364 15 1182 + 012049 1231 19 01 1 306446368 00 1183 + 012050 1231 19 02 1 306446368 01 1183 + 012051 1231 19 03 1 306446368 02 1183 + 012052 1231 19 04 1 306446368 03 1183 + 012053 1231 19 05 1 306446368 04 1183 + 012054 1231 19 06 1 306446368 05 1183 + 012055 1231 19 07 1 306446368 06 1183 + 012056 1231 19 08 1 306446368 07 1183 + 012057 1231 20 01 1 306446368 08 1183 + 012058 1231 20 02 1 306446368 09 1183 + 012059 1231 20 03 1 306446368 10 1183 + 012060 1231 20 04 1 306446368 11 1183 + 012061 1231 20 05 1 306446368 12 1183 + 012062 1231 20 06 1 306446368 13 1183 + 012063 1231 20 07 1 306446368 14 1183 + 012064 1231 20 08 1 306446368 15 1183 + 012065 1231 21 01 1 306446356 00 1180 + 012066 1231 21 02 1 306446356 01 1180 + 012067 1231 21 03 1 306446356 02 1180 + 012068 1231 21 04 1 306446356 03 1180 + 012069 1231 21 05 1 306446356 04 1180 + 012070 1231 21 06 1 306446356 05 1180 + 012071 1231 21 07 1 306446356 06 1180 + 012072 1231 21 08 1 306446356 07 1180 + 012073 1231 22 01 1 306446356 08 1180 + 012074 1231 22 02 1 306446356 09 1180 + 012075 1231 22 03 1 306446356 10 1180 + 012076 1231 22 04 1 306446356 11 1180 + 012077 1231 22 05 1 306446356 12 1180 + 012078 1231 22 06 1 306446356 13 1180 + 012079 1231 22 07 1 306446356 14 1180 + 012080 1231 22 08 1 306446356 15 1180 + 012081 1231 23 01 1 306446360 00 1181 + 012082 1231 23 02 1 306446360 01 1181 + 012083 1231 23 03 1 306446360 02 1181 + 012084 1231 23 04 1 306446360 03 1181 + 012085 1231 23 05 1 306446360 04 1181 + 012086 1231 23 06 1 306446360 05 1181 + 012087 1231 23 07 1 306446360 06 1181 + 012088 1231 23 08 1 306446360 07 1181 + 012089 1231 24 01 1 306446360 08 1181 + 012090 1231 24 02 1 306446360 09 1181 + 012091 1231 24 03 1 306446360 10 1181 + 012092 1231 24 04 1 306446360 11 1181 + 012093 1231 24 05 1 306446360 12 1181 + 012094 1231 24 06 1 306446360 13 1181 + 012095 1231 24 07 1 306446360 14 1181 + 012096 1231 24 08 1 306446360 15 1181 + 012097 1231 25 01 1 303087644 08 0094 + 012098 1231 25 02 1 303087644 09 0094 + 012099 9999 99 99 0 9999 99 9999 + 012100 9999 99 99 0 9999 99 9999 + 012101 9999 99 99 0 9999 99 9999 + 012102 9999 99 99 0 9999 99 9999 + 012103 9999 99 99 0 9999 99 9999 + 012104 9999 99 99 0 9999 99 9999 + 012105 1231 26 01 1 303087644 10 0094 + 012106 1231 26 02 1 303087644 11 0094 + 012107 9999 99 99 0 9999 99 9999 + 012108 9999 99 99 0 9999 99 9999 + 012109 9999 99 99 0 9999 99 9999 + 012110 9999 99 99 0 9999 99 9999 + 012111 9999 99 99 0 9999 99 9999 + 012112 9999 99 99 0 9999 99 9999 + 012113 1231 27 01 1 303087644 12 0094 + 012114 1231 27 02 1 303087644 13 0094 + 012115 9999 99 99 0 9999 99 9999 + 012116 9999 99 99 0 9999 99 9999 + 012117 9999 99 99 0 9999 99 9999 + 012118 9999 99 99 0 9999 99 9999 + 012119 9999 99 99 0 9999 99 9999 + 012120 9999 99 99 0 9999 99 9999 + 012121 1231 28 01 1 303087644 14 0094 + 012122 1231 28 02 1 303087644 15 0094 + 012123 9999 99 99 0 9999 99 9999 + 012124 9999 99 99 0 9999 99 9999 + 012125 9999 99 99 0 9999 99 9999 + 012126 9999 99 99 0 9999 99 9999 + 012127 9999 99 99 0 9999 99 9999 + 012128 9999 99 99 0 9999 99 9999 + 012129 1231 29 01 1 303087644 04 0094 + 012130 1231 29 02 1 303087644 05 0094 + 012131 9999 99 99 0 9999 99 9999 + 012132 9999 99 99 0 9999 99 9999 + 012133 9999 99 99 0 9999 99 9999 + 012134 9999 99 99 0 9999 99 9999 + 012135 9999 99 99 0 9999 99 9999 + 012136 9999 99 99 0 9999 99 9999 + 012137 1231 30 01 1 303087644 06 0094 + 012138 1231 30 02 1 303087644 07 0094 + 012139 9999 99 99 0 9999 99 9999 + 012140 9999 99 99 0 9999 99 9999 + 012141 9999 99 99 0 9999 99 9999 + 012142 9999 99 99 0 9999 99 9999 + 012143 9999 99 99 0 9999 99 9999 + 012144 9999 99 99 0 9999 99 9999 + 012145 1231 31 01 1 303087644 00 0094 + 012146 1231 31 02 1 303087644 01 0094 + 012147 9999 99 99 0 9999 99 9999 + 012148 9999 99 99 0 9999 99 9999 + 012149 9999 99 99 0 9999 99 9999 + 012150 9999 99 99 0 9999 99 9999 + 012151 9999 99 99 0 9999 99 9999 + 012152 9999 99 99 0 9999 99 9999 + 012153 1231 32 01 1 303087644 02 0094 + 012154 1231 32 02 1 303087644 03 0094 + 012155 9999 99 99 0 9999 99 9999 + 012156 9999 99 99 0 9999 99 9999 + 012157 9999 99 99 0 9999 99 9999 + 012158 9999 99 99 0 9999 99 9999 + 012159 9999 99 99 0 9999 99 9999 + 012160 9999 99 99 0 9999 99 9999 + 012161 1231 33 01 1 306442268 00 1174 + 012162 1231 33 02 1 306442268 01 1174 + 012163 1231 33 03 1 306442268 02 1174 + 012164 1231 33 04 1 306442268 03 1174 + 012165 1231 33 05 1 306442268 04 1174 + 012166 1231 33 06 1 306442268 05 1174 + 012167 1231 33 07 1 306442268 06 1174 + 012168 1231 33 08 1 306442268 07 1174 + 012169 1231 34 01 1 306442268 08 1174 + 012170 1231 34 02 1 306442268 09 1174 + 012171 1231 34 03 1 306442268 10 1174 + 012172 1231 34 04 1 306442268 11 1174 + 012173 1231 34 05 1 306442268 12 1174 + 012174 1231 34 06 1 306442268 13 1174 + 012175 1231 34 07 1 306442268 14 1174 + 012176 1231 34 08 1 306442268 15 1174 + 012177 1231 35 01 1 306442272 00 1175 + 012178 1231 35 02 1 306442272 01 1175 + 012179 1231 35 03 1 306442272 02 1175 + 012180 1231 35 04 1 306442272 03 1175 + 012181 1231 35 05 1 306442272 04 1175 + 012182 1231 35 06 1 306442272 05 1175 + 012183 1231 35 07 1 306442272 06 1175 + 012184 1231 35 08 1 306442272 07 1175 + 012185 1231 36 01 1 306442272 08 1175 + 012186 1231 36 02 1 306442272 09 1175 + 012187 1231 36 03 1 306442272 10 1175 + 012188 1231 36 04 1 306442272 11 1175 + 012189 1231 36 05 1 306442272 12 1175 + 012190 1231 36 06 1 306442272 13 1175 + 012191 1231 36 07 1 306442272 14 1175 + 012192 1231 36 08 1 306442272 15 1175 + 012193 1231 37 01 1 306442260 00 1172 + 012194 1231 37 02 1 306442260 01 1172 + 012195 1231 37 03 1 306442260 02 1172 + 012196 1231 37 04 1 306442260 03 1172 + 012197 1231 37 05 1 306442260 04 1172 + 012198 1231 37 06 1 306442260 05 1172 + 012199 1231 37 07 1 306442260 06 1172 + 012200 1231 37 08 1 306442260 07 1172 + 012201 1231 38 01 1 306442260 08 1172 + 012202 1231 38 02 1 306442260 09 1172 + 012203 1231 38 03 1 306442260 10 1172 + 012204 1231 38 04 1 306442260 11 1172 + 012205 1231 38 05 1 306442260 12 1172 + 012206 1231 38 06 1 306442260 13 1172 + 012207 1231 38 07 1 306442260 14 1172 + 012208 1231 38 08 1 306442260 15 1172 + 012209 1231 39 01 1 306442264 00 1173 + 012210 1231 39 02 1 306442264 01 1173 + 012211 1231 39 03 1 306442264 02 1173 + 012212 1231 39 04 1 306442264 03 1173 + 012213 1231 39 05 1 306442264 04 1173 + 012214 1231 39 06 1 306442264 05 1173 + 012215 1231 39 07 1 306442264 06 1173 + 012216 1231 39 08 1 306442264 07 1173 + 012217 1231 40 01 1 306442264 08 1173 + 012218 1231 40 02 1 306442264 09 1173 + 012219 1231 40 03 1 306442264 10 1173 + 012220 1231 40 04 1 306442264 11 1173 + 012221 1231 40 05 1 306442264 12 1173 + 012222 1231 40 06 1 306442264 13 1173 + 012223 1231 40 07 1 306442264 14 1173 + 012224 1231 40 08 1 306442264 15 1173 + 012225 1231 41 01 1 304201756 00 0318 + 012226 1231 41 02 1 304201756 01 0318 + 012227 1231 41 03 1 304201756 02 0318 + 012228 1231 41 04 1 304201756 03 0318 + 012229 9999 99 99 0 9999 99 9999 + 012230 9999 99 99 0 9999 99 9999 + 012231 9999 99 99 0 9999 99 9999 + 012232 9999 99 99 0 9999 99 9999 + 012233 1231 42 01 1 304201756 04 0318 + 012234 1231 42 02 1 304201756 05 0318 + 012235 1231 42 03 1 304201756 06 0318 + 012236 1231 42 04 1 304201756 07 0318 + 012237 9999 99 99 0 9999 99 9999 + 012238 9999 99 99 0 9999 99 9999 + 012239 9999 99 99 0 9999 99 9999 + 012240 9999 99 99 0 9999 99 9999 + 012241 1231 43 01 1 304201756 08 0318 + 012242 1231 43 02 1 304201756 09 0318 + 012243 1231 43 03 1 304201756 10 0318 + 012244 1231 43 04 1 304201756 11 0318 + 012245 9999 99 99 0 9999 99 9999 + 012246 9999 99 99 0 9999 99 9999 + 012247 9999 99 99 0 9999 99 9999 + 012248 9999 99 99 0 9999 99 9999 + 012249 1231 44 01 1 304201756 12 0318 + 012250 1231 44 02 1 304201756 13 0318 + 012251 1231 44 03 1 304201756 14 0318 + 012252 1231 44 04 1 304201756 15 0318 + 012253 9999 99 99 0 9999 99 9999 + 012254 9999 99 99 0 9999 99 9999 + 012255 9999 99 99 0 9999 99 9999 + 012256 9999 99 99 0 9999 99 9999 + 012257 1231 45 01 1 304201760 00 0319 + 012258 1231 45 02 1 304201760 01 0319 + 012259 1231 45 03 1 304201760 02 0319 + 012260 1231 45 04 1 304201760 03 0319 + 012261 9999 99 99 0 9999 99 9999 + 012262 9999 99 99 0 9999 99 9999 + 012263 9999 99 99 0 9999 99 9999 + 012264 9999 99 99 0 9999 99 9999 + 012265 1231 46 01 1 304201760 04 0319 + 012266 1231 46 02 1 304201760 05 0319 + 012267 1231 46 03 1 304201760 06 0319 + 012268 1231 46 04 1 304201760 07 0319 + 012269 9999 99 99 0 9999 99 9999 + 012270 9999 99 99 0 9999 99 9999 + 012271 9999 99 99 0 9999 99 9999 + 012272 9999 99 99 0 9999 99 9999 + 012273 1231 47 01 1 304201760 08 0319 + 012274 1231 47 02 1 304201760 09 0319 + 012275 1231 47 03 1 304201760 10 0319 + 012276 1231 47 04 1 304201760 11 0319 + 012277 9999 99 99 0 9999 99 9999 + 012278 9999 99 99 0 9999 99 9999 + 012279 9999 99 99 0 9999 99 9999 + 012280 9999 99 99 0 9999 99 9999 + 012281 1231 48 01 1 304201760 12 0319 + 012282 1231 48 02 1 304201760 13 0319 + 012283 1231 48 03 1 304201760 14 0319 + 012284 1231 48 04 1 304201760 15 0319 + 012285 9999 99 99 0 9999 99 9999 + 012286 9999 99 99 0 9999 99 9999 + 012287 9999 99 99 0 9999 99 9999 + 012288 9999 99 99 0 9999 99 9999 + 012289 1232 01 01 1 304197656 08 0309 + 012290 1232 01 02 1 304197656 09 0309 + 012291 1232 01 03 1 304197656 10 0309 + 012292 1232 01 04 1 304197656 11 0309 + 012293 9999 99 99 0 9999 99 9999 + 012294 9999 99 99 0 9999 99 9999 + 012295 9999 99 99 0 9999 99 9999 + 012296 9999 99 99 0 9999 99 9999 + 012297 1232 02 01 1 304197656 12 0309 + 012298 1232 02 02 1 304197656 13 0309 + 012299 1232 02 03 1 304197656 14 0309 + 012300 1232 02 04 1 304197656 15 0309 + 012301 9999 99 99 0 9999 99 9999 + 012302 9999 99 99 0 9999 99 9999 + 012303 9999 99 99 0 9999 99 9999 + 012304 9999 99 99 0 9999 99 9999 + 012305 1232 03 01 1 304197656 00 0309 + 012306 1232 03 02 1 304197656 01 0309 + 012307 1232 03 03 1 304197656 02 0309 + 012308 1232 03 04 1 304197656 03 0309 + 012309 9999 99 99 0 9999 99 9999 + 012310 9999 99 99 0 9999 99 9999 + 012311 9999 99 99 0 9999 99 9999 + 012312 9999 99 99 0 9999 99 9999 + 012313 1232 04 01 1 304197656 04 0309 + 012314 1232 04 02 1 304197656 05 0309 + 012315 1232 04 03 1 304197656 06 0309 + 012316 1232 04 04 1 304197656 07 0309 + 012317 9999 99 99 0 9999 99 9999 + 012318 9999 99 99 0 9999 99 9999 + 012319 9999 99 99 0 9999 99 9999 + 012320 9999 99 99 0 9999 99 9999 + 012321 1232 05 01 1 304197652 08 0308 + 012322 1232 05 02 1 304197652 09 0308 + 012323 1232 05 03 1 304197652 10 0308 + 012324 1232 05 04 1 304197652 11 0308 + 012325 9999 99 99 0 9999 99 9999 + 012326 9999 99 99 0 9999 99 9999 + 012327 9999 99 99 0 9999 99 9999 + 012328 9999 99 99 0 9999 99 9999 + 012329 1232 06 01 1 304197652 12 0308 + 012330 1232 06 02 1 304197652 13 0308 + 012331 1232 06 03 1 304197652 14 0308 + 012332 1232 06 04 1 304197652 15 0308 + 012333 9999 99 99 0 9999 99 9999 + 012334 9999 99 99 0 9999 99 9999 + 012335 9999 99 99 0 9999 99 9999 + 012336 9999 99 99 0 9999 99 9999 + 012337 1232 07 01 1 304197652 00 0308 + 012338 1232 07 02 1 304197652 01 0308 + 012339 1232 07 03 1 304197652 02 0308 + 012340 1232 07 04 1 304197652 03 0308 + 012341 9999 99 99 0 9999 99 9999 + 012342 9999 99 99 0 9999 99 9999 + 012343 9999 99 99 0 9999 99 9999 + 012344 9999 99 99 0 9999 99 9999 + 012345 1232 08 01 1 304197652 04 0308 + 012346 1232 08 02 1 304197652 05 0308 + 012347 1232 08 03 1 304197652 06 0308 + 012348 1232 08 04 1 304197652 07 0308 + 012349 9999 99 99 0 9999 99 9999 + 012350 9999 99 99 0 9999 99 9999 + 012351 9999 99 99 0 9999 99 9999 + 012352 9999 99 99 0 9999 99 9999 + 012353 1232 09 01 1 306438168 00 1165 + 012354 1232 09 02 1 306438168 01 1165 + 012355 1232 09 03 1 306438168 02 1165 + 012356 1232 09 04 1 306438168 03 1165 + 012357 1232 09 05 1 306438168 04 1165 + 012358 1232 09 06 1 306438168 05 1165 + 012359 1232 09 07 1 306438168 06 1165 + 012360 1232 09 08 1 306438168 07 1165 + 012361 1232 10 01 1 306438168 08 1165 + 012362 1232 10 02 1 306438168 09 1165 + 012363 1232 10 03 1 306438168 10 1165 + 012364 1232 10 04 1 306438168 11 1165 + 012365 1232 10 05 1 306438168 12 1165 + 012366 1232 10 06 1 306438168 13 1165 + 012367 1232 10 07 1 306438168 14 1165 + 012368 1232 10 08 1 306438168 15 1165 + 012369 1232 11 01 1 306438164 00 1164 + 012370 1232 11 02 1 306438164 01 1164 + 012371 1232 11 03 1 306438164 02 1164 + 012372 1232 11 04 1 306438164 03 1164 + 012373 1232 11 05 1 306438164 04 1164 + 012374 1232 11 06 1 306438164 05 1164 + 012375 1232 11 07 1 306438164 06 1164 + 012376 1232 11 08 1 306438164 07 1164 + 012377 1232 12 01 1 306438164 08 1164 + 012378 1232 12 02 1 306438164 09 1164 + 012379 1232 12 03 1 306438164 10 1164 + 012380 1232 12 04 1 306438164 11 1164 + 012381 1232 12 05 1 306438164 12 1164 + 012382 1232 12 06 1 306438164 13 1164 + 012383 1232 12 07 1 306438164 14 1164 + 012384 1232 12 08 1 306438164 15 1164 + 012385 1232 13 01 1 306438176 00 1167 + 012386 1232 13 02 1 306438176 01 1167 + 012387 1232 13 03 1 306438176 02 1167 + 012388 1232 13 04 1 306438176 03 1167 + 012389 1232 13 05 1 306438176 04 1167 + 012390 1232 13 06 1 306438176 05 1167 + 012391 1232 13 07 1 306438176 06 1167 + 012392 1232 13 08 1 306438176 07 1167 + 012393 1232 14 01 1 306438176 08 1167 + 012394 1232 14 02 1 306438176 09 1167 + 012395 1232 14 03 1 306438176 10 1167 + 012396 1232 14 04 1 306438176 11 1167 + 012397 1232 14 05 1 306438176 12 1167 + 012398 1232 14 06 1 306438176 13 1167 + 012399 1232 14 07 1 306438176 14 1167 + 012400 1232 14 08 1 306438176 15 1167 + 012401 1232 15 01 1 306438172 00 1166 + 012402 1232 15 02 1 306438172 01 1166 + 012403 1232 15 03 1 306438172 02 1166 + 012404 1232 15 04 1 306438172 03 1166 + 012405 1232 15 05 1 306438172 04 1166 + 012406 1232 15 06 1 306438172 05 1166 + 012407 1232 15 07 1 306438172 06 1166 + 012408 1232 15 08 1 306438172 07 1166 + 012409 1232 16 01 1 306438172 08 1166 + 012410 1232 16 02 1 306438172 09 1166 + 012411 1232 16 03 1 306438172 10 1166 + 012412 1232 16 04 1 306438172 11 1166 + 012413 1232 16 05 1 306438172 12 1166 + 012414 1232 16 06 1 306438172 13 1166 + 012415 1232 16 07 1 306438172 14 1166 + 012416 1232 16 08 1 306438172 15 1166 + 012417 1232 17 01 1 303087648 12 0095 + 012418 1232 17 02 1 303087648 13 0095 + 012419 9999 99 99 0 9999 99 9999 + 012420 9999 99 99 0 9999 99 9999 + 012421 9999 99 99 0 9999 99 9999 + 012422 9999 99 99 0 9999 99 9999 + 012423 9999 99 99 0 9999 99 9999 + 012424 9999 99 99 0 9999 99 9999 + 012425 1232 18 01 1 303087648 14 0095 + 012426 1232 18 02 1 303087648 15 0095 + 012427 9999 99 99 0 9999 99 9999 + 012428 9999 99 99 0 9999 99 9999 + 012429 9999 99 99 0 9999 99 9999 + 012430 9999 99 99 0 9999 99 9999 + 012431 9999 99 99 0 9999 99 9999 + 012432 9999 99 99 0 9999 99 9999 + 012433 1232 19 01 1 303087648 08 0095 + 012434 1232 19 02 1 303087648 09 0095 + 012435 9999 99 99 0 9999 99 9999 + 012436 9999 99 99 0 9999 99 9999 + 012437 9999 99 99 0 9999 99 9999 + 012438 9999 99 99 0 9999 99 9999 + 012439 9999 99 99 0 9999 99 9999 + 012440 9999 99 99 0 9999 99 9999 + 012441 1232 20 01 1 303087648 10 0095 + 012442 1232 20 02 1 303087648 11 0095 + 012443 9999 99 99 0 9999 99 9999 + 012444 9999 99 99 0 9999 99 9999 + 012445 9999 99 99 0 9999 99 9999 + 012446 9999 99 99 0 9999 99 9999 + 012447 9999 99 99 0 9999 99 9999 + 012448 9999 99 99 0 9999 99 9999 + 012449 1232 21 01 1 303087648 00 0095 + 012450 1232 21 02 1 303087648 01 0095 + 012451 9999 99 99 0 9999 99 9999 + 012452 9999 99 99 0 9999 99 9999 + 012453 9999 99 99 0 9999 99 9999 + 012454 9999 99 99 0 9999 99 9999 + 012455 9999 99 99 0 9999 99 9999 + 012456 9999 99 99 0 9999 99 9999 + 012457 1232 22 01 1 303087648 02 0095 + 012458 1232 22 02 1 303087648 03 0095 + 012459 9999 99 99 0 9999 99 9999 + 012460 9999 99 99 0 9999 99 9999 + 012461 9999 99 99 0 9999 99 9999 + 012462 9999 99 99 0 9999 99 9999 + 012463 9999 99 99 0 9999 99 9999 + 012464 9999 99 99 0 9999 99 9999 + 012465 1232 23 01 1 303087648 04 0095 + 012466 1232 23 02 1 303087648 05 0095 + 012467 9999 99 99 0 9999 99 9999 + 012468 9999 99 99 0 9999 99 9999 + 012469 9999 99 99 0 9999 99 9999 + 012470 9999 99 99 0 9999 99 9999 + 012471 9999 99 99 0 9999 99 9999 + 012472 9999 99 99 0 9999 99 9999 + 012473 1232 24 01 1 303087648 06 0095 + 012474 1232 24 02 1 303087648 07 0095 + 012475 9999 99 99 0 9999 99 9999 + 012476 9999 99 99 0 9999 99 9999 + 012477 9999 99 99 0 9999 99 9999 + 012478 9999 99 99 0 9999 99 9999 + 012479 9999 99 99 0 9999 99 9999 + 012480 9999 99 99 0 9999 99 9999 + 012481 1232 25 01 1 305315868 00 0670 + 012482 1232 25 02 1 305315868 01 0670 + 012483 1232 25 03 1 305315868 02 0670 + 012484 1232 25 04 1 305315868 03 0670 + 012485 1232 25 05 1 305315868 04 0670 + 012486 1232 25 06 1 305315868 05 0670 + 012487 1232 25 07 1 305315868 06 0670 + 012488 1232 25 08 1 305315868 07 0670 + 012489 1232 26 01 1 305315868 08 0670 + 012490 1232 26 02 1 305315868 09 0670 + 012491 1232 26 03 1 305315868 10 0670 + 012492 1232 26 04 1 305315868 11 0670 + 012493 1232 26 05 1 305315868 12 0670 + 012494 1232 26 06 1 305315868 13 0670 + 012495 1232 26 07 1 305315868 14 0670 + 012496 1232 26 08 1 305315868 15 0670 + 012497 1232 27 01 1 305315872 00 0671 + 012498 1232 27 02 1 305315872 01 0671 + 012499 1232 27 03 1 305315872 02 0671 + 012500 1232 27 04 1 305315872 03 0671 + 012501 1232 27 05 1 305315872 04 0671 + 012502 1232 27 06 1 305315872 05 0671 + 012503 1232 27 07 1 305315872 06 0671 + 012504 1232 27 08 1 305315872 07 0671 + 012505 1232 28 01 1 305315872 08 0671 + 012506 1232 28 02 1 305315872 09 0671 + 012507 1232 28 03 1 305315872 10 0671 + 012508 1232 28 04 1 305315872 11 0671 + 012509 1232 28 05 1 305315872 12 0671 + 012510 1232 28 06 1 305315872 13 0671 + 012511 1232 28 07 1 305315872 14 0671 + 012512 1232 28 08 1 305315872 15 0671 + 012513 1232 29 01 1 305315860 00 0668 + 012514 1232 29 02 1 305315860 01 0668 + 012515 1232 29 03 1 305315860 02 0668 + 012516 1232 29 04 1 305315860 03 0668 + 012517 1232 29 05 1 305315860 04 0668 + 012518 1232 29 06 1 305315860 05 0668 + 012519 1232 29 07 1 305315860 06 0668 + 012520 1232 29 08 1 305315860 07 0668 + 012521 1232 30 01 1 305315860 08 0668 + 012522 1232 30 02 1 305315860 09 0668 + 012523 1232 30 03 1 305315860 10 0668 + 012524 1232 30 04 1 305315860 11 0668 + 012525 1232 30 05 1 305315860 12 0668 + 012526 1232 30 06 1 305315860 13 0668 + 012527 1232 30 07 1 305315860 14 0668 + 012528 1232 30 08 1 305315860 15 0668 + 012529 1232 31 01 1 305315864 00 0669 + 012530 1232 31 02 1 305315864 01 0669 + 012531 1232 31 03 1 305315864 02 0669 + 012532 1232 31 04 1 305315864 03 0669 + 012533 1232 31 05 1 305315864 04 0669 + 012534 1232 31 06 1 305315864 05 0669 + 012535 1232 31 07 1 305315864 06 0669 + 012536 1232 31 08 1 305315864 07 0669 + 012537 1232 32 01 1 305315864 08 0669 + 012538 1232 32 02 1 305315864 09 0669 + 012539 1232 32 03 1 305315864 10 0669 + 012540 1232 32 04 1 305315864 11 0669 + 012541 1232 32 05 1 305315864 12 0669 + 012542 1232 32 06 1 305315864 13 0669 + 012543 1232 32 07 1 305315864 14 0669 + 012544 1232 32 08 1 305315864 15 0669 + 012545 1232 33 01 1 306434072 00 1157 + 012546 1232 33 02 1 306434072 01 1157 + 012547 1232 33 03 1 306434072 02 1157 + 012548 1232 33 04 1 306434072 03 1157 + 012549 1232 33 05 1 306434072 04 1157 + 012550 1232 33 06 1 306434072 05 1157 + 012551 1232 33 07 1 306434072 06 1157 + 012552 1232 33 08 1 306434072 07 1157 + 012553 1232 34 01 1 306434072 08 1157 + 012554 1232 34 02 1 306434072 09 1157 + 012555 1232 34 03 1 306434072 10 1157 + 012556 1232 34 04 1 306434072 11 1157 + 012557 1232 34 05 1 306434072 12 1157 + 012558 1232 34 06 1 306434072 13 1157 + 012559 1232 34 07 1 306434072 14 1157 + 012560 1232 34 08 1 306434072 15 1157 + 012561 1232 35 01 1 306434068 00 1156 + 012562 1232 35 02 1 306434068 01 1156 + 012563 1232 35 03 1 306434068 02 1156 + 012564 1232 35 04 1 306434068 03 1156 + 012565 1232 35 05 1 306434068 04 1156 + 012566 1232 35 06 1 306434068 05 1156 + 012567 1232 35 07 1 306434068 06 1156 + 012568 1232 35 08 1 306434068 07 1156 + 012569 1232 36 01 1 306434068 08 1156 + 012570 1232 36 02 1 306434068 09 1156 + 012571 1232 36 03 1 306434068 10 1156 + 012572 1232 36 04 1 306434068 11 1156 + 012573 1232 36 05 1 306434068 12 1156 + 012574 1232 36 06 1 306434068 13 1156 + 012575 1232 36 07 1 306434068 14 1156 + 012576 1232 36 08 1 306434068 15 1156 + 012577 1232 37 01 1 306434080 00 1159 + 012578 1232 37 02 1 306434080 01 1159 + 012579 1232 37 03 1 306434080 02 1159 + 012580 1232 37 04 1 306434080 03 1159 + 012581 1232 37 05 1 306434080 04 1159 + 012582 1232 37 06 1 306434080 05 1159 + 012583 1232 37 07 1 306434080 06 1159 + 012584 1232 37 08 1 306434080 07 1159 + 012585 1232 38 01 1 306434080 08 1159 + 012586 1232 38 02 1 306434080 09 1159 + 012587 1232 38 03 1 306434080 10 1159 + 012588 1232 38 04 1 306434080 11 1159 + 012589 1232 38 05 1 306434080 12 1159 + 012590 1232 38 06 1 306434080 13 1159 + 012591 1232 38 07 1 306434080 14 1159 + 012592 1232 38 08 1 306434080 15 1159 + 012593 1232 39 01 1 306434076 00 1158 + 012594 1232 39 02 1 306434076 01 1158 + 012595 1232 39 03 1 306434076 02 1158 + 012596 1232 39 04 1 306434076 03 1158 + 012597 1232 39 05 1 306434076 04 1158 + 012598 1232 39 06 1 306434076 05 1158 + 012599 1232 39 07 1 306434076 06 1158 + 012600 1232 39 08 1 306434076 07 1158 + 012601 1232 40 01 1 306434076 08 1158 + 012602 1232 40 02 1 306434076 09 1158 + 012603 1232 40 03 1 306434076 10 1158 + 012604 1232 40 04 1 306434076 11 1158 + 012605 1232 40 05 1 306434076 12 1158 + 012606 1232 40 06 1 306434076 13 1158 + 012607 1232 40 07 1 306434076 14 1158 + 012608 1232 40 08 1 306434076 15 1158 + 012609 1232 41 01 1 304197664 08 0311 + 012610 1232 41 02 1 304197664 09 0311 + 012611 1232 41 03 1 304197664 10 0311 + 012612 1232 41 04 1 304197664 11 0311 + 012613 9999 99 99 0 9999 99 9999 + 012614 9999 99 99 0 9999 99 9999 + 012615 9999 99 99 0 9999 99 9999 + 012616 9999 99 99 0 9999 99 9999 + 012617 1232 42 01 1 304197664 12 0311 + 012618 1232 42 02 1 304197664 13 0311 + 012619 1232 42 03 1 304197664 14 0311 + 012620 1232 42 04 1 304197664 15 0311 + 012621 9999 99 99 0 9999 99 9999 + 012622 9999 99 99 0 9999 99 9999 + 012623 9999 99 99 0 9999 99 9999 + 012624 9999 99 99 0 9999 99 9999 + 012625 1232 43 01 1 304197664 00 0311 + 012626 1232 43 02 1 304197664 01 0311 + 012627 1232 43 03 1 304197664 02 0311 + 012628 1232 43 04 1 304197664 03 0311 + 012629 9999 99 99 0 9999 99 9999 + 012630 9999 99 99 0 9999 99 9999 + 012631 9999 99 99 0 9999 99 9999 + 012632 9999 99 99 0 9999 99 9999 + 012633 1232 44 01 1 304197664 04 0311 + 012634 1232 44 02 1 304197664 05 0311 + 012635 1232 44 03 1 304197664 06 0311 + 012636 1232 44 04 1 304197664 07 0311 + 012637 9999 99 99 0 9999 99 9999 + 012638 9999 99 99 0 9999 99 9999 + 012639 9999 99 99 0 9999 99 9999 + 012640 9999 99 99 0 9999 99 9999 + 012641 1232 45 01 1 304197660 08 0310 + 012642 1232 45 02 1 304197660 09 0310 + 012643 1232 45 03 1 304197660 10 0310 + 012644 1232 45 04 1 304197660 11 0310 + 012645 9999 99 99 0 9999 99 9999 + 012646 9999 99 99 0 9999 99 9999 + 012647 9999 99 99 0 9999 99 9999 + 012648 9999 99 99 0 9999 99 9999 + 012649 1232 46 01 1 304197660 12 0310 + 012650 1232 46 02 1 304197660 13 0310 + 012651 1232 46 03 1 304197660 14 0310 + 012652 1232 46 04 1 304197660 15 0310 + 012653 9999 99 99 0 9999 99 9999 + 012654 9999 99 99 0 9999 99 9999 + 012655 9999 99 99 0 9999 99 9999 + 012656 9999 99 99 0 9999 99 9999 + 012657 1232 47 01 1 304197660 00 0310 + 012658 1232 47 02 1 304197660 01 0310 + 012659 1232 47 03 1 304197660 02 0310 + 012660 1232 47 04 1 304197660 03 0310 + 012661 9999 99 99 0 9999 99 9999 + 012662 9999 99 99 0 9999 99 9999 + 012663 9999 99 99 0 9999 99 9999 + 012664 9999 99 99 0 9999 99 9999 + 012665 1232 48 01 1 304197660 04 0310 + 012666 1232 48 02 1 304197660 05 0310 + 012667 1232 48 03 1 304197660 06 0310 + 012668 1232 48 04 1 304197660 07 0310 + 012669 9999 99 99 0 9999 99 9999 + 012670 9999 99 99 0 9999 99 9999 + 012671 9999 99 99 0 9999 99 9999 + 012672 9999 99 99 0 9999 99 9999 + 012673 1233 01 01 1 305311772 00 0662 + 012674 1233 01 02 1 305311772 01 0662 + 012675 1233 01 03 1 305311772 02 0662 + 012676 1233 01 04 1 305311772 03 0662 + 012677 1233 01 05 1 305311772 04 0662 + 012678 1233 01 06 1 305311772 05 0662 + 012679 1233 01 07 1 305311772 06 0662 + 012680 1233 01 08 1 305311772 07 0662 + 012681 1233 02 01 1 305311772 08 0662 + 012682 1233 02 02 1 305311772 09 0662 + 012683 1233 02 03 1 305311772 10 0662 + 012684 1233 02 04 1 305311772 11 0662 + 012685 1233 02 05 1 305311772 12 0662 + 012686 1233 02 06 1 305311772 13 0662 + 012687 1233 02 07 1 305311772 14 0662 + 012688 1233 02 08 1 305311772 15 0662 + 012689 1233 03 01 1 305311776 00 0663 + 012690 1233 03 02 1 305311776 01 0663 + 012691 1233 03 03 1 305311776 02 0663 + 012692 1233 03 04 1 305311776 03 0663 + 012693 1233 03 05 1 305311776 04 0663 + 012694 1233 03 06 1 305311776 05 0663 + 012695 1233 03 07 1 305311776 06 0663 + 012696 1233 03 08 1 305311776 07 0663 + 012697 1233 04 01 1 305311776 08 0663 + 012698 1233 04 02 1 305311776 09 0663 + 012699 1233 04 03 1 305311776 10 0663 + 012700 1233 04 04 1 305311776 11 0663 + 012701 1233 04 05 1 305311776 12 0663 + 012702 1233 04 06 1 305311776 13 0663 + 012703 1233 04 07 1 305311776 14 0663 + 012704 1233 04 08 1 305311776 15 0663 + 012705 1233 05 01 1 305311764 00 0660 + 012706 1233 05 02 1 305311764 01 0660 + 012707 1233 05 03 1 305311764 02 0660 + 012708 1233 05 04 1 305311764 03 0660 + 012709 1233 05 05 1 305311764 04 0660 + 012710 1233 05 06 1 305311764 05 0660 + 012711 1233 05 07 1 305311764 06 0660 + 012712 1233 05 08 1 305311764 07 0660 + 012713 1233 06 01 1 305311764 08 0660 + 012714 1233 06 02 1 305311764 09 0660 + 012715 1233 06 03 1 305311764 10 0660 + 012716 1233 06 04 1 305311764 11 0660 + 012717 1233 06 05 1 305311764 12 0660 + 012718 1233 06 06 1 305311764 13 0660 + 012719 1233 06 07 1 305311764 14 0660 + 012720 1233 06 08 1 305311764 15 0660 + 012721 1233 07 01 1 305311768 00 0661 + 012722 1233 07 02 1 305311768 01 0661 + 012723 1233 07 03 1 305311768 02 0661 + 012724 1233 07 04 1 305311768 03 0661 + 012725 1233 07 05 1 305311768 04 0661 + 012726 1233 07 06 1 305311768 05 0661 + 012727 1233 07 07 1 305311768 06 0661 + 012728 1233 07 08 1 305311768 07 0661 + 012729 1233 08 01 1 305311768 08 0661 + 012730 1233 08 02 1 305311768 09 0661 + 012731 1233 08 03 1 305311768 10 0661 + 012732 1233 08 04 1 305311768 11 0661 + 012733 1233 08 05 1 305311768 12 0661 + 012734 1233 08 06 1 305311768 13 0661 + 012735 1233 08 07 1 305311768 14 0661 + 012736 1233 08 08 1 305311768 15 0661 + 012737 1233 09 01 1 305307672 00 0653 + 012738 1233 09 02 1 305307672 01 0653 + 012739 1233 09 03 1 305307672 02 0653 + 012740 1233 09 04 1 305307672 03 0653 + 012741 1233 09 05 1 305307672 04 0653 + 012742 1233 09 06 1 305307672 05 0653 + 012743 1233 09 07 1 305307672 06 0653 + 012744 1233 09 08 1 305307672 07 0653 + 012745 1233 10 01 1 305307672 08 0653 + 012746 1233 10 02 1 305307672 09 0653 + 012747 1233 10 03 1 305307672 10 0653 + 012748 1233 10 04 1 305307672 11 0653 + 012749 1233 10 05 1 305307672 12 0653 + 012750 1233 10 06 1 305307672 13 0653 + 012751 1233 10 07 1 305307672 14 0653 + 012752 1233 10 08 1 305307672 15 0653 + 012753 1233 11 01 1 305307668 00 0652 + 012754 1233 11 02 1 305307668 01 0652 + 012755 1233 11 03 1 305307668 02 0652 + 012756 1233 11 04 1 305307668 03 0652 + 012757 1233 11 05 1 305307668 04 0652 + 012758 1233 11 06 1 305307668 05 0652 + 012759 1233 11 07 1 305307668 06 0652 + 012760 1233 11 08 1 305307668 07 0652 + 012761 1233 12 01 1 305307668 08 0652 + 012762 1233 12 02 1 305307668 09 0652 + 012763 1233 12 03 1 305307668 10 0652 + 012764 1233 12 04 1 305307668 11 0652 + 012765 1233 12 05 1 305307668 12 0652 + 012766 1233 12 06 1 305307668 13 0652 + 012767 1233 12 07 1 305307668 14 0652 + 012768 1233 12 08 1 305307668 15 0652 + 012769 1233 13 01 1 305307680 00 0655 + 012770 1233 13 02 1 305307680 01 0655 + 012771 1233 13 03 1 305307680 02 0655 + 012772 1233 13 04 1 305307680 03 0655 + 012773 1233 13 05 1 305307680 04 0655 + 012774 1233 13 06 1 305307680 05 0655 + 012775 1233 13 07 1 305307680 06 0655 + 012776 1233 13 08 1 305307680 07 0655 + 012777 1233 14 01 1 305307680 08 0655 + 012778 1233 14 02 1 305307680 09 0655 + 012779 1233 14 03 1 305307680 10 0655 + 012780 1233 14 04 1 305307680 11 0655 + 012781 1233 14 05 1 305307680 12 0655 + 012782 1233 14 06 1 305307680 13 0655 + 012783 1233 14 07 1 305307680 14 0655 + 012784 1233 14 08 1 305307680 15 0655 + 012785 1233 15 01 1 305307676 00 0654 + 012786 1233 15 02 1 305307676 01 0654 + 012787 1233 15 03 1 305307676 02 0654 + 012788 1233 15 04 1 305307676 03 0654 + 012789 1233 15 05 1 305307676 04 0654 + 012790 1233 15 06 1 305307676 05 0654 + 012791 1233 15 07 1 305307676 06 0654 + 012792 1233 15 08 1 305307676 07 0654 + 012793 1233 16 01 1 305307676 08 0654 + 012794 1233 16 02 1 305307676 09 0654 + 012795 1233 16 03 1 305307676 10 0654 + 012796 1233 16 04 1 305307676 11 0654 + 012797 1233 16 05 1 305307676 12 0654 + 012798 1233 16 06 1 305307676 13 0654 + 012799 1233 16 07 1 305307676 14 0654 + 012800 1233 16 08 1 305307676 15 0654 + 012801 9999 99 99 0 9999 99 9999 + 012802 9999 99 99 0 9999 99 9999 + 012803 9999 99 99 0 9999 99 9999 + 012804 9999 99 99 0 9999 99 9999 + 012805 9999 99 99 0 9999 99 9999 + 012806 9999 99 99 0 9999 99 9999 + 012807 9999 99 99 0 9999 99 9999 + 012808 9999 99 99 0 9999 99 9999 + 012809 9999 99 99 0 9999 99 9999 + 012810 9999 99 99 0 9999 99 9999 + 012811 9999 99 99 0 9999 99 9999 + 012812 9999 99 99 0 9999 99 9999 + 012813 9999 99 99 0 9999 99 9999 + 012814 9999 99 99 0 9999 99 9999 + 012815 9999 99 99 0 9999 99 9999 + 012816 9999 99 99 0 9999 99 9999 + 012817 9999 99 99 0 9999 99 9999 + 012818 9999 99 99 0 9999 99 9999 + 012819 9999 99 99 0 9999 99 9999 + 012820 9999 99 99 0 9999 99 9999 + 012821 9999 99 99 0 9999 99 9999 + 012822 9999 99 99 0 9999 99 9999 + 012823 9999 99 99 0 9999 99 9999 + 012824 9999 99 99 0 9999 99 9999 + 012825 9999 99 99 0 9999 99 9999 + 012826 9999 99 99 0 9999 99 9999 + 012827 9999 99 99 0 9999 99 9999 + 012828 9999 99 99 0 9999 99 9999 + 012829 9999 99 99 0 9999 99 9999 + 012830 9999 99 99 0 9999 99 9999 + 012831 9999 99 99 0 9999 99 9999 + 012832 9999 99 99 0 9999 99 9999 + 012833 9999 99 99 0 9999 99 9999 + 012834 9999 99 99 0 9999 99 9999 + 012835 9999 99 99 0 9999 99 9999 + 012836 9999 99 99 0 9999 99 9999 + 012837 9999 99 99 0 9999 99 9999 + 012838 9999 99 99 0 9999 99 9999 + 012839 9999 99 99 0 9999 99 9999 + 012840 9999 99 99 0 9999 99 9999 + 012841 9999 99 99 0 9999 99 9999 + 012842 9999 99 99 0 9999 99 9999 + 012843 9999 99 99 0 9999 99 9999 + 012844 9999 99 99 0 9999 99 9999 + 012845 9999 99 99 0 9999 99 9999 + 012846 9999 99 99 0 9999 99 9999 + 012847 9999 99 99 0 9999 99 9999 + 012848 9999 99 99 0 9999 99 9999 + 012849 9999 99 99 0 9999 99 9999 + 012850 9999 99 99 0 9999 99 9999 + 012851 9999 99 99 0 9999 99 9999 + 012852 9999 99 99 0 9999 99 9999 + 012853 9999 99 99 0 9999 99 9999 + 012854 9999 99 99 0 9999 99 9999 + 012855 9999 99 99 0 9999 99 9999 + 012856 9999 99 99 0 9999 99 9999 + 012857 9999 99 99 0 9999 99 9999 + 012858 9999 99 99 0 9999 99 9999 + 012859 9999 99 99 0 9999 99 9999 + 012860 9999 99 99 0 9999 99 9999 + 012861 9999 99 99 0 9999 99 9999 + 012862 9999 99 99 0 9999 99 9999 + 012863 9999 99 99 0 9999 99 9999 + 012864 9999 99 99 0 9999 99 9999 + 012865 9999 99 99 0 9999 99 9999 + 012866 9999 99 99 0 9999 99 9999 + 012867 9999 99 99 0 9999 99 9999 + 012868 9999 99 99 0 9999 99 9999 + 012869 9999 99 99 0 9999 99 9999 + 012870 9999 99 99 0 9999 99 9999 + 012871 9999 99 99 0 9999 99 9999 + 012872 9999 99 99 0 9999 99 9999 + 012873 9999 99 99 0 9999 99 9999 + 012874 9999 99 99 0 9999 99 9999 + 012875 9999 99 99 0 9999 99 9999 + 012876 9999 99 99 0 9999 99 9999 + 012877 9999 99 99 0 9999 99 9999 + 012878 9999 99 99 0 9999 99 9999 + 012879 9999 99 99 0 9999 99 9999 + 012880 9999 99 99 0 9999 99 9999 + 012881 9999 99 99 0 9999 99 9999 + 012882 9999 99 99 0 9999 99 9999 + 012883 9999 99 99 0 9999 99 9999 + 012884 9999 99 99 0 9999 99 9999 + 012885 9999 99 99 0 9999 99 9999 + 012886 9999 99 99 0 9999 99 9999 + 012887 9999 99 99 0 9999 99 9999 + 012888 9999 99 99 0 9999 99 9999 + 012889 9999 99 99 0 9999 99 9999 + 012890 9999 99 99 0 9999 99 9999 + 012891 9999 99 99 0 9999 99 9999 + 012892 9999 99 99 0 9999 99 9999 + 012893 9999 99 99 0 9999 99 9999 + 012894 9999 99 99 0 9999 99 9999 + 012895 9999 99 99 0 9999 99 9999 + 012896 9999 99 99 0 9999 99 9999 + 012897 9999 99 99 0 9999 99 9999 + 012898 9999 99 99 0 9999 99 9999 + 012899 9999 99 99 0 9999 99 9999 + 012900 9999 99 99 0 9999 99 9999 + 012901 9999 99 99 0 9999 99 9999 + 012902 9999 99 99 0 9999 99 9999 + 012903 9999 99 99 0 9999 99 9999 + 012904 9999 99 99 0 9999 99 9999 + 012905 9999 99 99 0 9999 99 9999 + 012906 9999 99 99 0 9999 99 9999 + 012907 9999 99 99 0 9999 99 9999 + 012908 9999 99 99 0 9999 99 9999 + 012909 9999 99 99 0 9999 99 9999 + 012910 9999 99 99 0 9999 99 9999 + 012911 9999 99 99 0 9999 99 9999 + 012912 9999 99 99 0 9999 99 9999 + 012913 9999 99 99 0 9999 99 9999 + 012914 9999 99 99 0 9999 99 9999 + 012915 9999 99 99 0 9999 99 9999 + 012916 9999 99 99 0 9999 99 9999 + 012917 9999 99 99 0 9999 99 9999 + 012918 9999 99 99 0 9999 99 9999 + 012919 9999 99 99 0 9999 99 9999 + 012920 9999 99 99 0 9999 99 9999 + 012921 9999 99 99 0 9999 99 9999 + 012922 9999 99 99 0 9999 99 9999 + 012923 9999 99 99 0 9999 99 9999 + 012924 9999 99 99 0 9999 99 9999 + 012925 9999 99 99 0 9999 99 9999 + 012926 9999 99 99 0 9999 99 9999 + 012927 9999 99 99 0 9999 99 9999 + 012928 9999 99 99 0 9999 99 9999 + 012929 9999 99 99 0 9999 99 9999 + 012930 9999 99 99 0 9999 99 9999 + 012931 9999 99 99 0 9999 99 9999 + 012932 9999 99 99 0 9999 99 9999 + 012933 9999 99 99 0 9999 99 9999 + 012934 9999 99 99 0 9999 99 9999 + 012935 9999 99 99 0 9999 99 9999 + 012936 9999 99 99 0 9999 99 9999 + 012937 9999 99 99 0 9999 99 9999 + 012938 9999 99 99 0 9999 99 9999 + 012939 9999 99 99 0 9999 99 9999 + 012940 9999 99 99 0 9999 99 9999 + 012941 9999 99 99 0 9999 99 9999 + 012942 9999 99 99 0 9999 99 9999 + 012943 9999 99 99 0 9999 99 9999 + 012944 9999 99 99 0 9999 99 9999 + 012945 9999 99 99 0 9999 99 9999 + 012946 9999 99 99 0 9999 99 9999 + 012947 9999 99 99 0 9999 99 9999 + 012948 9999 99 99 0 9999 99 9999 + 012949 9999 99 99 0 9999 99 9999 + 012950 9999 99 99 0 9999 99 9999 + 012951 9999 99 99 0 9999 99 9999 + 012952 9999 99 99 0 9999 99 9999 + 012953 9999 99 99 0 9999 99 9999 + 012954 9999 99 99 0 9999 99 9999 + 012955 9999 99 99 0 9999 99 9999 + 012956 9999 99 99 0 9999 99 9999 + 012957 9999 99 99 0 9999 99 9999 + 012958 9999 99 99 0 9999 99 9999 + 012959 9999 99 99 0 9999 99 9999 + 012960 9999 99 99 0 9999 99 9999 + 012961 9999 99 99 0 9999 99 9999 + 012962 9999 99 99 0 9999 99 9999 + 012963 9999 99 99 0 9999 99 9999 + 012964 9999 99 99 0 9999 99 9999 + 012965 9999 99 99 0 9999 99 9999 + 012966 9999 99 99 0 9999 99 9999 + 012967 9999 99 99 0 9999 99 9999 + 012968 9999 99 99 0 9999 99 9999 + 012969 9999 99 99 0 9999 99 9999 + 012970 9999 99 99 0 9999 99 9999 + 012971 9999 99 99 0 9999 99 9999 + 012972 9999 99 99 0 9999 99 9999 + 012973 9999 99 99 0 9999 99 9999 + 012974 9999 99 99 0 9999 99 9999 + 012975 9999 99 99 0 9999 99 9999 + 012976 9999 99 99 0 9999 99 9999 + 012977 9999 99 99 0 9999 99 9999 + 012978 9999 99 99 0 9999 99 9999 + 012979 9999 99 99 0 9999 99 9999 + 012980 9999 99 99 0 9999 99 9999 + 012981 9999 99 99 0 9999 99 9999 + 012982 9999 99 99 0 9999 99 9999 + 012983 9999 99 99 0 9999 99 9999 + 012984 9999 99 99 0 9999 99 9999 + 012985 9999 99 99 0 9999 99 9999 + 012986 9999 99 99 0 9999 99 9999 + 012987 9999 99 99 0 9999 99 9999 + 012988 9999 99 99 0 9999 99 9999 + 012989 9999 99 99 0 9999 99 9999 + 012990 9999 99 99 0 9999 99 9999 + 012991 9999 99 99 0 9999 99 9999 + 012992 9999 99 99 0 9999 99 9999 + 012993 9999 99 99 0 9999 99 9999 + 012994 9999 99 99 0 9999 99 9999 + 012995 9999 99 99 0 9999 99 9999 + 012996 9999 99 99 0 9999 99 9999 + 012997 9999 99 99 0 9999 99 9999 + 012998 9999 99 99 0 9999 99 9999 + 012999 9999 99 99 0 9999 99 9999 + 013000 9999 99 99 0 9999 99 9999 + 013001 9999 99 99 0 9999 99 9999 + 013002 9999 99 99 0 9999 99 9999 + 013003 9999 99 99 0 9999 99 9999 + 013004 9999 99 99 0 9999 99 9999 + 013005 9999 99 99 0 9999 99 9999 + 013006 9999 99 99 0 9999 99 9999 + 013007 9999 99 99 0 9999 99 9999 + 013008 9999 99 99 0 9999 99 9999 + 013009 9999 99 99 0 9999 99 9999 + 013010 9999 99 99 0 9999 99 9999 + 013011 9999 99 99 0 9999 99 9999 + 013012 9999 99 99 0 9999 99 9999 + 013013 9999 99 99 0 9999 99 9999 + 013014 9999 99 99 0 9999 99 9999 + 013015 9999 99 99 0 9999 99 9999 + 013016 9999 99 99 0 9999 99 9999 + 013017 9999 99 99 0 9999 99 9999 + 013018 9999 99 99 0 9999 99 9999 + 013019 9999 99 99 0 9999 99 9999 + 013020 9999 99 99 0 9999 99 9999 + 013021 9999 99 99 0 9999 99 9999 + 013022 9999 99 99 0 9999 99 9999 + 013023 9999 99 99 0 9999 99 9999 + 013024 9999 99 99 0 9999 99 9999 + 013025 9999 99 99 0 9999 99 9999 + 013026 9999 99 99 0 9999 99 9999 + 013027 9999 99 99 0 9999 99 9999 + 013028 9999 99 99 0 9999 99 9999 + 013029 9999 99 99 0 9999 99 9999 + 013030 9999 99 99 0 9999 99 9999 + 013031 9999 99 99 0 9999 99 9999 + 013032 9999 99 99 0 9999 99 9999 + 013033 9999 99 99 0 9999 99 9999 + 013034 9999 99 99 0 9999 99 9999 + 013035 9999 99 99 0 9999 99 9999 + 013036 9999 99 99 0 9999 99 9999 + 013037 9999 99 99 0 9999 99 9999 + 013038 9999 99 99 0 9999 99 9999 + 013039 9999 99 99 0 9999 99 9999 + 013040 9999 99 99 0 9999 99 9999 + 013041 9999 99 99 0 9999 99 9999 + 013042 9999 99 99 0 9999 99 9999 + 013043 9999 99 99 0 9999 99 9999 + 013044 9999 99 99 0 9999 99 9999 + 013045 9999 99 99 0 9999 99 9999 + 013046 9999 99 99 0 9999 99 9999 + 013047 9999 99 99 0 9999 99 9999 + 013048 9999 99 99 0 9999 99 9999 + 013049 9999 99 99 0 9999 99 9999 + 013050 9999 99 99 0 9999 99 9999 + 013051 9999 99 99 0 9999 99 9999 + 013052 9999 99 99 0 9999 99 9999 + 013053 9999 99 99 0 9999 99 9999 + 013054 9999 99 99 0 9999 99 9999 + 013055 9999 99 99 0 9999 99 9999 + 013056 9999 99 99 0 9999 99 9999 + 013057 9999 99 99 0 9999 99 9999 + 013058 9999 99 99 0 9999 99 9999 + 013059 9999 99 99 0 9999 99 9999 + 013060 9999 99 99 0 9999 99 9999 + 013061 9999 99 99 0 9999 99 9999 + 013062 9999 99 99 0 9999 99 9999 + 013063 9999 99 99 0 9999 99 9999 + 013064 9999 99 99 0 9999 99 9999 + 013065 9999 99 99 0 9999 99 9999 + 013066 9999 99 99 0 9999 99 9999 + 013067 9999 99 99 0 9999 99 9999 + 013068 9999 99 99 0 9999 99 9999 + 013069 9999 99 99 0 9999 99 9999 + 013070 9999 99 99 0 9999 99 9999 + 013071 9999 99 99 0 9999 99 9999 + 013072 9999 99 99 0 9999 99 9999 + 013073 9999 99 99 0 9999 99 9999 + 013074 9999 99 99 0 9999 99 9999 + 013075 9999 99 99 0 9999 99 9999 + 013076 9999 99 99 0 9999 99 9999 + 013077 9999 99 99 0 9999 99 9999 + 013078 9999 99 99 0 9999 99 9999 + 013079 9999 99 99 0 9999 99 9999 + 013080 9999 99 99 0 9999 99 9999 + 013081 9999 99 99 0 9999 99 9999 + 013082 9999 99 99 0 9999 99 9999 + 013083 9999 99 99 0 9999 99 9999 + 013084 9999 99 99 0 9999 99 9999 + 013085 9999 99 99 0 9999 99 9999 + 013086 9999 99 99 0 9999 99 9999 + 013087 9999 99 99 0 9999 99 9999 + 013088 9999 99 99 0 9999 99 9999 + 013089 9999 99 99 0 9999 99 9999 + 013090 9999 99 99 0 9999 99 9999 + 013091 9999 99 99 0 9999 99 9999 + 013092 9999 99 99 0 9999 99 9999 + 013093 9999 99 99 0 9999 99 9999 + 013094 9999 99 99 0 9999 99 9999 + 013095 9999 99 99 0 9999 99 9999 + 013096 9999 99 99 0 9999 99 9999 + 013097 9999 99 99 0 9999 99 9999 + 013098 9999 99 99 0 9999 99 9999 + 013099 9999 99 99 0 9999 99 9999 + 013100 9999 99 99 0 9999 99 9999 + 013101 9999 99 99 0 9999 99 9999 + 013102 9999 99 99 0 9999 99 9999 + 013103 9999 99 99 0 9999 99 9999 + 013104 9999 99 99 0 9999 99 9999 + 013105 9999 99 99 0 9999 99 9999 + 013106 9999 99 99 0 9999 99 9999 + 013107 9999 99 99 0 9999 99 9999 + 013108 9999 99 99 0 9999 99 9999 + 013109 9999 99 99 0 9999 99 9999 + 013110 9999 99 99 0 9999 99 9999 + 013111 9999 99 99 0 9999 99 9999 + 013112 9999 99 99 0 9999 99 9999 + 013113 9999 99 99 0 9999 99 9999 + 013114 9999 99 99 0 9999 99 9999 + 013115 9999 99 99 0 9999 99 9999 + 013116 9999 99 99 0 9999 99 9999 + 013117 9999 99 99 0 9999 99 9999 + 013118 9999 99 99 0 9999 99 9999 + 013119 9999 99 99 0 9999 99 9999 + 013120 9999 99 99 0 9999 99 9999 + 013121 9999 99 99 0 9999 99 9999 + 013122 9999 99 99 0 9999 99 9999 + 013123 9999 99 99 0 9999 99 9999 + 013124 9999 99 99 0 9999 99 9999 + 013125 9999 99 99 0 9999 99 9999 + 013126 9999 99 99 0 9999 99 9999 + 013127 9999 99 99 0 9999 99 9999 + 013128 9999 99 99 0 9999 99 9999 + 013129 9999 99 99 0 9999 99 9999 + 013130 9999 99 99 0 9999 99 9999 + 013131 9999 99 99 0 9999 99 9999 + 013132 9999 99 99 0 9999 99 9999 + 013133 9999 99 99 0 9999 99 9999 + 013134 9999 99 99 0 9999 99 9999 + 013135 9999 99 99 0 9999 99 9999 + 013136 9999 99 99 0 9999 99 9999 + 013137 9999 99 99 0 9999 99 9999 + 013138 9999 99 99 0 9999 99 9999 + 013139 9999 99 99 0 9999 99 9999 + 013140 9999 99 99 0 9999 99 9999 + 013141 9999 99 99 0 9999 99 9999 + 013142 9999 99 99 0 9999 99 9999 + 013143 9999 99 99 0 9999 99 9999 + 013144 9999 99 99 0 9999 99 9999 + 013145 9999 99 99 0 9999 99 9999 + 013146 9999 99 99 0 9999 99 9999 + 013147 9999 99 99 0 9999 99 9999 + 013148 9999 99 99 0 9999 99 9999 + 013149 9999 99 99 0 9999 99 9999 + 013150 9999 99 99 0 9999 99 9999 + 013151 9999 99 99 0 9999 99 9999 + 013152 9999 99 99 0 9999 99 9999 + 013153 9999 99 99 0 9999 99 9999 + 013154 9999 99 99 0 9999 99 9999 + 013155 9999 99 99 0 9999 99 9999 + 013156 9999 99 99 0 9999 99 9999 + 013157 9999 99 99 0 9999 99 9999 + 013158 9999 99 99 0 9999 99 9999 + 013159 9999 99 99 0 9999 99 9999 + 013160 9999 99 99 0 9999 99 9999 + 013161 9999 99 99 0 9999 99 9999 + 013162 9999 99 99 0 9999 99 9999 + 013163 9999 99 99 0 9999 99 9999 + 013164 9999 99 99 0 9999 99 9999 + 013165 9999 99 99 0 9999 99 9999 + 013166 9999 99 99 0 9999 99 9999 + 013167 9999 99 99 0 9999 99 9999 + 013168 9999 99 99 0 9999 99 9999 + 013169 9999 99 99 0 9999 99 9999 + 013170 9999 99 99 0 9999 99 9999 + 013171 9999 99 99 0 9999 99 9999 + 013172 9999 99 99 0 9999 99 9999 + 013173 9999 99 99 0 9999 99 9999 + 013174 9999 99 99 0 9999 99 9999 + 013175 9999 99 99 0 9999 99 9999 + 013176 9999 99 99 0 9999 99 9999 + 013177 9999 99 99 0 9999 99 9999 + 013178 9999 99 99 0 9999 99 9999 + 013179 9999 99 99 0 9999 99 9999 + 013180 9999 99 99 0 9999 99 9999 + 013181 9999 99 99 0 9999 99 9999 + 013182 9999 99 99 0 9999 99 9999 + 013183 9999 99 99 0 9999 99 9999 + 013184 9999 99 99 0 9999 99 9999 + 013185 9999 99 99 0 9999 99 9999 + 013186 9999 99 99 0 9999 99 9999 + 013187 9999 99 99 0 9999 99 9999 + 013188 9999 99 99 0 9999 99 9999 + 013189 9999 99 99 0 9999 99 9999 + 013190 9999 99 99 0 9999 99 9999 + 013191 9999 99 99 0 9999 99 9999 + 013192 9999 99 99 0 9999 99 9999 + 013193 9999 99 99 0 9999 99 9999 + 013194 9999 99 99 0 9999 99 9999 + 013195 9999 99 99 0 9999 99 9999 + 013196 9999 99 99 0 9999 99 9999 + 013197 9999 99 99 0 9999 99 9999 + 013198 9999 99 99 0 9999 99 9999 + 013199 9999 99 99 0 9999 99 9999 + 013200 9999 99 99 0 9999 99 9999 + 013201 9999 99 99 0 9999 99 9999 + 013202 9999 99 99 0 9999 99 9999 + 013203 9999 99 99 0 9999 99 9999 + 013204 9999 99 99 0 9999 99 9999 + 013205 9999 99 99 0 9999 99 9999 + 013206 9999 99 99 0 9999 99 9999 + 013207 9999 99 99 0 9999 99 9999 + 013208 9999 99 99 0 9999 99 9999 + 013209 9999 99 99 0 9999 99 9999 + 013210 9999 99 99 0 9999 99 9999 + 013211 9999 99 99 0 9999 99 9999 + 013212 9999 99 99 0 9999 99 9999 + 013213 9999 99 99 0 9999 99 9999 + 013214 9999 99 99 0 9999 99 9999 + 013215 9999 99 99 0 9999 99 9999 + 013216 9999 99 99 0 9999 99 9999 + 013217 9999 99 99 0 9999 99 9999 + 013218 9999 99 99 0 9999 99 9999 + 013219 9999 99 99 0 9999 99 9999 + 013220 9999 99 99 0 9999 99 9999 + 013221 9999 99 99 0 9999 99 9999 + 013222 9999 99 99 0 9999 99 9999 + 013223 9999 99 99 0 9999 99 9999 + 013224 9999 99 99 0 9999 99 9999 + 013225 9999 99 99 0 9999 99 9999 + 013226 9999 99 99 0 9999 99 9999 + 013227 9999 99 99 0 9999 99 9999 + 013228 9999 99 99 0 9999 99 9999 + 013229 9999 99 99 0 9999 99 9999 + 013230 9999 99 99 0 9999 99 9999 + 013231 9999 99 99 0 9999 99 9999 + 013232 9999 99 99 0 9999 99 9999 + 013233 9999 99 99 0 9999 99 9999 + 013234 9999 99 99 0 9999 99 9999 + 013235 9999 99 99 0 9999 99 9999 + 013236 9999 99 99 0 9999 99 9999 + 013237 9999 99 99 0 9999 99 9999 + 013238 9999 99 99 0 9999 99 9999 + 013239 9999 99 99 0 9999 99 9999 + 013240 9999 99 99 0 9999 99 9999 + 013241 9999 99 99 0 9999 99 9999 + 013242 9999 99 99 0 9999 99 9999 + 013243 9999 99 99 0 9999 99 9999 + 013244 9999 99 99 0 9999 99 9999 + 013245 9999 99 99 0 9999 99 9999 + 013246 9999 99 99 0 9999 99 9999 + 013247 9999 99 99 0 9999 99 9999 + 013248 9999 99 99 0 9999 99 9999 + 013249 9999 99 99 0 9999 99 9999 + 013250 9999 99 99 0 9999 99 9999 + 013251 9999 99 99 0 9999 99 9999 + 013252 9999 99 99 0 9999 99 9999 + 013253 9999 99 99 0 9999 99 9999 + 013254 9999 99 99 0 9999 99 9999 + 013255 9999 99 99 0 9999 99 9999 + 013256 9999 99 99 0 9999 99 9999 + 013257 9999 99 99 0 9999 99 9999 + 013258 9999 99 99 0 9999 99 9999 + 013259 9999 99 99 0 9999 99 9999 + 013260 9999 99 99 0 9999 99 9999 + 013261 9999 99 99 0 9999 99 9999 + 013262 9999 99 99 0 9999 99 9999 + 013263 9999 99 99 0 9999 99 9999 + 013264 9999 99 99 0 9999 99 9999 + 013265 9999 99 99 0 9999 99 9999 + 013266 9999 99 99 0 9999 99 9999 + 013267 9999 99 99 0 9999 99 9999 + 013268 9999 99 99 0 9999 99 9999 + 013269 9999 99 99 0 9999 99 9999 + 013270 9999 99 99 0 9999 99 9999 + 013271 9999 99 99 0 9999 99 9999 + 013272 9999 99 99 0 9999 99 9999 + 013273 9999 99 99 0 9999 99 9999 + 013274 9999 99 99 0 9999 99 9999 + 013275 9999 99 99 0 9999 99 9999 + 013276 9999 99 99 0 9999 99 9999 + 013277 9999 99 99 0 9999 99 9999 + 013278 9999 99 99 0 9999 99 9999 + 013279 9999 99 99 0 9999 99 9999 + 013280 9999 99 99 0 9999 99 9999 + 013281 9999 99 99 0 9999 99 9999 + 013282 9999 99 99 0 9999 99 9999 + 013283 9999 99 99 0 9999 99 9999 + 013284 9999 99 99 0 9999 99 9999 + 013285 9999 99 99 0 9999 99 9999 + 013286 9999 99 99 0 9999 99 9999 + 013287 9999 99 99 0 9999 99 9999 + 013288 9999 99 99 0 9999 99 9999 + 013289 9999 99 99 0 9999 99 9999 + 013290 9999 99 99 0 9999 99 9999 + 013291 9999 99 99 0 9999 99 9999 + 013292 9999 99 99 0 9999 99 9999 + 013293 9999 99 99 0 9999 99 9999 + 013294 9999 99 99 0 9999 99 9999 + 013295 9999 99 99 0 9999 99 9999 + 013296 9999 99 99 0 9999 99 9999 + 013297 9999 99 99 0 9999 99 9999 + 013298 9999 99 99 0 9999 99 9999 + 013299 9999 99 99 0 9999 99 9999 + 013300 9999 99 99 0 9999 99 9999 + 013301 9999 99 99 0 9999 99 9999 + 013302 9999 99 99 0 9999 99 9999 + 013303 9999 99 99 0 9999 99 9999 + 013304 9999 99 99 0 9999 99 9999 + 013305 9999 99 99 0 9999 99 9999 + 013306 9999 99 99 0 9999 99 9999 + 013307 9999 99 99 0 9999 99 9999 + 013308 9999 99 99 0 9999 99 9999 + 013309 9999 99 99 0 9999 99 9999 + 013310 9999 99 99 0 9999 99 9999 + 013311 9999 99 99 0 9999 99 9999 + 013312 9999 99 99 0 9999 99 9999 + 013313 9999 99 99 0 9999 99 9999 + 013314 9999 99 99 0 9999 99 9999 + 013315 9999 99 99 0 9999 99 9999 + 013316 9999 99 99 0 9999 99 9999 + 013317 9999 99 99 0 9999 99 9999 + 013318 9999 99 99 0 9999 99 9999 + 013319 9999 99 99 0 9999 99 9999 + 013320 9999 99 99 0 9999 99 9999 + 013321 9999 99 99 0 9999 99 9999 + 013322 9999 99 99 0 9999 99 9999 + 013323 9999 99 99 0 9999 99 9999 + 013324 9999 99 99 0 9999 99 9999 + 013325 9999 99 99 0 9999 99 9999 + 013326 9999 99 99 0 9999 99 9999 + 013327 9999 99 99 0 9999 99 9999 + 013328 9999 99 99 0 9999 99 9999 + 013329 9999 99 99 0 9999 99 9999 + 013330 9999 99 99 0 9999 99 9999 + 013331 9999 99 99 0 9999 99 9999 + 013332 9999 99 99 0 9999 99 9999 + 013333 9999 99 99 0 9999 99 9999 + 013334 9999 99 99 0 9999 99 9999 + 013335 9999 99 99 0 9999 99 9999 + 013336 9999 99 99 0 9999 99 9999 + 013337 9999 99 99 0 9999 99 9999 + 013338 9999 99 99 0 9999 99 9999 + 013339 9999 99 99 0 9999 99 9999 + 013340 9999 99 99 0 9999 99 9999 + 013341 9999 99 99 0 9999 99 9999 + 013342 9999 99 99 0 9999 99 9999 + 013343 9999 99 99 0 9999 99 9999 + 013344 9999 99 99 0 9999 99 9999 + 013345 9999 99 99 0 9999 99 9999 + 013346 9999 99 99 0 9999 99 9999 + 013347 9999 99 99 0 9999 99 9999 + 013348 9999 99 99 0 9999 99 9999 + 013349 9999 99 99 0 9999 99 9999 + 013350 9999 99 99 0 9999 99 9999 + 013351 9999 99 99 0 9999 99 9999 + 013352 9999 99 99 0 9999 99 9999 + 013353 9999 99 99 0 9999 99 9999 + 013354 9999 99 99 0 9999 99 9999 + 013355 9999 99 99 0 9999 99 9999 + 013356 9999 99 99 0 9999 99 9999 + 013357 9999 99 99 0 9999 99 9999 + 013358 9999 99 99 0 9999 99 9999 + 013359 9999 99 99 0 9999 99 9999 + 013360 9999 99 99 0 9999 99 9999 + 013361 9999 99 99 0 9999 99 9999 + 013362 9999 99 99 0 9999 99 9999 + 013363 9999 99 99 0 9999 99 9999 + 013364 9999 99 99 0 9999 99 9999 + 013365 9999 99 99 0 9999 99 9999 + 013366 9999 99 99 0 9999 99 9999 + 013367 9999 99 99 0 9999 99 9999 + 013368 9999 99 99 0 9999 99 9999 + 013369 9999 99 99 0 9999 99 9999 + 013370 9999 99 99 0 9999 99 9999 + 013371 9999 99 99 0 9999 99 9999 + 013372 9999 99 99 0 9999 99 9999 + 013373 9999 99 99 0 9999 99 9999 + 013374 9999 99 99 0 9999 99 9999 + 013375 9999 99 99 0 9999 99 9999 + 013376 9999 99 99 0 9999 99 9999 + 013377 9999 99 99 0 9999 99 9999 + 013378 9999 99 99 0 9999 99 9999 + 013379 9999 99 99 0 9999 99 9999 + 013380 9999 99 99 0 9999 99 9999 + 013381 9999 99 99 0 9999 99 9999 + 013382 9999 99 99 0 9999 99 9999 + 013383 9999 99 99 0 9999 99 9999 + 013384 9999 99 99 0 9999 99 9999 + 013385 9999 99 99 0 9999 99 9999 + 013386 9999 99 99 0 9999 99 9999 + 013387 9999 99 99 0 9999 99 9999 + 013388 9999 99 99 0 9999 99 9999 + 013389 9999 99 99 0 9999 99 9999 + 013390 9999 99 99 0 9999 99 9999 + 013391 9999 99 99 0 9999 99 9999 + 013392 9999 99 99 0 9999 99 9999 + 013393 9999 99 99 0 9999 99 9999 + 013394 9999 99 99 0 9999 99 9999 + 013395 9999 99 99 0 9999 99 9999 + 013396 9999 99 99 0 9999 99 9999 + 013397 9999 99 99 0 9999 99 9999 + 013398 9999 99 99 0 9999 99 9999 + 013399 9999 99 99 0 9999 99 9999 + 013400 9999 99 99 0 9999 99 9999 + 013401 9999 99 99 0 9999 99 9999 + 013402 9999 99 99 0 9999 99 9999 + 013403 9999 99 99 0 9999 99 9999 + 013404 9999 99 99 0 9999 99 9999 + 013405 9999 99 99 0 9999 99 9999 + 013406 9999 99 99 0 9999 99 9999 + 013407 9999 99 99 0 9999 99 9999 + 013408 9999 99 99 0 9999 99 9999 + 013409 9999 99 99 0 9999 99 9999 + 013410 9999 99 99 0 9999 99 9999 + 013411 9999 99 99 0 9999 99 9999 + 013412 9999 99 99 0 9999 99 9999 + 013413 9999 99 99 0 9999 99 9999 + 013414 9999 99 99 0 9999 99 9999 + 013415 9999 99 99 0 9999 99 9999 + 013416 9999 99 99 0 9999 99 9999 + 013417 9999 99 99 0 9999 99 9999 + 013418 9999 99 99 0 9999 99 9999 + 013419 9999 99 99 0 9999 99 9999 + 013420 9999 99 99 0 9999 99 9999 + 013421 9999 99 99 0 9999 99 9999 + 013422 9999 99 99 0 9999 99 9999 + 013423 9999 99 99 0 9999 99 9999 + 013424 9999 99 99 0 9999 99 9999 + 013425 9999 99 99 0 9999 99 9999 + 013426 9999 99 99 0 9999 99 9999 + 013427 9999 99 99 0 9999 99 9999 + 013428 9999 99 99 0 9999 99 9999 + 013429 9999 99 99 0 9999 99 9999 + 013430 9999 99 99 0 9999 99 9999 + 013431 9999 99 99 0 9999 99 9999 + 013432 9999 99 99 0 9999 99 9999 + 013433 9999 99 99 0 9999 99 9999 + 013434 9999 99 99 0 9999 99 9999 + 013435 9999 99 99 0 9999 99 9999 + 013436 9999 99 99 0 9999 99 9999 + 013437 9999 99 99 0 9999 99 9999 + 013438 9999 99 99 0 9999 99 9999 + 013439 9999 99 99 0 9999 99 9999 + 013440 9999 99 99 0 9999 99 9999 + 013441 9999 99 99 0 9999 99 9999 + 013442 9999 99 99 0 9999 99 9999 + 013443 9999 99 99 0 9999 99 9999 + 013444 9999 99 99 0 9999 99 9999 + 013445 9999 99 99 0 9999 99 9999 + 013446 9999 99 99 0 9999 99 9999 + 013447 9999 99 99 0 9999 99 9999 + 013448 9999 99 99 0 9999 99 9999 + 013449 9999 99 99 0 9999 99 9999 + 013450 9999 99 99 0 9999 99 9999 + 013451 9999 99 99 0 9999 99 9999 + 013452 9999 99 99 0 9999 99 9999 + 013453 9999 99 99 0 9999 99 9999 + 013454 9999 99 99 0 9999 99 9999 + 013455 9999 99 99 0 9999 99 9999 + 013456 9999 99 99 0 9999 99 9999 + 013457 9999 99 99 0 9999 99 9999 + 013458 9999 99 99 0 9999 99 9999 + 013459 9999 99 99 0 9999 99 9999 + 013460 9999 99 99 0 9999 99 9999 + 013461 9999 99 99 0 9999 99 9999 + 013462 9999 99 99 0 9999 99 9999 + 013463 9999 99 99 0 9999 99 9999 + 013464 9999 99 99 0 9999 99 9999 + 013465 9999 99 99 0 9999 99 9999 + 013466 9999 99 99 0 9999 99 9999 + 013467 9999 99 99 0 9999 99 9999 + 013468 9999 99 99 0 9999 99 9999 + 013469 9999 99 99 0 9999 99 9999 + 013470 9999 99 99 0 9999 99 9999 + 013471 9999 99 99 0 9999 99 9999 + 013472 9999 99 99 0 9999 99 9999 + 013473 9999 99 99 0 9999 99 9999 + 013474 9999 99 99 0 9999 99 9999 + 013475 9999 99 99 0 9999 99 9999 + 013476 9999 99 99 0 9999 99 9999 + 013477 9999 99 99 0 9999 99 9999 + 013478 9999 99 99 0 9999 99 9999 + 013479 9999 99 99 0 9999 99 9999 + 013480 9999 99 99 0 9999 99 9999 + 013481 9999 99 99 0 9999 99 9999 + 013482 9999 99 99 0 9999 99 9999 + 013483 9999 99 99 0 9999 99 9999 + 013484 9999 99 99 0 9999 99 9999 + 013485 9999 99 99 0 9999 99 9999 + 013486 9999 99 99 0 9999 99 9999 + 013487 9999 99 99 0 9999 99 9999 + 013488 9999 99 99 0 9999 99 9999 + 013489 9999 99 99 0 9999 99 9999 + 013490 9999 99 99 0 9999 99 9999 + 013491 9999 99 99 0 9999 99 9999 + 013492 9999 99 99 0 9999 99 9999 + 013493 9999 99 99 0 9999 99 9999 + 013494 9999 99 99 0 9999 99 9999 + 013495 9999 99 99 0 9999 99 9999 + 013496 9999 99 99 0 9999 99 9999 + 013497 9999 99 99 0 9999 99 9999 + 013498 9999 99 99 0 9999 99 9999 + 013499 9999 99 99 0 9999 99 9999 + 013500 9999 99 99 0 9999 99 9999 + 013501 9999 99 99 0 9999 99 9999 + 013502 9999 99 99 0 9999 99 9999 + 013503 9999 99 99 0 9999 99 9999 + 013504 9999 99 99 0 9999 99 9999 + 013505 9999 99 99 0 9999 99 9999 + 013506 9999 99 99 0 9999 99 9999 + 013507 9999 99 99 0 9999 99 9999 + 013508 9999 99 99 0 9999 99 9999 + 013509 9999 99 99 0 9999 99 9999 + 013510 9999 99 99 0 9999 99 9999 + 013511 9999 99 99 0 9999 99 9999 + 013512 9999 99 99 0 9999 99 9999 + 013513 9999 99 99 0 9999 99 9999 + 013514 9999 99 99 0 9999 99 9999 + 013515 9999 99 99 0 9999 99 9999 + 013516 9999 99 99 0 9999 99 9999 + 013517 9999 99 99 0 9999 99 9999 + 013518 9999 99 99 0 9999 99 9999 + 013519 9999 99 99 0 9999 99 9999 + 013520 9999 99 99 0 9999 99 9999 + 013521 9999 99 99 0 9999 99 9999 + 013522 9999 99 99 0 9999 99 9999 + 013523 9999 99 99 0 9999 99 9999 + 013524 9999 99 99 0 9999 99 9999 + 013525 9999 99 99 0 9999 99 9999 + 013526 9999 99 99 0 9999 99 9999 + 013527 9999 99 99 0 9999 99 9999 + 013528 9999 99 99 0 9999 99 9999 + 013529 9999 99 99 0 9999 99 9999 + 013530 9999 99 99 0 9999 99 9999 + 013531 9999 99 99 0 9999 99 9999 + 013532 9999 99 99 0 9999 99 9999 + 013533 9999 99 99 0 9999 99 9999 + 013534 9999 99 99 0 9999 99 9999 + 013535 9999 99 99 0 9999 99 9999 + 013536 9999 99 99 0 9999 99 9999 + 013537 9999 99 99 0 9999 99 9999 + 013538 9999 99 99 0 9999 99 9999 + 013539 9999 99 99 0 9999 99 9999 + 013540 9999 99 99 0 9999 99 9999 + 013541 9999 99 99 0 9999 99 9999 + 013542 9999 99 99 0 9999 99 9999 + 013543 9999 99 99 0 9999 99 9999 + 013544 9999 99 99 0 9999 99 9999 + 013545 9999 99 99 0 9999 99 9999 + 013546 9999 99 99 0 9999 99 9999 + 013547 9999 99 99 0 9999 99 9999 + 013548 9999 99 99 0 9999 99 9999 + 013549 9999 99 99 0 9999 99 9999 + 013550 9999 99 99 0 9999 99 9999 + 013551 9999 99 99 0 9999 99 9999 + 013552 9999 99 99 0 9999 99 9999 + 013553 9999 99 99 0 9999 99 9999 + 013554 9999 99 99 0 9999 99 9999 + 013555 9999 99 99 0 9999 99 9999 + 013556 9999 99 99 0 9999 99 9999 + 013557 9999 99 99 0 9999 99 9999 + 013558 9999 99 99 0 9999 99 9999 + 013559 9999 99 99 0 9999 99 9999 + 013560 9999 99 99 0 9999 99 9999 + 013561 9999 99 99 0 9999 99 9999 + 013562 9999 99 99 0 9999 99 9999 + 013563 9999 99 99 0 9999 99 9999 + 013564 9999 99 99 0 9999 99 9999 + 013565 9999 99 99 0 9999 99 9999 + 013566 9999 99 99 0 9999 99 9999 + 013567 9999 99 99 0 9999 99 9999 + 013568 9999 99 99 0 9999 99 9999 + 013569 9999 99 99 0 9999 99 9999 + 013570 9999 99 99 0 9999 99 9999 + 013571 9999 99 99 0 9999 99 9999 + 013572 9999 99 99 0 9999 99 9999 + 013573 9999 99 99 0 9999 99 9999 + 013574 9999 99 99 0 9999 99 9999 + 013575 9999 99 99 0 9999 99 9999 + 013576 9999 99 99 0 9999 99 9999 + 013577 9999 99 99 0 9999 99 9999 + 013578 9999 99 99 0 9999 99 9999 + 013579 9999 99 99 0 9999 99 9999 + 013580 9999 99 99 0 9999 99 9999 + 013581 9999 99 99 0 9999 99 9999 + 013582 9999 99 99 0 9999 99 9999 + 013583 9999 99 99 0 9999 99 9999 + 013584 9999 99 99 0 9999 99 9999 + 013585 9999 99 99 0 9999 99 9999 + 013586 9999 99 99 0 9999 99 9999 + 013587 9999 99 99 0 9999 99 9999 + 013588 9999 99 99 0 9999 99 9999 + 013589 9999 99 99 0 9999 99 9999 + 013590 9999 99 99 0 9999 99 9999 + 013591 9999 99 99 0 9999 99 9999 + 013592 9999 99 99 0 9999 99 9999 + 013593 9999 99 99 0 9999 99 9999 + 013594 9999 99 99 0 9999 99 9999 + 013595 9999 99 99 0 9999 99 9999 + 013596 9999 99 99 0 9999 99 9999 + 013597 9999 99 99 0 9999 99 9999 + 013598 9999 99 99 0 9999 99 9999 + 013599 9999 99 99 0 9999 99 9999 + 013600 9999 99 99 0 9999 99 9999 + 013601 9999 99 99 0 9999 99 9999 + 013602 9999 99 99 0 9999 99 9999 + 013603 9999 99 99 0 9999 99 9999 + 013604 9999 99 99 0 9999 99 9999 + 013605 9999 99 99 0 9999 99 9999 + 013606 9999 99 99 0 9999 99 9999 + 013607 9999 99 99 0 9999 99 9999 + 013608 9999 99 99 0 9999 99 9999 + 013609 9999 99 99 0 9999 99 9999 + 013610 9999 99 99 0 9999 99 9999 + 013611 9999 99 99 0 9999 99 9999 + 013612 9999 99 99 0 9999 99 9999 + 013613 9999 99 99 0 9999 99 9999 + 013614 9999 99 99 0 9999 99 9999 + 013615 9999 99 99 0 9999 99 9999 + 013616 9999 99 99 0 9999 99 9999 + 013617 9999 99 99 0 9999 99 9999 + 013618 9999 99 99 0 9999 99 9999 + 013619 9999 99 99 0 9999 99 9999 + 013620 9999 99 99 0 9999 99 9999 + 013621 9999 99 99 0 9999 99 9999 + 013622 9999 99 99 0 9999 99 9999 + 013623 9999 99 99 0 9999 99 9999 + 013624 9999 99 99 0 9999 99 9999 + 013625 9999 99 99 0 9999 99 9999 + 013626 9999 99 99 0 9999 99 9999 + 013627 9999 99 99 0 9999 99 9999 + 013628 9999 99 99 0 9999 99 9999 + 013629 9999 99 99 0 9999 99 9999 + 013630 9999 99 99 0 9999 99 9999 + 013631 9999 99 99 0 9999 99 9999 + 013632 9999 99 99 0 9999 99 9999 + 013633 9999 99 99 0 9999 99 9999 + 013634 9999 99 99 0 9999 99 9999 + 013635 9999 99 99 0 9999 99 9999 + 013636 9999 99 99 0 9999 99 9999 + 013637 9999 99 99 0 9999 99 9999 + 013638 9999 99 99 0 9999 99 9999 + 013639 9999 99 99 0 9999 99 9999 + 013640 9999 99 99 0 9999 99 9999 + 013641 9999 99 99 0 9999 99 9999 + 013642 9999 99 99 0 9999 99 9999 + 013643 9999 99 99 0 9999 99 9999 + 013644 9999 99 99 0 9999 99 9999 + 013645 9999 99 99 0 9999 99 9999 + 013646 9999 99 99 0 9999 99 9999 + 013647 9999 99 99 0 9999 99 9999 + 013648 9999 99 99 0 9999 99 9999 + 013649 9999 99 99 0 9999 99 9999 + 013650 9999 99 99 0 9999 99 9999 + 013651 9999 99 99 0 9999 99 9999 + 013652 9999 99 99 0 9999 99 9999 + 013653 9999 99 99 0 9999 99 9999 + 013654 9999 99 99 0 9999 99 9999 + 013655 9999 99 99 0 9999 99 9999 + 013656 9999 99 99 0 9999 99 9999 + 013657 9999 99 99 0 9999 99 9999 + 013658 9999 99 99 0 9999 99 9999 + 013659 9999 99 99 0 9999 99 9999 + 013660 9999 99 99 0 9999 99 9999 + 013661 9999 99 99 0 9999 99 9999 + 013662 9999 99 99 0 9999 99 9999 + 013663 9999 99 99 0 9999 99 9999 + 013664 9999 99 99 0 9999 99 9999 + 013665 9999 99 99 0 9999 99 9999 + 013666 9999 99 99 0 9999 99 9999 + 013667 9999 99 99 0 9999 99 9999 + 013668 9999 99 99 0 9999 99 9999 + 013669 9999 99 99 0 9999 99 9999 + 013670 9999 99 99 0 9999 99 9999 + 013671 9999 99 99 0 9999 99 9999 + 013672 9999 99 99 0 9999 99 9999 + 013673 9999 99 99 0 9999 99 9999 + 013674 9999 99 99 0 9999 99 9999 + 013675 9999 99 99 0 9999 99 9999 + 013676 9999 99 99 0 9999 99 9999 + 013677 9999 99 99 0 9999 99 9999 + 013678 9999 99 99 0 9999 99 9999 + 013679 9999 99 99 0 9999 99 9999 + 013680 9999 99 99 0 9999 99 9999 + 013681 9999 99 99 0 9999 99 9999 + 013682 9999 99 99 0 9999 99 9999 + 013683 9999 99 99 0 9999 99 9999 + 013684 9999 99 99 0 9999 99 9999 + 013685 9999 99 99 0 9999 99 9999 + 013686 9999 99 99 0 9999 99 9999 + 013687 9999 99 99 0 9999 99 9999 + 013688 9999 99 99 0 9999 99 9999 + 013689 9999 99 99 0 9999 99 9999 + 013690 9999 99 99 0 9999 99 9999 + 013691 9999 99 99 0 9999 99 9999 + 013692 9999 99 99 0 9999 99 9999 + 013693 9999 99 99 0 9999 99 9999 + 013694 9999 99 99 0 9999 99 9999 + 013695 9999 99 99 0 9999 99 9999 + 013696 9999 99 99 0 9999 99 9999 + 013697 9999 99 99 0 9999 99 9999 + 013698 9999 99 99 0 9999 99 9999 + 013699 9999 99 99 0 9999 99 9999 + 013700 9999 99 99 0 9999 99 9999 + 013701 9999 99 99 0 9999 99 9999 + 013702 9999 99 99 0 9999 99 9999 + 013703 9999 99 99 0 9999 99 9999 + 013704 9999 99 99 0 9999 99 9999 + 013705 9999 99 99 0 9999 99 9999 + 013706 9999 99 99 0 9999 99 9999 + 013707 9999 99 99 0 9999 99 9999 + 013708 9999 99 99 0 9999 99 9999 + 013709 9999 99 99 0 9999 99 9999 + 013710 9999 99 99 0 9999 99 9999 + 013711 9999 99 99 0 9999 99 9999 + 013712 9999 99 99 0 9999 99 9999 + 013713 9999 99 99 0 9999 99 9999 + 013714 9999 99 99 0 9999 99 9999 + 013715 9999 99 99 0 9999 99 9999 + 013716 9999 99 99 0 9999 99 9999 + 013717 9999 99 99 0 9999 99 9999 + 013718 9999 99 99 0 9999 99 9999 + 013719 9999 99 99 0 9999 99 9999 + 013720 9999 99 99 0 9999 99 9999 + 013721 9999 99 99 0 9999 99 9999 + 013722 9999 99 99 0 9999 99 9999 + 013723 9999 99 99 0 9999 99 9999 + 013724 9999 99 99 0 9999 99 9999 + 013725 9999 99 99 0 9999 99 9999 + 013726 9999 99 99 0 9999 99 9999 + 013727 9999 99 99 0 9999 99 9999 + 013728 9999 99 99 0 9999 99 9999 + 013729 9999 99 99 0 9999 99 9999 + 013730 9999 99 99 0 9999 99 9999 + 013731 9999 99 99 0 9999 99 9999 + 013732 9999 99 99 0 9999 99 9999 + 013733 9999 99 99 0 9999 99 9999 + 013734 9999 99 99 0 9999 99 9999 + 013735 9999 99 99 0 9999 99 9999 + 013736 9999 99 99 0 9999 99 9999 + 013737 9999 99 99 0 9999 99 9999 + 013738 9999 99 99 0 9999 99 9999 + 013739 9999 99 99 0 9999 99 9999 + 013740 9999 99 99 0 9999 99 9999 + 013741 9999 99 99 0 9999 99 9999 + 013742 9999 99 99 0 9999 99 9999 + 013743 9999 99 99 0 9999 99 9999 + 013744 9999 99 99 0 9999 99 9999 + 013745 9999 99 99 0 9999 99 9999 + 013746 9999 99 99 0 9999 99 9999 + 013747 9999 99 99 0 9999 99 9999 + 013748 9999 99 99 0 9999 99 9999 + 013749 9999 99 99 0 9999 99 9999 + 013750 9999 99 99 0 9999 99 9999 + 013751 9999 99 99 0 9999 99 9999 + 013752 9999 99 99 0 9999 99 9999 + 013753 9999 99 99 0 9999 99 9999 + 013754 9999 99 99 0 9999 99 9999 + 013755 9999 99 99 0 9999 99 9999 + 013756 9999 99 99 0 9999 99 9999 + 013757 9999 99 99 0 9999 99 9999 + 013758 9999 99 99 0 9999 99 9999 + 013759 9999 99 99 0 9999 99 9999 + 013760 9999 99 99 0 9999 99 9999 + 013761 9999 99 99 0 9999 99 9999 + 013762 9999 99 99 0 9999 99 9999 + 013763 9999 99 99 0 9999 99 9999 + 013764 9999 99 99 0 9999 99 9999 + 013765 9999 99 99 0 9999 99 9999 + 013766 9999 99 99 0 9999 99 9999 + 013767 9999 99 99 0 9999 99 9999 + 013768 9999 99 99 0 9999 99 9999 + 013769 9999 99 99 0 9999 99 9999 + 013770 9999 99 99 0 9999 99 9999 + 013771 9999 99 99 0 9999 99 9999 + 013772 9999 99 99 0 9999 99 9999 + 013773 9999 99 99 0 9999 99 9999 + 013774 9999 99 99 0 9999 99 9999 + 013775 9999 99 99 0 9999 99 9999 + 013776 9999 99 99 0 9999 99 9999 + 013777 9999 99 99 0 9999 99 9999 + 013778 9999 99 99 0 9999 99 9999 + 013779 9999 99 99 0 9999 99 9999 + 013780 9999 99 99 0 9999 99 9999 + 013781 9999 99 99 0 9999 99 9999 + 013782 9999 99 99 0 9999 99 9999 + 013783 9999 99 99 0 9999 99 9999 + 013784 9999 99 99 0 9999 99 9999 + 013785 9999 99 99 0 9999 99 9999 + 013786 9999 99 99 0 9999 99 9999 + 013787 9999 99 99 0 9999 99 9999 + 013788 9999 99 99 0 9999 99 9999 + 013789 9999 99 99 0 9999 99 9999 + 013790 9999 99 99 0 9999 99 9999 + 013791 9999 99 99 0 9999 99 9999 + 013792 9999 99 99 0 9999 99 9999 + 013793 9999 99 99 0 9999 99 9999 + 013794 9999 99 99 0 9999 99 9999 + 013795 9999 99 99 0 9999 99 9999 + 013796 9999 99 99 0 9999 99 9999 + 013797 9999 99 99 0 9999 99 9999 + 013798 9999 99 99 0 9999 99 9999 + 013799 9999 99 99 0 9999 99 9999 + 013800 9999 99 99 0 9999 99 9999 + 013801 9999 99 99 0 9999 99 9999 + 013802 9999 99 99 0 9999 99 9999 + 013803 9999 99 99 0 9999 99 9999 + 013804 9999 99 99 0 9999 99 9999 + 013805 9999 99 99 0 9999 99 9999 + 013806 9999 99 99 0 9999 99 9999 + 013807 9999 99 99 0 9999 99 9999 + 013808 9999 99 99 0 9999 99 9999 + 013809 9999 99 99 0 9999 99 9999 + 013810 9999 99 99 0 9999 99 9999 + 013811 9999 99 99 0 9999 99 9999 + 013812 9999 99 99 0 9999 99 9999 + 013813 9999 99 99 0 9999 99 9999 + 013814 9999 99 99 0 9999 99 9999 + 013815 9999 99 99 0 9999 99 9999 + 013816 9999 99 99 0 9999 99 9999 + 013817 9999 99 99 0 9999 99 9999 + 013818 9999 99 99 0 9999 99 9999 + 013819 9999 99 99 0 9999 99 9999 + 013820 9999 99 99 0 9999 99 9999 + 013821 9999 99 99 0 9999 99 9999 + 013822 9999 99 99 0 9999 99 9999 + 013823 9999 99 99 0 9999 99 9999 + 013824 9999 99 99 0 9999 99 9999 + 013825 1236 01 01 1 303075348 08 0068 + 013826 1236 01 02 1 303075348 09 0068 + 013827 9999 99 99 0 9999 99 9999 + 013828 9999 99 99 0 9999 99 9999 + 013829 9999 99 99 0 9999 99 9999 + 013830 9999 99 99 0 9999 99 9999 + 013831 9999 99 99 0 9999 99 9999 + 013832 9999 99 99 0 9999 99 9999 + 013833 1236 02 01 1 303075348 10 0068 + 013834 1236 02 02 1 303075348 11 0068 + 013835 9999 99 99 0 9999 99 9999 + 013836 9999 99 99 0 9999 99 9999 + 013837 9999 99 99 0 9999 99 9999 + 013838 9999 99 99 0 9999 99 9999 + 013839 9999 99 99 0 9999 99 9999 + 013840 9999 99 99 0 9999 99 9999 + 013841 1236 03 01 1 303075348 12 0068 + 013842 1236 03 02 1 303075348 13 0068 + 013843 9999 99 99 0 9999 99 9999 + 013844 9999 99 99 0 9999 99 9999 + 013845 9999 99 99 0 9999 99 9999 + 013846 9999 99 99 0 9999 99 9999 + 013847 9999 99 99 0 9999 99 9999 + 013848 9999 99 99 0 9999 99 9999 + 013849 1236 04 01 1 303075348 14 0068 + 013850 1236 04 02 1 303075348 15 0068 + 013851 9999 99 99 0 9999 99 9999 + 013852 9999 99 99 0 9999 99 9999 + 013853 9999 99 99 0 9999 99 9999 + 013854 9999 99 99 0 9999 99 9999 + 013855 9999 99 99 0 9999 99 9999 + 013856 9999 99 99 0 9999 99 9999 + 013857 1236 05 01 1 303075348 00 0068 + 013858 1236 05 02 1 303075348 01 0068 + 013859 9999 99 99 0 9999 99 9999 + 013860 9999 99 99 0 9999 99 9999 + 013861 9999 99 99 0 9999 99 9999 + 013862 9999 99 99 0 9999 99 9999 + 013863 9999 99 99 0 9999 99 9999 + 013864 9999 99 99 0 9999 99 9999 + 013865 1236 06 01 1 303075348 02 0068 + 013866 1236 06 02 1 303075348 03 0068 + 013867 9999 99 99 0 9999 99 9999 + 013868 9999 99 99 0 9999 99 9999 + 013869 9999 99 99 0 9999 99 9999 + 013870 9999 99 99 0 9999 99 9999 + 013871 9999 99 99 0 9999 99 9999 + 013872 9999 99 99 0 9999 99 9999 + 013873 1236 07 01 1 303075348 04 0068 + 013874 1236 07 02 1 303075348 05 0068 + 013875 9999 99 99 0 9999 99 9999 + 013876 9999 99 99 0 9999 99 9999 + 013877 9999 99 99 0 9999 99 9999 + 013878 9999 99 99 0 9999 99 9999 + 013879 9999 99 99 0 9999 99 9999 + 013880 9999 99 99 0 9999 99 9999 + 013881 1236 08 01 1 303075348 06 0068 + 013882 1236 08 02 1 303075348 07 0068 + 013883 9999 99 99 0 9999 99 9999 + 013884 9999 99 99 0 9999 99 9999 + 013885 9999 99 99 0 9999 99 9999 + 013886 9999 99 99 0 9999 99 9999 + 013887 9999 99 99 0 9999 99 9999 + 013888 9999 99 99 0 9999 99 9999 + 013889 1236 09 01 1 304168984 00 0253 + 013890 1236 09 02 1 304168984 01 0253 + 013891 1236 09 03 1 304168984 02 0253 + 013892 1236 09 04 1 304168984 03 0253 + 013893 9999 99 99 0 9999 99 9999 + 013894 9999 99 99 0 9999 99 9999 + 013895 9999 99 99 0 9999 99 9999 + 013896 9999 99 99 0 9999 99 9999 + 013897 1236 10 01 1 304168984 04 0253 + 013898 1236 10 02 1 304168984 05 0253 + 013899 1236 10 03 1 304168984 06 0253 + 013900 1236 10 04 1 304168984 07 0253 + 013901 9999 99 99 0 9999 99 9999 + 013902 9999 99 99 0 9999 99 9999 + 013903 9999 99 99 0 9999 99 9999 + 013904 9999 99 99 0 9999 99 9999 + 013905 1236 11 01 1 304168984 08 0253 + 013906 1236 11 02 1 304168984 09 0253 + 013907 1236 11 03 1 304168984 10 0253 + 013908 1236 11 04 1 304168984 11 0253 + 013909 9999 99 99 0 9999 99 9999 + 013910 9999 99 99 0 9999 99 9999 + 013911 9999 99 99 0 9999 99 9999 + 013912 9999 99 99 0 9999 99 9999 + 013913 1236 12 01 1 304168984 12 0253 + 013914 1236 12 02 1 304168984 13 0253 + 013915 1236 12 03 1 304168984 14 0253 + 013916 1236 12 04 1 304168984 15 0253 + 013917 9999 99 99 0 9999 99 9999 + 013918 9999 99 99 0 9999 99 9999 + 013919 9999 99 99 0 9999 99 9999 + 013920 9999 99 99 0 9999 99 9999 + 013921 1236 13 01 1 304168980 08 0252 + 013922 1236 13 02 1 304168980 09 0252 + 013923 1236 13 03 1 304168980 10 0252 + 013924 1236 13 04 1 304168980 11 0252 + 013925 9999 99 99 0 9999 99 9999 + 013926 9999 99 99 0 9999 99 9999 + 013927 9999 99 99 0 9999 99 9999 + 013928 9999 99 99 0 9999 99 9999 + 013929 1236 14 01 1 304168980 12 0252 + 013930 1236 14 02 1 304168980 13 0252 + 013931 1236 14 03 1 304168980 14 0252 + 013932 1236 14 04 1 304168980 15 0252 + 013933 9999 99 99 0 9999 99 9999 + 013934 9999 99 99 0 9999 99 9999 + 013935 9999 99 99 0 9999 99 9999 + 013936 9999 99 99 0 9999 99 9999 + 013937 1236 15 01 1 304168980 00 0252 + 013938 1236 15 02 1 304168980 01 0252 + 013939 1236 15 03 1 304168980 02 0252 + 013940 1236 15 04 1 304168980 03 0252 + 013941 9999 99 99 0 9999 99 9999 + 013942 9999 99 99 0 9999 99 9999 + 013943 9999 99 99 0 9999 99 9999 + 013944 9999 99 99 0 9999 99 9999 + 013945 1236 16 01 1 304168980 04 0252 + 013946 1236 16 02 1 304168980 05 0252 + 013947 1236 16 03 1 304168980 06 0252 + 013948 1236 16 04 1 304168980 07 0252 + 013949 9999 99 99 0 9999 99 9999 + 013950 9999 99 99 0 9999 99 9999 + 013951 9999 99 99 0 9999 99 9999 + 013952 9999 99 99 0 9999 99 9999 + 013953 1236 17 01 1 306368540 00 1030 + 013954 1236 17 02 1 306368540 01 1030 + 013955 1236 17 03 1 306368540 02 1030 + 013956 1236 17 04 1 306368540 03 1030 + 013957 1236 17 05 1 306368540 04 1030 + 013958 1236 17 06 1 306368540 05 1030 + 013959 1236 17 07 1 306368540 06 1030 + 013960 1236 17 08 1 306368540 07 1030 + 013961 1236 18 01 1 306368540 08 1030 + 013962 1236 18 02 1 306368540 09 1030 + 013963 1236 18 03 1 306368540 10 1030 + 013964 1236 18 04 1 306368540 11 1030 + 013965 1236 18 05 1 306368540 12 1030 + 013966 1236 18 06 1 306368540 13 1030 + 013967 1236 18 07 1 306368540 14 1030 + 013968 1236 18 08 1 306368540 15 1030 + 013969 1236 19 01 1 306368544 00 1031 + 013970 1236 19 02 1 306368544 01 1031 + 013971 1236 19 03 1 306368544 02 1031 + 013972 1236 19 04 1 306368544 03 1031 + 013973 1236 19 05 1 306368544 04 1031 + 013974 1236 19 06 1 306368544 05 1031 + 013975 1236 19 07 1 306368544 06 1031 + 013976 1236 19 08 1 306368544 07 1031 + 013977 1236 20 01 1 306368544 08 1031 + 013978 1236 20 02 1 306368544 09 1031 + 013979 1236 20 03 1 306368544 10 1031 + 013980 1236 20 04 1 306368544 11 1031 + 013981 1236 20 05 1 306368544 12 1031 + 013982 1236 20 06 1 306368544 13 1031 + 013983 1236 20 07 1 306368544 14 1031 + 013984 1236 20 08 1 306368544 15 1031 + 013985 1236 21 01 1 306368532 00 1028 + 013986 1236 21 02 1 306368532 01 1028 + 013987 1236 21 03 1 306368532 02 1028 + 013988 1236 21 04 1 306368532 03 1028 + 013989 1236 21 05 1 306368532 04 1028 + 013990 1236 21 06 1 306368532 05 1028 + 013991 1236 21 07 1 306368532 06 1028 + 013992 1236 21 08 1 306368532 07 1028 + 013993 1236 22 01 1 306368532 08 1028 + 013994 1236 22 02 1 306368532 09 1028 + 013995 1236 22 03 1 306368532 10 1028 + 013996 1236 22 04 1 306368532 11 1028 + 013997 1236 22 05 1 306368532 12 1028 + 013998 1236 22 06 1 306368532 13 1028 + 013999 1236 22 07 1 306368532 14 1028 + 014000 1236 22 08 1 306368532 15 1028 + 014001 1236 23 01 1 306368536 00 1029 + 014002 1236 23 02 1 306368536 01 1029 + 014003 1236 23 03 1 306368536 02 1029 + 014004 1236 23 04 1 306368536 03 1029 + 014005 1236 23 05 1 306368536 04 1029 + 014006 1236 23 06 1 306368536 05 1029 + 014007 1236 23 07 1 306368536 06 1029 + 014008 1236 23 08 1 306368536 07 1029 + 014009 1236 24 01 1 306368536 08 1029 + 014010 1236 24 02 1 306368536 09 1029 + 014011 1236 24 03 1 306368536 10 1029 + 014012 1236 24 04 1 306368536 11 1029 + 014013 1236 24 05 1 306368536 12 1029 + 014014 1236 24 06 1 306368536 13 1029 + 014015 1236 24 07 1 306368536 14 1029 + 014016 1236 24 08 1 306368536 15 1029 + 014017 1236 25 01 1 303075352 08 0069 + 014018 1236 25 02 1 303075352 09 0069 + 014019 9999 99 99 0 9999 99 9999 + 014020 9999 99 99 0 9999 99 9999 + 014021 9999 99 99 0 9999 99 9999 + 014022 9999 99 99 0 9999 99 9999 + 014023 9999 99 99 0 9999 99 9999 + 014024 9999 99 99 0 9999 99 9999 + 014025 1236 26 01 1 303075352 10 0069 + 014026 1236 26 02 1 303075352 11 0069 + 014027 9999 99 99 0 9999 99 9999 + 014028 9999 99 99 0 9999 99 9999 + 014029 9999 99 99 0 9999 99 9999 + 014030 9999 99 99 0 9999 99 9999 + 014031 9999 99 99 0 9999 99 9999 + 014032 9999 99 99 0 9999 99 9999 + 014033 1236 27 01 1 303075352 12 0069 + 014034 1236 27 02 1 303075352 13 0069 + 014035 9999 99 99 0 9999 99 9999 + 014036 9999 99 99 0 9999 99 9999 + 014037 9999 99 99 0 9999 99 9999 + 014038 9999 99 99 0 9999 99 9999 + 014039 9999 99 99 0 9999 99 9999 + 014040 9999 99 99 0 9999 99 9999 + 014041 1236 28 01 1 303075352 14 0069 + 014042 1236 28 02 1 303075352 15 0069 + 014043 9999 99 99 0 9999 99 9999 + 014044 9999 99 99 0 9999 99 9999 + 014045 9999 99 99 0 9999 99 9999 + 014046 9999 99 99 0 9999 99 9999 + 014047 9999 99 99 0 9999 99 9999 + 014048 9999 99 99 0 9999 99 9999 + 014049 1236 29 01 1 303075352 04 0069 + 014050 1236 29 02 1 303075352 05 0069 + 014051 9999 99 99 0 9999 99 9999 + 014052 9999 99 99 0 9999 99 9999 + 014053 9999 99 99 0 9999 99 9999 + 014054 9999 99 99 0 9999 99 9999 + 014055 9999 99 99 0 9999 99 9999 + 014056 9999 99 99 0 9999 99 9999 + 014057 1236 30 01 1 303075352 06 0069 + 014058 1236 30 02 1 303075352 07 0069 + 014059 9999 99 99 0 9999 99 9999 + 014060 9999 99 99 0 9999 99 9999 + 014061 9999 99 99 0 9999 99 9999 + 014062 9999 99 99 0 9999 99 9999 + 014063 9999 99 99 0 9999 99 9999 + 014064 9999 99 99 0 9999 99 9999 + 014065 1236 31 01 1 303075352 00 0069 + 014066 1236 31 02 1 303075352 01 0069 + 014067 9999 99 99 0 9999 99 9999 + 014068 9999 99 99 0 9999 99 9999 + 014069 9999 99 99 0 9999 99 9999 + 014070 9999 99 99 0 9999 99 9999 + 014071 9999 99 99 0 9999 99 9999 + 014072 9999 99 99 0 9999 99 9999 + 014073 1236 32 01 1 303075352 02 0069 + 014074 1236 32 02 1 303075352 03 0069 + 014075 9999 99 99 0 9999 99 9999 + 014076 9999 99 99 0 9999 99 9999 + 014077 9999 99 99 0 9999 99 9999 + 014078 9999 99 99 0 9999 99 9999 + 014079 9999 99 99 0 9999 99 9999 + 014080 9999 99 99 0 9999 99 9999 + 014081 1236 33 01 1 306372636 00 1038 + 014082 1236 33 02 1 306372636 01 1038 + 014083 1236 33 03 1 306372636 02 1038 + 014084 1236 33 04 1 306372636 03 1038 + 014085 1236 33 05 1 306372636 04 1038 + 014086 1236 33 06 1 306372636 05 1038 + 014087 1236 33 07 1 306372636 06 1038 + 014088 1236 33 08 1 306372636 07 1038 + 014089 1236 34 01 1 306372636 08 1038 + 014090 1236 34 02 1 306372636 09 1038 + 014091 1236 34 03 1 306372636 10 1038 + 014092 1236 34 04 1 306372636 11 1038 + 014093 1236 34 05 1 306372636 12 1038 + 014094 1236 34 06 1 306372636 13 1038 + 014095 1236 34 07 1 306372636 14 1038 + 014096 1236 34 08 1 306372636 15 1038 + 014097 1236 35 01 1 306372640 00 1039 + 014098 1236 35 02 1 306372640 01 1039 + 014099 1236 35 03 1 306372640 02 1039 + 014100 1236 35 04 1 306372640 03 1039 + 014101 1236 35 05 1 306372640 04 1039 + 014102 1236 35 06 1 306372640 05 1039 + 014103 1236 35 07 1 306372640 06 1039 + 014104 1236 35 08 1 306372640 07 1039 + 014105 1236 36 01 1 306372640 08 1039 + 014106 1236 36 02 1 306372640 09 1039 + 014107 1236 36 03 1 306372640 10 1039 + 014108 1236 36 04 1 306372640 11 1039 + 014109 1236 36 05 1 306372640 12 1039 + 014110 1236 36 06 1 306372640 13 1039 + 014111 1236 36 07 1 306372640 14 1039 + 014112 1236 36 08 1 306372640 15 1039 + 014113 1236 37 01 1 306372628 00 1036 + 014114 1236 37 02 1 306372628 01 1036 + 014115 1236 37 03 1 306372628 02 1036 + 014116 1236 37 04 1 306372628 03 1036 + 014117 1236 37 05 1 306372628 04 1036 + 014118 1236 37 06 1 306372628 05 1036 + 014119 1236 37 07 1 306372628 06 1036 + 014120 1236 37 08 1 306372628 07 1036 + 014121 1236 38 01 1 306372628 08 1036 + 014122 1236 38 02 1 306372628 09 1036 + 014123 1236 38 03 1 306372628 10 1036 + 014124 1236 38 04 1 306372628 11 1036 + 014125 1236 38 05 1 306372628 12 1036 + 014126 1236 38 06 1 306372628 13 1036 + 014127 1236 38 07 1 306372628 14 1036 + 014128 1236 38 08 1 306372628 15 1036 + 014129 1236 39 01 1 306372632 00 1037 + 014130 1236 39 02 1 306372632 01 1037 + 014131 1236 39 03 1 306372632 02 1037 + 014132 1236 39 04 1 306372632 03 1037 + 014133 1236 39 05 1 306372632 04 1037 + 014134 1236 39 06 1 306372632 05 1037 + 014135 1236 39 07 1 306372632 06 1037 + 014136 1236 39 08 1 306372632 07 1037 + 014137 1236 40 01 1 306372632 08 1037 + 014138 1236 40 02 1 306372632 09 1037 + 014139 1236 40 03 1 306372632 10 1037 + 014140 1236 40 04 1 306372632 11 1037 + 014141 1236 40 05 1 306372632 12 1037 + 014142 1236 40 06 1 306372632 13 1037 + 014143 1236 40 07 1 306372632 14 1037 + 014144 1236 40 08 1 306372632 15 1037 + 014145 1236 41 01 1 304168988 00 0254 + 014146 1236 41 02 1 304168988 01 0254 + 014147 1236 41 03 1 304168988 02 0254 + 014148 1236 41 04 1 304168988 03 0254 + 014149 9999 99 99 0 9999 99 9999 + 014150 9999 99 99 0 9999 99 9999 + 014151 9999 99 99 0 9999 99 9999 + 014152 9999 99 99 0 9999 99 9999 + 014153 1236 42 01 1 304168988 04 0254 + 014154 1236 42 02 1 304168988 05 0254 + 014155 1236 42 03 1 304168988 06 0254 + 014156 1236 42 04 1 304168988 07 0254 + 014157 9999 99 99 0 9999 99 9999 + 014158 9999 99 99 0 9999 99 9999 + 014159 9999 99 99 0 9999 99 9999 + 014160 9999 99 99 0 9999 99 9999 + 014161 1236 43 01 1 304168988 08 0254 + 014162 1236 43 02 1 304168988 09 0254 + 014163 1236 43 03 1 304168988 10 0254 + 014164 1236 43 04 1 304168988 11 0254 + 014165 9999 99 99 0 9999 99 9999 + 014166 9999 99 99 0 9999 99 9999 + 014167 9999 99 99 0 9999 99 9999 + 014168 9999 99 99 0 9999 99 9999 + 014169 1236 44 01 1 304168988 12 0254 + 014170 1236 44 02 1 304168988 13 0254 + 014171 1236 44 03 1 304168988 14 0254 + 014172 1236 44 04 1 304168988 15 0254 + 014173 9999 99 99 0 9999 99 9999 + 014174 9999 99 99 0 9999 99 9999 + 014175 9999 99 99 0 9999 99 9999 + 014176 9999 99 99 0 9999 99 9999 + 014177 1236 45 01 1 304168992 00 0255 + 014178 1236 45 02 1 304168992 01 0255 + 014179 1236 45 03 1 304168992 02 0255 + 014180 1236 45 04 1 304168992 03 0255 + 014181 9999 99 99 0 9999 99 9999 + 014182 9999 99 99 0 9999 99 9999 + 014183 9999 99 99 0 9999 99 9999 + 014184 9999 99 99 0 9999 99 9999 + 014185 1236 46 01 1 304168992 04 0255 + 014186 1236 46 02 1 304168992 05 0255 + 014187 1236 46 03 1 304168992 06 0255 + 014188 1236 46 04 1 304168992 07 0255 + 014189 9999 99 99 0 9999 99 9999 + 014190 9999 99 99 0 9999 99 9999 + 014191 9999 99 99 0 9999 99 9999 + 014192 9999 99 99 0 9999 99 9999 + 014193 1236 47 01 1 304168992 08 0255 + 014194 1236 47 02 1 304168992 09 0255 + 014195 1236 47 03 1 304168992 10 0255 + 014196 1236 47 04 1 304168992 11 0255 + 014197 9999 99 99 0 9999 99 9999 + 014198 9999 99 99 0 9999 99 9999 + 014199 9999 99 99 0 9999 99 9999 + 014200 9999 99 99 0 9999 99 9999 + 014201 1236 48 01 1 304168992 12 0255 + 014202 1236 48 02 1 304168992 13 0255 + 014203 1236 48 03 1 304168992 14 0255 + 014204 1236 48 04 1 304168992 15 0255 + 014205 9999 99 99 0 9999 99 9999 + 014206 9999 99 99 0 9999 99 9999 + 014207 9999 99 99 0 9999 99 9999 + 014208 9999 99 99 0 9999 99 9999 + 014209 1237 01 01 1 304173080 08 0261 + 014210 1237 01 02 1 304173080 09 0261 + 014211 1237 01 03 1 304173080 10 0261 + 014212 1237 01 04 1 304173080 11 0261 + 014213 9999 99 99 0 9999 99 9999 + 014214 9999 99 99 0 9999 99 9999 + 014215 9999 99 99 0 9999 99 9999 + 014216 9999 99 99 0 9999 99 9999 + 014217 1237 02 01 1 304173080 12 0261 + 014218 1237 02 02 1 304173080 13 0261 + 014219 1237 02 03 1 304173080 14 0261 + 014220 1237 02 04 1 304173080 15 0261 + 014221 9999 99 99 0 9999 99 9999 + 014222 9999 99 99 0 9999 99 9999 + 014223 9999 99 99 0 9999 99 9999 + 014224 9999 99 99 0 9999 99 9999 + 014225 1237 03 01 1 304173080 00 0261 + 014226 1237 03 02 1 304173080 01 0261 + 014227 1237 03 03 1 304173080 02 0261 + 014228 1237 03 04 1 304173080 03 0261 + 014229 9999 99 99 0 9999 99 9999 + 014230 9999 99 99 0 9999 99 9999 + 014231 9999 99 99 0 9999 99 9999 + 014232 9999 99 99 0 9999 99 9999 + 014233 1237 04 01 1 304173080 04 0261 + 014234 1237 04 02 1 304173080 05 0261 + 014235 1237 04 03 1 304173080 06 0261 + 014236 1237 04 04 1 304173080 07 0261 + 014237 9999 99 99 0 9999 99 9999 + 014238 9999 99 99 0 9999 99 9999 + 014239 9999 99 99 0 9999 99 9999 + 014240 9999 99 99 0 9999 99 9999 + 014241 1237 05 01 1 304173076 08 0260 + 014242 1237 05 02 1 304173076 09 0260 + 014243 1237 05 03 1 304173076 10 0260 + 014244 1237 05 04 1 304173076 11 0260 + 014245 9999 99 99 0 9999 99 9999 + 014246 9999 99 99 0 9999 99 9999 + 014247 9999 99 99 0 9999 99 9999 + 014248 9999 99 99 0 9999 99 9999 + 014249 1237 06 01 1 304173076 12 0260 + 014250 1237 06 02 1 304173076 13 0260 + 014251 1237 06 03 1 304173076 14 0260 + 014252 1237 06 04 1 304173076 15 0260 + 014253 9999 99 99 0 9999 99 9999 + 014254 9999 99 99 0 9999 99 9999 + 014255 9999 99 99 0 9999 99 9999 + 014256 9999 99 99 0 9999 99 9999 + 014257 1237 07 01 1 304173076 00 0260 + 014258 1237 07 02 1 304173076 01 0260 + 014259 1237 07 03 1 304173076 02 0260 + 014260 1237 07 04 1 304173076 03 0260 + 014261 9999 99 99 0 9999 99 9999 + 014262 9999 99 99 0 9999 99 9999 + 014263 9999 99 99 0 9999 99 9999 + 014264 9999 99 99 0 9999 99 9999 + 014265 1237 08 01 1 304173076 04 0260 + 014266 1237 08 02 1 304173076 05 0260 + 014267 1237 08 03 1 304173076 06 0260 + 014268 1237 08 04 1 304173076 07 0260 + 014269 9999 99 99 0 9999 99 9999 + 014270 9999 99 99 0 9999 99 9999 + 014271 9999 99 99 0 9999 99 9999 + 014272 9999 99 99 0 9999 99 9999 + 014273 1237 09 01 1 306376728 00 1045 + 014274 1237 09 02 1 306376728 01 1045 + 014275 1237 09 03 1 306376728 02 1045 + 014276 1237 09 04 1 306376728 03 1045 + 014277 1237 09 05 1 306376728 04 1045 + 014278 1237 09 06 1 306376728 05 1045 + 014279 1237 09 07 1 306376728 06 1045 + 014280 1237 09 08 1 306376728 07 1045 + 014281 1237 10 01 1 306376728 08 1045 + 014282 1237 10 02 1 306376728 09 1045 + 014283 1237 10 03 1 306376728 10 1045 + 014284 1237 10 04 1 306376728 11 1045 + 014285 1237 10 05 1 306376728 12 1045 + 014286 1237 10 06 1 306376728 13 1045 + 014287 1237 10 07 1 306376728 14 1045 + 014288 1237 10 08 1 306376728 15 1045 + 014289 1237 11 01 1 306376724 00 1044 + 014290 1237 11 02 1 306376724 01 1044 + 014291 1237 11 03 1 306376724 02 1044 + 014292 1237 11 04 1 306376724 03 1044 + 014293 1237 11 05 1 306376724 04 1044 + 014294 1237 11 06 1 306376724 05 1044 + 014295 1237 11 07 1 306376724 06 1044 + 014296 1237 11 08 1 306376724 07 1044 + 014297 1237 12 01 1 306376724 08 1044 + 014298 1237 12 02 1 306376724 09 1044 + 014299 1237 12 03 1 306376724 10 1044 + 014300 1237 12 04 1 306376724 11 1044 + 014301 1237 12 05 1 306376724 12 1044 + 014302 1237 12 06 1 306376724 13 1044 + 014303 1237 12 07 1 306376724 14 1044 + 014304 1237 12 08 1 306376724 15 1044 + 014305 1237 13 01 1 306376736 00 1047 + 014306 1237 13 02 1 306376736 01 1047 + 014307 1237 13 03 1 306376736 02 1047 + 014308 1237 13 04 1 306376736 03 1047 + 014309 1237 13 05 1 306376736 04 1047 + 014310 1237 13 06 1 306376736 05 1047 + 014311 1237 13 07 1 306376736 06 1047 + 014312 1237 13 08 1 306376736 07 1047 + 014313 1237 14 01 1 306376736 08 1047 + 014314 1237 14 02 1 306376736 09 1047 + 014315 1237 14 03 1 306376736 10 1047 + 014316 1237 14 04 1 306376736 11 1047 + 014317 1237 14 05 1 306376736 12 1047 + 014318 1237 14 06 1 306376736 13 1047 + 014319 1237 14 07 1 306376736 14 1047 + 014320 1237 14 08 1 306376736 15 1047 + 014321 1237 15 01 1 306376732 00 1046 + 014322 1237 15 02 1 306376732 01 1046 + 014323 1237 15 03 1 306376732 02 1046 + 014324 1237 15 04 1 306376732 03 1046 + 014325 1237 15 05 1 306376732 04 1046 + 014326 1237 15 06 1 306376732 05 1046 + 014327 1237 15 07 1 306376732 06 1046 + 014328 1237 15 08 1 306376732 07 1046 + 014329 1237 16 01 1 306376732 08 1046 + 014330 1237 16 02 1 306376732 09 1046 + 014331 1237 16 03 1 306376732 10 1046 + 014332 1237 16 04 1 306376732 11 1046 + 014333 1237 16 05 1 306376732 12 1046 + 014334 1237 16 06 1 306376732 13 1046 + 014335 1237 16 07 1 306376732 14 1046 + 014336 1237 16 08 1 306376732 15 1046 + 014337 1237 17 01 1 303075356 12 0070 + 014338 1237 17 02 1 303075356 13 0070 + 014339 9999 99 99 0 9999 99 9999 + 014340 9999 99 99 0 9999 99 9999 + 014341 9999 99 99 0 9999 99 9999 + 014342 9999 99 99 0 9999 99 9999 + 014343 9999 99 99 0 9999 99 9999 + 014344 9999 99 99 0 9999 99 9999 + 014345 1237 18 01 1 303075356 14 0070 + 014346 1237 18 02 1 303075356 15 0070 + 014347 9999 99 99 0 9999 99 9999 + 014348 9999 99 99 0 9999 99 9999 + 014349 9999 99 99 0 9999 99 9999 + 014350 9999 99 99 0 9999 99 9999 + 014351 9999 99 99 0 9999 99 9999 + 014352 9999 99 99 0 9999 99 9999 + 014353 1237 19 01 1 303075356 08 0070 + 014354 1237 19 02 1 303075356 09 0070 + 014355 9999 99 99 0 9999 99 9999 + 014356 9999 99 99 0 9999 99 9999 + 014357 9999 99 99 0 9999 99 9999 + 014358 9999 99 99 0 9999 99 9999 + 014359 9999 99 99 0 9999 99 9999 + 014360 9999 99 99 0 9999 99 9999 + 014361 1237 20 01 1 303075356 10 0070 + 014362 1237 20 02 1 303075356 11 0070 + 014363 9999 99 99 0 9999 99 9999 + 014364 9999 99 99 0 9999 99 9999 + 014365 9999 99 99 0 9999 99 9999 + 014366 9999 99 99 0 9999 99 9999 + 014367 9999 99 99 0 9999 99 9999 + 014368 9999 99 99 0 9999 99 9999 + 014369 1237 21 01 1 303075356 00 0070 + 014370 1237 21 02 1 303075356 01 0070 + 014371 9999 99 99 0 9999 99 9999 + 014372 9999 99 99 0 9999 99 9999 + 014373 9999 99 99 0 9999 99 9999 + 014374 9999 99 99 0 9999 99 9999 + 014375 9999 99 99 0 9999 99 9999 + 014376 9999 99 99 0 9999 99 9999 + 014377 1237 22 01 1 303075356 02 0070 + 014378 1237 22 02 1 303075356 03 0070 + 014379 9999 99 99 0 9999 99 9999 + 014380 9999 99 99 0 9999 99 9999 + 014381 9999 99 99 0 9999 99 9999 + 014382 9999 99 99 0 9999 99 9999 + 014383 9999 99 99 0 9999 99 9999 + 014384 9999 99 99 0 9999 99 9999 + 014385 1237 23 01 1 303075356 04 0070 + 014386 1237 23 02 1 303075356 05 0070 + 014387 9999 99 99 0 9999 99 9999 + 014388 9999 99 99 0 9999 99 9999 + 014389 9999 99 99 0 9999 99 9999 + 014390 9999 99 99 0 9999 99 9999 + 014391 9999 99 99 0 9999 99 9999 + 014392 9999 99 99 0 9999 99 9999 + 014393 1237 24 01 1 303075356 06 0070 + 014394 1237 24 02 1 303075356 07 0070 + 014395 9999 99 99 0 9999 99 9999 + 014396 9999 99 99 0 9999 99 9999 + 014397 9999 99 99 0 9999 99 9999 + 014398 9999 99 99 0 9999 99 9999 + 014399 9999 99 99 0 9999 99 9999 + 014400 9999 99 99 0 9999 99 9999 + 014401 1237 25 01 1 305266716 00 0574 + 014402 1237 25 02 1 305266716 01 0574 + 014403 1237 25 03 1 305266716 02 0574 + 014404 1237 25 04 1 305266716 03 0574 + 014405 1237 25 05 1 305266716 04 0574 + 014406 1237 25 06 1 305266716 05 0574 + 014407 1237 25 07 1 305266716 06 0574 + 014408 1237 25 08 1 305266716 07 0574 + 014409 1237 26 01 1 305266716 08 0574 + 014410 1237 26 02 1 305266716 09 0574 + 014411 1237 26 03 1 305266716 10 0574 + 014412 1237 26 04 1 305266716 11 0574 + 014413 1237 26 05 1 305266716 12 0574 + 014414 1237 26 06 1 305266716 13 0574 + 014415 1237 26 07 1 305266716 14 0574 + 014416 1237 26 08 1 305266716 15 0574 + 014417 1237 27 01 1 305266720 00 0575 + 014418 1237 27 02 1 305266720 01 0575 + 014419 1237 27 03 1 305266720 02 0575 + 014420 1237 27 04 1 305266720 03 0575 + 014421 1237 27 05 1 305266720 04 0575 + 014422 1237 27 06 1 305266720 05 0575 + 014423 1237 27 07 1 305266720 06 0575 + 014424 1237 27 08 1 305266720 07 0575 + 014425 1237 28 01 1 305266720 08 0575 + 014426 1237 28 02 1 305266720 09 0575 + 014427 1237 28 03 1 305266720 10 0575 + 014428 1237 28 04 1 305266720 11 0575 + 014429 1237 28 05 1 305266720 12 0575 + 014430 1237 28 06 1 305266720 13 0575 + 014431 1237 28 07 1 305266720 14 0575 + 014432 1237 28 08 1 305266720 15 0575 + 014433 1237 29 01 1 305266708 00 0572 + 014434 1237 29 02 1 305266708 01 0572 + 014435 1237 29 03 1 305266708 02 0572 + 014436 1237 29 04 1 305266708 03 0572 + 014437 1237 29 05 1 305266708 04 0572 + 014438 1237 29 06 1 305266708 05 0572 + 014439 1237 29 07 1 305266708 06 0572 + 014440 1237 29 08 1 305266708 07 0572 + 014441 1237 30 01 1 305266708 08 0572 + 014442 1237 30 02 1 305266708 09 0572 + 014443 1237 30 03 1 305266708 10 0572 + 014444 1237 30 04 1 305266708 11 0572 + 014445 1237 30 05 1 305266708 12 0572 + 014446 1237 30 06 1 305266708 13 0572 + 014447 1237 30 07 1 305266708 14 0572 + 014448 1237 30 08 1 305266708 15 0572 + 014449 1237 31 01 1 305266712 00 0573 + 014450 1237 31 02 1 305266712 01 0573 + 014451 1237 31 03 1 305266712 02 0573 + 014452 1237 31 04 1 305266712 03 0573 + 014453 1237 31 05 1 305266712 04 0573 + 014454 1237 31 06 1 305266712 05 0573 + 014455 1237 31 07 1 305266712 06 0573 + 014456 1237 31 08 1 305266712 07 0573 + 014457 1237 32 01 1 305266712 08 0573 + 014458 1237 32 02 1 305266712 09 0573 + 014459 1237 32 03 1 305266712 10 0573 + 014460 1237 32 04 1 305266712 11 0573 + 014461 1237 32 05 1 305266712 12 0573 + 014462 1237 32 06 1 305266712 13 0573 + 014463 1237 32 07 1 305266712 14 0573 + 014464 1237 32 08 1 305266712 15 0573 + 014465 1237 33 01 1 306380824 00 1053 + 014466 1237 33 02 1 306380824 01 1053 + 014467 1237 33 03 1 306380824 02 1053 + 014468 1237 33 04 1 306380824 03 1053 + 014469 1237 33 05 1 306380824 04 1053 + 014470 1237 33 06 1 306380824 05 1053 + 014471 1237 33 07 1 306380824 06 1053 + 014472 1237 33 08 1 306380824 07 1053 + 014473 1237 34 01 1 306380824 08 1053 + 014474 1237 34 02 1 306380824 09 1053 + 014475 1237 34 03 1 306380824 10 1053 + 014476 1237 34 04 1 306380824 11 1053 + 014477 1237 34 05 1 306380824 12 1053 + 014478 1237 34 06 1 306380824 13 1053 + 014479 1237 34 07 1 306380824 14 1053 + 014480 1237 34 08 1 306380824 15 1053 + 014481 1237 35 01 1 306380820 00 1052 + 014482 1237 35 02 1 306380820 01 1052 + 014483 1237 35 03 1 306380820 02 1052 + 014484 1237 35 04 1 306380820 03 1052 + 014485 1237 35 05 1 306380820 04 1052 + 014486 1237 35 06 1 306380820 05 1052 + 014487 1237 35 07 1 306380820 06 1052 + 014488 1237 35 08 1 306380820 07 1052 + 014489 1237 36 01 1 306380820 08 1052 + 014490 1237 36 02 1 306380820 09 1052 + 014491 1237 36 03 1 306380820 10 1052 + 014492 1237 36 04 1 306380820 11 1052 + 014493 1237 36 05 1 306380820 12 1052 + 014494 1237 36 06 1 306380820 13 1052 + 014495 1237 36 07 1 306380820 14 1052 + 014496 1237 36 08 1 306380820 15 1052 + 014497 1237 37 01 1 306380832 00 1055 + 014498 1237 37 02 1 306380832 01 1055 + 014499 1237 37 03 1 306380832 02 1055 + 014500 1237 37 04 1 306380832 03 1055 + 014501 1237 37 05 1 306380832 04 1055 + 014502 1237 37 06 1 306380832 05 1055 + 014503 1237 37 07 1 306380832 06 1055 + 014504 1237 37 08 1 306380832 07 1055 + 014505 1237 38 01 1 306380832 08 1055 + 014506 1237 38 02 1 306380832 09 1055 + 014507 1237 38 03 1 306380832 10 1055 + 014508 1237 38 04 1 306380832 11 1055 + 014509 1237 38 05 1 306380832 12 1055 + 014510 1237 38 06 1 306380832 13 1055 + 014511 1237 38 07 1 306380832 14 1055 + 014512 1237 38 08 1 306380832 15 1055 + 014513 1237 39 01 1 306380828 00 1054 + 014514 1237 39 02 1 306380828 01 1054 + 014515 1237 39 03 1 306380828 02 1054 + 014516 1237 39 04 1 306380828 03 1054 + 014517 1237 39 05 1 306380828 04 1054 + 014518 1237 39 06 1 306380828 05 1054 + 014519 1237 39 07 1 306380828 06 1054 + 014520 1237 39 08 1 306380828 07 1054 + 014521 1237 40 01 1 306380828 08 1054 + 014522 1237 40 02 1 306380828 09 1054 + 014523 1237 40 03 1 306380828 10 1054 + 014524 1237 40 04 1 306380828 11 1054 + 014525 1237 40 05 1 306380828 12 1054 + 014526 1237 40 06 1 306380828 13 1054 + 014527 1237 40 07 1 306380828 14 1054 + 014528 1237 40 08 1 306380828 15 1054 + 014529 1237 41 01 1 304173088 08 0263 + 014530 1237 41 02 1 304173088 09 0263 + 014531 1237 41 03 1 304173088 10 0263 + 014532 1237 41 04 1 304173088 11 0263 + 014533 9999 99 99 0 9999 99 9999 + 014534 9999 99 99 0 9999 99 9999 + 014535 9999 99 99 0 9999 99 9999 + 014536 9999 99 99 0 9999 99 9999 + 014537 1237 42 01 1 304173088 12 0263 + 014538 1237 42 02 1 304173088 13 0263 + 014539 1237 42 03 1 304173088 14 0263 + 014540 1237 42 04 1 304173088 15 0263 + 014541 9999 99 99 0 9999 99 9999 + 014542 9999 99 99 0 9999 99 9999 + 014543 9999 99 99 0 9999 99 9999 + 014544 9999 99 99 0 9999 99 9999 + 014545 1237 43 01 1 304173088 00 0263 + 014546 1237 43 02 1 304173088 01 0263 + 014547 1237 43 03 1 304173088 02 0263 + 014548 1237 43 04 1 304173088 03 0263 + 014549 9999 99 99 0 9999 99 9999 + 014550 9999 99 99 0 9999 99 9999 + 014551 9999 99 99 0 9999 99 9999 + 014552 9999 99 99 0 9999 99 9999 + 014553 1237 44 01 1 304173088 04 0263 + 014554 1237 44 02 1 304173088 05 0263 + 014555 1237 44 03 1 304173088 06 0263 + 014556 1237 44 04 1 304173088 07 0263 + 014557 9999 99 99 0 9999 99 9999 + 014558 9999 99 99 0 9999 99 9999 + 014559 9999 99 99 0 9999 99 9999 + 014560 9999 99 99 0 9999 99 9999 + 014561 1237 45 01 1 304173084 08 0262 + 014562 1237 45 02 1 304173084 09 0262 + 014563 1237 45 03 1 304173084 10 0262 + 014564 1237 45 04 1 304173084 11 0262 + 014565 9999 99 99 0 9999 99 9999 + 014566 9999 99 99 0 9999 99 9999 + 014567 9999 99 99 0 9999 99 9999 + 014568 9999 99 99 0 9999 99 9999 + 014569 1237 46 01 1 304173084 12 0262 + 014570 1237 46 02 1 304173084 13 0262 + 014571 1237 46 03 1 304173084 14 0262 + 014572 1237 46 04 1 304173084 15 0262 + 014573 9999 99 99 0 9999 99 9999 + 014574 9999 99 99 0 9999 99 9999 + 014575 9999 99 99 0 9999 99 9999 + 014576 9999 99 99 0 9999 99 9999 + 014577 1237 47 01 1 304173084 00 0262 + 014578 1237 47 02 1 304173084 01 0262 + 014579 1237 47 03 1 304173084 02 0262 + 014580 1237 47 04 1 304173084 03 0262 + 014581 9999 99 99 0 9999 99 9999 + 014582 9999 99 99 0 9999 99 9999 + 014583 9999 99 99 0 9999 99 9999 + 014584 9999 99 99 0 9999 99 9999 + 014585 1237 48 01 1 304173084 04 0262 + 014586 1237 48 02 1 304173084 05 0262 + 014587 1237 48 03 1 304173084 06 0262 + 014588 1237 48 04 1 304173084 07 0262 + 014589 9999 99 99 0 9999 99 9999 + 014590 9999 99 99 0 9999 99 9999 + 014591 9999 99 99 0 9999 99 9999 + 014592 9999 99 99 0 9999 99 9999 + 014593 1238 01 01 1 305270812 00 0582 + 014594 1238 01 02 1 305270812 01 0582 + 014595 1238 01 03 1 305270812 02 0582 + 014596 1238 01 04 1 305270812 03 0582 + 014597 1238 01 05 1 305270812 04 0582 + 014598 1238 01 06 1 305270812 05 0582 + 014599 1238 01 07 1 305270812 06 0582 + 014600 1238 01 08 1 305270812 07 0582 + 014601 1238 02 01 1 305270812 08 0582 + 014602 1238 02 02 1 305270812 09 0582 + 014603 1238 02 03 1 305270812 10 0582 + 014604 1238 02 04 1 305270812 11 0582 + 014605 1238 02 05 1 305270812 12 0582 + 014606 1238 02 06 1 305270812 13 0582 + 014607 1238 02 07 1 305270812 14 0582 + 014608 1238 02 08 1 305270812 15 0582 + 014609 1238 03 01 1 305270816 00 0583 + 014610 1238 03 02 1 305270816 01 0583 + 014611 1238 03 03 1 305270816 02 0583 + 014612 1238 03 04 1 305270816 03 0583 + 014613 1238 03 05 1 305270816 04 0583 + 014614 1238 03 06 1 305270816 05 0583 + 014615 1238 03 07 1 305270816 06 0583 + 014616 1238 03 08 1 305270816 07 0583 + 014617 1238 04 01 1 305270816 08 0583 + 014618 1238 04 02 1 305270816 09 0583 + 014619 1238 04 03 1 305270816 10 0583 + 014620 1238 04 04 1 305270816 11 0583 + 014621 1238 04 05 1 305270816 12 0583 + 014622 1238 04 06 1 305270816 13 0583 + 014623 1238 04 07 1 305270816 14 0583 + 014624 1238 04 08 1 305270816 15 0583 + 014625 1238 05 01 1 305270804 00 0580 + 014626 1238 05 02 1 305270804 01 0580 + 014627 1238 05 03 1 305270804 02 0580 + 014628 1238 05 04 1 305270804 03 0580 + 014629 1238 05 05 1 305270804 04 0580 + 014630 1238 05 06 1 305270804 05 0580 + 014631 1238 05 07 1 305270804 06 0580 + 014632 1238 05 08 1 305270804 07 0580 + 014633 1238 06 01 1 305270804 08 0580 + 014634 1238 06 02 1 305270804 09 0580 + 014635 1238 06 03 1 305270804 10 0580 + 014636 1238 06 04 1 305270804 11 0580 + 014637 1238 06 05 1 305270804 12 0580 + 014638 1238 06 06 1 305270804 13 0580 + 014639 1238 06 07 1 305270804 14 0580 + 014640 1238 06 08 1 305270804 15 0580 + 014641 1238 07 01 1 305270808 00 0581 + 014642 1238 07 02 1 305270808 01 0581 + 014643 1238 07 03 1 305270808 02 0581 + 014644 1238 07 04 1 305270808 03 0581 + 014645 1238 07 05 1 305270808 04 0581 + 014646 1238 07 06 1 305270808 05 0581 + 014647 1238 07 07 1 305270808 06 0581 + 014648 1238 07 08 1 305270808 07 0581 + 014649 1238 08 01 1 305270808 08 0581 + 014650 1238 08 02 1 305270808 09 0581 + 014651 1238 08 03 1 305270808 10 0581 + 014652 1238 08 04 1 305270808 11 0581 + 014653 1238 08 05 1 305270808 12 0581 + 014654 1238 08 06 1 305270808 13 0581 + 014655 1238 08 07 1 305270808 14 0581 + 014656 1238 08 08 1 305270808 15 0581 + 014657 9999 99 99 0 9999 99 9999 + 014658 9999 99 99 0 9999 99 9999 + 014659 9999 99 99 0 9999 99 9999 + 014660 9999 99 99 0 9999 99 9999 + 014661 9999 99 99 0 9999 99 9999 + 014662 9999 99 99 0 9999 99 9999 + 014663 9999 99 99 0 9999 99 9999 + 014664 9999 99 99 0 9999 99 9999 + 014665 9999 99 99 0 9999 99 9999 + 014666 9999 99 99 0 9999 99 9999 + 014667 9999 99 99 0 9999 99 9999 + 014668 9999 99 99 0 9999 99 9999 + 014669 9999 99 99 0 9999 99 9999 + 014670 9999 99 99 0 9999 99 9999 + 014671 9999 99 99 0 9999 99 9999 + 014672 9999 99 99 0 9999 99 9999 + 014673 9999 99 99 0 9999 99 9999 + 014674 9999 99 99 0 9999 99 9999 + 014675 9999 99 99 0 9999 99 9999 + 014676 9999 99 99 0 9999 99 9999 + 014677 9999 99 99 0 9999 99 9999 + 014678 9999 99 99 0 9999 99 9999 + 014679 9999 99 99 0 9999 99 9999 + 014680 9999 99 99 0 9999 99 9999 + 014681 9999 99 99 0 9999 99 9999 + 014682 9999 99 99 0 9999 99 9999 + 014683 9999 99 99 0 9999 99 9999 + 014684 9999 99 99 0 9999 99 9999 + 014685 9999 99 99 0 9999 99 9999 + 014686 9999 99 99 0 9999 99 9999 + 014687 9999 99 99 0 9999 99 9999 + 014688 9999 99 99 0 9999 99 9999 + 014689 9999 99 99 0 9999 99 9999 + 014690 9999 99 99 0 9999 99 9999 + 014691 9999 99 99 0 9999 99 9999 + 014692 9999 99 99 0 9999 99 9999 + 014693 9999 99 99 0 9999 99 9999 + 014694 9999 99 99 0 9999 99 9999 + 014695 9999 99 99 0 9999 99 9999 + 014696 9999 99 99 0 9999 99 9999 + 014697 9999 99 99 0 9999 99 9999 + 014698 9999 99 99 0 9999 99 9999 + 014699 9999 99 99 0 9999 99 9999 + 014700 9999 99 99 0 9999 99 9999 + 014701 9999 99 99 0 9999 99 9999 + 014702 9999 99 99 0 9999 99 9999 + 014703 9999 99 99 0 9999 99 9999 + 014704 9999 99 99 0 9999 99 9999 + 014705 9999 99 99 0 9999 99 9999 + 014706 9999 99 99 0 9999 99 9999 + 014707 9999 99 99 0 9999 99 9999 + 014708 9999 99 99 0 9999 99 9999 + 014709 9999 99 99 0 9999 99 9999 + 014710 9999 99 99 0 9999 99 9999 + 014711 9999 99 99 0 9999 99 9999 + 014712 9999 99 99 0 9999 99 9999 + 014713 9999 99 99 0 9999 99 9999 + 014714 9999 99 99 0 9999 99 9999 + 014715 9999 99 99 0 9999 99 9999 + 014716 9999 99 99 0 9999 99 9999 + 014717 9999 99 99 0 9999 99 9999 + 014718 9999 99 99 0 9999 99 9999 + 014719 9999 99 99 0 9999 99 9999 + 014720 9999 99 99 0 9999 99 9999 + 014721 9999 99 99 0 9999 99 9999 + 014722 9999 99 99 0 9999 99 9999 + 014723 9999 99 99 0 9999 99 9999 + 014724 9999 99 99 0 9999 99 9999 + 014725 9999 99 99 0 9999 99 9999 + 014726 9999 99 99 0 9999 99 9999 + 014727 9999 99 99 0 9999 99 9999 + 014728 9999 99 99 0 9999 99 9999 + 014729 9999 99 99 0 9999 99 9999 + 014730 9999 99 99 0 9999 99 9999 + 014731 9999 99 99 0 9999 99 9999 + 014732 9999 99 99 0 9999 99 9999 + 014733 9999 99 99 0 9999 99 9999 + 014734 9999 99 99 0 9999 99 9999 + 014735 9999 99 99 0 9999 99 9999 + 014736 9999 99 99 0 9999 99 9999 + 014737 9999 99 99 0 9999 99 9999 + 014738 9999 99 99 0 9999 99 9999 + 014739 9999 99 99 0 9999 99 9999 + 014740 9999 99 99 0 9999 99 9999 + 014741 9999 99 99 0 9999 99 9999 + 014742 9999 99 99 0 9999 99 9999 + 014743 9999 99 99 0 9999 99 9999 + 014744 9999 99 99 0 9999 99 9999 + 014745 9999 99 99 0 9999 99 9999 + 014746 9999 99 99 0 9999 99 9999 + 014747 9999 99 99 0 9999 99 9999 + 014748 9999 99 99 0 9999 99 9999 + 014749 9999 99 99 0 9999 99 9999 + 014750 9999 99 99 0 9999 99 9999 + 014751 9999 99 99 0 9999 99 9999 + 014752 9999 99 99 0 9999 99 9999 + 014753 9999 99 99 0 9999 99 9999 + 014754 9999 99 99 0 9999 99 9999 + 014755 9999 99 99 0 9999 99 9999 + 014756 9999 99 99 0 9999 99 9999 + 014757 9999 99 99 0 9999 99 9999 + 014758 9999 99 99 0 9999 99 9999 + 014759 9999 99 99 0 9999 99 9999 + 014760 9999 99 99 0 9999 99 9999 + 014761 9999 99 99 0 9999 99 9999 + 014762 9999 99 99 0 9999 99 9999 + 014763 9999 99 99 0 9999 99 9999 + 014764 9999 99 99 0 9999 99 9999 + 014765 9999 99 99 0 9999 99 9999 + 014766 9999 99 99 0 9999 99 9999 + 014767 9999 99 99 0 9999 99 9999 + 014768 9999 99 99 0 9999 99 9999 + 014769 9999 99 99 0 9999 99 9999 + 014770 9999 99 99 0 9999 99 9999 + 014771 9999 99 99 0 9999 99 9999 + 014772 9999 99 99 0 9999 99 9999 + 014773 9999 99 99 0 9999 99 9999 + 014774 9999 99 99 0 9999 99 9999 + 014775 9999 99 99 0 9999 99 9999 + 014776 9999 99 99 0 9999 99 9999 + 014777 9999 99 99 0 9999 99 9999 + 014778 9999 99 99 0 9999 99 9999 + 014779 9999 99 99 0 9999 99 9999 + 014780 9999 99 99 0 9999 99 9999 + 014781 9999 99 99 0 9999 99 9999 + 014782 9999 99 99 0 9999 99 9999 + 014783 9999 99 99 0 9999 99 9999 + 014784 9999 99 99 0 9999 99 9999 + 014785 1238 25 01 1 305258524 00 0558 + 014786 1238 25 02 1 305258524 01 0558 + 014787 1238 25 03 1 305258524 02 0558 + 014788 1238 25 04 1 305258524 03 0558 + 014789 1238 25 05 1 305258524 04 0558 + 014790 1238 25 06 1 305258524 05 0558 + 014791 1238 25 07 1 305258524 06 0558 + 014792 1238 25 08 1 305258524 07 0558 + 014793 1238 26 01 1 305258524 08 0558 + 014794 1238 26 02 1 305258524 09 0558 + 014795 1238 26 03 1 305258524 10 0558 + 014796 1238 26 04 1 305258524 11 0558 + 014797 1238 26 05 1 305258524 12 0558 + 014798 1238 26 06 1 305258524 13 0558 + 014799 1238 26 07 1 305258524 14 0558 + 014800 1238 26 08 1 305258524 15 0558 + 014801 1238 27 01 1 305258528 00 0559 + 014802 1238 27 02 1 305258528 01 0559 + 014803 1238 27 03 1 305258528 02 0559 + 014804 1238 27 04 1 305258528 03 0559 + 014805 1238 27 05 1 305258528 04 0559 + 014806 1238 27 06 1 305258528 05 0559 + 014807 1238 27 07 1 305258528 06 0559 + 014808 1238 27 08 1 305258528 07 0559 + 014809 1238 28 01 1 305258528 08 0559 + 014810 1238 28 02 1 305258528 09 0559 + 014811 1238 28 03 1 305258528 10 0559 + 014812 1238 28 04 1 305258528 11 0559 + 014813 1238 28 05 1 305258528 12 0559 + 014814 1238 28 06 1 305258528 13 0559 + 014815 1238 28 07 1 305258528 14 0559 + 014816 1238 28 08 1 305258528 15 0559 + 014817 1238 29 01 1 305258516 00 0556 + 014818 1238 29 02 1 305258516 01 0556 + 014819 1238 29 03 1 305258516 02 0556 + 014820 1238 29 04 1 305258516 03 0556 + 014821 1238 29 05 1 305258516 04 0556 + 014822 1238 29 06 1 305258516 05 0556 + 014823 1238 29 07 1 305258516 06 0556 + 014824 1238 29 08 1 305258516 07 0556 + 014825 1238 30 01 1 305258516 08 0556 + 014826 1238 30 02 1 305258516 09 0556 + 014827 1238 30 03 1 305258516 10 0556 + 014828 1238 30 04 1 305258516 11 0556 + 014829 1238 30 05 1 305258516 12 0556 + 014830 1238 30 06 1 305258516 13 0556 + 014831 1238 30 07 1 305258516 14 0556 + 014832 1238 30 08 1 305258516 15 0556 + 014833 1238 31 01 1 305258520 00 0557 + 014834 1238 31 02 1 305258520 01 0557 + 014835 1238 31 03 1 305258520 02 0557 + 014836 1238 31 04 1 305258520 03 0557 + 014837 1238 31 05 1 305258520 04 0557 + 014838 1238 31 06 1 305258520 05 0557 + 014839 1238 31 07 1 305258520 06 0557 + 014840 1238 31 08 1 305258520 07 0557 + 014841 1238 32 01 1 305258520 08 0557 + 014842 1238 32 02 1 305258520 09 0557 + 014843 1238 32 03 1 305258520 10 0557 + 014844 1238 32 04 1 305258520 11 0557 + 014845 1238 32 05 1 305258520 12 0557 + 014846 1238 32 06 1 305258520 13 0557 + 014847 1238 32 07 1 305258520 14 0557 + 014848 1238 32 08 1 305258520 15 0557 + 014849 1238 33 01 1 305262616 00 0565 + 014850 1238 33 02 1 305262616 01 0565 + 014851 1238 33 03 1 305262616 02 0565 + 014852 1238 33 04 1 305262616 03 0565 + 014853 1238 33 05 1 305262616 04 0565 + 014854 1238 33 06 1 305262616 05 0565 + 014855 1238 33 07 1 305262616 06 0565 + 014856 1238 33 08 1 305262616 07 0565 + 014857 1238 34 01 1 305262616 08 0565 + 014858 1238 34 02 1 305262616 09 0565 + 014859 1238 34 03 1 305262616 10 0565 + 014860 1238 34 04 1 305262616 11 0565 + 014861 1238 34 05 1 305262616 12 0565 + 014862 1238 34 06 1 305262616 13 0565 + 014863 1238 34 07 1 305262616 14 0565 + 014864 1238 34 08 1 305262616 15 0565 + 014865 1238 35 01 1 305262612 00 0564 + 014866 1238 35 02 1 305262612 01 0564 + 014867 1238 35 03 1 305262612 02 0564 + 014868 1238 35 04 1 305262612 03 0564 + 014869 1238 35 05 1 305262612 04 0564 + 014870 1238 35 06 1 305262612 05 0564 + 014871 1238 35 07 1 305262612 06 0564 + 014872 1238 35 08 1 305262612 07 0564 + 014873 1238 36 01 1 305262612 08 0564 + 014874 1238 36 02 1 305262612 09 0564 + 014875 1238 36 03 1 305262612 10 0564 + 014876 1238 36 04 1 305262612 11 0564 + 014877 1238 36 05 1 305262612 12 0564 + 014878 1238 36 06 1 305262612 13 0564 + 014879 1238 36 07 1 305262612 14 0564 + 014880 1238 36 08 1 305262612 15 0564 + 014881 1238 37 01 1 305262624 00 0567 + 014882 1238 37 02 1 305262624 01 0567 + 014883 1238 37 03 1 305262624 02 0567 + 014884 1238 37 04 1 305262624 03 0567 + 014885 1238 37 05 1 305262624 04 0567 + 014886 1238 37 06 1 305262624 05 0567 + 014887 1238 37 07 1 305262624 06 0567 + 014888 1238 37 08 1 305262624 07 0567 + 014889 1238 38 01 1 305262624 08 0567 + 014890 1238 38 02 1 305262624 09 0567 + 014891 1238 38 03 1 305262624 10 0567 + 014892 1238 38 04 1 305262624 11 0567 + 014893 1238 38 05 1 305262624 12 0567 + 014894 1238 38 06 1 305262624 13 0567 + 014895 1238 38 07 1 305262624 14 0567 + 014896 1238 38 08 1 305262624 15 0567 + 014897 1238 39 01 1 305262620 00 0566 + 014898 1238 39 02 1 305262620 01 0566 + 014899 1238 39 03 1 305262620 02 0566 + 014900 1238 39 04 1 305262620 03 0566 + 014901 1238 39 05 1 305262620 04 0566 + 014902 1238 39 06 1 305262620 05 0566 + 014903 1238 39 07 1 305262620 06 0566 + 014904 1238 39 08 1 305262620 07 0566 + 014905 1238 40 01 1 305262620 08 0566 + 014906 1238 40 02 1 305262620 09 0566 + 014907 1238 40 03 1 305262620 10 0566 + 014908 1238 40 04 1 305262620 11 0566 + 014909 1238 40 05 1 305262620 12 0566 + 014910 1238 40 06 1 305262620 13 0566 + 014911 1238 40 07 1 305262620 14 0566 + 014912 1238 40 08 1 305262620 15 0566 + 014913 9999 99 99 0 9999 99 9999 + 014914 9999 99 99 0 9999 99 9999 + 014915 9999 99 99 0 9999 99 9999 + 014916 9999 99 99 0 9999 99 9999 + 014917 9999 99 99 0 9999 99 9999 + 014918 9999 99 99 0 9999 99 9999 + 014919 9999 99 99 0 9999 99 9999 + 014920 9999 99 99 0 9999 99 9999 + 014921 9999 99 99 0 9999 99 9999 + 014922 9999 99 99 0 9999 99 9999 + 014923 9999 99 99 0 9999 99 9999 + 014924 9999 99 99 0 9999 99 9999 + 014925 9999 99 99 0 9999 99 9999 + 014926 9999 99 99 0 9999 99 9999 + 014927 9999 99 99 0 9999 99 9999 + 014928 9999 99 99 0 9999 99 9999 + 014929 9999 99 99 0 9999 99 9999 + 014930 9999 99 99 0 9999 99 9999 + 014931 9999 99 99 0 9999 99 9999 + 014932 9999 99 99 0 9999 99 9999 + 014933 9999 99 99 0 9999 99 9999 + 014934 9999 99 99 0 9999 99 9999 + 014935 9999 99 99 0 9999 99 9999 + 014936 9999 99 99 0 9999 99 9999 + 014937 9999 99 99 0 9999 99 9999 + 014938 9999 99 99 0 9999 99 9999 + 014939 9999 99 99 0 9999 99 9999 + 014940 9999 99 99 0 9999 99 9999 + 014941 9999 99 99 0 9999 99 9999 + 014942 9999 99 99 0 9999 99 9999 + 014943 9999 99 99 0 9999 99 9999 + 014944 9999 99 99 0 9999 99 9999 + 014945 9999 99 99 0 9999 99 9999 + 014946 9999 99 99 0 9999 99 9999 + 014947 9999 99 99 0 9999 99 9999 + 014948 9999 99 99 0 9999 99 9999 + 014949 9999 99 99 0 9999 99 9999 + 014950 9999 99 99 0 9999 99 9999 + 014951 9999 99 99 0 9999 99 9999 + 014952 9999 99 99 0 9999 99 9999 + 014953 9999 99 99 0 9999 99 9999 + 014954 9999 99 99 0 9999 99 9999 + 014955 9999 99 99 0 9999 99 9999 + 014956 9999 99 99 0 9999 99 9999 + 014957 9999 99 99 0 9999 99 9999 + 014958 9999 99 99 0 9999 99 9999 + 014959 9999 99 99 0 9999 99 9999 + 014960 9999 99 99 0 9999 99 9999 + 014961 9999 99 99 0 9999 99 9999 + 014962 9999 99 99 0 9999 99 9999 + 014963 9999 99 99 0 9999 99 9999 + 014964 9999 99 99 0 9999 99 9999 + 014965 9999 99 99 0 9999 99 9999 + 014966 9999 99 99 0 9999 99 9999 + 014967 9999 99 99 0 9999 99 9999 + 014968 9999 99 99 0 9999 99 9999 + 014969 9999 99 99 0 9999 99 9999 + 014970 9999 99 99 0 9999 99 9999 + 014971 9999 99 99 0 9999 99 9999 + 014972 9999 99 99 0 9999 99 9999 + 014973 9999 99 99 0 9999 99 9999 + 014974 9999 99 99 0 9999 99 9999 + 014975 9999 99 99 0 9999 99 9999 + 014976 9999 99 99 0 9999 99 9999 + 014977 1239 01 01 1 303071252 08 0060 + 014978 1239 01 02 1 303071252 09 0060 + 014979 9999 99 99 0 9999 99 9999 + 014980 9999 99 99 0 9999 99 9999 + 014981 9999 99 99 0 9999 99 9999 + 014982 9999 99 99 0 9999 99 9999 + 014983 9999 99 99 0 9999 99 9999 + 014984 9999 99 99 0 9999 99 9999 + 014985 1239 02 01 1 303071252 10 0060 + 014986 1239 02 02 1 303071252 11 0060 + 014987 9999 99 99 0 9999 99 9999 + 014988 9999 99 99 0 9999 99 9999 + 014989 9999 99 99 0 9999 99 9999 + 014990 9999 99 99 0 9999 99 9999 + 014991 9999 99 99 0 9999 99 9999 + 014992 9999 99 99 0 9999 99 9999 + 014993 1239 03 01 1 303071252 12 0060 + 014994 1239 03 02 1 303071252 13 0060 + 014995 9999 99 99 0 9999 99 9999 + 014996 9999 99 99 0 9999 99 9999 + 014997 9999 99 99 0 9999 99 9999 + 014998 9999 99 99 0 9999 99 9999 + 014999 9999 99 99 0 9999 99 9999 + 015000 9999 99 99 0 9999 99 9999 + 015001 1239 04 01 1 303071252 14 0060 + 015002 1239 04 02 1 303071252 15 0060 + 015003 9999 99 99 0 9999 99 9999 + 015004 9999 99 99 0 9999 99 9999 + 015005 9999 99 99 0 9999 99 9999 + 015006 9999 99 99 0 9999 99 9999 + 015007 9999 99 99 0 9999 99 9999 + 015008 9999 99 99 0 9999 99 9999 + 015009 1239 05 01 1 303071252 00 0060 + 015010 1239 05 02 1 303071252 01 0060 + 015011 9999 99 99 0 9999 99 9999 + 015012 9999 99 99 0 9999 99 9999 + 015013 9999 99 99 0 9999 99 9999 + 015014 9999 99 99 0 9999 99 9999 + 015015 9999 99 99 0 9999 99 9999 + 015016 9999 99 99 0 9999 99 9999 + 015017 1239 06 01 1 303071252 02 0060 + 015018 1239 06 02 1 303071252 03 0060 + 015019 9999 99 99 0 9999 99 9999 + 015020 9999 99 99 0 9999 99 9999 + 015021 9999 99 99 0 9999 99 9999 + 015022 9999 99 99 0 9999 99 9999 + 015023 9999 99 99 0 9999 99 9999 + 015024 9999 99 99 0 9999 99 9999 + 015025 1239 07 01 1 303071252 04 0060 + 015026 1239 07 02 1 303071252 05 0060 + 015027 9999 99 99 0 9999 99 9999 + 015028 9999 99 99 0 9999 99 9999 + 015029 9999 99 99 0 9999 99 9999 + 015030 9999 99 99 0 9999 99 9999 + 015031 9999 99 99 0 9999 99 9999 + 015032 9999 99 99 0 9999 99 9999 + 015033 1239 08 01 1 303071252 06 0060 + 015034 1239 08 02 1 303071252 07 0060 + 015035 9999 99 99 0 9999 99 9999 + 015036 9999 99 99 0 9999 99 9999 + 015037 9999 99 99 0 9999 99 9999 + 015038 9999 99 99 0 9999 99 9999 + 015039 9999 99 99 0 9999 99 9999 + 015040 9999 99 99 0 9999 99 9999 + 015041 1239 09 01 1 304160792 00 0237 + 015042 1239 09 02 1 304160792 01 0237 + 015043 1239 09 03 1 304160792 02 0237 + 015044 1239 09 04 1 304160792 03 0237 + 015045 9999 99 99 0 9999 99 9999 + 015046 9999 99 99 0 9999 99 9999 + 015047 9999 99 99 0 9999 99 9999 + 015048 9999 99 99 0 9999 99 9999 + 015049 1239 10 01 1 304160792 04 0237 + 015050 1239 10 02 1 304160792 05 0237 + 015051 1239 10 03 1 304160792 06 0237 + 015052 1239 10 04 1 304160792 07 0237 + 015053 9999 99 99 0 9999 99 9999 + 015054 9999 99 99 0 9999 99 9999 + 015055 9999 99 99 0 9999 99 9999 + 015056 9999 99 99 0 9999 99 9999 + 015057 1239 11 01 1 304160792 08 0237 + 015058 1239 11 02 1 304160792 09 0237 + 015059 1239 11 03 1 304160792 10 0237 + 015060 1239 11 04 1 304160792 11 0237 + 015061 9999 99 99 0 9999 99 9999 + 015062 9999 99 99 0 9999 99 9999 + 015063 9999 99 99 0 9999 99 9999 + 015064 9999 99 99 0 9999 99 9999 + 015065 1239 12 01 1 304160792 12 0237 + 015066 1239 12 02 1 304160792 13 0237 + 015067 1239 12 03 1 304160792 14 0237 + 015068 1239 12 04 1 304160792 15 0237 + 015069 9999 99 99 0 9999 99 9999 + 015070 9999 99 99 0 9999 99 9999 + 015071 9999 99 99 0 9999 99 9999 + 015072 9999 99 99 0 9999 99 9999 + 015073 1239 13 01 1 304160788 08 0236 + 015074 1239 13 02 1 304160788 09 0236 + 015075 1239 13 03 1 304160788 10 0236 + 015076 1239 13 04 1 304160788 11 0236 + 015077 9999 99 99 0 9999 99 9999 + 015078 9999 99 99 0 9999 99 9999 + 015079 9999 99 99 0 9999 99 9999 + 015080 9999 99 99 0 9999 99 9999 + 015081 1239 14 01 1 304160788 12 0236 + 015082 1239 14 02 1 304160788 13 0236 + 015083 1239 14 03 1 304160788 14 0236 + 015084 1239 14 04 1 304160788 15 0236 + 015085 9999 99 99 0 9999 99 9999 + 015086 9999 99 99 0 9999 99 9999 + 015087 9999 99 99 0 9999 99 9999 + 015088 9999 99 99 0 9999 99 9999 + 015089 1239 15 01 1 304160788 00 0236 + 015090 1239 15 02 1 304160788 01 0236 + 015091 1239 15 03 1 304160788 02 0236 + 015092 1239 15 04 1 304160788 03 0236 + 015093 9999 99 99 0 9999 99 9999 + 015094 9999 99 99 0 9999 99 9999 + 015095 9999 99 99 0 9999 99 9999 + 015096 9999 99 99 0 9999 99 9999 + 015097 1239 16 01 1 304160788 04 0236 + 015098 1239 16 02 1 304160788 05 0236 + 015099 1239 16 03 1 304160788 06 0236 + 015100 1239 16 04 1 304160788 07 0236 + 015101 9999 99 99 0 9999 99 9999 + 015102 9999 99 99 0 9999 99 9999 + 015103 9999 99 99 0 9999 99 9999 + 015104 9999 99 99 0 9999 99 9999 + 015105 1239 17 01 1 306352156 00 0998 + 015106 1239 17 02 1 306352156 01 0998 + 015107 1239 17 03 1 306352156 02 0998 + 015108 1239 17 04 1 306352156 03 0998 + 015109 1239 17 05 1 306352156 04 0998 + 015110 1239 17 06 1 306352156 05 0998 + 015111 1239 17 07 1 306352156 06 0998 + 015112 1239 17 08 1 306352156 07 0998 + 015113 1239 18 01 1 306352156 08 0998 + 015114 1239 18 02 1 306352156 09 0998 + 015115 1239 18 03 1 306352156 10 0998 + 015116 1239 18 04 1 306352156 11 0998 + 015117 1239 18 05 1 306352156 12 0998 + 015118 1239 18 06 1 306352156 13 0998 + 015119 1239 18 07 1 306352156 14 0998 + 015120 1239 18 08 1 306352156 15 0998 + 015121 1239 19 01 1 306352160 00 0999 + 015122 1239 19 02 1 306352160 01 0999 + 015123 1239 19 03 1 306352160 02 0999 + 015124 1239 19 04 1 306352160 03 0999 + 015125 1239 19 05 1 306352160 04 0999 + 015126 1239 19 06 1 306352160 05 0999 + 015127 1239 19 07 1 306352160 06 0999 + 015128 1239 19 08 1 306352160 07 0999 + 015129 1239 20 01 1 306352160 08 0999 + 015130 1239 20 02 1 306352160 09 0999 + 015131 1239 20 03 1 306352160 10 0999 + 015132 1239 20 04 1 306352160 11 0999 + 015133 1239 20 05 1 306352160 12 0999 + 015134 1239 20 06 1 306352160 13 0999 + 015135 1239 20 07 1 306352160 14 0999 + 015136 1239 20 08 1 306352160 15 0999 + 015137 1239 21 01 1 306352148 00 0996 + 015138 1239 21 02 1 306352148 01 0996 + 015139 1239 21 03 1 306352148 02 0996 + 015140 1239 21 04 1 306352148 03 0996 + 015141 1239 21 05 1 306352148 04 0996 + 015142 1239 21 06 1 306352148 05 0996 + 015143 1239 21 07 1 306352148 06 0996 + 015144 1239 21 08 1 306352148 07 0996 + 015145 1239 22 01 1 306352148 08 0996 + 015146 1239 22 02 1 306352148 09 0996 + 015147 1239 22 03 1 306352148 10 0996 + 015148 1239 22 04 1 306352148 11 0996 + 015149 1239 22 05 1 306352148 12 0996 + 015150 1239 22 06 1 306352148 13 0996 + 015151 1239 22 07 1 306352148 14 0996 + 015152 1239 22 08 1 306352148 15 0996 + 015153 1239 23 01 1 306352152 00 0997 + 015154 1239 23 02 1 306352152 01 0997 + 015155 1239 23 03 1 306352152 02 0997 + 015156 1239 23 04 1 306352152 03 0997 + 015157 1239 23 05 1 306352152 04 0997 + 015158 1239 23 06 1 306352152 05 0997 + 015159 1239 23 07 1 306352152 06 0997 + 015160 1239 23 08 1 306352152 07 0997 + 015161 1239 24 01 1 306352152 08 0997 + 015162 1239 24 02 1 306352152 09 0997 + 015163 1239 24 03 1 306352152 10 0997 + 015164 1239 24 04 1 306352152 11 0997 + 015165 1239 24 05 1 306352152 12 0997 + 015166 1239 24 06 1 306352152 13 0997 + 015167 1239 24 07 1 306352152 14 0997 + 015168 1239 24 08 1 306352152 15 0997 + 015169 1239 25 01 1 303071256 08 0061 + 015170 1239 25 02 1 303071256 09 0061 + 015171 9999 99 99 0 9999 99 9999 + 015172 9999 99 99 0 9999 99 9999 + 015173 9999 99 99 0 9999 99 9999 + 015174 9999 99 99 0 9999 99 9999 + 015175 9999 99 99 0 9999 99 9999 + 015176 9999 99 99 0 9999 99 9999 + 015177 1239 26 01 1 303071256 10 0061 + 015178 1239 26 02 1 303071256 11 0061 + 015179 9999 99 99 0 9999 99 9999 + 015180 9999 99 99 0 9999 99 9999 + 015181 9999 99 99 0 9999 99 9999 + 015182 9999 99 99 0 9999 99 9999 + 015183 9999 99 99 0 9999 99 9999 + 015184 9999 99 99 0 9999 99 9999 + 015185 1239 27 01 1 303071256 12 0061 + 015186 1239 27 02 1 303071256 13 0061 + 015187 9999 99 99 0 9999 99 9999 + 015188 9999 99 99 0 9999 99 9999 + 015189 9999 99 99 0 9999 99 9999 + 015190 9999 99 99 0 9999 99 9999 + 015191 9999 99 99 0 9999 99 9999 + 015192 9999 99 99 0 9999 99 9999 + 015193 1239 28 01 1 303071256 14 0061 + 015194 1239 28 02 1 303071256 15 0061 + 015195 9999 99 99 0 9999 99 9999 + 015196 9999 99 99 0 9999 99 9999 + 015197 9999 99 99 0 9999 99 9999 + 015198 9999 99 99 0 9999 99 9999 + 015199 9999 99 99 0 9999 99 9999 + 015200 9999 99 99 0 9999 99 9999 + 015201 1239 29 01 1 303071256 04 0061 + 015202 1239 29 02 1 303071256 05 0061 + 015203 9999 99 99 0 9999 99 9999 + 015204 9999 99 99 0 9999 99 9999 + 015205 9999 99 99 0 9999 99 9999 + 015206 9999 99 99 0 9999 99 9999 + 015207 9999 99 99 0 9999 99 9999 + 015208 9999 99 99 0 9999 99 9999 + 015209 1239 30 01 1 303071256 06 0061 + 015210 1239 30 02 1 303071256 07 0061 + 015211 9999 99 99 0 9999 99 9999 + 015212 9999 99 99 0 9999 99 9999 + 015213 9999 99 99 0 9999 99 9999 + 015214 9999 99 99 0 9999 99 9999 + 015215 9999 99 99 0 9999 99 9999 + 015216 9999 99 99 0 9999 99 9999 + 015217 1239 31 01 1 303071256 00 0061 + 015218 1239 31 02 1 303071256 01 0061 + 015219 9999 99 99 0 9999 99 9999 + 015220 9999 99 99 0 9999 99 9999 + 015221 9999 99 99 0 9999 99 9999 + 015222 9999 99 99 0 9999 99 9999 + 015223 9999 99 99 0 9999 99 9999 + 015224 9999 99 99 0 9999 99 9999 + 015225 1239 32 01 1 303071256 02 0061 + 015226 1239 32 02 1 303071256 03 0061 + 015227 9999 99 99 0 9999 99 9999 + 015228 9999 99 99 0 9999 99 9999 + 015229 9999 99 99 0 9999 99 9999 + 015230 9999 99 99 0 9999 99 9999 + 015231 9999 99 99 0 9999 99 9999 + 015232 9999 99 99 0 9999 99 9999 + 015233 1239 33 01 1 306356252 00 1006 + 015234 1239 33 02 1 306356252 01 1006 + 015235 1239 33 03 1 306356252 02 1006 + 015236 1239 33 04 1 306356252 03 1006 + 015237 1239 33 05 1 306356252 04 1006 + 015238 1239 33 06 1 306356252 05 1006 + 015239 1239 33 07 1 306356252 06 1006 + 015240 1239 33 08 1 306356252 07 1006 + 015241 1239 34 01 1 306356252 08 1006 + 015242 1239 34 02 1 306356252 09 1006 + 015243 1239 34 03 1 306356252 10 1006 + 015244 1239 34 04 1 306356252 11 1006 + 015245 1239 34 05 1 306356252 12 1006 + 015246 1239 34 06 1 306356252 13 1006 + 015247 1239 34 07 1 306356252 14 1006 + 015248 1239 34 08 1 306356252 15 1006 + 015249 1239 35 01 1 306356256 00 1007 + 015250 1239 35 02 1 306356256 01 1007 + 015251 1239 35 03 1 306356256 02 1007 + 015252 1239 35 04 1 306356256 03 1007 + 015253 1239 35 05 1 306356256 04 1007 + 015254 1239 35 06 1 306356256 05 1007 + 015255 1239 35 07 1 306356256 06 1007 + 015256 1239 35 08 1 306356256 07 1007 + 015257 1239 36 01 1 306356256 08 1007 + 015258 1239 36 02 1 306356256 09 1007 + 015259 1239 36 03 1 306356256 10 1007 + 015260 1239 36 04 1 306356256 11 1007 + 015261 1239 36 05 1 306356256 12 1007 + 015262 1239 36 06 1 306356256 13 1007 + 015263 1239 36 07 1 306356256 14 1007 + 015264 1239 36 08 1 306356256 15 1007 + 015265 1239 37 01 1 306356244 00 1004 + 015266 1239 37 02 1 306356244 01 1004 + 015267 1239 37 03 1 306356244 02 1004 + 015268 1239 37 04 1 306356244 03 1004 + 015269 1239 37 05 1 306356244 04 1004 + 015270 1239 37 06 1 306356244 05 1004 + 015271 1239 37 07 1 306356244 06 1004 + 015272 1239 37 08 1 306356244 07 1004 + 015273 1239 38 01 1 306356244 08 1004 + 015274 1239 38 02 1 306356244 09 1004 + 015275 1239 38 03 1 306356244 10 1004 + 015276 1239 38 04 1 306356244 11 1004 + 015277 1239 38 05 1 306356244 12 1004 + 015278 1239 38 06 1 306356244 13 1004 + 015279 1239 38 07 1 306356244 14 1004 + 015280 1239 38 08 1 306356244 15 1004 + 015281 1239 39 01 1 306356248 00 1005 + 015282 1239 39 02 1 306356248 01 1005 + 015283 1239 39 03 1 306356248 02 1005 + 015284 1239 39 04 1 306356248 03 1005 + 015285 1239 39 05 1 306356248 04 1005 + 015286 1239 39 06 1 306356248 05 1005 + 015287 1239 39 07 1 306356248 06 1005 + 015288 1239 39 08 1 306356248 07 1005 + 015289 1239 40 01 1 306356248 08 1005 + 015290 1239 40 02 1 306356248 09 1005 + 015291 1239 40 03 1 306356248 10 1005 + 015292 1239 40 04 1 306356248 11 1005 + 015293 1239 40 05 1 306356248 12 1005 + 015294 1239 40 06 1 306356248 13 1005 + 015295 1239 40 07 1 306356248 14 1005 + 015296 1239 40 08 1 306356248 15 1005 + 015297 1239 41 01 1 304160796 00 0238 + 015298 1239 41 02 1 304160796 01 0238 + 015299 1239 41 03 1 304160796 02 0238 + 015300 1239 41 04 1 304160796 03 0238 + 015301 9999 99 99 0 9999 99 9999 + 015302 9999 99 99 0 9999 99 9999 + 015303 9999 99 99 0 9999 99 9999 + 015304 9999 99 99 0 9999 99 9999 + 015305 1239 42 01 1 304160796 04 0238 + 015306 1239 42 02 1 304160796 05 0238 + 015307 1239 42 03 1 304160796 06 0238 + 015308 1239 42 04 1 304160796 07 0238 + 015309 9999 99 99 0 9999 99 9999 + 015310 9999 99 99 0 9999 99 9999 + 015311 9999 99 99 0 9999 99 9999 + 015312 9999 99 99 0 9999 99 9999 + 015313 1239 43 01 1 304160796 08 0238 + 015314 1239 43 02 1 304160796 09 0238 + 015315 1239 43 03 1 304160796 10 0238 + 015316 1239 43 04 1 304160796 11 0238 + 015317 9999 99 99 0 9999 99 9999 + 015318 9999 99 99 0 9999 99 9999 + 015319 9999 99 99 0 9999 99 9999 + 015320 9999 99 99 0 9999 99 9999 + 015321 1239 44 01 1 304160796 12 0238 + 015322 1239 44 02 1 304160796 13 0238 + 015323 1239 44 03 1 304160796 14 0238 + 015324 1239 44 04 1 304160796 15 0238 + 015325 9999 99 99 0 9999 99 9999 + 015326 9999 99 99 0 9999 99 9999 + 015327 9999 99 99 0 9999 99 9999 + 015328 9999 99 99 0 9999 99 9999 + 015329 1239 45 01 1 304160800 00 0239 + 015330 1239 45 02 1 304160800 01 0239 + 015331 1239 45 03 1 304160800 02 0239 + 015332 1239 45 04 1 304160800 03 0239 + 015333 9999 99 99 0 9999 99 9999 + 015334 9999 99 99 0 9999 99 9999 + 015335 9999 99 99 0 9999 99 9999 + 015336 9999 99 99 0 9999 99 9999 + 015337 1239 46 01 1 304160800 04 0239 + 015338 1239 46 02 1 304160800 05 0239 + 015339 1239 46 03 1 304160800 06 0239 + 015340 1239 46 04 1 304160800 07 0239 + 015341 9999 99 99 0 9999 99 9999 + 015342 9999 99 99 0 9999 99 9999 + 015343 9999 99 99 0 9999 99 9999 + 015344 9999 99 99 0 9999 99 9999 + 015345 1239 47 01 1 304160800 08 0239 + 015346 1239 47 02 1 304160800 09 0239 + 015347 1239 47 03 1 304160800 10 0239 + 015348 1239 47 04 1 304160800 11 0239 + 015349 9999 99 99 0 9999 99 9999 + 015350 9999 99 99 0 9999 99 9999 + 015351 9999 99 99 0 9999 99 9999 + 015352 9999 99 99 0 9999 99 9999 + 015353 1239 48 01 1 304160800 12 0239 + 015354 1239 48 02 1 304160800 13 0239 + 015355 1239 48 03 1 304160800 14 0239 + 015356 1239 48 04 1 304160800 15 0239 + 015357 9999 99 99 0 9999 99 9999 + 015358 9999 99 99 0 9999 99 9999 + 015359 9999 99 99 0 9999 99 9999 + 015360 9999 99 99 0 9999 99 9999 + 015361 1240 01 01 1 304164888 08 0245 + 015362 1240 01 02 1 304164888 09 0245 + 015363 1240 01 03 1 304164888 10 0245 + 015364 1240 01 04 1 304164888 11 0245 + 015365 9999 99 99 0 9999 99 9999 + 015366 9999 99 99 0 9999 99 9999 + 015367 9999 99 99 0 9999 99 9999 + 015368 9999 99 99 0 9999 99 9999 + 015369 1240 02 01 1 304164888 12 0245 + 015370 1240 02 02 1 304164888 13 0245 + 015371 1240 02 03 1 304164888 14 0245 + 015372 1240 02 04 1 304164888 15 0245 + 015373 9999 99 99 0 9999 99 9999 + 015374 9999 99 99 0 9999 99 9999 + 015375 9999 99 99 0 9999 99 9999 + 015376 9999 99 99 0 9999 99 9999 + 015377 1240 03 01 1 304164888 00 0245 + 015378 1240 03 02 1 304164888 01 0245 + 015379 1240 03 03 1 304164888 02 0245 + 015380 1240 03 04 1 304164888 03 0245 + 015381 9999 99 99 0 9999 99 9999 + 015382 9999 99 99 0 9999 99 9999 + 015383 9999 99 99 0 9999 99 9999 + 015384 9999 99 99 0 9999 99 9999 + 015385 1240 04 01 1 304164888 04 0245 + 015386 1240 04 02 1 304164888 05 0245 + 015387 1240 04 03 1 304164888 06 0245 + 015388 1240 04 04 1 304164888 07 0245 + 015389 9999 99 99 0 9999 99 9999 + 015390 9999 99 99 0 9999 99 9999 + 015391 9999 99 99 0 9999 99 9999 + 015392 9999 99 99 0 9999 99 9999 + 015393 1240 05 01 1 304164884 08 0244 + 015394 1240 05 02 1 304164884 09 0244 + 015395 1240 05 03 1 304164884 10 0244 + 015396 1240 05 04 1 304164884 11 0244 + 015397 9999 99 99 0 9999 99 9999 + 015398 9999 99 99 0 9999 99 9999 + 015399 9999 99 99 0 9999 99 9999 + 015400 9999 99 99 0 9999 99 9999 + 015401 1240 06 01 1 304164884 12 0244 + 015402 1240 06 02 1 304164884 13 0244 + 015403 1240 06 03 1 304164884 14 0244 + 015404 1240 06 04 1 304164884 15 0244 + 015405 9999 99 99 0 9999 99 9999 + 015406 9999 99 99 0 9999 99 9999 + 015407 9999 99 99 0 9999 99 9999 + 015408 9999 99 99 0 9999 99 9999 + 015409 1240 07 01 1 304164884 00 0244 + 015410 1240 07 02 1 304164884 01 0244 + 015411 1240 07 03 1 304164884 02 0244 + 015412 1240 07 04 1 304164884 03 0244 + 015413 9999 99 99 0 9999 99 9999 + 015414 9999 99 99 0 9999 99 9999 + 015415 9999 99 99 0 9999 99 9999 + 015416 9999 99 99 0 9999 99 9999 + 015417 1240 08 01 1 304164884 04 0244 + 015418 1240 08 02 1 304164884 05 0244 + 015419 1240 08 03 1 304164884 06 0244 + 015420 1240 08 04 1 304164884 07 0244 + 015421 9999 99 99 0 9999 99 9999 + 015422 9999 99 99 0 9999 99 9999 + 015423 9999 99 99 0 9999 99 9999 + 015424 9999 99 99 0 9999 99 9999 + 015425 1240 09 01 1 306360344 00 1013 + 015426 1240 09 02 1 306360344 01 1013 + 015427 1240 09 03 1 306360344 02 1013 + 015428 1240 09 04 1 306360344 03 1013 + 015429 1240 09 05 1 306360344 04 1013 + 015430 1240 09 06 1 306360344 05 1013 + 015431 1240 09 07 1 306360344 06 1013 + 015432 1240 09 08 1 306360344 07 1013 + 015433 1240 10 01 1 306360344 08 1013 + 015434 1240 10 02 1 306360344 09 1013 + 015435 1240 10 03 1 306360344 10 1013 + 015436 1240 10 04 1 306360344 11 1013 + 015437 1240 10 05 1 306360344 12 1013 + 015438 1240 10 06 1 306360344 13 1013 + 015439 1240 10 07 1 306360344 14 1013 + 015440 1240 10 08 1 306360344 15 1013 + 015441 1240 11 01 1 306360340 00 1012 + 015442 1240 11 02 1 306360340 01 1012 + 015443 1240 11 03 1 306360340 02 1012 + 015444 1240 11 04 1 306360340 03 1012 + 015445 1240 11 05 1 306360340 04 1012 + 015446 1240 11 06 1 306360340 05 1012 + 015447 1240 11 07 1 306360340 06 1012 + 015448 1240 11 08 1 306360340 07 1012 + 015449 1240 12 01 1 306360340 08 1012 + 015450 1240 12 02 1 306360340 09 1012 + 015451 1240 12 03 1 306360340 10 1012 + 015452 1240 12 04 1 306360340 11 1012 + 015453 1240 12 05 1 306360340 12 1012 + 015454 1240 12 06 1 306360340 13 1012 + 015455 1240 12 07 1 306360340 14 1012 + 015456 1240 12 08 1 306360340 15 1012 + 015457 1240 13 01 1 306360352 00 1015 + 015458 1240 13 02 1 306360352 01 1015 + 015459 1240 13 03 1 306360352 02 1015 + 015460 1240 13 04 1 306360352 03 1015 + 015461 1240 13 05 1 306360352 04 1015 + 015462 1240 13 06 1 306360352 05 1015 + 015463 1240 13 07 1 306360352 06 1015 + 015464 1240 13 08 1 306360352 07 1015 + 015465 1240 14 01 1 306360352 08 1015 + 015466 1240 14 02 1 306360352 09 1015 + 015467 1240 14 03 1 306360352 10 1015 + 015468 1240 14 04 1 306360352 11 1015 + 015469 1240 14 05 1 306360352 12 1015 + 015470 1240 14 06 1 306360352 13 1015 + 015471 1240 14 07 1 306360352 14 1015 + 015472 1240 14 08 1 306360352 15 1015 + 015473 1240 15 01 1 306360348 00 1014 + 015474 1240 15 02 1 306360348 01 1014 + 015475 1240 15 03 1 306360348 02 1014 + 015476 1240 15 04 1 306360348 03 1014 + 015477 1240 15 05 1 306360348 04 1014 + 015478 1240 15 06 1 306360348 05 1014 + 015479 1240 15 07 1 306360348 06 1014 + 015480 1240 15 08 1 306360348 07 1014 + 015481 1240 16 01 1 306360348 08 1014 + 015482 1240 16 02 1 306360348 09 1014 + 015483 1240 16 03 1 306360348 10 1014 + 015484 1240 16 04 1 306360348 11 1014 + 015485 1240 16 05 1 306360348 12 1014 + 015486 1240 16 06 1 306360348 13 1014 + 015487 1240 16 07 1 306360348 14 1014 + 015488 1240 16 08 1 306360348 15 1014 + 015489 1240 17 01 1 303075360 12 0071 + 015490 1240 17 02 1 303075360 13 0071 + 015491 9999 99 99 0 9999 99 9999 + 015492 9999 99 99 0 9999 99 9999 + 015493 9999 99 99 0 9999 99 9999 + 015494 9999 99 99 0 9999 99 9999 + 015495 9999 99 99 0 9999 99 9999 + 015496 9999 99 99 0 9999 99 9999 + 015497 1240 18 01 1 303075360 14 0071 + 015498 1240 18 02 1 303075360 15 0071 + 015499 9999 99 99 0 9999 99 9999 + 015500 9999 99 99 0 9999 99 9999 + 015501 9999 99 99 0 9999 99 9999 + 015502 9999 99 99 0 9999 99 9999 + 015503 9999 99 99 0 9999 99 9999 + 015504 9999 99 99 0 9999 99 9999 + 015505 1240 19 01 1 303075360 08 0071 + 015506 1240 19 02 1 303075360 09 0071 + 015507 9999 99 99 0 9999 99 9999 + 015508 9999 99 99 0 9999 99 9999 + 015509 9999 99 99 0 9999 99 9999 + 015510 9999 99 99 0 9999 99 9999 + 015511 9999 99 99 0 9999 99 9999 + 015512 9999 99 99 0 9999 99 9999 + 015513 1240 20 01 1 303075360 10 0071 + 015514 1240 20 02 1 303075360 11 0071 + 015515 9999 99 99 0 9999 99 9999 + 015516 9999 99 99 0 9999 99 9999 + 015517 9999 99 99 0 9999 99 9999 + 015518 9999 99 99 0 9999 99 9999 + 015519 9999 99 99 0 9999 99 9999 + 015520 9999 99 99 0 9999 99 9999 + 015521 1240 21 01 1 303075360 00 0071 + 015522 1240 21 02 1 303075360 01 0071 + 015523 9999 99 99 0 9999 99 9999 + 015524 9999 99 99 0 9999 99 9999 + 015525 9999 99 99 0 9999 99 9999 + 015526 9999 99 99 0 9999 99 9999 + 015527 9999 99 99 0 9999 99 9999 + 015528 9999 99 99 0 9999 99 9999 + 015529 1240 22 01 1 303075360 02 0071 + 015530 1240 22 02 1 303075360 03 0071 + 015531 9999 99 99 0 9999 99 9999 + 015532 9999 99 99 0 9999 99 9999 + 015533 9999 99 99 0 9999 99 9999 + 015534 9999 99 99 0 9999 99 9999 + 015535 9999 99 99 0 9999 99 9999 + 015536 9999 99 99 0 9999 99 9999 + 015537 1240 23 01 1 303075360 04 0071 + 015538 1240 23 02 1 303075360 05 0071 + 015539 9999 99 99 0 9999 99 9999 + 015540 9999 99 99 0 9999 99 9999 + 015541 9999 99 99 0 9999 99 9999 + 015542 9999 99 99 0 9999 99 9999 + 015543 9999 99 99 0 9999 99 9999 + 015544 9999 99 99 0 9999 99 9999 + 015545 1240 24 01 1 303075360 06 0071 + 015546 1240 24 02 1 303075360 07 0071 + 015547 9999 99 99 0 9999 99 9999 + 015548 9999 99 99 0 9999 99 9999 + 015549 9999 99 99 0 9999 99 9999 + 015550 9999 99 99 0 9999 99 9999 + 015551 9999 99 99 0 9999 99 9999 + 015552 9999 99 99 0 9999 99 9999 + 015553 1240 25 01 1 305254428 00 0550 + 015554 1240 25 02 1 305254428 01 0550 + 015555 1240 25 03 1 305254428 02 0550 + 015556 1240 25 04 1 305254428 03 0550 + 015557 1240 25 05 1 305254428 04 0550 + 015558 1240 25 06 1 305254428 05 0550 + 015559 1240 25 07 1 305254428 06 0550 + 015560 1240 25 08 1 305254428 07 0550 + 015561 1240 26 01 1 305254428 08 0550 + 015562 1240 26 02 1 305254428 09 0550 + 015563 1240 26 03 1 305254428 10 0550 + 015564 1240 26 04 1 305254428 11 0550 + 015565 1240 26 05 1 305254428 12 0550 + 015566 1240 26 06 1 305254428 13 0550 + 015567 1240 26 07 1 305254428 14 0550 + 015568 1240 26 08 1 305254428 15 0550 + 015569 1240 27 01 1 305254432 00 0551 + 015570 1240 27 02 1 305254432 01 0551 + 015571 1240 27 03 1 305254432 02 0551 + 015572 1240 27 04 1 305254432 03 0551 + 015573 1240 27 05 1 305254432 04 0551 + 015574 1240 27 06 1 305254432 05 0551 + 015575 1240 27 07 1 305254432 06 0551 + 015576 1240 27 08 1 305254432 07 0551 + 015577 1240 28 01 1 305254432 08 0551 + 015578 1240 28 02 1 305254432 09 0551 + 015579 1240 28 03 1 305254432 10 0551 + 015580 1240 28 04 1 305254432 11 0551 + 015581 1240 28 05 1 305254432 12 0551 + 015582 1240 28 06 1 305254432 13 0551 + 015583 1240 28 07 1 305254432 14 0551 + 015584 1240 28 08 1 305254432 15 0551 + 015585 1240 29 01 1 305254420 00 0548 + 015586 1240 29 02 1 305254420 01 0548 + 015587 1240 29 03 1 305254420 02 0548 + 015588 1240 29 04 1 305254420 03 0548 + 015589 1240 29 05 1 305254420 04 0548 + 015590 1240 29 06 1 305254420 05 0548 + 015591 1240 29 07 1 305254420 06 0548 + 015592 1240 29 08 1 305254420 07 0548 + 015593 1240 30 01 1 305254420 08 0548 + 015594 1240 30 02 1 305254420 09 0548 + 015595 1240 30 03 1 305254420 10 0548 + 015596 1240 30 04 1 305254420 11 0548 + 015597 1240 30 05 1 305254420 12 0548 + 015598 1240 30 06 1 305254420 13 0548 + 015599 1240 30 07 1 305254420 14 0548 + 015600 1240 30 08 1 305254420 15 0548 + 015601 1240 31 01 1 305254424 00 0549 + 015602 1240 31 02 1 305254424 01 0549 + 015603 1240 31 03 1 305254424 02 0549 + 015604 1240 31 04 1 305254424 03 0549 + 015605 1240 31 05 1 305254424 04 0549 + 015606 1240 31 06 1 305254424 05 0549 + 015607 1240 31 07 1 305254424 06 0549 + 015608 1240 31 08 1 305254424 07 0549 + 015609 1240 32 01 1 305254424 08 0549 + 015610 1240 32 02 1 305254424 09 0549 + 015611 1240 32 03 1 305254424 10 0549 + 015612 1240 32 04 1 305254424 11 0549 + 015613 1240 32 05 1 305254424 12 0549 + 015614 1240 32 06 1 305254424 13 0549 + 015615 1240 32 07 1 305254424 14 0549 + 015616 1240 32 08 1 305254424 15 0549 + 015617 1240 33 01 1 306364440 00 1021 + 015618 1240 33 02 1 306364440 01 1021 + 015619 1240 33 03 1 306364440 02 1021 + 015620 1240 33 04 1 306364440 03 1021 + 015621 1240 33 05 1 306364440 04 1021 + 015622 1240 33 06 1 306364440 05 1021 + 015623 1240 33 07 1 306364440 06 1021 + 015624 1240 33 08 1 306364440 07 1021 + 015625 1240 34 01 1 306364440 08 1021 + 015626 1240 34 02 1 306364440 09 1021 + 015627 1240 34 03 1 306364440 10 1021 + 015628 1240 34 04 1 306364440 11 1021 + 015629 1240 34 05 1 306364440 12 1021 + 015630 1240 34 06 1 306364440 13 1021 + 015631 1240 34 07 1 306364440 14 1021 + 015632 1240 34 08 1 306364440 15 1021 + 015633 1240 35 01 1 306364436 00 1020 + 015634 1240 35 02 1 306364436 01 1020 + 015635 1240 35 03 1 306364436 02 1020 + 015636 1240 35 04 1 306364436 03 1020 + 015637 1240 35 05 1 306364436 04 1020 + 015638 1240 35 06 1 306364436 05 1020 + 015639 1240 35 07 1 306364436 06 1020 + 015640 1240 35 08 1 306364436 07 1020 + 015641 1240 36 01 1 306364436 08 1020 + 015642 1240 36 02 1 306364436 09 1020 + 015643 1240 36 03 1 306364436 10 1020 + 015644 1240 36 04 1 306364436 11 1020 + 015645 1240 36 05 1 306364436 12 1020 + 015646 1240 36 06 1 306364436 13 1020 + 015647 1240 36 07 1 306364436 14 1020 + 015648 1240 36 08 1 306364436 15 1020 + 015649 1240 37 01 1 306364448 00 1023 + 015650 1240 37 02 1 306364448 01 1023 + 015651 1240 37 03 1 306364448 02 1023 + 015652 1240 37 04 1 306364448 03 1023 + 015653 1240 37 05 1 306364448 04 1023 + 015654 1240 37 06 1 306364448 05 1023 + 015655 1240 37 07 1 306364448 06 1023 + 015656 1240 37 08 1 306364448 07 1023 + 015657 1240 38 01 1 306364448 08 1023 + 015658 1240 38 02 1 306364448 09 1023 + 015659 1240 38 03 1 306364448 10 1023 + 015660 1240 38 04 1 306364448 11 1023 + 015661 1240 38 05 1 306364448 12 1023 + 015662 1240 38 06 1 306364448 13 1023 + 015663 1240 38 07 1 306364448 14 1023 + 015664 1240 38 08 1 306364448 15 1023 + 015665 1240 39 01 1 306364444 00 1022 + 015666 1240 39 02 1 306364444 01 1022 + 015667 1240 39 03 1 306364444 02 1022 + 015668 1240 39 04 1 306364444 03 1022 + 015669 1240 39 05 1 306364444 04 1022 + 015670 1240 39 06 1 306364444 05 1022 + 015671 1240 39 07 1 306364444 06 1022 + 015672 1240 39 08 1 306364444 07 1022 + 015673 1240 40 01 1 306364444 08 1022 + 015674 1240 40 02 1 306364444 09 1022 + 015675 1240 40 03 1 306364444 10 1022 + 015676 1240 40 04 1 306364444 11 1022 + 015677 1240 40 05 1 306364444 12 1022 + 015678 1240 40 06 1 306364444 13 1022 + 015679 1240 40 07 1 306364444 14 1022 + 015680 1240 40 08 1 306364444 15 1022 + 015681 1240 41 01 1 304164896 08 0247 + 015682 1240 41 02 1 304164896 09 0247 + 015683 1240 41 03 1 304164896 10 0247 + 015684 1240 41 04 1 304164896 11 0247 + 015685 9999 99 99 0 9999 99 9999 + 015686 9999 99 99 0 9999 99 9999 + 015687 9999 99 99 0 9999 99 9999 + 015688 9999 99 99 0 9999 99 9999 + 015689 1240 42 01 1 304164896 12 0247 + 015690 1240 42 02 1 304164896 13 0247 + 015691 1240 42 03 1 304164896 14 0247 + 015692 1240 42 04 1 304164896 15 0247 + 015693 9999 99 99 0 9999 99 9999 + 015694 9999 99 99 0 9999 99 9999 + 015695 9999 99 99 0 9999 99 9999 + 015696 9999 99 99 0 9999 99 9999 + 015697 1240 43 01 1 304164896 00 0247 + 015698 1240 43 02 1 304164896 01 0247 + 015699 1240 43 03 1 304164896 02 0247 + 015700 1240 43 04 1 304164896 03 0247 + 015701 9999 99 99 0 9999 99 9999 + 015702 9999 99 99 0 9999 99 9999 + 015703 9999 99 99 0 9999 99 9999 + 015704 9999 99 99 0 9999 99 9999 + 015705 1240 44 01 1 304164896 04 0247 + 015706 1240 44 02 1 304164896 05 0247 + 015707 1240 44 03 1 304164896 06 0247 + 015708 1240 44 04 1 304164896 07 0247 + 015709 9999 99 99 0 9999 99 9999 + 015710 9999 99 99 0 9999 99 9999 + 015711 9999 99 99 0 9999 99 9999 + 015712 9999 99 99 0 9999 99 9999 + 015713 1240 45 01 1 304164892 08 0246 + 015714 1240 45 02 1 304164892 09 0246 + 015715 1240 45 03 1 304164892 10 0246 + 015716 1240 45 04 1 304164892 11 0246 + 015717 9999 99 99 0 9999 99 9999 + 015718 9999 99 99 0 9999 99 9999 + 015719 9999 99 99 0 9999 99 9999 + 015720 9999 99 99 0 9999 99 9999 + 015721 1240 46 01 1 304164892 12 0246 + 015722 1240 46 02 1 304164892 13 0246 + 015723 1240 46 03 1 304164892 14 0246 + 015724 1240 46 04 1 304164892 15 0246 + 015725 9999 99 99 0 9999 99 9999 + 015726 9999 99 99 0 9999 99 9999 + 015727 9999 99 99 0 9999 99 9999 + 015728 9999 99 99 0 9999 99 9999 + 015729 1240 47 01 1 304164892 00 0246 + 015730 1240 47 02 1 304164892 01 0246 + 015731 1240 47 03 1 304164892 02 0246 + 015732 1240 47 04 1 304164892 03 0246 + 015733 9999 99 99 0 9999 99 9999 + 015734 9999 99 99 0 9999 99 9999 + 015735 9999 99 99 0 9999 99 9999 + 015736 9999 99 99 0 9999 99 9999 + 015737 1240 48 01 1 304164892 04 0246 + 015738 1240 48 02 1 304164892 05 0246 + 015739 1240 48 03 1 304164892 06 0246 + 015740 1240 48 04 1 304164892 07 0246 + 015741 9999 99 99 0 9999 99 9999 + 015742 9999 99 99 0 9999 99 9999 + 015743 9999 99 99 0 9999 99 9999 + 015744 9999 99 99 0 9999 99 9999 + 015745 1241 01 01 1 303067156 08 0052 + 015746 1241 01 02 1 303067156 09 0052 + 015747 9999 99 99 0 9999 99 9999 + 015748 9999 99 99 0 9999 99 9999 + 015749 9999 99 99 0 9999 99 9999 + 015750 9999 99 99 0 9999 99 9999 + 015751 9999 99 99 0 9999 99 9999 + 015752 9999 99 99 0 9999 99 9999 + 015753 1241 02 01 1 303067156 10 0052 + 015754 1241 02 02 1 303067156 11 0052 + 015755 9999 99 99 0 9999 99 9999 + 015756 9999 99 99 0 9999 99 9999 + 015757 9999 99 99 0 9999 99 9999 + 015758 9999 99 99 0 9999 99 9999 + 015759 9999 99 99 0 9999 99 9999 + 015760 9999 99 99 0 9999 99 9999 + 015761 1241 03 01 1 303067156 12 0052 + 015762 1241 03 02 1 303067156 13 0052 + 015763 9999 99 99 0 9999 99 9999 + 015764 9999 99 99 0 9999 99 9999 + 015765 9999 99 99 0 9999 99 9999 + 015766 9999 99 99 0 9999 99 9999 + 015767 9999 99 99 0 9999 99 9999 + 015768 9999 99 99 0 9999 99 9999 + 015769 1241 04 01 1 303067156 14 0052 + 015770 1241 04 02 1 303067156 15 0052 + 015771 9999 99 99 0 9999 99 9999 + 015772 9999 99 99 0 9999 99 9999 + 015773 9999 99 99 0 9999 99 9999 + 015774 9999 99 99 0 9999 99 9999 + 015775 9999 99 99 0 9999 99 9999 + 015776 9999 99 99 0 9999 99 9999 + 015777 1241 05 01 1 303067156 00 0052 + 015778 1241 05 02 1 303067156 01 0052 + 015779 9999 99 99 0 9999 99 9999 + 015780 9999 99 99 0 9999 99 9999 + 015781 9999 99 99 0 9999 99 9999 + 015782 9999 99 99 0 9999 99 9999 + 015783 9999 99 99 0 9999 99 9999 + 015784 9999 99 99 0 9999 99 9999 + 015785 1241 06 01 1 303067156 02 0052 + 015786 1241 06 02 1 303067156 03 0052 + 015787 9999 99 99 0 9999 99 9999 + 015788 9999 99 99 0 9999 99 9999 + 015789 9999 99 99 0 9999 99 9999 + 015790 9999 99 99 0 9999 99 9999 + 015791 9999 99 99 0 9999 99 9999 + 015792 9999 99 99 0 9999 99 9999 + 015793 1241 07 01 1 303067156 04 0052 + 015794 1241 07 02 1 303067156 05 0052 + 015795 9999 99 99 0 9999 99 9999 + 015796 9999 99 99 0 9999 99 9999 + 015797 9999 99 99 0 9999 99 9999 + 015798 9999 99 99 0 9999 99 9999 + 015799 9999 99 99 0 9999 99 9999 + 015800 9999 99 99 0 9999 99 9999 + 015801 1241 08 01 1 303067156 06 0052 + 015802 1241 08 02 1 303067156 07 0052 + 015803 9999 99 99 0 9999 99 9999 + 015804 9999 99 99 0 9999 99 9999 + 015805 9999 99 99 0 9999 99 9999 + 015806 9999 99 99 0 9999 99 9999 + 015807 9999 99 99 0 9999 99 9999 + 015808 9999 99 99 0 9999 99 9999 + 015809 1241 09 01 1 304156696 00 0229 + 015810 1241 09 02 1 304156696 01 0229 + 015811 1241 09 03 1 304156696 02 0229 + 015812 1241 09 04 1 304156696 03 0229 + 015813 9999 99 99 0 9999 99 9999 + 015814 9999 99 99 0 9999 99 9999 + 015815 9999 99 99 0 9999 99 9999 + 015816 9999 99 99 0 9999 99 9999 + 015817 1241 10 01 1 304156696 04 0229 + 015818 1241 10 02 1 304156696 05 0229 + 015819 1241 10 03 1 304156696 06 0229 + 015820 1241 10 04 1 304156696 07 0229 + 015821 9999 99 99 0 9999 99 9999 + 015822 9999 99 99 0 9999 99 9999 + 015823 9999 99 99 0 9999 99 9999 + 015824 9999 99 99 0 9999 99 9999 + 015825 1241 11 01 1 304156696 08 0229 + 015826 1241 11 02 1 304156696 09 0229 + 015827 1241 11 03 1 304156696 10 0229 + 015828 1241 11 04 1 304156696 11 0229 + 015829 9999 99 99 0 9999 99 9999 + 015830 9999 99 99 0 9999 99 9999 + 015831 9999 99 99 0 9999 99 9999 + 015832 9999 99 99 0 9999 99 9999 + 015833 1241 12 01 1 304156696 12 0229 + 015834 1241 12 02 1 304156696 13 0229 + 015835 1241 12 03 1 304156696 14 0229 + 015836 1241 12 04 1 304156696 15 0229 + 015837 9999 99 99 0 9999 99 9999 + 015838 9999 99 99 0 9999 99 9999 + 015839 9999 99 99 0 9999 99 9999 + 015840 9999 99 99 0 9999 99 9999 + 015841 1241 13 01 1 304156692 08 0228 + 015842 1241 13 02 1 304156692 09 0228 + 015843 1241 13 03 1 304156692 10 0228 + 015844 1241 13 04 1 304156692 11 0228 + 015845 9999 99 99 0 9999 99 9999 + 015846 9999 99 99 0 9999 99 9999 + 015847 9999 99 99 0 9999 99 9999 + 015848 9999 99 99 0 9999 99 9999 + 015849 1241 14 01 1 304156692 12 0228 + 015850 1241 14 02 1 304156692 13 0228 + 015851 1241 14 03 1 304156692 14 0228 + 015852 1241 14 04 1 304156692 15 0228 + 015853 9999 99 99 0 9999 99 9999 + 015854 9999 99 99 0 9999 99 9999 + 015855 9999 99 99 0 9999 99 9999 + 015856 9999 99 99 0 9999 99 9999 + 015857 1241 15 01 1 304156692 00 0228 + 015858 1241 15 02 1 304156692 01 0228 + 015859 1241 15 03 1 304156692 02 0228 + 015860 1241 15 04 1 304156692 03 0228 + 015861 9999 99 99 0 9999 99 9999 + 015862 9999 99 99 0 9999 99 9999 + 015863 9999 99 99 0 9999 99 9999 + 015864 9999 99 99 0 9999 99 9999 + 015865 1241 16 01 1 304156692 04 0228 + 015866 1241 16 02 1 304156692 05 0228 + 015867 1241 16 03 1 304156692 06 0228 + 015868 1241 16 04 1 304156692 07 0228 + 015869 9999 99 99 0 9999 99 9999 + 015870 9999 99 99 0 9999 99 9999 + 015871 9999 99 99 0 9999 99 9999 + 015872 9999 99 99 0 9999 99 9999 + 015873 1241 17 01 1 306335772 00 0966 + 015874 1241 17 02 1 306335772 01 0966 + 015875 1241 17 03 1 306335772 02 0966 + 015876 1241 17 04 1 306335772 03 0966 + 015877 1241 17 05 1 306335772 04 0966 + 015878 1241 17 06 1 306335772 05 0966 + 015879 1241 17 07 1 306335772 06 0966 + 015880 1241 17 08 1 306335772 07 0966 + 015881 1241 18 01 1 306335772 08 0966 + 015882 1241 18 02 1 306335772 09 0966 + 015883 1241 18 03 1 306335772 10 0966 + 015884 1241 18 04 1 306335772 11 0966 + 015885 1241 18 05 1 306335772 12 0966 + 015886 1241 18 06 1 306335772 13 0966 + 015887 1241 18 07 1 306335772 14 0966 + 015888 1241 18 08 1 306335772 15 0966 + 015889 1241 19 01 1 306335776 00 0967 + 015890 1241 19 02 1 306335776 01 0967 + 015891 1241 19 03 1 306335776 02 0967 + 015892 1241 19 04 1 306335776 03 0967 + 015893 1241 19 05 1 306335776 04 0967 + 015894 1241 19 06 1 306335776 05 0967 + 015895 1241 19 07 1 306335776 06 0967 + 015896 1241 19 08 1 306335776 07 0967 + 015897 1241 20 01 1 306335776 08 0967 + 015898 1241 20 02 1 306335776 09 0967 + 015899 1241 20 03 1 306335776 10 0967 + 015900 1241 20 04 1 306335776 11 0967 + 015901 1241 20 05 1 306335776 12 0967 + 015902 1241 20 06 1 306335776 13 0967 + 015903 1241 20 07 1 306335776 14 0967 + 015904 1241 20 08 1 306335776 15 0967 + 015905 1241 21 01 1 306335764 00 0964 + 015906 1241 21 02 1 306335764 01 0964 + 015907 1241 21 03 1 306335764 02 0964 + 015908 1241 21 04 1 306335764 03 0964 + 015909 1241 21 05 1 306335764 04 0964 + 015910 1241 21 06 1 306335764 05 0964 + 015911 1241 21 07 1 306335764 06 0964 + 015912 1241 21 08 1 306335764 07 0964 + 015913 1241 22 01 1 306335764 08 0964 + 015914 1241 22 02 1 306335764 09 0964 + 015915 1241 22 03 1 306335764 10 0964 + 015916 1241 22 04 1 306335764 11 0964 + 015917 1241 22 05 1 306335764 12 0964 + 015918 1241 22 06 1 306335764 13 0964 + 015919 1241 22 07 1 306335764 14 0964 + 015920 1241 22 08 1 306335764 15 0964 + 015921 1241 23 01 1 306335768 00 0965 + 015922 1241 23 02 1 306335768 01 0965 + 015923 1241 23 03 1 306335768 02 0965 + 015924 1241 23 04 1 306335768 03 0965 + 015925 1241 23 05 1 306335768 04 0965 + 015926 1241 23 06 1 306335768 05 0965 + 015927 1241 23 07 1 306335768 06 0965 + 015928 1241 23 08 1 306335768 07 0965 + 015929 1241 24 01 1 306335768 08 0965 + 015930 1241 24 02 1 306335768 09 0965 + 015931 1241 24 03 1 306335768 10 0965 + 015932 1241 24 04 1 306335768 11 0965 + 015933 1241 24 05 1 306335768 12 0965 + 015934 1241 24 06 1 306335768 13 0965 + 015935 1241 24 07 1 306335768 14 0965 + 015936 1241 24 08 1 306335768 15 0965 + 015937 1241 25 01 1 303071260 08 0062 + 015938 1241 25 02 1 303071260 09 0062 + 015939 9999 99 99 0 9999 99 9999 + 015940 9999 99 99 0 9999 99 9999 + 015941 9999 99 99 0 9999 99 9999 + 015942 9999 99 99 0 9999 99 9999 + 015943 9999 99 99 0 9999 99 9999 + 015944 9999 99 99 0 9999 99 9999 + 015945 1241 26 01 1 303071260 10 0062 + 015946 1241 26 02 1 303071260 11 0062 + 015947 9999 99 99 0 9999 99 9999 + 015948 9999 99 99 0 9999 99 9999 + 015949 9999 99 99 0 9999 99 9999 + 015950 9999 99 99 0 9999 99 9999 + 015951 9999 99 99 0 9999 99 9999 + 015952 9999 99 99 0 9999 99 9999 + 015953 1241 27 01 1 303071260 12 0062 + 015954 1241 27 02 1 303071260 13 0062 + 015955 9999 99 99 0 9999 99 9999 + 015956 9999 99 99 0 9999 99 9999 + 015957 9999 99 99 0 9999 99 9999 + 015958 9999 99 99 0 9999 99 9999 + 015959 9999 99 99 0 9999 99 9999 + 015960 9999 99 99 0 9999 99 9999 + 015961 1241 28 01 1 303071260 14 0062 + 015962 1241 28 02 1 303071260 15 0062 + 015963 9999 99 99 0 9999 99 9999 + 015964 9999 99 99 0 9999 99 9999 + 015965 9999 99 99 0 9999 99 9999 + 015966 9999 99 99 0 9999 99 9999 + 015967 9999 99 99 0 9999 99 9999 + 015968 9999 99 99 0 9999 99 9999 + 015969 1241 29 01 1 303071260 04 0062 + 015970 1241 29 02 1 303071260 05 0062 + 015971 9999 99 99 0 9999 99 9999 + 015972 9999 99 99 0 9999 99 9999 + 015973 9999 99 99 0 9999 99 9999 + 015974 9999 99 99 0 9999 99 9999 + 015975 9999 99 99 0 9999 99 9999 + 015976 9999 99 99 0 9999 99 9999 + 015977 1241 30 01 1 303071260 06 0062 + 015978 1241 30 02 1 303071260 07 0062 + 015979 9999 99 99 0 9999 99 9999 + 015980 9999 99 99 0 9999 99 9999 + 015981 9999 99 99 0 9999 99 9999 + 015982 9999 99 99 0 9999 99 9999 + 015983 9999 99 99 0 9999 99 9999 + 015984 9999 99 99 0 9999 99 9999 + 015985 1241 31 01 1 303071260 00 0062 + 015986 1241 31 02 1 303071260 01 0062 + 015987 9999 99 99 0 9999 99 9999 + 015988 9999 99 99 0 9999 99 9999 + 015989 9999 99 99 0 9999 99 9999 + 015990 9999 99 99 0 9999 99 9999 + 015991 9999 99 99 0 9999 99 9999 + 015992 9999 99 99 0 9999 99 9999 + 015993 1241 32 01 1 303071260 02 0062 + 015994 1241 32 02 1 303071260 03 0062 + 015995 9999 99 99 0 9999 99 9999 + 015996 9999 99 99 0 9999 99 9999 + 015997 9999 99 99 0 9999 99 9999 + 015998 9999 99 99 0 9999 99 9999 + 015999 9999 99 99 0 9999 99 9999 + 016000 9999 99 99 0 9999 99 9999 + 016001 1241 33 01 1 306339868 00 0974 + 016002 1241 33 02 1 306339868 01 0974 + 016003 1241 33 03 1 306339868 02 0974 + 016004 1241 33 04 1 306339868 03 0974 + 016005 1241 33 05 1 306339868 04 0974 + 016006 1241 33 06 1 306339868 05 0974 + 016007 1241 33 07 1 306339868 06 0974 + 016008 1241 33 08 1 306339868 07 0974 + 016009 1241 34 01 1 306339868 08 0974 + 016010 1241 34 02 1 306339868 09 0974 + 016011 1241 34 03 1 306339868 10 0974 + 016012 1241 34 04 1 306339868 11 0974 + 016013 1241 34 05 1 306339868 12 0974 + 016014 1241 34 06 1 306339868 13 0974 + 016015 1241 34 07 1 306339868 14 0974 + 016016 1241 34 08 1 306339868 15 0974 + 016017 1241 35 01 1 306339872 00 0975 + 016018 1241 35 02 1 306339872 01 0975 + 016019 1241 35 03 1 306339872 02 0975 + 016020 1241 35 04 1 306339872 03 0975 + 016021 1241 35 05 1 306339872 04 0975 + 016022 1241 35 06 1 306339872 05 0975 + 016023 1241 35 07 1 306339872 06 0975 + 016024 1241 35 08 1 306339872 07 0975 + 016025 1241 36 01 1 306339872 08 0975 + 016026 1241 36 02 1 306339872 09 0975 + 016027 1241 36 03 1 306339872 10 0975 + 016028 1241 36 04 1 306339872 11 0975 + 016029 1241 36 05 1 306339872 12 0975 + 016030 1241 36 06 1 306339872 13 0975 + 016031 1241 36 07 1 306339872 14 0975 + 016032 1241 36 08 1 306339872 15 0975 + 016033 1241 37 01 1 306339860 00 0972 + 016034 1241 37 02 1 306339860 01 0972 + 016035 1241 37 03 1 306339860 02 0972 + 016036 1241 37 04 1 306339860 03 0972 + 016037 1241 37 05 1 306339860 04 0972 + 016038 1241 37 06 1 306339860 05 0972 + 016039 1241 37 07 1 306339860 06 0972 + 016040 1241 37 08 1 306339860 07 0972 + 016041 1241 38 01 1 306339860 08 0972 + 016042 1241 38 02 1 306339860 09 0972 + 016043 1241 38 03 1 306339860 10 0972 + 016044 1241 38 04 1 306339860 11 0972 + 016045 1241 38 05 1 306339860 12 0972 + 016046 1241 38 06 1 306339860 13 0972 + 016047 1241 38 07 1 306339860 14 0972 + 016048 1241 38 08 1 306339860 15 0972 + 016049 1241 39 01 1 306339864 00 0973 + 016050 1241 39 02 1 306339864 01 0973 + 016051 1241 39 03 1 306339864 02 0973 + 016052 1241 39 04 1 306339864 03 0973 + 016053 1241 39 05 1 306339864 04 0973 + 016054 1241 39 06 1 306339864 05 0973 + 016055 1241 39 07 1 306339864 06 0973 + 016056 1241 39 08 1 306339864 07 0973 + 016057 1241 40 01 1 306339864 08 0973 + 016058 1241 40 02 1 306339864 09 0973 + 016059 1241 40 03 1 306339864 10 0973 + 016060 1241 40 04 1 306339864 11 0973 + 016061 1241 40 05 1 306339864 12 0973 + 016062 1241 40 06 1 306339864 13 0973 + 016063 1241 40 07 1 306339864 14 0973 + 016064 1241 40 08 1 306339864 15 0973 + 016065 1241 41 01 1 304156700 00 0230 + 016066 1241 41 02 1 304156700 01 0230 + 016067 1241 41 03 1 304156700 02 0230 + 016068 1241 41 04 1 304156700 03 0230 + 016069 9999 99 99 0 9999 99 9999 + 016070 9999 99 99 0 9999 99 9999 + 016071 9999 99 99 0 9999 99 9999 + 016072 9999 99 99 0 9999 99 9999 + 016073 1241 42 01 1 304156700 04 0230 + 016074 1241 42 02 1 304156700 05 0230 + 016075 1241 42 03 1 304156700 06 0230 + 016076 1241 42 04 1 304156700 07 0230 + 016077 9999 99 99 0 9999 99 9999 + 016078 9999 99 99 0 9999 99 9999 + 016079 9999 99 99 0 9999 99 9999 + 016080 9999 99 99 0 9999 99 9999 + 016081 1241 43 01 1 304156700 08 0230 + 016082 1241 43 02 1 304156700 09 0230 + 016083 1241 43 03 1 304156700 10 0230 + 016084 1241 43 04 1 304156700 11 0230 + 016085 9999 99 99 0 9999 99 9999 + 016086 9999 99 99 0 9999 99 9999 + 016087 9999 99 99 0 9999 99 9999 + 016088 9999 99 99 0 9999 99 9999 + 016089 1241 44 01 1 304156700 12 0230 + 016090 1241 44 02 1 304156700 13 0230 + 016091 1241 44 03 1 304156700 14 0230 + 016092 1241 44 04 1 304156700 15 0230 + 016093 9999 99 99 0 9999 99 9999 + 016094 9999 99 99 0 9999 99 9999 + 016095 9999 99 99 0 9999 99 9999 + 016096 9999 99 99 0 9999 99 9999 + 016097 1241 45 01 1 304156704 00 0231 + 016098 1241 45 02 1 304156704 01 0231 + 016099 1241 45 03 1 304156704 02 0231 + 016100 1241 45 04 1 304156704 03 0231 + 016101 9999 99 99 0 9999 99 9999 + 016102 9999 99 99 0 9999 99 9999 + 016103 9999 99 99 0 9999 99 9999 + 016104 9999 99 99 0 9999 99 9999 + 016105 1241 46 01 1 304156704 04 0231 + 016106 1241 46 02 1 304156704 05 0231 + 016107 1241 46 03 1 304156704 06 0231 + 016108 1241 46 04 1 304156704 07 0231 + 016109 9999 99 99 0 9999 99 9999 + 016110 9999 99 99 0 9999 99 9999 + 016111 9999 99 99 0 9999 99 9999 + 016112 9999 99 99 0 9999 99 9999 + 016113 1241 47 01 1 304156704 08 0231 + 016114 1241 47 02 1 304156704 09 0231 + 016115 1241 47 03 1 304156704 10 0231 + 016116 1241 47 04 1 304156704 11 0231 + 016117 9999 99 99 0 9999 99 9999 + 016118 9999 99 99 0 9999 99 9999 + 016119 9999 99 99 0 9999 99 9999 + 016120 9999 99 99 0 9999 99 9999 + 016121 1241 48 01 1 304156704 12 0231 + 016122 1241 48 02 1 304156704 13 0231 + 016123 1241 48 03 1 304156704 14 0231 + 016124 1241 48 04 1 304156704 15 0231 + 016125 9999 99 99 0 9999 99 9999 + 016126 9999 99 99 0 9999 99 9999 + 016127 9999 99 99 0 9999 99 9999 + 016128 9999 99 99 0 9999 99 9999 + 016129 1242 01 01 1 306343960 00 0981 + 016130 1242 01 02 1 306343960 01 0981 + 016131 1242 01 03 1 306343960 02 0981 + 016132 1242 01 04 1 306343960 03 0981 + 016133 1242 01 05 1 306343960 04 0981 + 016134 1242 01 06 1 306343960 05 0981 + 016135 1242 01 07 1 306343960 06 0981 + 016136 1242 01 08 1 306343960 07 0981 + 016137 1242 02 01 1 306343960 08 0981 + 016138 1242 02 02 1 306343960 09 0981 + 016139 1242 02 03 1 306343960 10 0981 + 016140 1242 02 04 1 306343960 11 0981 + 016141 1242 02 05 1 306343960 12 0981 + 016142 1242 02 06 1 306343960 13 0981 + 016143 1242 02 07 1 306343960 14 0981 + 016144 1242 02 08 1 306343960 15 0981 + 016145 1242 03 01 1 306343956 00 0980 + 016146 1242 03 02 1 306343956 01 0980 + 016147 1242 03 03 1 306343956 02 0980 + 016148 1242 03 04 1 306343956 03 0980 + 016149 1242 03 05 1 306343956 04 0980 + 016150 1242 03 06 1 306343956 05 0980 + 016151 1242 03 07 1 306343956 06 0980 + 016152 1242 03 08 1 306343956 07 0980 + 016153 1242 04 01 1 306343956 08 0980 + 016154 1242 04 02 1 306343956 09 0980 + 016155 1242 04 03 1 306343956 10 0980 + 016156 1242 04 04 1 306343956 11 0980 + 016157 1242 04 05 1 306343956 12 0980 + 016158 1242 04 06 1 306343956 13 0980 + 016159 1242 04 07 1 306343956 14 0980 + 016160 1242 04 08 1 306343956 15 0980 + 016161 1242 05 01 1 306343968 00 0983 + 016162 1242 05 02 1 306343968 01 0983 + 016163 1242 05 03 1 306343968 02 0983 + 016164 1242 05 04 1 306343968 03 0983 + 016165 1242 05 05 1 306343968 04 0983 + 016166 1242 05 06 1 306343968 05 0983 + 016167 1242 05 07 1 306343968 06 0983 + 016168 1242 05 08 1 306343968 07 0983 + 016169 1242 06 01 1 306343968 08 0983 + 016170 1242 06 02 1 306343968 09 0983 + 016171 1242 06 03 1 306343968 10 0983 + 016172 1242 06 04 1 306343968 11 0983 + 016173 1242 06 05 1 306343968 12 0983 + 016174 1242 06 06 1 306343968 13 0983 + 016175 1242 06 07 1 306343968 14 0983 + 016176 1242 06 08 1 306343968 15 0983 + 016177 1242 07 01 1 306343964 00 0982 + 016178 1242 07 02 1 306343964 01 0982 + 016179 1242 07 03 1 306343964 02 0982 + 016180 1242 07 04 1 306343964 03 0982 + 016181 1242 07 05 1 306343964 04 0982 + 016182 1242 07 06 1 306343964 05 0982 + 016183 1242 07 07 1 306343964 06 0982 + 016184 1242 07 08 1 306343964 07 0982 + 016185 1242 08 01 1 306343964 08 0982 + 016186 1242 08 02 1 306343964 09 0982 + 016187 1242 08 03 1 306343964 10 0982 + 016188 1242 08 04 1 306343964 11 0982 + 016189 1242 08 05 1 306343964 12 0982 + 016190 1242 08 06 1 306343964 13 0982 + 016191 1242 08 07 1 306343964 14 0982 + 016192 1242 08 08 1 306343964 15 0982 + 016193 1242 09 01 1 303071264 12 0063 + 016194 1242 09 02 1 303071264 13 0063 + 016195 9999 99 99 0 9999 99 9999 + 016196 9999 99 99 0 9999 99 9999 + 016197 9999 99 99 0 9999 99 9999 + 016198 9999 99 99 0 9999 99 9999 + 016199 9999 99 99 0 9999 99 9999 + 016200 9999 99 99 0 9999 99 9999 + 016201 1242 10 01 1 303071264 14 0063 + 016202 1242 10 02 1 303071264 15 0063 + 016203 9999 99 99 0 9999 99 9999 + 016204 9999 99 99 0 9999 99 9999 + 016205 9999 99 99 0 9999 99 9999 + 016206 9999 99 99 0 9999 99 9999 + 016207 9999 99 99 0 9999 99 9999 + 016208 9999 99 99 0 9999 99 9999 + 016209 1242 11 01 1 303071264 08 0063 + 016210 1242 11 02 1 303071264 09 0063 + 016211 9999 99 99 0 9999 99 9999 + 016212 9999 99 99 0 9999 99 9999 + 016213 9999 99 99 0 9999 99 9999 + 016214 9999 99 99 0 9999 99 9999 + 016215 9999 99 99 0 9999 99 9999 + 016216 9999 99 99 0 9999 99 9999 + 016217 1242 12 01 1 303071264 10 0063 + 016218 1242 12 02 1 303071264 11 0063 + 016219 9999 99 99 0 9999 99 9999 + 016220 9999 99 99 0 9999 99 9999 + 016221 9999 99 99 0 9999 99 9999 + 016222 9999 99 99 0 9999 99 9999 + 016223 9999 99 99 0 9999 99 9999 + 016224 9999 99 99 0 9999 99 9999 + 016225 1242 13 01 1 303071264 00 0063 + 016226 1242 13 02 1 303071264 01 0063 + 016227 9999 99 99 0 9999 99 9999 + 016228 9999 99 99 0 9999 99 9999 + 016229 9999 99 99 0 9999 99 9999 + 016230 9999 99 99 0 9999 99 9999 + 016231 9999 99 99 0 9999 99 9999 + 016232 9999 99 99 0 9999 99 9999 + 016233 1242 14 01 1 303071264 02 0063 + 016234 1242 14 02 1 303071264 03 0063 + 016235 9999 99 99 0 9999 99 9999 + 016236 9999 99 99 0 9999 99 9999 + 016237 9999 99 99 0 9999 99 9999 + 016238 9999 99 99 0 9999 99 9999 + 016239 9999 99 99 0 9999 99 9999 + 016240 9999 99 99 0 9999 99 9999 + 016241 1242 15 01 1 303071264 04 0063 + 016242 1242 15 02 1 303071264 05 0063 + 016243 9999 99 99 0 9999 99 9999 + 016244 9999 99 99 0 9999 99 9999 + 016245 9999 99 99 0 9999 99 9999 + 016246 9999 99 99 0 9999 99 9999 + 016247 9999 99 99 0 9999 99 9999 + 016248 9999 99 99 0 9999 99 9999 + 016249 1242 16 01 1 303071264 06 0063 + 016250 1242 16 02 1 303071264 07 0063 + 016251 9999 99 99 0 9999 99 9999 + 016252 9999 99 99 0 9999 99 9999 + 016253 9999 99 99 0 9999 99 9999 + 016254 9999 99 99 0 9999 99 9999 + 016255 9999 99 99 0 9999 99 9999 + 016256 9999 99 99 0 9999 99 9999 + 016257 1242 17 01 1 305242140 00 0526 + 016258 1242 17 02 1 305242140 01 0526 + 016259 1242 17 03 1 305242140 02 0526 + 016260 1242 17 04 1 305242140 03 0526 + 016261 1242 17 05 1 305242140 04 0526 + 016262 1242 17 06 1 305242140 05 0526 + 016263 1242 17 07 1 305242140 06 0526 + 016264 1242 17 08 1 305242140 07 0526 + 016265 1242 18 01 1 305242140 08 0526 + 016266 1242 18 02 1 305242140 09 0526 + 016267 1242 18 03 1 305242140 10 0526 + 016268 1242 18 04 1 305242140 11 0526 + 016269 1242 18 05 1 305242140 12 0526 + 016270 1242 18 06 1 305242140 13 0526 + 016271 1242 18 07 1 305242140 14 0526 + 016272 1242 18 08 1 305242140 15 0526 + 016273 1242 19 01 1 305242144 00 0527 + 016274 1242 19 02 1 305242144 01 0527 + 016275 1242 19 03 1 305242144 02 0527 + 016276 1242 19 04 1 305242144 03 0527 + 016277 1242 19 05 1 305242144 04 0527 + 016278 1242 19 06 1 305242144 05 0527 + 016279 1242 19 07 1 305242144 06 0527 + 016280 1242 19 08 1 305242144 07 0527 + 016281 1242 20 01 1 305242144 08 0527 + 016282 1242 20 02 1 305242144 09 0527 + 016283 1242 20 03 1 305242144 10 0527 + 016284 1242 20 04 1 305242144 11 0527 + 016285 1242 20 05 1 305242144 12 0527 + 016286 1242 20 06 1 305242144 13 0527 + 016287 1242 20 07 1 305242144 14 0527 + 016288 1242 20 08 1 305242144 15 0527 + 016289 1242 21 01 1 305242132 00 0524 + 016290 1242 21 02 1 305242132 01 0524 + 016291 1242 21 03 1 305242132 02 0524 + 016292 1242 21 04 1 305242132 03 0524 + 016293 1242 21 05 1 305242132 04 0524 + 016294 1242 21 06 1 305242132 05 0524 + 016295 1242 21 07 1 305242132 06 0524 + 016296 1242 21 08 1 305242132 07 0524 + 016297 1242 22 01 1 305242132 08 0524 + 016298 1242 22 02 1 305242132 09 0524 + 016299 1242 22 03 1 305242132 10 0524 + 016300 1242 22 04 1 305242132 11 0524 + 016301 1242 22 05 1 305242132 12 0524 + 016302 1242 22 06 1 305242132 13 0524 + 016303 1242 22 07 1 305242132 14 0524 + 016304 1242 22 08 1 305242132 15 0524 + 016305 1242 23 01 1 305242136 00 0525 + 016306 1242 23 02 1 305242136 01 0525 + 016307 1242 23 03 1 305242136 02 0525 + 016308 1242 23 04 1 305242136 03 0525 + 016309 1242 23 05 1 305242136 04 0525 + 016310 1242 23 06 1 305242136 05 0525 + 016311 1242 23 07 1 305242136 06 0525 + 016312 1242 23 08 1 305242136 07 0525 + 016313 1242 24 01 1 305242136 08 0525 + 016314 1242 24 02 1 305242136 09 0525 + 016315 1242 24 03 1 305242136 10 0525 + 016316 1242 24 04 1 305242136 11 0525 + 016317 1242 24 05 1 305242136 12 0525 + 016318 1242 24 06 1 305242136 13 0525 + 016319 1242 24 07 1 305242136 14 0525 + 016320 1242 24 08 1 305242136 15 0525 + 016321 1242 25 01 1 306348056 00 0989 + 016322 1242 25 02 1 306348056 01 0989 + 016323 1242 25 03 1 306348056 02 0989 + 016324 1242 25 04 1 306348056 03 0989 + 016325 1242 25 05 1 306348056 04 0989 + 016326 1242 25 06 1 306348056 05 0989 + 016327 1242 25 07 1 306348056 06 0989 + 016328 1242 25 08 1 306348056 07 0989 + 016329 1242 26 01 1 306348056 08 0989 + 016330 1242 26 02 1 306348056 09 0989 + 016331 1242 26 03 1 306348056 10 0989 + 016332 1242 26 04 1 306348056 11 0989 + 016333 1242 26 05 1 306348056 12 0989 + 016334 1242 26 06 1 306348056 13 0989 + 016335 1242 26 07 1 306348056 14 0989 + 016336 1242 26 08 1 306348056 15 0989 + 016337 1242 27 01 1 306348052 00 0988 + 016338 1242 27 02 1 306348052 01 0988 + 016339 1242 27 03 1 306348052 02 0988 + 016340 1242 27 04 1 306348052 03 0988 + 016341 1242 27 05 1 306348052 04 0988 + 016342 1242 27 06 1 306348052 05 0988 + 016343 1242 27 07 1 306348052 06 0988 + 016344 1242 27 08 1 306348052 07 0988 + 016345 1242 28 01 1 306348052 08 0988 + 016346 1242 28 02 1 306348052 09 0988 + 016347 1242 28 03 1 306348052 10 0988 + 016348 1242 28 04 1 306348052 11 0988 + 016349 1242 28 05 1 306348052 12 0988 + 016350 1242 28 06 1 306348052 13 0988 + 016351 1242 28 07 1 306348052 14 0988 + 016352 1242 28 08 1 306348052 15 0988 + 016353 1242 29 01 1 306348064 00 0991 + 016354 1242 29 02 1 306348064 01 0991 + 016355 1242 29 03 1 306348064 02 0991 + 016356 1242 29 04 1 306348064 03 0991 + 016357 1242 29 05 1 306348064 04 0991 + 016358 1242 29 06 1 306348064 05 0991 + 016359 1242 29 07 1 306348064 06 0991 + 016360 1242 29 08 1 306348064 07 0991 + 016361 1242 30 01 1 306348064 08 0991 + 016362 1242 30 02 1 306348064 09 0991 + 016363 1242 30 03 1 306348064 10 0991 + 016364 1242 30 04 1 306348064 11 0991 + 016365 1242 30 05 1 306348064 12 0991 + 016366 1242 30 06 1 306348064 13 0991 + 016367 1242 30 07 1 306348064 14 0991 + 016368 1242 30 08 1 306348064 15 0991 + 016369 1242 31 01 1 306348060 00 0990 + 016370 1242 31 02 1 306348060 01 0990 + 016371 1242 31 03 1 306348060 02 0990 + 016372 1242 31 04 1 306348060 03 0990 + 016373 1242 31 05 1 306348060 04 0990 + 016374 1242 31 06 1 306348060 05 0990 + 016375 1242 31 07 1 306348060 06 0990 + 016376 1242 31 08 1 306348060 07 0990 + 016377 1242 32 01 1 306348060 08 0990 + 016378 1242 32 02 1 306348060 09 0990 + 016379 1242 32 03 1 306348060 10 0990 + 016380 1242 32 04 1 306348060 11 0990 + 016381 1242 32 05 1 306348060 12 0990 + 016382 1242 32 06 1 306348060 13 0990 + 016383 1242 32 07 1 306348060 14 0990 + 016384 1242 32 08 1 306348060 15 0990 + 016385 1242 33 01 1 305246236 00 0534 + 016386 1242 33 02 1 305246236 01 0534 + 016387 1242 33 03 1 305246236 02 0534 + 016388 1242 33 04 1 305246236 03 0534 + 016389 1242 33 05 1 305246236 04 0534 + 016390 1242 33 06 1 305246236 05 0534 + 016391 1242 33 07 1 305246236 06 0534 + 016392 1242 33 08 1 305246236 07 0534 + 016393 1242 34 01 1 305246236 08 0534 + 016394 1242 34 02 1 305246236 09 0534 + 016395 1242 34 03 1 305246236 10 0534 + 016396 1242 34 04 1 305246236 11 0534 + 016397 1242 34 05 1 305246236 12 0534 + 016398 1242 34 06 1 305246236 13 0534 + 016399 1242 34 07 1 305246236 14 0534 + 016400 1242 34 08 1 305246236 15 0534 + 016401 1242 35 01 1 305246240 00 0535 + 016402 1242 35 02 1 305246240 01 0535 + 016403 1242 35 03 1 305246240 02 0535 + 016404 1242 35 04 1 305246240 03 0535 + 016405 1242 35 05 1 305246240 04 0535 + 016406 1242 35 06 1 305246240 05 0535 + 016407 1242 35 07 1 305246240 06 0535 + 016408 1242 35 08 1 305246240 07 0535 + 016409 1242 36 01 1 305246240 08 0535 + 016410 1242 36 02 1 305246240 09 0535 + 016411 1242 36 03 1 305246240 10 0535 + 016412 1242 36 04 1 305246240 11 0535 + 016413 1242 36 05 1 305246240 12 0535 + 016414 1242 36 06 1 305246240 13 0535 + 016415 1242 36 07 1 305246240 14 0535 + 016416 1242 36 08 1 305246240 15 0535 + 016417 1242 37 01 1 305246228 00 0532 + 016418 1242 37 02 1 305246228 01 0532 + 016419 1242 37 03 1 305246228 02 0532 + 016420 1242 37 04 1 305246228 03 0532 + 016421 1242 37 05 1 305246228 04 0532 + 016422 1242 37 06 1 305246228 05 0532 + 016423 1242 37 07 1 305246228 06 0532 + 016424 1242 37 08 1 305246228 07 0532 + 016425 1242 38 01 1 305246228 08 0532 + 016426 1242 38 02 1 305246228 09 0532 + 016427 1242 38 03 1 305246228 10 0532 + 016428 1242 38 04 1 305246228 11 0532 + 016429 1242 38 05 1 305246228 12 0532 + 016430 1242 38 06 1 305246228 13 0532 + 016431 1242 38 07 1 305246228 14 0532 + 016432 1242 38 08 1 305246228 15 0532 + 016433 1242 39 01 1 305246232 00 0533 + 016434 1242 39 02 1 305246232 01 0533 + 016435 1242 39 03 1 305246232 02 0533 + 016436 1242 39 04 1 305246232 03 0533 + 016437 1242 39 05 1 305246232 04 0533 + 016438 1242 39 06 1 305246232 05 0533 + 016439 1242 39 07 1 305246232 06 0533 + 016440 1242 39 08 1 305246232 07 0533 + 016441 1242 40 01 1 305246232 08 0533 + 016442 1242 40 02 1 305246232 09 0533 + 016443 1242 40 03 1 305246232 10 0533 + 016444 1242 40 04 1 305246232 11 0533 + 016445 1242 40 05 1 305246232 12 0533 + 016446 1242 40 06 1 305246232 13 0533 + 016447 1242 40 07 1 305246232 14 0533 + 016448 1242 40 08 1 305246232 15 0533 + 016449 1242 41 01 1 305250328 00 0541 + 016450 1242 41 02 1 305250328 01 0541 + 016451 1242 41 03 1 305250328 02 0541 + 016452 1242 41 04 1 305250328 03 0541 + 016453 1242 41 05 1 305250328 04 0541 + 016454 1242 41 06 1 305250328 05 0541 + 016455 1242 41 07 1 305250328 06 0541 + 016456 1242 41 08 1 305250328 07 0541 + 016457 1242 42 01 1 305250328 08 0541 + 016458 1242 42 02 1 305250328 09 0541 + 016459 1242 42 03 1 305250328 10 0541 + 016460 1242 42 04 1 305250328 11 0541 + 016461 1242 42 05 1 305250328 12 0541 + 016462 1242 42 06 1 305250328 13 0541 + 016463 1242 42 07 1 305250328 14 0541 + 016464 1242 42 08 1 305250328 15 0541 + 016465 1242 43 01 1 305250324 00 0540 + 016466 1242 43 02 1 305250324 01 0540 + 016467 1242 43 03 1 305250324 02 0540 + 016468 1242 43 04 1 305250324 03 0540 + 016469 1242 43 05 1 305250324 04 0540 + 016470 1242 43 06 1 305250324 05 0540 + 016471 1242 43 07 1 305250324 06 0540 + 016472 1242 43 08 1 305250324 07 0540 + 016473 1242 44 01 1 305250324 08 0540 + 016474 1242 44 02 1 305250324 09 0540 + 016475 1242 44 03 1 305250324 10 0540 + 016476 1242 44 04 1 305250324 11 0540 + 016477 1242 44 05 1 305250324 12 0540 + 016478 1242 44 06 1 305250324 13 0540 + 016479 1242 44 07 1 305250324 14 0540 + 016480 1242 44 08 1 305250324 15 0540 + 016481 1242 45 01 1 305250336 00 0543 + 016482 1242 45 02 1 305250336 01 0543 + 016483 1242 45 03 1 305250336 02 0543 + 016484 1242 45 04 1 305250336 03 0543 + 016485 1242 45 05 1 305250336 04 0543 + 016486 1242 45 06 1 305250336 05 0543 + 016487 1242 45 07 1 305250336 06 0543 + 016488 1242 45 08 1 305250336 07 0543 + 016489 1242 46 01 1 305250336 08 0543 + 016490 1242 46 02 1 305250336 09 0543 + 016491 1242 46 03 1 305250336 10 0543 + 016492 1242 46 04 1 305250336 11 0543 + 016493 1242 46 05 1 305250336 12 0543 + 016494 1242 46 06 1 305250336 13 0543 + 016495 1242 46 07 1 305250336 14 0543 + 016496 1242 46 08 1 305250336 15 0543 + 016497 1242 47 01 1 305250332 00 0542 + 016498 1242 47 02 1 305250332 01 0542 + 016499 1242 47 03 1 305250332 02 0542 + 016500 1242 47 04 1 305250332 03 0542 + 016501 1242 47 05 1 305250332 04 0542 + 016502 1242 47 06 1 305250332 05 0542 + 016503 1242 47 07 1 305250332 06 0542 + 016504 1242 47 08 1 305250332 07 0542 + 016505 1242 48 01 1 305250332 08 0542 + 016506 1242 48 02 1 305250332 09 0542 + 016507 1242 48 03 1 305250332 10 0542 + 016508 1242 48 04 1 305250332 11 0542 + 016509 1242 48 05 1 305250332 12 0542 + 016510 1242 48 06 1 305250332 13 0542 + 016511 1242 48 07 1 305250332 14 0542 + 016512 1242 48 08 1 305250332 15 0542 + 016513 1243 01 01 1 303067160 08 0053 + 016514 1243 01 02 1 303067160 09 0053 + 016515 9999 99 99 0 9999 99 9999 + 016516 9999 99 99 0 9999 99 9999 + 016517 9999 99 99 0 9999 99 9999 + 016518 9999 99 99 0 9999 99 9999 + 016519 9999 99 99 0 9999 99 9999 + 016520 9999 99 99 0 9999 99 9999 + 016521 1243 02 01 1 303067160 10 0053 + 016522 1243 02 02 1 303067160 11 0053 + 016523 9999 99 99 0 9999 99 9999 + 016524 9999 99 99 0 9999 99 9999 + 016525 9999 99 99 0 9999 99 9999 + 016526 9999 99 99 0 9999 99 9999 + 016527 9999 99 99 0 9999 99 9999 + 016528 9999 99 99 0 9999 99 9999 + 016529 1243 03 01 1 303067160 12 0053 + 016530 1243 03 02 1 303067160 13 0053 + 016531 9999 99 99 0 9999 99 9999 + 016532 9999 99 99 0 9999 99 9999 + 016533 9999 99 99 0 9999 99 9999 + 016534 9999 99 99 0 9999 99 9999 + 016535 9999 99 99 0 9999 99 9999 + 016536 9999 99 99 0 9999 99 9999 + 016537 1243 04 01 1 303067160 14 0053 + 016538 1243 04 02 1 303067160 15 0053 + 016539 9999 99 99 0 9999 99 9999 + 016540 9999 99 99 0 9999 99 9999 + 016541 9999 99 99 0 9999 99 9999 + 016542 9999 99 99 0 9999 99 9999 + 016543 9999 99 99 0 9999 99 9999 + 016544 9999 99 99 0 9999 99 9999 + 016545 1243 05 01 1 303067160 00 0053 + 016546 1243 05 02 1 303067160 01 0053 + 016547 9999 99 99 0 9999 99 9999 + 016548 9999 99 99 0 9999 99 9999 + 016549 9999 99 99 0 9999 99 9999 + 016550 9999 99 99 0 9999 99 9999 + 016551 9999 99 99 0 9999 99 9999 + 016552 9999 99 99 0 9999 99 9999 + 016553 1243 06 01 1 303067160 02 0053 + 016554 1243 06 02 1 303067160 03 0053 + 016555 9999 99 99 0 9999 99 9999 + 016556 9999 99 99 0 9999 99 9999 + 016557 9999 99 99 0 9999 99 9999 + 016558 9999 99 99 0 9999 99 9999 + 016559 9999 99 99 0 9999 99 9999 + 016560 9999 99 99 0 9999 99 9999 + 016561 1243 07 01 1 303067160 04 0053 + 016562 1243 07 02 1 303067160 05 0053 + 016563 9999 99 99 0 9999 99 9999 + 016564 9999 99 99 0 9999 99 9999 + 016565 9999 99 99 0 9999 99 9999 + 016566 9999 99 99 0 9999 99 9999 + 016567 9999 99 99 0 9999 99 9999 + 016568 9999 99 99 0 9999 99 9999 + 016569 1243 08 01 1 303067160 06 0053 + 016570 1243 08 02 1 303067160 07 0053 + 016571 9999 99 99 0 9999 99 9999 + 016572 9999 99 99 0 9999 99 9999 + 016573 9999 99 99 0 9999 99 9999 + 016574 9999 99 99 0 9999 99 9999 + 016575 9999 99 99 0 9999 99 9999 + 016576 9999 99 99 0 9999 99 9999 + 016577 1243 09 01 1 304148504 00 0213 + 016578 1243 09 02 1 304148504 01 0213 + 016579 1243 09 03 1 304148504 02 0213 + 016580 1243 09 04 1 304148504 03 0213 + 016581 9999 99 99 0 9999 99 9999 + 016582 9999 99 99 0 9999 99 9999 + 016583 9999 99 99 0 9999 99 9999 + 016584 9999 99 99 0 9999 99 9999 + 016585 1243 10 01 1 304148504 04 0213 + 016586 1243 10 02 1 304148504 05 0213 + 016587 1243 10 03 1 304148504 06 0213 + 016588 1243 10 04 1 304148504 07 0213 + 016589 9999 99 99 0 9999 99 9999 + 016590 9999 99 99 0 9999 99 9999 + 016591 9999 99 99 0 9999 99 9999 + 016592 9999 99 99 0 9999 99 9999 + 016593 1243 11 01 1 304148504 08 0213 + 016594 1243 11 02 1 304148504 09 0213 + 016595 1243 11 03 1 304148504 10 0213 + 016596 1243 11 04 1 304148504 11 0213 + 016597 9999 99 99 0 9999 99 9999 + 016598 9999 99 99 0 9999 99 9999 + 016599 9999 99 99 0 9999 99 9999 + 016600 9999 99 99 0 9999 99 9999 + 016601 1243 12 01 1 304148504 12 0213 + 016602 1243 12 02 1 304148504 13 0213 + 016603 1243 12 03 1 304148504 14 0213 + 016604 1243 12 04 1 304148504 15 0213 + 016605 9999 99 99 0 9999 99 9999 + 016606 9999 99 99 0 9999 99 9999 + 016607 9999 99 99 0 9999 99 9999 + 016608 9999 99 99 0 9999 99 9999 + 016609 1243 13 01 1 304148500 08 0212 + 016610 1243 13 02 1 304148500 09 0212 + 016611 1243 13 03 1 304148500 10 0212 + 016612 1243 13 04 1 304148500 11 0212 + 016613 9999 99 99 0 9999 99 9999 + 016614 9999 99 99 0 9999 99 9999 + 016615 9999 99 99 0 9999 99 9999 + 016616 9999 99 99 0 9999 99 9999 + 016617 1243 14 01 1 304148500 12 0212 + 016618 1243 14 02 1 304148500 13 0212 + 016619 1243 14 03 1 304148500 14 0212 + 016620 1243 14 04 1 304148500 15 0212 + 016621 9999 99 99 0 9999 99 9999 + 016622 9999 99 99 0 9999 99 9999 + 016623 9999 99 99 0 9999 99 9999 + 016624 9999 99 99 0 9999 99 9999 + 016625 1243 15 01 1 304148500 00 0212 + 016626 1243 15 02 1 304148500 01 0212 + 016627 1243 15 03 1 304148500 02 0212 + 016628 1243 15 04 1 304148500 03 0212 + 016629 9999 99 99 0 9999 99 9999 + 016630 9999 99 99 0 9999 99 9999 + 016631 9999 99 99 0 9999 99 9999 + 016632 9999 99 99 0 9999 99 9999 + 016633 1243 16 01 1 304148500 04 0212 + 016634 1243 16 02 1 304148500 05 0212 + 016635 1243 16 03 1 304148500 06 0212 + 016636 1243 16 04 1 304148500 07 0212 + 016637 9999 99 99 0 9999 99 9999 + 016638 9999 99 99 0 9999 99 9999 + 016639 9999 99 99 0 9999 99 9999 + 016640 9999 99 99 0 9999 99 9999 + 016641 1243 17 01 1 306319388 00 0934 + 016642 1243 17 02 1 306319388 01 0934 + 016643 1243 17 03 1 306319388 02 0934 + 016644 1243 17 04 1 306319388 03 0934 + 016645 1243 17 05 1 306319388 04 0934 + 016646 1243 17 06 1 306319388 05 0934 + 016647 1243 17 07 1 306319388 06 0934 + 016648 1243 17 08 1 306319388 07 0934 + 016649 1243 18 01 1 306319388 08 0934 + 016650 1243 18 02 1 306319388 09 0934 + 016651 1243 18 03 1 306319388 10 0934 + 016652 1243 18 04 1 306319388 11 0934 + 016653 1243 18 05 1 306319388 12 0934 + 016654 1243 18 06 1 306319388 13 0934 + 016655 1243 18 07 1 306319388 14 0934 + 016656 1243 18 08 1 306319388 15 0934 + 016657 1243 19 01 1 306319392 00 0935 + 016658 1243 19 02 1 306319392 01 0935 + 016659 1243 19 03 1 306319392 02 0935 + 016660 1243 19 04 1 306319392 03 0935 + 016661 1243 19 05 1 306319392 04 0935 + 016662 1243 19 06 1 306319392 05 0935 + 016663 1243 19 07 1 306319392 06 0935 + 016664 1243 19 08 1 306319392 07 0935 + 016665 1243 20 01 1 306319392 08 0935 + 016666 1243 20 02 1 306319392 09 0935 + 016667 1243 20 03 1 306319392 10 0935 + 016668 1243 20 04 1 306319392 11 0935 + 016669 1243 20 05 1 306319392 12 0935 + 016670 1243 20 06 1 306319392 13 0935 + 016671 1243 20 07 1 306319392 14 0935 + 016672 1243 20 08 1 306319392 15 0935 + 016673 1243 21 01 1 306319380 00 0932 + 016674 1243 21 02 1 306319380 01 0932 + 016675 1243 21 03 1 306319380 02 0932 + 016676 1243 21 04 1 306319380 03 0932 + 016677 1243 21 05 1 306319380 04 0932 + 016678 1243 21 06 1 306319380 05 0932 + 016679 1243 21 07 1 306319380 06 0932 + 016680 1243 21 08 1 306319380 07 0932 + 016681 1243 22 01 1 306319380 08 0932 + 016682 1243 22 02 1 306319380 09 0932 + 016683 1243 22 03 1 306319380 10 0932 + 016684 1243 22 04 1 306319380 11 0932 + 016685 1243 22 05 1 306319380 12 0932 + 016686 1243 22 06 1 306319380 13 0932 + 016687 1243 22 07 1 306319380 14 0932 + 016688 1243 22 08 1 306319380 15 0932 + 016689 1243 23 01 1 306319384 00 0933 + 016690 1243 23 02 1 306319384 01 0933 + 016691 1243 23 03 1 306319384 02 0933 + 016692 1243 23 04 1 306319384 03 0933 + 016693 1243 23 05 1 306319384 04 0933 + 016694 1243 23 06 1 306319384 05 0933 + 016695 1243 23 07 1 306319384 06 0933 + 016696 1243 23 08 1 306319384 07 0933 + 016697 1243 24 01 1 306319384 08 0933 + 016698 1243 24 02 1 306319384 09 0933 + 016699 1243 24 03 1 306319384 10 0933 + 016700 1243 24 04 1 306319384 11 0933 + 016701 1243 24 05 1 306319384 12 0933 + 016702 1243 24 06 1 306319384 13 0933 + 016703 1243 24 07 1 306319384 14 0933 + 016704 1243 24 08 1 306319384 15 0933 + 016705 1243 25 01 1 303067164 08 0054 + 016706 1243 25 02 1 303067164 09 0054 + 016707 9999 99 99 0 9999 99 9999 + 016708 9999 99 99 0 9999 99 9999 + 016709 9999 99 99 0 9999 99 9999 + 016710 9999 99 99 0 9999 99 9999 + 016711 9999 99 99 0 9999 99 9999 + 016712 9999 99 99 0 9999 99 9999 + 016713 1243 26 01 1 303067164 10 0054 + 016714 1243 26 02 1 303067164 11 0054 + 016715 9999 99 99 0 9999 99 9999 + 016716 9999 99 99 0 9999 99 9999 + 016717 9999 99 99 0 9999 99 9999 + 016718 9999 99 99 0 9999 99 9999 + 016719 9999 99 99 0 9999 99 9999 + 016720 9999 99 99 0 9999 99 9999 + 016721 1243 27 01 1 303067164 12 0054 + 016722 1243 27 02 1 303067164 13 0054 + 016723 9999 99 99 0 9999 99 9999 + 016724 9999 99 99 0 9999 99 9999 + 016725 9999 99 99 0 9999 99 9999 + 016726 9999 99 99 0 9999 99 9999 + 016727 9999 99 99 0 9999 99 9999 + 016728 9999 99 99 0 9999 99 9999 + 016729 1243 28 01 1 303067164 14 0054 + 016730 1243 28 02 1 303067164 15 0054 + 016731 9999 99 99 0 9999 99 9999 + 016732 9999 99 99 0 9999 99 9999 + 016733 9999 99 99 0 9999 99 9999 + 016734 9999 99 99 0 9999 99 9999 + 016735 9999 99 99 0 9999 99 9999 + 016736 9999 99 99 0 9999 99 9999 + 016737 1243 29 01 1 303067164 04 0054 + 016738 1243 29 02 1 303067164 05 0054 + 016739 9999 99 99 0 9999 99 9999 + 016740 9999 99 99 0 9999 99 9999 + 016741 9999 99 99 0 9999 99 9999 + 016742 9999 99 99 0 9999 99 9999 + 016743 9999 99 99 0 9999 99 9999 + 016744 9999 99 99 0 9999 99 9999 + 016745 1243 30 01 1 303067164 06 0054 + 016746 1243 30 02 1 303067164 07 0054 + 016747 9999 99 99 0 9999 99 9999 + 016748 9999 99 99 0 9999 99 9999 + 016749 9999 99 99 0 9999 99 9999 + 016750 9999 99 99 0 9999 99 9999 + 016751 9999 99 99 0 9999 99 9999 + 016752 9999 99 99 0 9999 99 9999 + 016753 1243 31 01 1 303067164 00 0054 + 016754 1243 31 02 1 303067164 01 0054 + 016755 9999 99 99 0 9999 99 9999 + 016756 9999 99 99 0 9999 99 9999 + 016757 9999 99 99 0 9999 99 9999 + 016758 9999 99 99 0 9999 99 9999 + 016759 9999 99 99 0 9999 99 9999 + 016760 9999 99 99 0 9999 99 9999 + 016761 1243 32 01 1 303067164 02 0054 + 016762 1243 32 02 1 303067164 03 0054 + 016763 9999 99 99 0 9999 99 9999 + 016764 9999 99 99 0 9999 99 9999 + 016765 9999 99 99 0 9999 99 9999 + 016766 9999 99 99 0 9999 99 9999 + 016767 9999 99 99 0 9999 99 9999 + 016768 9999 99 99 0 9999 99 9999 + 016769 1243 33 01 1 306323484 00 0942 + 016770 1243 33 02 1 306323484 01 0942 + 016771 1243 33 03 1 306323484 02 0942 + 016772 1243 33 04 1 306323484 03 0942 + 016773 1243 33 05 1 306323484 04 0942 + 016774 1243 33 06 1 306323484 05 0942 + 016775 1243 33 07 1 306323484 06 0942 + 016776 1243 33 08 1 306323484 07 0942 + 016777 1243 34 01 1 306323484 08 0942 + 016778 1243 34 02 1 306323484 09 0942 + 016779 1243 34 03 1 306323484 10 0942 + 016780 1243 34 04 1 306323484 11 0942 + 016781 1243 34 05 1 306323484 12 0942 + 016782 1243 34 06 1 306323484 13 0942 + 016783 1243 34 07 1 306323484 14 0942 + 016784 1243 34 08 1 306323484 15 0942 + 016785 1243 35 01 1 306323488 00 0943 + 016786 1243 35 02 1 306323488 01 0943 + 016787 1243 35 03 1 306323488 02 0943 + 016788 1243 35 04 1 306323488 03 0943 + 016789 1243 35 05 1 306323488 04 0943 + 016790 1243 35 06 1 306323488 05 0943 + 016791 1243 35 07 1 306323488 06 0943 + 016792 1243 35 08 1 306323488 07 0943 + 016793 1243 36 01 1 306323488 08 0943 + 016794 1243 36 02 1 306323488 09 0943 + 016795 1243 36 03 1 306323488 10 0943 + 016796 1243 36 04 1 306323488 11 0943 + 016797 1243 36 05 1 306323488 12 0943 + 016798 1243 36 06 1 306323488 13 0943 + 016799 1243 36 07 1 306323488 14 0943 + 016800 1243 36 08 1 306323488 15 0943 + 016801 1243 37 01 1 306323476 00 0940 + 016802 1243 37 02 1 306323476 01 0940 + 016803 1243 37 03 1 306323476 02 0940 + 016804 1243 37 04 1 306323476 03 0940 + 016805 1243 37 05 1 306323476 04 0940 + 016806 1243 37 06 1 306323476 05 0940 + 016807 1243 37 07 1 306323476 06 0940 + 016808 1243 37 08 1 306323476 07 0940 + 016809 1243 38 01 1 306323476 08 0940 + 016810 1243 38 02 1 306323476 09 0940 + 016811 1243 38 03 1 306323476 10 0940 + 016812 1243 38 04 1 306323476 11 0940 + 016813 1243 38 05 1 306323476 12 0940 + 016814 1243 38 06 1 306323476 13 0940 + 016815 1243 38 07 1 306323476 14 0940 + 016816 1243 38 08 1 306323476 15 0940 + 016817 1243 39 01 1 306323480 00 0941 + 016818 1243 39 02 1 306323480 01 0941 + 016819 1243 39 03 1 306323480 02 0941 + 016820 1243 39 04 1 306323480 03 0941 + 016821 1243 39 05 1 306323480 04 0941 + 016822 1243 39 06 1 306323480 05 0941 + 016823 1243 39 07 1 306323480 06 0941 + 016824 1243 39 08 1 306323480 07 0941 + 016825 1243 40 01 1 306323480 08 0941 + 016826 1243 40 02 1 306323480 09 0941 + 016827 1243 40 03 1 306323480 10 0941 + 016828 1243 40 04 1 306323480 11 0941 + 016829 1243 40 05 1 306323480 12 0941 + 016830 1243 40 06 1 306323480 13 0941 + 016831 1243 40 07 1 306323480 14 0941 + 016832 1243 40 08 1 306323480 15 0941 + 016833 1243 41 01 1 304148508 00 0214 + 016834 1243 41 02 1 304148508 01 0214 + 016835 1243 41 03 1 304148508 02 0214 + 016836 1243 41 04 1 304148508 03 0214 + 016837 9999 99 99 0 9999 99 9999 + 016838 9999 99 99 0 9999 99 9999 + 016839 9999 99 99 0 9999 99 9999 + 016840 9999 99 99 0 9999 99 9999 + 016841 1243 42 01 1 304148508 04 0214 + 016842 1243 42 02 1 304148508 05 0214 + 016843 1243 42 03 1 304148508 06 0214 + 016844 1243 42 04 1 304148508 07 0214 + 016845 9999 99 99 0 9999 99 9999 + 016846 9999 99 99 0 9999 99 9999 + 016847 9999 99 99 0 9999 99 9999 + 016848 9999 99 99 0 9999 99 9999 + 016849 1243 43 01 1 304148508 08 0214 + 016850 1243 43 02 1 304148508 09 0214 + 016851 1243 43 03 1 304148508 10 0214 + 016852 1243 43 04 1 304148508 11 0214 + 016853 9999 99 99 0 9999 99 9999 + 016854 9999 99 99 0 9999 99 9999 + 016855 9999 99 99 0 9999 99 9999 + 016856 9999 99 99 0 9999 99 9999 + 016857 1243 44 01 1 304148508 12 0214 + 016858 1243 44 02 1 304148508 13 0214 + 016859 1243 44 03 1 304148508 14 0214 + 016860 1243 44 04 1 304148508 15 0214 + 016861 9999 99 99 0 9999 99 9999 + 016862 9999 99 99 0 9999 99 9999 + 016863 9999 99 99 0 9999 99 9999 + 016864 9999 99 99 0 9999 99 9999 + 016865 1243 45 01 1 304148512 00 0215 + 016866 1243 45 02 1 304148512 01 0215 + 016867 1243 45 03 1 304148512 02 0215 + 016868 1243 45 04 1 304148512 03 0215 + 016869 9999 99 99 0 9999 99 9999 + 016870 9999 99 99 0 9999 99 9999 + 016871 9999 99 99 0 9999 99 9999 + 016872 9999 99 99 0 9999 99 9999 + 016873 1243 46 01 1 304148512 04 0215 + 016874 1243 46 02 1 304148512 05 0215 + 016875 1243 46 03 1 304148512 06 0215 + 016876 1243 46 04 1 304148512 07 0215 + 016877 9999 99 99 0 9999 99 9999 + 016878 9999 99 99 0 9999 99 9999 + 016879 9999 99 99 0 9999 99 9999 + 016880 9999 99 99 0 9999 99 9999 + 016881 1243 47 01 1 304148512 08 0215 + 016882 1243 47 02 1 304148512 09 0215 + 016883 1243 47 03 1 304148512 10 0215 + 016884 1243 47 04 1 304148512 11 0215 + 016885 9999 99 99 0 9999 99 9999 + 016886 9999 99 99 0 9999 99 9999 + 016887 9999 99 99 0 9999 99 9999 + 016888 9999 99 99 0 9999 99 9999 + 016889 1243 48 01 1 304148512 12 0215 + 016890 1243 48 02 1 304148512 13 0215 + 016891 1243 48 03 1 304148512 14 0215 + 016892 1243 48 04 1 304148512 15 0215 + 016893 9999 99 99 0 9999 99 9999 + 016894 9999 99 99 0 9999 99 9999 + 016895 9999 99 99 0 9999 99 9999 + 016896 9999 99 99 0 9999 99 9999 + 016897 1244 01 01 1 304152600 08 0221 + 016898 1244 01 02 1 304152600 09 0221 + 016899 1244 01 03 1 304152600 10 0221 + 016900 1244 01 04 1 304152600 11 0221 + 016901 9999 99 99 0 9999 99 9999 + 016902 9999 99 99 0 9999 99 9999 + 016903 9999 99 99 0 9999 99 9999 + 016904 9999 99 99 0 9999 99 9999 + 016905 1244 02 01 1 304152600 12 0221 + 016906 1244 02 02 1 304152600 13 0221 + 016907 1244 02 03 1 304152600 14 0221 + 016908 1244 02 04 1 304152600 15 0221 + 016909 9999 99 99 0 9999 99 9999 + 016910 9999 99 99 0 9999 99 9999 + 016911 9999 99 99 0 9999 99 9999 + 016912 9999 99 99 0 9999 99 9999 + 016913 1244 03 01 1 304152600 00 0221 + 016914 1244 03 02 1 304152600 01 0221 + 016915 1244 03 03 1 304152600 02 0221 + 016916 1244 03 04 1 304152600 03 0221 + 016917 9999 99 99 0 9999 99 9999 + 016918 9999 99 99 0 9999 99 9999 + 016919 9999 99 99 0 9999 99 9999 + 016920 9999 99 99 0 9999 99 9999 + 016921 1244 04 01 1 304152600 04 0221 + 016922 1244 04 02 1 304152600 05 0221 + 016923 1244 04 03 1 304152600 06 0221 + 016924 1244 04 04 1 304152600 07 0221 + 016925 9999 99 99 0 9999 99 9999 + 016926 9999 99 99 0 9999 99 9999 + 016927 9999 99 99 0 9999 99 9999 + 016928 9999 99 99 0 9999 99 9999 + 016929 1244 05 01 1 304152596 08 0220 + 016930 1244 05 02 1 304152596 09 0220 + 016931 1244 05 03 1 304152596 10 0220 + 016932 1244 05 04 1 304152596 11 0220 + 016933 9999 99 99 0 9999 99 9999 + 016934 9999 99 99 0 9999 99 9999 + 016935 9999 99 99 0 9999 99 9999 + 016936 9999 99 99 0 9999 99 9999 + 016937 1244 06 01 1 304152596 12 0220 + 016938 1244 06 02 1 304152596 13 0220 + 016939 1244 06 03 1 304152596 14 0220 + 016940 1244 06 04 1 304152596 15 0220 + 016941 9999 99 99 0 9999 99 9999 + 016942 9999 99 99 0 9999 99 9999 + 016943 9999 99 99 0 9999 99 9999 + 016944 9999 99 99 0 9999 99 9999 + 016945 1244 07 01 1 304152596 00 0220 + 016946 1244 07 02 1 304152596 01 0220 + 016947 1244 07 03 1 304152596 02 0220 + 016948 1244 07 04 1 304152596 03 0220 + 016949 9999 99 99 0 9999 99 9999 + 016950 9999 99 99 0 9999 99 9999 + 016951 9999 99 99 0 9999 99 9999 + 016952 9999 99 99 0 9999 99 9999 + 016953 1244 08 01 1 304152596 04 0220 + 016954 1244 08 02 1 304152596 05 0220 + 016955 1244 08 03 1 304152596 06 0220 + 016956 1244 08 04 1 304152596 07 0220 + 016957 9999 99 99 0 9999 99 9999 + 016958 9999 99 99 0 9999 99 9999 + 016959 9999 99 99 0 9999 99 9999 + 016960 9999 99 99 0 9999 99 9999 + 016961 1244 09 01 1 306327576 00 0949 + 016962 1244 09 02 1 306327576 01 0949 + 016963 1244 09 03 1 306327576 02 0949 + 016964 1244 09 04 1 306327576 03 0949 + 016965 1244 09 05 1 306327576 04 0949 + 016966 1244 09 06 1 306327576 05 0949 + 016967 1244 09 07 1 306327576 06 0949 + 016968 1244 09 08 1 306327576 07 0949 + 016969 1244 10 01 1 306327576 08 0949 + 016970 1244 10 02 1 306327576 09 0949 + 016971 1244 10 03 1 306327576 10 0949 + 016972 1244 10 04 1 306327576 11 0949 + 016973 1244 10 05 1 306327576 12 0949 + 016974 1244 10 06 1 306327576 13 0949 + 016975 1244 10 07 1 306327576 14 0949 + 016976 1244 10 08 1 306327576 15 0949 + 016977 1244 11 01 1 306327572 00 0948 + 016978 1244 11 02 1 306327572 01 0948 + 016979 1244 11 03 1 306327572 02 0948 + 016980 1244 11 04 1 306327572 03 0948 + 016981 1244 11 05 1 306327572 04 0948 + 016982 1244 11 06 1 306327572 05 0948 + 016983 1244 11 07 1 306327572 06 0948 + 016984 1244 11 08 1 306327572 07 0948 + 016985 1244 12 01 1 306327572 08 0948 + 016986 1244 12 02 1 306327572 09 0948 + 016987 1244 12 03 1 306327572 10 0948 + 016988 1244 12 04 1 306327572 11 0948 + 016989 1244 12 05 1 306327572 12 0948 + 016990 1244 12 06 1 306327572 13 0948 + 016991 1244 12 07 1 306327572 14 0948 + 016992 1244 12 08 1 306327572 15 0948 + 016993 1244 13 01 1 306327584 00 0951 + 016994 1244 13 02 1 306327584 01 0951 + 016995 1244 13 03 1 306327584 02 0951 + 016996 1244 13 04 1 306327584 03 0951 + 016997 1244 13 05 1 306327584 04 0951 + 016998 1244 13 06 1 306327584 05 0951 + 016999 1244 13 07 1 306327584 06 0951 + 017000 1244 13 08 1 306327584 07 0951 + 017001 1244 14 01 1 306327584 08 0951 + 017002 1244 14 02 1 306327584 09 0951 + 017003 1244 14 03 1 306327584 10 0951 + 017004 1244 14 04 1 306327584 11 0951 + 017005 1244 14 05 1 306327584 12 0951 + 017006 1244 14 06 1 306327584 13 0951 + 017007 1244 14 07 1 306327584 14 0951 + 017008 1244 14 08 1 306327584 15 0951 + 017009 1244 15 01 1 306327580 00 0950 + 017010 1244 15 02 1 306327580 01 0950 + 017011 1244 15 03 1 306327580 02 0950 + 017012 1244 15 04 1 306327580 03 0950 + 017013 1244 15 05 1 306327580 04 0950 + 017014 1244 15 06 1 306327580 05 0950 + 017015 1244 15 07 1 306327580 06 0950 + 017016 1244 15 08 1 306327580 07 0950 + 017017 1244 16 01 1 306327580 08 0950 + 017018 1244 16 02 1 306327580 09 0950 + 017019 1244 16 03 1 306327580 10 0950 + 017020 1244 16 04 1 306327580 11 0950 + 017021 1244 16 05 1 306327580 12 0950 + 017022 1244 16 06 1 306327580 13 0950 + 017023 1244 16 07 1 306327580 14 0950 + 017024 1244 16 08 1 306327580 15 0950 + 017025 1244 17 01 1 303067168 12 0055 + 017026 1244 17 02 1 303067168 13 0055 + 017027 9999 99 99 0 9999 99 9999 + 017028 9999 99 99 0 9999 99 9999 + 017029 9999 99 99 0 9999 99 9999 + 017030 9999 99 99 0 9999 99 9999 + 017031 9999 99 99 0 9999 99 9999 + 017032 9999 99 99 0 9999 99 9999 + 017033 1244 18 01 1 303067168 14 0055 + 017034 1244 18 02 1 303067168 15 0055 + 017035 9999 99 99 0 9999 99 9999 + 017036 9999 99 99 0 9999 99 9999 + 017037 9999 99 99 0 9999 99 9999 + 017038 9999 99 99 0 9999 99 9999 + 017039 9999 99 99 0 9999 99 9999 + 017040 9999 99 99 0 9999 99 9999 + 017041 1244 19 01 1 303067168 08 0055 + 017042 1244 19 02 1 303067168 09 0055 + 017043 9999 99 99 0 9999 99 9999 + 017044 9999 99 99 0 9999 99 9999 + 017045 9999 99 99 0 9999 99 9999 + 017046 9999 99 99 0 9999 99 9999 + 017047 9999 99 99 0 9999 99 9999 + 017048 9999 99 99 0 9999 99 9999 + 017049 1244 20 01 1 303067168 10 0055 + 017050 1244 20 02 1 303067168 11 0055 + 017051 9999 99 99 0 9999 99 9999 + 017052 9999 99 99 0 9999 99 9999 + 017053 9999 99 99 0 9999 99 9999 + 017054 9999 99 99 0 9999 99 9999 + 017055 9999 99 99 0 9999 99 9999 + 017056 9999 99 99 0 9999 99 9999 + 017057 1244 21 01 1 303067168 00 0055 + 017058 1244 21 02 1 303067168 01 0055 + 017059 9999 99 99 0 9999 99 9999 + 017060 9999 99 99 0 9999 99 9999 + 017061 9999 99 99 0 9999 99 9999 + 017062 9999 99 99 0 9999 99 9999 + 017063 9999 99 99 0 9999 99 9999 + 017064 9999 99 99 0 9999 99 9999 + 017065 1244 22 01 1 303067168 02 0055 + 017066 1244 22 02 1 303067168 03 0055 + 017067 9999 99 99 0 9999 99 9999 + 017068 9999 99 99 0 9999 99 9999 + 017069 9999 99 99 0 9999 99 9999 + 017070 9999 99 99 0 9999 99 9999 + 017071 9999 99 99 0 9999 99 9999 + 017072 9999 99 99 0 9999 99 9999 + 017073 1244 23 01 1 303067168 04 0055 + 017074 1244 23 02 1 303067168 05 0055 + 017075 9999 99 99 0 9999 99 9999 + 017076 9999 99 99 0 9999 99 9999 + 017077 9999 99 99 0 9999 99 9999 + 017078 9999 99 99 0 9999 99 9999 + 017079 9999 99 99 0 9999 99 9999 + 017080 9999 99 99 0 9999 99 9999 + 017081 1244 24 01 1 303067168 06 0055 + 017082 1244 24 02 1 303067168 07 0055 + 017083 9999 99 99 0 9999 99 9999 + 017084 9999 99 99 0 9999 99 9999 + 017085 9999 99 99 0 9999 99 9999 + 017086 9999 99 99 0 9999 99 9999 + 017087 9999 99 99 0 9999 99 9999 + 017088 9999 99 99 0 9999 99 9999 + 017089 1244 25 01 1 305229852 00 0502 + 017090 1244 25 02 1 305229852 01 0502 + 017091 1244 25 03 1 305229852 02 0502 + 017092 1244 25 04 1 305229852 03 0502 + 017093 1244 25 05 1 305229852 04 0502 + 017094 1244 25 06 1 305229852 05 0502 + 017095 1244 25 07 1 305229852 06 0502 + 017096 1244 25 08 1 305229852 07 0502 + 017097 1244 26 01 1 305229852 08 0502 + 017098 1244 26 02 1 305229852 09 0502 + 017099 1244 26 03 1 305229852 10 0502 + 017100 1244 26 04 1 305229852 11 0502 + 017101 1244 26 05 1 305229852 12 0502 + 017102 1244 26 06 1 305229852 13 0502 + 017103 1244 26 07 1 305229852 14 0502 + 017104 1244 26 08 1 305229852 15 0502 + 017105 1244 27 01 1 305229856 00 0503 + 017106 1244 27 02 1 305229856 01 0503 + 017107 1244 27 03 1 305229856 02 0503 + 017108 1244 27 04 1 305229856 03 0503 + 017109 1244 27 05 1 305229856 04 0503 + 017110 1244 27 06 1 305229856 05 0503 + 017111 1244 27 07 1 305229856 06 0503 + 017112 1244 27 08 1 305229856 07 0503 + 017113 1244 28 01 1 305229856 08 0503 + 017114 1244 28 02 1 305229856 09 0503 + 017115 1244 28 03 1 305229856 10 0503 + 017116 1244 28 04 1 305229856 11 0503 + 017117 1244 28 05 1 305229856 12 0503 + 017118 1244 28 06 1 305229856 13 0503 + 017119 1244 28 07 1 305229856 14 0503 + 017120 1244 28 08 1 305229856 15 0503 + 017121 1244 29 01 1 305229844 00 0500 + 017122 1244 29 02 1 305229844 01 0500 + 017123 1244 29 03 1 305229844 02 0500 + 017124 1244 29 04 1 305229844 03 0500 + 017125 1244 29 05 1 305229844 04 0500 + 017126 1244 29 06 1 305229844 05 0500 + 017127 1244 29 07 1 305229844 06 0500 + 017128 1244 29 08 1 305229844 07 0500 + 017129 1244 30 01 1 305229844 08 0500 + 017130 1244 30 02 1 305229844 09 0500 + 017131 1244 30 03 1 305229844 10 0500 + 017132 1244 30 04 1 305229844 11 0500 + 017133 1244 30 05 1 305229844 12 0500 + 017134 1244 30 06 1 305229844 13 0500 + 017135 1244 30 07 1 305229844 14 0500 + 017136 1244 30 08 1 305229844 15 0500 + 017137 1244 31 01 1 305229848 00 0501 + 017138 1244 31 02 1 305229848 01 0501 + 017139 1244 31 03 1 305229848 02 0501 + 017140 1244 31 04 1 305229848 03 0501 + 017141 1244 31 05 1 305229848 04 0501 + 017142 1244 31 06 1 305229848 05 0501 + 017143 1244 31 07 1 305229848 06 0501 + 017144 1244 31 08 1 305229848 07 0501 + 017145 1244 32 01 1 305229848 08 0501 + 017146 1244 32 02 1 305229848 09 0501 + 017147 1244 32 03 1 305229848 10 0501 + 017148 1244 32 04 1 305229848 11 0501 + 017149 1244 32 05 1 305229848 12 0501 + 017150 1244 32 06 1 305229848 13 0501 + 017151 1244 32 07 1 305229848 14 0501 + 017152 1244 32 08 1 305229848 15 0501 + 017153 1244 33 01 1 306331672 00 0957 + 017154 1244 33 02 1 306331672 01 0957 + 017155 1244 33 03 1 306331672 02 0957 + 017156 1244 33 04 1 306331672 03 0957 + 017157 1244 33 05 1 306331672 04 0957 + 017158 1244 33 06 1 306331672 05 0957 + 017159 1244 33 07 1 306331672 06 0957 + 017160 1244 33 08 1 306331672 07 0957 + 017161 1244 34 01 1 306331672 08 0957 + 017162 1244 34 02 1 306331672 09 0957 + 017163 1244 34 03 1 306331672 10 0957 + 017164 1244 34 04 1 306331672 11 0957 + 017165 1244 34 05 1 306331672 12 0957 + 017166 1244 34 06 1 306331672 13 0957 + 017167 1244 34 07 1 306331672 14 0957 + 017168 1244 34 08 1 306331672 15 0957 + 017169 1244 35 01 1 306331668 00 0956 + 017170 1244 35 02 1 306331668 01 0956 + 017171 1244 35 03 1 306331668 02 0956 + 017172 1244 35 04 1 306331668 03 0956 + 017173 1244 35 05 1 306331668 04 0956 + 017174 1244 35 06 1 306331668 05 0956 + 017175 1244 35 07 1 306331668 06 0956 + 017176 1244 35 08 1 306331668 07 0956 + 017177 1244 36 01 1 306331668 08 0956 + 017178 1244 36 02 1 306331668 09 0956 + 017179 1244 36 03 1 306331668 10 0956 + 017180 1244 36 04 1 306331668 11 0956 + 017181 1244 36 05 1 306331668 12 0956 + 017182 1244 36 06 1 306331668 13 0956 + 017183 1244 36 07 1 306331668 14 0956 + 017184 1244 36 08 1 306331668 15 0956 + 017185 1244 37 01 1 306331680 00 0959 + 017186 1244 37 02 1 306331680 01 0959 + 017187 1244 37 03 1 306331680 02 0959 + 017188 1244 37 04 1 306331680 03 0959 + 017189 1244 37 05 1 306331680 04 0959 + 017190 1244 37 06 1 306331680 05 0959 + 017191 1244 37 07 1 306331680 06 0959 + 017192 1244 37 08 1 306331680 07 0959 + 017193 1244 38 01 1 306331680 08 0959 + 017194 1244 38 02 1 306331680 09 0959 + 017195 1244 38 03 1 306331680 10 0959 + 017196 1244 38 04 1 306331680 11 0959 + 017197 1244 38 05 1 306331680 12 0959 + 017198 1244 38 06 1 306331680 13 0959 + 017199 1244 38 07 1 306331680 14 0959 + 017200 1244 38 08 1 306331680 15 0959 + 017201 1244 39 01 1 306331676 00 0958 + 017202 1244 39 02 1 306331676 01 0958 + 017203 1244 39 03 1 306331676 02 0958 + 017204 1244 39 04 1 306331676 03 0958 + 017205 1244 39 05 1 306331676 04 0958 + 017206 1244 39 06 1 306331676 05 0958 + 017207 1244 39 07 1 306331676 06 0958 + 017208 1244 39 08 1 306331676 07 0958 + 017209 1244 40 01 1 306331676 08 0958 + 017210 1244 40 02 1 306331676 09 0958 + 017211 1244 40 03 1 306331676 10 0958 + 017212 1244 40 04 1 306331676 11 0958 + 017213 1244 40 05 1 306331676 12 0958 + 017214 1244 40 06 1 306331676 13 0958 + 017215 1244 40 07 1 306331676 14 0958 + 017216 1244 40 08 1 306331676 15 0958 + 017217 1244 41 01 1 304152608 08 0223 + 017218 1244 41 02 1 304152608 09 0223 + 017219 1244 41 03 1 304152608 10 0223 + 017220 1244 41 04 1 304152608 11 0223 + 017221 9999 99 99 0 9999 99 9999 + 017222 9999 99 99 0 9999 99 9999 + 017223 9999 99 99 0 9999 99 9999 + 017224 9999 99 99 0 9999 99 9999 + 017225 1244 42 01 1 304152608 12 0223 + 017226 1244 42 02 1 304152608 13 0223 + 017227 1244 42 03 1 304152608 14 0223 + 017228 1244 42 04 1 304152608 15 0223 + 017229 9999 99 99 0 9999 99 9999 + 017230 9999 99 99 0 9999 99 9999 + 017231 9999 99 99 0 9999 99 9999 + 017232 9999 99 99 0 9999 99 9999 + 017233 1244 43 01 1 304152608 00 0223 + 017234 1244 43 02 1 304152608 01 0223 + 017235 1244 43 03 1 304152608 02 0223 + 017236 1244 43 04 1 304152608 03 0223 + 017237 9999 99 99 0 9999 99 9999 + 017238 9999 99 99 0 9999 99 9999 + 017239 9999 99 99 0 9999 99 9999 + 017240 9999 99 99 0 9999 99 9999 + 017241 1244 44 01 1 304152608 04 0223 + 017242 1244 44 02 1 304152608 05 0223 + 017243 1244 44 03 1 304152608 06 0223 + 017244 1244 44 04 1 304152608 07 0223 + 017245 9999 99 99 0 9999 99 9999 + 017246 9999 99 99 0 9999 99 9999 + 017247 9999 99 99 0 9999 99 9999 + 017248 9999 99 99 0 9999 99 9999 + 017249 1244 45 01 1 304152604 08 0222 + 017250 1244 45 02 1 304152604 09 0222 + 017251 1244 45 03 1 304152604 10 0222 + 017252 1244 45 04 1 304152604 11 0222 + 017253 9999 99 99 0 9999 99 9999 + 017254 9999 99 99 0 9999 99 9999 + 017255 9999 99 99 0 9999 99 9999 + 017256 9999 99 99 0 9999 99 9999 + 017257 1244 46 01 1 304152604 12 0222 + 017258 1244 46 02 1 304152604 13 0222 + 017259 1244 46 03 1 304152604 14 0222 + 017260 1244 46 04 1 304152604 15 0222 + 017261 9999 99 99 0 9999 99 9999 + 017262 9999 99 99 0 9999 99 9999 + 017263 9999 99 99 0 9999 99 9999 + 017264 9999 99 99 0 9999 99 9999 + 017265 1244 47 01 1 304152604 00 0222 + 017266 1244 47 02 1 304152604 01 0222 + 017267 1244 47 03 1 304152604 02 0222 + 017268 1244 47 04 1 304152604 03 0222 + 017269 9999 99 99 0 9999 99 9999 + 017270 9999 99 99 0 9999 99 9999 + 017271 9999 99 99 0 9999 99 9999 + 017272 9999 99 99 0 9999 99 9999 + 017273 1244 48 01 1 304152604 04 0222 + 017274 1244 48 02 1 304152604 05 0222 + 017275 1244 48 03 1 304152604 06 0222 + 017276 1244 48 04 1 304152604 07 0222 + 017277 9999 99 99 0 9999 99 9999 + 017278 9999 99 99 0 9999 99 9999 + 017279 9999 99 99 0 9999 99 9999 + 017280 9999 99 99 0 9999 99 9999 + 017281 1245 01 01 1 305233948 00 0510 + 017282 1245 01 02 1 305233948 01 0510 + 017283 1245 01 03 1 305233948 02 0510 + 017284 1245 01 04 1 305233948 03 0510 + 017285 1245 01 05 1 305233948 04 0510 + 017286 1245 01 06 1 305233948 05 0510 + 017287 1245 01 07 1 305233948 06 0510 + 017288 1245 01 08 1 305233948 07 0510 + 017289 1245 02 01 1 305233948 08 0510 + 017290 1245 02 02 1 305233948 09 0510 + 017291 1245 02 03 1 305233948 10 0510 + 017292 1245 02 04 1 305233948 11 0510 + 017293 1245 02 05 1 305233948 12 0510 + 017294 1245 02 06 1 305233948 13 0510 + 017295 1245 02 07 1 305233948 14 0510 + 017296 1245 02 08 1 305233948 15 0510 + 017297 1245 03 01 1 305233952 00 0511 + 017298 1245 03 02 1 305233952 01 0511 + 017299 1245 03 03 1 305233952 02 0511 + 017300 1245 03 04 1 305233952 03 0511 + 017301 1245 03 05 1 305233952 04 0511 + 017302 1245 03 06 1 305233952 05 0511 + 017303 1245 03 07 1 305233952 06 0511 + 017304 1245 03 08 1 305233952 07 0511 + 017305 1245 04 01 1 305233952 08 0511 + 017306 1245 04 02 1 305233952 09 0511 + 017307 1245 04 03 1 305233952 10 0511 + 017308 1245 04 04 1 305233952 11 0511 + 017309 1245 04 05 1 305233952 12 0511 + 017310 1245 04 06 1 305233952 13 0511 + 017311 1245 04 07 1 305233952 14 0511 + 017312 1245 04 08 1 305233952 15 0511 + 017313 1245 05 01 1 305233940 00 0508 + 017314 1245 05 02 1 305233940 01 0508 + 017315 1245 05 03 1 305233940 02 0508 + 017316 1245 05 04 1 305233940 03 0508 + 017317 1245 05 05 1 305233940 04 0508 + 017318 1245 05 06 1 305233940 05 0508 + 017319 1245 05 07 1 305233940 06 0508 + 017320 1245 05 08 1 305233940 07 0508 + 017321 1245 06 01 1 305233940 08 0508 + 017322 1245 06 02 1 305233940 09 0508 + 017323 1245 06 03 1 305233940 10 0508 + 017324 1245 06 04 1 305233940 11 0508 + 017325 1245 06 05 1 305233940 12 0508 + 017326 1245 06 06 1 305233940 13 0508 + 017327 1245 06 07 1 305233940 14 0508 + 017328 1245 06 08 1 305233940 15 0508 + 017329 1245 07 01 1 305233944 00 0509 + 017330 1245 07 02 1 305233944 01 0509 + 017331 1245 07 03 1 305233944 02 0509 + 017332 1245 07 04 1 305233944 03 0509 + 017333 1245 07 05 1 305233944 04 0509 + 017334 1245 07 06 1 305233944 05 0509 + 017335 1245 07 07 1 305233944 06 0509 + 017336 1245 07 08 1 305233944 07 0509 + 017337 1245 08 01 1 305233944 08 0509 + 017338 1245 08 02 1 305233944 09 0509 + 017339 1245 08 03 1 305233944 10 0509 + 017340 1245 08 04 1 305233944 11 0509 + 017341 1245 08 05 1 305233944 12 0509 + 017342 1245 08 06 1 305233944 13 0509 + 017343 1245 08 07 1 305233944 14 0509 + 017344 1245 08 08 1 305233944 15 0509 + 017345 1245 09 01 1 305238040 00 0517 + 017346 1245 09 02 1 305238040 01 0517 + 017347 1245 09 03 1 305238040 02 0517 + 017348 1245 09 04 1 305238040 03 0517 + 017349 1245 09 05 1 305238040 04 0517 + 017350 1245 09 06 1 305238040 05 0517 + 017351 1245 09 07 1 305238040 06 0517 + 017352 1245 09 08 1 305238040 07 0517 + 017353 1245 10 01 1 305238040 08 0517 + 017354 1245 10 02 1 305238040 09 0517 + 017355 1245 10 03 1 305238040 10 0517 + 017356 1245 10 04 1 305238040 11 0517 + 017357 1245 10 05 1 305238040 12 0517 + 017358 1245 10 06 1 305238040 13 0517 + 017359 1245 10 07 1 305238040 14 0517 + 017360 1245 10 08 1 305238040 15 0517 + 017361 1245 11 01 1 305238036 00 0516 + 017362 1245 11 02 1 305238036 01 0516 + 017363 1245 11 03 1 305238036 02 0516 + 017364 1245 11 04 1 305238036 03 0516 + 017365 1245 11 05 1 305238036 04 0516 + 017366 1245 11 06 1 305238036 05 0516 + 017367 1245 11 07 1 305238036 06 0516 + 017368 1245 11 08 1 305238036 07 0516 + 017369 1245 12 01 1 305238036 08 0516 + 017370 1245 12 02 1 305238036 09 0516 + 017371 1245 12 03 1 305238036 10 0516 + 017372 1245 12 04 1 305238036 11 0516 + 017373 1245 12 05 1 305238036 12 0516 + 017374 1245 12 06 1 305238036 13 0516 + 017375 1245 12 07 1 305238036 14 0516 + 017376 1245 12 08 1 305238036 15 0516 + 017377 1245 13 01 1 305238048 00 0519 + 017378 1245 13 02 1 305238048 01 0519 + 017379 1245 13 03 1 305238048 02 0519 + 017380 1245 13 04 1 305238048 03 0519 + 017381 1245 13 05 1 305238048 04 0519 + 017382 1245 13 06 1 305238048 05 0519 + 017383 1245 13 07 1 305238048 06 0519 + 017384 1245 13 08 1 305238048 07 0519 + 017385 1245 14 01 1 305238048 08 0519 + 017386 1245 14 02 1 305238048 09 0519 + 017387 1245 14 03 1 305238048 10 0519 + 017388 1245 14 04 1 305238048 11 0519 + 017389 1245 14 05 1 305238048 12 0519 + 017390 1245 14 06 1 305238048 13 0519 + 017391 1245 14 07 1 305238048 14 0519 + 017392 1245 14 08 1 305238048 15 0519 + 017393 1245 15 01 1 305238044 00 0518 + 017394 1245 15 02 1 305238044 01 0518 + 017395 1245 15 03 1 305238044 02 0518 + 017396 1245 15 04 1 305238044 03 0518 + 017397 1245 15 05 1 305238044 04 0518 + 017398 1245 15 06 1 305238044 05 0518 + 017399 1245 15 07 1 305238044 06 0518 + 017400 1245 15 08 1 305238044 07 0518 + 017401 1245 16 01 1 305238044 08 0518 + 017402 1245 16 02 1 305238044 09 0518 + 017403 1245 16 03 1 305238044 10 0518 + 017404 1245 16 04 1 305238044 11 0518 + 017405 1245 16 05 1 305238044 12 0518 + 017406 1245 16 06 1 305238044 13 0518 + 017407 1245 16 07 1 305238044 14 0518 + 017408 1245 16 08 1 305238044 15 0518 + 017409 9999 99 99 0 9999 99 9999 + 017410 9999 99 99 0 9999 99 9999 + 017411 9999 99 99 0 9999 99 9999 + 017412 9999 99 99 0 9999 99 9999 + 017413 9999 99 99 0 9999 99 9999 + 017414 9999 99 99 0 9999 99 9999 + 017415 9999 99 99 0 9999 99 9999 + 017416 9999 99 99 0 9999 99 9999 + 017417 9999 99 99 0 9999 99 9999 + 017418 9999 99 99 0 9999 99 9999 + 017419 9999 99 99 0 9999 99 9999 + 017420 9999 99 99 0 9999 99 9999 + 017421 9999 99 99 0 9999 99 9999 + 017422 9999 99 99 0 9999 99 9999 + 017423 9999 99 99 0 9999 99 9999 + 017424 9999 99 99 0 9999 99 9999 + 017425 9999 99 99 0 9999 99 9999 + 017426 9999 99 99 0 9999 99 9999 + 017427 9999 99 99 0 9999 99 9999 + 017428 9999 99 99 0 9999 99 9999 + 017429 9999 99 99 0 9999 99 9999 + 017430 9999 99 99 0 9999 99 9999 + 017431 9999 99 99 0 9999 99 9999 + 017432 9999 99 99 0 9999 99 9999 + 017433 9999 99 99 0 9999 99 9999 + 017434 9999 99 99 0 9999 99 9999 + 017435 9999 99 99 0 9999 99 9999 + 017436 9999 99 99 0 9999 99 9999 + 017437 9999 99 99 0 9999 99 9999 + 017438 9999 99 99 0 9999 99 9999 + 017439 9999 99 99 0 9999 99 9999 + 017440 9999 99 99 0 9999 99 9999 + 017441 9999 99 99 0 9999 99 9999 + 017442 9999 99 99 0 9999 99 9999 + 017443 9999 99 99 0 9999 99 9999 + 017444 9999 99 99 0 9999 99 9999 + 017445 9999 99 99 0 9999 99 9999 + 017446 9999 99 99 0 9999 99 9999 + 017447 9999 99 99 0 9999 99 9999 + 017448 9999 99 99 0 9999 99 9999 + 017449 9999 99 99 0 9999 99 9999 + 017450 9999 99 99 0 9999 99 9999 + 017451 9999 99 99 0 9999 99 9999 + 017452 9999 99 99 0 9999 99 9999 + 017453 9999 99 99 0 9999 99 9999 + 017454 9999 99 99 0 9999 99 9999 + 017455 9999 99 99 0 9999 99 9999 + 017456 9999 99 99 0 9999 99 9999 + 017457 9999 99 99 0 9999 99 9999 + 017458 9999 99 99 0 9999 99 9999 + 017459 9999 99 99 0 9999 99 9999 + 017460 9999 99 99 0 9999 99 9999 + 017461 9999 99 99 0 9999 99 9999 + 017462 9999 99 99 0 9999 99 9999 + 017463 9999 99 99 0 9999 99 9999 + 017464 9999 99 99 0 9999 99 9999 + 017465 9999 99 99 0 9999 99 9999 + 017466 9999 99 99 0 9999 99 9999 + 017467 9999 99 99 0 9999 99 9999 + 017468 9999 99 99 0 9999 99 9999 + 017469 9999 99 99 0 9999 99 9999 + 017470 9999 99 99 0 9999 99 9999 + 017471 9999 99 99 0 9999 99 9999 + 017472 9999 99 99 0 9999 99 9999 + 017473 9999 99 99 0 9999 99 9999 + 017474 9999 99 99 0 9999 99 9999 + 017475 9999 99 99 0 9999 99 9999 + 017476 9999 99 99 0 9999 99 9999 + 017477 9999 99 99 0 9999 99 9999 + 017478 9999 99 99 0 9999 99 9999 + 017479 9999 99 99 0 9999 99 9999 + 017480 9999 99 99 0 9999 99 9999 + 017481 9999 99 99 0 9999 99 9999 + 017482 9999 99 99 0 9999 99 9999 + 017483 9999 99 99 0 9999 99 9999 + 017484 9999 99 99 0 9999 99 9999 + 017485 9999 99 99 0 9999 99 9999 + 017486 9999 99 99 0 9999 99 9999 + 017487 9999 99 99 0 9999 99 9999 + 017488 9999 99 99 0 9999 99 9999 + 017489 9999 99 99 0 9999 99 9999 + 017490 9999 99 99 0 9999 99 9999 + 017491 9999 99 99 0 9999 99 9999 + 017492 9999 99 99 0 9999 99 9999 + 017493 9999 99 99 0 9999 99 9999 + 017494 9999 99 99 0 9999 99 9999 + 017495 9999 99 99 0 9999 99 9999 + 017496 9999 99 99 0 9999 99 9999 + 017497 9999 99 99 0 9999 99 9999 + 017498 9999 99 99 0 9999 99 9999 + 017499 9999 99 99 0 9999 99 9999 + 017500 9999 99 99 0 9999 99 9999 + 017501 9999 99 99 0 9999 99 9999 + 017502 9999 99 99 0 9999 99 9999 + 017503 9999 99 99 0 9999 99 9999 + 017504 9999 99 99 0 9999 99 9999 + 017505 9999 99 99 0 9999 99 9999 + 017506 9999 99 99 0 9999 99 9999 + 017507 9999 99 99 0 9999 99 9999 + 017508 9999 99 99 0 9999 99 9999 + 017509 9999 99 99 0 9999 99 9999 + 017510 9999 99 99 0 9999 99 9999 + 017511 9999 99 99 0 9999 99 9999 + 017512 9999 99 99 0 9999 99 9999 + 017513 9999 99 99 0 9999 99 9999 + 017514 9999 99 99 0 9999 99 9999 + 017515 9999 99 99 0 9999 99 9999 + 017516 9999 99 99 0 9999 99 9999 + 017517 9999 99 99 0 9999 99 9999 + 017518 9999 99 99 0 9999 99 9999 + 017519 9999 99 99 0 9999 99 9999 + 017520 9999 99 99 0 9999 99 9999 + 017521 9999 99 99 0 9999 99 9999 + 017522 9999 99 99 0 9999 99 9999 + 017523 9999 99 99 0 9999 99 9999 + 017524 9999 99 99 0 9999 99 9999 + 017525 9999 99 99 0 9999 99 9999 + 017526 9999 99 99 0 9999 99 9999 + 017527 9999 99 99 0 9999 99 9999 + 017528 9999 99 99 0 9999 99 9999 + 017529 9999 99 99 0 9999 99 9999 + 017530 9999 99 99 0 9999 99 9999 + 017531 9999 99 99 0 9999 99 9999 + 017532 9999 99 99 0 9999 99 9999 + 017533 9999 99 99 0 9999 99 9999 + 017534 9999 99 99 0 9999 99 9999 + 017535 9999 99 99 0 9999 99 9999 + 017536 9999 99 99 0 9999 99 9999 + 017537 9999 99 99 0 9999 99 9999 + 017538 9999 99 99 0 9999 99 9999 + 017539 9999 99 99 0 9999 99 9999 + 017540 9999 99 99 0 9999 99 9999 + 017541 9999 99 99 0 9999 99 9999 + 017542 9999 99 99 0 9999 99 9999 + 017543 9999 99 99 0 9999 99 9999 + 017544 9999 99 99 0 9999 99 9999 + 017545 9999 99 99 0 9999 99 9999 + 017546 9999 99 99 0 9999 99 9999 + 017547 9999 99 99 0 9999 99 9999 + 017548 9999 99 99 0 9999 99 9999 + 017549 9999 99 99 0 9999 99 9999 + 017550 9999 99 99 0 9999 99 9999 + 017551 9999 99 99 0 9999 99 9999 + 017552 9999 99 99 0 9999 99 9999 + 017553 9999 99 99 0 9999 99 9999 + 017554 9999 99 99 0 9999 99 9999 + 017555 9999 99 99 0 9999 99 9999 + 017556 9999 99 99 0 9999 99 9999 + 017557 9999 99 99 0 9999 99 9999 + 017558 9999 99 99 0 9999 99 9999 + 017559 9999 99 99 0 9999 99 9999 + 017560 9999 99 99 0 9999 99 9999 + 017561 9999 99 99 0 9999 99 9999 + 017562 9999 99 99 0 9999 99 9999 + 017563 9999 99 99 0 9999 99 9999 + 017564 9999 99 99 0 9999 99 9999 + 017565 9999 99 99 0 9999 99 9999 + 017566 9999 99 99 0 9999 99 9999 + 017567 9999 99 99 0 9999 99 9999 + 017568 9999 99 99 0 9999 99 9999 + 017569 9999 99 99 0 9999 99 9999 + 017570 9999 99 99 0 9999 99 9999 + 017571 9999 99 99 0 9999 99 9999 + 017572 9999 99 99 0 9999 99 9999 + 017573 9999 99 99 0 9999 99 9999 + 017574 9999 99 99 0 9999 99 9999 + 017575 9999 99 99 0 9999 99 9999 + 017576 9999 99 99 0 9999 99 9999 + 017577 9999 99 99 0 9999 99 9999 + 017578 9999 99 99 0 9999 99 9999 + 017579 9999 99 99 0 9999 99 9999 + 017580 9999 99 99 0 9999 99 9999 + 017581 9999 99 99 0 9999 99 9999 + 017582 9999 99 99 0 9999 99 9999 + 017583 9999 99 99 0 9999 99 9999 + 017584 9999 99 99 0 9999 99 9999 + 017585 9999 99 99 0 9999 99 9999 + 017586 9999 99 99 0 9999 99 9999 + 017587 9999 99 99 0 9999 99 9999 + 017588 9999 99 99 0 9999 99 9999 + 017589 9999 99 99 0 9999 99 9999 + 017590 9999 99 99 0 9999 99 9999 + 017591 9999 99 99 0 9999 99 9999 + 017592 9999 99 99 0 9999 99 9999 + 017593 9999 99 99 0 9999 99 9999 + 017594 9999 99 99 0 9999 99 9999 + 017595 9999 99 99 0 9999 99 9999 + 017596 9999 99 99 0 9999 99 9999 + 017597 9999 99 99 0 9999 99 9999 + 017598 9999 99 99 0 9999 99 9999 + 017599 9999 99 99 0 9999 99 9999 + 017600 9999 99 99 0 9999 99 9999 + 017601 9999 99 99 0 9999 99 9999 + 017602 9999 99 99 0 9999 99 9999 + 017603 9999 99 99 0 9999 99 9999 + 017604 9999 99 99 0 9999 99 9999 + 017605 9999 99 99 0 9999 99 9999 + 017606 9999 99 99 0 9999 99 9999 + 017607 9999 99 99 0 9999 99 9999 + 017608 9999 99 99 0 9999 99 9999 + 017609 9999 99 99 0 9999 99 9999 + 017610 9999 99 99 0 9999 99 9999 + 017611 9999 99 99 0 9999 99 9999 + 017612 9999 99 99 0 9999 99 9999 + 017613 9999 99 99 0 9999 99 9999 + 017614 9999 99 99 0 9999 99 9999 + 017615 9999 99 99 0 9999 99 9999 + 017616 9999 99 99 0 9999 99 9999 + 017617 9999 99 99 0 9999 99 9999 + 017618 9999 99 99 0 9999 99 9999 + 017619 9999 99 99 0 9999 99 9999 + 017620 9999 99 99 0 9999 99 9999 + 017621 9999 99 99 0 9999 99 9999 + 017622 9999 99 99 0 9999 99 9999 + 017623 9999 99 99 0 9999 99 9999 + 017624 9999 99 99 0 9999 99 9999 + 017625 9999 99 99 0 9999 99 9999 + 017626 9999 99 99 0 9999 99 9999 + 017627 9999 99 99 0 9999 99 9999 + 017628 9999 99 99 0 9999 99 9999 + 017629 9999 99 99 0 9999 99 9999 + 017630 9999 99 99 0 9999 99 9999 + 017631 9999 99 99 0 9999 99 9999 + 017632 9999 99 99 0 9999 99 9999 + 017633 9999 99 99 0 9999 99 9999 + 017634 9999 99 99 0 9999 99 9999 + 017635 9999 99 99 0 9999 99 9999 + 017636 9999 99 99 0 9999 99 9999 + 017637 9999 99 99 0 9999 99 9999 + 017638 9999 99 99 0 9999 99 9999 + 017639 9999 99 99 0 9999 99 9999 + 017640 9999 99 99 0 9999 99 9999 + 017641 9999 99 99 0 9999 99 9999 + 017642 9999 99 99 0 9999 99 9999 + 017643 9999 99 99 0 9999 99 9999 + 017644 9999 99 99 0 9999 99 9999 + 017645 9999 99 99 0 9999 99 9999 + 017646 9999 99 99 0 9999 99 9999 + 017647 9999 99 99 0 9999 99 9999 + 017648 9999 99 99 0 9999 99 9999 + 017649 9999 99 99 0 9999 99 9999 + 017650 9999 99 99 0 9999 99 9999 + 017651 9999 99 99 0 9999 99 9999 + 017652 9999 99 99 0 9999 99 9999 + 017653 9999 99 99 0 9999 99 9999 + 017654 9999 99 99 0 9999 99 9999 + 017655 9999 99 99 0 9999 99 9999 + 017656 9999 99 99 0 9999 99 9999 + 017657 9999 99 99 0 9999 99 9999 + 017658 9999 99 99 0 9999 99 9999 + 017659 9999 99 99 0 9999 99 9999 + 017660 9999 99 99 0 9999 99 9999 + 017661 9999 99 99 0 9999 99 9999 + 017662 9999 99 99 0 9999 99 9999 + 017663 9999 99 99 0 9999 99 9999 + 017664 9999 99 99 0 9999 99 9999 + 017665 9999 99 99 0 9999 99 9999 + 017666 9999 99 99 0 9999 99 9999 + 017667 9999 99 99 0 9999 99 9999 + 017668 9999 99 99 0 9999 99 9999 + 017669 9999 99 99 0 9999 99 9999 + 017670 9999 99 99 0 9999 99 9999 + 017671 9999 99 99 0 9999 99 9999 + 017672 9999 99 99 0 9999 99 9999 + 017673 9999 99 99 0 9999 99 9999 + 017674 9999 99 99 0 9999 99 9999 + 017675 9999 99 99 0 9999 99 9999 + 017676 9999 99 99 0 9999 99 9999 + 017677 9999 99 99 0 9999 99 9999 + 017678 9999 99 99 0 9999 99 9999 + 017679 9999 99 99 0 9999 99 9999 + 017680 9999 99 99 0 9999 99 9999 + 017681 9999 99 99 0 9999 99 9999 + 017682 9999 99 99 0 9999 99 9999 + 017683 9999 99 99 0 9999 99 9999 + 017684 9999 99 99 0 9999 99 9999 + 017685 9999 99 99 0 9999 99 9999 + 017686 9999 99 99 0 9999 99 9999 + 017687 9999 99 99 0 9999 99 9999 + 017688 9999 99 99 0 9999 99 9999 + 017689 9999 99 99 0 9999 99 9999 + 017690 9999 99 99 0 9999 99 9999 + 017691 9999 99 99 0 9999 99 9999 + 017692 9999 99 99 0 9999 99 9999 + 017693 9999 99 99 0 9999 99 9999 + 017694 9999 99 99 0 9999 99 9999 + 017695 9999 99 99 0 9999 99 9999 + 017696 9999 99 99 0 9999 99 9999 + 017697 9999 99 99 0 9999 99 9999 + 017698 9999 99 99 0 9999 99 9999 + 017699 9999 99 99 0 9999 99 9999 + 017700 9999 99 99 0 9999 99 9999 + 017701 9999 99 99 0 9999 99 9999 + 017702 9999 99 99 0 9999 99 9999 + 017703 9999 99 99 0 9999 99 9999 + 017704 9999 99 99 0 9999 99 9999 + 017705 9999 99 99 0 9999 99 9999 + 017706 9999 99 99 0 9999 99 9999 + 017707 9999 99 99 0 9999 99 9999 + 017708 9999 99 99 0 9999 99 9999 + 017709 9999 99 99 0 9999 99 9999 + 017710 9999 99 99 0 9999 99 9999 + 017711 9999 99 99 0 9999 99 9999 + 017712 9999 99 99 0 9999 99 9999 + 017713 9999 99 99 0 9999 99 9999 + 017714 9999 99 99 0 9999 99 9999 + 017715 9999 99 99 0 9999 99 9999 + 017716 9999 99 99 0 9999 99 9999 + 017717 9999 99 99 0 9999 99 9999 + 017718 9999 99 99 0 9999 99 9999 + 017719 9999 99 99 0 9999 99 9999 + 017720 9999 99 99 0 9999 99 9999 + 017721 9999 99 99 0 9999 99 9999 + 017722 9999 99 99 0 9999 99 9999 + 017723 9999 99 99 0 9999 99 9999 + 017724 9999 99 99 0 9999 99 9999 + 017725 9999 99 99 0 9999 99 9999 + 017726 9999 99 99 0 9999 99 9999 + 017727 9999 99 99 0 9999 99 9999 + 017728 9999 99 99 0 9999 99 9999 + 017729 9999 99 99 0 9999 99 9999 + 017730 9999 99 99 0 9999 99 9999 + 017731 9999 99 99 0 9999 99 9999 + 017732 9999 99 99 0 9999 99 9999 + 017733 9999 99 99 0 9999 99 9999 + 017734 9999 99 99 0 9999 99 9999 + 017735 9999 99 99 0 9999 99 9999 + 017736 9999 99 99 0 9999 99 9999 + 017737 9999 99 99 0 9999 99 9999 + 017738 9999 99 99 0 9999 99 9999 + 017739 9999 99 99 0 9999 99 9999 + 017740 9999 99 99 0 9999 99 9999 + 017741 9999 99 99 0 9999 99 9999 + 017742 9999 99 99 0 9999 99 9999 + 017743 9999 99 99 0 9999 99 9999 + 017744 9999 99 99 0 9999 99 9999 + 017745 9999 99 99 0 9999 99 9999 + 017746 9999 99 99 0 9999 99 9999 + 017747 9999 99 99 0 9999 99 9999 + 017748 9999 99 99 0 9999 99 9999 + 017749 9999 99 99 0 9999 99 9999 + 017750 9999 99 99 0 9999 99 9999 + 017751 9999 99 99 0 9999 99 9999 + 017752 9999 99 99 0 9999 99 9999 + 017753 9999 99 99 0 9999 99 9999 + 017754 9999 99 99 0 9999 99 9999 + 017755 9999 99 99 0 9999 99 9999 + 017756 9999 99 99 0 9999 99 9999 + 017757 9999 99 99 0 9999 99 9999 + 017758 9999 99 99 0 9999 99 9999 + 017759 9999 99 99 0 9999 99 9999 + 017760 9999 99 99 0 9999 99 9999 + 017761 9999 99 99 0 9999 99 9999 + 017762 9999 99 99 0 9999 99 9999 + 017763 9999 99 99 0 9999 99 9999 + 017764 9999 99 99 0 9999 99 9999 + 017765 9999 99 99 0 9999 99 9999 + 017766 9999 99 99 0 9999 99 9999 + 017767 9999 99 99 0 9999 99 9999 + 017768 9999 99 99 0 9999 99 9999 + 017769 9999 99 99 0 9999 99 9999 + 017770 9999 99 99 0 9999 99 9999 + 017771 9999 99 99 0 9999 99 9999 + 017772 9999 99 99 0 9999 99 9999 + 017773 9999 99 99 0 9999 99 9999 + 017774 9999 99 99 0 9999 99 9999 + 017775 9999 99 99 0 9999 99 9999 + 017776 9999 99 99 0 9999 99 9999 + 017777 9999 99 99 0 9999 99 9999 + 017778 9999 99 99 0 9999 99 9999 + 017779 9999 99 99 0 9999 99 9999 + 017780 9999 99 99 0 9999 99 9999 + 017781 9999 99 99 0 9999 99 9999 + 017782 9999 99 99 0 9999 99 9999 + 017783 9999 99 99 0 9999 99 9999 + 017784 9999 99 99 0 9999 99 9999 + 017785 9999 99 99 0 9999 99 9999 + 017786 9999 99 99 0 9999 99 9999 + 017787 9999 99 99 0 9999 99 9999 + 017788 9999 99 99 0 9999 99 9999 + 017789 9999 99 99 0 9999 99 9999 + 017790 9999 99 99 0 9999 99 9999 + 017791 9999 99 99 0 9999 99 9999 + 017792 9999 99 99 0 9999 99 9999 + 017793 9999 99 99 0 9999 99 9999 + 017794 9999 99 99 0 9999 99 9999 + 017795 9999 99 99 0 9999 99 9999 + 017796 9999 99 99 0 9999 99 9999 + 017797 9999 99 99 0 9999 99 9999 + 017798 9999 99 99 0 9999 99 9999 + 017799 9999 99 99 0 9999 99 9999 + 017800 9999 99 99 0 9999 99 9999 + 017801 9999 99 99 0 9999 99 9999 + 017802 9999 99 99 0 9999 99 9999 + 017803 9999 99 99 0 9999 99 9999 + 017804 9999 99 99 0 9999 99 9999 + 017805 9999 99 99 0 9999 99 9999 + 017806 9999 99 99 0 9999 99 9999 + 017807 9999 99 99 0 9999 99 9999 + 017808 9999 99 99 0 9999 99 9999 + 017809 9999 99 99 0 9999 99 9999 + 017810 9999 99 99 0 9999 99 9999 + 017811 9999 99 99 0 9999 99 9999 + 017812 9999 99 99 0 9999 99 9999 + 017813 9999 99 99 0 9999 99 9999 + 017814 9999 99 99 0 9999 99 9999 + 017815 9999 99 99 0 9999 99 9999 + 017816 9999 99 99 0 9999 99 9999 + 017817 9999 99 99 0 9999 99 9999 + 017818 9999 99 99 0 9999 99 9999 + 017819 9999 99 99 0 9999 99 9999 + 017820 9999 99 99 0 9999 99 9999 + 017821 9999 99 99 0 9999 99 9999 + 017822 9999 99 99 0 9999 99 9999 + 017823 9999 99 99 0 9999 99 9999 + 017824 9999 99 99 0 9999 99 9999 + 017825 9999 99 99 0 9999 99 9999 + 017826 9999 99 99 0 9999 99 9999 + 017827 9999 99 99 0 9999 99 9999 + 017828 9999 99 99 0 9999 99 9999 + 017829 9999 99 99 0 9999 99 9999 + 017830 9999 99 99 0 9999 99 9999 + 017831 9999 99 99 0 9999 99 9999 + 017832 9999 99 99 0 9999 99 9999 + 017833 9999 99 99 0 9999 99 9999 + 017834 9999 99 99 0 9999 99 9999 + 017835 9999 99 99 0 9999 99 9999 + 017836 9999 99 99 0 9999 99 9999 + 017837 9999 99 99 0 9999 99 9999 + 017838 9999 99 99 0 9999 99 9999 + 017839 9999 99 99 0 9999 99 9999 + 017840 9999 99 99 0 9999 99 9999 + 017841 9999 99 99 0 9999 99 9999 + 017842 9999 99 99 0 9999 99 9999 + 017843 9999 99 99 0 9999 99 9999 + 017844 9999 99 99 0 9999 99 9999 + 017845 9999 99 99 0 9999 99 9999 + 017846 9999 99 99 0 9999 99 9999 + 017847 9999 99 99 0 9999 99 9999 + 017848 9999 99 99 0 9999 99 9999 + 017849 9999 99 99 0 9999 99 9999 + 017850 9999 99 99 0 9999 99 9999 + 017851 9999 99 99 0 9999 99 9999 + 017852 9999 99 99 0 9999 99 9999 + 017853 9999 99 99 0 9999 99 9999 + 017854 9999 99 99 0 9999 99 9999 + 017855 9999 99 99 0 9999 99 9999 + 017856 9999 99 99 0 9999 99 9999 + 017857 9999 99 99 0 9999 99 9999 + 017858 9999 99 99 0 9999 99 9999 + 017859 9999 99 99 0 9999 99 9999 + 017860 9999 99 99 0 9999 99 9999 + 017861 9999 99 99 0 9999 99 9999 + 017862 9999 99 99 0 9999 99 9999 + 017863 9999 99 99 0 9999 99 9999 + 017864 9999 99 99 0 9999 99 9999 + 017865 9999 99 99 0 9999 99 9999 + 017866 9999 99 99 0 9999 99 9999 + 017867 9999 99 99 0 9999 99 9999 + 017868 9999 99 99 0 9999 99 9999 + 017869 9999 99 99 0 9999 99 9999 + 017870 9999 99 99 0 9999 99 9999 + 017871 9999 99 99 0 9999 99 9999 + 017872 9999 99 99 0 9999 99 9999 + 017873 9999 99 99 0 9999 99 9999 + 017874 9999 99 99 0 9999 99 9999 + 017875 9999 99 99 0 9999 99 9999 + 017876 9999 99 99 0 9999 99 9999 + 017877 9999 99 99 0 9999 99 9999 + 017878 9999 99 99 0 9999 99 9999 + 017879 9999 99 99 0 9999 99 9999 + 017880 9999 99 99 0 9999 99 9999 + 017881 9999 99 99 0 9999 99 9999 + 017882 9999 99 99 0 9999 99 9999 + 017883 9999 99 99 0 9999 99 9999 + 017884 9999 99 99 0 9999 99 9999 + 017885 9999 99 99 0 9999 99 9999 + 017886 9999 99 99 0 9999 99 9999 + 017887 9999 99 99 0 9999 99 9999 + 017888 9999 99 99 0 9999 99 9999 + 017889 9999 99 99 0 9999 99 9999 + 017890 9999 99 99 0 9999 99 9999 + 017891 9999 99 99 0 9999 99 9999 + 017892 9999 99 99 0 9999 99 9999 + 017893 9999 99 99 0 9999 99 9999 + 017894 9999 99 99 0 9999 99 9999 + 017895 9999 99 99 0 9999 99 9999 + 017896 9999 99 99 0 9999 99 9999 + 017897 9999 99 99 0 9999 99 9999 + 017898 9999 99 99 0 9999 99 9999 + 017899 9999 99 99 0 9999 99 9999 + 017900 9999 99 99 0 9999 99 9999 + 017901 9999 99 99 0 9999 99 9999 + 017902 9999 99 99 0 9999 99 9999 + 017903 9999 99 99 0 9999 99 9999 + 017904 9999 99 99 0 9999 99 9999 + 017905 9999 99 99 0 9999 99 9999 + 017906 9999 99 99 0 9999 99 9999 + 017907 9999 99 99 0 9999 99 9999 + 017908 9999 99 99 0 9999 99 9999 + 017909 9999 99 99 0 9999 99 9999 + 017910 9999 99 99 0 9999 99 9999 + 017911 9999 99 99 0 9999 99 9999 + 017912 9999 99 99 0 9999 99 9999 + 017913 9999 99 99 0 9999 99 9999 + 017914 9999 99 99 0 9999 99 9999 + 017915 9999 99 99 0 9999 99 9999 + 017916 9999 99 99 0 9999 99 9999 + 017917 9999 99 99 0 9999 99 9999 + 017918 9999 99 99 0 9999 99 9999 + 017919 9999 99 99 0 9999 99 9999 + 017920 9999 99 99 0 9999 99 9999 + 017921 9999 99 99 0 9999 99 9999 + 017922 9999 99 99 0 9999 99 9999 + 017923 9999 99 99 0 9999 99 9999 + 017924 9999 99 99 0 9999 99 9999 + 017925 9999 99 99 0 9999 99 9999 + 017926 9999 99 99 0 9999 99 9999 + 017927 9999 99 99 0 9999 99 9999 + 017928 9999 99 99 0 9999 99 9999 + 017929 9999 99 99 0 9999 99 9999 + 017930 9999 99 99 0 9999 99 9999 + 017931 9999 99 99 0 9999 99 9999 + 017932 9999 99 99 0 9999 99 9999 + 017933 9999 99 99 0 9999 99 9999 + 017934 9999 99 99 0 9999 99 9999 + 017935 9999 99 99 0 9999 99 9999 + 017936 9999 99 99 0 9999 99 9999 + 017937 9999 99 99 0 9999 99 9999 + 017938 9999 99 99 0 9999 99 9999 + 017939 9999 99 99 0 9999 99 9999 + 017940 9999 99 99 0 9999 99 9999 + 017941 9999 99 99 0 9999 99 9999 + 017942 9999 99 99 0 9999 99 9999 + 017943 9999 99 99 0 9999 99 9999 + 017944 9999 99 99 0 9999 99 9999 + 017945 9999 99 99 0 9999 99 9999 + 017946 9999 99 99 0 9999 99 9999 + 017947 9999 99 99 0 9999 99 9999 + 017948 9999 99 99 0 9999 99 9999 + 017949 9999 99 99 0 9999 99 9999 + 017950 9999 99 99 0 9999 99 9999 + 017951 9999 99 99 0 9999 99 9999 + 017952 9999 99 99 0 9999 99 9999 + 017953 9999 99 99 0 9999 99 9999 + 017954 9999 99 99 0 9999 99 9999 + 017955 9999 99 99 0 9999 99 9999 + 017956 9999 99 99 0 9999 99 9999 + 017957 9999 99 99 0 9999 99 9999 + 017958 9999 99 99 0 9999 99 9999 + 017959 9999 99 99 0 9999 99 9999 + 017960 9999 99 99 0 9999 99 9999 + 017961 9999 99 99 0 9999 99 9999 + 017962 9999 99 99 0 9999 99 9999 + 017963 9999 99 99 0 9999 99 9999 + 017964 9999 99 99 0 9999 99 9999 + 017965 9999 99 99 0 9999 99 9999 + 017966 9999 99 99 0 9999 99 9999 + 017967 9999 99 99 0 9999 99 9999 + 017968 9999 99 99 0 9999 99 9999 + 017969 9999 99 99 0 9999 99 9999 + 017970 9999 99 99 0 9999 99 9999 + 017971 9999 99 99 0 9999 99 9999 + 017972 9999 99 99 0 9999 99 9999 + 017973 9999 99 99 0 9999 99 9999 + 017974 9999 99 99 0 9999 99 9999 + 017975 9999 99 99 0 9999 99 9999 + 017976 9999 99 99 0 9999 99 9999 + 017977 9999 99 99 0 9999 99 9999 + 017978 9999 99 99 0 9999 99 9999 + 017979 9999 99 99 0 9999 99 9999 + 017980 9999 99 99 0 9999 99 9999 + 017981 9999 99 99 0 9999 99 9999 + 017982 9999 99 99 0 9999 99 9999 + 017983 9999 99 99 0 9999 99 9999 + 017984 9999 99 99 0 9999 99 9999 + 017985 9999 99 99 0 9999 99 9999 + 017986 9999 99 99 0 9999 99 9999 + 017987 9999 99 99 0 9999 99 9999 + 017988 9999 99 99 0 9999 99 9999 + 017989 9999 99 99 0 9999 99 9999 + 017990 9999 99 99 0 9999 99 9999 + 017991 9999 99 99 0 9999 99 9999 + 017992 9999 99 99 0 9999 99 9999 + 017993 9999 99 99 0 9999 99 9999 + 017994 9999 99 99 0 9999 99 9999 + 017995 9999 99 99 0 9999 99 9999 + 017996 9999 99 99 0 9999 99 9999 + 017997 9999 99 99 0 9999 99 9999 + 017998 9999 99 99 0 9999 99 9999 + 017999 9999 99 99 0 9999 99 9999 + 018000 9999 99 99 0 9999 99 9999 + 018001 9999 99 99 0 9999 99 9999 + 018002 9999 99 99 0 9999 99 9999 + 018003 9999 99 99 0 9999 99 9999 + 018004 9999 99 99 0 9999 99 9999 + 018005 9999 99 99 0 9999 99 9999 + 018006 9999 99 99 0 9999 99 9999 + 018007 9999 99 99 0 9999 99 9999 + 018008 9999 99 99 0 9999 99 9999 + 018009 9999 99 99 0 9999 99 9999 + 018010 9999 99 99 0 9999 99 9999 + 018011 9999 99 99 0 9999 99 9999 + 018012 9999 99 99 0 9999 99 9999 + 018013 9999 99 99 0 9999 99 9999 + 018014 9999 99 99 0 9999 99 9999 + 018015 9999 99 99 0 9999 99 9999 + 018016 9999 99 99 0 9999 99 9999 + 018017 9999 99 99 0 9999 99 9999 + 018018 9999 99 99 0 9999 99 9999 + 018019 9999 99 99 0 9999 99 9999 + 018020 9999 99 99 0 9999 99 9999 + 018021 9999 99 99 0 9999 99 9999 + 018022 9999 99 99 0 9999 99 9999 + 018023 9999 99 99 0 9999 99 9999 + 018024 9999 99 99 0 9999 99 9999 + 018025 9999 99 99 0 9999 99 9999 + 018026 9999 99 99 0 9999 99 9999 + 018027 9999 99 99 0 9999 99 9999 + 018028 9999 99 99 0 9999 99 9999 + 018029 9999 99 99 0 9999 99 9999 + 018030 9999 99 99 0 9999 99 9999 + 018031 9999 99 99 0 9999 99 9999 + 018032 9999 99 99 0 9999 99 9999 + 018033 9999 99 99 0 9999 99 9999 + 018034 9999 99 99 0 9999 99 9999 + 018035 9999 99 99 0 9999 99 9999 + 018036 9999 99 99 0 9999 99 9999 + 018037 9999 99 99 0 9999 99 9999 + 018038 9999 99 99 0 9999 99 9999 + 018039 9999 99 99 0 9999 99 9999 + 018040 9999 99 99 0 9999 99 9999 + 018041 9999 99 99 0 9999 99 9999 + 018042 9999 99 99 0 9999 99 9999 + 018043 9999 99 99 0 9999 99 9999 + 018044 9999 99 99 0 9999 99 9999 + 018045 9999 99 99 0 9999 99 9999 + 018046 9999 99 99 0 9999 99 9999 + 018047 9999 99 99 0 9999 99 9999 + 018048 9999 99 99 0 9999 99 9999 + 018049 9999 99 99 0 9999 99 9999 + 018050 9999 99 99 0 9999 99 9999 + 018051 9999 99 99 0 9999 99 9999 + 018052 9999 99 99 0 9999 99 9999 + 018053 9999 99 99 0 9999 99 9999 + 018054 9999 99 99 0 9999 99 9999 + 018055 9999 99 99 0 9999 99 9999 + 018056 9999 99 99 0 9999 99 9999 + 018057 9999 99 99 0 9999 99 9999 + 018058 9999 99 99 0 9999 99 9999 + 018059 9999 99 99 0 9999 99 9999 + 018060 9999 99 99 0 9999 99 9999 + 018061 9999 99 99 0 9999 99 9999 + 018062 9999 99 99 0 9999 99 9999 + 018063 9999 99 99 0 9999 99 9999 + 018064 9999 99 99 0 9999 99 9999 + 018065 9999 99 99 0 9999 99 9999 + 018066 9999 99 99 0 9999 99 9999 + 018067 9999 99 99 0 9999 99 9999 + 018068 9999 99 99 0 9999 99 9999 + 018069 9999 99 99 0 9999 99 9999 + 018070 9999 99 99 0 9999 99 9999 + 018071 9999 99 99 0 9999 99 9999 + 018072 9999 99 99 0 9999 99 9999 + 018073 9999 99 99 0 9999 99 9999 + 018074 9999 99 99 0 9999 99 9999 + 018075 9999 99 99 0 9999 99 9999 + 018076 9999 99 99 0 9999 99 9999 + 018077 9999 99 99 0 9999 99 9999 + 018078 9999 99 99 0 9999 99 9999 + 018079 9999 99 99 0 9999 99 9999 + 018080 9999 99 99 0 9999 99 9999 + 018081 9999 99 99 0 9999 99 9999 + 018082 9999 99 99 0 9999 99 9999 + 018083 9999 99 99 0 9999 99 9999 + 018084 9999 99 99 0 9999 99 9999 + 018085 9999 99 99 0 9999 99 9999 + 018086 9999 99 99 0 9999 99 9999 + 018087 9999 99 99 0 9999 99 9999 + 018088 9999 99 99 0 9999 99 9999 + 018089 9999 99 99 0 9999 99 9999 + 018090 9999 99 99 0 9999 99 9999 + 018091 9999 99 99 0 9999 99 9999 + 018092 9999 99 99 0 9999 99 9999 + 018093 9999 99 99 0 9999 99 9999 + 018094 9999 99 99 0 9999 99 9999 + 018095 9999 99 99 0 9999 99 9999 + 018096 9999 99 99 0 9999 99 9999 + 018097 9999 99 99 0 9999 99 9999 + 018098 9999 99 99 0 9999 99 9999 + 018099 9999 99 99 0 9999 99 9999 + 018100 9999 99 99 0 9999 99 9999 + 018101 9999 99 99 0 9999 99 9999 + 018102 9999 99 99 0 9999 99 9999 + 018103 9999 99 99 0 9999 99 9999 + 018104 9999 99 99 0 9999 99 9999 + 018105 9999 99 99 0 9999 99 9999 + 018106 9999 99 99 0 9999 99 9999 + 018107 9999 99 99 0 9999 99 9999 + 018108 9999 99 99 0 9999 99 9999 + 018109 9999 99 99 0 9999 99 9999 + 018110 9999 99 99 0 9999 99 9999 + 018111 9999 99 99 0 9999 99 9999 + 018112 9999 99 99 0 9999 99 9999 + 018113 9999 99 99 0 9999 99 9999 + 018114 9999 99 99 0 9999 99 9999 + 018115 9999 99 99 0 9999 99 9999 + 018116 9999 99 99 0 9999 99 9999 + 018117 9999 99 99 0 9999 99 9999 + 018118 9999 99 99 0 9999 99 9999 + 018119 9999 99 99 0 9999 99 9999 + 018120 9999 99 99 0 9999 99 9999 + 018121 9999 99 99 0 9999 99 9999 + 018122 9999 99 99 0 9999 99 9999 + 018123 9999 99 99 0 9999 99 9999 + 018124 9999 99 99 0 9999 99 9999 + 018125 9999 99 99 0 9999 99 9999 + 018126 9999 99 99 0 9999 99 9999 + 018127 9999 99 99 0 9999 99 9999 + 018128 9999 99 99 0 9999 99 9999 + 018129 9999 99 99 0 9999 99 9999 + 018130 9999 99 99 0 9999 99 9999 + 018131 9999 99 99 0 9999 99 9999 + 018132 9999 99 99 0 9999 99 9999 + 018133 9999 99 99 0 9999 99 9999 + 018134 9999 99 99 0 9999 99 9999 + 018135 9999 99 99 0 9999 99 9999 + 018136 9999 99 99 0 9999 99 9999 + 018137 9999 99 99 0 9999 99 9999 + 018138 9999 99 99 0 9999 99 9999 + 018139 9999 99 99 0 9999 99 9999 + 018140 9999 99 99 0 9999 99 9999 + 018141 9999 99 99 0 9999 99 9999 + 018142 9999 99 99 0 9999 99 9999 + 018143 9999 99 99 0 9999 99 9999 + 018144 9999 99 99 0 9999 99 9999 + 018145 9999 99 99 0 9999 99 9999 + 018146 9999 99 99 0 9999 99 9999 + 018147 9999 99 99 0 9999 99 9999 + 018148 9999 99 99 0 9999 99 9999 + 018149 9999 99 99 0 9999 99 9999 + 018150 9999 99 99 0 9999 99 9999 + 018151 9999 99 99 0 9999 99 9999 + 018152 9999 99 99 0 9999 99 9999 + 018153 9999 99 99 0 9999 99 9999 + 018154 9999 99 99 0 9999 99 9999 + 018155 9999 99 99 0 9999 99 9999 + 018156 9999 99 99 0 9999 99 9999 + 018157 9999 99 99 0 9999 99 9999 + 018158 9999 99 99 0 9999 99 9999 + 018159 9999 99 99 0 9999 99 9999 + 018160 9999 99 99 0 9999 99 9999 + 018161 9999 99 99 0 9999 99 9999 + 018162 9999 99 99 0 9999 99 9999 + 018163 9999 99 99 0 9999 99 9999 + 018164 9999 99 99 0 9999 99 9999 + 018165 9999 99 99 0 9999 99 9999 + 018166 9999 99 99 0 9999 99 9999 + 018167 9999 99 99 0 9999 99 9999 + 018168 9999 99 99 0 9999 99 9999 + 018169 9999 99 99 0 9999 99 9999 + 018170 9999 99 99 0 9999 99 9999 + 018171 9999 99 99 0 9999 99 9999 + 018172 9999 99 99 0 9999 99 9999 + 018173 9999 99 99 0 9999 99 9999 + 018174 9999 99 99 0 9999 99 9999 + 018175 9999 99 99 0 9999 99 9999 + 018176 9999 99 99 0 9999 99 9999 + 018177 9999 99 99 0 9999 99 9999 + 018178 9999 99 99 0 9999 99 9999 + 018179 9999 99 99 0 9999 99 9999 + 018180 9999 99 99 0 9999 99 9999 + 018181 9999 99 99 0 9999 99 9999 + 018182 9999 99 99 0 9999 99 9999 + 018183 9999 99 99 0 9999 99 9999 + 018184 9999 99 99 0 9999 99 9999 + 018185 9999 99 99 0 9999 99 9999 + 018186 9999 99 99 0 9999 99 9999 + 018187 9999 99 99 0 9999 99 9999 + 018188 9999 99 99 0 9999 99 9999 + 018189 9999 99 99 0 9999 99 9999 + 018190 9999 99 99 0 9999 99 9999 + 018191 9999 99 99 0 9999 99 9999 + 018192 9999 99 99 0 9999 99 9999 + 018193 9999 99 99 0 9999 99 9999 + 018194 9999 99 99 0 9999 99 9999 + 018195 9999 99 99 0 9999 99 9999 + 018196 9999 99 99 0 9999 99 9999 + 018197 9999 99 99 0 9999 99 9999 + 018198 9999 99 99 0 9999 99 9999 + 018199 9999 99 99 0 9999 99 9999 + 018200 9999 99 99 0 9999 99 9999 + 018201 9999 99 99 0 9999 99 9999 + 018202 9999 99 99 0 9999 99 9999 + 018203 9999 99 99 0 9999 99 9999 + 018204 9999 99 99 0 9999 99 9999 + 018205 9999 99 99 0 9999 99 9999 + 018206 9999 99 99 0 9999 99 9999 + 018207 9999 99 99 0 9999 99 9999 + 018208 9999 99 99 0 9999 99 9999 + 018209 9999 99 99 0 9999 99 9999 + 018210 9999 99 99 0 9999 99 9999 + 018211 9999 99 99 0 9999 99 9999 + 018212 9999 99 99 0 9999 99 9999 + 018213 9999 99 99 0 9999 99 9999 + 018214 9999 99 99 0 9999 99 9999 + 018215 9999 99 99 0 9999 99 9999 + 018216 9999 99 99 0 9999 99 9999 + 018217 9999 99 99 0 9999 99 9999 + 018218 9999 99 99 0 9999 99 9999 + 018219 9999 99 99 0 9999 99 9999 + 018220 9999 99 99 0 9999 99 9999 + 018221 9999 99 99 0 9999 99 9999 + 018222 9999 99 99 0 9999 99 9999 + 018223 9999 99 99 0 9999 99 9999 + 018224 9999 99 99 0 9999 99 9999 + 018225 9999 99 99 0 9999 99 9999 + 018226 9999 99 99 0 9999 99 9999 + 018227 9999 99 99 0 9999 99 9999 + 018228 9999 99 99 0 9999 99 9999 + 018229 9999 99 99 0 9999 99 9999 + 018230 9999 99 99 0 9999 99 9999 + 018231 9999 99 99 0 9999 99 9999 + 018232 9999 99 99 0 9999 99 9999 + 018233 9999 99 99 0 9999 99 9999 + 018234 9999 99 99 0 9999 99 9999 + 018235 9999 99 99 0 9999 99 9999 + 018236 9999 99 99 0 9999 99 9999 + 018237 9999 99 99 0 9999 99 9999 + 018238 9999 99 99 0 9999 99 9999 + 018239 9999 99 99 0 9999 99 9999 + 018240 9999 99 99 0 9999 99 9999 + 018241 9999 99 99 0 9999 99 9999 + 018242 9999 99 99 0 9999 99 9999 + 018243 9999 99 99 0 9999 99 9999 + 018244 9999 99 99 0 9999 99 9999 + 018245 9999 99 99 0 9999 99 9999 + 018246 9999 99 99 0 9999 99 9999 + 018247 9999 99 99 0 9999 99 9999 + 018248 9999 99 99 0 9999 99 9999 + 018249 9999 99 99 0 9999 99 9999 + 018250 9999 99 99 0 9999 99 9999 + 018251 9999 99 99 0 9999 99 9999 + 018252 9999 99 99 0 9999 99 9999 + 018253 9999 99 99 0 9999 99 9999 + 018254 9999 99 99 0 9999 99 9999 + 018255 9999 99 99 0 9999 99 9999 + 018256 9999 99 99 0 9999 99 9999 + 018257 9999 99 99 0 9999 99 9999 + 018258 9999 99 99 0 9999 99 9999 + 018259 9999 99 99 0 9999 99 9999 + 018260 9999 99 99 0 9999 99 9999 + 018261 9999 99 99 0 9999 99 9999 + 018262 9999 99 99 0 9999 99 9999 + 018263 9999 99 99 0 9999 99 9999 + 018264 9999 99 99 0 9999 99 9999 + 018265 9999 99 99 0 9999 99 9999 + 018266 9999 99 99 0 9999 99 9999 + 018267 9999 99 99 0 9999 99 9999 + 018268 9999 99 99 0 9999 99 9999 + 018269 9999 99 99 0 9999 99 9999 + 018270 9999 99 99 0 9999 99 9999 + 018271 9999 99 99 0 9999 99 9999 + 018272 9999 99 99 0 9999 99 9999 + 018273 9999 99 99 0 9999 99 9999 + 018274 9999 99 99 0 9999 99 9999 + 018275 9999 99 99 0 9999 99 9999 + 018276 9999 99 99 0 9999 99 9999 + 018277 9999 99 99 0 9999 99 9999 + 018278 9999 99 99 0 9999 99 9999 + 018279 9999 99 99 0 9999 99 9999 + 018280 9999 99 99 0 9999 99 9999 + 018281 9999 99 99 0 9999 99 9999 + 018282 9999 99 99 0 9999 99 9999 + 018283 9999 99 99 0 9999 99 9999 + 018284 9999 99 99 0 9999 99 9999 + 018285 9999 99 99 0 9999 99 9999 + 018286 9999 99 99 0 9999 99 9999 + 018287 9999 99 99 0 9999 99 9999 + 018288 9999 99 99 0 9999 99 9999 + 018289 9999 99 99 0 9999 99 9999 + 018290 9999 99 99 0 9999 99 9999 + 018291 9999 99 99 0 9999 99 9999 + 018292 9999 99 99 0 9999 99 9999 + 018293 9999 99 99 0 9999 99 9999 + 018294 9999 99 99 0 9999 99 9999 + 018295 9999 99 99 0 9999 99 9999 + 018296 9999 99 99 0 9999 99 9999 + 018297 9999 99 99 0 9999 99 9999 + 018298 9999 99 99 0 9999 99 9999 + 018299 9999 99 99 0 9999 99 9999 + 018300 9999 99 99 0 9999 99 9999 + 018301 9999 99 99 0 9999 99 9999 + 018302 9999 99 99 0 9999 99 9999 + 018303 9999 99 99 0 9999 99 9999 + 018304 9999 99 99 0 9999 99 9999 + 018305 9999 99 99 0 9999 99 9999 + 018306 9999 99 99 0 9999 99 9999 + 018307 9999 99 99 0 9999 99 9999 + 018308 9999 99 99 0 9999 99 9999 + 018309 9999 99 99 0 9999 99 9999 + 018310 9999 99 99 0 9999 99 9999 + 018311 9999 99 99 0 9999 99 9999 + 018312 9999 99 99 0 9999 99 9999 + 018313 9999 99 99 0 9999 99 9999 + 018314 9999 99 99 0 9999 99 9999 + 018315 9999 99 99 0 9999 99 9999 + 018316 9999 99 99 0 9999 99 9999 + 018317 9999 99 99 0 9999 99 9999 + 018318 9999 99 99 0 9999 99 9999 + 018319 9999 99 99 0 9999 99 9999 + 018320 9999 99 99 0 9999 99 9999 + 018321 9999 99 99 0 9999 99 9999 + 018322 9999 99 99 0 9999 99 9999 + 018323 9999 99 99 0 9999 99 9999 + 018324 9999 99 99 0 9999 99 9999 + 018325 9999 99 99 0 9999 99 9999 + 018326 9999 99 99 0 9999 99 9999 + 018327 9999 99 99 0 9999 99 9999 + 018328 9999 99 99 0 9999 99 9999 + 018329 9999 99 99 0 9999 99 9999 + 018330 9999 99 99 0 9999 99 9999 + 018331 9999 99 99 0 9999 99 9999 + 018332 9999 99 99 0 9999 99 9999 + 018333 9999 99 99 0 9999 99 9999 + 018334 9999 99 99 0 9999 99 9999 + 018335 9999 99 99 0 9999 99 9999 + 018336 9999 99 99 0 9999 99 9999 + 018337 9999 99 99 0 9999 99 9999 + 018338 9999 99 99 0 9999 99 9999 + 018339 9999 99 99 0 9999 99 9999 + 018340 9999 99 99 0 9999 99 9999 + 018341 9999 99 99 0 9999 99 9999 + 018342 9999 99 99 0 9999 99 9999 + 018343 9999 99 99 0 9999 99 9999 + 018344 9999 99 99 0 9999 99 9999 + 018345 9999 99 99 0 9999 99 9999 + 018346 9999 99 99 0 9999 99 9999 + 018347 9999 99 99 0 9999 99 9999 + 018348 9999 99 99 0 9999 99 9999 + 018349 9999 99 99 0 9999 99 9999 + 018350 9999 99 99 0 9999 99 9999 + 018351 9999 99 99 0 9999 99 9999 + 018352 9999 99 99 0 9999 99 9999 + 018353 9999 99 99 0 9999 99 9999 + 018354 9999 99 99 0 9999 99 9999 + 018355 9999 99 99 0 9999 99 9999 + 018356 9999 99 99 0 9999 99 9999 + 018357 9999 99 99 0 9999 99 9999 + 018358 9999 99 99 0 9999 99 9999 + 018359 9999 99 99 0 9999 99 9999 + 018360 9999 99 99 0 9999 99 9999 + 018361 9999 99 99 0 9999 99 9999 + 018362 9999 99 99 0 9999 99 9999 + 018363 9999 99 99 0 9999 99 9999 + 018364 9999 99 99 0 9999 99 9999 + 018365 9999 99 99 0 9999 99 9999 + 018366 9999 99 99 0 9999 99 9999 + 018367 9999 99 99 0 9999 99 9999 + 018368 9999 99 99 0 9999 99 9999 + 018369 9999 99 99 0 9999 99 9999 + 018370 9999 99 99 0 9999 99 9999 + 018371 9999 99 99 0 9999 99 9999 + 018372 9999 99 99 0 9999 99 9999 + 018373 9999 99 99 0 9999 99 9999 + 018374 9999 99 99 0 9999 99 9999 + 018375 9999 99 99 0 9999 99 9999 + 018376 9999 99 99 0 9999 99 9999 + 018377 9999 99 99 0 9999 99 9999 + 018378 9999 99 99 0 9999 99 9999 + 018379 9999 99 99 0 9999 99 9999 + 018380 9999 99 99 0 9999 99 9999 + 018381 9999 99 99 0 9999 99 9999 + 018382 9999 99 99 0 9999 99 9999 + 018383 9999 99 99 0 9999 99 9999 + 018384 9999 99 99 0 9999 99 9999 + 018385 9999 99 99 0 9999 99 9999 + 018386 9999 99 99 0 9999 99 9999 + 018387 9999 99 99 0 9999 99 9999 + 018388 9999 99 99 0 9999 99 9999 + 018389 9999 99 99 0 9999 99 9999 + 018390 9999 99 99 0 9999 99 9999 + 018391 9999 99 99 0 9999 99 9999 + 018392 9999 99 99 0 9999 99 9999 + 018393 9999 99 99 0 9999 99 9999 + 018394 9999 99 99 0 9999 99 9999 + 018395 9999 99 99 0 9999 99 9999 + 018396 9999 99 99 0 9999 99 9999 + 018397 9999 99 99 0 9999 99 9999 + 018398 9999 99 99 0 9999 99 9999 + 018399 9999 99 99 0 9999 99 9999 + 018400 9999 99 99 0 9999 99 9999 + 018401 9999 99 99 0 9999 99 9999 + 018402 9999 99 99 0 9999 99 9999 + 018403 9999 99 99 0 9999 99 9999 + 018404 9999 99 99 0 9999 99 9999 + 018405 9999 99 99 0 9999 99 9999 + 018406 9999 99 99 0 9999 99 9999 + 018407 9999 99 99 0 9999 99 9999 + 018408 9999 99 99 0 9999 99 9999 + 018409 9999 99 99 0 9999 99 9999 + 018410 9999 99 99 0 9999 99 9999 + 018411 9999 99 99 0 9999 99 9999 + 018412 9999 99 99 0 9999 99 9999 + 018413 9999 99 99 0 9999 99 9999 + 018414 9999 99 99 0 9999 99 9999 + 018415 9999 99 99 0 9999 99 9999 + 018416 9999 99 99 0 9999 99 9999 + 018417 9999 99 99 0 9999 99 9999 + 018418 9999 99 99 0 9999 99 9999 + 018419 9999 99 99 0 9999 99 9999 + 018420 9999 99 99 0 9999 99 9999 + 018421 9999 99 99 0 9999 99 9999 + 018422 9999 99 99 0 9999 99 9999 + 018423 9999 99 99 0 9999 99 9999 + 018424 9999 99 99 0 9999 99 9999 + 018425 9999 99 99 0 9999 99 9999 + 018426 9999 99 99 0 9999 99 9999 + 018427 9999 99 99 0 9999 99 9999 + 018428 9999 99 99 0 9999 99 9999 + 018429 9999 99 99 0 9999 99 9999 + 018430 9999 99 99 0 9999 99 9999 + 018431 9999 99 99 0 9999 99 9999 + 018432 9999 99 99 0 9999 99 9999 + 018433 1248 01 01 1 303050764 08 0018 + 018434 1248 01 02 1 303050764 09 0018 + 018435 9999 99 99 0 9999 99 9999 + 018436 9999 99 99 0 9999 99 9999 + 018437 9999 99 99 0 9999 99 9999 + 018438 9999 99 99 0 9999 99 9999 + 018439 9999 99 99 0 9999 99 9999 + 018440 9999 99 99 0 9999 99 9999 + 018441 1248 02 01 1 303050764 10 0018 + 018442 1248 02 02 1 303050764 11 0018 + 018443 9999 99 99 0 9999 99 9999 + 018444 9999 99 99 0 9999 99 9999 + 018445 9999 99 99 0 9999 99 9999 + 018446 9999 99 99 0 9999 99 9999 + 018447 9999 99 99 0 9999 99 9999 + 018448 9999 99 99 0 9999 99 9999 + 018449 1248 03 01 1 303050764 12 0018 + 018450 1248 03 02 1 303050764 13 0018 + 018451 9999 99 99 0 9999 99 9999 + 018452 9999 99 99 0 9999 99 9999 + 018453 9999 99 99 0 9999 99 9999 + 018454 9999 99 99 0 9999 99 9999 + 018455 9999 99 99 0 9999 99 9999 + 018456 9999 99 99 0 9999 99 9999 + 018457 1248 04 01 1 303050764 14 0018 + 018458 1248 04 02 1 303050764 15 0018 + 018459 9999 99 99 0 9999 99 9999 + 018460 9999 99 99 0 9999 99 9999 + 018461 9999 99 99 0 9999 99 9999 + 018462 9999 99 99 0 9999 99 9999 + 018463 9999 99 99 0 9999 99 9999 + 018464 9999 99 99 0 9999 99 9999 + 018465 1248 05 01 1 303050764 00 0018 + 018466 1248 05 02 1 303050764 01 0018 + 018467 9999 99 99 0 9999 99 9999 + 018468 9999 99 99 0 9999 99 9999 + 018469 9999 99 99 0 9999 99 9999 + 018470 9999 99 99 0 9999 99 9999 + 018471 9999 99 99 0 9999 99 9999 + 018472 9999 99 99 0 9999 99 9999 + 018473 1248 06 01 1 303050764 02 0018 + 018474 1248 06 02 1 303050764 03 0018 + 018475 9999 99 99 0 9999 99 9999 + 018476 9999 99 99 0 9999 99 9999 + 018477 9999 99 99 0 9999 99 9999 + 018478 9999 99 99 0 9999 99 9999 + 018479 9999 99 99 0 9999 99 9999 + 018480 9999 99 99 0 9999 99 9999 + 018481 1248 07 01 1 303050764 04 0018 + 018482 1248 07 02 1 303050764 05 0018 + 018483 9999 99 99 0 9999 99 9999 + 018484 9999 99 99 0 9999 99 9999 + 018485 9999 99 99 0 9999 99 9999 + 018486 9999 99 99 0 9999 99 9999 + 018487 9999 99 99 0 9999 99 9999 + 018488 9999 99 99 0 9999 99 9999 + 018489 1248 08 01 1 303050764 06 0018 + 018490 1248 08 02 1 303050764 07 0018 + 018491 9999 99 99 0 9999 99 9999 + 018492 9999 99 99 0 9999 99 9999 + 018493 9999 99 99 0 9999 99 9999 + 018494 9999 99 99 0 9999 99 9999 + 018495 9999 99 99 0 9999 99 9999 + 018496 9999 99 99 0 9999 99 9999 + 018497 1248 09 01 1 304115724 00 0146 + 018498 1248 09 02 1 304115724 01 0146 + 018499 1248 09 03 1 304115724 02 0146 + 018500 1248 09 04 1 304115724 03 0146 + 018501 9999 99 99 0 9999 99 9999 + 018502 9999 99 99 0 9999 99 9999 + 018503 9999 99 99 0 9999 99 9999 + 018504 9999 99 99 0 9999 99 9999 + 018505 1248 10 01 1 304115724 04 0146 + 018506 1248 10 02 1 304115724 05 0146 + 018507 1248 10 03 1 304115724 06 0146 + 018508 1248 10 04 1 304115724 07 0146 + 018509 9999 99 99 0 9999 99 9999 + 018510 9999 99 99 0 9999 99 9999 + 018511 9999 99 99 0 9999 99 9999 + 018512 9999 99 99 0 9999 99 9999 + 018513 1248 11 01 1 304115724 08 0146 + 018514 1248 11 02 1 304115724 09 0146 + 018515 1248 11 03 1 304115724 10 0146 + 018516 1248 11 04 1 304115724 11 0146 + 018517 9999 99 99 0 9999 99 9999 + 018518 9999 99 99 0 9999 99 9999 + 018519 9999 99 99 0 9999 99 9999 + 018520 9999 99 99 0 9999 99 9999 + 018521 1248 12 01 1 304115724 12 0146 + 018522 1248 12 02 1 304115724 13 0146 + 018523 1248 12 03 1 304115724 14 0146 + 018524 1248 12 04 1 304115724 15 0146 + 018525 9999 99 99 0 9999 99 9999 + 018526 9999 99 99 0 9999 99 9999 + 018527 9999 99 99 0 9999 99 9999 + 018528 9999 99 99 0 9999 99 9999 + 018529 1248 13 01 1 304115728 08 0147 + 018530 1248 13 02 1 304115728 09 0147 + 018531 1248 13 03 1 304115728 10 0147 + 018532 1248 13 04 1 304115728 11 0147 + 018533 9999 99 99 0 9999 99 9999 + 018534 9999 99 99 0 9999 99 9999 + 018535 9999 99 99 0 9999 99 9999 + 018536 9999 99 99 0 9999 99 9999 + 018537 1248 14 01 1 304115728 12 0147 + 018538 1248 14 02 1 304115728 13 0147 + 018539 1248 14 03 1 304115728 14 0147 + 018540 1248 14 04 1 304115728 15 0147 + 018541 9999 99 99 0 9999 99 9999 + 018542 9999 99 99 0 9999 99 9999 + 018543 9999 99 99 0 9999 99 9999 + 018544 9999 99 99 0 9999 99 9999 + 018545 1248 15 01 1 304115728 00 0147 + 018546 1248 15 02 1 304115728 01 0147 + 018547 1248 15 03 1 304115728 02 0147 + 018548 1248 15 04 1 304115728 03 0147 + 018549 9999 99 99 0 9999 99 9999 + 018550 9999 99 99 0 9999 99 9999 + 018551 9999 99 99 0 9999 99 9999 + 018552 9999 99 99 0 9999 99 9999 + 018553 1248 16 01 1 304115728 04 0147 + 018554 1248 16 02 1 304115728 05 0147 + 018555 1248 16 03 1 304115728 06 0147 + 018556 1248 16 04 1 304115728 07 0147 + 018557 9999 99 99 0 9999 99 9999 + 018558 9999 99 99 0 9999 99 9999 + 018559 9999 99 99 0 9999 99 9999 + 018560 9999 99 99 0 9999 99 9999 + 018561 1248 17 01 1 306249736 00 0793 + 018562 1248 17 02 1 306249736 01 0793 + 018563 1248 17 03 1 306249736 02 0793 + 018564 1248 17 04 1 306249736 03 0793 + 018565 1248 17 05 1 306249736 04 0793 + 018566 1248 17 06 1 306249736 05 0793 + 018567 1248 17 07 1 306249736 06 0793 + 018568 1248 17 08 1 306249736 07 0793 + 018569 1248 18 01 1 306249736 08 0793 + 018570 1248 18 02 1 306249736 09 0793 + 018571 1248 18 03 1 306249736 10 0793 + 018572 1248 18 04 1 306249736 11 0793 + 018573 1248 18 05 1 306249736 12 0793 + 018574 1248 18 06 1 306249736 13 0793 + 018575 1248 18 07 1 306249736 14 0793 + 018576 1248 18 08 1 306249736 15 0793 + 018577 1248 19 01 1 306249732 00 0792 + 018578 1248 19 02 1 306249732 01 0792 + 018579 1248 19 03 1 306249732 02 0792 + 018580 1248 19 04 1 306249732 03 0792 + 018581 1248 19 05 1 306249732 04 0792 + 018582 1248 19 06 1 306249732 05 0792 + 018583 1248 19 07 1 306249732 06 0792 + 018584 1248 19 08 1 306249732 07 0792 + 018585 1248 20 01 1 306249732 08 0792 + 018586 1248 20 02 1 306249732 09 0792 + 018587 1248 20 03 1 306249732 10 0792 + 018588 1248 20 04 1 306249732 11 0792 + 018589 1248 20 05 1 306249732 12 0792 + 018590 1248 20 06 1 306249732 13 0792 + 018591 1248 20 07 1 306249732 14 0792 + 018592 1248 20 08 1 306249732 15 0792 + 018593 1248 21 01 1 306249744 00 0795 + 018594 1248 21 02 1 306249744 01 0795 + 018595 1248 21 03 1 306249744 02 0795 + 018596 1248 21 04 1 306249744 03 0795 + 018597 1248 21 05 1 306249744 04 0795 + 018598 1248 21 06 1 306249744 05 0795 + 018599 1248 21 07 1 306249744 06 0795 + 018600 1248 21 08 1 306249744 07 0795 + 018601 1248 22 01 1 306249744 08 0795 + 018602 1248 22 02 1 306249744 09 0795 + 018603 1248 22 03 1 306249744 10 0795 + 018604 1248 22 04 1 306249744 11 0795 + 018605 1248 22 05 1 306249744 12 0795 + 018606 1248 22 06 1 306249744 13 0795 + 018607 1248 22 07 1 306249744 14 0795 + 018608 1248 22 08 1 306249744 15 0795 + 018609 1248 23 01 1 306249740 00 0794 + 018610 1248 23 02 1 306249740 01 0794 + 018611 1248 23 03 1 306249740 02 0794 + 018612 1248 23 04 1 306249740 03 0794 + 018613 1248 23 05 1 306249740 04 0794 + 018614 1248 23 06 1 306249740 05 0794 + 018615 1248 23 07 1 306249740 06 0794 + 018616 1248 23 08 1 306249740 07 0794 + 018617 1248 24 01 1 306249740 08 0794 + 018618 1248 24 02 1 306249740 09 0794 + 018619 1248 24 03 1 306249740 10 0794 + 018620 1248 24 04 1 306249740 11 0794 + 018621 1248 24 05 1 306249740 12 0794 + 018622 1248 24 06 1 306249740 13 0794 + 018623 1248 24 07 1 306249740 14 0794 + 018624 1248 24 08 1 306249740 15 0794 + 018625 1248 25 01 1 303050760 08 0017 + 018626 1248 25 02 1 303050760 09 0017 + 018627 9999 99 99 0 9999 99 9999 + 018628 9999 99 99 0 9999 99 9999 + 018629 9999 99 99 0 9999 99 9999 + 018630 9999 99 99 0 9999 99 9999 + 018631 9999 99 99 0 9999 99 9999 + 018632 9999 99 99 0 9999 99 9999 + 018633 1248 26 01 1 303050760 10 0017 + 018634 1248 26 02 1 303050760 11 0017 + 018635 9999 99 99 0 9999 99 9999 + 018636 9999 99 99 0 9999 99 9999 + 018637 9999 99 99 0 9999 99 9999 + 018638 9999 99 99 0 9999 99 9999 + 018639 9999 99 99 0 9999 99 9999 + 018640 9999 99 99 0 9999 99 9999 + 018641 1248 27 01 1 303050760 12 0017 + 018642 1248 27 02 1 303050760 13 0017 + 018643 9999 99 99 0 9999 99 9999 + 018644 9999 99 99 0 9999 99 9999 + 018645 9999 99 99 0 9999 99 9999 + 018646 9999 99 99 0 9999 99 9999 + 018647 9999 99 99 0 9999 99 9999 + 018648 9999 99 99 0 9999 99 9999 + 018649 1248 28 01 1 303050760 14 0017 + 018650 1248 28 02 1 303050760 15 0017 + 018651 9999 99 99 0 9999 99 9999 + 018652 9999 99 99 0 9999 99 9999 + 018653 9999 99 99 0 9999 99 9999 + 018654 9999 99 99 0 9999 99 9999 + 018655 9999 99 99 0 9999 99 9999 + 018656 9999 99 99 0 9999 99 9999 + 018657 1248 29 01 1 303050760 04 0017 + 018658 1248 29 02 1 303050760 05 0017 + 018659 9999 99 99 0 9999 99 9999 + 018660 9999 99 99 0 9999 99 9999 + 018661 9999 99 99 0 9999 99 9999 + 018662 9999 99 99 0 9999 99 9999 + 018663 9999 99 99 0 9999 99 9999 + 018664 9999 99 99 0 9999 99 9999 + 018665 1248 30 01 1 303050760 06 0017 + 018666 1248 30 02 1 303050760 07 0017 + 018667 9999 99 99 0 9999 99 9999 + 018668 9999 99 99 0 9999 99 9999 + 018669 9999 99 99 0 9999 99 9999 + 018670 9999 99 99 0 9999 99 9999 + 018671 9999 99 99 0 9999 99 9999 + 018672 9999 99 99 0 9999 99 9999 + 018673 1248 31 01 1 303050760 00 0017 + 018674 1248 31 02 1 303050760 01 0017 + 018675 9999 99 99 0 9999 99 9999 + 018676 9999 99 99 0 9999 99 9999 + 018677 9999 99 99 0 9999 99 9999 + 018678 9999 99 99 0 9999 99 9999 + 018679 9999 99 99 0 9999 99 9999 + 018680 9999 99 99 0 9999 99 9999 + 018681 1248 32 01 1 303050760 02 0017 + 018682 1248 32 02 1 303050760 03 0017 + 018683 9999 99 99 0 9999 99 9999 + 018684 9999 99 99 0 9999 99 9999 + 018685 9999 99 99 0 9999 99 9999 + 018686 9999 99 99 0 9999 99 9999 + 018687 9999 99 99 0 9999 99 9999 + 018688 9999 99 99 0 9999 99 9999 + 018689 1248 33 01 1 306245640 00 0785 + 018690 1248 33 02 1 306245640 01 0785 + 018691 1248 33 03 1 306245640 02 0785 + 018692 1248 33 04 1 306245640 03 0785 + 018693 1248 33 05 1 306245640 04 0785 + 018694 1248 33 06 1 306245640 05 0785 + 018695 1248 33 07 1 306245640 06 0785 + 018696 1248 33 08 1 306245640 07 0785 + 018697 1248 34 01 1 306245640 08 0785 + 018698 1248 34 02 1 306245640 09 0785 + 018699 1248 34 03 1 306245640 10 0785 + 018700 1248 34 04 1 306245640 11 0785 + 018701 1248 34 05 1 306245640 12 0785 + 018702 1248 34 06 1 306245640 13 0785 + 018703 1248 34 07 1 306245640 14 0785 + 018704 1248 34 08 1 306245640 15 0785 + 018705 1248 35 01 1 306245636 00 0784 + 018706 1248 35 02 1 306245636 01 0784 + 018707 1248 35 03 1 306245636 02 0784 + 018708 1248 35 04 1 306245636 03 0784 + 018709 1248 35 05 1 306245636 04 0784 + 018710 1248 35 06 1 306245636 05 0784 + 018711 1248 35 07 1 306245636 06 0784 + 018712 1248 35 08 1 306245636 07 0784 + 018713 1248 36 01 1 306245636 08 0784 + 018714 1248 36 02 1 306245636 09 0784 + 018715 1248 36 03 1 306245636 10 0784 + 018716 1248 36 04 1 306245636 11 0784 + 018717 1248 36 05 1 306245636 12 0784 + 018718 1248 36 06 1 306245636 13 0784 + 018719 1248 36 07 1 306245636 14 0784 + 018720 1248 36 08 1 306245636 15 0784 + 018721 1248 37 01 1 306245648 00 0787 + 018722 1248 37 02 1 306245648 01 0787 + 018723 1248 37 03 1 306245648 02 0787 + 018724 1248 37 04 1 306245648 03 0787 + 018725 1248 37 05 1 306245648 04 0787 + 018726 1248 37 06 1 306245648 05 0787 + 018727 1248 37 07 1 306245648 06 0787 + 018728 1248 37 08 1 306245648 07 0787 + 018729 1248 38 01 1 306245648 08 0787 + 018730 1248 38 02 1 306245648 09 0787 + 018731 1248 38 03 1 306245648 10 0787 + 018732 1248 38 04 1 306245648 11 0787 + 018733 1248 38 05 1 306245648 12 0787 + 018734 1248 38 06 1 306245648 13 0787 + 018735 1248 38 07 1 306245648 14 0787 + 018736 1248 38 08 1 306245648 15 0787 + 018737 1248 39 01 1 306245644 00 0786 + 018738 1248 39 02 1 306245644 01 0786 + 018739 1248 39 03 1 306245644 02 0786 + 018740 1248 39 04 1 306245644 03 0786 + 018741 1248 39 05 1 306245644 04 0786 + 018742 1248 39 06 1 306245644 05 0786 + 018743 1248 39 07 1 306245644 06 0786 + 018744 1248 39 08 1 306245644 07 0786 + 018745 1248 40 01 1 306245644 08 0786 + 018746 1248 40 02 1 306245644 09 0786 + 018747 1248 40 03 1 306245644 10 0786 + 018748 1248 40 04 1 306245644 11 0786 + 018749 1248 40 05 1 306245644 12 0786 + 018750 1248 40 06 1 306245644 13 0786 + 018751 1248 40 07 1 306245644 14 0786 + 018752 1248 40 08 1 306245644 15 0786 + 018753 1248 41 01 1 304115720 00 0145 + 018754 1248 41 02 1 304115720 01 0145 + 018755 1248 41 03 1 304115720 02 0145 + 018756 1248 41 04 1 304115720 03 0145 + 018757 9999 99 99 0 9999 99 9999 + 018758 9999 99 99 0 9999 99 9999 + 018759 9999 99 99 0 9999 99 9999 + 018760 9999 99 99 0 9999 99 9999 + 018761 1248 42 01 1 304115720 04 0145 + 018762 1248 42 02 1 304115720 05 0145 + 018763 1248 42 03 1 304115720 06 0145 + 018764 1248 42 04 1 304115720 07 0145 + 018765 9999 99 99 0 9999 99 9999 + 018766 9999 99 99 0 9999 99 9999 + 018767 9999 99 99 0 9999 99 9999 + 018768 9999 99 99 0 9999 99 9999 + 018769 1248 43 01 1 304115720 08 0145 + 018770 1248 43 02 1 304115720 09 0145 + 018771 1248 43 03 1 304115720 10 0145 + 018772 1248 43 04 1 304115720 11 0145 + 018773 9999 99 99 0 9999 99 9999 + 018774 9999 99 99 0 9999 99 9999 + 018775 9999 99 99 0 9999 99 9999 + 018776 9999 99 99 0 9999 99 9999 + 018777 1248 44 01 1 304115720 12 0145 + 018778 1248 44 02 1 304115720 13 0145 + 018779 1248 44 03 1 304115720 14 0145 + 018780 1248 44 04 1 304115720 15 0145 + 018781 9999 99 99 0 9999 99 9999 + 018782 9999 99 99 0 9999 99 9999 + 018783 9999 99 99 0 9999 99 9999 + 018784 9999 99 99 0 9999 99 9999 + 018785 1248 45 01 1 304115716 00 0144 + 018786 1248 45 02 1 304115716 01 0144 + 018787 1248 45 03 1 304115716 02 0144 + 018788 1248 45 04 1 304115716 03 0144 + 018789 9999 99 99 0 9999 99 9999 + 018790 9999 99 99 0 9999 99 9999 + 018791 9999 99 99 0 9999 99 9999 + 018792 9999 99 99 0 9999 99 9999 + 018793 1248 46 01 1 304115716 04 0144 + 018794 1248 46 02 1 304115716 05 0144 + 018795 1248 46 03 1 304115716 06 0144 + 018796 1248 46 04 1 304115716 07 0144 + 018797 9999 99 99 0 9999 99 9999 + 018798 9999 99 99 0 9999 99 9999 + 018799 9999 99 99 0 9999 99 9999 + 018800 9999 99 99 0 9999 99 9999 + 018801 1248 47 01 1 304115716 08 0144 + 018802 1248 47 02 1 304115716 09 0144 + 018803 1248 47 03 1 304115716 10 0144 + 018804 1248 47 04 1 304115716 11 0144 + 018805 9999 99 99 0 9999 99 9999 + 018806 9999 99 99 0 9999 99 9999 + 018807 9999 99 99 0 9999 99 9999 + 018808 9999 99 99 0 9999 99 9999 + 018809 1248 48 01 1 304115716 12 0144 + 018810 1248 48 02 1 304115716 13 0144 + 018811 1248 48 03 1 304115716 14 0144 + 018812 1248 48 04 1 304115716 15 0144 + 018813 9999 99 99 0 9999 99 9999 + 018814 9999 99 99 0 9999 99 9999 + 018815 9999 99 99 0 9999 99 9999 + 018816 9999 99 99 0 9999 99 9999 + 018817 1249 01 01 1 304111628 08 0138 + 018818 1249 01 02 1 304111628 09 0138 + 018819 1249 01 03 1 304111628 10 0138 + 018820 1249 01 04 1 304111628 11 0138 + 018821 9999 99 99 0 9999 99 9999 + 018822 9999 99 99 0 9999 99 9999 + 018823 9999 99 99 0 9999 99 9999 + 018824 9999 99 99 0 9999 99 9999 + 018825 1249 02 01 1 304111628 12 0138 + 018826 1249 02 02 1 304111628 13 0138 + 018827 1249 02 03 1 304111628 14 0138 + 018828 1249 02 04 1 304111628 15 0138 + 018829 9999 99 99 0 9999 99 9999 + 018830 9999 99 99 0 9999 99 9999 + 018831 9999 99 99 0 9999 99 9999 + 018832 9999 99 99 0 9999 99 9999 + 018833 1249 03 01 1 304111628 00 0138 + 018834 1249 03 02 1 304111628 01 0138 + 018835 1249 03 03 1 304111628 02 0138 + 018836 1249 03 04 1 304111628 03 0138 + 018837 9999 99 99 0 9999 99 9999 + 018838 9999 99 99 0 9999 99 9999 + 018839 9999 99 99 0 9999 99 9999 + 018840 9999 99 99 0 9999 99 9999 + 018841 1249 04 01 1 304111628 04 0138 + 018842 1249 04 02 1 304111628 05 0138 + 018843 1249 04 03 1 304111628 06 0138 + 018844 1249 04 04 1 304111628 07 0138 + 018845 9999 99 99 0 9999 99 9999 + 018846 9999 99 99 0 9999 99 9999 + 018847 9999 99 99 0 9999 99 9999 + 018848 9999 99 99 0 9999 99 9999 + 018849 1249 05 01 1 304111632 08 0139 + 018850 1249 05 02 1 304111632 09 0139 + 018851 1249 05 03 1 304111632 10 0139 + 018852 1249 05 04 1 304111632 11 0139 + 018853 9999 99 99 0 9999 99 9999 + 018854 9999 99 99 0 9999 99 9999 + 018855 9999 99 99 0 9999 99 9999 + 018856 9999 99 99 0 9999 99 9999 + 018857 1249 06 01 1 304111632 12 0139 + 018858 1249 06 02 1 304111632 13 0139 + 018859 1249 06 03 1 304111632 14 0139 + 018860 1249 06 04 1 304111632 15 0139 + 018861 9999 99 99 0 9999 99 9999 + 018862 9999 99 99 0 9999 99 9999 + 018863 9999 99 99 0 9999 99 9999 + 018864 9999 99 99 0 9999 99 9999 + 018865 1249 07 01 1 304111632 00 0139 + 018866 1249 07 02 1 304111632 01 0139 + 018867 1249 07 03 1 304111632 02 0139 + 018868 1249 07 04 1 304111632 03 0139 + 018869 9999 99 99 0 9999 99 9999 + 018870 9999 99 99 0 9999 99 9999 + 018871 9999 99 99 0 9999 99 9999 + 018872 9999 99 99 0 9999 99 9999 + 018873 1249 08 01 1 304111632 04 0139 + 018874 1249 08 02 1 304111632 05 0139 + 018875 1249 08 03 1 304111632 06 0139 + 018876 1249 08 04 1 304111632 07 0139 + 018877 9999 99 99 0 9999 99 9999 + 018878 9999 99 99 0 9999 99 9999 + 018879 9999 99 99 0 9999 99 9999 + 018880 9999 99 99 0 9999 99 9999 + 018881 1249 09 01 1 306241548 00 0778 + 018882 1249 09 02 1 306241548 01 0778 + 018883 1249 09 03 1 306241548 02 0778 + 018884 1249 09 04 1 306241548 03 0778 + 018885 1249 09 05 1 306241548 04 0778 + 018886 1249 09 06 1 306241548 05 0778 + 018887 1249 09 07 1 306241548 06 0778 + 018888 1249 09 08 1 306241548 07 0778 + 018889 1249 10 01 1 306241548 08 0778 + 018890 1249 10 02 1 306241548 09 0778 + 018891 1249 10 03 1 306241548 10 0778 + 018892 1249 10 04 1 306241548 11 0778 + 018893 1249 10 05 1 306241548 12 0778 + 018894 1249 10 06 1 306241548 13 0778 + 018895 1249 10 07 1 306241548 14 0778 + 018896 1249 10 08 1 306241548 15 0778 + 018897 1249 11 01 1 306241552 00 0779 + 018898 1249 11 02 1 306241552 01 0779 + 018899 1249 11 03 1 306241552 02 0779 + 018900 1249 11 04 1 306241552 03 0779 + 018901 1249 11 05 1 306241552 04 0779 + 018902 1249 11 06 1 306241552 05 0779 + 018903 1249 11 07 1 306241552 06 0779 + 018904 1249 11 08 1 306241552 07 0779 + 018905 1249 12 01 1 306241552 08 0779 + 018906 1249 12 02 1 306241552 09 0779 + 018907 1249 12 03 1 306241552 10 0779 + 018908 1249 12 04 1 306241552 11 0779 + 018909 1249 12 05 1 306241552 12 0779 + 018910 1249 12 06 1 306241552 13 0779 + 018911 1249 12 07 1 306241552 14 0779 + 018912 1249 12 08 1 306241552 15 0779 + 018913 1249 13 01 1 306241540 00 0776 + 018914 1249 13 02 1 306241540 01 0776 + 018915 1249 13 03 1 306241540 02 0776 + 018916 1249 13 04 1 306241540 03 0776 + 018917 1249 13 05 1 306241540 04 0776 + 018918 1249 13 06 1 306241540 05 0776 + 018919 1249 13 07 1 306241540 06 0776 + 018920 1249 13 08 1 306241540 07 0776 + 018921 1249 14 01 1 306241540 08 0776 + 018922 1249 14 02 1 306241540 09 0776 + 018923 1249 14 03 1 306241540 10 0776 + 018924 1249 14 04 1 306241540 11 0776 + 018925 1249 14 05 1 306241540 12 0776 + 018926 1249 14 06 1 306241540 13 0776 + 018927 1249 14 07 1 306241540 14 0776 + 018928 1249 14 08 1 306241540 15 0776 + 018929 1249 15 01 1 306241544 00 0777 + 018930 1249 15 02 1 306241544 01 0777 + 018931 1249 15 03 1 306241544 02 0777 + 018932 1249 15 04 1 306241544 03 0777 + 018933 1249 15 05 1 306241544 04 0777 + 018934 1249 15 06 1 306241544 05 0777 + 018935 1249 15 07 1 306241544 06 0777 + 018936 1249 15 08 1 306241544 07 0777 + 018937 1249 16 01 1 306241544 08 0777 + 018938 1249 16 02 1 306241544 09 0777 + 018939 1249 16 03 1 306241544 10 0777 + 018940 1249 16 04 1 306241544 11 0777 + 018941 1249 16 05 1 306241544 12 0777 + 018942 1249 16 06 1 306241544 13 0777 + 018943 1249 16 07 1 306241544 14 0777 + 018944 1249 16 08 1 306241544 15 0777 + 018945 1249 17 01 1 303050756 12 0016 + 018946 1249 17 02 1 303050756 13 0016 + 018947 9999 99 99 0 9999 99 9999 + 018948 9999 99 99 0 9999 99 9999 + 018949 9999 99 99 0 9999 99 9999 + 018950 9999 99 99 0 9999 99 9999 + 018951 9999 99 99 0 9999 99 9999 + 018952 9999 99 99 0 9999 99 9999 + 018953 1249 18 01 1 303050756 14 0016 + 018954 1249 18 02 1 303050756 15 0016 + 018955 9999 99 99 0 9999 99 9999 + 018956 9999 99 99 0 9999 99 9999 + 018957 9999 99 99 0 9999 99 9999 + 018958 9999 99 99 0 9999 99 9999 + 018959 9999 99 99 0 9999 99 9999 + 018960 9999 99 99 0 9999 99 9999 + 018961 1249 19 01 1 303050756 08 0016 + 018962 1249 19 02 1 303050756 09 0016 + 018963 9999 99 99 0 9999 99 9999 + 018964 9999 99 99 0 9999 99 9999 + 018965 9999 99 99 0 9999 99 9999 + 018966 9999 99 99 0 9999 99 9999 + 018967 9999 99 99 0 9999 99 9999 + 018968 9999 99 99 0 9999 99 9999 + 018969 1249 20 01 1 303050756 10 0016 + 018970 1249 20 02 1 303050756 11 0016 + 018971 9999 99 99 0 9999 99 9999 + 018972 9999 99 99 0 9999 99 9999 + 018973 9999 99 99 0 9999 99 9999 + 018974 9999 99 99 0 9999 99 9999 + 018975 9999 99 99 0 9999 99 9999 + 018976 9999 99 99 0 9999 99 9999 + 018977 1249 21 01 1 303050756 00 0016 + 018978 1249 21 02 1 303050756 01 0016 + 018979 9999 99 99 0 9999 99 9999 + 018980 9999 99 99 0 9999 99 9999 + 018981 9999 99 99 0 9999 99 9999 + 018982 9999 99 99 0 9999 99 9999 + 018983 9999 99 99 0 9999 99 9999 + 018984 9999 99 99 0 9999 99 9999 + 018985 1249 22 01 1 303050756 02 0016 + 018986 1249 22 02 1 303050756 03 0016 + 018987 9999 99 99 0 9999 99 9999 + 018988 9999 99 99 0 9999 99 9999 + 018989 9999 99 99 0 9999 99 9999 + 018990 9999 99 99 0 9999 99 9999 + 018991 9999 99 99 0 9999 99 9999 + 018992 9999 99 99 0 9999 99 9999 + 018993 1249 23 01 1 303050756 04 0016 + 018994 1249 23 02 1 303050756 05 0016 + 018995 9999 99 99 0 9999 99 9999 + 018996 9999 99 99 0 9999 99 9999 + 018997 9999 99 99 0 9999 99 9999 + 018998 9999 99 99 0 9999 99 9999 + 018999 9999 99 99 0 9999 99 9999 + 019000 9999 99 99 0 9999 99 9999 + 019001 1249 24 01 1 303050756 06 0016 + 019002 1249 24 02 1 303050756 07 0016 + 019003 9999 99 99 0 9999 99 9999 + 019004 9999 99 99 0 9999 99 9999 + 019005 9999 99 99 0 9999 99 9999 + 019006 9999 99 99 0 9999 99 9999 + 019007 9999 99 99 0 9999 99 9999 + 019008 9999 99 99 0 9999 99 9999 + 019009 1249 25 01 1 305180680 00 0401 + 019010 1249 25 02 1 305180680 01 0401 + 019011 1249 25 03 1 305180680 02 0401 + 019012 1249 25 04 1 305180680 03 0401 + 019013 1249 25 05 1 305180680 04 0401 + 019014 1249 25 06 1 305180680 05 0401 + 019015 1249 25 07 1 305180680 06 0401 + 019016 1249 25 08 1 305180680 07 0401 + 019017 1249 26 01 1 305180680 08 0401 + 019018 1249 26 02 1 305180680 09 0401 + 019019 1249 26 03 1 305180680 10 0401 + 019020 1249 26 04 1 305180680 11 0401 + 019021 1249 26 05 1 305180680 12 0401 + 019022 1249 26 06 1 305180680 13 0401 + 019023 1249 26 07 1 305180680 14 0401 + 019024 1249 26 08 1 305180680 15 0401 + 019025 1249 27 01 1 305180676 00 0400 + 019026 1249 27 02 1 305180676 01 0400 + 019027 1249 27 03 1 305180676 02 0400 + 019028 1249 27 04 1 305180676 03 0400 + 019029 1249 27 05 1 305180676 04 0400 + 019030 1249 27 06 1 305180676 05 0400 + 019031 1249 27 07 1 305180676 06 0400 + 019032 1249 27 08 1 305180676 07 0400 + 019033 1249 28 01 1 305180676 08 0400 + 019034 1249 28 02 1 305180676 09 0400 + 019035 1249 28 03 1 305180676 10 0400 + 019036 1249 28 04 1 305180676 11 0400 + 019037 1249 28 05 1 305180676 12 0400 + 019038 1249 28 06 1 305180676 13 0400 + 019039 1249 28 07 1 305180676 14 0400 + 019040 1249 28 08 1 305180676 15 0400 + 019041 1249 29 01 1 305180688 00 0403 + 019042 1249 29 02 1 305180688 01 0403 + 019043 1249 29 03 1 305180688 02 0403 + 019044 1249 29 04 1 305180688 03 0403 + 019045 1249 29 05 1 305180688 04 0403 + 019046 1249 29 06 1 305180688 05 0403 + 019047 1249 29 07 1 305180688 06 0403 + 019048 1249 29 08 1 305180688 07 0403 + 019049 1249 30 01 1 305180688 08 0403 + 019050 1249 30 02 1 305180688 09 0403 + 019051 1249 30 03 1 305180688 10 0403 + 019052 1249 30 04 1 305180688 11 0403 + 019053 1249 30 05 1 305180688 12 0403 + 019054 1249 30 06 1 305180688 13 0403 + 019055 1249 30 07 1 305180688 14 0403 + 019056 1249 30 08 1 305180688 15 0403 + 019057 1249 31 01 1 305180684 00 0402 + 019058 1249 31 02 1 305180684 01 0402 + 019059 1249 31 03 1 305180684 02 0402 + 019060 1249 31 04 1 305180684 03 0402 + 019061 1249 31 05 1 305180684 04 0402 + 019062 1249 31 06 1 305180684 05 0402 + 019063 1249 31 07 1 305180684 06 0402 + 019064 1249 31 08 1 305180684 07 0402 + 019065 1249 32 01 1 305180684 08 0402 + 019066 1249 32 02 1 305180684 09 0402 + 019067 1249 32 03 1 305180684 10 0402 + 019068 1249 32 04 1 305180684 11 0402 + 019069 1249 32 05 1 305180684 12 0402 + 019070 1249 32 06 1 305180684 13 0402 + 019071 1249 32 07 1 305180684 14 0402 + 019072 1249 32 08 1 305180684 15 0402 + 019073 1249 33 01 1 306237452 00 0770 + 019074 1249 33 02 1 306237452 01 0770 + 019075 1249 33 03 1 306237452 02 0770 + 019076 1249 33 04 1 306237452 03 0770 + 019077 1249 33 05 1 306237452 04 0770 + 019078 1249 33 06 1 306237452 05 0770 + 019079 1249 33 07 1 306237452 06 0770 + 019080 1249 33 08 1 306237452 07 0770 + 019081 1249 34 01 1 306237452 08 0770 + 019082 1249 34 02 1 306237452 09 0770 + 019083 1249 34 03 1 306237452 10 0770 + 019084 1249 34 04 1 306237452 11 0770 + 019085 1249 34 05 1 306237452 12 0770 + 019086 1249 34 06 1 306237452 13 0770 + 019087 1249 34 07 1 306237452 14 0770 + 019088 1249 34 08 1 306237452 15 0770 + 019089 1249 35 01 1 306237456 00 0771 + 019090 1249 35 02 1 306237456 01 0771 + 019091 1249 35 03 1 306237456 02 0771 + 019092 1249 35 04 1 306237456 03 0771 + 019093 1249 35 05 1 306237456 04 0771 + 019094 1249 35 06 1 306237456 05 0771 + 019095 1249 35 07 1 306237456 06 0771 + 019096 1249 35 08 1 306237456 07 0771 + 019097 1249 36 01 1 306237456 08 0771 + 019098 1249 36 02 1 306237456 09 0771 + 019099 1249 36 03 1 306237456 10 0771 + 019100 1249 36 04 1 306237456 11 0771 + 019101 1249 36 05 1 306237456 12 0771 + 019102 1249 36 06 1 306237456 13 0771 + 019103 1249 36 07 1 306237456 14 0771 + 019104 1249 36 08 1 306237456 15 0771 + 019105 1249 37 01 1 306237444 00 0768 + 019106 1249 37 02 1 306237444 01 0768 + 019107 1249 37 03 1 306237444 02 0768 + 019108 1249 37 04 1 306237444 03 0768 + 019109 1249 37 05 1 306237444 04 0768 + 019110 1249 37 06 1 306237444 05 0768 + 019111 1249 37 07 1 306237444 06 0768 + 019112 1249 37 08 1 306237444 07 0768 + 019113 1249 38 01 1 306237444 08 0768 + 019114 1249 38 02 1 306237444 09 0768 + 019115 1249 38 03 1 306237444 10 0768 + 019116 1249 38 04 1 306237444 11 0768 + 019117 1249 38 05 1 306237444 12 0768 + 019118 1249 38 06 1 306237444 13 0768 + 019119 1249 38 07 1 306237444 14 0768 + 019120 1249 38 08 1 306237444 15 0768 + 019121 1249 39 01 1 306237448 00 0769 + 019122 1249 39 02 1 306237448 01 0769 + 019123 1249 39 03 1 306237448 02 0769 + 019124 1249 39 04 1 306237448 03 0769 + 019125 1249 39 05 1 306237448 04 0769 + 019126 1249 39 06 1 306237448 05 0769 + 019127 1249 39 07 1 306237448 06 0769 + 019128 1249 39 08 1 306237448 07 0769 + 019129 1249 40 01 1 306237448 08 0769 + 019130 1249 40 02 1 306237448 09 0769 + 019131 1249 40 03 1 306237448 10 0769 + 019132 1249 40 04 1 306237448 11 0769 + 019133 1249 40 05 1 306237448 12 0769 + 019134 1249 40 06 1 306237448 13 0769 + 019135 1249 40 07 1 306237448 14 0769 + 019136 1249 40 08 1 306237448 15 0769 + 019137 1249 41 01 1 304111620 08 0136 + 019138 1249 41 02 1 304111620 09 0136 + 019139 1249 41 03 1 304111620 10 0136 + 019140 1249 41 04 1 304111620 11 0136 + 019141 9999 99 99 0 9999 99 9999 + 019142 9999 99 99 0 9999 99 9999 + 019143 9999 99 99 0 9999 99 9999 + 019144 9999 99 99 0 9999 99 9999 + 019145 1249 42 01 1 304111620 12 0136 + 019146 1249 42 02 1 304111620 13 0136 + 019147 1249 42 03 1 304111620 14 0136 + 019148 1249 42 04 1 304111620 15 0136 + 019149 9999 99 99 0 9999 99 9999 + 019150 9999 99 99 0 9999 99 9999 + 019151 9999 99 99 0 9999 99 9999 + 019152 9999 99 99 0 9999 99 9999 + 019153 1249 43 01 1 304111620 00 0136 + 019154 1249 43 02 1 304111620 01 0136 + 019155 1249 43 03 1 304111620 02 0136 + 019156 1249 43 04 1 304111620 03 0136 + 019157 9999 99 99 0 9999 99 9999 + 019158 9999 99 99 0 9999 99 9999 + 019159 9999 99 99 0 9999 99 9999 + 019160 9999 99 99 0 9999 99 9999 + 019161 1249 44 01 1 304111620 04 0136 + 019162 1249 44 02 1 304111620 05 0136 + 019163 1249 44 03 1 304111620 06 0136 + 019164 1249 44 04 1 304111620 07 0136 + 019165 9999 99 99 0 9999 99 9999 + 019166 9999 99 99 0 9999 99 9999 + 019167 9999 99 99 0 9999 99 9999 + 019168 9999 99 99 0 9999 99 9999 + 019169 1249 45 01 1 304111624 08 0137 + 019170 1249 45 02 1 304111624 09 0137 + 019171 1249 45 03 1 304111624 10 0137 + 019172 1249 45 04 1 304111624 11 0137 + 019173 9999 99 99 0 9999 99 9999 + 019174 9999 99 99 0 9999 99 9999 + 019175 9999 99 99 0 9999 99 9999 + 019176 9999 99 99 0 9999 99 9999 + 019177 1249 46 01 1 304111624 12 0137 + 019178 1249 46 02 1 304111624 13 0137 + 019179 1249 46 03 1 304111624 14 0137 + 019180 1249 46 04 1 304111624 15 0137 + 019181 9999 99 99 0 9999 99 9999 + 019182 9999 99 99 0 9999 99 9999 + 019183 9999 99 99 0 9999 99 9999 + 019184 9999 99 99 0 9999 99 9999 + 019185 1249 47 01 1 304111624 00 0137 + 019186 1249 47 02 1 304111624 01 0137 + 019187 1249 47 03 1 304111624 02 0137 + 019188 1249 47 04 1 304111624 03 0137 + 019189 9999 99 99 0 9999 99 9999 + 019190 9999 99 99 0 9999 99 9999 + 019191 9999 99 99 0 9999 99 9999 + 019192 9999 99 99 0 9999 99 9999 + 019193 1249 48 01 1 304111624 04 0137 + 019194 1249 48 02 1 304111624 05 0137 + 019195 1249 48 03 1 304111624 06 0137 + 019196 1249 48 04 1 304111624 07 0137 + 019197 9999 99 99 0 9999 99 9999 + 019198 9999 99 99 0 9999 99 9999 + 019199 9999 99 99 0 9999 99 9999 + 019200 9999 99 99 0 9999 99 9999 + 019201 1250 01 01 1 305176584 00 0393 + 019202 1250 01 02 1 305176584 01 0393 + 019203 1250 01 03 1 305176584 02 0393 + 019204 1250 01 04 1 305176584 03 0393 + 019205 1250 01 05 1 305176584 04 0393 + 019206 1250 01 06 1 305176584 05 0393 + 019207 1250 01 07 1 305176584 06 0393 + 019208 1250 01 08 1 305176584 07 0393 + 019209 1250 02 01 1 305176584 08 0393 + 019210 1250 02 02 1 305176584 09 0393 + 019211 1250 02 03 1 305176584 10 0393 + 019212 1250 02 04 1 305176584 11 0393 + 019213 1250 02 05 1 305176584 12 0393 + 019214 1250 02 06 1 305176584 13 0393 + 019215 1250 02 07 1 305176584 14 0393 + 019216 1250 02 08 1 305176584 15 0393 + 019217 1250 03 01 1 305176580 00 0392 + 019218 1250 03 02 1 305176580 01 0392 + 019219 1250 03 03 1 305176580 02 0392 + 019220 1250 03 04 1 305176580 03 0392 + 019221 1250 03 05 1 305176580 04 0392 + 019222 1250 03 06 1 305176580 05 0392 + 019223 1250 03 07 1 305176580 06 0392 + 019224 1250 03 08 1 305176580 07 0392 + 019225 1250 04 01 1 305176580 08 0392 + 019226 1250 04 02 1 305176580 09 0392 + 019227 1250 04 03 1 305176580 10 0392 + 019228 1250 04 04 1 305176580 11 0392 + 019229 1250 04 05 1 305176580 12 0392 + 019230 1250 04 06 1 305176580 13 0392 + 019231 1250 04 07 1 305176580 14 0392 + 019232 1250 04 08 1 305176580 15 0392 + 019233 1250 05 01 1 305176592 00 0395 + 019234 1250 05 02 1 305176592 01 0395 + 019235 1250 05 03 1 305176592 02 0395 + 019236 1250 05 04 1 305176592 03 0395 + 019237 1250 05 05 1 305176592 04 0395 + 019238 1250 05 06 1 305176592 05 0395 + 019239 1250 05 07 1 305176592 06 0395 + 019240 1250 05 08 1 305176592 07 0395 + 019241 1250 06 01 1 305176592 08 0395 + 019242 1250 06 02 1 305176592 09 0395 + 019243 1250 06 03 1 305176592 10 0395 + 019244 1250 06 04 1 305176592 11 0395 + 019245 1250 06 05 1 305176592 12 0395 + 019246 1250 06 06 1 305176592 13 0395 + 019247 1250 06 07 1 305176592 14 0395 + 019248 1250 06 08 1 305176592 15 0395 + 019249 1250 07 01 1 305176588 00 0394 + 019250 1250 07 02 1 305176588 01 0394 + 019251 1250 07 03 1 305176588 02 0394 + 019252 1250 07 04 1 305176588 03 0394 + 019253 1250 07 05 1 305176588 04 0394 + 019254 1250 07 06 1 305176588 05 0394 + 019255 1250 07 07 1 305176588 06 0394 + 019256 1250 07 08 1 305176588 07 0394 + 019257 1250 08 01 1 305176588 08 0394 + 019258 1250 08 02 1 305176588 09 0394 + 019259 1250 08 03 1 305176588 10 0394 + 019260 1250 08 04 1 305176588 11 0394 + 019261 1250 08 05 1 305176588 12 0394 + 019262 1250 08 06 1 305176588 13 0394 + 019263 1250 08 07 1 305176588 14 0394 + 019264 1250 08 08 1 305176588 15 0394 + 019265 9999 99 99 0 9999 99 9999 + 019266 9999 99 99 0 9999 99 9999 + 019267 9999 99 99 0 9999 99 9999 + 019268 9999 99 99 0 9999 99 9999 + 019269 9999 99 99 0 9999 99 9999 + 019270 9999 99 99 0 9999 99 9999 + 019271 9999 99 99 0 9999 99 9999 + 019272 9999 99 99 0 9999 99 9999 + 019273 9999 99 99 0 9999 99 9999 + 019274 9999 99 99 0 9999 99 9999 + 019275 9999 99 99 0 9999 99 9999 + 019276 9999 99 99 0 9999 99 9999 + 019277 9999 99 99 0 9999 99 9999 + 019278 9999 99 99 0 9999 99 9999 + 019279 9999 99 99 0 9999 99 9999 + 019280 9999 99 99 0 9999 99 9999 + 019281 9999 99 99 0 9999 99 9999 + 019282 9999 99 99 0 9999 99 9999 + 019283 9999 99 99 0 9999 99 9999 + 019284 9999 99 99 0 9999 99 9999 + 019285 9999 99 99 0 9999 99 9999 + 019286 9999 99 99 0 9999 99 9999 + 019287 9999 99 99 0 9999 99 9999 + 019288 9999 99 99 0 9999 99 9999 + 019289 9999 99 99 0 9999 99 9999 + 019290 9999 99 99 0 9999 99 9999 + 019291 9999 99 99 0 9999 99 9999 + 019292 9999 99 99 0 9999 99 9999 + 019293 9999 99 99 0 9999 99 9999 + 019294 9999 99 99 0 9999 99 9999 + 019295 9999 99 99 0 9999 99 9999 + 019296 9999 99 99 0 9999 99 9999 + 019297 9999 99 99 0 9999 99 9999 + 019298 9999 99 99 0 9999 99 9999 + 019299 9999 99 99 0 9999 99 9999 + 019300 9999 99 99 0 9999 99 9999 + 019301 9999 99 99 0 9999 99 9999 + 019302 9999 99 99 0 9999 99 9999 + 019303 9999 99 99 0 9999 99 9999 + 019304 9999 99 99 0 9999 99 9999 + 019305 9999 99 99 0 9999 99 9999 + 019306 9999 99 99 0 9999 99 9999 + 019307 9999 99 99 0 9999 99 9999 + 019308 9999 99 99 0 9999 99 9999 + 019309 9999 99 99 0 9999 99 9999 + 019310 9999 99 99 0 9999 99 9999 + 019311 9999 99 99 0 9999 99 9999 + 019312 9999 99 99 0 9999 99 9999 + 019313 9999 99 99 0 9999 99 9999 + 019314 9999 99 99 0 9999 99 9999 + 019315 9999 99 99 0 9999 99 9999 + 019316 9999 99 99 0 9999 99 9999 + 019317 9999 99 99 0 9999 99 9999 + 019318 9999 99 99 0 9999 99 9999 + 019319 9999 99 99 0 9999 99 9999 + 019320 9999 99 99 0 9999 99 9999 + 019321 9999 99 99 0 9999 99 9999 + 019322 9999 99 99 0 9999 99 9999 + 019323 9999 99 99 0 9999 99 9999 + 019324 9999 99 99 0 9999 99 9999 + 019325 9999 99 99 0 9999 99 9999 + 019326 9999 99 99 0 9999 99 9999 + 019327 9999 99 99 0 9999 99 9999 + 019328 9999 99 99 0 9999 99 9999 + 019329 9999 99 99 0 9999 99 9999 + 019330 9999 99 99 0 9999 99 9999 + 019331 9999 99 99 0 9999 99 9999 + 019332 9999 99 99 0 9999 99 9999 + 019333 9999 99 99 0 9999 99 9999 + 019334 9999 99 99 0 9999 99 9999 + 019335 9999 99 99 0 9999 99 9999 + 019336 9999 99 99 0 9999 99 9999 + 019337 9999 99 99 0 9999 99 9999 + 019338 9999 99 99 0 9999 99 9999 + 019339 9999 99 99 0 9999 99 9999 + 019340 9999 99 99 0 9999 99 9999 + 019341 9999 99 99 0 9999 99 9999 + 019342 9999 99 99 0 9999 99 9999 + 019343 9999 99 99 0 9999 99 9999 + 019344 9999 99 99 0 9999 99 9999 + 019345 9999 99 99 0 9999 99 9999 + 019346 9999 99 99 0 9999 99 9999 + 019347 9999 99 99 0 9999 99 9999 + 019348 9999 99 99 0 9999 99 9999 + 019349 9999 99 99 0 9999 99 9999 + 019350 9999 99 99 0 9999 99 9999 + 019351 9999 99 99 0 9999 99 9999 + 019352 9999 99 99 0 9999 99 9999 + 019353 9999 99 99 0 9999 99 9999 + 019354 9999 99 99 0 9999 99 9999 + 019355 9999 99 99 0 9999 99 9999 + 019356 9999 99 99 0 9999 99 9999 + 019357 9999 99 99 0 9999 99 9999 + 019358 9999 99 99 0 9999 99 9999 + 019359 9999 99 99 0 9999 99 9999 + 019360 9999 99 99 0 9999 99 9999 + 019361 9999 99 99 0 9999 99 9999 + 019362 9999 99 99 0 9999 99 9999 + 019363 9999 99 99 0 9999 99 9999 + 019364 9999 99 99 0 9999 99 9999 + 019365 9999 99 99 0 9999 99 9999 + 019366 9999 99 99 0 9999 99 9999 + 019367 9999 99 99 0 9999 99 9999 + 019368 9999 99 99 0 9999 99 9999 + 019369 9999 99 99 0 9999 99 9999 + 019370 9999 99 99 0 9999 99 9999 + 019371 9999 99 99 0 9999 99 9999 + 019372 9999 99 99 0 9999 99 9999 + 019373 9999 99 99 0 9999 99 9999 + 019374 9999 99 99 0 9999 99 9999 + 019375 9999 99 99 0 9999 99 9999 + 019376 9999 99 99 0 9999 99 9999 + 019377 9999 99 99 0 9999 99 9999 + 019378 9999 99 99 0 9999 99 9999 + 019379 9999 99 99 0 9999 99 9999 + 019380 9999 99 99 0 9999 99 9999 + 019381 9999 99 99 0 9999 99 9999 + 019382 9999 99 99 0 9999 99 9999 + 019383 9999 99 99 0 9999 99 9999 + 019384 9999 99 99 0 9999 99 9999 + 019385 9999 99 99 0 9999 99 9999 + 019386 9999 99 99 0 9999 99 9999 + 019387 9999 99 99 0 9999 99 9999 + 019388 9999 99 99 0 9999 99 9999 + 019389 9999 99 99 0 9999 99 9999 + 019390 9999 99 99 0 9999 99 9999 + 019391 9999 99 99 0 9999 99 9999 + 019392 9999 99 99 0 9999 99 9999 + 019393 1250 25 01 1 305168392 00 0377 + 019394 1250 25 02 1 305168392 01 0377 + 019395 1250 25 03 1 305168392 02 0377 + 019396 1250 25 04 1 305168392 03 0377 + 019397 1250 25 05 1 305168392 04 0377 + 019398 1250 25 06 1 305168392 05 0377 + 019399 1250 25 07 1 305168392 06 0377 + 019400 1250 25 08 1 305168392 07 0377 + 019401 1250 26 01 1 305168392 08 0377 + 019402 1250 26 02 1 305168392 09 0377 + 019403 1250 26 03 1 305168392 10 0377 + 019404 1250 26 04 1 305168392 11 0377 + 019405 1250 26 05 1 305168392 12 0377 + 019406 1250 26 06 1 305168392 13 0377 + 019407 1250 26 07 1 305168392 14 0377 + 019408 1250 26 08 1 305168392 15 0377 + 019409 1250 27 01 1 305168388 00 0376 + 019410 1250 27 02 1 305168388 01 0376 + 019411 1250 27 03 1 305168388 02 0376 + 019412 1250 27 04 1 305168388 03 0376 + 019413 1250 27 05 1 305168388 04 0376 + 019414 1250 27 06 1 305168388 05 0376 + 019415 1250 27 07 1 305168388 06 0376 + 019416 1250 27 08 1 305168388 07 0376 + 019417 1250 28 01 1 305168388 08 0376 + 019418 1250 28 02 1 305168388 09 0376 + 019419 1250 28 03 1 305168388 10 0376 + 019420 1250 28 04 1 305168388 11 0376 + 019421 1250 28 05 1 305168388 12 0376 + 019422 1250 28 06 1 305168388 13 0376 + 019423 1250 28 07 1 305168388 14 0376 + 019424 1250 28 08 1 305168388 15 0376 + 019425 1250 29 01 1 305168400 00 0379 + 019426 1250 29 02 1 305168400 01 0379 + 019427 1250 29 03 1 305168400 02 0379 + 019428 1250 29 04 1 305168400 03 0379 + 019429 1250 29 05 1 305168400 04 0379 + 019430 1250 29 06 1 305168400 05 0379 + 019431 1250 29 07 1 305168400 06 0379 + 019432 1250 29 08 1 305168400 07 0379 + 019433 1250 30 01 1 305168400 08 0379 + 019434 1250 30 02 1 305168400 09 0379 + 019435 1250 30 03 1 305168400 10 0379 + 019436 1250 30 04 1 305168400 11 0379 + 019437 1250 30 05 1 305168400 12 0379 + 019438 1250 30 06 1 305168400 13 0379 + 019439 1250 30 07 1 305168400 14 0379 + 019440 1250 30 08 1 305168400 15 0379 + 019441 1250 31 01 1 305168396 00 0378 + 019442 1250 31 02 1 305168396 01 0378 + 019443 1250 31 03 1 305168396 02 0378 + 019444 1250 31 04 1 305168396 03 0378 + 019445 1250 31 05 1 305168396 04 0378 + 019446 1250 31 06 1 305168396 05 0378 + 019447 1250 31 07 1 305168396 06 0378 + 019448 1250 31 08 1 305168396 07 0378 + 019449 1250 32 01 1 305168396 08 0378 + 019450 1250 32 02 1 305168396 09 0378 + 019451 1250 32 03 1 305168396 10 0378 + 019452 1250 32 04 1 305168396 11 0378 + 019453 1250 32 05 1 305168396 12 0378 + 019454 1250 32 06 1 305168396 13 0378 + 019455 1250 32 07 1 305168396 14 0378 + 019456 1250 32 08 1 305168396 15 0378 + 019457 1250 33 01 1 305164300 00 0370 + 019458 1250 33 02 1 305164300 01 0370 + 019459 1250 33 03 1 305164300 02 0370 + 019460 1250 33 04 1 305164300 03 0370 + 019461 1250 33 05 1 305164300 04 0370 + 019462 1250 33 06 1 305164300 05 0370 + 019463 1250 33 07 1 305164300 06 0370 + 019464 1250 33 08 1 305164300 07 0370 + 019465 1250 34 01 1 305164300 08 0370 + 019466 1250 34 02 1 305164300 09 0370 + 019467 1250 34 03 1 305164300 10 0370 + 019468 1250 34 04 1 305164300 11 0370 + 019469 1250 34 05 1 305164300 12 0370 + 019470 1250 34 06 1 305164300 13 0370 + 019471 1250 34 07 1 305164300 14 0370 + 019472 1250 34 08 1 305164300 15 0370 + 019473 1250 35 01 1 305164304 00 0371 + 019474 1250 35 02 1 305164304 01 0371 + 019475 1250 35 03 1 305164304 02 0371 + 019476 1250 35 04 1 305164304 03 0371 + 019477 1250 35 05 1 305164304 04 0371 + 019478 1250 35 06 1 305164304 05 0371 + 019479 1250 35 07 1 305164304 06 0371 + 019480 1250 35 08 1 305164304 07 0371 + 019481 1250 36 01 1 305164304 08 0371 + 019482 1250 36 02 1 305164304 09 0371 + 019483 1250 36 03 1 305164304 10 0371 + 019484 1250 36 04 1 305164304 11 0371 + 019485 1250 36 05 1 305164304 12 0371 + 019486 1250 36 06 1 305164304 13 0371 + 019487 1250 36 07 1 305164304 14 0371 + 019488 1250 36 08 1 305164304 15 0371 + 019489 1250 37 01 1 305164292 00 0368 + 019490 1250 37 02 1 305164292 01 0368 + 019491 1250 37 03 1 305164292 02 0368 + 019492 1250 37 04 1 305164292 03 0368 + 019493 1250 37 05 1 305164292 04 0368 + 019494 1250 37 06 1 305164292 05 0368 + 019495 1250 37 07 1 305164292 06 0368 + 019496 1250 37 08 1 305164292 07 0368 + 019497 1250 38 01 1 305164292 08 0368 + 019498 1250 38 02 1 305164292 09 0368 + 019499 1250 38 03 1 305164292 10 0368 + 019500 1250 38 04 1 305164292 11 0368 + 019501 1250 38 05 1 305164292 12 0368 + 019502 1250 38 06 1 305164292 13 0368 + 019503 1250 38 07 1 305164292 14 0368 + 019504 1250 38 08 1 305164292 15 0368 + 019505 1250 39 01 1 305164296 00 0369 + 019506 1250 39 02 1 305164296 01 0369 + 019507 1250 39 03 1 305164296 02 0369 + 019508 1250 39 04 1 305164296 03 0369 + 019509 1250 39 05 1 305164296 04 0369 + 019510 1250 39 06 1 305164296 05 0369 + 019511 1250 39 07 1 305164296 06 0369 + 019512 1250 39 08 1 305164296 07 0369 + 019513 1250 40 01 1 305164296 08 0369 + 019514 1250 40 02 1 305164296 09 0369 + 019515 1250 40 03 1 305164296 10 0369 + 019516 1250 40 04 1 305164296 11 0369 + 019517 1250 40 05 1 305164296 12 0369 + 019518 1250 40 06 1 305164296 13 0369 + 019519 1250 40 07 1 305164296 14 0369 + 019520 1250 40 08 1 305164296 15 0369 + 019521 9999 99 99 0 9999 99 9999 + 019522 9999 99 99 0 9999 99 9999 + 019523 9999 99 99 0 9999 99 9999 + 019524 9999 99 99 0 9999 99 9999 + 019525 9999 99 99 0 9999 99 9999 + 019526 9999 99 99 0 9999 99 9999 + 019527 9999 99 99 0 9999 99 9999 + 019528 9999 99 99 0 9999 99 9999 + 019529 9999 99 99 0 9999 99 9999 + 019530 9999 99 99 0 9999 99 9999 + 019531 9999 99 99 0 9999 99 9999 + 019532 9999 99 99 0 9999 99 9999 + 019533 9999 99 99 0 9999 99 9999 + 019534 9999 99 99 0 9999 99 9999 + 019535 9999 99 99 0 9999 99 9999 + 019536 9999 99 99 0 9999 99 9999 + 019537 9999 99 99 0 9999 99 9999 + 019538 9999 99 99 0 9999 99 9999 + 019539 9999 99 99 0 9999 99 9999 + 019540 9999 99 99 0 9999 99 9999 + 019541 9999 99 99 0 9999 99 9999 + 019542 9999 99 99 0 9999 99 9999 + 019543 9999 99 99 0 9999 99 9999 + 019544 9999 99 99 0 9999 99 9999 + 019545 9999 99 99 0 9999 99 9999 + 019546 9999 99 99 0 9999 99 9999 + 019547 9999 99 99 0 9999 99 9999 + 019548 9999 99 99 0 9999 99 9999 + 019549 9999 99 99 0 9999 99 9999 + 019550 9999 99 99 0 9999 99 9999 + 019551 9999 99 99 0 9999 99 9999 + 019552 9999 99 99 0 9999 99 9999 + 019553 9999 99 99 0 9999 99 9999 + 019554 9999 99 99 0 9999 99 9999 + 019555 9999 99 99 0 9999 99 9999 + 019556 9999 99 99 0 9999 99 9999 + 019557 9999 99 99 0 9999 99 9999 + 019558 9999 99 99 0 9999 99 9999 + 019559 9999 99 99 0 9999 99 9999 + 019560 9999 99 99 0 9999 99 9999 + 019561 9999 99 99 0 9999 99 9999 + 019562 9999 99 99 0 9999 99 9999 + 019563 9999 99 99 0 9999 99 9999 + 019564 9999 99 99 0 9999 99 9999 + 019565 9999 99 99 0 9999 99 9999 + 019566 9999 99 99 0 9999 99 9999 + 019567 9999 99 99 0 9999 99 9999 + 019568 9999 99 99 0 9999 99 9999 + 019569 9999 99 99 0 9999 99 9999 + 019570 9999 99 99 0 9999 99 9999 + 019571 9999 99 99 0 9999 99 9999 + 019572 9999 99 99 0 9999 99 9999 + 019573 9999 99 99 0 9999 99 9999 + 019574 9999 99 99 0 9999 99 9999 + 019575 9999 99 99 0 9999 99 9999 + 019576 9999 99 99 0 9999 99 9999 + 019577 9999 99 99 0 9999 99 9999 + 019578 9999 99 99 0 9999 99 9999 + 019579 9999 99 99 0 9999 99 9999 + 019580 9999 99 99 0 9999 99 9999 + 019581 9999 99 99 0 9999 99 9999 + 019582 9999 99 99 0 9999 99 9999 + 019583 9999 99 99 0 9999 99 9999 + 019584 9999 99 99 0 9999 99 9999 + 019585 1251 01 01 1 303050768 08 0019 + 019586 1251 01 02 1 303050768 09 0019 + 019587 9999 99 99 0 9999 99 9999 + 019588 9999 99 99 0 9999 99 9999 + 019589 9999 99 99 0 9999 99 9999 + 019590 9999 99 99 0 9999 99 9999 + 019591 9999 99 99 0 9999 99 9999 + 019592 9999 99 99 0 9999 99 9999 + 019593 1251 02 01 1 303050768 10 0019 + 019594 1251 02 02 1 303050768 11 0019 + 019595 9999 99 99 0 9999 99 9999 + 019596 9999 99 99 0 9999 99 9999 + 019597 9999 99 99 0 9999 99 9999 + 019598 9999 99 99 0 9999 99 9999 + 019599 9999 99 99 0 9999 99 9999 + 019600 9999 99 99 0 9999 99 9999 + 019601 1251 03 01 1 303050768 12 0019 + 019602 1251 03 02 1 303050768 13 0019 + 019603 9999 99 99 0 9999 99 9999 + 019604 9999 99 99 0 9999 99 9999 + 019605 9999 99 99 0 9999 99 9999 + 019606 9999 99 99 0 9999 99 9999 + 019607 9999 99 99 0 9999 99 9999 + 019608 9999 99 99 0 9999 99 9999 + 019609 1251 04 01 1 303050768 14 0019 + 019610 1251 04 02 1 303050768 15 0019 + 019611 9999 99 99 0 9999 99 9999 + 019612 9999 99 99 0 9999 99 9999 + 019613 9999 99 99 0 9999 99 9999 + 019614 9999 99 99 0 9999 99 9999 + 019615 9999 99 99 0 9999 99 9999 + 019616 9999 99 99 0 9999 99 9999 + 019617 1251 05 01 1 303050768 00 0019 + 019618 1251 05 02 1 303050768 01 0019 + 019619 9999 99 99 0 9999 99 9999 + 019620 9999 99 99 0 9999 99 9999 + 019621 9999 99 99 0 9999 99 9999 + 019622 9999 99 99 0 9999 99 9999 + 019623 9999 99 99 0 9999 99 9999 + 019624 9999 99 99 0 9999 99 9999 + 019625 1251 06 01 1 303050768 02 0019 + 019626 1251 06 02 1 303050768 03 0019 + 019627 9999 99 99 0 9999 99 9999 + 019628 9999 99 99 0 9999 99 9999 + 019629 9999 99 99 0 9999 99 9999 + 019630 9999 99 99 0 9999 99 9999 + 019631 9999 99 99 0 9999 99 9999 + 019632 9999 99 99 0 9999 99 9999 + 019633 1251 07 01 1 303050768 04 0019 + 019634 1251 07 02 1 303050768 05 0019 + 019635 9999 99 99 0 9999 99 9999 + 019636 9999 99 99 0 9999 99 9999 + 019637 9999 99 99 0 9999 99 9999 + 019638 9999 99 99 0 9999 99 9999 + 019639 9999 99 99 0 9999 99 9999 + 019640 9999 99 99 0 9999 99 9999 + 019641 1251 08 01 1 303050768 06 0019 + 019642 1251 08 02 1 303050768 07 0019 + 019643 9999 99 99 0 9999 99 9999 + 019644 9999 99 99 0 9999 99 9999 + 019645 9999 99 99 0 9999 99 9999 + 019646 9999 99 99 0 9999 99 9999 + 019647 9999 99 99 0 9999 99 9999 + 019648 9999 99 99 0 9999 99 9999 + 019649 1251 09 01 1 304107532 00 0130 + 019650 1251 09 02 1 304107532 01 0130 + 019651 1251 09 03 1 304107532 02 0130 + 019652 1251 09 04 1 304107532 03 0130 + 019653 9999 99 99 0 9999 99 9999 + 019654 9999 99 99 0 9999 99 9999 + 019655 9999 99 99 0 9999 99 9999 + 019656 9999 99 99 0 9999 99 9999 + 019657 1251 10 01 1 304107532 04 0130 + 019658 1251 10 02 1 304107532 05 0130 + 019659 1251 10 03 1 304107532 06 0130 + 019660 1251 10 04 1 304107532 07 0130 + 019661 9999 99 99 0 9999 99 9999 + 019662 9999 99 99 0 9999 99 9999 + 019663 9999 99 99 0 9999 99 9999 + 019664 9999 99 99 0 9999 99 9999 + 019665 1251 11 01 1 304107532 08 0130 + 019666 1251 11 02 1 304107532 09 0130 + 019667 1251 11 03 1 304107532 10 0130 + 019668 1251 11 04 1 304107532 11 0130 + 019669 9999 99 99 0 9999 99 9999 + 019670 9999 99 99 0 9999 99 9999 + 019671 9999 99 99 0 9999 99 9999 + 019672 9999 99 99 0 9999 99 9999 + 019673 1251 12 01 1 304107532 12 0130 + 019674 1251 12 02 1 304107532 13 0130 + 019675 1251 12 03 1 304107532 14 0130 + 019676 1251 12 04 1 304107532 15 0130 + 019677 9999 99 99 0 9999 99 9999 + 019678 9999 99 99 0 9999 99 9999 + 019679 9999 99 99 0 9999 99 9999 + 019680 9999 99 99 0 9999 99 9999 + 019681 1251 13 01 1 304107536 08 0131 + 019682 1251 13 02 1 304107536 09 0131 + 019683 1251 13 03 1 304107536 10 0131 + 019684 1251 13 04 1 304107536 11 0131 + 019685 9999 99 99 0 9999 99 9999 + 019686 9999 99 99 0 9999 99 9999 + 019687 9999 99 99 0 9999 99 9999 + 019688 9999 99 99 0 9999 99 9999 + 019689 1251 14 01 1 304107536 12 0131 + 019690 1251 14 02 1 304107536 13 0131 + 019691 1251 14 03 1 304107536 14 0131 + 019692 1251 14 04 1 304107536 15 0131 + 019693 9999 99 99 0 9999 99 9999 + 019694 9999 99 99 0 9999 99 9999 + 019695 9999 99 99 0 9999 99 9999 + 019696 9999 99 99 0 9999 99 9999 + 019697 1251 15 01 1 304107536 00 0131 + 019698 1251 15 02 1 304107536 01 0131 + 019699 1251 15 03 1 304107536 02 0131 + 019700 1251 15 04 1 304107536 03 0131 + 019701 9999 99 99 0 9999 99 9999 + 019702 9999 99 99 0 9999 99 9999 + 019703 9999 99 99 0 9999 99 9999 + 019704 9999 99 99 0 9999 99 9999 + 019705 1251 16 01 1 304107536 04 0131 + 019706 1251 16 02 1 304107536 05 0131 + 019707 1251 16 03 1 304107536 06 0131 + 019708 1251 16 04 1 304107536 07 0131 + 019709 9999 99 99 0 9999 99 9999 + 019710 9999 99 99 0 9999 99 9999 + 019711 9999 99 99 0 9999 99 9999 + 019712 9999 99 99 0 9999 99 9999 + 019713 1251 17 01 1 306233352 00 0761 + 019714 1251 17 02 1 306233352 01 0761 + 019715 1251 17 03 1 306233352 02 0761 + 019716 1251 17 04 1 306233352 03 0761 + 019717 1251 17 05 1 306233352 04 0761 + 019718 1251 17 06 1 306233352 05 0761 + 019719 1251 17 07 1 306233352 06 0761 + 019720 1251 17 08 1 306233352 07 0761 + 019721 1251 18 01 1 306233352 08 0761 + 019722 1251 18 02 1 306233352 09 0761 + 019723 1251 18 03 1 306233352 10 0761 + 019724 1251 18 04 1 306233352 11 0761 + 019725 1251 18 05 1 306233352 12 0761 + 019726 1251 18 06 1 306233352 13 0761 + 019727 1251 18 07 1 306233352 14 0761 + 019728 1251 18 08 1 306233352 15 0761 + 019729 1251 19 01 1 306233348 00 0760 + 019730 1251 19 02 1 306233348 01 0760 + 019731 1251 19 03 1 306233348 02 0760 + 019732 1251 19 04 1 306233348 03 0760 + 019733 1251 19 05 1 306233348 04 0760 + 019734 1251 19 06 1 306233348 05 0760 + 019735 1251 19 07 1 306233348 06 0760 + 019736 1251 19 08 1 306233348 07 0760 + 019737 1251 20 01 1 306233348 08 0760 + 019738 1251 20 02 1 306233348 09 0760 + 019739 1251 20 03 1 306233348 10 0760 + 019740 1251 20 04 1 306233348 11 0760 + 019741 1251 20 05 1 306233348 12 0760 + 019742 1251 20 06 1 306233348 13 0760 + 019743 1251 20 07 1 306233348 14 0760 + 019744 1251 20 08 1 306233348 15 0760 + 019745 1251 21 01 1 306233360 00 0763 + 019746 1251 21 02 1 306233360 01 0763 + 019747 1251 21 03 1 306233360 02 0763 + 019748 1251 21 04 1 306233360 03 0763 + 019749 1251 21 05 1 306233360 04 0763 + 019750 1251 21 06 1 306233360 05 0763 + 019751 1251 21 07 1 306233360 06 0763 + 019752 1251 21 08 1 306233360 07 0763 + 019753 1251 22 01 1 306233360 08 0763 + 019754 1251 22 02 1 306233360 09 0763 + 019755 1251 22 03 1 306233360 10 0763 + 019756 1251 22 04 1 306233360 11 0763 + 019757 1251 22 05 1 306233360 12 0763 + 019758 1251 22 06 1 306233360 13 0763 + 019759 1251 22 07 1 306233360 14 0763 + 019760 1251 22 08 1 306233360 15 0763 + 019761 1251 23 01 1 306233356 00 0762 + 019762 1251 23 02 1 306233356 01 0762 + 019763 1251 23 03 1 306233356 02 0762 + 019764 1251 23 04 1 306233356 03 0762 + 019765 1251 23 05 1 306233356 04 0762 + 019766 1251 23 06 1 306233356 05 0762 + 019767 1251 23 07 1 306233356 06 0762 + 019768 1251 23 08 1 306233356 07 0762 + 019769 1251 24 01 1 306233356 08 0762 + 019770 1251 24 02 1 306233356 09 0762 + 019771 1251 24 03 1 306233356 10 0762 + 019772 1251 24 04 1 306233356 11 0762 + 019773 1251 24 05 1 306233356 12 0762 + 019774 1251 24 06 1 306233356 13 0762 + 019775 1251 24 07 1 306233356 14 0762 + 019776 1251 24 08 1 306233356 15 0762 + 019777 1251 25 01 1 303046664 08 0009 + 019778 1251 25 02 1 303046664 09 0009 + 019779 9999 99 99 0 9999 99 9999 + 019780 9999 99 99 0 9999 99 9999 + 019781 9999 99 99 0 9999 99 9999 + 019782 9999 99 99 0 9999 99 9999 + 019783 9999 99 99 0 9999 99 9999 + 019784 9999 99 99 0 9999 99 9999 + 019785 1251 26 01 1 303046664 10 0009 + 019786 1251 26 02 1 303046664 11 0009 + 019787 9999 99 99 0 9999 99 9999 + 019788 9999 99 99 0 9999 99 9999 + 019789 9999 99 99 0 9999 99 9999 + 019790 9999 99 99 0 9999 99 9999 + 019791 9999 99 99 0 9999 99 9999 + 019792 9999 99 99 0 9999 99 9999 + 019793 1251 27 01 1 303046664 12 0009 + 019794 1251 27 02 1 303046664 13 0009 + 019795 9999 99 99 0 9999 99 9999 + 019796 9999 99 99 0 9999 99 9999 + 019797 9999 99 99 0 9999 99 9999 + 019798 9999 99 99 0 9999 99 9999 + 019799 9999 99 99 0 9999 99 9999 + 019800 9999 99 99 0 9999 99 9999 + 019801 1251 28 01 1 303046664 14 0009 + 019802 1251 28 02 1 303046664 15 0009 + 019803 9999 99 99 0 9999 99 9999 + 019804 9999 99 99 0 9999 99 9999 + 019805 9999 99 99 0 9999 99 9999 + 019806 9999 99 99 0 9999 99 9999 + 019807 9999 99 99 0 9999 99 9999 + 019808 9999 99 99 0 9999 99 9999 + 019809 1251 29 01 1 303046664 04 0009 + 019810 1251 29 02 1 303046664 05 0009 + 019811 9999 99 99 0 9999 99 9999 + 019812 9999 99 99 0 9999 99 9999 + 019813 9999 99 99 0 9999 99 9999 + 019814 9999 99 99 0 9999 99 9999 + 019815 9999 99 99 0 9999 99 9999 + 019816 9999 99 99 0 9999 99 9999 + 019817 1251 30 01 1 303046664 06 0009 + 019818 1251 30 02 1 303046664 07 0009 + 019819 9999 99 99 0 9999 99 9999 + 019820 9999 99 99 0 9999 99 9999 + 019821 9999 99 99 0 9999 99 9999 + 019822 9999 99 99 0 9999 99 9999 + 019823 9999 99 99 0 9999 99 9999 + 019824 9999 99 99 0 9999 99 9999 + 019825 1251 31 01 1 303046664 00 0009 + 019826 1251 31 02 1 303046664 01 0009 + 019827 9999 99 99 0 9999 99 9999 + 019828 9999 99 99 0 9999 99 9999 + 019829 9999 99 99 0 9999 99 9999 + 019830 9999 99 99 0 9999 99 9999 + 019831 9999 99 99 0 9999 99 9999 + 019832 9999 99 99 0 9999 99 9999 + 019833 1251 32 01 1 303046664 02 0009 + 019834 1251 32 02 1 303046664 03 0009 + 019835 9999 99 99 0 9999 99 9999 + 019836 9999 99 99 0 9999 99 9999 + 019837 9999 99 99 0 9999 99 9999 + 019838 9999 99 99 0 9999 99 9999 + 019839 9999 99 99 0 9999 99 9999 + 019840 9999 99 99 0 9999 99 9999 + 019841 1251 33 01 1 306229256 00 0753 + 019842 1251 33 02 1 306229256 01 0753 + 019843 1251 33 03 1 306229256 02 0753 + 019844 1251 33 04 1 306229256 03 0753 + 019845 1251 33 05 1 306229256 04 0753 + 019846 1251 33 06 1 306229256 05 0753 + 019847 1251 33 07 1 306229256 06 0753 + 019848 1251 33 08 1 306229256 07 0753 + 019849 1251 34 01 1 306229256 08 0753 + 019850 1251 34 02 1 306229256 09 0753 + 019851 1251 34 03 1 306229256 10 0753 + 019852 1251 34 04 1 306229256 11 0753 + 019853 1251 34 05 1 306229256 12 0753 + 019854 1251 34 06 1 306229256 13 0753 + 019855 1251 34 07 1 306229256 14 0753 + 019856 1251 34 08 1 306229256 15 0753 + 019857 1251 35 01 1 306229252 00 0752 + 019858 1251 35 02 1 306229252 01 0752 + 019859 1251 35 03 1 306229252 02 0752 + 019860 1251 35 04 1 306229252 03 0752 + 019861 1251 35 05 1 306229252 04 0752 + 019862 1251 35 06 1 306229252 05 0752 + 019863 1251 35 07 1 306229252 06 0752 + 019864 1251 35 08 1 306229252 07 0752 + 019865 1251 36 01 1 306229252 08 0752 + 019866 1251 36 02 1 306229252 09 0752 + 019867 1251 36 03 1 306229252 10 0752 + 019868 1251 36 04 1 306229252 11 0752 + 019869 1251 36 05 1 306229252 12 0752 + 019870 1251 36 06 1 306229252 13 0752 + 019871 1251 36 07 1 306229252 14 0752 + 019872 1251 36 08 1 306229252 15 0752 + 019873 1251 37 01 1 306229264 00 0755 + 019874 1251 37 02 1 306229264 01 0755 + 019875 1251 37 03 1 306229264 02 0755 + 019876 1251 37 04 1 306229264 03 0755 + 019877 1251 37 05 1 306229264 04 0755 + 019878 1251 37 06 1 306229264 05 0755 + 019879 1251 37 07 1 306229264 06 0755 + 019880 1251 37 08 1 306229264 07 0755 + 019881 1251 38 01 1 306229264 08 0755 + 019882 1251 38 02 1 306229264 09 0755 + 019883 1251 38 03 1 306229264 10 0755 + 019884 1251 38 04 1 306229264 11 0755 + 019885 1251 38 05 1 306229264 12 0755 + 019886 1251 38 06 1 306229264 13 0755 + 019887 1251 38 07 1 306229264 14 0755 + 019888 1251 38 08 1 306229264 15 0755 + 019889 1251 39 01 1 306229260 00 0754 + 019890 1251 39 02 1 306229260 01 0754 + 019891 1251 39 03 1 306229260 02 0754 + 019892 1251 39 04 1 306229260 03 0754 + 019893 1251 39 05 1 306229260 04 0754 + 019894 1251 39 06 1 306229260 05 0754 + 019895 1251 39 07 1 306229260 06 0754 + 019896 1251 39 08 1 306229260 07 0754 + 019897 1251 40 01 1 306229260 08 0754 + 019898 1251 40 02 1 306229260 09 0754 + 019899 1251 40 03 1 306229260 10 0754 + 019900 1251 40 04 1 306229260 11 0754 + 019901 1251 40 05 1 306229260 12 0754 + 019902 1251 40 06 1 306229260 13 0754 + 019903 1251 40 07 1 306229260 14 0754 + 019904 1251 40 08 1 306229260 15 0754 + 019905 1251 41 01 1 304107528 00 0129 + 019906 1251 41 02 1 304107528 01 0129 + 019907 1251 41 03 1 304107528 02 0129 + 019908 1251 41 04 1 304107528 03 0129 + 019909 9999 99 99 0 9999 99 9999 + 019910 9999 99 99 0 9999 99 9999 + 019911 9999 99 99 0 9999 99 9999 + 019912 9999 99 99 0 9999 99 9999 + 019913 1251 42 01 1 304107528 04 0129 + 019914 1251 42 02 1 304107528 05 0129 + 019915 1251 42 03 1 304107528 06 0129 + 019916 1251 42 04 1 304107528 07 0129 + 019917 9999 99 99 0 9999 99 9999 + 019918 9999 99 99 0 9999 99 9999 + 019919 9999 99 99 0 9999 99 9999 + 019920 9999 99 99 0 9999 99 9999 + 019921 1251 43 01 1 304107528 08 0129 + 019922 1251 43 02 1 304107528 09 0129 + 019923 1251 43 03 1 304107528 10 0129 + 019924 1251 43 04 1 304107528 11 0129 + 019925 9999 99 99 0 9999 99 9999 + 019926 9999 99 99 0 9999 99 9999 + 019927 9999 99 99 0 9999 99 9999 + 019928 9999 99 99 0 9999 99 9999 + 019929 1251 44 01 1 304107528 12 0129 + 019930 1251 44 02 1 304107528 13 0129 + 019931 1251 44 03 1 304107528 14 0129 + 019932 1251 44 04 1 304107528 15 0129 + 019933 9999 99 99 0 9999 99 9999 + 019934 9999 99 99 0 9999 99 9999 + 019935 9999 99 99 0 9999 99 9999 + 019936 9999 99 99 0 9999 99 9999 + 019937 1251 45 01 1 304107524 00 0128 + 019938 1251 45 02 1 304107524 01 0128 + 019939 1251 45 03 1 304107524 02 0128 + 019940 1251 45 04 1 304107524 03 0128 + 019941 9999 99 99 0 9999 99 9999 + 019942 9999 99 99 0 9999 99 9999 + 019943 9999 99 99 0 9999 99 9999 + 019944 9999 99 99 0 9999 99 9999 + 019945 1251 46 01 1 304107524 04 0128 + 019946 1251 46 02 1 304107524 05 0128 + 019947 1251 46 03 1 304107524 06 0128 + 019948 1251 46 04 1 304107524 07 0128 + 019949 9999 99 99 0 9999 99 9999 + 019950 9999 99 99 0 9999 99 9999 + 019951 9999 99 99 0 9999 99 9999 + 019952 9999 99 99 0 9999 99 9999 + 019953 1251 47 01 1 304107524 08 0128 + 019954 1251 47 02 1 304107524 09 0128 + 019955 1251 47 03 1 304107524 10 0128 + 019956 1251 47 04 1 304107524 11 0128 + 019957 9999 99 99 0 9999 99 9999 + 019958 9999 99 99 0 9999 99 9999 + 019959 9999 99 99 0 9999 99 9999 + 019960 9999 99 99 0 9999 99 9999 + 019961 1251 48 01 1 304107524 12 0128 + 019962 1251 48 02 1 304107524 13 0128 + 019963 1251 48 03 1 304107524 14 0128 + 019964 1251 48 04 1 304107524 15 0128 + 019965 9999 99 99 0 9999 99 9999 + 019966 9999 99 99 0 9999 99 9999 + 019967 9999 99 99 0 9999 99 9999 + 019968 9999 99 99 0 9999 99 9999 + 019969 1252 01 01 1 304103436 08 0122 + 019970 1252 01 02 1 304103436 09 0122 + 019971 1252 01 03 1 304103436 10 0122 + 019972 1252 01 04 1 304103436 11 0122 + 019973 9999 99 99 0 9999 99 9999 + 019974 9999 99 99 0 9999 99 9999 + 019975 9999 99 99 0 9999 99 9999 + 019976 9999 99 99 0 9999 99 9999 + 019977 1252 02 01 1 304103436 12 0122 + 019978 1252 02 02 1 304103436 13 0122 + 019979 1252 02 03 1 304103436 14 0122 + 019980 1252 02 04 1 304103436 15 0122 + 019981 9999 99 99 0 9999 99 9999 + 019982 9999 99 99 0 9999 99 9999 + 019983 9999 99 99 0 9999 99 9999 + 019984 9999 99 99 0 9999 99 9999 + 019985 1252 03 01 1 304103436 00 0122 + 019986 1252 03 02 1 304103436 01 0122 + 019987 1252 03 03 1 304103436 02 0122 + 019988 1252 03 04 1 304103436 03 0122 + 019989 9999 99 99 0 9999 99 9999 + 019990 9999 99 99 0 9999 99 9999 + 019991 9999 99 99 0 9999 99 9999 + 019992 9999 99 99 0 9999 99 9999 + 019993 1252 04 01 1 304103436 04 0122 + 019994 1252 04 02 1 304103436 05 0122 + 019995 1252 04 03 1 304103436 06 0122 + 019996 1252 04 04 1 304103436 07 0122 + 019997 9999 99 99 0 9999 99 9999 + 019998 9999 99 99 0 9999 99 9999 + 019999 9999 99 99 0 9999 99 9999 + 020000 9999 99 99 0 9999 99 9999 + 020001 1252 05 01 1 304103440 08 0123 + 020002 1252 05 02 1 304103440 09 0123 + 020003 1252 05 03 1 304103440 10 0123 + 020004 1252 05 04 1 304103440 11 0123 + 020005 9999 99 99 0 9999 99 9999 + 020006 9999 99 99 0 9999 99 9999 + 020007 9999 99 99 0 9999 99 9999 + 020008 9999 99 99 0 9999 99 9999 + 020009 1252 06 01 1 304103440 12 0123 + 020010 1252 06 02 1 304103440 13 0123 + 020011 1252 06 03 1 304103440 14 0123 + 020012 1252 06 04 1 304103440 15 0123 + 020013 9999 99 99 0 9999 99 9999 + 020014 9999 99 99 0 9999 99 9999 + 020015 9999 99 99 0 9999 99 9999 + 020016 9999 99 99 0 9999 99 9999 + 020017 1252 07 01 1 304103440 00 0123 + 020018 1252 07 02 1 304103440 01 0123 + 020019 1252 07 03 1 304103440 02 0123 + 020020 1252 07 04 1 304103440 03 0123 + 020021 9999 99 99 0 9999 99 9999 + 020022 9999 99 99 0 9999 99 9999 + 020023 9999 99 99 0 9999 99 9999 + 020024 9999 99 99 0 9999 99 9999 + 020025 1252 08 01 1 304103440 04 0123 + 020026 1252 08 02 1 304103440 05 0123 + 020027 1252 08 03 1 304103440 06 0123 + 020028 1252 08 04 1 304103440 07 0123 + 020029 9999 99 99 0 9999 99 9999 + 020030 9999 99 99 0 9999 99 9999 + 020031 9999 99 99 0 9999 99 9999 + 020032 9999 99 99 0 9999 99 9999 + 020033 1252 09 01 1 306225164 00 0746 + 020034 1252 09 02 1 306225164 01 0746 + 020035 1252 09 03 1 306225164 02 0746 + 020036 1252 09 04 1 306225164 03 0746 + 020037 1252 09 05 1 306225164 04 0746 + 020038 1252 09 06 1 306225164 05 0746 + 020039 1252 09 07 1 306225164 06 0746 + 020040 1252 09 08 1 306225164 07 0746 + 020041 1252 10 01 1 306225164 08 0746 + 020042 1252 10 02 1 306225164 09 0746 + 020043 1252 10 03 1 306225164 10 0746 + 020044 1252 10 04 1 306225164 11 0746 + 020045 1252 10 05 1 306225164 12 0746 + 020046 1252 10 06 1 306225164 13 0746 + 020047 1252 10 07 1 306225164 14 0746 + 020048 1252 10 08 1 306225164 15 0746 + 020049 1252 11 01 1 306225168 00 0747 + 020050 1252 11 02 1 306225168 01 0747 + 020051 1252 11 03 1 306225168 02 0747 + 020052 1252 11 04 1 306225168 03 0747 + 020053 1252 11 05 1 306225168 04 0747 + 020054 1252 11 06 1 306225168 05 0747 + 020055 1252 11 07 1 306225168 06 0747 + 020056 1252 11 08 1 306225168 07 0747 + 020057 1252 12 01 1 306225168 08 0747 + 020058 1252 12 02 1 306225168 09 0747 + 020059 1252 12 03 1 306225168 10 0747 + 020060 1252 12 04 1 306225168 11 0747 + 020061 1252 12 05 1 306225168 12 0747 + 020062 1252 12 06 1 306225168 13 0747 + 020063 1252 12 07 1 306225168 14 0747 + 020064 1252 12 08 1 306225168 15 0747 + 020065 1252 13 01 1 306225156 00 0744 + 020066 1252 13 02 1 306225156 01 0744 + 020067 1252 13 03 1 306225156 02 0744 + 020068 1252 13 04 1 306225156 03 0744 + 020069 1252 13 05 1 306225156 04 0744 + 020070 1252 13 06 1 306225156 05 0744 + 020071 1252 13 07 1 306225156 06 0744 + 020072 1252 13 08 1 306225156 07 0744 + 020073 1252 14 01 1 306225156 08 0744 + 020074 1252 14 02 1 306225156 09 0744 + 020075 1252 14 03 1 306225156 10 0744 + 020076 1252 14 04 1 306225156 11 0744 + 020077 1252 14 05 1 306225156 12 0744 + 020078 1252 14 06 1 306225156 13 0744 + 020079 1252 14 07 1 306225156 14 0744 + 020080 1252 14 08 1 306225156 15 0744 + 020081 1252 15 01 1 306225160 00 0745 + 020082 1252 15 02 1 306225160 01 0745 + 020083 1252 15 03 1 306225160 02 0745 + 020084 1252 15 04 1 306225160 03 0745 + 020085 1252 15 05 1 306225160 04 0745 + 020086 1252 15 06 1 306225160 05 0745 + 020087 1252 15 07 1 306225160 06 0745 + 020088 1252 15 08 1 306225160 07 0745 + 020089 1252 16 01 1 306225160 08 0745 + 020090 1252 16 02 1 306225160 09 0745 + 020091 1252 16 03 1 306225160 10 0745 + 020092 1252 16 04 1 306225160 11 0745 + 020093 1252 16 05 1 306225160 12 0745 + 020094 1252 16 06 1 306225160 13 0745 + 020095 1252 16 07 1 306225160 14 0745 + 020096 1252 16 08 1 306225160 15 0745 + 020097 1252 17 01 1 303046660 12 0008 + 020098 1252 17 02 1 303046660 13 0008 + 020099 9999 99 99 0 9999 99 9999 + 020100 9999 99 99 0 9999 99 9999 + 020101 9999 99 99 0 9999 99 9999 + 020102 9999 99 99 0 9999 99 9999 + 020103 9999 99 99 0 9999 99 9999 + 020104 9999 99 99 0 9999 99 9999 + 020105 1252 18 01 1 303046660 14 0008 + 020106 1252 18 02 1 303046660 15 0008 + 020107 9999 99 99 0 9999 99 9999 + 020108 9999 99 99 0 9999 99 9999 + 020109 9999 99 99 0 9999 99 9999 + 020110 9999 99 99 0 9999 99 9999 + 020111 9999 99 99 0 9999 99 9999 + 020112 9999 99 99 0 9999 99 9999 + 020113 1252 19 01 1 303046660 08 0008 + 020114 1252 19 02 1 303046660 09 0008 + 020115 9999 99 99 0 9999 99 9999 + 020116 9999 99 99 0 9999 99 9999 + 020117 9999 99 99 0 9999 99 9999 + 020118 9999 99 99 0 9999 99 9999 + 020119 9999 99 99 0 9999 99 9999 + 020120 9999 99 99 0 9999 99 9999 + 020121 1252 20 01 1 303046660 10 0008 + 020122 1252 20 02 1 303046660 11 0008 + 020123 9999 99 99 0 9999 99 9999 + 020124 9999 99 99 0 9999 99 9999 + 020125 9999 99 99 0 9999 99 9999 + 020126 9999 99 99 0 9999 99 9999 + 020127 9999 99 99 0 9999 99 9999 + 020128 9999 99 99 0 9999 99 9999 + 020129 1252 21 01 1 303046660 00 0008 + 020130 1252 21 02 1 303046660 01 0008 + 020131 9999 99 99 0 9999 99 9999 + 020132 9999 99 99 0 9999 99 9999 + 020133 9999 99 99 0 9999 99 9999 + 020134 9999 99 99 0 9999 99 9999 + 020135 9999 99 99 0 9999 99 9999 + 020136 9999 99 99 0 9999 99 9999 + 020137 1252 22 01 1 303046660 02 0008 + 020138 1252 22 02 1 303046660 03 0008 + 020139 9999 99 99 0 9999 99 9999 + 020140 9999 99 99 0 9999 99 9999 + 020141 9999 99 99 0 9999 99 9999 + 020142 9999 99 99 0 9999 99 9999 + 020143 9999 99 99 0 9999 99 9999 + 020144 9999 99 99 0 9999 99 9999 + 020145 1252 23 01 1 303046660 04 0008 + 020146 1252 23 02 1 303046660 05 0008 + 020147 9999 99 99 0 9999 99 9999 + 020148 9999 99 99 0 9999 99 9999 + 020149 9999 99 99 0 9999 99 9999 + 020150 9999 99 99 0 9999 99 9999 + 020151 9999 99 99 0 9999 99 9999 + 020152 9999 99 99 0 9999 99 9999 + 020153 1252 24 01 1 303046660 06 0008 + 020154 1252 24 02 1 303046660 07 0008 + 020155 9999 99 99 0 9999 99 9999 + 020156 9999 99 99 0 9999 99 9999 + 020157 9999 99 99 0 9999 99 9999 + 020158 9999 99 99 0 9999 99 9999 + 020159 9999 99 99 0 9999 99 9999 + 020160 9999 99 99 0 9999 99 9999 + 020161 1252 25 01 1 305172488 00 0385 + 020162 1252 25 02 1 305172488 01 0385 + 020163 1252 25 03 1 305172488 02 0385 + 020164 1252 25 04 1 305172488 03 0385 + 020165 1252 25 05 1 305172488 04 0385 + 020166 1252 25 06 1 305172488 05 0385 + 020167 1252 25 07 1 305172488 06 0385 + 020168 1252 25 08 1 305172488 07 0385 + 020169 1252 26 01 1 305172488 08 0385 + 020170 1252 26 02 1 305172488 09 0385 + 020171 1252 26 03 1 305172488 10 0385 + 020172 1252 26 04 1 305172488 11 0385 + 020173 1252 26 05 1 305172488 12 0385 + 020174 1252 26 06 1 305172488 13 0385 + 020175 1252 26 07 1 305172488 14 0385 + 020176 1252 26 08 1 305172488 15 0385 + 020177 1252 27 01 1 305172484 00 0384 + 020178 1252 27 02 1 305172484 01 0384 + 020179 1252 27 03 1 305172484 02 0384 + 020180 1252 27 04 1 305172484 03 0384 + 020181 1252 27 05 1 305172484 04 0384 + 020182 1252 27 06 1 305172484 05 0384 + 020183 1252 27 07 1 305172484 06 0384 + 020184 1252 27 08 1 305172484 07 0384 + 020185 1252 28 01 1 305172484 08 0384 + 020186 1252 28 02 1 305172484 09 0384 + 020187 1252 28 03 1 305172484 10 0384 + 020188 1252 28 04 1 305172484 11 0384 + 020189 1252 28 05 1 305172484 12 0384 + 020190 1252 28 06 1 305172484 13 0384 + 020191 1252 28 07 1 305172484 14 0384 + 020192 1252 28 08 1 305172484 15 0384 + 020193 1252 29 01 1 305172496 00 0387 + 020194 1252 29 02 1 305172496 01 0387 + 020195 1252 29 03 1 305172496 02 0387 + 020196 1252 29 04 1 305172496 03 0387 + 020197 1252 29 05 1 305172496 04 0387 + 020198 1252 29 06 1 305172496 05 0387 + 020199 1252 29 07 1 305172496 06 0387 + 020200 1252 29 08 1 305172496 07 0387 + 020201 1252 30 01 1 305172496 08 0387 + 020202 1252 30 02 1 305172496 09 0387 + 020203 1252 30 03 1 305172496 10 0387 + 020204 1252 30 04 1 305172496 11 0387 + 020205 1252 30 05 1 305172496 12 0387 + 020206 1252 30 06 1 305172496 13 0387 + 020207 1252 30 07 1 305172496 14 0387 + 020208 1252 30 08 1 305172496 15 0387 + 020209 1252 31 01 1 305172492 00 0386 + 020210 1252 31 02 1 305172492 01 0386 + 020211 1252 31 03 1 305172492 02 0386 + 020212 1252 31 04 1 305172492 03 0386 + 020213 1252 31 05 1 305172492 04 0386 + 020214 1252 31 06 1 305172492 05 0386 + 020215 1252 31 07 1 305172492 06 0386 + 020216 1252 31 08 1 305172492 07 0386 + 020217 1252 32 01 1 305172492 08 0386 + 020218 1252 32 02 1 305172492 09 0386 + 020219 1252 32 03 1 305172492 10 0386 + 020220 1252 32 04 1 305172492 11 0386 + 020221 1252 32 05 1 305172492 12 0386 + 020222 1252 32 06 1 305172492 13 0386 + 020223 1252 32 07 1 305172492 14 0386 + 020224 1252 32 08 1 305172492 15 0386 + 020225 1252 33 01 1 306221068 00 0738 + 020226 1252 33 02 1 306221068 01 0738 + 020227 1252 33 03 1 306221068 02 0738 + 020228 1252 33 04 1 306221068 03 0738 + 020229 1252 33 05 1 306221068 04 0738 + 020230 1252 33 06 1 306221068 05 0738 + 020231 1252 33 07 1 306221068 06 0738 + 020232 1252 33 08 1 306221068 07 0738 + 020233 1252 34 01 1 306221068 08 0738 + 020234 1252 34 02 1 306221068 09 0738 + 020235 1252 34 03 1 306221068 10 0738 + 020236 1252 34 04 1 306221068 11 0738 + 020237 1252 34 05 1 306221068 12 0738 + 020238 1252 34 06 1 306221068 13 0738 + 020239 1252 34 07 1 306221068 14 0738 + 020240 1252 34 08 1 306221068 15 0738 + 020241 1252 35 01 1 306221072 00 0739 + 020242 1252 35 02 1 306221072 01 0739 + 020243 1252 35 03 1 306221072 02 0739 + 020244 1252 35 04 1 306221072 03 0739 + 020245 1252 35 05 1 306221072 04 0739 + 020246 1252 35 06 1 306221072 05 0739 + 020247 1252 35 07 1 306221072 06 0739 + 020248 1252 35 08 1 306221072 07 0739 + 020249 1252 36 01 1 306221072 08 0739 + 020250 1252 36 02 1 306221072 09 0739 + 020251 1252 36 03 1 306221072 10 0739 + 020252 1252 36 04 1 306221072 11 0739 + 020253 1252 36 05 1 306221072 12 0739 + 020254 1252 36 06 1 306221072 13 0739 + 020255 1252 36 07 1 306221072 14 0739 + 020256 1252 36 08 1 306221072 15 0739 + 020257 1252 37 01 1 306221060 00 0736 + 020258 1252 37 02 1 306221060 01 0736 + 020259 1252 37 03 1 306221060 02 0736 + 020260 1252 37 04 1 306221060 03 0736 + 020261 1252 37 05 1 306221060 04 0736 + 020262 1252 37 06 1 306221060 05 0736 + 020263 1252 37 07 1 306221060 06 0736 + 020264 1252 37 08 1 306221060 07 0736 + 020265 1252 38 01 1 306221060 08 0736 + 020266 1252 38 02 1 306221060 09 0736 + 020267 1252 38 03 1 306221060 10 0736 + 020268 1252 38 04 1 306221060 11 0736 + 020269 1252 38 05 1 306221060 12 0736 + 020270 1252 38 06 1 306221060 13 0736 + 020271 1252 38 07 1 306221060 14 0736 + 020272 1252 38 08 1 306221060 15 0736 + 020273 1252 39 01 1 306221064 00 0737 + 020274 1252 39 02 1 306221064 01 0737 + 020275 1252 39 03 1 306221064 02 0737 + 020276 1252 39 04 1 306221064 03 0737 + 020277 1252 39 05 1 306221064 04 0737 + 020278 1252 39 06 1 306221064 05 0737 + 020279 1252 39 07 1 306221064 06 0737 + 020280 1252 39 08 1 306221064 07 0737 + 020281 1252 40 01 1 306221064 08 0737 + 020282 1252 40 02 1 306221064 09 0737 + 020283 1252 40 03 1 306221064 10 0737 + 020284 1252 40 04 1 306221064 11 0737 + 020285 1252 40 05 1 306221064 12 0737 + 020286 1252 40 06 1 306221064 13 0737 + 020287 1252 40 07 1 306221064 14 0737 + 020288 1252 40 08 1 306221064 15 0737 + 020289 1252 41 01 1 304103428 08 0120 + 020290 1252 41 02 1 304103428 09 0120 + 020291 1252 41 03 1 304103428 10 0120 + 020292 1252 41 04 1 304103428 11 0120 + 020293 9999 99 99 0 9999 99 9999 + 020294 9999 99 99 0 9999 99 9999 + 020295 9999 99 99 0 9999 99 9999 + 020296 9999 99 99 0 9999 99 9999 + 020297 1252 42 01 1 304103428 12 0120 + 020298 1252 42 02 1 304103428 13 0120 + 020299 1252 42 03 1 304103428 14 0120 + 020300 1252 42 04 1 304103428 15 0120 + 020301 9999 99 99 0 9999 99 9999 + 020302 9999 99 99 0 9999 99 9999 + 020303 9999 99 99 0 9999 99 9999 + 020304 9999 99 99 0 9999 99 9999 + 020305 1252 43 01 1 304103428 00 0120 + 020306 1252 43 02 1 304103428 01 0120 + 020307 1252 43 03 1 304103428 02 0120 + 020308 1252 43 04 1 304103428 03 0120 + 020309 9999 99 99 0 9999 99 9999 + 020310 9999 99 99 0 9999 99 9999 + 020311 9999 99 99 0 9999 99 9999 + 020312 9999 99 99 0 9999 99 9999 + 020313 1252 44 01 1 304103428 04 0120 + 020314 1252 44 02 1 304103428 05 0120 + 020315 1252 44 03 1 304103428 06 0120 + 020316 1252 44 04 1 304103428 07 0120 + 020317 9999 99 99 0 9999 99 9999 + 020318 9999 99 99 0 9999 99 9999 + 020319 9999 99 99 0 9999 99 9999 + 020320 9999 99 99 0 9999 99 9999 + 020321 1252 45 01 1 304103432 08 0121 + 020322 1252 45 02 1 304103432 09 0121 + 020323 1252 45 03 1 304103432 10 0121 + 020324 1252 45 04 1 304103432 11 0121 + 020325 9999 99 99 0 9999 99 9999 + 020326 9999 99 99 0 9999 99 9999 + 020327 9999 99 99 0 9999 99 9999 + 020328 9999 99 99 0 9999 99 9999 + 020329 1252 46 01 1 304103432 12 0121 + 020330 1252 46 02 1 304103432 13 0121 + 020331 1252 46 03 1 304103432 14 0121 + 020332 1252 46 04 1 304103432 15 0121 + 020333 9999 99 99 0 9999 99 9999 + 020334 9999 99 99 0 9999 99 9999 + 020335 9999 99 99 0 9999 99 9999 + 020336 9999 99 99 0 9999 99 9999 + 020337 1252 47 01 1 304103432 00 0121 + 020338 1252 47 02 1 304103432 01 0121 + 020339 1252 47 03 1 304103432 02 0121 + 020340 1252 47 04 1 304103432 03 0121 + 020341 9999 99 99 0 9999 99 9999 + 020342 9999 99 99 0 9999 99 9999 + 020343 9999 99 99 0 9999 99 9999 + 020344 9999 99 99 0 9999 99 9999 + 020345 1252 48 01 1 304103432 04 0121 + 020346 1252 48 02 1 304103432 05 0121 + 020347 1252 48 03 1 304103432 06 0121 + 020348 1252 48 04 1 304103432 07 0121 + 020349 9999 99 99 0 9999 99 9999 + 020350 9999 99 99 0 9999 99 9999 + 020351 9999 99 99 0 9999 99 9999 + 020352 9999 99 99 0 9999 99 9999 + 020353 1253 01 01 1 303046672 08 0011 + 020354 1253 01 02 1 303046672 09 0011 + 020355 9999 99 99 0 9999 99 9999 + 020356 9999 99 99 0 9999 99 9999 + 020357 9999 99 99 0 9999 99 9999 + 020358 9999 99 99 0 9999 99 9999 + 020359 9999 99 99 0 9999 99 9999 + 020360 9999 99 99 0 9999 99 9999 + 020361 1253 02 01 1 303046672 10 0011 + 020362 1253 02 02 1 303046672 11 0011 + 020363 9999 99 99 0 9999 99 9999 + 020364 9999 99 99 0 9999 99 9999 + 020365 9999 99 99 0 9999 99 9999 + 020366 9999 99 99 0 9999 99 9999 + 020367 9999 99 99 0 9999 99 9999 + 020368 9999 99 99 0 9999 99 9999 + 020369 1253 03 01 1 303046672 12 0011 + 020370 1253 03 02 1 303046672 13 0011 + 020371 9999 99 99 0 9999 99 9999 + 020372 9999 99 99 0 9999 99 9999 + 020373 9999 99 99 0 9999 99 9999 + 020374 9999 99 99 0 9999 99 9999 + 020375 9999 99 99 0 9999 99 9999 + 020376 9999 99 99 0 9999 99 9999 + 020377 1253 04 01 1 303046672 14 0011 + 020378 1253 04 02 1 303046672 15 0011 + 020379 9999 99 99 0 9999 99 9999 + 020380 9999 99 99 0 9999 99 9999 + 020381 9999 99 99 0 9999 99 9999 + 020382 9999 99 99 0 9999 99 9999 + 020383 9999 99 99 0 9999 99 9999 + 020384 9999 99 99 0 9999 99 9999 + 020385 1253 05 01 1 303046672 00 0011 + 020386 1253 05 02 1 303046672 01 0011 + 020387 9999 99 99 0 9999 99 9999 + 020388 9999 99 99 0 9999 99 9999 + 020389 9999 99 99 0 9999 99 9999 + 020390 9999 99 99 0 9999 99 9999 + 020391 9999 99 99 0 9999 99 9999 + 020392 9999 99 99 0 9999 99 9999 + 020393 1253 06 01 1 303046672 02 0011 + 020394 1253 06 02 1 303046672 03 0011 + 020395 9999 99 99 0 9999 99 9999 + 020396 9999 99 99 0 9999 99 9999 + 020397 9999 99 99 0 9999 99 9999 + 020398 9999 99 99 0 9999 99 9999 + 020399 9999 99 99 0 9999 99 9999 + 020400 9999 99 99 0 9999 99 9999 + 020401 1253 07 01 1 303046672 04 0011 + 020402 1253 07 02 1 303046672 05 0011 + 020403 9999 99 99 0 9999 99 9999 + 020404 9999 99 99 0 9999 99 9999 + 020405 9999 99 99 0 9999 99 9999 + 020406 9999 99 99 0 9999 99 9999 + 020407 9999 99 99 0 9999 99 9999 + 020408 9999 99 99 0 9999 99 9999 + 020409 1253 08 01 1 303046672 06 0011 + 020410 1253 08 02 1 303046672 07 0011 + 020411 9999 99 99 0 9999 99 9999 + 020412 9999 99 99 0 9999 99 9999 + 020413 9999 99 99 0 9999 99 9999 + 020414 9999 99 99 0 9999 99 9999 + 020415 9999 99 99 0 9999 99 9999 + 020416 9999 99 99 0 9999 99 9999 + 020417 1253 09 01 1 304099340 00 0114 + 020418 1253 09 02 1 304099340 01 0114 + 020419 1253 09 03 1 304099340 02 0114 + 020420 1253 09 04 1 304099340 03 0114 + 020421 9999 99 99 0 9999 99 9999 + 020422 9999 99 99 0 9999 99 9999 + 020423 9999 99 99 0 9999 99 9999 + 020424 9999 99 99 0 9999 99 9999 + 020425 1253 10 01 1 304099340 04 0114 + 020426 1253 10 02 1 304099340 05 0114 + 020427 1253 10 03 1 304099340 06 0114 + 020428 1253 10 04 1 304099340 07 0114 + 020429 9999 99 99 0 9999 99 9999 + 020430 9999 99 99 0 9999 99 9999 + 020431 9999 99 99 0 9999 99 9999 + 020432 9999 99 99 0 9999 99 9999 + 020433 1253 11 01 1 304099340 08 0114 + 020434 1253 11 02 1 304099340 09 0114 + 020435 1253 11 03 1 304099340 10 0114 + 020436 1253 11 04 1 304099340 11 0114 + 020437 9999 99 99 0 9999 99 9999 + 020438 9999 99 99 0 9999 99 9999 + 020439 9999 99 99 0 9999 99 9999 + 020440 9999 99 99 0 9999 99 9999 + 020441 1253 12 01 1 304099340 12 0114 + 020442 1253 12 02 1 304099340 13 0114 + 020443 1253 12 03 1 304099340 14 0114 + 020444 1253 12 04 1 304099340 15 0114 + 020445 9999 99 99 0 9999 99 9999 + 020446 9999 99 99 0 9999 99 9999 + 020447 9999 99 99 0 9999 99 9999 + 020448 9999 99 99 0 9999 99 9999 + 020449 1253 13 01 1 304099344 08 0115 + 020450 1253 13 02 1 304099344 09 0115 + 020451 1253 13 03 1 304099344 10 0115 + 020452 1253 13 04 1 304099344 11 0115 + 020453 9999 99 99 0 9999 99 9999 + 020454 9999 99 99 0 9999 99 9999 + 020455 9999 99 99 0 9999 99 9999 + 020456 9999 99 99 0 9999 99 9999 + 020457 1253 14 01 1 304099344 12 0115 + 020458 1253 14 02 1 304099344 13 0115 + 020459 1253 14 03 1 304099344 14 0115 + 020460 1253 14 04 1 304099344 15 0115 + 020461 9999 99 99 0 9999 99 9999 + 020462 9999 99 99 0 9999 99 9999 + 020463 9999 99 99 0 9999 99 9999 + 020464 9999 99 99 0 9999 99 9999 + 020465 1253 15 01 1 304099344 00 0115 + 020466 1253 15 02 1 304099344 01 0115 + 020467 1253 15 03 1 304099344 02 0115 + 020468 1253 15 04 1 304099344 03 0115 + 020469 9999 99 99 0 9999 99 9999 + 020470 9999 99 99 0 9999 99 9999 + 020471 9999 99 99 0 9999 99 9999 + 020472 9999 99 99 0 9999 99 9999 + 020473 1253 16 01 1 304099344 04 0115 + 020474 1253 16 02 1 304099344 05 0115 + 020475 1253 16 03 1 304099344 06 0115 + 020476 1253 16 04 1 304099344 07 0115 + 020477 9999 99 99 0 9999 99 9999 + 020478 9999 99 99 0 9999 99 9999 + 020479 9999 99 99 0 9999 99 9999 + 020480 9999 99 99 0 9999 99 9999 + 020481 1253 17 01 1 306216968 00 0729 + 020482 1253 17 02 1 306216968 01 0729 + 020483 1253 17 03 1 306216968 02 0729 + 020484 1253 17 04 1 306216968 03 0729 + 020485 1253 17 05 1 306216968 04 0729 + 020486 1253 17 06 1 306216968 05 0729 + 020487 1253 17 07 1 306216968 06 0729 + 020488 1253 17 08 1 306216968 07 0729 + 020489 1253 18 01 1 306216968 08 0729 + 020490 1253 18 02 1 306216968 09 0729 + 020491 1253 18 03 1 306216968 10 0729 + 020492 1253 18 04 1 306216968 11 0729 + 020493 1253 18 05 1 306216968 12 0729 + 020494 1253 18 06 1 306216968 13 0729 + 020495 1253 18 07 1 306216968 14 0729 + 020496 1253 18 08 1 306216968 15 0729 + 020497 1253 19 01 1 306216964 00 0728 + 020498 1253 19 02 1 306216964 01 0728 + 020499 1253 19 03 1 306216964 02 0728 + 020500 1253 19 04 1 306216964 03 0728 + 020501 1253 19 05 1 306216964 04 0728 + 020502 1253 19 06 1 306216964 05 0728 + 020503 1253 19 07 1 306216964 06 0728 + 020504 1253 19 08 1 306216964 07 0728 + 020505 1253 20 01 1 306216964 08 0728 + 020506 1253 20 02 1 306216964 09 0728 + 020507 1253 20 03 1 306216964 10 0728 + 020508 1253 20 04 1 306216964 11 0728 + 020509 1253 20 05 1 306216964 12 0728 + 020510 1253 20 06 1 306216964 13 0728 + 020511 1253 20 07 1 306216964 14 0728 + 020512 1253 20 08 1 306216964 15 0728 + 020513 1253 21 01 1 306216976 00 0731 + 020514 1253 21 02 1 306216976 01 0731 + 020515 1253 21 03 1 306216976 02 0731 + 020516 1253 21 04 1 306216976 03 0731 + 020517 1253 21 05 1 306216976 04 0731 + 020518 1253 21 06 1 306216976 05 0731 + 020519 1253 21 07 1 306216976 06 0731 + 020520 1253 21 08 1 306216976 07 0731 + 020521 1253 22 01 1 306216976 08 0731 + 020522 1253 22 02 1 306216976 09 0731 + 020523 1253 22 03 1 306216976 10 0731 + 020524 1253 22 04 1 306216976 11 0731 + 020525 1253 22 05 1 306216976 12 0731 + 020526 1253 22 06 1 306216976 13 0731 + 020527 1253 22 07 1 306216976 14 0731 + 020528 1253 22 08 1 306216976 15 0731 + 020529 1253 23 01 1 306216972 00 0730 + 020530 1253 23 02 1 306216972 01 0730 + 020531 1253 23 03 1 306216972 02 0730 + 020532 1253 23 04 1 306216972 03 0730 + 020533 1253 23 05 1 306216972 04 0730 + 020534 1253 23 06 1 306216972 05 0730 + 020535 1253 23 07 1 306216972 06 0730 + 020536 1253 23 08 1 306216972 07 0730 + 020537 1253 24 01 1 306216972 08 0730 + 020538 1253 24 02 1 306216972 09 0730 + 020539 1253 24 03 1 306216972 10 0730 + 020540 1253 24 04 1 306216972 11 0730 + 020541 1253 24 05 1 306216972 12 0730 + 020542 1253 24 06 1 306216972 13 0730 + 020543 1253 24 07 1 306216972 14 0730 + 020544 1253 24 08 1 306216972 15 0730 + 020545 1253 25 01 1 303046668 08 0010 + 020546 1253 25 02 1 303046668 09 0010 + 020547 9999 99 99 0 9999 99 9999 + 020548 9999 99 99 0 9999 99 9999 + 020549 9999 99 99 0 9999 99 9999 + 020550 9999 99 99 0 9999 99 9999 + 020551 9999 99 99 0 9999 99 9999 + 020552 9999 99 99 0 9999 99 9999 + 020553 1253 26 01 1 303046668 10 0010 + 020554 1253 26 02 1 303046668 11 0010 + 020555 9999 99 99 0 9999 99 9999 + 020556 9999 99 99 0 9999 99 9999 + 020557 9999 99 99 0 9999 99 9999 + 020558 9999 99 99 0 9999 99 9999 + 020559 9999 99 99 0 9999 99 9999 + 020560 9999 99 99 0 9999 99 9999 + 020561 1253 27 01 1 303046668 12 0010 + 020562 1253 27 02 1 303046668 13 0010 + 020563 9999 99 99 0 9999 99 9999 + 020564 9999 99 99 0 9999 99 9999 + 020565 9999 99 99 0 9999 99 9999 + 020566 9999 99 99 0 9999 99 9999 + 020567 9999 99 99 0 9999 99 9999 + 020568 9999 99 99 0 9999 99 9999 + 020569 1253 28 01 1 303046668 14 0010 + 020570 1253 28 02 1 303046668 15 0010 + 020571 9999 99 99 0 9999 99 9999 + 020572 9999 99 99 0 9999 99 9999 + 020573 9999 99 99 0 9999 99 9999 + 020574 9999 99 99 0 9999 99 9999 + 020575 9999 99 99 0 9999 99 9999 + 020576 9999 99 99 0 9999 99 9999 + 020577 1253 29 01 1 303046668 04 0010 + 020578 1253 29 02 1 303046668 05 0010 + 020579 9999 99 99 0 9999 99 9999 + 020580 9999 99 99 0 9999 99 9999 + 020581 9999 99 99 0 9999 99 9999 + 020582 9999 99 99 0 9999 99 9999 + 020583 9999 99 99 0 9999 99 9999 + 020584 9999 99 99 0 9999 99 9999 + 020585 1253 30 01 1 303046668 06 0010 + 020586 1253 30 02 1 303046668 07 0010 + 020587 9999 99 99 0 9999 99 9999 + 020588 9999 99 99 0 9999 99 9999 + 020589 9999 99 99 0 9999 99 9999 + 020590 9999 99 99 0 9999 99 9999 + 020591 9999 99 99 0 9999 99 9999 + 020592 9999 99 99 0 9999 99 9999 + 020593 1253 31 01 1 303046668 00 0010 + 020594 1253 31 02 1 303046668 01 0010 + 020595 9999 99 99 0 9999 99 9999 + 020596 9999 99 99 0 9999 99 9999 + 020597 9999 99 99 0 9999 99 9999 + 020598 9999 99 99 0 9999 99 9999 + 020599 9999 99 99 0 9999 99 9999 + 020600 9999 99 99 0 9999 99 9999 + 020601 1253 32 01 1 303046668 02 0010 + 020602 1253 32 02 1 303046668 03 0010 + 020603 9999 99 99 0 9999 99 9999 + 020604 9999 99 99 0 9999 99 9999 + 020605 9999 99 99 0 9999 99 9999 + 020606 9999 99 99 0 9999 99 9999 + 020607 9999 99 99 0 9999 99 9999 + 020608 9999 99 99 0 9999 99 9999 + 020609 1253 33 01 1 306212872 00 0721 + 020610 1253 33 02 1 306212872 01 0721 + 020611 1253 33 03 1 306212872 02 0721 + 020612 1253 33 04 1 306212872 03 0721 + 020613 1253 33 05 1 306212872 04 0721 + 020614 1253 33 06 1 306212872 05 0721 + 020615 1253 33 07 1 306212872 06 0721 + 020616 1253 33 08 1 306212872 07 0721 + 020617 1253 34 01 1 306212872 08 0721 + 020618 1253 34 02 1 306212872 09 0721 + 020619 1253 34 03 1 306212872 10 0721 + 020620 1253 34 04 1 306212872 11 0721 + 020621 1253 34 05 1 306212872 12 0721 + 020622 1253 34 06 1 306212872 13 0721 + 020623 1253 34 07 1 306212872 14 0721 + 020624 1253 34 08 1 306212872 15 0721 + 020625 1253 35 01 1 306212868 00 0720 + 020626 1253 35 02 1 306212868 01 0720 + 020627 1253 35 03 1 306212868 02 0720 + 020628 1253 35 04 1 306212868 03 0720 + 020629 1253 35 05 1 306212868 04 0720 + 020630 1253 35 06 1 306212868 05 0720 + 020631 1253 35 07 1 306212868 06 0720 + 020632 1253 35 08 1 306212868 07 0720 + 020633 1253 36 01 1 306212868 08 0720 + 020634 1253 36 02 1 306212868 09 0720 + 020635 1253 36 03 1 306212868 10 0720 + 020636 1253 36 04 1 306212868 11 0720 + 020637 1253 36 05 1 306212868 12 0720 + 020638 1253 36 06 1 306212868 13 0720 + 020639 1253 36 07 1 306212868 14 0720 + 020640 1253 36 08 1 306212868 15 0720 + 020641 1253 37 01 1 306212880 00 0723 + 020642 1253 37 02 1 306212880 01 0723 + 020643 1253 37 03 1 306212880 02 0723 + 020644 1253 37 04 1 306212880 03 0723 + 020645 1253 37 05 1 306212880 04 0723 + 020646 1253 37 06 1 306212880 05 0723 + 020647 1253 37 07 1 306212880 06 0723 + 020648 1253 37 08 1 306212880 07 0723 + 020649 1253 38 01 1 306212880 08 0723 + 020650 1253 38 02 1 306212880 09 0723 + 020651 1253 38 03 1 306212880 10 0723 + 020652 1253 38 04 1 306212880 11 0723 + 020653 1253 38 05 1 306212880 12 0723 + 020654 1253 38 06 1 306212880 13 0723 + 020655 1253 38 07 1 306212880 14 0723 + 020656 1253 38 08 1 306212880 15 0723 + 020657 1253 39 01 1 306212876 00 0722 + 020658 1253 39 02 1 306212876 01 0722 + 020659 1253 39 03 1 306212876 02 0722 + 020660 1253 39 04 1 306212876 03 0722 + 020661 1253 39 05 1 306212876 04 0722 + 020662 1253 39 06 1 306212876 05 0722 + 020663 1253 39 07 1 306212876 06 0722 + 020664 1253 39 08 1 306212876 07 0722 + 020665 1253 40 01 1 306212876 08 0722 + 020666 1253 40 02 1 306212876 09 0722 + 020667 1253 40 03 1 306212876 10 0722 + 020668 1253 40 04 1 306212876 11 0722 + 020669 1253 40 05 1 306212876 12 0722 + 020670 1253 40 06 1 306212876 13 0722 + 020671 1253 40 07 1 306212876 14 0722 + 020672 1253 40 08 1 306212876 15 0722 + 020673 1253 41 01 1 304099336 00 0113 + 020674 1253 41 02 1 304099336 01 0113 + 020675 1253 41 03 1 304099336 02 0113 + 020676 1253 41 04 1 304099336 03 0113 + 020677 9999 99 99 0 9999 99 9999 + 020678 9999 99 99 0 9999 99 9999 + 020679 9999 99 99 0 9999 99 9999 + 020680 9999 99 99 0 9999 99 9999 + 020681 1253 42 01 1 304099336 04 0113 + 020682 1253 42 02 1 304099336 05 0113 + 020683 1253 42 03 1 304099336 06 0113 + 020684 1253 42 04 1 304099336 07 0113 + 020685 9999 99 99 0 9999 99 9999 + 020686 9999 99 99 0 9999 99 9999 + 020687 9999 99 99 0 9999 99 9999 + 020688 9999 99 99 0 9999 99 9999 + 020689 1253 43 01 1 304099336 08 0113 + 020690 1253 43 02 1 304099336 09 0113 + 020691 1253 43 03 1 304099336 10 0113 + 020692 1253 43 04 1 304099336 11 0113 + 020693 9999 99 99 0 9999 99 9999 + 020694 9999 99 99 0 9999 99 9999 + 020695 9999 99 99 0 9999 99 9999 + 020696 9999 99 99 0 9999 99 9999 + 020697 1253 44 01 1 304099336 12 0113 + 020698 1253 44 02 1 304099336 13 0113 + 020699 1253 44 03 1 304099336 14 0113 + 020700 1253 44 04 1 304099336 15 0113 + 020701 9999 99 99 0 9999 99 9999 + 020702 9999 99 99 0 9999 99 9999 + 020703 9999 99 99 0 9999 99 9999 + 020704 9999 99 99 0 9999 99 9999 + 020705 1253 45 01 1 304099332 00 0112 + 020706 1253 45 02 1 304099332 01 0112 + 020707 1253 45 03 1 304099332 02 0112 + 020708 1253 45 04 1 304099332 03 0112 + 020709 9999 99 99 0 9999 99 9999 + 020710 9999 99 99 0 9999 99 9999 + 020711 9999 99 99 0 9999 99 9999 + 020712 9999 99 99 0 9999 99 9999 + 020713 1253 46 01 1 304099332 04 0112 + 020714 1253 46 02 1 304099332 05 0112 + 020715 1253 46 03 1 304099332 06 0112 + 020716 1253 46 04 1 304099332 07 0112 + 020717 9999 99 99 0 9999 99 9999 + 020718 9999 99 99 0 9999 99 9999 + 020719 9999 99 99 0 9999 99 9999 + 020720 9999 99 99 0 9999 99 9999 + 020721 1253 47 01 1 304099332 08 0112 + 020722 1253 47 02 1 304099332 09 0112 + 020723 1253 47 03 1 304099332 10 0112 + 020724 1253 47 04 1 304099332 11 0112 + 020725 9999 99 99 0 9999 99 9999 + 020726 9999 99 99 0 9999 99 9999 + 020727 9999 99 99 0 9999 99 9999 + 020728 9999 99 99 0 9999 99 9999 + 020729 1253 48 01 1 304099332 12 0112 + 020730 1253 48 02 1 304099332 13 0112 + 020731 1253 48 03 1 304099332 14 0112 + 020732 1253 48 04 1 304099332 15 0112 + 020733 9999 99 99 0 9999 99 9999 + 020734 9999 99 99 0 9999 99 9999 + 020735 9999 99 99 0 9999 99 9999 + 020736 9999 99 99 0 9999 99 9999 + 020737 1254 01 01 1 306208780 00 0714 + 020738 1254 01 02 1 306208780 01 0714 + 020739 1254 01 03 1 306208780 02 0714 + 020740 1254 01 04 1 306208780 03 0714 + 020741 1254 01 05 1 306208780 04 0714 + 020742 1254 01 06 1 306208780 05 0714 + 020743 1254 01 07 1 306208780 06 0714 + 020744 1254 01 08 1 306208780 07 0714 + 020745 1254 02 01 1 306208780 08 0714 + 020746 1254 02 02 1 306208780 09 0714 + 020747 1254 02 03 1 306208780 10 0714 + 020748 1254 02 04 1 306208780 11 0714 + 020749 1254 02 05 1 306208780 12 0714 + 020750 1254 02 06 1 306208780 13 0714 + 020751 1254 02 07 1 306208780 14 0714 + 020752 1254 02 08 1 306208780 15 0714 + 020753 1254 03 01 1 306208784 00 0715 + 020754 1254 03 02 1 306208784 01 0715 + 020755 1254 03 03 1 306208784 02 0715 + 020756 1254 03 04 1 306208784 03 0715 + 020757 1254 03 05 1 306208784 04 0715 + 020758 1254 03 06 1 306208784 05 0715 + 020759 1254 03 07 1 306208784 06 0715 + 020760 1254 03 08 1 306208784 07 0715 + 020761 1254 04 01 1 306208784 08 0715 + 020762 1254 04 02 1 306208784 09 0715 + 020763 1254 04 03 1 306208784 10 0715 + 020764 1254 04 04 1 306208784 11 0715 + 020765 1254 04 05 1 306208784 12 0715 + 020766 1254 04 06 1 306208784 13 0715 + 020767 1254 04 07 1 306208784 14 0715 + 020768 1254 04 08 1 306208784 15 0715 + 020769 1254 05 01 1 306208772 00 0712 + 020770 1254 05 02 1 306208772 01 0712 + 020771 1254 05 03 1 306208772 02 0712 + 020772 1254 05 04 1 306208772 03 0712 + 020773 1254 05 05 1 306208772 04 0712 + 020774 1254 05 06 1 306208772 05 0712 + 020775 1254 05 07 1 306208772 06 0712 + 020776 1254 05 08 1 306208772 07 0712 + 020777 1254 06 01 1 306208772 08 0712 + 020778 1254 06 02 1 306208772 09 0712 + 020779 1254 06 03 1 306208772 10 0712 + 020780 1254 06 04 1 306208772 11 0712 + 020781 1254 06 05 1 306208772 12 0712 + 020782 1254 06 06 1 306208772 13 0712 + 020783 1254 06 07 1 306208772 14 0712 + 020784 1254 06 08 1 306208772 15 0712 + 020785 1254 07 01 1 306208776 00 0713 + 020786 1254 07 02 1 306208776 01 0713 + 020787 1254 07 03 1 306208776 02 0713 + 020788 1254 07 04 1 306208776 03 0713 + 020789 1254 07 05 1 306208776 04 0713 + 020790 1254 07 06 1 306208776 05 0713 + 020791 1254 07 07 1 306208776 06 0713 + 020792 1254 07 08 1 306208776 07 0713 + 020793 1254 08 01 1 306208776 08 0713 + 020794 1254 08 02 1 306208776 09 0713 + 020795 1254 08 03 1 306208776 10 0713 + 020796 1254 08 04 1 306208776 11 0713 + 020797 1254 08 05 1 306208776 12 0713 + 020798 1254 08 06 1 306208776 13 0713 + 020799 1254 08 07 1 306208776 14 0713 + 020800 1254 08 08 1 306208776 15 0713 + 020801 1254 09 01 1 303042564 12 0000 + 020802 1254 09 02 1 303042564 13 0000 + 020803 9999 99 99 0 9999 99 9999 + 020804 9999 99 99 0 9999 99 9999 + 020805 9999 99 99 0 9999 99 9999 + 020806 9999 99 99 0 9999 99 9999 + 020807 9999 99 99 0 9999 99 9999 + 020808 9999 99 99 0 9999 99 9999 + 020809 1254 10 01 1 303042564 14 0000 + 020810 1254 10 02 1 303042564 15 0000 + 020811 9999 99 99 0 9999 99 9999 + 020812 9999 99 99 0 9999 99 9999 + 020813 9999 99 99 0 9999 99 9999 + 020814 9999 99 99 0 9999 99 9999 + 020815 9999 99 99 0 9999 99 9999 + 020816 9999 99 99 0 9999 99 9999 + 020817 1254 11 01 1 303042564 08 0000 + 020818 1254 11 02 1 303042564 09 0000 + 020819 9999 99 99 0 9999 99 9999 + 020820 9999 99 99 0 9999 99 9999 + 020821 9999 99 99 0 9999 99 9999 + 020822 9999 99 99 0 9999 99 9999 + 020823 9999 99 99 0 9999 99 9999 + 020824 9999 99 99 0 9999 99 9999 + 020825 1254 12 01 1 303042564 10 0000 + 020826 1254 12 02 1 303042564 11 0000 + 020827 9999 99 99 0 9999 99 9999 + 020828 9999 99 99 0 9999 99 9999 + 020829 9999 99 99 0 9999 99 9999 + 020830 9999 99 99 0 9999 99 9999 + 020831 9999 99 99 0 9999 99 9999 + 020832 9999 99 99 0 9999 99 9999 + 020833 1254 13 01 1 303042564 00 0000 + 020834 1254 13 02 1 303042564 01 0000 + 020835 9999 99 99 0 9999 99 9999 + 020836 9999 99 99 0 9999 99 9999 + 020837 9999 99 99 0 9999 99 9999 + 020838 9999 99 99 0 9999 99 9999 + 020839 9999 99 99 0 9999 99 9999 + 020840 9999 99 99 0 9999 99 9999 + 020841 1254 14 01 1 303042564 02 0000 + 020842 1254 14 02 1 303042564 03 0000 + 020843 9999 99 99 0 9999 99 9999 + 020844 9999 99 99 0 9999 99 9999 + 020845 9999 99 99 0 9999 99 9999 + 020846 9999 99 99 0 9999 99 9999 + 020847 9999 99 99 0 9999 99 9999 + 020848 9999 99 99 0 9999 99 9999 + 020849 1254 15 01 1 303042564 04 0000 + 020850 1254 15 02 1 303042564 05 0000 + 020851 9999 99 99 0 9999 99 9999 + 020852 9999 99 99 0 9999 99 9999 + 020853 9999 99 99 0 9999 99 9999 + 020854 9999 99 99 0 9999 99 9999 + 020855 9999 99 99 0 9999 99 9999 + 020856 9999 99 99 0 9999 99 9999 + 020857 1254 16 01 1 303042564 06 0000 + 020858 1254 16 02 1 303042564 07 0000 + 020859 9999 99 99 0 9999 99 9999 + 020860 9999 99 99 0 9999 99 9999 + 020861 9999 99 99 0 9999 99 9999 + 020862 9999 99 99 0 9999 99 9999 + 020863 9999 99 99 0 9999 99 9999 + 020864 9999 99 99 0 9999 99 9999 + 020865 1254 17 01 1 305160200 00 0361 + 020866 1254 17 02 1 305160200 01 0361 + 020867 1254 17 03 1 305160200 02 0361 + 020868 1254 17 04 1 305160200 03 0361 + 020869 1254 17 05 1 305160200 04 0361 + 020870 1254 17 06 1 305160200 05 0361 + 020871 1254 17 07 1 305160200 06 0361 + 020872 1254 17 08 1 305160200 07 0361 + 020873 1254 18 01 1 305160200 08 0361 + 020874 1254 18 02 1 305160200 09 0361 + 020875 1254 18 03 1 305160200 10 0361 + 020876 1254 18 04 1 305160200 11 0361 + 020877 1254 18 05 1 305160200 12 0361 + 020878 1254 18 06 1 305160200 13 0361 + 020879 1254 18 07 1 305160200 14 0361 + 020880 1254 18 08 1 305160200 15 0361 + 020881 1254 19 01 1 305160196 00 0360 + 020882 1254 19 02 1 305160196 01 0360 + 020883 1254 19 03 1 305160196 02 0360 + 020884 1254 19 04 1 305160196 03 0360 + 020885 1254 19 05 1 305160196 04 0360 + 020886 1254 19 06 1 305160196 05 0360 + 020887 1254 19 07 1 305160196 06 0360 + 020888 1254 19 08 1 305160196 07 0360 + 020889 1254 20 01 1 305160196 08 0360 + 020890 1254 20 02 1 305160196 09 0360 + 020891 1254 20 03 1 305160196 10 0360 + 020892 1254 20 04 1 305160196 11 0360 + 020893 1254 20 05 1 305160196 12 0360 + 020894 1254 20 06 1 305160196 13 0360 + 020895 1254 20 07 1 305160196 14 0360 + 020896 1254 20 08 1 305160196 15 0360 + 020897 1254 21 01 1 305160208 00 0363 + 020898 1254 21 02 1 305160208 01 0363 + 020899 1254 21 03 1 305160208 02 0363 + 020900 1254 21 04 1 305160208 03 0363 + 020901 1254 21 05 1 305160208 04 0363 + 020902 1254 21 06 1 305160208 05 0363 + 020903 1254 21 07 1 305160208 06 0363 + 020904 1254 21 08 1 305160208 07 0363 + 020905 1254 22 01 1 305160208 08 0363 + 020906 1254 22 02 1 305160208 09 0363 + 020907 1254 22 03 1 305160208 10 0363 + 020908 1254 22 04 1 305160208 11 0363 + 020909 1254 22 05 1 305160208 12 0363 + 020910 1254 22 06 1 305160208 13 0363 + 020911 1254 22 07 1 305160208 14 0363 + 020912 1254 22 08 1 305160208 15 0363 + 020913 1254 23 01 1 305160204 00 0362 + 020914 1254 23 02 1 305160204 01 0362 + 020915 1254 23 03 1 305160204 02 0362 + 020916 1254 23 04 1 305160204 03 0362 + 020917 1254 23 05 1 305160204 04 0362 + 020918 1254 23 06 1 305160204 05 0362 + 020919 1254 23 07 1 305160204 06 0362 + 020920 1254 23 08 1 305160204 07 0362 + 020921 1254 24 01 1 305160204 08 0362 + 020922 1254 24 02 1 305160204 09 0362 + 020923 1254 24 03 1 305160204 10 0362 + 020924 1254 24 04 1 305160204 11 0362 + 020925 1254 24 05 1 305160204 12 0362 + 020926 1254 24 06 1 305160204 13 0362 + 020927 1254 24 07 1 305160204 14 0362 + 020928 1254 24 08 1 305160204 15 0362 + 020929 1254 25 01 1 306204684 00 0706 + 020930 1254 25 02 1 306204684 01 0706 + 020931 1254 25 03 1 306204684 02 0706 + 020932 1254 25 04 1 306204684 03 0706 + 020933 1254 25 05 1 306204684 04 0706 + 020934 1254 25 06 1 306204684 05 0706 + 020935 1254 25 07 1 306204684 06 0706 + 020936 1254 25 08 1 306204684 07 0706 + 020937 1254 26 01 1 306204684 08 0706 + 020938 1254 26 02 1 306204684 09 0706 + 020939 1254 26 03 1 306204684 10 0706 + 020940 1254 26 04 1 306204684 11 0706 + 020941 1254 26 05 1 306204684 12 0706 + 020942 1254 26 06 1 306204684 13 0706 + 020943 1254 26 07 1 306204684 14 0706 + 020944 1254 26 08 1 306204684 15 0706 + 020945 1254 27 01 1 306204688 00 0707 + 020946 1254 27 02 1 306204688 01 0707 + 020947 1254 27 03 1 306204688 02 0707 + 020948 1254 27 04 1 306204688 03 0707 + 020949 1254 27 05 1 306204688 04 0707 + 020950 1254 27 06 1 306204688 05 0707 + 020951 1254 27 07 1 306204688 06 0707 + 020952 1254 27 08 1 306204688 07 0707 + 020953 1254 28 01 1 306204688 08 0707 + 020954 1254 28 02 1 306204688 09 0707 + 020955 1254 28 03 1 306204688 10 0707 + 020956 1254 28 04 1 306204688 11 0707 + 020957 1254 28 05 1 306204688 12 0707 + 020958 1254 28 06 1 306204688 13 0707 + 020959 1254 28 07 1 306204688 14 0707 + 020960 1254 28 08 1 306204688 15 0707 + 020961 1254 29 01 1 306204676 00 0704 + 020962 1254 29 02 1 306204676 01 0704 + 020963 1254 29 03 1 306204676 02 0704 + 020964 1254 29 04 1 306204676 03 0704 + 020965 1254 29 05 1 306204676 04 0704 + 020966 1254 29 06 1 306204676 05 0704 + 020967 1254 29 07 1 306204676 06 0704 + 020968 1254 29 08 1 306204676 07 0704 + 020969 1254 30 01 1 306204676 08 0704 + 020970 1254 30 02 1 306204676 09 0704 + 020971 1254 30 03 1 306204676 10 0704 + 020972 1254 30 04 1 306204676 11 0704 + 020973 1254 30 05 1 306204676 12 0704 + 020974 1254 30 06 1 306204676 13 0704 + 020975 1254 30 07 1 306204676 14 0704 + 020976 1254 30 08 1 306204676 15 0704 + 020977 1254 31 01 1 306204680 00 0705 + 020978 1254 31 02 1 306204680 01 0705 + 020979 1254 31 03 1 306204680 02 0705 + 020980 1254 31 04 1 306204680 03 0705 + 020981 1254 31 05 1 306204680 04 0705 + 020982 1254 31 06 1 306204680 05 0705 + 020983 1254 31 07 1 306204680 06 0705 + 020984 1254 31 08 1 306204680 07 0705 + 020985 1254 32 01 1 306204680 08 0705 + 020986 1254 32 02 1 306204680 09 0705 + 020987 1254 32 03 1 306204680 10 0705 + 020988 1254 32 04 1 306204680 11 0705 + 020989 1254 32 05 1 306204680 12 0705 + 020990 1254 32 06 1 306204680 13 0705 + 020991 1254 32 07 1 306204680 14 0705 + 020992 1254 32 08 1 306204680 15 0705 + 020993 1254 33 01 1 305156104 00 0353 + 020994 1254 33 02 1 305156104 01 0353 + 020995 1254 33 03 1 305156104 02 0353 + 020996 1254 33 04 1 305156104 03 0353 + 020997 1254 33 05 1 305156104 04 0353 + 020998 1254 33 06 1 305156104 05 0353 + 020999 1254 33 07 1 305156104 06 0353 + 021000 1254 33 08 1 305156104 07 0353 + 021001 1254 34 01 1 305156104 08 0353 + 021002 1254 34 02 1 305156104 09 0353 + 021003 1254 34 03 1 305156104 10 0353 + 021004 1254 34 04 1 305156104 11 0353 + 021005 1254 34 05 1 305156104 12 0353 + 021006 1254 34 06 1 305156104 13 0353 + 021007 1254 34 07 1 305156104 14 0353 + 021008 1254 34 08 1 305156104 15 0353 + 021009 1254 35 01 1 305156100 00 0352 + 021010 1254 35 02 1 305156100 01 0352 + 021011 1254 35 03 1 305156100 02 0352 + 021012 1254 35 04 1 305156100 03 0352 + 021013 1254 35 05 1 305156100 04 0352 + 021014 1254 35 06 1 305156100 05 0352 + 021015 1254 35 07 1 305156100 06 0352 + 021016 1254 35 08 1 305156100 07 0352 + 021017 1254 36 01 1 305156100 08 0352 + 021018 1254 36 02 1 305156100 09 0352 + 021019 1254 36 03 1 305156100 10 0352 + 021020 1254 36 04 1 305156100 11 0352 + 021021 1254 36 05 1 305156100 12 0352 + 021022 1254 36 06 1 305156100 13 0352 + 021023 1254 36 07 1 305156100 14 0352 + 021024 1254 36 08 1 305156100 15 0352 + 021025 1254 37 01 1 305156112 00 0355 + 021026 1254 37 02 1 305156112 01 0355 + 021027 1254 37 03 1 305156112 02 0355 + 021028 1254 37 04 1 305156112 03 0355 + 021029 1254 37 05 1 305156112 04 0355 + 021030 1254 37 06 1 305156112 05 0355 + 021031 1254 37 07 1 305156112 06 0355 + 021032 1254 37 08 1 305156112 07 0355 + 021033 1254 38 01 1 305156112 08 0355 + 021034 1254 38 02 1 305156112 09 0355 + 021035 1254 38 03 1 305156112 10 0355 + 021036 1254 38 04 1 305156112 11 0355 + 021037 1254 38 05 1 305156112 12 0355 + 021038 1254 38 06 1 305156112 13 0355 + 021039 1254 38 07 1 305156112 14 0355 + 021040 1254 38 08 1 305156112 15 0355 + 021041 1254 39 01 1 305156108 00 0354 + 021042 1254 39 02 1 305156108 01 0354 + 021043 1254 39 03 1 305156108 02 0354 + 021044 1254 39 04 1 305156108 03 0354 + 021045 1254 39 05 1 305156108 04 0354 + 021046 1254 39 06 1 305156108 05 0354 + 021047 1254 39 07 1 305156108 06 0354 + 021048 1254 39 08 1 305156108 07 0354 + 021049 1254 40 01 1 305156108 08 0354 + 021050 1254 40 02 1 305156108 09 0354 + 021051 1254 40 03 1 305156108 10 0354 + 021052 1254 40 04 1 305156108 11 0354 + 021053 1254 40 05 1 305156108 12 0354 + 021054 1254 40 06 1 305156108 13 0354 + 021055 1254 40 07 1 305156108 14 0354 + 021056 1254 40 08 1 305156108 15 0354 + 021057 1254 41 01 1 305152012 00 0346 + 021058 1254 41 02 1 305152012 01 0346 + 021059 1254 41 03 1 305152012 02 0346 + 021060 1254 41 04 1 305152012 03 0346 + 021061 1254 41 05 1 305152012 04 0346 + 021062 1254 41 06 1 305152012 05 0346 + 021063 1254 41 07 1 305152012 06 0346 + 021064 1254 41 08 1 305152012 07 0346 + 021065 1254 42 01 1 305152012 08 0346 + 021066 1254 42 02 1 305152012 09 0346 + 021067 1254 42 03 1 305152012 10 0346 + 021068 1254 42 04 1 305152012 11 0346 + 021069 1254 42 05 1 305152012 12 0346 + 021070 1254 42 06 1 305152012 13 0346 + 021071 1254 42 07 1 305152012 14 0346 + 021072 1254 42 08 1 305152012 15 0346 + 021073 1254 43 01 1 305152016 00 0347 + 021074 1254 43 02 1 305152016 01 0347 + 021075 1254 43 03 1 305152016 02 0347 + 021076 1254 43 04 1 305152016 03 0347 + 021077 1254 43 05 1 305152016 04 0347 + 021078 1254 43 06 1 305152016 05 0347 + 021079 1254 43 07 1 305152016 06 0347 + 021080 1254 43 08 1 305152016 07 0347 + 021081 1254 44 01 1 305152016 08 0347 + 021082 1254 44 02 1 305152016 09 0347 + 021083 1254 44 03 1 305152016 10 0347 + 021084 1254 44 04 1 305152016 11 0347 + 021085 1254 44 05 1 305152016 12 0347 + 021086 1254 44 06 1 305152016 13 0347 + 021087 1254 44 07 1 305152016 14 0347 + 021088 1254 44 08 1 305152016 15 0347 + 021089 1254 45 01 1 305152004 00 0344 + 021090 1254 45 02 1 305152004 01 0344 + 021091 1254 45 03 1 305152004 02 0344 + 021092 1254 45 04 1 305152004 03 0344 + 021093 1254 45 05 1 305152004 04 0344 + 021094 1254 45 06 1 305152004 05 0344 + 021095 1254 45 07 1 305152004 06 0344 + 021096 1254 45 08 1 305152004 07 0344 + 021097 1254 46 01 1 305152004 08 0344 + 021098 1254 46 02 1 305152004 09 0344 + 021099 1254 46 03 1 305152004 10 0344 + 021100 1254 46 04 1 305152004 11 0344 + 021101 1254 46 05 1 305152004 12 0344 + 021102 1254 46 06 1 305152004 13 0344 + 021103 1254 46 07 1 305152004 14 0344 + 021104 1254 46 08 1 305152004 15 0344 + 021105 1254 47 01 1 305152008 00 0345 + 021106 1254 47 02 1 305152008 01 0345 + 021107 1254 47 03 1 305152008 02 0345 + 021108 1254 47 04 1 305152008 03 0345 + 021109 1254 47 05 1 305152008 04 0345 + 021110 1254 47 06 1 305152008 05 0345 + 021111 1254 47 07 1 305152008 06 0345 + 021112 1254 47 08 1 305152008 07 0345 + 021113 1254 48 01 1 305152008 08 0345 + 021114 1254 48 02 1 305152008 09 0345 + 021115 1254 48 03 1 305152008 10 0345 + 021116 1254 48 04 1 305152008 11 0345 + 021117 1254 48 05 1 305152008 12 0345 + 021118 1254 48 06 1 305152008 13 0345 + 021119 1254 48 07 1 305152008 14 0345 + 021120 1254 48 08 1 305152008 15 0345 + 021121 1255 01 01 1 303042576 08 0003 + 021122 1255 01 02 1 303042576 09 0003 + 021123 9999 99 99 0 9999 99 9999 + 021124 9999 99 99 0 9999 99 9999 + 021125 9999 99 99 0 9999 99 9999 + 021126 9999 99 99 0 9999 99 9999 + 021127 9999 99 99 0 9999 99 9999 + 021128 9999 99 99 0 9999 99 9999 + 021129 1255 02 01 1 303042576 10 0003 + 021130 1255 02 02 1 303042576 11 0003 + 021131 9999 99 99 0 9999 99 9999 + 021132 9999 99 99 0 9999 99 9999 + 021133 9999 99 99 0 9999 99 9999 + 021134 9999 99 99 0 9999 99 9999 + 021135 9999 99 99 0 9999 99 9999 + 021136 9999 99 99 0 9999 99 9999 + 021137 1255 03 01 1 303042576 12 0003 + 021138 1255 03 02 1 303042576 13 0003 + 021139 9999 99 99 0 9999 99 9999 + 021140 9999 99 99 0 9999 99 9999 + 021141 9999 99 99 0 9999 99 9999 + 021142 9999 99 99 0 9999 99 9999 + 021143 9999 99 99 0 9999 99 9999 + 021144 9999 99 99 0 9999 99 9999 + 021145 1255 04 01 1 303042576 14 0003 + 021146 1255 04 02 1 303042576 15 0003 + 021147 9999 99 99 0 9999 99 9999 + 021148 9999 99 99 0 9999 99 9999 + 021149 9999 99 99 0 9999 99 9999 + 021150 9999 99 99 0 9999 99 9999 + 021151 9999 99 99 0 9999 99 9999 + 021152 9999 99 99 0 9999 99 9999 + 021153 1255 05 01 1 303042576 00 0003 + 021154 1255 05 02 1 303042576 01 0003 + 021155 9999 99 99 0 9999 99 9999 + 021156 9999 99 99 0 9999 99 9999 + 021157 9999 99 99 0 9999 99 9999 + 021158 9999 99 99 0 9999 99 9999 + 021159 9999 99 99 0 9999 99 9999 + 021160 9999 99 99 0 9999 99 9999 + 021161 1255 06 01 1 303042576 02 0003 + 021162 1255 06 02 1 303042576 03 0003 + 021163 9999 99 99 0 9999 99 9999 + 021164 9999 99 99 0 9999 99 9999 + 021165 9999 99 99 0 9999 99 9999 + 021166 9999 99 99 0 9999 99 9999 + 021167 9999 99 99 0 9999 99 9999 + 021168 9999 99 99 0 9999 99 9999 + 021169 1255 07 01 1 303042576 04 0003 + 021170 1255 07 02 1 303042576 05 0003 + 021171 9999 99 99 0 9999 99 9999 + 021172 9999 99 99 0 9999 99 9999 + 021173 9999 99 99 0 9999 99 9999 + 021174 9999 99 99 0 9999 99 9999 + 021175 9999 99 99 0 9999 99 9999 + 021176 9999 99 99 0 9999 99 9999 + 021177 1255 08 01 1 303042576 06 0003 + 021178 1255 08 02 1 303042576 07 0003 + 021179 9999 99 99 0 9999 99 9999 + 021180 9999 99 99 0 9999 99 9999 + 021181 9999 99 99 0 9999 99 9999 + 021182 9999 99 99 0 9999 99 9999 + 021183 9999 99 99 0 9999 99 9999 + 021184 9999 99 99 0 9999 99 9999 + 021185 1255 09 01 1 304095244 00 0106 + 021186 1255 09 02 1 304095244 01 0106 + 021187 1255 09 03 1 304095244 02 0106 + 021188 1255 09 04 1 304095244 03 0106 + 021189 9999 99 99 0 9999 99 9999 + 021190 9999 99 99 0 9999 99 9999 + 021191 9999 99 99 0 9999 99 9999 + 021192 9999 99 99 0 9999 99 9999 + 021193 1255 10 01 1 304095244 04 0106 + 021194 1255 10 02 1 304095244 05 0106 + 021195 1255 10 03 1 304095244 06 0106 + 021196 1255 10 04 1 304095244 07 0106 + 021197 9999 99 99 0 9999 99 9999 + 021198 9999 99 99 0 9999 99 9999 + 021199 9999 99 99 0 9999 99 9999 + 021200 9999 99 99 0 9999 99 9999 + 021201 1255 11 01 1 304095244 08 0106 + 021202 1255 11 02 1 304095244 09 0106 + 021203 1255 11 03 1 304095244 10 0106 + 021204 1255 11 04 1 304095244 11 0106 + 021205 9999 99 99 0 9999 99 9999 + 021206 9999 99 99 0 9999 99 9999 + 021207 9999 99 99 0 9999 99 9999 + 021208 9999 99 99 0 9999 99 9999 + 021209 1255 12 01 1 304095244 12 0106 + 021210 1255 12 02 1 304095244 13 0106 + 021211 1255 12 03 1 304095244 14 0106 + 021212 1255 12 04 1 304095244 15 0106 + 021213 9999 99 99 0 9999 99 9999 + 021214 9999 99 99 0 9999 99 9999 + 021215 9999 99 99 0 9999 99 9999 + 021216 9999 99 99 0 9999 99 9999 + 021217 1255 13 01 1 304095248 08 0107 + 021218 1255 13 02 1 304095248 09 0107 + 021219 1255 13 03 1 304095248 10 0107 + 021220 1255 13 04 1 304095248 11 0107 + 021221 9999 99 99 0 9999 99 9999 + 021222 9999 99 99 0 9999 99 9999 + 021223 9999 99 99 0 9999 99 9999 + 021224 9999 99 99 0 9999 99 9999 + 021225 1255 14 01 1 304095248 12 0107 + 021226 1255 14 02 1 304095248 13 0107 + 021227 1255 14 03 1 304095248 14 0107 + 021228 1255 14 04 1 304095248 15 0107 + 021229 9999 99 99 0 9999 99 9999 + 021230 9999 99 99 0 9999 99 9999 + 021231 9999 99 99 0 9999 99 9999 + 021232 9999 99 99 0 9999 99 9999 + 021233 1255 15 01 1 304095248 00 0107 + 021234 1255 15 02 1 304095248 01 0107 + 021235 1255 15 03 1 304095248 02 0107 + 021236 1255 15 04 1 304095248 03 0107 + 021237 9999 99 99 0 9999 99 9999 + 021238 9999 99 99 0 9999 99 9999 + 021239 9999 99 99 0 9999 99 9999 + 021240 9999 99 99 0 9999 99 9999 + 021241 1255 16 01 1 304095248 04 0107 + 021242 1255 16 02 1 304095248 05 0107 + 021243 1255 16 03 1 304095248 06 0107 + 021244 1255 16 04 1 304095248 07 0107 + 021245 9999 99 99 0 9999 99 9999 + 021246 9999 99 99 0 9999 99 9999 + 021247 9999 99 99 0 9999 99 9999 + 021248 9999 99 99 0 9999 99 9999 + 021249 1255 17 01 1 306200584 00 0697 + 021250 1255 17 02 1 306200584 01 0697 + 021251 1255 17 03 1 306200584 02 0697 + 021252 1255 17 04 1 306200584 03 0697 + 021253 1255 17 05 1 306200584 04 0697 + 021254 1255 17 06 1 306200584 05 0697 + 021255 1255 17 07 1 306200584 06 0697 + 021256 1255 17 08 1 306200584 07 0697 + 021257 1255 18 01 1 306200584 08 0697 + 021258 1255 18 02 1 306200584 09 0697 + 021259 1255 18 03 1 306200584 10 0697 + 021260 1255 18 04 1 306200584 11 0697 + 021261 1255 18 05 1 306200584 12 0697 + 021262 1255 18 06 1 306200584 13 0697 + 021263 1255 18 07 1 306200584 14 0697 + 021264 1255 18 08 1 306200584 15 0697 + 021265 1255 19 01 1 306200580 00 0696 + 021266 1255 19 02 1 306200580 01 0696 + 021267 1255 19 03 1 306200580 02 0696 + 021268 1255 19 04 1 306200580 03 0696 + 021269 1255 19 05 1 306200580 04 0696 + 021270 1255 19 06 1 306200580 05 0696 + 021271 1255 19 07 1 306200580 06 0696 + 021272 1255 19 08 1 306200580 07 0696 + 021273 1255 20 01 1 306200580 08 0696 + 021274 1255 20 02 1 306200580 09 0696 + 021275 1255 20 03 1 306200580 10 0696 + 021276 1255 20 04 1 306200580 11 0696 + 021277 1255 20 05 1 306200580 12 0696 + 021278 1255 20 06 1 306200580 13 0696 + 021279 1255 20 07 1 306200580 14 0696 + 021280 1255 20 08 1 306200580 15 0696 + 021281 1255 21 01 1 306200592 00 0699 + 021282 1255 21 02 1 306200592 01 0699 + 021283 1255 21 03 1 306200592 02 0699 + 021284 1255 21 04 1 306200592 03 0699 + 021285 1255 21 05 1 306200592 04 0699 + 021286 1255 21 06 1 306200592 05 0699 + 021287 1255 21 07 1 306200592 06 0699 + 021288 1255 21 08 1 306200592 07 0699 + 021289 1255 22 01 1 306200592 08 0699 + 021290 1255 22 02 1 306200592 09 0699 + 021291 1255 22 03 1 306200592 10 0699 + 021292 1255 22 04 1 306200592 11 0699 + 021293 1255 22 05 1 306200592 12 0699 + 021294 1255 22 06 1 306200592 13 0699 + 021295 1255 22 07 1 306200592 14 0699 + 021296 1255 22 08 1 306200592 15 0699 + 021297 1255 23 01 1 306200588 00 0698 + 021298 1255 23 02 1 306200588 01 0698 + 021299 1255 23 03 1 306200588 02 0698 + 021300 1255 23 04 1 306200588 03 0698 + 021301 1255 23 05 1 306200588 04 0698 + 021302 1255 23 06 1 306200588 05 0698 + 021303 1255 23 07 1 306200588 06 0698 + 021304 1255 23 08 1 306200588 07 0698 + 021305 1255 24 01 1 306200588 08 0698 + 021306 1255 24 02 1 306200588 09 0698 + 021307 1255 24 03 1 306200588 10 0698 + 021308 1255 24 04 1 306200588 11 0698 + 021309 1255 24 05 1 306200588 12 0698 + 021310 1255 24 06 1 306200588 13 0698 + 021311 1255 24 07 1 306200588 14 0698 + 021312 1255 24 08 1 306200588 15 0698 + 021313 1255 25 01 1 303042572 08 0002 + 021314 1255 25 02 1 303042572 09 0002 + 021315 9999 99 99 0 9999 99 9999 + 021316 9999 99 99 0 9999 99 9999 + 021317 9999 99 99 0 9999 99 9999 + 021318 9999 99 99 0 9999 99 9999 + 021319 9999 99 99 0 9999 99 9999 + 021320 9999 99 99 0 9999 99 9999 + 021321 1255 26 01 1 303042572 10 0002 + 021322 1255 26 02 1 303042572 11 0002 + 021323 9999 99 99 0 9999 99 9999 + 021324 9999 99 99 0 9999 99 9999 + 021325 9999 99 99 0 9999 99 9999 + 021326 9999 99 99 0 9999 99 9999 + 021327 9999 99 99 0 9999 99 9999 + 021328 9999 99 99 0 9999 99 9999 + 021329 1255 27 01 1 303042572 12 0002 + 021330 1255 27 02 1 303042572 13 0002 + 021331 9999 99 99 0 9999 99 9999 + 021332 9999 99 99 0 9999 99 9999 + 021333 9999 99 99 0 9999 99 9999 + 021334 9999 99 99 0 9999 99 9999 + 021335 9999 99 99 0 9999 99 9999 + 021336 9999 99 99 0 9999 99 9999 + 021337 1255 28 01 1 303042572 14 0002 + 021338 1255 28 02 1 303042572 15 0002 + 021339 9999 99 99 0 9999 99 9999 + 021340 9999 99 99 0 9999 99 9999 + 021341 9999 99 99 0 9999 99 9999 + 021342 9999 99 99 0 9999 99 9999 + 021343 9999 99 99 0 9999 99 9999 + 021344 9999 99 99 0 9999 99 9999 + 021345 1255 29 01 1 303042572 04 0002 + 021346 1255 29 02 1 303042572 05 0002 + 021347 9999 99 99 0 9999 99 9999 + 021348 9999 99 99 0 9999 99 9999 + 021349 9999 99 99 0 9999 99 9999 + 021350 9999 99 99 0 9999 99 9999 + 021351 9999 99 99 0 9999 99 9999 + 021352 9999 99 99 0 9999 99 9999 + 021353 1255 30 01 1 303042572 06 0002 + 021354 1255 30 02 1 303042572 07 0002 + 021355 9999 99 99 0 9999 99 9999 + 021356 9999 99 99 0 9999 99 9999 + 021357 9999 99 99 0 9999 99 9999 + 021358 9999 99 99 0 9999 99 9999 + 021359 9999 99 99 0 9999 99 9999 + 021360 9999 99 99 0 9999 99 9999 + 021361 1255 31 01 1 303042572 00 0002 + 021362 1255 31 02 1 303042572 01 0002 + 021363 9999 99 99 0 9999 99 9999 + 021364 9999 99 99 0 9999 99 9999 + 021365 9999 99 99 0 9999 99 9999 + 021366 9999 99 99 0 9999 99 9999 + 021367 9999 99 99 0 9999 99 9999 + 021368 9999 99 99 0 9999 99 9999 + 021369 1255 32 01 1 303042572 02 0002 + 021370 1255 32 02 1 303042572 03 0002 + 021371 9999 99 99 0 9999 99 9999 + 021372 9999 99 99 0 9999 99 9999 + 021373 9999 99 99 0 9999 99 9999 + 021374 9999 99 99 0 9999 99 9999 + 021375 9999 99 99 0 9999 99 9999 + 021376 9999 99 99 0 9999 99 9999 + 021377 1255 33 01 1 306196488 00 0689 + 021378 1255 33 02 1 306196488 01 0689 + 021379 1255 33 03 1 306196488 02 0689 + 021380 1255 33 04 1 306196488 03 0689 + 021381 1255 33 05 1 306196488 04 0689 + 021382 1255 33 06 1 306196488 05 0689 + 021383 1255 33 07 1 306196488 06 0689 + 021384 1255 33 08 1 306196488 07 0689 + 021385 1255 34 01 1 306196488 08 0689 + 021386 1255 34 02 1 306196488 09 0689 + 021387 1255 34 03 1 306196488 10 0689 + 021388 1255 34 04 1 306196488 11 0689 + 021389 1255 34 05 1 306196488 12 0689 + 021390 1255 34 06 1 306196488 13 0689 + 021391 1255 34 07 1 306196488 14 0689 + 021392 1255 34 08 1 306196488 15 0689 + 021393 1255 35 01 1 306196484 00 0688 + 021394 1255 35 02 1 306196484 01 0688 + 021395 1255 35 03 1 306196484 02 0688 + 021396 1255 35 04 1 306196484 03 0688 + 021397 1255 35 05 1 306196484 04 0688 + 021398 1255 35 06 1 306196484 05 0688 + 021399 1255 35 07 1 306196484 06 0688 + 021400 1255 35 08 1 306196484 07 0688 + 021401 1255 36 01 1 306196484 08 0688 + 021402 1255 36 02 1 306196484 09 0688 + 021403 1255 36 03 1 306196484 10 0688 + 021404 1255 36 04 1 306196484 11 0688 + 021405 1255 36 05 1 306196484 12 0688 + 021406 1255 36 06 1 306196484 13 0688 + 021407 1255 36 07 1 306196484 14 0688 + 021408 1255 36 08 1 306196484 15 0688 + 021409 1255 37 01 1 306196496 00 0691 + 021410 1255 37 02 1 306196496 01 0691 + 021411 1255 37 03 1 306196496 02 0691 + 021412 1255 37 04 1 306196496 03 0691 + 021413 1255 37 05 1 306196496 04 0691 + 021414 1255 37 06 1 306196496 05 0691 + 021415 1255 37 07 1 306196496 06 0691 + 021416 1255 37 08 1 306196496 07 0691 + 021417 1255 38 01 1 306196496 08 0691 + 021418 1255 38 02 1 306196496 09 0691 + 021419 1255 38 03 1 306196496 10 0691 + 021420 1255 38 04 1 306196496 11 0691 + 021421 1255 38 05 1 306196496 12 0691 + 021422 1255 38 06 1 306196496 13 0691 + 021423 1255 38 07 1 306196496 14 0691 + 021424 1255 38 08 1 306196496 15 0691 + 021425 1255 39 01 1 306196492 00 0690 + 021426 1255 39 02 1 306196492 01 0690 + 021427 1255 39 03 1 306196492 02 0690 + 021428 1255 39 04 1 306196492 03 0690 + 021429 1255 39 05 1 306196492 04 0690 + 021430 1255 39 06 1 306196492 05 0690 + 021431 1255 39 07 1 306196492 06 0690 + 021432 1255 39 08 1 306196492 07 0690 + 021433 1255 40 01 1 306196492 08 0690 + 021434 1255 40 02 1 306196492 09 0690 + 021435 1255 40 03 1 306196492 10 0690 + 021436 1255 40 04 1 306196492 11 0690 + 021437 1255 40 05 1 306196492 12 0690 + 021438 1255 40 06 1 306196492 13 0690 + 021439 1255 40 07 1 306196492 14 0690 + 021440 1255 40 08 1 306196492 15 0690 + 021441 1255 41 01 1 304095240 00 0105 + 021442 1255 41 02 1 304095240 01 0105 + 021443 1255 41 03 1 304095240 02 0105 + 021444 1255 41 04 1 304095240 03 0105 + 021445 9999 99 99 0 9999 99 9999 + 021446 9999 99 99 0 9999 99 9999 + 021447 9999 99 99 0 9999 99 9999 + 021448 9999 99 99 0 9999 99 9999 + 021449 1255 42 01 1 304095240 04 0105 + 021450 1255 42 02 1 304095240 05 0105 + 021451 1255 42 03 1 304095240 06 0105 + 021452 1255 42 04 1 304095240 07 0105 + 021453 9999 99 99 0 9999 99 9999 + 021454 9999 99 99 0 9999 99 9999 + 021455 9999 99 99 0 9999 99 9999 + 021456 9999 99 99 0 9999 99 9999 + 021457 1255 43 01 1 304095240 08 0105 + 021458 1255 43 02 1 304095240 09 0105 + 021459 1255 43 03 1 304095240 10 0105 + 021460 1255 43 04 1 304095240 11 0105 + 021461 9999 99 99 0 9999 99 9999 + 021462 9999 99 99 0 9999 99 9999 + 021463 9999 99 99 0 9999 99 9999 + 021464 9999 99 99 0 9999 99 9999 + 021465 1255 44 01 1 304095240 12 0105 + 021466 1255 44 02 1 304095240 13 0105 + 021467 1255 44 03 1 304095240 14 0105 + 021468 1255 44 04 1 304095240 15 0105 + 021469 9999 99 99 0 9999 99 9999 + 021470 9999 99 99 0 9999 99 9999 + 021471 9999 99 99 0 9999 99 9999 + 021472 9999 99 99 0 9999 99 9999 + 021473 1255 45 01 1 304095236 00 0104 + 021474 1255 45 02 1 304095236 01 0104 + 021475 1255 45 03 1 304095236 02 0104 + 021476 1255 45 04 1 304095236 03 0104 + 021477 9999 99 99 0 9999 99 9999 + 021478 9999 99 99 0 9999 99 9999 + 021479 9999 99 99 0 9999 99 9999 + 021480 9999 99 99 0 9999 99 9999 + 021481 1255 46 01 1 304095236 04 0104 + 021482 1255 46 02 1 304095236 05 0104 + 021483 1255 46 03 1 304095236 06 0104 + 021484 1255 46 04 1 304095236 07 0104 + 021485 9999 99 99 0 9999 99 9999 + 021486 9999 99 99 0 9999 99 9999 + 021487 9999 99 99 0 9999 99 9999 + 021488 9999 99 99 0 9999 99 9999 + 021489 1255 47 01 1 304095236 08 0104 + 021490 1255 47 02 1 304095236 09 0104 + 021491 1255 47 03 1 304095236 10 0104 + 021492 1255 47 04 1 304095236 11 0104 + 021493 9999 99 99 0 9999 99 9999 + 021494 9999 99 99 0 9999 99 9999 + 021495 9999 99 99 0 9999 99 9999 + 021496 9999 99 99 0 9999 99 9999 + 021497 1255 48 01 1 304095236 12 0104 + 021498 1255 48 02 1 304095236 13 0104 + 021499 1255 48 03 1 304095236 14 0104 + 021500 1255 48 04 1 304095236 15 0104 + 021501 9999 99 99 0 9999 99 9999 + 021502 9999 99 99 0 9999 99 9999 + 021503 9999 99 99 0 9999 99 9999 + 021504 9999 99 99 0 9999 99 9999 + 021505 1256 01 01 1 304091148 08 0098 + 021506 1256 01 02 1 304091148 09 0098 + 021507 1256 01 03 1 304091148 10 0098 + 021508 1256 01 04 1 304091148 11 0098 + 021509 9999 99 99 0 9999 99 9999 + 021510 9999 99 99 0 9999 99 9999 + 021511 9999 99 99 0 9999 99 9999 + 021512 9999 99 99 0 9999 99 9999 + 021513 1256 02 01 1 304091148 12 0098 + 021514 1256 02 02 1 304091148 13 0098 + 021515 1256 02 03 1 304091148 14 0098 + 021516 1256 02 04 1 304091148 15 0098 + 021517 9999 99 99 0 9999 99 9999 + 021518 9999 99 99 0 9999 99 9999 + 021519 9999 99 99 0 9999 99 9999 + 021520 9999 99 99 0 9999 99 9999 + 021521 1256 03 01 1 304091148 00 0098 + 021522 1256 03 02 1 304091148 01 0098 + 021523 1256 03 03 1 304091148 02 0098 + 021524 1256 03 04 1 304091148 03 0098 + 021525 9999 99 99 0 9999 99 9999 + 021526 9999 99 99 0 9999 99 9999 + 021527 9999 99 99 0 9999 99 9999 + 021528 9999 99 99 0 9999 99 9999 + 021529 1256 04 01 1 304091148 04 0098 + 021530 1256 04 02 1 304091148 05 0098 + 021531 1256 04 03 1 304091148 06 0098 + 021532 1256 04 04 1 304091148 07 0098 + 021533 9999 99 99 0 9999 99 9999 + 021534 9999 99 99 0 9999 99 9999 + 021535 9999 99 99 0 9999 99 9999 + 021536 9999 99 99 0 9999 99 9999 + 021537 1256 05 01 1 304091152 08 0099 + 021538 1256 05 02 1 304091152 09 0099 + 021539 1256 05 03 1 304091152 10 0099 + 021540 1256 05 04 1 304091152 11 0099 + 021541 9999 99 99 0 9999 99 9999 + 021542 9999 99 99 0 9999 99 9999 + 021543 9999 99 99 0 9999 99 9999 + 021544 9999 99 99 0 9999 99 9999 + 021545 1256 06 01 1 304091152 12 0099 + 021546 1256 06 02 1 304091152 13 0099 + 021547 1256 06 03 1 304091152 14 0099 + 021548 1256 06 04 1 304091152 15 0099 + 021549 9999 99 99 0 9999 99 9999 + 021550 9999 99 99 0 9999 99 9999 + 021551 9999 99 99 0 9999 99 9999 + 021552 9999 99 99 0 9999 99 9999 + 021553 1256 07 01 1 304091152 00 0099 + 021554 1256 07 02 1 304091152 01 0099 + 021555 1256 07 03 1 304091152 02 0099 + 021556 1256 07 04 1 304091152 03 0099 + 021557 9999 99 99 0 9999 99 9999 + 021558 9999 99 99 0 9999 99 9999 + 021559 9999 99 99 0 9999 99 9999 + 021560 9999 99 99 0 9999 99 9999 + 021561 1256 08 01 1 304091152 04 0099 + 021562 1256 08 02 1 304091152 05 0099 + 021563 1256 08 03 1 304091152 06 0099 + 021564 1256 08 04 1 304091152 07 0099 + 021565 9999 99 99 0 9999 99 9999 + 021566 9999 99 99 0 9999 99 9999 + 021567 9999 99 99 0 9999 99 9999 + 021568 9999 99 99 0 9999 99 9999 + 021569 1256 09 01 1 306192396 00 0682 + 021570 1256 09 02 1 306192396 01 0682 + 021571 1256 09 03 1 306192396 02 0682 + 021572 1256 09 04 1 306192396 03 0682 + 021573 1256 09 05 1 306192396 04 0682 + 021574 1256 09 06 1 306192396 05 0682 + 021575 1256 09 07 1 306192396 06 0682 + 021576 1256 09 08 1 306192396 07 0682 + 021577 1256 10 01 1 306192396 08 0682 + 021578 1256 10 02 1 306192396 09 0682 + 021579 1256 10 03 1 306192396 10 0682 + 021580 1256 10 04 1 306192396 11 0682 + 021581 1256 10 05 1 306192396 12 0682 + 021582 1256 10 06 1 306192396 13 0682 + 021583 1256 10 07 1 306192396 14 0682 + 021584 1256 10 08 1 306192396 15 0682 + 021585 1256 11 01 1 306192400 00 0683 + 021586 1256 11 02 1 306192400 01 0683 + 021587 1256 11 03 1 306192400 02 0683 + 021588 1256 11 04 1 306192400 03 0683 + 021589 1256 11 05 1 306192400 04 0683 + 021590 1256 11 06 1 306192400 05 0683 + 021591 1256 11 07 1 306192400 06 0683 + 021592 1256 11 08 1 306192400 07 0683 + 021593 1256 12 01 1 306192400 08 0683 + 021594 1256 12 02 1 306192400 09 0683 + 021595 1256 12 03 1 306192400 10 0683 + 021596 1256 12 04 1 306192400 11 0683 + 021597 1256 12 05 1 306192400 12 0683 + 021598 1256 12 06 1 306192400 13 0683 + 021599 1256 12 07 1 306192400 14 0683 + 021600 1256 12 08 1 306192400 15 0683 + 021601 1256 13 01 1 306192388 00 0680 + 021602 1256 13 02 1 306192388 01 0680 + 021603 1256 13 03 1 306192388 02 0680 + 021604 1256 13 04 1 306192388 03 0680 + 021605 1256 13 05 1 306192388 04 0680 + 021606 1256 13 06 1 306192388 05 0680 + 021607 1256 13 07 1 306192388 06 0680 + 021608 1256 13 08 1 306192388 07 0680 + 021609 1256 14 01 1 306192388 08 0680 + 021610 1256 14 02 1 306192388 09 0680 + 021611 1256 14 03 1 306192388 10 0680 + 021612 1256 14 04 1 306192388 11 0680 + 021613 1256 14 05 1 306192388 12 0680 + 021614 1256 14 06 1 306192388 13 0680 + 021615 1256 14 07 1 306192388 14 0680 + 021616 1256 14 08 1 306192388 15 0680 + 021617 1256 15 01 1 306192392 00 0681 + 021618 1256 15 02 1 306192392 01 0681 + 021619 1256 15 03 1 306192392 02 0681 + 021620 1256 15 04 1 306192392 03 0681 + 021621 1256 15 05 1 306192392 04 0681 + 021622 1256 15 06 1 306192392 05 0681 + 021623 1256 15 07 1 306192392 06 0681 + 021624 1256 15 08 1 306192392 07 0681 + 021625 1256 16 01 1 306192392 08 0681 + 021626 1256 16 02 1 306192392 09 0681 + 021627 1256 16 03 1 306192392 10 0681 + 021628 1256 16 04 1 306192392 11 0681 + 021629 1256 16 05 1 306192392 12 0681 + 021630 1256 16 06 1 306192392 13 0681 + 021631 1256 16 07 1 306192392 14 0681 + 021632 1256 16 08 1 306192392 15 0681 + 021633 1256 17 01 1 303042568 12 0001 + 021634 1256 17 02 1 303042568 13 0001 + 021635 9999 99 99 0 9999 99 9999 + 021636 9999 99 99 0 9999 99 9999 + 021637 9999 99 99 0 9999 99 9999 + 021638 9999 99 99 0 9999 99 9999 + 021639 9999 99 99 0 9999 99 9999 + 021640 9999 99 99 0 9999 99 9999 + 021641 1256 18 01 1 303042568 14 0001 + 021642 1256 18 02 1 303042568 15 0001 + 021643 9999 99 99 0 9999 99 9999 + 021644 9999 99 99 0 9999 99 9999 + 021645 9999 99 99 0 9999 99 9999 + 021646 9999 99 99 0 9999 99 9999 + 021647 9999 99 99 0 9999 99 9999 + 021648 9999 99 99 0 9999 99 9999 + 021649 1256 19 01 1 303042568 08 0001 + 021650 1256 19 02 1 303042568 09 0001 + 021651 9999 99 99 0 9999 99 9999 + 021652 9999 99 99 0 9999 99 9999 + 021653 9999 99 99 0 9999 99 9999 + 021654 9999 99 99 0 9999 99 9999 + 021655 9999 99 99 0 9999 99 9999 + 021656 9999 99 99 0 9999 99 9999 + 021657 1256 20 01 1 303042568 10 0001 + 021658 1256 20 02 1 303042568 11 0001 + 021659 9999 99 99 0 9999 99 9999 + 021660 9999 99 99 0 9999 99 9999 + 021661 9999 99 99 0 9999 99 9999 + 021662 9999 99 99 0 9999 99 9999 + 021663 9999 99 99 0 9999 99 9999 + 021664 9999 99 99 0 9999 99 9999 + 021665 1256 21 01 1 303042568 00 0001 + 021666 1256 21 02 1 303042568 01 0001 + 021667 9999 99 99 0 9999 99 9999 + 021668 9999 99 99 0 9999 99 9999 + 021669 9999 99 99 0 9999 99 9999 + 021670 9999 99 99 0 9999 99 9999 + 021671 9999 99 99 0 9999 99 9999 + 021672 9999 99 99 0 9999 99 9999 + 021673 1256 22 01 1 303042568 02 0001 + 021674 1256 22 02 1 303042568 03 0001 + 021675 9999 99 99 0 9999 99 9999 + 021676 9999 99 99 0 9999 99 9999 + 021677 9999 99 99 0 9999 99 9999 + 021678 9999 99 99 0 9999 99 9999 + 021679 9999 99 99 0 9999 99 9999 + 021680 9999 99 99 0 9999 99 9999 + 021681 1256 23 01 1 303042568 04 0001 + 021682 1256 23 02 1 303042568 05 0001 + 021683 9999 99 99 0 9999 99 9999 + 021684 9999 99 99 0 9999 99 9999 + 021685 9999 99 99 0 9999 99 9999 + 021686 9999 99 99 0 9999 99 9999 + 021687 9999 99 99 0 9999 99 9999 + 021688 9999 99 99 0 9999 99 9999 + 021689 1256 24 01 1 303042568 06 0001 + 021690 1256 24 02 1 303042568 07 0001 + 021691 9999 99 99 0 9999 99 9999 + 021692 9999 99 99 0 9999 99 9999 + 021693 9999 99 99 0 9999 99 9999 + 021694 9999 99 99 0 9999 99 9999 + 021695 9999 99 99 0 9999 99 9999 + 021696 9999 99 99 0 9999 99 9999 + 021697 1256 25 01 1 305147912 00 0337 + 021698 1256 25 02 1 305147912 01 0337 + 021699 1256 25 03 1 305147912 02 0337 + 021700 1256 25 04 1 305147912 03 0337 + 021701 1256 25 05 1 305147912 04 0337 + 021702 1256 25 06 1 305147912 05 0337 + 021703 1256 25 07 1 305147912 06 0337 + 021704 1256 25 08 1 305147912 07 0337 + 021705 1256 26 01 1 305147912 08 0337 + 021706 1256 26 02 1 305147912 09 0337 + 021707 1256 26 03 1 305147912 10 0337 + 021708 1256 26 04 1 305147912 11 0337 + 021709 1256 26 05 1 305147912 12 0337 + 021710 1256 26 06 1 305147912 13 0337 + 021711 1256 26 07 1 305147912 14 0337 + 021712 1256 26 08 1 305147912 15 0337 + 021713 1256 27 01 1 305147908 00 0336 + 021714 1256 27 02 1 305147908 01 0336 + 021715 1256 27 03 1 305147908 02 0336 + 021716 1256 27 04 1 305147908 03 0336 + 021717 1256 27 05 1 305147908 04 0336 + 021718 1256 27 06 1 305147908 05 0336 + 021719 1256 27 07 1 305147908 06 0336 + 021720 1256 27 08 1 305147908 07 0336 + 021721 1256 28 01 1 305147908 08 0336 + 021722 1256 28 02 1 305147908 09 0336 + 021723 1256 28 03 1 305147908 10 0336 + 021724 1256 28 04 1 305147908 11 0336 + 021725 1256 28 05 1 305147908 12 0336 + 021726 1256 28 06 1 305147908 13 0336 + 021727 1256 28 07 1 305147908 14 0336 + 021728 1256 28 08 1 305147908 15 0336 + 021729 1256 29 01 1 305147920 00 0339 + 021730 1256 29 02 1 305147920 01 0339 + 021731 1256 29 03 1 305147920 02 0339 + 021732 1256 29 04 1 305147920 03 0339 + 021733 1256 29 05 1 305147920 04 0339 + 021734 1256 29 06 1 305147920 05 0339 + 021735 1256 29 07 1 305147920 06 0339 + 021736 1256 29 08 1 305147920 07 0339 + 021737 1256 30 01 1 305147920 08 0339 + 021738 1256 30 02 1 305147920 09 0339 + 021739 1256 30 03 1 305147920 10 0339 + 021740 1256 30 04 1 305147920 11 0339 + 021741 1256 30 05 1 305147920 12 0339 + 021742 1256 30 06 1 305147920 13 0339 + 021743 1256 30 07 1 305147920 14 0339 + 021744 1256 30 08 1 305147920 15 0339 + 021745 1256 31 01 1 305147916 00 0338 + 021746 1256 31 02 1 305147916 01 0338 + 021747 1256 31 03 1 305147916 02 0338 + 021748 1256 31 04 1 305147916 03 0338 + 021749 1256 31 05 1 305147916 04 0338 + 021750 1256 31 06 1 305147916 05 0338 + 021751 1256 31 07 1 305147916 06 0338 + 021752 1256 31 08 1 305147916 07 0338 + 021753 1256 32 01 1 305147916 08 0338 + 021754 1256 32 02 1 305147916 09 0338 + 021755 1256 32 03 1 305147916 10 0338 + 021756 1256 32 04 1 305147916 11 0338 + 021757 1256 32 05 1 305147916 12 0338 + 021758 1256 32 06 1 305147916 13 0338 + 021759 1256 32 07 1 305147916 14 0338 + 021760 1256 32 08 1 305147916 15 0338 + 021761 1256 33 01 1 306188300 00 0674 + 021762 1256 33 02 1 306188300 01 0674 + 021763 1256 33 03 1 306188300 02 0674 + 021764 1256 33 04 1 306188300 03 0674 + 021765 1256 33 05 1 306188300 04 0674 + 021766 1256 33 06 1 306188300 05 0674 + 021767 1256 33 07 1 306188300 06 0674 + 021768 1256 33 08 1 306188300 07 0674 + 021769 1256 34 01 1 306188300 08 0674 + 021770 1256 34 02 1 306188300 09 0674 + 021771 1256 34 03 1 306188300 10 0674 + 021772 1256 34 04 1 306188300 11 0674 + 021773 1256 34 05 1 306188300 12 0674 + 021774 1256 34 06 1 306188300 13 0674 + 021775 1256 34 07 1 306188300 14 0674 + 021776 1256 34 08 1 306188300 15 0674 + 021777 1256 35 01 1 306188304 00 0675 + 021778 1256 35 02 1 306188304 01 0675 + 021779 1256 35 03 1 306188304 02 0675 + 021780 1256 35 04 1 306188304 03 0675 + 021781 1256 35 05 1 306188304 04 0675 + 021782 1256 35 06 1 306188304 05 0675 + 021783 1256 35 07 1 306188304 06 0675 + 021784 1256 35 08 1 306188304 07 0675 + 021785 1256 36 01 1 306188304 08 0675 + 021786 1256 36 02 1 306188304 09 0675 + 021787 1256 36 03 1 306188304 10 0675 + 021788 1256 36 04 1 306188304 11 0675 + 021789 1256 36 05 1 306188304 12 0675 + 021790 1256 36 06 1 306188304 13 0675 + 021791 1256 36 07 1 306188304 14 0675 + 021792 1256 36 08 1 306188304 15 0675 + 021793 1256 37 01 1 306188292 00 0672 + 021794 1256 37 02 1 306188292 01 0672 + 021795 1256 37 03 1 306188292 02 0672 + 021796 1256 37 04 1 306188292 03 0672 + 021797 1256 37 05 1 306188292 04 0672 + 021798 1256 37 06 1 306188292 05 0672 + 021799 1256 37 07 1 306188292 06 0672 + 021800 1256 37 08 1 306188292 07 0672 + 021801 1256 38 01 1 306188292 08 0672 + 021802 1256 38 02 1 306188292 09 0672 + 021803 1256 38 03 1 306188292 10 0672 + 021804 1256 38 04 1 306188292 11 0672 + 021805 1256 38 05 1 306188292 12 0672 + 021806 1256 38 06 1 306188292 13 0672 + 021807 1256 38 07 1 306188292 14 0672 + 021808 1256 38 08 1 306188292 15 0672 + 021809 1256 39 01 1 306188296 00 0673 + 021810 1256 39 02 1 306188296 01 0673 + 021811 1256 39 03 1 306188296 02 0673 + 021812 1256 39 04 1 306188296 03 0673 + 021813 1256 39 05 1 306188296 04 0673 + 021814 1256 39 06 1 306188296 05 0673 + 021815 1256 39 07 1 306188296 06 0673 + 021816 1256 39 08 1 306188296 07 0673 + 021817 1256 40 01 1 306188296 08 0673 + 021818 1256 40 02 1 306188296 09 0673 + 021819 1256 40 03 1 306188296 10 0673 + 021820 1256 40 04 1 306188296 11 0673 + 021821 1256 40 05 1 306188296 12 0673 + 021822 1256 40 06 1 306188296 13 0673 + 021823 1256 40 07 1 306188296 14 0673 + 021824 1256 40 08 1 306188296 15 0673 + 021825 1256 41 01 1 304091140 08 0096 + 021826 1256 41 02 1 304091140 09 0096 + 021827 1256 41 03 1 304091140 10 0096 + 021828 1256 41 04 1 304091140 11 0096 + 021829 9999 99 99 0 9999 99 9999 + 021830 9999 99 99 0 9999 99 9999 + 021831 9999 99 99 0 9999 99 9999 + 021832 9999 99 99 0 9999 99 9999 + 021833 1256 42 01 1 304091140 12 0096 + 021834 1256 42 02 1 304091140 13 0096 + 021835 1256 42 03 1 304091140 14 0096 + 021836 1256 42 04 1 304091140 15 0096 + 021837 9999 99 99 0 9999 99 9999 + 021838 9999 99 99 0 9999 99 9999 + 021839 9999 99 99 0 9999 99 9999 + 021840 9999 99 99 0 9999 99 9999 + 021841 1256 43 01 1 304091140 00 0096 + 021842 1256 43 02 1 304091140 01 0096 + 021843 1256 43 03 1 304091140 02 0096 + 021844 1256 43 04 1 304091140 03 0096 + 021845 9999 99 99 0 9999 99 9999 + 021846 9999 99 99 0 9999 99 9999 + 021847 9999 99 99 0 9999 99 9999 + 021848 9999 99 99 0 9999 99 9999 + 021849 1256 44 01 1 304091140 04 0096 + 021850 1256 44 02 1 304091140 05 0096 + 021851 1256 44 03 1 304091140 06 0096 + 021852 1256 44 04 1 304091140 07 0096 + 021853 9999 99 99 0 9999 99 9999 + 021854 9999 99 99 0 9999 99 9999 + 021855 9999 99 99 0 9999 99 9999 + 021856 9999 99 99 0 9999 99 9999 + 021857 1256 45 01 1 304091144 08 0097 + 021858 1256 45 02 1 304091144 09 0097 + 021859 1256 45 03 1 304091144 10 0097 + 021860 1256 45 04 1 304091144 11 0097 + 021861 9999 99 99 0 9999 99 9999 + 021862 9999 99 99 0 9999 99 9999 + 021863 9999 99 99 0 9999 99 9999 + 021864 9999 99 99 0 9999 99 9999 + 021865 1256 46 01 1 304091144 12 0097 + 021866 1256 46 02 1 304091144 13 0097 + 021867 1256 46 03 1 304091144 14 0097 + 021868 1256 46 04 1 304091144 15 0097 + 021869 9999 99 99 0 9999 99 9999 + 021870 9999 99 99 0 9999 99 9999 + 021871 9999 99 99 0 9999 99 9999 + 021872 9999 99 99 0 9999 99 9999 + 021873 1256 47 01 1 304091144 00 0097 + 021874 1256 47 02 1 304091144 01 0097 + 021875 1256 47 03 1 304091144 02 0097 + 021876 1256 47 04 1 304091144 03 0097 + 021877 9999 99 99 0 9999 99 9999 + 021878 9999 99 99 0 9999 99 9999 + 021879 9999 99 99 0 9999 99 9999 + 021880 9999 99 99 0 9999 99 9999 + 021881 1256 48 01 1 304091144 04 0097 + 021882 1256 48 02 1 304091144 05 0097 + 021883 1256 48 03 1 304091144 06 0097 + 021884 1256 48 04 1 304091144 07 0097 + 021885 9999 99 99 0 9999 99 9999 + 021886 9999 99 99 0 9999 99 9999 + 021887 9999 99 99 0 9999 99 9999 + 021888 9999 99 99 0 9999 99 9999 + 021889 1257 01 01 1 305143816 00 0329 + 021890 1257 01 02 1 305143816 01 0329 + 021891 1257 01 03 1 305143816 02 0329 + 021892 1257 01 04 1 305143816 03 0329 + 021893 1257 01 05 1 305143816 04 0329 + 021894 1257 01 06 1 305143816 05 0329 + 021895 1257 01 07 1 305143816 06 0329 + 021896 1257 01 08 1 305143816 07 0329 + 021897 1257 02 01 1 305143816 08 0329 + 021898 1257 02 02 1 305143816 09 0329 + 021899 1257 02 03 1 305143816 10 0329 + 021900 1257 02 04 1 305143816 11 0329 + 021901 1257 02 05 1 305143816 12 0329 + 021902 1257 02 06 1 305143816 13 0329 + 021903 1257 02 07 1 305143816 14 0329 + 021904 1257 02 08 1 305143816 15 0329 + 021905 1257 03 01 1 305143812 00 0328 + 021906 1257 03 02 1 305143812 01 0328 + 021907 1257 03 03 1 305143812 02 0328 + 021908 1257 03 04 1 305143812 03 0328 + 021909 1257 03 05 1 305143812 04 0328 + 021910 1257 03 06 1 305143812 05 0328 + 021911 1257 03 07 1 305143812 06 0328 + 021912 1257 03 08 1 305143812 07 0328 + 021913 1257 04 01 1 305143812 08 0328 + 021914 1257 04 02 1 305143812 09 0328 + 021915 1257 04 03 1 305143812 10 0328 + 021916 1257 04 04 1 305143812 11 0328 + 021917 1257 04 05 1 305143812 12 0328 + 021918 1257 04 06 1 305143812 13 0328 + 021919 1257 04 07 1 305143812 14 0328 + 021920 1257 04 08 1 305143812 15 0328 + 021921 1257 05 01 1 305143824 00 0331 + 021922 1257 05 02 1 305143824 01 0331 + 021923 1257 05 03 1 305143824 02 0331 + 021924 1257 05 04 1 305143824 03 0331 + 021925 1257 05 05 1 305143824 04 0331 + 021926 1257 05 06 1 305143824 05 0331 + 021927 1257 05 07 1 305143824 06 0331 + 021928 1257 05 08 1 305143824 07 0331 + 021929 1257 06 01 1 305143824 08 0331 + 021930 1257 06 02 1 305143824 09 0331 + 021931 1257 06 03 1 305143824 10 0331 + 021932 1257 06 04 1 305143824 11 0331 + 021933 1257 06 05 1 305143824 12 0331 + 021934 1257 06 06 1 305143824 13 0331 + 021935 1257 06 07 1 305143824 14 0331 + 021936 1257 06 08 1 305143824 15 0331 + 021937 1257 07 01 1 305143820 00 0330 + 021938 1257 07 02 1 305143820 01 0330 + 021939 1257 07 03 1 305143820 02 0330 + 021940 1257 07 04 1 305143820 03 0330 + 021941 1257 07 05 1 305143820 04 0330 + 021942 1257 07 06 1 305143820 05 0330 + 021943 1257 07 07 1 305143820 06 0330 + 021944 1257 07 08 1 305143820 07 0330 + 021945 1257 08 01 1 305143820 08 0330 + 021946 1257 08 02 1 305143820 09 0330 + 021947 1257 08 03 1 305143820 10 0330 + 021948 1257 08 04 1 305143820 11 0330 + 021949 1257 08 05 1 305143820 12 0330 + 021950 1257 08 06 1 305143820 13 0330 + 021951 1257 08 07 1 305143820 14 0330 + 021952 1257 08 08 1 305143820 15 0330 + 021953 1257 09 01 1 305139724 00 0322 + 021954 1257 09 02 1 305139724 01 0322 + 021955 1257 09 03 1 305139724 02 0322 + 021956 1257 09 04 1 305139724 03 0322 + 021957 1257 09 05 1 305139724 04 0322 + 021958 1257 09 06 1 305139724 05 0322 + 021959 1257 09 07 1 305139724 06 0322 + 021960 1257 09 08 1 305139724 07 0322 + 021961 1257 10 01 1 305139724 08 0322 + 021962 1257 10 02 1 305139724 09 0322 + 021963 1257 10 03 1 305139724 10 0322 + 021964 1257 10 04 1 305139724 11 0322 + 021965 1257 10 05 1 305139724 12 0322 + 021966 1257 10 06 1 305139724 13 0322 + 021967 1257 10 07 1 305139724 14 0322 + 021968 1257 10 08 1 305139724 15 0322 + 021969 1257 11 01 1 305139728 00 0323 + 021970 1257 11 02 1 305139728 01 0323 + 021971 1257 11 03 1 305139728 02 0323 + 021972 1257 11 04 1 305139728 03 0323 + 021973 1257 11 05 1 305139728 04 0323 + 021974 1257 11 06 1 305139728 05 0323 + 021975 1257 11 07 1 305139728 06 0323 + 021976 1257 11 08 1 305139728 07 0323 + 021977 1257 12 01 1 305139728 08 0323 + 021978 1257 12 02 1 305139728 09 0323 + 021979 1257 12 03 1 305139728 10 0323 + 021980 1257 12 04 1 305139728 11 0323 + 021981 1257 12 05 1 305139728 12 0323 + 021982 1257 12 06 1 305139728 13 0323 + 021983 1257 12 07 1 305139728 14 0323 + 021984 1257 12 08 1 305139728 15 0323 + 021985 1257 13 01 1 305139716 00 0320 + 021986 1257 13 02 1 305139716 01 0320 + 021987 1257 13 03 1 305139716 02 0320 + 021988 1257 13 04 1 305139716 03 0320 + 021989 1257 13 05 1 305139716 04 0320 + 021990 1257 13 06 1 305139716 05 0320 + 021991 1257 13 07 1 305139716 06 0320 + 021992 1257 13 08 1 305139716 07 0320 + 021993 1257 14 01 1 305139716 08 0320 + 021994 1257 14 02 1 305139716 09 0320 + 021995 1257 14 03 1 305139716 10 0320 + 021996 1257 14 04 1 305139716 11 0320 + 021997 1257 14 05 1 305139716 12 0320 + 021998 1257 14 06 1 305139716 13 0320 + 021999 1257 14 07 1 305139716 14 0320 + 022000 1257 14 08 1 305139716 15 0320 + 022001 1257 15 01 1 305139720 00 0321 + 022002 1257 15 02 1 305139720 01 0321 + 022003 1257 15 03 1 305139720 02 0321 + 022004 1257 15 04 1 305139720 03 0321 + 022005 1257 15 05 1 305139720 04 0321 + 022006 1257 15 06 1 305139720 05 0321 + 022007 1257 15 07 1 305139720 06 0321 + 022008 1257 15 08 1 305139720 07 0321 + 022009 1257 16 01 1 305139720 08 0321 + 022010 1257 16 02 1 305139720 09 0321 + 022011 1257 16 03 1 305139720 10 0321 + 022012 1257 16 04 1 305139720 11 0321 + 022013 1257 16 05 1 305139720 12 0321 + 022014 1257 16 06 1 305139720 13 0321 + 022015 1257 16 07 1 305139720 14 0321 + 022016 1257 16 08 1 305139720 15 0321 + 022017 9999 99 99 0 9999 99 9999 + 022018 9999 99 99 0 9999 99 9999 + 022019 9999 99 99 0 9999 99 9999 + 022020 9999 99 99 0 9999 99 9999 + 022021 9999 99 99 0 9999 99 9999 + 022022 9999 99 99 0 9999 99 9999 + 022023 9999 99 99 0 9999 99 9999 + 022024 9999 99 99 0 9999 99 9999 + 022025 9999 99 99 0 9999 99 9999 + 022026 9999 99 99 0 9999 99 9999 + 022027 9999 99 99 0 9999 99 9999 + 022028 9999 99 99 0 9999 99 9999 + 022029 9999 99 99 0 9999 99 9999 + 022030 9999 99 99 0 9999 99 9999 + 022031 9999 99 99 0 9999 99 9999 + 022032 9999 99 99 0 9999 99 9999 + 022033 9999 99 99 0 9999 99 9999 + 022034 9999 99 99 0 9999 99 9999 + 022035 9999 99 99 0 9999 99 9999 + 022036 9999 99 99 0 9999 99 9999 + 022037 9999 99 99 0 9999 99 9999 + 022038 9999 99 99 0 9999 99 9999 + 022039 9999 99 99 0 9999 99 9999 + 022040 9999 99 99 0 9999 99 9999 + 022041 9999 99 99 0 9999 99 9999 + 022042 9999 99 99 0 9999 99 9999 + 022043 9999 99 99 0 9999 99 9999 + 022044 9999 99 99 0 9999 99 9999 + 022045 9999 99 99 0 9999 99 9999 + 022046 9999 99 99 0 9999 99 9999 + 022047 9999 99 99 0 9999 99 9999 + 022048 9999 99 99 0 9999 99 9999 + 022049 9999 99 99 0 9999 99 9999 + 022050 9999 99 99 0 9999 99 9999 + 022051 9999 99 99 0 9999 99 9999 + 022052 9999 99 99 0 9999 99 9999 + 022053 9999 99 99 0 9999 99 9999 + 022054 9999 99 99 0 9999 99 9999 + 022055 9999 99 99 0 9999 99 9999 + 022056 9999 99 99 0 9999 99 9999 + 022057 9999 99 99 0 9999 99 9999 + 022058 9999 99 99 0 9999 99 9999 + 022059 9999 99 99 0 9999 99 9999 + 022060 9999 99 99 0 9999 99 9999 + 022061 9999 99 99 0 9999 99 9999 + 022062 9999 99 99 0 9999 99 9999 + 022063 9999 99 99 0 9999 99 9999 + 022064 9999 99 99 0 9999 99 9999 + 022065 9999 99 99 0 9999 99 9999 + 022066 9999 99 99 0 9999 99 9999 + 022067 9999 99 99 0 9999 99 9999 + 022068 9999 99 99 0 9999 99 9999 + 022069 9999 99 99 0 9999 99 9999 + 022070 9999 99 99 0 9999 99 9999 + 022071 9999 99 99 0 9999 99 9999 + 022072 9999 99 99 0 9999 99 9999 + 022073 9999 99 99 0 9999 99 9999 + 022074 9999 99 99 0 9999 99 9999 + 022075 9999 99 99 0 9999 99 9999 + 022076 9999 99 99 0 9999 99 9999 + 022077 9999 99 99 0 9999 99 9999 + 022078 9999 99 99 0 9999 99 9999 + 022079 9999 99 99 0 9999 99 9999 + 022080 9999 99 99 0 9999 99 9999 + 022081 9999 99 99 0 9999 99 9999 + 022082 9999 99 99 0 9999 99 9999 + 022083 9999 99 99 0 9999 99 9999 + 022084 9999 99 99 0 9999 99 9999 + 022085 9999 99 99 0 9999 99 9999 + 022086 9999 99 99 0 9999 99 9999 + 022087 9999 99 99 0 9999 99 9999 + 022088 9999 99 99 0 9999 99 9999 + 022089 9999 99 99 0 9999 99 9999 + 022090 9999 99 99 0 9999 99 9999 + 022091 9999 99 99 0 9999 99 9999 + 022092 9999 99 99 0 9999 99 9999 + 022093 9999 99 99 0 9999 99 9999 + 022094 9999 99 99 0 9999 99 9999 + 022095 9999 99 99 0 9999 99 9999 + 022096 9999 99 99 0 9999 99 9999 + 022097 9999 99 99 0 9999 99 9999 + 022098 9999 99 99 0 9999 99 9999 + 022099 9999 99 99 0 9999 99 9999 + 022100 9999 99 99 0 9999 99 9999 + 022101 9999 99 99 0 9999 99 9999 + 022102 9999 99 99 0 9999 99 9999 + 022103 9999 99 99 0 9999 99 9999 + 022104 9999 99 99 0 9999 99 9999 + 022105 9999 99 99 0 9999 99 9999 + 022106 9999 99 99 0 9999 99 9999 + 022107 9999 99 99 0 9999 99 9999 + 022108 9999 99 99 0 9999 99 9999 + 022109 9999 99 99 0 9999 99 9999 + 022110 9999 99 99 0 9999 99 9999 + 022111 9999 99 99 0 9999 99 9999 + 022112 9999 99 99 0 9999 99 9999 + 022113 9999 99 99 0 9999 99 9999 + 022114 9999 99 99 0 9999 99 9999 + 022115 9999 99 99 0 9999 99 9999 + 022116 9999 99 99 0 9999 99 9999 + 022117 9999 99 99 0 9999 99 9999 + 022118 9999 99 99 0 9999 99 9999 + 022119 9999 99 99 0 9999 99 9999 + 022120 9999 99 99 0 9999 99 9999 + 022121 9999 99 99 0 9999 99 9999 + 022122 9999 99 99 0 9999 99 9999 + 022123 9999 99 99 0 9999 99 9999 + 022124 9999 99 99 0 9999 99 9999 + 022125 9999 99 99 0 9999 99 9999 + 022126 9999 99 99 0 9999 99 9999 + 022127 9999 99 99 0 9999 99 9999 + 022128 9999 99 99 0 9999 99 9999 + 022129 9999 99 99 0 9999 99 9999 + 022130 9999 99 99 0 9999 99 9999 + 022131 9999 99 99 0 9999 99 9999 + 022132 9999 99 99 0 9999 99 9999 + 022133 9999 99 99 0 9999 99 9999 + 022134 9999 99 99 0 9999 99 9999 + 022135 9999 99 99 0 9999 99 9999 + 022136 9999 99 99 0 9999 99 9999 + 022137 9999 99 99 0 9999 99 9999 + 022138 9999 99 99 0 9999 99 9999 + 022139 9999 99 99 0 9999 99 9999 + 022140 9999 99 99 0 9999 99 9999 + 022141 9999 99 99 0 9999 99 9999 + 022142 9999 99 99 0 9999 99 9999 + 022143 9999 99 99 0 9999 99 9999 + 022144 9999 99 99 0 9999 99 9999 + 022145 9999 99 99 0 9999 99 9999 + 022146 9999 99 99 0 9999 99 9999 + 022147 9999 99 99 0 9999 99 9999 + 022148 9999 99 99 0 9999 99 9999 + 022149 9999 99 99 0 9999 99 9999 + 022150 9999 99 99 0 9999 99 9999 + 022151 9999 99 99 0 9999 99 9999 + 022152 9999 99 99 0 9999 99 9999 + 022153 9999 99 99 0 9999 99 9999 + 022154 9999 99 99 0 9999 99 9999 + 022155 9999 99 99 0 9999 99 9999 + 022156 9999 99 99 0 9999 99 9999 + 022157 9999 99 99 0 9999 99 9999 + 022158 9999 99 99 0 9999 99 9999 + 022159 9999 99 99 0 9999 99 9999 + 022160 9999 99 99 0 9999 99 9999 + 022161 9999 99 99 0 9999 99 9999 + 022162 9999 99 99 0 9999 99 9999 + 022163 9999 99 99 0 9999 99 9999 + 022164 9999 99 99 0 9999 99 9999 + 022165 9999 99 99 0 9999 99 9999 + 022166 9999 99 99 0 9999 99 9999 + 022167 9999 99 99 0 9999 99 9999 + 022168 9999 99 99 0 9999 99 9999 + 022169 9999 99 99 0 9999 99 9999 + 022170 9999 99 99 0 9999 99 9999 + 022171 9999 99 99 0 9999 99 9999 + 022172 9999 99 99 0 9999 99 9999 + 022173 9999 99 99 0 9999 99 9999 + 022174 9999 99 99 0 9999 99 9999 + 022175 9999 99 99 0 9999 99 9999 + 022176 9999 99 99 0 9999 99 9999 + 022177 9999 99 99 0 9999 99 9999 + 022178 9999 99 99 0 9999 99 9999 + 022179 9999 99 99 0 9999 99 9999 + 022180 9999 99 99 0 9999 99 9999 + 022181 9999 99 99 0 9999 99 9999 + 022182 9999 99 99 0 9999 99 9999 + 022183 9999 99 99 0 9999 99 9999 + 022184 9999 99 99 0 9999 99 9999 + 022185 9999 99 99 0 9999 99 9999 + 022186 9999 99 99 0 9999 99 9999 + 022187 9999 99 99 0 9999 99 9999 + 022188 9999 99 99 0 9999 99 9999 + 022189 9999 99 99 0 9999 99 9999 + 022190 9999 99 99 0 9999 99 9999 + 022191 9999 99 99 0 9999 99 9999 + 022192 9999 99 99 0 9999 99 9999 + 022193 9999 99 99 0 9999 99 9999 + 022194 9999 99 99 0 9999 99 9999 + 022195 9999 99 99 0 9999 99 9999 + 022196 9999 99 99 0 9999 99 9999 + 022197 9999 99 99 0 9999 99 9999 + 022198 9999 99 99 0 9999 99 9999 + 022199 9999 99 99 0 9999 99 9999 + 022200 9999 99 99 0 9999 99 9999 + 022201 9999 99 99 0 9999 99 9999 + 022202 9999 99 99 0 9999 99 9999 + 022203 9999 99 99 0 9999 99 9999 + 022204 9999 99 99 0 9999 99 9999 + 022205 9999 99 99 0 9999 99 9999 + 022206 9999 99 99 0 9999 99 9999 + 022207 9999 99 99 0 9999 99 9999 + 022208 9999 99 99 0 9999 99 9999 + 022209 9999 99 99 0 9999 99 9999 + 022210 9999 99 99 0 9999 99 9999 + 022211 9999 99 99 0 9999 99 9999 + 022212 9999 99 99 0 9999 99 9999 + 022213 9999 99 99 0 9999 99 9999 + 022214 9999 99 99 0 9999 99 9999 + 022215 9999 99 99 0 9999 99 9999 + 022216 9999 99 99 0 9999 99 9999 + 022217 9999 99 99 0 9999 99 9999 + 022218 9999 99 99 0 9999 99 9999 + 022219 9999 99 99 0 9999 99 9999 + 022220 9999 99 99 0 9999 99 9999 + 022221 9999 99 99 0 9999 99 9999 + 022222 9999 99 99 0 9999 99 9999 + 022223 9999 99 99 0 9999 99 9999 + 022224 9999 99 99 0 9999 99 9999 + 022225 9999 99 99 0 9999 99 9999 + 022226 9999 99 99 0 9999 99 9999 + 022227 9999 99 99 0 9999 99 9999 + 022228 9999 99 99 0 9999 99 9999 + 022229 9999 99 99 0 9999 99 9999 + 022230 9999 99 99 0 9999 99 9999 + 022231 9999 99 99 0 9999 99 9999 + 022232 9999 99 99 0 9999 99 9999 + 022233 9999 99 99 0 9999 99 9999 + 022234 9999 99 99 0 9999 99 9999 + 022235 9999 99 99 0 9999 99 9999 + 022236 9999 99 99 0 9999 99 9999 + 022237 9999 99 99 0 9999 99 9999 + 022238 9999 99 99 0 9999 99 9999 + 022239 9999 99 99 0 9999 99 9999 + 022240 9999 99 99 0 9999 99 9999 + 022241 9999 99 99 0 9999 99 9999 + 022242 9999 99 99 0 9999 99 9999 + 022243 9999 99 99 0 9999 99 9999 + 022244 9999 99 99 0 9999 99 9999 + 022245 9999 99 99 0 9999 99 9999 + 022246 9999 99 99 0 9999 99 9999 + 022247 9999 99 99 0 9999 99 9999 + 022248 9999 99 99 0 9999 99 9999 + 022249 9999 99 99 0 9999 99 9999 + 022250 9999 99 99 0 9999 99 9999 + 022251 9999 99 99 0 9999 99 9999 + 022252 9999 99 99 0 9999 99 9999 + 022253 9999 99 99 0 9999 99 9999 + 022254 9999 99 99 0 9999 99 9999 + 022255 9999 99 99 0 9999 99 9999 + 022256 9999 99 99 0 9999 99 9999 + 022257 9999 99 99 0 9999 99 9999 + 022258 9999 99 99 0 9999 99 9999 + 022259 9999 99 99 0 9999 99 9999 + 022260 9999 99 99 0 9999 99 9999 + 022261 9999 99 99 0 9999 99 9999 + 022262 9999 99 99 0 9999 99 9999 + 022263 9999 99 99 0 9999 99 9999 + 022264 9999 99 99 0 9999 99 9999 + 022265 9999 99 99 0 9999 99 9999 + 022266 9999 99 99 0 9999 99 9999 + 022267 9999 99 99 0 9999 99 9999 + 022268 9999 99 99 0 9999 99 9999 + 022269 9999 99 99 0 9999 99 9999 + 022270 9999 99 99 0 9999 99 9999 + 022271 9999 99 99 0 9999 99 9999 + 022272 9999 99 99 0 9999 99 9999 + 022273 9999 99 99 0 9999 99 9999 + 022274 9999 99 99 0 9999 99 9999 + 022275 9999 99 99 0 9999 99 9999 + 022276 9999 99 99 0 9999 99 9999 + 022277 9999 99 99 0 9999 99 9999 + 022278 9999 99 99 0 9999 99 9999 + 022279 9999 99 99 0 9999 99 9999 + 022280 9999 99 99 0 9999 99 9999 + 022281 9999 99 99 0 9999 99 9999 + 022282 9999 99 99 0 9999 99 9999 + 022283 9999 99 99 0 9999 99 9999 + 022284 9999 99 99 0 9999 99 9999 + 022285 9999 99 99 0 9999 99 9999 + 022286 9999 99 99 0 9999 99 9999 + 022287 9999 99 99 0 9999 99 9999 + 022288 9999 99 99 0 9999 99 9999 + 022289 9999 99 99 0 9999 99 9999 + 022290 9999 99 99 0 9999 99 9999 + 022291 9999 99 99 0 9999 99 9999 + 022292 9999 99 99 0 9999 99 9999 + 022293 9999 99 99 0 9999 99 9999 + 022294 9999 99 99 0 9999 99 9999 + 022295 9999 99 99 0 9999 99 9999 + 022296 9999 99 99 0 9999 99 9999 + 022297 9999 99 99 0 9999 99 9999 + 022298 9999 99 99 0 9999 99 9999 + 022299 9999 99 99 0 9999 99 9999 + 022300 9999 99 99 0 9999 99 9999 + 022301 9999 99 99 0 9999 99 9999 + 022302 9999 99 99 0 9999 99 9999 + 022303 9999 99 99 0 9999 99 9999 + 022304 9999 99 99 0 9999 99 9999 + 022305 9999 99 99 0 9999 99 9999 + 022306 9999 99 99 0 9999 99 9999 + 022307 9999 99 99 0 9999 99 9999 + 022308 9999 99 99 0 9999 99 9999 + 022309 9999 99 99 0 9999 99 9999 + 022310 9999 99 99 0 9999 99 9999 + 022311 9999 99 99 0 9999 99 9999 + 022312 9999 99 99 0 9999 99 9999 + 022313 9999 99 99 0 9999 99 9999 + 022314 9999 99 99 0 9999 99 9999 + 022315 9999 99 99 0 9999 99 9999 + 022316 9999 99 99 0 9999 99 9999 + 022317 9999 99 99 0 9999 99 9999 + 022318 9999 99 99 0 9999 99 9999 + 022319 9999 99 99 0 9999 99 9999 + 022320 9999 99 99 0 9999 99 9999 + 022321 9999 99 99 0 9999 99 9999 + 022322 9999 99 99 0 9999 99 9999 + 022323 9999 99 99 0 9999 99 9999 + 022324 9999 99 99 0 9999 99 9999 + 022325 9999 99 99 0 9999 99 9999 + 022326 9999 99 99 0 9999 99 9999 + 022327 9999 99 99 0 9999 99 9999 + 022328 9999 99 99 0 9999 99 9999 + 022329 9999 99 99 0 9999 99 9999 + 022330 9999 99 99 0 9999 99 9999 + 022331 9999 99 99 0 9999 99 9999 + 022332 9999 99 99 0 9999 99 9999 + 022333 9999 99 99 0 9999 99 9999 + 022334 9999 99 99 0 9999 99 9999 + 022335 9999 99 99 0 9999 99 9999 + 022336 9999 99 99 0 9999 99 9999 + 022337 9999 99 99 0 9999 99 9999 + 022338 9999 99 99 0 9999 99 9999 + 022339 9999 99 99 0 9999 99 9999 + 022340 9999 99 99 0 9999 99 9999 + 022341 9999 99 99 0 9999 99 9999 + 022342 9999 99 99 0 9999 99 9999 + 022343 9999 99 99 0 9999 99 9999 + 022344 9999 99 99 0 9999 99 9999 + 022345 9999 99 99 0 9999 99 9999 + 022346 9999 99 99 0 9999 99 9999 + 022347 9999 99 99 0 9999 99 9999 + 022348 9999 99 99 0 9999 99 9999 + 022349 9999 99 99 0 9999 99 9999 + 022350 9999 99 99 0 9999 99 9999 + 022351 9999 99 99 0 9999 99 9999 + 022352 9999 99 99 0 9999 99 9999 + 022353 9999 99 99 0 9999 99 9999 + 022354 9999 99 99 0 9999 99 9999 + 022355 9999 99 99 0 9999 99 9999 + 022356 9999 99 99 0 9999 99 9999 + 022357 9999 99 99 0 9999 99 9999 + 022358 9999 99 99 0 9999 99 9999 + 022359 9999 99 99 0 9999 99 9999 + 022360 9999 99 99 0 9999 99 9999 + 022361 9999 99 99 0 9999 99 9999 + 022362 9999 99 99 0 9999 99 9999 + 022363 9999 99 99 0 9999 99 9999 + 022364 9999 99 99 0 9999 99 9999 + 022365 9999 99 99 0 9999 99 9999 + 022366 9999 99 99 0 9999 99 9999 + 022367 9999 99 99 0 9999 99 9999 + 022368 9999 99 99 0 9999 99 9999 + 022369 9999 99 99 0 9999 99 9999 + 022370 9999 99 99 0 9999 99 9999 + 022371 9999 99 99 0 9999 99 9999 + 022372 9999 99 99 0 9999 99 9999 + 022373 9999 99 99 0 9999 99 9999 + 022374 9999 99 99 0 9999 99 9999 + 022375 9999 99 99 0 9999 99 9999 + 022376 9999 99 99 0 9999 99 9999 + 022377 9999 99 99 0 9999 99 9999 + 022378 9999 99 99 0 9999 99 9999 + 022379 9999 99 99 0 9999 99 9999 + 022380 9999 99 99 0 9999 99 9999 + 022381 9999 99 99 0 9999 99 9999 + 022382 9999 99 99 0 9999 99 9999 + 022383 9999 99 99 0 9999 99 9999 + 022384 9999 99 99 0 9999 99 9999 + 022385 9999 99 99 0 9999 99 9999 + 022386 9999 99 99 0 9999 99 9999 + 022387 9999 99 99 0 9999 99 9999 + 022388 9999 99 99 0 9999 99 9999 + 022389 9999 99 99 0 9999 99 9999 + 022390 9999 99 99 0 9999 99 9999 + 022391 9999 99 99 0 9999 99 9999 + 022392 9999 99 99 0 9999 99 9999 + 022393 9999 99 99 0 9999 99 9999 + 022394 9999 99 99 0 9999 99 9999 + 022395 9999 99 99 0 9999 99 9999 + 022396 9999 99 99 0 9999 99 9999 + 022397 9999 99 99 0 9999 99 9999 + 022398 9999 99 99 0 9999 99 9999 + 022399 9999 99 99 0 9999 99 9999 + 022400 9999 99 99 0 9999 99 9999 + 022401 9999 99 99 0 9999 99 9999 + 022402 9999 99 99 0 9999 99 9999 + 022403 9999 99 99 0 9999 99 9999 + 022404 9999 99 99 0 9999 99 9999 + 022405 9999 99 99 0 9999 99 9999 + 022406 9999 99 99 0 9999 99 9999 + 022407 9999 99 99 0 9999 99 9999 + 022408 9999 99 99 0 9999 99 9999 + 022409 9999 99 99 0 9999 99 9999 + 022410 9999 99 99 0 9999 99 9999 + 022411 9999 99 99 0 9999 99 9999 + 022412 9999 99 99 0 9999 99 9999 + 022413 9999 99 99 0 9999 99 9999 + 022414 9999 99 99 0 9999 99 9999 + 022415 9999 99 99 0 9999 99 9999 + 022416 9999 99 99 0 9999 99 9999 + 022417 9999 99 99 0 9999 99 9999 + 022418 9999 99 99 0 9999 99 9999 + 022419 9999 99 99 0 9999 99 9999 + 022420 9999 99 99 0 9999 99 9999 + 022421 9999 99 99 0 9999 99 9999 + 022422 9999 99 99 0 9999 99 9999 + 022423 9999 99 99 0 9999 99 9999 + 022424 9999 99 99 0 9999 99 9999 + 022425 9999 99 99 0 9999 99 9999 + 022426 9999 99 99 0 9999 99 9999 + 022427 9999 99 99 0 9999 99 9999 + 022428 9999 99 99 0 9999 99 9999 + 022429 9999 99 99 0 9999 99 9999 + 022430 9999 99 99 0 9999 99 9999 + 022431 9999 99 99 0 9999 99 9999 + 022432 9999 99 99 0 9999 99 9999 + 022433 9999 99 99 0 9999 99 9999 + 022434 9999 99 99 0 9999 99 9999 + 022435 9999 99 99 0 9999 99 9999 + 022436 9999 99 99 0 9999 99 9999 + 022437 9999 99 99 0 9999 99 9999 + 022438 9999 99 99 0 9999 99 9999 + 022439 9999 99 99 0 9999 99 9999 + 022440 9999 99 99 0 9999 99 9999 + 022441 9999 99 99 0 9999 99 9999 + 022442 9999 99 99 0 9999 99 9999 + 022443 9999 99 99 0 9999 99 9999 + 022444 9999 99 99 0 9999 99 9999 + 022445 9999 99 99 0 9999 99 9999 + 022446 9999 99 99 0 9999 99 9999 + 022447 9999 99 99 0 9999 99 9999 + 022448 9999 99 99 0 9999 99 9999 + 022449 9999 99 99 0 9999 99 9999 + 022450 9999 99 99 0 9999 99 9999 + 022451 9999 99 99 0 9999 99 9999 + 022452 9999 99 99 0 9999 99 9999 + 022453 9999 99 99 0 9999 99 9999 + 022454 9999 99 99 0 9999 99 9999 + 022455 9999 99 99 0 9999 99 9999 + 022456 9999 99 99 0 9999 99 9999 + 022457 9999 99 99 0 9999 99 9999 + 022458 9999 99 99 0 9999 99 9999 + 022459 9999 99 99 0 9999 99 9999 + 022460 9999 99 99 0 9999 99 9999 + 022461 9999 99 99 0 9999 99 9999 + 022462 9999 99 99 0 9999 99 9999 + 022463 9999 99 99 0 9999 99 9999 + 022464 9999 99 99 0 9999 99 9999 + 022465 9999 99 99 0 9999 99 9999 + 022466 9999 99 99 0 9999 99 9999 + 022467 9999 99 99 0 9999 99 9999 + 022468 9999 99 99 0 9999 99 9999 + 022469 9999 99 99 0 9999 99 9999 + 022470 9999 99 99 0 9999 99 9999 + 022471 9999 99 99 0 9999 99 9999 + 022472 9999 99 99 0 9999 99 9999 + 022473 9999 99 99 0 9999 99 9999 + 022474 9999 99 99 0 9999 99 9999 + 022475 9999 99 99 0 9999 99 9999 + 022476 9999 99 99 0 9999 99 9999 + 022477 9999 99 99 0 9999 99 9999 + 022478 9999 99 99 0 9999 99 9999 + 022479 9999 99 99 0 9999 99 9999 + 022480 9999 99 99 0 9999 99 9999 + 022481 9999 99 99 0 9999 99 9999 + 022482 9999 99 99 0 9999 99 9999 + 022483 9999 99 99 0 9999 99 9999 + 022484 9999 99 99 0 9999 99 9999 + 022485 9999 99 99 0 9999 99 9999 + 022486 9999 99 99 0 9999 99 9999 + 022487 9999 99 99 0 9999 99 9999 + 022488 9999 99 99 0 9999 99 9999 + 022489 9999 99 99 0 9999 99 9999 + 022490 9999 99 99 0 9999 99 9999 + 022491 9999 99 99 0 9999 99 9999 + 022492 9999 99 99 0 9999 99 9999 + 022493 9999 99 99 0 9999 99 9999 + 022494 9999 99 99 0 9999 99 9999 + 022495 9999 99 99 0 9999 99 9999 + 022496 9999 99 99 0 9999 99 9999 + 022497 9999 99 99 0 9999 99 9999 + 022498 9999 99 99 0 9999 99 9999 + 022499 9999 99 99 0 9999 99 9999 + 022500 9999 99 99 0 9999 99 9999 + 022501 9999 99 99 0 9999 99 9999 + 022502 9999 99 99 0 9999 99 9999 + 022503 9999 99 99 0 9999 99 9999 + 022504 9999 99 99 0 9999 99 9999 + 022505 9999 99 99 0 9999 99 9999 + 022506 9999 99 99 0 9999 99 9999 + 022507 9999 99 99 0 9999 99 9999 + 022508 9999 99 99 0 9999 99 9999 + 022509 9999 99 99 0 9999 99 9999 + 022510 9999 99 99 0 9999 99 9999 + 022511 9999 99 99 0 9999 99 9999 + 022512 9999 99 99 0 9999 99 9999 + 022513 9999 99 99 0 9999 99 9999 + 022514 9999 99 99 0 9999 99 9999 + 022515 9999 99 99 0 9999 99 9999 + 022516 9999 99 99 0 9999 99 9999 + 022517 9999 99 99 0 9999 99 9999 + 022518 9999 99 99 0 9999 99 9999 + 022519 9999 99 99 0 9999 99 9999 + 022520 9999 99 99 0 9999 99 9999 + 022521 9999 99 99 0 9999 99 9999 + 022522 9999 99 99 0 9999 99 9999 + 022523 9999 99 99 0 9999 99 9999 + 022524 9999 99 99 0 9999 99 9999 + 022525 9999 99 99 0 9999 99 9999 + 022526 9999 99 99 0 9999 99 9999 + 022527 9999 99 99 0 9999 99 9999 + 022528 9999 99 99 0 9999 99 9999 + 022529 9999 99 99 0 9999 99 9999 + 022530 9999 99 99 0 9999 99 9999 + 022531 9999 99 99 0 9999 99 9999 + 022532 9999 99 99 0 9999 99 9999 + 022533 9999 99 99 0 9999 99 9999 + 022534 9999 99 99 0 9999 99 9999 + 022535 9999 99 99 0 9999 99 9999 + 022536 9999 99 99 0 9999 99 9999 + 022537 9999 99 99 0 9999 99 9999 + 022538 9999 99 99 0 9999 99 9999 + 022539 9999 99 99 0 9999 99 9999 + 022540 9999 99 99 0 9999 99 9999 + 022541 9999 99 99 0 9999 99 9999 + 022542 9999 99 99 0 9999 99 9999 + 022543 9999 99 99 0 9999 99 9999 + 022544 9999 99 99 0 9999 99 9999 + 022545 9999 99 99 0 9999 99 9999 + 022546 9999 99 99 0 9999 99 9999 + 022547 9999 99 99 0 9999 99 9999 + 022548 9999 99 99 0 9999 99 9999 + 022549 9999 99 99 0 9999 99 9999 + 022550 9999 99 99 0 9999 99 9999 + 022551 9999 99 99 0 9999 99 9999 + 022552 9999 99 99 0 9999 99 9999 + 022553 9999 99 99 0 9999 99 9999 + 022554 9999 99 99 0 9999 99 9999 + 022555 9999 99 99 0 9999 99 9999 + 022556 9999 99 99 0 9999 99 9999 + 022557 9999 99 99 0 9999 99 9999 + 022558 9999 99 99 0 9999 99 9999 + 022559 9999 99 99 0 9999 99 9999 + 022560 9999 99 99 0 9999 99 9999 + 022561 9999 99 99 0 9999 99 9999 + 022562 9999 99 99 0 9999 99 9999 + 022563 9999 99 99 0 9999 99 9999 + 022564 9999 99 99 0 9999 99 9999 + 022565 9999 99 99 0 9999 99 9999 + 022566 9999 99 99 0 9999 99 9999 + 022567 9999 99 99 0 9999 99 9999 + 022568 9999 99 99 0 9999 99 9999 + 022569 9999 99 99 0 9999 99 9999 + 022570 9999 99 99 0 9999 99 9999 + 022571 9999 99 99 0 9999 99 9999 + 022572 9999 99 99 0 9999 99 9999 + 022573 9999 99 99 0 9999 99 9999 + 022574 9999 99 99 0 9999 99 9999 + 022575 9999 99 99 0 9999 99 9999 + 022576 9999 99 99 0 9999 99 9999 + 022577 9999 99 99 0 9999 99 9999 + 022578 9999 99 99 0 9999 99 9999 + 022579 9999 99 99 0 9999 99 9999 + 022580 9999 99 99 0 9999 99 9999 + 022581 9999 99 99 0 9999 99 9999 + 022582 9999 99 99 0 9999 99 9999 + 022583 9999 99 99 0 9999 99 9999 + 022584 9999 99 99 0 9999 99 9999 + 022585 9999 99 99 0 9999 99 9999 + 022586 9999 99 99 0 9999 99 9999 + 022587 9999 99 99 0 9999 99 9999 + 022588 9999 99 99 0 9999 99 9999 + 022589 9999 99 99 0 9999 99 9999 + 022590 9999 99 99 0 9999 99 9999 + 022591 9999 99 99 0 9999 99 9999 + 022592 9999 99 99 0 9999 99 9999 + 022593 9999 99 99 0 9999 99 9999 + 022594 9999 99 99 0 9999 99 9999 + 022595 9999 99 99 0 9999 99 9999 + 022596 9999 99 99 0 9999 99 9999 + 022597 9999 99 99 0 9999 99 9999 + 022598 9999 99 99 0 9999 99 9999 + 022599 9999 99 99 0 9999 99 9999 + 022600 9999 99 99 0 9999 99 9999 + 022601 9999 99 99 0 9999 99 9999 + 022602 9999 99 99 0 9999 99 9999 + 022603 9999 99 99 0 9999 99 9999 + 022604 9999 99 99 0 9999 99 9999 + 022605 9999 99 99 0 9999 99 9999 + 022606 9999 99 99 0 9999 99 9999 + 022607 9999 99 99 0 9999 99 9999 + 022608 9999 99 99 0 9999 99 9999 + 022609 9999 99 99 0 9999 99 9999 + 022610 9999 99 99 0 9999 99 9999 + 022611 9999 99 99 0 9999 99 9999 + 022612 9999 99 99 0 9999 99 9999 + 022613 9999 99 99 0 9999 99 9999 + 022614 9999 99 99 0 9999 99 9999 + 022615 9999 99 99 0 9999 99 9999 + 022616 9999 99 99 0 9999 99 9999 + 022617 9999 99 99 0 9999 99 9999 + 022618 9999 99 99 0 9999 99 9999 + 022619 9999 99 99 0 9999 99 9999 + 022620 9999 99 99 0 9999 99 9999 + 022621 9999 99 99 0 9999 99 9999 + 022622 9999 99 99 0 9999 99 9999 + 022623 9999 99 99 0 9999 99 9999 + 022624 9999 99 99 0 9999 99 9999 + 022625 9999 99 99 0 9999 99 9999 + 022626 9999 99 99 0 9999 99 9999 + 022627 9999 99 99 0 9999 99 9999 + 022628 9999 99 99 0 9999 99 9999 + 022629 9999 99 99 0 9999 99 9999 + 022630 9999 99 99 0 9999 99 9999 + 022631 9999 99 99 0 9999 99 9999 + 022632 9999 99 99 0 9999 99 9999 + 022633 9999 99 99 0 9999 99 9999 + 022634 9999 99 99 0 9999 99 9999 + 022635 9999 99 99 0 9999 99 9999 + 022636 9999 99 99 0 9999 99 9999 + 022637 9999 99 99 0 9999 99 9999 + 022638 9999 99 99 0 9999 99 9999 + 022639 9999 99 99 0 9999 99 9999 + 022640 9999 99 99 0 9999 99 9999 + 022641 9999 99 99 0 9999 99 9999 + 022642 9999 99 99 0 9999 99 9999 + 022643 9999 99 99 0 9999 99 9999 + 022644 9999 99 99 0 9999 99 9999 + 022645 9999 99 99 0 9999 99 9999 + 022646 9999 99 99 0 9999 99 9999 + 022647 9999 99 99 0 9999 99 9999 + 022648 9999 99 99 0 9999 99 9999 + 022649 9999 99 99 0 9999 99 9999 + 022650 9999 99 99 0 9999 99 9999 + 022651 9999 99 99 0 9999 99 9999 + 022652 9999 99 99 0 9999 99 9999 + 022653 9999 99 99 0 9999 99 9999 + 022654 9999 99 99 0 9999 99 9999 + 022655 9999 99 99 0 9999 99 9999 + 022656 9999 99 99 0 9999 99 9999 + 022657 9999 99 99 0 9999 99 9999 + 022658 9999 99 99 0 9999 99 9999 + 022659 9999 99 99 0 9999 99 9999 + 022660 9999 99 99 0 9999 99 9999 + 022661 9999 99 99 0 9999 99 9999 + 022662 9999 99 99 0 9999 99 9999 + 022663 9999 99 99 0 9999 99 9999 + 022664 9999 99 99 0 9999 99 9999 + 022665 9999 99 99 0 9999 99 9999 + 022666 9999 99 99 0 9999 99 9999 + 022667 9999 99 99 0 9999 99 9999 + 022668 9999 99 99 0 9999 99 9999 + 022669 9999 99 99 0 9999 99 9999 + 022670 9999 99 99 0 9999 99 9999 + 022671 9999 99 99 0 9999 99 9999 + 022672 9999 99 99 0 9999 99 9999 + 022673 9999 99 99 0 9999 99 9999 + 022674 9999 99 99 0 9999 99 9999 + 022675 9999 99 99 0 9999 99 9999 + 022676 9999 99 99 0 9999 99 9999 + 022677 9999 99 99 0 9999 99 9999 + 022678 9999 99 99 0 9999 99 9999 + 022679 9999 99 99 0 9999 99 9999 + 022680 9999 99 99 0 9999 99 9999 + 022681 9999 99 99 0 9999 99 9999 + 022682 9999 99 99 0 9999 99 9999 + 022683 9999 99 99 0 9999 99 9999 + 022684 9999 99 99 0 9999 99 9999 + 022685 9999 99 99 0 9999 99 9999 + 022686 9999 99 99 0 9999 99 9999 + 022687 9999 99 99 0 9999 99 9999 + 022688 9999 99 99 0 9999 99 9999 + 022689 9999 99 99 0 9999 99 9999 + 022690 9999 99 99 0 9999 99 9999 + 022691 9999 99 99 0 9999 99 9999 + 022692 9999 99 99 0 9999 99 9999 + 022693 9999 99 99 0 9999 99 9999 + 022694 9999 99 99 0 9999 99 9999 + 022695 9999 99 99 0 9999 99 9999 + 022696 9999 99 99 0 9999 99 9999 + 022697 9999 99 99 0 9999 99 9999 + 022698 9999 99 99 0 9999 99 9999 + 022699 9999 99 99 0 9999 99 9999 + 022700 9999 99 99 0 9999 99 9999 + 022701 9999 99 99 0 9999 99 9999 + 022702 9999 99 99 0 9999 99 9999 + 022703 9999 99 99 0 9999 99 9999 + 022704 9999 99 99 0 9999 99 9999 + 022705 9999 99 99 0 9999 99 9999 + 022706 9999 99 99 0 9999 99 9999 + 022707 9999 99 99 0 9999 99 9999 + 022708 9999 99 99 0 9999 99 9999 + 022709 9999 99 99 0 9999 99 9999 + 022710 9999 99 99 0 9999 99 9999 + 022711 9999 99 99 0 9999 99 9999 + 022712 9999 99 99 0 9999 99 9999 + 022713 9999 99 99 0 9999 99 9999 + 022714 9999 99 99 0 9999 99 9999 + 022715 9999 99 99 0 9999 99 9999 + 022716 9999 99 99 0 9999 99 9999 + 022717 9999 99 99 0 9999 99 9999 + 022718 9999 99 99 0 9999 99 9999 + 022719 9999 99 99 0 9999 99 9999 + 022720 9999 99 99 0 9999 99 9999 + 022721 9999 99 99 0 9999 99 9999 + 022722 9999 99 99 0 9999 99 9999 + 022723 9999 99 99 0 9999 99 9999 + 022724 9999 99 99 0 9999 99 9999 + 022725 9999 99 99 0 9999 99 9999 + 022726 9999 99 99 0 9999 99 9999 + 022727 9999 99 99 0 9999 99 9999 + 022728 9999 99 99 0 9999 99 9999 + 022729 9999 99 99 0 9999 99 9999 + 022730 9999 99 99 0 9999 99 9999 + 022731 9999 99 99 0 9999 99 9999 + 022732 9999 99 99 0 9999 99 9999 + 022733 9999 99 99 0 9999 99 9999 + 022734 9999 99 99 0 9999 99 9999 + 022735 9999 99 99 0 9999 99 9999 + 022736 9999 99 99 0 9999 99 9999 + 022737 9999 99 99 0 9999 99 9999 + 022738 9999 99 99 0 9999 99 9999 + 022739 9999 99 99 0 9999 99 9999 + 022740 9999 99 99 0 9999 99 9999 + 022741 9999 99 99 0 9999 99 9999 + 022742 9999 99 99 0 9999 99 9999 + 022743 9999 99 99 0 9999 99 9999 + 022744 9999 99 99 0 9999 99 9999 + 022745 9999 99 99 0 9999 99 9999 + 022746 9999 99 99 0 9999 99 9999 + 022747 9999 99 99 0 9999 99 9999 + 022748 9999 99 99 0 9999 99 9999 + 022749 9999 99 99 0 9999 99 9999 + 022750 9999 99 99 0 9999 99 9999 + 022751 9999 99 99 0 9999 99 9999 + 022752 9999 99 99 0 9999 99 9999 + 022753 9999 99 99 0 9999 99 9999 + 022754 9999 99 99 0 9999 99 9999 + 022755 9999 99 99 0 9999 99 9999 + 022756 9999 99 99 0 9999 99 9999 + 022757 9999 99 99 0 9999 99 9999 + 022758 9999 99 99 0 9999 99 9999 + 022759 9999 99 99 0 9999 99 9999 + 022760 9999 99 99 0 9999 99 9999 + 022761 9999 99 99 0 9999 99 9999 + 022762 9999 99 99 0 9999 99 9999 + 022763 9999 99 99 0 9999 99 9999 + 022764 9999 99 99 0 9999 99 9999 + 022765 9999 99 99 0 9999 99 9999 + 022766 9999 99 99 0 9999 99 9999 + 022767 9999 99 99 0 9999 99 9999 + 022768 9999 99 99 0 9999 99 9999 + 022769 9999 99 99 0 9999 99 9999 + 022770 9999 99 99 0 9999 99 9999 + 022771 9999 99 99 0 9999 99 9999 + 022772 9999 99 99 0 9999 99 9999 + 022773 9999 99 99 0 9999 99 9999 + 022774 9999 99 99 0 9999 99 9999 + 022775 9999 99 99 0 9999 99 9999 + 022776 9999 99 99 0 9999 99 9999 + 022777 9999 99 99 0 9999 99 9999 + 022778 9999 99 99 0 9999 99 9999 + 022779 9999 99 99 0 9999 99 9999 + 022780 9999 99 99 0 9999 99 9999 + 022781 9999 99 99 0 9999 99 9999 + 022782 9999 99 99 0 9999 99 9999 + 022783 9999 99 99 0 9999 99 9999 + 022784 9999 99 99 0 9999 99 9999 + 022785 9999 99 99 0 9999 99 9999 + 022786 9999 99 99 0 9999 99 9999 + 022787 9999 99 99 0 9999 99 9999 + 022788 9999 99 99 0 9999 99 9999 + 022789 9999 99 99 0 9999 99 9999 + 022790 9999 99 99 0 9999 99 9999 + 022791 9999 99 99 0 9999 99 9999 + 022792 9999 99 99 0 9999 99 9999 + 022793 9999 99 99 0 9999 99 9999 + 022794 9999 99 99 0 9999 99 9999 + 022795 9999 99 99 0 9999 99 9999 + 022796 9999 99 99 0 9999 99 9999 + 022797 9999 99 99 0 9999 99 9999 + 022798 9999 99 99 0 9999 99 9999 + 022799 9999 99 99 0 9999 99 9999 + 022800 9999 99 99 0 9999 99 9999 + 022801 9999 99 99 0 9999 99 9999 + 022802 9999 99 99 0 9999 99 9999 + 022803 9999 99 99 0 9999 99 9999 + 022804 9999 99 99 0 9999 99 9999 + 022805 9999 99 99 0 9999 99 9999 + 022806 9999 99 99 0 9999 99 9999 + 022807 9999 99 99 0 9999 99 9999 + 022808 9999 99 99 0 9999 99 9999 + 022809 9999 99 99 0 9999 99 9999 + 022810 9999 99 99 0 9999 99 9999 + 022811 9999 99 99 0 9999 99 9999 + 022812 9999 99 99 0 9999 99 9999 + 022813 9999 99 99 0 9999 99 9999 + 022814 9999 99 99 0 9999 99 9999 + 022815 9999 99 99 0 9999 99 9999 + 022816 9999 99 99 0 9999 99 9999 + 022817 9999 99 99 0 9999 99 9999 + 022818 9999 99 99 0 9999 99 9999 + 022819 9999 99 99 0 9999 99 9999 + 022820 9999 99 99 0 9999 99 9999 + 022821 9999 99 99 0 9999 99 9999 + 022822 9999 99 99 0 9999 99 9999 + 022823 9999 99 99 0 9999 99 9999 + 022824 9999 99 99 0 9999 99 9999 + 022825 9999 99 99 0 9999 99 9999 + 022826 9999 99 99 0 9999 99 9999 + 022827 9999 99 99 0 9999 99 9999 + 022828 9999 99 99 0 9999 99 9999 + 022829 9999 99 99 0 9999 99 9999 + 022830 9999 99 99 0 9999 99 9999 + 022831 9999 99 99 0 9999 99 9999 + 022832 9999 99 99 0 9999 99 9999 + 022833 9999 99 99 0 9999 99 9999 + 022834 9999 99 99 0 9999 99 9999 + 022835 9999 99 99 0 9999 99 9999 + 022836 9999 99 99 0 9999 99 9999 + 022837 9999 99 99 0 9999 99 9999 + 022838 9999 99 99 0 9999 99 9999 + 022839 9999 99 99 0 9999 99 9999 + 022840 9999 99 99 0 9999 99 9999 + 022841 9999 99 99 0 9999 99 9999 + 022842 9999 99 99 0 9999 99 9999 + 022843 9999 99 99 0 9999 99 9999 + 022844 9999 99 99 0 9999 99 9999 + 022845 9999 99 99 0 9999 99 9999 + 022846 9999 99 99 0 9999 99 9999 + 022847 9999 99 99 0 9999 99 9999 + 022848 9999 99 99 0 9999 99 9999 + 022849 9999 99 99 0 9999 99 9999 + 022850 9999 99 99 0 9999 99 9999 + 022851 9999 99 99 0 9999 99 9999 + 022852 9999 99 99 0 9999 99 9999 + 022853 9999 99 99 0 9999 99 9999 + 022854 9999 99 99 0 9999 99 9999 + 022855 9999 99 99 0 9999 99 9999 + 022856 9999 99 99 0 9999 99 9999 + 022857 9999 99 99 0 9999 99 9999 + 022858 9999 99 99 0 9999 99 9999 + 022859 9999 99 99 0 9999 99 9999 + 022860 9999 99 99 0 9999 99 9999 + 022861 9999 99 99 0 9999 99 9999 + 022862 9999 99 99 0 9999 99 9999 + 022863 9999 99 99 0 9999 99 9999 + 022864 9999 99 99 0 9999 99 9999 + 022865 9999 99 99 0 9999 99 9999 + 022866 9999 99 99 0 9999 99 9999 + 022867 9999 99 99 0 9999 99 9999 + 022868 9999 99 99 0 9999 99 9999 + 022869 9999 99 99 0 9999 99 9999 + 022870 9999 99 99 0 9999 99 9999 + 022871 9999 99 99 0 9999 99 9999 + 022872 9999 99 99 0 9999 99 9999 + 022873 9999 99 99 0 9999 99 9999 + 022874 9999 99 99 0 9999 99 9999 + 022875 9999 99 99 0 9999 99 9999 + 022876 9999 99 99 0 9999 99 9999 + 022877 9999 99 99 0 9999 99 9999 + 022878 9999 99 99 0 9999 99 9999 + 022879 9999 99 99 0 9999 99 9999 + 022880 9999 99 99 0 9999 99 9999 + 022881 9999 99 99 0 9999 99 9999 + 022882 9999 99 99 0 9999 99 9999 + 022883 9999 99 99 0 9999 99 9999 + 022884 9999 99 99 0 9999 99 9999 + 022885 9999 99 99 0 9999 99 9999 + 022886 9999 99 99 0 9999 99 9999 + 022887 9999 99 99 0 9999 99 9999 + 022888 9999 99 99 0 9999 99 9999 + 022889 9999 99 99 0 9999 99 9999 + 022890 9999 99 99 0 9999 99 9999 + 022891 9999 99 99 0 9999 99 9999 + 022892 9999 99 99 0 9999 99 9999 + 022893 9999 99 99 0 9999 99 9999 + 022894 9999 99 99 0 9999 99 9999 + 022895 9999 99 99 0 9999 99 9999 + 022896 9999 99 99 0 9999 99 9999 + 022897 9999 99 99 0 9999 99 9999 + 022898 9999 99 99 0 9999 99 9999 + 022899 9999 99 99 0 9999 99 9999 + 022900 9999 99 99 0 9999 99 9999 + 022901 9999 99 99 0 9999 99 9999 + 022902 9999 99 99 0 9999 99 9999 + 022903 9999 99 99 0 9999 99 9999 + 022904 9999 99 99 0 9999 99 9999 + 022905 9999 99 99 0 9999 99 9999 + 022906 9999 99 99 0 9999 99 9999 + 022907 9999 99 99 0 9999 99 9999 + 022908 9999 99 99 0 9999 99 9999 + 022909 9999 99 99 0 9999 99 9999 + 022910 9999 99 99 0 9999 99 9999 + 022911 9999 99 99 0 9999 99 9999 + 022912 9999 99 99 0 9999 99 9999 + 022913 9999 99 99 0 9999 99 9999 + 022914 9999 99 99 0 9999 99 9999 + 022915 9999 99 99 0 9999 99 9999 + 022916 9999 99 99 0 9999 99 9999 + 022917 9999 99 99 0 9999 99 9999 + 022918 9999 99 99 0 9999 99 9999 + 022919 9999 99 99 0 9999 99 9999 + 022920 9999 99 99 0 9999 99 9999 + 022921 9999 99 99 0 9999 99 9999 + 022922 9999 99 99 0 9999 99 9999 + 022923 9999 99 99 0 9999 99 9999 + 022924 9999 99 99 0 9999 99 9999 + 022925 9999 99 99 0 9999 99 9999 + 022926 9999 99 99 0 9999 99 9999 + 022927 9999 99 99 0 9999 99 9999 + 022928 9999 99 99 0 9999 99 9999 + 022929 9999 99 99 0 9999 99 9999 + 022930 9999 99 99 0 9999 99 9999 + 022931 9999 99 99 0 9999 99 9999 + 022932 9999 99 99 0 9999 99 9999 + 022933 9999 99 99 0 9999 99 9999 + 022934 9999 99 99 0 9999 99 9999 + 022935 9999 99 99 0 9999 99 9999 + 022936 9999 99 99 0 9999 99 9999 + 022937 9999 99 99 0 9999 99 9999 + 022938 9999 99 99 0 9999 99 9999 + 022939 9999 99 99 0 9999 99 9999 + 022940 9999 99 99 0 9999 99 9999 + 022941 9999 99 99 0 9999 99 9999 + 022942 9999 99 99 0 9999 99 9999 + 022943 9999 99 99 0 9999 99 9999 + 022944 9999 99 99 0 9999 99 9999 + 022945 9999 99 99 0 9999 99 9999 + 022946 9999 99 99 0 9999 99 9999 + 022947 9999 99 99 0 9999 99 9999 + 022948 9999 99 99 0 9999 99 9999 + 022949 9999 99 99 0 9999 99 9999 + 022950 9999 99 99 0 9999 99 9999 + 022951 9999 99 99 0 9999 99 9999 + 022952 9999 99 99 0 9999 99 9999 + 022953 9999 99 99 0 9999 99 9999 + 022954 9999 99 99 0 9999 99 9999 + 022955 9999 99 99 0 9999 99 9999 + 022956 9999 99 99 0 9999 99 9999 + 022957 9999 99 99 0 9999 99 9999 + 022958 9999 99 99 0 9999 99 9999 + 022959 9999 99 99 0 9999 99 9999 + 022960 9999 99 99 0 9999 99 9999 + 022961 9999 99 99 0 9999 99 9999 + 022962 9999 99 99 0 9999 99 9999 + 022963 9999 99 99 0 9999 99 9999 + 022964 9999 99 99 0 9999 99 9999 + 022965 9999 99 99 0 9999 99 9999 + 022966 9999 99 99 0 9999 99 9999 + 022967 9999 99 99 0 9999 99 9999 + 022968 9999 99 99 0 9999 99 9999 + 022969 9999 99 99 0 9999 99 9999 + 022970 9999 99 99 0 9999 99 9999 + 022971 9999 99 99 0 9999 99 9999 + 022972 9999 99 99 0 9999 99 9999 + 022973 9999 99 99 0 9999 99 9999 + 022974 9999 99 99 0 9999 99 9999 + 022975 9999 99 99 0 9999 99 9999 + 022976 9999 99 99 0 9999 99 9999 + 022977 9999 99 99 0 9999 99 9999 + 022978 9999 99 99 0 9999 99 9999 + 022979 9999 99 99 0 9999 99 9999 + 022980 9999 99 99 0 9999 99 9999 + 022981 9999 99 99 0 9999 99 9999 + 022982 9999 99 99 0 9999 99 9999 + 022983 9999 99 99 0 9999 99 9999 + 022984 9999 99 99 0 9999 99 9999 + 022985 9999 99 99 0 9999 99 9999 + 022986 9999 99 99 0 9999 99 9999 + 022987 9999 99 99 0 9999 99 9999 + 022988 9999 99 99 0 9999 99 9999 + 022989 9999 99 99 0 9999 99 9999 + 022990 9999 99 99 0 9999 99 9999 + 022991 9999 99 99 0 9999 99 9999 + 022992 9999 99 99 0 9999 99 9999 + 022993 9999 99 99 0 9999 99 9999 + 022994 9999 99 99 0 9999 99 9999 + 022995 9999 99 99 0 9999 99 9999 + 022996 9999 99 99 0 9999 99 9999 + 022997 9999 99 99 0 9999 99 9999 + 022998 9999 99 99 0 9999 99 9999 + 022999 9999 99 99 0 9999 99 9999 + 023000 9999 99 99 0 9999 99 9999 + 023001 9999 99 99 0 9999 99 9999 + 023002 9999 99 99 0 9999 99 9999 + 023003 9999 99 99 0 9999 99 9999 + 023004 9999 99 99 0 9999 99 9999 + 023005 9999 99 99 0 9999 99 9999 + 023006 9999 99 99 0 9999 99 9999 + 023007 9999 99 99 0 9999 99 9999 + 023008 9999 99 99 0 9999 99 9999 + 023009 9999 99 99 0 9999 99 9999 + 023010 9999 99 99 0 9999 99 9999 + 023011 9999 99 99 0 9999 99 9999 + 023012 9999 99 99 0 9999 99 9999 + 023013 9999 99 99 0 9999 99 9999 + 023014 9999 99 99 0 9999 99 9999 + 023015 9999 99 99 0 9999 99 9999 + 023016 9999 99 99 0 9999 99 9999 + 023017 9999 99 99 0 9999 99 9999 + 023018 9999 99 99 0 9999 99 9999 + 023019 9999 99 99 0 9999 99 9999 + 023020 9999 99 99 0 9999 99 9999 + 023021 9999 99 99 0 9999 99 9999 + 023022 9999 99 99 0 9999 99 9999 + 023023 9999 99 99 0 9999 99 9999 + 023024 9999 99 99 0 9999 99 9999 + 023025 9999 99 99 0 9999 99 9999 + 023026 9999 99 99 0 9999 99 9999 + 023027 9999 99 99 0 9999 99 9999 + 023028 9999 99 99 0 9999 99 9999 + 023029 9999 99 99 0 9999 99 9999 + 023030 9999 99 99 0 9999 99 9999 + 023031 9999 99 99 0 9999 99 9999 + 023032 9999 99 99 0 9999 99 9999 + 023033 9999 99 99 0 9999 99 9999 + 023034 9999 99 99 0 9999 99 9999 + 023035 9999 99 99 0 9999 99 9999 + 023036 9999 99 99 0 9999 99 9999 + 023037 9999 99 99 0 9999 99 9999 + 023038 9999 99 99 0 9999 99 9999 + 023039 9999 99 99 0 9999 99 9999 + 023040 9999 99 99 0 9999 99 9999 + 023041 1260 01 01 1 303054860 08 0026 + 023042 1260 01 02 1 303054860 09 0026 + 023043 9999 99 99 0 9999 99 9999 + 023044 9999 99 99 0 9999 99 9999 + 023045 9999 99 99 0 9999 99 9999 + 023046 9999 99 99 0 9999 99 9999 + 023047 9999 99 99 0 9999 99 9999 + 023048 9999 99 99 0 9999 99 9999 + 023049 1260 02 01 1 303054860 10 0026 + 023050 1260 02 02 1 303054860 11 0026 + 023051 9999 99 99 0 9999 99 9999 + 023052 9999 99 99 0 9999 99 9999 + 023053 9999 99 99 0 9999 99 9999 + 023054 9999 99 99 0 9999 99 9999 + 023055 9999 99 99 0 9999 99 9999 + 023056 9999 99 99 0 9999 99 9999 + 023057 1260 03 01 1 303054860 12 0026 + 023058 1260 03 02 1 303054860 13 0026 + 023059 9999 99 99 0 9999 99 9999 + 023060 9999 99 99 0 9999 99 9999 + 023061 9999 99 99 0 9999 99 9999 + 023062 9999 99 99 0 9999 99 9999 + 023063 9999 99 99 0 9999 99 9999 + 023064 9999 99 99 0 9999 99 9999 + 023065 1260 04 01 1 303054860 14 0026 + 023066 1260 04 02 1 303054860 15 0026 + 023067 9999 99 99 0 9999 99 9999 + 023068 9999 99 99 0 9999 99 9999 + 023069 9999 99 99 0 9999 99 9999 + 023070 9999 99 99 0 9999 99 9999 + 023071 9999 99 99 0 9999 99 9999 + 023072 9999 99 99 0 9999 99 9999 + 023073 1260 05 01 1 303054860 00 0026 + 023074 1260 05 02 1 303054860 01 0026 + 023075 9999 99 99 0 9999 99 9999 + 023076 9999 99 99 0 9999 99 9999 + 023077 9999 99 99 0 9999 99 9999 + 023078 9999 99 99 0 9999 99 9999 + 023079 9999 99 99 0 9999 99 9999 + 023080 9999 99 99 0 9999 99 9999 + 023081 1260 06 01 1 303054860 02 0026 + 023082 1260 06 02 1 303054860 03 0026 + 023083 9999 99 99 0 9999 99 9999 + 023084 9999 99 99 0 9999 99 9999 + 023085 9999 99 99 0 9999 99 9999 + 023086 9999 99 99 0 9999 99 9999 + 023087 9999 99 99 0 9999 99 9999 + 023088 9999 99 99 0 9999 99 9999 + 023089 1260 07 01 1 303054860 04 0026 + 023090 1260 07 02 1 303054860 05 0026 + 023091 9999 99 99 0 9999 99 9999 + 023092 9999 99 99 0 9999 99 9999 + 023093 9999 99 99 0 9999 99 9999 + 023094 9999 99 99 0 9999 99 9999 + 023095 9999 99 99 0 9999 99 9999 + 023096 9999 99 99 0 9999 99 9999 + 023097 1260 08 01 1 303054860 06 0026 + 023098 1260 08 02 1 303054860 07 0026 + 023099 9999 99 99 0 9999 99 9999 + 023100 9999 99 99 0 9999 99 9999 + 023101 9999 99 99 0 9999 99 9999 + 023102 9999 99 99 0 9999 99 9999 + 023103 9999 99 99 0 9999 99 9999 + 023104 9999 99 99 0 9999 99 9999 + 023105 1260 09 01 1 304119820 00 0154 + 023106 1260 09 02 1 304119820 01 0154 + 023107 1260 09 03 1 304119820 02 0154 + 023108 1260 09 04 1 304119820 03 0154 + 023109 9999 99 99 0 9999 99 9999 + 023110 9999 99 99 0 9999 99 9999 + 023111 9999 99 99 0 9999 99 9999 + 023112 9999 99 99 0 9999 99 9999 + 023113 1260 10 01 1 304119820 04 0154 + 023114 1260 10 02 1 304119820 05 0154 + 023115 1260 10 03 1 304119820 06 0154 + 023116 1260 10 04 1 304119820 07 0154 + 023117 9999 99 99 0 9999 99 9999 + 023118 9999 99 99 0 9999 99 9999 + 023119 9999 99 99 0 9999 99 9999 + 023120 9999 99 99 0 9999 99 9999 + 023121 1260 11 01 1 304119820 08 0154 + 023122 1260 11 02 1 304119820 09 0154 + 023123 1260 11 03 1 304119820 10 0154 + 023124 1260 11 04 1 304119820 11 0154 + 023125 9999 99 99 0 9999 99 9999 + 023126 9999 99 99 0 9999 99 9999 + 023127 9999 99 99 0 9999 99 9999 + 023128 9999 99 99 0 9999 99 9999 + 023129 1260 12 01 1 304119820 12 0154 + 023130 1260 12 02 1 304119820 13 0154 + 023131 1260 12 03 1 304119820 14 0154 + 023132 1260 12 04 1 304119820 15 0154 + 023133 9999 99 99 0 9999 99 9999 + 023134 9999 99 99 0 9999 99 9999 + 023135 9999 99 99 0 9999 99 9999 + 023136 9999 99 99 0 9999 99 9999 + 023137 1260 13 01 1 304119824 08 0155 + 023138 1260 13 02 1 304119824 09 0155 + 023139 1260 13 03 1 304119824 10 0155 + 023140 1260 13 04 1 304119824 11 0155 + 023141 9999 99 99 0 9999 99 9999 + 023142 9999 99 99 0 9999 99 9999 + 023143 9999 99 99 0 9999 99 9999 + 023144 9999 99 99 0 9999 99 9999 + 023145 1260 14 01 1 304119824 12 0155 + 023146 1260 14 02 1 304119824 13 0155 + 023147 1260 14 03 1 304119824 14 0155 + 023148 1260 14 04 1 304119824 15 0155 + 023149 9999 99 99 0 9999 99 9999 + 023150 9999 99 99 0 9999 99 9999 + 023151 9999 99 99 0 9999 99 9999 + 023152 9999 99 99 0 9999 99 9999 + 023153 1260 15 01 1 304119824 00 0155 + 023154 1260 15 02 1 304119824 01 0155 + 023155 1260 15 03 1 304119824 02 0155 + 023156 1260 15 04 1 304119824 03 0155 + 023157 9999 99 99 0 9999 99 9999 + 023158 9999 99 99 0 9999 99 9999 + 023159 9999 99 99 0 9999 99 9999 + 023160 9999 99 99 0 9999 99 9999 + 023161 1260 16 01 1 304119824 04 0155 + 023162 1260 16 02 1 304119824 05 0155 + 023163 1260 16 03 1 304119824 06 0155 + 023164 1260 16 04 1 304119824 07 0155 + 023165 9999 99 99 0 9999 99 9999 + 023166 9999 99 99 0 9999 99 9999 + 023167 9999 99 99 0 9999 99 9999 + 023168 9999 99 99 0 9999 99 9999 + 023169 1260 17 01 1 306253832 00 0801 + 023170 1260 17 02 1 306253832 01 0801 + 023171 1260 17 03 1 306253832 02 0801 + 023172 1260 17 04 1 306253832 03 0801 + 023173 1260 17 05 1 306253832 04 0801 + 023174 1260 17 06 1 306253832 05 0801 + 023175 1260 17 07 1 306253832 06 0801 + 023176 1260 17 08 1 306253832 07 0801 + 023177 1260 18 01 1 306253832 08 0801 + 023178 1260 18 02 1 306253832 09 0801 + 023179 1260 18 03 1 306253832 10 0801 + 023180 1260 18 04 1 306253832 11 0801 + 023181 1260 18 05 1 306253832 12 0801 + 023182 1260 18 06 1 306253832 13 0801 + 023183 1260 18 07 1 306253832 14 0801 + 023184 1260 18 08 1 306253832 15 0801 + 023185 1260 19 01 1 306253828 00 0800 + 023186 1260 19 02 1 306253828 01 0800 + 023187 1260 19 03 1 306253828 02 0800 + 023188 1260 19 04 1 306253828 03 0800 + 023189 1260 19 05 1 306253828 04 0800 + 023190 1260 19 06 1 306253828 05 0800 + 023191 1260 19 07 1 306253828 06 0800 + 023192 1260 19 08 1 306253828 07 0800 + 023193 1260 20 01 1 306253828 08 0800 + 023194 1260 20 02 1 306253828 09 0800 + 023195 1260 20 03 1 306253828 10 0800 + 023196 1260 20 04 1 306253828 11 0800 + 023197 1260 20 05 1 306253828 12 0800 + 023198 1260 20 06 1 306253828 13 0800 + 023199 1260 20 07 1 306253828 14 0800 + 023200 1260 20 08 1 306253828 15 0800 + 023201 1260 21 01 1 306253840 00 0803 + 023202 1260 21 02 1 306253840 01 0803 + 023203 1260 21 03 1 306253840 02 0803 + 023204 1260 21 04 1 306253840 03 0803 + 023205 1260 21 05 1 306253840 04 0803 + 023206 1260 21 06 1 306253840 05 0803 + 023207 1260 21 07 1 306253840 06 0803 + 023208 1260 21 08 1 306253840 07 0803 + 023209 1260 22 01 1 306253840 08 0803 + 023210 1260 22 02 1 306253840 09 0803 + 023211 1260 22 03 1 306253840 10 0803 + 023212 1260 22 04 1 306253840 11 0803 + 023213 1260 22 05 1 306253840 12 0803 + 023214 1260 22 06 1 306253840 13 0803 + 023215 1260 22 07 1 306253840 14 0803 + 023216 1260 22 08 1 306253840 15 0803 + 023217 1260 23 01 1 306253836 00 0802 + 023218 1260 23 02 1 306253836 01 0802 + 023219 1260 23 03 1 306253836 02 0802 + 023220 1260 23 04 1 306253836 03 0802 + 023221 1260 23 05 1 306253836 04 0802 + 023222 1260 23 06 1 306253836 05 0802 + 023223 1260 23 07 1 306253836 06 0802 + 023224 1260 23 08 1 306253836 07 0802 + 023225 1260 24 01 1 306253836 08 0802 + 023226 1260 24 02 1 306253836 09 0802 + 023227 1260 24 03 1 306253836 10 0802 + 023228 1260 24 04 1 306253836 11 0802 + 023229 1260 24 05 1 306253836 12 0802 + 023230 1260 24 06 1 306253836 13 0802 + 023231 1260 24 07 1 306253836 14 0802 + 023232 1260 24 08 1 306253836 15 0802 + 023233 1260 25 01 1 303054856 08 0025 + 023234 1260 25 02 1 303054856 09 0025 + 023235 9999 99 99 0 9999 99 9999 + 023236 9999 99 99 0 9999 99 9999 + 023237 9999 99 99 0 9999 99 9999 + 023238 9999 99 99 0 9999 99 9999 + 023239 9999 99 99 0 9999 99 9999 + 023240 9999 99 99 0 9999 99 9999 + 023241 1260 26 01 1 303054856 10 0025 + 023242 1260 26 02 1 303054856 11 0025 + 023243 9999 99 99 0 9999 99 9999 + 023244 9999 99 99 0 9999 99 9999 + 023245 9999 99 99 0 9999 99 9999 + 023246 9999 99 99 0 9999 99 9999 + 023247 9999 99 99 0 9999 99 9999 + 023248 9999 99 99 0 9999 99 9999 + 023249 1260 27 01 1 303054856 12 0025 + 023250 1260 27 02 1 303054856 13 0025 + 023251 9999 99 99 0 9999 99 9999 + 023252 9999 99 99 0 9999 99 9999 + 023253 9999 99 99 0 9999 99 9999 + 023254 9999 99 99 0 9999 99 9999 + 023255 9999 99 99 0 9999 99 9999 + 023256 9999 99 99 0 9999 99 9999 + 023257 1260 28 01 1 303054856 14 0025 + 023258 1260 28 02 1 303054856 15 0025 + 023259 9999 99 99 0 9999 99 9999 + 023260 9999 99 99 0 9999 99 9999 + 023261 9999 99 99 0 9999 99 9999 + 023262 9999 99 99 0 9999 99 9999 + 023263 9999 99 99 0 9999 99 9999 + 023264 9999 99 99 0 9999 99 9999 + 023265 1260 29 01 1 303054856 04 0025 + 023266 1260 29 02 1 303054856 05 0025 + 023267 9999 99 99 0 9999 99 9999 + 023268 9999 99 99 0 9999 99 9999 + 023269 9999 99 99 0 9999 99 9999 + 023270 9999 99 99 0 9999 99 9999 + 023271 9999 99 99 0 9999 99 9999 + 023272 9999 99 99 0 9999 99 9999 + 023273 1260 30 01 1 303054856 06 0025 + 023274 1260 30 02 1 303054856 07 0025 + 023275 9999 99 99 0 9999 99 9999 + 023276 9999 99 99 0 9999 99 9999 + 023277 9999 99 99 0 9999 99 9999 + 023278 9999 99 99 0 9999 99 9999 + 023279 9999 99 99 0 9999 99 9999 + 023280 9999 99 99 0 9999 99 9999 + 023281 1260 31 01 1 303054856 00 0025 + 023282 1260 31 02 1 303054856 01 0025 + 023283 9999 99 99 0 9999 99 9999 + 023284 9999 99 99 0 9999 99 9999 + 023285 9999 99 99 0 9999 99 9999 + 023286 9999 99 99 0 9999 99 9999 + 023287 9999 99 99 0 9999 99 9999 + 023288 9999 99 99 0 9999 99 9999 + 023289 1260 32 01 1 303054856 02 0025 + 023290 1260 32 02 1 303054856 03 0025 + 023291 9999 99 99 0 9999 99 9999 + 023292 9999 99 99 0 9999 99 9999 + 023293 9999 99 99 0 9999 99 9999 + 023294 9999 99 99 0 9999 99 9999 + 023295 9999 99 99 0 9999 99 9999 + 023296 9999 99 99 0 9999 99 9999 + 023297 1260 33 01 1 306257928 00 0809 + 023298 1260 33 02 1 306257928 01 0809 + 023299 1260 33 03 1 306257928 02 0809 + 023300 1260 33 04 1 306257928 03 0809 + 023301 1260 33 05 1 306257928 04 0809 + 023302 1260 33 06 1 306257928 05 0809 + 023303 1260 33 07 1 306257928 06 0809 + 023304 1260 33 08 1 306257928 07 0809 + 023305 1260 34 01 1 306257928 08 0809 + 023306 1260 34 02 1 306257928 09 0809 + 023307 1260 34 03 1 306257928 10 0809 + 023308 1260 34 04 1 306257928 11 0809 + 023309 1260 34 05 1 306257928 12 0809 + 023310 1260 34 06 1 306257928 13 0809 + 023311 1260 34 07 1 306257928 14 0809 + 023312 1260 34 08 1 306257928 15 0809 + 023313 1260 35 01 1 306257924 00 0808 + 023314 1260 35 02 1 306257924 01 0808 + 023315 1260 35 03 1 306257924 02 0808 + 023316 1260 35 04 1 306257924 03 0808 + 023317 1260 35 05 1 306257924 04 0808 + 023318 1260 35 06 1 306257924 05 0808 + 023319 1260 35 07 1 306257924 06 0808 + 023320 1260 35 08 1 306257924 07 0808 + 023321 1260 36 01 1 306257924 08 0808 + 023322 1260 36 02 1 306257924 09 0808 + 023323 1260 36 03 1 306257924 10 0808 + 023324 1260 36 04 1 306257924 11 0808 + 023325 1260 36 05 1 306257924 12 0808 + 023326 1260 36 06 1 306257924 13 0808 + 023327 1260 36 07 1 306257924 14 0808 + 023328 1260 36 08 1 306257924 15 0808 + 023329 1260 37 01 1 306257936 00 0811 + 023330 1260 37 02 1 306257936 01 0811 + 023331 1260 37 03 1 306257936 02 0811 + 023332 1260 37 04 1 306257936 03 0811 + 023333 1260 37 05 1 306257936 04 0811 + 023334 1260 37 06 1 306257936 05 0811 + 023335 1260 37 07 1 306257936 06 0811 + 023336 1260 37 08 1 306257936 07 0811 + 023337 1260 38 01 1 306257936 08 0811 + 023338 1260 38 02 1 306257936 09 0811 + 023339 1260 38 03 1 306257936 10 0811 + 023340 1260 38 04 1 306257936 11 0811 + 023341 1260 38 05 1 306257936 12 0811 + 023342 1260 38 06 1 306257936 13 0811 + 023343 1260 38 07 1 306257936 14 0811 + 023344 1260 38 08 1 306257936 15 0811 + 023345 1260 39 01 1 306257932 00 0810 + 023346 1260 39 02 1 306257932 01 0810 + 023347 1260 39 03 1 306257932 02 0810 + 023348 1260 39 04 1 306257932 03 0810 + 023349 1260 39 05 1 306257932 04 0810 + 023350 1260 39 06 1 306257932 05 0810 + 023351 1260 39 07 1 306257932 06 0810 + 023352 1260 39 08 1 306257932 07 0810 + 023353 1260 40 01 1 306257932 08 0810 + 023354 1260 40 02 1 306257932 09 0810 + 023355 1260 40 03 1 306257932 10 0810 + 023356 1260 40 04 1 306257932 11 0810 + 023357 1260 40 05 1 306257932 12 0810 + 023358 1260 40 06 1 306257932 13 0810 + 023359 1260 40 07 1 306257932 14 0810 + 023360 1260 40 08 1 306257932 15 0810 + 023361 1260 41 01 1 304119816 00 0153 + 023362 1260 41 02 1 304119816 01 0153 + 023363 1260 41 03 1 304119816 02 0153 + 023364 1260 41 04 1 304119816 03 0153 + 023365 9999 99 99 0 9999 99 9999 + 023366 9999 99 99 0 9999 99 9999 + 023367 9999 99 99 0 9999 99 9999 + 023368 9999 99 99 0 9999 99 9999 + 023369 1260 42 01 1 304119816 04 0153 + 023370 1260 42 02 1 304119816 05 0153 + 023371 1260 42 03 1 304119816 06 0153 + 023372 1260 42 04 1 304119816 07 0153 + 023373 9999 99 99 0 9999 99 9999 + 023374 9999 99 99 0 9999 99 9999 + 023375 9999 99 99 0 9999 99 9999 + 023376 9999 99 99 0 9999 99 9999 + 023377 1260 43 01 1 304119816 08 0153 + 023378 1260 43 02 1 304119816 09 0153 + 023379 1260 43 03 1 304119816 10 0153 + 023380 1260 43 04 1 304119816 11 0153 + 023381 9999 99 99 0 9999 99 9999 + 023382 9999 99 99 0 9999 99 9999 + 023383 9999 99 99 0 9999 99 9999 + 023384 9999 99 99 0 9999 99 9999 + 023385 1260 44 01 1 304119816 12 0153 + 023386 1260 44 02 1 304119816 13 0153 + 023387 1260 44 03 1 304119816 14 0153 + 023388 1260 44 04 1 304119816 15 0153 + 023389 9999 99 99 0 9999 99 9999 + 023390 9999 99 99 0 9999 99 9999 + 023391 9999 99 99 0 9999 99 9999 + 023392 9999 99 99 0 9999 99 9999 + 023393 1260 45 01 1 304119812 00 0152 + 023394 1260 45 02 1 304119812 01 0152 + 023395 1260 45 03 1 304119812 02 0152 + 023396 1260 45 04 1 304119812 03 0152 + 023397 9999 99 99 0 9999 99 9999 + 023398 9999 99 99 0 9999 99 9999 + 023399 9999 99 99 0 9999 99 9999 + 023400 9999 99 99 0 9999 99 9999 + 023401 1260 46 01 1 304119812 04 0152 + 023402 1260 46 02 1 304119812 05 0152 + 023403 1260 46 03 1 304119812 06 0152 + 023404 1260 46 04 1 304119812 07 0152 + 023405 9999 99 99 0 9999 99 9999 + 023406 9999 99 99 0 9999 99 9999 + 023407 9999 99 99 0 9999 99 9999 + 023408 9999 99 99 0 9999 99 9999 + 023409 1260 47 01 1 304119812 08 0152 + 023410 1260 47 02 1 304119812 09 0152 + 023411 1260 47 03 1 304119812 10 0152 + 023412 1260 47 04 1 304119812 11 0152 + 023413 9999 99 99 0 9999 99 9999 + 023414 9999 99 99 0 9999 99 9999 + 023415 9999 99 99 0 9999 99 9999 + 023416 9999 99 99 0 9999 99 9999 + 023417 1260 48 01 1 304119812 12 0152 + 023418 1260 48 02 1 304119812 13 0152 + 023419 1260 48 03 1 304119812 14 0152 + 023420 1260 48 04 1 304119812 15 0152 + 023421 9999 99 99 0 9999 99 9999 + 023422 9999 99 99 0 9999 99 9999 + 023423 9999 99 99 0 9999 99 9999 + 023424 9999 99 99 0 9999 99 9999 + 023425 1261 01 01 1 304123916 08 0162 + 023426 1261 01 02 1 304123916 09 0162 + 023427 1261 01 03 1 304123916 10 0162 + 023428 1261 01 04 1 304123916 11 0162 + 023429 9999 99 99 0 9999 99 9999 + 023430 9999 99 99 0 9999 99 9999 + 023431 9999 99 99 0 9999 99 9999 + 023432 9999 99 99 0 9999 99 9999 + 023433 1261 02 01 1 304123916 12 0162 + 023434 1261 02 02 1 304123916 13 0162 + 023435 1261 02 03 1 304123916 14 0162 + 023436 1261 02 04 1 304123916 15 0162 + 023437 9999 99 99 0 9999 99 9999 + 023438 9999 99 99 0 9999 99 9999 + 023439 9999 99 99 0 9999 99 9999 + 023440 9999 99 99 0 9999 99 9999 + 023441 1261 03 01 1 304123916 00 0162 + 023442 1261 03 02 1 304123916 01 0162 + 023443 1261 03 03 1 304123916 02 0162 + 023444 1261 03 04 1 304123916 03 0162 + 023445 9999 99 99 0 9999 99 9999 + 023446 9999 99 99 0 9999 99 9999 + 023447 9999 99 99 0 9999 99 9999 + 023448 9999 99 99 0 9999 99 9999 + 023449 1261 04 01 1 304123916 04 0162 + 023450 1261 04 02 1 304123916 05 0162 + 023451 1261 04 03 1 304123916 06 0162 + 023452 1261 04 04 1 304123916 07 0162 + 023453 9999 99 99 0 9999 99 9999 + 023454 9999 99 99 0 9999 99 9999 + 023455 9999 99 99 0 9999 99 9999 + 023456 9999 99 99 0 9999 99 9999 + 023457 1261 05 01 1 304123920 08 0163 + 023458 1261 05 02 1 304123920 09 0163 + 023459 1261 05 03 1 304123920 10 0163 + 023460 1261 05 04 1 304123920 11 0163 + 023461 9999 99 99 0 9999 99 9999 + 023462 9999 99 99 0 9999 99 9999 + 023463 9999 99 99 0 9999 99 9999 + 023464 9999 99 99 0 9999 99 9999 + 023465 1261 06 01 1 304123920 12 0163 + 023466 1261 06 02 1 304123920 13 0163 + 023467 1261 06 03 1 304123920 14 0163 + 023468 1261 06 04 1 304123920 15 0163 + 023469 9999 99 99 0 9999 99 9999 + 023470 9999 99 99 0 9999 99 9999 + 023471 9999 99 99 0 9999 99 9999 + 023472 9999 99 99 0 9999 99 9999 + 023473 1261 07 01 1 304123920 00 0163 + 023474 1261 07 02 1 304123920 01 0163 + 023475 1261 07 03 1 304123920 02 0163 + 023476 1261 07 04 1 304123920 03 0163 + 023477 9999 99 99 0 9999 99 9999 + 023478 9999 99 99 0 9999 99 9999 + 023479 9999 99 99 0 9999 99 9999 + 023480 9999 99 99 0 9999 99 9999 + 023481 1261 08 01 1 304123920 04 0163 + 023482 1261 08 02 1 304123920 05 0163 + 023483 1261 08 03 1 304123920 06 0163 + 023484 1261 08 04 1 304123920 07 0163 + 023485 9999 99 99 0 9999 99 9999 + 023486 9999 99 99 0 9999 99 9999 + 023487 9999 99 99 0 9999 99 9999 + 023488 9999 99 99 0 9999 99 9999 + 023489 1261 09 01 1 306262028 00 0818 + 023490 1261 09 02 1 306262028 01 0818 + 023491 1261 09 03 1 306262028 02 0818 + 023492 1261 09 04 1 306262028 03 0818 + 023493 1261 09 05 1 306262028 04 0818 + 023494 1261 09 06 1 306262028 05 0818 + 023495 1261 09 07 1 306262028 06 0818 + 023496 1261 09 08 1 306262028 07 0818 + 023497 1261 10 01 1 306262028 08 0818 + 023498 1261 10 02 1 306262028 09 0818 + 023499 1261 10 03 1 306262028 10 0818 + 023500 1261 10 04 1 306262028 11 0818 + 023501 1261 10 05 1 306262028 12 0818 + 023502 1261 10 06 1 306262028 13 0818 + 023503 1261 10 07 1 306262028 14 0818 + 023504 1261 10 08 1 306262028 15 0818 + 023505 1261 11 01 1 306262032 00 0819 + 023506 1261 11 02 1 306262032 01 0819 + 023507 1261 11 03 1 306262032 02 0819 + 023508 1261 11 04 1 306262032 03 0819 + 023509 1261 11 05 1 306262032 04 0819 + 023510 1261 11 06 1 306262032 05 0819 + 023511 1261 11 07 1 306262032 06 0819 + 023512 1261 11 08 1 306262032 07 0819 + 023513 1261 12 01 1 306262032 08 0819 + 023514 1261 12 02 1 306262032 09 0819 + 023515 1261 12 03 1 306262032 10 0819 + 023516 1261 12 04 1 306262032 11 0819 + 023517 1261 12 05 1 306262032 12 0819 + 023518 1261 12 06 1 306262032 13 0819 + 023519 1261 12 07 1 306262032 14 0819 + 023520 1261 12 08 1 306262032 15 0819 + 023521 1261 13 01 1 306262020 00 0816 + 023522 1261 13 02 1 306262020 01 0816 + 023523 1261 13 03 1 306262020 02 0816 + 023524 1261 13 04 1 306262020 03 0816 + 023525 1261 13 05 1 306262020 04 0816 + 023526 1261 13 06 1 306262020 05 0816 + 023527 1261 13 07 1 306262020 06 0816 + 023528 1261 13 08 1 306262020 07 0816 + 023529 1261 14 01 1 306262020 08 0816 + 023530 1261 14 02 1 306262020 09 0816 + 023531 1261 14 03 1 306262020 10 0816 + 023532 1261 14 04 1 306262020 11 0816 + 023533 1261 14 05 1 306262020 12 0816 + 023534 1261 14 06 1 306262020 13 0816 + 023535 1261 14 07 1 306262020 14 0816 + 023536 1261 14 08 1 306262020 15 0816 + 023537 1261 15 01 1 306262024 00 0817 + 023538 1261 15 02 1 306262024 01 0817 + 023539 1261 15 03 1 306262024 02 0817 + 023540 1261 15 04 1 306262024 03 0817 + 023541 1261 15 05 1 306262024 04 0817 + 023542 1261 15 06 1 306262024 05 0817 + 023543 1261 15 07 1 306262024 06 0817 + 023544 1261 15 08 1 306262024 07 0817 + 023545 1261 16 01 1 306262024 08 0817 + 023546 1261 16 02 1 306262024 09 0817 + 023547 1261 16 03 1 306262024 10 0817 + 023548 1261 16 04 1 306262024 11 0817 + 023549 1261 16 05 1 306262024 12 0817 + 023550 1261 16 06 1 306262024 13 0817 + 023551 1261 16 07 1 306262024 14 0817 + 023552 1261 16 08 1 306262024 15 0817 + 023553 1261 17 01 1 303054852 12 0024 + 023554 1261 17 02 1 303054852 13 0024 + 023555 9999 99 99 0 9999 99 9999 + 023556 9999 99 99 0 9999 99 9999 + 023557 9999 99 99 0 9999 99 9999 + 023558 9999 99 99 0 9999 99 9999 + 023559 9999 99 99 0 9999 99 9999 + 023560 9999 99 99 0 9999 99 9999 + 023561 1261 18 01 1 303054852 14 0024 + 023562 1261 18 02 1 303054852 15 0024 + 023563 9999 99 99 0 9999 99 9999 + 023564 9999 99 99 0 9999 99 9999 + 023565 9999 99 99 0 9999 99 9999 + 023566 9999 99 99 0 9999 99 9999 + 023567 9999 99 99 0 9999 99 9999 + 023568 9999 99 99 0 9999 99 9999 + 023569 1261 19 01 1 303054852 08 0024 + 023570 1261 19 02 1 303054852 09 0024 + 023571 9999 99 99 0 9999 99 9999 + 023572 9999 99 99 0 9999 99 9999 + 023573 9999 99 99 0 9999 99 9999 + 023574 9999 99 99 0 9999 99 9999 + 023575 9999 99 99 0 9999 99 9999 + 023576 9999 99 99 0 9999 99 9999 + 023577 1261 20 01 1 303054852 10 0024 + 023578 1261 20 02 1 303054852 11 0024 + 023579 9999 99 99 0 9999 99 9999 + 023580 9999 99 99 0 9999 99 9999 + 023581 9999 99 99 0 9999 99 9999 + 023582 9999 99 99 0 9999 99 9999 + 023583 9999 99 99 0 9999 99 9999 + 023584 9999 99 99 0 9999 99 9999 + 023585 1261 21 01 1 303054852 00 0024 + 023586 1261 21 02 1 303054852 01 0024 + 023587 9999 99 99 0 9999 99 9999 + 023588 9999 99 99 0 9999 99 9999 + 023589 9999 99 99 0 9999 99 9999 + 023590 9999 99 99 0 9999 99 9999 + 023591 9999 99 99 0 9999 99 9999 + 023592 9999 99 99 0 9999 99 9999 + 023593 1261 22 01 1 303054852 02 0024 + 023594 1261 22 02 1 303054852 03 0024 + 023595 9999 99 99 0 9999 99 9999 + 023596 9999 99 99 0 9999 99 9999 + 023597 9999 99 99 0 9999 99 9999 + 023598 9999 99 99 0 9999 99 9999 + 023599 9999 99 99 0 9999 99 9999 + 023600 9999 99 99 0 9999 99 9999 + 023601 1261 23 01 1 303054852 04 0024 + 023602 1261 23 02 1 303054852 05 0024 + 023603 9999 99 99 0 9999 99 9999 + 023604 9999 99 99 0 9999 99 9999 + 023605 9999 99 99 0 9999 99 9999 + 023606 9999 99 99 0 9999 99 9999 + 023607 9999 99 99 0 9999 99 9999 + 023608 9999 99 99 0 9999 99 9999 + 023609 1261 24 01 1 303054852 06 0024 + 023610 1261 24 02 1 303054852 07 0024 + 023611 9999 99 99 0 9999 99 9999 + 023612 9999 99 99 0 9999 99 9999 + 023613 9999 99 99 0 9999 99 9999 + 023614 9999 99 99 0 9999 99 9999 + 023615 9999 99 99 0 9999 99 9999 + 023616 9999 99 99 0 9999 99 9999 + 023617 1261 25 01 1 305184776 00 0409 + 023618 1261 25 02 1 305184776 01 0409 + 023619 1261 25 03 1 305184776 02 0409 + 023620 1261 25 04 1 305184776 03 0409 + 023621 1261 25 05 1 305184776 04 0409 + 023622 1261 25 06 1 305184776 05 0409 + 023623 1261 25 07 1 305184776 06 0409 + 023624 1261 25 08 1 305184776 07 0409 + 023625 1261 26 01 1 305184776 08 0409 + 023626 1261 26 02 1 305184776 09 0409 + 023627 1261 26 03 1 305184776 10 0409 + 023628 1261 26 04 1 305184776 11 0409 + 023629 1261 26 05 1 305184776 12 0409 + 023630 1261 26 06 1 305184776 13 0409 + 023631 1261 26 07 1 305184776 14 0409 + 023632 1261 26 08 1 305184776 15 0409 + 023633 1261 27 01 1 305184772 00 0408 + 023634 1261 27 02 1 305184772 01 0408 + 023635 1261 27 03 1 305184772 02 0408 + 023636 1261 27 04 1 305184772 03 0408 + 023637 1261 27 05 1 305184772 04 0408 + 023638 1261 27 06 1 305184772 05 0408 + 023639 1261 27 07 1 305184772 06 0408 + 023640 1261 27 08 1 305184772 07 0408 + 023641 1261 28 01 1 305184772 08 0408 + 023642 1261 28 02 1 305184772 09 0408 + 023643 1261 28 03 1 305184772 10 0408 + 023644 1261 28 04 1 305184772 11 0408 + 023645 1261 28 05 1 305184772 12 0408 + 023646 1261 28 06 1 305184772 13 0408 + 023647 1261 28 07 1 305184772 14 0408 + 023648 1261 28 08 1 305184772 15 0408 + 023649 1261 29 01 1 305184784 00 0411 + 023650 1261 29 02 1 305184784 01 0411 + 023651 1261 29 03 1 305184784 02 0411 + 023652 1261 29 04 1 305184784 03 0411 + 023653 1261 29 05 1 305184784 04 0411 + 023654 1261 29 06 1 305184784 05 0411 + 023655 1261 29 07 1 305184784 06 0411 + 023656 1261 29 08 1 305184784 07 0411 + 023657 1261 30 01 1 305184784 08 0411 + 023658 1261 30 02 1 305184784 09 0411 + 023659 1261 30 03 1 305184784 10 0411 + 023660 1261 30 04 1 305184784 11 0411 + 023661 1261 30 05 1 305184784 12 0411 + 023662 1261 30 06 1 305184784 13 0411 + 023663 1261 30 07 1 305184784 14 0411 + 023664 1261 30 08 1 305184784 15 0411 + 023665 1261 31 01 1 305184780 00 0410 + 023666 1261 31 02 1 305184780 01 0410 + 023667 1261 31 03 1 305184780 02 0410 + 023668 1261 31 04 1 305184780 03 0410 + 023669 1261 31 05 1 305184780 04 0410 + 023670 1261 31 06 1 305184780 05 0410 + 023671 1261 31 07 1 305184780 06 0410 + 023672 1261 31 08 1 305184780 07 0410 + 023673 1261 32 01 1 305184780 08 0410 + 023674 1261 32 02 1 305184780 09 0410 + 023675 1261 32 03 1 305184780 10 0410 + 023676 1261 32 04 1 305184780 11 0410 + 023677 1261 32 05 1 305184780 12 0410 + 023678 1261 32 06 1 305184780 13 0410 + 023679 1261 32 07 1 305184780 14 0410 + 023680 1261 32 08 1 305184780 15 0410 + 023681 1261 33 01 1 306266124 00 0826 + 023682 1261 33 02 1 306266124 01 0826 + 023683 1261 33 03 1 306266124 02 0826 + 023684 1261 33 04 1 306266124 03 0826 + 023685 1261 33 05 1 306266124 04 0826 + 023686 1261 33 06 1 306266124 05 0826 + 023687 1261 33 07 1 306266124 06 0826 + 023688 1261 33 08 1 306266124 07 0826 + 023689 1261 34 01 1 306266124 08 0826 + 023690 1261 34 02 1 306266124 09 0826 + 023691 1261 34 03 1 306266124 10 0826 + 023692 1261 34 04 1 306266124 11 0826 + 023693 1261 34 05 1 306266124 12 0826 + 023694 1261 34 06 1 306266124 13 0826 + 023695 1261 34 07 1 306266124 14 0826 + 023696 1261 34 08 1 306266124 15 0826 + 023697 1261 35 01 1 306266128 00 0827 + 023698 1261 35 02 1 306266128 01 0827 + 023699 1261 35 03 1 306266128 02 0827 + 023700 1261 35 04 1 306266128 03 0827 + 023701 1261 35 05 1 306266128 04 0827 + 023702 1261 35 06 1 306266128 05 0827 + 023703 1261 35 07 1 306266128 06 0827 + 023704 1261 35 08 1 306266128 07 0827 + 023705 1261 36 01 1 306266128 08 0827 + 023706 1261 36 02 1 306266128 09 0827 + 023707 1261 36 03 1 306266128 10 0827 + 023708 1261 36 04 1 306266128 11 0827 + 023709 1261 36 05 1 306266128 12 0827 + 023710 1261 36 06 1 306266128 13 0827 + 023711 1261 36 07 1 306266128 14 0827 + 023712 1261 36 08 1 306266128 15 0827 + 023713 1261 37 01 1 306266116 00 0824 + 023714 1261 37 02 1 306266116 01 0824 + 023715 1261 37 03 1 306266116 02 0824 + 023716 1261 37 04 1 306266116 03 0824 + 023717 1261 37 05 1 306266116 04 0824 + 023718 1261 37 06 1 306266116 05 0824 + 023719 1261 37 07 1 306266116 06 0824 + 023720 1261 37 08 1 306266116 07 0824 + 023721 1261 38 01 1 306266116 08 0824 + 023722 1261 38 02 1 306266116 09 0824 + 023723 1261 38 03 1 306266116 10 0824 + 023724 1261 38 04 1 306266116 11 0824 + 023725 1261 38 05 1 306266116 12 0824 + 023726 1261 38 06 1 306266116 13 0824 + 023727 1261 38 07 1 306266116 14 0824 + 023728 1261 38 08 1 306266116 15 0824 + 023729 1261 39 01 1 306266120 00 0825 + 023730 1261 39 02 1 306266120 01 0825 + 023731 1261 39 03 1 306266120 02 0825 + 023732 1261 39 04 1 306266120 03 0825 + 023733 1261 39 05 1 306266120 04 0825 + 023734 1261 39 06 1 306266120 05 0825 + 023735 1261 39 07 1 306266120 06 0825 + 023736 1261 39 08 1 306266120 07 0825 + 023737 1261 40 01 1 306266120 08 0825 + 023738 1261 40 02 1 306266120 09 0825 + 023739 1261 40 03 1 306266120 10 0825 + 023740 1261 40 04 1 306266120 11 0825 + 023741 1261 40 05 1 306266120 12 0825 + 023742 1261 40 06 1 306266120 13 0825 + 023743 1261 40 07 1 306266120 14 0825 + 023744 1261 40 08 1 306266120 15 0825 + 023745 1261 41 01 1 304123908 08 0160 + 023746 1261 41 02 1 304123908 09 0160 + 023747 1261 41 03 1 304123908 10 0160 + 023748 1261 41 04 1 304123908 11 0160 + 023749 9999 99 99 0 9999 99 9999 + 023750 9999 99 99 0 9999 99 9999 + 023751 9999 99 99 0 9999 99 9999 + 023752 9999 99 99 0 9999 99 9999 + 023753 1261 42 01 1 304123908 12 0160 + 023754 1261 42 02 1 304123908 13 0160 + 023755 1261 42 03 1 304123908 14 0160 + 023756 1261 42 04 1 304123908 15 0160 + 023757 9999 99 99 0 9999 99 9999 + 023758 9999 99 99 0 9999 99 9999 + 023759 9999 99 99 0 9999 99 9999 + 023760 9999 99 99 0 9999 99 9999 + 023761 1261 43 01 1 304123908 00 0160 + 023762 1261 43 02 1 304123908 01 0160 + 023763 1261 43 03 1 304123908 02 0160 + 023764 1261 43 04 1 304123908 03 0160 + 023765 9999 99 99 0 9999 99 9999 + 023766 9999 99 99 0 9999 99 9999 + 023767 9999 99 99 0 9999 99 9999 + 023768 9999 99 99 0 9999 99 9999 + 023769 1261 44 01 1 304123908 04 0160 + 023770 1261 44 02 1 304123908 05 0160 + 023771 1261 44 03 1 304123908 06 0160 + 023772 1261 44 04 1 304123908 07 0160 + 023773 9999 99 99 0 9999 99 9999 + 023774 9999 99 99 0 9999 99 9999 + 023775 9999 99 99 0 9999 99 9999 + 023776 9999 99 99 0 9999 99 9999 + 023777 1261 45 01 1 304123912 08 0161 + 023778 1261 45 02 1 304123912 09 0161 + 023779 1261 45 03 1 304123912 10 0161 + 023780 1261 45 04 1 304123912 11 0161 + 023781 9999 99 99 0 9999 99 9999 + 023782 9999 99 99 0 9999 99 9999 + 023783 9999 99 99 0 9999 99 9999 + 023784 9999 99 99 0 9999 99 9999 + 023785 1261 46 01 1 304123912 12 0161 + 023786 1261 46 02 1 304123912 13 0161 + 023787 1261 46 03 1 304123912 14 0161 + 023788 1261 46 04 1 304123912 15 0161 + 023789 9999 99 99 0 9999 99 9999 + 023790 9999 99 99 0 9999 99 9999 + 023791 9999 99 99 0 9999 99 9999 + 023792 9999 99 99 0 9999 99 9999 + 023793 1261 47 01 1 304123912 00 0161 + 023794 1261 47 02 1 304123912 01 0161 + 023795 1261 47 03 1 304123912 02 0161 + 023796 1261 47 04 1 304123912 03 0161 + 023797 9999 99 99 0 9999 99 9999 + 023798 9999 99 99 0 9999 99 9999 + 023799 9999 99 99 0 9999 99 9999 + 023800 9999 99 99 0 9999 99 9999 + 023801 1261 48 01 1 304123912 04 0161 + 023802 1261 48 02 1 304123912 05 0161 + 023803 1261 48 03 1 304123912 06 0161 + 023804 1261 48 04 1 304123912 07 0161 + 023805 9999 99 99 0 9999 99 9999 + 023806 9999 99 99 0 9999 99 9999 + 023807 9999 99 99 0 9999 99 9999 + 023808 9999 99 99 0 9999 99 9999 + 023809 1262 01 01 1 305188872 00 0417 + 023810 1262 01 02 1 305188872 01 0417 + 023811 1262 01 03 1 305188872 02 0417 + 023812 1262 01 04 1 305188872 03 0417 + 023813 1262 01 05 1 305188872 04 0417 + 023814 1262 01 06 1 305188872 05 0417 + 023815 1262 01 07 1 305188872 06 0417 + 023816 1262 01 08 1 305188872 07 0417 + 023817 1262 02 01 1 305188872 08 0417 + 023818 1262 02 02 1 305188872 09 0417 + 023819 1262 02 03 1 305188872 10 0417 + 023820 1262 02 04 1 305188872 11 0417 + 023821 1262 02 05 1 305188872 12 0417 + 023822 1262 02 06 1 305188872 13 0417 + 023823 1262 02 07 1 305188872 14 0417 + 023824 1262 02 08 1 305188872 15 0417 + 023825 1262 03 01 1 305188868 00 0416 + 023826 1262 03 02 1 305188868 01 0416 + 023827 1262 03 03 1 305188868 02 0416 + 023828 1262 03 04 1 305188868 03 0416 + 023829 1262 03 05 1 305188868 04 0416 + 023830 1262 03 06 1 305188868 05 0416 + 023831 1262 03 07 1 305188868 06 0416 + 023832 1262 03 08 1 305188868 07 0416 + 023833 1262 04 01 1 305188868 08 0416 + 023834 1262 04 02 1 305188868 09 0416 + 023835 1262 04 03 1 305188868 10 0416 + 023836 1262 04 04 1 305188868 11 0416 + 023837 1262 04 05 1 305188868 12 0416 + 023838 1262 04 06 1 305188868 13 0416 + 023839 1262 04 07 1 305188868 14 0416 + 023840 1262 04 08 1 305188868 15 0416 + 023841 1262 05 01 1 305188880 00 0419 + 023842 1262 05 02 1 305188880 01 0419 + 023843 1262 05 03 1 305188880 02 0419 + 023844 1262 05 04 1 305188880 03 0419 + 023845 1262 05 05 1 305188880 04 0419 + 023846 1262 05 06 1 305188880 05 0419 + 023847 1262 05 07 1 305188880 06 0419 + 023848 1262 05 08 1 305188880 07 0419 + 023849 1262 06 01 1 305188880 08 0419 + 023850 1262 06 02 1 305188880 09 0419 + 023851 1262 06 03 1 305188880 10 0419 + 023852 1262 06 04 1 305188880 11 0419 + 023853 1262 06 05 1 305188880 12 0419 + 023854 1262 06 06 1 305188880 13 0419 + 023855 1262 06 07 1 305188880 14 0419 + 023856 1262 06 08 1 305188880 15 0419 + 023857 1262 07 01 1 305188876 00 0418 + 023858 1262 07 02 1 305188876 01 0418 + 023859 1262 07 03 1 305188876 02 0418 + 023860 1262 07 04 1 305188876 03 0418 + 023861 1262 07 05 1 305188876 04 0418 + 023862 1262 07 06 1 305188876 05 0418 + 023863 1262 07 07 1 305188876 06 0418 + 023864 1262 07 08 1 305188876 07 0418 + 023865 1262 08 01 1 305188876 08 0418 + 023866 1262 08 02 1 305188876 09 0418 + 023867 1262 08 03 1 305188876 10 0418 + 023868 1262 08 04 1 305188876 11 0418 + 023869 1262 08 05 1 305188876 12 0418 + 023870 1262 08 06 1 305188876 13 0418 + 023871 1262 08 07 1 305188876 14 0418 + 023872 1262 08 08 1 305188876 15 0418 + 023873 9999 99 99 0 9999 99 9999 + 023874 9999 99 99 0 9999 99 9999 + 023875 9999 99 99 0 9999 99 9999 + 023876 9999 99 99 0 9999 99 9999 + 023877 9999 99 99 0 9999 99 9999 + 023878 9999 99 99 0 9999 99 9999 + 023879 9999 99 99 0 9999 99 9999 + 023880 9999 99 99 0 9999 99 9999 + 023881 9999 99 99 0 9999 99 9999 + 023882 9999 99 99 0 9999 99 9999 + 023883 9999 99 99 0 9999 99 9999 + 023884 9999 99 99 0 9999 99 9999 + 023885 9999 99 99 0 9999 99 9999 + 023886 9999 99 99 0 9999 99 9999 + 023887 9999 99 99 0 9999 99 9999 + 023888 9999 99 99 0 9999 99 9999 + 023889 9999 99 99 0 9999 99 9999 + 023890 9999 99 99 0 9999 99 9999 + 023891 9999 99 99 0 9999 99 9999 + 023892 9999 99 99 0 9999 99 9999 + 023893 9999 99 99 0 9999 99 9999 + 023894 9999 99 99 0 9999 99 9999 + 023895 9999 99 99 0 9999 99 9999 + 023896 9999 99 99 0 9999 99 9999 + 023897 9999 99 99 0 9999 99 9999 + 023898 9999 99 99 0 9999 99 9999 + 023899 9999 99 99 0 9999 99 9999 + 023900 9999 99 99 0 9999 99 9999 + 023901 9999 99 99 0 9999 99 9999 + 023902 9999 99 99 0 9999 99 9999 + 023903 9999 99 99 0 9999 99 9999 + 023904 9999 99 99 0 9999 99 9999 + 023905 9999 99 99 0 9999 99 9999 + 023906 9999 99 99 0 9999 99 9999 + 023907 9999 99 99 0 9999 99 9999 + 023908 9999 99 99 0 9999 99 9999 + 023909 9999 99 99 0 9999 99 9999 + 023910 9999 99 99 0 9999 99 9999 + 023911 9999 99 99 0 9999 99 9999 + 023912 9999 99 99 0 9999 99 9999 + 023913 9999 99 99 0 9999 99 9999 + 023914 9999 99 99 0 9999 99 9999 + 023915 9999 99 99 0 9999 99 9999 + 023916 9999 99 99 0 9999 99 9999 + 023917 9999 99 99 0 9999 99 9999 + 023918 9999 99 99 0 9999 99 9999 + 023919 9999 99 99 0 9999 99 9999 + 023920 9999 99 99 0 9999 99 9999 + 023921 9999 99 99 0 9999 99 9999 + 023922 9999 99 99 0 9999 99 9999 + 023923 9999 99 99 0 9999 99 9999 + 023924 9999 99 99 0 9999 99 9999 + 023925 9999 99 99 0 9999 99 9999 + 023926 9999 99 99 0 9999 99 9999 + 023927 9999 99 99 0 9999 99 9999 + 023928 9999 99 99 0 9999 99 9999 + 023929 9999 99 99 0 9999 99 9999 + 023930 9999 99 99 0 9999 99 9999 + 023931 9999 99 99 0 9999 99 9999 + 023932 9999 99 99 0 9999 99 9999 + 023933 9999 99 99 0 9999 99 9999 + 023934 9999 99 99 0 9999 99 9999 + 023935 9999 99 99 0 9999 99 9999 + 023936 9999 99 99 0 9999 99 9999 + 023937 9999 99 99 0 9999 99 9999 + 023938 9999 99 99 0 9999 99 9999 + 023939 9999 99 99 0 9999 99 9999 + 023940 9999 99 99 0 9999 99 9999 + 023941 9999 99 99 0 9999 99 9999 + 023942 9999 99 99 0 9999 99 9999 + 023943 9999 99 99 0 9999 99 9999 + 023944 9999 99 99 0 9999 99 9999 + 023945 9999 99 99 0 9999 99 9999 + 023946 9999 99 99 0 9999 99 9999 + 023947 9999 99 99 0 9999 99 9999 + 023948 9999 99 99 0 9999 99 9999 + 023949 9999 99 99 0 9999 99 9999 + 023950 9999 99 99 0 9999 99 9999 + 023951 9999 99 99 0 9999 99 9999 + 023952 9999 99 99 0 9999 99 9999 + 023953 9999 99 99 0 9999 99 9999 + 023954 9999 99 99 0 9999 99 9999 + 023955 9999 99 99 0 9999 99 9999 + 023956 9999 99 99 0 9999 99 9999 + 023957 9999 99 99 0 9999 99 9999 + 023958 9999 99 99 0 9999 99 9999 + 023959 9999 99 99 0 9999 99 9999 + 023960 9999 99 99 0 9999 99 9999 + 023961 9999 99 99 0 9999 99 9999 + 023962 9999 99 99 0 9999 99 9999 + 023963 9999 99 99 0 9999 99 9999 + 023964 9999 99 99 0 9999 99 9999 + 023965 9999 99 99 0 9999 99 9999 + 023966 9999 99 99 0 9999 99 9999 + 023967 9999 99 99 0 9999 99 9999 + 023968 9999 99 99 0 9999 99 9999 + 023969 9999 99 99 0 9999 99 9999 + 023970 9999 99 99 0 9999 99 9999 + 023971 9999 99 99 0 9999 99 9999 + 023972 9999 99 99 0 9999 99 9999 + 023973 9999 99 99 0 9999 99 9999 + 023974 9999 99 99 0 9999 99 9999 + 023975 9999 99 99 0 9999 99 9999 + 023976 9999 99 99 0 9999 99 9999 + 023977 9999 99 99 0 9999 99 9999 + 023978 9999 99 99 0 9999 99 9999 + 023979 9999 99 99 0 9999 99 9999 + 023980 9999 99 99 0 9999 99 9999 + 023981 9999 99 99 0 9999 99 9999 + 023982 9999 99 99 0 9999 99 9999 + 023983 9999 99 99 0 9999 99 9999 + 023984 9999 99 99 0 9999 99 9999 + 023985 9999 99 99 0 9999 99 9999 + 023986 9999 99 99 0 9999 99 9999 + 023987 9999 99 99 0 9999 99 9999 + 023988 9999 99 99 0 9999 99 9999 + 023989 9999 99 99 0 9999 99 9999 + 023990 9999 99 99 0 9999 99 9999 + 023991 9999 99 99 0 9999 99 9999 + 023992 9999 99 99 0 9999 99 9999 + 023993 9999 99 99 0 9999 99 9999 + 023994 9999 99 99 0 9999 99 9999 + 023995 9999 99 99 0 9999 99 9999 + 023996 9999 99 99 0 9999 99 9999 + 023997 9999 99 99 0 9999 99 9999 + 023998 9999 99 99 0 9999 99 9999 + 023999 9999 99 99 0 9999 99 9999 + 024000 9999 99 99 0 9999 99 9999 + 024001 1262 25 01 1 305197064 00 0433 + 024002 1262 25 02 1 305197064 01 0433 + 024003 1262 25 03 1 305197064 02 0433 + 024004 1262 25 04 1 305197064 03 0433 + 024005 1262 25 05 1 305197064 04 0433 + 024006 1262 25 06 1 305197064 05 0433 + 024007 1262 25 07 1 305197064 06 0433 + 024008 1262 25 08 1 305197064 07 0433 + 024009 1262 26 01 1 305197064 08 0433 + 024010 1262 26 02 1 305197064 09 0433 + 024011 1262 26 03 1 305197064 10 0433 + 024012 1262 26 04 1 305197064 11 0433 + 024013 1262 26 05 1 305197064 12 0433 + 024014 1262 26 06 1 305197064 13 0433 + 024015 1262 26 07 1 305197064 14 0433 + 024016 1262 26 08 1 305197064 15 0433 + 024017 1262 27 01 1 305197060 00 0432 + 024018 1262 27 02 1 305197060 01 0432 + 024019 1262 27 03 1 305197060 02 0432 + 024020 1262 27 04 1 305197060 03 0432 + 024021 1262 27 05 1 305197060 04 0432 + 024022 1262 27 06 1 305197060 05 0432 + 024023 1262 27 07 1 305197060 06 0432 + 024024 1262 27 08 1 305197060 07 0432 + 024025 1262 28 01 1 305197060 08 0432 + 024026 1262 28 02 1 305197060 09 0432 + 024027 1262 28 03 1 305197060 10 0432 + 024028 1262 28 04 1 305197060 11 0432 + 024029 1262 28 05 1 305197060 12 0432 + 024030 1262 28 06 1 305197060 13 0432 + 024031 1262 28 07 1 305197060 14 0432 + 024032 1262 28 08 1 305197060 15 0432 + 024033 1262 29 01 1 305197072 00 0435 + 024034 1262 29 02 1 305197072 01 0435 + 024035 1262 29 03 1 305197072 02 0435 + 024036 1262 29 04 1 305197072 03 0435 + 024037 1262 29 05 1 305197072 04 0435 + 024038 1262 29 06 1 305197072 05 0435 + 024039 1262 29 07 1 305197072 06 0435 + 024040 1262 29 08 1 305197072 07 0435 + 024041 1262 30 01 1 305197072 08 0435 + 024042 1262 30 02 1 305197072 09 0435 + 024043 1262 30 03 1 305197072 10 0435 + 024044 1262 30 04 1 305197072 11 0435 + 024045 1262 30 05 1 305197072 12 0435 + 024046 1262 30 06 1 305197072 13 0435 + 024047 1262 30 07 1 305197072 14 0435 + 024048 1262 30 08 1 305197072 15 0435 + 024049 1262 31 01 1 305197068 00 0434 + 024050 1262 31 02 1 305197068 01 0434 + 024051 1262 31 03 1 305197068 02 0434 + 024052 1262 31 04 1 305197068 03 0434 + 024053 1262 31 05 1 305197068 04 0434 + 024054 1262 31 06 1 305197068 05 0434 + 024055 1262 31 07 1 305197068 06 0434 + 024056 1262 31 08 1 305197068 07 0434 + 024057 1262 32 01 1 305197068 08 0434 + 024058 1262 32 02 1 305197068 09 0434 + 024059 1262 32 03 1 305197068 10 0434 + 024060 1262 32 04 1 305197068 11 0434 + 024061 1262 32 05 1 305197068 12 0434 + 024062 1262 32 06 1 305197068 13 0434 + 024063 1262 32 07 1 305197068 14 0434 + 024064 1262 32 08 1 305197068 15 0434 + 024065 1262 33 01 1 305201164 00 0442 + 024066 1262 33 02 1 305201164 01 0442 + 024067 1262 33 03 1 305201164 02 0442 + 024068 1262 33 04 1 305201164 03 0442 + 024069 1262 33 05 1 305201164 04 0442 + 024070 1262 33 06 1 305201164 05 0442 + 024071 1262 33 07 1 305201164 06 0442 + 024072 1262 33 08 1 305201164 07 0442 + 024073 1262 34 01 1 305201164 08 0442 + 024074 1262 34 02 1 305201164 09 0442 + 024075 1262 34 03 1 305201164 10 0442 + 024076 1262 34 04 1 305201164 11 0442 + 024077 1262 34 05 1 305201164 12 0442 + 024078 1262 34 06 1 305201164 13 0442 + 024079 1262 34 07 1 305201164 14 0442 + 024080 1262 34 08 1 305201164 15 0442 + 024081 1262 35 01 1 305201168 00 0443 + 024082 1262 35 02 1 305201168 01 0443 + 024083 1262 35 03 1 305201168 02 0443 + 024084 1262 35 04 1 305201168 03 0443 + 024085 1262 35 05 1 305201168 04 0443 + 024086 1262 35 06 1 305201168 05 0443 + 024087 1262 35 07 1 305201168 06 0443 + 024088 1262 35 08 1 305201168 07 0443 + 024089 1262 36 01 1 305201168 08 0443 + 024090 1262 36 02 1 305201168 09 0443 + 024091 1262 36 03 1 305201168 10 0443 + 024092 1262 36 04 1 305201168 11 0443 + 024093 1262 36 05 1 305201168 12 0443 + 024094 1262 36 06 1 305201168 13 0443 + 024095 1262 36 07 1 305201168 14 0443 + 024096 1262 36 08 1 305201168 15 0443 + 024097 1262 37 01 1 305201156 00 0440 + 024098 1262 37 02 1 305201156 01 0440 + 024099 1262 37 03 1 305201156 02 0440 + 024100 1262 37 04 1 305201156 03 0440 + 024101 1262 37 05 1 305201156 04 0440 + 024102 1262 37 06 1 305201156 05 0440 + 024103 1262 37 07 1 305201156 06 0440 + 024104 1262 37 08 1 305201156 07 0440 + 024105 1262 38 01 1 305201156 08 0440 + 024106 1262 38 02 1 305201156 09 0440 + 024107 1262 38 03 1 305201156 10 0440 + 024108 1262 38 04 1 305201156 11 0440 + 024109 1262 38 05 1 305201156 12 0440 + 024110 1262 38 06 1 305201156 13 0440 + 024111 1262 38 07 1 305201156 14 0440 + 024112 1262 38 08 1 305201156 15 0440 + 024113 1262 39 01 1 305201160 00 0441 + 024114 1262 39 02 1 305201160 01 0441 + 024115 1262 39 03 1 305201160 02 0441 + 024116 1262 39 04 1 305201160 03 0441 + 024117 1262 39 05 1 305201160 04 0441 + 024118 1262 39 06 1 305201160 05 0441 + 024119 1262 39 07 1 305201160 06 0441 + 024120 1262 39 08 1 305201160 07 0441 + 024121 1262 40 01 1 305201160 08 0441 + 024122 1262 40 02 1 305201160 09 0441 + 024123 1262 40 03 1 305201160 10 0441 + 024124 1262 40 04 1 305201160 11 0441 + 024125 1262 40 05 1 305201160 12 0441 + 024126 1262 40 06 1 305201160 13 0441 + 024127 1262 40 07 1 305201160 14 0441 + 024128 1262 40 08 1 305201160 15 0441 + 024129 9999 99 99 0 9999 99 9999 + 024130 9999 99 99 0 9999 99 9999 + 024131 9999 99 99 0 9999 99 9999 + 024132 9999 99 99 0 9999 99 9999 + 024133 9999 99 99 0 9999 99 9999 + 024134 9999 99 99 0 9999 99 9999 + 024135 9999 99 99 0 9999 99 9999 + 024136 9999 99 99 0 9999 99 9999 + 024137 9999 99 99 0 9999 99 9999 + 024138 9999 99 99 0 9999 99 9999 + 024139 9999 99 99 0 9999 99 9999 + 024140 9999 99 99 0 9999 99 9999 + 024141 9999 99 99 0 9999 99 9999 + 024142 9999 99 99 0 9999 99 9999 + 024143 9999 99 99 0 9999 99 9999 + 024144 9999 99 99 0 9999 99 9999 + 024145 9999 99 99 0 9999 99 9999 + 024146 9999 99 99 0 9999 99 9999 + 024147 9999 99 99 0 9999 99 9999 + 024148 9999 99 99 0 9999 99 9999 + 024149 9999 99 99 0 9999 99 9999 + 024150 9999 99 99 0 9999 99 9999 + 024151 9999 99 99 0 9999 99 9999 + 024152 9999 99 99 0 9999 99 9999 + 024153 9999 99 99 0 9999 99 9999 + 024154 9999 99 99 0 9999 99 9999 + 024155 9999 99 99 0 9999 99 9999 + 024156 9999 99 99 0 9999 99 9999 + 024157 9999 99 99 0 9999 99 9999 + 024158 9999 99 99 0 9999 99 9999 + 024159 9999 99 99 0 9999 99 9999 + 024160 9999 99 99 0 9999 99 9999 + 024161 9999 99 99 0 9999 99 9999 + 024162 9999 99 99 0 9999 99 9999 + 024163 9999 99 99 0 9999 99 9999 + 024164 9999 99 99 0 9999 99 9999 + 024165 9999 99 99 0 9999 99 9999 + 024166 9999 99 99 0 9999 99 9999 + 024167 9999 99 99 0 9999 99 9999 + 024168 9999 99 99 0 9999 99 9999 + 024169 9999 99 99 0 9999 99 9999 + 024170 9999 99 99 0 9999 99 9999 + 024171 9999 99 99 0 9999 99 9999 + 024172 9999 99 99 0 9999 99 9999 + 024173 9999 99 99 0 9999 99 9999 + 024174 9999 99 99 0 9999 99 9999 + 024175 9999 99 99 0 9999 99 9999 + 024176 9999 99 99 0 9999 99 9999 + 024177 9999 99 99 0 9999 99 9999 + 024178 9999 99 99 0 9999 99 9999 + 024179 9999 99 99 0 9999 99 9999 + 024180 9999 99 99 0 9999 99 9999 + 024181 9999 99 99 0 9999 99 9999 + 024182 9999 99 99 0 9999 99 9999 + 024183 9999 99 99 0 9999 99 9999 + 024184 9999 99 99 0 9999 99 9999 + 024185 9999 99 99 0 9999 99 9999 + 024186 9999 99 99 0 9999 99 9999 + 024187 9999 99 99 0 9999 99 9999 + 024188 9999 99 99 0 9999 99 9999 + 024189 9999 99 99 0 9999 99 9999 + 024190 9999 99 99 0 9999 99 9999 + 024191 9999 99 99 0 9999 99 9999 + 024192 9999 99 99 0 9999 99 9999 + 024193 1263 01 01 1 303054864 08 0027 + 024194 1263 01 02 1 303054864 09 0027 + 024195 9999 99 99 0 9999 99 9999 + 024196 9999 99 99 0 9999 99 9999 + 024197 9999 99 99 0 9999 99 9999 + 024198 9999 99 99 0 9999 99 9999 + 024199 9999 99 99 0 9999 99 9999 + 024200 9999 99 99 0 9999 99 9999 + 024201 1263 02 01 1 303054864 10 0027 + 024202 1263 02 02 1 303054864 11 0027 + 024203 9999 99 99 0 9999 99 9999 + 024204 9999 99 99 0 9999 99 9999 + 024205 9999 99 99 0 9999 99 9999 + 024206 9999 99 99 0 9999 99 9999 + 024207 9999 99 99 0 9999 99 9999 + 024208 9999 99 99 0 9999 99 9999 + 024209 1263 03 01 1 303054864 12 0027 + 024210 1263 03 02 1 303054864 13 0027 + 024211 9999 99 99 0 9999 99 9999 + 024212 9999 99 99 0 9999 99 9999 + 024213 9999 99 99 0 9999 99 9999 + 024214 9999 99 99 0 9999 99 9999 + 024215 9999 99 99 0 9999 99 9999 + 024216 9999 99 99 0 9999 99 9999 + 024217 1263 04 01 1 303054864 14 0027 + 024218 1263 04 02 1 303054864 15 0027 + 024219 9999 99 99 0 9999 99 9999 + 024220 9999 99 99 0 9999 99 9999 + 024221 9999 99 99 0 9999 99 9999 + 024222 9999 99 99 0 9999 99 9999 + 024223 9999 99 99 0 9999 99 9999 + 024224 9999 99 99 0 9999 99 9999 + 024225 1263 05 01 1 303054864 00 0027 + 024226 1263 05 02 1 303054864 01 0027 + 024227 9999 99 99 0 9999 99 9999 + 024228 9999 99 99 0 9999 99 9999 + 024229 9999 99 99 0 9999 99 9999 + 024230 9999 99 99 0 9999 99 9999 + 024231 9999 99 99 0 9999 99 9999 + 024232 9999 99 99 0 9999 99 9999 + 024233 1263 06 01 1 303054864 02 0027 + 024234 1263 06 02 1 303054864 03 0027 + 024235 9999 99 99 0 9999 99 9999 + 024236 9999 99 99 0 9999 99 9999 + 024237 9999 99 99 0 9999 99 9999 + 024238 9999 99 99 0 9999 99 9999 + 024239 9999 99 99 0 9999 99 9999 + 024240 9999 99 99 0 9999 99 9999 + 024241 1263 07 01 1 303054864 04 0027 + 024242 1263 07 02 1 303054864 05 0027 + 024243 9999 99 99 0 9999 99 9999 + 024244 9999 99 99 0 9999 99 9999 + 024245 9999 99 99 0 9999 99 9999 + 024246 9999 99 99 0 9999 99 9999 + 024247 9999 99 99 0 9999 99 9999 + 024248 9999 99 99 0 9999 99 9999 + 024249 1263 08 01 1 303054864 06 0027 + 024250 1263 08 02 1 303054864 07 0027 + 024251 9999 99 99 0 9999 99 9999 + 024252 9999 99 99 0 9999 99 9999 + 024253 9999 99 99 0 9999 99 9999 + 024254 9999 99 99 0 9999 99 9999 + 024255 9999 99 99 0 9999 99 9999 + 024256 9999 99 99 0 9999 99 9999 + 024257 1263 09 01 1 304128012 00 0170 + 024258 1263 09 02 1 304128012 01 0170 + 024259 1263 09 03 1 304128012 02 0170 + 024260 1263 09 04 1 304128012 03 0170 + 024261 9999 99 99 0 9999 99 9999 + 024262 9999 99 99 0 9999 99 9999 + 024263 9999 99 99 0 9999 99 9999 + 024264 9999 99 99 0 9999 99 9999 + 024265 1263 10 01 1 304128012 04 0170 + 024266 1263 10 02 1 304128012 05 0170 + 024267 1263 10 03 1 304128012 06 0170 + 024268 1263 10 04 1 304128012 07 0170 + 024269 9999 99 99 0 9999 99 9999 + 024270 9999 99 99 0 9999 99 9999 + 024271 9999 99 99 0 9999 99 9999 + 024272 9999 99 99 0 9999 99 9999 + 024273 1263 11 01 1 304128012 08 0170 + 024274 1263 11 02 1 304128012 09 0170 + 024275 1263 11 03 1 304128012 10 0170 + 024276 1263 11 04 1 304128012 11 0170 + 024277 9999 99 99 0 9999 99 9999 + 024278 9999 99 99 0 9999 99 9999 + 024279 9999 99 99 0 9999 99 9999 + 024280 9999 99 99 0 9999 99 9999 + 024281 1263 12 01 1 304128012 12 0170 + 024282 1263 12 02 1 304128012 13 0170 + 024283 1263 12 03 1 304128012 14 0170 + 024284 1263 12 04 1 304128012 15 0170 + 024285 9999 99 99 0 9999 99 9999 + 024286 9999 99 99 0 9999 99 9999 + 024287 9999 99 99 0 9999 99 9999 + 024288 9999 99 99 0 9999 99 9999 + 024289 1263 13 01 1 304128016 08 0171 + 024290 1263 13 02 1 304128016 09 0171 + 024291 1263 13 03 1 304128016 10 0171 + 024292 1263 13 04 1 304128016 11 0171 + 024293 9999 99 99 0 9999 99 9999 + 024294 9999 99 99 0 9999 99 9999 + 024295 9999 99 99 0 9999 99 9999 + 024296 9999 99 99 0 9999 99 9999 + 024297 1263 14 01 1 304128016 12 0171 + 024298 1263 14 02 1 304128016 13 0171 + 024299 1263 14 03 1 304128016 14 0171 + 024300 1263 14 04 1 304128016 15 0171 + 024301 9999 99 99 0 9999 99 9999 + 024302 9999 99 99 0 9999 99 9999 + 024303 9999 99 99 0 9999 99 9999 + 024304 9999 99 99 0 9999 99 9999 + 024305 1263 15 01 1 304128016 00 0171 + 024306 1263 15 02 1 304128016 01 0171 + 024307 1263 15 03 1 304128016 02 0171 + 024308 1263 15 04 1 304128016 03 0171 + 024309 9999 99 99 0 9999 99 9999 + 024310 9999 99 99 0 9999 99 9999 + 024311 9999 99 99 0 9999 99 9999 + 024312 9999 99 99 0 9999 99 9999 + 024313 1263 16 01 1 304128016 04 0171 + 024314 1263 16 02 1 304128016 05 0171 + 024315 1263 16 03 1 304128016 06 0171 + 024316 1263 16 04 1 304128016 07 0171 + 024317 9999 99 99 0 9999 99 9999 + 024318 9999 99 99 0 9999 99 9999 + 024319 9999 99 99 0 9999 99 9999 + 024320 9999 99 99 0 9999 99 9999 + 024321 1263 17 01 1 306270216 00 0833 + 024322 1263 17 02 1 306270216 01 0833 + 024323 1263 17 03 1 306270216 02 0833 + 024324 1263 17 04 1 306270216 03 0833 + 024325 1263 17 05 1 306270216 04 0833 + 024326 1263 17 06 1 306270216 05 0833 + 024327 1263 17 07 1 306270216 06 0833 + 024328 1263 17 08 1 306270216 07 0833 + 024329 1263 18 01 1 306270216 08 0833 + 024330 1263 18 02 1 306270216 09 0833 + 024331 1263 18 03 1 306270216 10 0833 + 024332 1263 18 04 1 306270216 11 0833 + 024333 1263 18 05 1 306270216 12 0833 + 024334 1263 18 06 1 306270216 13 0833 + 024335 1263 18 07 1 306270216 14 0833 + 024336 1263 18 08 1 306270216 15 0833 + 024337 1263 19 01 1 306270212 00 0832 + 024338 1263 19 02 1 306270212 01 0832 + 024339 1263 19 03 1 306270212 02 0832 + 024340 1263 19 04 1 306270212 03 0832 + 024341 1263 19 05 1 306270212 04 0832 + 024342 1263 19 06 1 306270212 05 0832 + 024343 1263 19 07 1 306270212 06 0832 + 024344 1263 19 08 1 306270212 07 0832 + 024345 1263 20 01 1 306270212 08 0832 + 024346 1263 20 02 1 306270212 09 0832 + 024347 1263 20 03 1 306270212 10 0832 + 024348 1263 20 04 1 306270212 11 0832 + 024349 1263 20 05 1 306270212 12 0832 + 024350 1263 20 06 1 306270212 13 0832 + 024351 1263 20 07 1 306270212 14 0832 + 024352 1263 20 08 1 306270212 15 0832 + 024353 1263 21 01 1 306270224 00 0835 + 024354 1263 21 02 1 306270224 01 0835 + 024355 1263 21 03 1 306270224 02 0835 + 024356 1263 21 04 1 306270224 03 0835 + 024357 1263 21 05 1 306270224 04 0835 + 024358 1263 21 06 1 306270224 05 0835 + 024359 1263 21 07 1 306270224 06 0835 + 024360 1263 21 08 1 306270224 07 0835 + 024361 1263 22 01 1 306270224 08 0835 + 024362 1263 22 02 1 306270224 09 0835 + 024363 1263 22 03 1 306270224 10 0835 + 024364 1263 22 04 1 306270224 11 0835 + 024365 1263 22 05 1 306270224 12 0835 + 024366 1263 22 06 1 306270224 13 0835 + 024367 1263 22 07 1 306270224 14 0835 + 024368 1263 22 08 1 306270224 15 0835 + 024369 1263 23 01 1 306270220 00 0834 + 024370 1263 23 02 1 306270220 01 0834 + 024371 1263 23 03 1 306270220 02 0834 + 024372 1263 23 04 1 306270220 03 0834 + 024373 1263 23 05 1 306270220 04 0834 + 024374 1263 23 06 1 306270220 05 0834 + 024375 1263 23 07 1 306270220 06 0834 + 024376 1263 23 08 1 306270220 07 0834 + 024377 1263 24 01 1 306270220 08 0834 + 024378 1263 24 02 1 306270220 09 0834 + 024379 1263 24 03 1 306270220 10 0834 + 024380 1263 24 04 1 306270220 11 0834 + 024381 1263 24 05 1 306270220 12 0834 + 024382 1263 24 06 1 306270220 13 0834 + 024383 1263 24 07 1 306270220 14 0834 + 024384 1263 24 08 1 306270220 15 0834 + 024385 1263 25 01 1 303058952 08 0033 + 024386 1263 25 02 1 303058952 09 0033 + 024387 9999 99 99 0 9999 99 9999 + 024388 9999 99 99 0 9999 99 9999 + 024389 9999 99 99 0 9999 99 9999 + 024390 9999 99 99 0 9999 99 9999 + 024391 9999 99 99 0 9999 99 9999 + 024392 9999 99 99 0 9999 99 9999 + 024393 1263 26 01 1 303058952 10 0033 + 024394 1263 26 02 1 303058952 11 0033 + 024395 9999 99 99 0 9999 99 9999 + 024396 9999 99 99 0 9999 99 9999 + 024397 9999 99 99 0 9999 99 9999 + 024398 9999 99 99 0 9999 99 9999 + 024399 9999 99 99 0 9999 99 9999 + 024400 9999 99 99 0 9999 99 9999 + 024401 1263 27 01 1 303058952 12 0033 + 024402 1263 27 02 1 303058952 13 0033 + 024403 9999 99 99 0 9999 99 9999 + 024404 9999 99 99 0 9999 99 9999 + 024405 9999 99 99 0 9999 99 9999 + 024406 9999 99 99 0 9999 99 9999 + 024407 9999 99 99 0 9999 99 9999 + 024408 9999 99 99 0 9999 99 9999 + 024409 1263 28 01 1 303058952 14 0033 + 024410 1263 28 02 1 303058952 15 0033 + 024411 9999 99 99 0 9999 99 9999 + 024412 9999 99 99 0 9999 99 9999 + 024413 9999 99 99 0 9999 99 9999 + 024414 9999 99 99 0 9999 99 9999 + 024415 9999 99 99 0 9999 99 9999 + 024416 9999 99 99 0 9999 99 9999 + 024417 1263 29 01 1 303058952 04 0033 + 024418 1263 29 02 1 303058952 05 0033 + 024419 9999 99 99 0 9999 99 9999 + 024420 9999 99 99 0 9999 99 9999 + 024421 9999 99 99 0 9999 99 9999 + 024422 9999 99 99 0 9999 99 9999 + 024423 9999 99 99 0 9999 99 9999 + 024424 9999 99 99 0 9999 99 9999 + 024425 1263 30 01 1 303058952 06 0033 + 024426 1263 30 02 1 303058952 07 0033 + 024427 9999 99 99 0 9999 99 9999 + 024428 9999 99 99 0 9999 99 9999 + 024429 9999 99 99 0 9999 99 9999 + 024430 9999 99 99 0 9999 99 9999 + 024431 9999 99 99 0 9999 99 9999 + 024432 9999 99 99 0 9999 99 9999 + 024433 1263 31 01 1 303058952 00 0033 + 024434 1263 31 02 1 303058952 01 0033 + 024435 9999 99 99 0 9999 99 9999 + 024436 9999 99 99 0 9999 99 9999 + 024437 9999 99 99 0 9999 99 9999 + 024438 9999 99 99 0 9999 99 9999 + 024439 9999 99 99 0 9999 99 9999 + 024440 9999 99 99 0 9999 99 9999 + 024441 1263 32 01 1 303058952 02 0033 + 024442 1263 32 02 1 303058952 03 0033 + 024443 9999 99 99 0 9999 99 9999 + 024444 9999 99 99 0 9999 99 9999 + 024445 9999 99 99 0 9999 99 9999 + 024446 9999 99 99 0 9999 99 9999 + 024447 9999 99 99 0 9999 99 9999 + 024448 9999 99 99 0 9999 99 9999 + 024449 1263 33 01 1 306274312 00 0841 + 024450 1263 33 02 1 306274312 01 0841 + 024451 1263 33 03 1 306274312 02 0841 + 024452 1263 33 04 1 306274312 03 0841 + 024453 1263 33 05 1 306274312 04 0841 + 024454 1263 33 06 1 306274312 05 0841 + 024455 1263 33 07 1 306274312 06 0841 + 024456 1263 33 08 1 306274312 07 0841 + 024457 1263 34 01 1 306274312 08 0841 + 024458 1263 34 02 1 306274312 09 0841 + 024459 1263 34 03 1 306274312 10 0841 + 024460 1263 34 04 1 306274312 11 0841 + 024461 1263 34 05 1 306274312 12 0841 + 024462 1263 34 06 1 306274312 13 0841 + 024463 1263 34 07 1 306274312 14 0841 + 024464 1263 34 08 1 306274312 15 0841 + 024465 1263 35 01 1 306274308 00 0840 + 024466 1263 35 02 1 306274308 01 0840 + 024467 1263 35 03 1 306274308 02 0840 + 024468 1263 35 04 1 306274308 03 0840 + 024469 1263 35 05 1 306274308 04 0840 + 024470 1263 35 06 1 306274308 05 0840 + 024471 1263 35 07 1 306274308 06 0840 + 024472 1263 35 08 1 306274308 07 0840 + 024473 1263 36 01 1 306274308 08 0840 + 024474 1263 36 02 1 306274308 09 0840 + 024475 1263 36 03 1 306274308 10 0840 + 024476 1263 36 04 1 306274308 11 0840 + 024477 1263 36 05 1 306274308 12 0840 + 024478 1263 36 06 1 306274308 13 0840 + 024479 1263 36 07 1 306274308 14 0840 + 024480 1263 36 08 1 306274308 15 0840 + 024481 1263 37 01 1 306274320 00 0843 + 024482 1263 37 02 1 306274320 01 0843 + 024483 1263 37 03 1 306274320 02 0843 + 024484 1263 37 04 1 306274320 03 0843 + 024485 1263 37 05 1 306274320 04 0843 + 024486 1263 37 06 1 306274320 05 0843 + 024487 1263 37 07 1 306274320 06 0843 + 024488 1263 37 08 1 306274320 07 0843 + 024489 1263 38 01 1 306274320 08 0843 + 024490 1263 38 02 1 306274320 09 0843 + 024491 1263 38 03 1 306274320 10 0843 + 024492 1263 38 04 1 306274320 11 0843 + 024493 1263 38 05 1 306274320 12 0843 + 024494 1263 38 06 1 306274320 13 0843 + 024495 1263 38 07 1 306274320 14 0843 + 024496 1263 38 08 1 306274320 15 0843 + 024497 1263 39 01 1 306274316 00 0842 + 024498 1263 39 02 1 306274316 01 0842 + 024499 1263 39 03 1 306274316 02 0842 + 024500 1263 39 04 1 306274316 03 0842 + 024501 1263 39 05 1 306274316 04 0842 + 024502 1263 39 06 1 306274316 05 0842 + 024503 1263 39 07 1 306274316 06 0842 + 024504 1263 39 08 1 306274316 07 0842 + 024505 1263 40 01 1 306274316 08 0842 + 024506 1263 40 02 1 306274316 09 0842 + 024507 1263 40 03 1 306274316 10 0842 + 024508 1263 40 04 1 306274316 11 0842 + 024509 1263 40 05 1 306274316 12 0842 + 024510 1263 40 06 1 306274316 13 0842 + 024511 1263 40 07 1 306274316 14 0842 + 024512 1263 40 08 1 306274316 15 0842 + 024513 1263 41 01 1 304128008 00 0169 + 024514 1263 41 02 1 304128008 01 0169 + 024515 1263 41 03 1 304128008 02 0169 + 024516 1263 41 04 1 304128008 03 0169 + 024517 9999 99 99 0 9999 99 9999 + 024518 9999 99 99 0 9999 99 9999 + 024519 9999 99 99 0 9999 99 9999 + 024520 9999 99 99 0 9999 99 9999 + 024521 1263 42 01 1 304128008 04 0169 + 024522 1263 42 02 1 304128008 05 0169 + 024523 1263 42 03 1 304128008 06 0169 + 024524 1263 42 04 1 304128008 07 0169 + 024525 9999 99 99 0 9999 99 9999 + 024526 9999 99 99 0 9999 99 9999 + 024527 9999 99 99 0 9999 99 9999 + 024528 9999 99 99 0 9999 99 9999 + 024529 1263 43 01 1 304128008 08 0169 + 024530 1263 43 02 1 304128008 09 0169 + 024531 1263 43 03 1 304128008 10 0169 + 024532 1263 43 04 1 304128008 11 0169 + 024533 9999 99 99 0 9999 99 9999 + 024534 9999 99 99 0 9999 99 9999 + 024535 9999 99 99 0 9999 99 9999 + 024536 9999 99 99 0 9999 99 9999 + 024537 1263 44 01 1 304128008 12 0169 + 024538 1263 44 02 1 304128008 13 0169 + 024539 1263 44 03 1 304128008 14 0169 + 024540 1263 44 04 1 304128008 15 0169 + 024541 9999 99 99 0 9999 99 9999 + 024542 9999 99 99 0 9999 99 9999 + 024543 9999 99 99 0 9999 99 9999 + 024544 9999 99 99 0 9999 99 9999 + 024545 1263 45 01 1 304128004 00 0168 + 024546 1263 45 02 1 304128004 01 0168 + 024547 1263 45 03 1 304128004 02 0168 + 024548 1263 45 04 1 304128004 03 0168 + 024549 9999 99 99 0 9999 99 9999 + 024550 9999 99 99 0 9999 99 9999 + 024551 9999 99 99 0 9999 99 9999 + 024552 9999 99 99 0 9999 99 9999 + 024553 1263 46 01 1 304128004 04 0168 + 024554 1263 46 02 1 304128004 05 0168 + 024555 1263 46 03 1 304128004 06 0168 + 024556 1263 46 04 1 304128004 07 0168 + 024557 9999 99 99 0 9999 99 9999 + 024558 9999 99 99 0 9999 99 9999 + 024559 9999 99 99 0 9999 99 9999 + 024560 9999 99 99 0 9999 99 9999 + 024561 1263 47 01 1 304128004 08 0168 + 024562 1263 47 02 1 304128004 09 0168 + 024563 1263 47 03 1 304128004 10 0168 + 024564 1263 47 04 1 304128004 11 0168 + 024565 9999 99 99 0 9999 99 9999 + 024566 9999 99 99 0 9999 99 9999 + 024567 9999 99 99 0 9999 99 9999 + 024568 9999 99 99 0 9999 99 9999 + 024569 1263 48 01 1 304128004 12 0168 + 024570 1263 48 02 1 304128004 13 0168 + 024571 1263 48 03 1 304128004 14 0168 + 024572 1263 48 04 1 304128004 15 0168 + 024573 9999 99 99 0 9999 99 9999 + 024574 9999 99 99 0 9999 99 9999 + 024575 9999 99 99 0 9999 99 9999 + 024576 9999 99 99 0 9999 99 9999 + 024577 1264 01 01 1 304132108 08 0178 + 024578 1264 01 02 1 304132108 09 0178 + 024579 1264 01 03 1 304132108 10 0178 + 024580 1264 01 04 1 304132108 11 0178 + 024581 9999 99 99 0 9999 99 9999 + 024582 9999 99 99 0 9999 99 9999 + 024583 9999 99 99 0 9999 99 9999 + 024584 9999 99 99 0 9999 99 9999 + 024585 1264 02 01 1 304132108 12 0178 + 024586 1264 02 02 1 304132108 13 0178 + 024587 1264 02 03 1 304132108 14 0178 + 024588 1264 02 04 1 304132108 15 0178 + 024589 9999 99 99 0 9999 99 9999 + 024590 9999 99 99 0 9999 99 9999 + 024591 9999 99 99 0 9999 99 9999 + 024592 9999 99 99 0 9999 99 9999 + 024593 1264 03 01 1 304132108 00 0178 + 024594 1264 03 02 1 304132108 01 0178 + 024595 1264 03 03 1 304132108 02 0178 + 024596 1264 03 04 1 304132108 03 0178 + 024597 9999 99 99 0 9999 99 9999 + 024598 9999 99 99 0 9999 99 9999 + 024599 9999 99 99 0 9999 99 9999 + 024600 9999 99 99 0 9999 99 9999 + 024601 1264 04 01 1 304132108 04 0178 + 024602 1264 04 02 1 304132108 05 0178 + 024603 1264 04 03 1 304132108 06 0178 + 024604 1264 04 04 1 304132108 07 0178 + 024605 9999 99 99 0 9999 99 9999 + 024606 9999 99 99 0 9999 99 9999 + 024607 9999 99 99 0 9999 99 9999 + 024608 9999 99 99 0 9999 99 9999 + 024609 1264 05 01 1 304132112 08 0179 + 024610 1264 05 02 1 304132112 09 0179 + 024611 1264 05 03 1 304132112 10 0179 + 024612 1264 05 04 1 304132112 11 0179 + 024613 9999 99 99 0 9999 99 9999 + 024614 9999 99 99 0 9999 99 9999 + 024615 9999 99 99 0 9999 99 9999 + 024616 9999 99 99 0 9999 99 9999 + 024617 1264 06 01 1 304132112 12 0179 + 024618 1264 06 02 1 304132112 13 0179 + 024619 1264 06 03 1 304132112 14 0179 + 024620 1264 06 04 1 304132112 15 0179 + 024621 9999 99 99 0 9999 99 9999 + 024622 9999 99 99 0 9999 99 9999 + 024623 9999 99 99 0 9999 99 9999 + 024624 9999 99 99 0 9999 99 9999 + 024625 1264 07 01 1 304132112 00 0179 + 024626 1264 07 02 1 304132112 01 0179 + 024627 1264 07 03 1 304132112 02 0179 + 024628 1264 07 04 1 304132112 03 0179 + 024629 9999 99 99 0 9999 99 9999 + 024630 9999 99 99 0 9999 99 9999 + 024631 9999 99 99 0 9999 99 9999 + 024632 9999 99 99 0 9999 99 9999 + 024633 1264 08 01 1 304132112 04 0179 + 024634 1264 08 02 1 304132112 05 0179 + 024635 1264 08 03 1 304132112 06 0179 + 024636 1264 08 04 1 304132112 07 0179 + 024637 9999 99 99 0 9999 99 9999 + 024638 9999 99 99 0 9999 99 9999 + 024639 9999 99 99 0 9999 99 9999 + 024640 9999 99 99 0 9999 99 9999 + 024641 1264 09 01 1 306278412 00 0850 + 024642 1264 09 02 1 306278412 01 0850 + 024643 1264 09 03 1 306278412 02 0850 + 024644 1264 09 04 1 306278412 03 0850 + 024645 1264 09 05 1 306278412 04 0850 + 024646 1264 09 06 1 306278412 05 0850 + 024647 1264 09 07 1 306278412 06 0850 + 024648 1264 09 08 1 306278412 07 0850 + 024649 1264 10 01 1 306278412 08 0850 + 024650 1264 10 02 1 306278412 09 0850 + 024651 1264 10 03 1 306278412 10 0850 + 024652 1264 10 04 1 306278412 11 0850 + 024653 1264 10 05 1 306278412 12 0850 + 024654 1264 10 06 1 306278412 13 0850 + 024655 1264 10 07 1 306278412 14 0850 + 024656 1264 10 08 1 306278412 15 0850 + 024657 1264 11 01 1 306278416 00 0851 + 024658 1264 11 02 1 306278416 01 0851 + 024659 1264 11 03 1 306278416 02 0851 + 024660 1264 11 04 1 306278416 03 0851 + 024661 1264 11 05 1 306278416 04 0851 + 024662 1264 11 06 1 306278416 05 0851 + 024663 1264 11 07 1 306278416 06 0851 + 024664 1264 11 08 1 306278416 07 0851 + 024665 1264 12 01 1 306278416 08 0851 + 024666 1264 12 02 1 306278416 09 0851 + 024667 1264 12 03 1 306278416 10 0851 + 024668 1264 12 04 1 306278416 11 0851 + 024669 1264 12 05 1 306278416 12 0851 + 024670 1264 12 06 1 306278416 13 0851 + 024671 1264 12 07 1 306278416 14 0851 + 024672 1264 12 08 1 306278416 15 0851 + 024673 1264 13 01 1 306278404 00 0848 + 024674 1264 13 02 1 306278404 01 0848 + 024675 1264 13 03 1 306278404 02 0848 + 024676 1264 13 04 1 306278404 03 0848 + 024677 1264 13 05 1 306278404 04 0848 + 024678 1264 13 06 1 306278404 05 0848 + 024679 1264 13 07 1 306278404 06 0848 + 024680 1264 13 08 1 306278404 07 0848 + 024681 1264 14 01 1 306278404 08 0848 + 024682 1264 14 02 1 306278404 09 0848 + 024683 1264 14 03 1 306278404 10 0848 + 024684 1264 14 04 1 306278404 11 0848 + 024685 1264 14 05 1 306278404 12 0848 + 024686 1264 14 06 1 306278404 13 0848 + 024687 1264 14 07 1 306278404 14 0848 + 024688 1264 14 08 1 306278404 15 0848 + 024689 1264 15 01 1 306278408 00 0849 + 024690 1264 15 02 1 306278408 01 0849 + 024691 1264 15 03 1 306278408 02 0849 + 024692 1264 15 04 1 306278408 03 0849 + 024693 1264 15 05 1 306278408 04 0849 + 024694 1264 15 06 1 306278408 05 0849 + 024695 1264 15 07 1 306278408 06 0849 + 024696 1264 15 08 1 306278408 07 0849 + 024697 1264 16 01 1 306278408 08 0849 + 024698 1264 16 02 1 306278408 09 0849 + 024699 1264 16 03 1 306278408 10 0849 + 024700 1264 16 04 1 306278408 11 0849 + 024701 1264 16 05 1 306278408 12 0849 + 024702 1264 16 06 1 306278408 13 0849 + 024703 1264 16 07 1 306278408 14 0849 + 024704 1264 16 08 1 306278408 15 0849 + 024705 1264 17 01 1 303058948 12 0032 + 024706 1264 17 02 1 303058948 13 0032 + 024707 9999 99 99 0 9999 99 9999 + 024708 9999 99 99 0 9999 99 9999 + 024709 9999 99 99 0 9999 99 9999 + 024710 9999 99 99 0 9999 99 9999 + 024711 9999 99 99 0 9999 99 9999 + 024712 9999 99 99 0 9999 99 9999 + 024713 1264 18 01 1 303058948 14 0032 + 024714 1264 18 02 1 303058948 15 0032 + 024715 9999 99 99 0 9999 99 9999 + 024716 9999 99 99 0 9999 99 9999 + 024717 9999 99 99 0 9999 99 9999 + 024718 9999 99 99 0 9999 99 9999 + 024719 9999 99 99 0 9999 99 9999 + 024720 9999 99 99 0 9999 99 9999 + 024721 1264 19 01 1 303058948 08 0032 + 024722 1264 19 02 1 303058948 09 0032 + 024723 9999 99 99 0 9999 99 9999 + 024724 9999 99 99 0 9999 99 9999 + 024725 9999 99 99 0 9999 99 9999 + 024726 9999 99 99 0 9999 99 9999 + 024727 9999 99 99 0 9999 99 9999 + 024728 9999 99 99 0 9999 99 9999 + 024729 1264 20 01 1 303058948 10 0032 + 024730 1264 20 02 1 303058948 11 0032 + 024731 9999 99 99 0 9999 99 9999 + 024732 9999 99 99 0 9999 99 9999 + 024733 9999 99 99 0 9999 99 9999 + 024734 9999 99 99 0 9999 99 9999 + 024735 9999 99 99 0 9999 99 9999 + 024736 9999 99 99 0 9999 99 9999 + 024737 1264 21 01 1 303058948 00 0032 + 024738 1264 21 02 1 303058948 01 0032 + 024739 9999 99 99 0 9999 99 9999 + 024740 9999 99 99 0 9999 99 9999 + 024741 9999 99 99 0 9999 99 9999 + 024742 9999 99 99 0 9999 99 9999 + 024743 9999 99 99 0 9999 99 9999 + 024744 9999 99 99 0 9999 99 9999 + 024745 1264 22 01 1 303058948 02 0032 + 024746 1264 22 02 1 303058948 03 0032 + 024747 9999 99 99 0 9999 99 9999 + 024748 9999 99 99 0 9999 99 9999 + 024749 9999 99 99 0 9999 99 9999 + 024750 9999 99 99 0 9999 99 9999 + 024751 9999 99 99 0 9999 99 9999 + 024752 9999 99 99 0 9999 99 9999 + 024753 1264 23 01 1 303058948 04 0032 + 024754 1264 23 02 1 303058948 05 0032 + 024755 9999 99 99 0 9999 99 9999 + 024756 9999 99 99 0 9999 99 9999 + 024757 9999 99 99 0 9999 99 9999 + 024758 9999 99 99 0 9999 99 9999 + 024759 9999 99 99 0 9999 99 9999 + 024760 9999 99 99 0 9999 99 9999 + 024761 1264 24 01 1 303058948 06 0032 + 024762 1264 24 02 1 303058948 07 0032 + 024763 9999 99 99 0 9999 99 9999 + 024764 9999 99 99 0 9999 99 9999 + 024765 9999 99 99 0 9999 99 9999 + 024766 9999 99 99 0 9999 99 9999 + 024767 9999 99 99 0 9999 99 9999 + 024768 9999 99 99 0 9999 99 9999 + 024769 1264 25 01 1 305192968 00 0425 + 024770 1264 25 02 1 305192968 01 0425 + 024771 1264 25 03 1 305192968 02 0425 + 024772 1264 25 04 1 305192968 03 0425 + 024773 1264 25 05 1 305192968 04 0425 + 024774 1264 25 06 1 305192968 05 0425 + 024775 1264 25 07 1 305192968 06 0425 + 024776 1264 25 08 1 305192968 07 0425 + 024777 1264 26 01 1 305192968 08 0425 + 024778 1264 26 02 1 305192968 09 0425 + 024779 1264 26 03 1 305192968 10 0425 + 024780 1264 26 04 1 305192968 11 0425 + 024781 1264 26 05 1 305192968 12 0425 + 024782 1264 26 06 1 305192968 13 0425 + 024783 1264 26 07 1 305192968 14 0425 + 024784 1264 26 08 1 305192968 15 0425 + 024785 1264 27 01 1 305192964 00 0424 + 024786 1264 27 02 1 305192964 01 0424 + 024787 1264 27 03 1 305192964 02 0424 + 024788 1264 27 04 1 305192964 03 0424 + 024789 1264 27 05 1 305192964 04 0424 + 024790 1264 27 06 1 305192964 05 0424 + 024791 1264 27 07 1 305192964 06 0424 + 024792 1264 27 08 1 305192964 07 0424 + 024793 1264 28 01 1 305192964 08 0424 + 024794 1264 28 02 1 305192964 09 0424 + 024795 1264 28 03 1 305192964 10 0424 + 024796 1264 28 04 1 305192964 11 0424 + 024797 1264 28 05 1 305192964 12 0424 + 024798 1264 28 06 1 305192964 13 0424 + 024799 1264 28 07 1 305192964 14 0424 + 024800 1264 28 08 1 305192964 15 0424 + 024801 1264 29 01 1 305192976 00 0427 + 024802 1264 29 02 1 305192976 01 0427 + 024803 1264 29 03 1 305192976 02 0427 + 024804 1264 29 04 1 305192976 03 0427 + 024805 1264 29 05 1 305192976 04 0427 + 024806 1264 29 06 1 305192976 05 0427 + 024807 1264 29 07 1 305192976 06 0427 + 024808 1264 29 08 1 305192976 07 0427 + 024809 1264 30 01 1 305192976 08 0427 + 024810 1264 30 02 1 305192976 09 0427 + 024811 1264 30 03 1 305192976 10 0427 + 024812 1264 30 04 1 305192976 11 0427 + 024813 1264 30 05 1 305192976 12 0427 + 024814 1264 30 06 1 305192976 13 0427 + 024815 1264 30 07 1 305192976 14 0427 + 024816 1264 30 08 1 305192976 15 0427 + 024817 1264 31 01 1 305192972 00 0426 + 024818 1264 31 02 1 305192972 01 0426 + 024819 1264 31 03 1 305192972 02 0426 + 024820 1264 31 04 1 305192972 03 0426 + 024821 1264 31 05 1 305192972 04 0426 + 024822 1264 31 06 1 305192972 05 0426 + 024823 1264 31 07 1 305192972 06 0426 + 024824 1264 31 08 1 305192972 07 0426 + 024825 1264 32 01 1 305192972 08 0426 + 024826 1264 32 02 1 305192972 09 0426 + 024827 1264 32 03 1 305192972 10 0426 + 024828 1264 32 04 1 305192972 11 0426 + 024829 1264 32 05 1 305192972 12 0426 + 024830 1264 32 06 1 305192972 13 0426 + 024831 1264 32 07 1 305192972 14 0426 + 024832 1264 32 08 1 305192972 15 0426 + 024833 1264 33 01 1 306282508 00 0858 + 024834 1264 33 02 1 306282508 01 0858 + 024835 1264 33 03 1 306282508 02 0858 + 024836 1264 33 04 1 306282508 03 0858 + 024837 1264 33 05 1 306282508 04 0858 + 024838 1264 33 06 1 306282508 05 0858 + 024839 1264 33 07 1 306282508 06 0858 + 024840 1264 33 08 1 306282508 07 0858 + 024841 1264 34 01 1 306282508 08 0858 + 024842 1264 34 02 1 306282508 09 0858 + 024843 1264 34 03 1 306282508 10 0858 + 024844 1264 34 04 1 306282508 11 0858 + 024845 1264 34 05 1 306282508 12 0858 + 024846 1264 34 06 1 306282508 13 0858 + 024847 1264 34 07 1 306282508 14 0858 + 024848 1264 34 08 1 306282508 15 0858 + 024849 1264 35 01 1 306282512 00 0859 + 024850 1264 35 02 1 306282512 01 0859 + 024851 1264 35 03 1 306282512 02 0859 + 024852 1264 35 04 1 306282512 03 0859 + 024853 1264 35 05 1 306282512 04 0859 + 024854 1264 35 06 1 306282512 05 0859 + 024855 1264 35 07 1 306282512 06 0859 + 024856 1264 35 08 1 306282512 07 0859 + 024857 1264 36 01 1 306282512 08 0859 + 024858 1264 36 02 1 306282512 09 0859 + 024859 1264 36 03 1 306282512 10 0859 + 024860 1264 36 04 1 306282512 11 0859 + 024861 1264 36 05 1 306282512 12 0859 + 024862 1264 36 06 1 306282512 13 0859 + 024863 1264 36 07 1 306282512 14 0859 + 024864 1264 36 08 1 306282512 15 0859 + 024865 1264 37 01 1 306282500 00 0856 + 024866 1264 37 02 1 306282500 01 0856 + 024867 1264 37 03 1 306282500 02 0856 + 024868 1264 37 04 1 306282500 03 0856 + 024869 1264 37 05 1 306282500 04 0856 + 024870 1264 37 06 1 306282500 05 0856 + 024871 1264 37 07 1 306282500 06 0856 + 024872 1264 37 08 1 306282500 07 0856 + 024873 1264 38 01 1 306282500 08 0856 + 024874 1264 38 02 1 306282500 09 0856 + 024875 1264 38 03 1 306282500 10 0856 + 024876 1264 38 04 1 306282500 11 0856 + 024877 1264 38 05 1 306282500 12 0856 + 024878 1264 38 06 1 306282500 13 0856 + 024879 1264 38 07 1 306282500 14 0856 + 024880 1264 38 08 1 306282500 15 0856 + 024881 1264 39 01 1 306282504 00 0857 + 024882 1264 39 02 1 306282504 01 0857 + 024883 1264 39 03 1 306282504 02 0857 + 024884 1264 39 04 1 306282504 03 0857 + 024885 1264 39 05 1 306282504 04 0857 + 024886 1264 39 06 1 306282504 05 0857 + 024887 1264 39 07 1 306282504 06 0857 + 024888 1264 39 08 1 306282504 07 0857 + 024889 1264 40 01 1 306282504 08 0857 + 024890 1264 40 02 1 306282504 09 0857 + 024891 1264 40 03 1 306282504 10 0857 + 024892 1264 40 04 1 306282504 11 0857 + 024893 1264 40 05 1 306282504 12 0857 + 024894 1264 40 06 1 306282504 13 0857 + 024895 1264 40 07 1 306282504 14 0857 + 024896 1264 40 08 1 306282504 15 0857 + 024897 1264 41 01 1 304132100 08 0176 + 024898 1264 41 02 1 304132100 09 0176 + 024899 1264 41 03 1 304132100 10 0176 + 024900 1264 41 04 1 304132100 11 0176 + 024901 9999 99 99 0 9999 99 9999 + 024902 9999 99 99 0 9999 99 9999 + 024903 9999 99 99 0 9999 99 9999 + 024904 9999 99 99 0 9999 99 9999 + 024905 1264 42 01 1 304132100 12 0176 + 024906 1264 42 02 1 304132100 13 0176 + 024907 1264 42 03 1 304132100 14 0176 + 024908 1264 42 04 1 304132100 15 0176 + 024909 9999 99 99 0 9999 99 9999 + 024910 9999 99 99 0 9999 99 9999 + 024911 9999 99 99 0 9999 99 9999 + 024912 9999 99 99 0 9999 99 9999 + 024913 1264 43 01 1 304132100 00 0176 + 024914 1264 43 02 1 304132100 01 0176 + 024915 1264 43 03 1 304132100 02 0176 + 024916 1264 43 04 1 304132100 03 0176 + 024917 9999 99 99 0 9999 99 9999 + 024918 9999 99 99 0 9999 99 9999 + 024919 9999 99 99 0 9999 99 9999 + 024920 9999 99 99 0 9999 99 9999 + 024921 1264 44 01 1 304132100 04 0176 + 024922 1264 44 02 1 304132100 05 0176 + 024923 1264 44 03 1 304132100 06 0176 + 024924 1264 44 04 1 304132100 07 0176 + 024925 9999 99 99 0 9999 99 9999 + 024926 9999 99 99 0 9999 99 9999 + 024927 9999 99 99 0 9999 99 9999 + 024928 9999 99 99 0 9999 99 9999 + 024929 1264 45 01 1 304132104 08 0177 + 024930 1264 45 02 1 304132104 09 0177 + 024931 1264 45 03 1 304132104 10 0177 + 024932 1264 45 04 1 304132104 11 0177 + 024933 9999 99 99 0 9999 99 9999 + 024934 9999 99 99 0 9999 99 9999 + 024935 9999 99 99 0 9999 99 9999 + 024936 9999 99 99 0 9999 99 9999 + 024937 1264 46 01 1 304132104 12 0177 + 024938 1264 46 02 1 304132104 13 0177 + 024939 1264 46 03 1 304132104 14 0177 + 024940 1264 46 04 1 304132104 15 0177 + 024941 9999 99 99 0 9999 99 9999 + 024942 9999 99 99 0 9999 99 9999 + 024943 9999 99 99 0 9999 99 9999 + 024944 9999 99 99 0 9999 99 9999 + 024945 1264 47 01 1 304132104 00 0177 + 024946 1264 47 02 1 304132104 01 0177 + 024947 1264 47 03 1 304132104 02 0177 + 024948 1264 47 04 1 304132104 03 0177 + 024949 9999 99 99 0 9999 99 9999 + 024950 9999 99 99 0 9999 99 9999 + 024951 9999 99 99 0 9999 99 9999 + 024952 9999 99 99 0 9999 99 9999 + 024953 1264 48 01 1 304132104 04 0177 + 024954 1264 48 02 1 304132104 05 0177 + 024955 1264 48 03 1 304132104 06 0177 + 024956 1264 48 04 1 304132104 07 0177 + 024957 9999 99 99 0 9999 99 9999 + 024958 9999 99 99 0 9999 99 9999 + 024959 9999 99 99 0 9999 99 9999 + 024960 9999 99 99 0 9999 99 9999 + 024961 1265 01 01 1 303058960 08 0035 + 024962 1265 01 02 1 303058960 09 0035 + 024963 9999 99 99 0 9999 99 9999 + 024964 9999 99 99 0 9999 99 9999 + 024965 9999 99 99 0 9999 99 9999 + 024966 9999 99 99 0 9999 99 9999 + 024967 9999 99 99 0 9999 99 9999 + 024968 9999 99 99 0 9999 99 9999 + 024969 1265 02 01 1 303058960 10 0035 + 024970 1265 02 02 1 303058960 11 0035 + 024971 9999 99 99 0 9999 99 9999 + 024972 9999 99 99 0 9999 99 9999 + 024973 9999 99 99 0 9999 99 9999 + 024974 9999 99 99 0 9999 99 9999 + 024975 9999 99 99 0 9999 99 9999 + 024976 9999 99 99 0 9999 99 9999 + 024977 1265 03 01 1 303058960 12 0035 + 024978 1265 03 02 1 303058960 13 0035 + 024979 9999 99 99 0 9999 99 9999 + 024980 9999 99 99 0 9999 99 9999 + 024981 9999 99 99 0 9999 99 9999 + 024982 9999 99 99 0 9999 99 9999 + 024983 9999 99 99 0 9999 99 9999 + 024984 9999 99 99 0 9999 99 9999 + 024985 1265 04 01 1 303058960 14 0035 + 024986 1265 04 02 1 303058960 15 0035 + 024987 9999 99 99 0 9999 99 9999 + 024988 9999 99 99 0 9999 99 9999 + 024989 9999 99 99 0 9999 99 9999 + 024990 9999 99 99 0 9999 99 9999 + 024991 9999 99 99 0 9999 99 9999 + 024992 9999 99 99 0 9999 99 9999 + 024993 1265 05 01 1 303058960 00 0035 + 024994 1265 05 02 1 303058960 01 0035 + 024995 9999 99 99 0 9999 99 9999 + 024996 9999 99 99 0 9999 99 9999 + 024997 9999 99 99 0 9999 99 9999 + 024998 9999 99 99 0 9999 99 9999 + 024999 9999 99 99 0 9999 99 9999 + 025000 9999 99 99 0 9999 99 9999 + 025001 1265 06 01 1 303058960 02 0035 + 025002 1265 06 02 1 303058960 03 0035 + 025003 9999 99 99 0 9999 99 9999 + 025004 9999 99 99 0 9999 99 9999 + 025005 9999 99 99 0 9999 99 9999 + 025006 9999 99 99 0 9999 99 9999 + 025007 9999 99 99 0 9999 99 9999 + 025008 9999 99 99 0 9999 99 9999 + 025009 1265 07 01 1 303058960 04 0035 + 025010 1265 07 02 1 303058960 05 0035 + 025011 9999 99 99 0 9999 99 9999 + 025012 9999 99 99 0 9999 99 9999 + 025013 9999 99 99 0 9999 99 9999 + 025014 9999 99 99 0 9999 99 9999 + 025015 9999 99 99 0 9999 99 9999 + 025016 9999 99 99 0 9999 99 9999 + 025017 1265 08 01 1 303058960 06 0035 + 025018 1265 08 02 1 303058960 07 0035 + 025019 9999 99 99 0 9999 99 9999 + 025020 9999 99 99 0 9999 99 9999 + 025021 9999 99 99 0 9999 99 9999 + 025022 9999 99 99 0 9999 99 9999 + 025023 9999 99 99 0 9999 99 9999 + 025024 9999 99 99 0 9999 99 9999 + 025025 1265 09 01 1 304136204 00 0186 + 025026 1265 09 02 1 304136204 01 0186 + 025027 1265 09 03 1 304136204 02 0186 + 025028 1265 09 04 1 304136204 03 0186 + 025029 9999 99 99 0 9999 99 9999 + 025030 9999 99 99 0 9999 99 9999 + 025031 9999 99 99 0 9999 99 9999 + 025032 9999 99 99 0 9999 99 9999 + 025033 1265 10 01 1 304136204 04 0186 + 025034 1265 10 02 1 304136204 05 0186 + 025035 1265 10 03 1 304136204 06 0186 + 025036 1265 10 04 1 304136204 07 0186 + 025037 9999 99 99 0 9999 99 9999 + 025038 9999 99 99 0 9999 99 9999 + 025039 9999 99 99 0 9999 99 9999 + 025040 9999 99 99 0 9999 99 9999 + 025041 1265 11 01 1 304136204 08 0186 + 025042 1265 11 02 1 304136204 09 0186 + 025043 1265 11 03 1 304136204 10 0186 + 025044 1265 11 04 1 304136204 11 0186 + 025045 9999 99 99 0 9999 99 9999 + 025046 9999 99 99 0 9999 99 9999 + 025047 9999 99 99 0 9999 99 9999 + 025048 9999 99 99 0 9999 99 9999 + 025049 1265 12 01 1 304136204 12 0186 + 025050 1265 12 02 1 304136204 13 0186 + 025051 1265 12 03 1 304136204 14 0186 + 025052 1265 12 04 1 304136204 15 0186 + 025053 9999 99 99 0 9999 99 9999 + 025054 9999 99 99 0 9999 99 9999 + 025055 9999 99 99 0 9999 99 9999 + 025056 9999 99 99 0 9999 99 9999 + 025057 1265 13 01 1 304136208 08 0187 + 025058 1265 13 02 1 304136208 09 0187 + 025059 1265 13 03 1 304136208 10 0187 + 025060 1265 13 04 1 304136208 11 0187 + 025061 9999 99 99 0 9999 99 9999 + 025062 9999 99 99 0 9999 99 9999 + 025063 9999 99 99 0 9999 99 9999 + 025064 9999 99 99 0 9999 99 9999 + 025065 1265 14 01 1 304136208 12 0187 + 025066 1265 14 02 1 304136208 13 0187 + 025067 1265 14 03 1 304136208 14 0187 + 025068 1265 14 04 1 304136208 15 0187 + 025069 9999 99 99 0 9999 99 9999 + 025070 9999 99 99 0 9999 99 9999 + 025071 9999 99 99 0 9999 99 9999 + 025072 9999 99 99 0 9999 99 9999 + 025073 1265 15 01 1 304136208 00 0187 + 025074 1265 15 02 1 304136208 01 0187 + 025075 1265 15 03 1 304136208 02 0187 + 025076 1265 15 04 1 304136208 03 0187 + 025077 9999 99 99 0 9999 99 9999 + 025078 9999 99 99 0 9999 99 9999 + 025079 9999 99 99 0 9999 99 9999 + 025080 9999 99 99 0 9999 99 9999 + 025081 1265 16 01 1 304136208 04 0187 + 025082 1265 16 02 1 304136208 05 0187 + 025083 1265 16 03 1 304136208 06 0187 + 025084 1265 16 04 1 304136208 07 0187 + 025085 9999 99 99 0 9999 99 9999 + 025086 9999 99 99 0 9999 99 9999 + 025087 9999 99 99 0 9999 99 9999 + 025088 9999 99 99 0 9999 99 9999 + 025089 1265 17 01 1 306286600 00 0865 + 025090 1265 17 02 1 306286600 01 0865 + 025091 1265 17 03 1 306286600 02 0865 + 025092 1265 17 04 1 306286600 03 0865 + 025093 1265 17 05 1 306286600 04 0865 + 025094 1265 17 06 1 306286600 05 0865 + 025095 1265 17 07 1 306286600 06 0865 + 025096 1265 17 08 1 306286600 07 0865 + 025097 1265 18 01 1 306286600 08 0865 + 025098 1265 18 02 1 306286600 09 0865 + 025099 1265 18 03 1 306286600 10 0865 + 025100 1265 18 04 1 306286600 11 0865 + 025101 1265 18 05 1 306286600 12 0865 + 025102 1265 18 06 1 306286600 13 0865 + 025103 1265 18 07 1 306286600 14 0865 + 025104 1265 18 08 1 306286600 15 0865 + 025105 1265 19 01 1 306286596 00 0864 + 025106 1265 19 02 1 306286596 01 0864 + 025107 1265 19 03 1 306286596 02 0864 + 025108 1265 19 04 1 306286596 03 0864 + 025109 1265 19 05 1 306286596 04 0864 + 025110 1265 19 06 1 306286596 05 0864 + 025111 1265 19 07 1 306286596 06 0864 + 025112 1265 19 08 1 306286596 07 0864 + 025113 1265 20 01 1 306286596 08 0864 + 025114 1265 20 02 1 306286596 09 0864 + 025115 1265 20 03 1 306286596 10 0864 + 025116 1265 20 04 1 306286596 11 0864 + 025117 1265 20 05 1 306286596 12 0864 + 025118 1265 20 06 1 306286596 13 0864 + 025119 1265 20 07 1 306286596 14 0864 + 025120 1265 20 08 1 306286596 15 0864 + 025121 1265 21 01 1 306286608 00 0867 + 025122 1265 21 02 1 306286608 01 0867 + 025123 1265 21 03 1 306286608 02 0867 + 025124 1265 21 04 1 306286608 03 0867 + 025125 1265 21 05 1 306286608 04 0867 + 025126 1265 21 06 1 306286608 05 0867 + 025127 1265 21 07 1 306286608 06 0867 + 025128 1265 21 08 1 306286608 07 0867 + 025129 1265 22 01 1 306286608 08 0867 + 025130 1265 22 02 1 306286608 09 0867 + 025131 1265 22 03 1 306286608 10 0867 + 025132 1265 22 04 1 306286608 11 0867 + 025133 1265 22 05 1 306286608 12 0867 + 025134 1265 22 06 1 306286608 13 0867 + 025135 1265 22 07 1 306286608 14 0867 + 025136 1265 22 08 1 306286608 15 0867 + 025137 1265 23 01 1 306286604 00 0866 + 025138 1265 23 02 1 306286604 01 0866 + 025139 1265 23 03 1 306286604 02 0866 + 025140 1265 23 04 1 306286604 03 0866 + 025141 1265 23 05 1 306286604 04 0866 + 025142 1265 23 06 1 306286604 05 0866 + 025143 1265 23 07 1 306286604 06 0866 + 025144 1265 23 08 1 306286604 07 0866 + 025145 1265 24 01 1 306286604 08 0866 + 025146 1265 24 02 1 306286604 09 0866 + 025147 1265 24 03 1 306286604 10 0866 + 025148 1265 24 04 1 306286604 11 0866 + 025149 1265 24 05 1 306286604 12 0866 + 025150 1265 24 06 1 306286604 13 0866 + 025151 1265 24 07 1 306286604 14 0866 + 025152 1265 24 08 1 306286604 15 0866 + 025153 1265 25 01 1 303058956 08 0034 + 025154 1265 25 02 1 303058956 09 0034 + 025155 9999 99 99 0 9999 99 9999 + 025156 9999 99 99 0 9999 99 9999 + 025157 9999 99 99 0 9999 99 9999 + 025158 9999 99 99 0 9999 99 9999 + 025159 9999 99 99 0 9999 99 9999 + 025160 9999 99 99 0 9999 99 9999 + 025161 1265 26 01 1 303058956 10 0034 + 025162 1265 26 02 1 303058956 11 0034 + 025163 9999 99 99 0 9999 99 9999 + 025164 9999 99 99 0 9999 99 9999 + 025165 9999 99 99 0 9999 99 9999 + 025166 9999 99 99 0 9999 99 9999 + 025167 9999 99 99 0 9999 99 9999 + 025168 9999 99 99 0 9999 99 9999 + 025169 1265 27 01 1 303058956 12 0034 + 025170 1265 27 02 1 303058956 13 0034 + 025171 9999 99 99 0 9999 99 9999 + 025172 9999 99 99 0 9999 99 9999 + 025173 9999 99 99 0 9999 99 9999 + 025174 9999 99 99 0 9999 99 9999 + 025175 9999 99 99 0 9999 99 9999 + 025176 9999 99 99 0 9999 99 9999 + 025177 1265 28 01 1 303058956 14 0034 + 025178 1265 28 02 1 303058956 15 0034 + 025179 9999 99 99 0 9999 99 9999 + 025180 9999 99 99 0 9999 99 9999 + 025181 9999 99 99 0 9999 99 9999 + 025182 9999 99 99 0 9999 99 9999 + 025183 9999 99 99 0 9999 99 9999 + 025184 9999 99 99 0 9999 99 9999 + 025185 1265 29 01 1 303058956 04 0034 + 025186 1265 29 02 1 303058956 05 0034 + 025187 9999 99 99 0 9999 99 9999 + 025188 9999 99 99 0 9999 99 9999 + 025189 9999 99 99 0 9999 99 9999 + 025190 9999 99 99 0 9999 99 9999 + 025191 9999 99 99 0 9999 99 9999 + 025192 9999 99 99 0 9999 99 9999 + 025193 1265 30 01 1 303058956 06 0034 + 025194 1265 30 02 1 303058956 07 0034 + 025195 9999 99 99 0 9999 99 9999 + 025196 9999 99 99 0 9999 99 9999 + 025197 9999 99 99 0 9999 99 9999 + 025198 9999 99 99 0 9999 99 9999 + 025199 9999 99 99 0 9999 99 9999 + 025200 9999 99 99 0 9999 99 9999 + 025201 1265 31 01 1 303058956 00 0034 + 025202 1265 31 02 1 303058956 01 0034 + 025203 9999 99 99 0 9999 99 9999 + 025204 9999 99 99 0 9999 99 9999 + 025205 9999 99 99 0 9999 99 9999 + 025206 9999 99 99 0 9999 99 9999 + 025207 9999 99 99 0 9999 99 9999 + 025208 9999 99 99 0 9999 99 9999 + 025209 1265 32 01 1 303058956 02 0034 + 025210 1265 32 02 1 303058956 03 0034 + 025211 9999 99 99 0 9999 99 9999 + 025212 9999 99 99 0 9999 99 9999 + 025213 9999 99 99 0 9999 99 9999 + 025214 9999 99 99 0 9999 99 9999 + 025215 9999 99 99 0 9999 99 9999 + 025216 9999 99 99 0 9999 99 9999 + 025217 1265 33 01 1 306290696 00 0873 + 025218 1265 33 02 1 306290696 01 0873 + 025219 1265 33 03 1 306290696 02 0873 + 025220 1265 33 04 1 306290696 03 0873 + 025221 1265 33 05 1 306290696 04 0873 + 025222 1265 33 06 1 306290696 05 0873 + 025223 1265 33 07 1 306290696 06 0873 + 025224 1265 33 08 1 306290696 07 0873 + 025225 1265 34 01 1 306290696 08 0873 + 025226 1265 34 02 1 306290696 09 0873 + 025227 1265 34 03 1 306290696 10 0873 + 025228 1265 34 04 1 306290696 11 0873 + 025229 1265 34 05 1 306290696 12 0873 + 025230 1265 34 06 1 306290696 13 0873 + 025231 1265 34 07 1 306290696 14 0873 + 025232 1265 34 08 1 306290696 15 0873 + 025233 1265 35 01 1 306290692 00 0872 + 025234 1265 35 02 1 306290692 01 0872 + 025235 1265 35 03 1 306290692 02 0872 + 025236 1265 35 04 1 306290692 03 0872 + 025237 1265 35 05 1 306290692 04 0872 + 025238 1265 35 06 1 306290692 05 0872 + 025239 1265 35 07 1 306290692 06 0872 + 025240 1265 35 08 1 306290692 07 0872 + 025241 1265 36 01 1 306290692 08 0872 + 025242 1265 36 02 1 306290692 09 0872 + 025243 1265 36 03 1 306290692 10 0872 + 025244 1265 36 04 1 306290692 11 0872 + 025245 1265 36 05 1 306290692 12 0872 + 025246 1265 36 06 1 306290692 13 0872 + 025247 1265 36 07 1 306290692 14 0872 + 025248 1265 36 08 1 306290692 15 0872 + 025249 1265 37 01 1 306290704 00 0875 + 025250 1265 37 02 1 306290704 01 0875 + 025251 1265 37 03 1 306290704 02 0875 + 025252 1265 37 04 1 306290704 03 0875 + 025253 1265 37 05 1 306290704 04 0875 + 025254 1265 37 06 1 306290704 05 0875 + 025255 1265 37 07 1 306290704 06 0875 + 025256 1265 37 08 1 306290704 07 0875 + 025257 1265 38 01 1 306290704 08 0875 + 025258 1265 38 02 1 306290704 09 0875 + 025259 1265 38 03 1 306290704 10 0875 + 025260 1265 38 04 1 306290704 11 0875 + 025261 1265 38 05 1 306290704 12 0875 + 025262 1265 38 06 1 306290704 13 0875 + 025263 1265 38 07 1 306290704 14 0875 + 025264 1265 38 08 1 306290704 15 0875 + 025265 1265 39 01 1 306290700 00 0874 + 025266 1265 39 02 1 306290700 01 0874 + 025267 1265 39 03 1 306290700 02 0874 + 025268 1265 39 04 1 306290700 03 0874 + 025269 1265 39 05 1 306290700 04 0874 + 025270 1265 39 06 1 306290700 05 0874 + 025271 1265 39 07 1 306290700 06 0874 + 025272 1265 39 08 1 306290700 07 0874 + 025273 1265 40 01 1 306290700 08 0874 + 025274 1265 40 02 1 306290700 09 0874 + 025275 1265 40 03 1 306290700 10 0874 + 025276 1265 40 04 1 306290700 11 0874 + 025277 1265 40 05 1 306290700 12 0874 + 025278 1265 40 06 1 306290700 13 0874 + 025279 1265 40 07 1 306290700 14 0874 + 025280 1265 40 08 1 306290700 15 0874 + 025281 1265 41 01 1 304136200 00 0185 + 025282 1265 41 02 1 304136200 01 0185 + 025283 1265 41 03 1 304136200 02 0185 + 025284 1265 41 04 1 304136200 03 0185 + 025285 9999 99 99 0 9999 99 9999 + 025286 9999 99 99 0 9999 99 9999 + 025287 9999 99 99 0 9999 99 9999 + 025288 9999 99 99 0 9999 99 9999 + 025289 1265 42 01 1 304136200 04 0185 + 025290 1265 42 02 1 304136200 05 0185 + 025291 1265 42 03 1 304136200 06 0185 + 025292 1265 42 04 1 304136200 07 0185 + 025293 9999 99 99 0 9999 99 9999 + 025294 9999 99 99 0 9999 99 9999 + 025295 9999 99 99 0 9999 99 9999 + 025296 9999 99 99 0 9999 99 9999 + 025297 1265 43 01 1 304136200 08 0185 + 025298 1265 43 02 1 304136200 09 0185 + 025299 1265 43 03 1 304136200 10 0185 + 025300 1265 43 04 1 304136200 11 0185 + 025301 9999 99 99 0 9999 99 9999 + 025302 9999 99 99 0 9999 99 9999 + 025303 9999 99 99 0 9999 99 9999 + 025304 9999 99 99 0 9999 99 9999 + 025305 1265 44 01 1 304136200 12 0185 + 025306 1265 44 02 1 304136200 13 0185 + 025307 1265 44 03 1 304136200 14 0185 + 025308 1265 44 04 1 304136200 15 0185 + 025309 9999 99 99 0 9999 99 9999 + 025310 9999 99 99 0 9999 99 9999 + 025311 9999 99 99 0 9999 99 9999 + 025312 9999 99 99 0 9999 99 9999 + 025313 1265 45 01 1 304136196 00 0184 + 025314 1265 45 02 1 304136196 01 0184 + 025315 1265 45 03 1 304136196 02 0184 + 025316 1265 45 04 1 304136196 03 0184 + 025317 9999 99 99 0 9999 99 9999 + 025318 9999 99 99 0 9999 99 9999 + 025319 9999 99 99 0 9999 99 9999 + 025320 9999 99 99 0 9999 99 9999 + 025321 1265 46 01 1 304136196 04 0184 + 025322 1265 46 02 1 304136196 05 0184 + 025323 1265 46 03 1 304136196 06 0184 + 025324 1265 46 04 1 304136196 07 0184 + 025325 9999 99 99 0 9999 99 9999 + 025326 9999 99 99 0 9999 99 9999 + 025327 9999 99 99 0 9999 99 9999 + 025328 9999 99 99 0 9999 99 9999 + 025329 1265 47 01 1 304136196 08 0184 + 025330 1265 47 02 1 304136196 09 0184 + 025331 1265 47 03 1 304136196 10 0184 + 025332 1265 47 04 1 304136196 11 0184 + 025333 9999 99 99 0 9999 99 9999 + 025334 9999 99 99 0 9999 99 9999 + 025335 9999 99 99 0 9999 99 9999 + 025336 9999 99 99 0 9999 99 9999 + 025337 1265 48 01 1 304136196 12 0184 + 025338 1265 48 02 1 304136196 13 0184 + 025339 1265 48 03 1 304136196 14 0184 + 025340 1265 48 04 1 304136196 15 0184 + 025341 9999 99 99 0 9999 99 9999 + 025342 9999 99 99 0 9999 99 9999 + 025343 9999 99 99 0 9999 99 9999 + 025344 9999 99 99 0 9999 99 9999 + 025345 1266 01 01 1 306294796 00 0882 + 025346 1266 01 02 1 306294796 01 0882 + 025347 1266 01 03 1 306294796 02 0882 + 025348 1266 01 04 1 306294796 03 0882 + 025349 1266 01 05 1 306294796 04 0882 + 025350 1266 01 06 1 306294796 05 0882 + 025351 1266 01 07 1 306294796 06 0882 + 025352 1266 01 08 1 306294796 07 0882 + 025353 1266 02 01 1 306294796 08 0882 + 025354 1266 02 02 1 306294796 09 0882 + 025355 1266 02 03 1 306294796 10 0882 + 025356 1266 02 04 1 306294796 11 0882 + 025357 1266 02 05 1 306294796 12 0882 + 025358 1266 02 06 1 306294796 13 0882 + 025359 1266 02 07 1 306294796 14 0882 + 025360 1266 02 08 1 306294796 15 0882 + 025361 1266 03 01 1 306294800 00 0883 + 025362 1266 03 02 1 306294800 01 0883 + 025363 1266 03 03 1 306294800 02 0883 + 025364 1266 03 04 1 306294800 03 0883 + 025365 1266 03 05 1 306294800 04 0883 + 025366 1266 03 06 1 306294800 05 0883 + 025367 1266 03 07 1 306294800 06 0883 + 025368 1266 03 08 1 306294800 07 0883 + 025369 1266 04 01 1 306294800 08 0883 + 025370 1266 04 02 1 306294800 09 0883 + 025371 1266 04 03 1 306294800 10 0883 + 025372 1266 04 04 1 306294800 11 0883 + 025373 1266 04 05 1 306294800 12 0883 + 025374 1266 04 06 1 306294800 13 0883 + 025375 1266 04 07 1 306294800 14 0883 + 025376 1266 04 08 1 306294800 15 0883 + 025377 1266 05 01 1 306294788 00 0880 + 025378 1266 05 02 1 306294788 01 0880 + 025379 1266 05 03 1 306294788 02 0880 + 025380 1266 05 04 1 306294788 03 0880 + 025381 1266 05 05 1 306294788 04 0880 + 025382 1266 05 06 1 306294788 05 0880 + 025383 1266 05 07 1 306294788 06 0880 + 025384 1266 05 08 1 306294788 07 0880 + 025385 1266 06 01 1 306294788 08 0880 + 025386 1266 06 02 1 306294788 09 0880 + 025387 1266 06 03 1 306294788 10 0880 + 025388 1266 06 04 1 306294788 11 0880 + 025389 1266 06 05 1 306294788 12 0880 + 025390 1266 06 06 1 306294788 13 0880 + 025391 1266 06 07 1 306294788 14 0880 + 025392 1266 06 08 1 306294788 15 0880 + 025393 1266 07 01 1 306294792 00 0881 + 025394 1266 07 02 1 306294792 01 0881 + 025395 1266 07 03 1 306294792 02 0881 + 025396 1266 07 04 1 306294792 03 0881 + 025397 1266 07 05 1 306294792 04 0881 + 025398 1266 07 06 1 306294792 05 0881 + 025399 1266 07 07 1 306294792 06 0881 + 025400 1266 07 08 1 306294792 07 0881 + 025401 1266 08 01 1 306294792 08 0881 + 025402 1266 08 02 1 306294792 09 0881 + 025403 1266 08 03 1 306294792 10 0881 + 025404 1266 08 04 1 306294792 11 0881 + 025405 1266 08 05 1 306294792 12 0881 + 025406 1266 08 06 1 306294792 13 0881 + 025407 1266 08 07 1 306294792 14 0881 + 025408 1266 08 08 1 306294792 15 0881 + 025409 1266 09 01 1 303063044 12 0040 + 025410 1266 09 02 1 303063044 13 0040 + 025411 9999 99 99 0 9999 99 9999 + 025412 9999 99 99 0 9999 99 9999 + 025413 9999 99 99 0 9999 99 9999 + 025414 9999 99 99 0 9999 99 9999 + 025415 9999 99 99 0 9999 99 9999 + 025416 9999 99 99 0 9999 99 9999 + 025417 1266 10 01 1 303063044 14 0040 + 025418 1266 10 02 1 303063044 15 0040 + 025419 9999 99 99 0 9999 99 9999 + 025420 9999 99 99 0 9999 99 9999 + 025421 9999 99 99 0 9999 99 9999 + 025422 9999 99 99 0 9999 99 9999 + 025423 9999 99 99 0 9999 99 9999 + 025424 9999 99 99 0 9999 99 9999 + 025425 1266 11 01 1 303063044 08 0040 + 025426 1266 11 02 1 303063044 09 0040 + 025427 9999 99 99 0 9999 99 9999 + 025428 9999 99 99 0 9999 99 9999 + 025429 9999 99 99 0 9999 99 9999 + 025430 9999 99 99 0 9999 99 9999 + 025431 9999 99 99 0 9999 99 9999 + 025432 9999 99 99 0 9999 99 9999 + 025433 1266 12 01 1 303063044 10 0040 + 025434 1266 12 02 1 303063044 11 0040 + 025435 9999 99 99 0 9999 99 9999 + 025436 9999 99 99 0 9999 99 9999 + 025437 9999 99 99 0 9999 99 9999 + 025438 9999 99 99 0 9999 99 9999 + 025439 9999 99 99 0 9999 99 9999 + 025440 9999 99 99 0 9999 99 9999 + 025441 1266 13 01 1 303063044 00 0040 + 025442 1266 13 02 1 303063044 01 0040 + 025443 9999 99 99 0 9999 99 9999 + 025444 9999 99 99 0 9999 99 9999 + 025445 9999 99 99 0 9999 99 9999 + 025446 9999 99 99 0 9999 99 9999 + 025447 9999 99 99 0 9999 99 9999 + 025448 9999 99 99 0 9999 99 9999 + 025449 1266 14 01 1 303063044 02 0040 + 025450 1266 14 02 1 303063044 03 0040 + 025451 9999 99 99 0 9999 99 9999 + 025452 9999 99 99 0 9999 99 9999 + 025453 9999 99 99 0 9999 99 9999 + 025454 9999 99 99 0 9999 99 9999 + 025455 9999 99 99 0 9999 99 9999 + 025456 9999 99 99 0 9999 99 9999 + 025457 1266 15 01 1 303063044 04 0040 + 025458 1266 15 02 1 303063044 05 0040 + 025459 9999 99 99 0 9999 99 9999 + 025460 9999 99 99 0 9999 99 9999 + 025461 9999 99 99 0 9999 99 9999 + 025462 9999 99 99 0 9999 99 9999 + 025463 9999 99 99 0 9999 99 9999 + 025464 9999 99 99 0 9999 99 9999 + 025465 1266 16 01 1 303063044 06 0040 + 025466 1266 16 02 1 303063044 07 0040 + 025467 9999 99 99 0 9999 99 9999 + 025468 9999 99 99 0 9999 99 9999 + 025469 9999 99 99 0 9999 99 9999 + 025470 9999 99 99 0 9999 99 9999 + 025471 9999 99 99 0 9999 99 9999 + 025472 9999 99 99 0 9999 99 9999 + 025473 1266 17 01 1 305205256 00 0449 + 025474 1266 17 02 1 305205256 01 0449 + 025475 1266 17 03 1 305205256 02 0449 + 025476 1266 17 04 1 305205256 03 0449 + 025477 1266 17 05 1 305205256 04 0449 + 025478 1266 17 06 1 305205256 05 0449 + 025479 1266 17 07 1 305205256 06 0449 + 025480 1266 17 08 1 305205256 07 0449 + 025481 1266 18 01 1 305205256 08 0449 + 025482 1266 18 02 1 305205256 09 0449 + 025483 1266 18 03 1 305205256 10 0449 + 025484 1266 18 04 1 305205256 11 0449 + 025485 1266 18 05 1 305205256 12 0449 + 025486 1266 18 06 1 305205256 13 0449 + 025487 1266 18 07 1 305205256 14 0449 + 025488 1266 18 08 1 305205256 15 0449 + 025489 1266 19 01 1 305205252 00 0448 + 025490 1266 19 02 1 305205252 01 0448 + 025491 1266 19 03 1 305205252 02 0448 + 025492 1266 19 04 1 305205252 03 0448 + 025493 1266 19 05 1 305205252 04 0448 + 025494 1266 19 06 1 305205252 05 0448 + 025495 1266 19 07 1 305205252 06 0448 + 025496 1266 19 08 1 305205252 07 0448 + 025497 1266 20 01 1 305205252 08 0448 + 025498 1266 20 02 1 305205252 09 0448 + 025499 1266 20 03 1 305205252 10 0448 + 025500 1266 20 04 1 305205252 11 0448 + 025501 1266 20 05 1 305205252 12 0448 + 025502 1266 20 06 1 305205252 13 0448 + 025503 1266 20 07 1 305205252 14 0448 + 025504 1266 20 08 1 305205252 15 0448 + 025505 1266 21 01 1 305205264 00 0451 + 025506 1266 21 02 1 305205264 01 0451 + 025507 1266 21 03 1 305205264 02 0451 + 025508 1266 21 04 1 305205264 03 0451 + 025509 1266 21 05 1 305205264 04 0451 + 025510 1266 21 06 1 305205264 05 0451 + 025511 1266 21 07 1 305205264 06 0451 + 025512 1266 21 08 1 305205264 07 0451 + 025513 1266 22 01 1 305205264 08 0451 + 025514 1266 22 02 1 305205264 09 0451 + 025515 1266 22 03 1 305205264 10 0451 + 025516 1266 22 04 1 305205264 11 0451 + 025517 1266 22 05 1 305205264 12 0451 + 025518 1266 22 06 1 305205264 13 0451 + 025519 1266 22 07 1 305205264 14 0451 + 025520 1266 22 08 1 305205264 15 0451 + 025521 1266 23 01 1 305205260 00 0450 + 025522 1266 23 02 1 305205260 01 0450 + 025523 1266 23 03 1 305205260 02 0450 + 025524 1266 23 04 1 305205260 03 0450 + 025525 1266 23 05 1 305205260 04 0450 + 025526 1266 23 06 1 305205260 05 0450 + 025527 1266 23 07 1 305205260 06 0450 + 025528 1266 23 08 1 305205260 07 0450 + 025529 1266 24 01 1 305205260 08 0450 + 025530 1266 24 02 1 305205260 09 0450 + 025531 1266 24 03 1 305205260 10 0450 + 025532 1266 24 04 1 305205260 11 0450 + 025533 1266 24 05 1 305205260 12 0450 + 025534 1266 24 06 1 305205260 13 0450 + 025535 1266 24 07 1 305205260 14 0450 + 025536 1266 24 08 1 305205260 15 0450 + 025537 1266 25 01 1 306298892 00 0890 + 025538 1266 25 02 1 306298892 01 0890 + 025539 1266 25 03 1 306298892 02 0890 + 025540 1266 25 04 1 306298892 03 0890 + 025541 1266 25 05 1 306298892 04 0890 + 025542 1266 25 06 1 306298892 05 0890 + 025543 1266 25 07 1 306298892 06 0890 + 025544 1266 25 08 1 306298892 07 0890 + 025545 1266 26 01 1 306298892 08 0890 + 025546 1266 26 02 1 306298892 09 0890 + 025547 1266 26 03 1 306298892 10 0890 + 025548 1266 26 04 1 306298892 11 0890 + 025549 1266 26 05 1 306298892 12 0890 + 025550 1266 26 06 1 306298892 13 0890 + 025551 1266 26 07 1 306298892 14 0890 + 025552 1266 26 08 1 306298892 15 0890 + 025553 1266 27 01 1 306298896 00 0891 + 025554 1266 27 02 1 306298896 01 0891 + 025555 1266 27 03 1 306298896 02 0891 + 025556 1266 27 04 1 306298896 03 0891 + 025557 1266 27 05 1 306298896 04 0891 + 025558 1266 27 06 1 306298896 05 0891 + 025559 1266 27 07 1 306298896 06 0891 + 025560 1266 27 08 1 306298896 07 0891 + 025561 1266 28 01 1 306298896 08 0891 + 025562 1266 28 02 1 306298896 09 0891 + 025563 1266 28 03 1 306298896 10 0891 + 025564 1266 28 04 1 306298896 11 0891 + 025565 1266 28 05 1 306298896 12 0891 + 025566 1266 28 06 1 306298896 13 0891 + 025567 1266 28 07 1 306298896 14 0891 + 025568 1266 28 08 1 306298896 15 0891 + 025569 1266 29 01 1 306298884 00 0888 + 025570 1266 29 02 1 306298884 01 0888 + 025571 1266 29 03 1 306298884 02 0888 + 025572 1266 29 04 1 306298884 03 0888 + 025573 1266 29 05 1 306298884 04 0888 + 025574 1266 29 06 1 306298884 05 0888 + 025575 1266 29 07 1 306298884 06 0888 + 025576 1266 29 08 1 306298884 07 0888 + 025577 1266 30 01 1 306298884 08 0888 + 025578 1266 30 02 1 306298884 09 0888 + 025579 1266 30 03 1 306298884 10 0888 + 025580 1266 30 04 1 306298884 11 0888 + 025581 1266 30 05 1 306298884 12 0888 + 025582 1266 30 06 1 306298884 13 0888 + 025583 1266 30 07 1 306298884 14 0888 + 025584 1266 30 08 1 306298884 15 0888 + 025585 1266 31 01 1 306298888 00 0889 + 025586 1266 31 02 1 306298888 01 0889 + 025587 1266 31 03 1 306298888 02 0889 + 025588 1266 31 04 1 306298888 03 0889 + 025589 1266 31 05 1 306298888 04 0889 + 025590 1266 31 06 1 306298888 05 0889 + 025591 1266 31 07 1 306298888 06 0889 + 025592 1266 31 08 1 306298888 07 0889 + 025593 1266 32 01 1 306298888 08 0889 + 025594 1266 32 02 1 306298888 09 0889 + 025595 1266 32 03 1 306298888 10 0889 + 025596 1266 32 04 1 306298888 11 0889 + 025597 1266 32 05 1 306298888 12 0889 + 025598 1266 32 06 1 306298888 13 0889 + 025599 1266 32 07 1 306298888 14 0889 + 025600 1266 32 08 1 306298888 15 0889 + 025601 1266 33 01 1 305209352 00 0457 + 025602 1266 33 02 1 305209352 01 0457 + 025603 1266 33 03 1 305209352 02 0457 + 025604 1266 33 04 1 305209352 03 0457 + 025605 1266 33 05 1 305209352 04 0457 + 025606 1266 33 06 1 305209352 05 0457 + 025607 1266 33 07 1 305209352 06 0457 + 025608 1266 33 08 1 305209352 07 0457 + 025609 1266 34 01 1 305209352 08 0457 + 025610 1266 34 02 1 305209352 09 0457 + 025611 1266 34 03 1 305209352 10 0457 + 025612 1266 34 04 1 305209352 11 0457 + 025613 1266 34 05 1 305209352 12 0457 + 025614 1266 34 06 1 305209352 13 0457 + 025615 1266 34 07 1 305209352 14 0457 + 025616 1266 34 08 1 305209352 15 0457 + 025617 1266 35 01 1 305209348 00 0456 + 025618 1266 35 02 1 305209348 01 0456 + 025619 1266 35 03 1 305209348 02 0456 + 025620 1266 35 04 1 305209348 03 0456 + 025621 1266 35 05 1 305209348 04 0456 + 025622 1266 35 06 1 305209348 05 0456 + 025623 1266 35 07 1 305209348 06 0456 + 025624 1266 35 08 1 305209348 07 0456 + 025625 1266 36 01 1 305209348 08 0456 + 025626 1266 36 02 1 305209348 09 0456 + 025627 1266 36 03 1 305209348 10 0456 + 025628 1266 36 04 1 305209348 11 0456 + 025629 1266 36 05 1 305209348 12 0456 + 025630 1266 36 06 1 305209348 13 0456 + 025631 1266 36 07 1 305209348 14 0456 + 025632 1266 36 08 1 305209348 15 0456 + 025633 1266 37 01 1 305209360 00 0459 + 025634 1266 37 02 1 305209360 01 0459 + 025635 1266 37 03 1 305209360 02 0459 + 025636 1266 37 04 1 305209360 03 0459 + 025637 1266 37 05 1 305209360 04 0459 + 025638 1266 37 06 1 305209360 05 0459 + 025639 1266 37 07 1 305209360 06 0459 + 025640 1266 37 08 1 305209360 07 0459 + 025641 1266 38 01 1 305209360 08 0459 + 025642 1266 38 02 1 305209360 09 0459 + 025643 1266 38 03 1 305209360 10 0459 + 025644 1266 38 04 1 305209360 11 0459 + 025645 1266 38 05 1 305209360 12 0459 + 025646 1266 38 06 1 305209360 13 0459 + 025647 1266 38 07 1 305209360 14 0459 + 025648 1266 38 08 1 305209360 15 0459 + 025649 1266 39 01 1 305209356 00 0458 + 025650 1266 39 02 1 305209356 01 0458 + 025651 1266 39 03 1 305209356 02 0458 + 025652 1266 39 04 1 305209356 03 0458 + 025653 1266 39 05 1 305209356 04 0458 + 025654 1266 39 06 1 305209356 05 0458 + 025655 1266 39 07 1 305209356 06 0458 + 025656 1266 39 08 1 305209356 07 0458 + 025657 1266 40 01 1 305209356 08 0458 + 025658 1266 40 02 1 305209356 09 0458 + 025659 1266 40 03 1 305209356 10 0458 + 025660 1266 40 04 1 305209356 11 0458 + 025661 1266 40 05 1 305209356 12 0458 + 025662 1266 40 06 1 305209356 13 0458 + 025663 1266 40 07 1 305209356 14 0458 + 025664 1266 40 08 1 305209356 15 0458 + 025665 1266 41 01 1 305213452 00 0466 + 025666 1266 41 02 1 305213452 01 0466 + 025667 1266 41 03 1 305213452 02 0466 + 025668 1266 41 04 1 305213452 03 0466 + 025669 1266 41 05 1 305213452 04 0466 + 025670 1266 41 06 1 305213452 05 0466 + 025671 1266 41 07 1 305213452 06 0466 + 025672 1266 41 08 1 305213452 07 0466 + 025673 1266 42 01 1 305213452 08 0466 + 025674 1266 42 02 1 305213452 09 0466 + 025675 1266 42 03 1 305213452 10 0466 + 025676 1266 42 04 1 305213452 11 0466 + 025677 1266 42 05 1 305213452 12 0466 + 025678 1266 42 06 1 305213452 13 0466 + 025679 1266 42 07 1 305213452 14 0466 + 025680 1266 42 08 1 305213452 15 0466 + 025681 1266 43 01 1 305213456 00 0467 + 025682 1266 43 02 1 305213456 01 0467 + 025683 1266 43 03 1 305213456 02 0467 + 025684 1266 43 04 1 305213456 03 0467 + 025685 1266 43 05 1 305213456 04 0467 + 025686 1266 43 06 1 305213456 05 0467 + 025687 1266 43 07 1 305213456 06 0467 + 025688 1266 43 08 1 305213456 07 0467 + 025689 1266 44 01 1 305213456 08 0467 + 025690 1266 44 02 1 305213456 09 0467 + 025691 1266 44 03 1 305213456 10 0467 + 025692 1266 44 04 1 305213456 11 0467 + 025693 1266 44 05 1 305213456 12 0467 + 025694 1266 44 06 1 305213456 13 0467 + 025695 1266 44 07 1 305213456 14 0467 + 025696 1266 44 08 1 305213456 15 0467 + 025697 1266 45 01 1 305213444 00 0464 + 025698 1266 45 02 1 305213444 01 0464 + 025699 1266 45 03 1 305213444 02 0464 + 025700 1266 45 04 1 305213444 03 0464 + 025701 1266 45 05 1 305213444 04 0464 + 025702 1266 45 06 1 305213444 05 0464 + 025703 1266 45 07 1 305213444 06 0464 + 025704 1266 45 08 1 305213444 07 0464 + 025705 1266 46 01 1 305213444 08 0464 + 025706 1266 46 02 1 305213444 09 0464 + 025707 1266 46 03 1 305213444 10 0464 + 025708 1266 46 04 1 305213444 11 0464 + 025709 1266 46 05 1 305213444 12 0464 + 025710 1266 46 06 1 305213444 13 0464 + 025711 1266 46 07 1 305213444 14 0464 + 025712 1266 46 08 1 305213444 15 0464 + 025713 1266 47 01 1 305213448 00 0465 + 025714 1266 47 02 1 305213448 01 0465 + 025715 1266 47 03 1 305213448 02 0465 + 025716 1266 47 04 1 305213448 03 0465 + 025717 1266 47 05 1 305213448 04 0465 + 025718 1266 47 06 1 305213448 05 0465 + 025719 1266 47 07 1 305213448 06 0465 + 025720 1266 47 08 1 305213448 07 0465 + 025721 1266 48 01 1 305213448 08 0465 + 025722 1266 48 02 1 305213448 09 0465 + 025723 1266 48 03 1 305213448 10 0465 + 025724 1266 48 04 1 305213448 11 0465 + 025725 1266 48 05 1 305213448 12 0465 + 025726 1266 48 06 1 305213448 13 0465 + 025727 1266 48 07 1 305213448 14 0465 + 025728 1266 48 08 1 305213448 15 0465 + 025729 1267 01 01 1 303063056 08 0043 + 025730 1267 01 02 1 303063056 09 0043 + 025731 9999 99 99 0 9999 99 9999 + 025732 9999 99 99 0 9999 99 9999 + 025733 9999 99 99 0 9999 99 9999 + 025734 9999 99 99 0 9999 99 9999 + 025735 9999 99 99 0 9999 99 9999 + 025736 9999 99 99 0 9999 99 9999 + 025737 1267 02 01 1 303063056 10 0043 + 025738 1267 02 02 1 303063056 11 0043 + 025739 9999 99 99 0 9999 99 9999 + 025740 9999 99 99 0 9999 99 9999 + 025741 9999 99 99 0 9999 99 9999 + 025742 9999 99 99 0 9999 99 9999 + 025743 9999 99 99 0 9999 99 9999 + 025744 9999 99 99 0 9999 99 9999 + 025745 1267 03 01 1 303063056 12 0043 + 025746 1267 03 02 1 303063056 13 0043 + 025747 9999 99 99 0 9999 99 9999 + 025748 9999 99 99 0 9999 99 9999 + 025749 9999 99 99 0 9999 99 9999 + 025750 9999 99 99 0 9999 99 9999 + 025751 9999 99 99 0 9999 99 9999 + 025752 9999 99 99 0 9999 99 9999 + 025753 1267 04 01 1 303063056 14 0043 + 025754 1267 04 02 1 303063056 15 0043 + 025755 9999 99 99 0 9999 99 9999 + 025756 9999 99 99 0 9999 99 9999 + 025757 9999 99 99 0 9999 99 9999 + 025758 9999 99 99 0 9999 99 9999 + 025759 9999 99 99 0 9999 99 9999 + 025760 9999 99 99 0 9999 99 9999 + 025761 1267 05 01 1 303063056 00 0043 + 025762 1267 05 02 1 303063056 01 0043 + 025763 9999 99 99 0 9999 99 9999 + 025764 9999 99 99 0 9999 99 9999 + 025765 9999 99 99 0 9999 99 9999 + 025766 9999 99 99 0 9999 99 9999 + 025767 9999 99 99 0 9999 99 9999 + 025768 9999 99 99 0 9999 99 9999 + 025769 1267 06 01 1 303063056 02 0043 + 025770 1267 06 02 1 303063056 03 0043 + 025771 9999 99 99 0 9999 99 9999 + 025772 9999 99 99 0 9999 99 9999 + 025773 9999 99 99 0 9999 99 9999 + 025774 9999 99 99 0 9999 99 9999 + 025775 9999 99 99 0 9999 99 9999 + 025776 9999 99 99 0 9999 99 9999 + 025777 1267 07 01 1 303063056 04 0043 + 025778 1267 07 02 1 303063056 05 0043 + 025779 9999 99 99 0 9999 99 9999 + 025780 9999 99 99 0 9999 99 9999 + 025781 9999 99 99 0 9999 99 9999 + 025782 9999 99 99 0 9999 99 9999 + 025783 9999 99 99 0 9999 99 9999 + 025784 9999 99 99 0 9999 99 9999 + 025785 1267 08 01 1 303063056 06 0043 + 025786 1267 08 02 1 303063056 07 0043 + 025787 9999 99 99 0 9999 99 9999 + 025788 9999 99 99 0 9999 99 9999 + 025789 9999 99 99 0 9999 99 9999 + 025790 9999 99 99 0 9999 99 9999 + 025791 9999 99 99 0 9999 99 9999 + 025792 9999 99 99 0 9999 99 9999 + 025793 1267 09 01 1 304140300 00 0194 + 025794 1267 09 02 1 304140300 01 0194 + 025795 1267 09 03 1 304140300 02 0194 + 025796 1267 09 04 1 304140300 03 0194 + 025797 9999 99 99 0 9999 99 9999 + 025798 9999 99 99 0 9999 99 9999 + 025799 9999 99 99 0 9999 99 9999 + 025800 9999 99 99 0 9999 99 9999 + 025801 1267 10 01 1 304140300 04 0194 + 025802 1267 10 02 1 304140300 05 0194 + 025803 1267 10 03 1 304140300 06 0194 + 025804 1267 10 04 1 304140300 07 0194 + 025805 9999 99 99 0 9999 99 9999 + 025806 9999 99 99 0 9999 99 9999 + 025807 9999 99 99 0 9999 99 9999 + 025808 9999 99 99 0 9999 99 9999 + 025809 1267 11 01 1 304140300 08 0194 + 025810 1267 11 02 1 304140300 09 0194 + 025811 1267 11 03 1 304140300 10 0194 + 025812 1267 11 04 1 304140300 11 0194 + 025813 9999 99 99 0 9999 99 9999 + 025814 9999 99 99 0 9999 99 9999 + 025815 9999 99 99 0 9999 99 9999 + 025816 9999 99 99 0 9999 99 9999 + 025817 1267 12 01 1 304140300 12 0194 + 025818 1267 12 02 1 304140300 13 0194 + 025819 1267 12 03 1 304140300 14 0194 + 025820 1267 12 04 1 304140300 15 0194 + 025821 9999 99 99 0 9999 99 9999 + 025822 9999 99 99 0 9999 99 9999 + 025823 9999 99 99 0 9999 99 9999 + 025824 9999 99 99 0 9999 99 9999 + 025825 1267 13 01 1 304140304 08 0195 + 025826 1267 13 02 1 304140304 09 0195 + 025827 1267 13 03 1 304140304 10 0195 + 025828 1267 13 04 1 304140304 11 0195 + 025829 9999 99 99 0 9999 99 9999 + 025830 9999 99 99 0 9999 99 9999 + 025831 9999 99 99 0 9999 99 9999 + 025832 9999 99 99 0 9999 99 9999 + 025833 1267 14 01 1 304140304 12 0195 + 025834 1267 14 02 1 304140304 13 0195 + 025835 1267 14 03 1 304140304 14 0195 + 025836 1267 14 04 1 304140304 15 0195 + 025837 9999 99 99 0 9999 99 9999 + 025838 9999 99 99 0 9999 99 9999 + 025839 9999 99 99 0 9999 99 9999 + 025840 9999 99 99 0 9999 99 9999 + 025841 1267 15 01 1 304140304 00 0195 + 025842 1267 15 02 1 304140304 01 0195 + 025843 1267 15 03 1 304140304 02 0195 + 025844 1267 15 04 1 304140304 03 0195 + 025845 9999 99 99 0 9999 99 9999 + 025846 9999 99 99 0 9999 99 9999 + 025847 9999 99 99 0 9999 99 9999 + 025848 9999 99 99 0 9999 99 9999 + 025849 1267 16 01 1 304140304 04 0195 + 025850 1267 16 02 1 304140304 05 0195 + 025851 1267 16 03 1 304140304 06 0195 + 025852 1267 16 04 1 304140304 07 0195 + 025853 9999 99 99 0 9999 99 9999 + 025854 9999 99 99 0 9999 99 9999 + 025855 9999 99 99 0 9999 99 9999 + 025856 9999 99 99 0 9999 99 9999 + 025857 1267 17 01 1 306302984 00 0897 + 025858 1267 17 02 1 306302984 01 0897 + 025859 1267 17 03 1 306302984 02 0897 + 025860 1267 17 04 1 306302984 03 0897 + 025861 1267 17 05 1 306302984 04 0897 + 025862 1267 17 06 1 306302984 05 0897 + 025863 1267 17 07 1 306302984 06 0897 + 025864 1267 17 08 1 306302984 07 0897 + 025865 1267 18 01 1 306302984 08 0897 + 025866 1267 18 02 1 306302984 09 0897 + 025867 1267 18 03 1 306302984 10 0897 + 025868 1267 18 04 1 306302984 11 0897 + 025869 1267 18 05 1 306302984 12 0897 + 025870 1267 18 06 1 306302984 13 0897 + 025871 1267 18 07 1 306302984 14 0897 + 025872 1267 18 08 1 306302984 15 0897 + 025873 1267 19 01 1 306302980 00 0896 + 025874 1267 19 02 1 306302980 01 0896 + 025875 1267 19 03 1 306302980 02 0896 + 025876 1267 19 04 1 306302980 03 0896 + 025877 1267 19 05 1 306302980 04 0896 + 025878 1267 19 06 1 306302980 05 0896 + 025879 1267 19 07 1 306302980 06 0896 + 025880 1267 19 08 1 306302980 07 0896 + 025881 1267 20 01 1 306302980 08 0896 + 025882 1267 20 02 1 306302980 09 0896 + 025883 1267 20 03 1 306302980 10 0896 + 025884 1267 20 04 1 306302980 11 0896 + 025885 1267 20 05 1 306302980 12 0896 + 025886 1267 20 06 1 306302980 13 0896 + 025887 1267 20 07 1 306302980 14 0896 + 025888 1267 20 08 1 306302980 15 0896 + 025889 1267 21 01 1 306302992 00 0899 + 025890 1267 21 02 1 306302992 01 0899 + 025891 1267 21 03 1 306302992 02 0899 + 025892 1267 21 04 1 306302992 03 0899 + 025893 1267 21 05 1 306302992 04 0899 + 025894 1267 21 06 1 306302992 05 0899 + 025895 1267 21 07 1 306302992 06 0899 + 025896 1267 21 08 1 306302992 07 0899 + 025897 1267 22 01 1 306302992 08 0899 + 025898 1267 22 02 1 306302992 09 0899 + 025899 1267 22 03 1 306302992 10 0899 + 025900 1267 22 04 1 306302992 11 0899 + 025901 1267 22 05 1 306302992 12 0899 + 025902 1267 22 06 1 306302992 13 0899 + 025903 1267 22 07 1 306302992 14 0899 + 025904 1267 22 08 1 306302992 15 0899 + 025905 1267 23 01 1 306302988 00 0898 + 025906 1267 23 02 1 306302988 01 0898 + 025907 1267 23 03 1 306302988 02 0898 + 025908 1267 23 04 1 306302988 03 0898 + 025909 1267 23 05 1 306302988 04 0898 + 025910 1267 23 06 1 306302988 05 0898 + 025911 1267 23 07 1 306302988 06 0898 + 025912 1267 23 08 1 306302988 07 0898 + 025913 1267 24 01 1 306302988 08 0898 + 025914 1267 24 02 1 306302988 09 0898 + 025915 1267 24 03 1 306302988 10 0898 + 025916 1267 24 04 1 306302988 11 0898 + 025917 1267 24 05 1 306302988 12 0898 + 025918 1267 24 06 1 306302988 13 0898 + 025919 1267 24 07 1 306302988 14 0898 + 025920 1267 24 08 1 306302988 15 0898 + 025921 1267 25 01 1 303063052 08 0042 + 025922 1267 25 02 1 303063052 09 0042 + 025923 9999 99 99 0 9999 99 9999 + 025924 9999 99 99 0 9999 99 9999 + 025925 9999 99 99 0 9999 99 9999 + 025926 9999 99 99 0 9999 99 9999 + 025927 9999 99 99 0 9999 99 9999 + 025928 9999 99 99 0 9999 99 9999 + 025929 1267 26 01 1 303063052 10 0042 + 025930 1267 26 02 1 303063052 11 0042 + 025931 9999 99 99 0 9999 99 9999 + 025932 9999 99 99 0 9999 99 9999 + 025933 9999 99 99 0 9999 99 9999 + 025934 9999 99 99 0 9999 99 9999 + 025935 9999 99 99 0 9999 99 9999 + 025936 9999 99 99 0 9999 99 9999 + 025937 1267 27 01 1 303063052 12 0042 + 025938 1267 27 02 1 303063052 13 0042 + 025939 9999 99 99 0 9999 99 9999 + 025940 9999 99 99 0 9999 99 9999 + 025941 9999 99 99 0 9999 99 9999 + 025942 9999 99 99 0 9999 99 9999 + 025943 9999 99 99 0 9999 99 9999 + 025944 9999 99 99 0 9999 99 9999 + 025945 1267 28 01 1 303063052 14 0042 + 025946 1267 28 02 1 303063052 15 0042 + 025947 9999 99 99 0 9999 99 9999 + 025948 9999 99 99 0 9999 99 9999 + 025949 9999 99 99 0 9999 99 9999 + 025950 9999 99 99 0 9999 99 9999 + 025951 9999 99 99 0 9999 99 9999 + 025952 9999 99 99 0 9999 99 9999 + 025953 1267 29 01 1 303063052 04 0042 + 025954 1267 29 02 1 303063052 05 0042 + 025955 9999 99 99 0 9999 99 9999 + 025956 9999 99 99 0 9999 99 9999 + 025957 9999 99 99 0 9999 99 9999 + 025958 9999 99 99 0 9999 99 9999 + 025959 9999 99 99 0 9999 99 9999 + 025960 9999 99 99 0 9999 99 9999 + 025961 1267 30 01 1 303063052 06 0042 + 025962 1267 30 02 1 303063052 07 0042 + 025963 9999 99 99 0 9999 99 9999 + 025964 9999 99 99 0 9999 99 9999 + 025965 9999 99 99 0 9999 99 9999 + 025966 9999 99 99 0 9999 99 9999 + 025967 9999 99 99 0 9999 99 9999 + 025968 9999 99 99 0 9999 99 9999 + 025969 1267 31 01 1 303063052 00 0042 + 025970 1267 31 02 1 303063052 01 0042 + 025971 9999 99 99 0 9999 99 9999 + 025972 9999 99 99 0 9999 99 9999 + 025973 9999 99 99 0 9999 99 9999 + 025974 9999 99 99 0 9999 99 9999 + 025975 9999 99 99 0 9999 99 9999 + 025976 9999 99 99 0 9999 99 9999 + 025977 1267 32 01 1 303063052 02 0042 + 025978 1267 32 02 1 303063052 03 0042 + 025979 9999 99 99 0 9999 99 9999 + 025980 9999 99 99 0 9999 99 9999 + 025981 9999 99 99 0 9999 99 9999 + 025982 9999 99 99 0 9999 99 9999 + 025983 9999 99 99 0 9999 99 9999 + 025984 9999 99 99 0 9999 99 9999 + 025985 1267 33 01 1 306307080 00 0905 + 025986 1267 33 02 1 306307080 01 0905 + 025987 1267 33 03 1 306307080 02 0905 + 025988 1267 33 04 1 306307080 03 0905 + 025989 1267 33 05 1 306307080 04 0905 + 025990 1267 33 06 1 306307080 05 0905 + 025991 1267 33 07 1 306307080 06 0905 + 025992 1267 33 08 1 306307080 07 0905 + 025993 1267 34 01 1 306307080 08 0905 + 025994 1267 34 02 1 306307080 09 0905 + 025995 1267 34 03 1 306307080 10 0905 + 025996 1267 34 04 1 306307080 11 0905 + 025997 1267 34 05 1 306307080 12 0905 + 025998 1267 34 06 1 306307080 13 0905 + 025999 1267 34 07 1 306307080 14 0905 + 026000 1267 34 08 1 306307080 15 0905 + 026001 1267 35 01 1 306307076 00 0904 + 026002 1267 35 02 1 306307076 01 0904 + 026003 1267 35 03 1 306307076 02 0904 + 026004 1267 35 04 1 306307076 03 0904 + 026005 1267 35 05 1 306307076 04 0904 + 026006 1267 35 06 1 306307076 05 0904 + 026007 1267 35 07 1 306307076 06 0904 + 026008 1267 35 08 1 306307076 07 0904 + 026009 1267 36 01 1 306307076 08 0904 + 026010 1267 36 02 1 306307076 09 0904 + 026011 1267 36 03 1 306307076 10 0904 + 026012 1267 36 04 1 306307076 11 0904 + 026013 1267 36 05 1 306307076 12 0904 + 026014 1267 36 06 1 306307076 13 0904 + 026015 1267 36 07 1 306307076 14 0904 + 026016 1267 36 08 1 306307076 15 0904 + 026017 1267 37 01 1 306307088 00 0907 + 026018 1267 37 02 1 306307088 01 0907 + 026019 1267 37 03 1 306307088 02 0907 + 026020 1267 37 04 1 306307088 03 0907 + 026021 1267 37 05 1 306307088 04 0907 + 026022 1267 37 06 1 306307088 05 0907 + 026023 1267 37 07 1 306307088 06 0907 + 026024 1267 37 08 1 306307088 07 0907 + 026025 1267 38 01 1 306307088 08 0907 + 026026 1267 38 02 1 306307088 09 0907 + 026027 1267 38 03 1 306307088 10 0907 + 026028 1267 38 04 1 306307088 11 0907 + 026029 1267 38 05 1 306307088 12 0907 + 026030 1267 38 06 1 306307088 13 0907 + 026031 1267 38 07 1 306307088 14 0907 + 026032 1267 38 08 1 306307088 15 0907 + 026033 1267 39 01 1 306307084 00 0906 + 026034 1267 39 02 1 306307084 01 0906 + 026035 1267 39 03 1 306307084 02 0906 + 026036 1267 39 04 1 306307084 03 0906 + 026037 1267 39 05 1 306307084 04 0906 + 026038 1267 39 06 1 306307084 05 0906 + 026039 1267 39 07 1 306307084 06 0906 + 026040 1267 39 08 1 306307084 07 0906 + 026041 1267 40 01 1 306307084 08 0906 + 026042 1267 40 02 1 306307084 09 0906 + 026043 1267 40 03 1 306307084 10 0906 + 026044 1267 40 04 1 306307084 11 0906 + 026045 1267 40 05 1 306307084 12 0906 + 026046 1267 40 06 1 306307084 13 0906 + 026047 1267 40 07 1 306307084 14 0906 + 026048 1267 40 08 1 306307084 15 0906 + 026049 1267 41 01 1 304140296 00 0193 + 026050 1267 41 02 1 304140296 01 0193 + 026051 1267 41 03 1 304140296 02 0193 + 026052 1267 41 04 1 304140296 03 0193 + 026053 9999 99 99 0 9999 99 9999 + 026054 9999 99 99 0 9999 99 9999 + 026055 9999 99 99 0 9999 99 9999 + 026056 9999 99 99 0 9999 99 9999 + 026057 1267 42 01 1 304140296 04 0193 + 026058 1267 42 02 1 304140296 05 0193 + 026059 1267 42 03 1 304140296 06 0193 + 026060 1267 42 04 1 304140296 07 0193 + 026061 9999 99 99 0 9999 99 9999 + 026062 9999 99 99 0 9999 99 9999 + 026063 9999 99 99 0 9999 99 9999 + 026064 9999 99 99 0 9999 99 9999 + 026065 1267 43 01 1 304140296 08 0193 + 026066 1267 43 02 1 304140296 09 0193 + 026067 1267 43 03 1 304140296 10 0193 + 026068 1267 43 04 1 304140296 11 0193 + 026069 9999 99 99 0 9999 99 9999 + 026070 9999 99 99 0 9999 99 9999 + 026071 9999 99 99 0 9999 99 9999 + 026072 9999 99 99 0 9999 99 9999 + 026073 1267 44 01 1 304140296 12 0193 + 026074 1267 44 02 1 304140296 13 0193 + 026075 1267 44 03 1 304140296 14 0193 + 026076 1267 44 04 1 304140296 15 0193 + 026077 9999 99 99 0 9999 99 9999 + 026078 9999 99 99 0 9999 99 9999 + 026079 9999 99 99 0 9999 99 9999 + 026080 9999 99 99 0 9999 99 9999 + 026081 1267 45 01 1 304140292 00 0192 + 026082 1267 45 02 1 304140292 01 0192 + 026083 1267 45 03 1 304140292 02 0192 + 026084 1267 45 04 1 304140292 03 0192 + 026085 9999 99 99 0 9999 99 9999 + 026086 9999 99 99 0 9999 99 9999 + 026087 9999 99 99 0 9999 99 9999 + 026088 9999 99 99 0 9999 99 9999 + 026089 1267 46 01 1 304140292 04 0192 + 026090 1267 46 02 1 304140292 05 0192 + 026091 1267 46 03 1 304140292 06 0192 + 026092 1267 46 04 1 304140292 07 0192 + 026093 9999 99 99 0 9999 99 9999 + 026094 9999 99 99 0 9999 99 9999 + 026095 9999 99 99 0 9999 99 9999 + 026096 9999 99 99 0 9999 99 9999 + 026097 1267 47 01 1 304140292 08 0192 + 026098 1267 47 02 1 304140292 09 0192 + 026099 1267 47 03 1 304140292 10 0192 + 026100 1267 47 04 1 304140292 11 0192 + 026101 9999 99 99 0 9999 99 9999 + 026102 9999 99 99 0 9999 99 9999 + 026103 9999 99 99 0 9999 99 9999 + 026104 9999 99 99 0 9999 99 9999 + 026105 1267 48 01 1 304140292 12 0192 + 026106 1267 48 02 1 304140292 13 0192 + 026107 1267 48 03 1 304140292 14 0192 + 026108 1267 48 04 1 304140292 15 0192 + 026109 9999 99 99 0 9999 99 9999 + 026110 9999 99 99 0 9999 99 9999 + 026111 9999 99 99 0 9999 99 9999 + 026112 9999 99 99 0 9999 99 9999 + 026113 1268 01 01 1 304144396 08 0202 + 026114 1268 01 02 1 304144396 09 0202 + 026115 1268 01 03 1 304144396 10 0202 + 026116 1268 01 04 1 304144396 11 0202 + 026117 9999 99 99 0 9999 99 9999 + 026118 9999 99 99 0 9999 99 9999 + 026119 9999 99 99 0 9999 99 9999 + 026120 9999 99 99 0 9999 99 9999 + 026121 1268 02 01 1 304144396 12 0202 + 026122 1268 02 02 1 304144396 13 0202 + 026123 1268 02 03 1 304144396 14 0202 + 026124 1268 02 04 1 304144396 15 0202 + 026125 9999 99 99 0 9999 99 9999 + 026126 9999 99 99 0 9999 99 9999 + 026127 9999 99 99 0 9999 99 9999 + 026128 9999 99 99 0 9999 99 9999 + 026129 1268 03 01 1 304144396 00 0202 + 026130 1268 03 02 1 304144396 01 0202 + 026131 1268 03 03 1 304144396 02 0202 + 026132 1268 03 04 1 304144396 03 0202 + 026133 9999 99 99 0 9999 99 9999 + 026134 9999 99 99 0 9999 99 9999 + 026135 9999 99 99 0 9999 99 9999 + 026136 9999 99 99 0 9999 99 9999 + 026137 1268 04 01 1 304144396 04 0202 + 026138 1268 04 02 1 304144396 05 0202 + 026139 1268 04 03 1 304144396 06 0202 + 026140 1268 04 04 1 304144396 07 0202 + 026141 9999 99 99 0 9999 99 9999 + 026142 9999 99 99 0 9999 99 9999 + 026143 9999 99 99 0 9999 99 9999 + 026144 9999 99 99 0 9999 99 9999 + 026145 1268 05 01 1 304144400 08 0203 + 026146 1268 05 02 1 304144400 09 0203 + 026147 1268 05 03 1 304144400 10 0203 + 026148 1268 05 04 1 304144400 11 0203 + 026149 9999 99 99 0 9999 99 9999 + 026150 9999 99 99 0 9999 99 9999 + 026151 9999 99 99 0 9999 99 9999 + 026152 9999 99 99 0 9999 99 9999 + 026153 1268 06 01 1 304144400 12 0203 + 026154 1268 06 02 1 304144400 13 0203 + 026155 1268 06 03 1 304144400 14 0203 + 026156 1268 06 04 1 304144400 15 0203 + 026157 9999 99 99 0 9999 99 9999 + 026158 9999 99 99 0 9999 99 9999 + 026159 9999 99 99 0 9999 99 9999 + 026160 9999 99 99 0 9999 99 9999 + 026161 1268 07 01 1 304144400 00 0203 + 026162 1268 07 02 1 304144400 01 0203 + 026163 1268 07 03 1 304144400 02 0203 + 026164 1268 07 04 1 304144400 03 0203 + 026165 9999 99 99 0 9999 99 9999 + 026166 9999 99 99 0 9999 99 9999 + 026167 9999 99 99 0 9999 99 9999 + 026168 9999 99 99 0 9999 99 9999 + 026169 1268 08 01 1 304144400 04 0203 + 026170 1268 08 02 1 304144400 05 0203 + 026171 1268 08 03 1 304144400 06 0203 + 026172 1268 08 04 1 304144400 07 0203 + 026173 9999 99 99 0 9999 99 9999 + 026174 9999 99 99 0 9999 99 9999 + 026175 9999 99 99 0 9999 99 9999 + 026176 9999 99 99 0 9999 99 9999 + 026177 1268 09 01 1 306311180 00 0914 + 026178 1268 09 02 1 306311180 01 0914 + 026179 1268 09 03 1 306311180 02 0914 + 026180 1268 09 04 1 306311180 03 0914 + 026181 1268 09 05 1 306311180 04 0914 + 026182 1268 09 06 1 306311180 05 0914 + 026183 1268 09 07 1 306311180 06 0914 + 026184 1268 09 08 1 306311180 07 0914 + 026185 1268 10 01 1 306311180 08 0914 + 026186 1268 10 02 1 306311180 09 0914 + 026187 1268 10 03 1 306311180 10 0914 + 026188 1268 10 04 1 306311180 11 0914 + 026189 1268 10 05 1 306311180 12 0914 + 026190 1268 10 06 1 306311180 13 0914 + 026191 1268 10 07 1 306311180 14 0914 + 026192 1268 10 08 1 306311180 15 0914 + 026193 1268 11 01 1 306311184 00 0915 + 026194 1268 11 02 1 306311184 01 0915 + 026195 1268 11 03 1 306311184 02 0915 + 026196 1268 11 04 1 306311184 03 0915 + 026197 1268 11 05 1 306311184 04 0915 + 026198 1268 11 06 1 306311184 05 0915 + 026199 1268 11 07 1 306311184 06 0915 + 026200 1268 11 08 1 306311184 07 0915 + 026201 1268 12 01 1 306311184 08 0915 + 026202 1268 12 02 1 306311184 09 0915 + 026203 1268 12 03 1 306311184 10 0915 + 026204 1268 12 04 1 306311184 11 0915 + 026205 1268 12 05 1 306311184 12 0915 + 026206 1268 12 06 1 306311184 13 0915 + 026207 1268 12 07 1 306311184 14 0915 + 026208 1268 12 08 1 306311184 15 0915 + 026209 1268 13 01 1 306311172 00 0912 + 026210 1268 13 02 1 306311172 01 0912 + 026211 1268 13 03 1 306311172 02 0912 + 026212 1268 13 04 1 306311172 03 0912 + 026213 1268 13 05 1 306311172 04 0912 + 026214 1268 13 06 1 306311172 05 0912 + 026215 1268 13 07 1 306311172 06 0912 + 026216 1268 13 08 1 306311172 07 0912 + 026217 1268 14 01 1 306311172 08 0912 + 026218 1268 14 02 1 306311172 09 0912 + 026219 1268 14 03 1 306311172 10 0912 + 026220 1268 14 04 1 306311172 11 0912 + 026221 1268 14 05 1 306311172 12 0912 + 026222 1268 14 06 1 306311172 13 0912 + 026223 1268 14 07 1 306311172 14 0912 + 026224 1268 14 08 1 306311172 15 0912 + 026225 1268 15 01 1 306311176 00 0913 + 026226 1268 15 02 1 306311176 01 0913 + 026227 1268 15 03 1 306311176 02 0913 + 026228 1268 15 04 1 306311176 03 0913 + 026229 1268 15 05 1 306311176 04 0913 + 026230 1268 15 06 1 306311176 05 0913 + 026231 1268 15 07 1 306311176 06 0913 + 026232 1268 15 08 1 306311176 07 0913 + 026233 1268 16 01 1 306311176 08 0913 + 026234 1268 16 02 1 306311176 09 0913 + 026235 1268 16 03 1 306311176 10 0913 + 026236 1268 16 04 1 306311176 11 0913 + 026237 1268 16 05 1 306311176 12 0913 + 026238 1268 16 06 1 306311176 13 0913 + 026239 1268 16 07 1 306311176 14 0913 + 026240 1268 16 08 1 306311176 15 0913 + 026241 1268 17 01 1 303063048 12 0041 + 026242 1268 17 02 1 303063048 13 0041 + 026243 9999 99 99 0 9999 99 9999 + 026244 9999 99 99 0 9999 99 9999 + 026245 9999 99 99 0 9999 99 9999 + 026246 9999 99 99 0 9999 99 9999 + 026247 9999 99 99 0 9999 99 9999 + 026248 9999 99 99 0 9999 99 9999 + 026249 1268 18 01 1 303063048 14 0041 + 026250 1268 18 02 1 303063048 15 0041 + 026251 9999 99 99 0 9999 99 9999 + 026252 9999 99 99 0 9999 99 9999 + 026253 9999 99 99 0 9999 99 9999 + 026254 9999 99 99 0 9999 99 9999 + 026255 9999 99 99 0 9999 99 9999 + 026256 9999 99 99 0 9999 99 9999 + 026257 1268 19 01 1 303063048 08 0041 + 026258 1268 19 02 1 303063048 09 0041 + 026259 9999 99 99 0 9999 99 9999 + 026260 9999 99 99 0 9999 99 9999 + 026261 9999 99 99 0 9999 99 9999 + 026262 9999 99 99 0 9999 99 9999 + 026263 9999 99 99 0 9999 99 9999 + 026264 9999 99 99 0 9999 99 9999 + 026265 1268 20 01 1 303063048 10 0041 + 026266 1268 20 02 1 303063048 11 0041 + 026267 9999 99 99 0 9999 99 9999 + 026268 9999 99 99 0 9999 99 9999 + 026269 9999 99 99 0 9999 99 9999 + 026270 9999 99 99 0 9999 99 9999 + 026271 9999 99 99 0 9999 99 9999 + 026272 9999 99 99 0 9999 99 9999 + 026273 1268 21 01 1 303063048 00 0041 + 026274 1268 21 02 1 303063048 01 0041 + 026275 9999 99 99 0 9999 99 9999 + 026276 9999 99 99 0 9999 99 9999 + 026277 9999 99 99 0 9999 99 9999 + 026278 9999 99 99 0 9999 99 9999 + 026279 9999 99 99 0 9999 99 9999 + 026280 9999 99 99 0 9999 99 9999 + 026281 1268 22 01 1 303063048 02 0041 + 026282 1268 22 02 1 303063048 03 0041 + 026283 9999 99 99 0 9999 99 9999 + 026284 9999 99 99 0 9999 99 9999 + 026285 9999 99 99 0 9999 99 9999 + 026286 9999 99 99 0 9999 99 9999 + 026287 9999 99 99 0 9999 99 9999 + 026288 9999 99 99 0 9999 99 9999 + 026289 1268 23 01 1 303063048 04 0041 + 026290 1268 23 02 1 303063048 05 0041 + 026291 9999 99 99 0 9999 99 9999 + 026292 9999 99 99 0 9999 99 9999 + 026293 9999 99 99 0 9999 99 9999 + 026294 9999 99 99 0 9999 99 9999 + 026295 9999 99 99 0 9999 99 9999 + 026296 9999 99 99 0 9999 99 9999 + 026297 1268 24 01 1 303063048 06 0041 + 026298 1268 24 02 1 303063048 07 0041 + 026299 9999 99 99 0 9999 99 9999 + 026300 9999 99 99 0 9999 99 9999 + 026301 9999 99 99 0 9999 99 9999 + 026302 9999 99 99 0 9999 99 9999 + 026303 9999 99 99 0 9999 99 9999 + 026304 9999 99 99 0 9999 99 9999 + 026305 1268 25 01 1 305217544 00 0473 + 026306 1268 25 02 1 305217544 01 0473 + 026307 1268 25 03 1 305217544 02 0473 + 026308 1268 25 04 1 305217544 03 0473 + 026309 1268 25 05 1 305217544 04 0473 + 026310 1268 25 06 1 305217544 05 0473 + 026311 1268 25 07 1 305217544 06 0473 + 026312 1268 25 08 1 305217544 07 0473 + 026313 1268 26 01 1 305217544 08 0473 + 026314 1268 26 02 1 305217544 09 0473 + 026315 1268 26 03 1 305217544 10 0473 + 026316 1268 26 04 1 305217544 11 0473 + 026317 1268 26 05 1 305217544 12 0473 + 026318 1268 26 06 1 305217544 13 0473 + 026319 1268 26 07 1 305217544 14 0473 + 026320 1268 26 08 1 305217544 15 0473 + 026321 1268 27 01 1 305217540 00 0472 + 026322 1268 27 02 1 305217540 01 0472 + 026323 1268 27 03 1 305217540 02 0472 + 026324 1268 27 04 1 305217540 03 0472 + 026325 1268 27 05 1 305217540 04 0472 + 026326 1268 27 06 1 305217540 05 0472 + 026327 1268 27 07 1 305217540 06 0472 + 026328 1268 27 08 1 305217540 07 0472 + 026329 1268 28 01 1 305217540 08 0472 + 026330 1268 28 02 1 305217540 09 0472 + 026331 1268 28 03 1 305217540 10 0472 + 026332 1268 28 04 1 305217540 11 0472 + 026333 1268 28 05 1 305217540 12 0472 + 026334 1268 28 06 1 305217540 13 0472 + 026335 1268 28 07 1 305217540 14 0472 + 026336 1268 28 08 1 305217540 15 0472 + 026337 1268 29 01 1 305217552 00 0475 + 026338 1268 29 02 1 305217552 01 0475 + 026339 1268 29 03 1 305217552 02 0475 + 026340 1268 29 04 1 305217552 03 0475 + 026341 1268 29 05 1 305217552 04 0475 + 026342 1268 29 06 1 305217552 05 0475 + 026343 1268 29 07 1 305217552 06 0475 + 026344 1268 29 08 1 305217552 07 0475 + 026345 1268 30 01 1 305217552 08 0475 + 026346 1268 30 02 1 305217552 09 0475 + 026347 1268 30 03 1 305217552 10 0475 + 026348 1268 30 04 1 305217552 11 0475 + 026349 1268 30 05 1 305217552 12 0475 + 026350 1268 30 06 1 305217552 13 0475 + 026351 1268 30 07 1 305217552 14 0475 + 026352 1268 30 08 1 305217552 15 0475 + 026353 1268 31 01 1 305217548 00 0474 + 026354 1268 31 02 1 305217548 01 0474 + 026355 1268 31 03 1 305217548 02 0474 + 026356 1268 31 04 1 305217548 03 0474 + 026357 1268 31 05 1 305217548 04 0474 + 026358 1268 31 06 1 305217548 05 0474 + 026359 1268 31 07 1 305217548 06 0474 + 026360 1268 31 08 1 305217548 07 0474 + 026361 1268 32 01 1 305217548 08 0474 + 026362 1268 32 02 1 305217548 09 0474 + 026363 1268 32 03 1 305217548 10 0474 + 026364 1268 32 04 1 305217548 11 0474 + 026365 1268 32 05 1 305217548 12 0474 + 026366 1268 32 06 1 305217548 13 0474 + 026367 1268 32 07 1 305217548 14 0474 + 026368 1268 32 08 1 305217548 15 0474 + 026369 1268 33 01 1 306315276 00 0922 + 026370 1268 33 02 1 306315276 01 0922 + 026371 1268 33 03 1 306315276 02 0922 + 026372 1268 33 04 1 306315276 03 0922 + 026373 1268 33 05 1 306315276 04 0922 + 026374 1268 33 06 1 306315276 05 0922 + 026375 1268 33 07 1 306315276 06 0922 + 026376 1268 33 08 1 306315276 07 0922 + 026377 1268 34 01 1 306315276 08 0922 + 026378 1268 34 02 1 306315276 09 0922 + 026379 1268 34 03 1 306315276 10 0922 + 026380 1268 34 04 1 306315276 11 0922 + 026381 1268 34 05 1 306315276 12 0922 + 026382 1268 34 06 1 306315276 13 0922 + 026383 1268 34 07 1 306315276 14 0922 + 026384 1268 34 08 1 306315276 15 0922 + 026385 1268 35 01 1 306315280 00 0923 + 026386 1268 35 02 1 306315280 01 0923 + 026387 1268 35 03 1 306315280 02 0923 + 026388 1268 35 04 1 306315280 03 0923 + 026389 1268 35 05 1 306315280 04 0923 + 026390 1268 35 06 1 306315280 05 0923 + 026391 1268 35 07 1 306315280 06 0923 + 026392 1268 35 08 1 306315280 07 0923 + 026393 1268 36 01 1 306315280 08 0923 + 026394 1268 36 02 1 306315280 09 0923 + 026395 1268 36 03 1 306315280 10 0923 + 026396 1268 36 04 1 306315280 11 0923 + 026397 1268 36 05 1 306315280 12 0923 + 026398 1268 36 06 1 306315280 13 0923 + 026399 1268 36 07 1 306315280 14 0923 + 026400 1268 36 08 1 306315280 15 0923 + 026401 1268 37 01 1 306315268 00 0920 + 026402 1268 37 02 1 306315268 01 0920 + 026403 1268 37 03 1 306315268 02 0920 + 026404 1268 37 04 1 306315268 03 0920 + 026405 1268 37 05 1 306315268 04 0920 + 026406 1268 37 06 1 306315268 05 0920 + 026407 1268 37 07 1 306315268 06 0920 + 026408 1268 37 08 1 306315268 07 0920 + 026409 1268 38 01 1 306315268 08 0920 + 026410 1268 38 02 1 306315268 09 0920 + 026411 1268 38 03 1 306315268 10 0920 + 026412 1268 38 04 1 306315268 11 0920 + 026413 1268 38 05 1 306315268 12 0920 + 026414 1268 38 06 1 306315268 13 0920 + 026415 1268 38 07 1 306315268 14 0920 + 026416 1268 38 08 1 306315268 15 0920 + 026417 1268 39 01 1 306315272 00 0921 + 026418 1268 39 02 1 306315272 01 0921 + 026419 1268 39 03 1 306315272 02 0921 + 026420 1268 39 04 1 306315272 03 0921 + 026421 1268 39 05 1 306315272 04 0921 + 026422 1268 39 06 1 306315272 05 0921 + 026423 1268 39 07 1 306315272 06 0921 + 026424 1268 39 08 1 306315272 07 0921 + 026425 1268 40 01 1 306315272 08 0921 + 026426 1268 40 02 1 306315272 09 0921 + 026427 1268 40 03 1 306315272 10 0921 + 026428 1268 40 04 1 306315272 11 0921 + 026429 1268 40 05 1 306315272 12 0921 + 026430 1268 40 06 1 306315272 13 0921 + 026431 1268 40 07 1 306315272 14 0921 + 026432 1268 40 08 1 306315272 15 0921 + 026433 1268 41 01 1 304144388 08 0200 + 026434 1268 41 02 1 304144388 09 0200 + 026435 1268 41 03 1 304144388 10 0200 + 026436 1268 41 04 1 304144388 11 0200 + 026437 9999 99 99 0 9999 99 9999 + 026438 9999 99 99 0 9999 99 9999 + 026439 9999 99 99 0 9999 99 9999 + 026440 9999 99 99 0 9999 99 9999 + 026441 1268 42 01 1 304144388 12 0200 + 026442 1268 42 02 1 304144388 13 0200 + 026443 1268 42 03 1 304144388 14 0200 + 026444 1268 42 04 1 304144388 15 0200 + 026445 9999 99 99 0 9999 99 9999 + 026446 9999 99 99 0 9999 99 9999 + 026447 9999 99 99 0 9999 99 9999 + 026448 9999 99 99 0 9999 99 9999 + 026449 1268 43 01 1 304144388 00 0200 + 026450 1268 43 02 1 304144388 01 0200 + 026451 1268 43 03 1 304144388 02 0200 + 026452 1268 43 04 1 304144388 03 0200 + 026453 9999 99 99 0 9999 99 9999 + 026454 9999 99 99 0 9999 99 9999 + 026455 9999 99 99 0 9999 99 9999 + 026456 9999 99 99 0 9999 99 9999 + 026457 1268 44 01 1 304144388 04 0200 + 026458 1268 44 02 1 304144388 05 0200 + 026459 1268 44 03 1 304144388 06 0200 + 026460 1268 44 04 1 304144388 07 0200 + 026461 9999 99 99 0 9999 99 9999 + 026462 9999 99 99 0 9999 99 9999 + 026463 9999 99 99 0 9999 99 9999 + 026464 9999 99 99 0 9999 99 9999 + 026465 1268 45 01 1 304144392 08 0201 + 026466 1268 45 02 1 304144392 09 0201 + 026467 1268 45 03 1 304144392 10 0201 + 026468 1268 45 04 1 304144392 11 0201 + 026469 9999 99 99 0 9999 99 9999 + 026470 9999 99 99 0 9999 99 9999 + 026471 9999 99 99 0 9999 99 9999 + 026472 9999 99 99 0 9999 99 9999 + 026473 1268 46 01 1 304144392 12 0201 + 026474 1268 46 02 1 304144392 13 0201 + 026475 1268 46 03 1 304144392 14 0201 + 026476 1268 46 04 1 304144392 15 0201 + 026477 9999 99 99 0 9999 99 9999 + 026478 9999 99 99 0 9999 99 9999 + 026479 9999 99 99 0 9999 99 9999 + 026480 9999 99 99 0 9999 99 9999 + 026481 1268 47 01 1 304144392 00 0201 + 026482 1268 47 02 1 304144392 01 0201 + 026483 1268 47 03 1 304144392 02 0201 + 026484 1268 47 04 1 304144392 03 0201 + 026485 9999 99 99 0 9999 99 9999 + 026486 9999 99 99 0 9999 99 9999 + 026487 9999 99 99 0 9999 99 9999 + 026488 9999 99 99 0 9999 99 9999 + 026489 1268 48 01 1 304144392 04 0201 + 026490 1268 48 02 1 304144392 05 0201 + 026491 1268 48 03 1 304144392 06 0201 + 026492 1268 48 04 1 304144392 07 0201 + 026493 9999 99 99 0 9999 99 9999 + 026494 9999 99 99 0 9999 99 9999 + 026495 9999 99 99 0 9999 99 9999 + 026496 9999 99 99 0 9999 99 9999 + 026497 1269 01 01 1 305221640 00 0481 + 026498 1269 01 02 1 305221640 01 0481 + 026499 1269 01 03 1 305221640 02 0481 + 026500 1269 01 04 1 305221640 03 0481 + 026501 1269 01 05 1 305221640 04 0481 + 026502 1269 01 06 1 305221640 05 0481 + 026503 1269 01 07 1 305221640 06 0481 + 026504 1269 01 08 1 305221640 07 0481 + 026505 1269 02 01 1 305221640 08 0481 + 026506 1269 02 02 1 305221640 09 0481 + 026507 1269 02 03 1 305221640 10 0481 + 026508 1269 02 04 1 305221640 11 0481 + 026509 1269 02 05 1 305221640 12 0481 + 026510 1269 02 06 1 305221640 13 0481 + 026511 1269 02 07 1 305221640 14 0481 + 026512 1269 02 08 1 305221640 15 0481 + 026513 1269 03 01 1 305221636 00 0480 + 026514 1269 03 02 1 305221636 01 0480 + 026515 1269 03 03 1 305221636 02 0480 + 026516 1269 03 04 1 305221636 03 0480 + 026517 1269 03 05 1 305221636 04 0480 + 026518 1269 03 06 1 305221636 05 0480 + 026519 1269 03 07 1 305221636 06 0480 + 026520 1269 03 08 1 305221636 07 0480 + 026521 1269 04 01 1 305221636 08 0480 + 026522 1269 04 02 1 305221636 09 0480 + 026523 1269 04 03 1 305221636 10 0480 + 026524 1269 04 04 1 305221636 11 0480 + 026525 1269 04 05 1 305221636 12 0480 + 026526 1269 04 06 1 305221636 13 0480 + 026527 1269 04 07 1 305221636 14 0480 + 026528 1269 04 08 1 305221636 15 0480 + 026529 1269 05 01 1 305221648 00 0483 + 026530 1269 05 02 1 305221648 01 0483 + 026531 1269 05 03 1 305221648 02 0483 + 026532 1269 05 04 1 305221648 03 0483 + 026533 1269 05 05 1 305221648 04 0483 + 026534 1269 05 06 1 305221648 05 0483 + 026535 1269 05 07 1 305221648 06 0483 + 026536 1269 05 08 1 305221648 07 0483 + 026537 1269 06 01 1 305221648 08 0483 + 026538 1269 06 02 1 305221648 09 0483 + 026539 1269 06 03 1 305221648 10 0483 + 026540 1269 06 04 1 305221648 11 0483 + 026541 1269 06 05 1 305221648 12 0483 + 026542 1269 06 06 1 305221648 13 0483 + 026543 1269 06 07 1 305221648 14 0483 + 026544 1269 06 08 1 305221648 15 0483 + 026545 1269 07 01 1 305221644 00 0482 + 026546 1269 07 02 1 305221644 01 0482 + 026547 1269 07 03 1 305221644 02 0482 + 026548 1269 07 04 1 305221644 03 0482 + 026549 1269 07 05 1 305221644 04 0482 + 026550 1269 07 06 1 305221644 05 0482 + 026551 1269 07 07 1 305221644 06 0482 + 026552 1269 07 08 1 305221644 07 0482 + 026553 1269 08 01 1 305221644 08 0482 + 026554 1269 08 02 1 305221644 09 0482 + 026555 1269 08 03 1 305221644 10 0482 + 026556 1269 08 04 1 305221644 11 0482 + 026557 1269 08 05 1 305221644 12 0482 + 026558 1269 08 06 1 305221644 13 0482 + 026559 1269 08 07 1 305221644 14 0482 + 026560 1269 08 08 1 305221644 15 0482 + 026561 1269 09 01 1 305225740 00 0490 + 026562 1269 09 02 1 305225740 01 0490 + 026563 1269 09 03 1 305225740 02 0490 + 026564 1269 09 04 1 305225740 03 0490 + 026565 1269 09 05 1 305225740 04 0490 + 026566 1269 09 06 1 305225740 05 0490 + 026567 1269 09 07 1 305225740 06 0490 + 026568 1269 09 08 1 305225740 07 0490 + 026569 1269 10 01 1 305225740 08 0490 + 026570 1269 10 02 1 305225740 09 0490 + 026571 1269 10 03 1 305225740 10 0490 + 026572 1269 10 04 1 305225740 11 0490 + 026573 1269 10 05 1 305225740 12 0490 + 026574 1269 10 06 1 305225740 13 0490 + 026575 1269 10 07 1 305225740 14 0490 + 026576 1269 10 08 1 305225740 15 0490 + 026577 1269 11 01 1 305225744 00 0491 + 026578 1269 11 02 1 305225744 01 0491 + 026579 1269 11 03 1 305225744 02 0491 + 026580 1269 11 04 1 305225744 03 0491 + 026581 1269 11 05 1 305225744 04 0491 + 026582 1269 11 06 1 305225744 05 0491 + 026583 1269 11 07 1 305225744 06 0491 + 026584 1269 11 08 1 305225744 07 0491 + 026585 1269 12 01 1 305225744 08 0491 + 026586 1269 12 02 1 305225744 09 0491 + 026587 1269 12 03 1 305225744 10 0491 + 026588 1269 12 04 1 305225744 11 0491 + 026589 1269 12 05 1 305225744 12 0491 + 026590 1269 12 06 1 305225744 13 0491 + 026591 1269 12 07 1 305225744 14 0491 + 026592 1269 12 08 1 305225744 15 0491 + 026593 1269 13 01 1 305225732 00 0488 + 026594 1269 13 02 1 305225732 01 0488 + 026595 1269 13 03 1 305225732 02 0488 + 026596 1269 13 04 1 305225732 03 0488 + 026597 1269 13 05 1 305225732 04 0488 + 026598 1269 13 06 1 305225732 05 0488 + 026599 1269 13 07 1 305225732 06 0488 + 026600 1269 13 08 1 305225732 07 0488 + 026601 1269 14 01 1 305225732 08 0488 + 026602 1269 14 02 1 305225732 09 0488 + 026603 1269 14 03 1 305225732 10 0488 + 026604 1269 14 04 1 305225732 11 0488 + 026605 1269 14 05 1 305225732 12 0488 + 026606 1269 14 06 1 305225732 13 0488 + 026607 1269 14 07 1 305225732 14 0488 + 026608 1269 14 08 1 305225732 15 0488 + 026609 1269 15 01 1 305225736 00 0489 + 026610 1269 15 02 1 305225736 01 0489 + 026611 1269 15 03 1 305225736 02 0489 + 026612 1269 15 04 1 305225736 03 0489 + 026613 1269 15 05 1 305225736 04 0489 + 026614 1269 15 06 1 305225736 05 0489 + 026615 1269 15 07 1 305225736 06 0489 + 026616 1269 15 08 1 305225736 07 0489 + 026617 1269 16 01 1 305225736 08 0489 + 026618 1269 16 02 1 305225736 09 0489 + 026619 1269 16 03 1 305225736 10 0489 + 026620 1269 16 04 1 305225736 11 0489 + 026621 1269 16 05 1 305225736 12 0489 + 026622 1269 16 06 1 305225736 13 0489 + 026623 1269 16 07 1 305225736 14 0489 + 026624 1269 16 08 1 305225736 15 0489 + 026625 9999 99 99 0 9999 99 9999 + 026626 9999 99 99 0 9999 99 9999 + 026627 9999 99 99 0 9999 99 9999 + 026628 9999 99 99 0 9999 99 9999 + 026629 9999 99 99 0 9999 99 9999 + 026630 9999 99 99 0 9999 99 9999 + 026631 9999 99 99 0 9999 99 9999 + 026632 9999 99 99 0 9999 99 9999 + 026633 9999 99 99 0 9999 99 9999 + 026634 9999 99 99 0 9999 99 9999 + 026635 9999 99 99 0 9999 99 9999 + 026636 9999 99 99 0 9999 99 9999 + 026637 9999 99 99 0 9999 99 9999 + 026638 9999 99 99 0 9999 99 9999 + 026639 9999 99 99 0 9999 99 9999 + 026640 9999 99 99 0 9999 99 9999 + 026641 9999 99 99 0 9999 99 9999 + 026642 9999 99 99 0 9999 99 9999 + 026643 9999 99 99 0 9999 99 9999 + 026644 9999 99 99 0 9999 99 9999 + 026645 9999 99 99 0 9999 99 9999 + 026646 9999 99 99 0 9999 99 9999 + 026647 9999 99 99 0 9999 99 9999 + 026648 9999 99 99 0 9999 99 9999 + 026649 9999 99 99 0 9999 99 9999 + 026650 9999 99 99 0 9999 99 9999 + 026651 9999 99 99 0 9999 99 9999 + 026652 9999 99 99 0 9999 99 9999 + 026653 9999 99 99 0 9999 99 9999 + 026654 9999 99 99 0 9999 99 9999 + 026655 9999 99 99 0 9999 99 9999 + 026656 9999 99 99 0 9999 99 9999 + 026657 9999 99 99 0 9999 99 9999 + 026658 9999 99 99 0 9999 99 9999 + 026659 9999 99 99 0 9999 99 9999 + 026660 9999 99 99 0 9999 99 9999 + 026661 9999 99 99 0 9999 99 9999 + 026662 9999 99 99 0 9999 99 9999 + 026663 9999 99 99 0 9999 99 9999 + 026664 9999 99 99 0 9999 99 9999 + 026665 9999 99 99 0 9999 99 9999 + 026666 9999 99 99 0 9999 99 9999 + 026667 9999 99 99 0 9999 99 9999 + 026668 9999 99 99 0 9999 99 9999 + 026669 9999 99 99 0 9999 99 9999 + 026670 9999 99 99 0 9999 99 9999 + 026671 9999 99 99 0 9999 99 9999 + 026672 9999 99 99 0 9999 99 9999 + 026673 9999 99 99 0 9999 99 9999 + 026674 9999 99 99 0 9999 99 9999 + 026675 9999 99 99 0 9999 99 9999 + 026676 9999 99 99 0 9999 99 9999 + 026677 9999 99 99 0 9999 99 9999 + 026678 9999 99 99 0 9999 99 9999 + 026679 9999 99 99 0 9999 99 9999 + 026680 9999 99 99 0 9999 99 9999 + 026681 9999 99 99 0 9999 99 9999 + 026682 9999 99 99 0 9999 99 9999 + 026683 9999 99 99 0 9999 99 9999 + 026684 9999 99 99 0 9999 99 9999 + 026685 9999 99 99 0 9999 99 9999 + 026686 9999 99 99 0 9999 99 9999 + 026687 9999 99 99 0 9999 99 9999 + 026688 9999 99 99 0 9999 99 9999 + 026689 9999 99 99 0 9999 99 9999 + 026690 9999 99 99 0 9999 99 9999 + 026691 9999 99 99 0 9999 99 9999 + 026692 9999 99 99 0 9999 99 9999 + 026693 9999 99 99 0 9999 99 9999 + 026694 9999 99 99 0 9999 99 9999 + 026695 9999 99 99 0 9999 99 9999 + 026696 9999 99 99 0 9999 99 9999 + 026697 9999 99 99 0 9999 99 9999 + 026698 9999 99 99 0 9999 99 9999 + 026699 9999 99 99 0 9999 99 9999 + 026700 9999 99 99 0 9999 99 9999 + 026701 9999 99 99 0 9999 99 9999 + 026702 9999 99 99 0 9999 99 9999 + 026703 9999 99 99 0 9999 99 9999 + 026704 9999 99 99 0 9999 99 9999 + 026705 9999 99 99 0 9999 99 9999 + 026706 9999 99 99 0 9999 99 9999 + 026707 9999 99 99 0 9999 99 9999 + 026708 9999 99 99 0 9999 99 9999 + 026709 9999 99 99 0 9999 99 9999 + 026710 9999 99 99 0 9999 99 9999 + 026711 9999 99 99 0 9999 99 9999 + 026712 9999 99 99 0 9999 99 9999 + 026713 9999 99 99 0 9999 99 9999 + 026714 9999 99 99 0 9999 99 9999 + 026715 9999 99 99 0 9999 99 9999 + 026716 9999 99 99 0 9999 99 9999 + 026717 9999 99 99 0 9999 99 9999 + 026718 9999 99 99 0 9999 99 9999 + 026719 9999 99 99 0 9999 99 9999 + 026720 9999 99 99 0 9999 99 9999 + 026721 9999 99 99 0 9999 99 9999 + 026722 9999 99 99 0 9999 99 9999 + 026723 9999 99 99 0 9999 99 9999 + 026724 9999 99 99 0 9999 99 9999 + 026725 9999 99 99 0 9999 99 9999 + 026726 9999 99 99 0 9999 99 9999 + 026727 9999 99 99 0 9999 99 9999 + 026728 9999 99 99 0 9999 99 9999 + 026729 9999 99 99 0 9999 99 9999 + 026730 9999 99 99 0 9999 99 9999 + 026731 9999 99 99 0 9999 99 9999 + 026732 9999 99 99 0 9999 99 9999 + 026733 9999 99 99 0 9999 99 9999 + 026734 9999 99 99 0 9999 99 9999 + 026735 9999 99 99 0 9999 99 9999 + 026736 9999 99 99 0 9999 99 9999 + 026737 9999 99 99 0 9999 99 9999 + 026738 9999 99 99 0 9999 99 9999 + 026739 9999 99 99 0 9999 99 9999 + 026740 9999 99 99 0 9999 99 9999 + 026741 9999 99 99 0 9999 99 9999 + 026742 9999 99 99 0 9999 99 9999 + 026743 9999 99 99 0 9999 99 9999 + 026744 9999 99 99 0 9999 99 9999 + 026745 9999 99 99 0 9999 99 9999 + 026746 9999 99 99 0 9999 99 9999 + 026747 9999 99 99 0 9999 99 9999 + 026748 9999 99 99 0 9999 99 9999 + 026749 9999 99 99 0 9999 99 9999 + 026750 9999 99 99 0 9999 99 9999 + 026751 9999 99 99 0 9999 99 9999 + 026752 9999 99 99 0 9999 99 9999 + 026753 9999 99 99 0 9999 99 9999 + 026754 9999 99 99 0 9999 99 9999 + 026755 9999 99 99 0 9999 99 9999 + 026756 9999 99 99 0 9999 99 9999 + 026757 9999 99 99 0 9999 99 9999 + 026758 9999 99 99 0 9999 99 9999 + 026759 9999 99 99 0 9999 99 9999 + 026760 9999 99 99 0 9999 99 9999 + 026761 9999 99 99 0 9999 99 9999 + 026762 9999 99 99 0 9999 99 9999 + 026763 9999 99 99 0 9999 99 9999 + 026764 9999 99 99 0 9999 99 9999 + 026765 9999 99 99 0 9999 99 9999 + 026766 9999 99 99 0 9999 99 9999 + 026767 9999 99 99 0 9999 99 9999 + 026768 9999 99 99 0 9999 99 9999 + 026769 9999 99 99 0 9999 99 9999 + 026770 9999 99 99 0 9999 99 9999 + 026771 9999 99 99 0 9999 99 9999 + 026772 9999 99 99 0 9999 99 9999 + 026773 9999 99 99 0 9999 99 9999 + 026774 9999 99 99 0 9999 99 9999 + 026775 9999 99 99 0 9999 99 9999 + 026776 9999 99 99 0 9999 99 9999 + 026777 9999 99 99 0 9999 99 9999 + 026778 9999 99 99 0 9999 99 9999 + 026779 9999 99 99 0 9999 99 9999 + 026780 9999 99 99 0 9999 99 9999 + 026781 9999 99 99 0 9999 99 9999 + 026782 9999 99 99 0 9999 99 9999 + 026783 9999 99 99 0 9999 99 9999 + 026784 9999 99 99 0 9999 99 9999 + 026785 9999 99 99 0 9999 99 9999 + 026786 9999 99 99 0 9999 99 9999 + 026787 9999 99 99 0 9999 99 9999 + 026788 9999 99 99 0 9999 99 9999 + 026789 9999 99 99 0 9999 99 9999 + 026790 9999 99 99 0 9999 99 9999 + 026791 9999 99 99 0 9999 99 9999 + 026792 9999 99 99 0 9999 99 9999 + 026793 9999 99 99 0 9999 99 9999 + 026794 9999 99 99 0 9999 99 9999 + 026795 9999 99 99 0 9999 99 9999 + 026796 9999 99 99 0 9999 99 9999 + 026797 9999 99 99 0 9999 99 9999 + 026798 9999 99 99 0 9999 99 9999 + 026799 9999 99 99 0 9999 99 9999 + 026800 9999 99 99 0 9999 99 9999 + 026801 9999 99 99 0 9999 99 9999 + 026802 9999 99 99 0 9999 99 9999 + 026803 9999 99 99 0 9999 99 9999 + 026804 9999 99 99 0 9999 99 9999 + 026805 9999 99 99 0 9999 99 9999 + 026806 9999 99 99 0 9999 99 9999 + 026807 9999 99 99 0 9999 99 9999 + 026808 9999 99 99 0 9999 99 9999 + 026809 9999 99 99 0 9999 99 9999 + 026810 9999 99 99 0 9999 99 9999 + 026811 9999 99 99 0 9999 99 9999 + 026812 9999 99 99 0 9999 99 9999 + 026813 9999 99 99 0 9999 99 9999 + 026814 9999 99 99 0 9999 99 9999 + 026815 9999 99 99 0 9999 99 9999 + 026816 9999 99 99 0 9999 99 9999 + 026817 9999 99 99 0 9999 99 9999 + 026818 9999 99 99 0 9999 99 9999 + 026819 9999 99 99 0 9999 99 9999 + 026820 9999 99 99 0 9999 99 9999 + 026821 9999 99 99 0 9999 99 9999 + 026822 9999 99 99 0 9999 99 9999 + 026823 9999 99 99 0 9999 99 9999 + 026824 9999 99 99 0 9999 99 9999 + 026825 9999 99 99 0 9999 99 9999 + 026826 9999 99 99 0 9999 99 9999 + 026827 9999 99 99 0 9999 99 9999 + 026828 9999 99 99 0 9999 99 9999 + 026829 9999 99 99 0 9999 99 9999 + 026830 9999 99 99 0 9999 99 9999 + 026831 9999 99 99 0 9999 99 9999 + 026832 9999 99 99 0 9999 99 9999 + 026833 9999 99 99 0 9999 99 9999 + 026834 9999 99 99 0 9999 99 9999 + 026835 9999 99 99 0 9999 99 9999 + 026836 9999 99 99 0 9999 99 9999 + 026837 9999 99 99 0 9999 99 9999 + 026838 9999 99 99 0 9999 99 9999 + 026839 9999 99 99 0 9999 99 9999 + 026840 9999 99 99 0 9999 99 9999 + 026841 9999 99 99 0 9999 99 9999 + 026842 9999 99 99 0 9999 99 9999 + 026843 9999 99 99 0 9999 99 9999 + 026844 9999 99 99 0 9999 99 9999 + 026845 9999 99 99 0 9999 99 9999 + 026846 9999 99 99 0 9999 99 9999 + 026847 9999 99 99 0 9999 99 9999 + 026848 9999 99 99 0 9999 99 9999 + 026849 9999 99 99 0 9999 99 9999 + 026850 9999 99 99 0 9999 99 9999 + 026851 9999 99 99 0 9999 99 9999 + 026852 9999 99 99 0 9999 99 9999 + 026853 9999 99 99 0 9999 99 9999 + 026854 9999 99 99 0 9999 99 9999 + 026855 9999 99 99 0 9999 99 9999 + 026856 9999 99 99 0 9999 99 9999 + 026857 9999 99 99 0 9999 99 9999 + 026858 9999 99 99 0 9999 99 9999 + 026859 9999 99 99 0 9999 99 9999 + 026860 9999 99 99 0 9999 99 9999 + 026861 9999 99 99 0 9999 99 9999 + 026862 9999 99 99 0 9999 99 9999 + 026863 9999 99 99 0 9999 99 9999 + 026864 9999 99 99 0 9999 99 9999 + 026865 9999 99 99 0 9999 99 9999 + 026866 9999 99 99 0 9999 99 9999 + 026867 9999 99 99 0 9999 99 9999 + 026868 9999 99 99 0 9999 99 9999 + 026869 9999 99 99 0 9999 99 9999 + 026870 9999 99 99 0 9999 99 9999 + 026871 9999 99 99 0 9999 99 9999 + 026872 9999 99 99 0 9999 99 9999 + 026873 9999 99 99 0 9999 99 9999 + 026874 9999 99 99 0 9999 99 9999 + 026875 9999 99 99 0 9999 99 9999 + 026876 9999 99 99 0 9999 99 9999 + 026877 9999 99 99 0 9999 99 9999 + 026878 9999 99 99 0 9999 99 9999 + 026879 9999 99 99 0 9999 99 9999 + 026880 9999 99 99 0 9999 99 9999 + 026881 9999 99 99 0 9999 99 9999 + 026882 9999 99 99 0 9999 99 9999 + 026883 9999 99 99 0 9999 99 9999 + 026884 9999 99 99 0 9999 99 9999 + 026885 9999 99 99 0 9999 99 9999 + 026886 9999 99 99 0 9999 99 9999 + 026887 9999 99 99 0 9999 99 9999 + 026888 9999 99 99 0 9999 99 9999 + 026889 9999 99 99 0 9999 99 9999 + 026890 9999 99 99 0 9999 99 9999 + 026891 9999 99 99 0 9999 99 9999 + 026892 9999 99 99 0 9999 99 9999 + 026893 9999 99 99 0 9999 99 9999 + 026894 9999 99 99 0 9999 99 9999 + 026895 9999 99 99 0 9999 99 9999 + 026896 9999 99 99 0 9999 99 9999 + 026897 9999 99 99 0 9999 99 9999 + 026898 9999 99 99 0 9999 99 9999 + 026899 9999 99 99 0 9999 99 9999 + 026900 9999 99 99 0 9999 99 9999 + 026901 9999 99 99 0 9999 99 9999 + 026902 9999 99 99 0 9999 99 9999 + 026903 9999 99 99 0 9999 99 9999 + 026904 9999 99 99 0 9999 99 9999 + 026905 9999 99 99 0 9999 99 9999 + 026906 9999 99 99 0 9999 99 9999 + 026907 9999 99 99 0 9999 99 9999 + 026908 9999 99 99 0 9999 99 9999 + 026909 9999 99 99 0 9999 99 9999 + 026910 9999 99 99 0 9999 99 9999 + 026911 9999 99 99 0 9999 99 9999 + 026912 9999 99 99 0 9999 99 9999 + 026913 9999 99 99 0 9999 99 9999 + 026914 9999 99 99 0 9999 99 9999 + 026915 9999 99 99 0 9999 99 9999 + 026916 9999 99 99 0 9999 99 9999 + 026917 9999 99 99 0 9999 99 9999 + 026918 9999 99 99 0 9999 99 9999 + 026919 9999 99 99 0 9999 99 9999 + 026920 9999 99 99 0 9999 99 9999 + 026921 9999 99 99 0 9999 99 9999 + 026922 9999 99 99 0 9999 99 9999 + 026923 9999 99 99 0 9999 99 9999 + 026924 9999 99 99 0 9999 99 9999 + 026925 9999 99 99 0 9999 99 9999 + 026926 9999 99 99 0 9999 99 9999 + 026927 9999 99 99 0 9999 99 9999 + 026928 9999 99 99 0 9999 99 9999 + 026929 9999 99 99 0 9999 99 9999 + 026930 9999 99 99 0 9999 99 9999 + 026931 9999 99 99 0 9999 99 9999 + 026932 9999 99 99 0 9999 99 9999 + 026933 9999 99 99 0 9999 99 9999 + 026934 9999 99 99 0 9999 99 9999 + 026935 9999 99 99 0 9999 99 9999 + 026936 9999 99 99 0 9999 99 9999 + 026937 9999 99 99 0 9999 99 9999 + 026938 9999 99 99 0 9999 99 9999 + 026939 9999 99 99 0 9999 99 9999 + 026940 9999 99 99 0 9999 99 9999 + 026941 9999 99 99 0 9999 99 9999 + 026942 9999 99 99 0 9999 99 9999 + 026943 9999 99 99 0 9999 99 9999 + 026944 9999 99 99 0 9999 99 9999 + 026945 9999 99 99 0 9999 99 9999 + 026946 9999 99 99 0 9999 99 9999 + 026947 9999 99 99 0 9999 99 9999 + 026948 9999 99 99 0 9999 99 9999 + 026949 9999 99 99 0 9999 99 9999 + 026950 9999 99 99 0 9999 99 9999 + 026951 9999 99 99 0 9999 99 9999 + 026952 9999 99 99 0 9999 99 9999 + 026953 9999 99 99 0 9999 99 9999 + 026954 9999 99 99 0 9999 99 9999 + 026955 9999 99 99 0 9999 99 9999 + 026956 9999 99 99 0 9999 99 9999 + 026957 9999 99 99 0 9999 99 9999 + 026958 9999 99 99 0 9999 99 9999 + 026959 9999 99 99 0 9999 99 9999 + 026960 9999 99 99 0 9999 99 9999 + 026961 9999 99 99 0 9999 99 9999 + 026962 9999 99 99 0 9999 99 9999 + 026963 9999 99 99 0 9999 99 9999 + 026964 9999 99 99 0 9999 99 9999 + 026965 9999 99 99 0 9999 99 9999 + 026966 9999 99 99 0 9999 99 9999 + 026967 9999 99 99 0 9999 99 9999 + 026968 9999 99 99 0 9999 99 9999 + 026969 9999 99 99 0 9999 99 9999 + 026970 9999 99 99 0 9999 99 9999 + 026971 9999 99 99 0 9999 99 9999 + 026972 9999 99 99 0 9999 99 9999 + 026973 9999 99 99 0 9999 99 9999 + 026974 9999 99 99 0 9999 99 9999 + 026975 9999 99 99 0 9999 99 9999 + 026976 9999 99 99 0 9999 99 9999 + 026977 9999 99 99 0 9999 99 9999 + 026978 9999 99 99 0 9999 99 9999 + 026979 9999 99 99 0 9999 99 9999 + 026980 9999 99 99 0 9999 99 9999 + 026981 9999 99 99 0 9999 99 9999 + 026982 9999 99 99 0 9999 99 9999 + 026983 9999 99 99 0 9999 99 9999 + 026984 9999 99 99 0 9999 99 9999 + 026985 9999 99 99 0 9999 99 9999 + 026986 9999 99 99 0 9999 99 9999 + 026987 9999 99 99 0 9999 99 9999 + 026988 9999 99 99 0 9999 99 9999 + 026989 9999 99 99 0 9999 99 9999 + 026990 9999 99 99 0 9999 99 9999 + 026991 9999 99 99 0 9999 99 9999 + 026992 9999 99 99 0 9999 99 9999 + 026993 9999 99 99 0 9999 99 9999 + 026994 9999 99 99 0 9999 99 9999 + 026995 9999 99 99 0 9999 99 9999 + 026996 9999 99 99 0 9999 99 9999 + 026997 9999 99 99 0 9999 99 9999 + 026998 9999 99 99 0 9999 99 9999 + 026999 9999 99 99 0 9999 99 9999 + 027000 9999 99 99 0 9999 99 9999 + 027001 9999 99 99 0 9999 99 9999 + 027002 9999 99 99 0 9999 99 9999 + 027003 9999 99 99 0 9999 99 9999 + 027004 9999 99 99 0 9999 99 9999 + 027005 9999 99 99 0 9999 99 9999 + 027006 9999 99 99 0 9999 99 9999 + 027007 9999 99 99 0 9999 99 9999 + 027008 9999 99 99 0 9999 99 9999 + 027009 9999 99 99 0 9999 99 9999 + 027010 9999 99 99 0 9999 99 9999 + 027011 9999 99 99 0 9999 99 9999 + 027012 9999 99 99 0 9999 99 9999 + 027013 9999 99 99 0 9999 99 9999 + 027014 9999 99 99 0 9999 99 9999 + 027015 9999 99 99 0 9999 99 9999 + 027016 9999 99 99 0 9999 99 9999 + 027017 9999 99 99 0 9999 99 9999 + 027018 9999 99 99 0 9999 99 9999 + 027019 9999 99 99 0 9999 99 9999 + 027020 9999 99 99 0 9999 99 9999 + 027021 9999 99 99 0 9999 99 9999 + 027022 9999 99 99 0 9999 99 9999 + 027023 9999 99 99 0 9999 99 9999 + 027024 9999 99 99 0 9999 99 9999 + 027025 9999 99 99 0 9999 99 9999 + 027026 9999 99 99 0 9999 99 9999 + 027027 9999 99 99 0 9999 99 9999 + 027028 9999 99 99 0 9999 99 9999 + 027029 9999 99 99 0 9999 99 9999 + 027030 9999 99 99 0 9999 99 9999 + 027031 9999 99 99 0 9999 99 9999 + 027032 9999 99 99 0 9999 99 9999 + 027033 9999 99 99 0 9999 99 9999 + 027034 9999 99 99 0 9999 99 9999 + 027035 9999 99 99 0 9999 99 9999 + 027036 9999 99 99 0 9999 99 9999 + 027037 9999 99 99 0 9999 99 9999 + 027038 9999 99 99 0 9999 99 9999 + 027039 9999 99 99 0 9999 99 9999 + 027040 9999 99 99 0 9999 99 9999 + 027041 9999 99 99 0 9999 99 9999 + 027042 9999 99 99 0 9999 99 9999 + 027043 9999 99 99 0 9999 99 9999 + 027044 9999 99 99 0 9999 99 9999 + 027045 9999 99 99 0 9999 99 9999 + 027046 9999 99 99 0 9999 99 9999 + 027047 9999 99 99 0 9999 99 9999 + 027048 9999 99 99 0 9999 99 9999 + 027049 9999 99 99 0 9999 99 9999 + 027050 9999 99 99 0 9999 99 9999 + 027051 9999 99 99 0 9999 99 9999 + 027052 9999 99 99 0 9999 99 9999 + 027053 9999 99 99 0 9999 99 9999 + 027054 9999 99 99 0 9999 99 9999 + 027055 9999 99 99 0 9999 99 9999 + 027056 9999 99 99 0 9999 99 9999 + 027057 9999 99 99 0 9999 99 9999 + 027058 9999 99 99 0 9999 99 9999 + 027059 9999 99 99 0 9999 99 9999 + 027060 9999 99 99 0 9999 99 9999 + 027061 9999 99 99 0 9999 99 9999 + 027062 9999 99 99 0 9999 99 9999 + 027063 9999 99 99 0 9999 99 9999 + 027064 9999 99 99 0 9999 99 9999 + 027065 9999 99 99 0 9999 99 9999 + 027066 9999 99 99 0 9999 99 9999 + 027067 9999 99 99 0 9999 99 9999 + 027068 9999 99 99 0 9999 99 9999 + 027069 9999 99 99 0 9999 99 9999 + 027070 9999 99 99 0 9999 99 9999 + 027071 9999 99 99 0 9999 99 9999 + 027072 9999 99 99 0 9999 99 9999 + 027073 9999 99 99 0 9999 99 9999 + 027074 9999 99 99 0 9999 99 9999 + 027075 9999 99 99 0 9999 99 9999 + 027076 9999 99 99 0 9999 99 9999 + 027077 9999 99 99 0 9999 99 9999 + 027078 9999 99 99 0 9999 99 9999 + 027079 9999 99 99 0 9999 99 9999 + 027080 9999 99 99 0 9999 99 9999 + 027081 9999 99 99 0 9999 99 9999 + 027082 9999 99 99 0 9999 99 9999 + 027083 9999 99 99 0 9999 99 9999 + 027084 9999 99 99 0 9999 99 9999 + 027085 9999 99 99 0 9999 99 9999 + 027086 9999 99 99 0 9999 99 9999 + 027087 9999 99 99 0 9999 99 9999 + 027088 9999 99 99 0 9999 99 9999 + 027089 9999 99 99 0 9999 99 9999 + 027090 9999 99 99 0 9999 99 9999 + 027091 9999 99 99 0 9999 99 9999 + 027092 9999 99 99 0 9999 99 9999 + 027093 9999 99 99 0 9999 99 9999 + 027094 9999 99 99 0 9999 99 9999 + 027095 9999 99 99 0 9999 99 9999 + 027096 9999 99 99 0 9999 99 9999 + 027097 9999 99 99 0 9999 99 9999 + 027098 9999 99 99 0 9999 99 9999 + 027099 9999 99 99 0 9999 99 9999 + 027100 9999 99 99 0 9999 99 9999 + 027101 9999 99 99 0 9999 99 9999 + 027102 9999 99 99 0 9999 99 9999 + 027103 9999 99 99 0 9999 99 9999 + 027104 9999 99 99 0 9999 99 9999 + 027105 9999 99 99 0 9999 99 9999 + 027106 9999 99 99 0 9999 99 9999 + 027107 9999 99 99 0 9999 99 9999 + 027108 9999 99 99 0 9999 99 9999 + 027109 9999 99 99 0 9999 99 9999 + 027110 9999 99 99 0 9999 99 9999 + 027111 9999 99 99 0 9999 99 9999 + 027112 9999 99 99 0 9999 99 9999 + 027113 9999 99 99 0 9999 99 9999 + 027114 9999 99 99 0 9999 99 9999 + 027115 9999 99 99 0 9999 99 9999 + 027116 9999 99 99 0 9999 99 9999 + 027117 9999 99 99 0 9999 99 9999 + 027118 9999 99 99 0 9999 99 9999 + 027119 9999 99 99 0 9999 99 9999 + 027120 9999 99 99 0 9999 99 9999 + 027121 9999 99 99 0 9999 99 9999 + 027122 9999 99 99 0 9999 99 9999 + 027123 9999 99 99 0 9999 99 9999 + 027124 9999 99 99 0 9999 99 9999 + 027125 9999 99 99 0 9999 99 9999 + 027126 9999 99 99 0 9999 99 9999 + 027127 9999 99 99 0 9999 99 9999 + 027128 9999 99 99 0 9999 99 9999 + 027129 9999 99 99 0 9999 99 9999 + 027130 9999 99 99 0 9999 99 9999 + 027131 9999 99 99 0 9999 99 9999 + 027132 9999 99 99 0 9999 99 9999 + 027133 9999 99 99 0 9999 99 9999 + 027134 9999 99 99 0 9999 99 9999 + 027135 9999 99 99 0 9999 99 9999 + 027136 9999 99 99 0 9999 99 9999 + 027137 9999 99 99 0 9999 99 9999 + 027138 9999 99 99 0 9999 99 9999 + 027139 9999 99 99 0 9999 99 9999 + 027140 9999 99 99 0 9999 99 9999 + 027141 9999 99 99 0 9999 99 9999 + 027142 9999 99 99 0 9999 99 9999 + 027143 9999 99 99 0 9999 99 9999 + 027144 9999 99 99 0 9999 99 9999 + 027145 9999 99 99 0 9999 99 9999 + 027146 9999 99 99 0 9999 99 9999 + 027147 9999 99 99 0 9999 99 9999 + 027148 9999 99 99 0 9999 99 9999 + 027149 9999 99 99 0 9999 99 9999 + 027150 9999 99 99 0 9999 99 9999 + 027151 9999 99 99 0 9999 99 9999 + 027152 9999 99 99 0 9999 99 9999 + 027153 9999 99 99 0 9999 99 9999 + 027154 9999 99 99 0 9999 99 9999 + 027155 9999 99 99 0 9999 99 9999 + 027156 9999 99 99 0 9999 99 9999 + 027157 9999 99 99 0 9999 99 9999 + 027158 9999 99 99 0 9999 99 9999 + 027159 9999 99 99 0 9999 99 9999 + 027160 9999 99 99 0 9999 99 9999 + 027161 9999 99 99 0 9999 99 9999 + 027162 9999 99 99 0 9999 99 9999 + 027163 9999 99 99 0 9999 99 9999 + 027164 9999 99 99 0 9999 99 9999 + 027165 9999 99 99 0 9999 99 9999 + 027166 9999 99 99 0 9999 99 9999 + 027167 9999 99 99 0 9999 99 9999 + 027168 9999 99 99 0 9999 99 9999 + 027169 9999 99 99 0 9999 99 9999 + 027170 9999 99 99 0 9999 99 9999 + 027171 9999 99 99 0 9999 99 9999 + 027172 9999 99 99 0 9999 99 9999 + 027173 9999 99 99 0 9999 99 9999 + 027174 9999 99 99 0 9999 99 9999 + 027175 9999 99 99 0 9999 99 9999 + 027176 9999 99 99 0 9999 99 9999 + 027177 9999 99 99 0 9999 99 9999 + 027178 9999 99 99 0 9999 99 9999 + 027179 9999 99 99 0 9999 99 9999 + 027180 9999 99 99 0 9999 99 9999 + 027181 9999 99 99 0 9999 99 9999 + 027182 9999 99 99 0 9999 99 9999 + 027183 9999 99 99 0 9999 99 9999 + 027184 9999 99 99 0 9999 99 9999 + 027185 9999 99 99 0 9999 99 9999 + 027186 9999 99 99 0 9999 99 9999 + 027187 9999 99 99 0 9999 99 9999 + 027188 9999 99 99 0 9999 99 9999 + 027189 9999 99 99 0 9999 99 9999 + 027190 9999 99 99 0 9999 99 9999 + 027191 9999 99 99 0 9999 99 9999 + 027192 9999 99 99 0 9999 99 9999 + 027193 9999 99 99 0 9999 99 9999 + 027194 9999 99 99 0 9999 99 9999 + 027195 9999 99 99 0 9999 99 9999 + 027196 9999 99 99 0 9999 99 9999 + 027197 9999 99 99 0 9999 99 9999 + 027198 9999 99 99 0 9999 99 9999 + 027199 9999 99 99 0 9999 99 9999 + 027200 9999 99 99 0 9999 99 9999 + 027201 9999 99 99 0 9999 99 9999 + 027202 9999 99 99 0 9999 99 9999 + 027203 9999 99 99 0 9999 99 9999 + 027204 9999 99 99 0 9999 99 9999 + 027205 9999 99 99 0 9999 99 9999 + 027206 9999 99 99 0 9999 99 9999 + 027207 9999 99 99 0 9999 99 9999 + 027208 9999 99 99 0 9999 99 9999 + 027209 9999 99 99 0 9999 99 9999 + 027210 9999 99 99 0 9999 99 9999 + 027211 9999 99 99 0 9999 99 9999 + 027212 9999 99 99 0 9999 99 9999 + 027213 9999 99 99 0 9999 99 9999 + 027214 9999 99 99 0 9999 99 9999 + 027215 9999 99 99 0 9999 99 9999 + 027216 9999 99 99 0 9999 99 9999 + 027217 9999 99 99 0 9999 99 9999 + 027218 9999 99 99 0 9999 99 9999 + 027219 9999 99 99 0 9999 99 9999 + 027220 9999 99 99 0 9999 99 9999 + 027221 9999 99 99 0 9999 99 9999 + 027222 9999 99 99 0 9999 99 9999 + 027223 9999 99 99 0 9999 99 9999 + 027224 9999 99 99 0 9999 99 9999 + 027225 9999 99 99 0 9999 99 9999 + 027226 9999 99 99 0 9999 99 9999 + 027227 9999 99 99 0 9999 99 9999 + 027228 9999 99 99 0 9999 99 9999 + 027229 9999 99 99 0 9999 99 9999 + 027230 9999 99 99 0 9999 99 9999 + 027231 9999 99 99 0 9999 99 9999 + 027232 9999 99 99 0 9999 99 9999 + 027233 9999 99 99 0 9999 99 9999 + 027234 9999 99 99 0 9999 99 9999 + 027235 9999 99 99 0 9999 99 9999 + 027236 9999 99 99 0 9999 99 9999 + 027237 9999 99 99 0 9999 99 9999 + 027238 9999 99 99 0 9999 99 9999 + 027239 9999 99 99 0 9999 99 9999 + 027240 9999 99 99 0 9999 99 9999 + 027241 9999 99 99 0 9999 99 9999 + 027242 9999 99 99 0 9999 99 9999 + 027243 9999 99 99 0 9999 99 9999 + 027244 9999 99 99 0 9999 99 9999 + 027245 9999 99 99 0 9999 99 9999 + 027246 9999 99 99 0 9999 99 9999 + 027247 9999 99 99 0 9999 99 9999 + 027248 9999 99 99 0 9999 99 9999 + 027249 9999 99 99 0 9999 99 9999 + 027250 9999 99 99 0 9999 99 9999 + 027251 9999 99 99 0 9999 99 9999 + 027252 9999 99 99 0 9999 99 9999 + 027253 9999 99 99 0 9999 99 9999 + 027254 9999 99 99 0 9999 99 9999 + 027255 9999 99 99 0 9999 99 9999 + 027256 9999 99 99 0 9999 99 9999 + 027257 9999 99 99 0 9999 99 9999 + 027258 9999 99 99 0 9999 99 9999 + 027259 9999 99 99 0 9999 99 9999 + 027260 9999 99 99 0 9999 99 9999 + 027261 9999 99 99 0 9999 99 9999 + 027262 9999 99 99 0 9999 99 9999 + 027263 9999 99 99 0 9999 99 9999 + 027264 9999 99 99 0 9999 99 9999 + 027265 9999 99 99 0 9999 99 9999 + 027266 9999 99 99 0 9999 99 9999 + 027267 9999 99 99 0 9999 99 9999 + 027268 9999 99 99 0 9999 99 9999 + 027269 9999 99 99 0 9999 99 9999 + 027270 9999 99 99 0 9999 99 9999 + 027271 9999 99 99 0 9999 99 9999 + 027272 9999 99 99 0 9999 99 9999 + 027273 9999 99 99 0 9999 99 9999 + 027274 9999 99 99 0 9999 99 9999 + 027275 9999 99 99 0 9999 99 9999 + 027276 9999 99 99 0 9999 99 9999 + 027277 9999 99 99 0 9999 99 9999 + 027278 9999 99 99 0 9999 99 9999 + 027279 9999 99 99 0 9999 99 9999 + 027280 9999 99 99 0 9999 99 9999 + 027281 9999 99 99 0 9999 99 9999 + 027282 9999 99 99 0 9999 99 9999 + 027283 9999 99 99 0 9999 99 9999 + 027284 9999 99 99 0 9999 99 9999 + 027285 9999 99 99 0 9999 99 9999 + 027286 9999 99 99 0 9999 99 9999 + 027287 9999 99 99 0 9999 99 9999 + 027288 9999 99 99 0 9999 99 9999 + 027289 9999 99 99 0 9999 99 9999 + 027290 9999 99 99 0 9999 99 9999 + 027291 9999 99 99 0 9999 99 9999 + 027292 9999 99 99 0 9999 99 9999 + 027293 9999 99 99 0 9999 99 9999 + 027294 9999 99 99 0 9999 99 9999 + 027295 9999 99 99 0 9999 99 9999 + 027296 9999 99 99 0 9999 99 9999 + 027297 9999 99 99 0 9999 99 9999 + 027298 9999 99 99 0 9999 99 9999 + 027299 9999 99 99 0 9999 99 9999 + 027300 9999 99 99 0 9999 99 9999 + 027301 9999 99 99 0 9999 99 9999 + 027302 9999 99 99 0 9999 99 9999 + 027303 9999 99 99 0 9999 99 9999 + 027304 9999 99 99 0 9999 99 9999 + 027305 9999 99 99 0 9999 99 9999 + 027306 9999 99 99 0 9999 99 9999 + 027307 9999 99 99 0 9999 99 9999 + 027308 9999 99 99 0 9999 99 9999 + 027309 9999 99 99 0 9999 99 9999 + 027310 9999 99 99 0 9999 99 9999 + 027311 9999 99 99 0 9999 99 9999 + 027312 9999 99 99 0 9999 99 9999 + 027313 9999 99 99 0 9999 99 9999 + 027314 9999 99 99 0 9999 99 9999 + 027315 9999 99 99 0 9999 99 9999 + 027316 9999 99 99 0 9999 99 9999 + 027317 9999 99 99 0 9999 99 9999 + 027318 9999 99 99 0 9999 99 9999 + 027319 9999 99 99 0 9999 99 9999 + 027320 9999 99 99 0 9999 99 9999 + 027321 9999 99 99 0 9999 99 9999 + 027322 9999 99 99 0 9999 99 9999 + 027323 9999 99 99 0 9999 99 9999 + 027324 9999 99 99 0 9999 99 9999 + 027325 9999 99 99 0 9999 99 9999 + 027326 9999 99 99 0 9999 99 9999 + 027327 9999 99 99 0 9999 99 9999 + 027328 9999 99 99 0 9999 99 9999 + 027329 9999 99 99 0 9999 99 9999 + 027330 9999 99 99 0 9999 99 9999 + 027331 9999 99 99 0 9999 99 9999 + 027332 9999 99 99 0 9999 99 9999 + 027333 9999 99 99 0 9999 99 9999 + 027334 9999 99 99 0 9999 99 9999 + 027335 9999 99 99 0 9999 99 9999 + 027336 9999 99 99 0 9999 99 9999 + 027337 9999 99 99 0 9999 99 9999 + 027338 9999 99 99 0 9999 99 9999 + 027339 9999 99 99 0 9999 99 9999 + 027340 9999 99 99 0 9999 99 9999 + 027341 9999 99 99 0 9999 99 9999 + 027342 9999 99 99 0 9999 99 9999 + 027343 9999 99 99 0 9999 99 9999 + 027344 9999 99 99 0 9999 99 9999 + 027345 9999 99 99 0 9999 99 9999 + 027346 9999 99 99 0 9999 99 9999 + 027347 9999 99 99 0 9999 99 9999 + 027348 9999 99 99 0 9999 99 9999 + 027349 9999 99 99 0 9999 99 9999 + 027350 9999 99 99 0 9999 99 9999 + 027351 9999 99 99 0 9999 99 9999 + 027352 9999 99 99 0 9999 99 9999 + 027353 9999 99 99 0 9999 99 9999 + 027354 9999 99 99 0 9999 99 9999 + 027355 9999 99 99 0 9999 99 9999 + 027356 9999 99 99 0 9999 99 9999 + 027357 9999 99 99 0 9999 99 9999 + 027358 9999 99 99 0 9999 99 9999 + 027359 9999 99 99 0 9999 99 9999 + 027360 9999 99 99 0 9999 99 9999 + 027361 9999 99 99 0 9999 99 9999 + 027362 9999 99 99 0 9999 99 9999 + 027363 9999 99 99 0 9999 99 9999 + 027364 9999 99 99 0 9999 99 9999 + 027365 9999 99 99 0 9999 99 9999 + 027366 9999 99 99 0 9999 99 9999 + 027367 9999 99 99 0 9999 99 9999 + 027368 9999 99 99 0 9999 99 9999 + 027369 9999 99 99 0 9999 99 9999 + 027370 9999 99 99 0 9999 99 9999 + 027371 9999 99 99 0 9999 99 9999 + 027372 9999 99 99 0 9999 99 9999 + 027373 9999 99 99 0 9999 99 9999 + 027374 9999 99 99 0 9999 99 9999 + 027375 9999 99 99 0 9999 99 9999 + 027376 9999 99 99 0 9999 99 9999 + 027377 9999 99 99 0 9999 99 9999 + 027378 9999 99 99 0 9999 99 9999 + 027379 9999 99 99 0 9999 99 9999 + 027380 9999 99 99 0 9999 99 9999 + 027381 9999 99 99 0 9999 99 9999 + 027382 9999 99 99 0 9999 99 9999 + 027383 9999 99 99 0 9999 99 9999 + 027384 9999 99 99 0 9999 99 9999 + 027385 9999 99 99 0 9999 99 9999 + 027386 9999 99 99 0 9999 99 9999 + 027387 9999 99 99 0 9999 99 9999 + 027388 9999 99 99 0 9999 99 9999 + 027389 9999 99 99 0 9999 99 9999 + 027390 9999 99 99 0 9999 99 9999 + 027391 9999 99 99 0 9999 99 9999 + 027392 9999 99 99 0 9999 99 9999 + 027393 9999 99 99 0 9999 99 9999 + 027394 9999 99 99 0 9999 99 9999 + 027395 9999 99 99 0 9999 99 9999 + 027396 9999 99 99 0 9999 99 9999 + 027397 9999 99 99 0 9999 99 9999 + 027398 9999 99 99 0 9999 99 9999 + 027399 9999 99 99 0 9999 99 9999 + 027400 9999 99 99 0 9999 99 9999 + 027401 9999 99 99 0 9999 99 9999 + 027402 9999 99 99 0 9999 99 9999 + 027403 9999 99 99 0 9999 99 9999 + 027404 9999 99 99 0 9999 99 9999 + 027405 9999 99 99 0 9999 99 9999 + 027406 9999 99 99 0 9999 99 9999 + 027407 9999 99 99 0 9999 99 9999 + 027408 9999 99 99 0 9999 99 9999 + 027409 9999 99 99 0 9999 99 9999 + 027410 9999 99 99 0 9999 99 9999 + 027411 9999 99 99 0 9999 99 9999 + 027412 9999 99 99 0 9999 99 9999 + 027413 9999 99 99 0 9999 99 9999 + 027414 9999 99 99 0 9999 99 9999 + 027415 9999 99 99 0 9999 99 9999 + 027416 9999 99 99 0 9999 99 9999 + 027417 9999 99 99 0 9999 99 9999 + 027418 9999 99 99 0 9999 99 9999 + 027419 9999 99 99 0 9999 99 9999 + 027420 9999 99 99 0 9999 99 9999 + 027421 9999 99 99 0 9999 99 9999 + 027422 9999 99 99 0 9999 99 9999 + 027423 9999 99 99 0 9999 99 9999 + 027424 9999 99 99 0 9999 99 9999 + 027425 9999 99 99 0 9999 99 9999 + 027426 9999 99 99 0 9999 99 9999 + 027427 9999 99 99 0 9999 99 9999 + 027428 9999 99 99 0 9999 99 9999 + 027429 9999 99 99 0 9999 99 9999 + 027430 9999 99 99 0 9999 99 9999 + 027431 9999 99 99 0 9999 99 9999 + 027432 9999 99 99 0 9999 99 9999 + 027433 9999 99 99 0 9999 99 9999 + 027434 9999 99 99 0 9999 99 9999 + 027435 9999 99 99 0 9999 99 9999 + 027436 9999 99 99 0 9999 99 9999 + 027437 9999 99 99 0 9999 99 9999 + 027438 9999 99 99 0 9999 99 9999 + 027439 9999 99 99 0 9999 99 9999 + 027440 9999 99 99 0 9999 99 9999 + 027441 9999 99 99 0 9999 99 9999 + 027442 9999 99 99 0 9999 99 9999 + 027443 9999 99 99 0 9999 99 9999 + 027444 9999 99 99 0 9999 99 9999 + 027445 9999 99 99 0 9999 99 9999 + 027446 9999 99 99 0 9999 99 9999 + 027447 9999 99 99 0 9999 99 9999 + 027448 9999 99 99 0 9999 99 9999 + 027449 9999 99 99 0 9999 99 9999 + 027450 9999 99 99 0 9999 99 9999 + 027451 9999 99 99 0 9999 99 9999 + 027452 9999 99 99 0 9999 99 9999 + 027453 9999 99 99 0 9999 99 9999 + 027454 9999 99 99 0 9999 99 9999 + 027455 9999 99 99 0 9999 99 9999 + 027456 9999 99 99 0 9999 99 9999 + 027457 9999 99 99 0 9999 99 9999 + 027458 9999 99 99 0 9999 99 9999 + 027459 9999 99 99 0 9999 99 9999 + 027460 9999 99 99 0 9999 99 9999 + 027461 9999 99 99 0 9999 99 9999 + 027462 9999 99 99 0 9999 99 9999 + 027463 9999 99 99 0 9999 99 9999 + 027464 9999 99 99 0 9999 99 9999 + 027465 9999 99 99 0 9999 99 9999 + 027466 9999 99 99 0 9999 99 9999 + 027467 9999 99 99 0 9999 99 9999 + 027468 9999 99 99 0 9999 99 9999 + 027469 9999 99 99 0 9999 99 9999 + 027470 9999 99 99 0 9999 99 9999 + 027471 9999 99 99 0 9999 99 9999 + 027472 9999 99 99 0 9999 99 9999 + 027473 9999 99 99 0 9999 99 9999 + 027474 9999 99 99 0 9999 99 9999 + 027475 9999 99 99 0 9999 99 9999 + 027476 9999 99 99 0 9999 99 9999 + 027477 9999 99 99 0 9999 99 9999 + 027478 9999 99 99 0 9999 99 9999 + 027479 9999 99 99 0 9999 99 9999 + 027480 9999 99 99 0 9999 99 9999 + 027481 9999 99 99 0 9999 99 9999 + 027482 9999 99 99 0 9999 99 9999 + 027483 9999 99 99 0 9999 99 9999 + 027484 9999 99 99 0 9999 99 9999 + 027485 9999 99 99 0 9999 99 9999 + 027486 9999 99 99 0 9999 99 9999 + 027487 9999 99 99 0 9999 99 9999 + 027488 9999 99 99 0 9999 99 9999 + 027489 9999 99 99 0 9999 99 9999 + 027490 9999 99 99 0 9999 99 9999 + 027491 9999 99 99 0 9999 99 9999 + 027492 9999 99 99 0 9999 99 9999 + 027493 9999 99 99 0 9999 99 9999 + 027494 9999 99 99 0 9999 99 9999 + 027495 9999 99 99 0 9999 99 9999 + 027496 9999 99 99 0 9999 99 9999 + 027497 9999 99 99 0 9999 99 9999 + 027498 9999 99 99 0 9999 99 9999 + 027499 9999 99 99 0 9999 99 9999 + 027500 9999 99 99 0 9999 99 9999 + 027501 9999 99 99 0 9999 99 9999 + 027502 9999 99 99 0 9999 99 9999 + 027503 9999 99 99 0 9999 99 9999 + 027504 9999 99 99 0 9999 99 9999 + 027505 9999 99 99 0 9999 99 9999 + 027506 9999 99 99 0 9999 99 9999 + 027507 9999 99 99 0 9999 99 9999 + 027508 9999 99 99 0 9999 99 9999 + 027509 9999 99 99 0 9999 99 9999 + 027510 9999 99 99 0 9999 99 9999 + 027511 9999 99 99 0 9999 99 9999 + 027512 9999 99 99 0 9999 99 9999 + 027513 9999 99 99 0 9999 99 9999 + 027514 9999 99 99 0 9999 99 9999 + 027515 9999 99 99 0 9999 99 9999 + 027516 9999 99 99 0 9999 99 9999 + 027517 9999 99 99 0 9999 99 9999 + 027518 9999 99 99 0 9999 99 9999 + 027519 9999 99 99 0 9999 99 9999 + 027520 9999 99 99 0 9999 99 9999 + 027521 9999 99 99 0 9999 99 9999 + 027522 9999 99 99 0 9999 99 9999 + 027523 9999 99 99 0 9999 99 9999 + 027524 9999 99 99 0 9999 99 9999 + 027525 9999 99 99 0 9999 99 9999 + 027526 9999 99 99 0 9999 99 9999 + 027527 9999 99 99 0 9999 99 9999 + 027528 9999 99 99 0 9999 99 9999 + 027529 9999 99 99 0 9999 99 9999 + 027530 9999 99 99 0 9999 99 9999 + 027531 9999 99 99 0 9999 99 9999 + 027532 9999 99 99 0 9999 99 9999 + 027533 9999 99 99 0 9999 99 9999 + 027534 9999 99 99 0 9999 99 9999 + 027535 9999 99 99 0 9999 99 9999 + 027536 9999 99 99 0 9999 99 9999 + 027537 9999 99 99 0 9999 99 9999 + 027538 9999 99 99 0 9999 99 9999 + 027539 9999 99 99 0 9999 99 9999 + 027540 9999 99 99 0 9999 99 9999 + 027541 9999 99 99 0 9999 99 9999 + 027542 9999 99 99 0 9999 99 9999 + 027543 9999 99 99 0 9999 99 9999 + 027544 9999 99 99 0 9999 99 9999 + 027545 9999 99 99 0 9999 99 9999 + 027546 9999 99 99 0 9999 99 9999 + 027547 9999 99 99 0 9999 99 9999 + 027548 9999 99 99 0 9999 99 9999 + 027549 9999 99 99 0 9999 99 9999 + 027550 9999 99 99 0 9999 99 9999 + 027551 9999 99 99 0 9999 99 9999 + 027552 9999 99 99 0 9999 99 9999 + 027553 9999 99 99 0 9999 99 9999 + 027554 9999 99 99 0 9999 99 9999 + 027555 9999 99 99 0 9999 99 9999 + 027556 9999 99 99 0 9999 99 9999 + 027557 9999 99 99 0 9999 99 9999 + 027558 9999 99 99 0 9999 99 9999 + 027559 9999 99 99 0 9999 99 9999 + 027560 9999 99 99 0 9999 99 9999 + 027561 9999 99 99 0 9999 99 9999 + 027562 9999 99 99 0 9999 99 9999 + 027563 9999 99 99 0 9999 99 9999 + 027564 9999 99 99 0 9999 99 9999 + 027565 9999 99 99 0 9999 99 9999 + 027566 9999 99 99 0 9999 99 9999 + 027567 9999 99 99 0 9999 99 9999 + 027568 9999 99 99 0 9999 99 9999 + 027569 9999 99 99 0 9999 99 9999 + 027570 9999 99 99 0 9999 99 9999 + 027571 9999 99 99 0 9999 99 9999 + 027572 9999 99 99 0 9999 99 9999 + 027573 9999 99 99 0 9999 99 9999 + 027574 9999 99 99 0 9999 99 9999 + 027575 9999 99 99 0 9999 99 9999 + 027576 9999 99 99 0 9999 99 9999 + 027577 9999 99 99 0 9999 99 9999 + 027578 9999 99 99 0 9999 99 9999 + 027579 9999 99 99 0 9999 99 9999 + 027580 9999 99 99 0 9999 99 9999 + 027581 9999 99 99 0 9999 99 9999 + 027582 9999 99 99 0 9999 99 9999 + 027583 9999 99 99 0 9999 99 9999 + 027584 9999 99 99 0 9999 99 9999 + 027585 9999 99 99 0 9999 99 9999 + 027586 9999 99 99 0 9999 99 9999 + 027587 9999 99 99 0 9999 99 9999 + 027588 9999 99 99 0 9999 99 9999 + 027589 9999 99 99 0 9999 99 9999 + 027590 9999 99 99 0 9999 99 9999 + 027591 9999 99 99 0 9999 99 9999 + 027592 9999 99 99 0 9999 99 9999 + 027593 9999 99 99 0 9999 99 9999 + 027594 9999 99 99 0 9999 99 9999 + 027595 9999 99 99 0 9999 99 9999 + 027596 9999 99 99 0 9999 99 9999 + 027597 9999 99 99 0 9999 99 9999 + 027598 9999 99 99 0 9999 99 9999 + 027599 9999 99 99 0 9999 99 9999 + 027600 9999 99 99 0 9999 99 9999 + 027601 9999 99 99 0 9999 99 9999 + 027602 9999 99 99 0 9999 99 9999 + 027603 9999 99 99 0 9999 99 9999 + 027604 9999 99 99 0 9999 99 9999 + 027605 9999 99 99 0 9999 99 9999 + 027606 9999 99 99 0 9999 99 9999 + 027607 9999 99 99 0 9999 99 9999 + 027608 9999 99 99 0 9999 99 9999 + 027609 9999 99 99 0 9999 99 9999 + 027610 9999 99 99 0 9999 99 9999 + 027611 9999 99 99 0 9999 99 9999 + 027612 9999 99 99 0 9999 99 9999 + 027613 9999 99 99 0 9999 99 9999 + 027614 9999 99 99 0 9999 99 9999 + 027615 9999 99 99 0 9999 99 9999 + 027616 9999 99 99 0 9999 99 9999 + 027617 9999 99 99 0 9999 99 9999 + 027618 9999 99 99 0 9999 99 9999 + 027619 9999 99 99 0 9999 99 9999 + 027620 9999 99 99 0 9999 99 9999 + 027621 9999 99 99 0 9999 99 9999 + 027622 9999 99 99 0 9999 99 9999 + 027623 9999 99 99 0 9999 99 9999 + 027624 9999 99 99 0 9999 99 9999 + 027625 9999 99 99 0 9999 99 9999 + 027626 9999 99 99 0 9999 99 9999 + 027627 9999 99 99 0 9999 99 9999 + 027628 9999 99 99 0 9999 99 9999 + 027629 9999 99 99 0 9999 99 9999 + 027630 9999 99 99 0 9999 99 9999 + 027631 9999 99 99 0 9999 99 9999 + 027632 9999 99 99 0 9999 99 9999 + 027633 9999 99 99 0 9999 99 9999 + 027634 9999 99 99 0 9999 99 9999 + 027635 9999 99 99 0 9999 99 9999 + 027636 9999 99 99 0 9999 99 9999 + 027637 9999 99 99 0 9999 99 9999 + 027638 9999 99 99 0 9999 99 9999 + 027639 9999 99 99 0 9999 99 9999 + 027640 9999 99 99 0 9999 99 9999 + 027641 9999 99 99 0 9999 99 9999 + 027642 9999 99 99 0 9999 99 9999 + 027643 9999 99 99 0 9999 99 9999 + 027644 9999 99 99 0 9999 99 9999 + 027645 9999 99 99 0 9999 99 9999 + 027646 9999 99 99 0 9999 99 9999 + 027647 9999 99 99 0 9999 99 9999 + 027648 9999 99 99 0 9999 99 9999 + 027649 1272 01 01 1 303079440 08 0075 + 027650 1272 01 02 1 303079440 09 0075 + 027651 9999 99 99 0 9999 99 9999 + 027652 9999 99 99 0 9999 99 9999 + 027653 9999 99 99 0 9999 99 9999 + 027654 9999 99 99 0 9999 99 9999 + 027655 9999 99 99 0 9999 99 9999 + 027656 9999 99 99 0 9999 99 9999 + 027657 1272 02 01 1 303079440 10 0075 + 027658 1272 02 02 1 303079440 11 0075 + 027659 9999 99 99 0 9999 99 9999 + 027660 9999 99 99 0 9999 99 9999 + 027661 9999 99 99 0 9999 99 9999 + 027662 9999 99 99 0 9999 99 9999 + 027663 9999 99 99 0 9999 99 9999 + 027664 9999 99 99 0 9999 99 9999 + 027665 1272 03 01 1 303079440 12 0075 + 027666 1272 03 02 1 303079440 13 0075 + 027667 9999 99 99 0 9999 99 9999 + 027668 9999 99 99 0 9999 99 9999 + 027669 9999 99 99 0 9999 99 9999 + 027670 9999 99 99 0 9999 99 9999 + 027671 9999 99 99 0 9999 99 9999 + 027672 9999 99 99 0 9999 99 9999 + 027673 1272 04 01 1 303079440 14 0075 + 027674 1272 04 02 1 303079440 15 0075 + 027675 9999 99 99 0 9999 99 9999 + 027676 9999 99 99 0 9999 99 9999 + 027677 9999 99 99 0 9999 99 9999 + 027678 9999 99 99 0 9999 99 9999 + 027679 9999 99 99 0 9999 99 9999 + 027680 9999 99 99 0 9999 99 9999 + 027681 1272 05 01 1 303079440 00 0075 + 027682 1272 05 02 1 303079440 01 0075 + 027683 9999 99 99 0 9999 99 9999 + 027684 9999 99 99 0 9999 99 9999 + 027685 9999 99 99 0 9999 99 9999 + 027686 9999 99 99 0 9999 99 9999 + 027687 9999 99 99 0 9999 99 9999 + 027688 9999 99 99 0 9999 99 9999 + 027689 1272 06 01 1 303079440 02 0075 + 027690 1272 06 02 1 303079440 03 0075 + 027691 9999 99 99 0 9999 99 9999 + 027692 9999 99 99 0 9999 99 9999 + 027693 9999 99 99 0 9999 99 9999 + 027694 9999 99 99 0 9999 99 9999 + 027695 9999 99 99 0 9999 99 9999 + 027696 9999 99 99 0 9999 99 9999 + 027697 1272 07 01 1 303079440 04 0075 + 027698 1272 07 02 1 303079440 05 0075 + 027699 9999 99 99 0 9999 99 9999 + 027700 9999 99 99 0 9999 99 9999 + 027701 9999 99 99 0 9999 99 9999 + 027702 9999 99 99 0 9999 99 9999 + 027703 9999 99 99 0 9999 99 9999 + 027704 9999 99 99 0 9999 99 9999 + 027705 1272 08 01 1 303079440 06 0075 + 027706 1272 08 02 1 303079440 07 0075 + 027707 9999 99 99 0 9999 99 9999 + 027708 9999 99 99 0 9999 99 9999 + 027709 9999 99 99 0 9999 99 9999 + 027710 9999 99 99 0 9999 99 9999 + 027711 9999 99 99 0 9999 99 9999 + 027712 9999 99 99 0 9999 99 9999 + 027713 1272 09 01 1 304181260 00 0274 + 027714 1272 09 02 1 304181260 01 0274 + 027715 1272 09 03 1 304181260 02 0274 + 027716 1272 09 04 1 304181260 03 0274 + 027717 9999 99 99 0 9999 99 9999 + 027718 9999 99 99 0 9999 99 9999 + 027719 9999 99 99 0 9999 99 9999 + 027720 9999 99 99 0 9999 99 9999 + 027721 1272 10 01 1 304181260 04 0274 + 027722 1272 10 02 1 304181260 05 0274 + 027723 1272 10 03 1 304181260 06 0274 + 027724 1272 10 04 1 304181260 07 0274 + 027725 9999 99 99 0 9999 99 9999 + 027726 9999 99 99 0 9999 99 9999 + 027727 9999 99 99 0 9999 99 9999 + 027728 9999 99 99 0 9999 99 9999 + 027729 1272 11 01 1 304181260 08 0274 + 027730 1272 11 02 1 304181260 09 0274 + 027731 1272 11 03 1 304181260 10 0274 + 027732 1272 11 04 1 304181260 11 0274 + 027733 9999 99 99 0 9999 99 9999 + 027734 9999 99 99 0 9999 99 9999 + 027735 9999 99 99 0 9999 99 9999 + 027736 9999 99 99 0 9999 99 9999 + 027737 1272 12 01 1 304181260 12 0274 + 027738 1272 12 02 1 304181260 13 0274 + 027739 1272 12 03 1 304181260 14 0274 + 027740 1272 12 04 1 304181260 15 0274 + 027741 9999 99 99 0 9999 99 9999 + 027742 9999 99 99 0 9999 99 9999 + 027743 9999 99 99 0 9999 99 9999 + 027744 9999 99 99 0 9999 99 9999 + 027745 1272 13 01 1 304181264 08 0275 + 027746 1272 13 02 1 304181264 09 0275 + 027747 1272 13 03 1 304181264 10 0275 + 027748 1272 13 04 1 304181264 11 0275 + 027749 9999 99 99 0 9999 99 9999 + 027750 9999 99 99 0 9999 99 9999 + 027751 9999 99 99 0 9999 99 9999 + 027752 9999 99 99 0 9999 99 9999 + 027753 1272 14 01 1 304181264 12 0275 + 027754 1272 14 02 1 304181264 13 0275 + 027755 1272 14 03 1 304181264 14 0275 + 027756 1272 14 04 1 304181264 15 0275 + 027757 9999 99 99 0 9999 99 9999 + 027758 9999 99 99 0 9999 99 9999 + 027759 9999 99 99 0 9999 99 9999 + 027760 9999 99 99 0 9999 99 9999 + 027761 1272 15 01 1 304181264 00 0275 + 027762 1272 15 02 1 304181264 01 0275 + 027763 1272 15 03 1 304181264 02 0275 + 027764 1272 15 04 1 304181264 03 0275 + 027765 9999 99 99 0 9999 99 9999 + 027766 9999 99 99 0 9999 99 9999 + 027767 9999 99 99 0 9999 99 9999 + 027768 9999 99 99 0 9999 99 9999 + 027769 1272 16 01 1 304181264 04 0275 + 027770 1272 16 02 1 304181264 05 0275 + 027771 1272 16 03 1 304181264 06 0275 + 027772 1272 16 04 1 304181264 07 0275 + 027773 9999 99 99 0 9999 99 9999 + 027774 9999 99 99 0 9999 99 9999 + 027775 9999 99 99 0 9999 99 9999 + 027776 9999 99 99 0 9999 99 9999 + 027777 1272 17 01 1 306397192 00 1081 + 027778 1272 17 02 1 306397192 01 1081 + 027779 1272 17 03 1 306397192 02 1081 + 027780 1272 17 04 1 306397192 03 1081 + 027781 1272 17 05 1 306397192 04 1081 + 027782 1272 17 06 1 306397192 05 1081 + 027783 1272 17 07 1 306397192 06 1081 + 027784 1272 17 08 1 306397192 07 1081 + 027785 1272 18 01 1 306397192 08 1081 + 027786 1272 18 02 1 306397192 09 1081 + 027787 1272 18 03 1 306397192 10 1081 + 027788 1272 18 04 1 306397192 11 1081 + 027789 1272 18 05 1 306397192 12 1081 + 027790 1272 18 06 1 306397192 13 1081 + 027791 1272 18 07 1 306397192 14 1081 + 027792 1272 18 08 1 306397192 15 1081 + 027793 1272 19 01 1 306397188 00 1080 + 027794 1272 19 02 1 306397188 01 1080 + 027795 1272 19 03 1 306397188 02 1080 + 027796 1272 19 04 1 306397188 03 1080 + 027797 1272 19 05 1 306397188 04 1080 + 027798 1272 19 06 1 306397188 05 1080 + 027799 1272 19 07 1 306397188 06 1080 + 027800 1272 19 08 1 306397188 07 1080 + 027801 1272 20 01 1 306397188 08 1080 + 027802 1272 20 02 1 306397188 09 1080 + 027803 1272 20 03 1 306397188 10 1080 + 027804 1272 20 04 1 306397188 11 1080 + 027805 1272 20 05 1 306397188 12 1080 + 027806 1272 20 06 1 306397188 13 1080 + 027807 1272 20 07 1 306397188 14 1080 + 027808 1272 20 08 1 306397188 15 1080 + 027809 1272 21 01 1 306397200 00 1083 + 027810 1272 21 02 1 306397200 01 1083 + 027811 1272 21 03 1 306397200 02 1083 + 027812 1272 21 04 1 306397200 03 1083 + 027813 1272 21 05 1 306397200 04 1083 + 027814 1272 21 06 1 306397200 05 1083 + 027815 1272 21 07 1 306397200 06 1083 + 027816 1272 21 08 1 306397200 07 1083 + 027817 1272 22 01 1 306397200 08 1083 + 027818 1272 22 02 1 306397200 09 1083 + 027819 1272 22 03 1 306397200 10 1083 + 027820 1272 22 04 1 306397200 11 1083 + 027821 1272 22 05 1 306397200 12 1083 + 027822 1272 22 06 1 306397200 13 1083 + 027823 1272 22 07 1 306397200 14 1083 + 027824 1272 22 08 1 306397200 15 1083 + 027825 1272 23 01 1 306397196 00 1082 + 027826 1272 23 02 1 306397196 01 1082 + 027827 1272 23 03 1 306397196 02 1082 + 027828 1272 23 04 1 306397196 03 1082 + 027829 1272 23 05 1 306397196 04 1082 + 027830 1272 23 06 1 306397196 05 1082 + 027831 1272 23 07 1 306397196 06 1082 + 027832 1272 23 08 1 306397196 07 1082 + 027833 1272 24 01 1 306397196 08 1082 + 027834 1272 24 02 1 306397196 09 1082 + 027835 1272 24 03 1 306397196 10 1082 + 027836 1272 24 04 1 306397196 11 1082 + 027837 1272 24 05 1 306397196 12 1082 + 027838 1272 24 06 1 306397196 13 1082 + 027839 1272 24 07 1 306397196 14 1082 + 027840 1272 24 08 1 306397196 15 1082 + 027841 1272 25 01 1 303079436 08 0074 + 027842 1272 25 02 1 303079436 09 0074 + 027843 9999 99 99 0 9999 99 9999 + 027844 9999 99 99 0 9999 99 9999 + 027845 9999 99 99 0 9999 99 9999 + 027846 9999 99 99 0 9999 99 9999 + 027847 9999 99 99 0 9999 99 9999 + 027848 9999 99 99 0 9999 99 9999 + 027849 1272 26 01 1 303079436 10 0074 + 027850 1272 26 02 1 303079436 11 0074 + 027851 9999 99 99 0 9999 99 9999 + 027852 9999 99 99 0 9999 99 9999 + 027853 9999 99 99 0 9999 99 9999 + 027854 9999 99 99 0 9999 99 9999 + 027855 9999 99 99 0 9999 99 9999 + 027856 9999 99 99 0 9999 99 9999 + 027857 1272 27 01 1 303079436 12 0074 + 027858 1272 27 02 1 303079436 13 0074 + 027859 9999 99 99 0 9999 99 9999 + 027860 9999 99 99 0 9999 99 9999 + 027861 9999 99 99 0 9999 99 9999 + 027862 9999 99 99 0 9999 99 9999 + 027863 9999 99 99 0 9999 99 9999 + 027864 9999 99 99 0 9999 99 9999 + 027865 1272 28 01 1 303079436 14 0074 + 027866 1272 28 02 1 303079436 15 0074 + 027867 9999 99 99 0 9999 99 9999 + 027868 9999 99 99 0 9999 99 9999 + 027869 9999 99 99 0 9999 99 9999 + 027870 9999 99 99 0 9999 99 9999 + 027871 9999 99 99 0 9999 99 9999 + 027872 9999 99 99 0 9999 99 9999 + 027873 1272 29 01 1 303079436 04 0074 + 027874 1272 29 02 1 303079436 05 0074 + 027875 9999 99 99 0 9999 99 9999 + 027876 9999 99 99 0 9999 99 9999 + 027877 9999 99 99 0 9999 99 9999 + 027878 9999 99 99 0 9999 99 9999 + 027879 9999 99 99 0 9999 99 9999 + 027880 9999 99 99 0 9999 99 9999 + 027881 1272 30 01 1 303079436 06 0074 + 027882 1272 30 02 1 303079436 07 0074 + 027883 9999 99 99 0 9999 99 9999 + 027884 9999 99 99 0 9999 99 9999 + 027885 9999 99 99 0 9999 99 9999 + 027886 9999 99 99 0 9999 99 9999 + 027887 9999 99 99 0 9999 99 9999 + 027888 9999 99 99 0 9999 99 9999 + 027889 1272 31 01 1 303079436 00 0074 + 027890 1272 31 02 1 303079436 01 0074 + 027891 9999 99 99 0 9999 99 9999 + 027892 9999 99 99 0 9999 99 9999 + 027893 9999 99 99 0 9999 99 9999 + 027894 9999 99 99 0 9999 99 9999 + 027895 9999 99 99 0 9999 99 9999 + 027896 9999 99 99 0 9999 99 9999 + 027897 1272 32 01 1 303079436 02 0074 + 027898 1272 32 02 1 303079436 03 0074 + 027899 9999 99 99 0 9999 99 9999 + 027900 9999 99 99 0 9999 99 9999 + 027901 9999 99 99 0 9999 99 9999 + 027902 9999 99 99 0 9999 99 9999 + 027903 9999 99 99 0 9999 99 9999 + 027904 9999 99 99 0 9999 99 9999 + 027905 1272 33 01 1 306393096 00 1073 + 027906 1272 33 02 1 306393096 01 1073 + 027907 1272 33 03 1 306393096 02 1073 + 027908 1272 33 04 1 306393096 03 1073 + 027909 1272 33 05 1 306393096 04 1073 + 027910 1272 33 06 1 306393096 05 1073 + 027911 1272 33 07 1 306393096 06 1073 + 027912 1272 33 08 1 306393096 07 1073 + 027913 1272 34 01 1 306393096 08 1073 + 027914 1272 34 02 1 306393096 09 1073 + 027915 1272 34 03 1 306393096 10 1073 + 027916 1272 34 04 1 306393096 11 1073 + 027917 1272 34 05 1 306393096 12 1073 + 027918 1272 34 06 1 306393096 13 1073 + 027919 1272 34 07 1 306393096 14 1073 + 027920 1272 34 08 1 306393096 15 1073 + 027921 1272 35 01 1 306393092 00 1072 + 027922 1272 35 02 1 306393092 01 1072 + 027923 1272 35 03 1 306393092 02 1072 + 027924 1272 35 04 1 306393092 03 1072 + 027925 1272 35 05 1 306393092 04 1072 + 027926 1272 35 06 1 306393092 05 1072 + 027927 1272 35 07 1 306393092 06 1072 + 027928 1272 35 08 1 306393092 07 1072 + 027929 1272 36 01 1 306393092 08 1072 + 027930 1272 36 02 1 306393092 09 1072 + 027931 1272 36 03 1 306393092 10 1072 + 027932 1272 36 04 1 306393092 11 1072 + 027933 1272 36 05 1 306393092 12 1072 + 027934 1272 36 06 1 306393092 13 1072 + 027935 1272 36 07 1 306393092 14 1072 + 027936 1272 36 08 1 306393092 15 1072 + 027937 1272 37 01 1 306393104 00 1075 + 027938 1272 37 02 1 306393104 01 1075 + 027939 1272 37 03 1 306393104 02 1075 + 027940 1272 37 04 1 306393104 03 1075 + 027941 1272 37 05 1 306393104 04 1075 + 027942 1272 37 06 1 306393104 05 1075 + 027943 1272 37 07 1 306393104 06 1075 + 027944 1272 37 08 1 306393104 07 1075 + 027945 1272 38 01 1 306393104 08 1075 + 027946 1272 38 02 1 306393104 09 1075 + 027947 1272 38 03 1 306393104 10 1075 + 027948 1272 38 04 1 306393104 11 1075 + 027949 1272 38 05 1 306393104 12 1075 + 027950 1272 38 06 1 306393104 13 1075 + 027951 1272 38 07 1 306393104 14 1075 + 027952 1272 38 08 1 306393104 15 1075 + 027953 1272 39 01 1 306393100 00 1074 + 027954 1272 39 02 1 306393100 01 1074 + 027955 1272 39 03 1 306393100 02 1074 + 027956 1272 39 04 1 306393100 03 1074 + 027957 1272 39 05 1 306393100 04 1074 + 027958 1272 39 06 1 306393100 05 1074 + 027959 1272 39 07 1 306393100 06 1074 + 027960 1272 39 08 1 306393100 07 1074 + 027961 1272 40 01 1 306393100 08 1074 + 027962 1272 40 02 1 306393100 09 1074 + 027963 1272 40 03 1 306393100 10 1074 + 027964 1272 40 04 1 306393100 11 1074 + 027965 1272 40 05 1 306393100 12 1074 + 027966 1272 40 06 1 306393100 13 1074 + 027967 1272 40 07 1 306393100 14 1074 + 027968 1272 40 08 1 306393100 15 1074 + 027969 1272 41 01 1 304181256 00 0273 + 027970 1272 41 02 1 304181256 01 0273 + 027971 1272 41 03 1 304181256 02 0273 + 027972 1272 41 04 1 304181256 03 0273 + 027973 9999 99 99 0 9999 99 9999 + 027974 9999 99 99 0 9999 99 9999 + 027975 9999 99 99 0 9999 99 9999 + 027976 9999 99 99 0 9999 99 9999 + 027977 1272 42 01 1 304181256 04 0273 + 027978 1272 42 02 1 304181256 05 0273 + 027979 1272 42 03 1 304181256 06 0273 + 027980 1272 42 04 1 304181256 07 0273 + 027981 9999 99 99 0 9999 99 9999 + 027982 9999 99 99 0 9999 99 9999 + 027983 9999 99 99 0 9999 99 9999 + 027984 9999 99 99 0 9999 99 9999 + 027985 1272 43 01 1 304181256 08 0273 + 027986 1272 43 02 1 304181256 09 0273 + 027987 1272 43 03 1 304181256 10 0273 + 027988 1272 43 04 1 304181256 11 0273 + 027989 9999 99 99 0 9999 99 9999 + 027990 9999 99 99 0 9999 99 9999 + 027991 9999 99 99 0 9999 99 9999 + 027992 9999 99 99 0 9999 99 9999 + 027993 1272 44 01 1 304181256 12 0273 + 027994 1272 44 02 1 304181256 13 0273 + 027995 1272 44 03 1 304181256 14 0273 + 027996 1272 44 04 1 304181256 15 0273 + 027997 9999 99 99 0 9999 99 9999 + 027998 9999 99 99 0 9999 99 9999 + 027999 9999 99 99 0 9999 99 9999 + 028000 9999 99 99 0 9999 99 9999 + 028001 1272 45 01 1 304181252 00 0272 + 028002 1272 45 02 1 304181252 01 0272 + 028003 1272 45 03 1 304181252 02 0272 + 028004 1272 45 04 1 304181252 03 0272 + 028005 9999 99 99 0 9999 99 9999 + 028006 9999 99 99 0 9999 99 9999 + 028007 9999 99 99 0 9999 99 9999 + 028008 9999 99 99 0 9999 99 9999 + 028009 1272 46 01 1 304181252 04 0272 + 028010 1272 46 02 1 304181252 05 0272 + 028011 1272 46 03 1 304181252 06 0272 + 028012 1272 46 04 1 304181252 07 0272 + 028013 9999 99 99 0 9999 99 9999 + 028014 9999 99 99 0 9999 99 9999 + 028015 9999 99 99 0 9999 99 9999 + 028016 9999 99 99 0 9999 99 9999 + 028017 1272 47 01 1 304181252 08 0272 + 028018 1272 47 02 1 304181252 09 0272 + 028019 1272 47 03 1 304181252 10 0272 + 028020 1272 47 04 1 304181252 11 0272 + 028021 9999 99 99 0 9999 99 9999 + 028022 9999 99 99 0 9999 99 9999 + 028023 9999 99 99 0 9999 99 9999 + 028024 9999 99 99 0 9999 99 9999 + 028025 1272 48 01 1 304181252 12 0272 + 028026 1272 48 02 1 304181252 13 0272 + 028027 1272 48 03 1 304181252 14 0272 + 028028 1272 48 04 1 304181252 15 0272 + 028029 9999 99 99 0 9999 99 9999 + 028030 9999 99 99 0 9999 99 9999 + 028031 9999 99 99 0 9999 99 9999 + 028032 9999 99 99 0 9999 99 9999 + 028033 1273 01 01 1 304177164 08 0266 + 028034 1273 01 02 1 304177164 09 0266 + 028035 1273 01 03 1 304177164 10 0266 + 028036 1273 01 04 1 304177164 11 0266 + 028037 9999 99 99 0 9999 99 9999 + 028038 9999 99 99 0 9999 99 9999 + 028039 9999 99 99 0 9999 99 9999 + 028040 9999 99 99 0 9999 99 9999 + 028041 1273 02 01 1 304177164 12 0266 + 028042 1273 02 02 1 304177164 13 0266 + 028043 1273 02 03 1 304177164 14 0266 + 028044 1273 02 04 1 304177164 15 0266 + 028045 9999 99 99 0 9999 99 9999 + 028046 9999 99 99 0 9999 99 9999 + 028047 9999 99 99 0 9999 99 9999 + 028048 9999 99 99 0 9999 99 9999 + 028049 1273 03 01 1 304177164 00 0266 + 028050 1273 03 02 1 304177164 01 0266 + 028051 1273 03 03 1 304177164 02 0266 + 028052 1273 03 04 1 304177164 03 0266 + 028053 9999 99 99 0 9999 99 9999 + 028054 9999 99 99 0 9999 99 9999 + 028055 9999 99 99 0 9999 99 9999 + 028056 9999 99 99 0 9999 99 9999 + 028057 1273 04 01 1 304177164 04 0266 + 028058 1273 04 02 1 304177164 05 0266 + 028059 1273 04 03 1 304177164 06 0266 + 028060 1273 04 04 1 304177164 07 0266 + 028061 9999 99 99 0 9999 99 9999 + 028062 9999 99 99 0 9999 99 9999 + 028063 9999 99 99 0 9999 99 9999 + 028064 9999 99 99 0 9999 99 9999 + 028065 1273 05 01 1 304177168 08 0267 + 028066 1273 05 02 1 304177168 09 0267 + 028067 1273 05 03 1 304177168 10 0267 + 028068 1273 05 04 1 304177168 11 0267 + 028069 9999 99 99 0 9999 99 9999 + 028070 9999 99 99 0 9999 99 9999 + 028071 9999 99 99 0 9999 99 9999 + 028072 9999 99 99 0 9999 99 9999 + 028073 1273 06 01 1 304177168 12 0267 + 028074 1273 06 02 1 304177168 13 0267 + 028075 1273 06 03 1 304177168 14 0267 + 028076 1273 06 04 1 304177168 15 0267 + 028077 9999 99 99 0 9999 99 9999 + 028078 9999 99 99 0 9999 99 9999 + 028079 9999 99 99 0 9999 99 9999 + 028080 9999 99 99 0 9999 99 9999 + 028081 1273 07 01 1 304177168 00 0267 + 028082 1273 07 02 1 304177168 01 0267 + 028083 1273 07 03 1 304177168 02 0267 + 028084 1273 07 04 1 304177168 03 0267 + 028085 9999 99 99 0 9999 99 9999 + 028086 9999 99 99 0 9999 99 9999 + 028087 9999 99 99 0 9999 99 9999 + 028088 9999 99 99 0 9999 99 9999 + 028089 1273 08 01 1 304177168 04 0267 + 028090 1273 08 02 1 304177168 05 0267 + 028091 1273 08 03 1 304177168 06 0267 + 028092 1273 08 04 1 304177168 07 0267 + 028093 9999 99 99 0 9999 99 9999 + 028094 9999 99 99 0 9999 99 9999 + 028095 9999 99 99 0 9999 99 9999 + 028096 9999 99 99 0 9999 99 9999 + 028097 1273 09 01 1 306389004 00 1066 + 028098 1273 09 02 1 306389004 01 1066 + 028099 1273 09 03 1 306389004 02 1066 + 028100 1273 09 04 1 306389004 03 1066 + 028101 1273 09 05 1 306389004 04 1066 + 028102 1273 09 06 1 306389004 05 1066 + 028103 1273 09 07 1 306389004 06 1066 + 028104 1273 09 08 1 306389004 07 1066 + 028105 1273 10 01 1 306389004 08 1066 + 028106 1273 10 02 1 306389004 09 1066 + 028107 1273 10 03 1 306389004 10 1066 + 028108 1273 10 04 1 306389004 11 1066 + 028109 1273 10 05 1 306389004 12 1066 + 028110 1273 10 06 1 306389004 13 1066 + 028111 1273 10 07 1 306389004 14 1066 + 028112 1273 10 08 1 306389004 15 1066 + 028113 1273 11 01 1 306389008 00 1067 + 028114 1273 11 02 1 306389008 01 1067 + 028115 1273 11 03 1 306389008 02 1067 + 028116 1273 11 04 1 306389008 03 1067 + 028117 1273 11 05 1 306389008 04 1067 + 028118 1273 11 06 1 306389008 05 1067 + 028119 1273 11 07 1 306389008 06 1067 + 028120 1273 11 08 1 306389008 07 1067 + 028121 1273 12 01 1 306389008 08 1067 + 028122 1273 12 02 1 306389008 09 1067 + 028123 1273 12 03 1 306389008 10 1067 + 028124 1273 12 04 1 306389008 11 1067 + 028125 1273 12 05 1 306389008 12 1067 + 028126 1273 12 06 1 306389008 13 1067 + 028127 1273 12 07 1 306389008 14 1067 + 028128 1273 12 08 1 306389008 15 1067 + 028129 1273 13 01 1 306388996 00 1064 + 028130 1273 13 02 1 306388996 01 1064 + 028131 1273 13 03 1 306388996 02 1064 + 028132 1273 13 04 1 306388996 03 1064 + 028133 1273 13 05 1 306388996 04 1064 + 028134 1273 13 06 1 306388996 05 1064 + 028135 1273 13 07 1 306388996 06 1064 + 028136 1273 13 08 1 306388996 07 1064 + 028137 1273 14 01 1 306388996 08 1064 + 028138 1273 14 02 1 306388996 09 1064 + 028139 1273 14 03 1 306388996 10 1064 + 028140 1273 14 04 1 306388996 11 1064 + 028141 1273 14 05 1 306388996 12 1064 + 028142 1273 14 06 1 306388996 13 1064 + 028143 1273 14 07 1 306388996 14 1064 + 028144 1273 14 08 1 306388996 15 1064 + 028145 1273 15 01 1 306389000 00 1065 + 028146 1273 15 02 1 306389000 01 1065 + 028147 1273 15 03 1 306389000 02 1065 + 028148 1273 15 04 1 306389000 03 1065 + 028149 1273 15 05 1 306389000 04 1065 + 028150 1273 15 06 1 306389000 05 1065 + 028151 1273 15 07 1 306389000 06 1065 + 028152 1273 15 08 1 306389000 07 1065 + 028153 1273 16 01 1 306389000 08 1065 + 028154 1273 16 02 1 306389000 09 1065 + 028155 1273 16 03 1 306389000 10 1065 + 028156 1273 16 04 1 306389000 11 1065 + 028157 1273 16 05 1 306389000 12 1065 + 028158 1273 16 06 1 306389000 13 1065 + 028159 1273 16 07 1 306389000 14 1065 + 028160 1273 16 08 1 306389000 15 1065 + 028161 1273 17 01 1 303079432 12 0073 + 028162 1273 17 02 1 303079432 13 0073 + 028163 9999 99 99 0 9999 99 9999 + 028164 9999 99 99 0 9999 99 9999 + 028165 9999 99 99 0 9999 99 9999 + 028166 9999 99 99 0 9999 99 9999 + 028167 9999 99 99 0 9999 99 9999 + 028168 9999 99 99 0 9999 99 9999 + 028169 1273 18 01 1 303079432 14 0073 + 028170 1273 18 02 1 303079432 15 0073 + 028171 9999 99 99 0 9999 99 9999 + 028172 9999 99 99 0 9999 99 9999 + 028173 9999 99 99 0 9999 99 9999 + 028174 9999 99 99 0 9999 99 9999 + 028175 9999 99 99 0 9999 99 9999 + 028176 9999 99 99 0 9999 99 9999 + 028177 1273 19 01 1 303079432 08 0073 + 028178 1273 19 02 1 303079432 09 0073 + 028179 9999 99 99 0 9999 99 9999 + 028180 9999 99 99 0 9999 99 9999 + 028181 9999 99 99 0 9999 99 9999 + 028182 9999 99 99 0 9999 99 9999 + 028183 9999 99 99 0 9999 99 9999 + 028184 9999 99 99 0 9999 99 9999 + 028185 1273 20 01 1 303079432 10 0073 + 028186 1273 20 02 1 303079432 11 0073 + 028187 9999 99 99 0 9999 99 9999 + 028188 9999 99 99 0 9999 99 9999 + 028189 9999 99 99 0 9999 99 9999 + 028190 9999 99 99 0 9999 99 9999 + 028191 9999 99 99 0 9999 99 9999 + 028192 9999 99 99 0 9999 99 9999 + 028193 1273 21 01 1 303079432 00 0073 + 028194 1273 21 02 1 303079432 01 0073 + 028195 9999 99 99 0 9999 99 9999 + 028196 9999 99 99 0 9999 99 9999 + 028197 9999 99 99 0 9999 99 9999 + 028198 9999 99 99 0 9999 99 9999 + 028199 9999 99 99 0 9999 99 9999 + 028200 9999 99 99 0 9999 99 9999 + 028201 1273 22 01 1 303079432 02 0073 + 028202 1273 22 02 1 303079432 03 0073 + 028203 9999 99 99 0 9999 99 9999 + 028204 9999 99 99 0 9999 99 9999 + 028205 9999 99 99 0 9999 99 9999 + 028206 9999 99 99 0 9999 99 9999 + 028207 9999 99 99 0 9999 99 9999 + 028208 9999 99 99 0 9999 99 9999 + 028209 1273 23 01 1 303079432 04 0073 + 028210 1273 23 02 1 303079432 05 0073 + 028211 9999 99 99 0 9999 99 9999 + 028212 9999 99 99 0 9999 99 9999 + 028213 9999 99 99 0 9999 99 9999 + 028214 9999 99 99 0 9999 99 9999 + 028215 9999 99 99 0 9999 99 9999 + 028216 9999 99 99 0 9999 99 9999 + 028217 1273 24 01 1 303079432 06 0073 + 028218 1273 24 02 1 303079432 07 0073 + 028219 9999 99 99 0 9999 99 9999 + 028220 9999 99 99 0 9999 99 9999 + 028221 9999 99 99 0 9999 99 9999 + 028222 9999 99 99 0 9999 99 9999 + 028223 9999 99 99 0 9999 99 9999 + 028224 9999 99 99 0 9999 99 9999 + 028225 1273 25 01 1 305278984 00 0593 + 028226 1273 25 02 1 305278984 01 0593 + 028227 1273 25 03 1 305278984 02 0593 + 028228 1273 25 04 1 305278984 03 0593 + 028229 1273 25 05 1 305278984 04 0593 + 028230 1273 25 06 1 305278984 05 0593 + 028231 1273 25 07 1 305278984 06 0593 + 028232 1273 25 08 1 305278984 07 0593 + 028233 1273 26 01 1 305278984 08 0593 + 028234 1273 26 02 1 305278984 09 0593 + 028235 1273 26 03 1 305278984 10 0593 + 028236 1273 26 04 1 305278984 11 0593 + 028237 1273 26 05 1 305278984 12 0593 + 028238 1273 26 06 1 305278984 13 0593 + 028239 1273 26 07 1 305278984 14 0593 + 028240 1273 26 08 1 305278984 15 0593 + 028241 1273 27 01 1 305278980 00 0592 + 028242 1273 27 02 1 305278980 01 0592 + 028243 1273 27 03 1 305278980 02 0592 + 028244 1273 27 04 1 305278980 03 0592 + 028245 1273 27 05 1 305278980 04 0592 + 028246 1273 27 06 1 305278980 05 0592 + 028247 1273 27 07 1 305278980 06 0592 + 028248 1273 27 08 1 305278980 07 0592 + 028249 1273 28 01 1 305278980 08 0592 + 028250 1273 28 02 1 305278980 09 0592 + 028251 1273 28 03 1 305278980 10 0592 + 028252 1273 28 04 1 305278980 11 0592 + 028253 1273 28 05 1 305278980 12 0592 + 028254 1273 28 06 1 305278980 13 0592 + 028255 1273 28 07 1 305278980 14 0592 + 028256 1273 28 08 1 305278980 15 0592 + 028257 1273 29 01 1 305278992 00 0595 + 028258 1273 29 02 1 305278992 01 0595 + 028259 1273 29 03 1 305278992 02 0595 + 028260 1273 29 04 1 305278992 03 0595 + 028261 1273 29 05 1 305278992 04 0595 + 028262 1273 29 06 1 305278992 05 0595 + 028263 1273 29 07 1 305278992 06 0595 + 028264 1273 29 08 1 305278992 07 0595 + 028265 1273 30 01 1 305278992 08 0595 + 028266 1273 30 02 1 305278992 09 0595 + 028267 1273 30 03 1 305278992 10 0595 + 028268 1273 30 04 1 305278992 11 0595 + 028269 1273 30 05 1 305278992 12 0595 + 028270 1273 30 06 1 305278992 13 0595 + 028271 1273 30 07 1 305278992 14 0595 + 028272 1273 30 08 1 305278992 15 0595 + 028273 1273 31 01 1 305278988 00 0594 + 028274 1273 31 02 1 305278988 01 0594 + 028275 1273 31 03 1 305278988 02 0594 + 028276 1273 31 04 1 305278988 03 0594 + 028277 1273 31 05 1 305278988 04 0594 + 028278 1273 31 06 1 305278988 05 0594 + 028279 1273 31 07 1 305278988 06 0594 + 028280 1273 31 08 1 305278988 07 0594 + 028281 1273 32 01 1 305278988 08 0594 + 028282 1273 32 02 1 305278988 09 0594 + 028283 1273 32 03 1 305278988 10 0594 + 028284 1273 32 04 1 305278988 11 0594 + 028285 1273 32 05 1 305278988 12 0594 + 028286 1273 32 06 1 305278988 13 0594 + 028287 1273 32 07 1 305278988 14 0594 + 028288 1273 32 08 1 305278988 15 0594 + 028289 1273 33 01 1 306384908 00 1058 + 028290 1273 33 02 1 306384908 01 1058 + 028291 1273 33 03 1 306384908 02 1058 + 028292 1273 33 04 1 306384908 03 1058 + 028293 1273 33 05 1 306384908 04 1058 + 028294 1273 33 06 1 306384908 05 1058 + 028295 1273 33 07 1 306384908 06 1058 + 028296 1273 33 08 1 306384908 07 1058 + 028297 1273 34 01 1 306384908 08 1058 + 028298 1273 34 02 1 306384908 09 1058 + 028299 1273 34 03 1 306384908 10 1058 + 028300 1273 34 04 1 306384908 11 1058 + 028301 1273 34 05 1 306384908 12 1058 + 028302 1273 34 06 1 306384908 13 1058 + 028303 1273 34 07 1 306384908 14 1058 + 028304 1273 34 08 1 306384908 15 1058 + 028305 1273 35 01 1 306384912 00 1059 + 028306 1273 35 02 1 306384912 01 1059 + 028307 1273 35 03 1 306384912 02 1059 + 028308 1273 35 04 1 306384912 03 1059 + 028309 1273 35 05 1 306384912 04 1059 + 028310 1273 35 06 1 306384912 05 1059 + 028311 1273 35 07 1 306384912 06 1059 + 028312 1273 35 08 1 306384912 07 1059 + 028313 1273 36 01 1 306384912 08 1059 + 028314 1273 36 02 1 306384912 09 1059 + 028315 1273 36 03 1 306384912 10 1059 + 028316 1273 36 04 1 306384912 11 1059 + 028317 1273 36 05 1 306384912 12 1059 + 028318 1273 36 06 1 306384912 13 1059 + 028319 1273 36 07 1 306384912 14 1059 + 028320 1273 36 08 1 306384912 15 1059 + 028321 1273 37 01 1 306384900 00 1056 + 028322 1273 37 02 1 306384900 01 1056 + 028323 1273 37 03 1 306384900 02 1056 + 028324 1273 37 04 1 306384900 03 1056 + 028325 1273 37 05 1 306384900 04 1056 + 028326 1273 37 06 1 306384900 05 1056 + 028327 1273 37 07 1 306384900 06 1056 + 028328 1273 37 08 1 306384900 07 1056 + 028329 1273 38 01 1 306384900 08 1056 + 028330 1273 38 02 1 306384900 09 1056 + 028331 1273 38 03 1 306384900 10 1056 + 028332 1273 38 04 1 306384900 11 1056 + 028333 1273 38 05 1 306384900 12 1056 + 028334 1273 38 06 1 306384900 13 1056 + 028335 1273 38 07 1 306384900 14 1056 + 028336 1273 38 08 1 306384900 15 1056 + 028337 1273 39 01 1 306384904 00 1057 + 028338 1273 39 02 1 306384904 01 1057 + 028339 1273 39 03 1 306384904 02 1057 + 028340 1273 39 04 1 306384904 03 1057 + 028341 1273 39 05 1 306384904 04 1057 + 028342 1273 39 06 1 306384904 05 1057 + 028343 1273 39 07 1 306384904 06 1057 + 028344 1273 39 08 1 306384904 07 1057 + 028345 1273 40 01 1 306384904 08 1057 + 028346 1273 40 02 1 306384904 09 1057 + 028347 1273 40 03 1 306384904 10 1057 + 028348 1273 40 04 1 306384904 11 1057 + 028349 1273 40 05 1 306384904 12 1057 + 028350 1273 40 06 1 306384904 13 1057 + 028351 1273 40 07 1 306384904 14 1057 + 028352 1273 40 08 1 306384904 15 1057 + 028353 1273 41 01 1 304177156 08 0264 + 028354 1273 41 02 1 304177156 09 0264 + 028355 1273 41 03 1 304177156 10 0264 + 028356 1273 41 04 1 304177156 11 0264 + 028357 9999 99 99 0 9999 99 9999 + 028358 9999 99 99 0 9999 99 9999 + 028359 9999 99 99 0 9999 99 9999 + 028360 9999 99 99 0 9999 99 9999 + 028361 1273 42 01 1 304177156 12 0264 + 028362 1273 42 02 1 304177156 13 0264 + 028363 1273 42 03 1 304177156 14 0264 + 028364 1273 42 04 1 304177156 15 0264 + 028365 9999 99 99 0 9999 99 9999 + 028366 9999 99 99 0 9999 99 9999 + 028367 9999 99 99 0 9999 99 9999 + 028368 9999 99 99 0 9999 99 9999 + 028369 1273 43 01 1 304177156 00 0264 + 028370 1273 43 02 1 304177156 01 0264 + 028371 1273 43 03 1 304177156 02 0264 + 028372 1273 43 04 1 304177156 03 0264 + 028373 9999 99 99 0 9999 99 9999 + 028374 9999 99 99 0 9999 99 9999 + 028375 9999 99 99 0 9999 99 9999 + 028376 9999 99 99 0 9999 99 9999 + 028377 1273 44 01 1 304177156 04 0264 + 028378 1273 44 02 1 304177156 05 0264 + 028379 1273 44 03 1 304177156 06 0264 + 028380 1273 44 04 1 304177156 07 0264 + 028381 9999 99 99 0 9999 99 9999 + 028382 9999 99 99 0 9999 99 9999 + 028383 9999 99 99 0 9999 99 9999 + 028384 9999 99 99 0 9999 99 9999 + 028385 1273 45 01 1 304177160 08 0265 + 028386 1273 45 02 1 304177160 09 0265 + 028387 1273 45 03 1 304177160 10 0265 + 028388 1273 45 04 1 304177160 11 0265 + 028389 9999 99 99 0 9999 99 9999 + 028390 9999 99 99 0 9999 99 9999 + 028391 9999 99 99 0 9999 99 9999 + 028392 9999 99 99 0 9999 99 9999 + 028393 1273 46 01 1 304177160 12 0265 + 028394 1273 46 02 1 304177160 13 0265 + 028395 1273 46 03 1 304177160 14 0265 + 028396 1273 46 04 1 304177160 15 0265 + 028397 9999 99 99 0 9999 99 9999 + 028398 9999 99 99 0 9999 99 9999 + 028399 9999 99 99 0 9999 99 9999 + 028400 9999 99 99 0 9999 99 9999 + 028401 1273 47 01 1 304177160 00 0265 + 028402 1273 47 02 1 304177160 01 0265 + 028403 1273 47 03 1 304177160 02 0265 + 028404 1273 47 04 1 304177160 03 0265 + 028405 9999 99 99 0 9999 99 9999 + 028406 9999 99 99 0 9999 99 9999 + 028407 9999 99 99 0 9999 99 9999 + 028408 9999 99 99 0 9999 99 9999 + 028409 1273 48 01 1 304177160 04 0265 + 028410 1273 48 02 1 304177160 05 0265 + 028411 1273 48 03 1 304177160 06 0265 + 028412 1273 48 04 1 304177160 07 0265 + 028413 9999 99 99 0 9999 99 9999 + 028414 9999 99 99 0 9999 99 9999 + 028415 9999 99 99 0 9999 99 9999 + 028416 9999 99 99 0 9999 99 9999 + 028417 1274 01 01 1 305274888 00 0585 + 028418 1274 01 02 1 305274888 01 0585 + 028419 1274 01 03 1 305274888 02 0585 + 028420 1274 01 04 1 305274888 03 0585 + 028421 1274 01 05 1 305274888 04 0585 + 028422 1274 01 06 1 305274888 05 0585 + 028423 1274 01 07 1 305274888 06 0585 + 028424 1274 01 08 1 305274888 07 0585 + 028425 1274 02 01 1 305274888 08 0585 + 028426 1274 02 02 1 305274888 09 0585 + 028427 1274 02 03 1 305274888 10 0585 + 028428 1274 02 04 1 305274888 11 0585 + 028429 1274 02 05 1 305274888 12 0585 + 028430 1274 02 06 1 305274888 13 0585 + 028431 1274 02 07 1 305274888 14 0585 + 028432 1274 02 08 1 305274888 15 0585 + 028433 1274 03 01 1 305274884 00 0584 + 028434 1274 03 02 1 305274884 01 0584 + 028435 1274 03 03 1 305274884 02 0584 + 028436 1274 03 04 1 305274884 03 0584 + 028437 1274 03 05 1 305274884 04 0584 + 028438 1274 03 06 1 305274884 05 0584 + 028439 1274 03 07 1 305274884 06 0584 + 028440 1274 03 08 1 305274884 07 0584 + 028441 1274 04 01 1 305274884 08 0584 + 028442 1274 04 02 1 305274884 09 0584 + 028443 1274 04 03 1 305274884 10 0584 + 028444 1274 04 04 1 305274884 11 0584 + 028445 1274 04 05 1 305274884 12 0584 + 028446 1274 04 06 1 305274884 13 0584 + 028447 1274 04 07 1 305274884 14 0584 + 028448 1274 04 08 1 305274884 15 0584 + 028449 1274 05 01 1 305274896 00 0587 + 028450 1274 05 02 1 305274896 01 0587 + 028451 1274 05 03 1 305274896 02 0587 + 028452 1274 05 04 1 305274896 03 0587 + 028453 1274 05 05 1 305274896 04 0587 + 028454 1274 05 06 1 305274896 05 0587 + 028455 1274 05 07 1 305274896 06 0587 + 028456 1274 05 08 1 305274896 07 0587 + 028457 1274 06 01 1 305274896 08 0587 + 028458 1274 06 02 1 305274896 09 0587 + 028459 1274 06 03 1 305274896 10 0587 + 028460 1274 06 04 1 305274896 11 0587 + 028461 1274 06 05 1 305274896 12 0587 + 028462 1274 06 06 1 305274896 13 0587 + 028463 1274 06 07 1 305274896 14 0587 + 028464 1274 06 08 1 305274896 15 0587 + 028465 1274 07 01 1 305274892 00 0586 + 028466 1274 07 02 1 305274892 01 0586 + 028467 1274 07 03 1 305274892 02 0586 + 028468 1274 07 04 1 305274892 03 0586 + 028469 1274 07 05 1 305274892 04 0586 + 028470 1274 07 06 1 305274892 05 0586 + 028471 1274 07 07 1 305274892 06 0586 + 028472 1274 07 08 1 305274892 07 0586 + 028473 1274 08 01 1 305274892 08 0586 + 028474 1274 08 02 1 305274892 09 0586 + 028475 1274 08 03 1 305274892 10 0586 + 028476 1274 08 04 1 305274892 11 0586 + 028477 1274 08 05 1 305274892 12 0586 + 028478 1274 08 06 1 305274892 13 0586 + 028479 1274 08 07 1 305274892 14 0586 + 028480 1274 08 08 1 305274892 15 0586 + 028481 9999 99 99 0 9999 99 9999 + 028482 9999 99 99 0 9999 99 9999 + 028483 9999 99 99 0 9999 99 9999 + 028484 9999 99 99 0 9999 99 9999 + 028485 9999 99 99 0 9999 99 9999 + 028486 9999 99 99 0 9999 99 9999 + 028487 9999 99 99 0 9999 99 9999 + 028488 9999 99 99 0 9999 99 9999 + 028489 9999 99 99 0 9999 99 9999 + 028490 9999 99 99 0 9999 99 9999 + 028491 9999 99 99 0 9999 99 9999 + 028492 9999 99 99 0 9999 99 9999 + 028493 9999 99 99 0 9999 99 9999 + 028494 9999 99 99 0 9999 99 9999 + 028495 9999 99 99 0 9999 99 9999 + 028496 9999 99 99 0 9999 99 9999 + 028497 9999 99 99 0 9999 99 9999 + 028498 9999 99 99 0 9999 99 9999 + 028499 9999 99 99 0 9999 99 9999 + 028500 9999 99 99 0 9999 99 9999 + 028501 9999 99 99 0 9999 99 9999 + 028502 9999 99 99 0 9999 99 9999 + 028503 9999 99 99 0 9999 99 9999 + 028504 9999 99 99 0 9999 99 9999 + 028505 9999 99 99 0 9999 99 9999 + 028506 9999 99 99 0 9999 99 9999 + 028507 9999 99 99 0 9999 99 9999 + 028508 9999 99 99 0 9999 99 9999 + 028509 9999 99 99 0 9999 99 9999 + 028510 9999 99 99 0 9999 99 9999 + 028511 9999 99 99 0 9999 99 9999 + 028512 9999 99 99 0 9999 99 9999 + 028513 9999 99 99 0 9999 99 9999 + 028514 9999 99 99 0 9999 99 9999 + 028515 9999 99 99 0 9999 99 9999 + 028516 9999 99 99 0 9999 99 9999 + 028517 9999 99 99 0 9999 99 9999 + 028518 9999 99 99 0 9999 99 9999 + 028519 9999 99 99 0 9999 99 9999 + 028520 9999 99 99 0 9999 99 9999 + 028521 9999 99 99 0 9999 99 9999 + 028522 9999 99 99 0 9999 99 9999 + 028523 9999 99 99 0 9999 99 9999 + 028524 9999 99 99 0 9999 99 9999 + 028525 9999 99 99 0 9999 99 9999 + 028526 9999 99 99 0 9999 99 9999 + 028527 9999 99 99 0 9999 99 9999 + 028528 9999 99 99 0 9999 99 9999 + 028529 9999 99 99 0 9999 99 9999 + 028530 9999 99 99 0 9999 99 9999 + 028531 9999 99 99 0 9999 99 9999 + 028532 9999 99 99 0 9999 99 9999 + 028533 9999 99 99 0 9999 99 9999 + 028534 9999 99 99 0 9999 99 9999 + 028535 9999 99 99 0 9999 99 9999 + 028536 9999 99 99 0 9999 99 9999 + 028537 9999 99 99 0 9999 99 9999 + 028538 9999 99 99 0 9999 99 9999 + 028539 9999 99 99 0 9999 99 9999 + 028540 9999 99 99 0 9999 99 9999 + 028541 9999 99 99 0 9999 99 9999 + 028542 9999 99 99 0 9999 99 9999 + 028543 9999 99 99 0 9999 99 9999 + 028544 9999 99 99 0 9999 99 9999 + 028545 9999 99 99 0 9999 99 9999 + 028546 9999 99 99 0 9999 99 9999 + 028547 9999 99 99 0 9999 99 9999 + 028548 9999 99 99 0 9999 99 9999 + 028549 9999 99 99 0 9999 99 9999 + 028550 9999 99 99 0 9999 99 9999 + 028551 9999 99 99 0 9999 99 9999 + 028552 9999 99 99 0 9999 99 9999 + 028553 9999 99 99 0 9999 99 9999 + 028554 9999 99 99 0 9999 99 9999 + 028555 9999 99 99 0 9999 99 9999 + 028556 9999 99 99 0 9999 99 9999 + 028557 9999 99 99 0 9999 99 9999 + 028558 9999 99 99 0 9999 99 9999 + 028559 9999 99 99 0 9999 99 9999 + 028560 9999 99 99 0 9999 99 9999 + 028561 9999 99 99 0 9999 99 9999 + 028562 9999 99 99 0 9999 99 9999 + 028563 9999 99 99 0 9999 99 9999 + 028564 9999 99 99 0 9999 99 9999 + 028565 9999 99 99 0 9999 99 9999 + 028566 9999 99 99 0 9999 99 9999 + 028567 9999 99 99 0 9999 99 9999 + 028568 9999 99 99 0 9999 99 9999 + 028569 9999 99 99 0 9999 99 9999 + 028570 9999 99 99 0 9999 99 9999 + 028571 9999 99 99 0 9999 99 9999 + 028572 9999 99 99 0 9999 99 9999 + 028573 9999 99 99 0 9999 99 9999 + 028574 9999 99 99 0 9999 99 9999 + 028575 9999 99 99 0 9999 99 9999 + 028576 9999 99 99 0 9999 99 9999 + 028577 9999 99 99 0 9999 99 9999 + 028578 9999 99 99 0 9999 99 9999 + 028579 9999 99 99 0 9999 99 9999 + 028580 9999 99 99 0 9999 99 9999 + 028581 9999 99 99 0 9999 99 9999 + 028582 9999 99 99 0 9999 99 9999 + 028583 9999 99 99 0 9999 99 9999 + 028584 9999 99 99 0 9999 99 9999 + 028585 9999 99 99 0 9999 99 9999 + 028586 9999 99 99 0 9999 99 9999 + 028587 9999 99 99 0 9999 99 9999 + 028588 9999 99 99 0 9999 99 9999 + 028589 9999 99 99 0 9999 99 9999 + 028590 9999 99 99 0 9999 99 9999 + 028591 9999 99 99 0 9999 99 9999 + 028592 9999 99 99 0 9999 99 9999 + 028593 9999 99 99 0 9999 99 9999 + 028594 9999 99 99 0 9999 99 9999 + 028595 9999 99 99 0 9999 99 9999 + 028596 9999 99 99 0 9999 99 9999 + 028597 9999 99 99 0 9999 99 9999 + 028598 9999 99 99 0 9999 99 9999 + 028599 9999 99 99 0 9999 99 9999 + 028600 9999 99 99 0 9999 99 9999 + 028601 9999 99 99 0 9999 99 9999 + 028602 9999 99 99 0 9999 99 9999 + 028603 9999 99 99 0 9999 99 9999 + 028604 9999 99 99 0 9999 99 9999 + 028605 9999 99 99 0 9999 99 9999 + 028606 9999 99 99 0 9999 99 9999 + 028607 9999 99 99 0 9999 99 9999 + 028608 9999 99 99 0 9999 99 9999 + 028609 1274 25 01 1 305287176 00 0609 + 028610 1274 25 02 1 305287176 01 0609 + 028611 1274 25 03 1 305287176 02 0609 + 028612 1274 25 04 1 305287176 03 0609 + 028613 1274 25 05 1 305287176 04 0609 + 028614 1274 25 06 1 305287176 05 0609 + 028615 1274 25 07 1 305287176 06 0609 + 028616 1274 25 08 1 305287176 07 0609 + 028617 1274 26 01 1 305287176 08 0609 + 028618 1274 26 02 1 305287176 09 0609 + 028619 1274 26 03 1 305287176 10 0609 + 028620 1274 26 04 1 305287176 11 0609 + 028621 1274 26 05 1 305287176 12 0609 + 028622 1274 26 06 1 305287176 13 0609 + 028623 1274 26 07 1 305287176 14 0609 + 028624 1274 26 08 1 305287176 15 0609 + 028625 1274 27 01 1 305287172 00 0608 + 028626 1274 27 02 1 305287172 01 0608 + 028627 1274 27 03 1 305287172 02 0608 + 028628 1274 27 04 1 305287172 03 0608 + 028629 1274 27 05 1 305287172 04 0608 + 028630 1274 27 06 1 305287172 05 0608 + 028631 1274 27 07 1 305287172 06 0608 + 028632 1274 27 08 1 305287172 07 0608 + 028633 1274 28 01 1 305287172 08 0608 + 028634 1274 28 02 1 305287172 09 0608 + 028635 1274 28 03 1 305287172 10 0608 + 028636 1274 28 04 1 305287172 11 0608 + 028637 1274 28 05 1 305287172 12 0608 + 028638 1274 28 06 1 305287172 13 0608 + 028639 1274 28 07 1 305287172 14 0608 + 028640 1274 28 08 1 305287172 15 0608 + 028641 1274 29 01 1 305287184 00 0611 + 028642 1274 29 02 1 305287184 01 0611 + 028643 1274 29 03 1 305287184 02 0611 + 028644 1274 29 04 1 305287184 03 0611 + 028645 1274 29 05 1 305287184 04 0611 + 028646 1274 29 06 1 305287184 05 0611 + 028647 1274 29 07 1 305287184 06 0611 + 028648 1274 29 08 1 305287184 07 0611 + 028649 1274 30 01 1 305287184 08 0611 + 028650 1274 30 02 1 305287184 09 0611 + 028651 1274 30 03 1 305287184 10 0611 + 028652 1274 30 04 1 305287184 11 0611 + 028653 1274 30 05 1 305287184 12 0611 + 028654 1274 30 06 1 305287184 13 0611 + 028655 1274 30 07 1 305287184 14 0611 + 028656 1274 30 08 1 305287184 15 0611 + 028657 1274 31 01 1 305287180 00 0610 + 028658 1274 31 02 1 305287180 01 0610 + 028659 1274 31 03 1 305287180 02 0610 + 028660 1274 31 04 1 305287180 03 0610 + 028661 1274 31 05 1 305287180 04 0610 + 028662 1274 31 06 1 305287180 05 0610 + 028663 1274 31 07 1 305287180 06 0610 + 028664 1274 31 08 1 305287180 07 0610 + 028665 1274 32 01 1 305287180 08 0610 + 028666 1274 32 02 1 305287180 09 0610 + 028667 1274 32 03 1 305287180 10 0610 + 028668 1274 32 04 1 305287180 11 0610 + 028669 1274 32 05 1 305287180 12 0610 + 028670 1274 32 06 1 305287180 13 0610 + 028671 1274 32 07 1 305287180 14 0610 + 028672 1274 32 08 1 305287180 15 0610 + 028673 1274 33 01 1 305283084 00 0602 + 028674 1274 33 02 1 305283084 01 0602 + 028675 1274 33 03 1 305283084 02 0602 + 028676 1274 33 04 1 305283084 03 0602 + 028677 1274 33 05 1 305283084 04 0602 + 028678 1274 33 06 1 305283084 05 0602 + 028679 1274 33 07 1 305283084 06 0602 + 028680 1274 33 08 1 305283084 07 0602 + 028681 1274 34 01 1 305283084 08 0602 + 028682 1274 34 02 1 305283084 09 0602 + 028683 1274 34 03 1 305283084 10 0602 + 028684 1274 34 04 1 305283084 11 0602 + 028685 1274 34 05 1 305283084 12 0602 + 028686 1274 34 06 1 305283084 13 0602 + 028687 1274 34 07 1 305283084 14 0602 + 028688 1274 34 08 1 305283084 15 0602 + 028689 1274 35 01 1 305283088 00 0603 + 028690 1274 35 02 1 305283088 01 0603 + 028691 1274 35 03 1 305283088 02 0603 + 028692 1274 35 04 1 305283088 03 0603 + 028693 1274 35 05 1 305283088 04 0603 + 028694 1274 35 06 1 305283088 05 0603 + 028695 1274 35 07 1 305283088 06 0603 + 028696 1274 35 08 1 305283088 07 0603 + 028697 1274 36 01 1 305283088 08 0603 + 028698 1274 36 02 1 305283088 09 0603 + 028699 1274 36 03 1 305283088 10 0603 + 028700 1274 36 04 1 305283088 11 0603 + 028701 1274 36 05 1 305283088 12 0603 + 028702 1274 36 06 1 305283088 13 0603 + 028703 1274 36 07 1 305283088 14 0603 + 028704 1274 36 08 1 305283088 15 0603 + 028705 1274 37 01 1 305283076 00 0600 + 028706 1274 37 02 1 305283076 01 0600 + 028707 1274 37 03 1 305283076 02 0600 + 028708 1274 37 04 1 305283076 03 0600 + 028709 1274 37 05 1 305283076 04 0600 + 028710 1274 37 06 1 305283076 05 0600 + 028711 1274 37 07 1 305283076 06 0600 + 028712 1274 37 08 1 305283076 07 0600 + 028713 1274 38 01 1 305283076 08 0600 + 028714 1274 38 02 1 305283076 09 0600 + 028715 1274 38 03 1 305283076 10 0600 + 028716 1274 38 04 1 305283076 11 0600 + 028717 1274 38 05 1 305283076 12 0600 + 028718 1274 38 06 1 305283076 13 0600 + 028719 1274 38 07 1 305283076 14 0600 + 028720 1274 38 08 1 305283076 15 0600 + 028721 1274 39 01 1 305283080 00 0601 + 028722 1274 39 02 1 305283080 01 0601 + 028723 1274 39 03 1 305283080 02 0601 + 028724 1274 39 04 1 305283080 03 0601 + 028725 1274 39 05 1 305283080 04 0601 + 028726 1274 39 06 1 305283080 05 0601 + 028727 1274 39 07 1 305283080 06 0601 + 028728 1274 39 08 1 305283080 07 0601 + 028729 1274 40 01 1 305283080 08 0601 + 028730 1274 40 02 1 305283080 09 0601 + 028731 1274 40 03 1 305283080 10 0601 + 028732 1274 40 04 1 305283080 11 0601 + 028733 1274 40 05 1 305283080 12 0601 + 028734 1274 40 06 1 305283080 13 0601 + 028735 1274 40 07 1 305283080 14 0601 + 028736 1274 40 08 1 305283080 15 0601 + 028737 9999 99 99 0 9999 99 9999 + 028738 9999 99 99 0 9999 99 9999 + 028739 9999 99 99 0 9999 99 9999 + 028740 9999 99 99 0 9999 99 9999 + 028741 9999 99 99 0 9999 99 9999 + 028742 9999 99 99 0 9999 99 9999 + 028743 9999 99 99 0 9999 99 9999 + 028744 9999 99 99 0 9999 99 9999 + 028745 9999 99 99 0 9999 99 9999 + 028746 9999 99 99 0 9999 99 9999 + 028747 9999 99 99 0 9999 99 9999 + 028748 9999 99 99 0 9999 99 9999 + 028749 9999 99 99 0 9999 99 9999 + 028750 9999 99 99 0 9999 99 9999 + 028751 9999 99 99 0 9999 99 9999 + 028752 9999 99 99 0 9999 99 9999 + 028753 9999 99 99 0 9999 99 9999 + 028754 9999 99 99 0 9999 99 9999 + 028755 9999 99 99 0 9999 99 9999 + 028756 9999 99 99 0 9999 99 9999 + 028757 9999 99 99 0 9999 99 9999 + 028758 9999 99 99 0 9999 99 9999 + 028759 9999 99 99 0 9999 99 9999 + 028760 9999 99 99 0 9999 99 9999 + 028761 9999 99 99 0 9999 99 9999 + 028762 9999 99 99 0 9999 99 9999 + 028763 9999 99 99 0 9999 99 9999 + 028764 9999 99 99 0 9999 99 9999 + 028765 9999 99 99 0 9999 99 9999 + 028766 9999 99 99 0 9999 99 9999 + 028767 9999 99 99 0 9999 99 9999 + 028768 9999 99 99 0 9999 99 9999 + 028769 9999 99 99 0 9999 99 9999 + 028770 9999 99 99 0 9999 99 9999 + 028771 9999 99 99 0 9999 99 9999 + 028772 9999 99 99 0 9999 99 9999 + 028773 9999 99 99 0 9999 99 9999 + 028774 9999 99 99 0 9999 99 9999 + 028775 9999 99 99 0 9999 99 9999 + 028776 9999 99 99 0 9999 99 9999 + 028777 9999 99 99 0 9999 99 9999 + 028778 9999 99 99 0 9999 99 9999 + 028779 9999 99 99 0 9999 99 9999 + 028780 9999 99 99 0 9999 99 9999 + 028781 9999 99 99 0 9999 99 9999 + 028782 9999 99 99 0 9999 99 9999 + 028783 9999 99 99 0 9999 99 9999 + 028784 9999 99 99 0 9999 99 9999 + 028785 9999 99 99 0 9999 99 9999 + 028786 9999 99 99 0 9999 99 9999 + 028787 9999 99 99 0 9999 99 9999 + 028788 9999 99 99 0 9999 99 9999 + 028789 9999 99 99 0 9999 99 9999 + 028790 9999 99 99 0 9999 99 9999 + 028791 9999 99 99 0 9999 99 9999 + 028792 9999 99 99 0 9999 99 9999 + 028793 9999 99 99 0 9999 99 9999 + 028794 9999 99 99 0 9999 99 9999 + 028795 9999 99 99 0 9999 99 9999 + 028796 9999 99 99 0 9999 99 9999 + 028797 9999 99 99 0 9999 99 9999 + 028798 9999 99 99 0 9999 99 9999 + 028799 9999 99 99 0 9999 99 9999 + 028800 9999 99 99 0 9999 99 9999 + 028801 1275 01 01 1 303083536 08 0083 + 028802 1275 01 02 1 303083536 09 0083 + 028803 9999 99 99 0 9999 99 9999 + 028804 9999 99 99 0 9999 99 9999 + 028805 9999 99 99 0 9999 99 9999 + 028806 9999 99 99 0 9999 99 9999 + 028807 9999 99 99 0 9999 99 9999 + 028808 9999 99 99 0 9999 99 9999 + 028809 1275 02 01 1 303083536 10 0083 + 028810 1275 02 02 1 303083536 11 0083 + 028811 9999 99 99 0 9999 99 9999 + 028812 9999 99 99 0 9999 99 9999 + 028813 9999 99 99 0 9999 99 9999 + 028814 9999 99 99 0 9999 99 9999 + 028815 9999 99 99 0 9999 99 9999 + 028816 9999 99 99 0 9999 99 9999 + 028817 1275 03 01 1 303083536 12 0083 + 028818 1275 03 02 1 303083536 13 0083 + 028819 9999 99 99 0 9999 99 9999 + 028820 9999 99 99 0 9999 99 9999 + 028821 9999 99 99 0 9999 99 9999 + 028822 9999 99 99 0 9999 99 9999 + 028823 9999 99 99 0 9999 99 9999 + 028824 9999 99 99 0 9999 99 9999 + 028825 1275 04 01 1 303083536 14 0083 + 028826 1275 04 02 1 303083536 15 0083 + 028827 9999 99 99 0 9999 99 9999 + 028828 9999 99 99 0 9999 99 9999 + 028829 9999 99 99 0 9999 99 9999 + 028830 9999 99 99 0 9999 99 9999 + 028831 9999 99 99 0 9999 99 9999 + 028832 9999 99 99 0 9999 99 9999 + 028833 1275 05 01 1 303083536 00 0083 + 028834 1275 05 02 1 303083536 01 0083 + 028835 9999 99 99 0 9999 99 9999 + 028836 9999 99 99 0 9999 99 9999 + 028837 9999 99 99 0 9999 99 9999 + 028838 9999 99 99 0 9999 99 9999 + 028839 9999 99 99 0 9999 99 9999 + 028840 9999 99 99 0 9999 99 9999 + 028841 1275 06 01 1 303083536 02 0083 + 028842 1275 06 02 1 303083536 03 0083 + 028843 9999 99 99 0 9999 99 9999 + 028844 9999 99 99 0 9999 99 9999 + 028845 9999 99 99 0 9999 99 9999 + 028846 9999 99 99 0 9999 99 9999 + 028847 9999 99 99 0 9999 99 9999 + 028848 9999 99 99 0 9999 99 9999 + 028849 1275 07 01 1 303083536 04 0083 + 028850 1275 07 02 1 303083536 05 0083 + 028851 9999 99 99 0 9999 99 9999 + 028852 9999 99 99 0 9999 99 9999 + 028853 9999 99 99 0 9999 99 9999 + 028854 9999 99 99 0 9999 99 9999 + 028855 9999 99 99 0 9999 99 9999 + 028856 9999 99 99 0 9999 99 9999 + 028857 1275 08 01 1 303083536 06 0083 + 028858 1275 08 02 1 303083536 07 0083 + 028859 9999 99 99 0 9999 99 9999 + 028860 9999 99 99 0 9999 99 9999 + 028861 9999 99 99 0 9999 99 9999 + 028862 9999 99 99 0 9999 99 9999 + 028863 9999 99 99 0 9999 99 9999 + 028864 9999 99 99 0 9999 99 9999 + 028865 1275 09 01 1 304189452 00 0290 + 028866 1275 09 02 1 304189452 01 0290 + 028867 1275 09 03 1 304189452 02 0290 + 028868 1275 09 04 1 304189452 03 0290 + 028869 9999 99 99 0 9999 99 9999 + 028870 9999 99 99 0 9999 99 9999 + 028871 9999 99 99 0 9999 99 9999 + 028872 9999 99 99 0 9999 99 9999 + 028873 1275 10 01 1 304189452 04 0290 + 028874 1275 10 02 1 304189452 05 0290 + 028875 1275 10 03 1 304189452 06 0290 + 028876 1275 10 04 1 304189452 07 0290 + 028877 9999 99 99 0 9999 99 9999 + 028878 9999 99 99 0 9999 99 9999 + 028879 9999 99 99 0 9999 99 9999 + 028880 9999 99 99 0 9999 99 9999 + 028881 1275 11 01 1 304189452 08 0290 + 028882 1275 11 02 1 304189452 09 0290 + 028883 1275 11 03 1 304189452 10 0290 + 028884 1275 11 04 1 304189452 11 0290 + 028885 9999 99 99 0 9999 99 9999 + 028886 9999 99 99 0 9999 99 9999 + 028887 9999 99 99 0 9999 99 9999 + 028888 9999 99 99 0 9999 99 9999 + 028889 1275 12 01 1 304189452 12 0290 + 028890 1275 12 02 1 304189452 13 0290 + 028891 1275 12 03 1 304189452 14 0290 + 028892 1275 12 04 1 304189452 15 0290 + 028893 9999 99 99 0 9999 99 9999 + 028894 9999 99 99 0 9999 99 9999 + 028895 9999 99 99 0 9999 99 9999 + 028896 9999 99 99 0 9999 99 9999 + 028897 1275 13 01 1 304189456 08 0291 + 028898 1275 13 02 1 304189456 09 0291 + 028899 1275 13 03 1 304189456 10 0291 + 028900 1275 13 04 1 304189456 11 0291 + 028901 9999 99 99 0 9999 99 9999 + 028902 9999 99 99 0 9999 99 9999 + 028903 9999 99 99 0 9999 99 9999 + 028904 9999 99 99 0 9999 99 9999 + 028905 1275 14 01 1 304189456 12 0291 + 028906 1275 14 02 1 304189456 13 0291 + 028907 1275 14 03 1 304189456 14 0291 + 028908 1275 14 04 1 304189456 15 0291 + 028909 9999 99 99 0 9999 99 9999 + 028910 9999 99 99 0 9999 99 9999 + 028911 9999 99 99 0 9999 99 9999 + 028912 9999 99 99 0 9999 99 9999 + 028913 1275 15 01 1 304189456 00 0291 + 028914 1275 15 02 1 304189456 01 0291 + 028915 1275 15 03 1 304189456 02 0291 + 028916 1275 15 04 1 304189456 03 0291 + 028917 9999 99 99 0 9999 99 9999 + 028918 9999 99 99 0 9999 99 9999 + 028919 9999 99 99 0 9999 99 9999 + 028920 9999 99 99 0 9999 99 9999 + 028921 1275 16 01 1 304189456 04 0291 + 028922 1275 16 02 1 304189456 05 0291 + 028923 1275 16 03 1 304189456 06 0291 + 028924 1275 16 04 1 304189456 07 0291 + 028925 9999 99 99 0 9999 99 9999 + 028926 9999 99 99 0 9999 99 9999 + 028927 9999 99 99 0 9999 99 9999 + 028928 9999 99 99 0 9999 99 9999 + 028929 1275 17 01 1 306413576 00 1113 + 028930 1275 17 02 1 306413576 01 1113 + 028931 1275 17 03 1 306413576 02 1113 + 028932 1275 17 04 1 306413576 03 1113 + 028933 1275 17 05 1 306413576 04 1113 + 028934 1275 17 06 1 306413576 05 1113 + 028935 1275 17 07 1 306413576 06 1113 + 028936 1275 17 08 1 306413576 07 1113 + 028937 1275 18 01 1 306413576 08 1113 + 028938 1275 18 02 1 306413576 09 1113 + 028939 1275 18 03 1 306413576 10 1113 + 028940 1275 18 04 1 306413576 11 1113 + 028941 1275 18 05 1 306413576 12 1113 + 028942 1275 18 06 1 306413576 13 1113 + 028943 1275 18 07 1 306413576 14 1113 + 028944 1275 18 08 1 306413576 15 1113 + 028945 1275 19 01 1 306413572 00 1112 + 028946 1275 19 02 1 306413572 01 1112 + 028947 1275 19 03 1 306413572 02 1112 + 028948 1275 19 04 1 306413572 03 1112 + 028949 1275 19 05 1 306413572 04 1112 + 028950 1275 19 06 1 306413572 05 1112 + 028951 1275 19 07 1 306413572 06 1112 + 028952 1275 19 08 1 306413572 07 1112 + 028953 1275 20 01 1 306413572 08 1112 + 028954 1275 20 02 1 306413572 09 1112 + 028955 1275 20 03 1 306413572 10 1112 + 028956 1275 20 04 1 306413572 11 1112 + 028957 1275 20 05 1 306413572 12 1112 + 028958 1275 20 06 1 306413572 13 1112 + 028959 1275 20 07 1 306413572 14 1112 + 028960 1275 20 08 1 306413572 15 1112 + 028961 1275 21 01 1 306413584 00 1115 + 028962 1275 21 02 1 306413584 01 1115 + 028963 1275 21 03 1 306413584 02 1115 + 028964 1275 21 04 1 306413584 03 1115 + 028965 1275 21 05 1 306413584 04 1115 + 028966 1275 21 06 1 306413584 05 1115 + 028967 1275 21 07 1 306413584 06 1115 + 028968 1275 21 08 1 306413584 07 1115 + 028969 1275 22 01 1 306413584 08 1115 + 028970 1275 22 02 1 306413584 09 1115 + 028971 1275 22 03 1 306413584 10 1115 + 028972 1275 22 04 1 306413584 11 1115 + 028973 1275 22 05 1 306413584 12 1115 + 028974 1275 22 06 1 306413584 13 1115 + 028975 1275 22 07 1 306413584 14 1115 + 028976 1275 22 08 1 306413584 15 1115 + 028977 1275 23 01 1 306413580 00 1114 + 028978 1275 23 02 1 306413580 01 1114 + 028979 1275 23 03 1 306413580 02 1114 + 028980 1275 23 04 1 306413580 03 1114 + 028981 1275 23 05 1 306413580 04 1114 + 028982 1275 23 06 1 306413580 05 1114 + 028983 1275 23 07 1 306413580 06 1114 + 028984 1275 23 08 1 306413580 07 1114 + 028985 1275 24 01 1 306413580 08 1114 + 028986 1275 24 02 1 306413580 09 1114 + 028987 1275 24 03 1 306413580 10 1114 + 028988 1275 24 04 1 306413580 11 1114 + 028989 1275 24 05 1 306413580 12 1114 + 028990 1275 24 06 1 306413580 13 1114 + 028991 1275 24 07 1 306413580 14 1114 + 028992 1275 24 08 1 306413580 15 1114 + 028993 1275 25 01 1 303083532 08 0082 + 028994 1275 25 02 1 303083532 09 0082 + 028995 9999 99 99 0 9999 99 9999 + 028996 9999 99 99 0 9999 99 9999 + 028997 9999 99 99 0 9999 99 9999 + 028998 9999 99 99 0 9999 99 9999 + 028999 9999 99 99 0 9999 99 9999 + 029000 9999 99 99 0 9999 99 9999 + 029001 1275 26 01 1 303083532 10 0082 + 029002 1275 26 02 1 303083532 11 0082 + 029003 9999 99 99 0 9999 99 9999 + 029004 9999 99 99 0 9999 99 9999 + 029005 9999 99 99 0 9999 99 9999 + 029006 9999 99 99 0 9999 99 9999 + 029007 9999 99 99 0 9999 99 9999 + 029008 9999 99 99 0 9999 99 9999 + 029009 1275 27 01 1 303083532 12 0082 + 029010 1275 27 02 1 303083532 13 0082 + 029011 9999 99 99 0 9999 99 9999 + 029012 9999 99 99 0 9999 99 9999 + 029013 9999 99 99 0 9999 99 9999 + 029014 9999 99 99 0 9999 99 9999 + 029015 9999 99 99 0 9999 99 9999 + 029016 9999 99 99 0 9999 99 9999 + 029017 1275 28 01 1 303083532 14 0082 + 029018 1275 28 02 1 303083532 15 0082 + 029019 9999 99 99 0 9999 99 9999 + 029020 9999 99 99 0 9999 99 9999 + 029021 9999 99 99 0 9999 99 9999 + 029022 9999 99 99 0 9999 99 9999 + 029023 9999 99 99 0 9999 99 9999 + 029024 9999 99 99 0 9999 99 9999 + 029025 1275 29 01 1 303083532 04 0082 + 029026 1275 29 02 1 303083532 05 0082 + 029027 9999 99 99 0 9999 99 9999 + 029028 9999 99 99 0 9999 99 9999 + 029029 9999 99 99 0 9999 99 9999 + 029030 9999 99 99 0 9999 99 9999 + 029031 9999 99 99 0 9999 99 9999 + 029032 9999 99 99 0 9999 99 9999 + 029033 1275 30 01 1 303083532 06 0082 + 029034 1275 30 02 1 303083532 07 0082 + 029035 9999 99 99 0 9999 99 9999 + 029036 9999 99 99 0 9999 99 9999 + 029037 9999 99 99 0 9999 99 9999 + 029038 9999 99 99 0 9999 99 9999 + 029039 9999 99 99 0 9999 99 9999 + 029040 9999 99 99 0 9999 99 9999 + 029041 1275 31 01 1 303083532 00 0082 + 029042 1275 31 02 1 303083532 01 0082 + 029043 9999 99 99 0 9999 99 9999 + 029044 9999 99 99 0 9999 99 9999 + 029045 9999 99 99 0 9999 99 9999 + 029046 9999 99 99 0 9999 99 9999 + 029047 9999 99 99 0 9999 99 9999 + 029048 9999 99 99 0 9999 99 9999 + 029049 1275 32 01 1 303083532 02 0082 + 029050 1275 32 02 1 303083532 03 0082 + 029051 9999 99 99 0 9999 99 9999 + 029052 9999 99 99 0 9999 99 9999 + 029053 9999 99 99 0 9999 99 9999 + 029054 9999 99 99 0 9999 99 9999 + 029055 9999 99 99 0 9999 99 9999 + 029056 9999 99 99 0 9999 99 9999 + 029057 1275 33 01 1 306409480 00 1105 + 029058 1275 33 02 1 306409480 01 1105 + 029059 1275 33 03 1 306409480 02 1105 + 029060 1275 33 04 1 306409480 03 1105 + 029061 1275 33 05 1 306409480 04 1105 + 029062 1275 33 06 1 306409480 05 1105 + 029063 1275 33 07 1 306409480 06 1105 + 029064 1275 33 08 1 306409480 07 1105 + 029065 1275 34 01 1 306409480 08 1105 + 029066 1275 34 02 1 306409480 09 1105 + 029067 1275 34 03 1 306409480 10 1105 + 029068 1275 34 04 1 306409480 11 1105 + 029069 1275 34 05 1 306409480 12 1105 + 029070 1275 34 06 1 306409480 13 1105 + 029071 1275 34 07 1 306409480 14 1105 + 029072 1275 34 08 1 306409480 15 1105 + 029073 1275 35 01 1 306409476 00 1104 + 029074 1275 35 02 1 306409476 01 1104 + 029075 1275 35 03 1 306409476 02 1104 + 029076 1275 35 04 1 306409476 03 1104 + 029077 1275 35 05 1 306409476 04 1104 + 029078 1275 35 06 1 306409476 05 1104 + 029079 1275 35 07 1 306409476 06 1104 + 029080 1275 35 08 1 306409476 07 1104 + 029081 1275 36 01 1 306409476 08 1104 + 029082 1275 36 02 1 306409476 09 1104 + 029083 1275 36 03 1 306409476 10 1104 + 029084 1275 36 04 1 306409476 11 1104 + 029085 1275 36 05 1 306409476 12 1104 + 029086 1275 36 06 1 306409476 13 1104 + 029087 1275 36 07 1 306409476 14 1104 + 029088 1275 36 08 1 306409476 15 1104 + 029089 1275 37 01 1 306409488 00 1107 + 029090 1275 37 02 1 306409488 01 1107 + 029091 1275 37 03 1 306409488 02 1107 + 029092 1275 37 04 1 306409488 03 1107 + 029093 1275 37 05 1 306409488 04 1107 + 029094 1275 37 06 1 306409488 05 1107 + 029095 1275 37 07 1 306409488 06 1107 + 029096 1275 37 08 1 306409488 07 1107 + 029097 1275 38 01 1 306409488 08 1107 + 029098 1275 38 02 1 306409488 09 1107 + 029099 1275 38 03 1 306409488 10 1107 + 029100 1275 38 04 1 306409488 11 1107 + 029101 1275 38 05 1 306409488 12 1107 + 029102 1275 38 06 1 306409488 13 1107 + 029103 1275 38 07 1 306409488 14 1107 + 029104 1275 38 08 1 306409488 15 1107 + 029105 1275 39 01 1 306409484 00 1106 + 029106 1275 39 02 1 306409484 01 1106 + 029107 1275 39 03 1 306409484 02 1106 + 029108 1275 39 04 1 306409484 03 1106 + 029109 1275 39 05 1 306409484 04 1106 + 029110 1275 39 06 1 306409484 05 1106 + 029111 1275 39 07 1 306409484 06 1106 + 029112 1275 39 08 1 306409484 07 1106 + 029113 1275 40 01 1 306409484 08 1106 + 029114 1275 40 02 1 306409484 09 1106 + 029115 1275 40 03 1 306409484 10 1106 + 029116 1275 40 04 1 306409484 11 1106 + 029117 1275 40 05 1 306409484 12 1106 + 029118 1275 40 06 1 306409484 13 1106 + 029119 1275 40 07 1 306409484 14 1106 + 029120 1275 40 08 1 306409484 15 1106 + 029121 1275 41 01 1 304189448 00 0289 + 029122 1275 41 02 1 304189448 01 0289 + 029123 1275 41 03 1 304189448 02 0289 + 029124 1275 41 04 1 304189448 03 0289 + 029125 9999 99 99 0 9999 99 9999 + 029126 9999 99 99 0 9999 99 9999 + 029127 9999 99 99 0 9999 99 9999 + 029128 9999 99 99 0 9999 99 9999 + 029129 1275 42 01 1 304189448 04 0289 + 029130 1275 42 02 1 304189448 05 0289 + 029131 1275 42 03 1 304189448 06 0289 + 029132 1275 42 04 1 304189448 07 0289 + 029133 9999 99 99 0 9999 99 9999 + 029134 9999 99 99 0 9999 99 9999 + 029135 9999 99 99 0 9999 99 9999 + 029136 9999 99 99 0 9999 99 9999 + 029137 1275 43 01 1 304189448 08 0289 + 029138 1275 43 02 1 304189448 09 0289 + 029139 1275 43 03 1 304189448 10 0289 + 029140 1275 43 04 1 304189448 11 0289 + 029141 9999 99 99 0 9999 99 9999 + 029142 9999 99 99 0 9999 99 9999 + 029143 9999 99 99 0 9999 99 9999 + 029144 9999 99 99 0 9999 99 9999 + 029145 1275 44 01 1 304189448 12 0289 + 029146 1275 44 02 1 304189448 13 0289 + 029147 1275 44 03 1 304189448 14 0289 + 029148 1275 44 04 1 304189448 15 0289 + 029149 9999 99 99 0 9999 99 9999 + 029150 9999 99 99 0 9999 99 9999 + 029151 9999 99 99 0 9999 99 9999 + 029152 9999 99 99 0 9999 99 9999 + 029153 1275 45 01 1 304189444 00 0288 + 029154 1275 45 02 1 304189444 01 0288 + 029155 1275 45 03 1 304189444 02 0288 + 029156 1275 45 04 1 304189444 03 0288 + 029157 9999 99 99 0 9999 99 9999 + 029158 9999 99 99 0 9999 99 9999 + 029159 9999 99 99 0 9999 99 9999 + 029160 9999 99 99 0 9999 99 9999 + 029161 1275 46 01 1 304189444 04 0288 + 029162 1275 46 02 1 304189444 05 0288 + 029163 1275 46 03 1 304189444 06 0288 + 029164 1275 46 04 1 304189444 07 0288 + 029165 9999 99 99 0 9999 99 9999 + 029166 9999 99 99 0 9999 99 9999 + 029167 9999 99 99 0 9999 99 9999 + 029168 9999 99 99 0 9999 99 9999 + 029169 1275 47 01 1 304189444 08 0288 + 029170 1275 47 02 1 304189444 09 0288 + 029171 1275 47 03 1 304189444 10 0288 + 029172 1275 47 04 1 304189444 11 0288 + 029173 9999 99 99 0 9999 99 9999 + 029174 9999 99 99 0 9999 99 9999 + 029175 9999 99 99 0 9999 99 9999 + 029176 9999 99 99 0 9999 99 9999 + 029177 1275 48 01 1 304189444 12 0288 + 029178 1275 48 02 1 304189444 13 0288 + 029179 1275 48 03 1 304189444 14 0288 + 029180 1275 48 04 1 304189444 15 0288 + 029181 9999 99 99 0 9999 99 9999 + 029182 9999 99 99 0 9999 99 9999 + 029183 9999 99 99 0 9999 99 9999 + 029184 9999 99 99 0 9999 99 9999 + 029185 1276 01 01 1 304185356 08 0282 + 029186 1276 01 02 1 304185356 09 0282 + 029187 1276 01 03 1 304185356 10 0282 + 029188 1276 01 04 1 304185356 11 0282 + 029189 9999 99 99 0 9999 99 9999 + 029190 9999 99 99 0 9999 99 9999 + 029191 9999 99 99 0 9999 99 9999 + 029192 9999 99 99 0 9999 99 9999 + 029193 1276 02 01 1 304185356 12 0282 + 029194 1276 02 02 1 304185356 13 0282 + 029195 1276 02 03 1 304185356 14 0282 + 029196 1276 02 04 1 304185356 15 0282 + 029197 9999 99 99 0 9999 99 9999 + 029198 9999 99 99 0 9999 99 9999 + 029199 9999 99 99 0 9999 99 9999 + 029200 9999 99 99 0 9999 99 9999 + 029201 1276 03 01 1 304185356 00 0282 + 029202 1276 03 02 1 304185356 01 0282 + 029203 1276 03 03 1 304185356 02 0282 + 029204 1276 03 04 1 304185356 03 0282 + 029205 9999 99 99 0 9999 99 9999 + 029206 9999 99 99 0 9999 99 9999 + 029207 9999 99 99 0 9999 99 9999 + 029208 9999 99 99 0 9999 99 9999 + 029209 1276 04 01 1 304185356 04 0282 + 029210 1276 04 02 1 304185356 05 0282 + 029211 1276 04 03 1 304185356 06 0282 + 029212 1276 04 04 1 304185356 07 0282 + 029213 9999 99 99 0 9999 99 9999 + 029214 9999 99 99 0 9999 99 9999 + 029215 9999 99 99 0 9999 99 9999 + 029216 9999 99 99 0 9999 99 9999 + 029217 1276 05 01 1 304185360 08 0283 + 029218 1276 05 02 1 304185360 09 0283 + 029219 1276 05 03 1 304185360 10 0283 + 029220 1276 05 04 1 304185360 11 0283 + 029221 9999 99 99 0 9999 99 9999 + 029222 9999 99 99 0 9999 99 9999 + 029223 9999 99 99 0 9999 99 9999 + 029224 9999 99 99 0 9999 99 9999 + 029225 1276 06 01 1 304185360 12 0283 + 029226 1276 06 02 1 304185360 13 0283 + 029227 1276 06 03 1 304185360 14 0283 + 029228 1276 06 04 1 304185360 15 0283 + 029229 9999 99 99 0 9999 99 9999 + 029230 9999 99 99 0 9999 99 9999 + 029231 9999 99 99 0 9999 99 9999 + 029232 9999 99 99 0 9999 99 9999 + 029233 1276 07 01 1 304185360 00 0283 + 029234 1276 07 02 1 304185360 01 0283 + 029235 1276 07 03 1 304185360 02 0283 + 029236 1276 07 04 1 304185360 03 0283 + 029237 9999 99 99 0 9999 99 9999 + 029238 9999 99 99 0 9999 99 9999 + 029239 9999 99 99 0 9999 99 9999 + 029240 9999 99 99 0 9999 99 9999 + 029241 1276 08 01 1 304185360 04 0283 + 029242 1276 08 02 1 304185360 05 0283 + 029243 1276 08 03 1 304185360 06 0283 + 029244 1276 08 04 1 304185360 07 0283 + 029245 9999 99 99 0 9999 99 9999 + 029246 9999 99 99 0 9999 99 9999 + 029247 9999 99 99 0 9999 99 9999 + 029248 9999 99 99 0 9999 99 9999 + 029249 1276 09 01 1 306405388 00 1098 + 029250 1276 09 02 1 306405388 01 1098 + 029251 1276 09 03 1 306405388 02 1098 + 029252 1276 09 04 1 306405388 03 1098 + 029253 1276 09 05 1 306405388 04 1098 + 029254 1276 09 06 1 306405388 05 1098 + 029255 1276 09 07 1 306405388 06 1098 + 029256 1276 09 08 1 306405388 07 1098 + 029257 1276 10 01 1 306405388 08 1098 + 029258 1276 10 02 1 306405388 09 1098 + 029259 1276 10 03 1 306405388 10 1098 + 029260 1276 10 04 1 306405388 11 1098 + 029261 1276 10 05 1 306405388 12 1098 + 029262 1276 10 06 1 306405388 13 1098 + 029263 1276 10 07 1 306405388 14 1098 + 029264 1276 10 08 1 306405388 15 1098 + 029265 1276 11 01 1 306405392 00 1099 + 029266 1276 11 02 1 306405392 01 1099 + 029267 1276 11 03 1 306405392 02 1099 + 029268 1276 11 04 1 306405392 03 1099 + 029269 1276 11 05 1 306405392 04 1099 + 029270 1276 11 06 1 306405392 05 1099 + 029271 1276 11 07 1 306405392 06 1099 + 029272 1276 11 08 1 306405392 07 1099 + 029273 1276 12 01 1 306405392 08 1099 + 029274 1276 12 02 1 306405392 09 1099 + 029275 1276 12 03 1 306405392 10 1099 + 029276 1276 12 04 1 306405392 11 1099 + 029277 1276 12 05 1 306405392 12 1099 + 029278 1276 12 06 1 306405392 13 1099 + 029279 1276 12 07 1 306405392 14 1099 + 029280 1276 12 08 1 306405392 15 1099 + 029281 1276 13 01 1 306405380 00 1096 + 029282 1276 13 02 1 306405380 01 1096 + 029283 1276 13 03 1 306405380 02 1096 + 029284 1276 13 04 1 306405380 03 1096 + 029285 1276 13 05 1 306405380 04 1096 + 029286 1276 13 06 1 306405380 05 1096 + 029287 1276 13 07 1 306405380 06 1096 + 029288 1276 13 08 1 306405380 07 1096 + 029289 1276 14 01 1 306405380 08 1096 + 029290 1276 14 02 1 306405380 09 1096 + 029291 1276 14 03 1 306405380 10 1096 + 029292 1276 14 04 1 306405380 11 1096 + 029293 1276 14 05 1 306405380 12 1096 + 029294 1276 14 06 1 306405380 13 1096 + 029295 1276 14 07 1 306405380 14 1096 + 029296 1276 14 08 1 306405380 15 1096 + 029297 1276 15 01 1 306405384 00 1097 + 029298 1276 15 02 1 306405384 01 1097 + 029299 1276 15 03 1 306405384 02 1097 + 029300 1276 15 04 1 306405384 03 1097 + 029301 1276 15 05 1 306405384 04 1097 + 029302 1276 15 06 1 306405384 05 1097 + 029303 1276 15 07 1 306405384 06 1097 + 029304 1276 15 08 1 306405384 07 1097 + 029305 1276 16 01 1 306405384 08 1097 + 029306 1276 16 02 1 306405384 09 1097 + 029307 1276 16 03 1 306405384 10 1097 + 029308 1276 16 04 1 306405384 11 1097 + 029309 1276 16 05 1 306405384 12 1097 + 029310 1276 16 06 1 306405384 13 1097 + 029311 1276 16 07 1 306405384 14 1097 + 029312 1276 16 08 1 306405384 15 1097 + 029313 1276 17 01 1 303079428 12 0072 + 029314 1276 17 02 1 303079428 13 0072 + 029315 9999 99 99 0 9999 99 9999 + 029316 9999 99 99 0 9999 99 9999 + 029317 9999 99 99 0 9999 99 9999 + 029318 9999 99 99 0 9999 99 9999 + 029319 9999 99 99 0 9999 99 9999 + 029320 9999 99 99 0 9999 99 9999 + 029321 1276 18 01 1 303079428 14 0072 + 029322 1276 18 02 1 303079428 15 0072 + 029323 9999 99 99 0 9999 99 9999 + 029324 9999 99 99 0 9999 99 9999 + 029325 9999 99 99 0 9999 99 9999 + 029326 9999 99 99 0 9999 99 9999 + 029327 9999 99 99 0 9999 99 9999 + 029328 9999 99 99 0 9999 99 9999 + 029329 1276 19 01 1 303079428 08 0072 + 029330 1276 19 02 1 303079428 09 0072 + 029331 9999 99 99 0 9999 99 9999 + 029332 9999 99 99 0 9999 99 9999 + 029333 9999 99 99 0 9999 99 9999 + 029334 9999 99 99 0 9999 99 9999 + 029335 9999 99 99 0 9999 99 9999 + 029336 9999 99 99 0 9999 99 9999 + 029337 1276 20 01 1 303079428 10 0072 + 029338 1276 20 02 1 303079428 11 0072 + 029339 9999 99 99 0 9999 99 9999 + 029340 9999 99 99 0 9999 99 9999 + 029341 9999 99 99 0 9999 99 9999 + 029342 9999 99 99 0 9999 99 9999 + 029343 9999 99 99 0 9999 99 9999 + 029344 9999 99 99 0 9999 99 9999 + 029345 1276 21 01 1 303079428 00 0072 + 029346 1276 21 02 1 303079428 01 0072 + 029347 9999 99 99 0 9999 99 9999 + 029348 9999 99 99 0 9999 99 9999 + 029349 9999 99 99 0 9999 99 9999 + 029350 9999 99 99 0 9999 99 9999 + 029351 9999 99 99 0 9999 99 9999 + 029352 9999 99 99 0 9999 99 9999 + 029353 1276 22 01 1 303079428 02 0072 + 029354 1276 22 02 1 303079428 03 0072 + 029355 9999 99 99 0 9999 99 9999 + 029356 9999 99 99 0 9999 99 9999 + 029357 9999 99 99 0 9999 99 9999 + 029358 9999 99 99 0 9999 99 9999 + 029359 9999 99 99 0 9999 99 9999 + 029360 9999 99 99 0 9999 99 9999 + 029361 1276 23 01 1 303079428 04 0072 + 029362 1276 23 02 1 303079428 05 0072 + 029363 9999 99 99 0 9999 99 9999 + 029364 9999 99 99 0 9999 99 9999 + 029365 9999 99 99 0 9999 99 9999 + 029366 9999 99 99 0 9999 99 9999 + 029367 9999 99 99 0 9999 99 9999 + 029368 9999 99 99 0 9999 99 9999 + 029369 1276 24 01 1 303079428 06 0072 + 029370 1276 24 02 1 303079428 07 0072 + 029371 9999 99 99 0 9999 99 9999 + 029372 9999 99 99 0 9999 99 9999 + 029373 9999 99 99 0 9999 99 9999 + 029374 9999 99 99 0 9999 99 9999 + 029375 9999 99 99 0 9999 99 9999 + 029376 9999 99 99 0 9999 99 9999 + 029377 1276 25 01 1 305291272 00 0617 + 029378 1276 25 02 1 305291272 01 0617 + 029379 1276 25 03 1 305291272 02 0617 + 029380 1276 25 04 1 305291272 03 0617 + 029381 1276 25 05 1 305291272 04 0617 + 029382 1276 25 06 1 305291272 05 0617 + 029383 1276 25 07 1 305291272 06 0617 + 029384 1276 25 08 1 305291272 07 0617 + 029385 1276 26 01 1 305291272 08 0617 + 029386 1276 26 02 1 305291272 09 0617 + 029387 1276 26 03 1 305291272 10 0617 + 029388 1276 26 04 1 305291272 11 0617 + 029389 1276 26 05 1 305291272 12 0617 + 029390 1276 26 06 1 305291272 13 0617 + 029391 1276 26 07 1 305291272 14 0617 + 029392 1276 26 08 1 305291272 15 0617 + 029393 1276 27 01 1 305291268 00 0616 + 029394 1276 27 02 1 305291268 01 0616 + 029395 1276 27 03 1 305291268 02 0616 + 029396 1276 27 04 1 305291268 03 0616 + 029397 1276 27 05 1 305291268 04 0616 + 029398 1276 27 06 1 305291268 05 0616 + 029399 1276 27 07 1 305291268 06 0616 + 029400 1276 27 08 1 305291268 07 0616 + 029401 1276 28 01 1 305291268 08 0616 + 029402 1276 28 02 1 305291268 09 0616 + 029403 1276 28 03 1 305291268 10 0616 + 029404 1276 28 04 1 305291268 11 0616 + 029405 1276 28 05 1 305291268 12 0616 + 029406 1276 28 06 1 305291268 13 0616 + 029407 1276 28 07 1 305291268 14 0616 + 029408 1276 28 08 1 305291268 15 0616 + 029409 1276 29 01 1 305291280 00 0619 + 029410 1276 29 02 1 305291280 01 0619 + 029411 1276 29 03 1 305291280 02 0619 + 029412 1276 29 04 1 305291280 03 0619 + 029413 1276 29 05 1 305291280 04 0619 + 029414 1276 29 06 1 305291280 05 0619 + 029415 1276 29 07 1 305291280 06 0619 + 029416 1276 29 08 1 305291280 07 0619 + 029417 1276 30 01 1 305291280 08 0619 + 029418 1276 30 02 1 305291280 09 0619 + 029419 1276 30 03 1 305291280 10 0619 + 029420 1276 30 04 1 305291280 11 0619 + 029421 1276 30 05 1 305291280 12 0619 + 029422 1276 30 06 1 305291280 13 0619 + 029423 1276 30 07 1 305291280 14 0619 + 029424 1276 30 08 1 305291280 15 0619 + 029425 1276 31 01 1 305291276 00 0618 + 029426 1276 31 02 1 305291276 01 0618 + 029427 1276 31 03 1 305291276 02 0618 + 029428 1276 31 04 1 305291276 03 0618 + 029429 1276 31 05 1 305291276 04 0618 + 029430 1276 31 06 1 305291276 05 0618 + 029431 1276 31 07 1 305291276 06 0618 + 029432 1276 31 08 1 305291276 07 0618 + 029433 1276 32 01 1 305291276 08 0618 + 029434 1276 32 02 1 305291276 09 0618 + 029435 1276 32 03 1 305291276 10 0618 + 029436 1276 32 04 1 305291276 11 0618 + 029437 1276 32 05 1 305291276 12 0618 + 029438 1276 32 06 1 305291276 13 0618 + 029439 1276 32 07 1 305291276 14 0618 + 029440 1276 32 08 1 305291276 15 0618 + 029441 1276 33 01 1 306401292 00 1090 + 029442 1276 33 02 1 306401292 01 1090 + 029443 1276 33 03 1 306401292 02 1090 + 029444 1276 33 04 1 306401292 03 1090 + 029445 1276 33 05 1 306401292 04 1090 + 029446 1276 33 06 1 306401292 05 1090 + 029447 1276 33 07 1 306401292 06 1090 + 029448 1276 33 08 1 306401292 07 1090 + 029449 1276 34 01 1 306401292 08 1090 + 029450 1276 34 02 1 306401292 09 1090 + 029451 1276 34 03 1 306401292 10 1090 + 029452 1276 34 04 1 306401292 11 1090 + 029453 1276 34 05 1 306401292 12 1090 + 029454 1276 34 06 1 306401292 13 1090 + 029455 1276 34 07 1 306401292 14 1090 + 029456 1276 34 08 1 306401292 15 1090 + 029457 1276 35 01 1 306401296 00 1091 + 029458 1276 35 02 1 306401296 01 1091 + 029459 1276 35 03 1 306401296 02 1091 + 029460 1276 35 04 1 306401296 03 1091 + 029461 1276 35 05 1 306401296 04 1091 + 029462 1276 35 06 1 306401296 05 1091 + 029463 1276 35 07 1 306401296 06 1091 + 029464 1276 35 08 1 306401296 07 1091 + 029465 1276 36 01 1 306401296 08 1091 + 029466 1276 36 02 1 306401296 09 1091 + 029467 1276 36 03 1 306401296 10 1091 + 029468 1276 36 04 1 306401296 11 1091 + 029469 1276 36 05 1 306401296 12 1091 + 029470 1276 36 06 1 306401296 13 1091 + 029471 1276 36 07 1 306401296 14 1091 + 029472 1276 36 08 1 306401296 15 1091 + 029473 1276 37 01 1 306401284 00 1088 + 029474 1276 37 02 1 306401284 01 1088 + 029475 1276 37 03 1 306401284 02 1088 + 029476 1276 37 04 1 306401284 03 1088 + 029477 1276 37 05 1 306401284 04 1088 + 029478 1276 37 06 1 306401284 05 1088 + 029479 1276 37 07 1 306401284 06 1088 + 029480 1276 37 08 1 306401284 07 1088 + 029481 1276 38 01 1 306401284 08 1088 + 029482 1276 38 02 1 306401284 09 1088 + 029483 1276 38 03 1 306401284 10 1088 + 029484 1276 38 04 1 306401284 11 1088 + 029485 1276 38 05 1 306401284 12 1088 + 029486 1276 38 06 1 306401284 13 1088 + 029487 1276 38 07 1 306401284 14 1088 + 029488 1276 38 08 1 306401284 15 1088 + 029489 1276 39 01 1 306401288 00 1089 + 029490 1276 39 02 1 306401288 01 1089 + 029491 1276 39 03 1 306401288 02 1089 + 029492 1276 39 04 1 306401288 03 1089 + 029493 1276 39 05 1 306401288 04 1089 + 029494 1276 39 06 1 306401288 05 1089 + 029495 1276 39 07 1 306401288 06 1089 + 029496 1276 39 08 1 306401288 07 1089 + 029497 1276 40 01 1 306401288 08 1089 + 029498 1276 40 02 1 306401288 09 1089 + 029499 1276 40 03 1 306401288 10 1089 + 029500 1276 40 04 1 306401288 11 1089 + 029501 1276 40 05 1 306401288 12 1089 + 029502 1276 40 06 1 306401288 13 1089 + 029503 1276 40 07 1 306401288 14 1089 + 029504 1276 40 08 1 306401288 15 1089 + 029505 1276 41 01 1 304185348 08 0280 + 029506 1276 41 02 1 304185348 09 0280 + 029507 1276 41 03 1 304185348 10 0280 + 029508 1276 41 04 1 304185348 11 0280 + 029509 9999 99 99 0 9999 99 9999 + 029510 9999 99 99 0 9999 99 9999 + 029511 9999 99 99 0 9999 99 9999 + 029512 9999 99 99 0 9999 99 9999 + 029513 1276 42 01 1 304185348 12 0280 + 029514 1276 42 02 1 304185348 13 0280 + 029515 1276 42 03 1 304185348 14 0280 + 029516 1276 42 04 1 304185348 15 0280 + 029517 9999 99 99 0 9999 99 9999 + 029518 9999 99 99 0 9999 99 9999 + 029519 9999 99 99 0 9999 99 9999 + 029520 9999 99 99 0 9999 99 9999 + 029521 1276 43 01 1 304185348 00 0280 + 029522 1276 43 02 1 304185348 01 0280 + 029523 1276 43 03 1 304185348 02 0280 + 029524 1276 43 04 1 304185348 03 0280 + 029525 9999 99 99 0 9999 99 9999 + 029526 9999 99 99 0 9999 99 9999 + 029527 9999 99 99 0 9999 99 9999 + 029528 9999 99 99 0 9999 99 9999 + 029529 1276 44 01 1 304185348 04 0280 + 029530 1276 44 02 1 304185348 05 0280 + 029531 1276 44 03 1 304185348 06 0280 + 029532 1276 44 04 1 304185348 07 0280 + 029533 9999 99 99 0 9999 99 9999 + 029534 9999 99 99 0 9999 99 9999 + 029535 9999 99 99 0 9999 99 9999 + 029536 9999 99 99 0 9999 99 9999 + 029537 1276 45 01 1 304185352 08 0281 + 029538 1276 45 02 1 304185352 09 0281 + 029539 1276 45 03 1 304185352 10 0281 + 029540 1276 45 04 1 304185352 11 0281 + 029541 9999 99 99 0 9999 99 9999 + 029542 9999 99 99 0 9999 99 9999 + 029543 9999 99 99 0 9999 99 9999 + 029544 9999 99 99 0 9999 99 9999 + 029545 1276 46 01 1 304185352 12 0281 + 029546 1276 46 02 1 304185352 13 0281 + 029547 1276 46 03 1 304185352 14 0281 + 029548 1276 46 04 1 304185352 15 0281 + 029549 9999 99 99 0 9999 99 9999 + 029550 9999 99 99 0 9999 99 9999 + 029551 9999 99 99 0 9999 99 9999 + 029552 9999 99 99 0 9999 99 9999 + 029553 1276 47 01 1 304185352 00 0281 + 029554 1276 47 02 1 304185352 01 0281 + 029555 1276 47 03 1 304185352 02 0281 + 029556 1276 47 04 1 304185352 03 0281 + 029557 9999 99 99 0 9999 99 9999 + 029558 9999 99 99 0 9999 99 9999 + 029559 9999 99 99 0 9999 99 9999 + 029560 9999 99 99 0 9999 99 9999 + 029561 1276 48 01 1 304185352 04 0281 + 029562 1276 48 02 1 304185352 05 0281 + 029563 1276 48 03 1 304185352 06 0281 + 029564 1276 48 04 1 304185352 07 0281 + 029565 9999 99 99 0 9999 99 9999 + 029566 9999 99 99 0 9999 99 9999 + 029567 9999 99 99 0 9999 99 9999 + 029568 9999 99 99 0 9999 99 9999 + 029569 1277 01 01 1 303087632 08 0091 + 029570 1277 01 02 1 303087632 09 0091 + 029571 9999 99 99 0 9999 99 9999 + 029572 9999 99 99 0 9999 99 9999 + 029573 9999 99 99 0 9999 99 9999 + 029574 9999 99 99 0 9999 99 9999 + 029575 9999 99 99 0 9999 99 9999 + 029576 9999 99 99 0 9999 99 9999 + 029577 1277 02 01 1 303087632 10 0091 + 029578 1277 02 02 1 303087632 11 0091 + 029579 9999 99 99 0 9999 99 9999 + 029580 9999 99 99 0 9999 99 9999 + 029581 9999 99 99 0 9999 99 9999 + 029582 9999 99 99 0 9999 99 9999 + 029583 9999 99 99 0 9999 99 9999 + 029584 9999 99 99 0 9999 99 9999 + 029585 1277 03 01 1 303087632 12 0091 + 029586 1277 03 02 1 303087632 13 0091 + 029587 9999 99 99 0 9999 99 9999 + 029588 9999 99 99 0 9999 99 9999 + 029589 9999 99 99 0 9999 99 9999 + 029590 9999 99 99 0 9999 99 9999 + 029591 9999 99 99 0 9999 99 9999 + 029592 9999 99 99 0 9999 99 9999 + 029593 1277 04 01 1 303087632 14 0091 + 029594 1277 04 02 1 303087632 15 0091 + 029595 9999 99 99 0 9999 99 9999 + 029596 9999 99 99 0 9999 99 9999 + 029597 9999 99 99 0 9999 99 9999 + 029598 9999 99 99 0 9999 99 9999 + 029599 9999 99 99 0 9999 99 9999 + 029600 9999 99 99 0 9999 99 9999 + 029601 1277 05 01 1 303087632 00 0091 + 029602 1277 05 02 1 303087632 01 0091 + 029603 9999 99 99 0 9999 99 9999 + 029604 9999 99 99 0 9999 99 9999 + 029605 9999 99 99 0 9999 99 9999 + 029606 9999 99 99 0 9999 99 9999 + 029607 9999 99 99 0 9999 99 9999 + 029608 9999 99 99 0 9999 99 9999 + 029609 1277 06 01 1 303087632 02 0091 + 029610 1277 06 02 1 303087632 03 0091 + 029611 9999 99 99 0 9999 99 9999 + 029612 9999 99 99 0 9999 99 9999 + 029613 9999 99 99 0 9999 99 9999 + 029614 9999 99 99 0 9999 99 9999 + 029615 9999 99 99 0 9999 99 9999 + 029616 9999 99 99 0 9999 99 9999 + 029617 1277 07 01 1 303087632 04 0091 + 029618 1277 07 02 1 303087632 05 0091 + 029619 9999 99 99 0 9999 99 9999 + 029620 9999 99 99 0 9999 99 9999 + 029621 9999 99 99 0 9999 99 9999 + 029622 9999 99 99 0 9999 99 9999 + 029623 9999 99 99 0 9999 99 9999 + 029624 9999 99 99 0 9999 99 9999 + 029625 1277 08 01 1 303087632 06 0091 + 029626 1277 08 02 1 303087632 07 0091 + 029627 9999 99 99 0 9999 99 9999 + 029628 9999 99 99 0 9999 99 9999 + 029629 9999 99 99 0 9999 99 9999 + 029630 9999 99 99 0 9999 99 9999 + 029631 9999 99 99 0 9999 99 9999 + 029632 9999 99 99 0 9999 99 9999 + 029633 1277 09 01 1 304193548 00 0298 + 029634 1277 09 02 1 304193548 01 0298 + 029635 1277 09 03 1 304193548 02 0298 + 029636 1277 09 04 1 304193548 03 0298 + 029637 9999 99 99 0 9999 99 9999 + 029638 9999 99 99 0 9999 99 9999 + 029639 9999 99 99 0 9999 99 9999 + 029640 9999 99 99 0 9999 99 9999 + 029641 1277 10 01 1 304193548 04 0298 + 029642 1277 10 02 1 304193548 05 0298 + 029643 1277 10 03 1 304193548 06 0298 + 029644 1277 10 04 1 304193548 07 0298 + 029645 9999 99 99 0 9999 99 9999 + 029646 9999 99 99 0 9999 99 9999 + 029647 9999 99 99 0 9999 99 9999 + 029648 9999 99 99 0 9999 99 9999 + 029649 1277 11 01 1 304193548 08 0298 + 029650 1277 11 02 1 304193548 09 0298 + 029651 1277 11 03 1 304193548 10 0298 + 029652 1277 11 04 1 304193548 11 0298 + 029653 9999 99 99 0 9999 99 9999 + 029654 9999 99 99 0 9999 99 9999 + 029655 9999 99 99 0 9999 99 9999 + 029656 9999 99 99 0 9999 99 9999 + 029657 1277 12 01 1 304193548 12 0298 + 029658 1277 12 02 1 304193548 13 0298 + 029659 1277 12 03 1 304193548 14 0298 + 029660 1277 12 04 1 304193548 15 0298 + 029661 9999 99 99 0 9999 99 9999 + 029662 9999 99 99 0 9999 99 9999 + 029663 9999 99 99 0 9999 99 9999 + 029664 9999 99 99 0 9999 99 9999 + 029665 1277 13 01 1 304193552 08 0299 + 029666 1277 13 02 1 304193552 09 0299 + 029667 1277 13 03 1 304193552 10 0299 + 029668 1277 13 04 1 304193552 11 0299 + 029669 9999 99 99 0 9999 99 9999 + 029670 9999 99 99 0 9999 99 9999 + 029671 9999 99 99 0 9999 99 9999 + 029672 9999 99 99 0 9999 99 9999 + 029673 1277 14 01 1 304193552 12 0299 + 029674 1277 14 02 1 304193552 13 0299 + 029675 1277 14 03 1 304193552 14 0299 + 029676 1277 14 04 1 304193552 15 0299 + 029677 9999 99 99 0 9999 99 9999 + 029678 9999 99 99 0 9999 99 9999 + 029679 9999 99 99 0 9999 99 9999 + 029680 9999 99 99 0 9999 99 9999 + 029681 1277 15 01 1 304193552 00 0299 + 029682 1277 15 02 1 304193552 01 0299 + 029683 1277 15 03 1 304193552 02 0299 + 029684 1277 15 04 1 304193552 03 0299 + 029685 9999 99 99 0 9999 99 9999 + 029686 9999 99 99 0 9999 99 9999 + 029687 9999 99 99 0 9999 99 9999 + 029688 9999 99 99 0 9999 99 9999 + 029689 1277 16 01 1 304193552 04 0299 + 029690 1277 16 02 1 304193552 05 0299 + 029691 1277 16 03 1 304193552 06 0299 + 029692 1277 16 04 1 304193552 07 0299 + 029693 9999 99 99 0 9999 99 9999 + 029694 9999 99 99 0 9999 99 9999 + 029695 9999 99 99 0 9999 99 9999 + 029696 9999 99 99 0 9999 99 9999 + 029697 1277 17 01 1 306429960 00 1145 + 029698 1277 17 02 1 306429960 01 1145 + 029699 1277 17 03 1 306429960 02 1145 + 029700 1277 17 04 1 306429960 03 1145 + 029701 1277 17 05 1 306429960 04 1145 + 029702 1277 17 06 1 306429960 05 1145 + 029703 1277 17 07 1 306429960 06 1145 + 029704 1277 17 08 1 306429960 07 1145 + 029705 1277 18 01 1 306429960 08 1145 + 029706 1277 18 02 1 306429960 09 1145 + 029707 1277 18 03 1 306429960 10 1145 + 029708 1277 18 04 1 306429960 11 1145 + 029709 1277 18 05 1 306429960 12 1145 + 029710 1277 18 06 1 306429960 13 1145 + 029711 1277 18 07 1 306429960 14 1145 + 029712 1277 18 08 1 306429960 15 1145 + 029713 1277 19 01 1 306429956 00 1144 + 029714 1277 19 02 1 306429956 01 1144 + 029715 1277 19 03 1 306429956 02 1144 + 029716 1277 19 04 1 306429956 03 1144 + 029717 1277 19 05 1 306429956 04 1144 + 029718 1277 19 06 1 306429956 05 1144 + 029719 1277 19 07 1 306429956 06 1144 + 029720 1277 19 08 1 306429956 07 1144 + 029721 1277 20 01 1 306429956 08 1144 + 029722 1277 20 02 1 306429956 09 1144 + 029723 1277 20 03 1 306429956 10 1144 + 029724 1277 20 04 1 306429956 11 1144 + 029725 1277 20 05 1 306429956 12 1144 + 029726 1277 20 06 1 306429956 13 1144 + 029727 1277 20 07 1 306429956 14 1144 + 029728 1277 20 08 1 306429956 15 1144 + 029729 1277 21 01 1 306429968 00 1147 + 029730 1277 21 02 1 306429968 01 1147 + 029731 1277 21 03 1 306429968 02 1147 + 029732 1277 21 04 1 306429968 03 1147 + 029733 1277 21 05 1 306429968 04 1147 + 029734 1277 21 06 1 306429968 05 1147 + 029735 1277 21 07 1 306429968 06 1147 + 029736 1277 21 08 1 306429968 07 1147 + 029737 1277 22 01 1 306429968 08 1147 + 029738 1277 22 02 1 306429968 09 1147 + 029739 1277 22 03 1 306429968 10 1147 + 029740 1277 22 04 1 306429968 11 1147 + 029741 1277 22 05 1 306429968 12 1147 + 029742 1277 22 06 1 306429968 13 1147 + 029743 1277 22 07 1 306429968 14 1147 + 029744 1277 22 08 1 306429968 15 1147 + 029745 1277 23 01 1 306429964 00 1146 + 029746 1277 23 02 1 306429964 01 1146 + 029747 1277 23 03 1 306429964 02 1146 + 029748 1277 23 04 1 306429964 03 1146 + 029749 1277 23 05 1 306429964 04 1146 + 029750 1277 23 06 1 306429964 05 1146 + 029751 1277 23 07 1 306429964 06 1146 + 029752 1277 23 08 1 306429964 07 1146 + 029753 1277 24 01 1 306429964 08 1146 + 029754 1277 24 02 1 306429964 09 1146 + 029755 1277 24 03 1 306429964 10 1146 + 029756 1277 24 04 1 306429964 11 1146 + 029757 1277 24 05 1 306429964 12 1146 + 029758 1277 24 06 1 306429964 13 1146 + 029759 1277 24 07 1 306429964 14 1146 + 029760 1277 24 08 1 306429964 15 1146 + 029761 1277 25 01 1 303083528 08 0081 + 029762 1277 25 02 1 303083528 09 0081 + 029763 9999 99 99 0 9999 99 9999 + 029764 9999 99 99 0 9999 99 9999 + 029765 9999 99 99 0 9999 99 9999 + 029766 9999 99 99 0 9999 99 9999 + 029767 9999 99 99 0 9999 99 9999 + 029768 9999 99 99 0 9999 99 9999 + 029769 1277 26 01 1 303083528 10 0081 + 029770 1277 26 02 1 303083528 11 0081 + 029771 9999 99 99 0 9999 99 9999 + 029772 9999 99 99 0 9999 99 9999 + 029773 9999 99 99 0 9999 99 9999 + 029774 9999 99 99 0 9999 99 9999 + 029775 9999 99 99 0 9999 99 9999 + 029776 9999 99 99 0 9999 99 9999 + 029777 1277 27 01 1 303083528 12 0081 + 029778 1277 27 02 1 303083528 13 0081 + 029779 9999 99 99 0 9999 99 9999 + 029780 9999 99 99 0 9999 99 9999 + 029781 9999 99 99 0 9999 99 9999 + 029782 9999 99 99 0 9999 99 9999 + 029783 9999 99 99 0 9999 99 9999 + 029784 9999 99 99 0 9999 99 9999 + 029785 1277 28 01 1 303083528 14 0081 + 029786 1277 28 02 1 303083528 15 0081 + 029787 9999 99 99 0 9999 99 9999 + 029788 9999 99 99 0 9999 99 9999 + 029789 9999 99 99 0 9999 99 9999 + 029790 9999 99 99 0 9999 99 9999 + 029791 9999 99 99 0 9999 99 9999 + 029792 9999 99 99 0 9999 99 9999 + 029793 1277 29 01 1 303083528 04 0081 + 029794 1277 29 02 1 303083528 05 0081 + 029795 9999 99 99 0 9999 99 9999 + 029796 9999 99 99 0 9999 99 9999 + 029797 9999 99 99 0 9999 99 9999 + 029798 9999 99 99 0 9999 99 9999 + 029799 9999 99 99 0 9999 99 9999 + 029800 9999 99 99 0 9999 99 9999 + 029801 1277 30 01 1 303083528 06 0081 + 029802 1277 30 02 1 303083528 07 0081 + 029803 9999 99 99 0 9999 99 9999 + 029804 9999 99 99 0 9999 99 9999 + 029805 9999 99 99 0 9999 99 9999 + 029806 9999 99 99 0 9999 99 9999 + 029807 9999 99 99 0 9999 99 9999 + 029808 9999 99 99 0 9999 99 9999 + 029809 1277 31 01 1 303083528 00 0081 + 029810 1277 31 02 1 303083528 01 0081 + 029811 9999 99 99 0 9999 99 9999 + 029812 9999 99 99 0 9999 99 9999 + 029813 9999 99 99 0 9999 99 9999 + 029814 9999 99 99 0 9999 99 9999 + 029815 9999 99 99 0 9999 99 9999 + 029816 9999 99 99 0 9999 99 9999 + 029817 1277 32 01 1 303083528 02 0081 + 029818 1277 32 02 1 303083528 03 0081 + 029819 9999 99 99 0 9999 99 9999 + 029820 9999 99 99 0 9999 99 9999 + 029821 9999 99 99 0 9999 99 9999 + 029822 9999 99 99 0 9999 99 9999 + 029823 9999 99 99 0 9999 99 9999 + 029824 9999 99 99 0 9999 99 9999 + 029825 1277 33 01 1 306425864 00 1137 + 029826 1277 33 02 1 306425864 01 1137 + 029827 1277 33 03 1 306425864 02 1137 + 029828 1277 33 04 1 306425864 03 1137 + 029829 1277 33 05 1 306425864 04 1137 + 029830 1277 33 06 1 306425864 05 1137 + 029831 1277 33 07 1 306425864 06 1137 + 029832 1277 33 08 1 306425864 07 1137 + 029833 1277 34 01 1 306425864 08 1137 + 029834 1277 34 02 1 306425864 09 1137 + 029835 1277 34 03 1 306425864 10 1137 + 029836 1277 34 04 1 306425864 11 1137 + 029837 1277 34 05 1 306425864 12 1137 + 029838 1277 34 06 1 306425864 13 1137 + 029839 1277 34 07 1 306425864 14 1137 + 029840 1277 34 08 1 306425864 15 1137 + 029841 1277 35 01 1 306425860 00 1136 + 029842 1277 35 02 1 306425860 01 1136 + 029843 1277 35 03 1 306425860 02 1136 + 029844 1277 35 04 1 306425860 03 1136 + 029845 1277 35 05 1 306425860 04 1136 + 029846 1277 35 06 1 306425860 05 1136 + 029847 1277 35 07 1 306425860 06 1136 + 029848 1277 35 08 1 306425860 07 1136 + 029849 1277 36 01 1 306425860 08 1136 + 029850 1277 36 02 1 306425860 09 1136 + 029851 1277 36 03 1 306425860 10 1136 + 029852 1277 36 04 1 306425860 11 1136 + 029853 1277 36 05 1 306425860 12 1136 + 029854 1277 36 06 1 306425860 13 1136 + 029855 1277 36 07 1 306425860 14 1136 + 029856 1277 36 08 1 306425860 15 1136 + 029857 1277 37 01 1 306425872 00 1139 + 029858 1277 37 02 1 306425872 01 1139 + 029859 1277 37 03 1 306425872 02 1139 + 029860 1277 37 04 1 306425872 03 1139 + 029861 1277 37 05 1 306425872 04 1139 + 029862 1277 37 06 1 306425872 05 1139 + 029863 1277 37 07 1 306425872 06 1139 + 029864 1277 37 08 1 306425872 07 1139 + 029865 1277 38 01 1 306425872 08 1139 + 029866 1277 38 02 1 306425872 09 1139 + 029867 1277 38 03 1 306425872 10 1139 + 029868 1277 38 04 1 306425872 11 1139 + 029869 1277 38 05 1 306425872 12 1139 + 029870 1277 38 06 1 306425872 13 1139 + 029871 1277 38 07 1 306425872 14 1139 + 029872 1277 38 08 1 306425872 15 1139 + 029873 1277 39 01 1 306425868 00 1138 + 029874 1277 39 02 1 306425868 01 1138 + 029875 1277 39 03 1 306425868 02 1138 + 029876 1277 39 04 1 306425868 03 1138 + 029877 1277 39 05 1 306425868 04 1138 + 029878 1277 39 06 1 306425868 05 1138 + 029879 1277 39 07 1 306425868 06 1138 + 029880 1277 39 08 1 306425868 07 1138 + 029881 1277 40 01 1 306425868 08 1138 + 029882 1277 40 02 1 306425868 09 1138 + 029883 1277 40 03 1 306425868 10 1138 + 029884 1277 40 04 1 306425868 11 1138 + 029885 1277 40 05 1 306425868 12 1138 + 029886 1277 40 06 1 306425868 13 1138 + 029887 1277 40 07 1 306425868 14 1138 + 029888 1277 40 08 1 306425868 15 1138 + 029889 1277 41 01 1 304193544 00 0297 + 029890 1277 41 02 1 304193544 01 0297 + 029891 1277 41 03 1 304193544 02 0297 + 029892 1277 41 04 1 304193544 03 0297 + 029893 9999 99 99 0 9999 99 9999 + 029894 9999 99 99 0 9999 99 9999 + 029895 9999 99 99 0 9999 99 9999 + 029896 9999 99 99 0 9999 99 9999 + 029897 1277 42 01 1 304193544 04 0297 + 029898 1277 42 02 1 304193544 05 0297 + 029899 1277 42 03 1 304193544 06 0297 + 029900 1277 42 04 1 304193544 07 0297 + 029901 9999 99 99 0 9999 99 9999 + 029902 9999 99 99 0 9999 99 9999 + 029903 9999 99 99 0 9999 99 9999 + 029904 9999 99 99 0 9999 99 9999 + 029905 1277 43 01 1 304193544 08 0297 + 029906 1277 43 02 1 304193544 09 0297 + 029907 1277 43 03 1 304193544 10 0297 + 029908 1277 43 04 1 304193544 11 0297 + 029909 9999 99 99 0 9999 99 9999 + 029910 9999 99 99 0 9999 99 9999 + 029911 9999 99 99 0 9999 99 9999 + 029912 9999 99 99 0 9999 99 9999 + 029913 1277 44 01 1 304193544 12 0297 + 029914 1277 44 02 1 304193544 13 0297 + 029915 1277 44 03 1 304193544 14 0297 + 029916 1277 44 04 1 304193544 15 0297 + 029917 9999 99 99 0 9999 99 9999 + 029918 9999 99 99 0 9999 99 9999 + 029919 9999 99 99 0 9999 99 9999 + 029920 9999 99 99 0 9999 99 9999 + 029921 1277 45 01 1 304193540 00 0296 + 029922 1277 45 02 1 304193540 01 0296 + 029923 1277 45 03 1 304193540 02 0296 + 029924 1277 45 04 1 304193540 03 0296 + 029925 9999 99 99 0 9999 99 9999 + 029926 9999 99 99 0 9999 99 9999 + 029927 9999 99 99 0 9999 99 9999 + 029928 9999 99 99 0 9999 99 9999 + 029929 1277 46 01 1 304193540 04 0296 + 029930 1277 46 02 1 304193540 05 0296 + 029931 1277 46 03 1 304193540 06 0296 + 029932 1277 46 04 1 304193540 07 0296 + 029933 9999 99 99 0 9999 99 9999 + 029934 9999 99 99 0 9999 99 9999 + 029935 9999 99 99 0 9999 99 9999 + 029936 9999 99 99 0 9999 99 9999 + 029937 1277 47 01 1 304193540 08 0296 + 029938 1277 47 02 1 304193540 09 0296 + 029939 1277 47 03 1 304193540 10 0296 + 029940 1277 47 04 1 304193540 11 0296 + 029941 9999 99 99 0 9999 99 9999 + 029942 9999 99 99 0 9999 99 9999 + 029943 9999 99 99 0 9999 99 9999 + 029944 9999 99 99 0 9999 99 9999 + 029945 1277 48 01 1 304193540 12 0296 + 029946 1277 48 02 1 304193540 13 0296 + 029947 1277 48 03 1 304193540 14 0296 + 029948 1277 48 04 1 304193540 15 0296 + 029949 9999 99 99 0 9999 99 9999 + 029950 9999 99 99 0 9999 99 9999 + 029951 9999 99 99 0 9999 99 9999 + 029952 9999 99 99 0 9999 99 9999 + 029953 1278 01 01 1 306421772 00 1130 + 029954 1278 01 02 1 306421772 01 1130 + 029955 1278 01 03 1 306421772 02 1130 + 029956 1278 01 04 1 306421772 03 1130 + 029957 1278 01 05 1 306421772 04 1130 + 029958 1278 01 06 1 306421772 05 1130 + 029959 1278 01 07 1 306421772 06 1130 + 029960 1278 01 08 1 306421772 07 1130 + 029961 1278 02 01 1 306421772 08 1130 + 029962 1278 02 02 1 306421772 09 1130 + 029963 1278 02 03 1 306421772 10 1130 + 029964 1278 02 04 1 306421772 11 1130 + 029965 1278 02 05 1 306421772 12 1130 + 029966 1278 02 06 1 306421772 13 1130 + 029967 1278 02 07 1 306421772 14 1130 + 029968 1278 02 08 1 306421772 15 1130 + 029969 1278 03 01 1 306421776 00 1131 + 029970 1278 03 02 1 306421776 01 1131 + 029971 1278 03 03 1 306421776 02 1131 + 029972 1278 03 04 1 306421776 03 1131 + 029973 1278 03 05 1 306421776 04 1131 + 029974 1278 03 06 1 306421776 05 1131 + 029975 1278 03 07 1 306421776 06 1131 + 029976 1278 03 08 1 306421776 07 1131 + 029977 1278 04 01 1 306421776 08 1131 + 029978 1278 04 02 1 306421776 09 1131 + 029979 1278 04 03 1 306421776 10 1131 + 029980 1278 04 04 1 306421776 11 1131 + 029981 1278 04 05 1 306421776 12 1131 + 029982 1278 04 06 1 306421776 13 1131 + 029983 1278 04 07 1 306421776 14 1131 + 029984 1278 04 08 1 306421776 15 1131 + 029985 1278 05 01 1 306421764 00 1128 + 029986 1278 05 02 1 306421764 01 1128 + 029987 1278 05 03 1 306421764 02 1128 + 029988 1278 05 04 1 306421764 03 1128 + 029989 1278 05 05 1 306421764 04 1128 + 029990 1278 05 06 1 306421764 05 1128 + 029991 1278 05 07 1 306421764 06 1128 + 029992 1278 05 08 1 306421764 07 1128 + 029993 1278 06 01 1 306421764 08 1128 + 029994 1278 06 02 1 306421764 09 1128 + 029995 1278 06 03 1 306421764 10 1128 + 029996 1278 06 04 1 306421764 11 1128 + 029997 1278 06 05 1 306421764 12 1128 + 029998 1278 06 06 1 306421764 13 1128 + 029999 1278 06 07 1 306421764 14 1128 + 030000 1278 06 08 1 306421764 15 1128 + 030001 1278 07 01 1 306421768 00 1129 + 030002 1278 07 02 1 306421768 01 1129 + 030003 1278 07 03 1 306421768 02 1129 + 030004 1278 07 04 1 306421768 03 1129 + 030005 1278 07 05 1 306421768 04 1129 + 030006 1278 07 06 1 306421768 05 1129 + 030007 1278 07 07 1 306421768 06 1129 + 030008 1278 07 08 1 306421768 07 1129 + 030009 1278 08 01 1 306421768 08 1129 + 030010 1278 08 02 1 306421768 09 1129 + 030011 1278 08 03 1 306421768 10 1129 + 030012 1278 08 04 1 306421768 11 1129 + 030013 1278 08 05 1 306421768 12 1129 + 030014 1278 08 06 1 306421768 13 1129 + 030015 1278 08 07 1 306421768 14 1129 + 030016 1278 08 08 1 306421768 15 1129 + 030017 1278 09 01 1 303083524 12 0080 + 030018 1278 09 02 1 303083524 13 0080 + 030019 9999 99 99 0 9999 99 9999 + 030020 9999 99 99 0 9999 99 9999 + 030021 9999 99 99 0 9999 99 9999 + 030022 9999 99 99 0 9999 99 9999 + 030023 9999 99 99 0 9999 99 9999 + 030024 9999 99 99 0 9999 99 9999 + 030025 1278 10 01 1 303083524 14 0080 + 030026 1278 10 02 1 303083524 15 0080 + 030027 9999 99 99 0 9999 99 9999 + 030028 9999 99 99 0 9999 99 9999 + 030029 9999 99 99 0 9999 99 9999 + 030030 9999 99 99 0 9999 99 9999 + 030031 9999 99 99 0 9999 99 9999 + 030032 9999 99 99 0 9999 99 9999 + 030033 1278 11 01 1 303083524 08 0080 + 030034 1278 11 02 1 303083524 09 0080 + 030035 9999 99 99 0 9999 99 9999 + 030036 9999 99 99 0 9999 99 9999 + 030037 9999 99 99 0 9999 99 9999 + 030038 9999 99 99 0 9999 99 9999 + 030039 9999 99 99 0 9999 99 9999 + 030040 9999 99 99 0 9999 99 9999 + 030041 1278 12 01 1 303083524 10 0080 + 030042 1278 12 02 1 303083524 11 0080 + 030043 9999 99 99 0 9999 99 9999 + 030044 9999 99 99 0 9999 99 9999 + 030045 9999 99 99 0 9999 99 9999 + 030046 9999 99 99 0 9999 99 9999 + 030047 9999 99 99 0 9999 99 9999 + 030048 9999 99 99 0 9999 99 9999 + 030049 1278 13 01 1 303083524 00 0080 + 030050 1278 13 02 1 303083524 01 0080 + 030051 9999 99 99 0 9999 99 9999 + 030052 9999 99 99 0 9999 99 9999 + 030053 9999 99 99 0 9999 99 9999 + 030054 9999 99 99 0 9999 99 9999 + 030055 9999 99 99 0 9999 99 9999 + 030056 9999 99 99 0 9999 99 9999 + 030057 1278 14 01 1 303083524 02 0080 + 030058 1278 14 02 1 303083524 03 0080 + 030059 9999 99 99 0 9999 99 9999 + 030060 9999 99 99 0 9999 99 9999 + 030061 9999 99 99 0 9999 99 9999 + 030062 9999 99 99 0 9999 99 9999 + 030063 9999 99 99 0 9999 99 9999 + 030064 9999 99 99 0 9999 99 9999 + 030065 1278 15 01 1 303083524 04 0080 + 030066 1278 15 02 1 303083524 05 0080 + 030067 9999 99 99 0 9999 99 9999 + 030068 9999 99 99 0 9999 99 9999 + 030069 9999 99 99 0 9999 99 9999 + 030070 9999 99 99 0 9999 99 9999 + 030071 9999 99 99 0 9999 99 9999 + 030072 9999 99 99 0 9999 99 9999 + 030073 1278 16 01 1 303083524 06 0080 + 030074 1278 16 02 1 303083524 07 0080 + 030075 9999 99 99 0 9999 99 9999 + 030076 9999 99 99 0 9999 99 9999 + 030077 9999 99 99 0 9999 99 9999 + 030078 9999 99 99 0 9999 99 9999 + 030079 9999 99 99 0 9999 99 9999 + 030080 9999 99 99 0 9999 99 9999 + 030081 1278 17 01 1 305303560 00 0641 + 030082 1278 17 02 1 305303560 01 0641 + 030083 1278 17 03 1 305303560 02 0641 + 030084 1278 17 04 1 305303560 03 0641 + 030085 1278 17 05 1 305303560 04 0641 + 030086 1278 17 06 1 305303560 05 0641 + 030087 1278 17 07 1 305303560 06 0641 + 030088 1278 17 08 1 305303560 07 0641 + 030089 1278 18 01 1 305303560 08 0641 + 030090 1278 18 02 1 305303560 09 0641 + 030091 1278 18 03 1 305303560 10 0641 + 030092 1278 18 04 1 305303560 11 0641 + 030093 1278 18 05 1 305303560 12 0641 + 030094 1278 18 06 1 305303560 13 0641 + 030095 1278 18 07 1 305303560 14 0641 + 030096 1278 18 08 1 305303560 15 0641 + 030097 1278 19 01 1 305303556 00 0640 + 030098 1278 19 02 1 305303556 01 0640 + 030099 1278 19 03 1 305303556 02 0640 + 030100 1278 19 04 1 305303556 03 0640 + 030101 1278 19 05 1 305303556 04 0640 + 030102 1278 19 06 1 305303556 05 0640 + 030103 1278 19 07 1 305303556 06 0640 + 030104 1278 19 08 1 305303556 07 0640 + 030105 1278 20 01 1 305303556 08 0640 + 030106 1278 20 02 1 305303556 09 0640 + 030107 1278 20 03 1 305303556 10 0640 + 030108 1278 20 04 1 305303556 11 0640 + 030109 1278 20 05 1 305303556 12 0640 + 030110 1278 20 06 1 305303556 13 0640 + 030111 1278 20 07 1 305303556 14 0640 + 030112 1278 20 08 1 305303556 15 0640 + 030113 1278 21 01 1 305303568 00 0643 + 030114 1278 21 02 1 305303568 01 0643 + 030115 1278 21 03 1 305303568 02 0643 + 030116 1278 21 04 1 305303568 03 0643 + 030117 1278 21 05 1 305303568 04 0643 + 030118 1278 21 06 1 305303568 05 0643 + 030119 1278 21 07 1 305303568 06 0643 + 030120 1278 21 08 1 305303568 07 0643 + 030121 1278 22 01 1 305303568 08 0643 + 030122 1278 22 02 1 305303568 09 0643 + 030123 1278 22 03 1 305303568 10 0643 + 030124 1278 22 04 1 305303568 11 0643 + 030125 1278 22 05 1 305303568 12 0643 + 030126 1278 22 06 1 305303568 13 0643 + 030127 1278 22 07 1 305303568 14 0643 + 030128 1278 22 08 1 305303568 15 0643 + 030129 1278 23 01 1 305303564 00 0642 + 030130 1278 23 02 1 305303564 01 0642 + 030131 1278 23 03 1 305303564 02 0642 + 030132 1278 23 04 1 305303564 03 0642 + 030133 1278 23 05 1 305303564 04 0642 + 030134 1278 23 06 1 305303564 05 0642 + 030135 1278 23 07 1 305303564 06 0642 + 030136 1278 23 08 1 305303564 07 0642 + 030137 1278 24 01 1 305303564 08 0642 + 030138 1278 24 02 1 305303564 09 0642 + 030139 1278 24 03 1 305303564 10 0642 + 030140 1278 24 04 1 305303564 11 0642 + 030141 1278 24 05 1 305303564 12 0642 + 030142 1278 24 06 1 305303564 13 0642 + 030143 1278 24 07 1 305303564 14 0642 + 030144 1278 24 08 1 305303564 15 0642 + 030145 1278 25 01 1 306417676 00 1122 + 030146 1278 25 02 1 306417676 01 1122 + 030147 1278 25 03 1 306417676 02 1122 + 030148 1278 25 04 1 306417676 03 1122 + 030149 1278 25 05 1 306417676 04 1122 + 030150 1278 25 06 1 306417676 05 1122 + 030151 1278 25 07 1 306417676 06 1122 + 030152 1278 25 08 1 306417676 07 1122 + 030153 1278 26 01 1 306417676 08 1122 + 030154 1278 26 02 1 306417676 09 1122 + 030155 1278 26 03 1 306417676 10 1122 + 030156 1278 26 04 1 306417676 11 1122 + 030157 1278 26 05 1 306417676 12 1122 + 030158 1278 26 06 1 306417676 13 1122 + 030159 1278 26 07 1 306417676 14 1122 + 030160 1278 26 08 1 306417676 15 1122 + 030161 1278 27 01 1 306417680 00 1123 + 030162 1278 27 02 1 306417680 01 1123 + 030163 1278 27 03 1 306417680 02 1123 + 030164 1278 27 04 1 306417680 03 1123 + 030165 1278 27 05 1 306417680 04 1123 + 030166 1278 27 06 1 306417680 05 1123 + 030167 1278 27 07 1 306417680 06 1123 + 030168 1278 27 08 1 306417680 07 1123 + 030169 1278 28 01 1 306417680 08 1123 + 030170 1278 28 02 1 306417680 09 1123 + 030171 1278 28 03 1 306417680 10 1123 + 030172 1278 28 04 1 306417680 11 1123 + 030173 1278 28 05 1 306417680 12 1123 + 030174 1278 28 06 1 306417680 13 1123 + 030175 1278 28 07 1 306417680 14 1123 + 030176 1278 28 08 1 306417680 15 1123 + 030177 1278 29 01 1 306417668 00 1120 + 030178 1278 29 02 1 306417668 01 1120 + 030179 1278 29 03 1 306417668 02 1120 + 030180 1278 29 04 1 306417668 03 1120 + 030181 1278 29 05 1 306417668 04 1120 + 030182 1278 29 06 1 306417668 05 1120 + 030183 1278 29 07 1 306417668 06 1120 + 030184 1278 29 08 1 306417668 07 1120 + 030185 1278 30 01 1 306417668 08 1120 + 030186 1278 30 02 1 306417668 09 1120 + 030187 1278 30 03 1 306417668 10 1120 + 030188 1278 30 04 1 306417668 11 1120 + 030189 1278 30 05 1 306417668 12 1120 + 030190 1278 30 06 1 306417668 13 1120 + 030191 1278 30 07 1 306417668 14 1120 + 030192 1278 30 08 1 306417668 15 1120 + 030193 1278 31 01 1 306417672 00 1121 + 030194 1278 31 02 1 306417672 01 1121 + 030195 1278 31 03 1 306417672 02 1121 + 030196 1278 31 04 1 306417672 03 1121 + 030197 1278 31 05 1 306417672 04 1121 + 030198 1278 31 06 1 306417672 05 1121 + 030199 1278 31 07 1 306417672 06 1121 + 030200 1278 31 08 1 306417672 07 1121 + 030201 1278 32 01 1 306417672 08 1121 + 030202 1278 32 02 1 306417672 09 1121 + 030203 1278 32 03 1 306417672 10 1121 + 030204 1278 32 04 1 306417672 11 1121 + 030205 1278 32 05 1 306417672 12 1121 + 030206 1278 32 06 1 306417672 13 1121 + 030207 1278 32 07 1 306417672 14 1121 + 030208 1278 32 08 1 306417672 15 1121 + 030209 1278 33 01 1 305299464 00 0633 + 030210 1278 33 02 1 305299464 01 0633 + 030211 1278 33 03 1 305299464 02 0633 + 030212 1278 33 04 1 305299464 03 0633 + 030213 1278 33 05 1 305299464 04 0633 + 030214 1278 33 06 1 305299464 05 0633 + 030215 1278 33 07 1 305299464 06 0633 + 030216 1278 33 08 1 305299464 07 0633 + 030217 1278 34 01 1 305299464 08 0633 + 030218 1278 34 02 1 305299464 09 0633 + 030219 1278 34 03 1 305299464 10 0633 + 030220 1278 34 04 1 305299464 11 0633 + 030221 1278 34 05 1 305299464 12 0633 + 030222 1278 34 06 1 305299464 13 0633 + 030223 1278 34 07 1 305299464 14 0633 + 030224 1278 34 08 1 305299464 15 0633 + 030225 1278 35 01 1 305299460 00 0632 + 030226 1278 35 02 1 305299460 01 0632 + 030227 1278 35 03 1 305299460 02 0632 + 030228 1278 35 04 1 305299460 03 0632 + 030229 1278 35 05 1 305299460 04 0632 + 030230 1278 35 06 1 305299460 05 0632 + 030231 1278 35 07 1 305299460 06 0632 + 030232 1278 35 08 1 305299460 07 0632 + 030233 1278 36 01 1 305299460 08 0632 + 030234 1278 36 02 1 305299460 09 0632 + 030235 1278 36 03 1 305299460 10 0632 + 030236 1278 36 04 1 305299460 11 0632 + 030237 1278 36 05 1 305299460 12 0632 + 030238 1278 36 06 1 305299460 13 0632 + 030239 1278 36 07 1 305299460 14 0632 + 030240 1278 36 08 1 305299460 15 0632 + 030241 1278 37 01 1 305299472 00 0635 + 030242 1278 37 02 1 305299472 01 0635 + 030243 1278 37 03 1 305299472 02 0635 + 030244 1278 37 04 1 305299472 03 0635 + 030245 1278 37 05 1 305299472 04 0635 + 030246 1278 37 06 1 305299472 05 0635 + 030247 1278 37 07 1 305299472 06 0635 + 030248 1278 37 08 1 305299472 07 0635 + 030249 1278 38 01 1 305299472 08 0635 + 030250 1278 38 02 1 305299472 09 0635 + 030251 1278 38 03 1 305299472 10 0635 + 030252 1278 38 04 1 305299472 11 0635 + 030253 1278 38 05 1 305299472 12 0635 + 030254 1278 38 06 1 305299472 13 0635 + 030255 1278 38 07 1 305299472 14 0635 + 030256 1278 38 08 1 305299472 15 0635 + 030257 1278 39 01 1 305299468 00 0634 + 030258 1278 39 02 1 305299468 01 0634 + 030259 1278 39 03 1 305299468 02 0634 + 030260 1278 39 04 1 305299468 03 0634 + 030261 1278 39 05 1 305299468 04 0634 + 030262 1278 39 06 1 305299468 05 0634 + 030263 1278 39 07 1 305299468 06 0634 + 030264 1278 39 08 1 305299468 07 0634 + 030265 1278 40 01 1 305299468 08 0634 + 030266 1278 40 02 1 305299468 09 0634 + 030267 1278 40 03 1 305299468 10 0634 + 030268 1278 40 04 1 305299468 11 0634 + 030269 1278 40 05 1 305299468 12 0634 + 030270 1278 40 06 1 305299468 13 0634 + 030271 1278 40 07 1 305299468 14 0634 + 030272 1278 40 08 1 305299468 15 0634 + 030273 1278 41 01 1 305295372 00 0626 + 030274 1278 41 02 1 305295372 01 0626 + 030275 1278 41 03 1 305295372 02 0626 + 030276 1278 41 04 1 305295372 03 0626 + 030277 1278 41 05 1 305295372 04 0626 + 030278 1278 41 06 1 305295372 05 0626 + 030279 1278 41 07 1 305295372 06 0626 + 030280 1278 41 08 1 305295372 07 0626 + 030281 1278 42 01 1 305295372 08 0626 + 030282 1278 42 02 1 305295372 09 0626 + 030283 1278 42 03 1 305295372 10 0626 + 030284 1278 42 04 1 305295372 11 0626 + 030285 1278 42 05 1 305295372 12 0626 + 030286 1278 42 06 1 305295372 13 0626 + 030287 1278 42 07 1 305295372 14 0626 + 030288 1278 42 08 1 305295372 15 0626 + 030289 1278 43 01 1 305295376 00 0627 + 030290 1278 43 02 1 305295376 01 0627 + 030291 1278 43 03 1 305295376 02 0627 + 030292 1278 43 04 1 305295376 03 0627 + 030293 1278 43 05 1 305295376 04 0627 + 030294 1278 43 06 1 305295376 05 0627 + 030295 1278 43 07 1 305295376 06 0627 + 030296 1278 43 08 1 305295376 07 0627 + 030297 1278 44 01 1 305295376 08 0627 + 030298 1278 44 02 1 305295376 09 0627 + 030299 1278 44 03 1 305295376 10 0627 + 030300 1278 44 04 1 305295376 11 0627 + 030301 1278 44 05 1 305295376 12 0627 + 030302 1278 44 06 1 305295376 13 0627 + 030303 1278 44 07 1 305295376 14 0627 + 030304 1278 44 08 1 305295376 15 0627 + 030305 1278 45 01 1 305295364 00 0624 + 030306 1278 45 02 1 305295364 01 0624 + 030307 1278 45 03 1 305295364 02 0624 + 030308 1278 45 04 1 305295364 03 0624 + 030309 1278 45 05 1 305295364 04 0624 + 030310 1278 45 06 1 305295364 05 0624 + 030311 1278 45 07 1 305295364 06 0624 + 030312 1278 45 08 1 305295364 07 0624 + 030313 1278 46 01 1 305295364 08 0624 + 030314 1278 46 02 1 305295364 09 0624 + 030315 1278 46 03 1 305295364 10 0624 + 030316 1278 46 04 1 305295364 11 0624 + 030317 1278 46 05 1 305295364 12 0624 + 030318 1278 46 06 1 305295364 13 0624 + 030319 1278 46 07 1 305295364 14 0624 + 030320 1278 46 08 1 305295364 15 0624 + 030321 1278 47 01 1 305295368 00 0625 + 030322 1278 47 02 1 305295368 01 0625 + 030323 1278 47 03 1 305295368 02 0625 + 030324 1278 47 04 1 305295368 03 0625 + 030325 1278 47 05 1 305295368 04 0625 + 030326 1278 47 06 1 305295368 05 0625 + 030327 1278 47 07 1 305295368 06 0625 + 030328 1278 47 08 1 305295368 07 0625 + 030329 1278 48 01 1 305295368 08 0625 + 030330 1278 48 02 1 305295368 09 0625 + 030331 1278 48 03 1 305295368 10 0625 + 030332 1278 48 04 1 305295368 11 0625 + 030333 1278 48 05 1 305295368 12 0625 + 030334 1278 48 06 1 305295368 13 0625 + 030335 1278 48 07 1 305295368 14 0625 + 030336 1278 48 08 1 305295368 15 0625 + 030337 1279 01 01 1 303087628 08 0090 + 030338 1279 01 02 1 303087628 09 0090 + 030339 9999 99 99 0 9999 99 9999 + 030340 9999 99 99 0 9999 99 9999 + 030341 9999 99 99 0 9999 99 9999 + 030342 9999 99 99 0 9999 99 9999 + 030343 9999 99 99 0 9999 99 9999 + 030344 9999 99 99 0 9999 99 9999 + 030345 1279 02 01 1 303087628 10 0090 + 030346 1279 02 02 1 303087628 11 0090 + 030347 9999 99 99 0 9999 99 9999 + 030348 9999 99 99 0 9999 99 9999 + 030349 9999 99 99 0 9999 99 9999 + 030350 9999 99 99 0 9999 99 9999 + 030351 9999 99 99 0 9999 99 9999 + 030352 9999 99 99 0 9999 99 9999 + 030353 1279 03 01 1 303087628 12 0090 + 030354 1279 03 02 1 303087628 13 0090 + 030355 9999 99 99 0 9999 99 9999 + 030356 9999 99 99 0 9999 99 9999 + 030357 9999 99 99 0 9999 99 9999 + 030358 9999 99 99 0 9999 99 9999 + 030359 9999 99 99 0 9999 99 9999 + 030360 9999 99 99 0 9999 99 9999 + 030361 1279 04 01 1 303087628 14 0090 + 030362 1279 04 02 1 303087628 15 0090 + 030363 9999 99 99 0 9999 99 9999 + 030364 9999 99 99 0 9999 99 9999 + 030365 9999 99 99 0 9999 99 9999 + 030366 9999 99 99 0 9999 99 9999 + 030367 9999 99 99 0 9999 99 9999 + 030368 9999 99 99 0 9999 99 9999 + 030369 1279 05 01 1 303087628 00 0090 + 030370 1279 05 02 1 303087628 01 0090 + 030371 9999 99 99 0 9999 99 9999 + 030372 9999 99 99 0 9999 99 9999 + 030373 9999 99 99 0 9999 99 9999 + 030374 9999 99 99 0 9999 99 9999 + 030375 9999 99 99 0 9999 99 9999 + 030376 9999 99 99 0 9999 99 9999 + 030377 1279 06 01 1 303087628 02 0090 + 030378 1279 06 02 1 303087628 03 0090 + 030379 9999 99 99 0 9999 99 9999 + 030380 9999 99 99 0 9999 99 9999 + 030381 9999 99 99 0 9999 99 9999 + 030382 9999 99 99 0 9999 99 9999 + 030383 9999 99 99 0 9999 99 9999 + 030384 9999 99 99 0 9999 99 9999 + 030385 1279 07 01 1 303087628 04 0090 + 030386 1279 07 02 1 303087628 05 0090 + 030387 9999 99 99 0 9999 99 9999 + 030388 9999 99 99 0 9999 99 9999 + 030389 9999 99 99 0 9999 99 9999 + 030390 9999 99 99 0 9999 99 9999 + 030391 9999 99 99 0 9999 99 9999 + 030392 9999 99 99 0 9999 99 9999 + 030393 1279 08 01 1 303087628 06 0090 + 030394 1279 08 02 1 303087628 07 0090 + 030395 9999 99 99 0 9999 99 9999 + 030396 9999 99 99 0 9999 99 9999 + 030397 9999 99 99 0 9999 99 9999 + 030398 9999 99 99 0 9999 99 9999 + 030399 9999 99 99 0 9999 99 9999 + 030400 9999 99 99 0 9999 99 9999 + 030401 1279 09 01 1 304201740 00 0314 + 030402 1279 09 02 1 304201740 01 0314 + 030403 1279 09 03 1 304201740 02 0314 + 030404 1279 09 04 1 304201740 03 0314 + 030405 9999 99 99 0 9999 99 9999 + 030406 9999 99 99 0 9999 99 9999 + 030407 9999 99 99 0 9999 99 9999 + 030408 9999 99 99 0 9999 99 9999 + 030409 1279 10 01 1 304201740 04 0314 + 030410 1279 10 02 1 304201740 05 0314 + 030411 1279 10 03 1 304201740 06 0314 + 030412 1279 10 04 1 304201740 07 0314 + 030413 9999 99 99 0 9999 99 9999 + 030414 9999 99 99 0 9999 99 9999 + 030415 9999 99 99 0 9999 99 9999 + 030416 9999 99 99 0 9999 99 9999 + 030417 1279 11 01 1 304201740 08 0314 + 030418 1279 11 02 1 304201740 09 0314 + 030419 1279 11 03 1 304201740 10 0314 + 030420 1279 11 04 1 304201740 11 0314 + 030421 9999 99 99 0 9999 99 9999 + 030422 9999 99 99 0 9999 99 9999 + 030423 9999 99 99 0 9999 99 9999 + 030424 9999 99 99 0 9999 99 9999 + 030425 1279 12 01 1 304201740 12 0314 + 030426 1279 12 02 1 304201740 13 0314 + 030427 1279 12 03 1 304201740 14 0314 + 030428 1279 12 04 1 304201740 15 0314 + 030429 9999 99 99 0 9999 99 9999 + 030430 9999 99 99 0 9999 99 9999 + 030431 9999 99 99 0 9999 99 9999 + 030432 9999 99 99 0 9999 99 9999 + 030433 1279 13 01 1 304201744 08 0315 + 030434 1279 13 02 1 304201744 09 0315 + 030435 1279 13 03 1 304201744 10 0315 + 030436 1279 13 04 1 304201744 11 0315 + 030437 9999 99 99 0 9999 99 9999 + 030438 9999 99 99 0 9999 99 9999 + 030439 9999 99 99 0 9999 99 9999 + 030440 9999 99 99 0 9999 99 9999 + 030441 1279 14 01 1 304201744 12 0315 + 030442 1279 14 02 1 304201744 13 0315 + 030443 1279 14 03 1 304201744 14 0315 + 030444 1279 14 04 1 304201744 15 0315 + 030445 9999 99 99 0 9999 99 9999 + 030446 9999 99 99 0 9999 99 9999 + 030447 9999 99 99 0 9999 99 9999 + 030448 9999 99 99 0 9999 99 9999 + 030449 1279 15 01 1 304201744 00 0315 + 030450 1279 15 02 1 304201744 01 0315 + 030451 1279 15 03 1 304201744 02 0315 + 030452 1279 15 04 1 304201744 03 0315 + 030453 9999 99 99 0 9999 99 9999 + 030454 9999 99 99 0 9999 99 9999 + 030455 9999 99 99 0 9999 99 9999 + 030456 9999 99 99 0 9999 99 9999 + 030457 1279 16 01 1 304201744 04 0315 + 030458 1279 16 02 1 304201744 05 0315 + 030459 1279 16 03 1 304201744 06 0315 + 030460 1279 16 04 1 304201744 07 0315 + 030461 9999 99 99 0 9999 99 9999 + 030462 9999 99 99 0 9999 99 9999 + 030463 9999 99 99 0 9999 99 9999 + 030464 9999 99 99 0 9999 99 9999 + 030465 1279 17 01 1 306446344 00 1177 + 030466 1279 17 02 1 306446344 01 1177 + 030467 1279 17 03 1 306446344 02 1177 + 030468 1279 17 04 1 306446344 03 1177 + 030469 1279 17 05 1 306446344 04 1177 + 030470 1279 17 06 1 306446344 05 1177 + 030471 1279 17 07 1 306446344 06 1177 + 030472 1279 17 08 1 306446344 07 1177 + 030473 1279 18 01 1 306446344 08 1177 + 030474 1279 18 02 1 306446344 09 1177 + 030475 1279 18 03 1 306446344 10 1177 + 030476 1279 18 04 1 306446344 11 1177 + 030477 1279 18 05 1 306446344 12 1177 + 030478 1279 18 06 1 306446344 13 1177 + 030479 1279 18 07 1 306446344 14 1177 + 030480 1279 18 08 1 306446344 15 1177 + 030481 1279 19 01 1 306446340 00 1176 + 030482 1279 19 02 1 306446340 01 1176 + 030483 1279 19 03 1 306446340 02 1176 + 030484 1279 19 04 1 306446340 03 1176 + 030485 1279 19 05 1 306446340 04 1176 + 030486 1279 19 06 1 306446340 05 1176 + 030487 1279 19 07 1 306446340 06 1176 + 030488 1279 19 08 1 306446340 07 1176 + 030489 1279 20 01 1 306446340 08 1176 + 030490 1279 20 02 1 306446340 09 1176 + 030491 1279 20 03 1 306446340 10 1176 + 030492 1279 20 04 1 306446340 11 1176 + 030493 1279 20 05 1 306446340 12 1176 + 030494 1279 20 06 1 306446340 13 1176 + 030495 1279 20 07 1 306446340 14 1176 + 030496 1279 20 08 1 306446340 15 1176 + 030497 1279 21 01 1 306446352 00 1179 + 030498 1279 21 02 1 306446352 01 1179 + 030499 1279 21 03 1 306446352 02 1179 + 030500 1279 21 04 1 306446352 03 1179 + 030501 1279 21 05 1 306446352 04 1179 + 030502 1279 21 06 1 306446352 05 1179 + 030503 1279 21 07 1 306446352 06 1179 + 030504 1279 21 08 1 306446352 07 1179 + 030505 1279 22 01 1 306446352 08 1179 + 030506 1279 22 02 1 306446352 09 1179 + 030507 1279 22 03 1 306446352 10 1179 + 030508 1279 22 04 1 306446352 11 1179 + 030509 1279 22 05 1 306446352 12 1179 + 030510 1279 22 06 1 306446352 13 1179 + 030511 1279 22 07 1 306446352 14 1179 + 030512 1279 22 08 1 306446352 15 1179 + 030513 1279 23 01 1 306446348 00 1178 + 030514 1279 23 02 1 306446348 01 1178 + 030515 1279 23 03 1 306446348 02 1178 + 030516 1279 23 04 1 306446348 03 1178 + 030517 1279 23 05 1 306446348 04 1178 + 030518 1279 23 06 1 306446348 05 1178 + 030519 1279 23 07 1 306446348 06 1178 + 030520 1279 23 08 1 306446348 07 1178 + 030521 1279 24 01 1 306446348 08 1178 + 030522 1279 24 02 1 306446348 09 1178 + 030523 1279 24 03 1 306446348 10 1178 + 030524 1279 24 04 1 306446348 11 1178 + 030525 1279 24 05 1 306446348 12 1178 + 030526 1279 24 06 1 306446348 13 1178 + 030527 1279 24 07 1 306446348 14 1178 + 030528 1279 24 08 1 306446348 15 1178 + 030529 1279 25 01 1 303087624 08 0089 + 030530 1279 25 02 1 303087624 09 0089 + 030531 9999 99 99 0 9999 99 9999 + 030532 9999 99 99 0 9999 99 9999 + 030533 9999 99 99 0 9999 99 9999 + 030534 9999 99 99 0 9999 99 9999 + 030535 9999 99 99 0 9999 99 9999 + 030536 9999 99 99 0 9999 99 9999 + 030537 1279 26 01 1 303087624 10 0089 + 030538 1279 26 02 1 303087624 11 0089 + 030539 9999 99 99 0 9999 99 9999 + 030540 9999 99 99 0 9999 99 9999 + 030541 9999 99 99 0 9999 99 9999 + 030542 9999 99 99 0 9999 99 9999 + 030543 9999 99 99 0 9999 99 9999 + 030544 9999 99 99 0 9999 99 9999 + 030545 1279 27 01 1 303087624 12 0089 + 030546 1279 27 02 1 303087624 13 0089 + 030547 9999 99 99 0 9999 99 9999 + 030548 9999 99 99 0 9999 99 9999 + 030549 9999 99 99 0 9999 99 9999 + 030550 9999 99 99 0 9999 99 9999 + 030551 9999 99 99 0 9999 99 9999 + 030552 9999 99 99 0 9999 99 9999 + 030553 1279 28 01 1 303087624 14 0089 + 030554 1279 28 02 1 303087624 15 0089 + 030555 9999 99 99 0 9999 99 9999 + 030556 9999 99 99 0 9999 99 9999 + 030557 9999 99 99 0 9999 99 9999 + 030558 9999 99 99 0 9999 99 9999 + 030559 9999 99 99 0 9999 99 9999 + 030560 9999 99 99 0 9999 99 9999 + 030561 1279 29 01 1 303087624 04 0089 + 030562 1279 29 02 1 303087624 05 0089 + 030563 9999 99 99 0 9999 99 9999 + 030564 9999 99 99 0 9999 99 9999 + 030565 9999 99 99 0 9999 99 9999 + 030566 9999 99 99 0 9999 99 9999 + 030567 9999 99 99 0 9999 99 9999 + 030568 9999 99 99 0 9999 99 9999 + 030569 1279 30 01 1 303087624 06 0089 + 030570 1279 30 02 1 303087624 07 0089 + 030571 9999 99 99 0 9999 99 9999 + 030572 9999 99 99 0 9999 99 9999 + 030573 9999 99 99 0 9999 99 9999 + 030574 9999 99 99 0 9999 99 9999 + 030575 9999 99 99 0 9999 99 9999 + 030576 9999 99 99 0 9999 99 9999 + 030577 1279 31 01 1 303087624 00 0089 + 030578 1279 31 02 1 303087624 01 0089 + 030579 9999 99 99 0 9999 99 9999 + 030580 9999 99 99 0 9999 99 9999 + 030581 9999 99 99 0 9999 99 9999 + 030582 9999 99 99 0 9999 99 9999 + 030583 9999 99 99 0 9999 99 9999 + 030584 9999 99 99 0 9999 99 9999 + 030585 1279 32 01 1 303087624 02 0089 + 030586 1279 32 02 1 303087624 03 0089 + 030587 9999 99 99 0 9999 99 9999 + 030588 9999 99 99 0 9999 99 9999 + 030589 9999 99 99 0 9999 99 9999 + 030590 9999 99 99 0 9999 99 9999 + 030591 9999 99 99 0 9999 99 9999 + 030592 9999 99 99 0 9999 99 9999 + 030593 1279 33 01 1 306442248 00 1169 + 030594 1279 33 02 1 306442248 01 1169 + 030595 1279 33 03 1 306442248 02 1169 + 030596 1279 33 04 1 306442248 03 1169 + 030597 1279 33 05 1 306442248 04 1169 + 030598 1279 33 06 1 306442248 05 1169 + 030599 1279 33 07 1 306442248 06 1169 + 030600 1279 33 08 1 306442248 07 1169 + 030601 1279 34 01 1 306442248 08 1169 + 030602 1279 34 02 1 306442248 09 1169 + 030603 1279 34 03 1 306442248 10 1169 + 030604 1279 34 04 1 306442248 11 1169 + 030605 1279 34 05 1 306442248 12 1169 + 030606 1279 34 06 1 306442248 13 1169 + 030607 1279 34 07 1 306442248 14 1169 + 030608 1279 34 08 1 306442248 15 1169 + 030609 1279 35 01 1 306442244 00 1168 + 030610 1279 35 02 1 306442244 01 1168 + 030611 1279 35 03 1 306442244 02 1168 + 030612 1279 35 04 1 306442244 03 1168 + 030613 1279 35 05 1 306442244 04 1168 + 030614 1279 35 06 1 306442244 05 1168 + 030615 1279 35 07 1 306442244 06 1168 + 030616 1279 35 08 1 306442244 07 1168 + 030617 1279 36 01 1 306442244 08 1168 + 030618 1279 36 02 1 306442244 09 1168 + 030619 1279 36 03 1 306442244 10 1168 + 030620 1279 36 04 1 306442244 11 1168 + 030621 1279 36 05 1 306442244 12 1168 + 030622 1279 36 06 1 306442244 13 1168 + 030623 1279 36 07 1 306442244 14 1168 + 030624 1279 36 08 1 306442244 15 1168 + 030625 1279 37 01 1 306442256 00 1171 + 030626 1279 37 02 1 306442256 01 1171 + 030627 1279 37 03 1 306442256 02 1171 + 030628 1279 37 04 1 306442256 03 1171 + 030629 1279 37 05 1 306442256 04 1171 + 030630 1279 37 06 1 306442256 05 1171 + 030631 1279 37 07 1 306442256 06 1171 + 030632 1279 37 08 1 306442256 07 1171 + 030633 1279 38 01 1 306442256 08 1171 + 030634 1279 38 02 1 306442256 09 1171 + 030635 1279 38 03 1 306442256 10 1171 + 030636 1279 38 04 1 306442256 11 1171 + 030637 1279 38 05 1 306442256 12 1171 + 030638 1279 38 06 1 306442256 13 1171 + 030639 1279 38 07 1 306442256 14 1171 + 030640 1279 38 08 1 306442256 15 1171 + 030641 1279 39 01 1 306442252 00 1170 + 030642 1279 39 02 1 306442252 01 1170 + 030643 1279 39 03 1 306442252 02 1170 + 030644 1279 39 04 1 306442252 03 1170 + 030645 1279 39 05 1 306442252 04 1170 + 030646 1279 39 06 1 306442252 05 1170 + 030647 1279 39 07 1 306442252 06 1170 + 030648 1279 39 08 1 306442252 07 1170 + 030649 1279 40 01 1 306442252 08 1170 + 030650 1279 40 02 1 306442252 09 1170 + 030651 1279 40 03 1 306442252 10 1170 + 030652 1279 40 04 1 306442252 11 1170 + 030653 1279 40 05 1 306442252 12 1170 + 030654 1279 40 06 1 306442252 13 1170 + 030655 1279 40 07 1 306442252 14 1170 + 030656 1279 40 08 1 306442252 15 1170 + 030657 1279 41 01 1 304201736 00 0313 + 030658 1279 41 02 1 304201736 01 0313 + 030659 1279 41 03 1 304201736 02 0313 + 030660 1279 41 04 1 304201736 03 0313 + 030661 9999 99 99 0 9999 99 9999 + 030662 9999 99 99 0 9999 99 9999 + 030663 9999 99 99 0 9999 99 9999 + 030664 9999 99 99 0 9999 99 9999 + 030665 1279 42 01 1 304201736 04 0313 + 030666 1279 42 02 1 304201736 05 0313 + 030667 1279 42 03 1 304201736 06 0313 + 030668 1279 42 04 1 304201736 07 0313 + 030669 9999 99 99 0 9999 99 9999 + 030670 9999 99 99 0 9999 99 9999 + 030671 9999 99 99 0 9999 99 9999 + 030672 9999 99 99 0 9999 99 9999 + 030673 1279 43 01 1 304201736 08 0313 + 030674 1279 43 02 1 304201736 09 0313 + 030675 1279 43 03 1 304201736 10 0313 + 030676 1279 43 04 1 304201736 11 0313 + 030677 9999 99 99 0 9999 99 9999 + 030678 9999 99 99 0 9999 99 9999 + 030679 9999 99 99 0 9999 99 9999 + 030680 9999 99 99 0 9999 99 9999 + 030681 1279 44 01 1 304201736 12 0313 + 030682 1279 44 02 1 304201736 13 0313 + 030683 1279 44 03 1 304201736 14 0313 + 030684 1279 44 04 1 304201736 15 0313 + 030685 9999 99 99 0 9999 99 9999 + 030686 9999 99 99 0 9999 99 9999 + 030687 9999 99 99 0 9999 99 9999 + 030688 9999 99 99 0 9999 99 9999 + 030689 1279 45 01 1 304201732 00 0312 + 030690 1279 45 02 1 304201732 01 0312 + 030691 1279 45 03 1 304201732 02 0312 + 030692 1279 45 04 1 304201732 03 0312 + 030693 9999 99 99 0 9999 99 9999 + 030694 9999 99 99 0 9999 99 9999 + 030695 9999 99 99 0 9999 99 9999 + 030696 9999 99 99 0 9999 99 9999 + 030697 1279 46 01 1 304201732 04 0312 + 030698 1279 46 02 1 304201732 05 0312 + 030699 1279 46 03 1 304201732 06 0312 + 030700 1279 46 04 1 304201732 07 0312 + 030701 9999 99 99 0 9999 99 9999 + 030702 9999 99 99 0 9999 99 9999 + 030703 9999 99 99 0 9999 99 9999 + 030704 9999 99 99 0 9999 99 9999 + 030705 1279 47 01 1 304201732 08 0312 + 030706 1279 47 02 1 304201732 09 0312 + 030707 1279 47 03 1 304201732 10 0312 + 030708 1279 47 04 1 304201732 11 0312 + 030709 9999 99 99 0 9999 99 9999 + 030710 9999 99 99 0 9999 99 9999 + 030711 9999 99 99 0 9999 99 9999 + 030712 9999 99 99 0 9999 99 9999 + 030713 1279 48 01 1 304201732 12 0312 + 030714 1279 48 02 1 304201732 13 0312 + 030715 1279 48 03 1 304201732 14 0312 + 030716 1279 48 04 1 304201732 15 0312 + 030717 9999 99 99 0 9999 99 9999 + 030718 9999 99 99 0 9999 99 9999 + 030719 9999 99 99 0 9999 99 9999 + 030720 9999 99 99 0 9999 99 9999 + 030721 1280 01 01 1 304197644 08 0306 + 030722 1280 01 02 1 304197644 09 0306 + 030723 1280 01 03 1 304197644 10 0306 + 030724 1280 01 04 1 304197644 11 0306 + 030725 9999 99 99 0 9999 99 9999 + 030726 9999 99 99 0 9999 99 9999 + 030727 9999 99 99 0 9999 99 9999 + 030728 9999 99 99 0 9999 99 9999 + 030729 1280 02 01 1 304197644 12 0306 + 030730 1280 02 02 1 304197644 13 0306 + 030731 1280 02 03 1 304197644 14 0306 + 030732 1280 02 04 1 304197644 15 0306 + 030733 9999 99 99 0 9999 99 9999 + 030734 9999 99 99 0 9999 99 9999 + 030735 9999 99 99 0 9999 99 9999 + 030736 9999 99 99 0 9999 99 9999 + 030737 1280 03 01 1 304197644 00 0306 + 030738 1280 03 02 1 304197644 01 0306 + 030739 1280 03 03 1 304197644 02 0306 + 030740 1280 03 04 1 304197644 03 0306 + 030741 9999 99 99 0 9999 99 9999 + 030742 9999 99 99 0 9999 99 9999 + 030743 9999 99 99 0 9999 99 9999 + 030744 9999 99 99 0 9999 99 9999 + 030745 1280 04 01 1 304197644 04 0306 + 030746 1280 04 02 1 304197644 05 0306 + 030747 1280 04 03 1 304197644 06 0306 + 030748 1280 04 04 1 304197644 07 0306 + 030749 9999 99 99 0 9999 99 9999 + 030750 9999 99 99 0 9999 99 9999 + 030751 9999 99 99 0 9999 99 9999 + 030752 9999 99 99 0 9999 99 9999 + 030753 1280 05 01 1 304197648 08 0307 + 030754 1280 05 02 1 304197648 09 0307 + 030755 1280 05 03 1 304197648 10 0307 + 030756 1280 05 04 1 304197648 11 0307 + 030757 9999 99 99 0 9999 99 9999 + 030758 9999 99 99 0 9999 99 9999 + 030759 9999 99 99 0 9999 99 9999 + 030760 9999 99 99 0 9999 99 9999 + 030761 1280 06 01 1 304197648 12 0307 + 030762 1280 06 02 1 304197648 13 0307 + 030763 1280 06 03 1 304197648 14 0307 + 030764 1280 06 04 1 304197648 15 0307 + 030765 9999 99 99 0 9999 99 9999 + 030766 9999 99 99 0 9999 99 9999 + 030767 9999 99 99 0 9999 99 9999 + 030768 9999 99 99 0 9999 99 9999 + 030769 1280 07 01 1 304197648 00 0307 + 030770 1280 07 02 1 304197648 01 0307 + 030771 1280 07 03 1 304197648 02 0307 + 030772 1280 07 04 1 304197648 03 0307 + 030773 9999 99 99 0 9999 99 9999 + 030774 9999 99 99 0 9999 99 9999 + 030775 9999 99 99 0 9999 99 9999 + 030776 9999 99 99 0 9999 99 9999 + 030777 1280 08 01 1 304197648 04 0307 + 030778 1280 08 02 1 304197648 05 0307 + 030779 1280 08 03 1 304197648 06 0307 + 030780 1280 08 04 1 304197648 07 0307 + 030781 9999 99 99 0 9999 99 9999 + 030782 9999 99 99 0 9999 99 9999 + 030783 9999 99 99 0 9999 99 9999 + 030784 9999 99 99 0 9999 99 9999 + 030785 1280 09 01 1 306438156 00 1162 + 030786 1280 09 02 1 306438156 01 1162 + 030787 1280 09 03 1 306438156 02 1162 + 030788 1280 09 04 1 306438156 03 1162 + 030789 1280 09 05 1 306438156 04 1162 + 030790 1280 09 06 1 306438156 05 1162 + 030791 1280 09 07 1 306438156 06 1162 + 030792 1280 09 08 1 306438156 07 1162 + 030793 1280 10 01 1 306438156 08 1162 + 030794 1280 10 02 1 306438156 09 1162 + 030795 1280 10 03 1 306438156 10 1162 + 030796 1280 10 04 1 306438156 11 1162 + 030797 1280 10 05 1 306438156 12 1162 + 030798 1280 10 06 1 306438156 13 1162 + 030799 1280 10 07 1 306438156 14 1162 + 030800 1280 10 08 1 306438156 15 1162 + 030801 1280 11 01 1 306438160 00 1163 + 030802 1280 11 02 1 306438160 01 1163 + 030803 1280 11 03 1 306438160 02 1163 + 030804 1280 11 04 1 306438160 03 1163 + 030805 1280 11 05 1 306438160 04 1163 + 030806 1280 11 06 1 306438160 05 1163 + 030807 1280 11 07 1 306438160 06 1163 + 030808 1280 11 08 1 306438160 07 1163 + 030809 1280 12 01 1 306438160 08 1163 + 030810 1280 12 02 1 306438160 09 1163 + 030811 1280 12 03 1 306438160 10 1163 + 030812 1280 12 04 1 306438160 11 1163 + 030813 1280 12 05 1 306438160 12 1163 + 030814 1280 12 06 1 306438160 13 1163 + 030815 1280 12 07 1 306438160 14 1163 + 030816 1280 12 08 1 306438160 15 1163 + 030817 1280 13 01 1 306438148 00 1160 + 030818 1280 13 02 1 306438148 01 1160 + 030819 1280 13 03 1 306438148 02 1160 + 030820 1280 13 04 1 306438148 03 1160 + 030821 1280 13 05 1 306438148 04 1160 + 030822 1280 13 06 1 306438148 05 1160 + 030823 1280 13 07 1 306438148 06 1160 + 030824 1280 13 08 1 306438148 07 1160 + 030825 1280 14 01 1 306438148 08 1160 + 030826 1280 14 02 1 306438148 09 1160 + 030827 1280 14 03 1 306438148 10 1160 + 030828 1280 14 04 1 306438148 11 1160 + 030829 1280 14 05 1 306438148 12 1160 + 030830 1280 14 06 1 306438148 13 1160 + 030831 1280 14 07 1 306438148 14 1160 + 030832 1280 14 08 1 306438148 15 1160 + 030833 1280 15 01 1 306438152 00 1161 + 030834 1280 15 02 1 306438152 01 1161 + 030835 1280 15 03 1 306438152 02 1161 + 030836 1280 15 04 1 306438152 03 1161 + 030837 1280 15 05 1 306438152 04 1161 + 030838 1280 15 06 1 306438152 05 1161 + 030839 1280 15 07 1 306438152 06 1161 + 030840 1280 15 08 1 306438152 07 1161 + 030841 1280 16 01 1 306438152 08 1161 + 030842 1280 16 02 1 306438152 09 1161 + 030843 1280 16 03 1 306438152 10 1161 + 030844 1280 16 04 1 306438152 11 1161 + 030845 1280 16 05 1 306438152 12 1161 + 030846 1280 16 06 1 306438152 13 1161 + 030847 1280 16 07 1 306438152 14 1161 + 030848 1280 16 08 1 306438152 15 1161 + 030849 1280 17 01 1 303087620 12 0088 + 030850 1280 17 02 1 303087620 13 0088 + 030851 9999 99 99 0 9999 99 9999 + 030852 9999 99 99 0 9999 99 9999 + 030853 9999 99 99 0 9999 99 9999 + 030854 9999 99 99 0 9999 99 9999 + 030855 9999 99 99 0 9999 99 9999 + 030856 9999 99 99 0 9999 99 9999 + 030857 1280 18 01 1 303087620 14 0088 + 030858 1280 18 02 1 303087620 15 0088 + 030859 9999 99 99 0 9999 99 9999 + 030860 9999 99 99 0 9999 99 9999 + 030861 9999 99 99 0 9999 99 9999 + 030862 9999 99 99 0 9999 99 9999 + 030863 9999 99 99 0 9999 99 9999 + 030864 9999 99 99 0 9999 99 9999 + 030865 1280 19 01 1 303087620 08 0088 + 030866 1280 19 02 1 303087620 09 0088 + 030867 9999 99 99 0 9999 99 9999 + 030868 9999 99 99 0 9999 99 9999 + 030869 9999 99 99 0 9999 99 9999 + 030870 9999 99 99 0 9999 99 9999 + 030871 9999 99 99 0 9999 99 9999 + 030872 9999 99 99 0 9999 99 9999 + 030873 1280 20 01 1 303087620 10 0088 + 030874 1280 20 02 1 303087620 11 0088 + 030875 9999 99 99 0 9999 99 9999 + 030876 9999 99 99 0 9999 99 9999 + 030877 9999 99 99 0 9999 99 9999 + 030878 9999 99 99 0 9999 99 9999 + 030879 9999 99 99 0 9999 99 9999 + 030880 9999 99 99 0 9999 99 9999 + 030881 1280 21 01 1 303087620 00 0088 + 030882 1280 21 02 1 303087620 01 0088 + 030883 9999 99 99 0 9999 99 9999 + 030884 9999 99 99 0 9999 99 9999 + 030885 9999 99 99 0 9999 99 9999 + 030886 9999 99 99 0 9999 99 9999 + 030887 9999 99 99 0 9999 99 9999 + 030888 9999 99 99 0 9999 99 9999 + 030889 1280 22 01 1 303087620 02 0088 + 030890 1280 22 02 1 303087620 03 0088 + 030891 9999 99 99 0 9999 99 9999 + 030892 9999 99 99 0 9999 99 9999 + 030893 9999 99 99 0 9999 99 9999 + 030894 9999 99 99 0 9999 99 9999 + 030895 9999 99 99 0 9999 99 9999 + 030896 9999 99 99 0 9999 99 9999 + 030897 1280 23 01 1 303087620 04 0088 + 030898 1280 23 02 1 303087620 05 0088 + 030899 9999 99 99 0 9999 99 9999 + 030900 9999 99 99 0 9999 99 9999 + 030901 9999 99 99 0 9999 99 9999 + 030902 9999 99 99 0 9999 99 9999 + 030903 9999 99 99 0 9999 99 9999 + 030904 9999 99 99 0 9999 99 9999 + 030905 1280 24 01 1 303087620 06 0088 + 030906 1280 24 02 1 303087620 07 0088 + 030907 9999 99 99 0 9999 99 9999 + 030908 9999 99 99 0 9999 99 9999 + 030909 9999 99 99 0 9999 99 9999 + 030910 9999 99 99 0 9999 99 9999 + 030911 9999 99 99 0 9999 99 9999 + 030912 9999 99 99 0 9999 99 9999 + 030913 1280 25 01 1 305315848 00 0665 + 030914 1280 25 02 1 305315848 01 0665 + 030915 1280 25 03 1 305315848 02 0665 + 030916 1280 25 04 1 305315848 03 0665 + 030917 1280 25 05 1 305315848 04 0665 + 030918 1280 25 06 1 305315848 05 0665 + 030919 1280 25 07 1 305315848 06 0665 + 030920 1280 25 08 1 305315848 07 0665 + 030921 1280 26 01 1 305315848 08 0665 + 030922 1280 26 02 1 305315848 09 0665 + 030923 1280 26 03 1 305315848 10 0665 + 030924 1280 26 04 1 305315848 11 0665 + 030925 1280 26 05 1 305315848 12 0665 + 030926 1280 26 06 1 305315848 13 0665 + 030927 1280 26 07 1 305315848 14 0665 + 030928 1280 26 08 1 305315848 15 0665 + 030929 1280 27 01 1 305315844 00 0664 + 030930 1280 27 02 1 305315844 01 0664 + 030931 1280 27 03 1 305315844 02 0664 + 030932 1280 27 04 1 305315844 03 0664 + 030933 1280 27 05 1 305315844 04 0664 + 030934 1280 27 06 1 305315844 05 0664 + 030935 1280 27 07 1 305315844 06 0664 + 030936 1280 27 08 1 305315844 07 0664 + 030937 1280 28 01 1 305315844 08 0664 + 030938 1280 28 02 1 305315844 09 0664 + 030939 1280 28 03 1 305315844 10 0664 + 030940 1280 28 04 1 305315844 11 0664 + 030941 1280 28 05 1 305315844 12 0664 + 030942 1280 28 06 1 305315844 13 0664 + 030943 1280 28 07 1 305315844 14 0664 + 030944 1280 28 08 1 305315844 15 0664 + 030945 1280 29 01 1 305315856 00 0667 + 030946 1280 29 02 1 305315856 01 0667 + 030947 1280 29 03 1 305315856 02 0667 + 030948 1280 29 04 1 305315856 03 0667 + 030949 1280 29 05 1 305315856 04 0667 + 030950 1280 29 06 1 305315856 05 0667 + 030951 1280 29 07 1 305315856 06 0667 + 030952 1280 29 08 1 305315856 07 0667 + 030953 1280 30 01 1 305315856 08 0667 + 030954 1280 30 02 1 305315856 09 0667 + 030955 1280 30 03 1 305315856 10 0667 + 030956 1280 30 04 1 305315856 11 0667 + 030957 1280 30 05 1 305315856 12 0667 + 030958 1280 30 06 1 305315856 13 0667 + 030959 1280 30 07 1 305315856 14 0667 + 030960 1280 30 08 1 305315856 15 0667 + 030961 1280 31 01 1 305315852 00 0666 + 030962 1280 31 02 1 305315852 01 0666 + 030963 1280 31 03 1 305315852 02 0666 + 030964 1280 31 04 1 305315852 03 0666 + 030965 1280 31 05 1 305315852 04 0666 + 030966 1280 31 06 1 305315852 05 0666 + 030967 1280 31 07 1 305315852 06 0666 + 030968 1280 31 08 1 305315852 07 0666 + 030969 1280 32 01 1 305315852 08 0666 + 030970 1280 32 02 1 305315852 09 0666 + 030971 1280 32 03 1 305315852 10 0666 + 030972 1280 32 04 1 305315852 11 0666 + 030973 1280 32 05 1 305315852 12 0666 + 030974 1280 32 06 1 305315852 13 0666 + 030975 1280 32 07 1 305315852 14 0666 + 030976 1280 32 08 1 305315852 15 0666 + 030977 1280 33 01 1 306434060 00 1154 + 030978 1280 33 02 1 306434060 01 1154 + 030979 1280 33 03 1 306434060 02 1154 + 030980 1280 33 04 1 306434060 03 1154 + 030981 1280 33 05 1 306434060 04 1154 + 030982 1280 33 06 1 306434060 05 1154 + 030983 1280 33 07 1 306434060 06 1154 + 030984 1280 33 08 1 306434060 07 1154 + 030985 1280 34 01 1 306434060 08 1154 + 030986 1280 34 02 1 306434060 09 1154 + 030987 1280 34 03 1 306434060 10 1154 + 030988 1280 34 04 1 306434060 11 1154 + 030989 1280 34 05 1 306434060 12 1154 + 030990 1280 34 06 1 306434060 13 1154 + 030991 1280 34 07 1 306434060 14 1154 + 030992 1280 34 08 1 306434060 15 1154 + 030993 1280 35 01 1 306434064 00 1155 + 030994 1280 35 02 1 306434064 01 1155 + 030995 1280 35 03 1 306434064 02 1155 + 030996 1280 35 04 1 306434064 03 1155 + 030997 1280 35 05 1 306434064 04 1155 + 030998 1280 35 06 1 306434064 05 1155 + 030999 1280 35 07 1 306434064 06 1155 + 031000 1280 35 08 1 306434064 07 1155 + 031001 1280 36 01 1 306434064 08 1155 + 031002 1280 36 02 1 306434064 09 1155 + 031003 1280 36 03 1 306434064 10 1155 + 031004 1280 36 04 1 306434064 11 1155 + 031005 1280 36 05 1 306434064 12 1155 + 031006 1280 36 06 1 306434064 13 1155 + 031007 1280 36 07 1 306434064 14 1155 + 031008 1280 36 08 1 306434064 15 1155 + 031009 1280 37 01 1 306434052 00 1152 + 031010 1280 37 02 1 306434052 01 1152 + 031011 1280 37 03 1 306434052 02 1152 + 031012 1280 37 04 1 306434052 03 1152 + 031013 1280 37 05 1 306434052 04 1152 + 031014 1280 37 06 1 306434052 05 1152 + 031015 1280 37 07 1 306434052 06 1152 + 031016 1280 37 08 1 306434052 07 1152 + 031017 1280 38 01 1 306434052 08 1152 + 031018 1280 38 02 1 306434052 09 1152 + 031019 1280 38 03 1 306434052 10 1152 + 031020 1280 38 04 1 306434052 11 1152 + 031021 1280 38 05 1 306434052 12 1152 + 031022 1280 38 06 1 306434052 13 1152 + 031023 1280 38 07 1 306434052 14 1152 + 031024 1280 38 08 1 306434052 15 1152 + 031025 1280 39 01 1 306434056 00 1153 + 031026 1280 39 02 1 306434056 01 1153 + 031027 1280 39 03 1 306434056 02 1153 + 031028 1280 39 04 1 306434056 03 1153 + 031029 1280 39 05 1 306434056 04 1153 + 031030 1280 39 06 1 306434056 05 1153 + 031031 1280 39 07 1 306434056 06 1153 + 031032 1280 39 08 1 306434056 07 1153 + 031033 1280 40 01 1 306434056 08 1153 + 031034 1280 40 02 1 306434056 09 1153 + 031035 1280 40 03 1 306434056 10 1153 + 031036 1280 40 04 1 306434056 11 1153 + 031037 1280 40 05 1 306434056 12 1153 + 031038 1280 40 06 1 306434056 13 1153 + 031039 1280 40 07 1 306434056 14 1153 + 031040 1280 40 08 1 306434056 15 1153 + 031041 1280 41 01 1 304197636 08 0304 + 031042 1280 41 02 1 304197636 09 0304 + 031043 1280 41 03 1 304197636 10 0304 + 031044 1280 41 04 1 304197636 11 0304 + 031045 9999 99 99 0 9999 99 9999 + 031046 9999 99 99 0 9999 99 9999 + 031047 9999 99 99 0 9999 99 9999 + 031048 9999 99 99 0 9999 99 9999 + 031049 1280 42 01 1 304197636 12 0304 + 031050 1280 42 02 1 304197636 13 0304 + 031051 1280 42 03 1 304197636 14 0304 + 031052 1280 42 04 1 304197636 15 0304 + 031053 9999 99 99 0 9999 99 9999 + 031054 9999 99 99 0 9999 99 9999 + 031055 9999 99 99 0 9999 99 9999 + 031056 9999 99 99 0 9999 99 9999 + 031057 1280 43 01 1 304197636 00 0304 + 031058 1280 43 02 1 304197636 01 0304 + 031059 1280 43 03 1 304197636 02 0304 + 031060 1280 43 04 1 304197636 03 0304 + 031061 9999 99 99 0 9999 99 9999 + 031062 9999 99 99 0 9999 99 9999 + 031063 9999 99 99 0 9999 99 9999 + 031064 9999 99 99 0 9999 99 9999 + 031065 1280 44 01 1 304197636 04 0304 + 031066 1280 44 02 1 304197636 05 0304 + 031067 1280 44 03 1 304197636 06 0304 + 031068 1280 44 04 1 304197636 07 0304 + 031069 9999 99 99 0 9999 99 9999 + 031070 9999 99 99 0 9999 99 9999 + 031071 9999 99 99 0 9999 99 9999 + 031072 9999 99 99 0 9999 99 9999 + 031073 1280 45 01 1 304197640 08 0305 + 031074 1280 45 02 1 304197640 09 0305 + 031075 1280 45 03 1 304197640 10 0305 + 031076 1280 45 04 1 304197640 11 0305 + 031077 9999 99 99 0 9999 99 9999 + 031078 9999 99 99 0 9999 99 9999 + 031079 9999 99 99 0 9999 99 9999 + 031080 9999 99 99 0 9999 99 9999 + 031081 1280 46 01 1 304197640 12 0305 + 031082 1280 46 02 1 304197640 13 0305 + 031083 1280 46 03 1 304197640 14 0305 + 031084 1280 46 04 1 304197640 15 0305 + 031085 9999 99 99 0 9999 99 9999 + 031086 9999 99 99 0 9999 99 9999 + 031087 9999 99 99 0 9999 99 9999 + 031088 9999 99 99 0 9999 99 9999 + 031089 1280 47 01 1 304197640 00 0305 + 031090 1280 47 02 1 304197640 01 0305 + 031091 1280 47 03 1 304197640 02 0305 + 031092 1280 47 04 1 304197640 03 0305 + 031093 9999 99 99 0 9999 99 9999 + 031094 9999 99 99 0 9999 99 9999 + 031095 9999 99 99 0 9999 99 9999 + 031096 9999 99 99 0 9999 99 9999 + 031097 1280 48 01 1 304197640 04 0305 + 031098 1280 48 02 1 304197640 05 0305 + 031099 1280 48 03 1 304197640 06 0305 + 031100 1280 48 04 1 304197640 07 0305 + 031101 9999 99 99 0 9999 99 9999 + 031102 9999 99 99 0 9999 99 9999 + 031103 9999 99 99 0 9999 99 9999 + 031104 9999 99 99 0 9999 99 9999 + 031105 1281 01 01 1 305311752 00 0657 + 031106 1281 01 02 1 305311752 01 0657 + 031107 1281 01 03 1 305311752 02 0657 + 031108 1281 01 04 1 305311752 03 0657 + 031109 1281 01 05 1 305311752 04 0657 + 031110 1281 01 06 1 305311752 05 0657 + 031111 1281 01 07 1 305311752 06 0657 + 031112 1281 01 08 1 305311752 07 0657 + 031113 1281 02 01 1 305311752 08 0657 + 031114 1281 02 02 1 305311752 09 0657 + 031115 1281 02 03 1 305311752 10 0657 + 031116 1281 02 04 1 305311752 11 0657 + 031117 1281 02 05 1 305311752 12 0657 + 031118 1281 02 06 1 305311752 13 0657 + 031119 1281 02 07 1 305311752 14 0657 + 031120 1281 02 08 1 305311752 15 0657 + 031121 1281 03 01 1 305311748 00 0656 + 031122 1281 03 02 1 305311748 01 0656 + 031123 1281 03 03 1 305311748 02 0656 + 031124 1281 03 04 1 305311748 03 0656 + 031125 1281 03 05 1 305311748 04 0656 + 031126 1281 03 06 1 305311748 05 0656 + 031127 1281 03 07 1 305311748 06 0656 + 031128 1281 03 08 1 305311748 07 0656 + 031129 1281 04 01 1 305311748 08 0656 + 031130 1281 04 02 1 305311748 09 0656 + 031131 1281 04 03 1 305311748 10 0656 + 031132 1281 04 04 1 305311748 11 0656 + 031133 1281 04 05 1 305311748 12 0656 + 031134 1281 04 06 1 305311748 13 0656 + 031135 1281 04 07 1 305311748 14 0656 + 031136 1281 04 08 1 305311748 15 0656 + 031137 1281 05 01 1 305311760 00 0659 + 031138 1281 05 02 1 305311760 01 0659 + 031139 1281 05 03 1 305311760 02 0659 + 031140 1281 05 04 1 305311760 03 0659 + 031141 1281 05 05 1 305311760 04 0659 + 031142 1281 05 06 1 305311760 05 0659 + 031143 1281 05 07 1 305311760 06 0659 + 031144 1281 05 08 1 305311760 07 0659 + 031145 1281 06 01 1 305311760 08 0659 + 031146 1281 06 02 1 305311760 09 0659 + 031147 1281 06 03 1 305311760 10 0659 + 031148 1281 06 04 1 305311760 11 0659 + 031149 1281 06 05 1 305311760 12 0659 + 031150 1281 06 06 1 305311760 13 0659 + 031151 1281 06 07 1 305311760 14 0659 + 031152 1281 06 08 1 305311760 15 0659 + 031153 1281 07 01 1 305311756 00 0658 + 031154 1281 07 02 1 305311756 01 0658 + 031155 1281 07 03 1 305311756 02 0658 + 031156 1281 07 04 1 305311756 03 0658 + 031157 1281 07 05 1 305311756 04 0658 + 031158 1281 07 06 1 305311756 05 0658 + 031159 1281 07 07 1 305311756 06 0658 + 031160 1281 07 08 1 305311756 07 0658 + 031161 1281 08 01 1 305311756 08 0658 + 031162 1281 08 02 1 305311756 09 0658 + 031163 1281 08 03 1 305311756 10 0658 + 031164 1281 08 04 1 305311756 11 0658 + 031165 1281 08 05 1 305311756 12 0658 + 031166 1281 08 06 1 305311756 13 0658 + 031167 1281 08 07 1 305311756 14 0658 + 031168 1281 08 08 1 305311756 15 0658 + 031169 1281 09 01 1 305307660 00 0650 + 031170 1281 09 02 1 305307660 01 0650 + 031171 1281 09 03 1 305307660 02 0650 + 031172 1281 09 04 1 305307660 03 0650 + 031173 1281 09 05 1 305307660 04 0650 + 031174 1281 09 06 1 305307660 05 0650 + 031175 1281 09 07 1 305307660 06 0650 + 031176 1281 09 08 1 305307660 07 0650 + 031177 1281 10 01 1 305307660 08 0650 + 031178 1281 10 02 1 305307660 09 0650 + 031179 1281 10 03 1 305307660 10 0650 + 031180 1281 10 04 1 305307660 11 0650 + 031181 1281 10 05 1 305307660 12 0650 + 031182 1281 10 06 1 305307660 13 0650 + 031183 1281 10 07 1 305307660 14 0650 + 031184 1281 10 08 1 305307660 15 0650 + 031185 1281 11 01 1 305307664 00 0651 + 031186 1281 11 02 1 305307664 01 0651 + 031187 1281 11 03 1 305307664 02 0651 + 031188 1281 11 04 1 305307664 03 0651 + 031189 1281 11 05 1 305307664 04 0651 + 031190 1281 11 06 1 305307664 05 0651 + 031191 1281 11 07 1 305307664 06 0651 + 031192 1281 11 08 1 305307664 07 0651 + 031193 1281 12 01 1 305307664 08 0651 + 031194 1281 12 02 1 305307664 09 0651 + 031195 1281 12 03 1 305307664 10 0651 + 031196 1281 12 04 1 305307664 11 0651 + 031197 1281 12 05 1 305307664 12 0651 + 031198 1281 12 06 1 305307664 13 0651 + 031199 1281 12 07 1 305307664 14 0651 + 031200 1281 12 08 1 305307664 15 0651 + 031201 1281 13 01 1 305307652 00 0648 + 031202 1281 13 02 1 305307652 01 0648 + 031203 1281 13 03 1 305307652 02 0648 + 031204 1281 13 04 1 305307652 03 0648 + 031205 1281 13 05 1 305307652 04 0648 + 031206 1281 13 06 1 305307652 05 0648 + 031207 1281 13 07 1 305307652 06 0648 + 031208 1281 13 08 1 305307652 07 0648 + 031209 1281 14 01 1 305307652 08 0648 + 031210 1281 14 02 1 305307652 09 0648 + 031211 1281 14 03 1 305307652 10 0648 + 031212 1281 14 04 1 305307652 11 0648 + 031213 1281 14 05 1 305307652 12 0648 + 031214 1281 14 06 1 305307652 13 0648 + 031215 1281 14 07 1 305307652 14 0648 + 031216 1281 14 08 1 305307652 15 0648 + 031217 1281 15 01 1 305307656 00 0649 + 031218 1281 15 02 1 305307656 01 0649 + 031219 1281 15 03 1 305307656 02 0649 + 031220 1281 15 04 1 305307656 03 0649 + 031221 1281 15 05 1 305307656 04 0649 + 031222 1281 15 06 1 305307656 05 0649 + 031223 1281 15 07 1 305307656 06 0649 + 031224 1281 15 08 1 305307656 07 0649 + 031225 1281 16 01 1 305307656 08 0649 + 031226 1281 16 02 1 305307656 09 0649 + 031227 1281 16 03 1 305307656 10 0649 + 031228 1281 16 04 1 305307656 11 0649 + 031229 1281 16 05 1 305307656 12 0649 + 031230 1281 16 06 1 305307656 13 0649 + 031231 1281 16 07 1 305307656 14 0649 + 031232 1281 16 08 1 305307656 15 0649 + 031233 9999 99 99 0 9999 99 9999 + 031234 9999 99 99 0 9999 99 9999 + 031235 9999 99 99 0 9999 99 9999 + 031236 9999 99 99 0 9999 99 9999 + 031237 9999 99 99 0 9999 99 9999 + 031238 9999 99 99 0 9999 99 9999 + 031239 9999 99 99 0 9999 99 9999 + 031240 9999 99 99 0 9999 99 9999 + 031241 9999 99 99 0 9999 99 9999 + 031242 9999 99 99 0 9999 99 9999 + 031243 9999 99 99 0 9999 99 9999 + 031244 9999 99 99 0 9999 99 9999 + 031245 9999 99 99 0 9999 99 9999 + 031246 9999 99 99 0 9999 99 9999 + 031247 9999 99 99 0 9999 99 9999 + 031248 9999 99 99 0 9999 99 9999 + 031249 9999 99 99 0 9999 99 9999 + 031250 9999 99 99 0 9999 99 9999 + 031251 9999 99 99 0 9999 99 9999 + 031252 9999 99 99 0 9999 99 9999 + 031253 9999 99 99 0 9999 99 9999 + 031254 9999 99 99 0 9999 99 9999 + 031255 9999 99 99 0 9999 99 9999 + 031256 9999 99 99 0 9999 99 9999 + 031257 9999 99 99 0 9999 99 9999 + 031258 9999 99 99 0 9999 99 9999 + 031259 9999 99 99 0 9999 99 9999 + 031260 9999 99 99 0 9999 99 9999 + 031261 9999 99 99 0 9999 99 9999 + 031262 9999 99 99 0 9999 99 9999 + 031263 9999 99 99 0 9999 99 9999 + 031264 9999 99 99 0 9999 99 9999 + 031265 9999 99 99 0 9999 99 9999 + 031266 9999 99 99 0 9999 99 9999 + 031267 9999 99 99 0 9999 99 9999 + 031268 9999 99 99 0 9999 99 9999 + 031269 9999 99 99 0 9999 99 9999 + 031270 9999 99 99 0 9999 99 9999 + 031271 9999 99 99 0 9999 99 9999 + 031272 9999 99 99 0 9999 99 9999 + 031273 9999 99 99 0 9999 99 9999 + 031274 9999 99 99 0 9999 99 9999 + 031275 9999 99 99 0 9999 99 9999 + 031276 9999 99 99 0 9999 99 9999 + 031277 9999 99 99 0 9999 99 9999 + 031278 9999 99 99 0 9999 99 9999 + 031279 9999 99 99 0 9999 99 9999 + 031280 9999 99 99 0 9999 99 9999 + 031281 9999 99 99 0 9999 99 9999 + 031282 9999 99 99 0 9999 99 9999 + 031283 9999 99 99 0 9999 99 9999 + 031284 9999 99 99 0 9999 99 9999 + 031285 9999 99 99 0 9999 99 9999 + 031286 9999 99 99 0 9999 99 9999 + 031287 9999 99 99 0 9999 99 9999 + 031288 9999 99 99 0 9999 99 9999 + 031289 9999 99 99 0 9999 99 9999 + 031290 9999 99 99 0 9999 99 9999 + 031291 9999 99 99 0 9999 99 9999 + 031292 9999 99 99 0 9999 99 9999 + 031293 9999 99 99 0 9999 99 9999 + 031294 9999 99 99 0 9999 99 9999 + 031295 9999 99 99 0 9999 99 9999 + 031296 9999 99 99 0 9999 99 9999 + 031297 9999 99 99 0 9999 99 9999 + 031298 9999 99 99 0 9999 99 9999 + 031299 9999 99 99 0 9999 99 9999 + 031300 9999 99 99 0 9999 99 9999 + 031301 9999 99 99 0 9999 99 9999 + 031302 9999 99 99 0 9999 99 9999 + 031303 9999 99 99 0 9999 99 9999 + 031304 9999 99 99 0 9999 99 9999 + 031305 9999 99 99 0 9999 99 9999 + 031306 9999 99 99 0 9999 99 9999 + 031307 9999 99 99 0 9999 99 9999 + 031308 9999 99 99 0 9999 99 9999 + 031309 9999 99 99 0 9999 99 9999 + 031310 9999 99 99 0 9999 99 9999 + 031311 9999 99 99 0 9999 99 9999 + 031312 9999 99 99 0 9999 99 9999 + 031313 9999 99 99 0 9999 99 9999 + 031314 9999 99 99 0 9999 99 9999 + 031315 9999 99 99 0 9999 99 9999 + 031316 9999 99 99 0 9999 99 9999 + 031317 9999 99 99 0 9999 99 9999 + 031318 9999 99 99 0 9999 99 9999 + 031319 9999 99 99 0 9999 99 9999 + 031320 9999 99 99 0 9999 99 9999 + 031321 9999 99 99 0 9999 99 9999 + 031322 9999 99 99 0 9999 99 9999 + 031323 9999 99 99 0 9999 99 9999 + 031324 9999 99 99 0 9999 99 9999 + 031325 9999 99 99 0 9999 99 9999 + 031326 9999 99 99 0 9999 99 9999 + 031327 9999 99 99 0 9999 99 9999 + 031328 9999 99 99 0 9999 99 9999 + 031329 9999 99 99 0 9999 99 9999 + 031330 9999 99 99 0 9999 99 9999 + 031331 9999 99 99 0 9999 99 9999 + 031332 9999 99 99 0 9999 99 9999 + 031333 9999 99 99 0 9999 99 9999 + 031334 9999 99 99 0 9999 99 9999 + 031335 9999 99 99 0 9999 99 9999 + 031336 9999 99 99 0 9999 99 9999 + 031337 9999 99 99 0 9999 99 9999 + 031338 9999 99 99 0 9999 99 9999 + 031339 9999 99 99 0 9999 99 9999 + 031340 9999 99 99 0 9999 99 9999 + 031341 9999 99 99 0 9999 99 9999 + 031342 9999 99 99 0 9999 99 9999 + 031343 9999 99 99 0 9999 99 9999 + 031344 9999 99 99 0 9999 99 9999 + 031345 9999 99 99 0 9999 99 9999 + 031346 9999 99 99 0 9999 99 9999 + 031347 9999 99 99 0 9999 99 9999 + 031348 9999 99 99 0 9999 99 9999 + 031349 9999 99 99 0 9999 99 9999 + 031350 9999 99 99 0 9999 99 9999 + 031351 9999 99 99 0 9999 99 9999 + 031352 9999 99 99 0 9999 99 9999 + 031353 9999 99 99 0 9999 99 9999 + 031354 9999 99 99 0 9999 99 9999 + 031355 9999 99 99 0 9999 99 9999 + 031356 9999 99 99 0 9999 99 9999 + 031357 9999 99 99 0 9999 99 9999 + 031358 9999 99 99 0 9999 99 9999 + 031359 9999 99 99 0 9999 99 9999 + 031360 9999 99 99 0 9999 99 9999 + 031361 9999 99 99 0 9999 99 9999 + 031362 9999 99 99 0 9999 99 9999 + 031363 9999 99 99 0 9999 99 9999 + 031364 9999 99 99 0 9999 99 9999 + 031365 9999 99 99 0 9999 99 9999 + 031366 9999 99 99 0 9999 99 9999 + 031367 9999 99 99 0 9999 99 9999 + 031368 9999 99 99 0 9999 99 9999 + 031369 9999 99 99 0 9999 99 9999 + 031370 9999 99 99 0 9999 99 9999 + 031371 9999 99 99 0 9999 99 9999 + 031372 9999 99 99 0 9999 99 9999 + 031373 9999 99 99 0 9999 99 9999 + 031374 9999 99 99 0 9999 99 9999 + 031375 9999 99 99 0 9999 99 9999 + 031376 9999 99 99 0 9999 99 9999 + 031377 9999 99 99 0 9999 99 9999 + 031378 9999 99 99 0 9999 99 9999 + 031379 9999 99 99 0 9999 99 9999 + 031380 9999 99 99 0 9999 99 9999 + 031381 9999 99 99 0 9999 99 9999 + 031382 9999 99 99 0 9999 99 9999 + 031383 9999 99 99 0 9999 99 9999 + 031384 9999 99 99 0 9999 99 9999 + 031385 9999 99 99 0 9999 99 9999 + 031386 9999 99 99 0 9999 99 9999 + 031387 9999 99 99 0 9999 99 9999 + 031388 9999 99 99 0 9999 99 9999 + 031389 9999 99 99 0 9999 99 9999 + 031390 9999 99 99 0 9999 99 9999 + 031391 9999 99 99 0 9999 99 9999 + 031392 9999 99 99 0 9999 99 9999 + 031393 9999 99 99 0 9999 99 9999 + 031394 9999 99 99 0 9999 99 9999 + 031395 9999 99 99 0 9999 99 9999 + 031396 9999 99 99 0 9999 99 9999 + 031397 9999 99 99 0 9999 99 9999 + 031398 9999 99 99 0 9999 99 9999 + 031399 9999 99 99 0 9999 99 9999 + 031400 9999 99 99 0 9999 99 9999 + 031401 9999 99 99 0 9999 99 9999 + 031402 9999 99 99 0 9999 99 9999 + 031403 9999 99 99 0 9999 99 9999 + 031404 9999 99 99 0 9999 99 9999 + 031405 9999 99 99 0 9999 99 9999 + 031406 9999 99 99 0 9999 99 9999 + 031407 9999 99 99 0 9999 99 9999 + 031408 9999 99 99 0 9999 99 9999 + 031409 9999 99 99 0 9999 99 9999 + 031410 9999 99 99 0 9999 99 9999 + 031411 9999 99 99 0 9999 99 9999 + 031412 9999 99 99 0 9999 99 9999 + 031413 9999 99 99 0 9999 99 9999 + 031414 9999 99 99 0 9999 99 9999 + 031415 9999 99 99 0 9999 99 9999 + 031416 9999 99 99 0 9999 99 9999 + 031417 9999 99 99 0 9999 99 9999 + 031418 9999 99 99 0 9999 99 9999 + 031419 9999 99 99 0 9999 99 9999 + 031420 9999 99 99 0 9999 99 9999 + 031421 9999 99 99 0 9999 99 9999 + 031422 9999 99 99 0 9999 99 9999 + 031423 9999 99 99 0 9999 99 9999 + 031424 9999 99 99 0 9999 99 9999 + 031425 9999 99 99 0 9999 99 9999 + 031426 9999 99 99 0 9999 99 9999 + 031427 9999 99 99 0 9999 99 9999 + 031428 9999 99 99 0 9999 99 9999 + 031429 9999 99 99 0 9999 99 9999 + 031430 9999 99 99 0 9999 99 9999 + 031431 9999 99 99 0 9999 99 9999 + 031432 9999 99 99 0 9999 99 9999 + 031433 9999 99 99 0 9999 99 9999 + 031434 9999 99 99 0 9999 99 9999 + 031435 9999 99 99 0 9999 99 9999 + 031436 9999 99 99 0 9999 99 9999 + 031437 9999 99 99 0 9999 99 9999 + 031438 9999 99 99 0 9999 99 9999 + 031439 9999 99 99 0 9999 99 9999 + 031440 9999 99 99 0 9999 99 9999 + 031441 9999 99 99 0 9999 99 9999 + 031442 9999 99 99 0 9999 99 9999 + 031443 9999 99 99 0 9999 99 9999 + 031444 9999 99 99 0 9999 99 9999 + 031445 9999 99 99 0 9999 99 9999 + 031446 9999 99 99 0 9999 99 9999 + 031447 9999 99 99 0 9999 99 9999 + 031448 9999 99 99 0 9999 99 9999 + 031449 9999 99 99 0 9999 99 9999 + 031450 9999 99 99 0 9999 99 9999 + 031451 9999 99 99 0 9999 99 9999 + 031452 9999 99 99 0 9999 99 9999 + 031453 9999 99 99 0 9999 99 9999 + 031454 9999 99 99 0 9999 99 9999 + 031455 9999 99 99 0 9999 99 9999 + 031456 9999 99 99 0 9999 99 9999 + 031457 9999 99 99 0 9999 99 9999 + 031458 9999 99 99 0 9999 99 9999 + 031459 9999 99 99 0 9999 99 9999 + 031460 9999 99 99 0 9999 99 9999 + 031461 9999 99 99 0 9999 99 9999 + 031462 9999 99 99 0 9999 99 9999 + 031463 9999 99 99 0 9999 99 9999 + 031464 9999 99 99 0 9999 99 9999 + 031465 9999 99 99 0 9999 99 9999 + 031466 9999 99 99 0 9999 99 9999 + 031467 9999 99 99 0 9999 99 9999 + 031468 9999 99 99 0 9999 99 9999 + 031469 9999 99 99 0 9999 99 9999 + 031470 9999 99 99 0 9999 99 9999 + 031471 9999 99 99 0 9999 99 9999 + 031472 9999 99 99 0 9999 99 9999 + 031473 9999 99 99 0 9999 99 9999 + 031474 9999 99 99 0 9999 99 9999 + 031475 9999 99 99 0 9999 99 9999 + 031476 9999 99 99 0 9999 99 9999 + 031477 9999 99 99 0 9999 99 9999 + 031478 9999 99 99 0 9999 99 9999 + 031479 9999 99 99 0 9999 99 9999 + 031480 9999 99 99 0 9999 99 9999 + 031481 9999 99 99 0 9999 99 9999 + 031482 9999 99 99 0 9999 99 9999 + 031483 9999 99 99 0 9999 99 9999 + 031484 9999 99 99 0 9999 99 9999 + 031485 9999 99 99 0 9999 99 9999 + 031486 9999 99 99 0 9999 99 9999 + 031487 9999 99 99 0 9999 99 9999 + 031488 9999 99 99 0 9999 99 9999 + 031489 9999 99 99 0 9999 99 9999 + 031490 9999 99 99 0 9999 99 9999 + 031491 9999 99 99 0 9999 99 9999 + 031492 9999 99 99 0 9999 99 9999 + 031493 9999 99 99 0 9999 99 9999 + 031494 9999 99 99 0 9999 99 9999 + 031495 9999 99 99 0 9999 99 9999 + 031496 9999 99 99 0 9999 99 9999 + 031497 9999 99 99 0 9999 99 9999 + 031498 9999 99 99 0 9999 99 9999 + 031499 9999 99 99 0 9999 99 9999 + 031500 9999 99 99 0 9999 99 9999 + 031501 9999 99 99 0 9999 99 9999 + 031502 9999 99 99 0 9999 99 9999 + 031503 9999 99 99 0 9999 99 9999 + 031504 9999 99 99 0 9999 99 9999 + 031505 9999 99 99 0 9999 99 9999 + 031506 9999 99 99 0 9999 99 9999 + 031507 9999 99 99 0 9999 99 9999 + 031508 9999 99 99 0 9999 99 9999 + 031509 9999 99 99 0 9999 99 9999 + 031510 9999 99 99 0 9999 99 9999 + 031511 9999 99 99 0 9999 99 9999 + 031512 9999 99 99 0 9999 99 9999 + 031513 9999 99 99 0 9999 99 9999 + 031514 9999 99 99 0 9999 99 9999 + 031515 9999 99 99 0 9999 99 9999 + 031516 9999 99 99 0 9999 99 9999 + 031517 9999 99 99 0 9999 99 9999 + 031518 9999 99 99 0 9999 99 9999 + 031519 9999 99 99 0 9999 99 9999 + 031520 9999 99 99 0 9999 99 9999 + 031521 9999 99 99 0 9999 99 9999 + 031522 9999 99 99 0 9999 99 9999 + 031523 9999 99 99 0 9999 99 9999 + 031524 9999 99 99 0 9999 99 9999 + 031525 9999 99 99 0 9999 99 9999 + 031526 9999 99 99 0 9999 99 9999 + 031527 9999 99 99 0 9999 99 9999 + 031528 9999 99 99 0 9999 99 9999 + 031529 9999 99 99 0 9999 99 9999 + 031530 9999 99 99 0 9999 99 9999 + 031531 9999 99 99 0 9999 99 9999 + 031532 9999 99 99 0 9999 99 9999 + 031533 9999 99 99 0 9999 99 9999 + 031534 9999 99 99 0 9999 99 9999 + 031535 9999 99 99 0 9999 99 9999 + 031536 9999 99 99 0 9999 99 9999 + 031537 9999 99 99 0 9999 99 9999 + 031538 9999 99 99 0 9999 99 9999 + 031539 9999 99 99 0 9999 99 9999 + 031540 9999 99 99 0 9999 99 9999 + 031541 9999 99 99 0 9999 99 9999 + 031542 9999 99 99 0 9999 99 9999 + 031543 9999 99 99 0 9999 99 9999 + 031544 9999 99 99 0 9999 99 9999 + 031545 9999 99 99 0 9999 99 9999 + 031546 9999 99 99 0 9999 99 9999 + 031547 9999 99 99 0 9999 99 9999 + 031548 9999 99 99 0 9999 99 9999 + 031549 9999 99 99 0 9999 99 9999 + 031550 9999 99 99 0 9999 99 9999 + 031551 9999 99 99 0 9999 99 9999 + 031552 9999 99 99 0 9999 99 9999 + 031553 9999 99 99 0 9999 99 9999 + 031554 9999 99 99 0 9999 99 9999 + 031555 9999 99 99 0 9999 99 9999 + 031556 9999 99 99 0 9999 99 9999 + 031557 9999 99 99 0 9999 99 9999 + 031558 9999 99 99 0 9999 99 9999 + 031559 9999 99 99 0 9999 99 9999 + 031560 9999 99 99 0 9999 99 9999 + 031561 9999 99 99 0 9999 99 9999 + 031562 9999 99 99 0 9999 99 9999 + 031563 9999 99 99 0 9999 99 9999 + 031564 9999 99 99 0 9999 99 9999 + 031565 9999 99 99 0 9999 99 9999 + 031566 9999 99 99 0 9999 99 9999 + 031567 9999 99 99 0 9999 99 9999 + 031568 9999 99 99 0 9999 99 9999 + 031569 9999 99 99 0 9999 99 9999 + 031570 9999 99 99 0 9999 99 9999 + 031571 9999 99 99 0 9999 99 9999 + 031572 9999 99 99 0 9999 99 9999 + 031573 9999 99 99 0 9999 99 9999 + 031574 9999 99 99 0 9999 99 9999 + 031575 9999 99 99 0 9999 99 9999 + 031576 9999 99 99 0 9999 99 9999 + 031577 9999 99 99 0 9999 99 9999 + 031578 9999 99 99 0 9999 99 9999 + 031579 9999 99 99 0 9999 99 9999 + 031580 9999 99 99 0 9999 99 9999 + 031581 9999 99 99 0 9999 99 9999 + 031582 9999 99 99 0 9999 99 9999 + 031583 9999 99 99 0 9999 99 9999 + 031584 9999 99 99 0 9999 99 9999 + 031585 9999 99 99 0 9999 99 9999 + 031586 9999 99 99 0 9999 99 9999 + 031587 9999 99 99 0 9999 99 9999 + 031588 9999 99 99 0 9999 99 9999 + 031589 9999 99 99 0 9999 99 9999 + 031590 9999 99 99 0 9999 99 9999 + 031591 9999 99 99 0 9999 99 9999 + 031592 9999 99 99 0 9999 99 9999 + 031593 9999 99 99 0 9999 99 9999 + 031594 9999 99 99 0 9999 99 9999 + 031595 9999 99 99 0 9999 99 9999 + 031596 9999 99 99 0 9999 99 9999 + 031597 9999 99 99 0 9999 99 9999 + 031598 9999 99 99 0 9999 99 9999 + 031599 9999 99 99 0 9999 99 9999 + 031600 9999 99 99 0 9999 99 9999 + 031601 9999 99 99 0 9999 99 9999 + 031602 9999 99 99 0 9999 99 9999 + 031603 9999 99 99 0 9999 99 9999 + 031604 9999 99 99 0 9999 99 9999 + 031605 9999 99 99 0 9999 99 9999 + 031606 9999 99 99 0 9999 99 9999 + 031607 9999 99 99 0 9999 99 9999 + 031608 9999 99 99 0 9999 99 9999 + 031609 9999 99 99 0 9999 99 9999 + 031610 9999 99 99 0 9999 99 9999 + 031611 9999 99 99 0 9999 99 9999 + 031612 9999 99 99 0 9999 99 9999 + 031613 9999 99 99 0 9999 99 9999 + 031614 9999 99 99 0 9999 99 9999 + 031615 9999 99 99 0 9999 99 9999 + 031616 9999 99 99 0 9999 99 9999 + 031617 9999 99 99 0 9999 99 9999 + 031618 9999 99 99 0 9999 99 9999 + 031619 9999 99 99 0 9999 99 9999 + 031620 9999 99 99 0 9999 99 9999 + 031621 9999 99 99 0 9999 99 9999 + 031622 9999 99 99 0 9999 99 9999 + 031623 9999 99 99 0 9999 99 9999 + 031624 9999 99 99 0 9999 99 9999 + 031625 9999 99 99 0 9999 99 9999 + 031626 9999 99 99 0 9999 99 9999 + 031627 9999 99 99 0 9999 99 9999 + 031628 9999 99 99 0 9999 99 9999 + 031629 9999 99 99 0 9999 99 9999 + 031630 9999 99 99 0 9999 99 9999 + 031631 9999 99 99 0 9999 99 9999 + 031632 9999 99 99 0 9999 99 9999 + 031633 9999 99 99 0 9999 99 9999 + 031634 9999 99 99 0 9999 99 9999 + 031635 9999 99 99 0 9999 99 9999 + 031636 9999 99 99 0 9999 99 9999 + 031637 9999 99 99 0 9999 99 9999 + 031638 9999 99 99 0 9999 99 9999 + 031639 9999 99 99 0 9999 99 9999 + 031640 9999 99 99 0 9999 99 9999 + 031641 9999 99 99 0 9999 99 9999 + 031642 9999 99 99 0 9999 99 9999 + 031643 9999 99 99 0 9999 99 9999 + 031644 9999 99 99 0 9999 99 9999 + 031645 9999 99 99 0 9999 99 9999 + 031646 9999 99 99 0 9999 99 9999 + 031647 9999 99 99 0 9999 99 9999 + 031648 9999 99 99 0 9999 99 9999 + 031649 9999 99 99 0 9999 99 9999 + 031650 9999 99 99 0 9999 99 9999 + 031651 9999 99 99 0 9999 99 9999 + 031652 9999 99 99 0 9999 99 9999 + 031653 9999 99 99 0 9999 99 9999 + 031654 9999 99 99 0 9999 99 9999 + 031655 9999 99 99 0 9999 99 9999 + 031656 9999 99 99 0 9999 99 9999 + 031657 9999 99 99 0 9999 99 9999 + 031658 9999 99 99 0 9999 99 9999 + 031659 9999 99 99 0 9999 99 9999 + 031660 9999 99 99 0 9999 99 9999 + 031661 9999 99 99 0 9999 99 9999 + 031662 9999 99 99 0 9999 99 9999 + 031663 9999 99 99 0 9999 99 9999 + 031664 9999 99 99 0 9999 99 9999 + 031665 9999 99 99 0 9999 99 9999 + 031666 9999 99 99 0 9999 99 9999 + 031667 9999 99 99 0 9999 99 9999 + 031668 9999 99 99 0 9999 99 9999 + 031669 9999 99 99 0 9999 99 9999 + 031670 9999 99 99 0 9999 99 9999 + 031671 9999 99 99 0 9999 99 9999 + 031672 9999 99 99 0 9999 99 9999 + 031673 9999 99 99 0 9999 99 9999 + 031674 9999 99 99 0 9999 99 9999 + 031675 9999 99 99 0 9999 99 9999 + 031676 9999 99 99 0 9999 99 9999 + 031677 9999 99 99 0 9999 99 9999 + 031678 9999 99 99 0 9999 99 9999 + 031679 9999 99 99 0 9999 99 9999 + 031680 9999 99 99 0 9999 99 9999 + 031681 9999 99 99 0 9999 99 9999 + 031682 9999 99 99 0 9999 99 9999 + 031683 9999 99 99 0 9999 99 9999 + 031684 9999 99 99 0 9999 99 9999 + 031685 9999 99 99 0 9999 99 9999 + 031686 9999 99 99 0 9999 99 9999 + 031687 9999 99 99 0 9999 99 9999 + 031688 9999 99 99 0 9999 99 9999 + 031689 9999 99 99 0 9999 99 9999 + 031690 9999 99 99 0 9999 99 9999 + 031691 9999 99 99 0 9999 99 9999 + 031692 9999 99 99 0 9999 99 9999 + 031693 9999 99 99 0 9999 99 9999 + 031694 9999 99 99 0 9999 99 9999 + 031695 9999 99 99 0 9999 99 9999 + 031696 9999 99 99 0 9999 99 9999 + 031697 9999 99 99 0 9999 99 9999 + 031698 9999 99 99 0 9999 99 9999 + 031699 9999 99 99 0 9999 99 9999 + 031700 9999 99 99 0 9999 99 9999 + 031701 9999 99 99 0 9999 99 9999 + 031702 9999 99 99 0 9999 99 9999 + 031703 9999 99 99 0 9999 99 9999 + 031704 9999 99 99 0 9999 99 9999 + 031705 9999 99 99 0 9999 99 9999 + 031706 9999 99 99 0 9999 99 9999 + 031707 9999 99 99 0 9999 99 9999 + 031708 9999 99 99 0 9999 99 9999 + 031709 9999 99 99 0 9999 99 9999 + 031710 9999 99 99 0 9999 99 9999 + 031711 9999 99 99 0 9999 99 9999 + 031712 9999 99 99 0 9999 99 9999 + 031713 9999 99 99 0 9999 99 9999 + 031714 9999 99 99 0 9999 99 9999 + 031715 9999 99 99 0 9999 99 9999 + 031716 9999 99 99 0 9999 99 9999 + 031717 9999 99 99 0 9999 99 9999 + 031718 9999 99 99 0 9999 99 9999 + 031719 9999 99 99 0 9999 99 9999 + 031720 9999 99 99 0 9999 99 9999 + 031721 9999 99 99 0 9999 99 9999 + 031722 9999 99 99 0 9999 99 9999 + 031723 9999 99 99 0 9999 99 9999 + 031724 9999 99 99 0 9999 99 9999 + 031725 9999 99 99 0 9999 99 9999 + 031726 9999 99 99 0 9999 99 9999 + 031727 9999 99 99 0 9999 99 9999 + 031728 9999 99 99 0 9999 99 9999 + 031729 9999 99 99 0 9999 99 9999 + 031730 9999 99 99 0 9999 99 9999 + 031731 9999 99 99 0 9999 99 9999 + 031732 9999 99 99 0 9999 99 9999 + 031733 9999 99 99 0 9999 99 9999 + 031734 9999 99 99 0 9999 99 9999 + 031735 9999 99 99 0 9999 99 9999 + 031736 9999 99 99 0 9999 99 9999 + 031737 9999 99 99 0 9999 99 9999 + 031738 9999 99 99 0 9999 99 9999 + 031739 9999 99 99 0 9999 99 9999 + 031740 9999 99 99 0 9999 99 9999 + 031741 9999 99 99 0 9999 99 9999 + 031742 9999 99 99 0 9999 99 9999 + 031743 9999 99 99 0 9999 99 9999 + 031744 9999 99 99 0 9999 99 9999 + 031745 9999 99 99 0 9999 99 9999 + 031746 9999 99 99 0 9999 99 9999 + 031747 9999 99 99 0 9999 99 9999 + 031748 9999 99 99 0 9999 99 9999 + 031749 9999 99 99 0 9999 99 9999 + 031750 9999 99 99 0 9999 99 9999 + 031751 9999 99 99 0 9999 99 9999 + 031752 9999 99 99 0 9999 99 9999 + 031753 9999 99 99 0 9999 99 9999 + 031754 9999 99 99 0 9999 99 9999 + 031755 9999 99 99 0 9999 99 9999 + 031756 9999 99 99 0 9999 99 9999 + 031757 9999 99 99 0 9999 99 9999 + 031758 9999 99 99 0 9999 99 9999 + 031759 9999 99 99 0 9999 99 9999 + 031760 9999 99 99 0 9999 99 9999 + 031761 9999 99 99 0 9999 99 9999 + 031762 9999 99 99 0 9999 99 9999 + 031763 9999 99 99 0 9999 99 9999 + 031764 9999 99 99 0 9999 99 9999 + 031765 9999 99 99 0 9999 99 9999 + 031766 9999 99 99 0 9999 99 9999 + 031767 9999 99 99 0 9999 99 9999 + 031768 9999 99 99 0 9999 99 9999 + 031769 9999 99 99 0 9999 99 9999 + 031770 9999 99 99 0 9999 99 9999 + 031771 9999 99 99 0 9999 99 9999 + 031772 9999 99 99 0 9999 99 9999 + 031773 9999 99 99 0 9999 99 9999 + 031774 9999 99 99 0 9999 99 9999 + 031775 9999 99 99 0 9999 99 9999 + 031776 9999 99 99 0 9999 99 9999 + 031777 9999 99 99 0 9999 99 9999 + 031778 9999 99 99 0 9999 99 9999 + 031779 9999 99 99 0 9999 99 9999 + 031780 9999 99 99 0 9999 99 9999 + 031781 9999 99 99 0 9999 99 9999 + 031782 9999 99 99 0 9999 99 9999 + 031783 9999 99 99 0 9999 99 9999 + 031784 9999 99 99 0 9999 99 9999 + 031785 9999 99 99 0 9999 99 9999 + 031786 9999 99 99 0 9999 99 9999 + 031787 9999 99 99 0 9999 99 9999 + 031788 9999 99 99 0 9999 99 9999 + 031789 9999 99 99 0 9999 99 9999 + 031790 9999 99 99 0 9999 99 9999 + 031791 9999 99 99 0 9999 99 9999 + 031792 9999 99 99 0 9999 99 9999 + 031793 9999 99 99 0 9999 99 9999 + 031794 9999 99 99 0 9999 99 9999 + 031795 9999 99 99 0 9999 99 9999 + 031796 9999 99 99 0 9999 99 9999 + 031797 9999 99 99 0 9999 99 9999 + 031798 9999 99 99 0 9999 99 9999 + 031799 9999 99 99 0 9999 99 9999 + 031800 9999 99 99 0 9999 99 9999 + 031801 9999 99 99 0 9999 99 9999 + 031802 9999 99 99 0 9999 99 9999 + 031803 9999 99 99 0 9999 99 9999 + 031804 9999 99 99 0 9999 99 9999 + 031805 9999 99 99 0 9999 99 9999 + 031806 9999 99 99 0 9999 99 9999 + 031807 9999 99 99 0 9999 99 9999 + 031808 9999 99 99 0 9999 99 9999 + 031809 9999 99 99 0 9999 99 9999 + 031810 9999 99 99 0 9999 99 9999 + 031811 9999 99 99 0 9999 99 9999 + 031812 9999 99 99 0 9999 99 9999 + 031813 9999 99 99 0 9999 99 9999 + 031814 9999 99 99 0 9999 99 9999 + 031815 9999 99 99 0 9999 99 9999 + 031816 9999 99 99 0 9999 99 9999 + 031817 9999 99 99 0 9999 99 9999 + 031818 9999 99 99 0 9999 99 9999 + 031819 9999 99 99 0 9999 99 9999 + 031820 9999 99 99 0 9999 99 9999 + 031821 9999 99 99 0 9999 99 9999 + 031822 9999 99 99 0 9999 99 9999 + 031823 9999 99 99 0 9999 99 9999 + 031824 9999 99 99 0 9999 99 9999 + 031825 9999 99 99 0 9999 99 9999 + 031826 9999 99 99 0 9999 99 9999 + 031827 9999 99 99 0 9999 99 9999 + 031828 9999 99 99 0 9999 99 9999 + 031829 9999 99 99 0 9999 99 9999 + 031830 9999 99 99 0 9999 99 9999 + 031831 9999 99 99 0 9999 99 9999 + 031832 9999 99 99 0 9999 99 9999 + 031833 9999 99 99 0 9999 99 9999 + 031834 9999 99 99 0 9999 99 9999 + 031835 9999 99 99 0 9999 99 9999 + 031836 9999 99 99 0 9999 99 9999 + 031837 9999 99 99 0 9999 99 9999 + 031838 9999 99 99 0 9999 99 9999 + 031839 9999 99 99 0 9999 99 9999 + 031840 9999 99 99 0 9999 99 9999 + 031841 9999 99 99 0 9999 99 9999 + 031842 9999 99 99 0 9999 99 9999 + 031843 9999 99 99 0 9999 99 9999 + 031844 9999 99 99 0 9999 99 9999 + 031845 9999 99 99 0 9999 99 9999 + 031846 9999 99 99 0 9999 99 9999 + 031847 9999 99 99 0 9999 99 9999 + 031848 9999 99 99 0 9999 99 9999 + 031849 9999 99 99 0 9999 99 9999 + 031850 9999 99 99 0 9999 99 9999 + 031851 9999 99 99 0 9999 99 9999 + 031852 9999 99 99 0 9999 99 9999 + 031853 9999 99 99 0 9999 99 9999 + 031854 9999 99 99 0 9999 99 9999 + 031855 9999 99 99 0 9999 99 9999 + 031856 9999 99 99 0 9999 99 9999 + 031857 9999 99 99 0 9999 99 9999 + 031858 9999 99 99 0 9999 99 9999 + 031859 9999 99 99 0 9999 99 9999 + 031860 9999 99 99 0 9999 99 9999 + 031861 9999 99 99 0 9999 99 9999 + 031862 9999 99 99 0 9999 99 9999 + 031863 9999 99 99 0 9999 99 9999 + 031864 9999 99 99 0 9999 99 9999 + 031865 9999 99 99 0 9999 99 9999 + 031866 9999 99 99 0 9999 99 9999 + 031867 9999 99 99 0 9999 99 9999 + 031868 9999 99 99 0 9999 99 9999 + 031869 9999 99 99 0 9999 99 9999 + 031870 9999 99 99 0 9999 99 9999 + 031871 9999 99 99 0 9999 99 9999 + 031872 9999 99 99 0 9999 99 9999 + 031873 9999 99 99 0 9999 99 9999 + 031874 9999 99 99 0 9999 99 9999 + 031875 9999 99 99 0 9999 99 9999 + 031876 9999 99 99 0 9999 99 9999 + 031877 9999 99 99 0 9999 99 9999 + 031878 9999 99 99 0 9999 99 9999 + 031879 9999 99 99 0 9999 99 9999 + 031880 9999 99 99 0 9999 99 9999 + 031881 9999 99 99 0 9999 99 9999 + 031882 9999 99 99 0 9999 99 9999 + 031883 9999 99 99 0 9999 99 9999 + 031884 9999 99 99 0 9999 99 9999 + 031885 9999 99 99 0 9999 99 9999 + 031886 9999 99 99 0 9999 99 9999 + 031887 9999 99 99 0 9999 99 9999 + 031888 9999 99 99 0 9999 99 9999 + 031889 9999 99 99 0 9999 99 9999 + 031890 9999 99 99 0 9999 99 9999 + 031891 9999 99 99 0 9999 99 9999 + 031892 9999 99 99 0 9999 99 9999 + 031893 9999 99 99 0 9999 99 9999 + 031894 9999 99 99 0 9999 99 9999 + 031895 9999 99 99 0 9999 99 9999 + 031896 9999 99 99 0 9999 99 9999 + 031897 9999 99 99 0 9999 99 9999 + 031898 9999 99 99 0 9999 99 9999 + 031899 9999 99 99 0 9999 99 9999 + 031900 9999 99 99 0 9999 99 9999 + 031901 9999 99 99 0 9999 99 9999 + 031902 9999 99 99 0 9999 99 9999 + 031903 9999 99 99 0 9999 99 9999 + 031904 9999 99 99 0 9999 99 9999 + 031905 9999 99 99 0 9999 99 9999 + 031906 9999 99 99 0 9999 99 9999 + 031907 9999 99 99 0 9999 99 9999 + 031908 9999 99 99 0 9999 99 9999 + 031909 9999 99 99 0 9999 99 9999 + 031910 9999 99 99 0 9999 99 9999 + 031911 9999 99 99 0 9999 99 9999 + 031912 9999 99 99 0 9999 99 9999 + 031913 9999 99 99 0 9999 99 9999 + 031914 9999 99 99 0 9999 99 9999 + 031915 9999 99 99 0 9999 99 9999 + 031916 9999 99 99 0 9999 99 9999 + 031917 9999 99 99 0 9999 99 9999 + 031918 9999 99 99 0 9999 99 9999 + 031919 9999 99 99 0 9999 99 9999 + 031920 9999 99 99 0 9999 99 9999 + 031921 9999 99 99 0 9999 99 9999 + 031922 9999 99 99 0 9999 99 9999 + 031923 9999 99 99 0 9999 99 9999 + 031924 9999 99 99 0 9999 99 9999 + 031925 9999 99 99 0 9999 99 9999 + 031926 9999 99 99 0 9999 99 9999 + 031927 9999 99 99 0 9999 99 9999 + 031928 9999 99 99 0 9999 99 9999 + 031929 9999 99 99 0 9999 99 9999 + 031930 9999 99 99 0 9999 99 9999 + 031931 9999 99 99 0 9999 99 9999 + 031932 9999 99 99 0 9999 99 9999 + 031933 9999 99 99 0 9999 99 9999 + 031934 9999 99 99 0 9999 99 9999 + 031935 9999 99 99 0 9999 99 9999 + 031936 9999 99 99 0 9999 99 9999 + 031937 9999 99 99 0 9999 99 9999 + 031938 9999 99 99 0 9999 99 9999 + 031939 9999 99 99 0 9999 99 9999 + 031940 9999 99 99 0 9999 99 9999 + 031941 9999 99 99 0 9999 99 9999 + 031942 9999 99 99 0 9999 99 9999 + 031943 9999 99 99 0 9999 99 9999 + 031944 9999 99 99 0 9999 99 9999 + 031945 9999 99 99 0 9999 99 9999 + 031946 9999 99 99 0 9999 99 9999 + 031947 9999 99 99 0 9999 99 9999 + 031948 9999 99 99 0 9999 99 9999 + 031949 9999 99 99 0 9999 99 9999 + 031950 9999 99 99 0 9999 99 9999 + 031951 9999 99 99 0 9999 99 9999 + 031952 9999 99 99 0 9999 99 9999 + 031953 9999 99 99 0 9999 99 9999 + 031954 9999 99 99 0 9999 99 9999 + 031955 9999 99 99 0 9999 99 9999 + 031956 9999 99 99 0 9999 99 9999 + 031957 9999 99 99 0 9999 99 9999 + 031958 9999 99 99 0 9999 99 9999 + 031959 9999 99 99 0 9999 99 9999 + 031960 9999 99 99 0 9999 99 9999 + 031961 9999 99 99 0 9999 99 9999 + 031962 9999 99 99 0 9999 99 9999 + 031963 9999 99 99 0 9999 99 9999 + 031964 9999 99 99 0 9999 99 9999 + 031965 9999 99 99 0 9999 99 9999 + 031966 9999 99 99 0 9999 99 9999 + 031967 9999 99 99 0 9999 99 9999 + 031968 9999 99 99 0 9999 99 9999 + 031969 9999 99 99 0 9999 99 9999 + 031970 9999 99 99 0 9999 99 9999 + 031971 9999 99 99 0 9999 99 9999 + 031972 9999 99 99 0 9999 99 9999 + 031973 9999 99 99 0 9999 99 9999 + 031974 9999 99 99 0 9999 99 9999 + 031975 9999 99 99 0 9999 99 9999 + 031976 9999 99 99 0 9999 99 9999 + 031977 9999 99 99 0 9999 99 9999 + 031978 9999 99 99 0 9999 99 9999 + 031979 9999 99 99 0 9999 99 9999 + 031980 9999 99 99 0 9999 99 9999 + 031981 9999 99 99 0 9999 99 9999 + 031982 9999 99 99 0 9999 99 9999 + 031983 9999 99 99 0 9999 99 9999 + 031984 9999 99 99 0 9999 99 9999 + 031985 9999 99 99 0 9999 99 9999 + 031986 9999 99 99 0 9999 99 9999 + 031987 9999 99 99 0 9999 99 9999 + 031988 9999 99 99 0 9999 99 9999 + 031989 9999 99 99 0 9999 99 9999 + 031990 9999 99 99 0 9999 99 9999 + 031991 9999 99 99 0 9999 99 9999 + 031992 9999 99 99 0 9999 99 9999 + 031993 9999 99 99 0 9999 99 9999 + 031994 9999 99 99 0 9999 99 9999 + 031995 9999 99 99 0 9999 99 9999 + 031996 9999 99 99 0 9999 99 9999 + 031997 9999 99 99 0 9999 99 9999 + 031998 9999 99 99 0 9999 99 9999 + 031999 9999 99 99 0 9999 99 9999 + 032000 9999 99 99 0 9999 99 9999 + 032001 9999 99 99 0 9999 99 9999 + 032002 9999 99 99 0 9999 99 9999 + 032003 9999 99 99 0 9999 99 9999 + 032004 9999 99 99 0 9999 99 9999 + 032005 9999 99 99 0 9999 99 9999 + 032006 9999 99 99 0 9999 99 9999 + 032007 9999 99 99 0 9999 99 9999 + 032008 9999 99 99 0 9999 99 9999 + 032009 9999 99 99 0 9999 99 9999 + 032010 9999 99 99 0 9999 99 9999 + 032011 9999 99 99 0 9999 99 9999 + 032012 9999 99 99 0 9999 99 9999 + 032013 9999 99 99 0 9999 99 9999 + 032014 9999 99 99 0 9999 99 9999 + 032015 9999 99 99 0 9999 99 9999 + 032016 9999 99 99 0 9999 99 9999 + 032017 9999 99 99 0 9999 99 9999 + 032018 9999 99 99 0 9999 99 9999 + 032019 9999 99 99 0 9999 99 9999 + 032020 9999 99 99 0 9999 99 9999 + 032021 9999 99 99 0 9999 99 9999 + 032022 9999 99 99 0 9999 99 9999 + 032023 9999 99 99 0 9999 99 9999 + 032024 9999 99 99 0 9999 99 9999 + 032025 9999 99 99 0 9999 99 9999 + 032026 9999 99 99 0 9999 99 9999 + 032027 9999 99 99 0 9999 99 9999 + 032028 9999 99 99 0 9999 99 9999 + 032029 9999 99 99 0 9999 99 9999 + 032030 9999 99 99 0 9999 99 9999 + 032031 9999 99 99 0 9999 99 9999 + 032032 9999 99 99 0 9999 99 9999 + 032033 9999 99 99 0 9999 99 9999 + 032034 9999 99 99 0 9999 99 9999 + 032035 9999 99 99 0 9999 99 9999 + 032036 9999 99 99 0 9999 99 9999 + 032037 9999 99 99 0 9999 99 9999 + 032038 9999 99 99 0 9999 99 9999 + 032039 9999 99 99 0 9999 99 9999 + 032040 9999 99 99 0 9999 99 9999 + 032041 9999 99 99 0 9999 99 9999 + 032042 9999 99 99 0 9999 99 9999 + 032043 9999 99 99 0 9999 99 9999 + 032044 9999 99 99 0 9999 99 9999 + 032045 9999 99 99 0 9999 99 9999 + 032046 9999 99 99 0 9999 99 9999 + 032047 9999 99 99 0 9999 99 9999 + 032048 9999 99 99 0 9999 99 9999 + 032049 9999 99 99 0 9999 99 9999 + 032050 9999 99 99 0 9999 99 9999 + 032051 9999 99 99 0 9999 99 9999 + 032052 9999 99 99 0 9999 99 9999 + 032053 9999 99 99 0 9999 99 9999 + 032054 9999 99 99 0 9999 99 9999 + 032055 9999 99 99 0 9999 99 9999 + 032056 9999 99 99 0 9999 99 9999 + 032057 9999 99 99 0 9999 99 9999 + 032058 9999 99 99 0 9999 99 9999 + 032059 9999 99 99 0 9999 99 9999 + 032060 9999 99 99 0 9999 99 9999 + 032061 9999 99 99 0 9999 99 9999 + 032062 9999 99 99 0 9999 99 9999 + 032063 9999 99 99 0 9999 99 9999 + 032064 9999 99 99 0 9999 99 9999 + 032065 9999 99 99 0 9999 99 9999 + 032066 9999 99 99 0 9999 99 9999 + 032067 9999 99 99 0 9999 99 9999 + 032068 9999 99 99 0 9999 99 9999 + 032069 9999 99 99 0 9999 99 9999 + 032070 9999 99 99 0 9999 99 9999 + 032071 9999 99 99 0 9999 99 9999 + 032072 9999 99 99 0 9999 99 9999 + 032073 9999 99 99 0 9999 99 9999 + 032074 9999 99 99 0 9999 99 9999 + 032075 9999 99 99 0 9999 99 9999 + 032076 9999 99 99 0 9999 99 9999 + 032077 9999 99 99 0 9999 99 9999 + 032078 9999 99 99 0 9999 99 9999 + 032079 9999 99 99 0 9999 99 9999 + 032080 9999 99 99 0 9999 99 9999 + 032081 9999 99 99 0 9999 99 9999 + 032082 9999 99 99 0 9999 99 9999 + 032083 9999 99 99 0 9999 99 9999 + 032084 9999 99 99 0 9999 99 9999 + 032085 9999 99 99 0 9999 99 9999 + 032086 9999 99 99 0 9999 99 9999 + 032087 9999 99 99 0 9999 99 9999 + 032088 9999 99 99 0 9999 99 9999 + 032089 9999 99 99 0 9999 99 9999 + 032090 9999 99 99 0 9999 99 9999 + 032091 9999 99 99 0 9999 99 9999 + 032092 9999 99 99 0 9999 99 9999 + 032093 9999 99 99 0 9999 99 9999 + 032094 9999 99 99 0 9999 99 9999 + 032095 9999 99 99 0 9999 99 9999 + 032096 9999 99 99 0 9999 99 9999 + 032097 9999 99 99 0 9999 99 9999 + 032098 9999 99 99 0 9999 99 9999 + 032099 9999 99 99 0 9999 99 9999 + 032100 9999 99 99 0 9999 99 9999 + 032101 9999 99 99 0 9999 99 9999 + 032102 9999 99 99 0 9999 99 9999 + 032103 9999 99 99 0 9999 99 9999 + 032104 9999 99 99 0 9999 99 9999 + 032105 9999 99 99 0 9999 99 9999 + 032106 9999 99 99 0 9999 99 9999 + 032107 9999 99 99 0 9999 99 9999 + 032108 9999 99 99 0 9999 99 9999 + 032109 9999 99 99 0 9999 99 9999 + 032110 9999 99 99 0 9999 99 9999 + 032111 9999 99 99 0 9999 99 9999 + 032112 9999 99 99 0 9999 99 9999 + 032113 9999 99 99 0 9999 99 9999 + 032114 9999 99 99 0 9999 99 9999 + 032115 9999 99 99 0 9999 99 9999 + 032116 9999 99 99 0 9999 99 9999 + 032117 9999 99 99 0 9999 99 9999 + 032118 9999 99 99 0 9999 99 9999 + 032119 9999 99 99 0 9999 99 9999 + 032120 9999 99 99 0 9999 99 9999 + 032121 9999 99 99 0 9999 99 9999 + 032122 9999 99 99 0 9999 99 9999 + 032123 9999 99 99 0 9999 99 9999 + 032124 9999 99 99 0 9999 99 9999 + 032125 9999 99 99 0 9999 99 9999 + 032126 9999 99 99 0 9999 99 9999 + 032127 9999 99 99 0 9999 99 9999 + 032128 9999 99 99 0 9999 99 9999 + 032129 9999 99 99 0 9999 99 9999 + 032130 9999 99 99 0 9999 99 9999 + 032131 9999 99 99 0 9999 99 9999 + 032132 9999 99 99 0 9999 99 9999 + 032133 9999 99 99 0 9999 99 9999 + 032134 9999 99 99 0 9999 99 9999 + 032135 9999 99 99 0 9999 99 9999 + 032136 9999 99 99 0 9999 99 9999 + 032137 9999 99 99 0 9999 99 9999 + 032138 9999 99 99 0 9999 99 9999 + 032139 9999 99 99 0 9999 99 9999 + 032140 9999 99 99 0 9999 99 9999 + 032141 9999 99 99 0 9999 99 9999 + 032142 9999 99 99 0 9999 99 9999 + 032143 9999 99 99 0 9999 99 9999 + 032144 9999 99 99 0 9999 99 9999 + 032145 9999 99 99 0 9999 99 9999 + 032146 9999 99 99 0 9999 99 9999 + 032147 9999 99 99 0 9999 99 9999 + 032148 9999 99 99 0 9999 99 9999 + 032149 9999 99 99 0 9999 99 9999 + 032150 9999 99 99 0 9999 99 9999 + 032151 9999 99 99 0 9999 99 9999 + 032152 9999 99 99 0 9999 99 9999 + 032153 9999 99 99 0 9999 99 9999 + 032154 9999 99 99 0 9999 99 9999 + 032155 9999 99 99 0 9999 99 9999 + 032156 9999 99 99 0 9999 99 9999 + 032157 9999 99 99 0 9999 99 9999 + 032158 9999 99 99 0 9999 99 9999 + 032159 9999 99 99 0 9999 99 9999 + 032160 9999 99 99 0 9999 99 9999 + 032161 9999 99 99 0 9999 99 9999 + 032162 9999 99 99 0 9999 99 9999 + 032163 9999 99 99 0 9999 99 9999 + 032164 9999 99 99 0 9999 99 9999 + 032165 9999 99 99 0 9999 99 9999 + 032166 9999 99 99 0 9999 99 9999 + 032167 9999 99 99 0 9999 99 9999 + 032168 9999 99 99 0 9999 99 9999 + 032169 9999 99 99 0 9999 99 9999 + 032170 9999 99 99 0 9999 99 9999 + 032171 9999 99 99 0 9999 99 9999 + 032172 9999 99 99 0 9999 99 9999 + 032173 9999 99 99 0 9999 99 9999 + 032174 9999 99 99 0 9999 99 9999 + 032175 9999 99 99 0 9999 99 9999 + 032176 9999 99 99 0 9999 99 9999 + 032177 9999 99 99 0 9999 99 9999 + 032178 9999 99 99 0 9999 99 9999 + 032179 9999 99 99 0 9999 99 9999 + 032180 9999 99 99 0 9999 99 9999 + 032181 9999 99 99 0 9999 99 9999 + 032182 9999 99 99 0 9999 99 9999 + 032183 9999 99 99 0 9999 99 9999 + 032184 9999 99 99 0 9999 99 9999 + 032185 9999 99 99 0 9999 99 9999 + 032186 9999 99 99 0 9999 99 9999 + 032187 9999 99 99 0 9999 99 9999 + 032188 9999 99 99 0 9999 99 9999 + 032189 9999 99 99 0 9999 99 9999 + 032190 9999 99 99 0 9999 99 9999 + 032191 9999 99 99 0 9999 99 9999 + 032192 9999 99 99 0 9999 99 9999 + 032193 9999 99 99 0 9999 99 9999 + 032194 9999 99 99 0 9999 99 9999 + 032195 9999 99 99 0 9999 99 9999 + 032196 9999 99 99 0 9999 99 9999 + 032197 9999 99 99 0 9999 99 9999 + 032198 9999 99 99 0 9999 99 9999 + 032199 9999 99 99 0 9999 99 9999 + 032200 9999 99 99 0 9999 99 9999 + 032201 9999 99 99 0 9999 99 9999 + 032202 9999 99 99 0 9999 99 9999 + 032203 9999 99 99 0 9999 99 9999 + 032204 9999 99 99 0 9999 99 9999 + 032205 9999 99 99 0 9999 99 9999 + 032206 9999 99 99 0 9999 99 9999 + 032207 9999 99 99 0 9999 99 9999 + 032208 9999 99 99 0 9999 99 9999 + 032209 9999 99 99 0 9999 99 9999 + 032210 9999 99 99 0 9999 99 9999 + 032211 9999 99 99 0 9999 99 9999 + 032212 9999 99 99 0 9999 99 9999 + 032213 9999 99 99 0 9999 99 9999 + 032214 9999 99 99 0 9999 99 9999 + 032215 9999 99 99 0 9999 99 9999 + 032216 9999 99 99 0 9999 99 9999 + 032217 9999 99 99 0 9999 99 9999 + 032218 9999 99 99 0 9999 99 9999 + 032219 9999 99 99 0 9999 99 9999 + 032220 9999 99 99 0 9999 99 9999 + 032221 9999 99 99 0 9999 99 9999 + 032222 9999 99 99 0 9999 99 9999 + 032223 9999 99 99 0 9999 99 9999 + 032224 9999 99 99 0 9999 99 9999 + 032225 9999 99 99 0 9999 99 9999 + 032226 9999 99 99 0 9999 99 9999 + 032227 9999 99 99 0 9999 99 9999 + 032228 9999 99 99 0 9999 99 9999 + 032229 9999 99 99 0 9999 99 9999 + 032230 9999 99 99 0 9999 99 9999 + 032231 9999 99 99 0 9999 99 9999 + 032232 9999 99 99 0 9999 99 9999 + 032233 9999 99 99 0 9999 99 9999 + 032234 9999 99 99 0 9999 99 9999 + 032235 9999 99 99 0 9999 99 9999 + 032236 9999 99 99 0 9999 99 9999 + 032237 9999 99 99 0 9999 99 9999 + 032238 9999 99 99 0 9999 99 9999 + 032239 9999 99 99 0 9999 99 9999 + 032240 9999 99 99 0 9999 99 9999 + 032241 9999 99 99 0 9999 99 9999 + 032242 9999 99 99 0 9999 99 9999 + 032243 9999 99 99 0 9999 99 9999 + 032244 9999 99 99 0 9999 99 9999 + 032245 9999 99 99 0 9999 99 9999 + 032246 9999 99 99 0 9999 99 9999 + 032247 9999 99 99 0 9999 99 9999 + 032248 9999 99 99 0 9999 99 9999 + 032249 9999 99 99 0 9999 99 9999 + 032250 9999 99 99 0 9999 99 9999 + 032251 9999 99 99 0 9999 99 9999 + 032252 9999 99 99 0 9999 99 9999 + 032253 9999 99 99 0 9999 99 9999 + 032254 9999 99 99 0 9999 99 9999 + 032255 9999 99 99 0 9999 99 9999 + 032256 9999 99 99 0 9999 99 9999 + 032257 1284 01 01 1 303075344 08 0067 + 032258 1284 01 02 1 303075344 09 0067 + 032259 9999 99 99 0 9999 99 9999 + 032260 9999 99 99 0 9999 99 9999 + 032261 9999 99 99 0 9999 99 9999 + 032262 9999 99 99 0 9999 99 9999 + 032263 9999 99 99 0 9999 99 9999 + 032264 9999 99 99 0 9999 99 9999 + 032265 1284 02 01 1 303075344 10 0067 + 032266 1284 02 02 1 303075344 11 0067 + 032267 9999 99 99 0 9999 99 9999 + 032268 9999 99 99 0 9999 99 9999 + 032269 9999 99 99 0 9999 99 9999 + 032270 9999 99 99 0 9999 99 9999 + 032271 9999 99 99 0 9999 99 9999 + 032272 9999 99 99 0 9999 99 9999 + 032273 1284 03 01 1 303075344 12 0067 + 032274 1284 03 02 1 303075344 13 0067 + 032275 9999 99 99 0 9999 99 9999 + 032276 9999 99 99 0 9999 99 9999 + 032277 9999 99 99 0 9999 99 9999 + 032278 9999 99 99 0 9999 99 9999 + 032279 9999 99 99 0 9999 99 9999 + 032280 9999 99 99 0 9999 99 9999 + 032281 1284 04 01 1 303075344 14 0067 + 032282 1284 04 02 1 303075344 15 0067 + 032283 9999 99 99 0 9999 99 9999 + 032284 9999 99 99 0 9999 99 9999 + 032285 9999 99 99 0 9999 99 9999 + 032286 9999 99 99 0 9999 99 9999 + 032287 9999 99 99 0 9999 99 9999 + 032288 9999 99 99 0 9999 99 9999 + 032289 1284 05 01 1 303075344 00 0067 + 032290 1284 05 02 1 303075344 01 0067 + 032291 9999 99 99 0 9999 99 9999 + 032292 9999 99 99 0 9999 99 9999 + 032293 9999 99 99 0 9999 99 9999 + 032294 9999 99 99 0 9999 99 9999 + 032295 9999 99 99 0 9999 99 9999 + 032296 9999 99 99 0 9999 99 9999 + 032297 1284 06 01 1 303075344 02 0067 + 032298 1284 06 02 1 303075344 03 0067 + 032299 9999 99 99 0 9999 99 9999 + 032300 9999 99 99 0 9999 99 9999 + 032301 9999 99 99 0 9999 99 9999 + 032302 9999 99 99 0 9999 99 9999 + 032303 9999 99 99 0 9999 99 9999 + 032304 9999 99 99 0 9999 99 9999 + 032305 1284 07 01 1 303075344 04 0067 + 032306 1284 07 02 1 303075344 05 0067 + 032307 9999 99 99 0 9999 99 9999 + 032308 9999 99 99 0 9999 99 9999 + 032309 9999 99 99 0 9999 99 9999 + 032310 9999 99 99 0 9999 99 9999 + 032311 9999 99 99 0 9999 99 9999 + 032312 9999 99 99 0 9999 99 9999 + 032313 1284 08 01 1 303075344 06 0067 + 032314 1284 08 02 1 303075344 07 0067 + 032315 9999 99 99 0 9999 99 9999 + 032316 9999 99 99 0 9999 99 9999 + 032317 9999 99 99 0 9999 99 9999 + 032318 9999 99 99 0 9999 99 9999 + 032319 9999 99 99 0 9999 99 9999 + 032320 9999 99 99 0 9999 99 9999 + 032321 1284 09 01 1 304168972 00 0250 + 032322 1284 09 02 1 304168972 01 0250 + 032323 1284 09 03 1 304168972 02 0250 + 032324 1284 09 04 1 304168972 03 0250 + 032325 9999 99 99 0 9999 99 9999 + 032326 9999 99 99 0 9999 99 9999 + 032327 9999 99 99 0 9999 99 9999 + 032328 9999 99 99 0 9999 99 9999 + 032329 1284 10 01 1 304168972 04 0250 + 032330 1284 10 02 1 304168972 05 0250 + 032331 1284 10 03 1 304168972 06 0250 + 032332 1284 10 04 1 304168972 07 0250 + 032333 9999 99 99 0 9999 99 9999 + 032334 9999 99 99 0 9999 99 9999 + 032335 9999 99 99 0 9999 99 9999 + 032336 9999 99 99 0 9999 99 9999 + 032337 1284 11 01 1 304168972 08 0250 + 032338 1284 11 02 1 304168972 09 0250 + 032339 1284 11 03 1 304168972 10 0250 + 032340 1284 11 04 1 304168972 11 0250 + 032341 9999 99 99 0 9999 99 9999 + 032342 9999 99 99 0 9999 99 9999 + 032343 9999 99 99 0 9999 99 9999 + 032344 9999 99 99 0 9999 99 9999 + 032345 1284 12 01 1 304168972 12 0250 + 032346 1284 12 02 1 304168972 13 0250 + 032347 1284 12 03 1 304168972 14 0250 + 032348 1284 12 04 1 304168972 15 0250 + 032349 9999 99 99 0 9999 99 9999 + 032350 9999 99 99 0 9999 99 9999 + 032351 9999 99 99 0 9999 99 9999 + 032352 9999 99 99 0 9999 99 9999 + 032353 1284 13 01 1 304168976 08 0251 + 032354 1284 13 02 1 304168976 09 0251 + 032355 1284 13 03 1 304168976 10 0251 + 032356 1284 13 04 1 304168976 11 0251 + 032357 9999 99 99 0 9999 99 9999 + 032358 9999 99 99 0 9999 99 9999 + 032359 9999 99 99 0 9999 99 9999 + 032360 9999 99 99 0 9999 99 9999 + 032361 1284 14 01 1 304168976 12 0251 + 032362 1284 14 02 1 304168976 13 0251 + 032363 1284 14 03 1 304168976 14 0251 + 032364 1284 14 04 1 304168976 15 0251 + 032365 9999 99 99 0 9999 99 9999 + 032366 9999 99 99 0 9999 99 9999 + 032367 9999 99 99 0 9999 99 9999 + 032368 9999 99 99 0 9999 99 9999 + 032369 1284 15 01 1 304168976 00 0251 + 032370 1284 15 02 1 304168976 01 0251 + 032371 1284 15 03 1 304168976 02 0251 + 032372 1284 15 04 1 304168976 03 0251 + 032373 9999 99 99 0 9999 99 9999 + 032374 9999 99 99 0 9999 99 9999 + 032375 9999 99 99 0 9999 99 9999 + 032376 9999 99 99 0 9999 99 9999 + 032377 1284 16 01 1 304168976 04 0251 + 032378 1284 16 02 1 304168976 05 0251 + 032379 1284 16 03 1 304168976 06 0251 + 032380 1284 16 04 1 304168976 07 0251 + 032381 9999 99 99 0 9999 99 9999 + 032382 9999 99 99 0 9999 99 9999 + 032383 9999 99 99 0 9999 99 9999 + 032384 9999 99 99 0 9999 99 9999 + 032385 1284 17 01 1 306368520 00 1025 + 032386 1284 17 02 1 306368520 01 1025 + 032387 1284 17 03 1 306368520 02 1025 + 032388 1284 17 04 1 306368520 03 1025 + 032389 1284 17 05 1 306368520 04 1025 + 032390 1284 17 06 1 306368520 05 1025 + 032391 1284 17 07 1 306368520 06 1025 + 032392 1284 17 08 1 306368520 07 1025 + 032393 1284 18 01 1 306368520 08 1025 + 032394 1284 18 02 1 306368520 09 1025 + 032395 1284 18 03 1 306368520 10 1025 + 032396 1284 18 04 1 306368520 11 1025 + 032397 1284 18 05 1 306368520 12 1025 + 032398 1284 18 06 1 306368520 13 1025 + 032399 1284 18 07 1 306368520 14 1025 + 032400 1284 18 08 1 306368520 15 1025 + 032401 1284 19 01 1 306368516 00 1024 + 032402 1284 19 02 1 306368516 01 1024 + 032403 1284 19 03 1 306368516 02 1024 + 032404 1284 19 04 1 306368516 03 1024 + 032405 1284 19 05 1 306368516 04 1024 + 032406 1284 19 06 1 306368516 05 1024 + 032407 1284 19 07 1 306368516 06 1024 + 032408 1284 19 08 1 306368516 07 1024 + 032409 1284 20 01 1 306368516 08 1024 + 032410 1284 20 02 1 306368516 09 1024 + 032411 1284 20 03 1 306368516 10 1024 + 032412 1284 20 04 1 306368516 11 1024 + 032413 1284 20 05 1 306368516 12 1024 + 032414 1284 20 06 1 306368516 13 1024 + 032415 1284 20 07 1 306368516 14 1024 + 032416 1284 20 08 1 306368516 15 1024 + 032417 1284 21 01 1 306368528 00 1027 + 032418 1284 21 02 1 306368528 01 1027 + 032419 1284 21 03 1 306368528 02 1027 + 032420 1284 21 04 1 306368528 03 1027 + 032421 1284 21 05 1 306368528 04 1027 + 032422 1284 21 06 1 306368528 05 1027 + 032423 1284 21 07 1 306368528 06 1027 + 032424 1284 21 08 1 306368528 07 1027 + 032425 1284 22 01 1 306368528 08 1027 + 032426 1284 22 02 1 306368528 09 1027 + 032427 1284 22 03 1 306368528 10 1027 + 032428 1284 22 04 1 306368528 11 1027 + 032429 1284 22 05 1 306368528 12 1027 + 032430 1284 22 06 1 306368528 13 1027 + 032431 1284 22 07 1 306368528 14 1027 + 032432 1284 22 08 1 306368528 15 1027 + 032433 1284 23 01 1 306368524 00 1026 + 032434 1284 23 02 1 306368524 01 1026 + 032435 1284 23 03 1 306368524 02 1026 + 032436 1284 23 04 1 306368524 03 1026 + 032437 1284 23 05 1 306368524 04 1026 + 032438 1284 23 06 1 306368524 05 1026 + 032439 1284 23 07 1 306368524 06 1026 + 032440 1284 23 08 1 306368524 07 1026 + 032441 1284 24 01 1 306368524 08 1026 + 032442 1284 24 02 1 306368524 09 1026 + 032443 1284 24 03 1 306368524 10 1026 + 032444 1284 24 04 1 306368524 11 1026 + 032445 1284 24 05 1 306368524 12 1026 + 032446 1284 24 06 1 306368524 13 1026 + 032447 1284 24 07 1 306368524 14 1026 + 032448 1284 24 08 1 306368524 15 1026 + 032449 1284 25 01 1 303075340 08 0066 + 032450 1284 25 02 1 303075340 09 0066 + 032451 9999 99 99 0 9999 99 9999 + 032452 9999 99 99 0 9999 99 9999 + 032453 9999 99 99 0 9999 99 9999 + 032454 9999 99 99 0 9999 99 9999 + 032455 9999 99 99 0 9999 99 9999 + 032456 9999 99 99 0 9999 99 9999 + 032457 1284 26 01 1 303075340 10 0066 + 032458 1284 26 02 1 303075340 11 0066 + 032459 9999 99 99 0 9999 99 9999 + 032460 9999 99 99 0 9999 99 9999 + 032461 9999 99 99 0 9999 99 9999 + 032462 9999 99 99 0 9999 99 9999 + 032463 9999 99 99 0 9999 99 9999 + 032464 9999 99 99 0 9999 99 9999 + 032465 1284 27 01 1 303075340 12 0066 + 032466 1284 27 02 1 303075340 13 0066 + 032467 9999 99 99 0 9999 99 9999 + 032468 9999 99 99 0 9999 99 9999 + 032469 9999 99 99 0 9999 99 9999 + 032470 9999 99 99 0 9999 99 9999 + 032471 9999 99 99 0 9999 99 9999 + 032472 9999 99 99 0 9999 99 9999 + 032473 1284 28 01 1 303075340 14 0066 + 032474 1284 28 02 1 303075340 15 0066 + 032475 9999 99 99 0 9999 99 9999 + 032476 9999 99 99 0 9999 99 9999 + 032477 9999 99 99 0 9999 99 9999 + 032478 9999 99 99 0 9999 99 9999 + 032479 9999 99 99 0 9999 99 9999 + 032480 9999 99 99 0 9999 99 9999 + 032481 1284 29 01 1 303075340 04 0066 + 032482 1284 29 02 1 303075340 05 0066 + 032483 9999 99 99 0 9999 99 9999 + 032484 9999 99 99 0 9999 99 9999 + 032485 9999 99 99 0 9999 99 9999 + 032486 9999 99 99 0 9999 99 9999 + 032487 9999 99 99 0 9999 99 9999 + 032488 9999 99 99 0 9999 99 9999 + 032489 1284 30 01 1 303075340 06 0066 + 032490 1284 30 02 1 303075340 07 0066 + 032491 9999 99 99 0 9999 99 9999 + 032492 9999 99 99 0 9999 99 9999 + 032493 9999 99 99 0 9999 99 9999 + 032494 9999 99 99 0 9999 99 9999 + 032495 9999 99 99 0 9999 99 9999 + 032496 9999 99 99 0 9999 99 9999 + 032497 1284 31 01 1 303075340 00 0066 + 032498 1284 31 02 1 303075340 01 0066 + 032499 9999 99 99 0 9999 99 9999 + 032500 9999 99 99 0 9999 99 9999 + 032501 9999 99 99 0 9999 99 9999 + 032502 9999 99 99 0 9999 99 9999 + 032503 9999 99 99 0 9999 99 9999 + 032504 9999 99 99 0 9999 99 9999 + 032505 1284 32 01 1 303075340 02 0066 + 032506 1284 32 02 1 303075340 03 0066 + 032507 9999 99 99 0 9999 99 9999 + 032508 9999 99 99 0 9999 99 9999 + 032509 9999 99 99 0 9999 99 9999 + 032510 9999 99 99 0 9999 99 9999 + 032511 9999 99 99 0 9999 99 9999 + 032512 9999 99 99 0 9999 99 9999 + 032513 1284 33 01 1 306372616 00 1033 + 032514 1284 33 02 1 306372616 01 1033 + 032515 1284 33 03 1 306372616 02 1033 + 032516 1284 33 04 1 306372616 03 1033 + 032517 1284 33 05 1 306372616 04 1033 + 032518 1284 33 06 1 306372616 05 1033 + 032519 1284 33 07 1 306372616 06 1033 + 032520 1284 33 08 1 306372616 07 1033 + 032521 1284 34 01 1 306372616 08 1033 + 032522 1284 34 02 1 306372616 09 1033 + 032523 1284 34 03 1 306372616 10 1033 + 032524 1284 34 04 1 306372616 11 1033 + 032525 1284 34 05 1 306372616 12 1033 + 032526 1284 34 06 1 306372616 13 1033 + 032527 1284 34 07 1 306372616 14 1033 + 032528 1284 34 08 1 306372616 15 1033 + 032529 1284 35 01 1 306372612 00 1032 + 032530 1284 35 02 1 306372612 01 1032 + 032531 1284 35 03 1 306372612 02 1032 + 032532 1284 35 04 1 306372612 03 1032 + 032533 1284 35 05 1 306372612 04 1032 + 032534 1284 35 06 1 306372612 05 1032 + 032535 1284 35 07 1 306372612 06 1032 + 032536 1284 35 08 1 306372612 07 1032 + 032537 1284 36 01 1 306372612 08 1032 + 032538 1284 36 02 1 306372612 09 1032 + 032539 1284 36 03 1 306372612 10 1032 + 032540 1284 36 04 1 306372612 11 1032 + 032541 1284 36 05 1 306372612 12 1032 + 032542 1284 36 06 1 306372612 13 1032 + 032543 1284 36 07 1 306372612 14 1032 + 032544 1284 36 08 1 306372612 15 1032 + 032545 1284 37 01 1 306372624 00 1035 + 032546 1284 37 02 1 306372624 01 1035 + 032547 1284 37 03 1 306372624 02 1035 + 032548 1284 37 04 1 306372624 03 1035 + 032549 1284 37 05 1 306372624 04 1035 + 032550 1284 37 06 1 306372624 05 1035 + 032551 1284 37 07 1 306372624 06 1035 + 032552 1284 37 08 1 306372624 07 1035 + 032553 1284 38 01 1 306372624 08 1035 + 032554 1284 38 02 1 306372624 09 1035 + 032555 1284 38 03 1 306372624 10 1035 + 032556 1284 38 04 1 306372624 11 1035 + 032557 1284 38 05 1 306372624 12 1035 + 032558 1284 38 06 1 306372624 13 1035 + 032559 1284 38 07 1 306372624 14 1035 + 032560 1284 38 08 1 306372624 15 1035 + 032561 1284 39 01 1 306372620 00 1034 + 032562 1284 39 02 1 306372620 01 1034 + 032563 1284 39 03 1 306372620 02 1034 + 032564 1284 39 04 1 306372620 03 1034 + 032565 1284 39 05 1 306372620 04 1034 + 032566 1284 39 06 1 306372620 05 1034 + 032567 1284 39 07 1 306372620 06 1034 + 032568 1284 39 08 1 306372620 07 1034 + 032569 1284 40 01 1 306372620 08 1034 + 032570 1284 40 02 1 306372620 09 1034 + 032571 1284 40 03 1 306372620 10 1034 + 032572 1284 40 04 1 306372620 11 1034 + 032573 1284 40 05 1 306372620 12 1034 + 032574 1284 40 06 1 306372620 13 1034 + 032575 1284 40 07 1 306372620 14 1034 + 032576 1284 40 08 1 306372620 15 1034 + 032577 1284 41 01 1 304168968 00 0249 + 032578 1284 41 02 1 304168968 01 0249 + 032579 1284 41 03 1 304168968 02 0249 + 032580 1284 41 04 1 304168968 03 0249 + 032581 9999 99 99 0 9999 99 9999 + 032582 9999 99 99 0 9999 99 9999 + 032583 9999 99 99 0 9999 99 9999 + 032584 9999 99 99 0 9999 99 9999 + 032585 1284 42 01 1 304168968 04 0249 + 032586 1284 42 02 1 304168968 05 0249 + 032587 1284 42 03 1 304168968 06 0249 + 032588 1284 42 04 1 304168968 07 0249 + 032589 9999 99 99 0 9999 99 9999 + 032590 9999 99 99 0 9999 99 9999 + 032591 9999 99 99 0 9999 99 9999 + 032592 9999 99 99 0 9999 99 9999 + 032593 1284 43 01 1 304168968 08 0249 + 032594 1284 43 02 1 304168968 09 0249 + 032595 1284 43 03 1 304168968 10 0249 + 032596 1284 43 04 1 304168968 11 0249 + 032597 9999 99 99 0 9999 99 9999 + 032598 9999 99 99 0 9999 99 9999 + 032599 9999 99 99 0 9999 99 9999 + 032600 9999 99 99 0 9999 99 9999 + 032601 1284 44 01 1 304168968 12 0249 + 032602 1284 44 02 1 304168968 13 0249 + 032603 1284 44 03 1 304168968 14 0249 + 032604 1284 44 04 1 304168968 15 0249 + 032605 9999 99 99 0 9999 99 9999 + 032606 9999 99 99 0 9999 99 9999 + 032607 9999 99 99 0 9999 99 9999 + 032608 9999 99 99 0 9999 99 9999 + 032609 1284 45 01 1 304168964 00 0248 + 032610 1284 45 02 1 304168964 01 0248 + 032611 1284 45 03 1 304168964 02 0248 + 032612 1284 45 04 1 304168964 03 0248 + 032613 9999 99 99 0 9999 99 9999 + 032614 9999 99 99 0 9999 99 9999 + 032615 9999 99 99 0 9999 99 9999 + 032616 9999 99 99 0 9999 99 9999 + 032617 1284 46 01 1 304168964 04 0248 + 032618 1284 46 02 1 304168964 05 0248 + 032619 1284 46 03 1 304168964 06 0248 + 032620 1284 46 04 1 304168964 07 0248 + 032621 9999 99 99 0 9999 99 9999 + 032622 9999 99 99 0 9999 99 9999 + 032623 9999 99 99 0 9999 99 9999 + 032624 9999 99 99 0 9999 99 9999 + 032625 1284 47 01 1 304168964 08 0248 + 032626 1284 47 02 1 304168964 09 0248 + 032627 1284 47 03 1 304168964 10 0248 + 032628 1284 47 04 1 304168964 11 0248 + 032629 9999 99 99 0 9999 99 9999 + 032630 9999 99 99 0 9999 99 9999 + 032631 9999 99 99 0 9999 99 9999 + 032632 9999 99 99 0 9999 99 9999 + 032633 1284 48 01 1 304168964 12 0248 + 032634 1284 48 02 1 304168964 13 0248 + 032635 1284 48 03 1 304168964 14 0248 + 032636 1284 48 04 1 304168964 15 0248 + 032637 9999 99 99 0 9999 99 9999 + 032638 9999 99 99 0 9999 99 9999 + 032639 9999 99 99 0 9999 99 9999 + 032640 9999 99 99 0 9999 99 9999 + 032641 1285 01 01 1 304173068 08 0258 + 032642 1285 01 02 1 304173068 09 0258 + 032643 1285 01 03 1 304173068 10 0258 + 032644 1285 01 04 1 304173068 11 0258 + 032645 9999 99 99 0 9999 99 9999 + 032646 9999 99 99 0 9999 99 9999 + 032647 9999 99 99 0 9999 99 9999 + 032648 9999 99 99 0 9999 99 9999 + 032649 1285 02 01 1 304173068 12 0258 + 032650 1285 02 02 1 304173068 13 0258 + 032651 1285 02 03 1 304173068 14 0258 + 032652 1285 02 04 1 304173068 15 0258 + 032653 9999 99 99 0 9999 99 9999 + 032654 9999 99 99 0 9999 99 9999 + 032655 9999 99 99 0 9999 99 9999 + 032656 9999 99 99 0 9999 99 9999 + 032657 1285 03 01 1 304173068 00 0258 + 032658 1285 03 02 1 304173068 01 0258 + 032659 1285 03 03 1 304173068 02 0258 + 032660 1285 03 04 1 304173068 03 0258 + 032661 9999 99 99 0 9999 99 9999 + 032662 9999 99 99 0 9999 99 9999 + 032663 9999 99 99 0 9999 99 9999 + 032664 9999 99 99 0 9999 99 9999 + 032665 1285 04 01 1 304173068 04 0258 + 032666 1285 04 02 1 304173068 05 0258 + 032667 1285 04 03 1 304173068 06 0258 + 032668 1285 04 04 1 304173068 07 0258 + 032669 9999 99 99 0 9999 99 9999 + 032670 9999 99 99 0 9999 99 9999 + 032671 9999 99 99 0 9999 99 9999 + 032672 9999 99 99 0 9999 99 9999 + 032673 1285 05 01 1 304173072 08 0259 + 032674 1285 05 02 1 304173072 09 0259 + 032675 1285 05 03 1 304173072 10 0259 + 032676 1285 05 04 1 304173072 11 0259 + 032677 9999 99 99 0 9999 99 9999 + 032678 9999 99 99 0 9999 99 9999 + 032679 9999 99 99 0 9999 99 9999 + 032680 9999 99 99 0 9999 99 9999 + 032681 1285 06 01 1 304173072 12 0259 + 032682 1285 06 02 1 304173072 13 0259 + 032683 1285 06 03 1 304173072 14 0259 + 032684 1285 06 04 1 304173072 15 0259 + 032685 9999 99 99 0 9999 99 9999 + 032686 9999 99 99 0 9999 99 9999 + 032687 9999 99 99 0 9999 99 9999 + 032688 9999 99 99 0 9999 99 9999 + 032689 1285 07 01 1 304173072 00 0259 + 032690 1285 07 02 1 304173072 01 0259 + 032691 1285 07 03 1 304173072 02 0259 + 032692 1285 07 04 1 304173072 03 0259 + 032693 9999 99 99 0 9999 99 9999 + 032694 9999 99 99 0 9999 99 9999 + 032695 9999 99 99 0 9999 99 9999 + 032696 9999 99 99 0 9999 99 9999 + 032697 1285 08 01 1 304173072 04 0259 + 032698 1285 08 02 1 304173072 05 0259 + 032699 1285 08 03 1 304173072 06 0259 + 032700 1285 08 04 1 304173072 07 0259 + 032701 9999 99 99 0 9999 99 9999 + 032702 9999 99 99 0 9999 99 9999 + 032703 9999 99 99 0 9999 99 9999 + 032704 9999 99 99 0 9999 99 9999 + 032705 1285 09 01 1 306376716 00 1042 + 032706 1285 09 02 1 306376716 01 1042 + 032707 1285 09 03 1 306376716 02 1042 + 032708 1285 09 04 1 306376716 03 1042 + 032709 1285 09 05 1 306376716 04 1042 + 032710 1285 09 06 1 306376716 05 1042 + 032711 1285 09 07 1 306376716 06 1042 + 032712 1285 09 08 1 306376716 07 1042 + 032713 1285 10 01 1 306376716 08 1042 + 032714 1285 10 02 1 306376716 09 1042 + 032715 1285 10 03 1 306376716 10 1042 + 032716 1285 10 04 1 306376716 11 1042 + 032717 1285 10 05 1 306376716 12 1042 + 032718 1285 10 06 1 306376716 13 1042 + 032719 1285 10 07 1 306376716 14 1042 + 032720 1285 10 08 1 306376716 15 1042 + 032721 1285 11 01 1 306376720 00 1043 + 032722 1285 11 02 1 306376720 01 1043 + 032723 1285 11 03 1 306376720 02 1043 + 032724 1285 11 04 1 306376720 03 1043 + 032725 1285 11 05 1 306376720 04 1043 + 032726 1285 11 06 1 306376720 05 1043 + 032727 1285 11 07 1 306376720 06 1043 + 032728 1285 11 08 1 306376720 07 1043 + 032729 1285 12 01 1 306376720 08 1043 + 032730 1285 12 02 1 306376720 09 1043 + 032731 1285 12 03 1 306376720 10 1043 + 032732 1285 12 04 1 306376720 11 1043 + 032733 1285 12 05 1 306376720 12 1043 + 032734 1285 12 06 1 306376720 13 1043 + 032735 1285 12 07 1 306376720 14 1043 + 032736 1285 12 08 1 306376720 15 1043 + 032737 1285 13 01 1 306376708 00 1040 + 032738 1285 13 02 1 306376708 01 1040 + 032739 1285 13 03 1 306376708 02 1040 + 032740 1285 13 04 1 306376708 03 1040 + 032741 1285 13 05 1 306376708 04 1040 + 032742 1285 13 06 1 306376708 05 1040 + 032743 1285 13 07 1 306376708 06 1040 + 032744 1285 13 08 1 306376708 07 1040 + 032745 1285 14 01 1 306376708 08 1040 + 032746 1285 14 02 1 306376708 09 1040 + 032747 1285 14 03 1 306376708 10 1040 + 032748 1285 14 04 1 306376708 11 1040 + 032749 1285 14 05 1 306376708 12 1040 + 032750 1285 14 06 1 306376708 13 1040 + 032751 1285 14 07 1 306376708 14 1040 + 032752 1285 14 08 1 306376708 15 1040 + 032753 1285 15 01 1 306376712 00 1041 + 032754 1285 15 02 1 306376712 01 1041 + 032755 1285 15 03 1 306376712 02 1041 + 032756 1285 15 04 1 306376712 03 1041 + 032757 1285 15 05 1 306376712 04 1041 + 032758 1285 15 06 1 306376712 05 1041 + 032759 1285 15 07 1 306376712 06 1041 + 032760 1285 15 08 1 306376712 07 1041 + 032761 1285 16 01 1 306376712 08 1041 + 032762 1285 16 02 1 306376712 09 1041 + 032763 1285 16 03 1 306376712 10 1041 + 032764 1285 16 04 1 306376712 11 1041 + 032765 1285 16 05 1 306376712 12 1041 + 032766 1285 16 06 1 306376712 13 1041 + 032767 1285 16 07 1 306376712 14 1041 + 032768 1285 16 08 1 306376712 15 1041 + 032769 1285 17 01 1 303075336 12 0065 + 032770 1285 17 02 1 303075336 13 0065 + 032771 9999 99 99 0 9999 99 9999 + 032772 9999 99 99 0 9999 99 9999 + 032773 9999 99 99 0 9999 99 9999 + 032774 9999 99 99 0 9999 99 9999 + 032775 9999 99 99 0 9999 99 9999 + 032776 9999 99 99 0 9999 99 9999 + 032777 1285 18 01 1 303075336 14 0065 + 032778 1285 18 02 1 303075336 15 0065 + 032779 9999 99 99 0 9999 99 9999 + 032780 9999 99 99 0 9999 99 9999 + 032781 9999 99 99 0 9999 99 9999 + 032782 9999 99 99 0 9999 99 9999 + 032783 9999 99 99 0 9999 99 9999 + 032784 9999 99 99 0 9999 99 9999 + 032785 1285 19 01 1 303075336 08 0065 + 032786 1285 19 02 1 303075336 09 0065 + 032787 9999 99 99 0 9999 99 9999 + 032788 9999 99 99 0 9999 99 9999 + 032789 9999 99 99 0 9999 99 9999 + 032790 9999 99 99 0 9999 99 9999 + 032791 9999 99 99 0 9999 99 9999 + 032792 9999 99 99 0 9999 99 9999 + 032793 1285 20 01 1 303075336 10 0065 + 032794 1285 20 02 1 303075336 11 0065 + 032795 9999 99 99 0 9999 99 9999 + 032796 9999 99 99 0 9999 99 9999 + 032797 9999 99 99 0 9999 99 9999 + 032798 9999 99 99 0 9999 99 9999 + 032799 9999 99 99 0 9999 99 9999 + 032800 9999 99 99 0 9999 99 9999 + 032801 1285 21 01 1 303075336 00 0065 + 032802 1285 21 02 1 303075336 01 0065 + 032803 9999 99 99 0 9999 99 9999 + 032804 9999 99 99 0 9999 99 9999 + 032805 9999 99 99 0 9999 99 9999 + 032806 9999 99 99 0 9999 99 9999 + 032807 9999 99 99 0 9999 99 9999 + 032808 9999 99 99 0 9999 99 9999 + 032809 1285 22 01 1 303075336 02 0065 + 032810 1285 22 02 1 303075336 03 0065 + 032811 9999 99 99 0 9999 99 9999 + 032812 9999 99 99 0 9999 99 9999 + 032813 9999 99 99 0 9999 99 9999 + 032814 9999 99 99 0 9999 99 9999 + 032815 9999 99 99 0 9999 99 9999 + 032816 9999 99 99 0 9999 99 9999 + 032817 1285 23 01 1 303075336 04 0065 + 032818 1285 23 02 1 303075336 05 0065 + 032819 9999 99 99 0 9999 99 9999 + 032820 9999 99 99 0 9999 99 9999 + 032821 9999 99 99 0 9999 99 9999 + 032822 9999 99 99 0 9999 99 9999 + 032823 9999 99 99 0 9999 99 9999 + 032824 9999 99 99 0 9999 99 9999 + 032825 1285 24 01 1 303075336 06 0065 + 032826 1285 24 02 1 303075336 07 0065 + 032827 9999 99 99 0 9999 99 9999 + 032828 9999 99 99 0 9999 99 9999 + 032829 9999 99 99 0 9999 99 9999 + 032830 9999 99 99 0 9999 99 9999 + 032831 9999 99 99 0 9999 99 9999 + 032832 9999 99 99 0 9999 99 9999 + 032833 1285 25 01 1 305266696 00 0569 + 032834 1285 25 02 1 305266696 01 0569 + 032835 1285 25 03 1 305266696 02 0569 + 032836 1285 25 04 1 305266696 03 0569 + 032837 1285 25 05 1 305266696 04 0569 + 032838 1285 25 06 1 305266696 05 0569 + 032839 1285 25 07 1 305266696 06 0569 + 032840 1285 25 08 1 305266696 07 0569 + 032841 1285 26 01 1 305266696 08 0569 + 032842 1285 26 02 1 305266696 09 0569 + 032843 1285 26 03 1 305266696 10 0569 + 032844 1285 26 04 1 305266696 11 0569 + 032845 1285 26 05 1 305266696 12 0569 + 032846 1285 26 06 1 305266696 13 0569 + 032847 1285 26 07 1 305266696 14 0569 + 032848 1285 26 08 1 305266696 15 0569 + 032849 1285 27 01 1 305266692 00 0568 + 032850 1285 27 02 1 305266692 01 0568 + 032851 1285 27 03 1 305266692 02 0568 + 032852 1285 27 04 1 305266692 03 0568 + 032853 1285 27 05 1 305266692 04 0568 + 032854 1285 27 06 1 305266692 05 0568 + 032855 1285 27 07 1 305266692 06 0568 + 032856 1285 27 08 1 305266692 07 0568 + 032857 1285 28 01 1 305266692 08 0568 + 032858 1285 28 02 1 305266692 09 0568 + 032859 1285 28 03 1 305266692 10 0568 + 032860 1285 28 04 1 305266692 11 0568 + 032861 1285 28 05 1 305266692 12 0568 + 032862 1285 28 06 1 305266692 13 0568 + 032863 1285 28 07 1 305266692 14 0568 + 032864 1285 28 08 1 305266692 15 0568 + 032865 1285 29 01 1 305266704 00 0571 + 032866 1285 29 02 1 305266704 01 0571 + 032867 1285 29 03 1 305266704 02 0571 + 032868 1285 29 04 1 305266704 03 0571 + 032869 1285 29 05 1 305266704 04 0571 + 032870 1285 29 06 1 305266704 05 0571 + 032871 1285 29 07 1 305266704 06 0571 + 032872 1285 29 08 1 305266704 07 0571 + 032873 1285 30 01 1 305266704 08 0571 + 032874 1285 30 02 1 305266704 09 0571 + 032875 1285 30 03 1 305266704 10 0571 + 032876 1285 30 04 1 305266704 11 0571 + 032877 1285 30 05 1 305266704 12 0571 + 032878 1285 30 06 1 305266704 13 0571 + 032879 1285 30 07 1 305266704 14 0571 + 032880 1285 30 08 1 305266704 15 0571 + 032881 1285 31 01 1 305266700 00 0570 + 032882 1285 31 02 1 305266700 01 0570 + 032883 1285 31 03 1 305266700 02 0570 + 032884 1285 31 04 1 305266700 03 0570 + 032885 1285 31 05 1 305266700 04 0570 + 032886 1285 31 06 1 305266700 05 0570 + 032887 1285 31 07 1 305266700 06 0570 + 032888 1285 31 08 1 305266700 07 0570 + 032889 1285 32 01 1 305266700 08 0570 + 032890 1285 32 02 1 305266700 09 0570 + 032891 1285 32 03 1 305266700 10 0570 + 032892 1285 32 04 1 305266700 11 0570 + 032893 1285 32 05 1 305266700 12 0570 + 032894 1285 32 06 1 305266700 13 0570 + 032895 1285 32 07 1 305266700 14 0570 + 032896 1285 32 08 1 305266700 15 0570 + 032897 1285 33 01 1 306380812 00 1050 + 032898 1285 33 02 1 306380812 01 1050 + 032899 1285 33 03 1 306380812 02 1050 + 032900 1285 33 04 1 306380812 03 1050 + 032901 1285 33 05 1 306380812 04 1050 + 032902 1285 33 06 1 306380812 05 1050 + 032903 1285 33 07 1 306380812 06 1050 + 032904 1285 33 08 1 306380812 07 1050 + 032905 1285 34 01 1 306380812 08 1050 + 032906 1285 34 02 1 306380812 09 1050 + 032907 1285 34 03 1 306380812 10 1050 + 032908 1285 34 04 1 306380812 11 1050 + 032909 1285 34 05 1 306380812 12 1050 + 032910 1285 34 06 1 306380812 13 1050 + 032911 1285 34 07 1 306380812 14 1050 + 032912 1285 34 08 1 306380812 15 1050 + 032913 1285 35 01 1 306380816 00 1051 + 032914 1285 35 02 1 306380816 01 1051 + 032915 1285 35 03 1 306380816 02 1051 + 032916 1285 35 04 1 306380816 03 1051 + 032917 1285 35 05 1 306380816 04 1051 + 032918 1285 35 06 1 306380816 05 1051 + 032919 1285 35 07 1 306380816 06 1051 + 032920 1285 35 08 1 306380816 07 1051 + 032921 1285 36 01 1 306380816 08 1051 + 032922 1285 36 02 1 306380816 09 1051 + 032923 1285 36 03 1 306380816 10 1051 + 032924 1285 36 04 1 306380816 11 1051 + 032925 1285 36 05 1 306380816 12 1051 + 032926 1285 36 06 1 306380816 13 1051 + 032927 1285 36 07 1 306380816 14 1051 + 032928 1285 36 08 1 306380816 15 1051 + 032929 1285 37 01 1 306380804 00 1048 + 032930 1285 37 02 1 306380804 01 1048 + 032931 1285 37 03 1 306380804 02 1048 + 032932 1285 37 04 1 306380804 03 1048 + 032933 1285 37 05 1 306380804 04 1048 + 032934 1285 37 06 1 306380804 05 1048 + 032935 1285 37 07 1 306380804 06 1048 + 032936 1285 37 08 1 306380804 07 1048 + 032937 1285 38 01 1 306380804 08 1048 + 032938 1285 38 02 1 306380804 09 1048 + 032939 1285 38 03 1 306380804 10 1048 + 032940 1285 38 04 1 306380804 11 1048 + 032941 1285 38 05 1 306380804 12 1048 + 032942 1285 38 06 1 306380804 13 1048 + 032943 1285 38 07 1 306380804 14 1048 + 032944 1285 38 08 1 306380804 15 1048 + 032945 1285 39 01 1 306380808 00 1049 + 032946 1285 39 02 1 306380808 01 1049 + 032947 1285 39 03 1 306380808 02 1049 + 032948 1285 39 04 1 306380808 03 1049 + 032949 1285 39 05 1 306380808 04 1049 + 032950 1285 39 06 1 306380808 05 1049 + 032951 1285 39 07 1 306380808 06 1049 + 032952 1285 39 08 1 306380808 07 1049 + 032953 1285 40 01 1 306380808 08 1049 + 032954 1285 40 02 1 306380808 09 1049 + 032955 1285 40 03 1 306380808 10 1049 + 032956 1285 40 04 1 306380808 11 1049 + 032957 1285 40 05 1 306380808 12 1049 + 032958 1285 40 06 1 306380808 13 1049 + 032959 1285 40 07 1 306380808 14 1049 + 032960 1285 40 08 1 306380808 15 1049 + 032961 1285 41 01 1 304173060 08 0256 + 032962 1285 41 02 1 304173060 09 0256 + 032963 1285 41 03 1 304173060 10 0256 + 032964 1285 41 04 1 304173060 11 0256 + 032965 9999 99 99 0 9999 99 9999 + 032966 9999 99 99 0 9999 99 9999 + 032967 9999 99 99 0 9999 99 9999 + 032968 9999 99 99 0 9999 99 9999 + 032969 1285 42 01 1 304173060 12 0256 + 032970 1285 42 02 1 304173060 13 0256 + 032971 1285 42 03 1 304173060 14 0256 + 032972 1285 42 04 1 304173060 15 0256 + 032973 9999 99 99 0 9999 99 9999 + 032974 9999 99 99 0 9999 99 9999 + 032975 9999 99 99 0 9999 99 9999 + 032976 9999 99 99 0 9999 99 9999 + 032977 1285 43 01 1 304173060 00 0256 + 032978 1285 43 02 1 304173060 01 0256 + 032979 1285 43 03 1 304173060 02 0256 + 032980 1285 43 04 1 304173060 03 0256 + 032981 9999 99 99 0 9999 99 9999 + 032982 9999 99 99 0 9999 99 9999 + 032983 9999 99 99 0 9999 99 9999 + 032984 9999 99 99 0 9999 99 9999 + 032985 1285 44 01 1 304173060 04 0256 + 032986 1285 44 02 1 304173060 05 0256 + 032987 1285 44 03 1 304173060 06 0256 + 032988 1285 44 04 1 304173060 07 0256 + 032989 9999 99 99 0 9999 99 9999 + 032990 9999 99 99 0 9999 99 9999 + 032991 9999 99 99 0 9999 99 9999 + 032992 9999 99 99 0 9999 99 9999 + 032993 1285 45 01 1 304173064 08 0257 + 032994 1285 45 02 1 304173064 09 0257 + 032995 1285 45 03 1 304173064 10 0257 + 032996 1285 45 04 1 304173064 11 0257 + 032997 9999 99 99 0 9999 99 9999 + 032998 9999 99 99 0 9999 99 9999 + 032999 9999 99 99 0 9999 99 9999 + 033000 9999 99 99 0 9999 99 9999 + 033001 1285 46 01 1 304173064 12 0257 + 033002 1285 46 02 1 304173064 13 0257 + 033003 1285 46 03 1 304173064 14 0257 + 033004 1285 46 04 1 304173064 15 0257 + 033005 9999 99 99 0 9999 99 9999 + 033006 9999 99 99 0 9999 99 9999 + 033007 9999 99 99 0 9999 99 9999 + 033008 9999 99 99 0 9999 99 9999 + 033009 1285 47 01 1 304173064 00 0257 + 033010 1285 47 02 1 304173064 01 0257 + 033011 1285 47 03 1 304173064 02 0257 + 033012 1285 47 04 1 304173064 03 0257 + 033013 9999 99 99 0 9999 99 9999 + 033014 9999 99 99 0 9999 99 9999 + 033015 9999 99 99 0 9999 99 9999 + 033016 9999 99 99 0 9999 99 9999 + 033017 1285 48 01 1 304173064 04 0257 + 033018 1285 48 02 1 304173064 05 0257 + 033019 1285 48 03 1 304173064 06 0257 + 033020 1285 48 04 1 304173064 07 0257 + 033021 9999 99 99 0 9999 99 9999 + 033022 9999 99 99 0 9999 99 9999 + 033023 9999 99 99 0 9999 99 9999 + 033024 9999 99 99 0 9999 99 9999 + 033025 1286 01 01 1 305270792 00 0577 + 033026 1286 01 02 1 305270792 01 0577 + 033027 1286 01 03 1 305270792 02 0577 + 033028 1286 01 04 1 305270792 03 0577 + 033029 1286 01 05 1 305270792 04 0577 + 033030 1286 01 06 1 305270792 05 0577 + 033031 1286 01 07 1 305270792 06 0577 + 033032 1286 01 08 1 305270792 07 0577 + 033033 1286 02 01 1 305270792 08 0577 + 033034 1286 02 02 1 305270792 09 0577 + 033035 1286 02 03 1 305270792 10 0577 + 033036 1286 02 04 1 305270792 11 0577 + 033037 1286 02 05 1 305270792 12 0577 + 033038 1286 02 06 1 305270792 13 0577 + 033039 1286 02 07 1 305270792 14 0577 + 033040 1286 02 08 1 305270792 15 0577 + 033041 1286 03 01 1 305270788 00 0576 + 033042 1286 03 02 1 305270788 01 0576 + 033043 1286 03 03 1 305270788 02 0576 + 033044 1286 03 04 1 305270788 03 0576 + 033045 1286 03 05 1 305270788 04 0576 + 033046 1286 03 06 1 305270788 05 0576 + 033047 1286 03 07 1 305270788 06 0576 + 033048 1286 03 08 1 305270788 07 0576 + 033049 1286 04 01 1 305270788 08 0576 + 033050 1286 04 02 1 305270788 09 0576 + 033051 1286 04 03 1 305270788 10 0576 + 033052 1286 04 04 1 305270788 11 0576 + 033053 1286 04 05 1 305270788 12 0576 + 033054 1286 04 06 1 305270788 13 0576 + 033055 1286 04 07 1 305270788 14 0576 + 033056 1286 04 08 1 305270788 15 0576 + 033057 1286 05 01 1 305270800 00 0579 + 033058 1286 05 02 1 305270800 01 0579 + 033059 1286 05 03 1 305270800 02 0579 + 033060 1286 05 04 1 305270800 03 0579 + 033061 1286 05 05 1 305270800 04 0579 + 033062 1286 05 06 1 305270800 05 0579 + 033063 1286 05 07 1 305270800 06 0579 + 033064 1286 05 08 1 305270800 07 0579 + 033065 1286 06 01 1 305270800 08 0579 + 033066 1286 06 02 1 305270800 09 0579 + 033067 1286 06 03 1 305270800 10 0579 + 033068 1286 06 04 1 305270800 11 0579 + 033069 1286 06 05 1 305270800 12 0579 + 033070 1286 06 06 1 305270800 13 0579 + 033071 1286 06 07 1 305270800 14 0579 + 033072 1286 06 08 1 305270800 15 0579 + 033073 1286 07 01 1 305270796 00 0578 + 033074 1286 07 02 1 305270796 01 0578 + 033075 1286 07 03 1 305270796 02 0578 + 033076 1286 07 04 1 305270796 03 0578 + 033077 1286 07 05 1 305270796 04 0578 + 033078 1286 07 06 1 305270796 05 0578 + 033079 1286 07 07 1 305270796 06 0578 + 033080 1286 07 08 1 305270796 07 0578 + 033081 1286 08 01 1 305270796 08 0578 + 033082 1286 08 02 1 305270796 09 0578 + 033083 1286 08 03 1 305270796 10 0578 + 033084 1286 08 04 1 305270796 11 0578 + 033085 1286 08 05 1 305270796 12 0578 + 033086 1286 08 06 1 305270796 13 0578 + 033087 1286 08 07 1 305270796 14 0578 + 033088 1286 08 08 1 305270796 15 0578 + 033089 9999 99 99 0 9999 99 9999 + 033090 9999 99 99 0 9999 99 9999 + 033091 9999 99 99 0 9999 99 9999 + 033092 9999 99 99 0 9999 99 9999 + 033093 9999 99 99 0 9999 99 9999 + 033094 9999 99 99 0 9999 99 9999 + 033095 9999 99 99 0 9999 99 9999 + 033096 9999 99 99 0 9999 99 9999 + 033097 9999 99 99 0 9999 99 9999 + 033098 9999 99 99 0 9999 99 9999 + 033099 9999 99 99 0 9999 99 9999 + 033100 9999 99 99 0 9999 99 9999 + 033101 9999 99 99 0 9999 99 9999 + 033102 9999 99 99 0 9999 99 9999 + 033103 9999 99 99 0 9999 99 9999 + 033104 9999 99 99 0 9999 99 9999 + 033105 9999 99 99 0 9999 99 9999 + 033106 9999 99 99 0 9999 99 9999 + 033107 9999 99 99 0 9999 99 9999 + 033108 9999 99 99 0 9999 99 9999 + 033109 9999 99 99 0 9999 99 9999 + 033110 9999 99 99 0 9999 99 9999 + 033111 9999 99 99 0 9999 99 9999 + 033112 9999 99 99 0 9999 99 9999 + 033113 9999 99 99 0 9999 99 9999 + 033114 9999 99 99 0 9999 99 9999 + 033115 9999 99 99 0 9999 99 9999 + 033116 9999 99 99 0 9999 99 9999 + 033117 9999 99 99 0 9999 99 9999 + 033118 9999 99 99 0 9999 99 9999 + 033119 9999 99 99 0 9999 99 9999 + 033120 9999 99 99 0 9999 99 9999 + 033121 9999 99 99 0 9999 99 9999 + 033122 9999 99 99 0 9999 99 9999 + 033123 9999 99 99 0 9999 99 9999 + 033124 9999 99 99 0 9999 99 9999 + 033125 9999 99 99 0 9999 99 9999 + 033126 9999 99 99 0 9999 99 9999 + 033127 9999 99 99 0 9999 99 9999 + 033128 9999 99 99 0 9999 99 9999 + 033129 9999 99 99 0 9999 99 9999 + 033130 9999 99 99 0 9999 99 9999 + 033131 9999 99 99 0 9999 99 9999 + 033132 9999 99 99 0 9999 99 9999 + 033133 9999 99 99 0 9999 99 9999 + 033134 9999 99 99 0 9999 99 9999 + 033135 9999 99 99 0 9999 99 9999 + 033136 9999 99 99 0 9999 99 9999 + 033137 9999 99 99 0 9999 99 9999 + 033138 9999 99 99 0 9999 99 9999 + 033139 9999 99 99 0 9999 99 9999 + 033140 9999 99 99 0 9999 99 9999 + 033141 9999 99 99 0 9999 99 9999 + 033142 9999 99 99 0 9999 99 9999 + 033143 9999 99 99 0 9999 99 9999 + 033144 9999 99 99 0 9999 99 9999 + 033145 9999 99 99 0 9999 99 9999 + 033146 9999 99 99 0 9999 99 9999 + 033147 9999 99 99 0 9999 99 9999 + 033148 9999 99 99 0 9999 99 9999 + 033149 9999 99 99 0 9999 99 9999 + 033150 9999 99 99 0 9999 99 9999 + 033151 9999 99 99 0 9999 99 9999 + 033152 9999 99 99 0 9999 99 9999 + 033153 9999 99 99 0 9999 99 9999 + 033154 9999 99 99 0 9999 99 9999 + 033155 9999 99 99 0 9999 99 9999 + 033156 9999 99 99 0 9999 99 9999 + 033157 9999 99 99 0 9999 99 9999 + 033158 9999 99 99 0 9999 99 9999 + 033159 9999 99 99 0 9999 99 9999 + 033160 9999 99 99 0 9999 99 9999 + 033161 9999 99 99 0 9999 99 9999 + 033162 9999 99 99 0 9999 99 9999 + 033163 9999 99 99 0 9999 99 9999 + 033164 9999 99 99 0 9999 99 9999 + 033165 9999 99 99 0 9999 99 9999 + 033166 9999 99 99 0 9999 99 9999 + 033167 9999 99 99 0 9999 99 9999 + 033168 9999 99 99 0 9999 99 9999 + 033169 9999 99 99 0 9999 99 9999 + 033170 9999 99 99 0 9999 99 9999 + 033171 9999 99 99 0 9999 99 9999 + 033172 9999 99 99 0 9999 99 9999 + 033173 9999 99 99 0 9999 99 9999 + 033174 9999 99 99 0 9999 99 9999 + 033175 9999 99 99 0 9999 99 9999 + 033176 9999 99 99 0 9999 99 9999 + 033177 9999 99 99 0 9999 99 9999 + 033178 9999 99 99 0 9999 99 9999 + 033179 9999 99 99 0 9999 99 9999 + 033180 9999 99 99 0 9999 99 9999 + 033181 9999 99 99 0 9999 99 9999 + 033182 9999 99 99 0 9999 99 9999 + 033183 9999 99 99 0 9999 99 9999 + 033184 9999 99 99 0 9999 99 9999 + 033185 9999 99 99 0 9999 99 9999 + 033186 9999 99 99 0 9999 99 9999 + 033187 9999 99 99 0 9999 99 9999 + 033188 9999 99 99 0 9999 99 9999 + 033189 9999 99 99 0 9999 99 9999 + 033190 9999 99 99 0 9999 99 9999 + 033191 9999 99 99 0 9999 99 9999 + 033192 9999 99 99 0 9999 99 9999 + 033193 9999 99 99 0 9999 99 9999 + 033194 9999 99 99 0 9999 99 9999 + 033195 9999 99 99 0 9999 99 9999 + 033196 9999 99 99 0 9999 99 9999 + 033197 9999 99 99 0 9999 99 9999 + 033198 9999 99 99 0 9999 99 9999 + 033199 9999 99 99 0 9999 99 9999 + 033200 9999 99 99 0 9999 99 9999 + 033201 9999 99 99 0 9999 99 9999 + 033202 9999 99 99 0 9999 99 9999 + 033203 9999 99 99 0 9999 99 9999 + 033204 9999 99 99 0 9999 99 9999 + 033205 9999 99 99 0 9999 99 9999 + 033206 9999 99 99 0 9999 99 9999 + 033207 9999 99 99 0 9999 99 9999 + 033208 9999 99 99 0 9999 99 9999 + 033209 9999 99 99 0 9999 99 9999 + 033210 9999 99 99 0 9999 99 9999 + 033211 9999 99 99 0 9999 99 9999 + 033212 9999 99 99 0 9999 99 9999 + 033213 9999 99 99 0 9999 99 9999 + 033214 9999 99 99 0 9999 99 9999 + 033215 9999 99 99 0 9999 99 9999 + 033216 9999 99 99 0 9999 99 9999 + 033217 1286 25 01 1 305258504 00 0553 + 033218 1286 25 02 1 305258504 01 0553 + 033219 1286 25 03 1 305258504 02 0553 + 033220 1286 25 04 1 305258504 03 0553 + 033221 1286 25 05 1 305258504 04 0553 + 033222 1286 25 06 1 305258504 05 0553 + 033223 1286 25 07 1 305258504 06 0553 + 033224 1286 25 08 1 305258504 07 0553 + 033225 1286 26 01 1 305258504 08 0553 + 033226 1286 26 02 1 305258504 09 0553 + 033227 1286 26 03 1 305258504 10 0553 + 033228 1286 26 04 1 305258504 11 0553 + 033229 1286 26 05 1 305258504 12 0553 + 033230 1286 26 06 1 305258504 13 0553 + 033231 1286 26 07 1 305258504 14 0553 + 033232 1286 26 08 1 305258504 15 0553 + 033233 1286 27 01 1 305258500 00 0552 + 033234 1286 27 02 1 305258500 01 0552 + 033235 1286 27 03 1 305258500 02 0552 + 033236 1286 27 04 1 305258500 03 0552 + 033237 1286 27 05 1 305258500 04 0552 + 033238 1286 27 06 1 305258500 05 0552 + 033239 1286 27 07 1 305258500 06 0552 + 033240 1286 27 08 1 305258500 07 0552 + 033241 1286 28 01 1 305258500 08 0552 + 033242 1286 28 02 1 305258500 09 0552 + 033243 1286 28 03 1 305258500 10 0552 + 033244 1286 28 04 1 305258500 11 0552 + 033245 1286 28 05 1 305258500 12 0552 + 033246 1286 28 06 1 305258500 13 0552 + 033247 1286 28 07 1 305258500 14 0552 + 033248 1286 28 08 1 305258500 15 0552 + 033249 1286 29 01 1 305258512 00 0555 + 033250 1286 29 02 1 305258512 01 0555 + 033251 1286 29 03 1 305258512 02 0555 + 033252 1286 29 04 1 305258512 03 0555 + 033253 1286 29 05 1 305258512 04 0555 + 033254 1286 29 06 1 305258512 05 0555 + 033255 1286 29 07 1 305258512 06 0555 + 033256 1286 29 08 1 305258512 07 0555 + 033257 1286 30 01 1 305258512 08 0555 + 033258 1286 30 02 1 305258512 09 0555 + 033259 1286 30 03 1 305258512 10 0555 + 033260 1286 30 04 1 305258512 11 0555 + 033261 1286 30 05 1 305258512 12 0555 + 033262 1286 30 06 1 305258512 13 0555 + 033263 1286 30 07 1 305258512 14 0555 + 033264 1286 30 08 1 305258512 15 0555 + 033265 1286 31 01 1 305258508 00 0554 + 033266 1286 31 02 1 305258508 01 0554 + 033267 1286 31 03 1 305258508 02 0554 + 033268 1286 31 04 1 305258508 03 0554 + 033269 1286 31 05 1 305258508 04 0554 + 033270 1286 31 06 1 305258508 05 0554 + 033271 1286 31 07 1 305258508 06 0554 + 033272 1286 31 08 1 305258508 07 0554 + 033273 1286 32 01 1 305258508 08 0554 + 033274 1286 32 02 1 305258508 09 0554 + 033275 1286 32 03 1 305258508 10 0554 + 033276 1286 32 04 1 305258508 11 0554 + 033277 1286 32 05 1 305258508 12 0554 + 033278 1286 32 06 1 305258508 13 0554 + 033279 1286 32 07 1 305258508 14 0554 + 033280 1286 32 08 1 305258508 15 0554 + 033281 1286 33 01 1 305262604 00 0562 + 033282 1286 33 02 1 305262604 01 0562 + 033283 1286 33 03 1 305262604 02 0562 + 033284 1286 33 04 1 305262604 03 0562 + 033285 1286 33 05 1 305262604 04 0562 + 033286 1286 33 06 1 305262604 05 0562 + 033287 1286 33 07 1 305262604 06 0562 + 033288 1286 33 08 1 305262604 07 0562 + 033289 1286 34 01 1 305262604 08 0562 + 033290 1286 34 02 1 305262604 09 0562 + 033291 1286 34 03 1 305262604 10 0562 + 033292 1286 34 04 1 305262604 11 0562 + 033293 1286 34 05 1 305262604 12 0562 + 033294 1286 34 06 1 305262604 13 0562 + 033295 1286 34 07 1 305262604 14 0562 + 033296 1286 34 08 1 305262604 15 0562 + 033297 1286 35 01 1 305262608 00 0563 + 033298 1286 35 02 1 305262608 01 0563 + 033299 1286 35 03 1 305262608 02 0563 + 033300 1286 35 04 1 305262608 03 0563 + 033301 1286 35 05 1 305262608 04 0563 + 033302 1286 35 06 1 305262608 05 0563 + 033303 1286 35 07 1 305262608 06 0563 + 033304 1286 35 08 1 305262608 07 0563 + 033305 1286 36 01 1 305262608 08 0563 + 033306 1286 36 02 1 305262608 09 0563 + 033307 1286 36 03 1 305262608 10 0563 + 033308 1286 36 04 1 305262608 11 0563 + 033309 1286 36 05 1 305262608 12 0563 + 033310 1286 36 06 1 305262608 13 0563 + 033311 1286 36 07 1 305262608 14 0563 + 033312 1286 36 08 1 305262608 15 0563 + 033313 1286 37 01 1 305262596 00 0560 + 033314 1286 37 02 1 305262596 01 0560 + 033315 1286 37 03 1 305262596 02 0560 + 033316 1286 37 04 1 305262596 03 0560 + 033317 1286 37 05 1 305262596 04 0560 + 033318 1286 37 06 1 305262596 05 0560 + 033319 1286 37 07 1 305262596 06 0560 + 033320 1286 37 08 1 305262596 07 0560 + 033321 1286 38 01 1 305262596 08 0560 + 033322 1286 38 02 1 305262596 09 0560 + 033323 1286 38 03 1 305262596 10 0560 + 033324 1286 38 04 1 305262596 11 0560 + 033325 1286 38 05 1 305262596 12 0560 + 033326 1286 38 06 1 305262596 13 0560 + 033327 1286 38 07 1 305262596 14 0560 + 033328 1286 38 08 1 305262596 15 0560 + 033329 1286 39 01 1 305262600 00 0561 + 033330 1286 39 02 1 305262600 01 0561 + 033331 1286 39 03 1 305262600 02 0561 + 033332 1286 39 04 1 305262600 03 0561 + 033333 1286 39 05 1 305262600 04 0561 + 033334 1286 39 06 1 305262600 05 0561 + 033335 1286 39 07 1 305262600 06 0561 + 033336 1286 39 08 1 305262600 07 0561 + 033337 1286 40 01 1 305262600 08 0561 + 033338 1286 40 02 1 305262600 09 0561 + 033339 1286 40 03 1 305262600 10 0561 + 033340 1286 40 04 1 305262600 11 0561 + 033341 1286 40 05 1 305262600 12 0561 + 033342 1286 40 06 1 305262600 13 0561 + 033343 1286 40 07 1 305262600 14 0561 + 033344 1286 40 08 1 305262600 15 0561 + 033345 9999 99 99 0 9999 99 9999 + 033346 9999 99 99 0 9999 99 9999 + 033347 9999 99 99 0 9999 99 9999 + 033348 9999 99 99 0 9999 99 9999 + 033349 9999 99 99 0 9999 99 9999 + 033350 9999 99 99 0 9999 99 9999 + 033351 9999 99 99 0 9999 99 9999 + 033352 9999 99 99 0 9999 99 9999 + 033353 9999 99 99 0 9999 99 9999 + 033354 9999 99 99 0 9999 99 9999 + 033355 9999 99 99 0 9999 99 9999 + 033356 9999 99 99 0 9999 99 9999 + 033357 9999 99 99 0 9999 99 9999 + 033358 9999 99 99 0 9999 99 9999 + 033359 9999 99 99 0 9999 99 9999 + 033360 9999 99 99 0 9999 99 9999 + 033361 9999 99 99 0 9999 99 9999 + 033362 9999 99 99 0 9999 99 9999 + 033363 9999 99 99 0 9999 99 9999 + 033364 9999 99 99 0 9999 99 9999 + 033365 9999 99 99 0 9999 99 9999 + 033366 9999 99 99 0 9999 99 9999 + 033367 9999 99 99 0 9999 99 9999 + 033368 9999 99 99 0 9999 99 9999 + 033369 9999 99 99 0 9999 99 9999 + 033370 9999 99 99 0 9999 99 9999 + 033371 9999 99 99 0 9999 99 9999 + 033372 9999 99 99 0 9999 99 9999 + 033373 9999 99 99 0 9999 99 9999 + 033374 9999 99 99 0 9999 99 9999 + 033375 9999 99 99 0 9999 99 9999 + 033376 9999 99 99 0 9999 99 9999 + 033377 9999 99 99 0 9999 99 9999 + 033378 9999 99 99 0 9999 99 9999 + 033379 9999 99 99 0 9999 99 9999 + 033380 9999 99 99 0 9999 99 9999 + 033381 9999 99 99 0 9999 99 9999 + 033382 9999 99 99 0 9999 99 9999 + 033383 9999 99 99 0 9999 99 9999 + 033384 9999 99 99 0 9999 99 9999 + 033385 9999 99 99 0 9999 99 9999 + 033386 9999 99 99 0 9999 99 9999 + 033387 9999 99 99 0 9999 99 9999 + 033388 9999 99 99 0 9999 99 9999 + 033389 9999 99 99 0 9999 99 9999 + 033390 9999 99 99 0 9999 99 9999 + 033391 9999 99 99 0 9999 99 9999 + 033392 9999 99 99 0 9999 99 9999 + 033393 9999 99 99 0 9999 99 9999 + 033394 9999 99 99 0 9999 99 9999 + 033395 9999 99 99 0 9999 99 9999 + 033396 9999 99 99 0 9999 99 9999 + 033397 9999 99 99 0 9999 99 9999 + 033398 9999 99 99 0 9999 99 9999 + 033399 9999 99 99 0 9999 99 9999 + 033400 9999 99 99 0 9999 99 9999 + 033401 9999 99 99 0 9999 99 9999 + 033402 9999 99 99 0 9999 99 9999 + 033403 9999 99 99 0 9999 99 9999 + 033404 9999 99 99 0 9999 99 9999 + 033405 9999 99 99 0 9999 99 9999 + 033406 9999 99 99 0 9999 99 9999 + 033407 9999 99 99 0 9999 99 9999 + 033408 9999 99 99 0 9999 99 9999 + 033409 1287 01 01 1 303071248 08 0059 + 033410 1287 01 02 1 303071248 09 0059 + 033411 9999 99 99 0 9999 99 9999 + 033412 9999 99 99 0 9999 99 9999 + 033413 9999 99 99 0 9999 99 9999 + 033414 9999 99 99 0 9999 99 9999 + 033415 9999 99 99 0 9999 99 9999 + 033416 9999 99 99 0 9999 99 9999 + 033417 1287 02 01 1 303071248 10 0059 + 033418 1287 02 02 1 303071248 11 0059 + 033419 9999 99 99 0 9999 99 9999 + 033420 9999 99 99 0 9999 99 9999 + 033421 9999 99 99 0 9999 99 9999 + 033422 9999 99 99 0 9999 99 9999 + 033423 9999 99 99 0 9999 99 9999 + 033424 9999 99 99 0 9999 99 9999 + 033425 1287 03 01 1 303071248 12 0059 + 033426 1287 03 02 1 303071248 13 0059 + 033427 9999 99 99 0 9999 99 9999 + 033428 9999 99 99 0 9999 99 9999 + 033429 9999 99 99 0 9999 99 9999 + 033430 9999 99 99 0 9999 99 9999 + 033431 9999 99 99 0 9999 99 9999 + 033432 9999 99 99 0 9999 99 9999 + 033433 1287 04 01 1 303071248 14 0059 + 033434 1287 04 02 1 303071248 15 0059 + 033435 9999 99 99 0 9999 99 9999 + 033436 9999 99 99 0 9999 99 9999 + 033437 9999 99 99 0 9999 99 9999 + 033438 9999 99 99 0 9999 99 9999 + 033439 9999 99 99 0 9999 99 9999 + 033440 9999 99 99 0 9999 99 9999 + 033441 1287 05 01 1 303071248 00 0059 + 033442 1287 05 02 1 303071248 01 0059 + 033443 9999 99 99 0 9999 99 9999 + 033444 9999 99 99 0 9999 99 9999 + 033445 9999 99 99 0 9999 99 9999 + 033446 9999 99 99 0 9999 99 9999 + 033447 9999 99 99 0 9999 99 9999 + 033448 9999 99 99 0 9999 99 9999 + 033449 1287 06 01 1 303071248 02 0059 + 033450 1287 06 02 1 303071248 03 0059 + 033451 9999 99 99 0 9999 99 9999 + 033452 9999 99 99 0 9999 99 9999 + 033453 9999 99 99 0 9999 99 9999 + 033454 9999 99 99 0 9999 99 9999 + 033455 9999 99 99 0 9999 99 9999 + 033456 9999 99 99 0 9999 99 9999 + 033457 1287 07 01 1 303071248 04 0059 + 033458 1287 07 02 1 303071248 05 0059 + 033459 9999 99 99 0 9999 99 9999 + 033460 9999 99 99 0 9999 99 9999 + 033461 9999 99 99 0 9999 99 9999 + 033462 9999 99 99 0 9999 99 9999 + 033463 9999 99 99 0 9999 99 9999 + 033464 9999 99 99 0 9999 99 9999 + 033465 1287 08 01 1 303071248 06 0059 + 033466 1287 08 02 1 303071248 07 0059 + 033467 9999 99 99 0 9999 99 9999 + 033468 9999 99 99 0 9999 99 9999 + 033469 9999 99 99 0 9999 99 9999 + 033470 9999 99 99 0 9999 99 9999 + 033471 9999 99 99 0 9999 99 9999 + 033472 9999 99 99 0 9999 99 9999 + 033473 1287 09 01 1 304160780 00 0234 + 033474 1287 09 02 1 304160780 01 0234 + 033475 1287 09 03 1 304160780 02 0234 + 033476 1287 09 04 1 304160780 03 0234 + 033477 9999 99 99 0 9999 99 9999 + 033478 9999 99 99 0 9999 99 9999 + 033479 9999 99 99 0 9999 99 9999 + 033480 9999 99 99 0 9999 99 9999 + 033481 1287 10 01 1 304160780 04 0234 + 033482 1287 10 02 1 304160780 05 0234 + 033483 1287 10 03 1 304160780 06 0234 + 033484 1287 10 04 1 304160780 07 0234 + 033485 9999 99 99 0 9999 99 9999 + 033486 9999 99 99 0 9999 99 9999 + 033487 9999 99 99 0 9999 99 9999 + 033488 9999 99 99 0 9999 99 9999 + 033489 1287 11 01 1 304160780 08 0234 + 033490 1287 11 02 1 304160780 09 0234 + 033491 1287 11 03 1 304160780 10 0234 + 033492 1287 11 04 1 304160780 11 0234 + 033493 9999 99 99 0 9999 99 9999 + 033494 9999 99 99 0 9999 99 9999 + 033495 9999 99 99 0 9999 99 9999 + 033496 9999 99 99 0 9999 99 9999 + 033497 1287 12 01 1 304160780 12 0234 + 033498 1287 12 02 1 304160780 13 0234 + 033499 1287 12 03 1 304160780 14 0234 + 033500 1287 12 04 1 304160780 15 0234 + 033501 9999 99 99 0 9999 99 9999 + 033502 9999 99 99 0 9999 99 9999 + 033503 9999 99 99 0 9999 99 9999 + 033504 9999 99 99 0 9999 99 9999 + 033505 1287 13 01 1 304160784 08 0235 + 033506 1287 13 02 1 304160784 09 0235 + 033507 1287 13 03 1 304160784 10 0235 + 033508 1287 13 04 1 304160784 11 0235 + 033509 9999 99 99 0 9999 99 9999 + 033510 9999 99 99 0 9999 99 9999 + 033511 9999 99 99 0 9999 99 9999 + 033512 9999 99 99 0 9999 99 9999 + 033513 1287 14 01 1 304160784 12 0235 + 033514 1287 14 02 1 304160784 13 0235 + 033515 1287 14 03 1 304160784 14 0235 + 033516 1287 14 04 1 304160784 15 0235 + 033517 9999 99 99 0 9999 99 9999 + 033518 9999 99 99 0 9999 99 9999 + 033519 9999 99 99 0 9999 99 9999 + 033520 9999 99 99 0 9999 99 9999 + 033521 1287 15 01 1 304160784 00 0235 + 033522 1287 15 02 1 304160784 01 0235 + 033523 1287 15 03 1 304160784 02 0235 + 033524 1287 15 04 1 304160784 03 0235 + 033525 9999 99 99 0 9999 99 9999 + 033526 9999 99 99 0 9999 99 9999 + 033527 9999 99 99 0 9999 99 9999 + 033528 9999 99 99 0 9999 99 9999 + 033529 1287 16 01 1 304160784 04 0235 + 033530 1287 16 02 1 304160784 05 0235 + 033531 1287 16 03 1 304160784 06 0235 + 033532 1287 16 04 1 304160784 07 0235 + 033533 9999 99 99 0 9999 99 9999 + 033534 9999 99 99 0 9999 99 9999 + 033535 9999 99 99 0 9999 99 9999 + 033536 9999 99 99 0 9999 99 9999 + 033537 1287 17 01 1 306352136 00 0993 + 033538 1287 17 02 1 306352136 01 0993 + 033539 1287 17 03 1 306352136 02 0993 + 033540 1287 17 04 1 306352136 03 0993 + 033541 1287 17 05 1 306352136 04 0993 + 033542 1287 17 06 1 306352136 05 0993 + 033543 1287 17 07 1 306352136 06 0993 + 033544 1287 17 08 1 306352136 07 0993 + 033545 1287 18 01 1 306352136 08 0993 + 033546 1287 18 02 1 306352136 09 0993 + 033547 1287 18 03 1 306352136 10 0993 + 033548 1287 18 04 1 306352136 11 0993 + 033549 1287 18 05 1 306352136 12 0993 + 033550 1287 18 06 1 306352136 13 0993 + 033551 1287 18 07 1 306352136 14 0993 + 033552 1287 18 08 1 306352136 15 0993 + 033553 1287 19 01 1 306352132 00 0992 + 033554 1287 19 02 1 306352132 01 0992 + 033555 1287 19 03 1 306352132 02 0992 + 033556 1287 19 04 1 306352132 03 0992 + 033557 1287 19 05 1 306352132 04 0992 + 033558 1287 19 06 1 306352132 05 0992 + 033559 1287 19 07 1 306352132 06 0992 + 033560 1287 19 08 1 306352132 07 0992 + 033561 1287 20 01 1 306352132 08 0992 + 033562 1287 20 02 1 306352132 09 0992 + 033563 1287 20 03 1 306352132 10 0992 + 033564 1287 20 04 1 306352132 11 0992 + 033565 1287 20 05 1 306352132 12 0992 + 033566 1287 20 06 1 306352132 13 0992 + 033567 1287 20 07 1 306352132 14 0992 + 033568 1287 20 08 1 306352132 15 0992 + 033569 1287 21 01 1 306352144 00 0995 + 033570 1287 21 02 1 306352144 01 0995 + 033571 1287 21 03 1 306352144 02 0995 + 033572 1287 21 04 1 306352144 03 0995 + 033573 1287 21 05 1 306352144 04 0995 + 033574 1287 21 06 1 306352144 05 0995 + 033575 1287 21 07 1 306352144 06 0995 + 033576 1287 21 08 1 306352144 07 0995 + 033577 1287 22 01 1 306352144 08 0995 + 033578 1287 22 02 1 306352144 09 0995 + 033579 1287 22 03 1 306352144 10 0995 + 033580 1287 22 04 1 306352144 11 0995 + 033581 1287 22 05 1 306352144 12 0995 + 033582 1287 22 06 1 306352144 13 0995 + 033583 1287 22 07 1 306352144 14 0995 + 033584 1287 22 08 1 306352144 15 0995 + 033585 1287 23 01 1 306352140 00 0994 + 033586 1287 23 02 1 306352140 01 0994 + 033587 1287 23 03 1 306352140 02 0994 + 033588 1287 23 04 1 306352140 03 0994 + 033589 1287 23 05 1 306352140 04 0994 + 033590 1287 23 06 1 306352140 05 0994 + 033591 1287 23 07 1 306352140 06 0994 + 033592 1287 23 08 1 306352140 07 0994 + 033593 1287 24 01 1 306352140 08 0994 + 033594 1287 24 02 1 306352140 09 0994 + 033595 1287 24 03 1 306352140 10 0994 + 033596 1287 24 04 1 306352140 11 0994 + 033597 1287 24 05 1 306352140 12 0994 + 033598 1287 24 06 1 306352140 13 0994 + 033599 1287 24 07 1 306352140 14 0994 + 033600 1287 24 08 1 306352140 15 0994 + 033601 1287 25 01 1 303071244 08 0058 + 033602 1287 25 02 1 303071244 09 0058 + 033603 9999 99 99 0 9999 99 9999 + 033604 9999 99 99 0 9999 99 9999 + 033605 9999 99 99 0 9999 99 9999 + 033606 9999 99 99 0 9999 99 9999 + 033607 9999 99 99 0 9999 99 9999 + 033608 9999 99 99 0 9999 99 9999 + 033609 1287 26 01 1 303071244 10 0058 + 033610 1287 26 02 1 303071244 11 0058 + 033611 9999 99 99 0 9999 99 9999 + 033612 9999 99 99 0 9999 99 9999 + 033613 9999 99 99 0 9999 99 9999 + 033614 9999 99 99 0 9999 99 9999 + 033615 9999 99 99 0 9999 99 9999 + 033616 9999 99 99 0 9999 99 9999 + 033617 1287 27 01 1 303071244 12 0058 + 033618 1287 27 02 1 303071244 13 0058 + 033619 9999 99 99 0 9999 99 9999 + 033620 9999 99 99 0 9999 99 9999 + 033621 9999 99 99 0 9999 99 9999 + 033622 9999 99 99 0 9999 99 9999 + 033623 9999 99 99 0 9999 99 9999 + 033624 9999 99 99 0 9999 99 9999 + 033625 1287 28 01 1 303071244 14 0058 + 033626 1287 28 02 1 303071244 15 0058 + 033627 9999 99 99 0 9999 99 9999 + 033628 9999 99 99 0 9999 99 9999 + 033629 9999 99 99 0 9999 99 9999 + 033630 9999 99 99 0 9999 99 9999 + 033631 9999 99 99 0 9999 99 9999 + 033632 9999 99 99 0 9999 99 9999 + 033633 1287 29 01 1 303071244 04 0058 + 033634 1287 29 02 1 303071244 05 0058 + 033635 9999 99 99 0 9999 99 9999 + 033636 9999 99 99 0 9999 99 9999 + 033637 9999 99 99 0 9999 99 9999 + 033638 9999 99 99 0 9999 99 9999 + 033639 9999 99 99 0 9999 99 9999 + 033640 9999 99 99 0 9999 99 9999 + 033641 1287 30 01 1 303071244 06 0058 + 033642 1287 30 02 1 303071244 07 0058 + 033643 9999 99 99 0 9999 99 9999 + 033644 9999 99 99 0 9999 99 9999 + 033645 9999 99 99 0 9999 99 9999 + 033646 9999 99 99 0 9999 99 9999 + 033647 9999 99 99 0 9999 99 9999 + 033648 9999 99 99 0 9999 99 9999 + 033649 1287 31 01 1 303071244 00 0058 + 033650 1287 31 02 1 303071244 01 0058 + 033651 9999 99 99 0 9999 99 9999 + 033652 9999 99 99 0 9999 99 9999 + 033653 9999 99 99 0 9999 99 9999 + 033654 9999 99 99 0 9999 99 9999 + 033655 9999 99 99 0 9999 99 9999 + 033656 9999 99 99 0 9999 99 9999 + 033657 1287 32 01 1 303071244 02 0058 + 033658 1287 32 02 1 303071244 03 0058 + 033659 9999 99 99 0 9999 99 9999 + 033660 9999 99 99 0 9999 99 9999 + 033661 9999 99 99 0 9999 99 9999 + 033662 9999 99 99 0 9999 99 9999 + 033663 9999 99 99 0 9999 99 9999 + 033664 9999 99 99 0 9999 99 9999 + 033665 1287 33 01 1 306356232 00 1001 + 033666 1287 33 02 1 306356232 01 1001 + 033667 1287 33 03 1 306356232 02 1001 + 033668 1287 33 04 1 306356232 03 1001 + 033669 1287 33 05 1 306356232 04 1001 + 033670 1287 33 06 1 306356232 05 1001 + 033671 1287 33 07 1 306356232 06 1001 + 033672 1287 33 08 1 306356232 07 1001 + 033673 1287 34 01 1 306356232 08 1001 + 033674 1287 34 02 1 306356232 09 1001 + 033675 1287 34 03 1 306356232 10 1001 + 033676 1287 34 04 1 306356232 11 1001 + 033677 1287 34 05 1 306356232 12 1001 + 033678 1287 34 06 1 306356232 13 1001 + 033679 1287 34 07 1 306356232 14 1001 + 033680 1287 34 08 1 306356232 15 1001 + 033681 1287 35 01 1 306356228 00 1000 + 033682 1287 35 02 1 306356228 01 1000 + 033683 1287 35 03 1 306356228 02 1000 + 033684 1287 35 04 1 306356228 03 1000 + 033685 1287 35 05 1 306356228 04 1000 + 033686 1287 35 06 1 306356228 05 1000 + 033687 1287 35 07 1 306356228 06 1000 + 033688 1287 35 08 1 306356228 07 1000 + 033689 1287 36 01 1 306356228 08 1000 + 033690 1287 36 02 1 306356228 09 1000 + 033691 1287 36 03 1 306356228 10 1000 + 033692 1287 36 04 1 306356228 11 1000 + 033693 1287 36 05 1 306356228 12 1000 + 033694 1287 36 06 1 306356228 13 1000 + 033695 1287 36 07 1 306356228 14 1000 + 033696 1287 36 08 1 306356228 15 1000 + 033697 1287 37 01 1 306356240 00 1003 + 033698 1287 37 02 1 306356240 01 1003 + 033699 1287 37 03 1 306356240 02 1003 + 033700 1287 37 04 1 306356240 03 1003 + 033701 1287 37 05 1 306356240 04 1003 + 033702 1287 37 06 1 306356240 05 1003 + 033703 1287 37 07 1 306356240 06 1003 + 033704 1287 37 08 1 306356240 07 1003 + 033705 1287 38 01 1 306356240 08 1003 + 033706 1287 38 02 1 306356240 09 1003 + 033707 1287 38 03 1 306356240 10 1003 + 033708 1287 38 04 1 306356240 11 1003 + 033709 1287 38 05 1 306356240 12 1003 + 033710 1287 38 06 1 306356240 13 1003 + 033711 1287 38 07 1 306356240 14 1003 + 033712 1287 38 08 1 306356240 15 1003 + 033713 1287 39 01 1 306356236 00 1002 + 033714 1287 39 02 1 306356236 01 1002 + 033715 1287 39 03 1 306356236 02 1002 + 033716 1287 39 04 1 306356236 03 1002 + 033717 1287 39 05 1 306356236 04 1002 + 033718 1287 39 06 1 306356236 05 1002 + 033719 1287 39 07 1 306356236 06 1002 + 033720 1287 39 08 1 306356236 07 1002 + 033721 1287 40 01 1 306356236 08 1002 + 033722 1287 40 02 1 306356236 09 1002 + 033723 1287 40 03 1 306356236 10 1002 + 033724 1287 40 04 1 306356236 11 1002 + 033725 1287 40 05 1 306356236 12 1002 + 033726 1287 40 06 1 306356236 13 1002 + 033727 1287 40 07 1 306356236 14 1002 + 033728 1287 40 08 1 306356236 15 1002 + 033729 1287 41 01 1 304160776 00 0233 + 033730 1287 41 02 1 304160776 01 0233 + 033731 1287 41 03 1 304160776 02 0233 + 033732 1287 41 04 1 304160776 03 0233 + 033733 9999 99 99 0 9999 99 9999 + 033734 9999 99 99 0 9999 99 9999 + 033735 9999 99 99 0 9999 99 9999 + 033736 9999 99 99 0 9999 99 9999 + 033737 1287 42 01 1 304160776 04 0233 + 033738 1287 42 02 1 304160776 05 0233 + 033739 1287 42 03 1 304160776 06 0233 + 033740 1287 42 04 1 304160776 07 0233 + 033741 9999 99 99 0 9999 99 9999 + 033742 9999 99 99 0 9999 99 9999 + 033743 9999 99 99 0 9999 99 9999 + 033744 9999 99 99 0 9999 99 9999 + 033745 1287 43 01 1 304160776 08 0233 + 033746 1287 43 02 1 304160776 09 0233 + 033747 1287 43 03 1 304160776 10 0233 + 033748 1287 43 04 1 304160776 11 0233 + 033749 9999 99 99 0 9999 99 9999 + 033750 9999 99 99 0 9999 99 9999 + 033751 9999 99 99 0 9999 99 9999 + 033752 9999 99 99 0 9999 99 9999 + 033753 1287 44 01 1 304160776 12 0233 + 033754 1287 44 02 1 304160776 13 0233 + 033755 1287 44 03 1 304160776 14 0233 + 033756 1287 44 04 1 304160776 15 0233 + 033757 9999 99 99 0 9999 99 9999 + 033758 9999 99 99 0 9999 99 9999 + 033759 9999 99 99 0 9999 99 9999 + 033760 9999 99 99 0 9999 99 9999 + 033761 1287 45 01 1 304160772 00 0232 + 033762 1287 45 02 1 304160772 01 0232 + 033763 1287 45 03 1 304160772 02 0232 + 033764 1287 45 04 1 304160772 03 0232 + 033765 9999 99 99 0 9999 99 9999 + 033766 9999 99 99 0 9999 99 9999 + 033767 9999 99 99 0 9999 99 9999 + 033768 9999 99 99 0 9999 99 9999 + 033769 1287 46 01 1 304160772 04 0232 + 033770 1287 46 02 1 304160772 05 0232 + 033771 1287 46 03 1 304160772 06 0232 + 033772 1287 46 04 1 304160772 07 0232 + 033773 9999 99 99 0 9999 99 9999 + 033774 9999 99 99 0 9999 99 9999 + 033775 9999 99 99 0 9999 99 9999 + 033776 9999 99 99 0 9999 99 9999 + 033777 1287 47 01 1 304160772 08 0232 + 033778 1287 47 02 1 304160772 09 0232 + 033779 1287 47 03 1 304160772 10 0232 + 033780 1287 47 04 1 304160772 11 0232 + 033781 9999 99 99 0 9999 99 9999 + 033782 9999 99 99 0 9999 99 9999 + 033783 9999 99 99 0 9999 99 9999 + 033784 9999 99 99 0 9999 99 9999 + 033785 1287 48 01 1 304160772 12 0232 + 033786 1287 48 02 1 304160772 13 0232 + 033787 1287 48 03 1 304160772 14 0232 + 033788 1287 48 04 1 304160772 15 0232 + 033789 9999 99 99 0 9999 99 9999 + 033790 9999 99 99 0 9999 99 9999 + 033791 9999 99 99 0 9999 99 9999 + 033792 9999 99 99 0 9999 99 9999 + 033793 1288 01 01 1 304164876 08 0242 + 033794 1288 01 02 1 304164876 09 0242 + 033795 1288 01 03 1 304164876 10 0242 + 033796 1288 01 04 1 304164876 11 0242 + 033797 9999 99 99 0 9999 99 9999 + 033798 9999 99 99 0 9999 99 9999 + 033799 9999 99 99 0 9999 99 9999 + 033800 9999 99 99 0 9999 99 9999 + 033801 1288 02 01 1 304164876 12 0242 + 033802 1288 02 02 1 304164876 13 0242 + 033803 1288 02 03 1 304164876 14 0242 + 033804 1288 02 04 1 304164876 15 0242 + 033805 9999 99 99 0 9999 99 9999 + 033806 9999 99 99 0 9999 99 9999 + 033807 9999 99 99 0 9999 99 9999 + 033808 9999 99 99 0 9999 99 9999 + 033809 1288 03 01 1 304164876 00 0242 + 033810 1288 03 02 1 304164876 01 0242 + 033811 1288 03 03 1 304164876 02 0242 + 033812 1288 03 04 1 304164876 03 0242 + 033813 9999 99 99 0 9999 99 9999 + 033814 9999 99 99 0 9999 99 9999 + 033815 9999 99 99 0 9999 99 9999 + 033816 9999 99 99 0 9999 99 9999 + 033817 1288 04 01 1 304164876 04 0242 + 033818 1288 04 02 1 304164876 05 0242 + 033819 1288 04 03 1 304164876 06 0242 + 033820 1288 04 04 1 304164876 07 0242 + 033821 9999 99 99 0 9999 99 9999 + 033822 9999 99 99 0 9999 99 9999 + 033823 9999 99 99 0 9999 99 9999 + 033824 9999 99 99 0 9999 99 9999 + 033825 1288 05 01 1 304164880 08 0243 + 033826 1288 05 02 1 304164880 09 0243 + 033827 1288 05 03 1 304164880 10 0243 + 033828 1288 05 04 1 304164880 11 0243 + 033829 9999 99 99 0 9999 99 9999 + 033830 9999 99 99 0 9999 99 9999 + 033831 9999 99 99 0 9999 99 9999 + 033832 9999 99 99 0 9999 99 9999 + 033833 1288 06 01 1 304164880 12 0243 + 033834 1288 06 02 1 304164880 13 0243 + 033835 1288 06 03 1 304164880 14 0243 + 033836 1288 06 04 1 304164880 15 0243 + 033837 9999 99 99 0 9999 99 9999 + 033838 9999 99 99 0 9999 99 9999 + 033839 9999 99 99 0 9999 99 9999 + 033840 9999 99 99 0 9999 99 9999 + 033841 1288 07 01 1 304164880 00 0243 + 033842 1288 07 02 1 304164880 01 0243 + 033843 1288 07 03 1 304164880 02 0243 + 033844 1288 07 04 1 304164880 03 0243 + 033845 9999 99 99 0 9999 99 9999 + 033846 9999 99 99 0 9999 99 9999 + 033847 9999 99 99 0 9999 99 9999 + 033848 9999 99 99 0 9999 99 9999 + 033849 1288 08 01 1 304164880 04 0243 + 033850 1288 08 02 1 304164880 05 0243 + 033851 1288 08 03 1 304164880 06 0243 + 033852 1288 08 04 1 304164880 07 0243 + 033853 9999 99 99 0 9999 99 9999 + 033854 9999 99 99 0 9999 99 9999 + 033855 9999 99 99 0 9999 99 9999 + 033856 9999 99 99 0 9999 99 9999 + 033857 1288 09 01 1 306360332 00 1010 + 033858 1288 09 02 1 306360332 01 1010 + 033859 1288 09 03 1 306360332 02 1010 + 033860 1288 09 04 1 306360332 03 1010 + 033861 1288 09 05 1 306360332 04 1010 + 033862 1288 09 06 1 306360332 05 1010 + 033863 1288 09 07 1 306360332 06 1010 + 033864 1288 09 08 1 306360332 07 1010 + 033865 1288 10 01 1 306360332 08 1010 + 033866 1288 10 02 1 306360332 09 1010 + 033867 1288 10 03 1 306360332 10 1010 + 033868 1288 10 04 1 306360332 11 1010 + 033869 1288 10 05 1 306360332 12 1010 + 033870 1288 10 06 1 306360332 13 1010 + 033871 1288 10 07 1 306360332 14 1010 + 033872 1288 10 08 1 306360332 15 1010 + 033873 1288 11 01 1 306360336 00 1011 + 033874 1288 11 02 1 306360336 01 1011 + 033875 1288 11 03 1 306360336 02 1011 + 033876 1288 11 04 1 306360336 03 1011 + 033877 1288 11 05 1 306360336 04 1011 + 033878 1288 11 06 1 306360336 05 1011 + 033879 1288 11 07 1 306360336 06 1011 + 033880 1288 11 08 1 306360336 07 1011 + 033881 1288 12 01 1 306360336 08 1011 + 033882 1288 12 02 1 306360336 09 1011 + 033883 1288 12 03 1 306360336 10 1011 + 033884 1288 12 04 1 306360336 11 1011 + 033885 1288 12 05 1 306360336 12 1011 + 033886 1288 12 06 1 306360336 13 1011 + 033887 1288 12 07 1 306360336 14 1011 + 033888 1288 12 08 1 306360336 15 1011 + 033889 1288 13 01 1 306360324 00 1008 + 033890 1288 13 02 1 306360324 01 1008 + 033891 1288 13 03 1 306360324 02 1008 + 033892 1288 13 04 1 306360324 03 1008 + 033893 1288 13 05 1 306360324 04 1008 + 033894 1288 13 06 1 306360324 05 1008 + 033895 1288 13 07 1 306360324 06 1008 + 033896 1288 13 08 1 306360324 07 1008 + 033897 1288 14 01 1 306360324 08 1008 + 033898 1288 14 02 1 306360324 09 1008 + 033899 1288 14 03 1 306360324 10 1008 + 033900 1288 14 04 1 306360324 11 1008 + 033901 1288 14 05 1 306360324 12 1008 + 033902 1288 14 06 1 306360324 13 1008 + 033903 1288 14 07 1 306360324 14 1008 + 033904 1288 14 08 1 306360324 15 1008 + 033905 1288 15 01 1 306360328 00 1009 + 033906 1288 15 02 1 306360328 01 1009 + 033907 1288 15 03 1 306360328 02 1009 + 033908 1288 15 04 1 306360328 03 1009 + 033909 1288 15 05 1 306360328 04 1009 + 033910 1288 15 06 1 306360328 05 1009 + 033911 1288 15 07 1 306360328 06 1009 + 033912 1288 15 08 1 306360328 07 1009 + 033913 1288 16 01 1 306360328 08 1009 + 033914 1288 16 02 1 306360328 09 1009 + 033915 1288 16 03 1 306360328 10 1009 + 033916 1288 16 04 1 306360328 11 1009 + 033917 1288 16 05 1 306360328 12 1009 + 033918 1288 16 06 1 306360328 13 1009 + 033919 1288 16 07 1 306360328 14 1009 + 033920 1288 16 08 1 306360328 15 1009 + 033921 1288 17 01 1 303075332 12 0064 + 033922 1288 17 02 1 303075332 13 0064 + 033923 9999 99 99 0 9999 99 9999 + 033924 9999 99 99 0 9999 99 9999 + 033925 9999 99 99 0 9999 99 9999 + 033926 9999 99 99 0 9999 99 9999 + 033927 9999 99 99 0 9999 99 9999 + 033928 9999 99 99 0 9999 99 9999 + 033929 1288 18 01 1 303075332 14 0064 + 033930 1288 18 02 1 303075332 15 0064 + 033931 9999 99 99 0 9999 99 9999 + 033932 9999 99 99 0 9999 99 9999 + 033933 9999 99 99 0 9999 99 9999 + 033934 9999 99 99 0 9999 99 9999 + 033935 9999 99 99 0 9999 99 9999 + 033936 9999 99 99 0 9999 99 9999 + 033937 1288 19 01 1 303075332 08 0064 + 033938 1288 19 02 1 303075332 09 0064 + 033939 9999 99 99 0 9999 99 9999 + 033940 9999 99 99 0 9999 99 9999 + 033941 9999 99 99 0 9999 99 9999 + 033942 9999 99 99 0 9999 99 9999 + 033943 9999 99 99 0 9999 99 9999 + 033944 9999 99 99 0 9999 99 9999 + 033945 1288 20 01 1 303075332 10 0064 + 033946 1288 20 02 1 303075332 11 0064 + 033947 9999 99 99 0 9999 99 9999 + 033948 9999 99 99 0 9999 99 9999 + 033949 9999 99 99 0 9999 99 9999 + 033950 9999 99 99 0 9999 99 9999 + 033951 9999 99 99 0 9999 99 9999 + 033952 9999 99 99 0 9999 99 9999 + 033953 1288 21 01 1 303075332 00 0064 + 033954 1288 21 02 1 303075332 01 0064 + 033955 9999 99 99 0 9999 99 9999 + 033956 9999 99 99 0 9999 99 9999 + 033957 9999 99 99 0 9999 99 9999 + 033958 9999 99 99 0 9999 99 9999 + 033959 9999 99 99 0 9999 99 9999 + 033960 9999 99 99 0 9999 99 9999 + 033961 1288 22 01 1 303075332 02 0064 + 033962 1288 22 02 1 303075332 03 0064 + 033963 9999 99 99 0 9999 99 9999 + 033964 9999 99 99 0 9999 99 9999 + 033965 9999 99 99 0 9999 99 9999 + 033966 9999 99 99 0 9999 99 9999 + 033967 9999 99 99 0 9999 99 9999 + 033968 9999 99 99 0 9999 99 9999 + 033969 1288 23 01 1 303075332 04 0064 + 033970 1288 23 02 1 303075332 05 0064 + 033971 9999 99 99 0 9999 99 9999 + 033972 9999 99 99 0 9999 99 9999 + 033973 9999 99 99 0 9999 99 9999 + 033974 9999 99 99 0 9999 99 9999 + 033975 9999 99 99 0 9999 99 9999 + 033976 9999 99 99 0 9999 99 9999 + 033977 1288 24 01 1 303075332 06 0064 + 033978 1288 24 02 1 303075332 07 0064 + 033979 9999 99 99 0 9999 99 9999 + 033980 9999 99 99 0 9999 99 9999 + 033981 9999 99 99 0 9999 99 9999 + 033982 9999 99 99 0 9999 99 9999 + 033983 9999 99 99 0 9999 99 9999 + 033984 9999 99 99 0 9999 99 9999 + 033985 1288 25 01 1 305254408 00 0545 + 033986 1288 25 02 1 305254408 01 0545 + 033987 1288 25 03 1 305254408 02 0545 + 033988 1288 25 04 1 305254408 03 0545 + 033989 1288 25 05 1 305254408 04 0545 + 033990 1288 25 06 1 305254408 05 0545 + 033991 1288 25 07 1 305254408 06 0545 + 033992 1288 25 08 1 305254408 07 0545 + 033993 1288 26 01 1 305254408 08 0545 + 033994 1288 26 02 1 305254408 09 0545 + 033995 1288 26 03 1 305254408 10 0545 + 033996 1288 26 04 1 305254408 11 0545 + 033997 1288 26 05 1 305254408 12 0545 + 033998 1288 26 06 1 305254408 13 0545 + 033999 1288 26 07 1 305254408 14 0545 + 034000 1288 26 08 1 305254408 15 0545 + 034001 1288 27 01 1 305254404 00 0544 + 034002 1288 27 02 1 305254404 01 0544 + 034003 1288 27 03 1 305254404 02 0544 + 034004 1288 27 04 1 305254404 03 0544 + 034005 1288 27 05 1 305254404 04 0544 + 034006 1288 27 06 1 305254404 05 0544 + 034007 1288 27 07 1 305254404 06 0544 + 034008 1288 27 08 1 305254404 07 0544 + 034009 1288 28 01 1 305254404 08 0544 + 034010 1288 28 02 1 305254404 09 0544 + 034011 1288 28 03 1 305254404 10 0544 + 034012 1288 28 04 1 305254404 11 0544 + 034013 1288 28 05 1 305254404 12 0544 + 034014 1288 28 06 1 305254404 13 0544 + 034015 1288 28 07 1 305254404 14 0544 + 034016 1288 28 08 1 305254404 15 0544 + 034017 1288 29 01 1 305254416 00 0547 + 034018 1288 29 02 1 305254416 01 0547 + 034019 1288 29 03 1 305254416 02 0547 + 034020 1288 29 04 1 305254416 03 0547 + 034021 1288 29 05 1 305254416 04 0547 + 034022 1288 29 06 1 305254416 05 0547 + 034023 1288 29 07 1 305254416 06 0547 + 034024 1288 29 08 1 305254416 07 0547 + 034025 1288 30 01 1 305254416 08 0547 + 034026 1288 30 02 1 305254416 09 0547 + 034027 1288 30 03 1 305254416 10 0547 + 034028 1288 30 04 1 305254416 11 0547 + 034029 1288 30 05 1 305254416 12 0547 + 034030 1288 30 06 1 305254416 13 0547 + 034031 1288 30 07 1 305254416 14 0547 + 034032 1288 30 08 1 305254416 15 0547 + 034033 1288 31 01 1 305254412 00 0546 + 034034 1288 31 02 1 305254412 01 0546 + 034035 1288 31 03 1 305254412 02 0546 + 034036 1288 31 04 1 305254412 03 0546 + 034037 1288 31 05 1 305254412 04 0546 + 034038 1288 31 06 1 305254412 05 0546 + 034039 1288 31 07 1 305254412 06 0546 + 034040 1288 31 08 1 305254412 07 0546 + 034041 1288 32 01 1 305254412 08 0546 + 034042 1288 32 02 1 305254412 09 0546 + 034043 1288 32 03 1 305254412 10 0546 + 034044 1288 32 04 1 305254412 11 0546 + 034045 1288 32 05 1 305254412 12 0546 + 034046 1288 32 06 1 305254412 13 0546 + 034047 1288 32 07 1 305254412 14 0546 + 034048 1288 32 08 1 305254412 15 0546 + 034049 1288 33 01 1 306364428 00 1018 + 034050 1288 33 02 1 306364428 01 1018 + 034051 1288 33 03 1 306364428 02 1018 + 034052 1288 33 04 1 306364428 03 1018 + 034053 1288 33 05 1 306364428 04 1018 + 034054 1288 33 06 1 306364428 05 1018 + 034055 1288 33 07 1 306364428 06 1018 + 034056 1288 33 08 1 306364428 07 1018 + 034057 1288 34 01 1 306364428 08 1018 + 034058 1288 34 02 1 306364428 09 1018 + 034059 1288 34 03 1 306364428 10 1018 + 034060 1288 34 04 1 306364428 11 1018 + 034061 1288 34 05 1 306364428 12 1018 + 034062 1288 34 06 1 306364428 13 1018 + 034063 1288 34 07 1 306364428 14 1018 + 034064 1288 34 08 1 306364428 15 1018 + 034065 1288 35 01 1 306364432 00 1019 + 034066 1288 35 02 1 306364432 01 1019 + 034067 1288 35 03 1 306364432 02 1019 + 034068 1288 35 04 1 306364432 03 1019 + 034069 1288 35 05 1 306364432 04 1019 + 034070 1288 35 06 1 306364432 05 1019 + 034071 1288 35 07 1 306364432 06 1019 + 034072 1288 35 08 1 306364432 07 1019 + 034073 1288 36 01 1 306364432 08 1019 + 034074 1288 36 02 1 306364432 09 1019 + 034075 1288 36 03 1 306364432 10 1019 + 034076 1288 36 04 1 306364432 11 1019 + 034077 1288 36 05 1 306364432 12 1019 + 034078 1288 36 06 1 306364432 13 1019 + 034079 1288 36 07 1 306364432 14 1019 + 034080 1288 36 08 1 306364432 15 1019 + 034081 1288 37 01 1 306364420 00 1016 + 034082 1288 37 02 1 306364420 01 1016 + 034083 1288 37 03 1 306364420 02 1016 + 034084 1288 37 04 1 306364420 03 1016 + 034085 1288 37 05 1 306364420 04 1016 + 034086 1288 37 06 1 306364420 05 1016 + 034087 1288 37 07 1 306364420 06 1016 + 034088 1288 37 08 1 306364420 07 1016 + 034089 1288 38 01 1 306364420 08 1016 + 034090 1288 38 02 1 306364420 09 1016 + 034091 1288 38 03 1 306364420 10 1016 + 034092 1288 38 04 1 306364420 11 1016 + 034093 1288 38 05 1 306364420 12 1016 + 034094 1288 38 06 1 306364420 13 1016 + 034095 1288 38 07 1 306364420 14 1016 + 034096 1288 38 08 1 306364420 15 1016 + 034097 1288 39 01 1 306364424 00 1017 + 034098 1288 39 02 1 306364424 01 1017 + 034099 1288 39 03 1 306364424 02 1017 + 034100 1288 39 04 1 306364424 03 1017 + 034101 1288 39 05 1 306364424 04 1017 + 034102 1288 39 06 1 306364424 05 1017 + 034103 1288 39 07 1 306364424 06 1017 + 034104 1288 39 08 1 306364424 07 1017 + 034105 1288 40 01 1 306364424 08 1017 + 034106 1288 40 02 1 306364424 09 1017 + 034107 1288 40 03 1 306364424 10 1017 + 034108 1288 40 04 1 306364424 11 1017 + 034109 1288 40 05 1 306364424 12 1017 + 034110 1288 40 06 1 306364424 13 1017 + 034111 1288 40 07 1 306364424 14 1017 + 034112 1288 40 08 1 306364424 15 1017 + 034113 1288 41 01 1 304164868 08 0240 + 034114 1288 41 02 1 304164868 09 0240 + 034115 1288 41 03 1 304164868 10 0240 + 034116 1288 41 04 1 304164868 11 0240 + 034117 9999 99 99 0 9999 99 9999 + 034118 9999 99 99 0 9999 99 9999 + 034119 9999 99 99 0 9999 99 9999 + 034120 9999 99 99 0 9999 99 9999 + 034121 1288 42 01 1 304164868 12 0240 + 034122 1288 42 02 1 304164868 13 0240 + 034123 1288 42 03 1 304164868 14 0240 + 034124 1288 42 04 1 304164868 15 0240 + 034125 9999 99 99 0 9999 99 9999 + 034126 9999 99 99 0 9999 99 9999 + 034127 9999 99 99 0 9999 99 9999 + 034128 9999 99 99 0 9999 99 9999 + 034129 1288 43 01 1 304164868 00 0240 + 034130 1288 43 02 1 304164868 01 0240 + 034131 1288 43 03 1 304164868 02 0240 + 034132 1288 43 04 1 304164868 03 0240 + 034133 9999 99 99 0 9999 99 9999 + 034134 9999 99 99 0 9999 99 9999 + 034135 9999 99 99 0 9999 99 9999 + 034136 9999 99 99 0 9999 99 9999 + 034137 1288 44 01 1 304164868 04 0240 + 034138 1288 44 02 1 304164868 05 0240 + 034139 1288 44 03 1 304164868 06 0240 + 034140 1288 44 04 1 304164868 07 0240 + 034141 9999 99 99 0 9999 99 9999 + 034142 9999 99 99 0 9999 99 9999 + 034143 9999 99 99 0 9999 99 9999 + 034144 9999 99 99 0 9999 99 9999 + 034145 1288 45 01 1 304164872 08 0241 + 034146 1288 45 02 1 304164872 09 0241 + 034147 1288 45 03 1 304164872 10 0241 + 034148 1288 45 04 1 304164872 11 0241 + 034149 9999 99 99 0 9999 99 9999 + 034150 9999 99 99 0 9999 99 9999 + 034151 9999 99 99 0 9999 99 9999 + 034152 9999 99 99 0 9999 99 9999 + 034153 1288 46 01 1 304164872 12 0241 + 034154 1288 46 02 1 304164872 13 0241 + 034155 1288 46 03 1 304164872 14 0241 + 034156 1288 46 04 1 304164872 15 0241 + 034157 9999 99 99 0 9999 99 9999 + 034158 9999 99 99 0 9999 99 9999 + 034159 9999 99 99 0 9999 99 9999 + 034160 9999 99 99 0 9999 99 9999 + 034161 1288 47 01 1 304164872 00 0241 + 034162 1288 47 02 1 304164872 01 0241 + 034163 1288 47 03 1 304164872 02 0241 + 034164 1288 47 04 1 304164872 03 0241 + 034165 9999 99 99 0 9999 99 9999 + 034166 9999 99 99 0 9999 99 9999 + 034167 9999 99 99 0 9999 99 9999 + 034168 9999 99 99 0 9999 99 9999 + 034169 1288 48 01 1 304164872 04 0241 + 034170 1288 48 02 1 304164872 05 0241 + 034171 1288 48 03 1 304164872 06 0241 + 034172 1288 48 04 1 304164872 07 0241 + 034173 9999 99 99 0 9999 99 9999 + 034174 9999 99 99 0 9999 99 9999 + 034175 9999 99 99 0 9999 99 9999 + 034176 9999 99 99 0 9999 99 9999 + 034177 1289 01 01 1 303067152 08 0051 + 034178 1289 01 02 1 303067152 09 0051 + 034179 9999 99 99 0 9999 99 9999 + 034180 9999 99 99 0 9999 99 9999 + 034181 9999 99 99 0 9999 99 9999 + 034182 9999 99 99 0 9999 99 9999 + 034183 9999 99 99 0 9999 99 9999 + 034184 9999 99 99 0 9999 99 9999 + 034185 1289 02 01 1 303067152 10 0051 + 034186 1289 02 02 1 303067152 11 0051 + 034187 9999 99 99 0 9999 99 9999 + 034188 9999 99 99 0 9999 99 9999 + 034189 9999 99 99 0 9999 99 9999 + 034190 9999 99 99 0 9999 99 9999 + 034191 9999 99 99 0 9999 99 9999 + 034192 9999 99 99 0 9999 99 9999 + 034193 1289 03 01 1 303067152 12 0051 + 034194 1289 03 02 1 303067152 13 0051 + 034195 9999 99 99 0 9999 99 9999 + 034196 9999 99 99 0 9999 99 9999 + 034197 9999 99 99 0 9999 99 9999 + 034198 9999 99 99 0 9999 99 9999 + 034199 9999 99 99 0 9999 99 9999 + 034200 9999 99 99 0 9999 99 9999 + 034201 1289 04 01 1 303067152 14 0051 + 034202 1289 04 02 1 303067152 15 0051 + 034203 9999 99 99 0 9999 99 9999 + 034204 9999 99 99 0 9999 99 9999 + 034205 9999 99 99 0 9999 99 9999 + 034206 9999 99 99 0 9999 99 9999 + 034207 9999 99 99 0 9999 99 9999 + 034208 9999 99 99 0 9999 99 9999 + 034209 1289 05 01 1 303067152 00 0051 + 034210 1289 05 02 1 303067152 01 0051 + 034211 9999 99 99 0 9999 99 9999 + 034212 9999 99 99 0 9999 99 9999 + 034213 9999 99 99 0 9999 99 9999 + 034214 9999 99 99 0 9999 99 9999 + 034215 9999 99 99 0 9999 99 9999 + 034216 9999 99 99 0 9999 99 9999 + 034217 1289 06 01 1 303067152 02 0051 + 034218 1289 06 02 1 303067152 03 0051 + 034219 9999 99 99 0 9999 99 9999 + 034220 9999 99 99 0 9999 99 9999 + 034221 9999 99 99 0 9999 99 9999 + 034222 9999 99 99 0 9999 99 9999 + 034223 9999 99 99 0 9999 99 9999 + 034224 9999 99 99 0 9999 99 9999 + 034225 1289 07 01 1 303067152 04 0051 + 034226 1289 07 02 1 303067152 05 0051 + 034227 9999 99 99 0 9999 99 9999 + 034228 9999 99 99 0 9999 99 9999 + 034229 9999 99 99 0 9999 99 9999 + 034230 9999 99 99 0 9999 99 9999 + 034231 9999 99 99 0 9999 99 9999 + 034232 9999 99 99 0 9999 99 9999 + 034233 1289 08 01 1 303067152 06 0051 + 034234 1289 08 02 1 303067152 07 0051 + 034235 9999 99 99 0 9999 99 9999 + 034236 9999 99 99 0 9999 99 9999 + 034237 9999 99 99 0 9999 99 9999 + 034238 9999 99 99 0 9999 99 9999 + 034239 9999 99 99 0 9999 99 9999 + 034240 9999 99 99 0 9999 99 9999 + 034241 1289 09 01 1 304156684 00 0226 + 034242 1289 09 02 1 304156684 01 0226 + 034243 1289 09 03 1 304156684 02 0226 + 034244 1289 09 04 1 304156684 03 0226 + 034245 9999 99 99 0 9999 99 9999 + 034246 9999 99 99 0 9999 99 9999 + 034247 9999 99 99 0 9999 99 9999 + 034248 9999 99 99 0 9999 99 9999 + 034249 1289 10 01 1 304156684 04 0226 + 034250 1289 10 02 1 304156684 05 0226 + 034251 1289 10 03 1 304156684 06 0226 + 034252 1289 10 04 1 304156684 07 0226 + 034253 9999 99 99 0 9999 99 9999 + 034254 9999 99 99 0 9999 99 9999 + 034255 9999 99 99 0 9999 99 9999 + 034256 9999 99 99 0 9999 99 9999 + 034257 1289 11 01 1 304156684 08 0226 + 034258 1289 11 02 1 304156684 09 0226 + 034259 1289 11 03 1 304156684 10 0226 + 034260 1289 11 04 1 304156684 11 0226 + 034261 9999 99 99 0 9999 99 9999 + 034262 9999 99 99 0 9999 99 9999 + 034263 9999 99 99 0 9999 99 9999 + 034264 9999 99 99 0 9999 99 9999 + 034265 1289 12 01 1 304156684 12 0226 + 034266 1289 12 02 1 304156684 13 0226 + 034267 1289 12 03 1 304156684 14 0226 + 034268 1289 12 04 1 304156684 15 0226 + 034269 9999 99 99 0 9999 99 9999 + 034270 9999 99 99 0 9999 99 9999 + 034271 9999 99 99 0 9999 99 9999 + 034272 9999 99 99 0 9999 99 9999 + 034273 1289 13 01 1 304156688 08 0227 + 034274 1289 13 02 1 304156688 09 0227 + 034275 1289 13 03 1 304156688 10 0227 + 034276 1289 13 04 1 304156688 11 0227 + 034277 9999 99 99 0 9999 99 9999 + 034278 9999 99 99 0 9999 99 9999 + 034279 9999 99 99 0 9999 99 9999 + 034280 9999 99 99 0 9999 99 9999 + 034281 1289 14 01 1 304156688 12 0227 + 034282 1289 14 02 1 304156688 13 0227 + 034283 1289 14 03 1 304156688 14 0227 + 034284 1289 14 04 1 304156688 15 0227 + 034285 9999 99 99 0 9999 99 9999 + 034286 9999 99 99 0 9999 99 9999 + 034287 9999 99 99 0 9999 99 9999 + 034288 9999 99 99 0 9999 99 9999 + 034289 1289 15 01 1 304156688 00 0227 + 034290 1289 15 02 1 304156688 01 0227 + 034291 1289 15 03 1 304156688 02 0227 + 034292 1289 15 04 1 304156688 03 0227 + 034293 9999 99 99 0 9999 99 9999 + 034294 9999 99 99 0 9999 99 9999 + 034295 9999 99 99 0 9999 99 9999 + 034296 9999 99 99 0 9999 99 9999 + 034297 1289 16 01 1 304156688 04 0227 + 034298 1289 16 02 1 304156688 05 0227 + 034299 1289 16 03 1 304156688 06 0227 + 034300 1289 16 04 1 304156688 07 0227 + 034301 9999 99 99 0 9999 99 9999 + 034302 9999 99 99 0 9999 99 9999 + 034303 9999 99 99 0 9999 99 9999 + 034304 9999 99 99 0 9999 99 9999 + 034305 1289 17 01 1 306335752 00 0961 + 034306 1289 17 02 1 306335752 01 0961 + 034307 1289 17 03 1 306335752 02 0961 + 034308 1289 17 04 1 306335752 03 0961 + 034309 1289 17 05 1 306335752 04 0961 + 034310 1289 17 06 1 306335752 05 0961 + 034311 1289 17 07 1 306335752 06 0961 + 034312 1289 17 08 1 306335752 07 0961 + 034313 1289 18 01 1 306335752 08 0961 + 034314 1289 18 02 1 306335752 09 0961 + 034315 1289 18 03 1 306335752 10 0961 + 034316 1289 18 04 1 306335752 11 0961 + 034317 1289 18 05 1 306335752 12 0961 + 034318 1289 18 06 1 306335752 13 0961 + 034319 1289 18 07 1 306335752 14 0961 + 034320 1289 18 08 1 306335752 15 0961 + 034321 1289 19 01 1 306335748 00 0960 + 034322 1289 19 02 1 306335748 01 0960 + 034323 1289 19 03 1 306335748 02 0960 + 034324 1289 19 04 1 306335748 03 0960 + 034325 1289 19 05 1 306335748 04 0960 + 034326 1289 19 06 1 306335748 05 0960 + 034327 1289 19 07 1 306335748 06 0960 + 034328 1289 19 08 1 306335748 07 0960 + 034329 1289 20 01 1 306335748 08 0960 + 034330 1289 20 02 1 306335748 09 0960 + 034331 1289 20 03 1 306335748 10 0960 + 034332 1289 20 04 1 306335748 11 0960 + 034333 1289 20 05 1 306335748 12 0960 + 034334 1289 20 06 1 306335748 13 0960 + 034335 1289 20 07 1 306335748 14 0960 + 034336 1289 20 08 1 306335748 15 0960 + 034337 1289 21 01 1 306335760 00 0963 + 034338 1289 21 02 1 306335760 01 0963 + 034339 1289 21 03 1 306335760 02 0963 + 034340 1289 21 04 1 306335760 03 0963 + 034341 1289 21 05 1 306335760 04 0963 + 034342 1289 21 06 1 306335760 05 0963 + 034343 1289 21 07 1 306335760 06 0963 + 034344 1289 21 08 1 306335760 07 0963 + 034345 1289 22 01 1 306335760 08 0963 + 034346 1289 22 02 1 306335760 09 0963 + 034347 1289 22 03 1 306335760 10 0963 + 034348 1289 22 04 1 306335760 11 0963 + 034349 1289 22 05 1 306335760 12 0963 + 034350 1289 22 06 1 306335760 13 0963 + 034351 1289 22 07 1 306335760 14 0963 + 034352 1289 22 08 1 306335760 15 0963 + 034353 1289 23 01 1 306335756 00 0962 + 034354 1289 23 02 1 306335756 01 0962 + 034355 1289 23 03 1 306335756 02 0962 + 034356 1289 23 04 1 306335756 03 0962 + 034357 1289 23 05 1 306335756 04 0962 + 034358 1289 23 06 1 306335756 05 0962 + 034359 1289 23 07 1 306335756 06 0962 + 034360 1289 23 08 1 306335756 07 0962 + 034361 1289 24 01 1 306335756 08 0962 + 034362 1289 24 02 1 306335756 09 0962 + 034363 1289 24 03 1 306335756 10 0962 + 034364 1289 24 04 1 306335756 11 0962 + 034365 1289 24 05 1 306335756 12 0962 + 034366 1289 24 06 1 306335756 13 0962 + 034367 1289 24 07 1 306335756 14 0962 + 034368 1289 24 08 1 306335756 15 0962 + 034369 1289 25 01 1 303071240 08 0057 + 034370 1289 25 02 1 303071240 09 0057 + 034371 9999 99 99 0 9999 99 9999 + 034372 9999 99 99 0 9999 99 9999 + 034373 9999 99 99 0 9999 99 9999 + 034374 9999 99 99 0 9999 99 9999 + 034375 9999 99 99 0 9999 99 9999 + 034376 9999 99 99 0 9999 99 9999 + 034377 1289 26 01 1 303071240 10 0057 + 034378 1289 26 02 1 303071240 11 0057 + 034379 9999 99 99 0 9999 99 9999 + 034380 9999 99 99 0 9999 99 9999 + 034381 9999 99 99 0 9999 99 9999 + 034382 9999 99 99 0 9999 99 9999 + 034383 9999 99 99 0 9999 99 9999 + 034384 9999 99 99 0 9999 99 9999 + 034385 1289 27 01 1 303071240 12 0057 + 034386 1289 27 02 1 303071240 13 0057 + 034387 9999 99 99 0 9999 99 9999 + 034388 9999 99 99 0 9999 99 9999 + 034389 9999 99 99 0 9999 99 9999 + 034390 9999 99 99 0 9999 99 9999 + 034391 9999 99 99 0 9999 99 9999 + 034392 9999 99 99 0 9999 99 9999 + 034393 1289 28 01 1 303071240 14 0057 + 034394 1289 28 02 1 303071240 15 0057 + 034395 9999 99 99 0 9999 99 9999 + 034396 9999 99 99 0 9999 99 9999 + 034397 9999 99 99 0 9999 99 9999 + 034398 9999 99 99 0 9999 99 9999 + 034399 9999 99 99 0 9999 99 9999 + 034400 9999 99 99 0 9999 99 9999 + 034401 1289 29 01 1 303071240 04 0057 + 034402 1289 29 02 1 303071240 05 0057 + 034403 9999 99 99 0 9999 99 9999 + 034404 9999 99 99 0 9999 99 9999 + 034405 9999 99 99 0 9999 99 9999 + 034406 9999 99 99 0 9999 99 9999 + 034407 9999 99 99 0 9999 99 9999 + 034408 9999 99 99 0 9999 99 9999 + 034409 1289 30 01 1 303071240 06 0057 + 034410 1289 30 02 1 303071240 07 0057 + 034411 9999 99 99 0 9999 99 9999 + 034412 9999 99 99 0 9999 99 9999 + 034413 9999 99 99 0 9999 99 9999 + 034414 9999 99 99 0 9999 99 9999 + 034415 9999 99 99 0 9999 99 9999 + 034416 9999 99 99 0 9999 99 9999 + 034417 1289 31 01 1 303071240 00 0057 + 034418 1289 31 02 1 303071240 01 0057 + 034419 9999 99 99 0 9999 99 9999 + 034420 9999 99 99 0 9999 99 9999 + 034421 9999 99 99 0 9999 99 9999 + 034422 9999 99 99 0 9999 99 9999 + 034423 9999 99 99 0 9999 99 9999 + 034424 9999 99 99 0 9999 99 9999 + 034425 1289 32 01 1 303071240 02 0057 + 034426 1289 32 02 1 303071240 03 0057 + 034427 9999 99 99 0 9999 99 9999 + 034428 9999 99 99 0 9999 99 9999 + 034429 9999 99 99 0 9999 99 9999 + 034430 9999 99 99 0 9999 99 9999 + 034431 9999 99 99 0 9999 99 9999 + 034432 9999 99 99 0 9999 99 9999 + 034433 1289 33 01 1 306339848 00 0969 + 034434 1289 33 02 1 306339848 01 0969 + 034435 1289 33 03 1 306339848 02 0969 + 034436 1289 33 04 1 306339848 03 0969 + 034437 1289 33 05 1 306339848 04 0969 + 034438 1289 33 06 1 306339848 05 0969 + 034439 1289 33 07 1 306339848 06 0969 + 034440 1289 33 08 1 306339848 07 0969 + 034441 1289 34 01 1 306339848 08 0969 + 034442 1289 34 02 1 306339848 09 0969 + 034443 1289 34 03 1 306339848 10 0969 + 034444 1289 34 04 1 306339848 11 0969 + 034445 1289 34 05 1 306339848 12 0969 + 034446 1289 34 06 1 306339848 13 0969 + 034447 1289 34 07 1 306339848 14 0969 + 034448 1289 34 08 1 306339848 15 0969 + 034449 1289 35 01 1 306339844 00 0968 + 034450 1289 35 02 1 306339844 01 0968 + 034451 1289 35 03 1 306339844 02 0968 + 034452 1289 35 04 1 306339844 03 0968 + 034453 1289 35 05 1 306339844 04 0968 + 034454 1289 35 06 1 306339844 05 0968 + 034455 1289 35 07 1 306339844 06 0968 + 034456 1289 35 08 1 306339844 07 0968 + 034457 1289 36 01 1 306339844 08 0968 + 034458 1289 36 02 1 306339844 09 0968 + 034459 1289 36 03 1 306339844 10 0968 + 034460 1289 36 04 1 306339844 11 0968 + 034461 1289 36 05 1 306339844 12 0968 + 034462 1289 36 06 1 306339844 13 0968 + 034463 1289 36 07 1 306339844 14 0968 + 034464 1289 36 08 1 306339844 15 0968 + 034465 1289 37 01 1 306339856 00 0971 + 034466 1289 37 02 1 306339856 01 0971 + 034467 1289 37 03 1 306339856 02 0971 + 034468 1289 37 04 1 306339856 03 0971 + 034469 1289 37 05 1 306339856 04 0971 + 034470 1289 37 06 1 306339856 05 0971 + 034471 1289 37 07 1 306339856 06 0971 + 034472 1289 37 08 1 306339856 07 0971 + 034473 1289 38 01 1 306339856 08 0971 + 034474 1289 38 02 1 306339856 09 0971 + 034475 1289 38 03 1 306339856 10 0971 + 034476 1289 38 04 1 306339856 11 0971 + 034477 1289 38 05 1 306339856 12 0971 + 034478 1289 38 06 1 306339856 13 0971 + 034479 1289 38 07 1 306339856 14 0971 + 034480 1289 38 08 1 306339856 15 0971 + 034481 1289 39 01 1 306339852 00 0970 + 034482 1289 39 02 1 306339852 01 0970 + 034483 1289 39 03 1 306339852 02 0970 + 034484 1289 39 04 1 306339852 03 0970 + 034485 1289 39 05 1 306339852 04 0970 + 034486 1289 39 06 1 306339852 05 0970 + 034487 1289 39 07 1 306339852 06 0970 + 034488 1289 39 08 1 306339852 07 0970 + 034489 1289 40 01 1 306339852 08 0970 + 034490 1289 40 02 1 306339852 09 0970 + 034491 1289 40 03 1 306339852 10 0970 + 034492 1289 40 04 1 306339852 11 0970 + 034493 1289 40 05 1 306339852 12 0970 + 034494 1289 40 06 1 306339852 13 0970 + 034495 1289 40 07 1 306339852 14 0970 + 034496 1289 40 08 1 306339852 15 0970 + 034497 1289 41 01 1 304156680 00 0225 + 034498 1289 41 02 1 304156680 01 0225 + 034499 1289 41 03 1 304156680 02 0225 + 034500 1289 41 04 1 304156680 03 0225 + 034501 9999 99 99 0 9999 99 9999 + 034502 9999 99 99 0 9999 99 9999 + 034503 9999 99 99 0 9999 99 9999 + 034504 9999 99 99 0 9999 99 9999 + 034505 1289 42 01 1 304156680 04 0225 + 034506 1289 42 02 1 304156680 05 0225 + 034507 1289 42 03 1 304156680 06 0225 + 034508 1289 42 04 1 304156680 07 0225 + 034509 9999 99 99 0 9999 99 9999 + 034510 9999 99 99 0 9999 99 9999 + 034511 9999 99 99 0 9999 99 9999 + 034512 9999 99 99 0 9999 99 9999 + 034513 1289 43 01 1 304156680 08 0225 + 034514 1289 43 02 1 304156680 09 0225 + 034515 1289 43 03 1 304156680 10 0225 + 034516 1289 43 04 1 304156680 11 0225 + 034517 9999 99 99 0 9999 99 9999 + 034518 9999 99 99 0 9999 99 9999 + 034519 9999 99 99 0 9999 99 9999 + 034520 9999 99 99 0 9999 99 9999 + 034521 1289 44 01 1 304156680 12 0225 + 034522 1289 44 02 1 304156680 13 0225 + 034523 1289 44 03 1 304156680 14 0225 + 034524 1289 44 04 1 304156680 15 0225 + 034525 9999 99 99 0 9999 99 9999 + 034526 9999 99 99 0 9999 99 9999 + 034527 9999 99 99 0 9999 99 9999 + 034528 9999 99 99 0 9999 99 9999 + 034529 1289 45 01 1 304156676 00 0224 + 034530 1289 45 02 1 304156676 01 0224 + 034531 1289 45 03 1 304156676 02 0224 + 034532 1289 45 04 1 304156676 03 0224 + 034533 9999 99 99 0 9999 99 9999 + 034534 9999 99 99 0 9999 99 9999 + 034535 9999 99 99 0 9999 99 9999 + 034536 9999 99 99 0 9999 99 9999 + 034537 1289 46 01 1 304156676 04 0224 + 034538 1289 46 02 1 304156676 05 0224 + 034539 1289 46 03 1 304156676 06 0224 + 034540 1289 46 04 1 304156676 07 0224 + 034541 9999 99 99 0 9999 99 9999 + 034542 9999 99 99 0 9999 99 9999 + 034543 9999 99 99 0 9999 99 9999 + 034544 9999 99 99 0 9999 99 9999 + 034545 1289 47 01 1 304156676 08 0224 + 034546 1289 47 02 1 304156676 09 0224 + 034547 1289 47 03 1 304156676 10 0224 + 034548 1289 47 04 1 304156676 11 0224 + 034549 9999 99 99 0 9999 99 9999 + 034550 9999 99 99 0 9999 99 9999 + 034551 9999 99 99 0 9999 99 9999 + 034552 9999 99 99 0 9999 99 9999 + 034553 1289 48 01 1 304156676 12 0224 + 034554 1289 48 02 1 304156676 13 0224 + 034555 1289 48 03 1 304156676 14 0224 + 034556 1289 48 04 1 304156676 15 0224 + 034557 9999 99 99 0 9999 99 9999 + 034558 9999 99 99 0 9999 99 9999 + 034559 9999 99 99 0 9999 99 9999 + 034560 9999 99 99 0 9999 99 9999 + 034561 1290 01 01 1 306343948 00 0978 + 034562 1290 01 02 1 306343948 01 0978 + 034563 1290 01 03 1 306343948 02 0978 + 034564 1290 01 04 1 306343948 03 0978 + 034565 1290 01 05 1 306343948 04 0978 + 034566 1290 01 06 1 306343948 05 0978 + 034567 1290 01 07 1 306343948 06 0978 + 034568 1290 01 08 1 306343948 07 0978 + 034569 1290 02 01 1 306343948 08 0978 + 034570 1290 02 02 1 306343948 09 0978 + 034571 1290 02 03 1 306343948 10 0978 + 034572 1290 02 04 1 306343948 11 0978 + 034573 1290 02 05 1 306343948 12 0978 + 034574 1290 02 06 1 306343948 13 0978 + 034575 1290 02 07 1 306343948 14 0978 + 034576 1290 02 08 1 306343948 15 0978 + 034577 1290 03 01 1 306343952 00 0979 + 034578 1290 03 02 1 306343952 01 0979 + 034579 1290 03 03 1 306343952 02 0979 + 034580 1290 03 04 1 306343952 03 0979 + 034581 1290 03 05 1 306343952 04 0979 + 034582 1290 03 06 1 306343952 05 0979 + 034583 1290 03 07 1 306343952 06 0979 + 034584 1290 03 08 1 306343952 07 0979 + 034585 1290 04 01 1 306343952 08 0979 + 034586 1290 04 02 1 306343952 09 0979 + 034587 1290 04 03 1 306343952 10 0979 + 034588 1290 04 04 1 306343952 11 0979 + 034589 1290 04 05 1 306343952 12 0979 + 034590 1290 04 06 1 306343952 13 0979 + 034591 1290 04 07 1 306343952 14 0979 + 034592 1290 04 08 1 306343952 15 0979 + 034593 1290 05 01 1 306343940 00 0976 + 034594 1290 05 02 1 306343940 01 0976 + 034595 1290 05 03 1 306343940 02 0976 + 034596 1290 05 04 1 306343940 03 0976 + 034597 1290 05 05 1 306343940 04 0976 + 034598 1290 05 06 1 306343940 05 0976 + 034599 1290 05 07 1 306343940 06 0976 + 034600 1290 05 08 1 306343940 07 0976 + 034601 1290 06 01 1 306343940 08 0976 + 034602 1290 06 02 1 306343940 09 0976 + 034603 1290 06 03 1 306343940 10 0976 + 034604 1290 06 04 1 306343940 11 0976 + 034605 1290 06 05 1 306343940 12 0976 + 034606 1290 06 06 1 306343940 13 0976 + 034607 1290 06 07 1 306343940 14 0976 + 034608 1290 06 08 1 306343940 15 0976 + 034609 1290 07 01 1 306343944 00 0977 + 034610 1290 07 02 1 306343944 01 0977 + 034611 1290 07 03 1 306343944 02 0977 + 034612 1290 07 04 1 306343944 03 0977 + 034613 1290 07 05 1 306343944 04 0977 + 034614 1290 07 06 1 306343944 05 0977 + 034615 1290 07 07 1 306343944 06 0977 + 034616 1290 07 08 1 306343944 07 0977 + 034617 1290 08 01 1 306343944 08 0977 + 034618 1290 08 02 1 306343944 09 0977 + 034619 1290 08 03 1 306343944 10 0977 + 034620 1290 08 04 1 306343944 11 0977 + 034621 1290 08 05 1 306343944 12 0977 + 034622 1290 08 06 1 306343944 13 0977 + 034623 1290 08 07 1 306343944 14 0977 + 034624 1290 08 08 1 306343944 15 0977 + 034625 1290 09 01 1 303071236 12 0056 + 034626 1290 09 02 1 303071236 13 0056 + 034627 9999 99 99 0 9999 99 9999 + 034628 9999 99 99 0 9999 99 9999 + 034629 9999 99 99 0 9999 99 9999 + 034630 9999 99 99 0 9999 99 9999 + 034631 9999 99 99 0 9999 99 9999 + 034632 9999 99 99 0 9999 99 9999 + 034633 1290 10 01 1 303071236 14 0056 + 034634 1290 10 02 1 303071236 15 0056 + 034635 9999 99 99 0 9999 99 9999 + 034636 9999 99 99 0 9999 99 9999 + 034637 9999 99 99 0 9999 99 9999 + 034638 9999 99 99 0 9999 99 9999 + 034639 9999 99 99 0 9999 99 9999 + 034640 9999 99 99 0 9999 99 9999 + 034641 1290 11 01 1 303071236 08 0056 + 034642 1290 11 02 1 303071236 09 0056 + 034643 9999 99 99 0 9999 99 9999 + 034644 9999 99 99 0 9999 99 9999 + 034645 9999 99 99 0 9999 99 9999 + 034646 9999 99 99 0 9999 99 9999 + 034647 9999 99 99 0 9999 99 9999 + 034648 9999 99 99 0 9999 99 9999 + 034649 1290 12 01 1 303071236 10 0056 + 034650 1290 12 02 1 303071236 11 0056 + 034651 9999 99 99 0 9999 99 9999 + 034652 9999 99 99 0 9999 99 9999 + 034653 9999 99 99 0 9999 99 9999 + 034654 9999 99 99 0 9999 99 9999 + 034655 9999 99 99 0 9999 99 9999 + 034656 9999 99 99 0 9999 99 9999 + 034657 1290 13 01 1 303071236 00 0056 + 034658 1290 13 02 1 303071236 01 0056 + 034659 9999 99 99 0 9999 99 9999 + 034660 9999 99 99 0 9999 99 9999 + 034661 9999 99 99 0 9999 99 9999 + 034662 9999 99 99 0 9999 99 9999 + 034663 9999 99 99 0 9999 99 9999 + 034664 9999 99 99 0 9999 99 9999 + 034665 1290 14 01 1 303071236 02 0056 + 034666 1290 14 02 1 303071236 03 0056 + 034667 9999 99 99 0 9999 99 9999 + 034668 9999 99 99 0 9999 99 9999 + 034669 9999 99 99 0 9999 99 9999 + 034670 9999 99 99 0 9999 99 9999 + 034671 9999 99 99 0 9999 99 9999 + 034672 9999 99 99 0 9999 99 9999 + 034673 1290 15 01 1 303071236 04 0056 + 034674 1290 15 02 1 303071236 05 0056 + 034675 9999 99 99 0 9999 99 9999 + 034676 9999 99 99 0 9999 99 9999 + 034677 9999 99 99 0 9999 99 9999 + 034678 9999 99 99 0 9999 99 9999 + 034679 9999 99 99 0 9999 99 9999 + 034680 9999 99 99 0 9999 99 9999 + 034681 1290 16 01 1 303071236 06 0056 + 034682 1290 16 02 1 303071236 07 0056 + 034683 9999 99 99 0 9999 99 9999 + 034684 9999 99 99 0 9999 99 9999 + 034685 9999 99 99 0 9999 99 9999 + 034686 9999 99 99 0 9999 99 9999 + 034687 9999 99 99 0 9999 99 9999 + 034688 9999 99 99 0 9999 99 9999 + 034689 1290 17 01 1 305242120 00 0521 + 034690 1290 17 02 1 305242120 01 0521 + 034691 1290 17 03 1 305242120 02 0521 + 034692 1290 17 04 1 305242120 03 0521 + 034693 1290 17 05 1 305242120 04 0521 + 034694 1290 17 06 1 305242120 05 0521 + 034695 1290 17 07 1 305242120 06 0521 + 034696 1290 17 08 1 305242120 07 0521 + 034697 1290 18 01 1 305242120 08 0521 + 034698 1290 18 02 1 305242120 09 0521 + 034699 1290 18 03 1 305242120 10 0521 + 034700 1290 18 04 1 305242120 11 0521 + 034701 1290 18 05 1 305242120 12 0521 + 034702 1290 18 06 1 305242120 13 0521 + 034703 1290 18 07 1 305242120 14 0521 + 034704 1290 18 08 1 305242120 15 0521 + 034705 1290 19 01 1 305242116 00 0520 + 034706 1290 19 02 1 305242116 01 0520 + 034707 1290 19 03 1 305242116 02 0520 + 034708 1290 19 04 1 305242116 03 0520 + 034709 1290 19 05 1 305242116 04 0520 + 034710 1290 19 06 1 305242116 05 0520 + 034711 1290 19 07 1 305242116 06 0520 + 034712 1290 19 08 1 305242116 07 0520 + 034713 1290 20 01 1 305242116 08 0520 + 034714 1290 20 02 1 305242116 09 0520 + 034715 1290 20 03 1 305242116 10 0520 + 034716 1290 20 04 1 305242116 11 0520 + 034717 1290 20 05 1 305242116 12 0520 + 034718 1290 20 06 1 305242116 13 0520 + 034719 1290 20 07 1 305242116 14 0520 + 034720 1290 20 08 1 305242116 15 0520 + 034721 1290 21 01 1 305242128 00 0523 + 034722 1290 21 02 1 305242128 01 0523 + 034723 1290 21 03 1 305242128 02 0523 + 034724 1290 21 04 1 305242128 03 0523 + 034725 1290 21 05 1 305242128 04 0523 + 034726 1290 21 06 1 305242128 05 0523 + 034727 1290 21 07 1 305242128 06 0523 + 034728 1290 21 08 1 305242128 07 0523 + 034729 1290 22 01 1 305242128 08 0523 + 034730 1290 22 02 1 305242128 09 0523 + 034731 1290 22 03 1 305242128 10 0523 + 034732 1290 22 04 1 305242128 11 0523 + 034733 1290 22 05 1 305242128 12 0523 + 034734 1290 22 06 1 305242128 13 0523 + 034735 1290 22 07 1 305242128 14 0523 + 034736 1290 22 08 1 305242128 15 0523 + 034737 1290 23 01 1 305242124 00 0522 + 034738 1290 23 02 1 305242124 01 0522 + 034739 1290 23 03 1 305242124 02 0522 + 034740 1290 23 04 1 305242124 03 0522 + 034741 1290 23 05 1 305242124 04 0522 + 034742 1290 23 06 1 305242124 05 0522 + 034743 1290 23 07 1 305242124 06 0522 + 034744 1290 23 08 1 305242124 07 0522 + 034745 1290 24 01 1 305242124 08 0522 + 034746 1290 24 02 1 305242124 09 0522 + 034747 1290 24 03 1 305242124 10 0522 + 034748 1290 24 04 1 305242124 11 0522 + 034749 1290 24 05 1 305242124 12 0522 + 034750 1290 24 06 1 305242124 13 0522 + 034751 1290 24 07 1 305242124 14 0522 + 034752 1290 24 08 1 305242124 15 0522 + 034753 1290 25 01 1 306348044 00 0986 + 034754 1290 25 02 1 306348044 01 0986 + 034755 1290 25 03 1 306348044 02 0986 + 034756 1290 25 04 1 306348044 03 0986 + 034757 1290 25 05 1 306348044 04 0986 + 034758 1290 25 06 1 306348044 05 0986 + 034759 1290 25 07 1 306348044 06 0986 + 034760 1290 25 08 1 306348044 07 0986 + 034761 1290 26 01 1 306348044 08 0986 + 034762 1290 26 02 1 306348044 09 0986 + 034763 1290 26 03 1 306348044 10 0986 + 034764 1290 26 04 1 306348044 11 0986 + 034765 1290 26 05 1 306348044 12 0986 + 034766 1290 26 06 1 306348044 13 0986 + 034767 1290 26 07 1 306348044 14 0986 + 034768 1290 26 08 1 306348044 15 0986 + 034769 1290 27 01 1 306348048 00 0987 + 034770 1290 27 02 1 306348048 01 0987 + 034771 1290 27 03 1 306348048 02 0987 + 034772 1290 27 04 1 306348048 03 0987 + 034773 1290 27 05 1 306348048 04 0987 + 034774 1290 27 06 1 306348048 05 0987 + 034775 1290 27 07 1 306348048 06 0987 + 034776 1290 27 08 1 306348048 07 0987 + 034777 1290 28 01 1 306348048 08 0987 + 034778 1290 28 02 1 306348048 09 0987 + 034779 1290 28 03 1 306348048 10 0987 + 034780 1290 28 04 1 306348048 11 0987 + 034781 1290 28 05 1 306348048 12 0987 + 034782 1290 28 06 1 306348048 13 0987 + 034783 1290 28 07 1 306348048 14 0987 + 034784 1290 28 08 1 306348048 15 0987 + 034785 1290 29 01 1 306348036 00 0984 + 034786 1290 29 02 1 306348036 01 0984 + 034787 1290 29 03 1 306348036 02 0984 + 034788 1290 29 04 1 306348036 03 0984 + 034789 1290 29 05 1 306348036 04 0984 + 034790 1290 29 06 1 306348036 05 0984 + 034791 1290 29 07 1 306348036 06 0984 + 034792 1290 29 08 1 306348036 07 0984 + 034793 1290 30 01 1 306348036 08 0984 + 034794 1290 30 02 1 306348036 09 0984 + 034795 1290 30 03 1 306348036 10 0984 + 034796 1290 30 04 1 306348036 11 0984 + 034797 1290 30 05 1 306348036 12 0984 + 034798 1290 30 06 1 306348036 13 0984 + 034799 1290 30 07 1 306348036 14 0984 + 034800 1290 30 08 1 306348036 15 0984 + 034801 1290 31 01 1 306348040 00 0985 + 034802 1290 31 02 1 306348040 01 0985 + 034803 1290 31 03 1 306348040 02 0985 + 034804 1290 31 04 1 306348040 03 0985 + 034805 1290 31 05 1 306348040 04 0985 + 034806 1290 31 06 1 306348040 05 0985 + 034807 1290 31 07 1 306348040 06 0985 + 034808 1290 31 08 1 306348040 07 0985 + 034809 1290 32 01 1 306348040 08 0985 + 034810 1290 32 02 1 306348040 09 0985 + 034811 1290 32 03 1 306348040 10 0985 + 034812 1290 32 04 1 306348040 11 0985 + 034813 1290 32 05 1 306348040 12 0985 + 034814 1290 32 06 1 306348040 13 0985 + 034815 1290 32 07 1 306348040 14 0985 + 034816 1290 32 08 1 306348040 15 0985 + 034817 1290 33 01 1 305246216 00 0529 + 034818 1290 33 02 1 305246216 01 0529 + 034819 1290 33 03 1 305246216 02 0529 + 034820 1290 33 04 1 305246216 03 0529 + 034821 1290 33 05 1 305246216 04 0529 + 034822 1290 33 06 1 305246216 05 0529 + 034823 1290 33 07 1 305246216 06 0529 + 034824 1290 33 08 1 305246216 07 0529 + 034825 1290 34 01 1 305246216 08 0529 + 034826 1290 34 02 1 305246216 09 0529 + 034827 1290 34 03 1 305246216 10 0529 + 034828 1290 34 04 1 305246216 11 0529 + 034829 1290 34 05 1 305246216 12 0529 + 034830 1290 34 06 1 305246216 13 0529 + 034831 1290 34 07 1 305246216 14 0529 + 034832 1290 34 08 1 305246216 15 0529 + 034833 1290 35 01 1 305246212 00 0528 + 034834 1290 35 02 1 305246212 01 0528 + 034835 1290 35 03 1 305246212 02 0528 + 034836 1290 35 04 1 305246212 03 0528 + 034837 1290 35 05 1 305246212 04 0528 + 034838 1290 35 06 1 305246212 05 0528 + 034839 1290 35 07 1 305246212 06 0528 + 034840 1290 35 08 1 305246212 07 0528 + 034841 1290 36 01 1 305246212 08 0528 + 034842 1290 36 02 1 305246212 09 0528 + 034843 1290 36 03 1 305246212 10 0528 + 034844 1290 36 04 1 305246212 11 0528 + 034845 1290 36 05 1 305246212 12 0528 + 034846 1290 36 06 1 305246212 13 0528 + 034847 1290 36 07 1 305246212 14 0528 + 034848 1290 36 08 1 305246212 15 0528 + 034849 1290 37 01 1 305246224 00 0531 + 034850 1290 37 02 1 305246224 01 0531 + 034851 1290 37 03 1 305246224 02 0531 + 034852 1290 37 04 1 305246224 03 0531 + 034853 1290 37 05 1 305246224 04 0531 + 034854 1290 37 06 1 305246224 05 0531 + 034855 1290 37 07 1 305246224 06 0531 + 034856 1290 37 08 1 305246224 07 0531 + 034857 1290 38 01 1 305246224 08 0531 + 034858 1290 38 02 1 305246224 09 0531 + 034859 1290 38 03 1 305246224 10 0531 + 034860 1290 38 04 1 305246224 11 0531 + 034861 1290 38 05 1 305246224 12 0531 + 034862 1290 38 06 1 305246224 13 0531 + 034863 1290 38 07 1 305246224 14 0531 + 034864 1290 38 08 1 305246224 15 0531 + 034865 1290 39 01 1 305246220 00 0530 + 034866 1290 39 02 1 305246220 01 0530 + 034867 1290 39 03 1 305246220 02 0530 + 034868 1290 39 04 1 305246220 03 0530 + 034869 1290 39 05 1 305246220 04 0530 + 034870 1290 39 06 1 305246220 05 0530 + 034871 1290 39 07 1 305246220 06 0530 + 034872 1290 39 08 1 305246220 07 0530 + 034873 1290 40 01 1 305246220 08 0530 + 034874 1290 40 02 1 305246220 09 0530 + 034875 1290 40 03 1 305246220 10 0530 + 034876 1290 40 04 1 305246220 11 0530 + 034877 1290 40 05 1 305246220 12 0530 + 034878 1290 40 06 1 305246220 13 0530 + 034879 1290 40 07 1 305246220 14 0530 + 034880 1290 40 08 1 305246220 15 0530 + 034881 1290 41 01 1 305250316 00 0538 + 034882 1290 41 02 1 305250316 01 0538 + 034883 1290 41 03 1 305250316 02 0538 + 034884 1290 41 04 1 305250316 03 0538 + 034885 1290 41 05 1 305250316 04 0538 + 034886 1290 41 06 1 305250316 05 0538 + 034887 1290 41 07 1 305250316 06 0538 + 034888 1290 41 08 1 305250316 07 0538 + 034889 1290 42 01 1 305250316 08 0538 + 034890 1290 42 02 1 305250316 09 0538 + 034891 1290 42 03 1 305250316 10 0538 + 034892 1290 42 04 1 305250316 11 0538 + 034893 1290 42 05 1 305250316 12 0538 + 034894 1290 42 06 1 305250316 13 0538 + 034895 1290 42 07 1 305250316 14 0538 + 034896 1290 42 08 1 305250316 15 0538 + 034897 1290 43 01 1 305250320 00 0539 + 034898 1290 43 02 1 305250320 01 0539 + 034899 1290 43 03 1 305250320 02 0539 + 034900 1290 43 04 1 305250320 03 0539 + 034901 1290 43 05 1 305250320 04 0539 + 034902 1290 43 06 1 305250320 05 0539 + 034903 1290 43 07 1 305250320 06 0539 + 034904 1290 43 08 1 305250320 07 0539 + 034905 1290 44 01 1 305250320 08 0539 + 034906 1290 44 02 1 305250320 09 0539 + 034907 1290 44 03 1 305250320 10 0539 + 034908 1290 44 04 1 305250320 11 0539 + 034909 1290 44 05 1 305250320 12 0539 + 034910 1290 44 06 1 305250320 13 0539 + 034911 1290 44 07 1 305250320 14 0539 + 034912 1290 44 08 1 305250320 15 0539 + 034913 1290 45 01 1 305250308 00 0536 + 034914 1290 45 02 1 305250308 01 0536 + 034915 1290 45 03 1 305250308 02 0536 + 034916 1290 45 04 1 305250308 03 0536 + 034917 1290 45 05 1 305250308 04 0536 + 034918 1290 45 06 1 305250308 05 0536 + 034919 1290 45 07 1 305250308 06 0536 + 034920 1290 45 08 1 305250308 07 0536 + 034921 1290 46 01 1 305250308 08 0536 + 034922 1290 46 02 1 305250308 09 0536 + 034923 1290 46 03 1 305250308 10 0536 + 034924 1290 46 04 1 305250308 11 0536 + 034925 1290 46 05 1 305250308 12 0536 + 034926 1290 46 06 1 305250308 13 0536 + 034927 1290 46 07 1 305250308 14 0536 + 034928 1290 46 08 1 305250308 15 0536 + 034929 1290 47 01 1 305250312 00 0537 + 034930 1290 47 02 1 305250312 01 0537 + 034931 1290 47 03 1 305250312 02 0537 + 034932 1290 47 04 1 305250312 03 0537 + 034933 1290 47 05 1 305250312 04 0537 + 034934 1290 47 06 1 305250312 05 0537 + 034935 1290 47 07 1 305250312 06 0537 + 034936 1290 47 08 1 305250312 07 0537 + 034937 1290 48 01 1 305250312 08 0537 + 034938 1290 48 02 1 305250312 09 0537 + 034939 1290 48 03 1 305250312 10 0537 + 034940 1290 48 04 1 305250312 11 0537 + 034941 1290 48 05 1 305250312 12 0537 + 034942 1290 48 06 1 305250312 13 0537 + 034943 1290 48 07 1 305250312 14 0537 + 034944 1290 48 08 1 305250312 15 0537 + 034945 1291 01 01 1 303067148 08 0050 + 034946 1291 01 02 1 303067148 09 0050 + 034947 9999 99 99 0 9999 99 9999 + 034948 9999 99 99 0 9999 99 9999 + 034949 9999 99 99 0 9999 99 9999 + 034950 9999 99 99 0 9999 99 9999 + 034951 9999 99 99 0 9999 99 9999 + 034952 9999 99 99 0 9999 99 9999 + 034953 1291 02 01 1 303067148 10 0050 + 034954 1291 02 02 1 303067148 11 0050 + 034955 9999 99 99 0 9999 99 9999 + 034956 9999 99 99 0 9999 99 9999 + 034957 9999 99 99 0 9999 99 9999 + 034958 9999 99 99 0 9999 99 9999 + 034959 9999 99 99 0 9999 99 9999 + 034960 9999 99 99 0 9999 99 9999 + 034961 1291 03 01 1 303067148 12 0050 + 034962 1291 03 02 1 303067148 13 0050 + 034963 9999 99 99 0 9999 99 9999 + 034964 9999 99 99 0 9999 99 9999 + 034965 9999 99 99 0 9999 99 9999 + 034966 9999 99 99 0 9999 99 9999 + 034967 9999 99 99 0 9999 99 9999 + 034968 9999 99 99 0 9999 99 9999 + 034969 1291 04 01 1 303067148 14 0050 + 034970 1291 04 02 1 303067148 15 0050 + 034971 9999 99 99 0 9999 99 9999 + 034972 9999 99 99 0 9999 99 9999 + 034973 9999 99 99 0 9999 99 9999 + 034974 9999 99 99 0 9999 99 9999 + 034975 9999 99 99 0 9999 99 9999 + 034976 9999 99 99 0 9999 99 9999 + 034977 1291 05 01 1 303067148 00 0050 + 034978 1291 05 02 1 303067148 01 0050 + 034979 9999 99 99 0 9999 99 9999 + 034980 9999 99 99 0 9999 99 9999 + 034981 9999 99 99 0 9999 99 9999 + 034982 9999 99 99 0 9999 99 9999 + 034983 9999 99 99 0 9999 99 9999 + 034984 9999 99 99 0 9999 99 9999 + 034985 1291 06 01 1 303067148 02 0050 + 034986 1291 06 02 1 303067148 03 0050 + 034987 9999 99 99 0 9999 99 9999 + 034988 9999 99 99 0 9999 99 9999 + 034989 9999 99 99 0 9999 99 9999 + 034990 9999 99 99 0 9999 99 9999 + 034991 9999 99 99 0 9999 99 9999 + 034992 9999 99 99 0 9999 99 9999 + 034993 1291 07 01 1 303067148 04 0050 + 034994 1291 07 02 1 303067148 05 0050 + 034995 9999 99 99 0 9999 99 9999 + 034996 9999 99 99 0 9999 99 9999 + 034997 9999 99 99 0 9999 99 9999 + 034998 9999 99 99 0 9999 99 9999 + 034999 9999 99 99 0 9999 99 9999 + 035000 9999 99 99 0 9999 99 9999 + 035001 1291 08 01 1 303067148 06 0050 + 035002 1291 08 02 1 303067148 07 0050 + 035003 9999 99 99 0 9999 99 9999 + 035004 9999 99 99 0 9999 99 9999 + 035005 9999 99 99 0 9999 99 9999 + 035006 9999 99 99 0 9999 99 9999 + 035007 9999 99 99 0 9999 99 9999 + 035008 9999 99 99 0 9999 99 9999 + 035009 1291 09 01 1 304148492 00 0210 + 035010 1291 09 02 1 304148492 01 0210 + 035011 1291 09 03 1 304148492 02 0210 + 035012 1291 09 04 1 304148492 03 0210 + 035013 9999 99 99 0 9999 99 9999 + 035014 9999 99 99 0 9999 99 9999 + 035015 9999 99 99 0 9999 99 9999 + 035016 9999 99 99 0 9999 99 9999 + 035017 1291 10 01 1 304148492 04 0210 + 035018 1291 10 02 1 304148492 05 0210 + 035019 1291 10 03 1 304148492 06 0210 + 035020 1291 10 04 1 304148492 07 0210 + 035021 9999 99 99 0 9999 99 9999 + 035022 9999 99 99 0 9999 99 9999 + 035023 9999 99 99 0 9999 99 9999 + 035024 9999 99 99 0 9999 99 9999 + 035025 1291 11 01 1 304148492 08 0210 + 035026 1291 11 02 1 304148492 09 0210 + 035027 1291 11 03 1 304148492 10 0210 + 035028 1291 11 04 1 304148492 11 0210 + 035029 9999 99 99 0 9999 99 9999 + 035030 9999 99 99 0 9999 99 9999 + 035031 9999 99 99 0 9999 99 9999 + 035032 9999 99 99 0 9999 99 9999 + 035033 1291 12 01 1 304148492 12 0210 + 035034 1291 12 02 1 304148492 13 0210 + 035035 1291 12 03 1 304148492 14 0210 + 035036 1291 12 04 1 304148492 15 0210 + 035037 9999 99 99 0 9999 99 9999 + 035038 9999 99 99 0 9999 99 9999 + 035039 9999 99 99 0 9999 99 9999 + 035040 9999 99 99 0 9999 99 9999 + 035041 1291 13 01 1 304148496 08 0211 + 035042 1291 13 02 1 304148496 09 0211 + 035043 1291 13 03 1 304148496 10 0211 + 035044 1291 13 04 1 304148496 11 0211 + 035045 9999 99 99 0 9999 99 9999 + 035046 9999 99 99 0 9999 99 9999 + 035047 9999 99 99 0 9999 99 9999 + 035048 9999 99 99 0 9999 99 9999 + 035049 1291 14 01 1 304148496 12 0211 + 035050 1291 14 02 1 304148496 13 0211 + 035051 1291 14 03 1 304148496 14 0211 + 035052 1291 14 04 1 304148496 15 0211 + 035053 9999 99 99 0 9999 99 9999 + 035054 9999 99 99 0 9999 99 9999 + 035055 9999 99 99 0 9999 99 9999 + 035056 9999 99 99 0 9999 99 9999 + 035057 1291 15 01 1 304148496 00 0211 + 035058 1291 15 02 1 304148496 01 0211 + 035059 1291 15 03 1 304148496 02 0211 + 035060 1291 15 04 1 304148496 03 0211 + 035061 9999 99 99 0 9999 99 9999 + 035062 9999 99 99 0 9999 99 9999 + 035063 9999 99 99 0 9999 99 9999 + 035064 9999 99 99 0 9999 99 9999 + 035065 1291 16 01 1 304148496 04 0211 + 035066 1291 16 02 1 304148496 05 0211 + 035067 1291 16 03 1 304148496 06 0211 + 035068 1291 16 04 1 304148496 07 0211 + 035069 9999 99 99 0 9999 99 9999 + 035070 9999 99 99 0 9999 99 9999 + 035071 9999 99 99 0 9999 99 9999 + 035072 9999 99 99 0 9999 99 9999 + 035073 1291 17 01 1 306319368 00 0929 + 035074 1291 17 02 1 306319368 01 0929 + 035075 1291 17 03 1 306319368 02 0929 + 035076 1291 17 04 1 306319368 03 0929 + 035077 1291 17 05 1 306319368 04 0929 + 035078 1291 17 06 1 306319368 05 0929 + 035079 1291 17 07 1 306319368 06 0929 + 035080 1291 17 08 1 306319368 07 0929 + 035081 1291 18 01 1 306319368 08 0929 + 035082 1291 18 02 1 306319368 09 0929 + 035083 1291 18 03 1 306319368 10 0929 + 035084 1291 18 04 1 306319368 11 0929 + 035085 1291 18 05 1 306319368 12 0929 + 035086 1291 18 06 1 306319368 13 0929 + 035087 1291 18 07 1 306319368 14 0929 + 035088 1291 18 08 1 306319368 15 0929 + 035089 1291 19 01 1 306319364 00 0928 + 035090 1291 19 02 1 306319364 01 0928 + 035091 1291 19 03 1 306319364 02 0928 + 035092 1291 19 04 1 306319364 03 0928 + 035093 1291 19 05 1 306319364 04 0928 + 035094 1291 19 06 1 306319364 05 0928 + 035095 1291 19 07 1 306319364 06 0928 + 035096 1291 19 08 1 306319364 07 0928 + 035097 1291 20 01 1 306319364 08 0928 + 035098 1291 20 02 1 306319364 09 0928 + 035099 1291 20 03 1 306319364 10 0928 + 035100 1291 20 04 1 306319364 11 0928 + 035101 1291 20 05 1 306319364 12 0928 + 035102 1291 20 06 1 306319364 13 0928 + 035103 1291 20 07 1 306319364 14 0928 + 035104 1291 20 08 1 306319364 15 0928 + 035105 1291 21 01 1 306319376 00 0931 + 035106 1291 21 02 1 306319376 01 0931 + 035107 1291 21 03 1 306319376 02 0931 + 035108 1291 21 04 1 306319376 03 0931 + 035109 1291 21 05 1 306319376 04 0931 + 035110 1291 21 06 1 306319376 05 0931 + 035111 1291 21 07 1 306319376 06 0931 + 035112 1291 21 08 1 306319376 07 0931 + 035113 1291 22 01 1 306319376 08 0931 + 035114 1291 22 02 1 306319376 09 0931 + 035115 1291 22 03 1 306319376 10 0931 + 035116 1291 22 04 1 306319376 11 0931 + 035117 1291 22 05 1 306319376 12 0931 + 035118 1291 22 06 1 306319376 13 0931 + 035119 1291 22 07 1 306319376 14 0931 + 035120 1291 22 08 1 306319376 15 0931 + 035121 1291 23 01 1 306319372 00 0930 + 035122 1291 23 02 1 306319372 01 0930 + 035123 1291 23 03 1 306319372 02 0930 + 035124 1291 23 04 1 306319372 03 0930 + 035125 1291 23 05 1 306319372 04 0930 + 035126 1291 23 06 1 306319372 05 0930 + 035127 1291 23 07 1 306319372 06 0930 + 035128 1291 23 08 1 306319372 07 0930 + 035129 1291 24 01 1 306319372 08 0930 + 035130 1291 24 02 1 306319372 09 0930 + 035131 1291 24 03 1 306319372 10 0930 + 035132 1291 24 04 1 306319372 11 0930 + 035133 1291 24 05 1 306319372 12 0930 + 035134 1291 24 06 1 306319372 13 0930 + 035135 1291 24 07 1 306319372 14 0930 + 035136 1291 24 08 1 306319372 15 0930 + 035137 1291 25 01 1 303067144 08 0049 + 035138 1291 25 02 1 303067144 09 0049 + 035139 9999 99 99 0 9999 99 9999 + 035140 9999 99 99 0 9999 99 9999 + 035141 9999 99 99 0 9999 99 9999 + 035142 9999 99 99 0 9999 99 9999 + 035143 9999 99 99 0 9999 99 9999 + 035144 9999 99 99 0 9999 99 9999 + 035145 1291 26 01 1 303067144 10 0049 + 035146 1291 26 02 1 303067144 11 0049 + 035147 9999 99 99 0 9999 99 9999 + 035148 9999 99 99 0 9999 99 9999 + 035149 9999 99 99 0 9999 99 9999 + 035150 9999 99 99 0 9999 99 9999 + 035151 9999 99 99 0 9999 99 9999 + 035152 9999 99 99 0 9999 99 9999 + 035153 1291 27 01 1 303067144 12 0049 + 035154 1291 27 02 1 303067144 13 0049 + 035155 9999 99 99 0 9999 99 9999 + 035156 9999 99 99 0 9999 99 9999 + 035157 9999 99 99 0 9999 99 9999 + 035158 9999 99 99 0 9999 99 9999 + 035159 9999 99 99 0 9999 99 9999 + 035160 9999 99 99 0 9999 99 9999 + 035161 1291 28 01 1 303067144 14 0049 + 035162 1291 28 02 1 303067144 15 0049 + 035163 9999 99 99 0 9999 99 9999 + 035164 9999 99 99 0 9999 99 9999 + 035165 9999 99 99 0 9999 99 9999 + 035166 9999 99 99 0 9999 99 9999 + 035167 9999 99 99 0 9999 99 9999 + 035168 9999 99 99 0 9999 99 9999 + 035169 1291 29 01 1 303067144 04 0049 + 035170 1291 29 02 1 303067144 05 0049 + 035171 9999 99 99 0 9999 99 9999 + 035172 9999 99 99 0 9999 99 9999 + 035173 9999 99 99 0 9999 99 9999 + 035174 9999 99 99 0 9999 99 9999 + 035175 9999 99 99 0 9999 99 9999 + 035176 9999 99 99 0 9999 99 9999 + 035177 1291 30 01 1 303067144 06 0049 + 035178 1291 30 02 1 303067144 07 0049 + 035179 9999 99 99 0 9999 99 9999 + 035180 9999 99 99 0 9999 99 9999 + 035181 9999 99 99 0 9999 99 9999 + 035182 9999 99 99 0 9999 99 9999 + 035183 9999 99 99 0 9999 99 9999 + 035184 9999 99 99 0 9999 99 9999 + 035185 1291 31 01 1 303067144 00 0049 + 035186 1291 31 02 1 303067144 01 0049 + 035187 9999 99 99 0 9999 99 9999 + 035188 9999 99 99 0 9999 99 9999 + 035189 9999 99 99 0 9999 99 9999 + 035190 9999 99 99 0 9999 99 9999 + 035191 9999 99 99 0 9999 99 9999 + 035192 9999 99 99 0 9999 99 9999 + 035193 1291 32 01 1 303067144 02 0049 + 035194 1291 32 02 1 303067144 03 0049 + 035195 9999 99 99 0 9999 99 9999 + 035196 9999 99 99 0 9999 99 9999 + 035197 9999 99 99 0 9999 99 9999 + 035198 9999 99 99 0 9999 99 9999 + 035199 9999 99 99 0 9999 99 9999 + 035200 9999 99 99 0 9999 99 9999 + 035201 1291 33 01 1 306323464 00 0937 + 035202 1291 33 02 1 306323464 01 0937 + 035203 1291 33 03 1 306323464 02 0937 + 035204 1291 33 04 1 306323464 03 0937 + 035205 1291 33 05 1 306323464 04 0937 + 035206 1291 33 06 1 306323464 05 0937 + 035207 1291 33 07 1 306323464 06 0937 + 035208 1291 33 08 1 306323464 07 0937 + 035209 1291 34 01 1 306323464 08 0937 + 035210 1291 34 02 1 306323464 09 0937 + 035211 1291 34 03 1 306323464 10 0937 + 035212 1291 34 04 1 306323464 11 0937 + 035213 1291 34 05 1 306323464 12 0937 + 035214 1291 34 06 1 306323464 13 0937 + 035215 1291 34 07 1 306323464 14 0937 + 035216 1291 34 08 1 306323464 15 0937 + 035217 1291 35 01 1 306323460 00 0936 + 035218 1291 35 02 1 306323460 01 0936 + 035219 1291 35 03 1 306323460 02 0936 + 035220 1291 35 04 1 306323460 03 0936 + 035221 1291 35 05 1 306323460 04 0936 + 035222 1291 35 06 1 306323460 05 0936 + 035223 1291 35 07 1 306323460 06 0936 + 035224 1291 35 08 1 306323460 07 0936 + 035225 1291 36 01 1 306323460 08 0936 + 035226 1291 36 02 1 306323460 09 0936 + 035227 1291 36 03 1 306323460 10 0936 + 035228 1291 36 04 1 306323460 11 0936 + 035229 1291 36 05 1 306323460 12 0936 + 035230 1291 36 06 1 306323460 13 0936 + 035231 1291 36 07 1 306323460 14 0936 + 035232 1291 36 08 1 306323460 15 0936 + 035233 1291 37 01 1 306323472 00 0939 + 035234 1291 37 02 1 306323472 01 0939 + 035235 1291 37 03 1 306323472 02 0939 + 035236 1291 37 04 1 306323472 03 0939 + 035237 1291 37 05 1 306323472 04 0939 + 035238 1291 37 06 1 306323472 05 0939 + 035239 1291 37 07 1 306323472 06 0939 + 035240 1291 37 08 1 306323472 07 0939 + 035241 1291 38 01 1 306323472 08 0939 + 035242 1291 38 02 1 306323472 09 0939 + 035243 1291 38 03 1 306323472 10 0939 + 035244 1291 38 04 1 306323472 11 0939 + 035245 1291 38 05 1 306323472 12 0939 + 035246 1291 38 06 1 306323472 13 0939 + 035247 1291 38 07 1 306323472 14 0939 + 035248 1291 38 08 1 306323472 15 0939 + 035249 1291 39 01 1 306323468 00 0938 + 035250 1291 39 02 1 306323468 01 0938 + 035251 1291 39 03 1 306323468 02 0938 + 035252 1291 39 04 1 306323468 03 0938 + 035253 1291 39 05 1 306323468 04 0938 + 035254 1291 39 06 1 306323468 05 0938 + 035255 1291 39 07 1 306323468 06 0938 + 035256 1291 39 08 1 306323468 07 0938 + 035257 1291 40 01 1 306323468 08 0938 + 035258 1291 40 02 1 306323468 09 0938 + 035259 1291 40 03 1 306323468 10 0938 + 035260 1291 40 04 1 306323468 11 0938 + 035261 1291 40 05 1 306323468 12 0938 + 035262 1291 40 06 1 306323468 13 0938 + 035263 1291 40 07 1 306323468 14 0938 + 035264 1291 40 08 1 306323468 15 0938 + 035265 1291 41 01 1 304148488 00 0209 + 035266 1291 41 02 1 304148488 01 0209 + 035267 1291 41 03 1 304148488 02 0209 + 035268 1291 41 04 1 304148488 03 0209 + 035269 9999 99 99 0 9999 99 9999 + 035270 9999 99 99 0 9999 99 9999 + 035271 9999 99 99 0 9999 99 9999 + 035272 9999 99 99 0 9999 99 9999 + 035273 1291 42 01 1 304148488 04 0209 + 035274 1291 42 02 1 304148488 05 0209 + 035275 1291 42 03 1 304148488 06 0209 + 035276 1291 42 04 1 304148488 07 0209 + 035277 9999 99 99 0 9999 99 9999 + 035278 9999 99 99 0 9999 99 9999 + 035279 9999 99 99 0 9999 99 9999 + 035280 9999 99 99 0 9999 99 9999 + 035281 1291 43 01 1 304148488 08 0209 + 035282 1291 43 02 1 304148488 09 0209 + 035283 1291 43 03 1 304148488 10 0209 + 035284 1291 43 04 1 304148488 11 0209 + 035285 9999 99 99 0 9999 99 9999 + 035286 9999 99 99 0 9999 99 9999 + 035287 9999 99 99 0 9999 99 9999 + 035288 9999 99 99 0 9999 99 9999 + 035289 1291 44 01 1 304148488 12 0209 + 035290 1291 44 02 1 304148488 13 0209 + 035291 1291 44 03 1 304148488 14 0209 + 035292 1291 44 04 1 304148488 15 0209 + 035293 9999 99 99 0 9999 99 9999 + 035294 9999 99 99 0 9999 99 9999 + 035295 9999 99 99 0 9999 99 9999 + 035296 9999 99 99 0 9999 99 9999 + 035297 1291 45 01 1 304148484 00 0208 + 035298 1291 45 02 1 304148484 01 0208 + 035299 1291 45 03 1 304148484 02 0208 + 035300 1291 45 04 1 304148484 03 0208 + 035301 9999 99 99 0 9999 99 9999 + 035302 9999 99 99 0 9999 99 9999 + 035303 9999 99 99 0 9999 99 9999 + 035304 9999 99 99 0 9999 99 9999 + 035305 1291 46 01 1 304148484 04 0208 + 035306 1291 46 02 1 304148484 05 0208 + 035307 1291 46 03 1 304148484 06 0208 + 035308 1291 46 04 1 304148484 07 0208 + 035309 9999 99 99 0 9999 99 9999 + 035310 9999 99 99 0 9999 99 9999 + 035311 9999 99 99 0 9999 99 9999 + 035312 9999 99 99 0 9999 99 9999 + 035313 1291 47 01 1 304148484 08 0208 + 035314 1291 47 02 1 304148484 09 0208 + 035315 1291 47 03 1 304148484 10 0208 + 035316 1291 47 04 1 304148484 11 0208 + 035317 9999 99 99 0 9999 99 9999 + 035318 9999 99 99 0 9999 99 9999 + 035319 9999 99 99 0 9999 99 9999 + 035320 9999 99 99 0 9999 99 9999 + 035321 1291 48 01 1 304148484 12 0208 + 035322 1291 48 02 1 304148484 13 0208 + 035323 1291 48 03 1 304148484 14 0208 + 035324 1291 48 04 1 304148484 15 0208 + 035325 9999 99 99 0 9999 99 9999 + 035326 9999 99 99 0 9999 99 9999 + 035327 9999 99 99 0 9999 99 9999 + 035328 9999 99 99 0 9999 99 9999 + 035329 1292 01 01 1 304152588 08 0218 + 035330 1292 01 02 1 304152588 09 0218 + 035331 1292 01 03 1 304152588 10 0218 + 035332 1292 01 04 1 304152588 11 0218 + 035333 9999 99 99 0 9999 99 9999 + 035334 9999 99 99 0 9999 99 9999 + 035335 9999 99 99 0 9999 99 9999 + 035336 9999 99 99 0 9999 99 9999 + 035337 1292 02 01 1 304152588 12 0218 + 035338 1292 02 02 1 304152588 13 0218 + 035339 1292 02 03 1 304152588 14 0218 + 035340 1292 02 04 1 304152588 15 0218 + 035341 9999 99 99 0 9999 99 9999 + 035342 9999 99 99 0 9999 99 9999 + 035343 9999 99 99 0 9999 99 9999 + 035344 9999 99 99 0 9999 99 9999 + 035345 1292 03 01 1 304152588 00 0218 + 035346 1292 03 02 1 304152588 01 0218 + 035347 1292 03 03 1 304152588 02 0218 + 035348 1292 03 04 1 304152588 03 0218 + 035349 9999 99 99 0 9999 99 9999 + 035350 9999 99 99 0 9999 99 9999 + 035351 9999 99 99 0 9999 99 9999 + 035352 9999 99 99 0 9999 99 9999 + 035353 1292 04 01 1 304152588 04 0218 + 035354 1292 04 02 1 304152588 05 0218 + 035355 1292 04 03 1 304152588 06 0218 + 035356 1292 04 04 1 304152588 07 0218 + 035357 9999 99 99 0 9999 99 9999 + 035358 9999 99 99 0 9999 99 9999 + 035359 9999 99 99 0 9999 99 9999 + 035360 9999 99 99 0 9999 99 9999 + 035361 1292 05 01 1 304152592 08 0219 + 035362 1292 05 02 1 304152592 09 0219 + 035363 1292 05 03 1 304152592 10 0219 + 035364 1292 05 04 1 304152592 11 0219 + 035365 9999 99 99 0 9999 99 9999 + 035366 9999 99 99 0 9999 99 9999 + 035367 9999 99 99 0 9999 99 9999 + 035368 9999 99 99 0 9999 99 9999 + 035369 1292 06 01 1 304152592 12 0219 + 035370 1292 06 02 1 304152592 13 0219 + 035371 1292 06 03 1 304152592 14 0219 + 035372 1292 06 04 1 304152592 15 0219 + 035373 9999 99 99 0 9999 99 9999 + 035374 9999 99 99 0 9999 99 9999 + 035375 9999 99 99 0 9999 99 9999 + 035376 9999 99 99 0 9999 99 9999 + 035377 1292 07 01 1 304152592 00 0219 + 035378 1292 07 02 1 304152592 01 0219 + 035379 1292 07 03 1 304152592 02 0219 + 035380 1292 07 04 1 304152592 03 0219 + 035381 9999 99 99 0 9999 99 9999 + 035382 9999 99 99 0 9999 99 9999 + 035383 9999 99 99 0 9999 99 9999 + 035384 9999 99 99 0 9999 99 9999 + 035385 1292 08 01 1 304152592 04 0219 + 035386 1292 08 02 1 304152592 05 0219 + 035387 1292 08 03 1 304152592 06 0219 + 035388 1292 08 04 1 304152592 07 0219 + 035389 9999 99 99 0 9999 99 9999 + 035390 9999 99 99 0 9999 99 9999 + 035391 9999 99 99 0 9999 99 9999 + 035392 9999 99 99 0 9999 99 9999 + 035393 1292 09 01 1 306327564 00 0946 + 035394 1292 09 02 1 306327564 01 0946 + 035395 1292 09 03 1 306327564 02 0946 + 035396 1292 09 04 1 306327564 03 0946 + 035397 1292 09 05 1 306327564 04 0946 + 035398 1292 09 06 1 306327564 05 0946 + 035399 1292 09 07 1 306327564 06 0946 + 035400 1292 09 08 1 306327564 07 0946 + 035401 1292 10 01 1 306327564 08 0946 + 035402 1292 10 02 1 306327564 09 0946 + 035403 1292 10 03 1 306327564 10 0946 + 035404 1292 10 04 1 306327564 11 0946 + 035405 1292 10 05 1 306327564 12 0946 + 035406 1292 10 06 1 306327564 13 0946 + 035407 1292 10 07 1 306327564 14 0946 + 035408 1292 10 08 1 306327564 15 0946 + 035409 1292 11 01 1 306327568 00 0947 + 035410 1292 11 02 1 306327568 01 0947 + 035411 1292 11 03 1 306327568 02 0947 + 035412 1292 11 04 1 306327568 03 0947 + 035413 1292 11 05 1 306327568 04 0947 + 035414 1292 11 06 1 306327568 05 0947 + 035415 1292 11 07 1 306327568 06 0947 + 035416 1292 11 08 1 306327568 07 0947 + 035417 1292 12 01 1 306327568 08 0947 + 035418 1292 12 02 1 306327568 09 0947 + 035419 1292 12 03 1 306327568 10 0947 + 035420 1292 12 04 1 306327568 11 0947 + 035421 1292 12 05 1 306327568 12 0947 + 035422 1292 12 06 1 306327568 13 0947 + 035423 1292 12 07 1 306327568 14 0947 + 035424 1292 12 08 1 306327568 15 0947 + 035425 1292 13 01 1 306327556 00 0944 + 035426 1292 13 02 1 306327556 01 0944 + 035427 1292 13 03 1 306327556 02 0944 + 035428 1292 13 04 1 306327556 03 0944 + 035429 1292 13 05 1 306327556 04 0944 + 035430 1292 13 06 1 306327556 05 0944 + 035431 1292 13 07 1 306327556 06 0944 + 035432 1292 13 08 1 306327556 07 0944 + 035433 1292 14 01 1 306327556 08 0944 + 035434 1292 14 02 1 306327556 09 0944 + 035435 1292 14 03 1 306327556 10 0944 + 035436 1292 14 04 1 306327556 11 0944 + 035437 1292 14 05 1 306327556 12 0944 + 035438 1292 14 06 1 306327556 13 0944 + 035439 1292 14 07 1 306327556 14 0944 + 035440 1292 14 08 1 306327556 15 0944 + 035441 1292 15 01 1 306327560 00 0945 + 035442 1292 15 02 1 306327560 01 0945 + 035443 1292 15 03 1 306327560 02 0945 + 035444 1292 15 04 1 306327560 03 0945 + 035445 1292 15 05 1 306327560 04 0945 + 035446 1292 15 06 1 306327560 05 0945 + 035447 1292 15 07 1 306327560 06 0945 + 035448 1292 15 08 1 306327560 07 0945 + 035449 1292 16 01 1 306327560 08 0945 + 035450 1292 16 02 1 306327560 09 0945 + 035451 1292 16 03 1 306327560 10 0945 + 035452 1292 16 04 1 306327560 11 0945 + 035453 1292 16 05 1 306327560 12 0945 + 035454 1292 16 06 1 306327560 13 0945 + 035455 1292 16 07 1 306327560 14 0945 + 035456 1292 16 08 1 306327560 15 0945 + 035457 1292 17 01 1 303067140 12 0048 + 035458 1292 17 02 1 303067140 13 0048 + 035459 9999 99 99 0 9999 99 9999 + 035460 9999 99 99 0 9999 99 9999 + 035461 9999 99 99 0 9999 99 9999 + 035462 9999 99 99 0 9999 99 9999 + 035463 9999 99 99 0 9999 99 9999 + 035464 9999 99 99 0 9999 99 9999 + 035465 1292 18 01 1 303067140 14 0048 + 035466 1292 18 02 1 303067140 15 0048 + 035467 9999 99 99 0 9999 99 9999 + 035468 9999 99 99 0 9999 99 9999 + 035469 9999 99 99 0 9999 99 9999 + 035470 9999 99 99 0 9999 99 9999 + 035471 9999 99 99 0 9999 99 9999 + 035472 9999 99 99 0 9999 99 9999 + 035473 1292 19 01 1 303067140 08 0048 + 035474 1292 19 02 1 303067140 09 0048 + 035475 9999 99 99 0 9999 99 9999 + 035476 9999 99 99 0 9999 99 9999 + 035477 9999 99 99 0 9999 99 9999 + 035478 9999 99 99 0 9999 99 9999 + 035479 9999 99 99 0 9999 99 9999 + 035480 9999 99 99 0 9999 99 9999 + 035481 1292 20 01 1 303067140 10 0048 + 035482 1292 20 02 1 303067140 11 0048 + 035483 9999 99 99 0 9999 99 9999 + 035484 9999 99 99 0 9999 99 9999 + 035485 9999 99 99 0 9999 99 9999 + 035486 9999 99 99 0 9999 99 9999 + 035487 9999 99 99 0 9999 99 9999 + 035488 9999 99 99 0 9999 99 9999 + 035489 1292 21 01 1 303067140 00 0048 + 035490 1292 21 02 1 303067140 01 0048 + 035491 9999 99 99 0 9999 99 9999 + 035492 9999 99 99 0 9999 99 9999 + 035493 9999 99 99 0 9999 99 9999 + 035494 9999 99 99 0 9999 99 9999 + 035495 9999 99 99 0 9999 99 9999 + 035496 9999 99 99 0 9999 99 9999 + 035497 1292 22 01 1 303067140 02 0048 + 035498 1292 22 02 1 303067140 03 0048 + 035499 9999 99 99 0 9999 99 9999 + 035500 9999 99 99 0 9999 99 9999 + 035501 9999 99 99 0 9999 99 9999 + 035502 9999 99 99 0 9999 99 9999 + 035503 9999 99 99 0 9999 99 9999 + 035504 9999 99 99 0 9999 99 9999 + 035505 1292 23 01 1 303067140 04 0048 + 035506 1292 23 02 1 303067140 05 0048 + 035507 9999 99 99 0 9999 99 9999 + 035508 9999 99 99 0 9999 99 9999 + 035509 9999 99 99 0 9999 99 9999 + 035510 9999 99 99 0 9999 99 9999 + 035511 9999 99 99 0 9999 99 9999 + 035512 9999 99 99 0 9999 99 9999 + 035513 1292 24 01 1 303067140 06 0048 + 035514 1292 24 02 1 303067140 07 0048 + 035515 9999 99 99 0 9999 99 9999 + 035516 9999 99 99 0 9999 99 9999 + 035517 9999 99 99 0 9999 99 9999 + 035518 9999 99 99 0 9999 99 9999 + 035519 9999 99 99 0 9999 99 9999 + 035520 9999 99 99 0 9999 99 9999 + 035521 1292 25 01 1 305229832 00 0497 + 035522 1292 25 02 1 305229832 01 0497 + 035523 1292 25 03 1 305229832 02 0497 + 035524 1292 25 04 1 305229832 03 0497 + 035525 1292 25 05 1 305229832 04 0497 + 035526 1292 25 06 1 305229832 05 0497 + 035527 1292 25 07 1 305229832 06 0497 + 035528 1292 25 08 1 305229832 07 0497 + 035529 1292 26 01 1 305229832 08 0497 + 035530 1292 26 02 1 305229832 09 0497 + 035531 1292 26 03 1 305229832 10 0497 + 035532 1292 26 04 1 305229832 11 0497 + 035533 1292 26 05 1 305229832 12 0497 + 035534 1292 26 06 1 305229832 13 0497 + 035535 1292 26 07 1 305229832 14 0497 + 035536 1292 26 08 1 305229832 15 0497 + 035537 1292 27 01 1 305229828 00 0496 + 035538 1292 27 02 1 305229828 01 0496 + 035539 1292 27 03 1 305229828 02 0496 + 035540 1292 27 04 1 305229828 03 0496 + 035541 1292 27 05 1 305229828 04 0496 + 035542 1292 27 06 1 305229828 05 0496 + 035543 1292 27 07 1 305229828 06 0496 + 035544 1292 27 08 1 305229828 07 0496 + 035545 1292 28 01 1 305229828 08 0496 + 035546 1292 28 02 1 305229828 09 0496 + 035547 1292 28 03 1 305229828 10 0496 + 035548 1292 28 04 1 305229828 11 0496 + 035549 1292 28 05 1 305229828 12 0496 + 035550 1292 28 06 1 305229828 13 0496 + 035551 1292 28 07 1 305229828 14 0496 + 035552 1292 28 08 1 305229828 15 0496 + 035553 1292 29 01 1 305229840 00 0499 + 035554 1292 29 02 1 305229840 01 0499 + 035555 1292 29 03 1 305229840 02 0499 + 035556 1292 29 04 1 305229840 03 0499 + 035557 1292 29 05 1 305229840 04 0499 + 035558 1292 29 06 1 305229840 05 0499 + 035559 1292 29 07 1 305229840 06 0499 + 035560 1292 29 08 1 305229840 07 0499 + 035561 1292 30 01 1 305229840 08 0499 + 035562 1292 30 02 1 305229840 09 0499 + 035563 1292 30 03 1 305229840 10 0499 + 035564 1292 30 04 1 305229840 11 0499 + 035565 1292 30 05 1 305229840 12 0499 + 035566 1292 30 06 1 305229840 13 0499 + 035567 1292 30 07 1 305229840 14 0499 + 035568 1292 30 08 1 305229840 15 0499 + 035569 1292 31 01 1 305229836 00 0498 + 035570 1292 31 02 1 305229836 01 0498 + 035571 1292 31 03 1 305229836 02 0498 + 035572 1292 31 04 1 305229836 03 0498 + 035573 1292 31 05 1 305229836 04 0498 + 035574 1292 31 06 1 305229836 05 0498 + 035575 1292 31 07 1 305229836 06 0498 + 035576 1292 31 08 1 305229836 07 0498 + 035577 1292 32 01 1 305229836 08 0498 + 035578 1292 32 02 1 305229836 09 0498 + 035579 1292 32 03 1 305229836 10 0498 + 035580 1292 32 04 1 305229836 11 0498 + 035581 1292 32 05 1 305229836 12 0498 + 035582 1292 32 06 1 305229836 13 0498 + 035583 1292 32 07 1 305229836 14 0498 + 035584 1292 32 08 1 305229836 15 0498 + 035585 1292 33 01 1 306331660 00 0954 + 035586 1292 33 02 1 306331660 01 0954 + 035587 1292 33 03 1 306331660 02 0954 + 035588 1292 33 04 1 306331660 03 0954 + 035589 1292 33 05 1 306331660 04 0954 + 035590 1292 33 06 1 306331660 05 0954 + 035591 1292 33 07 1 306331660 06 0954 + 035592 1292 33 08 1 306331660 07 0954 + 035593 1292 34 01 1 306331660 08 0954 + 035594 1292 34 02 1 306331660 09 0954 + 035595 1292 34 03 1 306331660 10 0954 + 035596 1292 34 04 1 306331660 11 0954 + 035597 1292 34 05 1 306331660 12 0954 + 035598 1292 34 06 1 306331660 13 0954 + 035599 1292 34 07 1 306331660 14 0954 + 035600 1292 34 08 1 306331660 15 0954 + 035601 1292 35 01 1 306331664 00 0955 + 035602 1292 35 02 1 306331664 01 0955 + 035603 1292 35 03 1 306331664 02 0955 + 035604 1292 35 04 1 306331664 03 0955 + 035605 1292 35 05 1 306331664 04 0955 + 035606 1292 35 06 1 306331664 05 0955 + 035607 1292 35 07 1 306331664 06 0955 + 035608 1292 35 08 1 306331664 07 0955 + 035609 1292 36 01 1 306331664 08 0955 + 035610 1292 36 02 1 306331664 09 0955 + 035611 1292 36 03 1 306331664 10 0955 + 035612 1292 36 04 1 306331664 11 0955 + 035613 1292 36 05 1 306331664 12 0955 + 035614 1292 36 06 1 306331664 13 0955 + 035615 1292 36 07 1 306331664 14 0955 + 035616 1292 36 08 1 306331664 15 0955 + 035617 1292 37 01 1 306331652 00 0952 + 035618 1292 37 02 1 306331652 01 0952 + 035619 1292 37 03 1 306331652 02 0952 + 035620 1292 37 04 1 306331652 03 0952 + 035621 1292 37 05 1 306331652 04 0952 + 035622 1292 37 06 1 306331652 05 0952 + 035623 1292 37 07 1 306331652 06 0952 + 035624 1292 37 08 1 306331652 07 0952 + 035625 1292 38 01 1 306331652 08 0952 + 035626 1292 38 02 1 306331652 09 0952 + 035627 1292 38 03 1 306331652 10 0952 + 035628 1292 38 04 1 306331652 11 0952 + 035629 1292 38 05 1 306331652 12 0952 + 035630 1292 38 06 1 306331652 13 0952 + 035631 1292 38 07 1 306331652 14 0952 + 035632 1292 38 08 1 306331652 15 0952 + 035633 1292 39 01 1 306331656 00 0953 + 035634 1292 39 02 1 306331656 01 0953 + 035635 1292 39 03 1 306331656 02 0953 + 035636 1292 39 04 1 306331656 03 0953 + 035637 1292 39 05 1 306331656 04 0953 + 035638 1292 39 06 1 306331656 05 0953 + 035639 1292 39 07 1 306331656 06 0953 + 035640 1292 39 08 1 306331656 07 0953 + 035641 1292 40 01 1 306331656 08 0953 + 035642 1292 40 02 1 306331656 09 0953 + 035643 1292 40 03 1 306331656 10 0953 + 035644 1292 40 04 1 306331656 11 0953 + 035645 1292 40 05 1 306331656 12 0953 + 035646 1292 40 06 1 306331656 13 0953 + 035647 1292 40 07 1 306331656 14 0953 + 035648 1292 40 08 1 306331656 15 0953 + 035649 1292 41 01 1 304152580 08 0216 + 035650 1292 41 02 1 304152580 09 0216 + 035651 1292 41 03 1 304152580 10 0216 + 035652 1292 41 04 1 304152580 11 0216 + 035653 9999 99 99 0 9999 99 9999 + 035654 9999 99 99 0 9999 99 9999 + 035655 9999 99 99 0 9999 99 9999 + 035656 9999 99 99 0 9999 99 9999 + 035657 1292 42 01 1 304152580 12 0216 + 035658 1292 42 02 1 304152580 13 0216 + 035659 1292 42 03 1 304152580 14 0216 + 035660 1292 42 04 1 304152580 15 0216 + 035661 9999 99 99 0 9999 99 9999 + 035662 9999 99 99 0 9999 99 9999 + 035663 9999 99 99 0 9999 99 9999 + 035664 9999 99 99 0 9999 99 9999 + 035665 1292 43 01 1 304152580 00 0216 + 035666 1292 43 02 1 304152580 01 0216 + 035667 1292 43 03 1 304152580 02 0216 + 035668 1292 43 04 1 304152580 03 0216 + 035669 9999 99 99 0 9999 99 9999 + 035670 9999 99 99 0 9999 99 9999 + 035671 9999 99 99 0 9999 99 9999 + 035672 9999 99 99 0 9999 99 9999 + 035673 1292 44 01 1 304152580 04 0216 + 035674 1292 44 02 1 304152580 05 0216 + 035675 1292 44 03 1 304152580 06 0216 + 035676 1292 44 04 1 304152580 07 0216 + 035677 9999 99 99 0 9999 99 9999 + 035678 9999 99 99 0 9999 99 9999 + 035679 9999 99 99 0 9999 99 9999 + 035680 9999 99 99 0 9999 99 9999 + 035681 1292 45 01 1 304152584 08 0217 + 035682 1292 45 02 1 304152584 09 0217 + 035683 1292 45 03 1 304152584 10 0217 + 035684 1292 45 04 1 304152584 11 0217 + 035685 9999 99 99 0 9999 99 9999 + 035686 9999 99 99 0 9999 99 9999 + 035687 9999 99 99 0 9999 99 9999 + 035688 9999 99 99 0 9999 99 9999 + 035689 1292 46 01 1 304152584 12 0217 + 035690 1292 46 02 1 304152584 13 0217 + 035691 1292 46 03 1 304152584 14 0217 + 035692 1292 46 04 1 304152584 15 0217 + 035693 9999 99 99 0 9999 99 9999 + 035694 9999 99 99 0 9999 99 9999 + 035695 9999 99 99 0 9999 99 9999 + 035696 9999 99 99 0 9999 99 9999 + 035697 1292 47 01 1 304152584 00 0217 + 035698 1292 47 02 1 304152584 01 0217 + 035699 1292 47 03 1 304152584 02 0217 + 035700 1292 47 04 1 304152584 03 0217 + 035701 9999 99 99 0 9999 99 9999 + 035702 9999 99 99 0 9999 99 9999 + 035703 9999 99 99 0 9999 99 9999 + 035704 9999 99 99 0 9999 99 9999 + 035705 1292 48 01 1 304152584 04 0217 + 035706 1292 48 02 1 304152584 05 0217 + 035707 1292 48 03 1 304152584 06 0217 + 035708 1292 48 04 1 304152584 07 0217 + 035709 9999 99 99 0 9999 99 9999 + 035710 9999 99 99 0 9999 99 9999 + 035711 9999 99 99 0 9999 99 9999 + 035712 9999 99 99 0 9999 99 9999 + 035713 1293 01 01 1 305233928 00 0505 + 035714 1293 01 02 1 305233928 01 0505 + 035715 1293 01 03 1 305233928 02 0505 + 035716 1293 01 04 1 305233928 03 0505 + 035717 1293 01 05 1 305233928 04 0505 + 035718 1293 01 06 1 305233928 05 0505 + 035719 1293 01 07 1 305233928 06 0505 + 035720 1293 01 08 1 305233928 07 0505 + 035721 1293 02 01 1 305233928 08 0505 + 035722 1293 02 02 1 305233928 09 0505 + 035723 1293 02 03 1 305233928 10 0505 + 035724 1293 02 04 1 305233928 11 0505 + 035725 1293 02 05 1 305233928 12 0505 + 035726 1293 02 06 1 305233928 13 0505 + 035727 1293 02 07 1 305233928 14 0505 + 035728 1293 02 08 1 305233928 15 0505 + 035729 1293 03 01 1 305233924 00 0504 + 035730 1293 03 02 1 305233924 01 0504 + 035731 1293 03 03 1 305233924 02 0504 + 035732 1293 03 04 1 305233924 03 0504 + 035733 1293 03 05 1 305233924 04 0504 + 035734 1293 03 06 1 305233924 05 0504 + 035735 1293 03 07 1 305233924 06 0504 + 035736 1293 03 08 1 305233924 07 0504 + 035737 1293 04 01 1 305233924 08 0504 + 035738 1293 04 02 1 305233924 09 0504 + 035739 1293 04 03 1 305233924 10 0504 + 035740 1293 04 04 1 305233924 11 0504 + 035741 1293 04 05 1 305233924 12 0504 + 035742 1293 04 06 1 305233924 13 0504 + 035743 1293 04 07 1 305233924 14 0504 + 035744 1293 04 08 1 305233924 15 0504 + 035745 1293 05 01 1 305233936 00 0507 + 035746 1293 05 02 1 305233936 01 0507 + 035747 1293 05 03 1 305233936 02 0507 + 035748 1293 05 04 1 305233936 03 0507 + 035749 1293 05 05 1 305233936 04 0507 + 035750 1293 05 06 1 305233936 05 0507 + 035751 1293 05 07 1 305233936 06 0507 + 035752 1293 05 08 1 305233936 07 0507 + 035753 1293 06 01 1 305233936 08 0507 + 035754 1293 06 02 1 305233936 09 0507 + 035755 1293 06 03 1 305233936 10 0507 + 035756 1293 06 04 1 305233936 11 0507 + 035757 1293 06 05 1 305233936 12 0507 + 035758 1293 06 06 1 305233936 13 0507 + 035759 1293 06 07 1 305233936 14 0507 + 035760 1293 06 08 1 305233936 15 0507 + 035761 1293 07 01 1 305233932 00 0506 + 035762 1293 07 02 1 305233932 01 0506 + 035763 1293 07 03 1 305233932 02 0506 + 035764 1293 07 04 1 305233932 03 0506 + 035765 1293 07 05 1 305233932 04 0506 + 035766 1293 07 06 1 305233932 05 0506 + 035767 1293 07 07 1 305233932 06 0506 + 035768 1293 07 08 1 305233932 07 0506 + 035769 1293 08 01 1 305233932 08 0506 + 035770 1293 08 02 1 305233932 09 0506 + 035771 1293 08 03 1 305233932 10 0506 + 035772 1293 08 04 1 305233932 11 0506 + 035773 1293 08 05 1 305233932 12 0506 + 035774 1293 08 06 1 305233932 13 0506 + 035775 1293 08 07 1 305233932 14 0506 + 035776 1293 08 08 1 305233932 15 0506 + 035777 1293 09 01 1 305238028 00 0514 + 035778 1293 09 02 1 305238028 01 0514 + 035779 1293 09 03 1 305238028 02 0514 + 035780 1293 09 04 1 305238028 03 0514 + 035781 1293 09 05 1 305238028 04 0514 + 035782 1293 09 06 1 305238028 05 0514 + 035783 1293 09 07 1 305238028 06 0514 + 035784 1293 09 08 1 305238028 07 0514 + 035785 1293 10 01 1 305238028 08 0514 + 035786 1293 10 02 1 305238028 09 0514 + 035787 1293 10 03 1 305238028 10 0514 + 035788 1293 10 04 1 305238028 11 0514 + 035789 1293 10 05 1 305238028 12 0514 + 035790 1293 10 06 1 305238028 13 0514 + 035791 1293 10 07 1 305238028 14 0514 + 035792 1293 10 08 1 305238028 15 0514 + 035793 1293 11 01 1 305238032 00 0515 + 035794 1293 11 02 1 305238032 01 0515 + 035795 1293 11 03 1 305238032 02 0515 + 035796 1293 11 04 1 305238032 03 0515 + 035797 1293 11 05 1 305238032 04 0515 + 035798 1293 11 06 1 305238032 05 0515 + 035799 1293 11 07 1 305238032 06 0515 + 035800 1293 11 08 1 305238032 07 0515 + 035801 1293 12 01 1 305238032 08 0515 + 035802 1293 12 02 1 305238032 09 0515 + 035803 1293 12 03 1 305238032 10 0515 + 035804 1293 12 04 1 305238032 11 0515 + 035805 1293 12 05 1 305238032 12 0515 + 035806 1293 12 06 1 305238032 13 0515 + 035807 1293 12 07 1 305238032 14 0515 + 035808 1293 12 08 1 305238032 15 0515 + 035809 1293 13 01 1 305238020 00 0512 + 035810 1293 13 02 1 305238020 01 0512 + 035811 1293 13 03 1 305238020 02 0512 + 035812 1293 13 04 1 305238020 03 0512 + 035813 1293 13 05 1 305238020 04 0512 + 035814 1293 13 06 1 305238020 05 0512 + 035815 1293 13 07 1 305238020 06 0512 + 035816 1293 13 08 1 305238020 07 0512 + 035817 1293 14 01 1 305238020 08 0512 + 035818 1293 14 02 1 305238020 09 0512 + 035819 1293 14 03 1 305238020 10 0512 + 035820 1293 14 04 1 305238020 11 0512 + 035821 1293 14 05 1 305238020 12 0512 + 035822 1293 14 06 1 305238020 13 0512 + 035823 1293 14 07 1 305238020 14 0512 + 035824 1293 14 08 1 305238020 15 0512 + 035825 1293 15 01 1 305238024 00 0513 + 035826 1293 15 02 1 305238024 01 0513 + 035827 1293 15 03 1 305238024 02 0513 + 035828 1293 15 04 1 305238024 03 0513 + 035829 1293 15 05 1 305238024 04 0513 + 035830 1293 15 06 1 305238024 05 0513 + 035831 1293 15 07 1 305238024 06 0513 + 035832 1293 15 08 1 305238024 07 0513 + 035833 1293 16 01 1 305238024 08 0513 + 035834 1293 16 02 1 305238024 09 0513 + 035835 1293 16 03 1 305238024 10 0513 + 035836 1293 16 04 1 305238024 11 0513 + 035837 1293 16 05 1 305238024 12 0513 + 035838 1293 16 06 1 305238024 13 0513 + 035839 1293 16 07 1 305238024 14 0513 + 035840 1293 16 08 1 305238024 15 0513 + 035841 9999 99 99 0 9999 99 9999 + 035842 9999 99 99 0 9999 99 9999 + 035843 9999 99 99 0 9999 99 9999 + 035844 9999 99 99 0 9999 99 9999 + 035845 9999 99 99 0 9999 99 9999 + 035846 9999 99 99 0 9999 99 9999 + 035847 9999 99 99 0 9999 99 9999 + 035848 9999 99 99 0 9999 99 9999 + 035849 9999 99 99 0 9999 99 9999 + 035850 9999 99 99 0 9999 99 9999 + 035851 9999 99 99 0 9999 99 9999 + 035852 9999 99 99 0 9999 99 9999 + 035853 9999 99 99 0 9999 99 9999 + 035854 9999 99 99 0 9999 99 9999 + 035855 9999 99 99 0 9999 99 9999 + 035856 9999 99 99 0 9999 99 9999 + 035857 9999 99 99 0 9999 99 9999 + 035858 9999 99 99 0 9999 99 9999 + 035859 9999 99 99 0 9999 99 9999 + 035860 9999 99 99 0 9999 99 9999 + 035861 9999 99 99 0 9999 99 9999 + 035862 9999 99 99 0 9999 99 9999 + 035863 9999 99 99 0 9999 99 9999 + 035864 9999 99 99 0 9999 99 9999 + 035865 9999 99 99 0 9999 99 9999 + 035866 9999 99 99 0 9999 99 9999 + 035867 9999 99 99 0 9999 99 9999 + 035868 9999 99 99 0 9999 99 9999 + 035869 9999 99 99 0 9999 99 9999 + 035870 9999 99 99 0 9999 99 9999 + 035871 9999 99 99 0 9999 99 9999 + 035872 9999 99 99 0 9999 99 9999 + 035873 9999 99 99 0 9999 99 9999 + 035874 9999 99 99 0 9999 99 9999 + 035875 9999 99 99 0 9999 99 9999 + 035876 9999 99 99 0 9999 99 9999 + 035877 9999 99 99 0 9999 99 9999 + 035878 9999 99 99 0 9999 99 9999 + 035879 9999 99 99 0 9999 99 9999 + 035880 9999 99 99 0 9999 99 9999 + 035881 9999 99 99 0 9999 99 9999 + 035882 9999 99 99 0 9999 99 9999 + 035883 9999 99 99 0 9999 99 9999 + 035884 9999 99 99 0 9999 99 9999 + 035885 9999 99 99 0 9999 99 9999 + 035886 9999 99 99 0 9999 99 9999 + 035887 9999 99 99 0 9999 99 9999 + 035888 9999 99 99 0 9999 99 9999 + 035889 9999 99 99 0 9999 99 9999 + 035890 9999 99 99 0 9999 99 9999 + 035891 9999 99 99 0 9999 99 9999 + 035892 9999 99 99 0 9999 99 9999 + 035893 9999 99 99 0 9999 99 9999 + 035894 9999 99 99 0 9999 99 9999 + 035895 9999 99 99 0 9999 99 9999 + 035896 9999 99 99 0 9999 99 9999 + 035897 9999 99 99 0 9999 99 9999 + 035898 9999 99 99 0 9999 99 9999 + 035899 9999 99 99 0 9999 99 9999 + 035900 9999 99 99 0 9999 99 9999 + 035901 9999 99 99 0 9999 99 9999 + 035902 9999 99 99 0 9999 99 9999 + 035903 9999 99 99 0 9999 99 9999 + 035904 9999 99 99 0 9999 99 9999 + 035905 9999 99 99 0 9999 99 9999 + 035906 9999 99 99 0 9999 99 9999 + 035907 9999 99 99 0 9999 99 9999 + 035908 9999 99 99 0 9999 99 9999 + 035909 9999 99 99 0 9999 99 9999 + 035910 9999 99 99 0 9999 99 9999 + 035911 9999 99 99 0 9999 99 9999 + 035912 9999 99 99 0 9999 99 9999 + 035913 9999 99 99 0 9999 99 9999 + 035914 9999 99 99 0 9999 99 9999 + 035915 9999 99 99 0 9999 99 9999 + 035916 9999 99 99 0 9999 99 9999 + 035917 9999 99 99 0 9999 99 9999 + 035918 9999 99 99 0 9999 99 9999 + 035919 9999 99 99 0 9999 99 9999 + 035920 9999 99 99 0 9999 99 9999 + 035921 9999 99 99 0 9999 99 9999 + 035922 9999 99 99 0 9999 99 9999 + 035923 9999 99 99 0 9999 99 9999 + 035924 9999 99 99 0 9999 99 9999 + 035925 9999 99 99 0 9999 99 9999 + 035926 9999 99 99 0 9999 99 9999 + 035927 9999 99 99 0 9999 99 9999 + 035928 9999 99 99 0 9999 99 9999 + 035929 9999 99 99 0 9999 99 9999 + 035930 9999 99 99 0 9999 99 9999 + 035931 9999 99 99 0 9999 99 9999 + 035932 9999 99 99 0 9999 99 9999 + 035933 9999 99 99 0 9999 99 9999 + 035934 9999 99 99 0 9999 99 9999 + 035935 9999 99 99 0 9999 99 9999 + 035936 9999 99 99 0 9999 99 9999 + 035937 9999 99 99 0 9999 99 9999 + 035938 9999 99 99 0 9999 99 9999 + 035939 9999 99 99 0 9999 99 9999 + 035940 9999 99 99 0 9999 99 9999 + 035941 9999 99 99 0 9999 99 9999 + 035942 9999 99 99 0 9999 99 9999 + 035943 9999 99 99 0 9999 99 9999 + 035944 9999 99 99 0 9999 99 9999 + 035945 9999 99 99 0 9999 99 9999 + 035946 9999 99 99 0 9999 99 9999 + 035947 9999 99 99 0 9999 99 9999 + 035948 9999 99 99 0 9999 99 9999 + 035949 9999 99 99 0 9999 99 9999 + 035950 9999 99 99 0 9999 99 9999 + 035951 9999 99 99 0 9999 99 9999 + 035952 9999 99 99 0 9999 99 9999 + 035953 9999 99 99 0 9999 99 9999 + 035954 9999 99 99 0 9999 99 9999 + 035955 9999 99 99 0 9999 99 9999 + 035956 9999 99 99 0 9999 99 9999 + 035957 9999 99 99 0 9999 99 9999 + 035958 9999 99 99 0 9999 99 9999 + 035959 9999 99 99 0 9999 99 9999 + 035960 9999 99 99 0 9999 99 9999 + 035961 9999 99 99 0 9999 99 9999 + 035962 9999 99 99 0 9999 99 9999 + 035963 9999 99 99 0 9999 99 9999 + 035964 9999 99 99 0 9999 99 9999 + 035965 9999 99 99 0 9999 99 9999 + 035966 9999 99 99 0 9999 99 9999 + 035967 9999 99 99 0 9999 99 9999 + 035968 9999 99 99 0 9999 99 9999 + 035969 9999 99 99 0 9999 99 9999 + 035970 9999 99 99 0 9999 99 9999 + 035971 9999 99 99 0 9999 99 9999 + 035972 9999 99 99 0 9999 99 9999 + 035973 9999 99 99 0 9999 99 9999 + 035974 9999 99 99 0 9999 99 9999 + 035975 9999 99 99 0 9999 99 9999 + 035976 9999 99 99 0 9999 99 9999 + 035977 9999 99 99 0 9999 99 9999 + 035978 9999 99 99 0 9999 99 9999 + 035979 9999 99 99 0 9999 99 9999 + 035980 9999 99 99 0 9999 99 9999 + 035981 9999 99 99 0 9999 99 9999 + 035982 9999 99 99 0 9999 99 9999 + 035983 9999 99 99 0 9999 99 9999 + 035984 9999 99 99 0 9999 99 9999 + 035985 9999 99 99 0 9999 99 9999 + 035986 9999 99 99 0 9999 99 9999 + 035987 9999 99 99 0 9999 99 9999 + 035988 9999 99 99 0 9999 99 9999 + 035989 9999 99 99 0 9999 99 9999 + 035990 9999 99 99 0 9999 99 9999 + 035991 9999 99 99 0 9999 99 9999 + 035992 9999 99 99 0 9999 99 9999 + 035993 9999 99 99 0 9999 99 9999 + 035994 9999 99 99 0 9999 99 9999 + 035995 9999 99 99 0 9999 99 9999 + 035996 9999 99 99 0 9999 99 9999 + 035997 9999 99 99 0 9999 99 9999 + 035998 9999 99 99 0 9999 99 9999 + 035999 9999 99 99 0 9999 99 9999 + 036000 9999 99 99 0 9999 99 9999 + 036001 9999 99 99 0 9999 99 9999 + 036002 9999 99 99 0 9999 99 9999 + 036003 9999 99 99 0 9999 99 9999 + 036004 9999 99 99 0 9999 99 9999 + 036005 9999 99 99 0 9999 99 9999 + 036006 9999 99 99 0 9999 99 9999 + 036007 9999 99 99 0 9999 99 9999 + 036008 9999 99 99 0 9999 99 9999 + 036009 9999 99 99 0 9999 99 9999 + 036010 9999 99 99 0 9999 99 9999 + 036011 9999 99 99 0 9999 99 9999 + 036012 9999 99 99 0 9999 99 9999 + 036013 9999 99 99 0 9999 99 9999 + 036014 9999 99 99 0 9999 99 9999 + 036015 9999 99 99 0 9999 99 9999 + 036016 9999 99 99 0 9999 99 9999 + 036017 9999 99 99 0 9999 99 9999 + 036018 9999 99 99 0 9999 99 9999 + 036019 9999 99 99 0 9999 99 9999 + 036020 9999 99 99 0 9999 99 9999 + 036021 9999 99 99 0 9999 99 9999 + 036022 9999 99 99 0 9999 99 9999 + 036023 9999 99 99 0 9999 99 9999 + 036024 9999 99 99 0 9999 99 9999 + 036025 9999 99 99 0 9999 99 9999 + 036026 9999 99 99 0 9999 99 9999 + 036027 9999 99 99 0 9999 99 9999 + 036028 9999 99 99 0 9999 99 9999 + 036029 9999 99 99 0 9999 99 9999 + 036030 9999 99 99 0 9999 99 9999 + 036031 9999 99 99 0 9999 99 9999 + 036032 9999 99 99 0 9999 99 9999 + 036033 9999 99 99 0 9999 99 9999 + 036034 9999 99 99 0 9999 99 9999 + 036035 9999 99 99 0 9999 99 9999 + 036036 9999 99 99 0 9999 99 9999 + 036037 9999 99 99 0 9999 99 9999 + 036038 9999 99 99 0 9999 99 9999 + 036039 9999 99 99 0 9999 99 9999 + 036040 9999 99 99 0 9999 99 9999 + 036041 9999 99 99 0 9999 99 9999 + 036042 9999 99 99 0 9999 99 9999 + 036043 9999 99 99 0 9999 99 9999 + 036044 9999 99 99 0 9999 99 9999 + 036045 9999 99 99 0 9999 99 9999 + 036046 9999 99 99 0 9999 99 9999 + 036047 9999 99 99 0 9999 99 9999 + 036048 9999 99 99 0 9999 99 9999 + 036049 9999 99 99 0 9999 99 9999 + 036050 9999 99 99 0 9999 99 9999 + 036051 9999 99 99 0 9999 99 9999 + 036052 9999 99 99 0 9999 99 9999 + 036053 9999 99 99 0 9999 99 9999 + 036054 9999 99 99 0 9999 99 9999 + 036055 9999 99 99 0 9999 99 9999 + 036056 9999 99 99 0 9999 99 9999 + 036057 9999 99 99 0 9999 99 9999 + 036058 9999 99 99 0 9999 99 9999 + 036059 9999 99 99 0 9999 99 9999 + 036060 9999 99 99 0 9999 99 9999 + 036061 9999 99 99 0 9999 99 9999 + 036062 9999 99 99 0 9999 99 9999 + 036063 9999 99 99 0 9999 99 9999 + 036064 9999 99 99 0 9999 99 9999 + 036065 9999 99 99 0 9999 99 9999 + 036066 9999 99 99 0 9999 99 9999 + 036067 9999 99 99 0 9999 99 9999 + 036068 9999 99 99 0 9999 99 9999 + 036069 9999 99 99 0 9999 99 9999 + 036070 9999 99 99 0 9999 99 9999 + 036071 9999 99 99 0 9999 99 9999 + 036072 9999 99 99 0 9999 99 9999 + 036073 9999 99 99 0 9999 99 9999 + 036074 9999 99 99 0 9999 99 9999 + 036075 9999 99 99 0 9999 99 9999 + 036076 9999 99 99 0 9999 99 9999 + 036077 9999 99 99 0 9999 99 9999 + 036078 9999 99 99 0 9999 99 9999 + 036079 9999 99 99 0 9999 99 9999 + 036080 9999 99 99 0 9999 99 9999 + 036081 9999 99 99 0 9999 99 9999 + 036082 9999 99 99 0 9999 99 9999 + 036083 9999 99 99 0 9999 99 9999 + 036084 9999 99 99 0 9999 99 9999 + 036085 9999 99 99 0 9999 99 9999 + 036086 9999 99 99 0 9999 99 9999 + 036087 9999 99 99 0 9999 99 9999 + 036088 9999 99 99 0 9999 99 9999 + 036089 9999 99 99 0 9999 99 9999 + 036090 9999 99 99 0 9999 99 9999 + 036091 9999 99 99 0 9999 99 9999 + 036092 9999 99 99 0 9999 99 9999 + 036093 9999 99 99 0 9999 99 9999 + 036094 9999 99 99 0 9999 99 9999 + 036095 9999 99 99 0 9999 99 9999 + 036096 9999 99 99 0 9999 99 9999 + 036097 9999 99 99 0 9999 99 9999 + 036098 9999 99 99 0 9999 99 9999 + 036099 9999 99 99 0 9999 99 9999 + 036100 9999 99 99 0 9999 99 9999 + 036101 9999 99 99 0 9999 99 9999 + 036102 9999 99 99 0 9999 99 9999 + 036103 9999 99 99 0 9999 99 9999 + 036104 9999 99 99 0 9999 99 9999 + 036105 9999 99 99 0 9999 99 9999 + 036106 9999 99 99 0 9999 99 9999 + 036107 9999 99 99 0 9999 99 9999 + 036108 9999 99 99 0 9999 99 9999 + 036109 9999 99 99 0 9999 99 9999 + 036110 9999 99 99 0 9999 99 9999 + 036111 9999 99 99 0 9999 99 9999 + 036112 9999 99 99 0 9999 99 9999 + 036113 9999 99 99 0 9999 99 9999 + 036114 9999 99 99 0 9999 99 9999 + 036115 9999 99 99 0 9999 99 9999 + 036116 9999 99 99 0 9999 99 9999 + 036117 9999 99 99 0 9999 99 9999 + 036118 9999 99 99 0 9999 99 9999 + 036119 9999 99 99 0 9999 99 9999 + 036120 9999 99 99 0 9999 99 9999 + 036121 9999 99 99 0 9999 99 9999 + 036122 9999 99 99 0 9999 99 9999 + 036123 9999 99 99 0 9999 99 9999 + 036124 9999 99 99 0 9999 99 9999 + 036125 9999 99 99 0 9999 99 9999 + 036126 9999 99 99 0 9999 99 9999 + 036127 9999 99 99 0 9999 99 9999 + 036128 9999 99 99 0 9999 99 9999 + 036129 9999 99 99 0 9999 99 9999 + 036130 9999 99 99 0 9999 99 9999 + 036131 9999 99 99 0 9999 99 9999 + 036132 9999 99 99 0 9999 99 9999 + 036133 9999 99 99 0 9999 99 9999 + 036134 9999 99 99 0 9999 99 9999 + 036135 9999 99 99 0 9999 99 9999 + 036136 9999 99 99 0 9999 99 9999 + 036137 9999 99 99 0 9999 99 9999 + 036138 9999 99 99 0 9999 99 9999 + 036139 9999 99 99 0 9999 99 9999 + 036140 9999 99 99 0 9999 99 9999 + 036141 9999 99 99 0 9999 99 9999 + 036142 9999 99 99 0 9999 99 9999 + 036143 9999 99 99 0 9999 99 9999 + 036144 9999 99 99 0 9999 99 9999 + 036145 9999 99 99 0 9999 99 9999 + 036146 9999 99 99 0 9999 99 9999 + 036147 9999 99 99 0 9999 99 9999 + 036148 9999 99 99 0 9999 99 9999 + 036149 9999 99 99 0 9999 99 9999 + 036150 9999 99 99 0 9999 99 9999 + 036151 9999 99 99 0 9999 99 9999 + 036152 9999 99 99 0 9999 99 9999 + 036153 9999 99 99 0 9999 99 9999 + 036154 9999 99 99 0 9999 99 9999 + 036155 9999 99 99 0 9999 99 9999 + 036156 9999 99 99 0 9999 99 9999 + 036157 9999 99 99 0 9999 99 9999 + 036158 9999 99 99 0 9999 99 9999 + 036159 9999 99 99 0 9999 99 9999 + 036160 9999 99 99 0 9999 99 9999 + 036161 9999 99 99 0 9999 99 9999 + 036162 9999 99 99 0 9999 99 9999 + 036163 9999 99 99 0 9999 99 9999 + 036164 9999 99 99 0 9999 99 9999 + 036165 9999 99 99 0 9999 99 9999 + 036166 9999 99 99 0 9999 99 9999 + 036167 9999 99 99 0 9999 99 9999 + 036168 9999 99 99 0 9999 99 9999 + 036169 9999 99 99 0 9999 99 9999 + 036170 9999 99 99 0 9999 99 9999 + 036171 9999 99 99 0 9999 99 9999 + 036172 9999 99 99 0 9999 99 9999 + 036173 9999 99 99 0 9999 99 9999 + 036174 9999 99 99 0 9999 99 9999 + 036175 9999 99 99 0 9999 99 9999 + 036176 9999 99 99 0 9999 99 9999 + 036177 9999 99 99 0 9999 99 9999 + 036178 9999 99 99 0 9999 99 9999 + 036179 9999 99 99 0 9999 99 9999 + 036180 9999 99 99 0 9999 99 9999 + 036181 9999 99 99 0 9999 99 9999 + 036182 9999 99 99 0 9999 99 9999 + 036183 9999 99 99 0 9999 99 9999 + 036184 9999 99 99 0 9999 99 9999 + 036185 9999 99 99 0 9999 99 9999 + 036186 9999 99 99 0 9999 99 9999 + 036187 9999 99 99 0 9999 99 9999 + 036188 9999 99 99 0 9999 99 9999 + 036189 9999 99 99 0 9999 99 9999 + 036190 9999 99 99 0 9999 99 9999 + 036191 9999 99 99 0 9999 99 9999 + 036192 9999 99 99 0 9999 99 9999 + 036193 9999 99 99 0 9999 99 9999 + 036194 9999 99 99 0 9999 99 9999 + 036195 9999 99 99 0 9999 99 9999 + 036196 9999 99 99 0 9999 99 9999 + 036197 9999 99 99 0 9999 99 9999 + 036198 9999 99 99 0 9999 99 9999 + 036199 9999 99 99 0 9999 99 9999 + 036200 9999 99 99 0 9999 99 9999 + 036201 9999 99 99 0 9999 99 9999 + 036202 9999 99 99 0 9999 99 9999 + 036203 9999 99 99 0 9999 99 9999 + 036204 9999 99 99 0 9999 99 9999 + 036205 9999 99 99 0 9999 99 9999 + 036206 9999 99 99 0 9999 99 9999 + 036207 9999 99 99 0 9999 99 9999 + 036208 9999 99 99 0 9999 99 9999 + 036209 9999 99 99 0 9999 99 9999 + 036210 9999 99 99 0 9999 99 9999 + 036211 9999 99 99 0 9999 99 9999 + 036212 9999 99 99 0 9999 99 9999 + 036213 9999 99 99 0 9999 99 9999 + 036214 9999 99 99 0 9999 99 9999 + 036215 9999 99 99 0 9999 99 9999 + 036216 9999 99 99 0 9999 99 9999 + 036217 9999 99 99 0 9999 99 9999 + 036218 9999 99 99 0 9999 99 9999 + 036219 9999 99 99 0 9999 99 9999 + 036220 9999 99 99 0 9999 99 9999 + 036221 9999 99 99 0 9999 99 9999 + 036222 9999 99 99 0 9999 99 9999 + 036223 9999 99 99 0 9999 99 9999 + 036224 9999 99 99 0 9999 99 9999 + 036225 9999 99 99 0 9999 99 9999 + 036226 9999 99 99 0 9999 99 9999 + 036227 9999 99 99 0 9999 99 9999 + 036228 9999 99 99 0 9999 99 9999 + 036229 9999 99 99 0 9999 99 9999 + 036230 9999 99 99 0 9999 99 9999 + 036231 9999 99 99 0 9999 99 9999 + 036232 9999 99 99 0 9999 99 9999 + 036233 9999 99 99 0 9999 99 9999 + 036234 9999 99 99 0 9999 99 9999 + 036235 9999 99 99 0 9999 99 9999 + 036236 9999 99 99 0 9999 99 9999 + 036237 9999 99 99 0 9999 99 9999 + 036238 9999 99 99 0 9999 99 9999 + 036239 9999 99 99 0 9999 99 9999 + 036240 9999 99 99 0 9999 99 9999 + 036241 9999 99 99 0 9999 99 9999 + 036242 9999 99 99 0 9999 99 9999 + 036243 9999 99 99 0 9999 99 9999 + 036244 9999 99 99 0 9999 99 9999 + 036245 9999 99 99 0 9999 99 9999 + 036246 9999 99 99 0 9999 99 9999 + 036247 9999 99 99 0 9999 99 9999 + 036248 9999 99 99 0 9999 99 9999 + 036249 9999 99 99 0 9999 99 9999 + 036250 9999 99 99 0 9999 99 9999 + 036251 9999 99 99 0 9999 99 9999 + 036252 9999 99 99 0 9999 99 9999 + 036253 9999 99 99 0 9999 99 9999 + 036254 9999 99 99 0 9999 99 9999 + 036255 9999 99 99 0 9999 99 9999 + 036256 9999 99 99 0 9999 99 9999 + 036257 9999 99 99 0 9999 99 9999 + 036258 9999 99 99 0 9999 99 9999 + 036259 9999 99 99 0 9999 99 9999 + 036260 9999 99 99 0 9999 99 9999 + 036261 9999 99 99 0 9999 99 9999 + 036262 9999 99 99 0 9999 99 9999 + 036263 9999 99 99 0 9999 99 9999 + 036264 9999 99 99 0 9999 99 9999 + 036265 9999 99 99 0 9999 99 9999 + 036266 9999 99 99 0 9999 99 9999 + 036267 9999 99 99 0 9999 99 9999 + 036268 9999 99 99 0 9999 99 9999 + 036269 9999 99 99 0 9999 99 9999 + 036270 9999 99 99 0 9999 99 9999 + 036271 9999 99 99 0 9999 99 9999 + 036272 9999 99 99 0 9999 99 9999 + 036273 9999 99 99 0 9999 99 9999 + 036274 9999 99 99 0 9999 99 9999 + 036275 9999 99 99 0 9999 99 9999 + 036276 9999 99 99 0 9999 99 9999 + 036277 9999 99 99 0 9999 99 9999 + 036278 9999 99 99 0 9999 99 9999 + 036279 9999 99 99 0 9999 99 9999 + 036280 9999 99 99 0 9999 99 9999 + 036281 9999 99 99 0 9999 99 9999 + 036282 9999 99 99 0 9999 99 9999 + 036283 9999 99 99 0 9999 99 9999 + 036284 9999 99 99 0 9999 99 9999 + 036285 9999 99 99 0 9999 99 9999 + 036286 9999 99 99 0 9999 99 9999 + 036287 9999 99 99 0 9999 99 9999 + 036288 9999 99 99 0 9999 99 9999 + 036289 9999 99 99 0 9999 99 9999 + 036290 9999 99 99 0 9999 99 9999 + 036291 9999 99 99 0 9999 99 9999 + 036292 9999 99 99 0 9999 99 9999 + 036293 9999 99 99 0 9999 99 9999 + 036294 9999 99 99 0 9999 99 9999 + 036295 9999 99 99 0 9999 99 9999 + 036296 9999 99 99 0 9999 99 9999 + 036297 9999 99 99 0 9999 99 9999 + 036298 9999 99 99 0 9999 99 9999 + 036299 9999 99 99 0 9999 99 9999 + 036300 9999 99 99 0 9999 99 9999 + 036301 9999 99 99 0 9999 99 9999 + 036302 9999 99 99 0 9999 99 9999 + 036303 9999 99 99 0 9999 99 9999 + 036304 9999 99 99 0 9999 99 9999 + 036305 9999 99 99 0 9999 99 9999 + 036306 9999 99 99 0 9999 99 9999 + 036307 9999 99 99 0 9999 99 9999 + 036308 9999 99 99 0 9999 99 9999 + 036309 9999 99 99 0 9999 99 9999 + 036310 9999 99 99 0 9999 99 9999 + 036311 9999 99 99 0 9999 99 9999 + 036312 9999 99 99 0 9999 99 9999 + 036313 9999 99 99 0 9999 99 9999 + 036314 9999 99 99 0 9999 99 9999 + 036315 9999 99 99 0 9999 99 9999 + 036316 9999 99 99 0 9999 99 9999 + 036317 9999 99 99 0 9999 99 9999 + 036318 9999 99 99 0 9999 99 9999 + 036319 9999 99 99 0 9999 99 9999 + 036320 9999 99 99 0 9999 99 9999 + 036321 9999 99 99 0 9999 99 9999 + 036322 9999 99 99 0 9999 99 9999 + 036323 9999 99 99 0 9999 99 9999 + 036324 9999 99 99 0 9999 99 9999 + 036325 9999 99 99 0 9999 99 9999 + 036326 9999 99 99 0 9999 99 9999 + 036327 9999 99 99 0 9999 99 9999 + 036328 9999 99 99 0 9999 99 9999 + 036329 9999 99 99 0 9999 99 9999 + 036330 9999 99 99 0 9999 99 9999 + 036331 9999 99 99 0 9999 99 9999 + 036332 9999 99 99 0 9999 99 9999 + 036333 9999 99 99 0 9999 99 9999 + 036334 9999 99 99 0 9999 99 9999 + 036335 9999 99 99 0 9999 99 9999 + 036336 9999 99 99 0 9999 99 9999 + 036337 9999 99 99 0 9999 99 9999 + 036338 9999 99 99 0 9999 99 9999 + 036339 9999 99 99 0 9999 99 9999 + 036340 9999 99 99 0 9999 99 9999 + 036341 9999 99 99 0 9999 99 9999 + 036342 9999 99 99 0 9999 99 9999 + 036343 9999 99 99 0 9999 99 9999 + 036344 9999 99 99 0 9999 99 9999 + 036345 9999 99 99 0 9999 99 9999 + 036346 9999 99 99 0 9999 99 9999 + 036347 9999 99 99 0 9999 99 9999 + 036348 9999 99 99 0 9999 99 9999 + 036349 9999 99 99 0 9999 99 9999 + 036350 9999 99 99 0 9999 99 9999 + 036351 9999 99 99 0 9999 99 9999 + 036352 9999 99 99 0 9999 99 9999 + 036353 9999 99 99 0 9999 99 9999 + 036354 9999 99 99 0 9999 99 9999 + 036355 9999 99 99 0 9999 99 9999 + 036356 9999 99 99 0 9999 99 9999 + 036357 9999 99 99 0 9999 99 9999 + 036358 9999 99 99 0 9999 99 9999 + 036359 9999 99 99 0 9999 99 9999 + 036360 9999 99 99 0 9999 99 9999 + 036361 9999 99 99 0 9999 99 9999 + 036362 9999 99 99 0 9999 99 9999 + 036363 9999 99 99 0 9999 99 9999 + 036364 9999 99 99 0 9999 99 9999 + 036365 9999 99 99 0 9999 99 9999 + 036366 9999 99 99 0 9999 99 9999 + 036367 9999 99 99 0 9999 99 9999 + 036368 9999 99 99 0 9999 99 9999 + 036369 9999 99 99 0 9999 99 9999 + 036370 9999 99 99 0 9999 99 9999 + 036371 9999 99 99 0 9999 99 9999 + 036372 9999 99 99 0 9999 99 9999 + 036373 9999 99 99 0 9999 99 9999 + 036374 9999 99 99 0 9999 99 9999 + 036375 9999 99 99 0 9999 99 9999 + 036376 9999 99 99 0 9999 99 9999 + 036377 9999 99 99 0 9999 99 9999 + 036378 9999 99 99 0 9999 99 9999 + 036379 9999 99 99 0 9999 99 9999 + 036380 9999 99 99 0 9999 99 9999 + 036381 9999 99 99 0 9999 99 9999 + 036382 9999 99 99 0 9999 99 9999 + 036383 9999 99 99 0 9999 99 9999 + 036384 9999 99 99 0 9999 99 9999 + 036385 9999 99 99 0 9999 99 9999 + 036386 9999 99 99 0 9999 99 9999 + 036387 9999 99 99 0 9999 99 9999 + 036388 9999 99 99 0 9999 99 9999 + 036389 9999 99 99 0 9999 99 9999 + 036390 9999 99 99 0 9999 99 9999 + 036391 9999 99 99 0 9999 99 9999 + 036392 9999 99 99 0 9999 99 9999 + 036393 9999 99 99 0 9999 99 9999 + 036394 9999 99 99 0 9999 99 9999 + 036395 9999 99 99 0 9999 99 9999 + 036396 9999 99 99 0 9999 99 9999 + 036397 9999 99 99 0 9999 99 9999 + 036398 9999 99 99 0 9999 99 9999 + 036399 9999 99 99 0 9999 99 9999 + 036400 9999 99 99 0 9999 99 9999 + 036401 9999 99 99 0 9999 99 9999 + 036402 9999 99 99 0 9999 99 9999 + 036403 9999 99 99 0 9999 99 9999 + 036404 9999 99 99 0 9999 99 9999 + 036405 9999 99 99 0 9999 99 9999 + 036406 9999 99 99 0 9999 99 9999 + 036407 9999 99 99 0 9999 99 9999 + 036408 9999 99 99 0 9999 99 9999 + 036409 9999 99 99 0 9999 99 9999 + 036410 9999 99 99 0 9999 99 9999 + 036411 9999 99 99 0 9999 99 9999 + 036412 9999 99 99 0 9999 99 9999 + 036413 9999 99 99 0 9999 99 9999 + 036414 9999 99 99 0 9999 99 9999 + 036415 9999 99 99 0 9999 99 9999 + 036416 9999 99 99 0 9999 99 9999 + 036417 9999 99 99 0 9999 99 9999 + 036418 9999 99 99 0 9999 99 9999 + 036419 9999 99 99 0 9999 99 9999 + 036420 9999 99 99 0 9999 99 9999 + 036421 9999 99 99 0 9999 99 9999 + 036422 9999 99 99 0 9999 99 9999 + 036423 9999 99 99 0 9999 99 9999 + 036424 9999 99 99 0 9999 99 9999 + 036425 9999 99 99 0 9999 99 9999 + 036426 9999 99 99 0 9999 99 9999 + 036427 9999 99 99 0 9999 99 9999 + 036428 9999 99 99 0 9999 99 9999 + 036429 9999 99 99 0 9999 99 9999 + 036430 9999 99 99 0 9999 99 9999 + 036431 9999 99 99 0 9999 99 9999 + 036432 9999 99 99 0 9999 99 9999 + 036433 9999 99 99 0 9999 99 9999 + 036434 9999 99 99 0 9999 99 9999 + 036435 9999 99 99 0 9999 99 9999 + 036436 9999 99 99 0 9999 99 9999 + 036437 9999 99 99 0 9999 99 9999 + 036438 9999 99 99 0 9999 99 9999 + 036439 9999 99 99 0 9999 99 9999 + 036440 9999 99 99 0 9999 99 9999 + 036441 9999 99 99 0 9999 99 9999 + 036442 9999 99 99 0 9999 99 9999 + 036443 9999 99 99 0 9999 99 9999 + 036444 9999 99 99 0 9999 99 9999 + 036445 9999 99 99 0 9999 99 9999 + 036446 9999 99 99 0 9999 99 9999 + 036447 9999 99 99 0 9999 99 9999 + 036448 9999 99 99 0 9999 99 9999 + 036449 9999 99 99 0 9999 99 9999 + 036450 9999 99 99 0 9999 99 9999 + 036451 9999 99 99 0 9999 99 9999 + 036452 9999 99 99 0 9999 99 9999 + 036453 9999 99 99 0 9999 99 9999 + 036454 9999 99 99 0 9999 99 9999 + 036455 9999 99 99 0 9999 99 9999 + 036456 9999 99 99 0 9999 99 9999 + 036457 9999 99 99 0 9999 99 9999 + 036458 9999 99 99 0 9999 99 9999 + 036459 9999 99 99 0 9999 99 9999 + 036460 9999 99 99 0 9999 99 9999 + 036461 9999 99 99 0 9999 99 9999 + 036462 9999 99 99 0 9999 99 9999 + 036463 9999 99 99 0 9999 99 9999 + 036464 9999 99 99 0 9999 99 9999 + 036465 9999 99 99 0 9999 99 9999 + 036466 9999 99 99 0 9999 99 9999 + 036467 9999 99 99 0 9999 99 9999 + 036468 9999 99 99 0 9999 99 9999 + 036469 9999 99 99 0 9999 99 9999 + 036470 9999 99 99 0 9999 99 9999 + 036471 9999 99 99 0 9999 99 9999 + 036472 9999 99 99 0 9999 99 9999 + 036473 9999 99 99 0 9999 99 9999 + 036474 9999 99 99 0 9999 99 9999 + 036475 9999 99 99 0 9999 99 9999 + 036476 9999 99 99 0 9999 99 9999 + 036477 9999 99 99 0 9999 99 9999 + 036478 9999 99 99 0 9999 99 9999 + 036479 9999 99 99 0 9999 99 9999 + 036480 9999 99 99 0 9999 99 9999 + 036481 9999 99 99 0 9999 99 9999 + 036482 9999 99 99 0 9999 99 9999 + 036483 9999 99 99 0 9999 99 9999 + 036484 9999 99 99 0 9999 99 9999 + 036485 9999 99 99 0 9999 99 9999 + 036486 9999 99 99 0 9999 99 9999 + 036487 9999 99 99 0 9999 99 9999 + 036488 9999 99 99 0 9999 99 9999 + 036489 9999 99 99 0 9999 99 9999 + 036490 9999 99 99 0 9999 99 9999 + 036491 9999 99 99 0 9999 99 9999 + 036492 9999 99 99 0 9999 99 9999 + 036493 9999 99 99 0 9999 99 9999 + 036494 9999 99 99 0 9999 99 9999 + 036495 9999 99 99 0 9999 99 9999 + 036496 9999 99 99 0 9999 99 9999 + 036497 9999 99 99 0 9999 99 9999 + 036498 9999 99 99 0 9999 99 9999 + 036499 9999 99 99 0 9999 99 9999 + 036500 9999 99 99 0 9999 99 9999 + 036501 9999 99 99 0 9999 99 9999 + 036502 9999 99 99 0 9999 99 9999 + 036503 9999 99 99 0 9999 99 9999 + 036504 9999 99 99 0 9999 99 9999 + 036505 9999 99 99 0 9999 99 9999 + 036506 9999 99 99 0 9999 99 9999 + 036507 9999 99 99 0 9999 99 9999 + 036508 9999 99 99 0 9999 99 9999 + 036509 9999 99 99 0 9999 99 9999 + 036510 9999 99 99 0 9999 99 9999 + 036511 9999 99 99 0 9999 99 9999 + 036512 9999 99 99 0 9999 99 9999 + 036513 9999 99 99 0 9999 99 9999 + 036514 9999 99 99 0 9999 99 9999 + 036515 9999 99 99 0 9999 99 9999 + 036516 9999 99 99 0 9999 99 9999 + 036517 9999 99 99 0 9999 99 9999 + 036518 9999 99 99 0 9999 99 9999 + 036519 9999 99 99 0 9999 99 9999 + 036520 9999 99 99 0 9999 99 9999 + 036521 9999 99 99 0 9999 99 9999 + 036522 9999 99 99 0 9999 99 9999 + 036523 9999 99 99 0 9999 99 9999 + 036524 9999 99 99 0 9999 99 9999 + 036525 9999 99 99 0 9999 99 9999 + 036526 9999 99 99 0 9999 99 9999 + 036527 9999 99 99 0 9999 99 9999 + 036528 9999 99 99 0 9999 99 9999 + 036529 9999 99 99 0 9999 99 9999 + 036530 9999 99 99 0 9999 99 9999 + 036531 9999 99 99 0 9999 99 9999 + 036532 9999 99 99 0 9999 99 9999 + 036533 9999 99 99 0 9999 99 9999 + 036534 9999 99 99 0 9999 99 9999 + 036535 9999 99 99 0 9999 99 9999 + 036536 9999 99 99 0 9999 99 9999 + 036537 9999 99 99 0 9999 99 9999 + 036538 9999 99 99 0 9999 99 9999 + 036539 9999 99 99 0 9999 99 9999 + 036540 9999 99 99 0 9999 99 9999 + 036541 9999 99 99 0 9999 99 9999 + 036542 9999 99 99 0 9999 99 9999 + 036543 9999 99 99 0 9999 99 9999 + 036544 9999 99 99 0 9999 99 9999 + 036545 9999 99 99 0 9999 99 9999 + 036546 9999 99 99 0 9999 99 9999 + 036547 9999 99 99 0 9999 99 9999 + 036548 9999 99 99 0 9999 99 9999 + 036549 9999 99 99 0 9999 99 9999 + 036550 9999 99 99 0 9999 99 9999 + 036551 9999 99 99 0 9999 99 9999 + 036552 9999 99 99 0 9999 99 9999 + 036553 9999 99 99 0 9999 99 9999 + 036554 9999 99 99 0 9999 99 9999 + 036555 9999 99 99 0 9999 99 9999 + 036556 9999 99 99 0 9999 99 9999 + 036557 9999 99 99 0 9999 99 9999 + 036558 9999 99 99 0 9999 99 9999 + 036559 9999 99 99 0 9999 99 9999 + 036560 9999 99 99 0 9999 99 9999 + 036561 9999 99 99 0 9999 99 9999 + 036562 9999 99 99 0 9999 99 9999 + 036563 9999 99 99 0 9999 99 9999 + 036564 9999 99 99 0 9999 99 9999 + 036565 9999 99 99 0 9999 99 9999 + 036566 9999 99 99 0 9999 99 9999 + 036567 9999 99 99 0 9999 99 9999 + 036568 9999 99 99 0 9999 99 9999 + 036569 9999 99 99 0 9999 99 9999 + 036570 9999 99 99 0 9999 99 9999 + 036571 9999 99 99 0 9999 99 9999 + 036572 9999 99 99 0 9999 99 9999 + 036573 9999 99 99 0 9999 99 9999 + 036574 9999 99 99 0 9999 99 9999 + 036575 9999 99 99 0 9999 99 9999 + 036576 9999 99 99 0 9999 99 9999 + 036577 9999 99 99 0 9999 99 9999 + 036578 9999 99 99 0 9999 99 9999 + 036579 9999 99 99 0 9999 99 9999 + 036580 9999 99 99 0 9999 99 9999 + 036581 9999 99 99 0 9999 99 9999 + 036582 9999 99 99 0 9999 99 9999 + 036583 9999 99 99 0 9999 99 9999 + 036584 9999 99 99 0 9999 99 9999 + 036585 9999 99 99 0 9999 99 9999 + 036586 9999 99 99 0 9999 99 9999 + 036587 9999 99 99 0 9999 99 9999 + 036588 9999 99 99 0 9999 99 9999 + 036589 9999 99 99 0 9999 99 9999 + 036590 9999 99 99 0 9999 99 9999 + 036591 9999 99 99 0 9999 99 9999 + 036592 9999 99 99 0 9999 99 9999 + 036593 9999 99 99 0 9999 99 9999 + 036594 9999 99 99 0 9999 99 9999 + 036595 9999 99 99 0 9999 99 9999 + 036596 9999 99 99 0 9999 99 9999 + 036597 9999 99 99 0 9999 99 9999 + 036598 9999 99 99 0 9999 99 9999 + 036599 9999 99 99 0 9999 99 9999 + 036600 9999 99 99 0 9999 99 9999 + 036601 9999 99 99 0 9999 99 9999 + 036602 9999 99 99 0 9999 99 9999 + 036603 9999 99 99 0 9999 99 9999 + 036604 9999 99 99 0 9999 99 9999 + 036605 9999 99 99 0 9999 99 9999 + 036606 9999 99 99 0 9999 99 9999 + 036607 9999 99 99 0 9999 99 9999 + 036608 9999 99 99 0 9999 99 9999 + 036609 9999 99 99 0 9999 99 9999 + 036610 9999 99 99 0 9999 99 9999 + 036611 9999 99 99 0 9999 99 9999 + 036612 9999 99 99 0 9999 99 9999 + 036613 9999 99 99 0 9999 99 9999 + 036614 9999 99 99 0 9999 99 9999 + 036615 9999 99 99 0 9999 99 9999 + 036616 9999 99 99 0 9999 99 9999 + 036617 9999 99 99 0 9999 99 9999 + 036618 9999 99 99 0 9999 99 9999 + 036619 9999 99 99 0 9999 99 9999 + 036620 9999 99 99 0 9999 99 9999 + 036621 9999 99 99 0 9999 99 9999 + 036622 9999 99 99 0 9999 99 9999 + 036623 9999 99 99 0 9999 99 9999 + 036624 9999 99 99 0 9999 99 9999 + 036625 9999 99 99 0 9999 99 9999 + 036626 9999 99 99 0 9999 99 9999 + 036627 9999 99 99 0 9999 99 9999 + 036628 9999 99 99 0 9999 99 9999 + 036629 9999 99 99 0 9999 99 9999 + 036630 9999 99 99 0 9999 99 9999 + 036631 9999 99 99 0 9999 99 9999 + 036632 9999 99 99 0 9999 99 9999 + 036633 9999 99 99 0 9999 99 9999 + 036634 9999 99 99 0 9999 99 9999 + 036635 9999 99 99 0 9999 99 9999 + 036636 9999 99 99 0 9999 99 9999 + 036637 9999 99 99 0 9999 99 9999 + 036638 9999 99 99 0 9999 99 9999 + 036639 9999 99 99 0 9999 99 9999 + 036640 9999 99 99 0 9999 99 9999 + 036641 9999 99 99 0 9999 99 9999 + 036642 9999 99 99 0 9999 99 9999 + 036643 9999 99 99 0 9999 99 9999 + 036644 9999 99 99 0 9999 99 9999 + 036645 9999 99 99 0 9999 99 9999 + 036646 9999 99 99 0 9999 99 9999 + 036647 9999 99 99 0 9999 99 9999 + 036648 9999 99 99 0 9999 99 9999 + 036649 9999 99 99 0 9999 99 9999 + 036650 9999 99 99 0 9999 99 9999 + 036651 9999 99 99 0 9999 99 9999 + 036652 9999 99 99 0 9999 99 9999 + 036653 9999 99 99 0 9999 99 9999 + 036654 9999 99 99 0 9999 99 9999 + 036655 9999 99 99 0 9999 99 9999 + 036656 9999 99 99 0 9999 99 9999 + 036657 9999 99 99 0 9999 99 9999 + 036658 9999 99 99 0 9999 99 9999 + 036659 9999 99 99 0 9999 99 9999 + 036660 9999 99 99 0 9999 99 9999 + 036661 9999 99 99 0 9999 99 9999 + 036662 9999 99 99 0 9999 99 9999 + 036663 9999 99 99 0 9999 99 9999 + 036664 9999 99 99 0 9999 99 9999 + 036665 9999 99 99 0 9999 99 9999 + 036666 9999 99 99 0 9999 99 9999 + 036667 9999 99 99 0 9999 99 9999 + 036668 9999 99 99 0 9999 99 9999 + 036669 9999 99 99 0 9999 99 9999 + 036670 9999 99 99 0 9999 99 9999 + 036671 9999 99 99 0 9999 99 9999 + 036672 9999 99 99 0 9999 99 9999 + 036673 9999 99 99 0 9999 99 9999 + 036674 9999 99 99 0 9999 99 9999 + 036675 9999 99 99 0 9999 99 9999 + 036676 9999 99 99 0 9999 99 9999 + 036677 9999 99 99 0 9999 99 9999 + 036678 9999 99 99 0 9999 99 9999 + 036679 9999 99 99 0 9999 99 9999 + 036680 9999 99 99 0 9999 99 9999 + 036681 9999 99 99 0 9999 99 9999 + 036682 9999 99 99 0 9999 99 9999 + 036683 9999 99 99 0 9999 99 9999 + 036684 9999 99 99 0 9999 99 9999 + 036685 9999 99 99 0 9999 99 9999 + 036686 9999 99 99 0 9999 99 9999 + 036687 9999 99 99 0 9999 99 9999 + 036688 9999 99 99 0 9999 99 9999 + 036689 9999 99 99 0 9999 99 9999 + 036690 9999 99 99 0 9999 99 9999 + 036691 9999 99 99 0 9999 99 9999 + 036692 9999 99 99 0 9999 99 9999 + 036693 9999 99 99 0 9999 99 9999 + 036694 9999 99 99 0 9999 99 9999 + 036695 9999 99 99 0 9999 99 9999 + 036696 9999 99 99 0 9999 99 9999 + 036697 9999 99 99 0 9999 99 9999 + 036698 9999 99 99 0 9999 99 9999 + 036699 9999 99 99 0 9999 99 9999 + 036700 9999 99 99 0 9999 99 9999 + 036701 9999 99 99 0 9999 99 9999 + 036702 9999 99 99 0 9999 99 9999 + 036703 9999 99 99 0 9999 99 9999 + 036704 9999 99 99 0 9999 99 9999 + 036705 9999 99 99 0 9999 99 9999 + 036706 9999 99 99 0 9999 99 9999 + 036707 9999 99 99 0 9999 99 9999 + 036708 9999 99 99 0 9999 99 9999 + 036709 9999 99 99 0 9999 99 9999 + 036710 9999 99 99 0 9999 99 9999 + 036711 9999 99 99 0 9999 99 9999 + 036712 9999 99 99 0 9999 99 9999 + 036713 9999 99 99 0 9999 99 9999 + 036714 9999 99 99 0 9999 99 9999 + 036715 9999 99 99 0 9999 99 9999 + 036716 9999 99 99 0 9999 99 9999 + 036717 9999 99 99 0 9999 99 9999 + 036718 9999 99 99 0 9999 99 9999 + 036719 9999 99 99 0 9999 99 9999 + 036720 9999 99 99 0 9999 99 9999 + 036721 9999 99 99 0 9999 99 9999 + 036722 9999 99 99 0 9999 99 9999 + 036723 9999 99 99 0 9999 99 9999 + 036724 9999 99 99 0 9999 99 9999 + 036725 9999 99 99 0 9999 99 9999 + 036726 9999 99 99 0 9999 99 9999 + 036727 9999 99 99 0 9999 99 9999 + 036728 9999 99 99 0 9999 99 9999 + 036729 9999 99 99 0 9999 99 9999 + 036730 9999 99 99 0 9999 99 9999 + 036731 9999 99 99 0 9999 99 9999 + 036732 9999 99 99 0 9999 99 9999 + 036733 9999 99 99 0 9999 99 9999 + 036734 9999 99 99 0 9999 99 9999 + 036735 9999 99 99 0 9999 99 9999 + 036736 9999 99 99 0 9999 99 9999 + 036737 9999 99 99 0 9999 99 9999 + 036738 9999 99 99 0 9999 99 9999 + 036739 9999 99 99 0 9999 99 9999 + 036740 9999 99 99 0 9999 99 9999 + 036741 9999 99 99 0 9999 99 9999 + 036742 9999 99 99 0 9999 99 9999 + 036743 9999 99 99 0 9999 99 9999 + 036744 9999 99 99 0 9999 99 9999 + 036745 9999 99 99 0 9999 99 9999 + 036746 9999 99 99 0 9999 99 9999 + 036747 9999 99 99 0 9999 99 9999 + 036748 9999 99 99 0 9999 99 9999 + 036749 9999 99 99 0 9999 99 9999 + 036750 9999 99 99 0 9999 99 9999 + 036751 9999 99 99 0 9999 99 9999 + 036752 9999 99 99 0 9999 99 9999 + 036753 9999 99 99 0 9999 99 9999 + 036754 9999 99 99 0 9999 99 9999 + 036755 9999 99 99 0 9999 99 9999 + 036756 9999 99 99 0 9999 99 9999 + 036757 9999 99 99 0 9999 99 9999 + 036758 9999 99 99 0 9999 99 9999 + 036759 9999 99 99 0 9999 99 9999 + 036760 9999 99 99 0 9999 99 9999 + 036761 9999 99 99 0 9999 99 9999 + 036762 9999 99 99 0 9999 99 9999 + 036763 9999 99 99 0 9999 99 9999 + 036764 9999 99 99 0 9999 99 9999 + 036765 9999 99 99 0 9999 99 9999 + 036766 9999 99 99 0 9999 99 9999 + 036767 9999 99 99 0 9999 99 9999 + 036768 9999 99 99 0 9999 99 9999 + 036769 9999 99 99 0 9999 99 9999 + 036770 9999 99 99 0 9999 99 9999 + 036771 9999 99 99 0 9999 99 9999 + 036772 9999 99 99 0 9999 99 9999 + 036773 9999 99 99 0 9999 99 9999 + 036774 9999 99 99 0 9999 99 9999 + 036775 9999 99 99 0 9999 99 9999 + 036776 9999 99 99 0 9999 99 9999 + 036777 9999 99 99 0 9999 99 9999 + 036778 9999 99 99 0 9999 99 9999 + 036779 9999 99 99 0 9999 99 9999 + 036780 9999 99 99 0 9999 99 9999 + 036781 9999 99 99 0 9999 99 9999 + 036782 9999 99 99 0 9999 99 9999 + 036783 9999 99 99 0 9999 99 9999 + 036784 9999 99 99 0 9999 99 9999 + 036785 9999 99 99 0 9999 99 9999 + 036786 9999 99 99 0 9999 99 9999 + 036787 9999 99 99 0 9999 99 9999 + 036788 9999 99 99 0 9999 99 9999 + 036789 9999 99 99 0 9999 99 9999 + 036790 9999 99 99 0 9999 99 9999 + 036791 9999 99 99 0 9999 99 9999 + 036792 9999 99 99 0 9999 99 9999 + 036793 9999 99 99 0 9999 99 9999 + 036794 9999 99 99 0 9999 99 9999 + 036795 9999 99 99 0 9999 99 9999 + 036796 9999 99 99 0 9999 99 9999 + 036797 9999 99 99 0 9999 99 9999 + 036798 9999 99 99 0 9999 99 9999 + 036799 9999 99 99 0 9999 99 9999 + 036800 9999 99 99 0 9999 99 9999 + 036801 9999 99 99 0 9999 99 9999 + 036802 9999 99 99 0 9999 99 9999 + 036803 9999 99 99 0 9999 99 9999 + 036804 9999 99 99 0 9999 99 9999 + 036805 9999 99 99 0 9999 99 9999 + 036806 9999 99 99 0 9999 99 9999 + 036807 9999 99 99 0 9999 99 9999 + 036808 9999 99 99 0 9999 99 9999 + 036809 9999 99 99 0 9999 99 9999 + 036810 9999 99 99 0 9999 99 9999 + 036811 9999 99 99 0 9999 99 9999 + 036812 9999 99 99 0 9999 99 9999 + 036813 9999 99 99 0 9999 99 9999 + 036814 9999 99 99 0 9999 99 9999 + 036815 9999 99 99 0 9999 99 9999 + 036816 9999 99 99 0 9999 99 9999 + 036817 9999 99 99 0 9999 99 9999 + 036818 9999 99 99 0 9999 99 9999 + 036819 9999 99 99 0 9999 99 9999 + 036820 9999 99 99 0 9999 99 9999 + 036821 9999 99 99 0 9999 99 9999 + 036822 9999 99 99 0 9999 99 9999 + 036823 9999 99 99 0 9999 99 9999 + 036824 9999 99 99 0 9999 99 9999 + 036825 9999 99 99 0 9999 99 9999 + 036826 9999 99 99 0 9999 99 9999 + 036827 9999 99 99 0 9999 99 9999 + 036828 9999 99 99 0 9999 99 9999 + 036829 9999 99 99 0 9999 99 9999 + 036830 9999 99 99 0 9999 99 9999 + 036831 9999 99 99 0 9999 99 9999 + 036832 9999 99 99 0 9999 99 9999 + 036833 9999 99 99 0 9999 99 9999 + 036834 9999 99 99 0 9999 99 9999 + 036835 9999 99 99 0 9999 99 9999 + 036836 9999 99 99 0 9999 99 9999 + 036837 9999 99 99 0 9999 99 9999 + 036838 9999 99 99 0 9999 99 9999 + 036839 9999 99 99 0 9999 99 9999 + 036840 9999 99 99 0 9999 99 9999 + 036841 9999 99 99 0 9999 99 9999 + 036842 9999 99 99 0 9999 99 9999 + 036843 9999 99 99 0 9999 99 9999 + 036844 9999 99 99 0 9999 99 9999 + 036845 9999 99 99 0 9999 99 9999 + 036846 9999 99 99 0 9999 99 9999 + 036847 9999 99 99 0 9999 99 9999 + 036848 9999 99 99 0 9999 99 9999 + 036849 9999 99 99 0 9999 99 9999 + 036850 9999 99 99 0 9999 99 9999 + 036851 9999 99 99 0 9999 99 9999 + 036852 9999 99 99 0 9999 99 9999 + 036853 9999 99 99 0 9999 99 9999 + 036854 9999 99 99 0 9999 99 9999 + 036855 9999 99 99 0 9999 99 9999 + 036856 9999 99 99 0 9999 99 9999 + 036857 9999 99 99 0 9999 99 9999 + 036858 9999 99 99 0 9999 99 9999 + 036859 9999 99 99 0 9999 99 9999 + 036860 9999 99 99 0 9999 99 9999 + 036861 9999 99 99 0 9999 99 9999 + 036862 9999 99 99 0 9999 99 9999 + 036863 9999 99 99 0 9999 99 9999 + 036864 9999 99 99 0 9999 99 9999 + 036865 1296 01 01 2 352609284 00 1530 + 036866 1296 01 02 2 352609284 01 1530 + 036867 1296 01 03 2 352609284 02 1530 + 036868 1296 01 04 2 352609284 03 1530 + 036869 1296 01 05 2 352609284 04 1530 + 036870 1296 01 06 2 352609284 05 1530 + 036871 1296 01 07 2 352609284 06 1530 + 036872 1296 01 08 2 352609284 07 1530 + 036873 1296 02 01 2 352609284 08 1530 + 036874 1296 02 02 2 352609284 09 1530 + 036875 1296 02 03 2 352609284 10 1530 + 036876 1296 02 04 2 352609284 11 1530 + 036877 1296 02 05 2 352609284 12 1530 + 036878 1296 02 06 2 352609284 13 1530 + 036879 1296 02 07 2 352609284 14 1530 + 036880 1296 02 08 2 352609284 15 1530 + 036881 1296 03 01 2 352610308 00 1531 + 036882 1296 03 02 2 352610308 01 1531 + 036883 1296 03 03 2 352610308 02 1531 + 036884 1296 03 04 2 352610308 03 1531 + 036885 1296 03 05 2 352610308 04 1531 + 036886 1296 03 06 2 352610308 05 1531 + 036887 1296 03 07 2 352610308 06 1531 + 036888 1296 03 08 2 352610308 07 1531 + 036889 1296 04 01 2 352610308 08 1531 + 036890 1296 04 02 2 352610308 09 1531 + 036891 1296 04 03 2 352610308 10 1531 + 036892 1296 04 04 2 352610308 11 1531 + 036893 1296 04 05 2 352610308 12 1531 + 036894 1296 04 06 2 352610308 13 1531 + 036895 1296 04 07 2 352610308 14 1531 + 036896 1296 04 08 2 352610308 15 1531 + 036897 1296 05 01 2 352711684 00 1580 + 036898 1296 05 02 2 352711684 01 1580 + 036899 1296 05 03 2 352711684 02 1580 + 036900 1296 05 04 2 352711684 03 1580 + 036901 1296 05 05 2 352711684 04 1580 + 036902 1296 05 06 2 352711684 05 1580 + 036903 1296 05 07 2 352711684 06 1580 + 036904 1296 05 08 2 352711684 07 1580 + 036905 1296 06 01 2 352711684 08 1580 + 036906 1296 06 02 2 352711684 09 1580 + 036907 1296 06 03 2 352711684 10 1580 + 036908 1296 06 04 2 352711684 11 1580 + 036909 1296 06 05 2 352711684 12 1580 + 036910 1296 06 06 2 352711684 13 1580 + 036911 1296 06 07 2 352711684 14 1580 + 036912 1296 06 08 2 352711684 15 1580 + 036913 1296 07 01 2 352712708 00 1581 + 036914 1296 07 02 2 352712708 01 1581 + 036915 1296 07 03 2 352712708 02 1581 + 036916 1296 07 04 2 352712708 03 1581 + 036917 1296 07 05 2 352712708 04 1581 + 036918 1296 07 06 2 352712708 05 1581 + 036919 1296 07 07 2 352712708 06 1581 + 036920 1296 07 08 2 352712708 07 1581 + 036921 1296 08 01 2 352712708 08 1581 + 036922 1296 08 02 2 352712708 09 1581 + 036923 1296 08 03 2 352712708 10 1581 + 036924 1296 08 04 2 352712708 11 1581 + 036925 1296 08 05 2 352712708 12 1581 + 036926 1296 08 06 2 352712708 13 1581 + 036927 1296 08 07 2 352712708 14 1581 + 036928 1296 08 08 2 352712708 15 1581 + 036929 1296 09 01 2 352871428 00 1642 + 036930 1296 09 02 2 352871428 01 1642 + 036931 1296 09 03 2 352871428 02 1642 + 036932 1296 09 04 2 352871428 03 1642 + 036933 1296 09 05 2 352871428 04 1642 + 036934 1296 09 06 2 352871428 05 1642 + 036935 1296 09 07 2 352871428 06 1642 + 036936 1296 09 08 2 352871428 07 1642 + 036937 1296 10 01 2 352871428 08 1642 + 036938 1296 10 02 2 352871428 09 1642 + 036939 1296 10 03 2 352871428 10 1642 + 036940 1296 10 04 2 352871428 11 1642 + 036941 1296 10 05 2 352871428 12 1642 + 036942 1296 10 06 2 352871428 13 1642 + 036943 1296 10 07 2 352871428 14 1642 + 036944 1296 10 08 2 352871428 15 1642 + 036945 1296 11 01 2 352872452 00 1643 + 036946 1296 11 02 2 352872452 01 1643 + 036947 1296 11 03 2 352872452 02 1643 + 036948 1296 11 04 2 352872452 03 1643 + 036949 1296 11 05 2 352872452 04 1643 + 036950 1296 11 06 2 352872452 05 1643 + 036951 1296 11 07 2 352872452 06 1643 + 036952 1296 11 08 2 352872452 07 1643 + 036953 1296 12 01 2 352872452 08 1643 + 036954 1296 12 02 2 352872452 09 1643 + 036955 1296 12 03 2 352872452 10 1643 + 036956 1296 12 04 2 352872452 11 1643 + 036957 1296 12 05 2 352872452 12 1643 + 036958 1296 12 06 2 352872452 13 1643 + 036959 1296 12 07 2 352872452 14 1643 + 036960 1296 12 08 2 352872452 15 1643 + 036961 1296 13 01 2 352973828 00 1692 + 036962 1296 13 02 2 352973828 01 1692 + 036963 1296 13 03 2 352973828 02 1692 + 036964 1296 13 04 2 352973828 03 1692 + 036965 1296 13 05 2 352973828 04 1692 + 036966 1296 13 06 2 352973828 05 1692 + 036967 1296 13 07 2 352973828 06 1692 + 036968 1296 13 08 2 352973828 07 1692 + 036969 1296 14 01 2 352973828 08 1692 + 036970 1296 14 02 2 352973828 09 1692 + 036971 1296 14 03 2 352973828 10 1692 + 036972 1296 14 04 2 352973828 11 1692 + 036973 1296 14 05 2 352973828 12 1692 + 036974 1296 14 06 2 352973828 13 1692 + 036975 1296 14 07 2 352973828 14 1692 + 036976 1296 14 08 2 352973828 15 1692 + 036977 1296 15 01 2 352974852 00 1693 + 036978 1296 15 02 2 352974852 01 1693 + 036979 1296 15 03 2 352974852 02 1693 + 036980 1296 15 04 2 352974852 03 1693 + 036981 1296 15 05 2 352974852 04 1693 + 036982 1296 15 06 2 352974852 05 1693 + 036983 1296 15 07 2 352974852 06 1693 + 036984 1296 15 08 2 352974852 07 1693 + 036985 1296 16 01 2 352974852 08 1693 + 036986 1296 16 02 2 352974852 09 1693 + 036987 1296 16 03 2 352974852 10 1693 + 036988 1296 16 04 2 352974852 11 1693 + 036989 1296 16 05 2 352974852 12 1693 + 036990 1296 16 06 2 352974852 13 1693 + 036991 1296 16 07 2 352974852 14 1693 + 036992 1296 16 08 2 352974852 15 1693 + 036993 1296 17 01 2 353133572 00 1754 + 036994 1296 17 02 2 353133572 01 1754 + 036995 1296 17 03 2 353133572 02 1754 + 036996 1296 17 04 2 353133572 03 1754 + 036997 1296 17 05 2 353133572 04 1754 + 036998 1296 17 06 2 353133572 05 1754 + 036999 1296 17 07 2 353133572 06 1754 + 037000 1296 17 08 2 353133572 07 1754 + 037001 1296 18 01 2 353133572 08 1754 + 037002 1296 18 02 2 353133572 09 1754 + 037003 1296 18 03 2 353133572 10 1754 + 037004 1296 18 04 2 353133572 11 1754 + 037005 1296 18 05 2 353133572 12 1754 + 037006 1296 18 06 2 353133572 13 1754 + 037007 1296 18 07 2 353133572 14 1754 + 037008 1296 18 08 2 353133572 15 1754 + 037009 1296 19 01 2 353134596 00 1755 + 037010 1296 19 02 2 353134596 01 1755 + 037011 1296 19 03 2 353134596 02 1755 + 037012 1296 19 04 2 353134596 03 1755 + 037013 1296 19 05 2 353134596 04 1755 + 037014 1296 19 06 2 353134596 05 1755 + 037015 1296 19 07 2 353134596 06 1755 + 037016 1296 19 08 2 353134596 07 1755 + 037017 1296 20 01 2 353134596 08 1755 + 037018 1296 20 02 2 353134596 09 1755 + 037019 1296 20 03 2 353134596 10 1755 + 037020 1296 20 04 2 353134596 11 1755 + 037021 1296 20 05 2 353134596 12 1755 + 037022 1296 20 06 2 353134596 13 1755 + 037023 1296 20 07 2 353134596 14 1755 + 037024 1296 20 08 2 353134596 15 1755 + 037025 1296 21 01 2 353235972 00 1804 + 037026 1296 21 02 2 353235972 01 1804 + 037027 1296 21 03 2 353235972 02 1804 + 037028 1296 21 04 2 353235972 03 1804 + 037029 1296 21 05 2 353235972 04 1804 + 037030 1296 21 06 2 353235972 05 1804 + 037031 1296 21 07 2 353235972 06 1804 + 037032 1296 21 08 2 353235972 07 1804 + 037033 1296 22 01 2 353235972 08 1804 + 037034 1296 22 02 2 353235972 09 1804 + 037035 1296 22 03 2 353235972 10 1804 + 037036 1296 22 04 2 353235972 11 1804 + 037037 1296 22 05 2 353235972 12 1804 + 037038 1296 22 06 2 353235972 13 1804 + 037039 1296 22 07 2 353235972 14 1804 + 037040 1296 22 08 2 353235972 15 1804 + 037041 1296 23 01 2 353236996 00 1805 + 037042 1296 23 02 2 353236996 01 1805 + 037043 1296 23 03 2 353236996 02 1805 + 037044 1296 23 04 2 353236996 03 1805 + 037045 1296 23 05 2 353236996 04 1805 + 037046 1296 23 06 2 353236996 05 1805 + 037047 1296 23 07 2 353236996 06 1805 + 037048 1296 23 08 2 353236996 07 1805 + 037049 1296 24 01 2 353236996 08 1805 + 037050 1296 24 02 2 353236996 09 1805 + 037051 1296 24 03 2 353236996 10 1805 + 037052 1296 24 04 2 353236996 11 1805 + 037053 1296 24 05 2 353236996 12 1805 + 037054 1296 24 06 2 353236996 13 1805 + 037055 1296 24 07 2 353236996 14 1805 + 037056 1296 24 08 2 353236996 15 1805 + 037057 1296 25 01 2 352605188 00 1528 + 037058 1296 25 02 2 352605188 01 1528 + 037059 1296 25 03 2 352605188 02 1528 + 037060 1296 25 04 2 352605188 03 1528 + 037061 1296 25 05 2 352605188 04 1528 + 037062 1296 25 06 2 352605188 05 1528 + 037063 1296 25 07 2 352605188 06 1528 + 037064 1296 25 08 2 352605188 07 1528 + 037065 1296 26 01 2 352605188 08 1528 + 037066 1296 26 02 2 352605188 09 1528 + 037067 1296 26 03 2 352605188 10 1528 + 037068 1296 26 04 2 352605188 11 1528 + 037069 1296 26 05 2 352605188 12 1528 + 037070 1296 26 06 2 352605188 13 1528 + 037071 1296 26 07 2 352605188 14 1528 + 037072 1296 26 08 2 352605188 15 1528 + 037073 1296 27 01 2 352606212 00 1529 + 037074 1296 27 02 2 352606212 01 1529 + 037075 1296 27 03 2 352606212 02 1529 + 037076 1296 27 04 2 352606212 03 1529 + 037077 1296 27 05 2 352606212 04 1529 + 037078 1296 27 06 2 352606212 05 1529 + 037079 1296 27 07 2 352606212 06 1529 + 037080 1296 27 08 2 352606212 07 1529 + 037081 1296 28 01 2 352606212 08 1529 + 037082 1296 28 02 2 352606212 09 1529 + 037083 1296 28 03 2 352606212 10 1529 + 037084 1296 28 04 2 352606212 11 1529 + 037085 1296 28 05 2 352606212 12 1529 + 037086 1296 28 06 2 352606212 13 1529 + 037087 1296 28 07 2 352606212 14 1529 + 037088 1296 28 08 2 352606212 15 1529 + 037089 1296 29 01 2 352707588 00 1578 + 037090 1296 29 02 2 352707588 01 1578 + 037091 1296 29 03 2 352707588 02 1578 + 037092 1296 29 04 2 352707588 03 1578 + 037093 1296 29 05 2 352707588 04 1578 + 037094 1296 29 06 2 352707588 05 1578 + 037095 1296 29 07 2 352707588 06 1578 + 037096 1296 29 08 2 352707588 07 1578 + 037097 1296 30 01 2 352707588 08 1578 + 037098 1296 30 02 2 352707588 09 1578 + 037099 1296 30 03 2 352707588 10 1578 + 037100 1296 30 04 2 352707588 11 1578 + 037101 1296 30 05 2 352707588 12 1578 + 037102 1296 30 06 2 352707588 13 1578 + 037103 1296 30 07 2 352707588 14 1578 + 037104 1296 30 08 2 352707588 15 1578 + 037105 1296 31 01 2 352708612 00 1579 + 037106 1296 31 02 2 352708612 01 1579 + 037107 1296 31 03 2 352708612 02 1579 + 037108 1296 31 04 2 352708612 03 1579 + 037109 1296 31 05 2 352708612 04 1579 + 037110 1296 31 06 2 352708612 05 1579 + 037111 1296 31 07 2 352708612 06 1579 + 037112 1296 31 08 2 352708612 07 1579 + 037113 1296 32 01 2 352708612 08 1579 + 037114 1296 32 02 2 352708612 09 1579 + 037115 1296 32 03 2 352708612 10 1579 + 037116 1296 32 04 2 352708612 11 1579 + 037117 1296 32 05 2 352708612 12 1579 + 037118 1296 32 06 2 352708612 13 1579 + 037119 1296 32 07 2 352708612 14 1579 + 037120 1296 32 08 2 352708612 15 1579 + 037121 1296 33 01 2 352867332 00 1640 + 037122 1296 33 02 2 352867332 01 1640 + 037123 1296 33 03 2 352867332 02 1640 + 037124 1296 33 04 2 352867332 03 1640 + 037125 1296 33 05 2 352867332 04 1640 + 037126 1296 33 06 2 352867332 05 1640 + 037127 1296 33 07 2 352867332 06 1640 + 037128 1296 33 08 2 352867332 07 1640 + 037129 1296 34 01 2 352867332 08 1640 + 037130 1296 34 02 2 352867332 09 1640 + 037131 1296 34 03 2 352867332 10 1640 + 037132 1296 34 04 2 352867332 11 1640 + 037133 1296 34 05 2 352867332 12 1640 + 037134 1296 34 06 2 352867332 13 1640 + 037135 1296 34 07 2 352867332 14 1640 + 037136 1296 34 08 2 352867332 15 1640 + 037137 1296 35 01 2 352868356 00 1641 + 037138 1296 35 02 2 352868356 01 1641 + 037139 1296 35 03 2 352868356 02 1641 + 037140 1296 35 04 2 352868356 03 1641 + 037141 1296 35 05 2 352868356 04 1641 + 037142 1296 35 06 2 352868356 05 1641 + 037143 1296 35 07 2 352868356 06 1641 + 037144 1296 35 08 2 352868356 07 1641 + 037145 1296 36 01 2 352868356 08 1641 + 037146 1296 36 02 2 352868356 09 1641 + 037147 1296 36 03 2 352868356 10 1641 + 037148 1296 36 04 2 352868356 11 1641 + 037149 1296 36 05 2 352868356 12 1641 + 037150 1296 36 06 2 352868356 13 1641 + 037151 1296 36 07 2 352868356 14 1641 + 037152 1296 36 08 2 352868356 15 1641 + 037153 1296 37 01 2 352969732 00 1690 + 037154 1296 37 02 2 352969732 01 1690 + 037155 1296 37 03 2 352969732 02 1690 + 037156 1296 37 04 2 352969732 03 1690 + 037157 1296 37 05 2 352969732 04 1690 + 037158 1296 37 06 2 352969732 05 1690 + 037159 1296 37 07 2 352969732 06 1690 + 037160 1296 37 08 2 352969732 07 1690 + 037161 1296 38 01 2 352969732 08 1690 + 037162 1296 38 02 2 352969732 09 1690 + 037163 1296 38 03 2 352969732 10 1690 + 037164 1296 38 04 2 352969732 11 1690 + 037165 1296 38 05 2 352969732 12 1690 + 037166 1296 38 06 2 352969732 13 1690 + 037167 1296 38 07 2 352969732 14 1690 + 037168 1296 38 08 2 352969732 15 1690 + 037169 1296 39 01 2 352970756 00 1691 + 037170 1296 39 02 2 352970756 01 1691 + 037171 1296 39 03 2 352970756 02 1691 + 037172 1296 39 04 2 352970756 03 1691 + 037173 1296 39 05 2 352970756 04 1691 + 037174 1296 39 06 2 352970756 05 1691 + 037175 1296 39 07 2 352970756 06 1691 + 037176 1296 39 08 2 352970756 07 1691 + 037177 1296 40 01 2 352970756 08 1691 + 037178 1296 40 02 2 352970756 09 1691 + 037179 1296 40 03 2 352970756 10 1691 + 037180 1296 40 04 2 352970756 11 1691 + 037181 1296 40 05 2 352970756 12 1691 + 037182 1296 40 06 2 352970756 13 1691 + 037183 1296 40 07 2 352970756 14 1691 + 037184 1296 40 08 2 352970756 15 1691 + 037185 1296 41 01 2 353129476 00 1752 + 037186 1296 41 02 2 353129476 01 1752 + 037187 1296 41 03 2 353129476 02 1752 + 037188 1296 41 04 2 353129476 03 1752 + 037189 1296 41 05 2 353129476 04 1752 + 037190 1296 41 06 2 353129476 05 1752 + 037191 1296 41 07 2 353129476 06 1752 + 037192 1296 41 08 2 353129476 07 1752 + 037193 1296 42 01 2 353129476 08 1752 + 037194 1296 42 02 2 353129476 09 1752 + 037195 1296 42 03 2 353129476 10 1752 + 037196 1296 42 04 2 353129476 11 1752 + 037197 1296 42 05 2 353129476 12 1752 + 037198 1296 42 06 2 353129476 13 1752 + 037199 1296 42 07 2 353129476 14 1752 + 037200 1296 42 08 2 353129476 15 1752 + 037201 1296 43 01 2 353130500 00 1753 + 037202 1296 43 02 2 353130500 01 1753 + 037203 1296 43 03 2 353130500 02 1753 + 037204 1296 43 04 2 353130500 03 1753 + 037205 1296 43 05 2 353130500 04 1753 + 037206 1296 43 06 2 353130500 05 1753 + 037207 1296 43 07 2 353130500 06 1753 + 037208 1296 43 08 2 353130500 07 1753 + 037209 1296 44 01 2 353130500 08 1753 + 037210 1296 44 02 2 353130500 09 1753 + 037211 1296 44 03 2 353130500 10 1753 + 037212 1296 44 04 2 353130500 11 1753 + 037213 1296 44 05 2 353130500 12 1753 + 037214 1296 44 06 2 353130500 13 1753 + 037215 1296 44 07 2 353130500 14 1753 + 037216 1296 44 08 2 353130500 15 1753 + 037217 1296 45 01 2 353231876 00 1802 + 037218 1296 45 02 2 353231876 01 1802 + 037219 1296 45 03 2 353231876 02 1802 + 037220 1296 45 04 2 353231876 03 1802 + 037221 1296 45 05 2 353231876 04 1802 + 037222 1296 45 06 2 353231876 05 1802 + 037223 1296 45 07 2 353231876 06 1802 + 037224 1296 45 08 2 353231876 07 1802 + 037225 1296 46 01 2 353231876 08 1802 + 037226 1296 46 02 2 353231876 09 1802 + 037227 1296 46 03 2 353231876 10 1802 + 037228 1296 46 04 2 353231876 11 1802 + 037229 1296 46 05 2 353231876 12 1802 + 037230 1296 46 06 2 353231876 13 1802 + 037231 1296 46 07 2 353231876 14 1802 + 037232 1296 46 08 2 353231876 15 1802 + 037233 1296 47 01 2 353232900 00 1803 + 037234 1296 47 02 2 353232900 01 1803 + 037235 1296 47 03 2 353232900 02 1803 + 037236 1296 47 04 2 353232900 03 1803 + 037237 1296 47 05 2 353232900 04 1803 + 037238 1296 47 06 2 353232900 05 1803 + 037239 1296 47 07 2 353232900 06 1803 + 037240 1296 47 08 2 353232900 07 1803 + 037241 1296 48 01 2 353232900 08 1803 + 037242 1296 48 02 2 353232900 09 1803 + 037243 1296 48 03 2 353232900 10 1803 + 037244 1296 48 04 2 353232900 11 1803 + 037245 1296 48 05 2 353232900 12 1803 + 037246 1296 48 06 2 353232900 13 1803 + 037247 1296 48 07 2 353232900 14 1803 + 037248 1296 48 08 2 353232900 15 1803 + 037249 1297 01 01 2 352601092 00 1526 + 037250 1297 01 02 2 352601092 01 1526 + 037251 1297 01 03 2 352601092 02 1526 + 037252 1297 01 04 2 352601092 03 1526 + 037253 1297 01 05 2 352601092 04 1526 + 037254 1297 01 06 2 352601092 05 1526 + 037255 1297 01 07 2 352601092 06 1526 + 037256 1297 01 08 2 352601092 07 1526 + 037257 1297 02 01 2 352601092 08 1526 + 037258 1297 02 02 2 352601092 09 1526 + 037259 1297 02 03 2 352601092 10 1526 + 037260 1297 02 04 2 352601092 11 1526 + 037261 1297 02 05 2 352601092 12 1526 + 037262 1297 02 06 2 352601092 13 1526 + 037263 1297 02 07 2 352601092 14 1526 + 037264 1297 02 08 2 352601092 15 1526 + 037265 1297 03 01 2 352602116 00 1527 + 037266 1297 03 02 2 352602116 01 1527 + 037267 1297 03 03 2 352602116 02 1527 + 037268 1297 03 04 2 352602116 03 1527 + 037269 1297 03 05 2 352602116 04 1527 + 037270 1297 03 06 2 352602116 05 1527 + 037271 1297 03 07 2 352602116 06 1527 + 037272 1297 03 08 2 352602116 07 1527 + 037273 1297 04 01 2 352602116 08 1527 + 037274 1297 04 02 2 352602116 09 1527 + 037275 1297 04 03 2 352602116 10 1527 + 037276 1297 04 04 2 352602116 11 1527 + 037277 1297 04 05 2 352602116 12 1527 + 037278 1297 04 06 2 352602116 13 1527 + 037279 1297 04 07 2 352602116 14 1527 + 037280 1297 04 08 2 352602116 15 1527 + 037281 1297 05 01 2 352703492 00 1576 + 037282 1297 05 02 2 352703492 01 1576 + 037283 1297 05 03 2 352703492 02 1576 + 037284 1297 05 04 2 352703492 03 1576 + 037285 1297 05 05 2 352703492 04 1576 + 037286 1297 05 06 2 352703492 05 1576 + 037287 1297 05 07 2 352703492 06 1576 + 037288 1297 05 08 2 352703492 07 1576 + 037289 1297 06 01 2 352703492 08 1576 + 037290 1297 06 02 2 352703492 09 1576 + 037291 1297 06 03 2 352703492 10 1576 + 037292 1297 06 04 2 352703492 11 1576 + 037293 1297 06 05 2 352703492 12 1576 + 037294 1297 06 06 2 352703492 13 1576 + 037295 1297 06 07 2 352703492 14 1576 + 037296 1297 06 08 2 352703492 15 1576 + 037297 1297 07 01 2 352704516 00 1577 + 037298 1297 07 02 2 352704516 01 1577 + 037299 1297 07 03 2 352704516 02 1577 + 037300 1297 07 04 2 352704516 03 1577 + 037301 1297 07 05 2 352704516 04 1577 + 037302 1297 07 06 2 352704516 05 1577 + 037303 1297 07 07 2 352704516 06 1577 + 037304 1297 07 08 2 352704516 07 1577 + 037305 1297 08 01 2 352704516 08 1577 + 037306 1297 08 02 2 352704516 09 1577 + 037307 1297 08 03 2 352704516 10 1577 + 037308 1297 08 04 2 352704516 11 1577 + 037309 1297 08 05 2 352704516 12 1577 + 037310 1297 08 06 2 352704516 13 1577 + 037311 1297 08 07 2 352704516 14 1577 + 037312 1297 08 08 2 352704516 15 1577 + 037313 1297 09 01 2 352863236 00 1638 + 037314 1297 09 02 2 352863236 01 1638 + 037315 1297 09 03 2 352863236 02 1638 + 037316 1297 09 04 2 352863236 03 1638 + 037317 1297 09 05 2 352863236 04 1638 + 037318 1297 09 06 2 352863236 05 1638 + 037319 1297 09 07 2 352863236 06 1638 + 037320 1297 09 08 2 352863236 07 1638 + 037321 1297 10 01 2 352863236 08 1638 + 037322 1297 10 02 2 352863236 09 1638 + 037323 1297 10 03 2 352863236 10 1638 + 037324 1297 10 04 2 352863236 11 1638 + 037325 1297 10 05 2 352863236 12 1638 + 037326 1297 10 06 2 352863236 13 1638 + 037327 1297 10 07 2 352863236 14 1638 + 037328 1297 10 08 2 352863236 15 1638 + 037329 1297 11 01 2 352864260 00 1639 + 037330 1297 11 02 2 352864260 01 1639 + 037331 1297 11 03 2 352864260 02 1639 + 037332 1297 11 04 2 352864260 03 1639 + 037333 1297 11 05 2 352864260 04 1639 + 037334 1297 11 06 2 352864260 05 1639 + 037335 1297 11 07 2 352864260 06 1639 + 037336 1297 11 08 2 352864260 07 1639 + 037337 1297 12 01 2 352864260 08 1639 + 037338 1297 12 02 2 352864260 09 1639 + 037339 1297 12 03 2 352864260 10 1639 + 037340 1297 12 04 2 352864260 11 1639 + 037341 1297 12 05 2 352864260 12 1639 + 037342 1297 12 06 2 352864260 13 1639 + 037343 1297 12 07 2 352864260 14 1639 + 037344 1297 12 08 2 352864260 15 1639 + 037345 1297 13 01 2 352965636 00 1688 + 037346 1297 13 02 2 352965636 01 1688 + 037347 1297 13 03 2 352965636 02 1688 + 037348 1297 13 04 2 352965636 03 1688 + 037349 1297 13 05 2 352965636 04 1688 + 037350 1297 13 06 2 352965636 05 1688 + 037351 1297 13 07 2 352965636 06 1688 + 037352 1297 13 08 2 352965636 07 1688 + 037353 1297 14 01 2 352965636 08 1688 + 037354 1297 14 02 2 352965636 09 1688 + 037355 1297 14 03 2 352965636 10 1688 + 037356 1297 14 04 2 352965636 11 1688 + 037357 1297 14 05 2 352965636 12 1688 + 037358 1297 14 06 2 352965636 13 1688 + 037359 1297 14 07 2 352965636 14 1688 + 037360 1297 14 08 2 352965636 15 1688 + 037361 1297 15 01 2 352966660 00 1689 + 037362 1297 15 02 2 352966660 01 1689 + 037363 1297 15 03 2 352966660 02 1689 + 037364 1297 15 04 2 352966660 03 1689 + 037365 1297 15 05 2 352966660 04 1689 + 037366 1297 15 06 2 352966660 05 1689 + 037367 1297 15 07 2 352966660 06 1689 + 037368 1297 15 08 2 352966660 07 1689 + 037369 1297 16 01 2 352966660 08 1689 + 037370 1297 16 02 2 352966660 09 1689 + 037371 1297 16 03 2 352966660 10 1689 + 037372 1297 16 04 2 352966660 11 1689 + 037373 1297 16 05 2 352966660 12 1689 + 037374 1297 16 06 2 352966660 13 1689 + 037375 1297 16 07 2 352966660 14 1689 + 037376 1297 16 08 2 352966660 15 1689 + 037377 1297 17 01 2 353125380 00 1750 + 037378 1297 17 02 2 353125380 01 1750 + 037379 1297 17 03 2 353125380 02 1750 + 037380 1297 17 04 2 353125380 03 1750 + 037381 1297 17 05 2 353125380 04 1750 + 037382 1297 17 06 2 353125380 05 1750 + 037383 1297 17 07 2 353125380 06 1750 + 037384 1297 17 08 2 353125380 07 1750 + 037385 1297 18 01 2 353125380 08 1750 + 037386 1297 18 02 2 353125380 09 1750 + 037387 1297 18 03 2 353125380 10 1750 + 037388 1297 18 04 2 353125380 11 1750 + 037389 1297 18 05 2 353125380 12 1750 + 037390 1297 18 06 2 353125380 13 1750 + 037391 1297 18 07 2 353125380 14 1750 + 037392 1297 18 08 2 353125380 15 1750 + 037393 1297 19 01 2 353126404 00 1751 + 037394 1297 19 02 2 353126404 01 1751 + 037395 1297 19 03 2 353126404 02 1751 + 037396 1297 19 04 2 353126404 03 1751 + 037397 1297 19 05 2 353126404 04 1751 + 037398 1297 19 06 2 353126404 05 1751 + 037399 1297 19 07 2 353126404 06 1751 + 037400 1297 19 08 2 353126404 07 1751 + 037401 1297 20 01 2 353126404 08 1751 + 037402 1297 20 02 2 353126404 09 1751 + 037403 1297 20 03 2 353126404 10 1751 + 037404 1297 20 04 2 353126404 11 1751 + 037405 1297 20 05 2 353126404 12 1751 + 037406 1297 20 06 2 353126404 13 1751 + 037407 1297 20 07 2 353126404 14 1751 + 037408 1297 20 08 2 353126404 15 1751 + 037409 1297 21 01 2 353227780 00 1800 + 037410 1297 21 02 2 353227780 01 1800 + 037411 1297 21 03 2 353227780 02 1800 + 037412 1297 21 04 2 353227780 03 1800 + 037413 1297 21 05 2 353227780 04 1800 + 037414 1297 21 06 2 353227780 05 1800 + 037415 1297 21 07 2 353227780 06 1800 + 037416 1297 21 08 2 353227780 07 1800 + 037417 1297 22 01 2 353227780 08 1800 + 037418 1297 22 02 2 353227780 09 1800 + 037419 1297 22 03 2 353227780 10 1800 + 037420 1297 22 04 2 353227780 11 1800 + 037421 1297 22 05 2 353227780 12 1800 + 037422 1297 22 06 2 353227780 13 1800 + 037423 1297 22 07 2 353227780 14 1800 + 037424 1297 22 08 2 353227780 15 1800 + 037425 1297 23 01 2 353228804 00 1801 + 037426 1297 23 02 2 353228804 01 1801 + 037427 1297 23 03 2 353228804 02 1801 + 037428 1297 23 04 2 353228804 03 1801 + 037429 1297 23 05 2 353228804 04 1801 + 037430 1297 23 06 2 353228804 05 1801 + 037431 1297 23 07 2 353228804 06 1801 + 037432 1297 23 08 2 353228804 07 1801 + 037433 1297 24 01 2 353228804 08 1801 + 037434 1297 24 02 2 353228804 09 1801 + 037435 1297 24 03 2 353228804 10 1801 + 037436 1297 24 04 2 353228804 11 1801 + 037437 1297 24 05 2 353228804 12 1801 + 037438 1297 24 06 2 353228804 13 1801 + 037439 1297 24 07 2 353228804 14 1801 + 037440 1297 24 08 2 353228804 15 1801 + 037441 1297 25 01 2 352695300 00 1572 + 037442 1297 25 02 2 352695300 01 1572 + 037443 1297 25 03 2 352695300 02 1572 + 037444 1297 25 04 2 352695300 03 1572 + 037445 1297 25 05 2 352695300 04 1572 + 037446 1297 25 06 2 352695300 05 1572 + 037447 1297 25 07 2 352695300 06 1572 + 037448 1297 25 08 2 352695300 07 1572 + 037449 1297 26 01 2 352695300 08 1572 + 037450 1297 26 02 2 352695300 09 1572 + 037451 1297 26 03 2 352695300 10 1572 + 037452 1297 26 04 2 352695300 11 1572 + 037453 1297 26 05 2 352695300 12 1572 + 037454 1297 26 06 2 352695300 13 1572 + 037455 1297 26 07 2 352695300 14 1572 + 037456 1297 26 08 2 352695300 15 1572 + 037457 1297 27 01 2 352696324 00 1573 + 037458 1297 27 02 2 352696324 01 1573 + 037459 1297 27 03 2 352696324 02 1573 + 037460 1297 27 04 2 352696324 03 1573 + 037461 1297 27 05 2 352696324 04 1573 + 037462 1297 27 06 2 352696324 05 1573 + 037463 1297 27 07 2 352696324 06 1573 + 037464 1297 27 08 2 352696324 07 1573 + 037465 1297 28 01 2 352696324 08 1573 + 037466 1297 28 02 2 352696324 09 1573 + 037467 1297 28 03 2 352696324 10 1573 + 037468 1297 28 04 2 352696324 11 1573 + 037469 1297 28 05 2 352696324 12 1573 + 037470 1297 28 06 2 352696324 13 1573 + 037471 1297 28 07 2 352696324 14 1573 + 037472 1297 28 08 2 352696324 15 1573 + 037473 1297 29 01 2 352699396 00 1574 + 037474 1297 29 02 2 352699396 01 1574 + 037475 1297 29 03 2 352699396 02 1574 + 037476 1297 29 04 2 352699396 03 1574 + 037477 1297 29 05 2 352699396 04 1574 + 037478 1297 29 06 2 352699396 05 1574 + 037479 1297 29 07 2 352699396 06 1574 + 037480 1297 29 08 2 352699396 07 1574 + 037481 1297 30 01 2 352699396 08 1574 + 037482 1297 30 02 2 352699396 09 1574 + 037483 1297 30 03 2 352699396 10 1574 + 037484 1297 30 04 2 352699396 11 1574 + 037485 1297 30 05 2 352699396 12 1574 + 037486 1297 30 06 2 352699396 13 1574 + 037487 1297 30 07 2 352699396 14 1574 + 037488 1297 30 08 2 352699396 15 1574 + 037489 1297 31 01 2 352700420 00 1575 + 037490 1297 31 02 2 352700420 01 1575 + 037491 1297 31 03 2 352700420 02 1575 + 037492 1297 31 04 2 352700420 03 1575 + 037493 1297 31 05 2 352700420 04 1575 + 037494 1297 31 06 2 352700420 05 1575 + 037495 1297 31 07 2 352700420 06 1575 + 037496 1297 31 08 2 352700420 07 1575 + 037497 1297 32 01 2 352700420 08 1575 + 037498 1297 32 02 2 352700420 09 1575 + 037499 1297 32 03 2 352700420 10 1575 + 037500 1297 32 04 2 352700420 11 1575 + 037501 1297 32 05 2 352700420 12 1575 + 037502 1297 32 06 2 352700420 13 1575 + 037503 1297 32 07 2 352700420 14 1575 + 037504 1297 32 08 2 352700420 15 1575 + 037505 1297 33 01 2 352957444 00 1684 + 037506 1297 33 02 2 352957444 01 1684 + 037507 1297 33 03 2 352957444 02 1684 + 037508 1297 33 04 2 352957444 03 1684 + 037509 1297 33 05 2 352957444 04 1684 + 037510 1297 33 06 2 352957444 05 1684 + 037511 1297 33 07 2 352957444 06 1684 + 037512 1297 33 08 2 352957444 07 1684 + 037513 1297 34 01 2 352957444 08 1684 + 037514 1297 34 02 2 352957444 09 1684 + 037515 1297 34 03 2 352957444 10 1684 + 037516 1297 34 04 2 352957444 11 1684 + 037517 1297 34 05 2 352957444 12 1684 + 037518 1297 34 06 2 352957444 13 1684 + 037519 1297 34 07 2 352957444 14 1684 + 037520 1297 34 08 2 352957444 15 1684 + 037521 1297 35 01 2 352958468 00 1685 + 037522 1297 35 02 2 352958468 01 1685 + 037523 1297 35 03 2 352958468 02 1685 + 037524 1297 35 04 2 352958468 03 1685 + 037525 1297 35 05 2 352958468 04 1685 + 037526 1297 35 06 2 352958468 05 1685 + 037527 1297 35 07 2 352958468 06 1685 + 037528 1297 35 08 2 352958468 07 1685 + 037529 1297 36 01 2 352958468 08 1685 + 037530 1297 36 02 2 352958468 09 1685 + 037531 1297 36 03 2 352958468 10 1685 + 037532 1297 36 04 2 352958468 11 1685 + 037533 1297 36 05 2 352958468 12 1685 + 037534 1297 36 06 2 352958468 13 1685 + 037535 1297 36 07 2 352958468 14 1685 + 037536 1297 36 08 2 352958468 15 1685 + 037537 1297 37 01 2 352961540 00 1686 + 037538 1297 37 02 2 352961540 01 1686 + 037539 1297 37 03 2 352961540 02 1686 + 037540 1297 37 04 2 352961540 03 1686 + 037541 1297 37 05 2 352961540 04 1686 + 037542 1297 37 06 2 352961540 05 1686 + 037543 1297 37 07 2 352961540 06 1686 + 037544 1297 37 08 2 352961540 07 1686 + 037545 1297 38 01 2 352961540 08 1686 + 037546 1297 38 02 2 352961540 09 1686 + 037547 1297 38 03 2 352961540 10 1686 + 037548 1297 38 04 2 352961540 11 1686 + 037549 1297 38 05 2 352961540 12 1686 + 037550 1297 38 06 2 352961540 13 1686 + 037551 1297 38 07 2 352961540 14 1686 + 037552 1297 38 08 2 352961540 15 1686 + 037553 1297 39 01 2 352962564 00 1687 + 037554 1297 39 02 2 352962564 01 1687 + 037555 1297 39 03 2 352962564 02 1687 + 037556 1297 39 04 2 352962564 03 1687 + 037557 1297 39 05 2 352962564 04 1687 + 037558 1297 39 06 2 352962564 05 1687 + 037559 1297 39 07 2 352962564 06 1687 + 037560 1297 39 08 2 352962564 07 1687 + 037561 1297 40 01 2 352962564 08 1687 + 037562 1297 40 02 2 352962564 09 1687 + 037563 1297 40 03 2 352962564 10 1687 + 037564 1297 40 04 2 352962564 11 1687 + 037565 1297 40 05 2 352962564 12 1687 + 037566 1297 40 06 2 352962564 13 1687 + 037567 1297 40 07 2 352962564 14 1687 + 037568 1297 40 08 2 352962564 15 1687 + 037569 1297 41 01 2 353219588 00 1796 + 037570 1297 41 02 2 353219588 01 1796 + 037571 1297 41 03 2 353219588 02 1796 + 037572 1297 41 04 2 353219588 03 1796 + 037573 1297 41 05 2 353219588 04 1796 + 037574 1297 41 06 2 353219588 05 1796 + 037575 1297 41 07 2 353219588 06 1796 + 037576 1297 41 08 2 353219588 07 1796 + 037577 1297 42 01 2 353219588 08 1796 + 037578 1297 42 02 2 353219588 09 1796 + 037579 1297 42 03 2 353219588 10 1796 + 037580 1297 42 04 2 353219588 11 1796 + 037581 1297 42 05 2 353219588 12 1796 + 037582 1297 42 06 2 353219588 13 1796 + 037583 1297 42 07 2 353219588 14 1796 + 037584 1297 42 08 2 353219588 15 1796 + 037585 1297 43 01 2 353220612 00 1797 + 037586 1297 43 02 2 353220612 01 1797 + 037587 1297 43 03 2 353220612 02 1797 + 037588 1297 43 04 2 353220612 03 1797 + 037589 1297 43 05 2 353220612 04 1797 + 037590 1297 43 06 2 353220612 05 1797 + 037591 1297 43 07 2 353220612 06 1797 + 037592 1297 43 08 2 353220612 07 1797 + 037593 1297 44 01 2 353220612 08 1797 + 037594 1297 44 02 2 353220612 09 1797 + 037595 1297 44 03 2 353220612 10 1797 + 037596 1297 44 04 2 353220612 11 1797 + 037597 1297 44 05 2 353220612 12 1797 + 037598 1297 44 06 2 353220612 13 1797 + 037599 1297 44 07 2 353220612 14 1797 + 037600 1297 44 08 2 353220612 15 1797 + 037601 1297 45 01 2 353223684 00 1798 + 037602 1297 45 02 2 353223684 01 1798 + 037603 1297 45 03 2 353223684 02 1798 + 037604 1297 45 04 2 353223684 03 1798 + 037605 1297 45 05 2 353223684 04 1798 + 037606 1297 45 06 2 353223684 05 1798 + 037607 1297 45 07 2 353223684 06 1798 + 037608 1297 45 08 2 353223684 07 1798 + 037609 1297 46 01 2 353223684 08 1798 + 037610 1297 46 02 2 353223684 09 1798 + 037611 1297 46 03 2 353223684 10 1798 + 037612 1297 46 04 2 353223684 11 1798 + 037613 1297 46 05 2 353223684 12 1798 + 037614 1297 46 06 2 353223684 13 1798 + 037615 1297 46 07 2 353223684 14 1798 + 037616 1297 46 08 2 353223684 15 1798 + 037617 1297 47 01 2 353224708 00 1799 + 037618 1297 47 02 2 353224708 01 1799 + 037619 1297 47 03 2 353224708 02 1799 + 037620 1297 47 04 2 353224708 03 1799 + 037621 1297 47 05 2 353224708 04 1799 + 037622 1297 47 06 2 353224708 05 1799 + 037623 1297 47 07 2 353224708 06 1799 + 037624 1297 47 08 2 353224708 07 1799 + 037625 1297 48 01 2 353224708 08 1799 + 037626 1297 48 02 2 353224708 09 1799 + 037627 1297 48 03 2 353224708 10 1799 + 037628 1297 48 04 2 353224708 11 1799 + 037629 1297 48 05 2 353224708 12 1799 + 037630 1297 48 06 2 353224708 13 1799 + 037631 1297 48 07 2 353224708 14 1799 + 037632 1297 48 08 2 353224708 15 1799 + 037633 1298 01 01 2 352691204 00 1570 + 037634 1298 01 02 2 352691204 01 1570 + 037635 1298 01 03 2 352691204 02 1570 + 037636 1298 01 04 2 352691204 03 1570 + 037637 1298 01 05 2 352691204 04 1570 + 037638 1298 01 06 2 352691204 05 1570 + 037639 1298 01 07 2 352691204 06 1570 + 037640 1298 01 08 2 352691204 07 1570 + 037641 1298 02 01 2 352691204 08 1570 + 037642 1298 02 02 2 352691204 09 1570 + 037643 1298 02 03 2 352691204 10 1570 + 037644 1298 02 04 2 352691204 11 1570 + 037645 1298 02 05 2 352691204 12 1570 + 037646 1298 02 06 2 352691204 13 1570 + 037647 1298 02 07 2 352691204 14 1570 + 037648 1298 02 08 2 352691204 15 1570 + 037649 1298 03 01 2 352692228 00 1571 + 037650 1298 03 02 2 352692228 01 1571 + 037651 1298 03 03 2 352692228 02 1571 + 037652 1298 03 04 2 352692228 03 1571 + 037653 1298 03 05 2 352692228 04 1571 + 037654 1298 03 06 2 352692228 05 1571 + 037655 1298 03 07 2 352692228 06 1571 + 037656 1298 03 08 2 352692228 07 1571 + 037657 1298 04 01 2 352692228 08 1571 + 037658 1298 04 02 2 352692228 09 1571 + 037659 1298 04 03 2 352692228 10 1571 + 037660 1298 04 04 2 352692228 11 1571 + 037661 1298 04 05 2 352692228 12 1571 + 037662 1298 04 06 2 352692228 13 1571 + 037663 1298 04 07 2 352692228 14 1571 + 037664 1298 04 08 2 352692228 15 1571 + 037665 1298 05 01 2 352596996 00 1524 + 037666 1298 05 02 2 352596996 01 1524 + 037667 1298 05 03 2 352596996 02 1524 + 037668 1298 05 04 2 352596996 03 1524 + 037669 1298 05 05 2 352596996 04 1524 + 037670 1298 05 06 2 352596996 05 1524 + 037671 1298 05 07 2 352596996 06 1524 + 037672 1298 05 08 2 352596996 07 1524 + 037673 1298 06 01 2 352596996 08 1524 + 037674 1298 06 02 2 352596996 09 1524 + 037675 1298 06 03 2 352596996 10 1524 + 037676 1298 06 04 2 352596996 11 1524 + 037677 1298 06 05 2 352596996 12 1524 + 037678 1298 06 06 2 352596996 13 1524 + 037679 1298 06 07 2 352596996 14 1524 + 037680 1298 06 08 2 352596996 15 1524 + 037681 1298 07 01 2 352598020 00 1525 + 037682 1298 07 02 2 352598020 01 1525 + 037683 1298 07 03 2 352598020 02 1525 + 037684 1298 07 04 2 352598020 03 1525 + 037685 1298 07 05 2 352598020 04 1525 + 037686 1298 07 06 2 352598020 05 1525 + 037687 1298 07 07 2 352598020 06 1525 + 037688 1298 07 08 2 352598020 07 1525 + 037689 1298 08 01 2 352598020 08 1525 + 037690 1298 08 02 2 352598020 09 1525 + 037691 1298 08 03 2 352598020 10 1525 + 037692 1298 08 04 2 352598020 11 1525 + 037693 1298 08 05 2 352598020 12 1525 + 037694 1298 08 06 2 352598020 13 1525 + 037695 1298 08 07 2 352598020 14 1525 + 037696 1298 08 08 2 352598020 15 1525 + 037697 1298 09 01 2 352953348 00 1682 + 037698 1298 09 02 2 352953348 01 1682 + 037699 1298 09 03 2 352953348 02 1682 + 037700 1298 09 04 2 352953348 03 1682 + 037701 1298 09 05 2 352953348 04 1682 + 037702 1298 09 06 2 352953348 05 1682 + 037703 1298 09 07 2 352953348 06 1682 + 037704 1298 09 08 2 352953348 07 1682 + 037705 1298 10 01 2 352953348 08 1682 + 037706 1298 10 02 2 352953348 09 1682 + 037707 1298 10 03 2 352953348 10 1682 + 037708 1298 10 04 2 352953348 11 1682 + 037709 1298 10 05 2 352953348 12 1682 + 037710 1298 10 06 2 352953348 13 1682 + 037711 1298 10 07 2 352953348 14 1682 + 037712 1298 10 08 2 352953348 15 1682 + 037713 1298 11 01 2 352954372 00 1683 + 037714 1298 11 02 2 352954372 01 1683 + 037715 1298 11 03 2 352954372 02 1683 + 037716 1298 11 04 2 352954372 03 1683 + 037717 1298 11 05 2 352954372 04 1683 + 037718 1298 11 06 2 352954372 05 1683 + 037719 1298 11 07 2 352954372 06 1683 + 037720 1298 11 08 2 352954372 07 1683 + 037721 1298 12 01 2 352954372 08 1683 + 037722 1298 12 02 2 352954372 09 1683 + 037723 1298 12 03 2 352954372 10 1683 + 037724 1298 12 04 2 352954372 11 1683 + 037725 1298 12 05 2 352954372 12 1683 + 037726 1298 12 06 2 352954372 13 1683 + 037727 1298 12 07 2 352954372 14 1683 + 037728 1298 12 08 2 352954372 15 1683 + 037729 1298 13 01 2 352859140 00 1636 + 037730 1298 13 02 2 352859140 01 1636 + 037731 1298 13 03 2 352859140 02 1636 + 037732 1298 13 04 2 352859140 03 1636 + 037733 1298 13 05 2 352859140 04 1636 + 037734 1298 13 06 2 352859140 05 1636 + 037735 1298 13 07 2 352859140 06 1636 + 037736 1298 13 08 2 352859140 07 1636 + 037737 1298 14 01 2 352859140 08 1636 + 037738 1298 14 02 2 352859140 09 1636 + 037739 1298 14 03 2 352859140 10 1636 + 037740 1298 14 04 2 352859140 11 1636 + 037741 1298 14 05 2 352859140 12 1636 + 037742 1298 14 06 2 352859140 13 1636 + 037743 1298 14 07 2 352859140 14 1636 + 037744 1298 14 08 2 352859140 15 1636 + 037745 1298 15 01 2 352860164 00 1637 + 037746 1298 15 02 2 352860164 01 1637 + 037747 1298 15 03 2 352860164 02 1637 + 037748 1298 15 04 2 352860164 03 1637 + 037749 1298 15 05 2 352860164 04 1637 + 037750 1298 15 06 2 352860164 05 1637 + 037751 1298 15 07 2 352860164 06 1637 + 037752 1298 15 08 2 352860164 07 1637 + 037753 1298 16 01 2 352860164 08 1637 + 037754 1298 16 02 2 352860164 09 1637 + 037755 1298 16 03 2 352860164 10 1637 + 037756 1298 16 04 2 352860164 11 1637 + 037757 1298 16 05 2 352860164 12 1637 + 037758 1298 16 06 2 352860164 13 1637 + 037759 1298 16 07 2 352860164 14 1637 + 037760 1298 16 08 2 352860164 15 1637 + 037761 1298 17 01 2 353215492 00 1794 + 037762 1298 17 02 2 353215492 01 1794 + 037763 1298 17 03 2 353215492 02 1794 + 037764 1298 17 04 2 353215492 03 1794 + 037765 1298 17 05 2 353215492 04 1794 + 037766 1298 17 06 2 353215492 05 1794 + 037767 1298 17 07 2 353215492 06 1794 + 037768 1298 17 08 2 353215492 07 1794 + 037769 1298 18 01 2 353215492 08 1794 + 037770 1298 18 02 2 353215492 09 1794 + 037771 1298 18 03 2 353215492 10 1794 + 037772 1298 18 04 2 353215492 11 1794 + 037773 1298 18 05 2 353215492 12 1794 + 037774 1298 18 06 2 353215492 13 1794 + 037775 1298 18 07 2 353215492 14 1794 + 037776 1298 18 08 2 353215492 15 1794 + 037777 1298 19 01 2 353216516 00 1795 + 037778 1298 19 02 2 353216516 01 1795 + 037779 1298 19 03 2 353216516 02 1795 + 037780 1298 19 04 2 353216516 03 1795 + 037781 1298 19 05 2 353216516 04 1795 + 037782 1298 19 06 2 353216516 05 1795 + 037783 1298 19 07 2 353216516 06 1795 + 037784 1298 19 08 2 353216516 07 1795 + 037785 1298 20 01 2 353216516 08 1795 + 037786 1298 20 02 2 353216516 09 1795 + 037787 1298 20 03 2 353216516 10 1795 + 037788 1298 20 04 2 353216516 11 1795 + 037789 1298 20 05 2 353216516 12 1795 + 037790 1298 20 06 2 353216516 13 1795 + 037791 1298 20 07 2 353216516 14 1795 + 037792 1298 20 08 2 353216516 15 1795 + 037793 1298 21 01 2 353121284 00 1748 + 037794 1298 21 02 2 353121284 01 1748 + 037795 1298 21 03 2 353121284 02 1748 + 037796 1298 21 04 2 353121284 03 1748 + 037797 1298 21 05 2 353121284 04 1748 + 037798 1298 21 06 2 353121284 05 1748 + 037799 1298 21 07 2 353121284 06 1748 + 037800 1298 21 08 2 353121284 07 1748 + 037801 1298 22 01 2 353121284 08 1748 + 037802 1298 22 02 2 353121284 09 1748 + 037803 1298 22 03 2 353121284 10 1748 + 037804 1298 22 04 2 353121284 11 1748 + 037805 1298 22 05 2 353121284 12 1748 + 037806 1298 22 06 2 353121284 13 1748 + 037807 1298 22 07 2 353121284 14 1748 + 037808 1298 22 08 2 353121284 15 1748 + 037809 1298 23 01 2 353122308 00 1749 + 037810 1298 23 02 2 353122308 01 1749 + 037811 1298 23 03 2 353122308 02 1749 + 037812 1298 23 04 2 353122308 03 1749 + 037813 1298 23 05 2 353122308 04 1749 + 037814 1298 23 06 2 353122308 05 1749 + 037815 1298 23 07 2 353122308 06 1749 + 037816 1298 23 08 2 353122308 07 1749 + 037817 1298 24 01 2 353122308 08 1749 + 037818 1298 24 02 2 353122308 09 1749 + 037819 1298 24 03 2 353122308 10 1749 + 037820 1298 24 04 2 353122308 11 1749 + 037821 1298 24 05 2 353122308 12 1749 + 037822 1298 24 06 2 353122308 13 1749 + 037823 1298 24 07 2 353122308 14 1749 + 037824 1298 24 08 2 353122308 15 1749 + 037825 1298 25 01 2 352687108 00 1568 + 037826 1298 25 02 2 352687108 01 1568 + 037827 1298 25 03 2 352687108 02 1568 + 037828 1298 25 04 2 352687108 03 1568 + 037829 1298 25 05 2 352687108 04 1568 + 037830 1298 25 06 2 352687108 05 1568 + 037831 1298 25 07 2 352687108 06 1568 + 037832 1298 25 08 2 352687108 07 1568 + 037833 1298 26 01 2 352687108 08 1568 + 037834 1298 26 02 2 352687108 09 1568 + 037835 1298 26 03 2 352687108 10 1568 + 037836 1298 26 04 2 352687108 11 1568 + 037837 1298 26 05 2 352687108 12 1568 + 037838 1298 26 06 2 352687108 13 1568 + 037839 1298 26 07 2 352687108 14 1568 + 037840 1298 26 08 2 352687108 15 1568 + 037841 1298 27 01 2 352688132 00 1569 + 037842 1298 27 02 2 352688132 01 1569 + 037843 1298 27 03 2 352688132 02 1569 + 037844 1298 27 04 2 352688132 03 1569 + 037845 1298 27 05 2 352688132 04 1569 + 037846 1298 27 06 2 352688132 05 1569 + 037847 1298 27 07 2 352688132 06 1569 + 037848 1298 27 08 2 352688132 07 1569 + 037849 1298 28 01 2 352688132 08 1569 + 037850 1298 28 02 2 352688132 09 1569 + 037851 1298 28 03 2 352688132 10 1569 + 037852 1298 28 04 2 352688132 11 1569 + 037853 1298 28 05 2 352688132 12 1569 + 037854 1298 28 06 2 352688132 13 1569 + 037855 1298 28 07 2 352688132 14 1569 + 037856 1298 28 08 2 352688132 15 1569 + 037857 1298 29 01 2 352592900 00 1522 + 037858 1298 29 02 2 352592900 01 1522 + 037859 1298 29 03 2 352592900 02 1522 + 037860 1298 29 04 2 352592900 03 1522 + 037861 1298 29 05 2 352592900 04 1522 + 037862 1298 29 06 2 352592900 05 1522 + 037863 1298 29 07 2 352592900 06 1522 + 037864 1298 29 08 2 352592900 07 1522 + 037865 1298 30 01 2 352592900 08 1522 + 037866 1298 30 02 2 352592900 09 1522 + 037867 1298 30 03 2 352592900 10 1522 + 037868 1298 30 04 2 352592900 11 1522 + 037869 1298 30 05 2 352592900 12 1522 + 037870 1298 30 06 2 352592900 13 1522 + 037871 1298 30 07 2 352592900 14 1522 + 037872 1298 30 08 2 352592900 15 1522 + 037873 1298 31 01 2 352593924 00 1523 + 037874 1298 31 02 2 352593924 01 1523 + 037875 1298 31 03 2 352593924 02 1523 + 037876 1298 31 04 2 352593924 03 1523 + 037877 1298 31 05 2 352593924 04 1523 + 037878 1298 31 06 2 352593924 05 1523 + 037879 1298 31 07 2 352593924 06 1523 + 037880 1298 31 08 2 352593924 07 1523 + 037881 1298 32 01 2 352593924 08 1523 + 037882 1298 32 02 2 352593924 09 1523 + 037883 1298 32 03 2 352593924 10 1523 + 037884 1298 32 04 2 352593924 11 1523 + 037885 1298 32 05 2 352593924 12 1523 + 037886 1298 32 06 2 352593924 13 1523 + 037887 1298 32 07 2 352593924 14 1523 + 037888 1298 32 08 2 352593924 15 1523 + 037889 1298 33 01 2 352949252 00 1680 + 037890 1298 33 02 2 352949252 01 1680 + 037891 1298 33 03 2 352949252 02 1680 + 037892 1298 33 04 2 352949252 03 1680 + 037893 1298 33 05 2 352949252 04 1680 + 037894 1298 33 06 2 352949252 05 1680 + 037895 1298 33 07 2 352949252 06 1680 + 037896 1298 33 08 2 352949252 07 1680 + 037897 1298 34 01 2 352949252 08 1680 + 037898 1298 34 02 2 352949252 09 1680 + 037899 1298 34 03 2 352949252 10 1680 + 037900 1298 34 04 2 352949252 11 1680 + 037901 1298 34 05 2 352949252 12 1680 + 037902 1298 34 06 2 352949252 13 1680 + 037903 1298 34 07 2 352949252 14 1680 + 037904 1298 34 08 2 352949252 15 1680 + 037905 1298 35 01 2 352950276 00 1681 + 037906 1298 35 02 2 352950276 01 1681 + 037907 1298 35 03 2 352950276 02 1681 + 037908 1298 35 04 2 352950276 03 1681 + 037909 1298 35 05 2 352950276 04 1681 + 037910 1298 35 06 2 352950276 05 1681 + 037911 1298 35 07 2 352950276 06 1681 + 037912 1298 35 08 2 352950276 07 1681 + 037913 1298 36 01 2 352950276 08 1681 + 037914 1298 36 02 2 352950276 09 1681 + 037915 1298 36 03 2 352950276 10 1681 + 037916 1298 36 04 2 352950276 11 1681 + 037917 1298 36 05 2 352950276 12 1681 + 037918 1298 36 06 2 352950276 13 1681 + 037919 1298 36 07 2 352950276 14 1681 + 037920 1298 36 08 2 352950276 15 1681 + 037921 1298 37 01 2 352855044 00 1634 + 037922 1298 37 02 2 352855044 01 1634 + 037923 1298 37 03 2 352855044 02 1634 + 037924 1298 37 04 2 352855044 03 1634 + 037925 1298 37 05 2 352855044 04 1634 + 037926 1298 37 06 2 352855044 05 1634 + 037927 1298 37 07 2 352855044 06 1634 + 037928 1298 37 08 2 352855044 07 1634 + 037929 1298 38 01 2 352855044 08 1634 + 037930 1298 38 02 2 352855044 09 1634 + 037931 1298 38 03 2 352855044 10 1634 + 037932 1298 38 04 2 352855044 11 1634 + 037933 1298 38 05 2 352855044 12 1634 + 037934 1298 38 06 2 352855044 13 1634 + 037935 1298 38 07 2 352855044 14 1634 + 037936 1298 38 08 2 352855044 15 1634 + 037937 1298 39 01 2 352856068 00 1635 + 037938 1298 39 02 2 352856068 01 1635 + 037939 1298 39 03 2 352856068 02 1635 + 037940 1298 39 04 2 352856068 03 1635 + 037941 1298 39 05 2 352856068 04 1635 + 037942 1298 39 06 2 352856068 05 1635 + 037943 1298 39 07 2 352856068 06 1635 + 037944 1298 39 08 2 352856068 07 1635 + 037945 1298 40 01 2 352856068 08 1635 + 037946 1298 40 02 2 352856068 09 1635 + 037947 1298 40 03 2 352856068 10 1635 + 037948 1298 40 04 2 352856068 11 1635 + 037949 1298 40 05 2 352856068 12 1635 + 037950 1298 40 06 2 352856068 13 1635 + 037951 1298 40 07 2 352856068 14 1635 + 037952 1298 40 08 2 352856068 15 1635 + 037953 1298 41 01 2 353211396 00 1792 + 037954 1298 41 02 2 353211396 01 1792 + 037955 1298 41 03 2 353211396 02 1792 + 037956 1298 41 04 2 353211396 03 1792 + 037957 1298 41 05 2 353211396 04 1792 + 037958 1298 41 06 2 353211396 05 1792 + 037959 1298 41 07 2 353211396 06 1792 + 037960 1298 41 08 2 353211396 07 1792 + 037961 1298 42 01 2 353211396 08 1792 + 037962 1298 42 02 2 353211396 09 1792 + 037963 1298 42 03 2 353211396 10 1792 + 037964 1298 42 04 2 353211396 11 1792 + 037965 1298 42 05 2 353211396 12 1792 + 037966 1298 42 06 2 353211396 13 1792 + 037967 1298 42 07 2 353211396 14 1792 + 037968 1298 42 08 2 353211396 15 1792 + 037969 1298 43 01 2 353212420 00 1793 + 037970 1298 43 02 2 353212420 01 1793 + 037971 1298 43 03 2 353212420 02 1793 + 037972 1298 43 04 2 353212420 03 1793 + 037973 1298 43 05 2 353212420 04 1793 + 037974 1298 43 06 2 353212420 05 1793 + 037975 1298 43 07 2 353212420 06 1793 + 037976 1298 43 08 2 353212420 07 1793 + 037977 1298 44 01 2 353212420 08 1793 + 037978 1298 44 02 2 353212420 09 1793 + 037979 1298 44 03 2 353212420 10 1793 + 037980 1298 44 04 2 353212420 11 1793 + 037981 1298 44 05 2 353212420 12 1793 + 037982 1298 44 06 2 353212420 13 1793 + 037983 1298 44 07 2 353212420 14 1793 + 037984 1298 44 08 2 353212420 15 1793 + 037985 1298 45 01 2 353117188 00 1746 + 037986 1298 45 02 2 353117188 01 1746 + 037987 1298 45 03 2 353117188 02 1746 + 037988 1298 45 04 2 353117188 03 1746 + 037989 1298 45 05 2 353117188 04 1746 + 037990 1298 45 06 2 353117188 05 1746 + 037991 1298 45 07 2 353117188 06 1746 + 037992 1298 45 08 2 353117188 07 1746 + 037993 1298 46 01 2 353117188 08 1746 + 037994 1298 46 02 2 353117188 09 1746 + 037995 1298 46 03 2 353117188 10 1746 + 037996 1298 46 04 2 353117188 11 1746 + 037997 1298 46 05 2 353117188 12 1746 + 037998 1298 46 06 2 353117188 13 1746 + 037999 1298 46 07 2 353117188 14 1746 + 038000 1298 46 08 2 353117188 15 1746 + 038001 1298 47 01 2 353118212 00 1747 + 038002 1298 47 02 2 353118212 01 1747 + 038003 1298 47 03 2 353118212 02 1747 + 038004 1298 47 04 2 353118212 03 1747 + 038005 1298 47 05 2 353118212 04 1747 + 038006 1298 47 06 2 353118212 05 1747 + 038007 1298 47 07 2 353118212 06 1747 + 038008 1298 47 08 2 353118212 07 1747 + 038009 1298 48 01 2 353118212 08 1747 + 038010 1298 48 02 2 353118212 09 1747 + 038011 1298 48 03 2 353118212 10 1747 + 038012 1298 48 04 2 353118212 11 1747 + 038013 1298 48 05 2 353118212 12 1747 + 038014 1298 48 06 2 353118212 13 1747 + 038015 1298 48 07 2 353118212 14 1747 + 038016 1298 48 08 2 353118212 15 1747 + 038017 1299 01 01 2 352683012 00 1566 + 038018 1299 01 02 2 352683012 01 1566 + 038019 1299 01 03 2 352683012 02 1566 + 038020 1299 01 04 2 352683012 03 1566 + 038021 1299 01 05 2 352683012 04 1566 + 038022 1299 01 06 2 352683012 05 1566 + 038023 1299 01 07 2 352683012 06 1566 + 038024 1299 01 08 2 352683012 07 1566 + 038025 1299 02 01 2 352683012 08 1566 + 038026 1299 02 02 2 352683012 09 1566 + 038027 1299 02 03 2 352683012 10 1566 + 038028 1299 02 04 2 352683012 11 1566 + 038029 1299 02 05 2 352683012 12 1566 + 038030 1299 02 06 2 352683012 13 1566 + 038031 1299 02 07 2 352683012 14 1566 + 038032 1299 02 08 2 352683012 15 1566 + 038033 1299 03 01 2 352684036 00 1567 + 038034 1299 03 02 2 352684036 01 1567 + 038035 1299 03 03 2 352684036 02 1567 + 038036 1299 03 04 2 352684036 03 1567 + 038037 1299 03 05 2 352684036 04 1567 + 038038 1299 03 06 2 352684036 05 1567 + 038039 1299 03 07 2 352684036 06 1567 + 038040 1299 03 08 2 352684036 07 1567 + 038041 1299 04 01 2 352684036 08 1567 + 038042 1299 04 02 2 352684036 09 1567 + 038043 1299 04 03 2 352684036 10 1567 + 038044 1299 04 04 2 352684036 11 1567 + 038045 1299 04 05 2 352684036 12 1567 + 038046 1299 04 06 2 352684036 13 1567 + 038047 1299 04 07 2 352684036 14 1567 + 038048 1299 04 08 2 352684036 15 1567 + 038049 1299 05 01 2 352588804 00 1520 + 038050 1299 05 02 2 352588804 01 1520 + 038051 1299 05 03 2 352588804 02 1520 + 038052 1299 05 04 2 352588804 03 1520 + 038053 1299 05 05 2 352588804 04 1520 + 038054 1299 05 06 2 352588804 05 1520 + 038055 1299 05 07 2 352588804 06 1520 + 038056 1299 05 08 2 352588804 07 1520 + 038057 1299 06 01 2 352588804 08 1520 + 038058 1299 06 02 2 352588804 09 1520 + 038059 1299 06 03 2 352588804 10 1520 + 038060 1299 06 04 2 352588804 11 1520 + 038061 1299 06 05 2 352588804 12 1520 + 038062 1299 06 06 2 352588804 13 1520 + 038063 1299 06 07 2 352588804 14 1520 + 038064 1299 06 08 2 352588804 15 1520 + 038065 1299 07 01 2 352589828 00 1521 + 038066 1299 07 02 2 352589828 01 1521 + 038067 1299 07 03 2 352589828 02 1521 + 038068 1299 07 04 2 352589828 03 1521 + 038069 1299 07 05 2 352589828 04 1521 + 038070 1299 07 06 2 352589828 05 1521 + 038071 1299 07 07 2 352589828 06 1521 + 038072 1299 07 08 2 352589828 07 1521 + 038073 1299 08 01 2 352589828 08 1521 + 038074 1299 08 02 2 352589828 09 1521 + 038075 1299 08 03 2 352589828 10 1521 + 038076 1299 08 04 2 352589828 11 1521 + 038077 1299 08 05 2 352589828 12 1521 + 038078 1299 08 06 2 352589828 13 1521 + 038079 1299 08 07 2 352589828 14 1521 + 038080 1299 08 08 2 352589828 15 1521 + 038081 1299 09 01 2 352945156 00 1678 + 038082 1299 09 02 2 352945156 01 1678 + 038083 1299 09 03 2 352945156 02 1678 + 038084 1299 09 04 2 352945156 03 1678 + 038085 1299 09 05 2 352945156 04 1678 + 038086 1299 09 06 2 352945156 05 1678 + 038087 1299 09 07 2 352945156 06 1678 + 038088 1299 09 08 2 352945156 07 1678 + 038089 1299 10 01 2 352945156 08 1678 + 038090 1299 10 02 2 352945156 09 1678 + 038091 1299 10 03 2 352945156 10 1678 + 038092 1299 10 04 2 352945156 11 1678 + 038093 1299 10 05 2 352945156 12 1678 + 038094 1299 10 06 2 352945156 13 1678 + 038095 1299 10 07 2 352945156 14 1678 + 038096 1299 10 08 2 352945156 15 1678 + 038097 1299 11 01 2 352946180 00 1679 + 038098 1299 11 02 2 352946180 01 1679 + 038099 1299 11 03 2 352946180 02 1679 + 038100 1299 11 04 2 352946180 03 1679 + 038101 1299 11 05 2 352946180 04 1679 + 038102 1299 11 06 2 352946180 05 1679 + 038103 1299 11 07 2 352946180 06 1679 + 038104 1299 11 08 2 352946180 07 1679 + 038105 1299 12 01 2 352946180 08 1679 + 038106 1299 12 02 2 352946180 09 1679 + 038107 1299 12 03 2 352946180 10 1679 + 038108 1299 12 04 2 352946180 11 1679 + 038109 1299 12 05 2 352946180 12 1679 + 038110 1299 12 06 2 352946180 13 1679 + 038111 1299 12 07 2 352946180 14 1679 + 038112 1299 12 08 2 352946180 15 1679 + 038113 1299 13 01 2 352850948 00 1632 + 038114 1299 13 02 2 352850948 01 1632 + 038115 1299 13 03 2 352850948 02 1632 + 038116 1299 13 04 2 352850948 03 1632 + 038117 1299 13 05 2 352850948 04 1632 + 038118 1299 13 06 2 352850948 05 1632 + 038119 1299 13 07 2 352850948 06 1632 + 038120 1299 13 08 2 352850948 07 1632 + 038121 1299 14 01 2 352850948 08 1632 + 038122 1299 14 02 2 352850948 09 1632 + 038123 1299 14 03 2 352850948 10 1632 + 038124 1299 14 04 2 352850948 11 1632 + 038125 1299 14 05 2 352850948 12 1632 + 038126 1299 14 06 2 352850948 13 1632 + 038127 1299 14 07 2 352850948 14 1632 + 038128 1299 14 08 2 352850948 15 1632 + 038129 1299 15 01 2 352851972 00 1633 + 038130 1299 15 02 2 352851972 01 1633 + 038131 1299 15 03 2 352851972 02 1633 + 038132 1299 15 04 2 352851972 03 1633 + 038133 1299 15 05 2 352851972 04 1633 + 038134 1299 15 06 2 352851972 05 1633 + 038135 1299 15 07 2 352851972 06 1633 + 038136 1299 15 08 2 352851972 07 1633 + 038137 1299 16 01 2 352851972 08 1633 + 038138 1299 16 02 2 352851972 09 1633 + 038139 1299 16 03 2 352851972 10 1633 + 038140 1299 16 04 2 352851972 11 1633 + 038141 1299 16 05 2 352851972 12 1633 + 038142 1299 16 06 2 352851972 13 1633 + 038143 1299 16 07 2 352851972 14 1633 + 038144 1299 16 08 2 352851972 15 1633 + 038145 1299 17 01 2 353207300 00 1790 + 038146 1299 17 02 2 353207300 01 1790 + 038147 1299 17 03 2 353207300 02 1790 + 038148 1299 17 04 2 353207300 03 1790 + 038149 1299 17 05 2 353207300 04 1790 + 038150 1299 17 06 2 353207300 05 1790 + 038151 1299 17 07 2 353207300 06 1790 + 038152 1299 17 08 2 353207300 07 1790 + 038153 1299 18 01 2 353207300 08 1790 + 038154 1299 18 02 2 353207300 09 1790 + 038155 1299 18 03 2 353207300 10 1790 + 038156 1299 18 04 2 353207300 11 1790 + 038157 1299 18 05 2 353207300 12 1790 + 038158 1299 18 06 2 353207300 13 1790 + 038159 1299 18 07 2 353207300 14 1790 + 038160 1299 18 08 2 353207300 15 1790 + 038161 1299 19 01 2 353208324 00 1791 + 038162 1299 19 02 2 353208324 01 1791 + 038163 1299 19 03 2 353208324 02 1791 + 038164 1299 19 04 2 353208324 03 1791 + 038165 1299 19 05 2 353208324 04 1791 + 038166 1299 19 06 2 353208324 05 1791 + 038167 1299 19 07 2 353208324 06 1791 + 038168 1299 19 08 2 353208324 07 1791 + 038169 1299 20 01 2 353208324 08 1791 + 038170 1299 20 02 2 353208324 09 1791 + 038171 1299 20 03 2 353208324 10 1791 + 038172 1299 20 04 2 353208324 11 1791 + 038173 1299 20 05 2 353208324 12 1791 + 038174 1299 20 06 2 353208324 13 1791 + 038175 1299 20 07 2 353208324 14 1791 + 038176 1299 20 08 2 353208324 15 1791 + 038177 1299 21 01 2 353113092 00 1744 + 038178 1299 21 02 2 353113092 01 1744 + 038179 1299 21 03 2 353113092 02 1744 + 038180 1299 21 04 2 353113092 03 1744 + 038181 1299 21 05 2 353113092 04 1744 + 038182 1299 21 06 2 353113092 05 1744 + 038183 1299 21 07 2 353113092 06 1744 + 038184 1299 21 08 2 353113092 07 1744 + 038185 1299 22 01 2 353113092 08 1744 + 038186 1299 22 02 2 353113092 09 1744 + 038187 1299 22 03 2 353113092 10 1744 + 038188 1299 22 04 2 353113092 11 1744 + 038189 1299 22 05 2 353113092 12 1744 + 038190 1299 22 06 2 353113092 13 1744 + 038191 1299 22 07 2 353113092 14 1744 + 038192 1299 22 08 2 353113092 15 1744 + 038193 1299 23 01 2 353114116 00 1745 + 038194 1299 23 02 2 353114116 01 1745 + 038195 1299 23 03 2 353114116 02 1745 + 038196 1299 23 04 2 353114116 03 1745 + 038197 1299 23 05 2 353114116 04 1745 + 038198 1299 23 06 2 353114116 05 1745 + 038199 1299 23 07 2 353114116 06 1745 + 038200 1299 23 08 2 353114116 07 1745 + 038201 1299 24 01 2 353114116 08 1745 + 038202 1299 24 02 2 353114116 09 1745 + 038203 1299 24 03 2 353114116 10 1745 + 038204 1299 24 04 2 353114116 11 1745 + 038205 1299 24 05 2 353114116 12 1745 + 038206 1299 24 06 2 353114116 13 1745 + 038207 1299 24 07 2 353114116 14 1745 + 038208 1299 24 08 2 353114116 15 1745 + 038209 1299 25 01 2 352674820 00 1562 + 038210 1299 25 02 2 352674820 01 1562 + 038211 1299 25 03 2 352674820 02 1562 + 038212 1299 25 04 2 352674820 03 1562 + 038213 1299 25 05 2 352674820 04 1562 + 038214 1299 25 06 2 352674820 05 1562 + 038215 1299 25 07 2 352674820 06 1562 + 038216 1299 25 08 2 352674820 07 1562 + 038217 1299 26 01 2 352674820 08 1562 + 038218 1299 26 02 2 352674820 09 1562 + 038219 1299 26 03 2 352674820 10 1562 + 038220 1299 26 04 2 352674820 11 1562 + 038221 1299 26 05 2 352674820 12 1562 + 038222 1299 26 06 2 352674820 13 1562 + 038223 1299 26 07 2 352674820 14 1562 + 038224 1299 26 08 2 352674820 15 1562 + 038225 1299 27 01 2 352675844 00 1563 + 038226 1299 27 02 2 352675844 01 1563 + 038227 1299 27 03 2 352675844 02 1563 + 038228 1299 27 04 2 352675844 03 1563 + 038229 1299 27 05 2 352675844 04 1563 + 038230 1299 27 06 2 352675844 05 1563 + 038231 1299 27 07 2 352675844 06 1563 + 038232 1299 27 08 2 352675844 07 1563 + 038233 1299 28 01 2 352675844 08 1563 + 038234 1299 28 02 2 352675844 09 1563 + 038235 1299 28 03 2 352675844 10 1563 + 038236 1299 28 04 2 352675844 11 1563 + 038237 1299 28 05 2 352675844 12 1563 + 038238 1299 28 06 2 352675844 13 1563 + 038239 1299 28 07 2 352675844 14 1563 + 038240 1299 28 08 2 352675844 15 1563 + 038241 1299 29 01 2 352678916 00 1564 + 038242 1299 29 02 2 352678916 01 1564 + 038243 1299 29 03 2 352678916 02 1564 + 038244 1299 29 04 2 352678916 03 1564 + 038245 1299 29 05 2 352678916 04 1564 + 038246 1299 29 06 2 352678916 05 1564 + 038247 1299 29 07 2 352678916 06 1564 + 038248 1299 29 08 2 352678916 07 1564 + 038249 1299 30 01 2 352678916 08 1564 + 038250 1299 30 02 2 352678916 09 1564 + 038251 1299 30 03 2 352678916 10 1564 + 038252 1299 30 04 2 352678916 11 1564 + 038253 1299 30 05 2 352678916 12 1564 + 038254 1299 30 06 2 352678916 13 1564 + 038255 1299 30 07 2 352678916 14 1564 + 038256 1299 30 08 2 352678916 15 1564 + 038257 1299 31 01 2 352679940 00 1565 + 038258 1299 31 02 2 352679940 01 1565 + 038259 1299 31 03 2 352679940 02 1565 + 038260 1299 31 04 2 352679940 03 1565 + 038261 1299 31 05 2 352679940 04 1565 + 038262 1299 31 06 2 352679940 05 1565 + 038263 1299 31 07 2 352679940 06 1565 + 038264 1299 31 08 2 352679940 07 1565 + 038265 1299 32 01 2 352679940 08 1565 + 038266 1299 32 02 2 352679940 09 1565 + 038267 1299 32 03 2 352679940 10 1565 + 038268 1299 32 04 2 352679940 11 1565 + 038269 1299 32 05 2 352679940 12 1565 + 038270 1299 32 06 2 352679940 13 1565 + 038271 1299 32 07 2 352679940 14 1565 + 038272 1299 32 08 2 352679940 15 1565 + 038273 1299 33 01 2 352936964 00 1674 + 038274 1299 33 02 2 352936964 01 1674 + 038275 1299 33 03 2 352936964 02 1674 + 038276 1299 33 04 2 352936964 03 1674 + 038277 1299 33 05 2 352936964 04 1674 + 038278 1299 33 06 2 352936964 05 1674 + 038279 1299 33 07 2 352936964 06 1674 + 038280 1299 33 08 2 352936964 07 1674 + 038281 1299 34 01 2 352936964 08 1674 + 038282 1299 34 02 2 352936964 09 1674 + 038283 1299 34 03 2 352936964 10 1674 + 038284 1299 34 04 2 352936964 11 1674 + 038285 1299 34 05 2 352936964 12 1674 + 038286 1299 34 06 2 352936964 13 1674 + 038287 1299 34 07 2 352936964 14 1674 + 038288 1299 34 08 2 352936964 15 1674 + 038289 1299 35 01 2 352937988 00 1675 + 038290 1299 35 02 2 352937988 01 1675 + 038291 1299 35 03 2 352937988 02 1675 + 038292 1299 35 04 2 352937988 03 1675 + 038293 1299 35 05 2 352937988 04 1675 + 038294 1299 35 06 2 352937988 05 1675 + 038295 1299 35 07 2 352937988 06 1675 + 038296 1299 35 08 2 352937988 07 1675 + 038297 1299 36 01 2 352937988 08 1675 + 038298 1299 36 02 2 352937988 09 1675 + 038299 1299 36 03 2 352937988 10 1675 + 038300 1299 36 04 2 352937988 11 1675 + 038301 1299 36 05 2 352937988 12 1675 + 038302 1299 36 06 2 352937988 13 1675 + 038303 1299 36 07 2 352937988 14 1675 + 038304 1299 36 08 2 352937988 15 1675 + 038305 1299 37 01 2 352941060 00 1676 + 038306 1299 37 02 2 352941060 01 1676 + 038307 1299 37 03 2 352941060 02 1676 + 038308 1299 37 04 2 352941060 03 1676 + 038309 1299 37 05 2 352941060 04 1676 + 038310 1299 37 06 2 352941060 05 1676 + 038311 1299 37 07 2 352941060 06 1676 + 038312 1299 37 08 2 352941060 07 1676 + 038313 1299 38 01 2 352941060 08 1676 + 038314 1299 38 02 2 352941060 09 1676 + 038315 1299 38 03 2 352941060 10 1676 + 038316 1299 38 04 2 352941060 11 1676 + 038317 1299 38 05 2 352941060 12 1676 + 038318 1299 38 06 2 352941060 13 1676 + 038319 1299 38 07 2 352941060 14 1676 + 038320 1299 38 08 2 352941060 15 1676 + 038321 1299 39 01 2 352942084 00 1677 + 038322 1299 39 02 2 352942084 01 1677 + 038323 1299 39 03 2 352942084 02 1677 + 038324 1299 39 04 2 352942084 03 1677 + 038325 1299 39 05 2 352942084 04 1677 + 038326 1299 39 06 2 352942084 05 1677 + 038327 1299 39 07 2 352942084 06 1677 + 038328 1299 39 08 2 352942084 07 1677 + 038329 1299 40 01 2 352942084 08 1677 + 038330 1299 40 02 2 352942084 09 1677 + 038331 1299 40 03 2 352942084 10 1677 + 038332 1299 40 04 2 352942084 11 1677 + 038333 1299 40 05 2 352942084 12 1677 + 038334 1299 40 06 2 352942084 13 1677 + 038335 1299 40 07 2 352942084 14 1677 + 038336 1299 40 08 2 352942084 15 1677 + 038337 1299 41 01 2 353199108 00 1786 + 038338 1299 41 02 2 353199108 01 1786 + 038339 1299 41 03 2 353199108 02 1786 + 038340 1299 41 04 2 353199108 03 1786 + 038341 1299 41 05 2 353199108 04 1786 + 038342 1299 41 06 2 353199108 05 1786 + 038343 1299 41 07 2 353199108 06 1786 + 038344 1299 41 08 2 353199108 07 1786 + 038345 1299 42 01 2 353199108 08 1786 + 038346 1299 42 02 2 353199108 09 1786 + 038347 1299 42 03 2 353199108 10 1786 + 038348 1299 42 04 2 353199108 11 1786 + 038349 1299 42 05 2 353199108 12 1786 + 038350 1299 42 06 2 353199108 13 1786 + 038351 1299 42 07 2 353199108 14 1786 + 038352 1299 42 08 2 353199108 15 1786 + 038353 1299 43 01 2 353200132 00 1787 + 038354 1299 43 02 2 353200132 01 1787 + 038355 1299 43 03 2 353200132 02 1787 + 038356 1299 43 04 2 353200132 03 1787 + 038357 1299 43 05 2 353200132 04 1787 + 038358 1299 43 06 2 353200132 05 1787 + 038359 1299 43 07 2 353200132 06 1787 + 038360 1299 43 08 2 353200132 07 1787 + 038361 1299 44 01 2 353200132 08 1787 + 038362 1299 44 02 2 353200132 09 1787 + 038363 1299 44 03 2 353200132 10 1787 + 038364 1299 44 04 2 353200132 11 1787 + 038365 1299 44 05 2 353200132 12 1787 + 038366 1299 44 06 2 353200132 13 1787 + 038367 1299 44 07 2 353200132 14 1787 + 038368 1299 44 08 2 353200132 15 1787 + 038369 1299 45 01 2 353203204 00 1788 + 038370 1299 45 02 2 353203204 01 1788 + 038371 1299 45 03 2 353203204 02 1788 + 038372 1299 45 04 2 353203204 03 1788 + 038373 1299 45 05 2 353203204 04 1788 + 038374 1299 45 06 2 353203204 05 1788 + 038375 1299 45 07 2 353203204 06 1788 + 038376 1299 45 08 2 353203204 07 1788 + 038377 1299 46 01 2 353203204 08 1788 + 038378 1299 46 02 2 353203204 09 1788 + 038379 1299 46 03 2 353203204 10 1788 + 038380 1299 46 04 2 353203204 11 1788 + 038381 1299 46 05 2 353203204 12 1788 + 038382 1299 46 06 2 353203204 13 1788 + 038383 1299 46 07 2 353203204 14 1788 + 038384 1299 46 08 2 353203204 15 1788 + 038385 1299 47 01 2 353204228 00 1789 + 038386 1299 47 02 2 353204228 01 1789 + 038387 1299 47 03 2 353204228 02 1789 + 038388 1299 47 04 2 353204228 03 1789 + 038389 1299 47 05 2 353204228 04 1789 + 038390 1299 47 06 2 353204228 05 1789 + 038391 1299 47 07 2 353204228 06 1789 + 038392 1299 47 08 2 353204228 07 1789 + 038393 1299 48 01 2 353204228 08 1789 + 038394 1299 48 02 2 353204228 09 1789 + 038395 1299 48 03 2 353204228 10 1789 + 038396 1299 48 04 2 353204228 11 1789 + 038397 1299 48 05 2 353204228 12 1789 + 038398 1299 48 06 2 353204228 13 1789 + 038399 1299 48 07 2 353204228 14 1789 + 038400 1299 48 08 2 353204228 15 1789 + 038401 1300 01 01 2 352809988 00 1628 + 038402 1300 01 02 2 352809988 01 1628 + 038403 1300 01 03 2 352809988 02 1628 + 038404 1300 01 04 2 352809988 03 1628 + 038405 1300 01 05 2 352809988 04 1628 + 038406 1300 01 06 2 352809988 05 1628 + 038407 1300 01 07 2 352809988 06 1628 + 038408 1300 01 08 2 352809988 07 1628 + 038409 1300 02 01 2 352809988 08 1628 + 038410 1300 02 02 2 352809988 09 1628 + 038411 1300 02 03 2 352809988 10 1628 + 038412 1300 02 04 2 352809988 11 1628 + 038413 1300 02 05 2 352809988 12 1628 + 038414 1300 02 06 2 352809988 13 1628 + 038415 1300 02 07 2 352809988 14 1628 + 038416 1300 02 08 2 352809988 15 1628 + 038417 1300 03 01 2 352811012 00 1629 + 038418 1300 03 02 2 352811012 01 1629 + 038419 1300 03 03 2 352811012 02 1629 + 038420 1300 03 04 2 352811012 03 1629 + 038421 1300 03 05 2 352811012 04 1629 + 038422 1300 03 06 2 352811012 05 1629 + 038423 1300 03 07 2 352811012 06 1629 + 038424 1300 03 08 2 352811012 07 1629 + 038425 1300 04 01 2 352811012 08 1629 + 038426 1300 04 02 2 352811012 09 1629 + 038427 1300 04 03 2 352811012 10 1629 + 038428 1300 04 04 2 352811012 11 1629 + 038429 1300 04 05 2 352811012 12 1629 + 038430 1300 04 06 2 352811012 13 1629 + 038431 1300 04 07 2 352811012 14 1629 + 038432 1300 04 08 2 352811012 15 1629 + 038433 1300 05 01 2 352814084 00 1630 + 038434 1300 05 02 2 352814084 01 1630 + 038435 1300 05 03 2 352814084 02 1630 + 038436 1300 05 04 2 352814084 03 1630 + 038437 1300 05 05 2 352814084 04 1630 + 038438 1300 05 06 2 352814084 05 1630 + 038439 1300 05 07 2 352814084 06 1630 + 038440 1300 05 08 2 352814084 07 1630 + 038441 1300 06 01 2 352814084 08 1630 + 038442 1300 06 02 2 352814084 09 1630 + 038443 1300 06 03 2 352814084 10 1630 + 038444 1300 06 04 2 352814084 11 1630 + 038445 1300 06 05 2 352814084 12 1630 + 038446 1300 06 06 2 352814084 13 1630 + 038447 1300 06 07 2 352814084 14 1630 + 038448 1300 06 08 2 352814084 15 1630 + 038449 1300 07 01 2 352815108 00 1631 + 038450 1300 07 02 2 352815108 01 1631 + 038451 1300 07 03 2 352815108 02 1631 + 038452 1300 07 04 2 352815108 03 1631 + 038453 1300 07 05 2 352815108 04 1631 + 038454 1300 07 06 2 352815108 05 1631 + 038455 1300 07 07 2 352815108 06 1631 + 038456 1300 07 08 2 352815108 07 1631 + 038457 1300 08 01 2 352815108 08 1631 + 038458 1300 08 02 2 352815108 09 1631 + 038459 1300 08 03 2 352815108 10 1631 + 038460 1300 08 04 2 352815108 11 1631 + 038461 1300 08 05 2 352815108 12 1631 + 038462 1300 08 06 2 352815108 13 1631 + 038463 1300 08 07 2 352815108 14 1631 + 038464 1300 08 08 2 352815108 15 1631 + 038465 1300 09 01 2 353072132 00 1740 + 038466 1300 09 02 2 353072132 01 1740 + 038467 1300 09 03 2 353072132 02 1740 + 038468 1300 09 04 2 353072132 03 1740 + 038469 1300 09 05 2 353072132 04 1740 + 038470 1300 09 06 2 353072132 05 1740 + 038471 1300 09 07 2 353072132 06 1740 + 038472 1300 09 08 2 353072132 07 1740 + 038473 1300 10 01 2 353072132 08 1740 + 038474 1300 10 02 2 353072132 09 1740 + 038475 1300 10 03 2 353072132 10 1740 + 038476 1300 10 04 2 353072132 11 1740 + 038477 1300 10 05 2 353072132 12 1740 + 038478 1300 10 06 2 353072132 13 1740 + 038479 1300 10 07 2 353072132 14 1740 + 038480 1300 10 08 2 353072132 15 1740 + 038481 1300 11 01 2 353073156 00 1741 + 038482 1300 11 02 2 353073156 01 1741 + 038483 1300 11 03 2 353073156 02 1741 + 038484 1300 11 04 2 353073156 03 1741 + 038485 1300 11 05 2 353073156 04 1741 + 038486 1300 11 06 2 353073156 05 1741 + 038487 1300 11 07 2 353073156 06 1741 + 038488 1300 11 08 2 353073156 07 1741 + 038489 1300 12 01 2 353073156 08 1741 + 038490 1300 12 02 2 353073156 09 1741 + 038491 1300 12 03 2 353073156 10 1741 + 038492 1300 12 04 2 353073156 11 1741 + 038493 1300 12 05 2 353073156 12 1741 + 038494 1300 12 06 2 353073156 13 1741 + 038495 1300 12 07 2 353073156 14 1741 + 038496 1300 12 08 2 353073156 15 1741 + 038497 1300 13 01 2 353076228 00 1742 + 038498 1300 13 02 2 353076228 01 1742 + 038499 1300 13 03 2 353076228 02 1742 + 038500 1300 13 04 2 353076228 03 1742 + 038501 1300 13 05 2 353076228 04 1742 + 038502 1300 13 06 2 353076228 05 1742 + 038503 1300 13 07 2 353076228 06 1742 + 038504 1300 13 08 2 353076228 07 1742 + 038505 1300 14 01 2 353076228 08 1742 + 038506 1300 14 02 2 353076228 09 1742 + 038507 1300 14 03 2 353076228 10 1742 + 038508 1300 14 04 2 353076228 11 1742 + 038509 1300 14 05 2 353076228 12 1742 + 038510 1300 14 06 2 353076228 13 1742 + 038511 1300 14 07 2 353076228 14 1742 + 038512 1300 14 08 2 353076228 15 1742 + 038513 1300 15 01 2 353077252 00 1743 + 038514 1300 15 02 2 353077252 01 1743 + 038515 1300 15 03 2 353077252 02 1743 + 038516 1300 15 04 2 353077252 03 1743 + 038517 1300 15 05 2 353077252 04 1743 + 038518 1300 15 06 2 353077252 05 1743 + 038519 1300 15 07 2 353077252 06 1743 + 038520 1300 15 08 2 353077252 07 1743 + 038521 1300 16 01 2 353077252 08 1743 + 038522 1300 16 02 2 353077252 09 1743 + 038523 1300 16 03 2 353077252 10 1743 + 038524 1300 16 04 2 353077252 11 1743 + 038525 1300 16 05 2 353077252 12 1743 + 038526 1300 16 06 2 353077252 13 1743 + 038527 1300 16 07 2 353077252 14 1743 + 038528 1300 16 08 2 353077252 15 1743 + 038529 1300 17 01 2 353334276 00 1852 + 038530 1300 17 02 2 353334276 01 1852 + 038531 1300 17 03 2 353334276 02 1852 + 038532 1300 17 04 2 353334276 03 1852 + 038533 1300 17 05 2 353334276 04 1852 + 038534 1300 17 06 2 353334276 05 1852 + 038535 1300 17 07 2 353334276 06 1852 + 038536 1300 17 08 2 353334276 07 1852 + 038537 1300 18 01 2 353334276 08 1852 + 038538 1300 18 02 2 353334276 09 1852 + 038539 1300 18 03 2 353334276 10 1852 + 038540 1300 18 04 2 353334276 11 1852 + 038541 1300 18 05 2 353334276 12 1852 + 038542 1300 18 06 2 353334276 13 1852 + 038543 1300 18 07 2 353334276 14 1852 + 038544 1300 18 08 2 353334276 15 1852 + 038545 1300 19 01 2 353335300 00 1853 + 038546 1300 19 02 2 353335300 01 1853 + 038547 1300 19 03 2 353335300 02 1853 + 038548 1300 19 04 2 353335300 03 1853 + 038549 1300 19 05 2 353335300 04 1853 + 038550 1300 19 06 2 353335300 05 1853 + 038551 1300 19 07 2 353335300 06 1853 + 038552 1300 19 08 2 353335300 07 1853 + 038553 1300 20 01 2 353335300 08 1853 + 038554 1300 20 02 2 353335300 09 1853 + 038555 1300 20 03 2 353335300 10 1853 + 038556 1300 20 04 2 353335300 11 1853 + 038557 1300 20 05 2 353335300 12 1853 + 038558 1300 20 06 2 353335300 13 1853 + 038559 1300 20 07 2 353335300 14 1853 + 038560 1300 20 08 2 353335300 15 1853 + 038561 1300 21 01 2 353338372 00 1854 + 038562 1300 21 02 2 353338372 01 1854 + 038563 1300 21 03 2 353338372 02 1854 + 038564 1300 21 04 2 353338372 03 1854 + 038565 1300 21 05 2 353338372 04 1854 + 038566 1300 21 06 2 353338372 05 1854 + 038567 1300 21 07 2 353338372 06 1854 + 038568 1300 21 08 2 353338372 07 1854 + 038569 1300 22 01 2 353338372 08 1854 + 038570 1300 22 02 2 353338372 09 1854 + 038571 1300 22 03 2 353338372 10 1854 + 038572 1300 22 04 2 353338372 11 1854 + 038573 1300 22 05 2 353338372 12 1854 + 038574 1300 22 06 2 353338372 13 1854 + 038575 1300 22 07 2 353338372 14 1854 + 038576 1300 22 08 2 353338372 15 1854 + 038577 1300 23 01 2 353339396 00 1855 + 038578 1300 23 02 2 353339396 01 1855 + 038579 1300 23 03 2 353339396 02 1855 + 038580 1300 23 04 2 353339396 03 1855 + 038581 1300 23 05 2 353339396 04 1855 + 038582 1300 23 06 2 353339396 05 1855 + 038583 1300 23 07 2 353339396 06 1855 + 038584 1300 23 08 2 353339396 07 1855 + 038585 1300 24 01 2 353339396 08 1855 + 038586 1300 24 02 2 353339396 09 1855 + 038587 1300 24 03 2 353339396 10 1855 + 038588 1300 24 04 2 353339396 11 1855 + 038589 1300 24 05 2 353339396 12 1855 + 038590 1300 24 06 2 353339396 13 1855 + 038591 1300 24 07 2 353339396 14 1855 + 038592 1300 24 08 2 353339396 15 1855 + 038593 1300 25 01 2 352670724 00 1560 + 038594 1300 25 02 2 352670724 01 1560 + 038595 1300 25 03 2 352670724 02 1560 + 038596 1300 25 04 2 352670724 03 1560 + 038597 1300 25 05 2 352670724 04 1560 + 038598 1300 25 06 2 352670724 05 1560 + 038599 1300 25 07 2 352670724 06 1560 + 038600 1300 25 08 2 352670724 07 1560 + 038601 1300 26 01 2 352670724 08 1560 + 038602 1300 26 02 2 352670724 09 1560 + 038603 1300 26 03 2 352670724 10 1560 + 038604 1300 26 04 2 352670724 11 1560 + 038605 1300 26 05 2 352670724 12 1560 + 038606 1300 26 06 2 352670724 13 1560 + 038607 1300 26 07 2 352670724 14 1560 + 038608 1300 26 08 2 352670724 15 1560 + 038609 1300 27 01 2 352671748 00 1561 + 038610 1300 27 02 2 352671748 01 1561 + 038611 1300 27 03 2 352671748 02 1561 + 038612 1300 27 04 2 352671748 03 1561 + 038613 1300 27 05 2 352671748 04 1561 + 038614 1300 27 06 2 352671748 05 1561 + 038615 1300 27 07 2 352671748 06 1561 + 038616 1300 27 08 2 352671748 07 1561 + 038617 1300 28 01 2 352671748 08 1561 + 038618 1300 28 02 2 352671748 09 1561 + 038619 1300 28 03 2 352671748 10 1561 + 038620 1300 28 04 2 352671748 11 1561 + 038621 1300 28 05 2 352671748 12 1561 + 038622 1300 28 06 2 352671748 13 1561 + 038623 1300 28 07 2 352671748 14 1561 + 038624 1300 28 08 2 352671748 15 1561 + 038625 1300 29 01 2 352805892 00 1626 + 038626 1300 29 02 2 352805892 01 1626 + 038627 1300 29 03 2 352805892 02 1626 + 038628 1300 29 04 2 352805892 03 1626 + 038629 1300 29 05 2 352805892 04 1626 + 038630 1300 29 06 2 352805892 05 1626 + 038631 1300 29 07 2 352805892 06 1626 + 038632 1300 29 08 2 352805892 07 1626 + 038633 1300 30 01 2 352805892 08 1626 + 038634 1300 30 02 2 352805892 09 1626 + 038635 1300 30 03 2 352805892 10 1626 + 038636 1300 30 04 2 352805892 11 1626 + 038637 1300 30 05 2 352805892 12 1626 + 038638 1300 30 06 2 352805892 13 1626 + 038639 1300 30 07 2 352805892 14 1626 + 038640 1300 30 08 2 352805892 15 1626 + 038641 1300 31 01 2 352806916 00 1627 + 038642 1300 31 02 2 352806916 01 1627 + 038643 1300 31 03 2 352806916 02 1627 + 038644 1300 31 04 2 352806916 03 1627 + 038645 1300 31 05 2 352806916 04 1627 + 038646 1300 31 06 2 352806916 05 1627 + 038647 1300 31 07 2 352806916 06 1627 + 038648 1300 31 08 2 352806916 07 1627 + 038649 1300 32 01 2 352806916 08 1627 + 038650 1300 32 02 2 352806916 09 1627 + 038651 1300 32 03 2 352806916 10 1627 + 038652 1300 32 04 2 352806916 11 1627 + 038653 1300 32 05 2 352806916 12 1627 + 038654 1300 32 06 2 352806916 13 1627 + 038655 1300 32 07 2 352806916 14 1627 + 038656 1300 32 08 2 352806916 15 1627 + 038657 1300 33 01 2 352932868 00 1672 + 038658 1300 33 02 2 352932868 01 1672 + 038659 1300 33 03 2 352932868 02 1672 + 038660 1300 33 04 2 352932868 03 1672 + 038661 1300 33 05 2 352932868 04 1672 + 038662 1300 33 06 2 352932868 05 1672 + 038663 1300 33 07 2 352932868 06 1672 + 038664 1300 33 08 2 352932868 07 1672 + 038665 1300 34 01 2 352932868 08 1672 + 038666 1300 34 02 2 352932868 09 1672 + 038667 1300 34 03 2 352932868 10 1672 + 038668 1300 34 04 2 352932868 11 1672 + 038669 1300 34 05 2 352932868 12 1672 + 038670 1300 34 06 2 352932868 13 1672 + 038671 1300 34 07 2 352932868 14 1672 + 038672 1300 34 08 2 352932868 15 1672 + 038673 1300 35 01 2 352933892 00 1673 + 038674 1300 35 02 2 352933892 01 1673 + 038675 1300 35 03 2 352933892 02 1673 + 038676 1300 35 04 2 352933892 03 1673 + 038677 1300 35 05 2 352933892 04 1673 + 038678 1300 35 06 2 352933892 05 1673 + 038679 1300 35 07 2 352933892 06 1673 + 038680 1300 35 08 2 352933892 07 1673 + 038681 1300 36 01 2 352933892 08 1673 + 038682 1300 36 02 2 352933892 09 1673 + 038683 1300 36 03 2 352933892 10 1673 + 038684 1300 36 04 2 352933892 11 1673 + 038685 1300 36 05 2 352933892 12 1673 + 038686 1300 36 06 2 352933892 13 1673 + 038687 1300 36 07 2 352933892 14 1673 + 038688 1300 36 08 2 352933892 15 1673 + 038689 1300 37 01 2 353068036 00 1738 + 038690 1300 37 02 2 353068036 01 1738 + 038691 1300 37 03 2 353068036 02 1738 + 038692 1300 37 04 2 353068036 03 1738 + 038693 1300 37 05 2 353068036 04 1738 + 038694 1300 37 06 2 353068036 05 1738 + 038695 1300 37 07 2 353068036 06 1738 + 038696 1300 37 08 2 353068036 07 1738 + 038697 1300 38 01 2 353068036 08 1738 + 038698 1300 38 02 2 353068036 09 1738 + 038699 1300 38 03 2 353068036 10 1738 + 038700 1300 38 04 2 353068036 11 1738 + 038701 1300 38 05 2 353068036 12 1738 + 038702 1300 38 06 2 353068036 13 1738 + 038703 1300 38 07 2 353068036 14 1738 + 038704 1300 38 08 2 353068036 15 1738 + 038705 1300 39 01 2 353069060 00 1739 + 038706 1300 39 02 2 353069060 01 1739 + 038707 1300 39 03 2 353069060 02 1739 + 038708 1300 39 04 2 353069060 03 1739 + 038709 1300 39 05 2 353069060 04 1739 + 038710 1300 39 06 2 353069060 05 1739 + 038711 1300 39 07 2 353069060 06 1739 + 038712 1300 39 08 2 353069060 07 1739 + 038713 1300 40 01 2 353069060 08 1739 + 038714 1300 40 02 2 353069060 09 1739 + 038715 1300 40 03 2 353069060 10 1739 + 038716 1300 40 04 2 353069060 11 1739 + 038717 1300 40 05 2 353069060 12 1739 + 038718 1300 40 06 2 353069060 13 1739 + 038719 1300 40 07 2 353069060 14 1739 + 038720 1300 40 08 2 353069060 15 1739 + 038721 1300 41 01 2 353195012 00 1784 + 038722 1300 41 02 2 353195012 01 1784 + 038723 1300 41 03 2 353195012 02 1784 + 038724 1300 41 04 2 353195012 03 1784 + 038725 1300 41 05 2 353195012 04 1784 + 038726 1300 41 06 2 353195012 05 1784 + 038727 1300 41 07 2 353195012 06 1784 + 038728 1300 41 08 2 353195012 07 1784 + 038729 1300 42 01 2 353195012 08 1784 + 038730 1300 42 02 2 353195012 09 1784 + 038731 1300 42 03 2 353195012 10 1784 + 038732 1300 42 04 2 353195012 11 1784 + 038733 1300 42 05 2 353195012 12 1784 + 038734 1300 42 06 2 353195012 13 1784 + 038735 1300 42 07 2 353195012 14 1784 + 038736 1300 42 08 2 353195012 15 1784 + 038737 1300 43 01 2 353196036 00 1785 + 038738 1300 43 02 2 353196036 01 1785 + 038739 1300 43 03 2 353196036 02 1785 + 038740 1300 43 04 2 353196036 03 1785 + 038741 1300 43 05 2 353196036 04 1785 + 038742 1300 43 06 2 353196036 05 1785 + 038743 1300 43 07 2 353196036 06 1785 + 038744 1300 43 08 2 353196036 07 1785 + 038745 1300 44 01 2 353196036 08 1785 + 038746 1300 44 02 2 353196036 09 1785 + 038747 1300 44 03 2 353196036 10 1785 + 038748 1300 44 04 2 353196036 11 1785 + 038749 1300 44 05 2 353196036 12 1785 + 038750 1300 44 06 2 353196036 13 1785 + 038751 1300 44 07 2 353196036 14 1785 + 038752 1300 44 08 2 353196036 15 1785 + 038753 1300 45 01 2 353330180 00 1850 + 038754 1300 45 02 2 353330180 01 1850 + 038755 1300 45 03 2 353330180 02 1850 + 038756 1300 45 04 2 353330180 03 1850 + 038757 1300 45 05 2 353330180 04 1850 + 038758 1300 45 06 2 353330180 05 1850 + 038759 1300 45 07 2 353330180 06 1850 + 038760 1300 45 08 2 353330180 07 1850 + 038761 1300 46 01 2 353330180 08 1850 + 038762 1300 46 02 2 353330180 09 1850 + 038763 1300 46 03 2 353330180 10 1850 + 038764 1300 46 04 2 353330180 11 1850 + 038765 1300 46 05 2 353330180 12 1850 + 038766 1300 46 06 2 353330180 13 1850 + 038767 1300 46 07 2 353330180 14 1850 + 038768 1300 46 08 2 353330180 15 1850 + 038769 1300 47 01 2 353331204 00 1851 + 038770 1300 47 02 2 353331204 01 1851 + 038771 1300 47 03 2 353331204 02 1851 + 038772 1300 47 04 2 353331204 03 1851 + 038773 1300 47 05 2 353331204 04 1851 + 038774 1300 47 06 2 353331204 05 1851 + 038775 1300 47 07 2 353331204 06 1851 + 038776 1300 47 08 2 353331204 07 1851 + 038777 1300 48 01 2 353331204 08 1851 + 038778 1300 48 02 2 353331204 09 1851 + 038779 1300 48 03 2 353331204 10 1851 + 038780 1300 48 04 2 353331204 11 1851 + 038781 1300 48 05 2 353331204 12 1851 + 038782 1300 48 06 2 353331204 13 1851 + 038783 1300 48 07 2 353331204 14 1851 + 038784 1300 48 08 2 353331204 15 1851 + 038785 1301 01 01 2 352797700 00 1622 + 038786 1301 01 02 2 352797700 01 1622 + 038787 1301 01 03 2 352797700 02 1622 + 038788 1301 01 04 2 352797700 03 1622 + 038789 1301 01 05 2 352797700 04 1622 + 038790 1301 01 06 2 352797700 05 1622 + 038791 1301 01 07 2 352797700 06 1622 + 038792 1301 01 08 2 352797700 07 1622 + 038793 1301 02 01 2 352797700 08 1622 + 038794 1301 02 02 2 352797700 09 1622 + 038795 1301 02 03 2 352797700 10 1622 + 038796 1301 02 04 2 352797700 11 1622 + 038797 1301 02 05 2 352797700 12 1622 + 038798 1301 02 06 2 352797700 13 1622 + 038799 1301 02 07 2 352797700 14 1622 + 038800 1301 02 08 2 352797700 15 1622 + 038801 1301 03 01 2 352798724 00 1623 + 038802 1301 03 02 2 352798724 01 1623 + 038803 1301 03 03 2 352798724 02 1623 + 038804 1301 03 04 2 352798724 03 1623 + 038805 1301 03 05 2 352798724 04 1623 + 038806 1301 03 06 2 352798724 05 1623 + 038807 1301 03 07 2 352798724 06 1623 + 038808 1301 03 08 2 352798724 07 1623 + 038809 1301 04 01 2 352798724 08 1623 + 038810 1301 04 02 2 352798724 09 1623 + 038811 1301 04 03 2 352798724 10 1623 + 038812 1301 04 04 2 352798724 11 1623 + 038813 1301 04 05 2 352798724 12 1623 + 038814 1301 04 06 2 352798724 13 1623 + 038815 1301 04 07 2 352798724 14 1623 + 038816 1301 04 08 2 352798724 15 1623 + 038817 1301 05 01 2 352801796 00 1624 + 038818 1301 05 02 2 352801796 01 1624 + 038819 1301 05 03 2 352801796 02 1624 + 038820 1301 05 04 2 352801796 03 1624 + 038821 1301 05 05 2 352801796 04 1624 + 038822 1301 05 06 2 352801796 05 1624 + 038823 1301 05 07 2 352801796 06 1624 + 038824 1301 05 08 2 352801796 07 1624 + 038825 1301 06 01 2 352801796 08 1624 + 038826 1301 06 02 2 352801796 09 1624 + 038827 1301 06 03 2 352801796 10 1624 + 038828 1301 06 04 2 352801796 11 1624 + 038829 1301 06 05 2 352801796 12 1624 + 038830 1301 06 06 2 352801796 13 1624 + 038831 1301 06 07 2 352801796 14 1624 + 038832 1301 06 08 2 352801796 15 1624 + 038833 1301 07 01 2 352802820 00 1625 + 038834 1301 07 02 2 352802820 01 1625 + 038835 1301 07 03 2 352802820 02 1625 + 038836 1301 07 04 2 352802820 03 1625 + 038837 1301 07 05 2 352802820 04 1625 + 038838 1301 07 06 2 352802820 05 1625 + 038839 1301 07 07 2 352802820 06 1625 + 038840 1301 07 08 2 352802820 07 1625 + 038841 1301 08 01 2 352802820 08 1625 + 038842 1301 08 02 2 352802820 09 1625 + 038843 1301 08 03 2 352802820 10 1625 + 038844 1301 08 04 2 352802820 11 1625 + 038845 1301 08 05 2 352802820 12 1625 + 038846 1301 08 06 2 352802820 13 1625 + 038847 1301 08 07 2 352802820 14 1625 + 038848 1301 08 08 2 352802820 15 1625 + 038849 1301 09 01 2 353059844 00 1734 + 038850 1301 09 02 2 353059844 01 1734 + 038851 1301 09 03 2 353059844 02 1734 + 038852 1301 09 04 2 353059844 03 1734 + 038853 1301 09 05 2 353059844 04 1734 + 038854 1301 09 06 2 353059844 05 1734 + 038855 1301 09 07 2 353059844 06 1734 + 038856 1301 09 08 2 353059844 07 1734 + 038857 1301 10 01 2 353059844 08 1734 + 038858 1301 10 02 2 353059844 09 1734 + 038859 1301 10 03 2 353059844 10 1734 + 038860 1301 10 04 2 353059844 11 1734 + 038861 1301 10 05 2 353059844 12 1734 + 038862 1301 10 06 2 353059844 13 1734 + 038863 1301 10 07 2 353059844 14 1734 + 038864 1301 10 08 2 353059844 15 1734 + 038865 1301 11 01 2 353060868 00 1735 + 038866 1301 11 02 2 353060868 01 1735 + 038867 1301 11 03 2 353060868 02 1735 + 038868 1301 11 04 2 353060868 03 1735 + 038869 1301 11 05 2 353060868 04 1735 + 038870 1301 11 06 2 353060868 05 1735 + 038871 1301 11 07 2 353060868 06 1735 + 038872 1301 11 08 2 353060868 07 1735 + 038873 1301 12 01 2 353060868 08 1735 + 038874 1301 12 02 2 353060868 09 1735 + 038875 1301 12 03 2 353060868 10 1735 + 038876 1301 12 04 2 353060868 11 1735 + 038877 1301 12 05 2 353060868 12 1735 + 038878 1301 12 06 2 353060868 13 1735 + 038879 1301 12 07 2 353060868 14 1735 + 038880 1301 12 08 2 353060868 15 1735 + 038881 1301 13 01 2 353063940 00 1736 + 038882 1301 13 02 2 353063940 01 1736 + 038883 1301 13 03 2 353063940 02 1736 + 038884 1301 13 04 2 353063940 03 1736 + 038885 1301 13 05 2 353063940 04 1736 + 038886 1301 13 06 2 353063940 05 1736 + 038887 1301 13 07 2 353063940 06 1736 + 038888 1301 13 08 2 353063940 07 1736 + 038889 1301 14 01 2 353063940 08 1736 + 038890 1301 14 02 2 353063940 09 1736 + 038891 1301 14 03 2 353063940 10 1736 + 038892 1301 14 04 2 353063940 11 1736 + 038893 1301 14 05 2 353063940 12 1736 + 038894 1301 14 06 2 353063940 13 1736 + 038895 1301 14 07 2 353063940 14 1736 + 038896 1301 14 08 2 353063940 15 1736 + 038897 1301 15 01 2 353064964 00 1737 + 038898 1301 15 02 2 353064964 01 1737 + 038899 1301 15 03 2 353064964 02 1737 + 038900 1301 15 04 2 353064964 03 1737 + 038901 1301 15 05 2 353064964 04 1737 + 038902 1301 15 06 2 353064964 05 1737 + 038903 1301 15 07 2 353064964 06 1737 + 038904 1301 15 08 2 353064964 07 1737 + 038905 1301 16 01 2 353064964 08 1737 + 038906 1301 16 02 2 353064964 09 1737 + 038907 1301 16 03 2 353064964 10 1737 + 038908 1301 16 04 2 353064964 11 1737 + 038909 1301 16 05 2 353064964 12 1737 + 038910 1301 16 06 2 353064964 13 1737 + 038911 1301 16 07 2 353064964 14 1737 + 038912 1301 16 08 2 353064964 15 1737 + 038913 1301 17 01 2 353321988 00 1846 + 038914 1301 17 02 2 353321988 01 1846 + 038915 1301 17 03 2 353321988 02 1846 + 038916 1301 17 04 2 353321988 03 1846 + 038917 1301 17 05 2 353321988 04 1846 + 038918 1301 17 06 2 353321988 05 1846 + 038919 1301 17 07 2 353321988 06 1846 + 038920 1301 17 08 2 353321988 07 1846 + 038921 1301 18 01 2 353321988 08 1846 + 038922 1301 18 02 2 353321988 09 1846 + 038923 1301 18 03 2 353321988 10 1846 + 038924 1301 18 04 2 353321988 11 1846 + 038925 1301 18 05 2 353321988 12 1846 + 038926 1301 18 06 2 353321988 13 1846 + 038927 1301 18 07 2 353321988 14 1846 + 038928 1301 18 08 2 353321988 15 1846 + 038929 1301 19 01 2 353323012 00 1847 + 038930 1301 19 02 2 353323012 01 1847 + 038931 1301 19 03 2 353323012 02 1847 + 038932 1301 19 04 2 353323012 03 1847 + 038933 1301 19 05 2 353323012 04 1847 + 038934 1301 19 06 2 353323012 05 1847 + 038935 1301 19 07 2 353323012 06 1847 + 038936 1301 19 08 2 353323012 07 1847 + 038937 1301 20 01 2 353323012 08 1847 + 038938 1301 20 02 2 353323012 09 1847 + 038939 1301 20 03 2 353323012 10 1847 + 038940 1301 20 04 2 353323012 11 1847 + 038941 1301 20 05 2 353323012 12 1847 + 038942 1301 20 06 2 353323012 13 1847 + 038943 1301 20 07 2 353323012 14 1847 + 038944 1301 20 08 2 353323012 15 1847 + 038945 1301 21 01 2 353326084 00 1848 + 038946 1301 21 02 2 353326084 01 1848 + 038947 1301 21 03 2 353326084 02 1848 + 038948 1301 21 04 2 353326084 03 1848 + 038949 1301 21 05 2 353326084 04 1848 + 038950 1301 21 06 2 353326084 05 1848 + 038951 1301 21 07 2 353326084 06 1848 + 038952 1301 21 08 2 353326084 07 1848 + 038953 1301 22 01 2 353326084 08 1848 + 038954 1301 22 02 2 353326084 09 1848 + 038955 1301 22 03 2 353326084 10 1848 + 038956 1301 22 04 2 353326084 11 1848 + 038957 1301 22 05 2 353326084 12 1848 + 038958 1301 22 06 2 353326084 13 1848 + 038959 1301 22 07 2 353326084 14 1848 + 038960 1301 22 08 2 353326084 15 1848 + 038961 1301 23 01 2 353327108 00 1849 + 038962 1301 23 02 2 353327108 01 1849 + 038963 1301 23 03 2 353327108 02 1849 + 038964 1301 23 04 2 353327108 03 1849 + 038965 1301 23 05 2 353327108 04 1849 + 038966 1301 23 06 2 353327108 05 1849 + 038967 1301 23 07 2 353327108 06 1849 + 038968 1301 23 08 2 353327108 07 1849 + 038969 1301 24 01 2 353327108 08 1849 + 038970 1301 24 02 2 353327108 09 1849 + 038971 1301 24 03 2 353327108 10 1849 + 038972 1301 24 04 2 353327108 11 1849 + 038973 1301 24 05 2 353327108 12 1849 + 038974 1301 24 06 2 353327108 13 1849 + 038975 1301 24 07 2 353327108 14 1849 + 038976 1301 24 08 2 353327108 15 1849 + 038977 1301 25 01 2 352793604 00 1620 + 038978 1301 25 02 2 352793604 01 1620 + 038979 1301 25 03 2 352793604 02 1620 + 038980 1301 25 04 2 352793604 03 1620 + 038981 1301 25 05 2 352793604 04 1620 + 038982 1301 25 06 2 352793604 05 1620 + 038983 1301 25 07 2 352793604 06 1620 + 038984 1301 25 08 2 352793604 07 1620 + 038985 1301 26 01 2 352793604 08 1620 + 038986 1301 26 02 2 352793604 09 1620 + 038987 1301 26 03 2 352793604 10 1620 + 038988 1301 26 04 2 352793604 11 1620 + 038989 1301 26 05 2 352793604 12 1620 + 038990 1301 26 06 2 352793604 13 1620 + 038991 1301 26 07 2 352793604 14 1620 + 038992 1301 26 08 2 352793604 15 1620 + 038993 1301 27 01 2 352794628 00 1621 + 038994 1301 27 02 2 352794628 01 1621 + 038995 1301 27 03 2 352794628 02 1621 + 038996 1301 27 04 2 352794628 03 1621 + 038997 1301 27 05 2 352794628 04 1621 + 038998 1301 27 06 2 352794628 05 1621 + 038999 1301 27 07 2 352794628 06 1621 + 039000 1301 27 08 2 352794628 07 1621 + 039001 1301 28 01 2 352794628 08 1621 + 039002 1301 28 02 2 352794628 09 1621 + 039003 1301 28 03 2 352794628 10 1621 + 039004 1301 28 04 2 352794628 11 1621 + 039005 1301 28 05 2 352794628 12 1621 + 039006 1301 28 06 2 352794628 13 1621 + 039007 1301 28 07 2 352794628 14 1621 + 039008 1301 28 08 2 352794628 15 1621 + 039009 1301 29 01 2 352666628 00 1558 + 039010 1301 29 02 2 352666628 01 1558 + 039011 1301 29 03 2 352666628 02 1558 + 039012 1301 29 04 2 352666628 03 1558 + 039013 1301 29 05 2 352666628 04 1558 + 039014 1301 29 06 2 352666628 05 1558 + 039015 1301 29 07 2 352666628 06 1558 + 039016 1301 29 08 2 352666628 07 1558 + 039017 1301 30 01 2 352666628 08 1558 + 039018 1301 30 02 2 352666628 09 1558 + 039019 1301 30 03 2 352666628 10 1558 + 039020 1301 30 04 2 352666628 11 1558 + 039021 1301 30 05 2 352666628 12 1558 + 039022 1301 30 06 2 352666628 13 1558 + 039023 1301 30 07 2 352666628 14 1558 + 039024 1301 30 08 2 352666628 15 1558 + 039025 1301 31 01 2 352667652 00 1559 + 039026 1301 31 02 2 352667652 01 1559 + 039027 1301 31 03 2 352667652 02 1559 + 039028 1301 31 04 2 352667652 03 1559 + 039029 1301 31 05 2 352667652 04 1559 + 039030 1301 31 06 2 352667652 05 1559 + 039031 1301 31 07 2 352667652 06 1559 + 039032 1301 31 08 2 352667652 07 1559 + 039033 1301 32 01 2 352667652 08 1559 + 039034 1301 32 02 2 352667652 09 1559 + 039035 1301 32 03 2 352667652 10 1559 + 039036 1301 32 04 2 352667652 11 1559 + 039037 1301 32 05 2 352667652 12 1559 + 039038 1301 32 06 2 352667652 13 1559 + 039039 1301 32 07 2 352667652 14 1559 + 039040 1301 32 08 2 352667652 15 1559 + 039041 1301 33 01 2 353055748 00 1732 + 039042 1301 33 02 2 353055748 01 1732 + 039043 1301 33 03 2 353055748 02 1732 + 039044 1301 33 04 2 353055748 03 1732 + 039045 1301 33 05 2 353055748 04 1732 + 039046 1301 33 06 2 353055748 05 1732 + 039047 1301 33 07 2 353055748 06 1732 + 039048 1301 33 08 2 353055748 07 1732 + 039049 1301 34 01 2 353055748 08 1732 + 039050 1301 34 02 2 353055748 09 1732 + 039051 1301 34 03 2 353055748 10 1732 + 039052 1301 34 04 2 353055748 11 1732 + 039053 1301 34 05 2 353055748 12 1732 + 039054 1301 34 06 2 353055748 13 1732 + 039055 1301 34 07 2 353055748 14 1732 + 039056 1301 34 08 2 353055748 15 1732 + 039057 1301 35 01 2 353056772 00 1733 + 039058 1301 35 02 2 353056772 01 1733 + 039059 1301 35 03 2 353056772 02 1733 + 039060 1301 35 04 2 353056772 03 1733 + 039061 1301 35 05 2 353056772 04 1733 + 039062 1301 35 06 2 353056772 05 1733 + 039063 1301 35 07 2 353056772 06 1733 + 039064 1301 35 08 2 353056772 07 1733 + 039065 1301 36 01 2 353056772 08 1733 + 039066 1301 36 02 2 353056772 09 1733 + 039067 1301 36 03 2 353056772 10 1733 + 039068 1301 36 04 2 353056772 11 1733 + 039069 1301 36 05 2 353056772 12 1733 + 039070 1301 36 06 2 353056772 13 1733 + 039071 1301 36 07 2 353056772 14 1733 + 039072 1301 36 08 2 353056772 15 1733 + 039073 1301 37 01 2 352928772 00 1670 + 039074 1301 37 02 2 352928772 01 1670 + 039075 1301 37 03 2 352928772 02 1670 + 039076 1301 37 04 2 352928772 03 1670 + 039077 1301 37 05 2 352928772 04 1670 + 039078 1301 37 06 2 352928772 05 1670 + 039079 1301 37 07 2 352928772 06 1670 + 039080 1301 37 08 2 352928772 07 1670 + 039081 1301 38 01 2 352928772 08 1670 + 039082 1301 38 02 2 352928772 09 1670 + 039083 1301 38 03 2 352928772 10 1670 + 039084 1301 38 04 2 352928772 11 1670 + 039085 1301 38 05 2 352928772 12 1670 + 039086 1301 38 06 2 352928772 13 1670 + 039087 1301 38 07 2 352928772 14 1670 + 039088 1301 38 08 2 352928772 15 1670 + 039089 1301 39 01 2 352929796 00 1671 + 039090 1301 39 02 2 352929796 01 1671 + 039091 1301 39 03 2 352929796 02 1671 + 039092 1301 39 04 2 352929796 03 1671 + 039093 1301 39 05 2 352929796 04 1671 + 039094 1301 39 06 2 352929796 05 1671 + 039095 1301 39 07 2 352929796 06 1671 + 039096 1301 39 08 2 352929796 07 1671 + 039097 1301 40 01 2 352929796 08 1671 + 039098 1301 40 02 2 352929796 09 1671 + 039099 1301 40 03 2 352929796 10 1671 + 039100 1301 40 04 2 352929796 11 1671 + 039101 1301 40 05 2 352929796 12 1671 + 039102 1301 40 06 2 352929796 13 1671 + 039103 1301 40 07 2 352929796 14 1671 + 039104 1301 40 08 2 352929796 15 1671 + 039105 1301 41 01 2 353317892 00 1844 + 039106 1301 41 02 2 353317892 01 1844 + 039107 1301 41 03 2 353317892 02 1844 + 039108 1301 41 04 2 353317892 03 1844 + 039109 1301 41 05 2 353317892 04 1844 + 039110 1301 41 06 2 353317892 05 1844 + 039111 1301 41 07 2 353317892 06 1844 + 039112 1301 41 08 2 353317892 07 1844 + 039113 1301 42 01 2 353317892 08 1844 + 039114 1301 42 02 2 353317892 09 1844 + 039115 1301 42 03 2 353317892 10 1844 + 039116 1301 42 04 2 353317892 11 1844 + 039117 1301 42 05 2 353317892 12 1844 + 039118 1301 42 06 2 353317892 13 1844 + 039119 1301 42 07 2 353317892 14 1844 + 039120 1301 42 08 2 353317892 15 1844 + 039121 1301 43 01 2 353318916 00 1845 + 039122 1301 43 02 2 353318916 01 1845 + 039123 1301 43 03 2 353318916 02 1845 + 039124 1301 43 04 2 353318916 03 1845 + 039125 1301 43 05 2 353318916 04 1845 + 039126 1301 43 06 2 353318916 05 1845 + 039127 1301 43 07 2 353318916 06 1845 + 039128 1301 43 08 2 353318916 07 1845 + 039129 1301 44 01 2 353318916 08 1845 + 039130 1301 44 02 2 353318916 09 1845 + 039131 1301 44 03 2 353318916 10 1845 + 039132 1301 44 04 2 353318916 11 1845 + 039133 1301 44 05 2 353318916 12 1845 + 039134 1301 44 06 2 353318916 13 1845 + 039135 1301 44 07 2 353318916 14 1845 + 039136 1301 44 08 2 353318916 15 1845 + 039137 1301 45 01 2 353190916 00 1782 + 039138 1301 45 02 2 353190916 01 1782 + 039139 1301 45 03 2 353190916 02 1782 + 039140 1301 45 04 2 353190916 03 1782 + 039141 1301 45 05 2 353190916 04 1782 + 039142 1301 45 06 2 353190916 05 1782 + 039143 1301 45 07 2 353190916 06 1782 + 039144 1301 45 08 2 353190916 07 1782 + 039145 1301 46 01 2 353190916 08 1782 + 039146 1301 46 02 2 353190916 09 1782 + 039147 1301 46 03 2 353190916 10 1782 + 039148 1301 46 04 2 353190916 11 1782 + 039149 1301 46 05 2 353190916 12 1782 + 039150 1301 46 06 2 353190916 13 1782 + 039151 1301 46 07 2 353190916 14 1782 + 039152 1301 46 08 2 353190916 15 1782 + 039153 1301 47 01 2 353191940 00 1783 + 039154 1301 47 02 2 353191940 01 1783 + 039155 1301 47 03 2 353191940 02 1783 + 039156 1301 47 04 2 353191940 03 1783 + 039157 1301 47 05 2 353191940 04 1783 + 039158 1301 47 06 2 353191940 05 1783 + 039159 1301 47 07 2 353191940 06 1783 + 039160 1301 47 08 2 353191940 07 1783 + 039161 1301 48 01 2 353191940 08 1783 + 039162 1301 48 02 2 353191940 09 1783 + 039163 1301 48 03 2 353191940 10 1783 + 039164 1301 48 04 2 353191940 11 1783 + 039165 1301 48 05 2 353191940 12 1783 + 039166 1301 48 06 2 353191940 13 1783 + 039167 1301 48 07 2 353191940 14 1783 + 039168 1301 48 08 2 353191940 15 1783 + 039169 1302 01 01 2 352789508 00 1618 + 039170 1302 01 02 2 352789508 01 1618 + 039171 1302 01 03 2 352789508 02 1618 + 039172 1302 01 04 2 352789508 03 1618 + 039173 1302 01 05 2 352789508 04 1618 + 039174 1302 01 06 2 352789508 05 1618 + 039175 1302 01 07 2 352789508 06 1618 + 039176 1302 01 08 2 352789508 07 1618 + 039177 1302 02 01 2 352789508 08 1618 + 039178 1302 02 02 2 352789508 09 1618 + 039179 1302 02 03 2 352789508 10 1618 + 039180 1302 02 04 2 352789508 11 1618 + 039181 1302 02 05 2 352789508 12 1618 + 039182 1302 02 06 2 352789508 13 1618 + 039183 1302 02 07 2 352789508 14 1618 + 039184 1302 02 08 2 352789508 15 1618 + 039185 1302 03 01 2 352790532 00 1619 + 039186 1302 03 02 2 352790532 01 1619 + 039187 1302 03 03 2 352790532 02 1619 + 039188 1302 03 04 2 352790532 03 1619 + 039189 1302 03 05 2 352790532 04 1619 + 039190 1302 03 06 2 352790532 05 1619 + 039191 1302 03 07 2 352790532 06 1619 + 039192 1302 03 08 2 352790532 07 1619 + 039193 1302 04 01 2 352790532 08 1619 + 039194 1302 04 02 2 352790532 09 1619 + 039195 1302 04 03 2 352790532 10 1619 + 039196 1302 04 04 2 352790532 11 1619 + 039197 1302 04 05 2 352790532 12 1619 + 039198 1302 04 06 2 352790532 13 1619 + 039199 1302 04 07 2 352790532 14 1619 + 039200 1302 04 08 2 352790532 15 1619 + 039201 1302 05 01 2 352662532 00 1556 + 039202 1302 05 02 2 352662532 01 1556 + 039203 1302 05 03 2 352662532 02 1556 + 039204 1302 05 04 2 352662532 03 1556 + 039205 1302 05 05 2 352662532 04 1556 + 039206 1302 05 06 2 352662532 05 1556 + 039207 1302 05 07 2 352662532 06 1556 + 039208 1302 05 08 2 352662532 07 1556 + 039209 1302 06 01 2 352662532 08 1556 + 039210 1302 06 02 2 352662532 09 1556 + 039211 1302 06 03 2 352662532 10 1556 + 039212 1302 06 04 2 352662532 11 1556 + 039213 1302 06 05 2 352662532 12 1556 + 039214 1302 06 06 2 352662532 13 1556 + 039215 1302 06 07 2 352662532 14 1556 + 039216 1302 06 08 2 352662532 15 1556 + 039217 1302 07 01 2 352663556 00 1557 + 039218 1302 07 02 2 352663556 01 1557 + 039219 1302 07 03 2 352663556 02 1557 + 039220 1302 07 04 2 352663556 03 1557 + 039221 1302 07 05 2 352663556 04 1557 + 039222 1302 07 06 2 352663556 05 1557 + 039223 1302 07 07 2 352663556 06 1557 + 039224 1302 07 08 2 352663556 07 1557 + 039225 1302 08 01 2 352663556 08 1557 + 039226 1302 08 02 2 352663556 09 1557 + 039227 1302 08 03 2 352663556 10 1557 + 039228 1302 08 04 2 352663556 11 1557 + 039229 1302 08 05 2 352663556 12 1557 + 039230 1302 08 06 2 352663556 13 1557 + 039231 1302 08 07 2 352663556 14 1557 + 039232 1302 08 08 2 352663556 15 1557 + 039233 1302 09 01 2 353051652 00 1730 + 039234 1302 09 02 2 353051652 01 1730 + 039235 1302 09 03 2 353051652 02 1730 + 039236 1302 09 04 2 353051652 03 1730 + 039237 1302 09 05 2 353051652 04 1730 + 039238 1302 09 06 2 353051652 05 1730 + 039239 1302 09 07 2 353051652 06 1730 + 039240 1302 09 08 2 353051652 07 1730 + 039241 1302 10 01 2 353051652 08 1730 + 039242 1302 10 02 2 353051652 09 1730 + 039243 1302 10 03 2 353051652 10 1730 + 039244 1302 10 04 2 353051652 11 1730 + 039245 1302 10 05 2 353051652 12 1730 + 039246 1302 10 06 2 353051652 13 1730 + 039247 1302 10 07 2 353051652 14 1730 + 039248 1302 10 08 2 353051652 15 1730 + 039249 1302 11 01 2 353052676 00 1731 + 039250 1302 11 02 2 353052676 01 1731 + 039251 1302 11 03 2 353052676 02 1731 + 039252 1302 11 04 2 353052676 03 1731 + 039253 1302 11 05 2 353052676 04 1731 + 039254 1302 11 06 2 353052676 05 1731 + 039255 1302 11 07 2 353052676 06 1731 + 039256 1302 11 08 2 353052676 07 1731 + 039257 1302 12 01 2 353052676 08 1731 + 039258 1302 12 02 2 353052676 09 1731 + 039259 1302 12 03 2 353052676 10 1731 + 039260 1302 12 04 2 353052676 11 1731 + 039261 1302 12 05 2 353052676 12 1731 + 039262 1302 12 06 2 353052676 13 1731 + 039263 1302 12 07 2 353052676 14 1731 + 039264 1302 12 08 2 353052676 15 1731 + 039265 1302 13 01 2 352924676 00 1668 + 039266 1302 13 02 2 352924676 01 1668 + 039267 1302 13 03 2 352924676 02 1668 + 039268 1302 13 04 2 352924676 03 1668 + 039269 1302 13 05 2 352924676 04 1668 + 039270 1302 13 06 2 352924676 05 1668 + 039271 1302 13 07 2 352924676 06 1668 + 039272 1302 13 08 2 352924676 07 1668 + 039273 1302 14 01 2 352924676 08 1668 + 039274 1302 14 02 2 352924676 09 1668 + 039275 1302 14 03 2 352924676 10 1668 + 039276 1302 14 04 2 352924676 11 1668 + 039277 1302 14 05 2 352924676 12 1668 + 039278 1302 14 06 2 352924676 13 1668 + 039279 1302 14 07 2 352924676 14 1668 + 039280 1302 14 08 2 352924676 15 1668 + 039281 1302 15 01 2 352925700 00 1669 + 039282 1302 15 02 2 352925700 01 1669 + 039283 1302 15 03 2 352925700 02 1669 + 039284 1302 15 04 2 352925700 03 1669 + 039285 1302 15 05 2 352925700 04 1669 + 039286 1302 15 06 2 352925700 05 1669 + 039287 1302 15 07 2 352925700 06 1669 + 039288 1302 15 08 2 352925700 07 1669 + 039289 1302 16 01 2 352925700 08 1669 + 039290 1302 16 02 2 352925700 09 1669 + 039291 1302 16 03 2 352925700 10 1669 + 039292 1302 16 04 2 352925700 11 1669 + 039293 1302 16 05 2 352925700 12 1669 + 039294 1302 16 06 2 352925700 13 1669 + 039295 1302 16 07 2 352925700 14 1669 + 039296 1302 16 08 2 352925700 15 1669 + 039297 1302 17 01 2 353313796 00 1842 + 039298 1302 17 02 2 353313796 01 1842 + 039299 1302 17 03 2 353313796 02 1842 + 039300 1302 17 04 2 353313796 03 1842 + 039301 1302 17 05 2 353313796 04 1842 + 039302 1302 17 06 2 353313796 05 1842 + 039303 1302 17 07 2 353313796 06 1842 + 039304 1302 17 08 2 353313796 07 1842 + 039305 1302 18 01 2 353313796 08 1842 + 039306 1302 18 02 2 353313796 09 1842 + 039307 1302 18 03 2 353313796 10 1842 + 039308 1302 18 04 2 353313796 11 1842 + 039309 1302 18 05 2 353313796 12 1842 + 039310 1302 18 06 2 353313796 13 1842 + 039311 1302 18 07 2 353313796 14 1842 + 039312 1302 18 08 2 353313796 15 1842 + 039313 1302 19 01 2 353314820 00 1843 + 039314 1302 19 02 2 353314820 01 1843 + 039315 1302 19 03 2 353314820 02 1843 + 039316 1302 19 04 2 353314820 03 1843 + 039317 1302 19 05 2 353314820 04 1843 + 039318 1302 19 06 2 353314820 05 1843 + 039319 1302 19 07 2 353314820 06 1843 + 039320 1302 19 08 2 353314820 07 1843 + 039321 1302 20 01 2 353314820 08 1843 + 039322 1302 20 02 2 353314820 09 1843 + 039323 1302 20 03 2 353314820 10 1843 + 039324 1302 20 04 2 353314820 11 1843 + 039325 1302 20 05 2 353314820 12 1843 + 039326 1302 20 06 2 353314820 13 1843 + 039327 1302 20 07 2 353314820 14 1843 + 039328 1302 20 08 2 353314820 15 1843 + 039329 1302 21 01 2 353186820 00 1780 + 039330 1302 21 02 2 353186820 01 1780 + 039331 1302 21 03 2 353186820 02 1780 + 039332 1302 21 04 2 353186820 03 1780 + 039333 1302 21 05 2 353186820 04 1780 + 039334 1302 21 06 2 353186820 05 1780 + 039335 1302 21 07 2 353186820 06 1780 + 039336 1302 21 08 2 353186820 07 1780 + 039337 1302 22 01 2 353186820 08 1780 + 039338 1302 22 02 2 353186820 09 1780 + 039339 1302 22 03 2 353186820 10 1780 + 039340 1302 22 04 2 353186820 11 1780 + 039341 1302 22 05 2 353186820 12 1780 + 039342 1302 22 06 2 353186820 13 1780 + 039343 1302 22 07 2 353186820 14 1780 + 039344 1302 22 08 2 353186820 15 1780 + 039345 1302 23 01 2 353187844 00 1781 + 039346 1302 23 02 2 353187844 01 1781 + 039347 1302 23 03 2 353187844 02 1781 + 039348 1302 23 04 2 353187844 03 1781 + 039349 1302 23 05 2 353187844 04 1781 + 039350 1302 23 06 2 353187844 05 1781 + 039351 1302 23 07 2 353187844 06 1781 + 039352 1302 23 08 2 353187844 07 1781 + 039353 1302 24 01 2 353187844 08 1781 + 039354 1302 24 02 2 353187844 09 1781 + 039355 1302 24 03 2 353187844 10 1781 + 039356 1302 24 04 2 353187844 11 1781 + 039357 1302 24 05 2 353187844 12 1781 + 039358 1302 24 06 2 353187844 13 1781 + 039359 1302 24 07 2 353187844 14 1781 + 039360 1302 24 08 2 353187844 15 1781 + 039361 1302 25 01 2 352785412 00 1616 + 039362 1302 25 02 2 352785412 01 1616 + 039363 1302 25 03 2 352785412 02 1616 + 039364 1302 25 04 2 352785412 03 1616 + 039365 1302 25 05 2 352785412 04 1616 + 039366 1302 25 06 2 352785412 05 1616 + 039367 1302 25 07 2 352785412 06 1616 + 039368 1302 25 08 2 352785412 07 1616 + 039369 1302 26 01 2 352785412 08 1616 + 039370 1302 26 02 2 352785412 09 1616 + 039371 1302 26 03 2 352785412 10 1616 + 039372 1302 26 04 2 352785412 11 1616 + 039373 1302 26 05 2 352785412 12 1616 + 039374 1302 26 06 2 352785412 13 1616 + 039375 1302 26 07 2 352785412 14 1616 + 039376 1302 26 08 2 352785412 15 1616 + 039377 1302 27 01 2 352786436 00 1617 + 039378 1302 27 02 2 352786436 01 1617 + 039379 1302 27 03 2 352786436 02 1617 + 039380 1302 27 04 2 352786436 03 1617 + 039381 1302 27 05 2 352786436 04 1617 + 039382 1302 27 06 2 352786436 05 1617 + 039383 1302 27 07 2 352786436 06 1617 + 039384 1302 27 08 2 352786436 07 1617 + 039385 1302 28 01 2 352786436 08 1617 + 039386 1302 28 02 2 352786436 09 1617 + 039387 1302 28 03 2 352786436 10 1617 + 039388 1302 28 04 2 352786436 11 1617 + 039389 1302 28 05 2 352786436 12 1617 + 039390 1302 28 06 2 352786436 13 1617 + 039391 1302 28 07 2 352786436 14 1617 + 039392 1302 28 08 2 352786436 15 1617 + 039393 1302 29 01 2 352658436 00 1554 + 039394 1302 29 02 2 352658436 01 1554 + 039395 1302 29 03 2 352658436 02 1554 + 039396 1302 29 04 2 352658436 03 1554 + 039397 1302 29 05 2 352658436 04 1554 + 039398 1302 29 06 2 352658436 05 1554 + 039399 1302 29 07 2 352658436 06 1554 + 039400 1302 29 08 2 352658436 07 1554 + 039401 1302 30 01 2 352658436 08 1554 + 039402 1302 30 02 2 352658436 09 1554 + 039403 1302 30 03 2 352658436 10 1554 + 039404 1302 30 04 2 352658436 11 1554 + 039405 1302 30 05 2 352658436 12 1554 + 039406 1302 30 06 2 352658436 13 1554 + 039407 1302 30 07 2 352658436 14 1554 + 039408 1302 30 08 2 352658436 15 1554 + 039409 1302 31 01 2 352659460 00 1555 + 039410 1302 31 02 2 352659460 01 1555 + 039411 1302 31 03 2 352659460 02 1555 + 039412 1302 31 04 2 352659460 03 1555 + 039413 1302 31 05 2 352659460 04 1555 + 039414 1302 31 06 2 352659460 05 1555 + 039415 1302 31 07 2 352659460 06 1555 + 039416 1302 31 08 2 352659460 07 1555 + 039417 1302 32 01 2 352659460 08 1555 + 039418 1302 32 02 2 352659460 09 1555 + 039419 1302 32 03 2 352659460 10 1555 + 039420 1302 32 04 2 352659460 11 1555 + 039421 1302 32 05 2 352659460 12 1555 + 039422 1302 32 06 2 352659460 13 1555 + 039423 1302 32 07 2 352659460 14 1555 + 039424 1302 32 08 2 352659460 15 1555 + 039425 1302 33 01 2 353047556 00 1728 + 039426 1302 33 02 2 353047556 01 1728 + 039427 1302 33 03 2 353047556 02 1728 + 039428 1302 33 04 2 353047556 03 1728 + 039429 1302 33 05 2 353047556 04 1728 + 039430 1302 33 06 2 353047556 05 1728 + 039431 1302 33 07 2 353047556 06 1728 + 039432 1302 33 08 2 353047556 07 1728 + 039433 1302 34 01 2 353047556 08 1728 + 039434 1302 34 02 2 353047556 09 1728 + 039435 1302 34 03 2 353047556 10 1728 + 039436 1302 34 04 2 353047556 11 1728 + 039437 1302 34 05 2 353047556 12 1728 + 039438 1302 34 06 2 353047556 13 1728 + 039439 1302 34 07 2 353047556 14 1728 + 039440 1302 34 08 2 353047556 15 1728 + 039441 1302 35 01 2 353048580 00 1729 + 039442 1302 35 02 2 353048580 01 1729 + 039443 1302 35 03 2 353048580 02 1729 + 039444 1302 35 04 2 353048580 03 1729 + 039445 1302 35 05 2 353048580 04 1729 + 039446 1302 35 06 2 353048580 05 1729 + 039447 1302 35 07 2 353048580 06 1729 + 039448 1302 35 08 2 353048580 07 1729 + 039449 1302 36 01 2 353048580 08 1729 + 039450 1302 36 02 2 353048580 09 1729 + 039451 1302 36 03 2 353048580 10 1729 + 039452 1302 36 04 2 353048580 11 1729 + 039453 1302 36 05 2 353048580 12 1729 + 039454 1302 36 06 2 353048580 13 1729 + 039455 1302 36 07 2 353048580 14 1729 + 039456 1302 36 08 2 353048580 15 1729 + 039457 1302 37 01 2 352920580 00 1666 + 039458 1302 37 02 2 352920580 01 1666 + 039459 1302 37 03 2 352920580 02 1666 + 039460 1302 37 04 2 352920580 03 1666 + 039461 1302 37 05 2 352920580 04 1666 + 039462 1302 37 06 2 352920580 05 1666 + 039463 1302 37 07 2 352920580 06 1666 + 039464 1302 37 08 2 352920580 07 1666 + 039465 1302 38 01 2 352920580 08 1666 + 039466 1302 38 02 2 352920580 09 1666 + 039467 1302 38 03 2 352920580 10 1666 + 039468 1302 38 04 2 352920580 11 1666 + 039469 1302 38 05 2 352920580 12 1666 + 039470 1302 38 06 2 352920580 13 1666 + 039471 1302 38 07 2 352920580 14 1666 + 039472 1302 38 08 2 352920580 15 1666 + 039473 1302 39 01 2 352921604 00 1667 + 039474 1302 39 02 2 352921604 01 1667 + 039475 1302 39 03 2 352921604 02 1667 + 039476 1302 39 04 2 352921604 03 1667 + 039477 1302 39 05 2 352921604 04 1667 + 039478 1302 39 06 2 352921604 05 1667 + 039479 1302 39 07 2 352921604 06 1667 + 039480 1302 39 08 2 352921604 07 1667 + 039481 1302 40 01 2 352921604 08 1667 + 039482 1302 40 02 2 352921604 09 1667 + 039483 1302 40 03 2 352921604 10 1667 + 039484 1302 40 04 2 352921604 11 1667 + 039485 1302 40 05 2 352921604 12 1667 + 039486 1302 40 06 2 352921604 13 1667 + 039487 1302 40 07 2 352921604 14 1667 + 039488 1302 40 08 2 352921604 15 1667 + 039489 1302 41 01 2 353309700 00 1840 + 039490 1302 41 02 2 353309700 01 1840 + 039491 1302 41 03 2 353309700 02 1840 + 039492 1302 41 04 2 353309700 03 1840 + 039493 1302 41 05 2 353309700 04 1840 + 039494 1302 41 06 2 353309700 05 1840 + 039495 1302 41 07 2 353309700 06 1840 + 039496 1302 41 08 2 353309700 07 1840 + 039497 1302 42 01 2 353309700 08 1840 + 039498 1302 42 02 2 353309700 09 1840 + 039499 1302 42 03 2 353309700 10 1840 + 039500 1302 42 04 2 353309700 11 1840 + 039501 1302 42 05 2 353309700 12 1840 + 039502 1302 42 06 2 353309700 13 1840 + 039503 1302 42 07 2 353309700 14 1840 + 039504 1302 42 08 2 353309700 15 1840 + 039505 1302 43 01 2 353310724 00 1841 + 039506 1302 43 02 2 353310724 01 1841 + 039507 1302 43 03 2 353310724 02 1841 + 039508 1302 43 04 2 353310724 03 1841 + 039509 1302 43 05 2 353310724 04 1841 + 039510 1302 43 06 2 353310724 05 1841 + 039511 1302 43 07 2 353310724 06 1841 + 039512 1302 43 08 2 353310724 07 1841 + 039513 1302 44 01 2 353310724 08 1841 + 039514 1302 44 02 2 353310724 09 1841 + 039515 1302 44 03 2 353310724 10 1841 + 039516 1302 44 04 2 353310724 11 1841 + 039517 1302 44 05 2 353310724 12 1841 + 039518 1302 44 06 2 353310724 13 1841 + 039519 1302 44 07 2 353310724 14 1841 + 039520 1302 44 08 2 353310724 15 1841 + 039521 1302 45 01 2 353182724 00 1778 + 039522 1302 45 02 2 353182724 01 1778 + 039523 1302 45 03 2 353182724 02 1778 + 039524 1302 45 04 2 353182724 03 1778 + 039525 1302 45 05 2 353182724 04 1778 + 039526 1302 45 06 2 353182724 05 1778 + 039527 1302 45 07 2 353182724 06 1778 + 039528 1302 45 08 2 353182724 07 1778 + 039529 1302 46 01 2 353182724 08 1778 + 039530 1302 46 02 2 353182724 09 1778 + 039531 1302 46 03 2 353182724 10 1778 + 039532 1302 46 04 2 353182724 11 1778 + 039533 1302 46 05 2 353182724 12 1778 + 039534 1302 46 06 2 353182724 13 1778 + 039535 1302 46 07 2 353182724 14 1778 + 039536 1302 46 08 2 353182724 15 1778 + 039537 1302 47 01 2 353183748 00 1779 + 039538 1302 47 02 2 353183748 01 1779 + 039539 1302 47 03 2 353183748 02 1779 + 039540 1302 47 04 2 353183748 03 1779 + 039541 1302 47 05 2 353183748 04 1779 + 039542 1302 47 06 2 353183748 05 1779 + 039543 1302 47 07 2 353183748 06 1779 + 039544 1302 47 08 2 353183748 07 1779 + 039545 1302 48 01 2 353183748 08 1779 + 039546 1302 48 02 2 353183748 09 1779 + 039547 1302 48 03 2 353183748 10 1779 + 039548 1302 48 04 2 353183748 11 1779 + 039549 1302 48 05 2 353183748 12 1779 + 039550 1302 48 06 2 353183748 13 1779 + 039551 1302 48 07 2 353183748 14 1779 + 039552 1302 48 08 2 353183748 15 1779 + 039553 9999 99 99 0 9999 99 9999 + 039554 9999 99 99 0 9999 99 9999 + 039555 9999 99 99 0 9999 99 9999 + 039556 9999 99 99 0 9999 99 9999 + 039557 9999 99 99 0 9999 99 9999 + 039558 9999 99 99 0 9999 99 9999 + 039559 9999 99 99 0 9999 99 9999 + 039560 9999 99 99 0 9999 99 9999 + 039561 9999 99 99 0 9999 99 9999 + 039562 9999 99 99 0 9999 99 9999 + 039563 9999 99 99 0 9999 99 9999 + 039564 9999 99 99 0 9999 99 9999 + 039565 9999 99 99 0 9999 99 9999 + 039566 9999 99 99 0 9999 99 9999 + 039567 9999 99 99 0 9999 99 9999 + 039568 9999 99 99 0 9999 99 9999 + 039569 9999 99 99 0 9999 99 9999 + 039570 9999 99 99 0 9999 99 9999 + 039571 9999 99 99 0 9999 99 9999 + 039572 9999 99 99 0 9999 99 9999 + 039573 9999 99 99 0 9999 99 9999 + 039574 9999 99 99 0 9999 99 9999 + 039575 9999 99 99 0 9999 99 9999 + 039576 9999 99 99 0 9999 99 9999 + 039577 9999 99 99 0 9999 99 9999 + 039578 9999 99 99 0 9999 99 9999 + 039579 9999 99 99 0 9999 99 9999 + 039580 9999 99 99 0 9999 99 9999 + 039581 9999 99 99 0 9999 99 9999 + 039582 9999 99 99 0 9999 99 9999 + 039583 9999 99 99 0 9999 99 9999 + 039584 9999 99 99 0 9999 99 9999 + 039585 9999 99 99 0 9999 99 9999 + 039586 9999 99 99 0 9999 99 9999 + 039587 9999 99 99 0 9999 99 9999 + 039588 9999 99 99 0 9999 99 9999 + 039589 9999 99 99 0 9999 99 9999 + 039590 9999 99 99 0 9999 99 9999 + 039591 9999 99 99 0 9999 99 9999 + 039592 9999 99 99 0 9999 99 9999 + 039593 9999 99 99 0 9999 99 9999 + 039594 9999 99 99 0 9999 99 9999 + 039595 9999 99 99 0 9999 99 9999 + 039596 9999 99 99 0 9999 99 9999 + 039597 9999 99 99 0 9999 99 9999 + 039598 9999 99 99 0 9999 99 9999 + 039599 9999 99 99 0 9999 99 9999 + 039600 9999 99 99 0 9999 99 9999 + 039601 9999 99 99 0 9999 99 9999 + 039602 9999 99 99 0 9999 99 9999 + 039603 9999 99 99 0 9999 99 9999 + 039604 9999 99 99 0 9999 99 9999 + 039605 9999 99 99 0 9999 99 9999 + 039606 9999 99 99 0 9999 99 9999 + 039607 9999 99 99 0 9999 99 9999 + 039608 9999 99 99 0 9999 99 9999 + 039609 9999 99 99 0 9999 99 9999 + 039610 9999 99 99 0 9999 99 9999 + 039611 9999 99 99 0 9999 99 9999 + 039612 9999 99 99 0 9999 99 9999 + 039613 9999 99 99 0 9999 99 9999 + 039614 9999 99 99 0 9999 99 9999 + 039615 9999 99 99 0 9999 99 9999 + 039616 9999 99 99 0 9999 99 9999 + 039617 9999 99 99 0 9999 99 9999 + 039618 9999 99 99 0 9999 99 9999 + 039619 9999 99 99 0 9999 99 9999 + 039620 9999 99 99 0 9999 99 9999 + 039621 9999 99 99 0 9999 99 9999 + 039622 9999 99 99 0 9999 99 9999 + 039623 9999 99 99 0 9999 99 9999 + 039624 9999 99 99 0 9999 99 9999 + 039625 9999 99 99 0 9999 99 9999 + 039626 9999 99 99 0 9999 99 9999 + 039627 9999 99 99 0 9999 99 9999 + 039628 9999 99 99 0 9999 99 9999 + 039629 9999 99 99 0 9999 99 9999 + 039630 9999 99 99 0 9999 99 9999 + 039631 9999 99 99 0 9999 99 9999 + 039632 9999 99 99 0 9999 99 9999 + 039633 9999 99 99 0 9999 99 9999 + 039634 9999 99 99 0 9999 99 9999 + 039635 9999 99 99 0 9999 99 9999 + 039636 9999 99 99 0 9999 99 9999 + 039637 9999 99 99 0 9999 99 9999 + 039638 9999 99 99 0 9999 99 9999 + 039639 9999 99 99 0 9999 99 9999 + 039640 9999 99 99 0 9999 99 9999 + 039641 9999 99 99 0 9999 99 9999 + 039642 9999 99 99 0 9999 99 9999 + 039643 9999 99 99 0 9999 99 9999 + 039644 9999 99 99 0 9999 99 9999 + 039645 9999 99 99 0 9999 99 9999 + 039646 9999 99 99 0 9999 99 9999 + 039647 9999 99 99 0 9999 99 9999 + 039648 9999 99 99 0 9999 99 9999 + 039649 9999 99 99 0 9999 99 9999 + 039650 9999 99 99 0 9999 99 9999 + 039651 9999 99 99 0 9999 99 9999 + 039652 9999 99 99 0 9999 99 9999 + 039653 9999 99 99 0 9999 99 9999 + 039654 9999 99 99 0 9999 99 9999 + 039655 9999 99 99 0 9999 99 9999 + 039656 9999 99 99 0 9999 99 9999 + 039657 9999 99 99 0 9999 99 9999 + 039658 9999 99 99 0 9999 99 9999 + 039659 9999 99 99 0 9999 99 9999 + 039660 9999 99 99 0 9999 99 9999 + 039661 9999 99 99 0 9999 99 9999 + 039662 9999 99 99 0 9999 99 9999 + 039663 9999 99 99 0 9999 99 9999 + 039664 9999 99 99 0 9999 99 9999 + 039665 9999 99 99 0 9999 99 9999 + 039666 9999 99 99 0 9999 99 9999 + 039667 9999 99 99 0 9999 99 9999 + 039668 9999 99 99 0 9999 99 9999 + 039669 9999 99 99 0 9999 99 9999 + 039670 9999 99 99 0 9999 99 9999 + 039671 9999 99 99 0 9999 99 9999 + 039672 9999 99 99 0 9999 99 9999 + 039673 9999 99 99 0 9999 99 9999 + 039674 9999 99 99 0 9999 99 9999 + 039675 9999 99 99 0 9999 99 9999 + 039676 9999 99 99 0 9999 99 9999 + 039677 9999 99 99 0 9999 99 9999 + 039678 9999 99 99 0 9999 99 9999 + 039679 9999 99 99 0 9999 99 9999 + 039680 9999 99 99 0 9999 99 9999 + 039681 9999 99 99 0 9999 99 9999 + 039682 9999 99 99 0 9999 99 9999 + 039683 9999 99 99 0 9999 99 9999 + 039684 9999 99 99 0 9999 99 9999 + 039685 9999 99 99 0 9999 99 9999 + 039686 9999 99 99 0 9999 99 9999 + 039687 9999 99 99 0 9999 99 9999 + 039688 9999 99 99 0 9999 99 9999 + 039689 9999 99 99 0 9999 99 9999 + 039690 9999 99 99 0 9999 99 9999 + 039691 9999 99 99 0 9999 99 9999 + 039692 9999 99 99 0 9999 99 9999 + 039693 9999 99 99 0 9999 99 9999 + 039694 9999 99 99 0 9999 99 9999 + 039695 9999 99 99 0 9999 99 9999 + 039696 9999 99 99 0 9999 99 9999 + 039697 9999 99 99 0 9999 99 9999 + 039698 9999 99 99 0 9999 99 9999 + 039699 9999 99 99 0 9999 99 9999 + 039700 9999 99 99 0 9999 99 9999 + 039701 9999 99 99 0 9999 99 9999 + 039702 9999 99 99 0 9999 99 9999 + 039703 9999 99 99 0 9999 99 9999 + 039704 9999 99 99 0 9999 99 9999 + 039705 9999 99 99 0 9999 99 9999 + 039706 9999 99 99 0 9999 99 9999 + 039707 9999 99 99 0 9999 99 9999 + 039708 9999 99 99 0 9999 99 9999 + 039709 9999 99 99 0 9999 99 9999 + 039710 9999 99 99 0 9999 99 9999 + 039711 9999 99 99 0 9999 99 9999 + 039712 9999 99 99 0 9999 99 9999 + 039713 9999 99 99 0 9999 99 9999 + 039714 9999 99 99 0 9999 99 9999 + 039715 9999 99 99 0 9999 99 9999 + 039716 9999 99 99 0 9999 99 9999 + 039717 9999 99 99 0 9999 99 9999 + 039718 9999 99 99 0 9999 99 9999 + 039719 9999 99 99 0 9999 99 9999 + 039720 9999 99 99 0 9999 99 9999 + 039721 9999 99 99 0 9999 99 9999 + 039722 9999 99 99 0 9999 99 9999 + 039723 9999 99 99 0 9999 99 9999 + 039724 9999 99 99 0 9999 99 9999 + 039725 9999 99 99 0 9999 99 9999 + 039726 9999 99 99 0 9999 99 9999 + 039727 9999 99 99 0 9999 99 9999 + 039728 9999 99 99 0 9999 99 9999 + 039729 9999 99 99 0 9999 99 9999 + 039730 9999 99 99 0 9999 99 9999 + 039731 9999 99 99 0 9999 99 9999 + 039732 9999 99 99 0 9999 99 9999 + 039733 9999 99 99 0 9999 99 9999 + 039734 9999 99 99 0 9999 99 9999 + 039735 9999 99 99 0 9999 99 9999 + 039736 9999 99 99 0 9999 99 9999 + 039737 9999 99 99 0 9999 99 9999 + 039738 9999 99 99 0 9999 99 9999 + 039739 9999 99 99 0 9999 99 9999 + 039740 9999 99 99 0 9999 99 9999 + 039741 9999 99 99 0 9999 99 9999 + 039742 9999 99 99 0 9999 99 9999 + 039743 9999 99 99 0 9999 99 9999 + 039744 9999 99 99 0 9999 99 9999 + 039745 9999 99 99 0 9999 99 9999 + 039746 9999 99 99 0 9999 99 9999 + 039747 9999 99 99 0 9999 99 9999 + 039748 9999 99 99 0 9999 99 9999 + 039749 9999 99 99 0 9999 99 9999 + 039750 9999 99 99 0 9999 99 9999 + 039751 9999 99 99 0 9999 99 9999 + 039752 9999 99 99 0 9999 99 9999 + 039753 9999 99 99 0 9999 99 9999 + 039754 9999 99 99 0 9999 99 9999 + 039755 9999 99 99 0 9999 99 9999 + 039756 9999 99 99 0 9999 99 9999 + 039757 9999 99 99 0 9999 99 9999 + 039758 9999 99 99 0 9999 99 9999 + 039759 9999 99 99 0 9999 99 9999 + 039760 9999 99 99 0 9999 99 9999 + 039761 9999 99 99 0 9999 99 9999 + 039762 9999 99 99 0 9999 99 9999 + 039763 9999 99 99 0 9999 99 9999 + 039764 9999 99 99 0 9999 99 9999 + 039765 9999 99 99 0 9999 99 9999 + 039766 9999 99 99 0 9999 99 9999 + 039767 9999 99 99 0 9999 99 9999 + 039768 9999 99 99 0 9999 99 9999 + 039769 9999 99 99 0 9999 99 9999 + 039770 9999 99 99 0 9999 99 9999 + 039771 9999 99 99 0 9999 99 9999 + 039772 9999 99 99 0 9999 99 9999 + 039773 9999 99 99 0 9999 99 9999 + 039774 9999 99 99 0 9999 99 9999 + 039775 9999 99 99 0 9999 99 9999 + 039776 9999 99 99 0 9999 99 9999 + 039777 9999 99 99 0 9999 99 9999 + 039778 9999 99 99 0 9999 99 9999 + 039779 9999 99 99 0 9999 99 9999 + 039780 9999 99 99 0 9999 99 9999 + 039781 9999 99 99 0 9999 99 9999 + 039782 9999 99 99 0 9999 99 9999 + 039783 9999 99 99 0 9999 99 9999 + 039784 9999 99 99 0 9999 99 9999 + 039785 9999 99 99 0 9999 99 9999 + 039786 9999 99 99 0 9999 99 9999 + 039787 9999 99 99 0 9999 99 9999 + 039788 9999 99 99 0 9999 99 9999 + 039789 9999 99 99 0 9999 99 9999 + 039790 9999 99 99 0 9999 99 9999 + 039791 9999 99 99 0 9999 99 9999 + 039792 9999 99 99 0 9999 99 9999 + 039793 9999 99 99 0 9999 99 9999 + 039794 9999 99 99 0 9999 99 9999 + 039795 9999 99 99 0 9999 99 9999 + 039796 9999 99 99 0 9999 99 9999 + 039797 9999 99 99 0 9999 99 9999 + 039798 9999 99 99 0 9999 99 9999 + 039799 9999 99 99 0 9999 99 9999 + 039800 9999 99 99 0 9999 99 9999 + 039801 9999 99 99 0 9999 99 9999 + 039802 9999 99 99 0 9999 99 9999 + 039803 9999 99 99 0 9999 99 9999 + 039804 9999 99 99 0 9999 99 9999 + 039805 9999 99 99 0 9999 99 9999 + 039806 9999 99 99 0 9999 99 9999 + 039807 9999 99 99 0 9999 99 9999 + 039808 9999 99 99 0 9999 99 9999 + 039809 9999 99 99 0 9999 99 9999 + 039810 9999 99 99 0 9999 99 9999 + 039811 9999 99 99 0 9999 99 9999 + 039812 9999 99 99 0 9999 99 9999 + 039813 9999 99 99 0 9999 99 9999 + 039814 9999 99 99 0 9999 99 9999 + 039815 9999 99 99 0 9999 99 9999 + 039816 9999 99 99 0 9999 99 9999 + 039817 9999 99 99 0 9999 99 9999 + 039818 9999 99 99 0 9999 99 9999 + 039819 9999 99 99 0 9999 99 9999 + 039820 9999 99 99 0 9999 99 9999 + 039821 9999 99 99 0 9999 99 9999 + 039822 9999 99 99 0 9999 99 9999 + 039823 9999 99 99 0 9999 99 9999 + 039824 9999 99 99 0 9999 99 9999 + 039825 9999 99 99 0 9999 99 9999 + 039826 9999 99 99 0 9999 99 9999 + 039827 9999 99 99 0 9999 99 9999 + 039828 9999 99 99 0 9999 99 9999 + 039829 9999 99 99 0 9999 99 9999 + 039830 9999 99 99 0 9999 99 9999 + 039831 9999 99 99 0 9999 99 9999 + 039832 9999 99 99 0 9999 99 9999 + 039833 9999 99 99 0 9999 99 9999 + 039834 9999 99 99 0 9999 99 9999 + 039835 9999 99 99 0 9999 99 9999 + 039836 9999 99 99 0 9999 99 9999 + 039837 9999 99 99 0 9999 99 9999 + 039838 9999 99 99 0 9999 99 9999 + 039839 9999 99 99 0 9999 99 9999 + 039840 9999 99 99 0 9999 99 9999 + 039841 9999 99 99 0 9999 99 9999 + 039842 9999 99 99 0 9999 99 9999 + 039843 9999 99 99 0 9999 99 9999 + 039844 9999 99 99 0 9999 99 9999 + 039845 9999 99 99 0 9999 99 9999 + 039846 9999 99 99 0 9999 99 9999 + 039847 9999 99 99 0 9999 99 9999 + 039848 9999 99 99 0 9999 99 9999 + 039849 9999 99 99 0 9999 99 9999 + 039850 9999 99 99 0 9999 99 9999 + 039851 9999 99 99 0 9999 99 9999 + 039852 9999 99 99 0 9999 99 9999 + 039853 9999 99 99 0 9999 99 9999 + 039854 9999 99 99 0 9999 99 9999 + 039855 9999 99 99 0 9999 99 9999 + 039856 9999 99 99 0 9999 99 9999 + 039857 9999 99 99 0 9999 99 9999 + 039858 9999 99 99 0 9999 99 9999 + 039859 9999 99 99 0 9999 99 9999 + 039860 9999 99 99 0 9999 99 9999 + 039861 9999 99 99 0 9999 99 9999 + 039862 9999 99 99 0 9999 99 9999 + 039863 9999 99 99 0 9999 99 9999 + 039864 9999 99 99 0 9999 99 9999 + 039865 9999 99 99 0 9999 99 9999 + 039866 9999 99 99 0 9999 99 9999 + 039867 9999 99 99 0 9999 99 9999 + 039868 9999 99 99 0 9999 99 9999 + 039869 9999 99 99 0 9999 99 9999 + 039870 9999 99 99 0 9999 99 9999 + 039871 9999 99 99 0 9999 99 9999 + 039872 9999 99 99 0 9999 99 9999 + 039873 9999 99 99 0 9999 99 9999 + 039874 9999 99 99 0 9999 99 9999 + 039875 9999 99 99 0 9999 99 9999 + 039876 9999 99 99 0 9999 99 9999 + 039877 9999 99 99 0 9999 99 9999 + 039878 9999 99 99 0 9999 99 9999 + 039879 9999 99 99 0 9999 99 9999 + 039880 9999 99 99 0 9999 99 9999 + 039881 9999 99 99 0 9999 99 9999 + 039882 9999 99 99 0 9999 99 9999 + 039883 9999 99 99 0 9999 99 9999 + 039884 9999 99 99 0 9999 99 9999 + 039885 9999 99 99 0 9999 99 9999 + 039886 9999 99 99 0 9999 99 9999 + 039887 9999 99 99 0 9999 99 9999 + 039888 9999 99 99 0 9999 99 9999 + 039889 9999 99 99 0 9999 99 9999 + 039890 9999 99 99 0 9999 99 9999 + 039891 9999 99 99 0 9999 99 9999 + 039892 9999 99 99 0 9999 99 9999 + 039893 9999 99 99 0 9999 99 9999 + 039894 9999 99 99 0 9999 99 9999 + 039895 9999 99 99 0 9999 99 9999 + 039896 9999 99 99 0 9999 99 9999 + 039897 9999 99 99 0 9999 99 9999 + 039898 9999 99 99 0 9999 99 9999 + 039899 9999 99 99 0 9999 99 9999 + 039900 9999 99 99 0 9999 99 9999 + 039901 9999 99 99 0 9999 99 9999 + 039902 9999 99 99 0 9999 99 9999 + 039903 9999 99 99 0 9999 99 9999 + 039904 9999 99 99 0 9999 99 9999 + 039905 9999 99 99 0 9999 99 9999 + 039906 9999 99 99 0 9999 99 9999 + 039907 9999 99 99 0 9999 99 9999 + 039908 9999 99 99 0 9999 99 9999 + 039909 9999 99 99 0 9999 99 9999 + 039910 9999 99 99 0 9999 99 9999 + 039911 9999 99 99 0 9999 99 9999 + 039912 9999 99 99 0 9999 99 9999 + 039913 9999 99 99 0 9999 99 9999 + 039914 9999 99 99 0 9999 99 9999 + 039915 9999 99 99 0 9999 99 9999 + 039916 9999 99 99 0 9999 99 9999 + 039917 9999 99 99 0 9999 99 9999 + 039918 9999 99 99 0 9999 99 9999 + 039919 9999 99 99 0 9999 99 9999 + 039920 9999 99 99 0 9999 99 9999 + 039921 9999 99 99 0 9999 99 9999 + 039922 9999 99 99 0 9999 99 9999 + 039923 9999 99 99 0 9999 99 9999 + 039924 9999 99 99 0 9999 99 9999 + 039925 9999 99 99 0 9999 99 9999 + 039926 9999 99 99 0 9999 99 9999 + 039927 9999 99 99 0 9999 99 9999 + 039928 9999 99 99 0 9999 99 9999 + 039929 9999 99 99 0 9999 99 9999 + 039930 9999 99 99 0 9999 99 9999 + 039931 9999 99 99 0 9999 99 9999 + 039932 9999 99 99 0 9999 99 9999 + 039933 9999 99 99 0 9999 99 9999 + 039934 9999 99 99 0 9999 99 9999 + 039935 9999 99 99 0 9999 99 9999 + 039936 9999 99 99 0 9999 99 9999 + 039937 9999 99 99 0 9999 99 9999 + 039938 9999 99 99 0 9999 99 9999 + 039939 9999 99 99 0 9999 99 9999 + 039940 9999 99 99 0 9999 99 9999 + 039941 9999 99 99 0 9999 99 9999 + 039942 9999 99 99 0 9999 99 9999 + 039943 9999 99 99 0 9999 99 9999 + 039944 9999 99 99 0 9999 99 9999 + 039945 9999 99 99 0 9999 99 9999 + 039946 9999 99 99 0 9999 99 9999 + 039947 9999 99 99 0 9999 99 9999 + 039948 9999 99 99 0 9999 99 9999 + 039949 9999 99 99 0 9999 99 9999 + 039950 9999 99 99 0 9999 99 9999 + 039951 9999 99 99 0 9999 99 9999 + 039952 9999 99 99 0 9999 99 9999 + 039953 9999 99 99 0 9999 99 9999 + 039954 9999 99 99 0 9999 99 9999 + 039955 9999 99 99 0 9999 99 9999 + 039956 9999 99 99 0 9999 99 9999 + 039957 9999 99 99 0 9999 99 9999 + 039958 9999 99 99 0 9999 99 9999 + 039959 9999 99 99 0 9999 99 9999 + 039960 9999 99 99 0 9999 99 9999 + 039961 9999 99 99 0 9999 99 9999 + 039962 9999 99 99 0 9999 99 9999 + 039963 9999 99 99 0 9999 99 9999 + 039964 9999 99 99 0 9999 99 9999 + 039965 9999 99 99 0 9999 99 9999 + 039966 9999 99 99 0 9999 99 9999 + 039967 9999 99 99 0 9999 99 9999 + 039968 9999 99 99 0 9999 99 9999 + 039969 9999 99 99 0 9999 99 9999 + 039970 9999 99 99 0 9999 99 9999 + 039971 9999 99 99 0 9999 99 9999 + 039972 9999 99 99 0 9999 99 9999 + 039973 9999 99 99 0 9999 99 9999 + 039974 9999 99 99 0 9999 99 9999 + 039975 9999 99 99 0 9999 99 9999 + 039976 9999 99 99 0 9999 99 9999 + 039977 9999 99 99 0 9999 99 9999 + 039978 9999 99 99 0 9999 99 9999 + 039979 9999 99 99 0 9999 99 9999 + 039980 9999 99 99 0 9999 99 9999 + 039981 9999 99 99 0 9999 99 9999 + 039982 9999 99 99 0 9999 99 9999 + 039983 9999 99 99 0 9999 99 9999 + 039984 9999 99 99 0 9999 99 9999 + 039985 9999 99 99 0 9999 99 9999 + 039986 9999 99 99 0 9999 99 9999 + 039987 9999 99 99 0 9999 99 9999 + 039988 9999 99 99 0 9999 99 9999 + 039989 9999 99 99 0 9999 99 9999 + 039990 9999 99 99 0 9999 99 9999 + 039991 9999 99 99 0 9999 99 9999 + 039992 9999 99 99 0 9999 99 9999 + 039993 9999 99 99 0 9999 99 9999 + 039994 9999 99 99 0 9999 99 9999 + 039995 9999 99 99 0 9999 99 9999 + 039996 9999 99 99 0 9999 99 9999 + 039997 9999 99 99 0 9999 99 9999 + 039998 9999 99 99 0 9999 99 9999 + 039999 9999 99 99 0 9999 99 9999 + 040000 9999 99 99 0 9999 99 9999 + 040001 9999 99 99 0 9999 99 9999 + 040002 9999 99 99 0 9999 99 9999 + 040003 9999 99 99 0 9999 99 9999 + 040004 9999 99 99 0 9999 99 9999 + 040005 9999 99 99 0 9999 99 9999 + 040006 9999 99 99 0 9999 99 9999 + 040007 9999 99 99 0 9999 99 9999 + 040008 9999 99 99 0 9999 99 9999 + 040009 9999 99 99 0 9999 99 9999 + 040010 9999 99 99 0 9999 99 9999 + 040011 9999 99 99 0 9999 99 9999 + 040012 9999 99 99 0 9999 99 9999 + 040013 9999 99 99 0 9999 99 9999 + 040014 9999 99 99 0 9999 99 9999 + 040015 9999 99 99 0 9999 99 9999 + 040016 9999 99 99 0 9999 99 9999 + 040017 9999 99 99 0 9999 99 9999 + 040018 9999 99 99 0 9999 99 9999 + 040019 9999 99 99 0 9999 99 9999 + 040020 9999 99 99 0 9999 99 9999 + 040021 9999 99 99 0 9999 99 9999 + 040022 9999 99 99 0 9999 99 9999 + 040023 9999 99 99 0 9999 99 9999 + 040024 9999 99 99 0 9999 99 9999 + 040025 9999 99 99 0 9999 99 9999 + 040026 9999 99 99 0 9999 99 9999 + 040027 9999 99 99 0 9999 99 9999 + 040028 9999 99 99 0 9999 99 9999 + 040029 9999 99 99 0 9999 99 9999 + 040030 9999 99 99 0 9999 99 9999 + 040031 9999 99 99 0 9999 99 9999 + 040032 9999 99 99 0 9999 99 9999 + 040033 9999 99 99 0 9999 99 9999 + 040034 9999 99 99 0 9999 99 9999 + 040035 9999 99 99 0 9999 99 9999 + 040036 9999 99 99 0 9999 99 9999 + 040037 9999 99 99 0 9999 99 9999 + 040038 9999 99 99 0 9999 99 9999 + 040039 9999 99 99 0 9999 99 9999 + 040040 9999 99 99 0 9999 99 9999 + 040041 9999 99 99 0 9999 99 9999 + 040042 9999 99 99 0 9999 99 9999 + 040043 9999 99 99 0 9999 99 9999 + 040044 9999 99 99 0 9999 99 9999 + 040045 9999 99 99 0 9999 99 9999 + 040046 9999 99 99 0 9999 99 9999 + 040047 9999 99 99 0 9999 99 9999 + 040048 9999 99 99 0 9999 99 9999 + 040049 9999 99 99 0 9999 99 9999 + 040050 9999 99 99 0 9999 99 9999 + 040051 9999 99 99 0 9999 99 9999 + 040052 9999 99 99 0 9999 99 9999 + 040053 9999 99 99 0 9999 99 9999 + 040054 9999 99 99 0 9999 99 9999 + 040055 9999 99 99 0 9999 99 9999 + 040056 9999 99 99 0 9999 99 9999 + 040057 9999 99 99 0 9999 99 9999 + 040058 9999 99 99 0 9999 99 9999 + 040059 9999 99 99 0 9999 99 9999 + 040060 9999 99 99 0 9999 99 9999 + 040061 9999 99 99 0 9999 99 9999 + 040062 9999 99 99 0 9999 99 9999 + 040063 9999 99 99 0 9999 99 9999 + 040064 9999 99 99 0 9999 99 9999 + 040065 9999 99 99 0 9999 99 9999 + 040066 9999 99 99 0 9999 99 9999 + 040067 9999 99 99 0 9999 99 9999 + 040068 9999 99 99 0 9999 99 9999 + 040069 9999 99 99 0 9999 99 9999 + 040070 9999 99 99 0 9999 99 9999 + 040071 9999 99 99 0 9999 99 9999 + 040072 9999 99 99 0 9999 99 9999 + 040073 9999 99 99 0 9999 99 9999 + 040074 9999 99 99 0 9999 99 9999 + 040075 9999 99 99 0 9999 99 9999 + 040076 9999 99 99 0 9999 99 9999 + 040077 9999 99 99 0 9999 99 9999 + 040078 9999 99 99 0 9999 99 9999 + 040079 9999 99 99 0 9999 99 9999 + 040080 9999 99 99 0 9999 99 9999 + 040081 9999 99 99 0 9999 99 9999 + 040082 9999 99 99 0 9999 99 9999 + 040083 9999 99 99 0 9999 99 9999 + 040084 9999 99 99 0 9999 99 9999 + 040085 9999 99 99 0 9999 99 9999 + 040086 9999 99 99 0 9999 99 9999 + 040087 9999 99 99 0 9999 99 9999 + 040088 9999 99 99 0 9999 99 9999 + 040089 9999 99 99 0 9999 99 9999 + 040090 9999 99 99 0 9999 99 9999 + 040091 9999 99 99 0 9999 99 9999 + 040092 9999 99 99 0 9999 99 9999 + 040093 9999 99 99 0 9999 99 9999 + 040094 9999 99 99 0 9999 99 9999 + 040095 9999 99 99 0 9999 99 9999 + 040096 9999 99 99 0 9999 99 9999 + 040097 9999 99 99 0 9999 99 9999 + 040098 9999 99 99 0 9999 99 9999 + 040099 9999 99 99 0 9999 99 9999 + 040100 9999 99 99 0 9999 99 9999 + 040101 9999 99 99 0 9999 99 9999 + 040102 9999 99 99 0 9999 99 9999 + 040103 9999 99 99 0 9999 99 9999 + 040104 9999 99 99 0 9999 99 9999 + 040105 9999 99 99 0 9999 99 9999 + 040106 9999 99 99 0 9999 99 9999 + 040107 9999 99 99 0 9999 99 9999 + 040108 9999 99 99 0 9999 99 9999 + 040109 9999 99 99 0 9999 99 9999 + 040110 9999 99 99 0 9999 99 9999 + 040111 9999 99 99 0 9999 99 9999 + 040112 9999 99 99 0 9999 99 9999 + 040113 9999 99 99 0 9999 99 9999 + 040114 9999 99 99 0 9999 99 9999 + 040115 9999 99 99 0 9999 99 9999 + 040116 9999 99 99 0 9999 99 9999 + 040117 9999 99 99 0 9999 99 9999 + 040118 9999 99 99 0 9999 99 9999 + 040119 9999 99 99 0 9999 99 9999 + 040120 9999 99 99 0 9999 99 9999 + 040121 9999 99 99 0 9999 99 9999 + 040122 9999 99 99 0 9999 99 9999 + 040123 9999 99 99 0 9999 99 9999 + 040124 9999 99 99 0 9999 99 9999 + 040125 9999 99 99 0 9999 99 9999 + 040126 9999 99 99 0 9999 99 9999 + 040127 9999 99 99 0 9999 99 9999 + 040128 9999 99 99 0 9999 99 9999 + 040129 9999 99 99 0 9999 99 9999 + 040130 9999 99 99 0 9999 99 9999 + 040131 9999 99 99 0 9999 99 9999 + 040132 9999 99 99 0 9999 99 9999 + 040133 9999 99 99 0 9999 99 9999 + 040134 9999 99 99 0 9999 99 9999 + 040135 9999 99 99 0 9999 99 9999 + 040136 9999 99 99 0 9999 99 9999 + 040137 9999 99 99 0 9999 99 9999 + 040138 9999 99 99 0 9999 99 9999 + 040139 9999 99 99 0 9999 99 9999 + 040140 9999 99 99 0 9999 99 9999 + 040141 9999 99 99 0 9999 99 9999 + 040142 9999 99 99 0 9999 99 9999 + 040143 9999 99 99 0 9999 99 9999 + 040144 9999 99 99 0 9999 99 9999 + 040145 9999 99 99 0 9999 99 9999 + 040146 9999 99 99 0 9999 99 9999 + 040147 9999 99 99 0 9999 99 9999 + 040148 9999 99 99 0 9999 99 9999 + 040149 9999 99 99 0 9999 99 9999 + 040150 9999 99 99 0 9999 99 9999 + 040151 9999 99 99 0 9999 99 9999 + 040152 9999 99 99 0 9999 99 9999 + 040153 9999 99 99 0 9999 99 9999 + 040154 9999 99 99 0 9999 99 9999 + 040155 9999 99 99 0 9999 99 9999 + 040156 9999 99 99 0 9999 99 9999 + 040157 9999 99 99 0 9999 99 9999 + 040158 9999 99 99 0 9999 99 9999 + 040159 9999 99 99 0 9999 99 9999 + 040160 9999 99 99 0 9999 99 9999 + 040161 9999 99 99 0 9999 99 9999 + 040162 9999 99 99 0 9999 99 9999 + 040163 9999 99 99 0 9999 99 9999 + 040164 9999 99 99 0 9999 99 9999 + 040165 9999 99 99 0 9999 99 9999 + 040166 9999 99 99 0 9999 99 9999 + 040167 9999 99 99 0 9999 99 9999 + 040168 9999 99 99 0 9999 99 9999 + 040169 9999 99 99 0 9999 99 9999 + 040170 9999 99 99 0 9999 99 9999 + 040171 9999 99 99 0 9999 99 9999 + 040172 9999 99 99 0 9999 99 9999 + 040173 9999 99 99 0 9999 99 9999 + 040174 9999 99 99 0 9999 99 9999 + 040175 9999 99 99 0 9999 99 9999 + 040176 9999 99 99 0 9999 99 9999 + 040177 9999 99 99 0 9999 99 9999 + 040178 9999 99 99 0 9999 99 9999 + 040179 9999 99 99 0 9999 99 9999 + 040180 9999 99 99 0 9999 99 9999 + 040181 9999 99 99 0 9999 99 9999 + 040182 9999 99 99 0 9999 99 9999 + 040183 9999 99 99 0 9999 99 9999 + 040184 9999 99 99 0 9999 99 9999 + 040185 9999 99 99 0 9999 99 9999 + 040186 9999 99 99 0 9999 99 9999 + 040187 9999 99 99 0 9999 99 9999 + 040188 9999 99 99 0 9999 99 9999 + 040189 9999 99 99 0 9999 99 9999 + 040190 9999 99 99 0 9999 99 9999 + 040191 9999 99 99 0 9999 99 9999 + 040192 9999 99 99 0 9999 99 9999 + 040193 9999 99 99 0 9999 99 9999 + 040194 9999 99 99 0 9999 99 9999 + 040195 9999 99 99 0 9999 99 9999 + 040196 9999 99 99 0 9999 99 9999 + 040197 9999 99 99 0 9999 99 9999 + 040198 9999 99 99 0 9999 99 9999 + 040199 9999 99 99 0 9999 99 9999 + 040200 9999 99 99 0 9999 99 9999 + 040201 9999 99 99 0 9999 99 9999 + 040202 9999 99 99 0 9999 99 9999 + 040203 9999 99 99 0 9999 99 9999 + 040204 9999 99 99 0 9999 99 9999 + 040205 9999 99 99 0 9999 99 9999 + 040206 9999 99 99 0 9999 99 9999 + 040207 9999 99 99 0 9999 99 9999 + 040208 9999 99 99 0 9999 99 9999 + 040209 9999 99 99 0 9999 99 9999 + 040210 9999 99 99 0 9999 99 9999 + 040211 9999 99 99 0 9999 99 9999 + 040212 9999 99 99 0 9999 99 9999 + 040213 9999 99 99 0 9999 99 9999 + 040214 9999 99 99 0 9999 99 9999 + 040215 9999 99 99 0 9999 99 9999 + 040216 9999 99 99 0 9999 99 9999 + 040217 9999 99 99 0 9999 99 9999 + 040218 9999 99 99 0 9999 99 9999 + 040219 9999 99 99 0 9999 99 9999 + 040220 9999 99 99 0 9999 99 9999 + 040221 9999 99 99 0 9999 99 9999 + 040222 9999 99 99 0 9999 99 9999 + 040223 9999 99 99 0 9999 99 9999 + 040224 9999 99 99 0 9999 99 9999 + 040225 9999 99 99 0 9999 99 9999 + 040226 9999 99 99 0 9999 99 9999 + 040227 9999 99 99 0 9999 99 9999 + 040228 9999 99 99 0 9999 99 9999 + 040229 9999 99 99 0 9999 99 9999 + 040230 9999 99 99 0 9999 99 9999 + 040231 9999 99 99 0 9999 99 9999 + 040232 9999 99 99 0 9999 99 9999 + 040233 9999 99 99 0 9999 99 9999 + 040234 9999 99 99 0 9999 99 9999 + 040235 9999 99 99 0 9999 99 9999 + 040236 9999 99 99 0 9999 99 9999 + 040237 9999 99 99 0 9999 99 9999 + 040238 9999 99 99 0 9999 99 9999 + 040239 9999 99 99 0 9999 99 9999 + 040240 9999 99 99 0 9999 99 9999 + 040241 9999 99 99 0 9999 99 9999 + 040242 9999 99 99 0 9999 99 9999 + 040243 9999 99 99 0 9999 99 9999 + 040244 9999 99 99 0 9999 99 9999 + 040245 9999 99 99 0 9999 99 9999 + 040246 9999 99 99 0 9999 99 9999 + 040247 9999 99 99 0 9999 99 9999 + 040248 9999 99 99 0 9999 99 9999 + 040249 9999 99 99 0 9999 99 9999 + 040250 9999 99 99 0 9999 99 9999 + 040251 9999 99 99 0 9999 99 9999 + 040252 9999 99 99 0 9999 99 9999 + 040253 9999 99 99 0 9999 99 9999 + 040254 9999 99 99 0 9999 99 9999 + 040255 9999 99 99 0 9999 99 9999 + 040256 9999 99 99 0 9999 99 9999 + 040257 9999 99 99 0 9999 99 9999 + 040258 9999 99 99 0 9999 99 9999 + 040259 9999 99 99 0 9999 99 9999 + 040260 9999 99 99 0 9999 99 9999 + 040261 9999 99 99 0 9999 99 9999 + 040262 9999 99 99 0 9999 99 9999 + 040263 9999 99 99 0 9999 99 9999 + 040264 9999 99 99 0 9999 99 9999 + 040265 9999 99 99 0 9999 99 9999 + 040266 9999 99 99 0 9999 99 9999 + 040267 9999 99 99 0 9999 99 9999 + 040268 9999 99 99 0 9999 99 9999 + 040269 9999 99 99 0 9999 99 9999 + 040270 9999 99 99 0 9999 99 9999 + 040271 9999 99 99 0 9999 99 9999 + 040272 9999 99 99 0 9999 99 9999 + 040273 9999 99 99 0 9999 99 9999 + 040274 9999 99 99 0 9999 99 9999 + 040275 9999 99 99 0 9999 99 9999 + 040276 9999 99 99 0 9999 99 9999 + 040277 9999 99 99 0 9999 99 9999 + 040278 9999 99 99 0 9999 99 9999 + 040279 9999 99 99 0 9999 99 9999 + 040280 9999 99 99 0 9999 99 9999 + 040281 9999 99 99 0 9999 99 9999 + 040282 9999 99 99 0 9999 99 9999 + 040283 9999 99 99 0 9999 99 9999 + 040284 9999 99 99 0 9999 99 9999 + 040285 9999 99 99 0 9999 99 9999 + 040286 9999 99 99 0 9999 99 9999 + 040287 9999 99 99 0 9999 99 9999 + 040288 9999 99 99 0 9999 99 9999 + 040289 9999 99 99 0 9999 99 9999 + 040290 9999 99 99 0 9999 99 9999 + 040291 9999 99 99 0 9999 99 9999 + 040292 9999 99 99 0 9999 99 9999 + 040293 9999 99 99 0 9999 99 9999 + 040294 9999 99 99 0 9999 99 9999 + 040295 9999 99 99 0 9999 99 9999 + 040296 9999 99 99 0 9999 99 9999 + 040297 9999 99 99 0 9999 99 9999 + 040298 9999 99 99 0 9999 99 9999 + 040299 9999 99 99 0 9999 99 9999 + 040300 9999 99 99 0 9999 99 9999 + 040301 9999 99 99 0 9999 99 9999 + 040302 9999 99 99 0 9999 99 9999 + 040303 9999 99 99 0 9999 99 9999 + 040304 9999 99 99 0 9999 99 9999 + 040305 9999 99 99 0 9999 99 9999 + 040306 9999 99 99 0 9999 99 9999 + 040307 9999 99 99 0 9999 99 9999 + 040308 9999 99 99 0 9999 99 9999 + 040309 9999 99 99 0 9999 99 9999 + 040310 9999 99 99 0 9999 99 9999 + 040311 9999 99 99 0 9999 99 9999 + 040312 9999 99 99 0 9999 99 9999 + 040313 9999 99 99 0 9999 99 9999 + 040314 9999 99 99 0 9999 99 9999 + 040315 9999 99 99 0 9999 99 9999 + 040316 9999 99 99 0 9999 99 9999 + 040317 9999 99 99 0 9999 99 9999 + 040318 9999 99 99 0 9999 99 9999 + 040319 9999 99 99 0 9999 99 9999 + 040320 9999 99 99 0 9999 99 9999 + 040321 9999 99 99 0 9999 99 9999 + 040322 9999 99 99 0 9999 99 9999 + 040323 9999 99 99 0 9999 99 9999 + 040324 9999 99 99 0 9999 99 9999 + 040325 9999 99 99 0 9999 99 9999 + 040326 9999 99 99 0 9999 99 9999 + 040327 9999 99 99 0 9999 99 9999 + 040328 9999 99 99 0 9999 99 9999 + 040329 9999 99 99 0 9999 99 9999 + 040330 9999 99 99 0 9999 99 9999 + 040331 9999 99 99 0 9999 99 9999 + 040332 9999 99 99 0 9999 99 9999 + 040333 9999 99 99 0 9999 99 9999 + 040334 9999 99 99 0 9999 99 9999 + 040335 9999 99 99 0 9999 99 9999 + 040336 9999 99 99 0 9999 99 9999 + 040337 9999 99 99 0 9999 99 9999 + 040338 9999 99 99 0 9999 99 9999 + 040339 9999 99 99 0 9999 99 9999 + 040340 9999 99 99 0 9999 99 9999 + 040341 9999 99 99 0 9999 99 9999 + 040342 9999 99 99 0 9999 99 9999 + 040343 9999 99 99 0 9999 99 9999 + 040344 9999 99 99 0 9999 99 9999 + 040345 9999 99 99 0 9999 99 9999 + 040346 9999 99 99 0 9999 99 9999 + 040347 9999 99 99 0 9999 99 9999 + 040348 9999 99 99 0 9999 99 9999 + 040349 9999 99 99 0 9999 99 9999 + 040350 9999 99 99 0 9999 99 9999 + 040351 9999 99 99 0 9999 99 9999 + 040352 9999 99 99 0 9999 99 9999 + 040353 9999 99 99 0 9999 99 9999 + 040354 9999 99 99 0 9999 99 9999 + 040355 9999 99 99 0 9999 99 9999 + 040356 9999 99 99 0 9999 99 9999 + 040357 9999 99 99 0 9999 99 9999 + 040358 9999 99 99 0 9999 99 9999 + 040359 9999 99 99 0 9999 99 9999 + 040360 9999 99 99 0 9999 99 9999 + 040361 9999 99 99 0 9999 99 9999 + 040362 9999 99 99 0 9999 99 9999 + 040363 9999 99 99 0 9999 99 9999 + 040364 9999 99 99 0 9999 99 9999 + 040365 9999 99 99 0 9999 99 9999 + 040366 9999 99 99 0 9999 99 9999 + 040367 9999 99 99 0 9999 99 9999 + 040368 9999 99 99 0 9999 99 9999 + 040369 9999 99 99 0 9999 99 9999 + 040370 9999 99 99 0 9999 99 9999 + 040371 9999 99 99 0 9999 99 9999 + 040372 9999 99 99 0 9999 99 9999 + 040373 9999 99 99 0 9999 99 9999 + 040374 9999 99 99 0 9999 99 9999 + 040375 9999 99 99 0 9999 99 9999 + 040376 9999 99 99 0 9999 99 9999 + 040377 9999 99 99 0 9999 99 9999 + 040378 9999 99 99 0 9999 99 9999 + 040379 9999 99 99 0 9999 99 9999 + 040380 9999 99 99 0 9999 99 9999 + 040381 9999 99 99 0 9999 99 9999 + 040382 9999 99 99 0 9999 99 9999 + 040383 9999 99 99 0 9999 99 9999 + 040384 9999 99 99 0 9999 99 9999 + 040385 9999 99 99 0 9999 99 9999 + 040386 9999 99 99 0 9999 99 9999 + 040387 9999 99 99 0 9999 99 9999 + 040388 9999 99 99 0 9999 99 9999 + 040389 9999 99 99 0 9999 99 9999 + 040390 9999 99 99 0 9999 99 9999 + 040391 9999 99 99 0 9999 99 9999 + 040392 9999 99 99 0 9999 99 9999 + 040393 9999 99 99 0 9999 99 9999 + 040394 9999 99 99 0 9999 99 9999 + 040395 9999 99 99 0 9999 99 9999 + 040396 9999 99 99 0 9999 99 9999 + 040397 9999 99 99 0 9999 99 9999 + 040398 9999 99 99 0 9999 99 9999 + 040399 9999 99 99 0 9999 99 9999 + 040400 9999 99 99 0 9999 99 9999 + 040401 9999 99 99 0 9999 99 9999 + 040402 9999 99 99 0 9999 99 9999 + 040403 9999 99 99 0 9999 99 9999 + 040404 9999 99 99 0 9999 99 9999 + 040405 9999 99 99 0 9999 99 9999 + 040406 9999 99 99 0 9999 99 9999 + 040407 9999 99 99 0 9999 99 9999 + 040408 9999 99 99 0 9999 99 9999 + 040409 9999 99 99 0 9999 99 9999 + 040410 9999 99 99 0 9999 99 9999 + 040411 9999 99 99 0 9999 99 9999 + 040412 9999 99 99 0 9999 99 9999 + 040413 9999 99 99 0 9999 99 9999 + 040414 9999 99 99 0 9999 99 9999 + 040415 9999 99 99 0 9999 99 9999 + 040416 9999 99 99 0 9999 99 9999 + 040417 9999 99 99 0 9999 99 9999 + 040418 9999 99 99 0 9999 99 9999 + 040419 9999 99 99 0 9999 99 9999 + 040420 9999 99 99 0 9999 99 9999 + 040421 9999 99 99 0 9999 99 9999 + 040422 9999 99 99 0 9999 99 9999 + 040423 9999 99 99 0 9999 99 9999 + 040424 9999 99 99 0 9999 99 9999 + 040425 9999 99 99 0 9999 99 9999 + 040426 9999 99 99 0 9999 99 9999 + 040427 9999 99 99 0 9999 99 9999 + 040428 9999 99 99 0 9999 99 9999 + 040429 9999 99 99 0 9999 99 9999 + 040430 9999 99 99 0 9999 99 9999 + 040431 9999 99 99 0 9999 99 9999 + 040432 9999 99 99 0 9999 99 9999 + 040433 9999 99 99 0 9999 99 9999 + 040434 9999 99 99 0 9999 99 9999 + 040435 9999 99 99 0 9999 99 9999 + 040436 9999 99 99 0 9999 99 9999 + 040437 9999 99 99 0 9999 99 9999 + 040438 9999 99 99 0 9999 99 9999 + 040439 9999 99 99 0 9999 99 9999 + 040440 9999 99 99 0 9999 99 9999 + 040441 9999 99 99 0 9999 99 9999 + 040442 9999 99 99 0 9999 99 9999 + 040443 9999 99 99 0 9999 99 9999 + 040444 9999 99 99 0 9999 99 9999 + 040445 9999 99 99 0 9999 99 9999 + 040446 9999 99 99 0 9999 99 9999 + 040447 9999 99 99 0 9999 99 9999 + 040448 9999 99 99 0 9999 99 9999 + 040449 9999 99 99 0 9999 99 9999 + 040450 9999 99 99 0 9999 99 9999 + 040451 9999 99 99 0 9999 99 9999 + 040452 9999 99 99 0 9999 99 9999 + 040453 9999 99 99 0 9999 99 9999 + 040454 9999 99 99 0 9999 99 9999 + 040455 9999 99 99 0 9999 99 9999 + 040456 9999 99 99 0 9999 99 9999 + 040457 9999 99 99 0 9999 99 9999 + 040458 9999 99 99 0 9999 99 9999 + 040459 9999 99 99 0 9999 99 9999 + 040460 9999 99 99 0 9999 99 9999 + 040461 9999 99 99 0 9999 99 9999 + 040462 9999 99 99 0 9999 99 9999 + 040463 9999 99 99 0 9999 99 9999 + 040464 9999 99 99 0 9999 99 9999 + 040465 9999 99 99 0 9999 99 9999 + 040466 9999 99 99 0 9999 99 9999 + 040467 9999 99 99 0 9999 99 9999 + 040468 9999 99 99 0 9999 99 9999 + 040469 9999 99 99 0 9999 99 9999 + 040470 9999 99 99 0 9999 99 9999 + 040471 9999 99 99 0 9999 99 9999 + 040472 9999 99 99 0 9999 99 9999 + 040473 9999 99 99 0 9999 99 9999 + 040474 9999 99 99 0 9999 99 9999 + 040475 9999 99 99 0 9999 99 9999 + 040476 9999 99 99 0 9999 99 9999 + 040477 9999 99 99 0 9999 99 9999 + 040478 9999 99 99 0 9999 99 9999 + 040479 9999 99 99 0 9999 99 9999 + 040480 9999 99 99 0 9999 99 9999 + 040481 9999 99 99 0 9999 99 9999 + 040482 9999 99 99 0 9999 99 9999 + 040483 9999 99 99 0 9999 99 9999 + 040484 9999 99 99 0 9999 99 9999 + 040485 9999 99 99 0 9999 99 9999 + 040486 9999 99 99 0 9999 99 9999 + 040487 9999 99 99 0 9999 99 9999 + 040488 9999 99 99 0 9999 99 9999 + 040489 9999 99 99 0 9999 99 9999 + 040490 9999 99 99 0 9999 99 9999 + 040491 9999 99 99 0 9999 99 9999 + 040492 9999 99 99 0 9999 99 9999 + 040493 9999 99 99 0 9999 99 9999 + 040494 9999 99 99 0 9999 99 9999 + 040495 9999 99 99 0 9999 99 9999 + 040496 9999 99 99 0 9999 99 9999 + 040497 9999 99 99 0 9999 99 9999 + 040498 9999 99 99 0 9999 99 9999 + 040499 9999 99 99 0 9999 99 9999 + 040500 9999 99 99 0 9999 99 9999 + 040501 9999 99 99 0 9999 99 9999 + 040502 9999 99 99 0 9999 99 9999 + 040503 9999 99 99 0 9999 99 9999 + 040504 9999 99 99 0 9999 99 9999 + 040505 9999 99 99 0 9999 99 9999 + 040506 9999 99 99 0 9999 99 9999 + 040507 9999 99 99 0 9999 99 9999 + 040508 9999 99 99 0 9999 99 9999 + 040509 9999 99 99 0 9999 99 9999 + 040510 9999 99 99 0 9999 99 9999 + 040511 9999 99 99 0 9999 99 9999 + 040512 9999 99 99 0 9999 99 9999 + 040513 9999 99 99 0 9999 99 9999 + 040514 9999 99 99 0 9999 99 9999 + 040515 9999 99 99 0 9999 99 9999 + 040516 9999 99 99 0 9999 99 9999 + 040517 9999 99 99 0 9999 99 9999 + 040518 9999 99 99 0 9999 99 9999 + 040519 9999 99 99 0 9999 99 9999 + 040520 9999 99 99 0 9999 99 9999 + 040521 9999 99 99 0 9999 99 9999 + 040522 9999 99 99 0 9999 99 9999 + 040523 9999 99 99 0 9999 99 9999 + 040524 9999 99 99 0 9999 99 9999 + 040525 9999 99 99 0 9999 99 9999 + 040526 9999 99 99 0 9999 99 9999 + 040527 9999 99 99 0 9999 99 9999 + 040528 9999 99 99 0 9999 99 9999 + 040529 9999 99 99 0 9999 99 9999 + 040530 9999 99 99 0 9999 99 9999 + 040531 9999 99 99 0 9999 99 9999 + 040532 9999 99 99 0 9999 99 9999 + 040533 9999 99 99 0 9999 99 9999 + 040534 9999 99 99 0 9999 99 9999 + 040535 9999 99 99 0 9999 99 9999 + 040536 9999 99 99 0 9999 99 9999 + 040537 9999 99 99 0 9999 99 9999 + 040538 9999 99 99 0 9999 99 9999 + 040539 9999 99 99 0 9999 99 9999 + 040540 9999 99 99 0 9999 99 9999 + 040541 9999 99 99 0 9999 99 9999 + 040542 9999 99 99 0 9999 99 9999 + 040543 9999 99 99 0 9999 99 9999 + 040544 9999 99 99 0 9999 99 9999 + 040545 9999 99 99 0 9999 99 9999 + 040546 9999 99 99 0 9999 99 9999 + 040547 9999 99 99 0 9999 99 9999 + 040548 9999 99 99 0 9999 99 9999 + 040549 9999 99 99 0 9999 99 9999 + 040550 9999 99 99 0 9999 99 9999 + 040551 9999 99 99 0 9999 99 9999 + 040552 9999 99 99 0 9999 99 9999 + 040553 9999 99 99 0 9999 99 9999 + 040554 9999 99 99 0 9999 99 9999 + 040555 9999 99 99 0 9999 99 9999 + 040556 9999 99 99 0 9999 99 9999 + 040557 9999 99 99 0 9999 99 9999 + 040558 9999 99 99 0 9999 99 9999 + 040559 9999 99 99 0 9999 99 9999 + 040560 9999 99 99 0 9999 99 9999 + 040561 9999 99 99 0 9999 99 9999 + 040562 9999 99 99 0 9999 99 9999 + 040563 9999 99 99 0 9999 99 9999 + 040564 9999 99 99 0 9999 99 9999 + 040565 9999 99 99 0 9999 99 9999 + 040566 9999 99 99 0 9999 99 9999 + 040567 9999 99 99 0 9999 99 9999 + 040568 9999 99 99 0 9999 99 9999 + 040569 9999 99 99 0 9999 99 9999 + 040570 9999 99 99 0 9999 99 9999 + 040571 9999 99 99 0 9999 99 9999 + 040572 9999 99 99 0 9999 99 9999 + 040573 9999 99 99 0 9999 99 9999 + 040574 9999 99 99 0 9999 99 9999 + 040575 9999 99 99 0 9999 99 9999 + 040576 9999 99 99 0 9999 99 9999 + 040577 9999 99 99 0 9999 99 9999 + 040578 9999 99 99 0 9999 99 9999 + 040579 9999 99 99 0 9999 99 9999 + 040580 9999 99 99 0 9999 99 9999 + 040581 9999 99 99 0 9999 99 9999 + 040582 9999 99 99 0 9999 99 9999 + 040583 9999 99 99 0 9999 99 9999 + 040584 9999 99 99 0 9999 99 9999 + 040585 9999 99 99 0 9999 99 9999 + 040586 9999 99 99 0 9999 99 9999 + 040587 9999 99 99 0 9999 99 9999 + 040588 9999 99 99 0 9999 99 9999 + 040589 9999 99 99 0 9999 99 9999 + 040590 9999 99 99 0 9999 99 9999 + 040591 9999 99 99 0 9999 99 9999 + 040592 9999 99 99 0 9999 99 9999 + 040593 9999 99 99 0 9999 99 9999 + 040594 9999 99 99 0 9999 99 9999 + 040595 9999 99 99 0 9999 99 9999 + 040596 9999 99 99 0 9999 99 9999 + 040597 9999 99 99 0 9999 99 9999 + 040598 9999 99 99 0 9999 99 9999 + 040599 9999 99 99 0 9999 99 9999 + 040600 9999 99 99 0 9999 99 9999 + 040601 9999 99 99 0 9999 99 9999 + 040602 9999 99 99 0 9999 99 9999 + 040603 9999 99 99 0 9999 99 9999 + 040604 9999 99 99 0 9999 99 9999 + 040605 9999 99 99 0 9999 99 9999 + 040606 9999 99 99 0 9999 99 9999 + 040607 9999 99 99 0 9999 99 9999 + 040608 9999 99 99 0 9999 99 9999 + 040609 9999 99 99 0 9999 99 9999 + 040610 9999 99 99 0 9999 99 9999 + 040611 9999 99 99 0 9999 99 9999 + 040612 9999 99 99 0 9999 99 9999 + 040613 9999 99 99 0 9999 99 9999 + 040614 9999 99 99 0 9999 99 9999 + 040615 9999 99 99 0 9999 99 9999 + 040616 9999 99 99 0 9999 99 9999 + 040617 9999 99 99 0 9999 99 9999 + 040618 9999 99 99 0 9999 99 9999 + 040619 9999 99 99 0 9999 99 9999 + 040620 9999 99 99 0 9999 99 9999 + 040621 9999 99 99 0 9999 99 9999 + 040622 9999 99 99 0 9999 99 9999 + 040623 9999 99 99 0 9999 99 9999 + 040624 9999 99 99 0 9999 99 9999 + 040625 9999 99 99 0 9999 99 9999 + 040626 9999 99 99 0 9999 99 9999 + 040627 9999 99 99 0 9999 99 9999 + 040628 9999 99 99 0 9999 99 9999 + 040629 9999 99 99 0 9999 99 9999 + 040630 9999 99 99 0 9999 99 9999 + 040631 9999 99 99 0 9999 99 9999 + 040632 9999 99 99 0 9999 99 9999 + 040633 9999 99 99 0 9999 99 9999 + 040634 9999 99 99 0 9999 99 9999 + 040635 9999 99 99 0 9999 99 9999 + 040636 9999 99 99 0 9999 99 9999 + 040637 9999 99 99 0 9999 99 9999 + 040638 9999 99 99 0 9999 99 9999 + 040639 9999 99 99 0 9999 99 9999 + 040640 9999 99 99 0 9999 99 9999 + 040641 9999 99 99 0 9999 99 9999 + 040642 9999 99 99 0 9999 99 9999 + 040643 9999 99 99 0 9999 99 9999 + 040644 9999 99 99 0 9999 99 9999 + 040645 9999 99 99 0 9999 99 9999 + 040646 9999 99 99 0 9999 99 9999 + 040647 9999 99 99 0 9999 99 9999 + 040648 9999 99 99 0 9999 99 9999 + 040649 9999 99 99 0 9999 99 9999 + 040650 9999 99 99 0 9999 99 9999 + 040651 9999 99 99 0 9999 99 9999 + 040652 9999 99 99 0 9999 99 9999 + 040653 9999 99 99 0 9999 99 9999 + 040654 9999 99 99 0 9999 99 9999 + 040655 9999 99 99 0 9999 99 9999 + 040656 9999 99 99 0 9999 99 9999 + 040657 9999 99 99 0 9999 99 9999 + 040658 9999 99 99 0 9999 99 9999 + 040659 9999 99 99 0 9999 99 9999 + 040660 9999 99 99 0 9999 99 9999 + 040661 9999 99 99 0 9999 99 9999 + 040662 9999 99 99 0 9999 99 9999 + 040663 9999 99 99 0 9999 99 9999 + 040664 9999 99 99 0 9999 99 9999 + 040665 9999 99 99 0 9999 99 9999 + 040666 9999 99 99 0 9999 99 9999 + 040667 9999 99 99 0 9999 99 9999 + 040668 9999 99 99 0 9999 99 9999 + 040669 9999 99 99 0 9999 99 9999 + 040670 9999 99 99 0 9999 99 9999 + 040671 9999 99 99 0 9999 99 9999 + 040672 9999 99 99 0 9999 99 9999 + 040673 9999 99 99 0 9999 99 9999 + 040674 9999 99 99 0 9999 99 9999 + 040675 9999 99 99 0 9999 99 9999 + 040676 9999 99 99 0 9999 99 9999 + 040677 9999 99 99 0 9999 99 9999 + 040678 9999 99 99 0 9999 99 9999 + 040679 9999 99 99 0 9999 99 9999 + 040680 9999 99 99 0 9999 99 9999 + 040681 9999 99 99 0 9999 99 9999 + 040682 9999 99 99 0 9999 99 9999 + 040683 9999 99 99 0 9999 99 9999 + 040684 9999 99 99 0 9999 99 9999 + 040685 9999 99 99 0 9999 99 9999 + 040686 9999 99 99 0 9999 99 9999 + 040687 9999 99 99 0 9999 99 9999 + 040688 9999 99 99 0 9999 99 9999 + 040689 9999 99 99 0 9999 99 9999 + 040690 9999 99 99 0 9999 99 9999 + 040691 9999 99 99 0 9999 99 9999 + 040692 9999 99 99 0 9999 99 9999 + 040693 9999 99 99 0 9999 99 9999 + 040694 9999 99 99 0 9999 99 9999 + 040695 9999 99 99 0 9999 99 9999 + 040696 9999 99 99 0 9999 99 9999 + 040697 9999 99 99 0 9999 99 9999 + 040698 9999 99 99 0 9999 99 9999 + 040699 9999 99 99 0 9999 99 9999 + 040700 9999 99 99 0 9999 99 9999 + 040701 9999 99 99 0 9999 99 9999 + 040702 9999 99 99 0 9999 99 9999 + 040703 9999 99 99 0 9999 99 9999 + 040704 9999 99 99 0 9999 99 9999 + 040705 9999 99 99 0 9999 99 9999 + 040706 9999 99 99 0 9999 99 9999 + 040707 9999 99 99 0 9999 99 9999 + 040708 9999 99 99 0 9999 99 9999 + 040709 9999 99 99 0 9999 99 9999 + 040710 9999 99 99 0 9999 99 9999 + 040711 9999 99 99 0 9999 99 9999 + 040712 9999 99 99 0 9999 99 9999 + 040713 9999 99 99 0 9999 99 9999 + 040714 9999 99 99 0 9999 99 9999 + 040715 9999 99 99 0 9999 99 9999 + 040716 9999 99 99 0 9999 99 9999 + 040717 9999 99 99 0 9999 99 9999 + 040718 9999 99 99 0 9999 99 9999 + 040719 9999 99 99 0 9999 99 9999 + 040720 9999 99 99 0 9999 99 9999 + 040721 9999 99 99 0 9999 99 9999 + 040722 9999 99 99 0 9999 99 9999 + 040723 9999 99 99 0 9999 99 9999 + 040724 9999 99 99 0 9999 99 9999 + 040725 9999 99 99 0 9999 99 9999 + 040726 9999 99 99 0 9999 99 9999 + 040727 9999 99 99 0 9999 99 9999 + 040728 9999 99 99 0 9999 99 9999 + 040729 9999 99 99 0 9999 99 9999 + 040730 9999 99 99 0 9999 99 9999 + 040731 9999 99 99 0 9999 99 9999 + 040732 9999 99 99 0 9999 99 9999 + 040733 9999 99 99 0 9999 99 9999 + 040734 9999 99 99 0 9999 99 9999 + 040735 9999 99 99 0 9999 99 9999 + 040736 9999 99 99 0 9999 99 9999 + 040737 9999 99 99 0 9999 99 9999 + 040738 9999 99 99 0 9999 99 9999 + 040739 9999 99 99 0 9999 99 9999 + 040740 9999 99 99 0 9999 99 9999 + 040741 9999 99 99 0 9999 99 9999 + 040742 9999 99 99 0 9999 99 9999 + 040743 9999 99 99 0 9999 99 9999 + 040744 9999 99 99 0 9999 99 9999 + 040745 9999 99 99 0 9999 99 9999 + 040746 9999 99 99 0 9999 99 9999 + 040747 9999 99 99 0 9999 99 9999 + 040748 9999 99 99 0 9999 99 9999 + 040749 9999 99 99 0 9999 99 9999 + 040750 9999 99 99 0 9999 99 9999 + 040751 9999 99 99 0 9999 99 9999 + 040752 9999 99 99 0 9999 99 9999 + 040753 9999 99 99 0 9999 99 9999 + 040754 9999 99 99 0 9999 99 9999 + 040755 9999 99 99 0 9999 99 9999 + 040756 9999 99 99 0 9999 99 9999 + 040757 9999 99 99 0 9999 99 9999 + 040758 9999 99 99 0 9999 99 9999 + 040759 9999 99 99 0 9999 99 9999 + 040760 9999 99 99 0 9999 99 9999 + 040761 9999 99 99 0 9999 99 9999 + 040762 9999 99 99 0 9999 99 9999 + 040763 9999 99 99 0 9999 99 9999 + 040764 9999 99 99 0 9999 99 9999 + 040765 9999 99 99 0 9999 99 9999 + 040766 9999 99 99 0 9999 99 9999 + 040767 9999 99 99 0 9999 99 9999 + 040768 9999 99 99 0 9999 99 9999 + 040769 9999 99 99 0 9999 99 9999 + 040770 9999 99 99 0 9999 99 9999 + 040771 9999 99 99 0 9999 99 9999 + 040772 9999 99 99 0 9999 99 9999 + 040773 9999 99 99 0 9999 99 9999 + 040774 9999 99 99 0 9999 99 9999 + 040775 9999 99 99 0 9999 99 9999 + 040776 9999 99 99 0 9999 99 9999 + 040777 9999 99 99 0 9999 99 9999 + 040778 9999 99 99 0 9999 99 9999 + 040779 9999 99 99 0 9999 99 9999 + 040780 9999 99 99 0 9999 99 9999 + 040781 9999 99 99 0 9999 99 9999 + 040782 9999 99 99 0 9999 99 9999 + 040783 9999 99 99 0 9999 99 9999 + 040784 9999 99 99 0 9999 99 9999 + 040785 9999 99 99 0 9999 99 9999 + 040786 9999 99 99 0 9999 99 9999 + 040787 9999 99 99 0 9999 99 9999 + 040788 9999 99 99 0 9999 99 9999 + 040789 9999 99 99 0 9999 99 9999 + 040790 9999 99 99 0 9999 99 9999 + 040791 9999 99 99 0 9999 99 9999 + 040792 9999 99 99 0 9999 99 9999 + 040793 9999 99 99 0 9999 99 9999 + 040794 9999 99 99 0 9999 99 9999 + 040795 9999 99 99 0 9999 99 9999 + 040796 9999 99 99 0 9999 99 9999 + 040797 9999 99 99 0 9999 99 9999 + 040798 9999 99 99 0 9999 99 9999 + 040799 9999 99 99 0 9999 99 9999 + 040800 9999 99 99 0 9999 99 9999 + 040801 9999 99 99 0 9999 99 9999 + 040802 9999 99 99 0 9999 99 9999 + 040803 9999 99 99 0 9999 99 9999 + 040804 9999 99 99 0 9999 99 9999 + 040805 9999 99 99 0 9999 99 9999 + 040806 9999 99 99 0 9999 99 9999 + 040807 9999 99 99 0 9999 99 9999 + 040808 9999 99 99 0 9999 99 9999 + 040809 9999 99 99 0 9999 99 9999 + 040810 9999 99 99 0 9999 99 9999 + 040811 9999 99 99 0 9999 99 9999 + 040812 9999 99 99 0 9999 99 9999 + 040813 9999 99 99 0 9999 99 9999 + 040814 9999 99 99 0 9999 99 9999 + 040815 9999 99 99 0 9999 99 9999 + 040816 9999 99 99 0 9999 99 9999 + 040817 9999 99 99 0 9999 99 9999 + 040818 9999 99 99 0 9999 99 9999 + 040819 9999 99 99 0 9999 99 9999 + 040820 9999 99 99 0 9999 99 9999 + 040821 9999 99 99 0 9999 99 9999 + 040822 9999 99 99 0 9999 99 9999 + 040823 9999 99 99 0 9999 99 9999 + 040824 9999 99 99 0 9999 99 9999 + 040825 9999 99 99 0 9999 99 9999 + 040826 9999 99 99 0 9999 99 9999 + 040827 9999 99 99 0 9999 99 9999 + 040828 9999 99 99 0 9999 99 9999 + 040829 9999 99 99 0 9999 99 9999 + 040830 9999 99 99 0 9999 99 9999 + 040831 9999 99 99 0 9999 99 9999 + 040832 9999 99 99 0 9999 99 9999 + 040833 9999 99 99 0 9999 99 9999 + 040834 9999 99 99 0 9999 99 9999 + 040835 9999 99 99 0 9999 99 9999 + 040836 9999 99 99 0 9999 99 9999 + 040837 9999 99 99 0 9999 99 9999 + 040838 9999 99 99 0 9999 99 9999 + 040839 9999 99 99 0 9999 99 9999 + 040840 9999 99 99 0 9999 99 9999 + 040841 9999 99 99 0 9999 99 9999 + 040842 9999 99 99 0 9999 99 9999 + 040843 9999 99 99 0 9999 99 9999 + 040844 9999 99 99 0 9999 99 9999 + 040845 9999 99 99 0 9999 99 9999 + 040846 9999 99 99 0 9999 99 9999 + 040847 9999 99 99 0 9999 99 9999 + 040848 9999 99 99 0 9999 99 9999 + 040849 9999 99 99 0 9999 99 9999 + 040850 9999 99 99 0 9999 99 9999 + 040851 9999 99 99 0 9999 99 9999 + 040852 9999 99 99 0 9999 99 9999 + 040853 9999 99 99 0 9999 99 9999 + 040854 9999 99 99 0 9999 99 9999 + 040855 9999 99 99 0 9999 99 9999 + 040856 9999 99 99 0 9999 99 9999 + 040857 9999 99 99 0 9999 99 9999 + 040858 9999 99 99 0 9999 99 9999 + 040859 9999 99 99 0 9999 99 9999 + 040860 9999 99 99 0 9999 99 9999 + 040861 9999 99 99 0 9999 99 9999 + 040862 9999 99 99 0 9999 99 9999 + 040863 9999 99 99 0 9999 99 9999 + 040864 9999 99 99 0 9999 99 9999 + 040865 9999 99 99 0 9999 99 9999 + 040866 9999 99 99 0 9999 99 9999 + 040867 9999 99 99 0 9999 99 9999 + 040868 9999 99 99 0 9999 99 9999 + 040869 9999 99 99 0 9999 99 9999 + 040870 9999 99 99 0 9999 99 9999 + 040871 9999 99 99 0 9999 99 9999 + 040872 9999 99 99 0 9999 99 9999 + 040873 9999 99 99 0 9999 99 9999 + 040874 9999 99 99 0 9999 99 9999 + 040875 9999 99 99 0 9999 99 9999 + 040876 9999 99 99 0 9999 99 9999 + 040877 9999 99 99 0 9999 99 9999 + 040878 9999 99 99 0 9999 99 9999 + 040879 9999 99 99 0 9999 99 9999 + 040880 9999 99 99 0 9999 99 9999 + 040881 9999 99 99 0 9999 99 9999 + 040882 9999 99 99 0 9999 99 9999 + 040883 9999 99 99 0 9999 99 9999 + 040884 9999 99 99 0 9999 99 9999 + 040885 9999 99 99 0 9999 99 9999 + 040886 9999 99 99 0 9999 99 9999 + 040887 9999 99 99 0 9999 99 9999 + 040888 9999 99 99 0 9999 99 9999 + 040889 9999 99 99 0 9999 99 9999 + 040890 9999 99 99 0 9999 99 9999 + 040891 9999 99 99 0 9999 99 9999 + 040892 9999 99 99 0 9999 99 9999 + 040893 9999 99 99 0 9999 99 9999 + 040894 9999 99 99 0 9999 99 9999 + 040895 9999 99 99 0 9999 99 9999 + 040896 9999 99 99 0 9999 99 9999 + 040897 9999 99 99 0 9999 99 9999 + 040898 9999 99 99 0 9999 99 9999 + 040899 9999 99 99 0 9999 99 9999 + 040900 9999 99 99 0 9999 99 9999 + 040901 9999 99 99 0 9999 99 9999 + 040902 9999 99 99 0 9999 99 9999 + 040903 9999 99 99 0 9999 99 9999 + 040904 9999 99 99 0 9999 99 9999 + 040905 9999 99 99 0 9999 99 9999 + 040906 9999 99 99 0 9999 99 9999 + 040907 9999 99 99 0 9999 99 9999 + 040908 9999 99 99 0 9999 99 9999 + 040909 9999 99 99 0 9999 99 9999 + 040910 9999 99 99 0 9999 99 9999 + 040911 9999 99 99 0 9999 99 9999 + 040912 9999 99 99 0 9999 99 9999 + 040913 9999 99 99 0 9999 99 9999 + 040914 9999 99 99 0 9999 99 9999 + 040915 9999 99 99 0 9999 99 9999 + 040916 9999 99 99 0 9999 99 9999 + 040917 9999 99 99 0 9999 99 9999 + 040918 9999 99 99 0 9999 99 9999 + 040919 9999 99 99 0 9999 99 9999 + 040920 9999 99 99 0 9999 99 9999 + 040921 9999 99 99 0 9999 99 9999 + 040922 9999 99 99 0 9999 99 9999 + 040923 9999 99 99 0 9999 99 9999 + 040924 9999 99 99 0 9999 99 9999 + 040925 9999 99 99 0 9999 99 9999 + 040926 9999 99 99 0 9999 99 9999 + 040927 9999 99 99 0 9999 99 9999 + 040928 9999 99 99 0 9999 99 9999 + 040929 9999 99 99 0 9999 99 9999 + 040930 9999 99 99 0 9999 99 9999 + 040931 9999 99 99 0 9999 99 9999 + 040932 9999 99 99 0 9999 99 9999 + 040933 9999 99 99 0 9999 99 9999 + 040934 9999 99 99 0 9999 99 9999 + 040935 9999 99 99 0 9999 99 9999 + 040936 9999 99 99 0 9999 99 9999 + 040937 9999 99 99 0 9999 99 9999 + 040938 9999 99 99 0 9999 99 9999 + 040939 9999 99 99 0 9999 99 9999 + 040940 9999 99 99 0 9999 99 9999 + 040941 9999 99 99 0 9999 99 9999 + 040942 9999 99 99 0 9999 99 9999 + 040943 9999 99 99 0 9999 99 9999 + 040944 9999 99 99 0 9999 99 9999 + 040945 9999 99 99 0 9999 99 9999 + 040946 9999 99 99 0 9999 99 9999 + 040947 9999 99 99 0 9999 99 9999 + 040948 9999 99 99 0 9999 99 9999 + 040949 9999 99 99 0 9999 99 9999 + 040950 9999 99 99 0 9999 99 9999 + 040951 9999 99 99 0 9999 99 9999 + 040952 9999 99 99 0 9999 99 9999 + 040953 9999 99 99 0 9999 99 9999 + 040954 9999 99 99 0 9999 99 9999 + 040955 9999 99 99 0 9999 99 9999 + 040956 9999 99 99 0 9999 99 9999 + 040957 9999 99 99 0 9999 99 9999 + 040958 9999 99 99 0 9999 99 9999 + 040959 9999 99 99 0 9999 99 9999 + 040960 9999 99 99 0 9999 99 9999 + 040961 9999 99 99 0 9999 99 9999 + 040962 9999 99 99 0 9999 99 9999 + 040963 9999 99 99 0 9999 99 9999 + 040964 9999 99 99 0 9999 99 9999 + 040965 9999 99 99 0 9999 99 9999 + 040966 9999 99 99 0 9999 99 9999 + 040967 9999 99 99 0 9999 99 9999 + 040968 9999 99 99 0 9999 99 9999 + 040969 9999 99 99 0 9999 99 9999 + 040970 9999 99 99 0 9999 99 9999 + 040971 9999 99 99 0 9999 99 9999 + 040972 9999 99 99 0 9999 99 9999 + 040973 9999 99 99 0 9999 99 9999 + 040974 9999 99 99 0 9999 99 9999 + 040975 9999 99 99 0 9999 99 9999 + 040976 9999 99 99 0 9999 99 9999 + 040977 9999 99 99 0 9999 99 9999 + 040978 9999 99 99 0 9999 99 9999 + 040979 9999 99 99 0 9999 99 9999 + 040980 9999 99 99 0 9999 99 9999 + 040981 9999 99 99 0 9999 99 9999 + 040982 9999 99 99 0 9999 99 9999 + 040983 9999 99 99 0 9999 99 9999 + 040984 9999 99 99 0 9999 99 9999 + 040985 9999 99 99 0 9999 99 9999 + 040986 9999 99 99 0 9999 99 9999 + 040987 9999 99 99 0 9999 99 9999 + 040988 9999 99 99 0 9999 99 9999 + 040989 9999 99 99 0 9999 99 9999 + 040990 9999 99 99 0 9999 99 9999 + 040991 9999 99 99 0 9999 99 9999 + 040992 9999 99 99 0 9999 99 9999 + 040993 9999 99 99 0 9999 99 9999 + 040994 9999 99 99 0 9999 99 9999 + 040995 9999 99 99 0 9999 99 9999 + 040996 9999 99 99 0 9999 99 9999 + 040997 9999 99 99 0 9999 99 9999 + 040998 9999 99 99 0 9999 99 9999 + 040999 9999 99 99 0 9999 99 9999 + 041000 9999 99 99 0 9999 99 9999 + 041001 9999 99 99 0 9999 99 9999 + 041002 9999 99 99 0 9999 99 9999 + 041003 9999 99 99 0 9999 99 9999 + 041004 9999 99 99 0 9999 99 9999 + 041005 9999 99 99 0 9999 99 9999 + 041006 9999 99 99 0 9999 99 9999 + 041007 9999 99 99 0 9999 99 9999 + 041008 9999 99 99 0 9999 99 9999 + 041009 9999 99 99 0 9999 99 9999 + 041010 9999 99 99 0 9999 99 9999 + 041011 9999 99 99 0 9999 99 9999 + 041012 9999 99 99 0 9999 99 9999 + 041013 9999 99 99 0 9999 99 9999 + 041014 9999 99 99 0 9999 99 9999 + 041015 9999 99 99 0 9999 99 9999 + 041016 9999 99 99 0 9999 99 9999 + 041017 9999 99 99 0 9999 99 9999 + 041018 9999 99 99 0 9999 99 9999 + 041019 9999 99 99 0 9999 99 9999 + 041020 9999 99 99 0 9999 99 9999 + 041021 9999 99 99 0 9999 99 9999 + 041022 9999 99 99 0 9999 99 9999 + 041023 9999 99 99 0 9999 99 9999 + 041024 9999 99 99 0 9999 99 9999 + 041025 9999 99 99 0 9999 99 9999 + 041026 9999 99 99 0 9999 99 9999 + 041027 9999 99 99 0 9999 99 9999 + 041028 9999 99 99 0 9999 99 9999 + 041029 9999 99 99 0 9999 99 9999 + 041030 9999 99 99 0 9999 99 9999 + 041031 9999 99 99 0 9999 99 9999 + 041032 9999 99 99 0 9999 99 9999 + 041033 9999 99 99 0 9999 99 9999 + 041034 9999 99 99 0 9999 99 9999 + 041035 9999 99 99 0 9999 99 9999 + 041036 9999 99 99 0 9999 99 9999 + 041037 9999 99 99 0 9999 99 9999 + 041038 9999 99 99 0 9999 99 9999 + 041039 9999 99 99 0 9999 99 9999 + 041040 9999 99 99 0 9999 99 9999 + 041041 9999 99 99 0 9999 99 9999 + 041042 9999 99 99 0 9999 99 9999 + 041043 9999 99 99 0 9999 99 9999 + 041044 9999 99 99 0 9999 99 9999 + 041045 9999 99 99 0 9999 99 9999 + 041046 9999 99 99 0 9999 99 9999 + 041047 9999 99 99 0 9999 99 9999 + 041048 9999 99 99 0 9999 99 9999 + 041049 9999 99 99 0 9999 99 9999 + 041050 9999 99 99 0 9999 99 9999 + 041051 9999 99 99 0 9999 99 9999 + 041052 9999 99 99 0 9999 99 9999 + 041053 9999 99 99 0 9999 99 9999 + 041054 9999 99 99 0 9999 99 9999 + 041055 9999 99 99 0 9999 99 9999 + 041056 9999 99 99 0 9999 99 9999 + 041057 9999 99 99 0 9999 99 9999 + 041058 9999 99 99 0 9999 99 9999 + 041059 9999 99 99 0 9999 99 9999 + 041060 9999 99 99 0 9999 99 9999 + 041061 9999 99 99 0 9999 99 9999 + 041062 9999 99 99 0 9999 99 9999 + 041063 9999 99 99 0 9999 99 9999 + 041064 9999 99 99 0 9999 99 9999 + 041065 9999 99 99 0 9999 99 9999 + 041066 9999 99 99 0 9999 99 9999 + 041067 9999 99 99 0 9999 99 9999 + 041068 9999 99 99 0 9999 99 9999 + 041069 9999 99 99 0 9999 99 9999 + 041070 9999 99 99 0 9999 99 9999 + 041071 9999 99 99 0 9999 99 9999 + 041072 9999 99 99 0 9999 99 9999 + 041073 9999 99 99 0 9999 99 9999 + 041074 9999 99 99 0 9999 99 9999 + 041075 9999 99 99 0 9999 99 9999 + 041076 9999 99 99 0 9999 99 9999 + 041077 9999 99 99 0 9999 99 9999 + 041078 9999 99 99 0 9999 99 9999 + 041079 9999 99 99 0 9999 99 9999 + 041080 9999 99 99 0 9999 99 9999 + 041081 9999 99 99 0 9999 99 9999 + 041082 9999 99 99 0 9999 99 9999 + 041083 9999 99 99 0 9999 99 9999 + 041084 9999 99 99 0 9999 99 9999 + 041085 9999 99 99 0 9999 99 9999 + 041086 9999 99 99 0 9999 99 9999 + 041087 9999 99 99 0 9999 99 9999 + 041088 9999 99 99 0 9999 99 9999 + 041089 9999 99 99 0 9999 99 9999 + 041090 9999 99 99 0 9999 99 9999 + 041091 9999 99 99 0 9999 99 9999 + 041092 9999 99 99 0 9999 99 9999 + 041093 9999 99 99 0 9999 99 9999 + 041094 9999 99 99 0 9999 99 9999 + 041095 9999 99 99 0 9999 99 9999 + 041096 9999 99 99 0 9999 99 9999 + 041097 9999 99 99 0 9999 99 9999 + 041098 9999 99 99 0 9999 99 9999 + 041099 9999 99 99 0 9999 99 9999 + 041100 9999 99 99 0 9999 99 9999 + 041101 9999 99 99 0 9999 99 9999 + 041102 9999 99 99 0 9999 99 9999 + 041103 9999 99 99 0 9999 99 9999 + 041104 9999 99 99 0 9999 99 9999 + 041105 9999 99 99 0 9999 99 9999 + 041106 9999 99 99 0 9999 99 9999 + 041107 9999 99 99 0 9999 99 9999 + 041108 9999 99 99 0 9999 99 9999 + 041109 9999 99 99 0 9999 99 9999 + 041110 9999 99 99 0 9999 99 9999 + 041111 9999 99 99 0 9999 99 9999 + 041112 9999 99 99 0 9999 99 9999 + 041113 9999 99 99 0 9999 99 9999 + 041114 9999 99 99 0 9999 99 9999 + 041115 9999 99 99 0 9999 99 9999 + 041116 9999 99 99 0 9999 99 9999 + 041117 9999 99 99 0 9999 99 9999 + 041118 9999 99 99 0 9999 99 9999 + 041119 9999 99 99 0 9999 99 9999 + 041120 9999 99 99 0 9999 99 9999 + 041121 9999 99 99 0 9999 99 9999 + 041122 9999 99 99 0 9999 99 9999 + 041123 9999 99 99 0 9999 99 9999 + 041124 9999 99 99 0 9999 99 9999 + 041125 9999 99 99 0 9999 99 9999 + 041126 9999 99 99 0 9999 99 9999 + 041127 9999 99 99 0 9999 99 9999 + 041128 9999 99 99 0 9999 99 9999 + 041129 9999 99 99 0 9999 99 9999 + 041130 9999 99 99 0 9999 99 9999 + 041131 9999 99 99 0 9999 99 9999 + 041132 9999 99 99 0 9999 99 9999 + 041133 9999 99 99 0 9999 99 9999 + 041134 9999 99 99 0 9999 99 9999 + 041135 9999 99 99 0 9999 99 9999 + 041136 9999 99 99 0 9999 99 9999 + 041137 9999 99 99 0 9999 99 9999 + 041138 9999 99 99 0 9999 99 9999 + 041139 9999 99 99 0 9999 99 9999 + 041140 9999 99 99 0 9999 99 9999 + 041141 9999 99 99 0 9999 99 9999 + 041142 9999 99 99 0 9999 99 9999 + 041143 9999 99 99 0 9999 99 9999 + 041144 9999 99 99 0 9999 99 9999 + 041145 9999 99 99 0 9999 99 9999 + 041146 9999 99 99 0 9999 99 9999 + 041147 9999 99 99 0 9999 99 9999 + 041148 9999 99 99 0 9999 99 9999 + 041149 9999 99 99 0 9999 99 9999 + 041150 9999 99 99 0 9999 99 9999 + 041151 9999 99 99 0 9999 99 9999 + 041152 9999 99 99 0 9999 99 9999 + 041153 9999 99 99 0 9999 99 9999 + 041154 9999 99 99 0 9999 99 9999 + 041155 9999 99 99 0 9999 99 9999 + 041156 9999 99 99 0 9999 99 9999 + 041157 9999 99 99 0 9999 99 9999 + 041158 9999 99 99 0 9999 99 9999 + 041159 9999 99 99 0 9999 99 9999 + 041160 9999 99 99 0 9999 99 9999 + 041161 9999 99 99 0 9999 99 9999 + 041162 9999 99 99 0 9999 99 9999 + 041163 9999 99 99 0 9999 99 9999 + 041164 9999 99 99 0 9999 99 9999 + 041165 9999 99 99 0 9999 99 9999 + 041166 9999 99 99 0 9999 99 9999 + 041167 9999 99 99 0 9999 99 9999 + 041168 9999 99 99 0 9999 99 9999 + 041169 9999 99 99 0 9999 99 9999 + 041170 9999 99 99 0 9999 99 9999 + 041171 9999 99 99 0 9999 99 9999 + 041172 9999 99 99 0 9999 99 9999 + 041173 9999 99 99 0 9999 99 9999 + 041174 9999 99 99 0 9999 99 9999 + 041175 9999 99 99 0 9999 99 9999 + 041176 9999 99 99 0 9999 99 9999 + 041177 9999 99 99 0 9999 99 9999 + 041178 9999 99 99 0 9999 99 9999 + 041179 9999 99 99 0 9999 99 9999 + 041180 9999 99 99 0 9999 99 9999 + 041181 9999 99 99 0 9999 99 9999 + 041182 9999 99 99 0 9999 99 9999 + 041183 9999 99 99 0 9999 99 9999 + 041184 9999 99 99 0 9999 99 9999 + 041185 9999 99 99 0 9999 99 9999 + 041186 9999 99 99 0 9999 99 9999 + 041187 9999 99 99 0 9999 99 9999 + 041188 9999 99 99 0 9999 99 9999 + 041189 9999 99 99 0 9999 99 9999 + 041190 9999 99 99 0 9999 99 9999 + 041191 9999 99 99 0 9999 99 9999 + 041192 9999 99 99 0 9999 99 9999 + 041193 9999 99 99 0 9999 99 9999 + 041194 9999 99 99 0 9999 99 9999 + 041195 9999 99 99 0 9999 99 9999 + 041196 9999 99 99 0 9999 99 9999 + 041197 9999 99 99 0 9999 99 9999 + 041198 9999 99 99 0 9999 99 9999 + 041199 9999 99 99 0 9999 99 9999 + 041200 9999 99 99 0 9999 99 9999 + 041201 9999 99 99 0 9999 99 9999 + 041202 9999 99 99 0 9999 99 9999 + 041203 9999 99 99 0 9999 99 9999 + 041204 9999 99 99 0 9999 99 9999 + 041205 9999 99 99 0 9999 99 9999 + 041206 9999 99 99 0 9999 99 9999 + 041207 9999 99 99 0 9999 99 9999 + 041208 9999 99 99 0 9999 99 9999 + 041209 9999 99 99 0 9999 99 9999 + 041210 9999 99 99 0 9999 99 9999 + 041211 9999 99 99 0 9999 99 9999 + 041212 9999 99 99 0 9999 99 9999 + 041213 9999 99 99 0 9999 99 9999 + 041214 9999 99 99 0 9999 99 9999 + 041215 9999 99 99 0 9999 99 9999 + 041216 9999 99 99 0 9999 99 9999 + 041217 9999 99 99 0 9999 99 9999 + 041218 9999 99 99 0 9999 99 9999 + 041219 9999 99 99 0 9999 99 9999 + 041220 9999 99 99 0 9999 99 9999 + 041221 9999 99 99 0 9999 99 9999 + 041222 9999 99 99 0 9999 99 9999 + 041223 9999 99 99 0 9999 99 9999 + 041224 9999 99 99 0 9999 99 9999 + 041225 9999 99 99 0 9999 99 9999 + 041226 9999 99 99 0 9999 99 9999 + 041227 9999 99 99 0 9999 99 9999 + 041228 9999 99 99 0 9999 99 9999 + 041229 9999 99 99 0 9999 99 9999 + 041230 9999 99 99 0 9999 99 9999 + 041231 9999 99 99 0 9999 99 9999 + 041232 9999 99 99 0 9999 99 9999 + 041233 9999 99 99 0 9999 99 9999 + 041234 9999 99 99 0 9999 99 9999 + 041235 9999 99 99 0 9999 99 9999 + 041236 9999 99 99 0 9999 99 9999 + 041237 9999 99 99 0 9999 99 9999 + 041238 9999 99 99 0 9999 99 9999 + 041239 9999 99 99 0 9999 99 9999 + 041240 9999 99 99 0 9999 99 9999 + 041241 9999 99 99 0 9999 99 9999 + 041242 9999 99 99 0 9999 99 9999 + 041243 9999 99 99 0 9999 99 9999 + 041244 9999 99 99 0 9999 99 9999 + 041245 9999 99 99 0 9999 99 9999 + 041246 9999 99 99 0 9999 99 9999 + 041247 9999 99 99 0 9999 99 9999 + 041248 9999 99 99 0 9999 99 9999 + 041249 9999 99 99 0 9999 99 9999 + 041250 9999 99 99 0 9999 99 9999 + 041251 9999 99 99 0 9999 99 9999 + 041252 9999 99 99 0 9999 99 9999 + 041253 9999 99 99 0 9999 99 9999 + 041254 9999 99 99 0 9999 99 9999 + 041255 9999 99 99 0 9999 99 9999 + 041256 9999 99 99 0 9999 99 9999 + 041257 9999 99 99 0 9999 99 9999 + 041258 9999 99 99 0 9999 99 9999 + 041259 9999 99 99 0 9999 99 9999 + 041260 9999 99 99 0 9999 99 9999 + 041261 9999 99 99 0 9999 99 9999 + 041262 9999 99 99 0 9999 99 9999 + 041263 9999 99 99 0 9999 99 9999 + 041264 9999 99 99 0 9999 99 9999 + 041265 9999 99 99 0 9999 99 9999 + 041266 9999 99 99 0 9999 99 9999 + 041267 9999 99 99 0 9999 99 9999 + 041268 9999 99 99 0 9999 99 9999 + 041269 9999 99 99 0 9999 99 9999 + 041270 9999 99 99 0 9999 99 9999 + 041271 9999 99 99 0 9999 99 9999 + 041272 9999 99 99 0 9999 99 9999 + 041273 9999 99 99 0 9999 99 9999 + 041274 9999 99 99 0 9999 99 9999 + 041275 9999 99 99 0 9999 99 9999 + 041276 9999 99 99 0 9999 99 9999 + 041277 9999 99 99 0 9999 99 9999 + 041278 9999 99 99 0 9999 99 9999 + 041279 9999 99 99 0 9999 99 9999 + 041280 9999 99 99 0 9999 99 9999 + 041281 9999 99 99 0 9999 99 9999 + 041282 9999 99 99 0 9999 99 9999 + 041283 9999 99 99 0 9999 99 9999 + 041284 9999 99 99 0 9999 99 9999 + 041285 9999 99 99 0 9999 99 9999 + 041286 9999 99 99 0 9999 99 9999 + 041287 9999 99 99 0 9999 99 9999 + 041288 9999 99 99 0 9999 99 9999 + 041289 9999 99 99 0 9999 99 9999 + 041290 9999 99 99 0 9999 99 9999 + 041291 9999 99 99 0 9999 99 9999 + 041292 9999 99 99 0 9999 99 9999 + 041293 9999 99 99 0 9999 99 9999 + 041294 9999 99 99 0 9999 99 9999 + 041295 9999 99 99 0 9999 99 9999 + 041296 9999 99 99 0 9999 99 9999 + 041297 9999 99 99 0 9999 99 9999 + 041298 9999 99 99 0 9999 99 9999 + 041299 9999 99 99 0 9999 99 9999 + 041300 9999 99 99 0 9999 99 9999 + 041301 9999 99 99 0 9999 99 9999 + 041302 9999 99 99 0 9999 99 9999 + 041303 9999 99 99 0 9999 99 9999 + 041304 9999 99 99 0 9999 99 9999 + 041305 9999 99 99 0 9999 99 9999 + 041306 9999 99 99 0 9999 99 9999 + 041307 9999 99 99 0 9999 99 9999 + 041308 9999 99 99 0 9999 99 9999 + 041309 9999 99 99 0 9999 99 9999 + 041310 9999 99 99 0 9999 99 9999 + 041311 9999 99 99 0 9999 99 9999 + 041312 9999 99 99 0 9999 99 9999 + 041313 9999 99 99 0 9999 99 9999 + 041314 9999 99 99 0 9999 99 9999 + 041315 9999 99 99 0 9999 99 9999 + 041316 9999 99 99 0 9999 99 9999 + 041317 9999 99 99 0 9999 99 9999 + 041318 9999 99 99 0 9999 99 9999 + 041319 9999 99 99 0 9999 99 9999 + 041320 9999 99 99 0 9999 99 9999 + 041321 9999 99 99 0 9999 99 9999 + 041322 9999 99 99 0 9999 99 9999 + 041323 9999 99 99 0 9999 99 9999 + 041324 9999 99 99 0 9999 99 9999 + 041325 9999 99 99 0 9999 99 9999 + 041326 9999 99 99 0 9999 99 9999 + 041327 9999 99 99 0 9999 99 9999 + 041328 9999 99 99 0 9999 99 9999 + 041329 9999 99 99 0 9999 99 9999 + 041330 9999 99 99 0 9999 99 9999 + 041331 9999 99 99 0 9999 99 9999 + 041332 9999 99 99 0 9999 99 9999 + 041333 9999 99 99 0 9999 99 9999 + 041334 9999 99 99 0 9999 99 9999 + 041335 9999 99 99 0 9999 99 9999 + 041336 9999 99 99 0 9999 99 9999 + 041337 9999 99 99 0 9999 99 9999 + 041338 9999 99 99 0 9999 99 9999 + 041339 9999 99 99 0 9999 99 9999 + 041340 9999 99 99 0 9999 99 9999 + 041341 9999 99 99 0 9999 99 9999 + 041342 9999 99 99 0 9999 99 9999 + 041343 9999 99 99 0 9999 99 9999 + 041344 9999 99 99 0 9999 99 9999 + 041345 9999 99 99 0 9999 99 9999 + 041346 9999 99 99 0 9999 99 9999 + 041347 9999 99 99 0 9999 99 9999 + 041348 9999 99 99 0 9999 99 9999 + 041349 9999 99 99 0 9999 99 9999 + 041350 9999 99 99 0 9999 99 9999 + 041351 9999 99 99 0 9999 99 9999 + 041352 9999 99 99 0 9999 99 9999 + 041353 9999 99 99 0 9999 99 9999 + 041354 9999 99 99 0 9999 99 9999 + 041355 9999 99 99 0 9999 99 9999 + 041356 9999 99 99 0 9999 99 9999 + 041357 9999 99 99 0 9999 99 9999 + 041358 9999 99 99 0 9999 99 9999 + 041359 9999 99 99 0 9999 99 9999 + 041360 9999 99 99 0 9999 99 9999 + 041361 9999 99 99 0 9999 99 9999 + 041362 9999 99 99 0 9999 99 9999 + 041363 9999 99 99 0 9999 99 9999 + 041364 9999 99 99 0 9999 99 9999 + 041365 9999 99 99 0 9999 99 9999 + 041366 9999 99 99 0 9999 99 9999 + 041367 9999 99 99 0 9999 99 9999 + 041368 9999 99 99 0 9999 99 9999 + 041369 9999 99 99 0 9999 99 9999 + 041370 9999 99 99 0 9999 99 9999 + 041371 9999 99 99 0 9999 99 9999 + 041372 9999 99 99 0 9999 99 9999 + 041373 9999 99 99 0 9999 99 9999 + 041374 9999 99 99 0 9999 99 9999 + 041375 9999 99 99 0 9999 99 9999 + 041376 9999 99 99 0 9999 99 9999 + 041377 9999 99 99 0 9999 99 9999 + 041378 9999 99 99 0 9999 99 9999 + 041379 9999 99 99 0 9999 99 9999 + 041380 9999 99 99 0 9999 99 9999 + 041381 9999 99 99 0 9999 99 9999 + 041382 9999 99 99 0 9999 99 9999 + 041383 9999 99 99 0 9999 99 9999 + 041384 9999 99 99 0 9999 99 9999 + 041385 9999 99 99 0 9999 99 9999 + 041386 9999 99 99 0 9999 99 9999 + 041387 9999 99 99 0 9999 99 9999 + 041388 9999 99 99 0 9999 99 9999 + 041389 9999 99 99 0 9999 99 9999 + 041390 9999 99 99 0 9999 99 9999 + 041391 9999 99 99 0 9999 99 9999 + 041392 9999 99 99 0 9999 99 9999 + 041393 9999 99 99 0 9999 99 9999 + 041394 9999 99 99 0 9999 99 9999 + 041395 9999 99 99 0 9999 99 9999 + 041396 9999 99 99 0 9999 99 9999 + 041397 9999 99 99 0 9999 99 9999 + 041398 9999 99 99 0 9999 99 9999 + 041399 9999 99 99 0 9999 99 9999 + 041400 9999 99 99 0 9999 99 9999 + 041401 9999 99 99 0 9999 99 9999 + 041402 9999 99 99 0 9999 99 9999 + 041403 9999 99 99 0 9999 99 9999 + 041404 9999 99 99 0 9999 99 9999 + 041405 9999 99 99 0 9999 99 9999 + 041406 9999 99 99 0 9999 99 9999 + 041407 9999 99 99 0 9999 99 9999 + 041408 9999 99 99 0 9999 99 9999 + 041409 9999 99 99 0 9999 99 9999 + 041410 9999 99 99 0 9999 99 9999 + 041411 9999 99 99 0 9999 99 9999 + 041412 9999 99 99 0 9999 99 9999 + 041413 9999 99 99 0 9999 99 9999 + 041414 9999 99 99 0 9999 99 9999 + 041415 9999 99 99 0 9999 99 9999 + 041416 9999 99 99 0 9999 99 9999 + 041417 9999 99 99 0 9999 99 9999 + 041418 9999 99 99 0 9999 99 9999 + 041419 9999 99 99 0 9999 99 9999 + 041420 9999 99 99 0 9999 99 9999 + 041421 9999 99 99 0 9999 99 9999 + 041422 9999 99 99 0 9999 99 9999 + 041423 9999 99 99 0 9999 99 9999 + 041424 9999 99 99 0 9999 99 9999 + 041425 9999 99 99 0 9999 99 9999 + 041426 9999 99 99 0 9999 99 9999 + 041427 9999 99 99 0 9999 99 9999 + 041428 9999 99 99 0 9999 99 9999 + 041429 9999 99 99 0 9999 99 9999 + 041430 9999 99 99 0 9999 99 9999 + 041431 9999 99 99 0 9999 99 9999 + 041432 9999 99 99 0 9999 99 9999 + 041433 9999 99 99 0 9999 99 9999 + 041434 9999 99 99 0 9999 99 9999 + 041435 9999 99 99 0 9999 99 9999 + 041436 9999 99 99 0 9999 99 9999 + 041437 9999 99 99 0 9999 99 9999 + 041438 9999 99 99 0 9999 99 9999 + 041439 9999 99 99 0 9999 99 9999 + 041440 9999 99 99 0 9999 99 9999 + 041441 9999 99 99 0 9999 99 9999 + 041442 9999 99 99 0 9999 99 9999 + 041443 9999 99 99 0 9999 99 9999 + 041444 9999 99 99 0 9999 99 9999 + 041445 9999 99 99 0 9999 99 9999 + 041446 9999 99 99 0 9999 99 9999 + 041447 9999 99 99 0 9999 99 9999 + 041448 9999 99 99 0 9999 99 9999 + 041449 9999 99 99 0 9999 99 9999 + 041450 9999 99 99 0 9999 99 9999 + 041451 9999 99 99 0 9999 99 9999 + 041452 9999 99 99 0 9999 99 9999 + 041453 9999 99 99 0 9999 99 9999 + 041454 9999 99 99 0 9999 99 9999 + 041455 9999 99 99 0 9999 99 9999 + 041456 9999 99 99 0 9999 99 9999 + 041457 9999 99 99 0 9999 99 9999 + 041458 9999 99 99 0 9999 99 9999 + 041459 9999 99 99 0 9999 99 9999 + 041460 9999 99 99 0 9999 99 9999 + 041461 9999 99 99 0 9999 99 9999 + 041462 9999 99 99 0 9999 99 9999 + 041463 9999 99 99 0 9999 99 9999 + 041464 9999 99 99 0 9999 99 9999 + 041465 9999 99 99 0 9999 99 9999 + 041466 9999 99 99 0 9999 99 9999 + 041467 9999 99 99 0 9999 99 9999 + 041468 9999 99 99 0 9999 99 9999 + 041469 9999 99 99 0 9999 99 9999 + 041470 9999 99 99 0 9999 99 9999 + 041471 9999 99 99 0 9999 99 9999 + 041472 9999 99 99 0 9999 99 9999 + 041473 1308 01 01 2 352715780 00 1582 + 041474 1308 01 02 2 352715780 01 1582 + 041475 1308 01 03 2 352715780 02 1582 + 041476 1308 01 04 2 352715780 03 1582 + 041477 1308 01 05 2 352715780 04 1582 + 041478 1308 01 06 2 352715780 05 1582 + 041479 1308 01 07 2 352715780 06 1582 + 041480 1308 01 08 2 352715780 07 1582 + 041481 1308 02 01 2 352715780 08 1582 + 041482 1308 02 02 2 352715780 09 1582 + 041483 1308 02 03 2 352715780 10 1582 + 041484 1308 02 04 2 352715780 11 1582 + 041485 1308 02 05 2 352715780 12 1582 + 041486 1308 02 06 2 352715780 13 1582 + 041487 1308 02 07 2 352715780 14 1582 + 041488 1308 02 08 2 352715780 15 1582 + 041489 1308 03 01 2 352716804 00 1583 + 041490 1308 03 02 2 352716804 01 1583 + 041491 1308 03 03 2 352716804 02 1583 + 041492 1308 03 04 2 352716804 03 1583 + 041493 1308 03 05 2 352716804 04 1583 + 041494 1308 03 06 2 352716804 05 1583 + 041495 1308 03 07 2 352716804 06 1583 + 041496 1308 03 08 2 352716804 07 1583 + 041497 1308 04 01 2 352716804 08 1583 + 041498 1308 04 02 2 352716804 09 1583 + 041499 1308 04 03 2 352716804 10 1583 + 041500 1308 04 04 2 352716804 11 1583 + 041501 1308 04 05 2 352716804 12 1583 + 041502 1308 04 06 2 352716804 13 1583 + 041503 1308 04 07 2 352716804 14 1583 + 041504 1308 04 08 2 352716804 15 1583 + 041505 1308 05 01 2 352613380 00 1532 + 041506 1308 05 02 2 352613380 01 1532 + 041507 1308 05 03 2 352613380 02 1532 + 041508 1308 05 04 2 352613380 03 1532 + 041509 1308 05 05 2 352613380 04 1532 + 041510 1308 05 06 2 352613380 05 1532 + 041511 1308 05 07 2 352613380 06 1532 + 041512 1308 05 08 2 352613380 07 1532 + 041513 1308 06 01 2 352613380 08 1532 + 041514 1308 06 02 2 352613380 09 1532 + 041515 1308 06 03 2 352613380 10 1532 + 041516 1308 06 04 2 352613380 11 1532 + 041517 1308 06 05 2 352613380 12 1532 + 041518 1308 06 06 2 352613380 13 1532 + 041519 1308 06 07 2 352613380 14 1532 + 041520 1308 06 08 2 352613380 15 1532 + 041521 1308 07 01 2 352614404 00 1533 + 041522 1308 07 02 2 352614404 01 1533 + 041523 1308 07 03 2 352614404 02 1533 + 041524 1308 07 04 2 352614404 03 1533 + 041525 1308 07 05 2 352614404 04 1533 + 041526 1308 07 06 2 352614404 05 1533 + 041527 1308 07 07 2 352614404 06 1533 + 041528 1308 07 08 2 352614404 07 1533 + 041529 1308 08 01 2 352614404 08 1533 + 041530 1308 08 02 2 352614404 09 1533 + 041531 1308 08 03 2 352614404 10 1533 + 041532 1308 08 04 2 352614404 11 1533 + 041533 1308 08 05 2 352614404 12 1533 + 041534 1308 08 06 2 352614404 13 1533 + 041535 1308 08 07 2 352614404 14 1533 + 041536 1308 08 08 2 352614404 15 1533 + 041537 1308 09 01 2 352977924 00 1694 + 041538 1308 09 02 2 352977924 01 1694 + 041539 1308 09 03 2 352977924 02 1694 + 041540 1308 09 04 2 352977924 03 1694 + 041541 1308 09 05 2 352977924 04 1694 + 041542 1308 09 06 2 352977924 05 1694 + 041543 1308 09 07 2 352977924 06 1694 + 041544 1308 09 08 2 352977924 07 1694 + 041545 1308 10 01 2 352977924 08 1694 + 041546 1308 10 02 2 352977924 09 1694 + 041547 1308 10 03 2 352977924 10 1694 + 041548 1308 10 04 2 352977924 11 1694 + 041549 1308 10 05 2 352977924 12 1694 + 041550 1308 10 06 2 352977924 13 1694 + 041551 1308 10 07 2 352977924 14 1694 + 041552 1308 10 08 2 352977924 15 1694 + 041553 1308 11 01 2 352978948 00 1695 + 041554 1308 11 02 2 352978948 01 1695 + 041555 1308 11 03 2 352978948 02 1695 + 041556 1308 11 04 2 352978948 03 1695 + 041557 1308 11 05 2 352978948 04 1695 + 041558 1308 11 06 2 352978948 05 1695 + 041559 1308 11 07 2 352978948 06 1695 + 041560 1308 11 08 2 352978948 07 1695 + 041561 1308 12 01 2 352978948 08 1695 + 041562 1308 12 02 2 352978948 09 1695 + 041563 1308 12 03 2 352978948 10 1695 + 041564 1308 12 04 2 352978948 11 1695 + 041565 1308 12 05 2 352978948 12 1695 + 041566 1308 12 06 2 352978948 13 1695 + 041567 1308 12 07 2 352978948 14 1695 + 041568 1308 12 08 2 352978948 15 1695 + 041569 1308 13 01 2 352875524 00 1644 + 041570 1308 13 02 2 352875524 01 1644 + 041571 1308 13 03 2 352875524 02 1644 + 041572 1308 13 04 2 352875524 03 1644 + 041573 1308 13 05 2 352875524 04 1644 + 041574 1308 13 06 2 352875524 05 1644 + 041575 1308 13 07 2 352875524 06 1644 + 041576 1308 13 08 2 352875524 07 1644 + 041577 1308 14 01 2 352875524 08 1644 + 041578 1308 14 02 2 352875524 09 1644 + 041579 1308 14 03 2 352875524 10 1644 + 041580 1308 14 04 2 352875524 11 1644 + 041581 1308 14 05 2 352875524 12 1644 + 041582 1308 14 06 2 352875524 13 1644 + 041583 1308 14 07 2 352875524 14 1644 + 041584 1308 14 08 2 352875524 15 1644 + 041585 1308 15 01 2 352876548 00 1645 + 041586 1308 15 02 2 352876548 01 1645 + 041587 1308 15 03 2 352876548 02 1645 + 041588 1308 15 04 2 352876548 03 1645 + 041589 1308 15 05 2 352876548 04 1645 + 041590 1308 15 06 2 352876548 05 1645 + 041591 1308 15 07 2 352876548 06 1645 + 041592 1308 15 08 2 352876548 07 1645 + 041593 1308 16 01 2 352876548 08 1645 + 041594 1308 16 02 2 352876548 09 1645 + 041595 1308 16 03 2 352876548 10 1645 + 041596 1308 16 04 2 352876548 11 1645 + 041597 1308 16 05 2 352876548 12 1645 + 041598 1308 16 06 2 352876548 13 1645 + 041599 1308 16 07 2 352876548 14 1645 + 041600 1308 16 08 2 352876548 15 1645 + 041601 1308 17 01 2 353240068 00 1806 + 041602 1308 17 02 2 353240068 01 1806 + 041603 1308 17 03 2 353240068 02 1806 + 041604 1308 17 04 2 353240068 03 1806 + 041605 1308 17 05 2 353240068 04 1806 + 041606 1308 17 06 2 353240068 05 1806 + 041607 1308 17 07 2 353240068 06 1806 + 041608 1308 17 08 2 353240068 07 1806 + 041609 1308 18 01 2 353240068 08 1806 + 041610 1308 18 02 2 353240068 09 1806 + 041611 1308 18 03 2 353240068 10 1806 + 041612 1308 18 04 2 353240068 11 1806 + 041613 1308 18 05 2 353240068 12 1806 + 041614 1308 18 06 2 353240068 13 1806 + 041615 1308 18 07 2 353240068 14 1806 + 041616 1308 18 08 2 353240068 15 1806 + 041617 1308 19 01 2 353241092 00 1807 + 041618 1308 19 02 2 353241092 01 1807 + 041619 1308 19 03 2 353241092 02 1807 + 041620 1308 19 04 2 353241092 03 1807 + 041621 1308 19 05 2 353241092 04 1807 + 041622 1308 19 06 2 353241092 05 1807 + 041623 1308 19 07 2 353241092 06 1807 + 041624 1308 19 08 2 353241092 07 1807 + 041625 1308 20 01 2 353241092 08 1807 + 041626 1308 20 02 2 353241092 09 1807 + 041627 1308 20 03 2 353241092 10 1807 + 041628 1308 20 04 2 353241092 11 1807 + 041629 1308 20 05 2 353241092 12 1807 + 041630 1308 20 06 2 353241092 13 1807 + 041631 1308 20 07 2 353241092 14 1807 + 041632 1308 20 08 2 353241092 15 1807 + 041633 1308 21 01 2 353137668 00 1756 + 041634 1308 21 02 2 353137668 01 1756 + 041635 1308 21 03 2 353137668 02 1756 + 041636 1308 21 04 2 353137668 03 1756 + 041637 1308 21 05 2 353137668 04 1756 + 041638 1308 21 06 2 353137668 05 1756 + 041639 1308 21 07 2 353137668 06 1756 + 041640 1308 21 08 2 353137668 07 1756 + 041641 1308 22 01 2 353137668 08 1756 + 041642 1308 22 02 2 353137668 09 1756 + 041643 1308 22 03 2 353137668 10 1756 + 041644 1308 22 04 2 353137668 11 1756 + 041645 1308 22 05 2 353137668 12 1756 + 041646 1308 22 06 2 353137668 13 1756 + 041647 1308 22 07 2 353137668 14 1756 + 041648 1308 22 08 2 353137668 15 1756 + 041649 1308 23 01 2 353138692 00 1757 + 041650 1308 23 02 2 353138692 01 1757 + 041651 1308 23 03 2 353138692 02 1757 + 041652 1308 23 04 2 353138692 03 1757 + 041653 1308 23 05 2 353138692 04 1757 + 041654 1308 23 06 2 353138692 05 1757 + 041655 1308 23 07 2 353138692 06 1757 + 041656 1308 23 08 2 353138692 07 1757 + 041657 1308 24 01 2 353138692 08 1757 + 041658 1308 24 02 2 353138692 09 1757 + 041659 1308 24 03 2 353138692 10 1757 + 041660 1308 24 04 2 353138692 11 1757 + 041661 1308 24 05 2 353138692 12 1757 + 041662 1308 24 06 2 353138692 13 1757 + 041663 1308 24 07 2 353138692 14 1757 + 041664 1308 24 08 2 353138692 15 1757 + 041665 1308 25 01 2 352719876 00 1584 + 041666 1308 25 02 2 352719876 01 1584 + 041667 1308 25 03 2 352719876 02 1584 + 041668 1308 25 04 2 352719876 03 1584 + 041669 1308 25 05 2 352719876 04 1584 + 041670 1308 25 06 2 352719876 05 1584 + 041671 1308 25 07 2 352719876 06 1584 + 041672 1308 25 08 2 352719876 07 1584 + 041673 1308 26 01 2 352719876 08 1584 + 041674 1308 26 02 2 352719876 09 1584 + 041675 1308 26 03 2 352719876 10 1584 + 041676 1308 26 04 2 352719876 11 1584 + 041677 1308 26 05 2 352719876 12 1584 + 041678 1308 26 06 2 352719876 13 1584 + 041679 1308 26 07 2 352719876 14 1584 + 041680 1308 26 08 2 352719876 15 1584 + 041681 1308 27 01 2 352720900 00 1585 + 041682 1308 27 02 2 352720900 01 1585 + 041683 1308 27 03 2 352720900 02 1585 + 041684 1308 27 04 2 352720900 03 1585 + 041685 1308 27 05 2 352720900 04 1585 + 041686 1308 27 06 2 352720900 05 1585 + 041687 1308 27 07 2 352720900 06 1585 + 041688 1308 27 08 2 352720900 07 1585 + 041689 1308 28 01 2 352720900 08 1585 + 041690 1308 28 02 2 352720900 09 1585 + 041691 1308 28 03 2 352720900 10 1585 + 041692 1308 28 04 2 352720900 11 1585 + 041693 1308 28 05 2 352720900 12 1585 + 041694 1308 28 06 2 352720900 13 1585 + 041695 1308 28 07 2 352720900 14 1585 + 041696 1308 28 08 2 352720900 15 1585 + 041697 1308 29 01 2 352617476 00 1534 + 041698 1308 29 02 2 352617476 01 1534 + 041699 1308 29 03 2 352617476 02 1534 + 041700 1308 29 04 2 352617476 03 1534 + 041701 1308 29 05 2 352617476 04 1534 + 041702 1308 29 06 2 352617476 05 1534 + 041703 1308 29 07 2 352617476 06 1534 + 041704 1308 29 08 2 352617476 07 1534 + 041705 1308 30 01 2 352617476 08 1534 + 041706 1308 30 02 2 352617476 09 1534 + 041707 1308 30 03 2 352617476 10 1534 + 041708 1308 30 04 2 352617476 11 1534 + 041709 1308 30 05 2 352617476 12 1534 + 041710 1308 30 06 2 352617476 13 1534 + 041711 1308 30 07 2 352617476 14 1534 + 041712 1308 30 08 2 352617476 15 1534 + 041713 1308 31 01 2 352618500 00 1535 + 041714 1308 31 02 2 352618500 01 1535 + 041715 1308 31 03 2 352618500 02 1535 + 041716 1308 31 04 2 352618500 03 1535 + 041717 1308 31 05 2 352618500 04 1535 + 041718 1308 31 06 2 352618500 05 1535 + 041719 1308 31 07 2 352618500 06 1535 + 041720 1308 31 08 2 352618500 07 1535 + 041721 1308 32 01 2 352618500 08 1535 + 041722 1308 32 02 2 352618500 09 1535 + 041723 1308 32 03 2 352618500 10 1535 + 041724 1308 32 04 2 352618500 11 1535 + 041725 1308 32 05 2 352618500 12 1535 + 041726 1308 32 06 2 352618500 13 1535 + 041727 1308 32 07 2 352618500 14 1535 + 041728 1308 32 08 2 352618500 15 1535 + 041729 1308 33 01 2 352982020 00 1696 + 041730 1308 33 02 2 352982020 01 1696 + 041731 1308 33 03 2 352982020 02 1696 + 041732 1308 33 04 2 352982020 03 1696 + 041733 1308 33 05 2 352982020 04 1696 + 041734 1308 33 06 2 352982020 05 1696 + 041735 1308 33 07 2 352982020 06 1696 + 041736 1308 33 08 2 352982020 07 1696 + 041737 1308 34 01 2 352982020 08 1696 + 041738 1308 34 02 2 352982020 09 1696 + 041739 1308 34 03 2 352982020 10 1696 + 041740 1308 34 04 2 352982020 11 1696 + 041741 1308 34 05 2 352982020 12 1696 + 041742 1308 34 06 2 352982020 13 1696 + 041743 1308 34 07 2 352982020 14 1696 + 041744 1308 34 08 2 352982020 15 1696 + 041745 1308 35 01 2 352983044 00 1697 + 041746 1308 35 02 2 352983044 01 1697 + 041747 1308 35 03 2 352983044 02 1697 + 041748 1308 35 04 2 352983044 03 1697 + 041749 1308 35 05 2 352983044 04 1697 + 041750 1308 35 06 2 352983044 05 1697 + 041751 1308 35 07 2 352983044 06 1697 + 041752 1308 35 08 2 352983044 07 1697 + 041753 1308 36 01 2 352983044 08 1697 + 041754 1308 36 02 2 352983044 09 1697 + 041755 1308 36 03 2 352983044 10 1697 + 041756 1308 36 04 2 352983044 11 1697 + 041757 1308 36 05 2 352983044 12 1697 + 041758 1308 36 06 2 352983044 13 1697 + 041759 1308 36 07 2 352983044 14 1697 + 041760 1308 36 08 2 352983044 15 1697 + 041761 1308 37 01 2 352879620 00 1646 + 041762 1308 37 02 2 352879620 01 1646 + 041763 1308 37 03 2 352879620 02 1646 + 041764 1308 37 04 2 352879620 03 1646 + 041765 1308 37 05 2 352879620 04 1646 + 041766 1308 37 06 2 352879620 05 1646 + 041767 1308 37 07 2 352879620 06 1646 + 041768 1308 37 08 2 352879620 07 1646 + 041769 1308 38 01 2 352879620 08 1646 + 041770 1308 38 02 2 352879620 09 1646 + 041771 1308 38 03 2 352879620 10 1646 + 041772 1308 38 04 2 352879620 11 1646 + 041773 1308 38 05 2 352879620 12 1646 + 041774 1308 38 06 2 352879620 13 1646 + 041775 1308 38 07 2 352879620 14 1646 + 041776 1308 38 08 2 352879620 15 1646 + 041777 1308 39 01 2 352880644 00 1647 + 041778 1308 39 02 2 352880644 01 1647 + 041779 1308 39 03 2 352880644 02 1647 + 041780 1308 39 04 2 352880644 03 1647 + 041781 1308 39 05 2 352880644 04 1647 + 041782 1308 39 06 2 352880644 05 1647 + 041783 1308 39 07 2 352880644 06 1647 + 041784 1308 39 08 2 352880644 07 1647 + 041785 1308 40 01 2 352880644 08 1647 + 041786 1308 40 02 2 352880644 09 1647 + 041787 1308 40 03 2 352880644 10 1647 + 041788 1308 40 04 2 352880644 11 1647 + 041789 1308 40 05 2 352880644 12 1647 + 041790 1308 40 06 2 352880644 13 1647 + 041791 1308 40 07 2 352880644 14 1647 + 041792 1308 40 08 2 352880644 15 1647 + 041793 1308 41 01 2 353244164 00 1808 + 041794 1308 41 02 2 353244164 01 1808 + 041795 1308 41 03 2 353244164 02 1808 + 041796 1308 41 04 2 353244164 03 1808 + 041797 1308 41 05 2 353244164 04 1808 + 041798 1308 41 06 2 353244164 05 1808 + 041799 1308 41 07 2 353244164 06 1808 + 041800 1308 41 08 2 353244164 07 1808 + 041801 1308 42 01 2 353244164 08 1808 + 041802 1308 42 02 2 353244164 09 1808 + 041803 1308 42 03 2 353244164 10 1808 + 041804 1308 42 04 2 353244164 11 1808 + 041805 1308 42 05 2 353244164 12 1808 + 041806 1308 42 06 2 353244164 13 1808 + 041807 1308 42 07 2 353244164 14 1808 + 041808 1308 42 08 2 353244164 15 1808 + 041809 1308 43 01 2 353245188 00 1809 + 041810 1308 43 02 2 353245188 01 1809 + 041811 1308 43 03 2 353245188 02 1809 + 041812 1308 43 04 2 353245188 03 1809 + 041813 1308 43 05 2 353245188 04 1809 + 041814 1308 43 06 2 353245188 05 1809 + 041815 1308 43 07 2 353245188 06 1809 + 041816 1308 43 08 2 353245188 07 1809 + 041817 1308 44 01 2 353245188 08 1809 + 041818 1308 44 02 2 353245188 09 1809 + 041819 1308 44 03 2 353245188 10 1809 + 041820 1308 44 04 2 353245188 11 1809 + 041821 1308 44 05 2 353245188 12 1809 + 041822 1308 44 06 2 353245188 13 1809 + 041823 1308 44 07 2 353245188 14 1809 + 041824 1308 44 08 2 353245188 15 1809 + 041825 1308 45 01 2 353141764 00 1758 + 041826 1308 45 02 2 353141764 01 1758 + 041827 1308 45 03 2 353141764 02 1758 + 041828 1308 45 04 2 353141764 03 1758 + 041829 1308 45 05 2 353141764 04 1758 + 041830 1308 45 06 2 353141764 05 1758 + 041831 1308 45 07 2 353141764 06 1758 + 041832 1308 45 08 2 353141764 07 1758 + 041833 1308 46 01 2 353141764 08 1758 + 041834 1308 46 02 2 353141764 09 1758 + 041835 1308 46 03 2 353141764 10 1758 + 041836 1308 46 04 2 353141764 11 1758 + 041837 1308 46 05 2 353141764 12 1758 + 041838 1308 46 06 2 353141764 13 1758 + 041839 1308 46 07 2 353141764 14 1758 + 041840 1308 46 08 2 353141764 15 1758 + 041841 1308 47 01 2 353142788 00 1759 + 041842 1308 47 02 2 353142788 01 1759 + 041843 1308 47 03 2 353142788 02 1759 + 041844 1308 47 04 2 353142788 03 1759 + 041845 1308 47 05 2 353142788 04 1759 + 041846 1308 47 06 2 353142788 05 1759 + 041847 1308 47 07 2 353142788 06 1759 + 041848 1308 47 08 2 353142788 07 1759 + 041849 1308 48 01 2 353142788 08 1759 + 041850 1308 48 02 2 353142788 09 1759 + 041851 1308 48 03 2 353142788 10 1759 + 041852 1308 48 04 2 353142788 11 1759 + 041853 1308 48 05 2 353142788 12 1759 + 041854 1308 48 06 2 353142788 13 1759 + 041855 1308 48 07 2 353142788 14 1759 + 041856 1308 48 08 2 353142788 15 1759 + 041857 1309 01 01 2 352723972 00 1586 + 041858 1309 01 02 2 352723972 01 1586 + 041859 1309 01 03 2 352723972 02 1586 + 041860 1309 01 04 2 352723972 03 1586 + 041861 1309 01 05 2 352723972 04 1586 + 041862 1309 01 06 2 352723972 05 1586 + 041863 1309 01 07 2 352723972 06 1586 + 041864 1309 01 08 2 352723972 07 1586 + 041865 1309 02 01 2 352723972 08 1586 + 041866 1309 02 02 2 352723972 09 1586 + 041867 1309 02 03 2 352723972 10 1586 + 041868 1309 02 04 2 352723972 11 1586 + 041869 1309 02 05 2 352723972 12 1586 + 041870 1309 02 06 2 352723972 13 1586 + 041871 1309 02 07 2 352723972 14 1586 + 041872 1309 02 08 2 352723972 15 1586 + 041873 1309 03 01 2 352724996 00 1587 + 041874 1309 03 02 2 352724996 01 1587 + 041875 1309 03 03 2 352724996 02 1587 + 041876 1309 03 04 2 352724996 03 1587 + 041877 1309 03 05 2 352724996 04 1587 + 041878 1309 03 06 2 352724996 05 1587 + 041879 1309 03 07 2 352724996 06 1587 + 041880 1309 03 08 2 352724996 07 1587 + 041881 1309 04 01 2 352724996 08 1587 + 041882 1309 04 02 2 352724996 09 1587 + 041883 1309 04 03 2 352724996 10 1587 + 041884 1309 04 04 2 352724996 11 1587 + 041885 1309 04 05 2 352724996 12 1587 + 041886 1309 04 06 2 352724996 13 1587 + 041887 1309 04 07 2 352724996 14 1587 + 041888 1309 04 08 2 352724996 15 1587 + 041889 1309 05 01 2 352621572 00 1536 + 041890 1309 05 02 2 352621572 01 1536 + 041891 1309 05 03 2 352621572 02 1536 + 041892 1309 05 04 2 352621572 03 1536 + 041893 1309 05 05 2 352621572 04 1536 + 041894 1309 05 06 2 352621572 05 1536 + 041895 1309 05 07 2 352621572 06 1536 + 041896 1309 05 08 2 352621572 07 1536 + 041897 1309 06 01 2 352621572 08 1536 + 041898 1309 06 02 2 352621572 09 1536 + 041899 1309 06 03 2 352621572 10 1536 + 041900 1309 06 04 2 352621572 11 1536 + 041901 1309 06 05 2 352621572 12 1536 + 041902 1309 06 06 2 352621572 13 1536 + 041903 1309 06 07 2 352621572 14 1536 + 041904 1309 06 08 2 352621572 15 1536 + 041905 1309 07 01 2 352622596 00 1537 + 041906 1309 07 02 2 352622596 01 1537 + 041907 1309 07 03 2 352622596 02 1537 + 041908 1309 07 04 2 352622596 03 1537 + 041909 1309 07 05 2 352622596 04 1537 + 041910 1309 07 06 2 352622596 05 1537 + 041911 1309 07 07 2 352622596 06 1537 + 041912 1309 07 08 2 352622596 07 1537 + 041913 1309 08 01 2 352622596 08 1537 + 041914 1309 08 02 2 352622596 09 1537 + 041915 1309 08 03 2 352622596 10 1537 + 041916 1309 08 04 2 352622596 11 1537 + 041917 1309 08 05 2 352622596 12 1537 + 041918 1309 08 06 2 352622596 13 1537 + 041919 1309 08 07 2 352622596 14 1537 + 041920 1309 08 08 2 352622596 15 1537 + 041921 1309 09 01 2 352986116 00 1698 + 041922 1309 09 02 2 352986116 01 1698 + 041923 1309 09 03 2 352986116 02 1698 + 041924 1309 09 04 2 352986116 03 1698 + 041925 1309 09 05 2 352986116 04 1698 + 041926 1309 09 06 2 352986116 05 1698 + 041927 1309 09 07 2 352986116 06 1698 + 041928 1309 09 08 2 352986116 07 1698 + 041929 1309 10 01 2 352986116 08 1698 + 041930 1309 10 02 2 352986116 09 1698 + 041931 1309 10 03 2 352986116 10 1698 + 041932 1309 10 04 2 352986116 11 1698 + 041933 1309 10 05 2 352986116 12 1698 + 041934 1309 10 06 2 352986116 13 1698 + 041935 1309 10 07 2 352986116 14 1698 + 041936 1309 10 08 2 352986116 15 1698 + 041937 1309 11 01 2 352987140 00 1699 + 041938 1309 11 02 2 352987140 01 1699 + 041939 1309 11 03 2 352987140 02 1699 + 041940 1309 11 04 2 352987140 03 1699 + 041941 1309 11 05 2 352987140 04 1699 + 041942 1309 11 06 2 352987140 05 1699 + 041943 1309 11 07 2 352987140 06 1699 + 041944 1309 11 08 2 352987140 07 1699 + 041945 1309 12 01 2 352987140 08 1699 + 041946 1309 12 02 2 352987140 09 1699 + 041947 1309 12 03 2 352987140 10 1699 + 041948 1309 12 04 2 352987140 11 1699 + 041949 1309 12 05 2 352987140 12 1699 + 041950 1309 12 06 2 352987140 13 1699 + 041951 1309 12 07 2 352987140 14 1699 + 041952 1309 12 08 2 352987140 15 1699 + 041953 1309 13 01 2 352883716 00 1648 + 041954 1309 13 02 2 352883716 01 1648 + 041955 1309 13 03 2 352883716 02 1648 + 041956 1309 13 04 2 352883716 03 1648 + 041957 1309 13 05 2 352883716 04 1648 + 041958 1309 13 06 2 352883716 05 1648 + 041959 1309 13 07 2 352883716 06 1648 + 041960 1309 13 08 2 352883716 07 1648 + 041961 1309 14 01 2 352883716 08 1648 + 041962 1309 14 02 2 352883716 09 1648 + 041963 1309 14 03 2 352883716 10 1648 + 041964 1309 14 04 2 352883716 11 1648 + 041965 1309 14 05 2 352883716 12 1648 + 041966 1309 14 06 2 352883716 13 1648 + 041967 1309 14 07 2 352883716 14 1648 + 041968 1309 14 08 2 352883716 15 1648 + 041969 1309 15 01 2 352884740 00 1649 + 041970 1309 15 02 2 352884740 01 1649 + 041971 1309 15 03 2 352884740 02 1649 + 041972 1309 15 04 2 352884740 03 1649 + 041973 1309 15 05 2 352884740 04 1649 + 041974 1309 15 06 2 352884740 05 1649 + 041975 1309 15 07 2 352884740 06 1649 + 041976 1309 15 08 2 352884740 07 1649 + 041977 1309 16 01 2 352884740 08 1649 + 041978 1309 16 02 2 352884740 09 1649 + 041979 1309 16 03 2 352884740 10 1649 + 041980 1309 16 04 2 352884740 11 1649 + 041981 1309 16 05 2 352884740 12 1649 + 041982 1309 16 06 2 352884740 13 1649 + 041983 1309 16 07 2 352884740 14 1649 + 041984 1309 16 08 2 352884740 15 1649 + 041985 1309 17 01 2 353248260 00 1810 + 041986 1309 17 02 2 353248260 01 1810 + 041987 1309 17 03 2 353248260 02 1810 + 041988 1309 17 04 2 353248260 03 1810 + 041989 1309 17 05 2 353248260 04 1810 + 041990 1309 17 06 2 353248260 05 1810 + 041991 1309 17 07 2 353248260 06 1810 + 041992 1309 17 08 2 353248260 07 1810 + 041993 1309 18 01 2 353248260 08 1810 + 041994 1309 18 02 2 353248260 09 1810 + 041995 1309 18 03 2 353248260 10 1810 + 041996 1309 18 04 2 353248260 11 1810 + 041997 1309 18 05 2 353248260 12 1810 + 041998 1309 18 06 2 353248260 13 1810 + 041999 1309 18 07 2 353248260 14 1810 + 042000 1309 18 08 2 353248260 15 1810 + 042001 1309 19 01 2 353249284 00 1811 + 042002 1309 19 02 2 353249284 01 1811 + 042003 1309 19 03 2 353249284 02 1811 + 042004 1309 19 04 2 353249284 03 1811 + 042005 1309 19 05 2 353249284 04 1811 + 042006 1309 19 06 2 353249284 05 1811 + 042007 1309 19 07 2 353249284 06 1811 + 042008 1309 19 08 2 353249284 07 1811 + 042009 1309 20 01 2 353249284 08 1811 + 042010 1309 20 02 2 353249284 09 1811 + 042011 1309 20 03 2 353249284 10 1811 + 042012 1309 20 04 2 353249284 11 1811 + 042013 1309 20 05 2 353249284 12 1811 + 042014 1309 20 06 2 353249284 13 1811 + 042015 1309 20 07 2 353249284 14 1811 + 042016 1309 20 08 2 353249284 15 1811 + 042017 1309 21 01 2 353145860 00 1760 + 042018 1309 21 02 2 353145860 01 1760 + 042019 1309 21 03 2 353145860 02 1760 + 042020 1309 21 04 2 353145860 03 1760 + 042021 1309 21 05 2 353145860 04 1760 + 042022 1309 21 06 2 353145860 05 1760 + 042023 1309 21 07 2 353145860 06 1760 + 042024 1309 21 08 2 353145860 07 1760 + 042025 1309 22 01 2 353145860 08 1760 + 042026 1309 22 02 2 353145860 09 1760 + 042027 1309 22 03 2 353145860 10 1760 + 042028 1309 22 04 2 353145860 11 1760 + 042029 1309 22 05 2 353145860 12 1760 + 042030 1309 22 06 2 353145860 13 1760 + 042031 1309 22 07 2 353145860 14 1760 + 042032 1309 22 08 2 353145860 15 1760 + 042033 1309 23 01 2 353146884 00 1761 + 042034 1309 23 02 2 353146884 01 1761 + 042035 1309 23 03 2 353146884 02 1761 + 042036 1309 23 04 2 353146884 03 1761 + 042037 1309 23 05 2 353146884 04 1761 + 042038 1309 23 06 2 353146884 05 1761 + 042039 1309 23 07 2 353146884 06 1761 + 042040 1309 23 08 2 353146884 07 1761 + 042041 1309 24 01 2 353146884 08 1761 + 042042 1309 24 02 2 353146884 09 1761 + 042043 1309 24 03 2 353146884 10 1761 + 042044 1309 24 04 2 353146884 11 1761 + 042045 1309 24 05 2 353146884 12 1761 + 042046 1309 24 06 2 353146884 13 1761 + 042047 1309 24 07 2 353146884 14 1761 + 042048 1309 24 08 2 353146884 15 1761 + 042049 1309 25 01 2 352728068 00 1588 + 042050 1309 25 02 2 352728068 01 1588 + 042051 1309 25 03 2 352728068 02 1588 + 042052 1309 25 04 2 352728068 03 1588 + 042053 1309 25 05 2 352728068 04 1588 + 042054 1309 25 06 2 352728068 05 1588 + 042055 1309 25 07 2 352728068 06 1588 + 042056 1309 25 08 2 352728068 07 1588 + 042057 1309 26 01 2 352728068 08 1588 + 042058 1309 26 02 2 352728068 09 1588 + 042059 1309 26 03 2 352728068 10 1588 + 042060 1309 26 04 2 352728068 11 1588 + 042061 1309 26 05 2 352728068 12 1588 + 042062 1309 26 06 2 352728068 13 1588 + 042063 1309 26 07 2 352728068 14 1588 + 042064 1309 26 08 2 352728068 15 1588 + 042065 1309 27 01 2 352729092 00 1589 + 042066 1309 27 02 2 352729092 01 1589 + 042067 1309 27 03 2 352729092 02 1589 + 042068 1309 27 04 2 352729092 03 1589 + 042069 1309 27 05 2 352729092 04 1589 + 042070 1309 27 06 2 352729092 05 1589 + 042071 1309 27 07 2 352729092 06 1589 + 042072 1309 27 08 2 352729092 07 1589 + 042073 1309 28 01 2 352729092 08 1589 + 042074 1309 28 02 2 352729092 09 1589 + 042075 1309 28 03 2 352729092 10 1589 + 042076 1309 28 04 2 352729092 11 1589 + 042077 1309 28 05 2 352729092 12 1589 + 042078 1309 28 06 2 352729092 13 1589 + 042079 1309 28 07 2 352729092 14 1589 + 042080 1309 28 08 2 352729092 15 1589 + 042081 1309 29 01 2 352732164 00 1590 + 042082 1309 29 02 2 352732164 01 1590 + 042083 1309 29 03 2 352732164 02 1590 + 042084 1309 29 04 2 352732164 03 1590 + 042085 1309 29 05 2 352732164 04 1590 + 042086 1309 29 06 2 352732164 05 1590 + 042087 1309 29 07 2 352732164 06 1590 + 042088 1309 29 08 2 352732164 07 1590 + 042089 1309 30 01 2 352732164 08 1590 + 042090 1309 30 02 2 352732164 09 1590 + 042091 1309 30 03 2 352732164 10 1590 + 042092 1309 30 04 2 352732164 11 1590 + 042093 1309 30 05 2 352732164 12 1590 + 042094 1309 30 06 2 352732164 13 1590 + 042095 1309 30 07 2 352732164 14 1590 + 042096 1309 30 08 2 352732164 15 1590 + 042097 1309 31 01 2 352733188 00 1591 + 042098 1309 31 02 2 352733188 01 1591 + 042099 1309 31 03 2 352733188 02 1591 + 042100 1309 31 04 2 352733188 03 1591 + 042101 1309 31 05 2 352733188 04 1591 + 042102 1309 31 06 2 352733188 05 1591 + 042103 1309 31 07 2 352733188 06 1591 + 042104 1309 31 08 2 352733188 07 1591 + 042105 1309 32 01 2 352733188 08 1591 + 042106 1309 32 02 2 352733188 09 1591 + 042107 1309 32 03 2 352733188 10 1591 + 042108 1309 32 04 2 352733188 11 1591 + 042109 1309 32 05 2 352733188 12 1591 + 042110 1309 32 06 2 352733188 13 1591 + 042111 1309 32 07 2 352733188 14 1591 + 042112 1309 32 08 2 352733188 15 1591 + 042113 1309 33 01 2 352990212 00 1700 + 042114 1309 33 02 2 352990212 01 1700 + 042115 1309 33 03 2 352990212 02 1700 + 042116 1309 33 04 2 352990212 03 1700 + 042117 1309 33 05 2 352990212 04 1700 + 042118 1309 33 06 2 352990212 05 1700 + 042119 1309 33 07 2 352990212 06 1700 + 042120 1309 33 08 2 352990212 07 1700 + 042121 1309 34 01 2 352990212 08 1700 + 042122 1309 34 02 2 352990212 09 1700 + 042123 1309 34 03 2 352990212 10 1700 + 042124 1309 34 04 2 352990212 11 1700 + 042125 1309 34 05 2 352990212 12 1700 + 042126 1309 34 06 2 352990212 13 1700 + 042127 1309 34 07 2 352990212 14 1700 + 042128 1309 34 08 2 352990212 15 1700 + 042129 1309 35 01 2 352991236 00 1701 + 042130 1309 35 02 2 352991236 01 1701 + 042131 1309 35 03 2 352991236 02 1701 + 042132 1309 35 04 2 352991236 03 1701 + 042133 1309 35 05 2 352991236 04 1701 + 042134 1309 35 06 2 352991236 05 1701 + 042135 1309 35 07 2 352991236 06 1701 + 042136 1309 35 08 2 352991236 07 1701 + 042137 1309 36 01 2 352991236 08 1701 + 042138 1309 36 02 2 352991236 09 1701 + 042139 1309 36 03 2 352991236 10 1701 + 042140 1309 36 04 2 352991236 11 1701 + 042141 1309 36 05 2 352991236 12 1701 + 042142 1309 36 06 2 352991236 13 1701 + 042143 1309 36 07 2 352991236 14 1701 + 042144 1309 36 08 2 352991236 15 1701 + 042145 1309 37 01 2 352994308 00 1702 + 042146 1309 37 02 2 352994308 01 1702 + 042147 1309 37 03 2 352994308 02 1702 + 042148 1309 37 04 2 352994308 03 1702 + 042149 1309 37 05 2 352994308 04 1702 + 042150 1309 37 06 2 352994308 05 1702 + 042151 1309 37 07 2 352994308 06 1702 + 042152 1309 37 08 2 352994308 07 1702 + 042153 1309 38 01 2 352994308 08 1702 + 042154 1309 38 02 2 352994308 09 1702 + 042155 1309 38 03 2 352994308 10 1702 + 042156 1309 38 04 2 352994308 11 1702 + 042157 1309 38 05 2 352994308 12 1702 + 042158 1309 38 06 2 352994308 13 1702 + 042159 1309 38 07 2 352994308 14 1702 + 042160 1309 38 08 2 352994308 15 1702 + 042161 1309 39 01 2 352995332 00 1703 + 042162 1309 39 02 2 352995332 01 1703 + 042163 1309 39 03 2 352995332 02 1703 + 042164 1309 39 04 2 352995332 03 1703 + 042165 1309 39 05 2 352995332 04 1703 + 042166 1309 39 06 2 352995332 05 1703 + 042167 1309 39 07 2 352995332 06 1703 + 042168 1309 39 08 2 352995332 07 1703 + 042169 1309 40 01 2 352995332 08 1703 + 042170 1309 40 02 2 352995332 09 1703 + 042171 1309 40 03 2 352995332 10 1703 + 042172 1309 40 04 2 352995332 11 1703 + 042173 1309 40 05 2 352995332 12 1703 + 042174 1309 40 06 2 352995332 13 1703 + 042175 1309 40 07 2 352995332 14 1703 + 042176 1309 40 08 2 352995332 15 1703 + 042177 1309 41 01 2 353252356 00 1812 + 042178 1309 41 02 2 353252356 01 1812 + 042179 1309 41 03 2 353252356 02 1812 + 042180 1309 41 04 2 353252356 03 1812 + 042181 1309 41 05 2 353252356 04 1812 + 042182 1309 41 06 2 353252356 05 1812 + 042183 1309 41 07 2 353252356 06 1812 + 042184 1309 41 08 2 353252356 07 1812 + 042185 1309 42 01 2 353252356 08 1812 + 042186 1309 42 02 2 353252356 09 1812 + 042187 1309 42 03 2 353252356 10 1812 + 042188 1309 42 04 2 353252356 11 1812 + 042189 1309 42 05 2 353252356 12 1812 + 042190 1309 42 06 2 353252356 13 1812 + 042191 1309 42 07 2 353252356 14 1812 + 042192 1309 42 08 2 353252356 15 1812 + 042193 1309 43 01 2 353253380 00 1813 + 042194 1309 43 02 2 353253380 01 1813 + 042195 1309 43 03 2 353253380 02 1813 + 042196 1309 43 04 2 353253380 03 1813 + 042197 1309 43 05 2 353253380 04 1813 + 042198 1309 43 06 2 353253380 05 1813 + 042199 1309 43 07 2 353253380 06 1813 + 042200 1309 43 08 2 353253380 07 1813 + 042201 1309 44 01 2 353253380 08 1813 + 042202 1309 44 02 2 353253380 09 1813 + 042203 1309 44 03 2 353253380 10 1813 + 042204 1309 44 04 2 353253380 11 1813 + 042205 1309 44 05 2 353253380 12 1813 + 042206 1309 44 06 2 353253380 13 1813 + 042207 1309 44 07 2 353253380 14 1813 + 042208 1309 44 08 2 353253380 15 1813 + 042209 1309 45 01 2 353256452 00 1814 + 042210 1309 45 02 2 353256452 01 1814 + 042211 1309 45 03 2 353256452 02 1814 + 042212 1309 45 04 2 353256452 03 1814 + 042213 1309 45 05 2 353256452 04 1814 + 042214 1309 45 06 2 353256452 05 1814 + 042215 1309 45 07 2 353256452 06 1814 + 042216 1309 45 08 2 353256452 07 1814 + 042217 1309 46 01 2 353256452 08 1814 + 042218 1309 46 02 2 353256452 09 1814 + 042219 1309 46 03 2 353256452 10 1814 + 042220 1309 46 04 2 353256452 11 1814 + 042221 1309 46 05 2 353256452 12 1814 + 042222 1309 46 06 2 353256452 13 1814 + 042223 1309 46 07 2 353256452 14 1814 + 042224 1309 46 08 2 353256452 15 1814 + 042225 1309 47 01 2 353257476 00 1815 + 042226 1309 47 02 2 353257476 01 1815 + 042227 1309 47 03 2 353257476 02 1815 + 042228 1309 47 04 2 353257476 03 1815 + 042229 1309 47 05 2 353257476 04 1815 + 042230 1309 47 06 2 353257476 05 1815 + 042231 1309 47 07 2 353257476 06 1815 + 042232 1309 47 08 2 353257476 07 1815 + 042233 1309 48 01 2 353257476 08 1815 + 042234 1309 48 02 2 353257476 09 1815 + 042235 1309 48 03 2 353257476 10 1815 + 042236 1309 48 04 2 353257476 11 1815 + 042237 1309 48 05 2 353257476 12 1815 + 042238 1309 48 06 2 353257476 13 1815 + 042239 1309 48 07 2 353257476 14 1815 + 042240 1309 48 08 2 353257476 15 1815 + 042241 1310 01 01 2 352625668 00 1538 + 042242 1310 01 02 2 352625668 01 1538 + 042243 1310 01 03 2 352625668 02 1538 + 042244 1310 01 04 2 352625668 03 1538 + 042245 1310 01 05 2 352625668 04 1538 + 042246 1310 01 06 2 352625668 05 1538 + 042247 1310 01 07 2 352625668 06 1538 + 042248 1310 01 08 2 352625668 07 1538 + 042249 1310 02 01 2 352625668 08 1538 + 042250 1310 02 02 2 352625668 09 1538 + 042251 1310 02 03 2 352625668 10 1538 + 042252 1310 02 04 2 352625668 11 1538 + 042253 1310 02 05 2 352625668 12 1538 + 042254 1310 02 06 2 352625668 13 1538 + 042255 1310 02 07 2 352625668 14 1538 + 042256 1310 02 08 2 352625668 15 1538 + 042257 1310 03 01 2 352626692 00 1539 + 042258 1310 03 02 2 352626692 01 1539 + 042259 1310 03 03 2 352626692 02 1539 + 042260 1310 03 04 2 352626692 03 1539 + 042261 1310 03 05 2 352626692 04 1539 + 042262 1310 03 06 2 352626692 05 1539 + 042263 1310 03 07 2 352626692 06 1539 + 042264 1310 03 08 2 352626692 07 1539 + 042265 1310 04 01 2 352626692 08 1539 + 042266 1310 04 02 2 352626692 09 1539 + 042267 1310 04 03 2 352626692 10 1539 + 042268 1310 04 04 2 352626692 11 1539 + 042269 1310 04 05 2 352626692 12 1539 + 042270 1310 04 06 2 352626692 13 1539 + 042271 1310 04 07 2 352626692 14 1539 + 042272 1310 04 08 2 352626692 15 1539 + 042273 1310 05 01 2 352736260 00 1592 + 042274 1310 05 02 2 352736260 01 1592 + 042275 1310 05 03 2 352736260 02 1592 + 042276 1310 05 04 2 352736260 03 1592 + 042277 1310 05 05 2 352736260 04 1592 + 042278 1310 05 06 2 352736260 05 1592 + 042279 1310 05 07 2 352736260 06 1592 + 042280 1310 05 08 2 352736260 07 1592 + 042281 1310 06 01 2 352736260 08 1592 + 042282 1310 06 02 2 352736260 09 1592 + 042283 1310 06 03 2 352736260 10 1592 + 042284 1310 06 04 2 352736260 11 1592 + 042285 1310 06 05 2 352736260 12 1592 + 042286 1310 06 06 2 352736260 13 1592 + 042287 1310 06 07 2 352736260 14 1592 + 042288 1310 06 08 2 352736260 15 1592 + 042289 1310 07 01 2 352737284 00 1593 + 042290 1310 07 02 2 352737284 01 1593 + 042291 1310 07 03 2 352737284 02 1593 + 042292 1310 07 04 2 352737284 03 1593 + 042293 1310 07 05 2 352737284 04 1593 + 042294 1310 07 06 2 352737284 05 1593 + 042295 1310 07 07 2 352737284 06 1593 + 042296 1310 07 08 2 352737284 07 1593 + 042297 1310 08 01 2 352737284 08 1593 + 042298 1310 08 02 2 352737284 09 1593 + 042299 1310 08 03 2 352737284 10 1593 + 042300 1310 08 04 2 352737284 11 1593 + 042301 1310 08 05 2 352737284 12 1593 + 042302 1310 08 06 2 352737284 13 1593 + 042303 1310 08 07 2 352737284 14 1593 + 042304 1310 08 08 2 352737284 15 1593 + 042305 1310 09 01 2 352887812 00 1650 + 042306 1310 09 02 2 352887812 01 1650 + 042307 1310 09 03 2 352887812 02 1650 + 042308 1310 09 04 2 352887812 03 1650 + 042309 1310 09 05 2 352887812 04 1650 + 042310 1310 09 06 2 352887812 05 1650 + 042311 1310 09 07 2 352887812 06 1650 + 042312 1310 09 08 2 352887812 07 1650 + 042313 1310 10 01 2 352887812 08 1650 + 042314 1310 10 02 2 352887812 09 1650 + 042315 1310 10 03 2 352887812 10 1650 + 042316 1310 10 04 2 352887812 11 1650 + 042317 1310 10 05 2 352887812 12 1650 + 042318 1310 10 06 2 352887812 13 1650 + 042319 1310 10 07 2 352887812 14 1650 + 042320 1310 10 08 2 352887812 15 1650 + 042321 1310 11 01 2 352888836 00 1651 + 042322 1310 11 02 2 352888836 01 1651 + 042323 1310 11 03 2 352888836 02 1651 + 042324 1310 11 04 2 352888836 03 1651 + 042325 1310 11 05 2 352888836 04 1651 + 042326 1310 11 06 2 352888836 05 1651 + 042327 1310 11 07 2 352888836 06 1651 + 042328 1310 11 08 2 352888836 07 1651 + 042329 1310 12 01 2 352888836 08 1651 + 042330 1310 12 02 2 352888836 09 1651 + 042331 1310 12 03 2 352888836 10 1651 + 042332 1310 12 04 2 352888836 11 1651 + 042333 1310 12 05 2 352888836 12 1651 + 042334 1310 12 06 2 352888836 13 1651 + 042335 1310 12 07 2 352888836 14 1651 + 042336 1310 12 08 2 352888836 15 1651 + 042337 1310 13 01 2 352998404 00 1704 + 042338 1310 13 02 2 352998404 01 1704 + 042339 1310 13 03 2 352998404 02 1704 + 042340 1310 13 04 2 352998404 03 1704 + 042341 1310 13 05 2 352998404 04 1704 + 042342 1310 13 06 2 352998404 05 1704 + 042343 1310 13 07 2 352998404 06 1704 + 042344 1310 13 08 2 352998404 07 1704 + 042345 1310 14 01 2 352998404 08 1704 + 042346 1310 14 02 2 352998404 09 1704 + 042347 1310 14 03 2 352998404 10 1704 + 042348 1310 14 04 2 352998404 11 1704 + 042349 1310 14 05 2 352998404 12 1704 + 042350 1310 14 06 2 352998404 13 1704 + 042351 1310 14 07 2 352998404 14 1704 + 042352 1310 14 08 2 352998404 15 1704 + 042353 1310 15 01 2 352999428 00 1705 + 042354 1310 15 02 2 352999428 01 1705 + 042355 1310 15 03 2 352999428 02 1705 + 042356 1310 15 04 2 352999428 03 1705 + 042357 1310 15 05 2 352999428 04 1705 + 042358 1310 15 06 2 352999428 05 1705 + 042359 1310 15 07 2 352999428 06 1705 + 042360 1310 15 08 2 352999428 07 1705 + 042361 1310 16 01 2 352999428 08 1705 + 042362 1310 16 02 2 352999428 09 1705 + 042363 1310 16 03 2 352999428 10 1705 + 042364 1310 16 04 2 352999428 11 1705 + 042365 1310 16 05 2 352999428 12 1705 + 042366 1310 16 06 2 352999428 13 1705 + 042367 1310 16 07 2 352999428 14 1705 + 042368 1310 16 08 2 352999428 15 1705 + 042369 1310 17 01 2 353149956 00 1762 + 042370 1310 17 02 2 353149956 01 1762 + 042371 1310 17 03 2 353149956 02 1762 + 042372 1310 17 04 2 353149956 03 1762 + 042373 1310 17 05 2 353149956 04 1762 + 042374 1310 17 06 2 353149956 05 1762 + 042375 1310 17 07 2 353149956 06 1762 + 042376 1310 17 08 2 353149956 07 1762 + 042377 1310 18 01 2 353149956 08 1762 + 042378 1310 18 02 2 353149956 09 1762 + 042379 1310 18 03 2 353149956 10 1762 + 042380 1310 18 04 2 353149956 11 1762 + 042381 1310 18 05 2 353149956 12 1762 + 042382 1310 18 06 2 353149956 13 1762 + 042383 1310 18 07 2 353149956 14 1762 + 042384 1310 18 08 2 353149956 15 1762 + 042385 1310 19 01 2 353150980 00 1763 + 042386 1310 19 02 2 353150980 01 1763 + 042387 1310 19 03 2 353150980 02 1763 + 042388 1310 19 04 2 353150980 03 1763 + 042389 1310 19 05 2 353150980 04 1763 + 042390 1310 19 06 2 353150980 05 1763 + 042391 1310 19 07 2 353150980 06 1763 + 042392 1310 19 08 2 353150980 07 1763 + 042393 1310 20 01 2 353150980 08 1763 + 042394 1310 20 02 2 353150980 09 1763 + 042395 1310 20 03 2 353150980 10 1763 + 042396 1310 20 04 2 353150980 11 1763 + 042397 1310 20 05 2 353150980 12 1763 + 042398 1310 20 06 2 353150980 13 1763 + 042399 1310 20 07 2 353150980 14 1763 + 042400 1310 20 08 2 353150980 15 1763 + 042401 1310 21 01 2 353260548 00 1816 + 042402 1310 21 02 2 353260548 01 1816 + 042403 1310 21 03 2 353260548 02 1816 + 042404 1310 21 04 2 353260548 03 1816 + 042405 1310 21 05 2 353260548 04 1816 + 042406 1310 21 06 2 353260548 05 1816 + 042407 1310 21 07 2 353260548 06 1816 + 042408 1310 21 08 2 353260548 07 1816 + 042409 1310 22 01 2 353260548 08 1816 + 042410 1310 22 02 2 353260548 09 1816 + 042411 1310 22 03 2 353260548 10 1816 + 042412 1310 22 04 2 353260548 11 1816 + 042413 1310 22 05 2 353260548 12 1816 + 042414 1310 22 06 2 353260548 13 1816 + 042415 1310 22 07 2 353260548 14 1816 + 042416 1310 22 08 2 353260548 15 1816 + 042417 1310 23 01 2 353261572 00 1817 + 042418 1310 23 02 2 353261572 01 1817 + 042419 1310 23 03 2 353261572 02 1817 + 042420 1310 23 04 2 353261572 03 1817 + 042421 1310 23 05 2 353261572 04 1817 + 042422 1310 23 06 2 353261572 05 1817 + 042423 1310 23 07 2 353261572 06 1817 + 042424 1310 23 08 2 353261572 07 1817 + 042425 1310 24 01 2 353261572 08 1817 + 042426 1310 24 02 2 353261572 09 1817 + 042427 1310 24 03 2 353261572 10 1817 + 042428 1310 24 04 2 353261572 11 1817 + 042429 1310 24 05 2 353261572 12 1817 + 042430 1310 24 06 2 353261572 13 1817 + 042431 1310 24 07 2 353261572 14 1817 + 042432 1310 24 08 2 353261572 15 1817 + 042433 1310 25 01 2 352740356 00 1594 + 042434 1310 25 02 2 352740356 01 1594 + 042435 1310 25 03 2 352740356 02 1594 + 042436 1310 25 04 2 352740356 03 1594 + 042437 1310 25 05 2 352740356 04 1594 + 042438 1310 25 06 2 352740356 05 1594 + 042439 1310 25 07 2 352740356 06 1594 + 042440 1310 25 08 2 352740356 07 1594 + 042441 1310 26 01 2 352740356 08 1594 + 042442 1310 26 02 2 352740356 09 1594 + 042443 1310 26 03 2 352740356 10 1594 + 042444 1310 26 04 2 352740356 11 1594 + 042445 1310 26 05 2 352740356 12 1594 + 042446 1310 26 06 2 352740356 13 1594 + 042447 1310 26 07 2 352740356 14 1594 + 042448 1310 26 08 2 352740356 15 1594 + 042449 1310 27 01 2 352741380 00 1595 + 042450 1310 27 02 2 352741380 01 1595 + 042451 1310 27 03 2 352741380 02 1595 + 042452 1310 27 04 2 352741380 03 1595 + 042453 1310 27 05 2 352741380 04 1595 + 042454 1310 27 06 2 352741380 05 1595 + 042455 1310 27 07 2 352741380 06 1595 + 042456 1310 27 08 2 352741380 07 1595 + 042457 1310 28 01 2 352741380 08 1595 + 042458 1310 28 02 2 352741380 09 1595 + 042459 1310 28 03 2 352741380 10 1595 + 042460 1310 28 04 2 352741380 11 1595 + 042461 1310 28 05 2 352741380 12 1595 + 042462 1310 28 06 2 352741380 13 1595 + 042463 1310 28 07 2 352741380 14 1595 + 042464 1310 28 08 2 352741380 15 1595 + 042465 1310 29 01 2 352744452 00 1596 + 042466 1310 29 02 2 352744452 01 1596 + 042467 1310 29 03 2 352744452 02 1596 + 042468 1310 29 04 2 352744452 03 1596 + 042469 1310 29 05 2 352744452 04 1596 + 042470 1310 29 06 2 352744452 05 1596 + 042471 1310 29 07 2 352744452 06 1596 + 042472 1310 29 08 2 352744452 07 1596 + 042473 1310 30 01 2 352744452 08 1596 + 042474 1310 30 02 2 352744452 09 1596 + 042475 1310 30 03 2 352744452 10 1596 + 042476 1310 30 04 2 352744452 11 1596 + 042477 1310 30 05 2 352744452 12 1596 + 042478 1310 30 06 2 352744452 13 1596 + 042479 1310 30 07 2 352744452 14 1596 + 042480 1310 30 08 2 352744452 15 1596 + 042481 1310 31 01 2 352745476 00 1597 + 042482 1310 31 02 2 352745476 01 1597 + 042483 1310 31 03 2 352745476 02 1597 + 042484 1310 31 04 2 352745476 03 1597 + 042485 1310 31 05 2 352745476 04 1597 + 042486 1310 31 06 2 352745476 05 1597 + 042487 1310 31 07 2 352745476 06 1597 + 042488 1310 31 08 2 352745476 07 1597 + 042489 1310 32 01 2 352745476 08 1597 + 042490 1310 32 02 2 352745476 09 1597 + 042491 1310 32 03 2 352745476 10 1597 + 042492 1310 32 04 2 352745476 11 1597 + 042493 1310 32 05 2 352745476 12 1597 + 042494 1310 32 06 2 352745476 13 1597 + 042495 1310 32 07 2 352745476 14 1597 + 042496 1310 32 08 2 352745476 15 1597 + 042497 1310 33 01 2 353002500 00 1706 + 042498 1310 33 02 2 353002500 01 1706 + 042499 1310 33 03 2 353002500 02 1706 + 042500 1310 33 04 2 353002500 03 1706 + 042501 1310 33 05 2 353002500 04 1706 + 042502 1310 33 06 2 353002500 05 1706 + 042503 1310 33 07 2 353002500 06 1706 + 042504 1310 33 08 2 353002500 07 1706 + 042505 1310 34 01 2 353002500 08 1706 + 042506 1310 34 02 2 353002500 09 1706 + 042507 1310 34 03 2 353002500 10 1706 + 042508 1310 34 04 2 353002500 11 1706 + 042509 1310 34 05 2 353002500 12 1706 + 042510 1310 34 06 2 353002500 13 1706 + 042511 1310 34 07 2 353002500 14 1706 + 042512 1310 34 08 2 353002500 15 1706 + 042513 1310 35 01 2 353003524 00 1707 + 042514 1310 35 02 2 353003524 01 1707 + 042515 1310 35 03 2 353003524 02 1707 + 042516 1310 35 04 2 353003524 03 1707 + 042517 1310 35 05 2 353003524 04 1707 + 042518 1310 35 06 2 353003524 05 1707 + 042519 1310 35 07 2 353003524 06 1707 + 042520 1310 35 08 2 353003524 07 1707 + 042521 1310 36 01 2 353003524 08 1707 + 042522 1310 36 02 2 353003524 09 1707 + 042523 1310 36 03 2 353003524 10 1707 + 042524 1310 36 04 2 353003524 11 1707 + 042525 1310 36 05 2 353003524 12 1707 + 042526 1310 36 06 2 353003524 13 1707 + 042527 1310 36 07 2 353003524 14 1707 + 042528 1310 36 08 2 353003524 15 1707 + 042529 1310 37 01 2 353006596 00 1708 + 042530 1310 37 02 2 353006596 01 1708 + 042531 1310 37 03 2 353006596 02 1708 + 042532 1310 37 04 2 353006596 03 1708 + 042533 1310 37 05 2 353006596 04 1708 + 042534 1310 37 06 2 353006596 05 1708 + 042535 1310 37 07 2 353006596 06 1708 + 042536 1310 37 08 2 353006596 07 1708 + 042537 1310 38 01 2 353006596 08 1708 + 042538 1310 38 02 2 353006596 09 1708 + 042539 1310 38 03 2 353006596 10 1708 + 042540 1310 38 04 2 353006596 11 1708 + 042541 1310 38 05 2 353006596 12 1708 + 042542 1310 38 06 2 353006596 13 1708 + 042543 1310 38 07 2 353006596 14 1708 + 042544 1310 38 08 2 353006596 15 1708 + 042545 1310 39 01 2 353007620 00 1709 + 042546 1310 39 02 2 353007620 01 1709 + 042547 1310 39 03 2 353007620 02 1709 + 042548 1310 39 04 2 353007620 03 1709 + 042549 1310 39 05 2 353007620 04 1709 + 042550 1310 39 06 2 353007620 05 1709 + 042551 1310 39 07 2 353007620 06 1709 + 042552 1310 39 08 2 353007620 07 1709 + 042553 1310 40 01 2 353007620 08 1709 + 042554 1310 40 02 2 353007620 09 1709 + 042555 1310 40 03 2 353007620 10 1709 + 042556 1310 40 04 2 353007620 11 1709 + 042557 1310 40 05 2 353007620 12 1709 + 042558 1310 40 06 2 353007620 13 1709 + 042559 1310 40 07 2 353007620 14 1709 + 042560 1310 40 08 2 353007620 15 1709 + 042561 1310 41 01 2 353264644 00 1818 + 042562 1310 41 02 2 353264644 01 1818 + 042563 1310 41 03 2 353264644 02 1818 + 042564 1310 41 04 2 353264644 03 1818 + 042565 1310 41 05 2 353264644 04 1818 + 042566 1310 41 06 2 353264644 05 1818 + 042567 1310 41 07 2 353264644 06 1818 + 042568 1310 41 08 2 353264644 07 1818 + 042569 1310 42 01 2 353264644 08 1818 + 042570 1310 42 02 2 353264644 09 1818 + 042571 1310 42 03 2 353264644 10 1818 + 042572 1310 42 04 2 353264644 11 1818 + 042573 1310 42 05 2 353264644 12 1818 + 042574 1310 42 06 2 353264644 13 1818 + 042575 1310 42 07 2 353264644 14 1818 + 042576 1310 42 08 2 353264644 15 1818 + 042577 1310 43 01 2 353265668 00 1819 + 042578 1310 43 02 2 353265668 01 1819 + 042579 1310 43 03 2 353265668 02 1819 + 042580 1310 43 04 2 353265668 03 1819 + 042581 1310 43 05 2 353265668 04 1819 + 042582 1310 43 06 2 353265668 05 1819 + 042583 1310 43 07 2 353265668 06 1819 + 042584 1310 43 08 2 353265668 07 1819 + 042585 1310 44 01 2 353265668 08 1819 + 042586 1310 44 02 2 353265668 09 1819 + 042587 1310 44 03 2 353265668 10 1819 + 042588 1310 44 04 2 353265668 11 1819 + 042589 1310 44 05 2 353265668 12 1819 + 042590 1310 44 06 2 353265668 13 1819 + 042591 1310 44 07 2 353265668 14 1819 + 042592 1310 44 08 2 353265668 15 1819 + 042593 1310 45 01 2 353268740 00 1820 + 042594 1310 45 02 2 353268740 01 1820 + 042595 1310 45 03 2 353268740 02 1820 + 042596 1310 45 04 2 353268740 03 1820 + 042597 1310 45 05 2 353268740 04 1820 + 042598 1310 45 06 2 353268740 05 1820 + 042599 1310 45 07 2 353268740 06 1820 + 042600 1310 45 08 2 353268740 07 1820 + 042601 1310 46 01 2 353268740 08 1820 + 042602 1310 46 02 2 353268740 09 1820 + 042603 1310 46 03 2 353268740 10 1820 + 042604 1310 46 04 2 353268740 11 1820 + 042605 1310 46 05 2 353268740 12 1820 + 042606 1310 46 06 2 353268740 13 1820 + 042607 1310 46 07 2 353268740 14 1820 + 042608 1310 46 08 2 353268740 15 1820 + 042609 1310 47 01 2 353269764 00 1821 + 042610 1310 47 02 2 353269764 01 1821 + 042611 1310 47 03 2 353269764 02 1821 + 042612 1310 47 04 2 353269764 03 1821 + 042613 1310 47 05 2 353269764 04 1821 + 042614 1310 47 06 2 353269764 05 1821 + 042615 1310 47 07 2 353269764 06 1821 + 042616 1310 47 08 2 353269764 07 1821 + 042617 1310 48 01 2 353269764 08 1821 + 042618 1310 48 02 2 353269764 09 1821 + 042619 1310 48 03 2 353269764 10 1821 + 042620 1310 48 04 2 353269764 11 1821 + 042621 1310 48 05 2 353269764 12 1821 + 042622 1310 48 06 2 353269764 13 1821 + 042623 1310 48 07 2 353269764 14 1821 + 042624 1310 48 08 2 353269764 15 1821 + 042625 1311 01 01 2 352629764 00 1540 + 042626 1311 01 02 2 352629764 01 1540 + 042627 1311 01 03 2 352629764 02 1540 + 042628 1311 01 04 2 352629764 03 1540 + 042629 1311 01 05 2 352629764 04 1540 + 042630 1311 01 06 2 352629764 05 1540 + 042631 1311 01 07 2 352629764 06 1540 + 042632 1311 01 08 2 352629764 07 1540 + 042633 1311 02 01 2 352629764 08 1540 + 042634 1311 02 02 2 352629764 09 1540 + 042635 1311 02 03 2 352629764 10 1540 + 042636 1311 02 04 2 352629764 11 1540 + 042637 1311 02 05 2 352629764 12 1540 + 042638 1311 02 06 2 352629764 13 1540 + 042639 1311 02 07 2 352629764 14 1540 + 042640 1311 02 08 2 352629764 15 1540 + 042641 1311 03 01 2 352630788 00 1541 + 042642 1311 03 02 2 352630788 01 1541 + 042643 1311 03 03 2 352630788 02 1541 + 042644 1311 03 04 2 352630788 03 1541 + 042645 1311 03 05 2 352630788 04 1541 + 042646 1311 03 06 2 352630788 05 1541 + 042647 1311 03 07 2 352630788 06 1541 + 042648 1311 03 08 2 352630788 07 1541 + 042649 1311 04 01 2 352630788 08 1541 + 042650 1311 04 02 2 352630788 09 1541 + 042651 1311 04 03 2 352630788 10 1541 + 042652 1311 04 04 2 352630788 11 1541 + 042653 1311 04 05 2 352630788 12 1541 + 042654 1311 04 06 2 352630788 13 1541 + 042655 1311 04 07 2 352630788 14 1541 + 042656 1311 04 08 2 352630788 15 1541 + 042657 1311 05 01 2 352748548 00 1598 + 042658 1311 05 02 2 352748548 01 1598 + 042659 1311 05 03 2 352748548 02 1598 + 042660 1311 05 04 2 352748548 03 1598 + 042661 1311 05 05 2 352748548 04 1598 + 042662 1311 05 06 2 352748548 05 1598 + 042663 1311 05 07 2 352748548 06 1598 + 042664 1311 05 08 2 352748548 07 1598 + 042665 1311 06 01 2 352748548 08 1598 + 042666 1311 06 02 2 352748548 09 1598 + 042667 1311 06 03 2 352748548 10 1598 + 042668 1311 06 04 2 352748548 11 1598 + 042669 1311 06 05 2 352748548 12 1598 + 042670 1311 06 06 2 352748548 13 1598 + 042671 1311 06 07 2 352748548 14 1598 + 042672 1311 06 08 2 352748548 15 1598 + 042673 1311 07 01 2 352749572 00 1599 + 042674 1311 07 02 2 352749572 01 1599 + 042675 1311 07 03 2 352749572 02 1599 + 042676 1311 07 04 2 352749572 03 1599 + 042677 1311 07 05 2 352749572 04 1599 + 042678 1311 07 06 2 352749572 05 1599 + 042679 1311 07 07 2 352749572 06 1599 + 042680 1311 07 08 2 352749572 07 1599 + 042681 1311 08 01 2 352749572 08 1599 + 042682 1311 08 02 2 352749572 09 1599 + 042683 1311 08 03 2 352749572 10 1599 + 042684 1311 08 04 2 352749572 11 1599 + 042685 1311 08 05 2 352749572 12 1599 + 042686 1311 08 06 2 352749572 13 1599 + 042687 1311 08 07 2 352749572 14 1599 + 042688 1311 08 08 2 352749572 15 1599 + 042689 1311 09 01 2 352891908 00 1652 + 042690 1311 09 02 2 352891908 01 1652 + 042691 1311 09 03 2 352891908 02 1652 + 042692 1311 09 04 2 352891908 03 1652 + 042693 1311 09 05 2 352891908 04 1652 + 042694 1311 09 06 2 352891908 05 1652 + 042695 1311 09 07 2 352891908 06 1652 + 042696 1311 09 08 2 352891908 07 1652 + 042697 1311 10 01 2 352891908 08 1652 + 042698 1311 10 02 2 352891908 09 1652 + 042699 1311 10 03 2 352891908 10 1652 + 042700 1311 10 04 2 352891908 11 1652 + 042701 1311 10 05 2 352891908 12 1652 + 042702 1311 10 06 2 352891908 13 1652 + 042703 1311 10 07 2 352891908 14 1652 + 042704 1311 10 08 2 352891908 15 1652 + 042705 1311 11 01 2 352892932 00 1653 + 042706 1311 11 02 2 352892932 01 1653 + 042707 1311 11 03 2 352892932 02 1653 + 042708 1311 11 04 2 352892932 03 1653 + 042709 1311 11 05 2 352892932 04 1653 + 042710 1311 11 06 2 352892932 05 1653 + 042711 1311 11 07 2 352892932 06 1653 + 042712 1311 11 08 2 352892932 07 1653 + 042713 1311 12 01 2 352892932 08 1653 + 042714 1311 12 02 2 352892932 09 1653 + 042715 1311 12 03 2 352892932 10 1653 + 042716 1311 12 04 2 352892932 11 1653 + 042717 1311 12 05 2 352892932 12 1653 + 042718 1311 12 06 2 352892932 13 1653 + 042719 1311 12 07 2 352892932 14 1653 + 042720 1311 12 08 2 352892932 15 1653 + 042721 1311 13 01 2 353010692 00 1710 + 042722 1311 13 02 2 353010692 01 1710 + 042723 1311 13 03 2 353010692 02 1710 + 042724 1311 13 04 2 353010692 03 1710 + 042725 1311 13 05 2 353010692 04 1710 + 042726 1311 13 06 2 353010692 05 1710 + 042727 1311 13 07 2 353010692 06 1710 + 042728 1311 13 08 2 353010692 07 1710 + 042729 1311 14 01 2 353010692 08 1710 + 042730 1311 14 02 2 353010692 09 1710 + 042731 1311 14 03 2 353010692 10 1710 + 042732 1311 14 04 2 353010692 11 1710 + 042733 1311 14 05 2 353010692 12 1710 + 042734 1311 14 06 2 353010692 13 1710 + 042735 1311 14 07 2 353010692 14 1710 + 042736 1311 14 08 2 353010692 15 1710 + 042737 1311 15 01 2 353011716 00 1711 + 042738 1311 15 02 2 353011716 01 1711 + 042739 1311 15 03 2 353011716 02 1711 + 042740 1311 15 04 2 353011716 03 1711 + 042741 1311 15 05 2 353011716 04 1711 + 042742 1311 15 06 2 353011716 05 1711 + 042743 1311 15 07 2 353011716 06 1711 + 042744 1311 15 08 2 353011716 07 1711 + 042745 1311 16 01 2 353011716 08 1711 + 042746 1311 16 02 2 353011716 09 1711 + 042747 1311 16 03 2 353011716 10 1711 + 042748 1311 16 04 2 353011716 11 1711 + 042749 1311 16 05 2 353011716 12 1711 + 042750 1311 16 06 2 353011716 13 1711 + 042751 1311 16 07 2 353011716 14 1711 + 042752 1311 16 08 2 353011716 15 1711 + 042753 1311 17 01 2 353154052 00 1764 + 042754 1311 17 02 2 353154052 01 1764 + 042755 1311 17 03 2 353154052 02 1764 + 042756 1311 17 04 2 353154052 03 1764 + 042757 1311 17 05 2 353154052 04 1764 + 042758 1311 17 06 2 353154052 05 1764 + 042759 1311 17 07 2 353154052 06 1764 + 042760 1311 17 08 2 353154052 07 1764 + 042761 1311 18 01 2 353154052 08 1764 + 042762 1311 18 02 2 353154052 09 1764 + 042763 1311 18 03 2 353154052 10 1764 + 042764 1311 18 04 2 353154052 11 1764 + 042765 1311 18 05 2 353154052 12 1764 + 042766 1311 18 06 2 353154052 13 1764 + 042767 1311 18 07 2 353154052 14 1764 + 042768 1311 18 08 2 353154052 15 1764 + 042769 1311 19 01 2 353155076 00 1765 + 042770 1311 19 02 2 353155076 01 1765 + 042771 1311 19 03 2 353155076 02 1765 + 042772 1311 19 04 2 353155076 03 1765 + 042773 1311 19 05 2 353155076 04 1765 + 042774 1311 19 06 2 353155076 05 1765 + 042775 1311 19 07 2 353155076 06 1765 + 042776 1311 19 08 2 353155076 07 1765 + 042777 1311 20 01 2 353155076 08 1765 + 042778 1311 20 02 2 353155076 09 1765 + 042779 1311 20 03 2 353155076 10 1765 + 042780 1311 20 04 2 353155076 11 1765 + 042781 1311 20 05 2 353155076 12 1765 + 042782 1311 20 06 2 353155076 13 1765 + 042783 1311 20 07 2 353155076 14 1765 + 042784 1311 20 08 2 353155076 15 1765 + 042785 1311 21 01 2 353272836 00 1822 + 042786 1311 21 02 2 353272836 01 1822 + 042787 1311 21 03 2 353272836 02 1822 + 042788 1311 21 04 2 353272836 03 1822 + 042789 1311 21 05 2 353272836 04 1822 + 042790 1311 21 06 2 353272836 05 1822 + 042791 1311 21 07 2 353272836 06 1822 + 042792 1311 21 08 2 353272836 07 1822 + 042793 1311 22 01 2 353272836 08 1822 + 042794 1311 22 02 2 353272836 09 1822 + 042795 1311 22 03 2 353272836 10 1822 + 042796 1311 22 04 2 353272836 11 1822 + 042797 1311 22 05 2 353272836 12 1822 + 042798 1311 22 06 2 353272836 13 1822 + 042799 1311 22 07 2 353272836 14 1822 + 042800 1311 22 08 2 353272836 15 1822 + 042801 1311 23 01 2 353273860 00 1823 + 042802 1311 23 02 2 353273860 01 1823 + 042803 1311 23 03 2 353273860 02 1823 + 042804 1311 23 04 2 353273860 03 1823 + 042805 1311 23 05 2 353273860 04 1823 + 042806 1311 23 06 2 353273860 05 1823 + 042807 1311 23 07 2 353273860 06 1823 + 042808 1311 23 08 2 353273860 07 1823 + 042809 1311 24 01 2 353273860 08 1823 + 042810 1311 24 02 2 353273860 09 1823 + 042811 1311 24 03 2 353273860 10 1823 + 042812 1311 24 04 2 353273860 11 1823 + 042813 1311 24 05 2 353273860 12 1823 + 042814 1311 24 06 2 353273860 13 1823 + 042815 1311 24 07 2 353273860 14 1823 + 042816 1311 24 08 2 353273860 15 1823 + 042817 1311 25 01 2 352752644 00 1600 + 042818 1311 25 02 2 352752644 01 1600 + 042819 1311 25 03 2 352752644 02 1600 + 042820 1311 25 04 2 352752644 03 1600 + 042821 1311 25 05 2 352752644 04 1600 + 042822 1311 25 06 2 352752644 05 1600 + 042823 1311 25 07 2 352752644 06 1600 + 042824 1311 25 08 2 352752644 07 1600 + 042825 1311 26 01 2 352752644 08 1600 + 042826 1311 26 02 2 352752644 09 1600 + 042827 1311 26 03 2 352752644 10 1600 + 042828 1311 26 04 2 352752644 11 1600 + 042829 1311 26 05 2 352752644 12 1600 + 042830 1311 26 06 2 352752644 13 1600 + 042831 1311 26 07 2 352752644 14 1600 + 042832 1311 26 08 2 352752644 15 1600 + 042833 1311 27 01 2 352753668 00 1601 + 042834 1311 27 02 2 352753668 01 1601 + 042835 1311 27 03 2 352753668 02 1601 + 042836 1311 27 04 2 352753668 03 1601 + 042837 1311 27 05 2 352753668 04 1601 + 042838 1311 27 06 2 352753668 05 1601 + 042839 1311 27 07 2 352753668 06 1601 + 042840 1311 27 08 2 352753668 07 1601 + 042841 1311 28 01 2 352753668 08 1601 + 042842 1311 28 02 2 352753668 09 1601 + 042843 1311 28 03 2 352753668 10 1601 + 042844 1311 28 04 2 352753668 11 1601 + 042845 1311 28 05 2 352753668 12 1601 + 042846 1311 28 06 2 352753668 13 1601 + 042847 1311 28 07 2 352753668 14 1601 + 042848 1311 28 08 2 352753668 15 1601 + 042849 1311 29 01 2 352633860 00 1542 + 042850 1311 29 02 2 352633860 01 1542 + 042851 1311 29 03 2 352633860 02 1542 + 042852 1311 29 04 2 352633860 03 1542 + 042853 1311 29 05 2 352633860 04 1542 + 042854 1311 29 06 2 352633860 05 1542 + 042855 1311 29 07 2 352633860 06 1542 + 042856 1311 29 08 2 352633860 07 1542 + 042857 1311 30 01 2 352633860 08 1542 + 042858 1311 30 02 2 352633860 09 1542 + 042859 1311 30 03 2 352633860 10 1542 + 042860 1311 30 04 2 352633860 11 1542 + 042861 1311 30 05 2 352633860 12 1542 + 042862 1311 30 06 2 352633860 13 1542 + 042863 1311 30 07 2 352633860 14 1542 + 042864 1311 30 08 2 352633860 15 1542 + 042865 1311 31 01 2 352634884 00 1543 + 042866 1311 31 02 2 352634884 01 1543 + 042867 1311 31 03 2 352634884 02 1543 + 042868 1311 31 04 2 352634884 03 1543 + 042869 1311 31 05 2 352634884 04 1543 + 042870 1311 31 06 2 352634884 05 1543 + 042871 1311 31 07 2 352634884 06 1543 + 042872 1311 31 08 2 352634884 07 1543 + 042873 1311 32 01 2 352634884 08 1543 + 042874 1311 32 02 2 352634884 09 1543 + 042875 1311 32 03 2 352634884 10 1543 + 042876 1311 32 04 2 352634884 11 1543 + 042877 1311 32 05 2 352634884 12 1543 + 042878 1311 32 06 2 352634884 13 1543 + 042879 1311 32 07 2 352634884 14 1543 + 042880 1311 32 08 2 352634884 15 1543 + 042881 1311 33 01 2 353014788 00 1712 + 042882 1311 33 02 2 353014788 01 1712 + 042883 1311 33 03 2 353014788 02 1712 + 042884 1311 33 04 2 353014788 03 1712 + 042885 1311 33 05 2 353014788 04 1712 + 042886 1311 33 06 2 353014788 05 1712 + 042887 1311 33 07 2 353014788 06 1712 + 042888 1311 33 08 2 353014788 07 1712 + 042889 1311 34 01 2 353014788 08 1712 + 042890 1311 34 02 2 353014788 09 1712 + 042891 1311 34 03 2 353014788 10 1712 + 042892 1311 34 04 2 353014788 11 1712 + 042893 1311 34 05 2 353014788 12 1712 + 042894 1311 34 06 2 353014788 13 1712 + 042895 1311 34 07 2 353014788 14 1712 + 042896 1311 34 08 2 353014788 15 1712 + 042897 1311 35 01 2 353015812 00 1713 + 042898 1311 35 02 2 353015812 01 1713 + 042899 1311 35 03 2 353015812 02 1713 + 042900 1311 35 04 2 353015812 03 1713 + 042901 1311 35 05 2 353015812 04 1713 + 042902 1311 35 06 2 353015812 05 1713 + 042903 1311 35 07 2 353015812 06 1713 + 042904 1311 35 08 2 353015812 07 1713 + 042905 1311 36 01 2 353015812 08 1713 + 042906 1311 36 02 2 353015812 09 1713 + 042907 1311 36 03 2 353015812 10 1713 + 042908 1311 36 04 2 353015812 11 1713 + 042909 1311 36 05 2 353015812 12 1713 + 042910 1311 36 06 2 353015812 13 1713 + 042911 1311 36 07 2 353015812 14 1713 + 042912 1311 36 08 2 353015812 15 1713 + 042913 1311 37 01 2 352896004 00 1654 + 042914 1311 37 02 2 352896004 01 1654 + 042915 1311 37 03 2 352896004 02 1654 + 042916 1311 37 04 2 352896004 03 1654 + 042917 1311 37 05 2 352896004 04 1654 + 042918 1311 37 06 2 352896004 05 1654 + 042919 1311 37 07 2 352896004 06 1654 + 042920 1311 37 08 2 352896004 07 1654 + 042921 1311 38 01 2 352896004 08 1654 + 042922 1311 38 02 2 352896004 09 1654 + 042923 1311 38 03 2 352896004 10 1654 + 042924 1311 38 04 2 352896004 11 1654 + 042925 1311 38 05 2 352896004 12 1654 + 042926 1311 38 06 2 352896004 13 1654 + 042927 1311 38 07 2 352896004 14 1654 + 042928 1311 38 08 2 352896004 15 1654 + 042929 1311 39 01 2 352897028 00 1655 + 042930 1311 39 02 2 352897028 01 1655 + 042931 1311 39 03 2 352897028 02 1655 + 042932 1311 39 04 2 352897028 03 1655 + 042933 1311 39 05 2 352897028 04 1655 + 042934 1311 39 06 2 352897028 05 1655 + 042935 1311 39 07 2 352897028 06 1655 + 042936 1311 39 08 2 352897028 07 1655 + 042937 1311 40 01 2 352897028 08 1655 + 042938 1311 40 02 2 352897028 09 1655 + 042939 1311 40 03 2 352897028 10 1655 + 042940 1311 40 04 2 352897028 11 1655 + 042941 1311 40 05 2 352897028 12 1655 + 042942 1311 40 06 2 352897028 13 1655 + 042943 1311 40 07 2 352897028 14 1655 + 042944 1311 40 08 2 352897028 15 1655 + 042945 1311 41 01 2 353276932 00 1824 + 042946 1311 41 02 2 353276932 01 1824 + 042947 1311 41 03 2 353276932 02 1824 + 042948 1311 41 04 2 353276932 03 1824 + 042949 1311 41 05 2 353276932 04 1824 + 042950 1311 41 06 2 353276932 05 1824 + 042951 1311 41 07 2 353276932 06 1824 + 042952 1311 41 08 2 353276932 07 1824 + 042953 1311 42 01 2 353276932 08 1824 + 042954 1311 42 02 2 353276932 09 1824 + 042955 1311 42 03 2 353276932 10 1824 + 042956 1311 42 04 2 353276932 11 1824 + 042957 1311 42 05 2 353276932 12 1824 + 042958 1311 42 06 2 353276932 13 1824 + 042959 1311 42 07 2 353276932 14 1824 + 042960 1311 42 08 2 353276932 15 1824 + 042961 1311 43 01 2 353277956 00 1825 + 042962 1311 43 02 2 353277956 01 1825 + 042963 1311 43 03 2 353277956 02 1825 + 042964 1311 43 04 2 353277956 03 1825 + 042965 1311 43 05 2 353277956 04 1825 + 042966 1311 43 06 2 353277956 05 1825 + 042967 1311 43 07 2 353277956 06 1825 + 042968 1311 43 08 2 353277956 07 1825 + 042969 1311 44 01 2 353277956 08 1825 + 042970 1311 44 02 2 353277956 09 1825 + 042971 1311 44 03 2 353277956 10 1825 + 042972 1311 44 04 2 353277956 11 1825 + 042973 1311 44 05 2 353277956 12 1825 + 042974 1311 44 06 2 353277956 13 1825 + 042975 1311 44 07 2 353277956 14 1825 + 042976 1311 44 08 2 353277956 15 1825 + 042977 1311 45 01 2 353158148 00 1766 + 042978 1311 45 02 2 353158148 01 1766 + 042979 1311 45 03 2 353158148 02 1766 + 042980 1311 45 04 2 353158148 03 1766 + 042981 1311 45 05 2 353158148 04 1766 + 042982 1311 45 06 2 353158148 05 1766 + 042983 1311 45 07 2 353158148 06 1766 + 042984 1311 45 08 2 353158148 07 1766 + 042985 1311 46 01 2 353158148 08 1766 + 042986 1311 46 02 2 353158148 09 1766 + 042987 1311 46 03 2 353158148 10 1766 + 042988 1311 46 04 2 353158148 11 1766 + 042989 1311 46 05 2 353158148 12 1766 + 042990 1311 46 06 2 353158148 13 1766 + 042991 1311 46 07 2 353158148 14 1766 + 042992 1311 46 08 2 353158148 15 1766 + 042993 1311 47 01 2 353159172 00 1767 + 042994 1311 47 02 2 353159172 01 1767 + 042995 1311 47 03 2 353159172 02 1767 + 042996 1311 47 04 2 353159172 03 1767 + 042997 1311 47 05 2 353159172 04 1767 + 042998 1311 47 06 2 353159172 05 1767 + 042999 1311 47 07 2 353159172 06 1767 + 043000 1311 47 08 2 353159172 07 1767 + 043001 1311 48 01 2 353159172 08 1767 + 043002 1311 48 02 2 353159172 09 1767 + 043003 1311 48 03 2 353159172 10 1767 + 043004 1311 48 04 2 353159172 11 1767 + 043005 1311 48 05 2 353159172 12 1767 + 043006 1311 48 06 2 353159172 13 1767 + 043007 1311 48 07 2 353159172 14 1767 + 043008 1311 48 08 2 353159172 15 1767 + 043009 1312 01 01 2 352756740 00 1602 + 043010 1312 01 02 2 352756740 01 1602 + 043011 1312 01 03 2 352756740 02 1602 + 043012 1312 01 04 2 352756740 03 1602 + 043013 1312 01 05 2 352756740 04 1602 + 043014 1312 01 06 2 352756740 05 1602 + 043015 1312 01 07 2 352756740 06 1602 + 043016 1312 01 08 2 352756740 07 1602 + 043017 1312 02 01 2 352756740 08 1602 + 043018 1312 02 02 2 352756740 09 1602 + 043019 1312 02 03 2 352756740 10 1602 + 043020 1312 02 04 2 352756740 11 1602 + 043021 1312 02 05 2 352756740 12 1602 + 043022 1312 02 06 2 352756740 13 1602 + 043023 1312 02 07 2 352756740 14 1602 + 043024 1312 02 08 2 352756740 15 1602 + 043025 1312 03 01 2 352757764 00 1603 + 043026 1312 03 02 2 352757764 01 1603 + 043027 1312 03 03 2 352757764 02 1603 + 043028 1312 03 04 2 352757764 03 1603 + 043029 1312 03 05 2 352757764 04 1603 + 043030 1312 03 06 2 352757764 05 1603 + 043031 1312 03 07 2 352757764 06 1603 + 043032 1312 03 08 2 352757764 07 1603 + 043033 1312 04 01 2 352757764 08 1603 + 043034 1312 04 02 2 352757764 09 1603 + 043035 1312 04 03 2 352757764 10 1603 + 043036 1312 04 04 2 352757764 11 1603 + 043037 1312 04 05 2 352757764 12 1603 + 043038 1312 04 06 2 352757764 13 1603 + 043039 1312 04 07 2 352757764 14 1603 + 043040 1312 04 08 2 352757764 15 1603 + 043041 1312 05 01 2 352637956 00 1544 + 043042 1312 05 02 2 352637956 01 1544 + 043043 1312 05 03 2 352637956 02 1544 + 043044 1312 05 04 2 352637956 03 1544 + 043045 1312 05 05 2 352637956 04 1544 + 043046 1312 05 06 2 352637956 05 1544 + 043047 1312 05 07 2 352637956 06 1544 + 043048 1312 05 08 2 352637956 07 1544 + 043049 1312 06 01 2 352637956 08 1544 + 043050 1312 06 02 2 352637956 09 1544 + 043051 1312 06 03 2 352637956 10 1544 + 043052 1312 06 04 2 352637956 11 1544 + 043053 1312 06 05 2 352637956 12 1544 + 043054 1312 06 06 2 352637956 13 1544 + 043055 1312 06 07 2 352637956 14 1544 + 043056 1312 06 08 2 352637956 15 1544 + 043057 1312 07 01 2 352638980 00 1545 + 043058 1312 07 02 2 352638980 01 1545 + 043059 1312 07 03 2 352638980 02 1545 + 043060 1312 07 04 2 352638980 03 1545 + 043061 1312 07 05 2 352638980 04 1545 + 043062 1312 07 06 2 352638980 05 1545 + 043063 1312 07 07 2 352638980 06 1545 + 043064 1312 07 08 2 352638980 07 1545 + 043065 1312 08 01 2 352638980 08 1545 + 043066 1312 08 02 2 352638980 09 1545 + 043067 1312 08 03 2 352638980 10 1545 + 043068 1312 08 04 2 352638980 11 1545 + 043069 1312 08 05 2 352638980 12 1545 + 043070 1312 08 06 2 352638980 13 1545 + 043071 1312 08 07 2 352638980 14 1545 + 043072 1312 08 08 2 352638980 15 1545 + 043073 1312 09 01 2 353018884 00 1714 + 043074 1312 09 02 2 353018884 01 1714 + 043075 1312 09 03 2 353018884 02 1714 + 043076 1312 09 04 2 353018884 03 1714 + 043077 1312 09 05 2 353018884 04 1714 + 043078 1312 09 06 2 353018884 05 1714 + 043079 1312 09 07 2 353018884 06 1714 + 043080 1312 09 08 2 353018884 07 1714 + 043081 1312 10 01 2 353018884 08 1714 + 043082 1312 10 02 2 353018884 09 1714 + 043083 1312 10 03 2 353018884 10 1714 + 043084 1312 10 04 2 353018884 11 1714 + 043085 1312 10 05 2 353018884 12 1714 + 043086 1312 10 06 2 353018884 13 1714 + 043087 1312 10 07 2 353018884 14 1714 + 043088 1312 10 08 2 353018884 15 1714 + 043089 1312 11 01 2 353019908 00 1715 + 043090 1312 11 02 2 353019908 01 1715 + 043091 1312 11 03 2 353019908 02 1715 + 043092 1312 11 04 2 353019908 03 1715 + 043093 1312 11 05 2 353019908 04 1715 + 043094 1312 11 06 2 353019908 05 1715 + 043095 1312 11 07 2 353019908 06 1715 + 043096 1312 11 08 2 353019908 07 1715 + 043097 1312 12 01 2 353019908 08 1715 + 043098 1312 12 02 2 353019908 09 1715 + 043099 1312 12 03 2 353019908 10 1715 + 043100 1312 12 04 2 353019908 11 1715 + 043101 1312 12 05 2 353019908 12 1715 + 043102 1312 12 06 2 353019908 13 1715 + 043103 1312 12 07 2 353019908 14 1715 + 043104 1312 12 08 2 353019908 15 1715 + 043105 1312 13 01 2 352900100 00 1656 + 043106 1312 13 02 2 352900100 01 1656 + 043107 1312 13 03 2 352900100 02 1656 + 043108 1312 13 04 2 352900100 03 1656 + 043109 1312 13 05 2 352900100 04 1656 + 043110 1312 13 06 2 352900100 05 1656 + 043111 1312 13 07 2 352900100 06 1656 + 043112 1312 13 08 2 352900100 07 1656 + 043113 1312 14 01 2 352900100 08 1656 + 043114 1312 14 02 2 352900100 09 1656 + 043115 1312 14 03 2 352900100 10 1656 + 043116 1312 14 04 2 352900100 11 1656 + 043117 1312 14 05 2 352900100 12 1656 + 043118 1312 14 06 2 352900100 13 1656 + 043119 1312 14 07 2 352900100 14 1656 + 043120 1312 14 08 2 352900100 15 1656 + 043121 1312 15 01 2 352901124 00 1657 + 043122 1312 15 02 2 352901124 01 1657 + 043123 1312 15 03 2 352901124 02 1657 + 043124 1312 15 04 2 352901124 03 1657 + 043125 1312 15 05 2 352901124 04 1657 + 043126 1312 15 06 2 352901124 05 1657 + 043127 1312 15 07 2 352901124 06 1657 + 043128 1312 15 08 2 352901124 07 1657 + 043129 1312 16 01 2 352901124 08 1657 + 043130 1312 16 02 2 352901124 09 1657 + 043131 1312 16 03 2 352901124 10 1657 + 043132 1312 16 04 2 352901124 11 1657 + 043133 1312 16 05 2 352901124 12 1657 + 043134 1312 16 06 2 352901124 13 1657 + 043135 1312 16 07 2 352901124 14 1657 + 043136 1312 16 08 2 352901124 15 1657 + 043137 1312 17 01 2 353281028 00 1826 + 043138 1312 17 02 2 353281028 01 1826 + 043139 1312 17 03 2 353281028 02 1826 + 043140 1312 17 04 2 353281028 03 1826 + 043141 1312 17 05 2 353281028 04 1826 + 043142 1312 17 06 2 353281028 05 1826 + 043143 1312 17 07 2 353281028 06 1826 + 043144 1312 17 08 2 353281028 07 1826 + 043145 1312 18 01 2 353281028 08 1826 + 043146 1312 18 02 2 353281028 09 1826 + 043147 1312 18 03 2 353281028 10 1826 + 043148 1312 18 04 2 353281028 11 1826 + 043149 1312 18 05 2 353281028 12 1826 + 043150 1312 18 06 2 353281028 13 1826 + 043151 1312 18 07 2 353281028 14 1826 + 043152 1312 18 08 2 353281028 15 1826 + 043153 1312 19 01 2 353282052 00 1827 + 043154 1312 19 02 2 353282052 01 1827 + 043155 1312 19 03 2 353282052 02 1827 + 043156 1312 19 04 2 353282052 03 1827 + 043157 1312 19 05 2 353282052 04 1827 + 043158 1312 19 06 2 353282052 05 1827 + 043159 1312 19 07 2 353282052 06 1827 + 043160 1312 19 08 2 353282052 07 1827 + 043161 1312 20 01 2 353282052 08 1827 + 043162 1312 20 02 2 353282052 09 1827 + 043163 1312 20 03 2 353282052 10 1827 + 043164 1312 20 04 2 353282052 11 1827 + 043165 1312 20 05 2 353282052 12 1827 + 043166 1312 20 06 2 353282052 13 1827 + 043167 1312 20 07 2 353282052 14 1827 + 043168 1312 20 08 2 353282052 15 1827 + 043169 1312 21 01 2 353162244 00 1768 + 043170 1312 21 02 2 353162244 01 1768 + 043171 1312 21 03 2 353162244 02 1768 + 043172 1312 21 04 2 353162244 03 1768 + 043173 1312 21 05 2 353162244 04 1768 + 043174 1312 21 06 2 353162244 05 1768 + 043175 1312 21 07 2 353162244 06 1768 + 043176 1312 21 08 2 353162244 07 1768 + 043177 1312 22 01 2 353162244 08 1768 + 043178 1312 22 02 2 353162244 09 1768 + 043179 1312 22 03 2 353162244 10 1768 + 043180 1312 22 04 2 353162244 11 1768 + 043181 1312 22 05 2 353162244 12 1768 + 043182 1312 22 06 2 353162244 13 1768 + 043183 1312 22 07 2 353162244 14 1768 + 043184 1312 22 08 2 353162244 15 1768 + 043185 1312 23 01 2 353163268 00 1769 + 043186 1312 23 02 2 353163268 01 1769 + 043187 1312 23 03 2 353163268 02 1769 + 043188 1312 23 04 2 353163268 03 1769 + 043189 1312 23 05 2 353163268 04 1769 + 043190 1312 23 06 2 353163268 05 1769 + 043191 1312 23 07 2 353163268 06 1769 + 043192 1312 23 08 2 353163268 07 1769 + 043193 1312 24 01 2 353163268 08 1769 + 043194 1312 24 02 2 353163268 09 1769 + 043195 1312 24 03 2 353163268 10 1769 + 043196 1312 24 04 2 353163268 11 1769 + 043197 1312 24 05 2 353163268 12 1769 + 043198 1312 24 06 2 353163268 13 1769 + 043199 1312 24 07 2 353163268 14 1769 + 043200 1312 24 08 2 353163268 15 1769 + 043201 1312 25 01 2 352760836 00 1604 + 043202 1312 25 02 2 352760836 01 1604 + 043203 1312 25 03 2 352760836 02 1604 + 043204 1312 25 04 2 352760836 03 1604 + 043205 1312 25 05 2 352760836 04 1604 + 043206 1312 25 06 2 352760836 05 1604 + 043207 1312 25 07 2 352760836 06 1604 + 043208 1312 25 08 2 352760836 07 1604 + 043209 1312 26 01 2 352760836 08 1604 + 043210 1312 26 02 2 352760836 09 1604 + 043211 1312 26 03 2 352760836 10 1604 + 043212 1312 26 04 2 352760836 11 1604 + 043213 1312 26 05 2 352760836 12 1604 + 043214 1312 26 06 2 352760836 13 1604 + 043215 1312 26 07 2 352760836 14 1604 + 043216 1312 26 08 2 352760836 15 1604 + 043217 1312 27 01 2 352761860 00 1605 + 043218 1312 27 02 2 352761860 01 1605 + 043219 1312 27 03 2 352761860 02 1605 + 043220 1312 27 04 2 352761860 03 1605 + 043221 1312 27 05 2 352761860 04 1605 + 043222 1312 27 06 2 352761860 05 1605 + 043223 1312 27 07 2 352761860 06 1605 + 043224 1312 27 08 2 352761860 07 1605 + 043225 1312 28 01 2 352761860 08 1605 + 043226 1312 28 02 2 352761860 09 1605 + 043227 1312 28 03 2 352761860 10 1605 + 043228 1312 28 04 2 352761860 11 1605 + 043229 1312 28 05 2 352761860 12 1605 + 043230 1312 28 06 2 352761860 13 1605 + 043231 1312 28 07 2 352761860 14 1605 + 043232 1312 28 08 2 352761860 15 1605 + 043233 1312 29 01 2 352642052 00 1546 + 043234 1312 29 02 2 352642052 01 1546 + 043235 1312 29 03 2 352642052 02 1546 + 043236 1312 29 04 2 352642052 03 1546 + 043237 1312 29 05 2 352642052 04 1546 + 043238 1312 29 06 2 352642052 05 1546 + 043239 1312 29 07 2 352642052 06 1546 + 043240 1312 29 08 2 352642052 07 1546 + 043241 1312 30 01 2 352642052 08 1546 + 043242 1312 30 02 2 352642052 09 1546 + 043243 1312 30 03 2 352642052 10 1546 + 043244 1312 30 04 2 352642052 11 1546 + 043245 1312 30 05 2 352642052 12 1546 + 043246 1312 30 06 2 352642052 13 1546 + 043247 1312 30 07 2 352642052 14 1546 + 043248 1312 30 08 2 352642052 15 1546 + 043249 1312 31 01 2 352643076 00 1547 + 043250 1312 31 02 2 352643076 01 1547 + 043251 1312 31 03 2 352643076 02 1547 + 043252 1312 31 04 2 352643076 03 1547 + 043253 1312 31 05 2 352643076 04 1547 + 043254 1312 31 06 2 352643076 05 1547 + 043255 1312 31 07 2 352643076 06 1547 + 043256 1312 31 08 2 352643076 07 1547 + 043257 1312 32 01 2 352643076 08 1547 + 043258 1312 32 02 2 352643076 09 1547 + 043259 1312 32 03 2 352643076 10 1547 + 043260 1312 32 04 2 352643076 11 1547 + 043261 1312 32 05 2 352643076 12 1547 + 043262 1312 32 06 2 352643076 13 1547 + 043263 1312 32 07 2 352643076 14 1547 + 043264 1312 32 08 2 352643076 15 1547 + 043265 1312 33 01 2 353022980 00 1716 + 043266 1312 33 02 2 353022980 01 1716 + 043267 1312 33 03 2 353022980 02 1716 + 043268 1312 33 04 2 353022980 03 1716 + 043269 1312 33 05 2 353022980 04 1716 + 043270 1312 33 06 2 353022980 05 1716 + 043271 1312 33 07 2 353022980 06 1716 + 043272 1312 33 08 2 353022980 07 1716 + 043273 1312 34 01 2 353022980 08 1716 + 043274 1312 34 02 2 353022980 09 1716 + 043275 1312 34 03 2 353022980 10 1716 + 043276 1312 34 04 2 353022980 11 1716 + 043277 1312 34 05 2 353022980 12 1716 + 043278 1312 34 06 2 353022980 13 1716 + 043279 1312 34 07 2 353022980 14 1716 + 043280 1312 34 08 2 353022980 15 1716 + 043281 1312 35 01 2 353024004 00 1717 + 043282 1312 35 02 2 353024004 01 1717 + 043283 1312 35 03 2 353024004 02 1717 + 043284 1312 35 04 2 353024004 03 1717 + 043285 1312 35 05 2 353024004 04 1717 + 043286 1312 35 06 2 353024004 05 1717 + 043287 1312 35 07 2 353024004 06 1717 + 043288 1312 35 08 2 353024004 07 1717 + 043289 1312 36 01 2 353024004 08 1717 + 043290 1312 36 02 2 353024004 09 1717 + 043291 1312 36 03 2 353024004 10 1717 + 043292 1312 36 04 2 353024004 11 1717 + 043293 1312 36 05 2 353024004 12 1717 + 043294 1312 36 06 2 353024004 13 1717 + 043295 1312 36 07 2 353024004 14 1717 + 043296 1312 36 08 2 353024004 15 1717 + 043297 1312 37 01 2 352904196 00 1658 + 043298 1312 37 02 2 352904196 01 1658 + 043299 1312 37 03 2 352904196 02 1658 + 043300 1312 37 04 2 352904196 03 1658 + 043301 1312 37 05 2 352904196 04 1658 + 043302 1312 37 06 2 352904196 05 1658 + 043303 1312 37 07 2 352904196 06 1658 + 043304 1312 37 08 2 352904196 07 1658 + 043305 1312 38 01 2 352904196 08 1658 + 043306 1312 38 02 2 352904196 09 1658 + 043307 1312 38 03 2 352904196 10 1658 + 043308 1312 38 04 2 352904196 11 1658 + 043309 1312 38 05 2 352904196 12 1658 + 043310 1312 38 06 2 352904196 13 1658 + 043311 1312 38 07 2 352904196 14 1658 + 043312 1312 38 08 2 352904196 15 1658 + 043313 1312 39 01 2 352905220 00 1659 + 043314 1312 39 02 2 352905220 01 1659 + 043315 1312 39 03 2 352905220 02 1659 + 043316 1312 39 04 2 352905220 03 1659 + 043317 1312 39 05 2 352905220 04 1659 + 043318 1312 39 06 2 352905220 05 1659 + 043319 1312 39 07 2 352905220 06 1659 + 043320 1312 39 08 2 352905220 07 1659 + 043321 1312 40 01 2 352905220 08 1659 + 043322 1312 40 02 2 352905220 09 1659 + 043323 1312 40 03 2 352905220 10 1659 + 043324 1312 40 04 2 352905220 11 1659 + 043325 1312 40 05 2 352905220 12 1659 + 043326 1312 40 06 2 352905220 13 1659 + 043327 1312 40 07 2 352905220 14 1659 + 043328 1312 40 08 2 352905220 15 1659 + 043329 1312 41 01 2 353285124 00 1828 + 043330 1312 41 02 2 353285124 01 1828 + 043331 1312 41 03 2 353285124 02 1828 + 043332 1312 41 04 2 353285124 03 1828 + 043333 1312 41 05 2 353285124 04 1828 + 043334 1312 41 06 2 353285124 05 1828 + 043335 1312 41 07 2 353285124 06 1828 + 043336 1312 41 08 2 353285124 07 1828 + 043337 1312 42 01 2 353285124 08 1828 + 043338 1312 42 02 2 353285124 09 1828 + 043339 1312 42 03 2 353285124 10 1828 + 043340 1312 42 04 2 353285124 11 1828 + 043341 1312 42 05 2 353285124 12 1828 + 043342 1312 42 06 2 353285124 13 1828 + 043343 1312 42 07 2 353285124 14 1828 + 043344 1312 42 08 2 353285124 15 1828 + 043345 1312 43 01 2 353286148 00 1829 + 043346 1312 43 02 2 353286148 01 1829 + 043347 1312 43 03 2 353286148 02 1829 + 043348 1312 43 04 2 353286148 03 1829 + 043349 1312 43 05 2 353286148 04 1829 + 043350 1312 43 06 2 353286148 05 1829 + 043351 1312 43 07 2 353286148 06 1829 + 043352 1312 43 08 2 353286148 07 1829 + 043353 1312 44 01 2 353286148 08 1829 + 043354 1312 44 02 2 353286148 09 1829 + 043355 1312 44 03 2 353286148 10 1829 + 043356 1312 44 04 2 353286148 11 1829 + 043357 1312 44 05 2 353286148 12 1829 + 043358 1312 44 06 2 353286148 13 1829 + 043359 1312 44 07 2 353286148 14 1829 + 043360 1312 44 08 2 353286148 15 1829 + 043361 1312 45 01 2 353166340 00 1770 + 043362 1312 45 02 2 353166340 01 1770 + 043363 1312 45 03 2 353166340 02 1770 + 043364 1312 45 04 2 353166340 03 1770 + 043365 1312 45 05 2 353166340 04 1770 + 043366 1312 45 06 2 353166340 05 1770 + 043367 1312 45 07 2 353166340 06 1770 + 043368 1312 45 08 2 353166340 07 1770 + 043369 1312 46 01 2 353166340 08 1770 + 043370 1312 46 02 2 353166340 09 1770 + 043371 1312 46 03 2 353166340 10 1770 + 043372 1312 46 04 2 353166340 11 1770 + 043373 1312 46 05 2 353166340 12 1770 + 043374 1312 46 06 2 353166340 13 1770 + 043375 1312 46 07 2 353166340 14 1770 + 043376 1312 46 08 2 353166340 15 1770 + 043377 1312 47 01 2 353167364 00 1771 + 043378 1312 47 02 2 353167364 01 1771 + 043379 1312 47 03 2 353167364 02 1771 + 043380 1312 47 04 2 353167364 03 1771 + 043381 1312 47 05 2 353167364 04 1771 + 043382 1312 47 06 2 353167364 05 1771 + 043383 1312 47 07 2 353167364 06 1771 + 043384 1312 47 08 2 353167364 07 1771 + 043385 1312 48 01 2 353167364 08 1771 + 043386 1312 48 02 2 353167364 09 1771 + 043387 1312 48 03 2 353167364 10 1771 + 043388 1312 48 04 2 353167364 11 1771 + 043389 1312 48 05 2 353167364 12 1771 + 043390 1312 48 06 2 353167364 13 1771 + 043391 1312 48 07 2 353167364 14 1771 + 043392 1312 48 08 2 353167364 15 1771 + 043393 1313 01 01 2 352764932 00 1606 + 043394 1313 01 02 2 352764932 01 1606 + 043395 1313 01 03 2 352764932 02 1606 + 043396 1313 01 04 2 352764932 03 1606 + 043397 1313 01 05 2 352764932 04 1606 + 043398 1313 01 06 2 352764932 05 1606 + 043399 1313 01 07 2 352764932 06 1606 + 043400 1313 01 08 2 352764932 07 1606 + 043401 1313 02 01 2 352764932 08 1606 + 043402 1313 02 02 2 352764932 09 1606 + 043403 1313 02 03 2 352764932 10 1606 + 043404 1313 02 04 2 352764932 11 1606 + 043405 1313 02 05 2 352764932 12 1606 + 043406 1313 02 06 2 352764932 13 1606 + 043407 1313 02 07 2 352764932 14 1606 + 043408 1313 02 08 2 352764932 15 1606 + 043409 1313 03 01 2 352765956 00 1607 + 043410 1313 03 02 2 352765956 01 1607 + 043411 1313 03 03 2 352765956 02 1607 + 043412 1313 03 04 2 352765956 03 1607 + 043413 1313 03 05 2 352765956 04 1607 + 043414 1313 03 06 2 352765956 05 1607 + 043415 1313 03 07 2 352765956 06 1607 + 043416 1313 03 08 2 352765956 07 1607 + 043417 1313 04 01 2 352765956 08 1607 + 043418 1313 04 02 2 352765956 09 1607 + 043419 1313 04 03 2 352765956 10 1607 + 043420 1313 04 04 2 352765956 11 1607 + 043421 1313 04 05 2 352765956 12 1607 + 043422 1313 04 06 2 352765956 13 1607 + 043423 1313 04 07 2 352765956 14 1607 + 043424 1313 04 08 2 352765956 15 1607 + 043425 1313 05 01 2 352769028 00 1608 + 043426 1313 05 02 2 352769028 01 1608 + 043427 1313 05 03 2 352769028 02 1608 + 043428 1313 05 04 2 352769028 03 1608 + 043429 1313 05 05 2 352769028 04 1608 + 043430 1313 05 06 2 352769028 05 1608 + 043431 1313 05 07 2 352769028 06 1608 + 043432 1313 05 08 2 352769028 07 1608 + 043433 1313 06 01 2 352769028 08 1608 + 043434 1313 06 02 2 352769028 09 1608 + 043435 1313 06 03 2 352769028 10 1608 + 043436 1313 06 04 2 352769028 11 1608 + 043437 1313 06 05 2 352769028 12 1608 + 043438 1313 06 06 2 352769028 13 1608 + 043439 1313 06 07 2 352769028 14 1608 + 043440 1313 06 08 2 352769028 15 1608 + 043441 1313 07 01 2 352770052 00 1609 + 043442 1313 07 02 2 352770052 01 1609 + 043443 1313 07 03 2 352770052 02 1609 + 043444 1313 07 04 2 352770052 03 1609 + 043445 1313 07 05 2 352770052 04 1609 + 043446 1313 07 06 2 352770052 05 1609 + 043447 1313 07 07 2 352770052 06 1609 + 043448 1313 07 08 2 352770052 07 1609 + 043449 1313 08 01 2 352770052 08 1609 + 043450 1313 08 02 2 352770052 09 1609 + 043451 1313 08 03 2 352770052 10 1609 + 043452 1313 08 04 2 352770052 11 1609 + 043453 1313 08 05 2 352770052 12 1609 + 043454 1313 08 06 2 352770052 13 1609 + 043455 1313 08 07 2 352770052 14 1609 + 043456 1313 08 08 2 352770052 15 1609 + 043457 1313 09 01 2 353027076 00 1718 + 043458 1313 09 02 2 353027076 01 1718 + 043459 1313 09 03 2 353027076 02 1718 + 043460 1313 09 04 2 353027076 03 1718 + 043461 1313 09 05 2 353027076 04 1718 + 043462 1313 09 06 2 353027076 05 1718 + 043463 1313 09 07 2 353027076 06 1718 + 043464 1313 09 08 2 353027076 07 1718 + 043465 1313 10 01 2 353027076 08 1718 + 043466 1313 10 02 2 353027076 09 1718 + 043467 1313 10 03 2 353027076 10 1718 + 043468 1313 10 04 2 353027076 11 1718 + 043469 1313 10 05 2 353027076 12 1718 + 043470 1313 10 06 2 353027076 13 1718 + 043471 1313 10 07 2 353027076 14 1718 + 043472 1313 10 08 2 353027076 15 1718 + 043473 1313 11 01 2 353028100 00 1719 + 043474 1313 11 02 2 353028100 01 1719 + 043475 1313 11 03 2 353028100 02 1719 + 043476 1313 11 04 2 353028100 03 1719 + 043477 1313 11 05 2 353028100 04 1719 + 043478 1313 11 06 2 353028100 05 1719 + 043479 1313 11 07 2 353028100 06 1719 + 043480 1313 11 08 2 353028100 07 1719 + 043481 1313 12 01 2 353028100 08 1719 + 043482 1313 12 02 2 353028100 09 1719 + 043483 1313 12 03 2 353028100 10 1719 + 043484 1313 12 04 2 353028100 11 1719 + 043485 1313 12 05 2 353028100 12 1719 + 043486 1313 12 06 2 353028100 13 1719 + 043487 1313 12 07 2 353028100 14 1719 + 043488 1313 12 08 2 353028100 15 1719 + 043489 1313 13 01 2 353031172 00 1720 + 043490 1313 13 02 2 353031172 01 1720 + 043491 1313 13 03 2 353031172 02 1720 + 043492 1313 13 04 2 353031172 03 1720 + 043493 1313 13 05 2 353031172 04 1720 + 043494 1313 13 06 2 353031172 05 1720 + 043495 1313 13 07 2 353031172 06 1720 + 043496 1313 13 08 2 353031172 07 1720 + 043497 1313 14 01 2 353031172 08 1720 + 043498 1313 14 02 2 353031172 09 1720 + 043499 1313 14 03 2 353031172 10 1720 + 043500 1313 14 04 2 353031172 11 1720 + 043501 1313 14 05 2 353031172 12 1720 + 043502 1313 14 06 2 353031172 13 1720 + 043503 1313 14 07 2 353031172 14 1720 + 043504 1313 14 08 2 353031172 15 1720 + 043505 1313 15 01 2 353032196 00 1721 + 043506 1313 15 02 2 353032196 01 1721 + 043507 1313 15 03 2 353032196 02 1721 + 043508 1313 15 04 2 353032196 03 1721 + 043509 1313 15 05 2 353032196 04 1721 + 043510 1313 15 06 2 353032196 05 1721 + 043511 1313 15 07 2 353032196 06 1721 + 043512 1313 15 08 2 353032196 07 1721 + 043513 1313 16 01 2 353032196 08 1721 + 043514 1313 16 02 2 353032196 09 1721 + 043515 1313 16 03 2 353032196 10 1721 + 043516 1313 16 04 2 353032196 11 1721 + 043517 1313 16 05 2 353032196 12 1721 + 043518 1313 16 06 2 353032196 13 1721 + 043519 1313 16 07 2 353032196 14 1721 + 043520 1313 16 08 2 353032196 15 1721 + 043521 1313 17 01 2 353289220 00 1830 + 043522 1313 17 02 2 353289220 01 1830 + 043523 1313 17 03 2 353289220 02 1830 + 043524 1313 17 04 2 353289220 03 1830 + 043525 1313 17 05 2 353289220 04 1830 + 043526 1313 17 06 2 353289220 05 1830 + 043527 1313 17 07 2 353289220 06 1830 + 043528 1313 17 08 2 353289220 07 1830 + 043529 1313 18 01 2 353289220 08 1830 + 043530 1313 18 02 2 353289220 09 1830 + 043531 1313 18 03 2 353289220 10 1830 + 043532 1313 18 04 2 353289220 11 1830 + 043533 1313 18 05 2 353289220 12 1830 + 043534 1313 18 06 2 353289220 13 1830 + 043535 1313 18 07 2 353289220 14 1830 + 043536 1313 18 08 2 353289220 15 1830 + 043537 1313 19 01 2 353290244 00 1831 + 043538 1313 19 02 2 353290244 01 1831 + 043539 1313 19 03 2 353290244 02 1831 + 043540 1313 19 04 2 353290244 03 1831 + 043541 1313 19 05 2 353290244 04 1831 + 043542 1313 19 06 2 353290244 05 1831 + 043543 1313 19 07 2 353290244 06 1831 + 043544 1313 19 08 2 353290244 07 1831 + 043545 1313 20 01 2 353290244 08 1831 + 043546 1313 20 02 2 353290244 09 1831 + 043547 1313 20 03 2 353290244 10 1831 + 043548 1313 20 04 2 353290244 11 1831 + 043549 1313 20 05 2 353290244 12 1831 + 043550 1313 20 06 2 353290244 13 1831 + 043551 1313 20 07 2 353290244 14 1831 + 043552 1313 20 08 2 353290244 15 1831 + 043553 1313 21 01 2 353293316 00 1832 + 043554 1313 21 02 2 353293316 01 1832 + 043555 1313 21 03 2 353293316 02 1832 + 043556 1313 21 04 2 353293316 03 1832 + 043557 1313 21 05 2 353293316 04 1832 + 043558 1313 21 06 2 353293316 05 1832 + 043559 1313 21 07 2 353293316 06 1832 + 043560 1313 21 08 2 353293316 07 1832 + 043561 1313 22 01 2 353293316 08 1832 + 043562 1313 22 02 2 353293316 09 1832 + 043563 1313 22 03 2 353293316 10 1832 + 043564 1313 22 04 2 353293316 11 1832 + 043565 1313 22 05 2 353293316 12 1832 + 043566 1313 22 06 2 353293316 13 1832 + 043567 1313 22 07 2 353293316 14 1832 + 043568 1313 22 08 2 353293316 15 1832 + 043569 1313 23 01 2 353294340 00 1833 + 043570 1313 23 02 2 353294340 01 1833 + 043571 1313 23 03 2 353294340 02 1833 + 043572 1313 23 04 2 353294340 03 1833 + 043573 1313 23 05 2 353294340 04 1833 + 043574 1313 23 06 2 353294340 05 1833 + 043575 1313 23 07 2 353294340 06 1833 + 043576 1313 23 08 2 353294340 07 1833 + 043577 1313 24 01 2 353294340 08 1833 + 043578 1313 24 02 2 353294340 09 1833 + 043579 1313 24 03 2 353294340 10 1833 + 043580 1313 24 04 2 353294340 11 1833 + 043581 1313 24 05 2 353294340 12 1833 + 043582 1313 24 06 2 353294340 13 1833 + 043583 1313 24 07 2 353294340 14 1833 + 043584 1313 24 08 2 353294340 15 1833 + 043585 1313 25 01 2 352646148 00 1548 + 043586 1313 25 02 2 352646148 01 1548 + 043587 1313 25 03 2 352646148 02 1548 + 043588 1313 25 04 2 352646148 03 1548 + 043589 1313 25 05 2 352646148 04 1548 + 043590 1313 25 06 2 352646148 05 1548 + 043591 1313 25 07 2 352646148 06 1548 + 043592 1313 25 08 2 352646148 07 1548 + 043593 1313 26 01 2 352646148 08 1548 + 043594 1313 26 02 2 352646148 09 1548 + 043595 1313 26 03 2 352646148 10 1548 + 043596 1313 26 04 2 352646148 11 1548 + 043597 1313 26 05 2 352646148 12 1548 + 043598 1313 26 06 2 352646148 13 1548 + 043599 1313 26 07 2 352646148 14 1548 + 043600 1313 26 08 2 352646148 15 1548 + 043601 1313 27 01 2 352647172 00 1549 + 043602 1313 27 02 2 352647172 01 1549 + 043603 1313 27 03 2 352647172 02 1549 + 043604 1313 27 04 2 352647172 03 1549 + 043605 1313 27 05 2 352647172 04 1549 + 043606 1313 27 06 2 352647172 05 1549 + 043607 1313 27 07 2 352647172 06 1549 + 043608 1313 27 08 2 352647172 07 1549 + 043609 1313 28 01 2 352647172 08 1549 + 043610 1313 28 02 2 352647172 09 1549 + 043611 1313 28 03 2 352647172 10 1549 + 043612 1313 28 04 2 352647172 11 1549 + 043613 1313 28 05 2 352647172 12 1549 + 043614 1313 28 06 2 352647172 13 1549 + 043615 1313 28 07 2 352647172 14 1549 + 043616 1313 28 08 2 352647172 15 1549 + 043617 1313 29 01 2 352773124 00 1610 + 043618 1313 29 02 2 352773124 01 1610 + 043619 1313 29 03 2 352773124 02 1610 + 043620 1313 29 04 2 352773124 03 1610 + 043621 1313 29 05 2 352773124 04 1610 + 043622 1313 29 06 2 352773124 05 1610 + 043623 1313 29 07 2 352773124 06 1610 + 043624 1313 29 08 2 352773124 07 1610 + 043625 1313 30 01 2 352773124 08 1610 + 043626 1313 30 02 2 352773124 09 1610 + 043627 1313 30 03 2 352773124 10 1610 + 043628 1313 30 04 2 352773124 11 1610 + 043629 1313 30 05 2 352773124 12 1610 + 043630 1313 30 06 2 352773124 13 1610 + 043631 1313 30 07 2 352773124 14 1610 + 043632 1313 30 08 2 352773124 15 1610 + 043633 1313 31 01 2 352774148 00 1611 + 043634 1313 31 02 2 352774148 01 1611 + 043635 1313 31 03 2 352774148 02 1611 + 043636 1313 31 04 2 352774148 03 1611 + 043637 1313 31 05 2 352774148 04 1611 + 043638 1313 31 06 2 352774148 05 1611 + 043639 1313 31 07 2 352774148 06 1611 + 043640 1313 31 08 2 352774148 07 1611 + 043641 1313 32 01 2 352774148 08 1611 + 043642 1313 32 02 2 352774148 09 1611 + 043643 1313 32 03 2 352774148 10 1611 + 043644 1313 32 04 2 352774148 11 1611 + 043645 1313 32 05 2 352774148 12 1611 + 043646 1313 32 06 2 352774148 13 1611 + 043647 1313 32 07 2 352774148 14 1611 + 043648 1313 32 08 2 352774148 15 1611 + 043649 1313 33 01 2 352908292 00 1660 + 043650 1313 33 02 2 352908292 01 1660 + 043651 1313 33 03 2 352908292 02 1660 + 043652 1313 33 04 2 352908292 03 1660 + 043653 1313 33 05 2 352908292 04 1660 + 043654 1313 33 06 2 352908292 05 1660 + 043655 1313 33 07 2 352908292 06 1660 + 043656 1313 33 08 2 352908292 07 1660 + 043657 1313 34 01 2 352908292 08 1660 + 043658 1313 34 02 2 352908292 09 1660 + 043659 1313 34 03 2 352908292 10 1660 + 043660 1313 34 04 2 352908292 11 1660 + 043661 1313 34 05 2 352908292 12 1660 + 043662 1313 34 06 2 352908292 13 1660 + 043663 1313 34 07 2 352908292 14 1660 + 043664 1313 34 08 2 352908292 15 1660 + 043665 1313 35 01 2 352909316 00 1661 + 043666 1313 35 02 2 352909316 01 1661 + 043667 1313 35 03 2 352909316 02 1661 + 043668 1313 35 04 2 352909316 03 1661 + 043669 1313 35 05 2 352909316 04 1661 + 043670 1313 35 06 2 352909316 05 1661 + 043671 1313 35 07 2 352909316 06 1661 + 043672 1313 35 08 2 352909316 07 1661 + 043673 1313 36 01 2 352909316 08 1661 + 043674 1313 36 02 2 352909316 09 1661 + 043675 1313 36 03 2 352909316 10 1661 + 043676 1313 36 04 2 352909316 11 1661 + 043677 1313 36 05 2 352909316 12 1661 + 043678 1313 36 06 2 352909316 13 1661 + 043679 1313 36 07 2 352909316 14 1661 + 043680 1313 36 08 2 352909316 15 1661 + 043681 1313 37 01 2 353035268 00 1722 + 043682 1313 37 02 2 353035268 01 1722 + 043683 1313 37 03 2 353035268 02 1722 + 043684 1313 37 04 2 353035268 03 1722 + 043685 1313 37 05 2 353035268 04 1722 + 043686 1313 37 06 2 353035268 05 1722 + 043687 1313 37 07 2 353035268 06 1722 + 043688 1313 37 08 2 353035268 07 1722 + 043689 1313 38 01 2 353035268 08 1722 + 043690 1313 38 02 2 353035268 09 1722 + 043691 1313 38 03 2 353035268 10 1722 + 043692 1313 38 04 2 353035268 11 1722 + 043693 1313 38 05 2 353035268 12 1722 + 043694 1313 38 06 2 353035268 13 1722 + 043695 1313 38 07 2 353035268 14 1722 + 043696 1313 38 08 2 353035268 15 1722 + 043697 1313 39 01 2 353036292 00 1723 + 043698 1313 39 02 2 353036292 01 1723 + 043699 1313 39 03 2 353036292 02 1723 + 043700 1313 39 04 2 353036292 03 1723 + 043701 1313 39 05 2 353036292 04 1723 + 043702 1313 39 06 2 353036292 05 1723 + 043703 1313 39 07 2 353036292 06 1723 + 043704 1313 39 08 2 353036292 07 1723 + 043705 1313 40 01 2 353036292 08 1723 + 043706 1313 40 02 2 353036292 09 1723 + 043707 1313 40 03 2 353036292 10 1723 + 043708 1313 40 04 2 353036292 11 1723 + 043709 1313 40 05 2 353036292 12 1723 + 043710 1313 40 06 2 353036292 13 1723 + 043711 1313 40 07 2 353036292 14 1723 + 043712 1313 40 08 2 353036292 15 1723 + 043713 1313 41 01 2 353170436 00 1772 + 043714 1313 41 02 2 353170436 01 1772 + 043715 1313 41 03 2 353170436 02 1772 + 043716 1313 41 04 2 353170436 03 1772 + 043717 1313 41 05 2 353170436 04 1772 + 043718 1313 41 06 2 353170436 05 1772 + 043719 1313 41 07 2 353170436 06 1772 + 043720 1313 41 08 2 353170436 07 1772 + 043721 1313 42 01 2 353170436 08 1772 + 043722 1313 42 02 2 353170436 09 1772 + 043723 1313 42 03 2 353170436 10 1772 + 043724 1313 42 04 2 353170436 11 1772 + 043725 1313 42 05 2 353170436 12 1772 + 043726 1313 42 06 2 353170436 13 1772 + 043727 1313 42 07 2 353170436 14 1772 + 043728 1313 42 08 2 353170436 15 1772 + 043729 1313 43 01 2 353171460 00 1773 + 043730 1313 43 02 2 353171460 01 1773 + 043731 1313 43 03 2 353171460 02 1773 + 043732 1313 43 04 2 353171460 03 1773 + 043733 1313 43 05 2 353171460 04 1773 + 043734 1313 43 06 2 353171460 05 1773 + 043735 1313 43 07 2 353171460 06 1773 + 043736 1313 43 08 2 353171460 07 1773 + 043737 1313 44 01 2 353171460 08 1773 + 043738 1313 44 02 2 353171460 09 1773 + 043739 1313 44 03 2 353171460 10 1773 + 043740 1313 44 04 2 353171460 11 1773 + 043741 1313 44 05 2 353171460 12 1773 + 043742 1313 44 06 2 353171460 13 1773 + 043743 1313 44 07 2 353171460 14 1773 + 043744 1313 44 08 2 353171460 15 1773 + 043745 1313 45 01 2 353297412 00 1834 + 043746 1313 45 02 2 353297412 01 1834 + 043747 1313 45 03 2 353297412 02 1834 + 043748 1313 45 04 2 353297412 03 1834 + 043749 1313 45 05 2 353297412 04 1834 + 043750 1313 45 06 2 353297412 05 1834 + 043751 1313 45 07 2 353297412 06 1834 + 043752 1313 45 08 2 353297412 07 1834 + 043753 1313 46 01 2 353297412 08 1834 + 043754 1313 46 02 2 353297412 09 1834 + 043755 1313 46 03 2 353297412 10 1834 + 043756 1313 46 04 2 353297412 11 1834 + 043757 1313 46 05 2 353297412 12 1834 + 043758 1313 46 06 2 353297412 13 1834 + 043759 1313 46 07 2 353297412 14 1834 + 043760 1313 46 08 2 353297412 15 1834 + 043761 1313 47 01 2 353298436 00 1835 + 043762 1313 47 02 2 353298436 01 1835 + 043763 1313 47 03 2 353298436 02 1835 + 043764 1313 47 04 2 353298436 03 1835 + 043765 1313 47 05 2 353298436 04 1835 + 043766 1313 47 06 2 353298436 05 1835 + 043767 1313 47 07 2 353298436 06 1835 + 043768 1313 47 08 2 353298436 07 1835 + 043769 1313 48 01 2 353298436 08 1835 + 043770 1313 48 02 2 353298436 09 1835 + 043771 1313 48 03 2 353298436 10 1835 + 043772 1313 48 04 2 353298436 11 1835 + 043773 1313 48 05 2 353298436 12 1835 + 043774 1313 48 06 2 353298436 13 1835 + 043775 1313 48 07 2 353298436 14 1835 + 043776 1313 48 08 2 353298436 15 1835 + 043777 1314 01 01 2 352650244 00 1550 + 043778 1314 01 02 2 352650244 01 1550 + 043779 1314 01 03 2 352650244 02 1550 + 043780 1314 01 04 2 352650244 03 1550 + 043781 1314 01 05 2 352650244 04 1550 + 043782 1314 01 06 2 352650244 05 1550 + 043783 1314 01 07 2 352650244 06 1550 + 043784 1314 01 08 2 352650244 07 1550 + 043785 1314 02 01 2 352650244 08 1550 + 043786 1314 02 02 2 352650244 09 1550 + 043787 1314 02 03 2 352650244 10 1550 + 043788 1314 02 04 2 352650244 11 1550 + 043789 1314 02 05 2 352650244 12 1550 + 043790 1314 02 06 2 352650244 13 1550 + 043791 1314 02 07 2 352650244 14 1550 + 043792 1314 02 08 2 352650244 15 1550 + 043793 1314 03 01 2 352651268 00 1551 + 043794 1314 03 02 2 352651268 01 1551 + 043795 1314 03 03 2 352651268 02 1551 + 043796 1314 03 04 2 352651268 03 1551 + 043797 1314 03 05 2 352651268 04 1551 + 043798 1314 03 06 2 352651268 05 1551 + 043799 1314 03 07 2 352651268 06 1551 + 043800 1314 03 08 2 352651268 07 1551 + 043801 1314 04 01 2 352651268 08 1551 + 043802 1314 04 02 2 352651268 09 1551 + 043803 1314 04 03 2 352651268 10 1551 + 043804 1314 04 04 2 352651268 11 1551 + 043805 1314 04 05 2 352651268 12 1551 + 043806 1314 04 06 2 352651268 13 1551 + 043807 1314 04 07 2 352651268 14 1551 + 043808 1314 04 08 2 352651268 15 1551 + 043809 1314 05 01 2 352777220 00 1612 + 043810 1314 05 02 2 352777220 01 1612 + 043811 1314 05 03 2 352777220 02 1612 + 043812 1314 05 04 2 352777220 03 1612 + 043813 1314 05 05 2 352777220 04 1612 + 043814 1314 05 06 2 352777220 05 1612 + 043815 1314 05 07 2 352777220 06 1612 + 043816 1314 05 08 2 352777220 07 1612 + 043817 1314 06 01 2 352777220 08 1612 + 043818 1314 06 02 2 352777220 09 1612 + 043819 1314 06 03 2 352777220 10 1612 + 043820 1314 06 04 2 352777220 11 1612 + 043821 1314 06 05 2 352777220 12 1612 + 043822 1314 06 06 2 352777220 13 1612 + 043823 1314 06 07 2 352777220 14 1612 + 043824 1314 06 08 2 352777220 15 1612 + 043825 1314 07 01 2 352778244 00 1613 + 043826 1314 07 02 2 352778244 01 1613 + 043827 1314 07 03 2 352778244 02 1613 + 043828 1314 07 04 2 352778244 03 1613 + 043829 1314 07 05 2 352778244 04 1613 + 043830 1314 07 06 2 352778244 05 1613 + 043831 1314 07 07 2 352778244 06 1613 + 043832 1314 07 08 2 352778244 07 1613 + 043833 1314 08 01 2 352778244 08 1613 + 043834 1314 08 02 2 352778244 09 1613 + 043835 1314 08 03 2 352778244 10 1613 + 043836 1314 08 04 2 352778244 11 1613 + 043837 1314 08 05 2 352778244 12 1613 + 043838 1314 08 06 2 352778244 13 1613 + 043839 1314 08 07 2 352778244 14 1613 + 043840 1314 08 08 2 352778244 15 1613 + 043841 1314 09 01 2 352912388 00 1662 + 043842 1314 09 02 2 352912388 01 1662 + 043843 1314 09 03 2 352912388 02 1662 + 043844 1314 09 04 2 352912388 03 1662 + 043845 1314 09 05 2 352912388 04 1662 + 043846 1314 09 06 2 352912388 05 1662 + 043847 1314 09 07 2 352912388 06 1662 + 043848 1314 09 08 2 352912388 07 1662 + 043849 1314 10 01 2 352912388 08 1662 + 043850 1314 10 02 2 352912388 09 1662 + 043851 1314 10 03 2 352912388 10 1662 + 043852 1314 10 04 2 352912388 11 1662 + 043853 1314 10 05 2 352912388 12 1662 + 043854 1314 10 06 2 352912388 13 1662 + 043855 1314 10 07 2 352912388 14 1662 + 043856 1314 10 08 2 352912388 15 1662 + 043857 1314 11 01 2 352913412 00 1663 + 043858 1314 11 02 2 352913412 01 1663 + 043859 1314 11 03 2 352913412 02 1663 + 043860 1314 11 04 2 352913412 03 1663 + 043861 1314 11 05 2 352913412 04 1663 + 043862 1314 11 06 2 352913412 05 1663 + 043863 1314 11 07 2 352913412 06 1663 + 043864 1314 11 08 2 352913412 07 1663 + 043865 1314 12 01 2 352913412 08 1663 + 043866 1314 12 02 2 352913412 09 1663 + 043867 1314 12 03 2 352913412 10 1663 + 043868 1314 12 04 2 352913412 11 1663 + 043869 1314 12 05 2 352913412 12 1663 + 043870 1314 12 06 2 352913412 13 1663 + 043871 1314 12 07 2 352913412 14 1663 + 043872 1314 12 08 2 352913412 15 1663 + 043873 1314 13 01 2 353039364 00 1724 + 043874 1314 13 02 2 353039364 01 1724 + 043875 1314 13 03 2 353039364 02 1724 + 043876 1314 13 04 2 353039364 03 1724 + 043877 1314 13 05 2 353039364 04 1724 + 043878 1314 13 06 2 353039364 05 1724 + 043879 1314 13 07 2 353039364 06 1724 + 043880 1314 13 08 2 353039364 07 1724 + 043881 1314 14 01 2 353039364 08 1724 + 043882 1314 14 02 2 353039364 09 1724 + 043883 1314 14 03 2 353039364 10 1724 + 043884 1314 14 04 2 353039364 11 1724 + 043885 1314 14 05 2 353039364 12 1724 + 043886 1314 14 06 2 353039364 13 1724 + 043887 1314 14 07 2 353039364 14 1724 + 043888 1314 14 08 2 353039364 15 1724 + 043889 1314 15 01 2 353040388 00 1725 + 043890 1314 15 02 2 353040388 01 1725 + 043891 1314 15 03 2 353040388 02 1725 + 043892 1314 15 04 2 353040388 03 1725 + 043893 1314 15 05 2 353040388 04 1725 + 043894 1314 15 06 2 353040388 05 1725 + 043895 1314 15 07 2 353040388 06 1725 + 043896 1314 15 08 2 353040388 07 1725 + 043897 1314 16 01 2 353040388 08 1725 + 043898 1314 16 02 2 353040388 09 1725 + 043899 1314 16 03 2 353040388 10 1725 + 043900 1314 16 04 2 353040388 11 1725 + 043901 1314 16 05 2 353040388 12 1725 + 043902 1314 16 06 2 353040388 13 1725 + 043903 1314 16 07 2 353040388 14 1725 + 043904 1314 16 08 2 353040388 15 1725 + 043905 1314 17 01 2 353174532 00 1774 + 043906 1314 17 02 2 353174532 01 1774 + 043907 1314 17 03 2 353174532 02 1774 + 043908 1314 17 04 2 353174532 03 1774 + 043909 1314 17 05 2 353174532 04 1774 + 043910 1314 17 06 2 353174532 05 1774 + 043911 1314 17 07 2 353174532 06 1774 + 043912 1314 17 08 2 353174532 07 1774 + 043913 1314 18 01 2 353174532 08 1774 + 043914 1314 18 02 2 353174532 09 1774 + 043915 1314 18 03 2 353174532 10 1774 + 043916 1314 18 04 2 353174532 11 1774 + 043917 1314 18 05 2 353174532 12 1774 + 043918 1314 18 06 2 353174532 13 1774 + 043919 1314 18 07 2 353174532 14 1774 + 043920 1314 18 08 2 353174532 15 1774 + 043921 1314 19 01 2 353175556 00 1775 + 043922 1314 19 02 2 353175556 01 1775 + 043923 1314 19 03 2 353175556 02 1775 + 043924 1314 19 04 2 353175556 03 1775 + 043925 1314 19 05 2 353175556 04 1775 + 043926 1314 19 06 2 353175556 05 1775 + 043927 1314 19 07 2 353175556 06 1775 + 043928 1314 19 08 2 353175556 07 1775 + 043929 1314 20 01 2 353175556 08 1775 + 043930 1314 20 02 2 353175556 09 1775 + 043931 1314 20 03 2 353175556 10 1775 + 043932 1314 20 04 2 353175556 11 1775 + 043933 1314 20 05 2 353175556 12 1775 + 043934 1314 20 06 2 353175556 13 1775 + 043935 1314 20 07 2 353175556 14 1775 + 043936 1314 20 08 2 353175556 15 1775 + 043937 1314 21 01 2 353301508 00 1836 + 043938 1314 21 02 2 353301508 01 1836 + 043939 1314 21 03 2 353301508 02 1836 + 043940 1314 21 04 2 353301508 03 1836 + 043941 1314 21 05 2 353301508 04 1836 + 043942 1314 21 06 2 353301508 05 1836 + 043943 1314 21 07 2 353301508 06 1836 + 043944 1314 21 08 2 353301508 07 1836 + 043945 1314 22 01 2 353301508 08 1836 + 043946 1314 22 02 2 353301508 09 1836 + 043947 1314 22 03 2 353301508 10 1836 + 043948 1314 22 04 2 353301508 11 1836 + 043949 1314 22 05 2 353301508 12 1836 + 043950 1314 22 06 2 353301508 13 1836 + 043951 1314 22 07 2 353301508 14 1836 + 043952 1314 22 08 2 353301508 15 1836 + 043953 1314 23 01 2 353302532 00 1837 + 043954 1314 23 02 2 353302532 01 1837 + 043955 1314 23 03 2 353302532 02 1837 + 043956 1314 23 04 2 353302532 03 1837 + 043957 1314 23 05 2 353302532 04 1837 + 043958 1314 23 06 2 353302532 05 1837 + 043959 1314 23 07 2 353302532 06 1837 + 043960 1314 23 08 2 353302532 07 1837 + 043961 1314 24 01 2 353302532 08 1837 + 043962 1314 24 02 2 353302532 09 1837 + 043963 1314 24 03 2 353302532 10 1837 + 043964 1314 24 04 2 353302532 11 1837 + 043965 1314 24 05 2 353302532 12 1837 + 043966 1314 24 06 2 353302532 13 1837 + 043967 1314 24 07 2 353302532 14 1837 + 043968 1314 24 08 2 353302532 15 1837 + 043969 1314 25 01 2 352654340 00 1552 + 043970 1314 25 02 2 352654340 01 1552 + 043971 1314 25 03 2 352654340 02 1552 + 043972 1314 25 04 2 352654340 03 1552 + 043973 1314 25 05 2 352654340 04 1552 + 043974 1314 25 06 2 352654340 05 1552 + 043975 1314 25 07 2 352654340 06 1552 + 043976 1314 25 08 2 352654340 07 1552 + 043977 1314 26 01 2 352654340 08 1552 + 043978 1314 26 02 2 352654340 09 1552 + 043979 1314 26 03 2 352654340 10 1552 + 043980 1314 26 04 2 352654340 11 1552 + 043981 1314 26 05 2 352654340 12 1552 + 043982 1314 26 06 2 352654340 13 1552 + 043983 1314 26 07 2 352654340 14 1552 + 043984 1314 26 08 2 352654340 15 1552 + 043985 1314 27 01 2 352655364 00 1553 + 043986 1314 27 02 2 352655364 01 1553 + 043987 1314 27 03 2 352655364 02 1553 + 043988 1314 27 04 2 352655364 03 1553 + 043989 1314 27 05 2 352655364 04 1553 + 043990 1314 27 06 2 352655364 05 1553 + 043991 1314 27 07 2 352655364 06 1553 + 043992 1314 27 08 2 352655364 07 1553 + 043993 1314 28 01 2 352655364 08 1553 + 043994 1314 28 02 2 352655364 09 1553 + 043995 1314 28 03 2 352655364 10 1553 + 043996 1314 28 04 2 352655364 11 1553 + 043997 1314 28 05 2 352655364 12 1553 + 043998 1314 28 06 2 352655364 13 1553 + 043999 1314 28 07 2 352655364 14 1553 + 044000 1314 28 08 2 352655364 15 1553 + 044001 1314 29 01 2 352781316 00 1614 + 044002 1314 29 02 2 352781316 01 1614 + 044003 1314 29 03 2 352781316 02 1614 + 044004 1314 29 04 2 352781316 03 1614 + 044005 1314 29 05 2 352781316 04 1614 + 044006 1314 29 06 2 352781316 05 1614 + 044007 1314 29 07 2 352781316 06 1614 + 044008 1314 29 08 2 352781316 07 1614 + 044009 1314 30 01 2 352781316 08 1614 + 044010 1314 30 02 2 352781316 09 1614 + 044011 1314 30 03 2 352781316 10 1614 + 044012 1314 30 04 2 352781316 11 1614 + 044013 1314 30 05 2 352781316 12 1614 + 044014 1314 30 06 2 352781316 13 1614 + 044015 1314 30 07 2 352781316 14 1614 + 044016 1314 30 08 2 352781316 15 1614 + 044017 1314 31 01 2 352782340 00 1615 + 044018 1314 31 02 2 352782340 01 1615 + 044019 1314 31 03 2 352782340 02 1615 + 044020 1314 31 04 2 352782340 03 1615 + 044021 1314 31 05 2 352782340 04 1615 + 044022 1314 31 06 2 352782340 05 1615 + 044023 1314 31 07 2 352782340 06 1615 + 044024 1314 31 08 2 352782340 07 1615 + 044025 1314 32 01 2 352782340 08 1615 + 044026 1314 32 02 2 352782340 09 1615 + 044027 1314 32 03 2 352782340 10 1615 + 044028 1314 32 04 2 352782340 11 1615 + 044029 1314 32 05 2 352782340 12 1615 + 044030 1314 32 06 2 352782340 13 1615 + 044031 1314 32 07 2 352782340 14 1615 + 044032 1314 32 08 2 352782340 15 1615 + 044033 1314 33 01 2 352916484 00 1664 + 044034 1314 33 02 2 352916484 01 1664 + 044035 1314 33 03 2 352916484 02 1664 + 044036 1314 33 04 2 352916484 03 1664 + 044037 1314 33 05 2 352916484 04 1664 + 044038 1314 33 06 2 352916484 05 1664 + 044039 1314 33 07 2 352916484 06 1664 + 044040 1314 33 08 2 352916484 07 1664 + 044041 1314 34 01 2 352916484 08 1664 + 044042 1314 34 02 2 352916484 09 1664 + 044043 1314 34 03 2 352916484 10 1664 + 044044 1314 34 04 2 352916484 11 1664 + 044045 1314 34 05 2 352916484 12 1664 + 044046 1314 34 06 2 352916484 13 1664 + 044047 1314 34 07 2 352916484 14 1664 + 044048 1314 34 08 2 352916484 15 1664 + 044049 1314 35 01 2 352917508 00 1665 + 044050 1314 35 02 2 352917508 01 1665 + 044051 1314 35 03 2 352917508 02 1665 + 044052 1314 35 04 2 352917508 03 1665 + 044053 1314 35 05 2 352917508 04 1665 + 044054 1314 35 06 2 352917508 05 1665 + 044055 1314 35 07 2 352917508 06 1665 + 044056 1314 35 08 2 352917508 07 1665 + 044057 1314 36 01 2 352917508 08 1665 + 044058 1314 36 02 2 352917508 09 1665 + 044059 1314 36 03 2 352917508 10 1665 + 044060 1314 36 04 2 352917508 11 1665 + 044061 1314 36 05 2 352917508 12 1665 + 044062 1314 36 06 2 352917508 13 1665 + 044063 1314 36 07 2 352917508 14 1665 + 044064 1314 36 08 2 352917508 15 1665 + 044065 1314 37 01 2 353043460 00 1726 + 044066 1314 37 02 2 353043460 01 1726 + 044067 1314 37 03 2 353043460 02 1726 + 044068 1314 37 04 2 353043460 03 1726 + 044069 1314 37 05 2 353043460 04 1726 + 044070 1314 37 06 2 353043460 05 1726 + 044071 1314 37 07 2 353043460 06 1726 + 044072 1314 37 08 2 353043460 07 1726 + 044073 1314 38 01 2 353043460 08 1726 + 044074 1314 38 02 2 353043460 09 1726 + 044075 1314 38 03 2 353043460 10 1726 + 044076 1314 38 04 2 353043460 11 1726 + 044077 1314 38 05 2 353043460 12 1726 + 044078 1314 38 06 2 353043460 13 1726 + 044079 1314 38 07 2 353043460 14 1726 + 044080 1314 38 08 2 353043460 15 1726 + 044081 1314 39 01 2 353044484 00 1727 + 044082 1314 39 02 2 353044484 01 1727 + 044083 1314 39 03 2 353044484 02 1727 + 044084 1314 39 04 2 353044484 03 1727 + 044085 1314 39 05 2 353044484 04 1727 + 044086 1314 39 06 2 353044484 05 1727 + 044087 1314 39 07 2 353044484 06 1727 + 044088 1314 39 08 2 353044484 07 1727 + 044089 1314 40 01 2 353044484 08 1727 + 044090 1314 40 02 2 353044484 09 1727 + 044091 1314 40 03 2 353044484 10 1727 + 044092 1314 40 04 2 353044484 11 1727 + 044093 1314 40 05 2 353044484 12 1727 + 044094 1314 40 06 2 353044484 13 1727 + 044095 1314 40 07 2 353044484 14 1727 + 044096 1314 40 08 2 353044484 15 1727 + 044097 1314 41 01 2 353178628 00 1776 + 044098 1314 41 02 2 353178628 01 1776 + 044099 1314 41 03 2 353178628 02 1776 + 044100 1314 41 04 2 353178628 03 1776 + 044101 1314 41 05 2 353178628 04 1776 + 044102 1314 41 06 2 353178628 05 1776 + 044103 1314 41 07 2 353178628 06 1776 + 044104 1314 41 08 2 353178628 07 1776 + 044105 1314 42 01 2 353178628 08 1776 + 044106 1314 42 02 2 353178628 09 1776 + 044107 1314 42 03 2 353178628 10 1776 + 044108 1314 42 04 2 353178628 11 1776 + 044109 1314 42 05 2 353178628 12 1776 + 044110 1314 42 06 2 353178628 13 1776 + 044111 1314 42 07 2 353178628 14 1776 + 044112 1314 42 08 2 353178628 15 1776 + 044113 1314 43 01 2 353179652 00 1777 + 044114 1314 43 02 2 353179652 01 1777 + 044115 1314 43 03 2 353179652 02 1777 + 044116 1314 43 04 2 353179652 03 1777 + 044117 1314 43 05 2 353179652 04 1777 + 044118 1314 43 06 2 353179652 05 1777 + 044119 1314 43 07 2 353179652 06 1777 + 044120 1314 43 08 2 353179652 07 1777 + 044121 1314 44 01 2 353179652 08 1777 + 044122 1314 44 02 2 353179652 09 1777 + 044123 1314 44 03 2 353179652 10 1777 + 044124 1314 44 04 2 353179652 11 1777 + 044125 1314 44 05 2 353179652 12 1777 + 044126 1314 44 06 2 353179652 13 1777 + 044127 1314 44 07 2 353179652 14 1777 + 044128 1314 44 08 2 353179652 15 1777 + 044129 1314 45 01 2 353305604 00 1838 + 044130 1314 45 02 2 353305604 01 1838 + 044131 1314 45 03 2 353305604 02 1838 + 044132 1314 45 04 2 353305604 03 1838 + 044133 1314 45 05 2 353305604 04 1838 + 044134 1314 45 06 2 353305604 05 1838 + 044135 1314 45 07 2 353305604 06 1838 + 044136 1314 45 08 2 353305604 07 1838 + 044137 1314 46 01 2 353305604 08 1838 + 044138 1314 46 02 2 353305604 09 1838 + 044139 1314 46 03 2 353305604 10 1838 + 044140 1314 46 04 2 353305604 11 1838 + 044141 1314 46 05 2 353305604 12 1838 + 044142 1314 46 06 2 353305604 13 1838 + 044143 1314 46 07 2 353305604 14 1838 + 044144 1314 46 08 2 353305604 15 1838 + 044145 1314 47 01 2 353306628 00 1839 + 044146 1314 47 02 2 353306628 01 1839 + 044147 1314 47 03 2 353306628 02 1839 + 044148 1314 47 04 2 353306628 03 1839 + 044149 1314 47 05 2 353306628 04 1839 + 044150 1314 47 06 2 353306628 05 1839 + 044151 1314 47 07 2 353306628 06 1839 + 044152 1314 47 08 2 353306628 07 1839 + 044153 1314 48 01 2 353306628 08 1839 + 044154 1314 48 02 2 353306628 09 1839 + 044155 1314 48 03 2 353306628 10 1839 + 044156 1314 48 04 2 353306628 11 1839 + 044157 1314 48 05 2 353306628 12 1839 + 044158 1314 48 06 2 353306628 13 1839 + 044159 1314 48 07 2 353306628 14 1839 + 044160 1314 48 08 2 353306628 15 1839 + 044161 9999 99 99 0 9999 99 9999 + 044162 9999 99 99 0 9999 99 9999 + 044163 9999 99 99 0 9999 99 9999 + 044164 9999 99 99 0 9999 99 9999 + 044165 9999 99 99 0 9999 99 9999 + 044166 9999 99 99 0 9999 99 9999 + 044167 9999 99 99 0 9999 99 9999 + 044168 9999 99 99 0 9999 99 9999 + 044169 9999 99 99 0 9999 99 9999 + 044170 9999 99 99 0 9999 99 9999 + 044171 9999 99 99 0 9999 99 9999 + 044172 9999 99 99 0 9999 99 9999 + 044173 9999 99 99 0 9999 99 9999 + 044174 9999 99 99 0 9999 99 9999 + 044175 9999 99 99 0 9999 99 9999 + 044176 9999 99 99 0 9999 99 9999 + 044177 9999 99 99 0 9999 99 9999 + 044178 9999 99 99 0 9999 99 9999 + 044179 9999 99 99 0 9999 99 9999 + 044180 9999 99 99 0 9999 99 9999 + 044181 9999 99 99 0 9999 99 9999 + 044182 9999 99 99 0 9999 99 9999 + 044183 9999 99 99 0 9999 99 9999 + 044184 9999 99 99 0 9999 99 9999 + 044185 9999 99 99 0 9999 99 9999 + 044186 9999 99 99 0 9999 99 9999 + 044187 9999 99 99 0 9999 99 9999 + 044188 9999 99 99 0 9999 99 9999 + 044189 9999 99 99 0 9999 99 9999 + 044190 9999 99 99 0 9999 99 9999 + 044191 9999 99 99 0 9999 99 9999 + 044192 9999 99 99 0 9999 99 9999 + 044193 9999 99 99 0 9999 99 9999 + 044194 9999 99 99 0 9999 99 9999 + 044195 9999 99 99 0 9999 99 9999 + 044196 9999 99 99 0 9999 99 9999 + 044197 9999 99 99 0 9999 99 9999 + 044198 9999 99 99 0 9999 99 9999 + 044199 9999 99 99 0 9999 99 9999 + 044200 9999 99 99 0 9999 99 9999 + 044201 9999 99 99 0 9999 99 9999 + 044202 9999 99 99 0 9999 99 9999 + 044203 9999 99 99 0 9999 99 9999 + 044204 9999 99 99 0 9999 99 9999 + 044205 9999 99 99 0 9999 99 9999 + 044206 9999 99 99 0 9999 99 9999 + 044207 9999 99 99 0 9999 99 9999 + 044208 9999 99 99 0 9999 99 9999 + 044209 9999 99 99 0 9999 99 9999 + 044210 9999 99 99 0 9999 99 9999 + 044211 9999 99 99 0 9999 99 9999 + 044212 9999 99 99 0 9999 99 9999 + 044213 9999 99 99 0 9999 99 9999 + 044214 9999 99 99 0 9999 99 9999 + 044215 9999 99 99 0 9999 99 9999 + 044216 9999 99 99 0 9999 99 9999 + 044217 9999 99 99 0 9999 99 9999 + 044218 9999 99 99 0 9999 99 9999 + 044219 9999 99 99 0 9999 99 9999 + 044220 9999 99 99 0 9999 99 9999 + 044221 9999 99 99 0 9999 99 9999 + 044222 9999 99 99 0 9999 99 9999 + 044223 9999 99 99 0 9999 99 9999 + 044224 9999 99 99 0 9999 99 9999 + 044225 9999 99 99 0 9999 99 9999 + 044226 9999 99 99 0 9999 99 9999 + 044227 9999 99 99 0 9999 99 9999 + 044228 9999 99 99 0 9999 99 9999 + 044229 9999 99 99 0 9999 99 9999 + 044230 9999 99 99 0 9999 99 9999 + 044231 9999 99 99 0 9999 99 9999 + 044232 9999 99 99 0 9999 99 9999 + 044233 9999 99 99 0 9999 99 9999 + 044234 9999 99 99 0 9999 99 9999 + 044235 9999 99 99 0 9999 99 9999 + 044236 9999 99 99 0 9999 99 9999 + 044237 9999 99 99 0 9999 99 9999 + 044238 9999 99 99 0 9999 99 9999 + 044239 9999 99 99 0 9999 99 9999 + 044240 9999 99 99 0 9999 99 9999 + 044241 9999 99 99 0 9999 99 9999 + 044242 9999 99 99 0 9999 99 9999 + 044243 9999 99 99 0 9999 99 9999 + 044244 9999 99 99 0 9999 99 9999 + 044245 9999 99 99 0 9999 99 9999 + 044246 9999 99 99 0 9999 99 9999 + 044247 9999 99 99 0 9999 99 9999 + 044248 9999 99 99 0 9999 99 9999 + 044249 9999 99 99 0 9999 99 9999 + 044250 9999 99 99 0 9999 99 9999 + 044251 9999 99 99 0 9999 99 9999 + 044252 9999 99 99 0 9999 99 9999 + 044253 9999 99 99 0 9999 99 9999 + 044254 9999 99 99 0 9999 99 9999 + 044255 9999 99 99 0 9999 99 9999 + 044256 9999 99 99 0 9999 99 9999 + 044257 9999 99 99 0 9999 99 9999 + 044258 9999 99 99 0 9999 99 9999 + 044259 9999 99 99 0 9999 99 9999 + 044260 9999 99 99 0 9999 99 9999 + 044261 9999 99 99 0 9999 99 9999 + 044262 9999 99 99 0 9999 99 9999 + 044263 9999 99 99 0 9999 99 9999 + 044264 9999 99 99 0 9999 99 9999 + 044265 9999 99 99 0 9999 99 9999 + 044266 9999 99 99 0 9999 99 9999 + 044267 9999 99 99 0 9999 99 9999 + 044268 9999 99 99 0 9999 99 9999 + 044269 9999 99 99 0 9999 99 9999 + 044270 9999 99 99 0 9999 99 9999 + 044271 9999 99 99 0 9999 99 9999 + 044272 9999 99 99 0 9999 99 9999 + 044273 9999 99 99 0 9999 99 9999 + 044274 9999 99 99 0 9999 99 9999 + 044275 9999 99 99 0 9999 99 9999 + 044276 9999 99 99 0 9999 99 9999 + 044277 9999 99 99 0 9999 99 9999 + 044278 9999 99 99 0 9999 99 9999 + 044279 9999 99 99 0 9999 99 9999 + 044280 9999 99 99 0 9999 99 9999 + 044281 9999 99 99 0 9999 99 9999 + 044282 9999 99 99 0 9999 99 9999 + 044283 9999 99 99 0 9999 99 9999 + 044284 9999 99 99 0 9999 99 9999 + 044285 9999 99 99 0 9999 99 9999 + 044286 9999 99 99 0 9999 99 9999 + 044287 9999 99 99 0 9999 99 9999 + 044288 9999 99 99 0 9999 99 9999 + 044289 9999 99 99 0 9999 99 9999 + 044290 9999 99 99 0 9999 99 9999 + 044291 9999 99 99 0 9999 99 9999 + 044292 9999 99 99 0 9999 99 9999 + 044293 9999 99 99 0 9999 99 9999 + 044294 9999 99 99 0 9999 99 9999 + 044295 9999 99 99 0 9999 99 9999 + 044296 9999 99 99 0 9999 99 9999 + 044297 9999 99 99 0 9999 99 9999 + 044298 9999 99 99 0 9999 99 9999 + 044299 9999 99 99 0 9999 99 9999 + 044300 9999 99 99 0 9999 99 9999 + 044301 9999 99 99 0 9999 99 9999 + 044302 9999 99 99 0 9999 99 9999 + 044303 9999 99 99 0 9999 99 9999 + 044304 9999 99 99 0 9999 99 9999 + 044305 9999 99 99 0 9999 99 9999 + 044306 9999 99 99 0 9999 99 9999 + 044307 9999 99 99 0 9999 99 9999 + 044308 9999 99 99 0 9999 99 9999 + 044309 9999 99 99 0 9999 99 9999 + 044310 9999 99 99 0 9999 99 9999 + 044311 9999 99 99 0 9999 99 9999 + 044312 9999 99 99 0 9999 99 9999 + 044313 9999 99 99 0 9999 99 9999 + 044314 9999 99 99 0 9999 99 9999 + 044315 9999 99 99 0 9999 99 9999 + 044316 9999 99 99 0 9999 99 9999 + 044317 9999 99 99 0 9999 99 9999 + 044318 9999 99 99 0 9999 99 9999 + 044319 9999 99 99 0 9999 99 9999 + 044320 9999 99 99 0 9999 99 9999 + 044321 9999 99 99 0 9999 99 9999 + 044322 9999 99 99 0 9999 99 9999 + 044323 9999 99 99 0 9999 99 9999 + 044324 9999 99 99 0 9999 99 9999 + 044325 9999 99 99 0 9999 99 9999 + 044326 9999 99 99 0 9999 99 9999 + 044327 9999 99 99 0 9999 99 9999 + 044328 9999 99 99 0 9999 99 9999 + 044329 9999 99 99 0 9999 99 9999 + 044330 9999 99 99 0 9999 99 9999 + 044331 9999 99 99 0 9999 99 9999 + 044332 9999 99 99 0 9999 99 9999 + 044333 9999 99 99 0 9999 99 9999 + 044334 9999 99 99 0 9999 99 9999 + 044335 9999 99 99 0 9999 99 9999 + 044336 9999 99 99 0 9999 99 9999 + 044337 9999 99 99 0 9999 99 9999 + 044338 9999 99 99 0 9999 99 9999 + 044339 9999 99 99 0 9999 99 9999 + 044340 9999 99 99 0 9999 99 9999 + 044341 9999 99 99 0 9999 99 9999 + 044342 9999 99 99 0 9999 99 9999 + 044343 9999 99 99 0 9999 99 9999 + 044344 9999 99 99 0 9999 99 9999 + 044345 9999 99 99 0 9999 99 9999 + 044346 9999 99 99 0 9999 99 9999 + 044347 9999 99 99 0 9999 99 9999 + 044348 9999 99 99 0 9999 99 9999 + 044349 9999 99 99 0 9999 99 9999 + 044350 9999 99 99 0 9999 99 9999 + 044351 9999 99 99 0 9999 99 9999 + 044352 9999 99 99 0 9999 99 9999 + 044353 9999 99 99 0 9999 99 9999 + 044354 9999 99 99 0 9999 99 9999 + 044355 9999 99 99 0 9999 99 9999 + 044356 9999 99 99 0 9999 99 9999 + 044357 9999 99 99 0 9999 99 9999 + 044358 9999 99 99 0 9999 99 9999 + 044359 9999 99 99 0 9999 99 9999 + 044360 9999 99 99 0 9999 99 9999 + 044361 9999 99 99 0 9999 99 9999 + 044362 9999 99 99 0 9999 99 9999 + 044363 9999 99 99 0 9999 99 9999 + 044364 9999 99 99 0 9999 99 9999 + 044365 9999 99 99 0 9999 99 9999 + 044366 9999 99 99 0 9999 99 9999 + 044367 9999 99 99 0 9999 99 9999 + 044368 9999 99 99 0 9999 99 9999 + 044369 9999 99 99 0 9999 99 9999 + 044370 9999 99 99 0 9999 99 9999 + 044371 9999 99 99 0 9999 99 9999 + 044372 9999 99 99 0 9999 99 9999 + 044373 9999 99 99 0 9999 99 9999 + 044374 9999 99 99 0 9999 99 9999 + 044375 9999 99 99 0 9999 99 9999 + 044376 9999 99 99 0 9999 99 9999 + 044377 9999 99 99 0 9999 99 9999 + 044378 9999 99 99 0 9999 99 9999 + 044379 9999 99 99 0 9999 99 9999 + 044380 9999 99 99 0 9999 99 9999 + 044381 9999 99 99 0 9999 99 9999 + 044382 9999 99 99 0 9999 99 9999 + 044383 9999 99 99 0 9999 99 9999 + 044384 9999 99 99 0 9999 99 9999 + 044385 9999 99 99 0 9999 99 9999 + 044386 9999 99 99 0 9999 99 9999 + 044387 9999 99 99 0 9999 99 9999 + 044388 9999 99 99 0 9999 99 9999 + 044389 9999 99 99 0 9999 99 9999 + 044390 9999 99 99 0 9999 99 9999 + 044391 9999 99 99 0 9999 99 9999 + 044392 9999 99 99 0 9999 99 9999 + 044393 9999 99 99 0 9999 99 9999 + 044394 9999 99 99 0 9999 99 9999 + 044395 9999 99 99 0 9999 99 9999 + 044396 9999 99 99 0 9999 99 9999 + 044397 9999 99 99 0 9999 99 9999 + 044398 9999 99 99 0 9999 99 9999 + 044399 9999 99 99 0 9999 99 9999 + 044400 9999 99 99 0 9999 99 9999 + 044401 9999 99 99 0 9999 99 9999 + 044402 9999 99 99 0 9999 99 9999 + 044403 9999 99 99 0 9999 99 9999 + 044404 9999 99 99 0 9999 99 9999 + 044405 9999 99 99 0 9999 99 9999 + 044406 9999 99 99 0 9999 99 9999 + 044407 9999 99 99 0 9999 99 9999 + 044408 9999 99 99 0 9999 99 9999 + 044409 9999 99 99 0 9999 99 9999 + 044410 9999 99 99 0 9999 99 9999 + 044411 9999 99 99 0 9999 99 9999 + 044412 9999 99 99 0 9999 99 9999 + 044413 9999 99 99 0 9999 99 9999 + 044414 9999 99 99 0 9999 99 9999 + 044415 9999 99 99 0 9999 99 9999 + 044416 9999 99 99 0 9999 99 9999 + 044417 9999 99 99 0 9999 99 9999 + 044418 9999 99 99 0 9999 99 9999 + 044419 9999 99 99 0 9999 99 9999 + 044420 9999 99 99 0 9999 99 9999 + 044421 9999 99 99 0 9999 99 9999 + 044422 9999 99 99 0 9999 99 9999 + 044423 9999 99 99 0 9999 99 9999 + 044424 9999 99 99 0 9999 99 9999 + 044425 9999 99 99 0 9999 99 9999 + 044426 9999 99 99 0 9999 99 9999 + 044427 9999 99 99 0 9999 99 9999 + 044428 9999 99 99 0 9999 99 9999 + 044429 9999 99 99 0 9999 99 9999 + 044430 9999 99 99 0 9999 99 9999 + 044431 9999 99 99 0 9999 99 9999 + 044432 9999 99 99 0 9999 99 9999 + 044433 9999 99 99 0 9999 99 9999 + 044434 9999 99 99 0 9999 99 9999 + 044435 9999 99 99 0 9999 99 9999 + 044436 9999 99 99 0 9999 99 9999 + 044437 9999 99 99 0 9999 99 9999 + 044438 9999 99 99 0 9999 99 9999 + 044439 9999 99 99 0 9999 99 9999 + 044440 9999 99 99 0 9999 99 9999 + 044441 9999 99 99 0 9999 99 9999 + 044442 9999 99 99 0 9999 99 9999 + 044443 9999 99 99 0 9999 99 9999 + 044444 9999 99 99 0 9999 99 9999 + 044445 9999 99 99 0 9999 99 9999 + 044446 9999 99 99 0 9999 99 9999 + 044447 9999 99 99 0 9999 99 9999 + 044448 9999 99 99 0 9999 99 9999 + 044449 9999 99 99 0 9999 99 9999 + 044450 9999 99 99 0 9999 99 9999 + 044451 9999 99 99 0 9999 99 9999 + 044452 9999 99 99 0 9999 99 9999 + 044453 9999 99 99 0 9999 99 9999 + 044454 9999 99 99 0 9999 99 9999 + 044455 9999 99 99 0 9999 99 9999 + 044456 9999 99 99 0 9999 99 9999 + 044457 9999 99 99 0 9999 99 9999 + 044458 9999 99 99 0 9999 99 9999 + 044459 9999 99 99 0 9999 99 9999 + 044460 9999 99 99 0 9999 99 9999 + 044461 9999 99 99 0 9999 99 9999 + 044462 9999 99 99 0 9999 99 9999 + 044463 9999 99 99 0 9999 99 9999 + 044464 9999 99 99 0 9999 99 9999 + 044465 9999 99 99 0 9999 99 9999 + 044466 9999 99 99 0 9999 99 9999 + 044467 9999 99 99 0 9999 99 9999 + 044468 9999 99 99 0 9999 99 9999 + 044469 9999 99 99 0 9999 99 9999 + 044470 9999 99 99 0 9999 99 9999 + 044471 9999 99 99 0 9999 99 9999 + 044472 9999 99 99 0 9999 99 9999 + 044473 9999 99 99 0 9999 99 9999 + 044474 9999 99 99 0 9999 99 9999 + 044475 9999 99 99 0 9999 99 9999 + 044476 9999 99 99 0 9999 99 9999 + 044477 9999 99 99 0 9999 99 9999 + 044478 9999 99 99 0 9999 99 9999 + 044479 9999 99 99 0 9999 99 9999 + 044480 9999 99 99 0 9999 99 9999 + 044481 9999 99 99 0 9999 99 9999 + 044482 9999 99 99 0 9999 99 9999 + 044483 9999 99 99 0 9999 99 9999 + 044484 9999 99 99 0 9999 99 9999 + 044485 9999 99 99 0 9999 99 9999 + 044486 9999 99 99 0 9999 99 9999 + 044487 9999 99 99 0 9999 99 9999 + 044488 9999 99 99 0 9999 99 9999 + 044489 9999 99 99 0 9999 99 9999 + 044490 9999 99 99 0 9999 99 9999 + 044491 9999 99 99 0 9999 99 9999 + 044492 9999 99 99 0 9999 99 9999 + 044493 9999 99 99 0 9999 99 9999 + 044494 9999 99 99 0 9999 99 9999 + 044495 9999 99 99 0 9999 99 9999 + 044496 9999 99 99 0 9999 99 9999 + 044497 9999 99 99 0 9999 99 9999 + 044498 9999 99 99 0 9999 99 9999 + 044499 9999 99 99 0 9999 99 9999 + 044500 9999 99 99 0 9999 99 9999 + 044501 9999 99 99 0 9999 99 9999 + 044502 9999 99 99 0 9999 99 9999 + 044503 9999 99 99 0 9999 99 9999 + 044504 9999 99 99 0 9999 99 9999 + 044505 9999 99 99 0 9999 99 9999 + 044506 9999 99 99 0 9999 99 9999 + 044507 9999 99 99 0 9999 99 9999 + 044508 9999 99 99 0 9999 99 9999 + 044509 9999 99 99 0 9999 99 9999 + 044510 9999 99 99 0 9999 99 9999 + 044511 9999 99 99 0 9999 99 9999 + 044512 9999 99 99 0 9999 99 9999 + 044513 9999 99 99 0 9999 99 9999 + 044514 9999 99 99 0 9999 99 9999 + 044515 9999 99 99 0 9999 99 9999 + 044516 9999 99 99 0 9999 99 9999 + 044517 9999 99 99 0 9999 99 9999 + 044518 9999 99 99 0 9999 99 9999 + 044519 9999 99 99 0 9999 99 9999 + 044520 9999 99 99 0 9999 99 9999 + 044521 9999 99 99 0 9999 99 9999 + 044522 9999 99 99 0 9999 99 9999 + 044523 9999 99 99 0 9999 99 9999 + 044524 9999 99 99 0 9999 99 9999 + 044525 9999 99 99 0 9999 99 9999 + 044526 9999 99 99 0 9999 99 9999 + 044527 9999 99 99 0 9999 99 9999 + 044528 9999 99 99 0 9999 99 9999 + 044529 9999 99 99 0 9999 99 9999 + 044530 9999 99 99 0 9999 99 9999 + 044531 9999 99 99 0 9999 99 9999 + 044532 9999 99 99 0 9999 99 9999 + 044533 9999 99 99 0 9999 99 9999 + 044534 9999 99 99 0 9999 99 9999 + 044535 9999 99 99 0 9999 99 9999 + 044536 9999 99 99 0 9999 99 9999 + 044537 9999 99 99 0 9999 99 9999 + 044538 9999 99 99 0 9999 99 9999 + 044539 9999 99 99 0 9999 99 9999 + 044540 9999 99 99 0 9999 99 9999 + 044541 9999 99 99 0 9999 99 9999 + 044542 9999 99 99 0 9999 99 9999 + 044543 9999 99 99 0 9999 99 9999 + 044544 9999 99 99 0 9999 99 9999 + 044545 9999 99 99 0 9999 99 9999 + 044546 9999 99 99 0 9999 99 9999 + 044547 9999 99 99 0 9999 99 9999 + 044548 9999 99 99 0 9999 99 9999 + 044549 9999 99 99 0 9999 99 9999 + 044550 9999 99 99 0 9999 99 9999 + 044551 9999 99 99 0 9999 99 9999 + 044552 9999 99 99 0 9999 99 9999 + 044553 9999 99 99 0 9999 99 9999 + 044554 9999 99 99 0 9999 99 9999 + 044555 9999 99 99 0 9999 99 9999 + 044556 9999 99 99 0 9999 99 9999 + 044557 9999 99 99 0 9999 99 9999 + 044558 9999 99 99 0 9999 99 9999 + 044559 9999 99 99 0 9999 99 9999 + 044560 9999 99 99 0 9999 99 9999 + 044561 9999 99 99 0 9999 99 9999 + 044562 9999 99 99 0 9999 99 9999 + 044563 9999 99 99 0 9999 99 9999 + 044564 9999 99 99 0 9999 99 9999 + 044565 9999 99 99 0 9999 99 9999 + 044566 9999 99 99 0 9999 99 9999 + 044567 9999 99 99 0 9999 99 9999 + 044568 9999 99 99 0 9999 99 9999 + 044569 9999 99 99 0 9999 99 9999 + 044570 9999 99 99 0 9999 99 9999 + 044571 9999 99 99 0 9999 99 9999 + 044572 9999 99 99 0 9999 99 9999 + 044573 9999 99 99 0 9999 99 9999 + 044574 9999 99 99 0 9999 99 9999 + 044575 9999 99 99 0 9999 99 9999 + 044576 9999 99 99 0 9999 99 9999 + 044577 9999 99 99 0 9999 99 9999 + 044578 9999 99 99 0 9999 99 9999 + 044579 9999 99 99 0 9999 99 9999 + 044580 9999 99 99 0 9999 99 9999 + 044581 9999 99 99 0 9999 99 9999 + 044582 9999 99 99 0 9999 99 9999 + 044583 9999 99 99 0 9999 99 9999 + 044584 9999 99 99 0 9999 99 9999 + 044585 9999 99 99 0 9999 99 9999 + 044586 9999 99 99 0 9999 99 9999 + 044587 9999 99 99 0 9999 99 9999 + 044588 9999 99 99 0 9999 99 9999 + 044589 9999 99 99 0 9999 99 9999 + 044590 9999 99 99 0 9999 99 9999 + 044591 9999 99 99 0 9999 99 9999 + 044592 9999 99 99 0 9999 99 9999 + 044593 9999 99 99 0 9999 99 9999 + 044594 9999 99 99 0 9999 99 9999 + 044595 9999 99 99 0 9999 99 9999 + 044596 9999 99 99 0 9999 99 9999 + 044597 9999 99 99 0 9999 99 9999 + 044598 9999 99 99 0 9999 99 9999 + 044599 9999 99 99 0 9999 99 9999 + 044600 9999 99 99 0 9999 99 9999 + 044601 9999 99 99 0 9999 99 9999 + 044602 9999 99 99 0 9999 99 9999 + 044603 9999 99 99 0 9999 99 9999 + 044604 9999 99 99 0 9999 99 9999 + 044605 9999 99 99 0 9999 99 9999 + 044606 9999 99 99 0 9999 99 9999 + 044607 9999 99 99 0 9999 99 9999 + 044608 9999 99 99 0 9999 99 9999 + 044609 9999 99 99 0 9999 99 9999 + 044610 9999 99 99 0 9999 99 9999 + 044611 9999 99 99 0 9999 99 9999 + 044612 9999 99 99 0 9999 99 9999 + 044613 9999 99 99 0 9999 99 9999 + 044614 9999 99 99 0 9999 99 9999 + 044615 9999 99 99 0 9999 99 9999 + 044616 9999 99 99 0 9999 99 9999 + 044617 9999 99 99 0 9999 99 9999 + 044618 9999 99 99 0 9999 99 9999 + 044619 9999 99 99 0 9999 99 9999 + 044620 9999 99 99 0 9999 99 9999 + 044621 9999 99 99 0 9999 99 9999 + 044622 9999 99 99 0 9999 99 9999 + 044623 9999 99 99 0 9999 99 9999 + 044624 9999 99 99 0 9999 99 9999 + 044625 9999 99 99 0 9999 99 9999 + 044626 9999 99 99 0 9999 99 9999 + 044627 9999 99 99 0 9999 99 9999 + 044628 9999 99 99 0 9999 99 9999 + 044629 9999 99 99 0 9999 99 9999 + 044630 9999 99 99 0 9999 99 9999 + 044631 9999 99 99 0 9999 99 9999 + 044632 9999 99 99 0 9999 99 9999 + 044633 9999 99 99 0 9999 99 9999 + 044634 9999 99 99 0 9999 99 9999 + 044635 9999 99 99 0 9999 99 9999 + 044636 9999 99 99 0 9999 99 9999 + 044637 9999 99 99 0 9999 99 9999 + 044638 9999 99 99 0 9999 99 9999 + 044639 9999 99 99 0 9999 99 9999 + 044640 9999 99 99 0 9999 99 9999 + 044641 9999 99 99 0 9999 99 9999 + 044642 9999 99 99 0 9999 99 9999 + 044643 9999 99 99 0 9999 99 9999 + 044644 9999 99 99 0 9999 99 9999 + 044645 9999 99 99 0 9999 99 9999 + 044646 9999 99 99 0 9999 99 9999 + 044647 9999 99 99 0 9999 99 9999 + 044648 9999 99 99 0 9999 99 9999 + 044649 9999 99 99 0 9999 99 9999 + 044650 9999 99 99 0 9999 99 9999 + 044651 9999 99 99 0 9999 99 9999 + 044652 9999 99 99 0 9999 99 9999 + 044653 9999 99 99 0 9999 99 9999 + 044654 9999 99 99 0 9999 99 9999 + 044655 9999 99 99 0 9999 99 9999 + 044656 9999 99 99 0 9999 99 9999 + 044657 9999 99 99 0 9999 99 9999 + 044658 9999 99 99 0 9999 99 9999 + 044659 9999 99 99 0 9999 99 9999 + 044660 9999 99 99 0 9999 99 9999 + 044661 9999 99 99 0 9999 99 9999 + 044662 9999 99 99 0 9999 99 9999 + 044663 9999 99 99 0 9999 99 9999 + 044664 9999 99 99 0 9999 99 9999 + 044665 9999 99 99 0 9999 99 9999 + 044666 9999 99 99 0 9999 99 9999 + 044667 9999 99 99 0 9999 99 9999 + 044668 9999 99 99 0 9999 99 9999 + 044669 9999 99 99 0 9999 99 9999 + 044670 9999 99 99 0 9999 99 9999 + 044671 9999 99 99 0 9999 99 9999 + 044672 9999 99 99 0 9999 99 9999 + 044673 9999 99 99 0 9999 99 9999 + 044674 9999 99 99 0 9999 99 9999 + 044675 9999 99 99 0 9999 99 9999 + 044676 9999 99 99 0 9999 99 9999 + 044677 9999 99 99 0 9999 99 9999 + 044678 9999 99 99 0 9999 99 9999 + 044679 9999 99 99 0 9999 99 9999 + 044680 9999 99 99 0 9999 99 9999 + 044681 9999 99 99 0 9999 99 9999 + 044682 9999 99 99 0 9999 99 9999 + 044683 9999 99 99 0 9999 99 9999 + 044684 9999 99 99 0 9999 99 9999 + 044685 9999 99 99 0 9999 99 9999 + 044686 9999 99 99 0 9999 99 9999 + 044687 9999 99 99 0 9999 99 9999 + 044688 9999 99 99 0 9999 99 9999 + 044689 9999 99 99 0 9999 99 9999 + 044690 9999 99 99 0 9999 99 9999 + 044691 9999 99 99 0 9999 99 9999 + 044692 9999 99 99 0 9999 99 9999 + 044693 9999 99 99 0 9999 99 9999 + 044694 9999 99 99 0 9999 99 9999 + 044695 9999 99 99 0 9999 99 9999 + 044696 9999 99 99 0 9999 99 9999 + 044697 9999 99 99 0 9999 99 9999 + 044698 9999 99 99 0 9999 99 9999 + 044699 9999 99 99 0 9999 99 9999 + 044700 9999 99 99 0 9999 99 9999 + 044701 9999 99 99 0 9999 99 9999 + 044702 9999 99 99 0 9999 99 9999 + 044703 9999 99 99 0 9999 99 9999 + 044704 9999 99 99 0 9999 99 9999 + 044705 9999 99 99 0 9999 99 9999 + 044706 9999 99 99 0 9999 99 9999 + 044707 9999 99 99 0 9999 99 9999 + 044708 9999 99 99 0 9999 99 9999 + 044709 9999 99 99 0 9999 99 9999 + 044710 9999 99 99 0 9999 99 9999 + 044711 9999 99 99 0 9999 99 9999 + 044712 9999 99 99 0 9999 99 9999 + 044713 9999 99 99 0 9999 99 9999 + 044714 9999 99 99 0 9999 99 9999 + 044715 9999 99 99 0 9999 99 9999 + 044716 9999 99 99 0 9999 99 9999 + 044717 9999 99 99 0 9999 99 9999 + 044718 9999 99 99 0 9999 99 9999 + 044719 9999 99 99 0 9999 99 9999 + 044720 9999 99 99 0 9999 99 9999 + 044721 9999 99 99 0 9999 99 9999 + 044722 9999 99 99 0 9999 99 9999 + 044723 9999 99 99 0 9999 99 9999 + 044724 9999 99 99 0 9999 99 9999 + 044725 9999 99 99 0 9999 99 9999 + 044726 9999 99 99 0 9999 99 9999 + 044727 9999 99 99 0 9999 99 9999 + 044728 9999 99 99 0 9999 99 9999 + 044729 9999 99 99 0 9999 99 9999 + 044730 9999 99 99 0 9999 99 9999 + 044731 9999 99 99 0 9999 99 9999 + 044732 9999 99 99 0 9999 99 9999 + 044733 9999 99 99 0 9999 99 9999 + 044734 9999 99 99 0 9999 99 9999 + 044735 9999 99 99 0 9999 99 9999 + 044736 9999 99 99 0 9999 99 9999 + 044737 9999 99 99 0 9999 99 9999 + 044738 9999 99 99 0 9999 99 9999 + 044739 9999 99 99 0 9999 99 9999 + 044740 9999 99 99 0 9999 99 9999 + 044741 9999 99 99 0 9999 99 9999 + 044742 9999 99 99 0 9999 99 9999 + 044743 9999 99 99 0 9999 99 9999 + 044744 9999 99 99 0 9999 99 9999 + 044745 9999 99 99 0 9999 99 9999 + 044746 9999 99 99 0 9999 99 9999 + 044747 9999 99 99 0 9999 99 9999 + 044748 9999 99 99 0 9999 99 9999 + 044749 9999 99 99 0 9999 99 9999 + 044750 9999 99 99 0 9999 99 9999 + 044751 9999 99 99 0 9999 99 9999 + 044752 9999 99 99 0 9999 99 9999 + 044753 9999 99 99 0 9999 99 9999 + 044754 9999 99 99 0 9999 99 9999 + 044755 9999 99 99 0 9999 99 9999 + 044756 9999 99 99 0 9999 99 9999 + 044757 9999 99 99 0 9999 99 9999 + 044758 9999 99 99 0 9999 99 9999 + 044759 9999 99 99 0 9999 99 9999 + 044760 9999 99 99 0 9999 99 9999 + 044761 9999 99 99 0 9999 99 9999 + 044762 9999 99 99 0 9999 99 9999 + 044763 9999 99 99 0 9999 99 9999 + 044764 9999 99 99 0 9999 99 9999 + 044765 9999 99 99 0 9999 99 9999 + 044766 9999 99 99 0 9999 99 9999 + 044767 9999 99 99 0 9999 99 9999 + 044768 9999 99 99 0 9999 99 9999 + 044769 9999 99 99 0 9999 99 9999 + 044770 9999 99 99 0 9999 99 9999 + 044771 9999 99 99 0 9999 99 9999 + 044772 9999 99 99 0 9999 99 9999 + 044773 9999 99 99 0 9999 99 9999 + 044774 9999 99 99 0 9999 99 9999 + 044775 9999 99 99 0 9999 99 9999 + 044776 9999 99 99 0 9999 99 9999 + 044777 9999 99 99 0 9999 99 9999 + 044778 9999 99 99 0 9999 99 9999 + 044779 9999 99 99 0 9999 99 9999 + 044780 9999 99 99 0 9999 99 9999 + 044781 9999 99 99 0 9999 99 9999 + 044782 9999 99 99 0 9999 99 9999 + 044783 9999 99 99 0 9999 99 9999 + 044784 9999 99 99 0 9999 99 9999 + 044785 9999 99 99 0 9999 99 9999 + 044786 9999 99 99 0 9999 99 9999 + 044787 9999 99 99 0 9999 99 9999 + 044788 9999 99 99 0 9999 99 9999 + 044789 9999 99 99 0 9999 99 9999 + 044790 9999 99 99 0 9999 99 9999 + 044791 9999 99 99 0 9999 99 9999 + 044792 9999 99 99 0 9999 99 9999 + 044793 9999 99 99 0 9999 99 9999 + 044794 9999 99 99 0 9999 99 9999 + 044795 9999 99 99 0 9999 99 9999 + 044796 9999 99 99 0 9999 99 9999 + 044797 9999 99 99 0 9999 99 9999 + 044798 9999 99 99 0 9999 99 9999 + 044799 9999 99 99 0 9999 99 9999 + 044800 9999 99 99 0 9999 99 9999 + 044801 9999 99 99 0 9999 99 9999 + 044802 9999 99 99 0 9999 99 9999 + 044803 9999 99 99 0 9999 99 9999 + 044804 9999 99 99 0 9999 99 9999 + 044805 9999 99 99 0 9999 99 9999 + 044806 9999 99 99 0 9999 99 9999 + 044807 9999 99 99 0 9999 99 9999 + 044808 9999 99 99 0 9999 99 9999 + 044809 9999 99 99 0 9999 99 9999 + 044810 9999 99 99 0 9999 99 9999 + 044811 9999 99 99 0 9999 99 9999 + 044812 9999 99 99 0 9999 99 9999 + 044813 9999 99 99 0 9999 99 9999 + 044814 9999 99 99 0 9999 99 9999 + 044815 9999 99 99 0 9999 99 9999 + 044816 9999 99 99 0 9999 99 9999 + 044817 9999 99 99 0 9999 99 9999 + 044818 9999 99 99 0 9999 99 9999 + 044819 9999 99 99 0 9999 99 9999 + 044820 9999 99 99 0 9999 99 9999 + 044821 9999 99 99 0 9999 99 9999 + 044822 9999 99 99 0 9999 99 9999 + 044823 9999 99 99 0 9999 99 9999 + 044824 9999 99 99 0 9999 99 9999 + 044825 9999 99 99 0 9999 99 9999 + 044826 9999 99 99 0 9999 99 9999 + 044827 9999 99 99 0 9999 99 9999 + 044828 9999 99 99 0 9999 99 9999 + 044829 9999 99 99 0 9999 99 9999 + 044830 9999 99 99 0 9999 99 9999 + 044831 9999 99 99 0 9999 99 9999 + 044832 9999 99 99 0 9999 99 9999 + 044833 9999 99 99 0 9999 99 9999 + 044834 9999 99 99 0 9999 99 9999 + 044835 9999 99 99 0 9999 99 9999 + 044836 9999 99 99 0 9999 99 9999 + 044837 9999 99 99 0 9999 99 9999 + 044838 9999 99 99 0 9999 99 9999 + 044839 9999 99 99 0 9999 99 9999 + 044840 9999 99 99 0 9999 99 9999 + 044841 9999 99 99 0 9999 99 9999 + 044842 9999 99 99 0 9999 99 9999 + 044843 9999 99 99 0 9999 99 9999 + 044844 9999 99 99 0 9999 99 9999 + 044845 9999 99 99 0 9999 99 9999 + 044846 9999 99 99 0 9999 99 9999 + 044847 9999 99 99 0 9999 99 9999 + 044848 9999 99 99 0 9999 99 9999 + 044849 9999 99 99 0 9999 99 9999 + 044850 9999 99 99 0 9999 99 9999 + 044851 9999 99 99 0 9999 99 9999 + 044852 9999 99 99 0 9999 99 9999 + 044853 9999 99 99 0 9999 99 9999 + 044854 9999 99 99 0 9999 99 9999 + 044855 9999 99 99 0 9999 99 9999 + 044856 9999 99 99 0 9999 99 9999 + 044857 9999 99 99 0 9999 99 9999 + 044858 9999 99 99 0 9999 99 9999 + 044859 9999 99 99 0 9999 99 9999 + 044860 9999 99 99 0 9999 99 9999 + 044861 9999 99 99 0 9999 99 9999 + 044862 9999 99 99 0 9999 99 9999 + 044863 9999 99 99 0 9999 99 9999 + 044864 9999 99 99 0 9999 99 9999 + 044865 9999 99 99 0 9999 99 9999 + 044866 9999 99 99 0 9999 99 9999 + 044867 9999 99 99 0 9999 99 9999 + 044868 9999 99 99 0 9999 99 9999 + 044869 9999 99 99 0 9999 99 9999 + 044870 9999 99 99 0 9999 99 9999 + 044871 9999 99 99 0 9999 99 9999 + 044872 9999 99 99 0 9999 99 9999 + 044873 9999 99 99 0 9999 99 9999 + 044874 9999 99 99 0 9999 99 9999 + 044875 9999 99 99 0 9999 99 9999 + 044876 9999 99 99 0 9999 99 9999 + 044877 9999 99 99 0 9999 99 9999 + 044878 9999 99 99 0 9999 99 9999 + 044879 9999 99 99 0 9999 99 9999 + 044880 9999 99 99 0 9999 99 9999 + 044881 9999 99 99 0 9999 99 9999 + 044882 9999 99 99 0 9999 99 9999 + 044883 9999 99 99 0 9999 99 9999 + 044884 9999 99 99 0 9999 99 9999 + 044885 9999 99 99 0 9999 99 9999 + 044886 9999 99 99 0 9999 99 9999 + 044887 9999 99 99 0 9999 99 9999 + 044888 9999 99 99 0 9999 99 9999 + 044889 9999 99 99 0 9999 99 9999 + 044890 9999 99 99 0 9999 99 9999 + 044891 9999 99 99 0 9999 99 9999 + 044892 9999 99 99 0 9999 99 9999 + 044893 9999 99 99 0 9999 99 9999 + 044894 9999 99 99 0 9999 99 9999 + 044895 9999 99 99 0 9999 99 9999 + 044896 9999 99 99 0 9999 99 9999 + 044897 9999 99 99 0 9999 99 9999 + 044898 9999 99 99 0 9999 99 9999 + 044899 9999 99 99 0 9999 99 9999 + 044900 9999 99 99 0 9999 99 9999 + 044901 9999 99 99 0 9999 99 9999 + 044902 9999 99 99 0 9999 99 9999 + 044903 9999 99 99 0 9999 99 9999 + 044904 9999 99 99 0 9999 99 9999 + 044905 9999 99 99 0 9999 99 9999 + 044906 9999 99 99 0 9999 99 9999 + 044907 9999 99 99 0 9999 99 9999 + 044908 9999 99 99 0 9999 99 9999 + 044909 9999 99 99 0 9999 99 9999 + 044910 9999 99 99 0 9999 99 9999 + 044911 9999 99 99 0 9999 99 9999 + 044912 9999 99 99 0 9999 99 9999 + 044913 9999 99 99 0 9999 99 9999 + 044914 9999 99 99 0 9999 99 9999 + 044915 9999 99 99 0 9999 99 9999 + 044916 9999 99 99 0 9999 99 9999 + 044917 9999 99 99 0 9999 99 9999 + 044918 9999 99 99 0 9999 99 9999 + 044919 9999 99 99 0 9999 99 9999 + 044920 9999 99 99 0 9999 99 9999 + 044921 9999 99 99 0 9999 99 9999 + 044922 9999 99 99 0 9999 99 9999 + 044923 9999 99 99 0 9999 99 9999 + 044924 9999 99 99 0 9999 99 9999 + 044925 9999 99 99 0 9999 99 9999 + 044926 9999 99 99 0 9999 99 9999 + 044927 9999 99 99 0 9999 99 9999 + 044928 9999 99 99 0 9999 99 9999 + 044929 9999 99 99 0 9999 99 9999 + 044930 9999 99 99 0 9999 99 9999 + 044931 9999 99 99 0 9999 99 9999 + 044932 9999 99 99 0 9999 99 9999 + 044933 9999 99 99 0 9999 99 9999 + 044934 9999 99 99 0 9999 99 9999 + 044935 9999 99 99 0 9999 99 9999 + 044936 9999 99 99 0 9999 99 9999 + 044937 9999 99 99 0 9999 99 9999 + 044938 9999 99 99 0 9999 99 9999 + 044939 9999 99 99 0 9999 99 9999 + 044940 9999 99 99 0 9999 99 9999 + 044941 9999 99 99 0 9999 99 9999 + 044942 9999 99 99 0 9999 99 9999 + 044943 9999 99 99 0 9999 99 9999 + 044944 9999 99 99 0 9999 99 9999 + 044945 9999 99 99 0 9999 99 9999 + 044946 9999 99 99 0 9999 99 9999 + 044947 9999 99 99 0 9999 99 9999 + 044948 9999 99 99 0 9999 99 9999 + 044949 9999 99 99 0 9999 99 9999 + 044950 9999 99 99 0 9999 99 9999 + 044951 9999 99 99 0 9999 99 9999 + 044952 9999 99 99 0 9999 99 9999 + 044953 9999 99 99 0 9999 99 9999 + 044954 9999 99 99 0 9999 99 9999 + 044955 9999 99 99 0 9999 99 9999 + 044956 9999 99 99 0 9999 99 9999 + 044957 9999 99 99 0 9999 99 9999 + 044958 9999 99 99 0 9999 99 9999 + 044959 9999 99 99 0 9999 99 9999 + 044960 9999 99 99 0 9999 99 9999 + 044961 9999 99 99 0 9999 99 9999 + 044962 9999 99 99 0 9999 99 9999 + 044963 9999 99 99 0 9999 99 9999 + 044964 9999 99 99 0 9999 99 9999 + 044965 9999 99 99 0 9999 99 9999 + 044966 9999 99 99 0 9999 99 9999 + 044967 9999 99 99 0 9999 99 9999 + 044968 9999 99 99 0 9999 99 9999 + 044969 9999 99 99 0 9999 99 9999 + 044970 9999 99 99 0 9999 99 9999 + 044971 9999 99 99 0 9999 99 9999 + 044972 9999 99 99 0 9999 99 9999 + 044973 9999 99 99 0 9999 99 9999 + 044974 9999 99 99 0 9999 99 9999 + 044975 9999 99 99 0 9999 99 9999 + 044976 9999 99 99 0 9999 99 9999 + 044977 9999 99 99 0 9999 99 9999 + 044978 9999 99 99 0 9999 99 9999 + 044979 9999 99 99 0 9999 99 9999 + 044980 9999 99 99 0 9999 99 9999 + 044981 9999 99 99 0 9999 99 9999 + 044982 9999 99 99 0 9999 99 9999 + 044983 9999 99 99 0 9999 99 9999 + 044984 9999 99 99 0 9999 99 9999 + 044985 9999 99 99 0 9999 99 9999 + 044986 9999 99 99 0 9999 99 9999 + 044987 9999 99 99 0 9999 99 9999 + 044988 9999 99 99 0 9999 99 9999 + 044989 9999 99 99 0 9999 99 9999 + 044990 9999 99 99 0 9999 99 9999 + 044991 9999 99 99 0 9999 99 9999 + 044992 9999 99 99 0 9999 99 9999 + 044993 9999 99 99 0 9999 99 9999 + 044994 9999 99 99 0 9999 99 9999 + 044995 9999 99 99 0 9999 99 9999 + 044996 9999 99 99 0 9999 99 9999 + 044997 9999 99 99 0 9999 99 9999 + 044998 9999 99 99 0 9999 99 9999 + 044999 9999 99 99 0 9999 99 9999 + 045000 9999 99 99 0 9999 99 9999 + 045001 9999 99 99 0 9999 99 9999 + 045002 9999 99 99 0 9999 99 9999 + 045003 9999 99 99 0 9999 99 9999 + 045004 9999 99 99 0 9999 99 9999 + 045005 9999 99 99 0 9999 99 9999 + 045006 9999 99 99 0 9999 99 9999 + 045007 9999 99 99 0 9999 99 9999 + 045008 9999 99 99 0 9999 99 9999 + 045009 9999 99 99 0 9999 99 9999 + 045010 9999 99 99 0 9999 99 9999 + 045011 9999 99 99 0 9999 99 9999 + 045012 9999 99 99 0 9999 99 9999 + 045013 9999 99 99 0 9999 99 9999 + 045014 9999 99 99 0 9999 99 9999 + 045015 9999 99 99 0 9999 99 9999 + 045016 9999 99 99 0 9999 99 9999 + 045017 9999 99 99 0 9999 99 9999 + 045018 9999 99 99 0 9999 99 9999 + 045019 9999 99 99 0 9999 99 9999 + 045020 9999 99 99 0 9999 99 9999 + 045021 9999 99 99 0 9999 99 9999 + 045022 9999 99 99 0 9999 99 9999 + 045023 9999 99 99 0 9999 99 9999 + 045024 9999 99 99 0 9999 99 9999 + 045025 9999 99 99 0 9999 99 9999 + 045026 9999 99 99 0 9999 99 9999 + 045027 9999 99 99 0 9999 99 9999 + 045028 9999 99 99 0 9999 99 9999 + 045029 9999 99 99 0 9999 99 9999 + 045030 9999 99 99 0 9999 99 9999 + 045031 9999 99 99 0 9999 99 9999 + 045032 9999 99 99 0 9999 99 9999 + 045033 9999 99 99 0 9999 99 9999 + 045034 9999 99 99 0 9999 99 9999 + 045035 9999 99 99 0 9999 99 9999 + 045036 9999 99 99 0 9999 99 9999 + 045037 9999 99 99 0 9999 99 9999 + 045038 9999 99 99 0 9999 99 9999 + 045039 9999 99 99 0 9999 99 9999 + 045040 9999 99 99 0 9999 99 9999 + 045041 9999 99 99 0 9999 99 9999 + 045042 9999 99 99 0 9999 99 9999 + 045043 9999 99 99 0 9999 99 9999 + 045044 9999 99 99 0 9999 99 9999 + 045045 9999 99 99 0 9999 99 9999 + 045046 9999 99 99 0 9999 99 9999 + 045047 9999 99 99 0 9999 99 9999 + 045048 9999 99 99 0 9999 99 9999 + 045049 9999 99 99 0 9999 99 9999 + 045050 9999 99 99 0 9999 99 9999 + 045051 9999 99 99 0 9999 99 9999 + 045052 9999 99 99 0 9999 99 9999 + 045053 9999 99 99 0 9999 99 9999 + 045054 9999 99 99 0 9999 99 9999 + 045055 9999 99 99 0 9999 99 9999 + 045056 9999 99 99 0 9999 99 9999 + 045057 9999 99 99 0 9999 99 9999 + 045058 9999 99 99 0 9999 99 9999 + 045059 9999 99 99 0 9999 99 9999 + 045060 9999 99 99 0 9999 99 9999 + 045061 9999 99 99 0 9999 99 9999 + 045062 9999 99 99 0 9999 99 9999 + 045063 9999 99 99 0 9999 99 9999 + 045064 9999 99 99 0 9999 99 9999 + 045065 9999 99 99 0 9999 99 9999 + 045066 9999 99 99 0 9999 99 9999 + 045067 9999 99 99 0 9999 99 9999 + 045068 9999 99 99 0 9999 99 9999 + 045069 9999 99 99 0 9999 99 9999 + 045070 9999 99 99 0 9999 99 9999 + 045071 9999 99 99 0 9999 99 9999 + 045072 9999 99 99 0 9999 99 9999 + 045073 9999 99 99 0 9999 99 9999 + 045074 9999 99 99 0 9999 99 9999 + 045075 9999 99 99 0 9999 99 9999 + 045076 9999 99 99 0 9999 99 9999 + 045077 9999 99 99 0 9999 99 9999 + 045078 9999 99 99 0 9999 99 9999 + 045079 9999 99 99 0 9999 99 9999 + 045080 9999 99 99 0 9999 99 9999 + 045081 9999 99 99 0 9999 99 9999 + 045082 9999 99 99 0 9999 99 9999 + 045083 9999 99 99 0 9999 99 9999 + 045084 9999 99 99 0 9999 99 9999 + 045085 9999 99 99 0 9999 99 9999 + 045086 9999 99 99 0 9999 99 9999 + 045087 9999 99 99 0 9999 99 9999 + 045088 9999 99 99 0 9999 99 9999 + 045089 9999 99 99 0 9999 99 9999 + 045090 9999 99 99 0 9999 99 9999 + 045091 9999 99 99 0 9999 99 9999 + 045092 9999 99 99 0 9999 99 9999 + 045093 9999 99 99 0 9999 99 9999 + 045094 9999 99 99 0 9999 99 9999 + 045095 9999 99 99 0 9999 99 9999 + 045096 9999 99 99 0 9999 99 9999 + 045097 9999 99 99 0 9999 99 9999 + 045098 9999 99 99 0 9999 99 9999 + 045099 9999 99 99 0 9999 99 9999 + 045100 9999 99 99 0 9999 99 9999 + 045101 9999 99 99 0 9999 99 9999 + 045102 9999 99 99 0 9999 99 9999 + 045103 9999 99 99 0 9999 99 9999 + 045104 9999 99 99 0 9999 99 9999 + 045105 9999 99 99 0 9999 99 9999 + 045106 9999 99 99 0 9999 99 9999 + 045107 9999 99 99 0 9999 99 9999 + 045108 9999 99 99 0 9999 99 9999 + 045109 9999 99 99 0 9999 99 9999 + 045110 9999 99 99 0 9999 99 9999 + 045111 9999 99 99 0 9999 99 9999 + 045112 9999 99 99 0 9999 99 9999 + 045113 9999 99 99 0 9999 99 9999 + 045114 9999 99 99 0 9999 99 9999 + 045115 9999 99 99 0 9999 99 9999 + 045116 9999 99 99 0 9999 99 9999 + 045117 9999 99 99 0 9999 99 9999 + 045118 9999 99 99 0 9999 99 9999 + 045119 9999 99 99 0 9999 99 9999 + 045120 9999 99 99 0 9999 99 9999 + 045121 9999 99 99 0 9999 99 9999 + 045122 9999 99 99 0 9999 99 9999 + 045123 9999 99 99 0 9999 99 9999 + 045124 9999 99 99 0 9999 99 9999 + 045125 9999 99 99 0 9999 99 9999 + 045126 9999 99 99 0 9999 99 9999 + 045127 9999 99 99 0 9999 99 9999 + 045128 9999 99 99 0 9999 99 9999 + 045129 9999 99 99 0 9999 99 9999 + 045130 9999 99 99 0 9999 99 9999 + 045131 9999 99 99 0 9999 99 9999 + 045132 9999 99 99 0 9999 99 9999 + 045133 9999 99 99 0 9999 99 9999 + 045134 9999 99 99 0 9999 99 9999 + 045135 9999 99 99 0 9999 99 9999 + 045136 9999 99 99 0 9999 99 9999 + 045137 9999 99 99 0 9999 99 9999 + 045138 9999 99 99 0 9999 99 9999 + 045139 9999 99 99 0 9999 99 9999 + 045140 9999 99 99 0 9999 99 9999 + 045141 9999 99 99 0 9999 99 9999 + 045142 9999 99 99 0 9999 99 9999 + 045143 9999 99 99 0 9999 99 9999 + 045144 9999 99 99 0 9999 99 9999 + 045145 9999 99 99 0 9999 99 9999 + 045146 9999 99 99 0 9999 99 9999 + 045147 9999 99 99 0 9999 99 9999 + 045148 9999 99 99 0 9999 99 9999 + 045149 9999 99 99 0 9999 99 9999 + 045150 9999 99 99 0 9999 99 9999 + 045151 9999 99 99 0 9999 99 9999 + 045152 9999 99 99 0 9999 99 9999 + 045153 9999 99 99 0 9999 99 9999 + 045154 9999 99 99 0 9999 99 9999 + 045155 9999 99 99 0 9999 99 9999 + 045156 9999 99 99 0 9999 99 9999 + 045157 9999 99 99 0 9999 99 9999 + 045158 9999 99 99 0 9999 99 9999 + 045159 9999 99 99 0 9999 99 9999 + 045160 9999 99 99 0 9999 99 9999 + 045161 9999 99 99 0 9999 99 9999 + 045162 9999 99 99 0 9999 99 9999 + 045163 9999 99 99 0 9999 99 9999 + 045164 9999 99 99 0 9999 99 9999 + 045165 9999 99 99 0 9999 99 9999 + 045166 9999 99 99 0 9999 99 9999 + 045167 9999 99 99 0 9999 99 9999 + 045168 9999 99 99 0 9999 99 9999 + 045169 9999 99 99 0 9999 99 9999 + 045170 9999 99 99 0 9999 99 9999 + 045171 9999 99 99 0 9999 99 9999 + 045172 9999 99 99 0 9999 99 9999 + 045173 9999 99 99 0 9999 99 9999 + 045174 9999 99 99 0 9999 99 9999 + 045175 9999 99 99 0 9999 99 9999 + 045176 9999 99 99 0 9999 99 9999 + 045177 9999 99 99 0 9999 99 9999 + 045178 9999 99 99 0 9999 99 9999 + 045179 9999 99 99 0 9999 99 9999 + 045180 9999 99 99 0 9999 99 9999 + 045181 9999 99 99 0 9999 99 9999 + 045182 9999 99 99 0 9999 99 9999 + 045183 9999 99 99 0 9999 99 9999 + 045184 9999 99 99 0 9999 99 9999 + 045185 9999 99 99 0 9999 99 9999 + 045186 9999 99 99 0 9999 99 9999 + 045187 9999 99 99 0 9999 99 9999 + 045188 9999 99 99 0 9999 99 9999 + 045189 9999 99 99 0 9999 99 9999 + 045190 9999 99 99 0 9999 99 9999 + 045191 9999 99 99 0 9999 99 9999 + 045192 9999 99 99 0 9999 99 9999 + 045193 9999 99 99 0 9999 99 9999 + 045194 9999 99 99 0 9999 99 9999 + 045195 9999 99 99 0 9999 99 9999 + 045196 9999 99 99 0 9999 99 9999 + 045197 9999 99 99 0 9999 99 9999 + 045198 9999 99 99 0 9999 99 9999 + 045199 9999 99 99 0 9999 99 9999 + 045200 9999 99 99 0 9999 99 9999 + 045201 9999 99 99 0 9999 99 9999 + 045202 9999 99 99 0 9999 99 9999 + 045203 9999 99 99 0 9999 99 9999 + 045204 9999 99 99 0 9999 99 9999 + 045205 9999 99 99 0 9999 99 9999 + 045206 9999 99 99 0 9999 99 9999 + 045207 9999 99 99 0 9999 99 9999 + 045208 9999 99 99 0 9999 99 9999 + 045209 9999 99 99 0 9999 99 9999 + 045210 9999 99 99 0 9999 99 9999 + 045211 9999 99 99 0 9999 99 9999 + 045212 9999 99 99 0 9999 99 9999 + 045213 9999 99 99 0 9999 99 9999 + 045214 9999 99 99 0 9999 99 9999 + 045215 9999 99 99 0 9999 99 9999 + 045216 9999 99 99 0 9999 99 9999 + 045217 9999 99 99 0 9999 99 9999 + 045218 9999 99 99 0 9999 99 9999 + 045219 9999 99 99 0 9999 99 9999 + 045220 9999 99 99 0 9999 99 9999 + 045221 9999 99 99 0 9999 99 9999 + 045222 9999 99 99 0 9999 99 9999 + 045223 9999 99 99 0 9999 99 9999 + 045224 9999 99 99 0 9999 99 9999 + 045225 9999 99 99 0 9999 99 9999 + 045226 9999 99 99 0 9999 99 9999 + 045227 9999 99 99 0 9999 99 9999 + 045228 9999 99 99 0 9999 99 9999 + 045229 9999 99 99 0 9999 99 9999 + 045230 9999 99 99 0 9999 99 9999 + 045231 9999 99 99 0 9999 99 9999 + 045232 9999 99 99 0 9999 99 9999 + 045233 9999 99 99 0 9999 99 9999 + 045234 9999 99 99 0 9999 99 9999 + 045235 9999 99 99 0 9999 99 9999 + 045236 9999 99 99 0 9999 99 9999 + 045237 9999 99 99 0 9999 99 9999 + 045238 9999 99 99 0 9999 99 9999 + 045239 9999 99 99 0 9999 99 9999 + 045240 9999 99 99 0 9999 99 9999 + 045241 9999 99 99 0 9999 99 9999 + 045242 9999 99 99 0 9999 99 9999 + 045243 9999 99 99 0 9999 99 9999 + 045244 9999 99 99 0 9999 99 9999 + 045245 9999 99 99 0 9999 99 9999 + 045246 9999 99 99 0 9999 99 9999 + 045247 9999 99 99 0 9999 99 9999 + 045248 9999 99 99 0 9999 99 9999 + 045249 9999 99 99 0 9999 99 9999 + 045250 9999 99 99 0 9999 99 9999 + 045251 9999 99 99 0 9999 99 9999 + 045252 9999 99 99 0 9999 99 9999 + 045253 9999 99 99 0 9999 99 9999 + 045254 9999 99 99 0 9999 99 9999 + 045255 9999 99 99 0 9999 99 9999 + 045256 9999 99 99 0 9999 99 9999 + 045257 9999 99 99 0 9999 99 9999 + 045258 9999 99 99 0 9999 99 9999 + 045259 9999 99 99 0 9999 99 9999 + 045260 9999 99 99 0 9999 99 9999 + 045261 9999 99 99 0 9999 99 9999 + 045262 9999 99 99 0 9999 99 9999 + 045263 9999 99 99 0 9999 99 9999 + 045264 9999 99 99 0 9999 99 9999 + 045265 9999 99 99 0 9999 99 9999 + 045266 9999 99 99 0 9999 99 9999 + 045267 9999 99 99 0 9999 99 9999 + 045268 9999 99 99 0 9999 99 9999 + 045269 9999 99 99 0 9999 99 9999 + 045270 9999 99 99 0 9999 99 9999 + 045271 9999 99 99 0 9999 99 9999 + 045272 9999 99 99 0 9999 99 9999 + 045273 9999 99 99 0 9999 99 9999 + 045274 9999 99 99 0 9999 99 9999 + 045275 9999 99 99 0 9999 99 9999 + 045276 9999 99 99 0 9999 99 9999 + 045277 9999 99 99 0 9999 99 9999 + 045278 9999 99 99 0 9999 99 9999 + 045279 9999 99 99 0 9999 99 9999 + 045280 9999 99 99 0 9999 99 9999 + 045281 9999 99 99 0 9999 99 9999 + 045282 9999 99 99 0 9999 99 9999 + 045283 9999 99 99 0 9999 99 9999 + 045284 9999 99 99 0 9999 99 9999 + 045285 9999 99 99 0 9999 99 9999 + 045286 9999 99 99 0 9999 99 9999 + 045287 9999 99 99 0 9999 99 9999 + 045288 9999 99 99 0 9999 99 9999 + 045289 9999 99 99 0 9999 99 9999 + 045290 9999 99 99 0 9999 99 9999 + 045291 9999 99 99 0 9999 99 9999 + 045292 9999 99 99 0 9999 99 9999 + 045293 9999 99 99 0 9999 99 9999 + 045294 9999 99 99 0 9999 99 9999 + 045295 9999 99 99 0 9999 99 9999 + 045296 9999 99 99 0 9999 99 9999 + 045297 9999 99 99 0 9999 99 9999 + 045298 9999 99 99 0 9999 99 9999 + 045299 9999 99 99 0 9999 99 9999 + 045300 9999 99 99 0 9999 99 9999 + 045301 9999 99 99 0 9999 99 9999 + 045302 9999 99 99 0 9999 99 9999 + 045303 9999 99 99 0 9999 99 9999 + 045304 9999 99 99 0 9999 99 9999 + 045305 9999 99 99 0 9999 99 9999 + 045306 9999 99 99 0 9999 99 9999 + 045307 9999 99 99 0 9999 99 9999 + 045308 9999 99 99 0 9999 99 9999 + 045309 9999 99 99 0 9999 99 9999 + 045310 9999 99 99 0 9999 99 9999 + 045311 9999 99 99 0 9999 99 9999 + 045312 9999 99 99 0 9999 99 9999 + 045313 9999 99 99 0 9999 99 9999 + 045314 9999 99 99 0 9999 99 9999 + 045315 9999 99 99 0 9999 99 9999 + 045316 9999 99 99 0 9999 99 9999 + 045317 9999 99 99 0 9999 99 9999 + 045318 9999 99 99 0 9999 99 9999 + 045319 9999 99 99 0 9999 99 9999 + 045320 9999 99 99 0 9999 99 9999 + 045321 9999 99 99 0 9999 99 9999 + 045322 9999 99 99 0 9999 99 9999 + 045323 9999 99 99 0 9999 99 9999 + 045324 9999 99 99 0 9999 99 9999 + 045325 9999 99 99 0 9999 99 9999 + 045326 9999 99 99 0 9999 99 9999 + 045327 9999 99 99 0 9999 99 9999 + 045328 9999 99 99 0 9999 99 9999 + 045329 9999 99 99 0 9999 99 9999 + 045330 9999 99 99 0 9999 99 9999 + 045331 9999 99 99 0 9999 99 9999 + 045332 9999 99 99 0 9999 99 9999 + 045333 9999 99 99 0 9999 99 9999 + 045334 9999 99 99 0 9999 99 9999 + 045335 9999 99 99 0 9999 99 9999 + 045336 9999 99 99 0 9999 99 9999 + 045337 9999 99 99 0 9999 99 9999 + 045338 9999 99 99 0 9999 99 9999 + 045339 9999 99 99 0 9999 99 9999 + 045340 9999 99 99 0 9999 99 9999 + 045341 9999 99 99 0 9999 99 9999 + 045342 9999 99 99 0 9999 99 9999 + 045343 9999 99 99 0 9999 99 9999 + 045344 9999 99 99 0 9999 99 9999 + 045345 9999 99 99 0 9999 99 9999 + 045346 9999 99 99 0 9999 99 9999 + 045347 9999 99 99 0 9999 99 9999 + 045348 9999 99 99 0 9999 99 9999 + 045349 9999 99 99 0 9999 99 9999 + 045350 9999 99 99 0 9999 99 9999 + 045351 9999 99 99 0 9999 99 9999 + 045352 9999 99 99 0 9999 99 9999 + 045353 9999 99 99 0 9999 99 9999 + 045354 9999 99 99 0 9999 99 9999 + 045355 9999 99 99 0 9999 99 9999 + 045356 9999 99 99 0 9999 99 9999 + 045357 9999 99 99 0 9999 99 9999 + 045358 9999 99 99 0 9999 99 9999 + 045359 9999 99 99 0 9999 99 9999 + 045360 9999 99 99 0 9999 99 9999 + 045361 9999 99 99 0 9999 99 9999 + 045362 9999 99 99 0 9999 99 9999 + 045363 9999 99 99 0 9999 99 9999 + 045364 9999 99 99 0 9999 99 9999 + 045365 9999 99 99 0 9999 99 9999 + 045366 9999 99 99 0 9999 99 9999 + 045367 9999 99 99 0 9999 99 9999 + 045368 9999 99 99 0 9999 99 9999 + 045369 9999 99 99 0 9999 99 9999 + 045370 9999 99 99 0 9999 99 9999 + 045371 9999 99 99 0 9999 99 9999 + 045372 9999 99 99 0 9999 99 9999 + 045373 9999 99 99 0 9999 99 9999 + 045374 9999 99 99 0 9999 99 9999 + 045375 9999 99 99 0 9999 99 9999 + 045376 9999 99 99 0 9999 99 9999 + 045377 9999 99 99 0 9999 99 9999 + 045378 9999 99 99 0 9999 99 9999 + 045379 9999 99 99 0 9999 99 9999 + 045380 9999 99 99 0 9999 99 9999 + 045381 9999 99 99 0 9999 99 9999 + 045382 9999 99 99 0 9999 99 9999 + 045383 9999 99 99 0 9999 99 9999 + 045384 9999 99 99 0 9999 99 9999 + 045385 9999 99 99 0 9999 99 9999 + 045386 9999 99 99 0 9999 99 9999 + 045387 9999 99 99 0 9999 99 9999 + 045388 9999 99 99 0 9999 99 9999 + 045389 9999 99 99 0 9999 99 9999 + 045390 9999 99 99 0 9999 99 9999 + 045391 9999 99 99 0 9999 99 9999 + 045392 9999 99 99 0 9999 99 9999 + 045393 9999 99 99 0 9999 99 9999 + 045394 9999 99 99 0 9999 99 9999 + 045395 9999 99 99 0 9999 99 9999 + 045396 9999 99 99 0 9999 99 9999 + 045397 9999 99 99 0 9999 99 9999 + 045398 9999 99 99 0 9999 99 9999 + 045399 9999 99 99 0 9999 99 9999 + 045400 9999 99 99 0 9999 99 9999 + 045401 9999 99 99 0 9999 99 9999 + 045402 9999 99 99 0 9999 99 9999 + 045403 9999 99 99 0 9999 99 9999 + 045404 9999 99 99 0 9999 99 9999 + 045405 9999 99 99 0 9999 99 9999 + 045406 9999 99 99 0 9999 99 9999 + 045407 9999 99 99 0 9999 99 9999 + 045408 9999 99 99 0 9999 99 9999 + 045409 9999 99 99 0 9999 99 9999 + 045410 9999 99 99 0 9999 99 9999 + 045411 9999 99 99 0 9999 99 9999 + 045412 9999 99 99 0 9999 99 9999 + 045413 9999 99 99 0 9999 99 9999 + 045414 9999 99 99 0 9999 99 9999 + 045415 9999 99 99 0 9999 99 9999 + 045416 9999 99 99 0 9999 99 9999 + 045417 9999 99 99 0 9999 99 9999 + 045418 9999 99 99 0 9999 99 9999 + 045419 9999 99 99 0 9999 99 9999 + 045420 9999 99 99 0 9999 99 9999 + 045421 9999 99 99 0 9999 99 9999 + 045422 9999 99 99 0 9999 99 9999 + 045423 9999 99 99 0 9999 99 9999 + 045424 9999 99 99 0 9999 99 9999 + 045425 9999 99 99 0 9999 99 9999 + 045426 9999 99 99 0 9999 99 9999 + 045427 9999 99 99 0 9999 99 9999 + 045428 9999 99 99 0 9999 99 9999 + 045429 9999 99 99 0 9999 99 9999 + 045430 9999 99 99 0 9999 99 9999 + 045431 9999 99 99 0 9999 99 9999 + 045432 9999 99 99 0 9999 99 9999 + 045433 9999 99 99 0 9999 99 9999 + 045434 9999 99 99 0 9999 99 9999 + 045435 9999 99 99 0 9999 99 9999 + 045436 9999 99 99 0 9999 99 9999 + 045437 9999 99 99 0 9999 99 9999 + 045438 9999 99 99 0 9999 99 9999 + 045439 9999 99 99 0 9999 99 9999 + 045440 9999 99 99 0 9999 99 9999 + 045441 9999 99 99 0 9999 99 9999 + 045442 9999 99 99 0 9999 99 9999 + 045443 9999 99 99 0 9999 99 9999 + 045444 9999 99 99 0 9999 99 9999 + 045445 9999 99 99 0 9999 99 9999 + 045446 9999 99 99 0 9999 99 9999 + 045447 9999 99 99 0 9999 99 9999 + 045448 9999 99 99 0 9999 99 9999 + 045449 9999 99 99 0 9999 99 9999 + 045450 9999 99 99 0 9999 99 9999 + 045451 9999 99 99 0 9999 99 9999 + 045452 9999 99 99 0 9999 99 9999 + 045453 9999 99 99 0 9999 99 9999 + 045454 9999 99 99 0 9999 99 9999 + 045455 9999 99 99 0 9999 99 9999 + 045456 9999 99 99 0 9999 99 9999 + 045457 9999 99 99 0 9999 99 9999 + 045458 9999 99 99 0 9999 99 9999 + 045459 9999 99 99 0 9999 99 9999 + 045460 9999 99 99 0 9999 99 9999 + 045461 9999 99 99 0 9999 99 9999 + 045462 9999 99 99 0 9999 99 9999 + 045463 9999 99 99 0 9999 99 9999 + 045464 9999 99 99 0 9999 99 9999 + 045465 9999 99 99 0 9999 99 9999 + 045466 9999 99 99 0 9999 99 9999 + 045467 9999 99 99 0 9999 99 9999 + 045468 9999 99 99 0 9999 99 9999 + 045469 9999 99 99 0 9999 99 9999 + 045470 9999 99 99 0 9999 99 9999 + 045471 9999 99 99 0 9999 99 9999 + 045472 9999 99 99 0 9999 99 9999 + 045473 9999 99 99 0 9999 99 9999 + 045474 9999 99 99 0 9999 99 9999 + 045475 9999 99 99 0 9999 99 9999 + 045476 9999 99 99 0 9999 99 9999 + 045477 9999 99 99 0 9999 99 9999 + 045478 9999 99 99 0 9999 99 9999 + 045479 9999 99 99 0 9999 99 9999 + 045480 9999 99 99 0 9999 99 9999 + 045481 9999 99 99 0 9999 99 9999 + 045482 9999 99 99 0 9999 99 9999 + 045483 9999 99 99 0 9999 99 9999 + 045484 9999 99 99 0 9999 99 9999 + 045485 9999 99 99 0 9999 99 9999 + 045486 9999 99 99 0 9999 99 9999 + 045487 9999 99 99 0 9999 99 9999 + 045488 9999 99 99 0 9999 99 9999 + 045489 9999 99 99 0 9999 99 9999 + 045490 9999 99 99 0 9999 99 9999 + 045491 9999 99 99 0 9999 99 9999 + 045492 9999 99 99 0 9999 99 9999 + 045493 9999 99 99 0 9999 99 9999 + 045494 9999 99 99 0 9999 99 9999 + 045495 9999 99 99 0 9999 99 9999 + 045496 9999 99 99 0 9999 99 9999 + 045497 9999 99 99 0 9999 99 9999 + 045498 9999 99 99 0 9999 99 9999 + 045499 9999 99 99 0 9999 99 9999 + 045500 9999 99 99 0 9999 99 9999 + 045501 9999 99 99 0 9999 99 9999 + 045502 9999 99 99 0 9999 99 9999 + 045503 9999 99 99 0 9999 99 9999 + 045504 9999 99 99 0 9999 99 9999 + 045505 9999 99 99 0 9999 99 9999 + 045506 9999 99 99 0 9999 99 9999 + 045507 9999 99 99 0 9999 99 9999 + 045508 9999 99 99 0 9999 99 9999 + 045509 9999 99 99 0 9999 99 9999 + 045510 9999 99 99 0 9999 99 9999 + 045511 9999 99 99 0 9999 99 9999 + 045512 9999 99 99 0 9999 99 9999 + 045513 9999 99 99 0 9999 99 9999 + 045514 9999 99 99 0 9999 99 9999 + 045515 9999 99 99 0 9999 99 9999 + 045516 9999 99 99 0 9999 99 9999 + 045517 9999 99 99 0 9999 99 9999 + 045518 9999 99 99 0 9999 99 9999 + 045519 9999 99 99 0 9999 99 9999 + 045520 9999 99 99 0 9999 99 9999 + 045521 9999 99 99 0 9999 99 9999 + 045522 9999 99 99 0 9999 99 9999 + 045523 9999 99 99 0 9999 99 9999 + 045524 9999 99 99 0 9999 99 9999 + 045525 9999 99 99 0 9999 99 9999 + 045526 9999 99 99 0 9999 99 9999 + 045527 9999 99 99 0 9999 99 9999 + 045528 9999 99 99 0 9999 99 9999 + 045529 9999 99 99 0 9999 99 9999 + 045530 9999 99 99 0 9999 99 9999 + 045531 9999 99 99 0 9999 99 9999 + 045532 9999 99 99 0 9999 99 9999 + 045533 9999 99 99 0 9999 99 9999 + 045534 9999 99 99 0 9999 99 9999 + 045535 9999 99 99 0 9999 99 9999 + 045536 9999 99 99 0 9999 99 9999 + 045537 9999 99 99 0 9999 99 9999 + 045538 9999 99 99 0 9999 99 9999 + 045539 9999 99 99 0 9999 99 9999 + 045540 9999 99 99 0 9999 99 9999 + 045541 9999 99 99 0 9999 99 9999 + 045542 9999 99 99 0 9999 99 9999 + 045543 9999 99 99 0 9999 99 9999 + 045544 9999 99 99 0 9999 99 9999 + 045545 9999 99 99 0 9999 99 9999 + 045546 9999 99 99 0 9999 99 9999 + 045547 9999 99 99 0 9999 99 9999 + 045548 9999 99 99 0 9999 99 9999 + 045549 9999 99 99 0 9999 99 9999 + 045550 9999 99 99 0 9999 99 9999 + 045551 9999 99 99 0 9999 99 9999 + 045552 9999 99 99 0 9999 99 9999 + 045553 9999 99 99 0 9999 99 9999 + 045554 9999 99 99 0 9999 99 9999 + 045555 9999 99 99 0 9999 99 9999 + 045556 9999 99 99 0 9999 99 9999 + 045557 9999 99 99 0 9999 99 9999 + 045558 9999 99 99 0 9999 99 9999 + 045559 9999 99 99 0 9999 99 9999 + 045560 9999 99 99 0 9999 99 9999 + 045561 9999 99 99 0 9999 99 9999 + 045562 9999 99 99 0 9999 99 9999 + 045563 9999 99 99 0 9999 99 9999 + 045564 9999 99 99 0 9999 99 9999 + 045565 9999 99 99 0 9999 99 9999 + 045566 9999 99 99 0 9999 99 9999 + 045567 9999 99 99 0 9999 99 9999 + 045568 9999 99 99 0 9999 99 9999 + 045569 9999 99 99 0 9999 99 9999 + 045570 9999 99 99 0 9999 99 9999 + 045571 9999 99 99 0 9999 99 9999 + 045572 9999 99 99 0 9999 99 9999 + 045573 9999 99 99 0 9999 99 9999 + 045574 9999 99 99 0 9999 99 9999 + 045575 9999 99 99 0 9999 99 9999 + 045576 9999 99 99 0 9999 99 9999 + 045577 9999 99 99 0 9999 99 9999 + 045578 9999 99 99 0 9999 99 9999 + 045579 9999 99 99 0 9999 99 9999 + 045580 9999 99 99 0 9999 99 9999 + 045581 9999 99 99 0 9999 99 9999 + 045582 9999 99 99 0 9999 99 9999 + 045583 9999 99 99 0 9999 99 9999 + 045584 9999 99 99 0 9999 99 9999 + 045585 9999 99 99 0 9999 99 9999 + 045586 9999 99 99 0 9999 99 9999 + 045587 9999 99 99 0 9999 99 9999 + 045588 9999 99 99 0 9999 99 9999 + 045589 9999 99 99 0 9999 99 9999 + 045590 9999 99 99 0 9999 99 9999 + 045591 9999 99 99 0 9999 99 9999 + 045592 9999 99 99 0 9999 99 9999 + 045593 9999 99 99 0 9999 99 9999 + 045594 9999 99 99 0 9999 99 9999 + 045595 9999 99 99 0 9999 99 9999 + 045596 9999 99 99 0 9999 99 9999 + 045597 9999 99 99 0 9999 99 9999 + 045598 9999 99 99 0 9999 99 9999 + 045599 9999 99 99 0 9999 99 9999 + 045600 9999 99 99 0 9999 99 9999 + 045601 9999 99 99 0 9999 99 9999 + 045602 9999 99 99 0 9999 99 9999 + 045603 9999 99 99 0 9999 99 9999 + 045604 9999 99 99 0 9999 99 9999 + 045605 9999 99 99 0 9999 99 9999 + 045606 9999 99 99 0 9999 99 9999 + 045607 9999 99 99 0 9999 99 9999 + 045608 9999 99 99 0 9999 99 9999 + 045609 9999 99 99 0 9999 99 9999 + 045610 9999 99 99 0 9999 99 9999 + 045611 9999 99 99 0 9999 99 9999 + 045612 9999 99 99 0 9999 99 9999 + 045613 9999 99 99 0 9999 99 9999 + 045614 9999 99 99 0 9999 99 9999 + 045615 9999 99 99 0 9999 99 9999 + 045616 9999 99 99 0 9999 99 9999 + 045617 9999 99 99 0 9999 99 9999 + 045618 9999 99 99 0 9999 99 9999 + 045619 9999 99 99 0 9999 99 9999 + 045620 9999 99 99 0 9999 99 9999 + 045621 9999 99 99 0 9999 99 9999 + 045622 9999 99 99 0 9999 99 9999 + 045623 9999 99 99 0 9999 99 9999 + 045624 9999 99 99 0 9999 99 9999 + 045625 9999 99 99 0 9999 99 9999 + 045626 9999 99 99 0 9999 99 9999 + 045627 9999 99 99 0 9999 99 9999 + 045628 9999 99 99 0 9999 99 9999 + 045629 9999 99 99 0 9999 99 9999 + 045630 9999 99 99 0 9999 99 9999 + 045631 9999 99 99 0 9999 99 9999 + 045632 9999 99 99 0 9999 99 9999 + 045633 9999 99 99 0 9999 99 9999 + 045634 9999 99 99 0 9999 99 9999 + 045635 9999 99 99 0 9999 99 9999 + 045636 9999 99 99 0 9999 99 9999 + 045637 9999 99 99 0 9999 99 9999 + 045638 9999 99 99 0 9999 99 9999 + 045639 9999 99 99 0 9999 99 9999 + 045640 9999 99 99 0 9999 99 9999 + 045641 9999 99 99 0 9999 99 9999 + 045642 9999 99 99 0 9999 99 9999 + 045643 9999 99 99 0 9999 99 9999 + 045644 9999 99 99 0 9999 99 9999 + 045645 9999 99 99 0 9999 99 9999 + 045646 9999 99 99 0 9999 99 9999 + 045647 9999 99 99 0 9999 99 9999 + 045648 9999 99 99 0 9999 99 9999 + 045649 9999 99 99 0 9999 99 9999 + 045650 9999 99 99 0 9999 99 9999 + 045651 9999 99 99 0 9999 99 9999 + 045652 9999 99 99 0 9999 99 9999 + 045653 9999 99 99 0 9999 99 9999 + 045654 9999 99 99 0 9999 99 9999 + 045655 9999 99 99 0 9999 99 9999 + 045656 9999 99 99 0 9999 99 9999 + 045657 9999 99 99 0 9999 99 9999 + 045658 9999 99 99 0 9999 99 9999 + 045659 9999 99 99 0 9999 99 9999 + 045660 9999 99 99 0 9999 99 9999 + 045661 9999 99 99 0 9999 99 9999 + 045662 9999 99 99 0 9999 99 9999 + 045663 9999 99 99 0 9999 99 9999 + 045664 9999 99 99 0 9999 99 9999 + 045665 9999 99 99 0 9999 99 9999 + 045666 9999 99 99 0 9999 99 9999 + 045667 9999 99 99 0 9999 99 9999 + 045668 9999 99 99 0 9999 99 9999 + 045669 9999 99 99 0 9999 99 9999 + 045670 9999 99 99 0 9999 99 9999 + 045671 9999 99 99 0 9999 99 9999 + 045672 9999 99 99 0 9999 99 9999 + 045673 9999 99 99 0 9999 99 9999 + 045674 9999 99 99 0 9999 99 9999 + 045675 9999 99 99 0 9999 99 9999 + 045676 9999 99 99 0 9999 99 9999 + 045677 9999 99 99 0 9999 99 9999 + 045678 9999 99 99 0 9999 99 9999 + 045679 9999 99 99 0 9999 99 9999 + 045680 9999 99 99 0 9999 99 9999 + 045681 9999 99 99 0 9999 99 9999 + 045682 9999 99 99 0 9999 99 9999 + 045683 9999 99 99 0 9999 99 9999 + 045684 9999 99 99 0 9999 99 9999 + 045685 9999 99 99 0 9999 99 9999 + 045686 9999 99 99 0 9999 99 9999 + 045687 9999 99 99 0 9999 99 9999 + 045688 9999 99 99 0 9999 99 9999 + 045689 9999 99 99 0 9999 99 9999 + 045690 9999 99 99 0 9999 99 9999 + 045691 9999 99 99 0 9999 99 9999 + 045692 9999 99 99 0 9999 99 9999 + 045693 9999 99 99 0 9999 99 9999 + 045694 9999 99 99 0 9999 99 9999 + 045695 9999 99 99 0 9999 99 9999 + 045696 9999 99 99 0 9999 99 9999 + 045697 9999 99 99 0 9999 99 9999 + 045698 9999 99 99 0 9999 99 9999 + 045699 9999 99 99 0 9999 99 9999 + 045700 9999 99 99 0 9999 99 9999 + 045701 9999 99 99 0 9999 99 9999 + 045702 9999 99 99 0 9999 99 9999 + 045703 9999 99 99 0 9999 99 9999 + 045704 9999 99 99 0 9999 99 9999 + 045705 9999 99 99 0 9999 99 9999 + 045706 9999 99 99 0 9999 99 9999 + 045707 9999 99 99 0 9999 99 9999 + 045708 9999 99 99 0 9999 99 9999 + 045709 9999 99 99 0 9999 99 9999 + 045710 9999 99 99 0 9999 99 9999 + 045711 9999 99 99 0 9999 99 9999 + 045712 9999 99 99 0 9999 99 9999 + 045713 9999 99 99 0 9999 99 9999 + 045714 9999 99 99 0 9999 99 9999 + 045715 9999 99 99 0 9999 99 9999 + 045716 9999 99 99 0 9999 99 9999 + 045717 9999 99 99 0 9999 99 9999 + 045718 9999 99 99 0 9999 99 9999 + 045719 9999 99 99 0 9999 99 9999 + 045720 9999 99 99 0 9999 99 9999 + 045721 9999 99 99 0 9999 99 9999 + 045722 9999 99 99 0 9999 99 9999 + 045723 9999 99 99 0 9999 99 9999 + 045724 9999 99 99 0 9999 99 9999 + 045725 9999 99 99 0 9999 99 9999 + 045726 9999 99 99 0 9999 99 9999 + 045727 9999 99 99 0 9999 99 9999 + 045728 9999 99 99 0 9999 99 9999 + 045729 9999 99 99 0 9999 99 9999 + 045730 9999 99 99 0 9999 99 9999 + 045731 9999 99 99 0 9999 99 9999 + 045732 9999 99 99 0 9999 99 9999 + 045733 9999 99 99 0 9999 99 9999 + 045734 9999 99 99 0 9999 99 9999 + 045735 9999 99 99 0 9999 99 9999 + 045736 9999 99 99 0 9999 99 9999 + 045737 9999 99 99 0 9999 99 9999 + 045738 9999 99 99 0 9999 99 9999 + 045739 9999 99 99 0 9999 99 9999 + 045740 9999 99 99 0 9999 99 9999 + 045741 9999 99 99 0 9999 99 9999 + 045742 9999 99 99 0 9999 99 9999 + 045743 9999 99 99 0 9999 99 9999 + 045744 9999 99 99 0 9999 99 9999 + 045745 9999 99 99 0 9999 99 9999 + 045746 9999 99 99 0 9999 99 9999 + 045747 9999 99 99 0 9999 99 9999 + 045748 9999 99 99 0 9999 99 9999 + 045749 9999 99 99 0 9999 99 9999 + 045750 9999 99 99 0 9999 99 9999 + 045751 9999 99 99 0 9999 99 9999 + 045752 9999 99 99 0 9999 99 9999 + 045753 9999 99 99 0 9999 99 9999 + 045754 9999 99 99 0 9999 99 9999 + 045755 9999 99 99 0 9999 99 9999 + 045756 9999 99 99 0 9999 99 9999 + 045757 9999 99 99 0 9999 99 9999 + 045758 9999 99 99 0 9999 99 9999 + 045759 9999 99 99 0 9999 99 9999 + 045760 9999 99 99 0 9999 99 9999 + 045761 9999 99 99 0 9999 99 9999 + 045762 9999 99 99 0 9999 99 9999 + 045763 9999 99 99 0 9999 99 9999 + 045764 9999 99 99 0 9999 99 9999 + 045765 9999 99 99 0 9999 99 9999 + 045766 9999 99 99 0 9999 99 9999 + 045767 9999 99 99 0 9999 99 9999 + 045768 9999 99 99 0 9999 99 9999 + 045769 9999 99 99 0 9999 99 9999 + 045770 9999 99 99 0 9999 99 9999 + 045771 9999 99 99 0 9999 99 9999 + 045772 9999 99 99 0 9999 99 9999 + 045773 9999 99 99 0 9999 99 9999 + 045774 9999 99 99 0 9999 99 9999 + 045775 9999 99 99 0 9999 99 9999 + 045776 9999 99 99 0 9999 99 9999 + 045777 9999 99 99 0 9999 99 9999 + 045778 9999 99 99 0 9999 99 9999 + 045779 9999 99 99 0 9999 99 9999 + 045780 9999 99 99 0 9999 99 9999 + 045781 9999 99 99 0 9999 99 9999 + 045782 9999 99 99 0 9999 99 9999 + 045783 9999 99 99 0 9999 99 9999 + 045784 9999 99 99 0 9999 99 9999 + 045785 9999 99 99 0 9999 99 9999 + 045786 9999 99 99 0 9999 99 9999 + 045787 9999 99 99 0 9999 99 9999 + 045788 9999 99 99 0 9999 99 9999 + 045789 9999 99 99 0 9999 99 9999 + 045790 9999 99 99 0 9999 99 9999 + 045791 9999 99 99 0 9999 99 9999 + 045792 9999 99 99 0 9999 99 9999 + 045793 9999 99 99 0 9999 99 9999 + 045794 9999 99 99 0 9999 99 9999 + 045795 9999 99 99 0 9999 99 9999 + 045796 9999 99 99 0 9999 99 9999 + 045797 9999 99 99 0 9999 99 9999 + 045798 9999 99 99 0 9999 99 9999 + 045799 9999 99 99 0 9999 99 9999 + 045800 9999 99 99 0 9999 99 9999 + 045801 9999 99 99 0 9999 99 9999 + 045802 9999 99 99 0 9999 99 9999 + 045803 9999 99 99 0 9999 99 9999 + 045804 9999 99 99 0 9999 99 9999 + 045805 9999 99 99 0 9999 99 9999 + 045806 9999 99 99 0 9999 99 9999 + 045807 9999 99 99 0 9999 99 9999 + 045808 9999 99 99 0 9999 99 9999 + 045809 9999 99 99 0 9999 99 9999 + 045810 9999 99 99 0 9999 99 9999 + 045811 9999 99 99 0 9999 99 9999 + 045812 9999 99 99 0 9999 99 9999 + 045813 9999 99 99 0 9999 99 9999 + 045814 9999 99 99 0 9999 99 9999 + 045815 9999 99 99 0 9999 99 9999 + 045816 9999 99 99 0 9999 99 9999 + 045817 9999 99 99 0 9999 99 9999 + 045818 9999 99 99 0 9999 99 9999 + 045819 9999 99 99 0 9999 99 9999 + 045820 9999 99 99 0 9999 99 9999 + 045821 9999 99 99 0 9999 99 9999 + 045822 9999 99 99 0 9999 99 9999 + 045823 9999 99 99 0 9999 99 9999 + 045824 9999 99 99 0 9999 99 9999 + 045825 9999 99 99 0 9999 99 9999 + 045826 9999 99 99 0 9999 99 9999 + 045827 9999 99 99 0 9999 99 9999 + 045828 9999 99 99 0 9999 99 9999 + 045829 9999 99 99 0 9999 99 9999 + 045830 9999 99 99 0 9999 99 9999 + 045831 9999 99 99 0 9999 99 9999 + 045832 9999 99 99 0 9999 99 9999 + 045833 9999 99 99 0 9999 99 9999 + 045834 9999 99 99 0 9999 99 9999 + 045835 9999 99 99 0 9999 99 9999 + 045836 9999 99 99 0 9999 99 9999 + 045837 9999 99 99 0 9999 99 9999 + 045838 9999 99 99 0 9999 99 9999 + 045839 9999 99 99 0 9999 99 9999 + 045840 9999 99 99 0 9999 99 9999 + 045841 9999 99 99 0 9999 99 9999 + 045842 9999 99 99 0 9999 99 9999 + 045843 9999 99 99 0 9999 99 9999 + 045844 9999 99 99 0 9999 99 9999 + 045845 9999 99 99 0 9999 99 9999 + 045846 9999 99 99 0 9999 99 9999 + 045847 9999 99 99 0 9999 99 9999 + 045848 9999 99 99 0 9999 99 9999 + 045849 9999 99 99 0 9999 99 9999 + 045850 9999 99 99 0 9999 99 9999 + 045851 9999 99 99 0 9999 99 9999 + 045852 9999 99 99 0 9999 99 9999 + 045853 9999 99 99 0 9999 99 9999 + 045854 9999 99 99 0 9999 99 9999 + 045855 9999 99 99 0 9999 99 9999 + 045856 9999 99 99 0 9999 99 9999 + 045857 9999 99 99 0 9999 99 9999 + 045858 9999 99 99 0 9999 99 9999 + 045859 9999 99 99 0 9999 99 9999 + 045860 9999 99 99 0 9999 99 9999 + 045861 9999 99 99 0 9999 99 9999 + 045862 9999 99 99 0 9999 99 9999 + 045863 9999 99 99 0 9999 99 9999 + 045864 9999 99 99 0 9999 99 9999 + 045865 9999 99 99 0 9999 99 9999 + 045866 9999 99 99 0 9999 99 9999 + 045867 9999 99 99 0 9999 99 9999 + 045868 9999 99 99 0 9999 99 9999 + 045869 9999 99 99 0 9999 99 9999 + 045870 9999 99 99 0 9999 99 9999 + 045871 9999 99 99 0 9999 99 9999 + 045872 9999 99 99 0 9999 99 9999 + 045873 9999 99 99 0 9999 99 9999 + 045874 9999 99 99 0 9999 99 9999 + 045875 9999 99 99 0 9999 99 9999 + 045876 9999 99 99 0 9999 99 9999 + 045877 9999 99 99 0 9999 99 9999 + 045878 9999 99 99 0 9999 99 9999 + 045879 9999 99 99 0 9999 99 9999 + 045880 9999 99 99 0 9999 99 9999 + 045881 9999 99 99 0 9999 99 9999 + 045882 9999 99 99 0 9999 99 9999 + 045883 9999 99 99 0 9999 99 9999 + 045884 9999 99 99 0 9999 99 9999 + 045885 9999 99 99 0 9999 99 9999 + 045886 9999 99 99 0 9999 99 9999 + 045887 9999 99 99 0 9999 99 9999 + 045888 9999 99 99 0 9999 99 9999 + 045889 9999 99 99 0 9999 99 9999 + 045890 9999 99 99 0 9999 99 9999 + 045891 9999 99 99 0 9999 99 9999 + 045892 9999 99 99 0 9999 99 9999 + 045893 9999 99 99 0 9999 99 9999 + 045894 9999 99 99 0 9999 99 9999 + 045895 9999 99 99 0 9999 99 9999 + 045896 9999 99 99 0 9999 99 9999 + 045897 9999 99 99 0 9999 99 9999 + 045898 9999 99 99 0 9999 99 9999 + 045899 9999 99 99 0 9999 99 9999 + 045900 9999 99 99 0 9999 99 9999 + 045901 9999 99 99 0 9999 99 9999 + 045902 9999 99 99 0 9999 99 9999 + 045903 9999 99 99 0 9999 99 9999 + 045904 9999 99 99 0 9999 99 9999 + 045905 9999 99 99 0 9999 99 9999 + 045906 9999 99 99 0 9999 99 9999 + 045907 9999 99 99 0 9999 99 9999 + 045908 9999 99 99 0 9999 99 9999 + 045909 9999 99 99 0 9999 99 9999 + 045910 9999 99 99 0 9999 99 9999 + 045911 9999 99 99 0 9999 99 9999 + 045912 9999 99 99 0 9999 99 9999 + 045913 9999 99 99 0 9999 99 9999 + 045914 9999 99 99 0 9999 99 9999 + 045915 9999 99 99 0 9999 99 9999 + 045916 9999 99 99 0 9999 99 9999 + 045917 9999 99 99 0 9999 99 9999 + 045918 9999 99 99 0 9999 99 9999 + 045919 9999 99 99 0 9999 99 9999 + 045920 9999 99 99 0 9999 99 9999 + 045921 9999 99 99 0 9999 99 9999 + 045922 9999 99 99 0 9999 99 9999 + 045923 9999 99 99 0 9999 99 9999 + 045924 9999 99 99 0 9999 99 9999 + 045925 9999 99 99 0 9999 99 9999 + 045926 9999 99 99 0 9999 99 9999 + 045927 9999 99 99 0 9999 99 9999 + 045928 9999 99 99 0 9999 99 9999 + 045929 9999 99 99 0 9999 99 9999 + 045930 9999 99 99 0 9999 99 9999 + 045931 9999 99 99 0 9999 99 9999 + 045932 9999 99 99 0 9999 99 9999 + 045933 9999 99 99 0 9999 99 9999 + 045934 9999 99 99 0 9999 99 9999 + 045935 9999 99 99 0 9999 99 9999 + 045936 9999 99 99 0 9999 99 9999 + 045937 9999 99 99 0 9999 99 9999 + 045938 9999 99 99 0 9999 99 9999 + 045939 9999 99 99 0 9999 99 9999 + 045940 9999 99 99 0 9999 99 9999 + 045941 9999 99 99 0 9999 99 9999 + 045942 9999 99 99 0 9999 99 9999 + 045943 9999 99 99 0 9999 99 9999 + 045944 9999 99 99 0 9999 99 9999 + 045945 9999 99 99 0 9999 99 9999 + 045946 9999 99 99 0 9999 99 9999 + 045947 9999 99 99 0 9999 99 9999 + 045948 9999 99 99 0 9999 99 9999 + 045949 9999 99 99 0 9999 99 9999 + 045950 9999 99 99 0 9999 99 9999 + 045951 9999 99 99 0 9999 99 9999 + 045952 9999 99 99 0 9999 99 9999 + 045953 9999 99 99 0 9999 99 9999 + 045954 9999 99 99 0 9999 99 9999 + 045955 9999 99 99 0 9999 99 9999 + 045956 9999 99 99 0 9999 99 9999 + 045957 9999 99 99 0 9999 99 9999 + 045958 9999 99 99 0 9999 99 9999 + 045959 9999 99 99 0 9999 99 9999 + 045960 9999 99 99 0 9999 99 9999 + 045961 9999 99 99 0 9999 99 9999 + 045962 9999 99 99 0 9999 99 9999 + 045963 9999 99 99 0 9999 99 9999 + 045964 9999 99 99 0 9999 99 9999 + 045965 9999 99 99 0 9999 99 9999 + 045966 9999 99 99 0 9999 99 9999 + 045967 9999 99 99 0 9999 99 9999 + 045968 9999 99 99 0 9999 99 9999 + 045969 9999 99 99 0 9999 99 9999 + 045970 9999 99 99 0 9999 99 9999 + 045971 9999 99 99 0 9999 99 9999 + 045972 9999 99 99 0 9999 99 9999 + 045973 9999 99 99 0 9999 99 9999 + 045974 9999 99 99 0 9999 99 9999 + 045975 9999 99 99 0 9999 99 9999 + 045976 9999 99 99 0 9999 99 9999 + 045977 9999 99 99 0 9999 99 9999 + 045978 9999 99 99 0 9999 99 9999 + 045979 9999 99 99 0 9999 99 9999 + 045980 9999 99 99 0 9999 99 9999 + 045981 9999 99 99 0 9999 99 9999 + 045982 9999 99 99 0 9999 99 9999 + 045983 9999 99 99 0 9999 99 9999 + 045984 9999 99 99 0 9999 99 9999 + 045985 9999 99 99 0 9999 99 9999 + 045986 9999 99 99 0 9999 99 9999 + 045987 9999 99 99 0 9999 99 9999 + 045988 9999 99 99 0 9999 99 9999 + 045989 9999 99 99 0 9999 99 9999 + 045990 9999 99 99 0 9999 99 9999 + 045991 9999 99 99 0 9999 99 9999 + 045992 9999 99 99 0 9999 99 9999 + 045993 9999 99 99 0 9999 99 9999 + 045994 9999 99 99 0 9999 99 9999 + 045995 9999 99 99 0 9999 99 9999 + 045996 9999 99 99 0 9999 99 9999 + 045997 9999 99 99 0 9999 99 9999 + 045998 9999 99 99 0 9999 99 9999 + 045999 9999 99 99 0 9999 99 9999 + 046000 9999 99 99 0 9999 99 9999 + 046001 9999 99 99 0 9999 99 9999 + 046002 9999 99 99 0 9999 99 9999 + 046003 9999 99 99 0 9999 99 9999 + 046004 9999 99 99 0 9999 99 9999 + 046005 9999 99 99 0 9999 99 9999 + 046006 9999 99 99 0 9999 99 9999 + 046007 9999 99 99 0 9999 99 9999 + 046008 9999 99 99 0 9999 99 9999 + 046009 9999 99 99 0 9999 99 9999 + 046010 9999 99 99 0 9999 99 9999 + 046011 9999 99 99 0 9999 99 9999 + 046012 9999 99 99 0 9999 99 9999 + 046013 9999 99 99 0 9999 99 9999 + 046014 9999 99 99 0 9999 99 9999 + 046015 9999 99 99 0 9999 99 9999 + 046016 9999 99 99 0 9999 99 9999 + 046017 9999 99 99 0 9999 99 9999 + 046018 9999 99 99 0 9999 99 9999 + 046019 9999 99 99 0 9999 99 9999 + 046020 9999 99 99 0 9999 99 9999 + 046021 9999 99 99 0 9999 99 9999 + 046022 9999 99 99 0 9999 99 9999 + 046023 9999 99 99 0 9999 99 9999 + 046024 9999 99 99 0 9999 99 9999 + 046025 9999 99 99 0 9999 99 9999 + 046026 9999 99 99 0 9999 99 9999 + 046027 9999 99 99 0 9999 99 9999 + 046028 9999 99 99 0 9999 99 9999 + 046029 9999 99 99 0 9999 99 9999 + 046030 9999 99 99 0 9999 99 9999 + 046031 9999 99 99 0 9999 99 9999 + 046032 9999 99 99 0 9999 99 9999 + 046033 9999 99 99 0 9999 99 9999 + 046034 9999 99 99 0 9999 99 9999 + 046035 9999 99 99 0 9999 99 9999 + 046036 9999 99 99 0 9999 99 9999 + 046037 9999 99 99 0 9999 99 9999 + 046038 9999 99 99 0 9999 99 9999 + 046039 9999 99 99 0 9999 99 9999 + 046040 9999 99 99 0 9999 99 9999 + 046041 9999 99 99 0 9999 99 9999 + 046042 9999 99 99 0 9999 99 9999 + 046043 9999 99 99 0 9999 99 9999 + 046044 9999 99 99 0 9999 99 9999 + 046045 9999 99 99 0 9999 99 9999 + 046046 9999 99 99 0 9999 99 9999 + 046047 9999 99 99 0 9999 99 9999 + 046048 9999 99 99 0 9999 99 9999 + 046049 9999 99 99 0 9999 99 9999 + 046050 9999 99 99 0 9999 99 9999 + 046051 9999 99 99 0 9999 99 9999 + 046052 9999 99 99 0 9999 99 9999 + 046053 9999 99 99 0 9999 99 9999 + 046054 9999 99 99 0 9999 99 9999 + 046055 9999 99 99 0 9999 99 9999 + 046056 9999 99 99 0 9999 99 9999 + 046057 9999 99 99 0 9999 99 9999 + 046058 9999 99 99 0 9999 99 9999 + 046059 9999 99 99 0 9999 99 9999 + 046060 9999 99 99 0 9999 99 9999 + 046061 9999 99 99 0 9999 99 9999 + 046062 9999 99 99 0 9999 99 9999 + 046063 9999 99 99 0 9999 99 9999 + 046064 9999 99 99 0 9999 99 9999 + 046065 9999 99 99 0 9999 99 9999 + 046066 9999 99 99 0 9999 99 9999 + 046067 9999 99 99 0 9999 99 9999 + 046068 9999 99 99 0 9999 99 9999 + 046069 9999 99 99 0 9999 99 9999 + 046070 9999 99 99 0 9999 99 9999 + 046071 9999 99 99 0 9999 99 9999 + 046072 9999 99 99 0 9999 99 9999 + 046073 9999 99 99 0 9999 99 9999 + 046074 9999 99 99 0 9999 99 9999 + 046075 9999 99 99 0 9999 99 9999 + 046076 9999 99 99 0 9999 99 9999 + 046077 9999 99 99 0 9999 99 9999 + 046078 9999 99 99 0 9999 99 9999 + 046079 9999 99 99 0 9999 99 9999 + 046080 9999 99 99 0 9999 99 9999 + 046081 1320 01 01 2 344323076 00 1244 + 046082 1320 01 02 2 344323076 01 1244 + 046083 1320 01 03 2 344323076 02 1244 + 046084 1320 01 04 2 344323076 03 1244 + 046085 1320 01 05 2 344323076 04 1244 + 046086 1320 01 06 2 344323076 05 1244 + 046087 1320 01 07 2 344323076 06 1244 + 046088 1320 01 08 2 344323076 07 1244 + 046089 1320 02 01 2 344323076 08 1244 + 046090 1320 02 02 2 344323076 09 1244 + 046091 1320 02 03 2 344323076 10 1244 + 046092 1320 02 04 2 344323076 11 1244 + 046093 1320 02 05 2 344323076 12 1244 + 046094 1320 02 06 2 344323076 13 1244 + 046095 1320 02 07 2 344323076 14 1244 + 046096 1320 02 08 2 344323076 15 1244 + 046097 1320 03 01 2 344324100 00 1245 + 046098 1320 03 02 2 344324100 01 1245 + 046099 1320 03 03 2 344324100 02 1245 + 046100 1320 03 04 2 344324100 03 1245 + 046101 1320 03 05 2 344324100 04 1245 + 046102 1320 03 06 2 344324100 05 1245 + 046103 1320 03 07 2 344324100 06 1245 + 046104 1320 03 08 2 344324100 07 1245 + 046105 1320 04 01 2 344324100 08 1245 + 046106 1320 04 02 2 344324100 09 1245 + 046107 1320 04 03 2 344324100 10 1245 + 046108 1320 04 04 2 344324100 11 1245 + 046109 1320 04 05 2 344324100 12 1245 + 046110 1320 04 06 2 344324100 13 1245 + 046111 1320 04 07 2 344324100 14 1245 + 046112 1320 04 08 2 344324100 15 1245 + 046113 1320 05 01 2 344220676 00 1194 + 046114 1320 05 02 2 344220676 01 1194 + 046115 1320 05 03 2 344220676 02 1194 + 046116 1320 05 04 2 344220676 03 1194 + 046117 1320 05 05 2 344220676 04 1194 + 046118 1320 05 06 2 344220676 05 1194 + 046119 1320 05 07 2 344220676 06 1194 + 046120 1320 05 08 2 344220676 07 1194 + 046121 1320 06 01 2 344220676 08 1194 + 046122 1320 06 02 2 344220676 09 1194 + 046123 1320 06 03 2 344220676 10 1194 + 046124 1320 06 04 2 344220676 11 1194 + 046125 1320 06 05 2 344220676 12 1194 + 046126 1320 06 06 2 344220676 13 1194 + 046127 1320 06 07 2 344220676 14 1194 + 046128 1320 06 08 2 344220676 15 1194 + 046129 1320 07 01 2 344221700 00 1195 + 046130 1320 07 02 2 344221700 01 1195 + 046131 1320 07 03 2 344221700 02 1195 + 046132 1320 07 04 2 344221700 03 1195 + 046133 1320 07 05 2 344221700 04 1195 + 046134 1320 07 06 2 344221700 05 1195 + 046135 1320 07 07 2 344221700 06 1195 + 046136 1320 07 08 2 344221700 07 1195 + 046137 1320 08 01 2 344221700 08 1195 + 046138 1320 08 02 2 344221700 09 1195 + 046139 1320 08 03 2 344221700 10 1195 + 046140 1320 08 04 2 344221700 11 1195 + 046141 1320 08 05 2 344221700 12 1195 + 046142 1320 08 06 2 344221700 13 1195 + 046143 1320 08 07 2 344221700 14 1195 + 046144 1320 08 08 2 344221700 15 1195 + 046145 1320 09 01 2 344585220 00 1356 + 046146 1320 09 02 2 344585220 01 1356 + 046147 1320 09 03 2 344585220 02 1356 + 046148 1320 09 04 2 344585220 03 1356 + 046149 1320 09 05 2 344585220 04 1356 + 046150 1320 09 06 2 344585220 05 1356 + 046151 1320 09 07 2 344585220 06 1356 + 046152 1320 09 08 2 344585220 07 1356 + 046153 1320 10 01 2 344585220 08 1356 + 046154 1320 10 02 2 344585220 09 1356 + 046155 1320 10 03 2 344585220 10 1356 + 046156 1320 10 04 2 344585220 11 1356 + 046157 1320 10 05 2 344585220 12 1356 + 046158 1320 10 06 2 344585220 13 1356 + 046159 1320 10 07 2 344585220 14 1356 + 046160 1320 10 08 2 344585220 15 1356 + 046161 1320 11 01 2 344586244 00 1357 + 046162 1320 11 02 2 344586244 01 1357 + 046163 1320 11 03 2 344586244 02 1357 + 046164 1320 11 04 2 344586244 03 1357 + 046165 1320 11 05 2 344586244 04 1357 + 046166 1320 11 06 2 344586244 05 1357 + 046167 1320 11 07 2 344586244 06 1357 + 046168 1320 11 08 2 344586244 07 1357 + 046169 1320 12 01 2 344586244 08 1357 + 046170 1320 12 02 2 344586244 09 1357 + 046171 1320 12 03 2 344586244 10 1357 + 046172 1320 12 04 2 344586244 11 1357 + 046173 1320 12 05 2 344586244 12 1357 + 046174 1320 12 06 2 344586244 13 1357 + 046175 1320 12 07 2 344586244 14 1357 + 046176 1320 12 08 2 344586244 15 1357 + 046177 1320 13 01 2 344482820 00 1306 + 046178 1320 13 02 2 344482820 01 1306 + 046179 1320 13 03 2 344482820 02 1306 + 046180 1320 13 04 2 344482820 03 1306 + 046181 1320 13 05 2 344482820 04 1306 + 046182 1320 13 06 2 344482820 05 1306 + 046183 1320 13 07 2 344482820 06 1306 + 046184 1320 13 08 2 344482820 07 1306 + 046185 1320 14 01 2 344482820 08 1306 + 046186 1320 14 02 2 344482820 09 1306 + 046187 1320 14 03 2 344482820 10 1306 + 046188 1320 14 04 2 344482820 11 1306 + 046189 1320 14 05 2 344482820 12 1306 + 046190 1320 14 06 2 344482820 13 1306 + 046191 1320 14 07 2 344482820 14 1306 + 046192 1320 14 08 2 344482820 15 1306 + 046193 1320 15 01 2 344483844 00 1307 + 046194 1320 15 02 2 344483844 01 1307 + 046195 1320 15 03 2 344483844 02 1307 + 046196 1320 15 04 2 344483844 03 1307 + 046197 1320 15 05 2 344483844 04 1307 + 046198 1320 15 06 2 344483844 05 1307 + 046199 1320 15 07 2 344483844 06 1307 + 046200 1320 15 08 2 344483844 07 1307 + 046201 1320 16 01 2 344483844 08 1307 + 046202 1320 16 02 2 344483844 09 1307 + 046203 1320 16 03 2 344483844 10 1307 + 046204 1320 16 04 2 344483844 11 1307 + 046205 1320 16 05 2 344483844 12 1307 + 046206 1320 16 06 2 344483844 13 1307 + 046207 1320 16 07 2 344483844 14 1307 + 046208 1320 16 08 2 344483844 15 1307 + 046209 1320 17 01 2 344847364 00 1468 + 046210 1320 17 02 2 344847364 01 1468 + 046211 1320 17 03 2 344847364 02 1468 + 046212 1320 17 04 2 344847364 03 1468 + 046213 1320 17 05 2 344847364 04 1468 + 046214 1320 17 06 2 344847364 05 1468 + 046215 1320 17 07 2 344847364 06 1468 + 046216 1320 17 08 2 344847364 07 1468 + 046217 1320 18 01 2 344847364 08 1468 + 046218 1320 18 02 2 344847364 09 1468 + 046219 1320 18 03 2 344847364 10 1468 + 046220 1320 18 04 2 344847364 11 1468 + 046221 1320 18 05 2 344847364 12 1468 + 046222 1320 18 06 2 344847364 13 1468 + 046223 1320 18 07 2 344847364 14 1468 + 046224 1320 18 08 2 344847364 15 1468 + 046225 1320 19 01 2 344848388 00 1469 + 046226 1320 19 02 2 344848388 01 1469 + 046227 1320 19 03 2 344848388 02 1469 + 046228 1320 19 04 2 344848388 03 1469 + 046229 1320 19 05 2 344848388 04 1469 + 046230 1320 19 06 2 344848388 05 1469 + 046231 1320 19 07 2 344848388 06 1469 + 046232 1320 19 08 2 344848388 07 1469 + 046233 1320 20 01 2 344848388 08 1469 + 046234 1320 20 02 2 344848388 09 1469 + 046235 1320 20 03 2 344848388 10 1469 + 046236 1320 20 04 2 344848388 11 1469 + 046237 1320 20 05 2 344848388 12 1469 + 046238 1320 20 06 2 344848388 13 1469 + 046239 1320 20 07 2 344848388 14 1469 + 046240 1320 20 08 2 344848388 15 1469 + 046241 1320 21 01 2 344744964 00 1418 + 046242 1320 21 02 2 344744964 01 1418 + 046243 1320 21 03 2 344744964 02 1418 + 046244 1320 21 04 2 344744964 03 1418 + 046245 1320 21 05 2 344744964 04 1418 + 046246 1320 21 06 2 344744964 05 1418 + 046247 1320 21 07 2 344744964 06 1418 + 046248 1320 21 08 2 344744964 07 1418 + 046249 1320 22 01 2 344744964 08 1418 + 046250 1320 22 02 2 344744964 09 1418 + 046251 1320 22 03 2 344744964 10 1418 + 046252 1320 22 04 2 344744964 11 1418 + 046253 1320 22 05 2 344744964 12 1418 + 046254 1320 22 06 2 344744964 13 1418 + 046255 1320 22 07 2 344744964 14 1418 + 046256 1320 22 08 2 344744964 15 1418 + 046257 1320 23 01 2 344745988 00 1419 + 046258 1320 23 02 2 344745988 01 1419 + 046259 1320 23 03 2 344745988 02 1419 + 046260 1320 23 04 2 344745988 03 1419 + 046261 1320 23 05 2 344745988 04 1419 + 046262 1320 23 06 2 344745988 05 1419 + 046263 1320 23 07 2 344745988 06 1419 + 046264 1320 23 08 2 344745988 07 1419 + 046265 1320 24 01 2 344745988 08 1419 + 046266 1320 24 02 2 344745988 09 1419 + 046267 1320 24 03 2 344745988 10 1419 + 046268 1320 24 04 2 344745988 11 1419 + 046269 1320 24 05 2 344745988 12 1419 + 046270 1320 24 06 2 344745988 13 1419 + 046271 1320 24 07 2 344745988 14 1419 + 046272 1320 24 08 2 344745988 15 1419 + 046273 1320 25 01 2 344318980 00 1242 + 046274 1320 25 02 2 344318980 01 1242 + 046275 1320 25 03 2 344318980 02 1242 + 046276 1320 25 04 2 344318980 03 1242 + 046277 1320 25 05 2 344318980 04 1242 + 046278 1320 25 06 2 344318980 05 1242 + 046279 1320 25 07 2 344318980 06 1242 + 046280 1320 25 08 2 344318980 07 1242 + 046281 1320 26 01 2 344318980 08 1242 + 046282 1320 26 02 2 344318980 09 1242 + 046283 1320 26 03 2 344318980 10 1242 + 046284 1320 26 04 2 344318980 11 1242 + 046285 1320 26 05 2 344318980 12 1242 + 046286 1320 26 06 2 344318980 13 1242 + 046287 1320 26 07 2 344318980 14 1242 + 046288 1320 26 08 2 344318980 15 1242 + 046289 1320 27 01 2 344320004 00 1243 + 046290 1320 27 02 2 344320004 01 1243 + 046291 1320 27 03 2 344320004 02 1243 + 046292 1320 27 04 2 344320004 03 1243 + 046293 1320 27 05 2 344320004 04 1243 + 046294 1320 27 06 2 344320004 05 1243 + 046295 1320 27 07 2 344320004 06 1243 + 046296 1320 27 08 2 344320004 07 1243 + 046297 1320 28 01 2 344320004 08 1243 + 046298 1320 28 02 2 344320004 09 1243 + 046299 1320 28 03 2 344320004 10 1243 + 046300 1320 28 04 2 344320004 11 1243 + 046301 1320 28 05 2 344320004 12 1243 + 046302 1320 28 06 2 344320004 13 1243 + 046303 1320 28 07 2 344320004 14 1243 + 046304 1320 28 08 2 344320004 15 1243 + 046305 1320 29 01 2 344216580 00 1192 + 046306 1320 29 02 2 344216580 01 1192 + 046307 1320 29 03 2 344216580 02 1192 + 046308 1320 29 04 2 344216580 03 1192 + 046309 1320 29 05 2 344216580 04 1192 + 046310 1320 29 06 2 344216580 05 1192 + 046311 1320 29 07 2 344216580 06 1192 + 046312 1320 29 08 2 344216580 07 1192 + 046313 1320 30 01 2 344216580 08 1192 + 046314 1320 30 02 2 344216580 09 1192 + 046315 1320 30 03 2 344216580 10 1192 + 046316 1320 30 04 2 344216580 11 1192 + 046317 1320 30 05 2 344216580 12 1192 + 046318 1320 30 06 2 344216580 13 1192 + 046319 1320 30 07 2 344216580 14 1192 + 046320 1320 30 08 2 344216580 15 1192 + 046321 1320 31 01 2 344217604 00 1193 + 046322 1320 31 02 2 344217604 01 1193 + 046323 1320 31 03 2 344217604 02 1193 + 046324 1320 31 04 2 344217604 03 1193 + 046325 1320 31 05 2 344217604 04 1193 + 046326 1320 31 06 2 344217604 05 1193 + 046327 1320 31 07 2 344217604 06 1193 + 046328 1320 31 08 2 344217604 07 1193 + 046329 1320 32 01 2 344217604 08 1193 + 046330 1320 32 02 2 344217604 09 1193 + 046331 1320 32 03 2 344217604 10 1193 + 046332 1320 32 04 2 344217604 11 1193 + 046333 1320 32 05 2 344217604 12 1193 + 046334 1320 32 06 2 344217604 13 1193 + 046335 1320 32 07 2 344217604 14 1193 + 046336 1320 32 08 2 344217604 15 1193 + 046337 1320 33 01 2 344581124 00 1354 + 046338 1320 33 02 2 344581124 01 1354 + 046339 1320 33 03 2 344581124 02 1354 + 046340 1320 33 04 2 344581124 03 1354 + 046341 1320 33 05 2 344581124 04 1354 + 046342 1320 33 06 2 344581124 05 1354 + 046343 1320 33 07 2 344581124 06 1354 + 046344 1320 33 08 2 344581124 07 1354 + 046345 1320 34 01 2 344581124 08 1354 + 046346 1320 34 02 2 344581124 09 1354 + 046347 1320 34 03 2 344581124 10 1354 + 046348 1320 34 04 2 344581124 11 1354 + 046349 1320 34 05 2 344581124 12 1354 + 046350 1320 34 06 2 344581124 13 1354 + 046351 1320 34 07 2 344581124 14 1354 + 046352 1320 34 08 2 344581124 15 1354 + 046353 1320 35 01 2 344582148 00 1355 + 046354 1320 35 02 2 344582148 01 1355 + 046355 1320 35 03 2 344582148 02 1355 + 046356 1320 35 04 2 344582148 03 1355 + 046357 1320 35 05 2 344582148 04 1355 + 046358 1320 35 06 2 344582148 05 1355 + 046359 1320 35 07 2 344582148 06 1355 + 046360 1320 35 08 2 344582148 07 1355 + 046361 1320 36 01 2 344582148 08 1355 + 046362 1320 36 02 2 344582148 09 1355 + 046363 1320 36 03 2 344582148 10 1355 + 046364 1320 36 04 2 344582148 11 1355 + 046365 1320 36 05 2 344582148 12 1355 + 046366 1320 36 06 2 344582148 13 1355 + 046367 1320 36 07 2 344582148 14 1355 + 046368 1320 36 08 2 344582148 15 1355 + 046369 1320 37 01 2 344478724 00 1304 + 046370 1320 37 02 2 344478724 01 1304 + 046371 1320 37 03 2 344478724 02 1304 + 046372 1320 37 04 2 344478724 03 1304 + 046373 1320 37 05 2 344478724 04 1304 + 046374 1320 37 06 2 344478724 05 1304 + 046375 1320 37 07 2 344478724 06 1304 + 046376 1320 37 08 2 344478724 07 1304 + 046377 1320 38 01 2 344478724 08 1304 + 046378 1320 38 02 2 344478724 09 1304 + 046379 1320 38 03 2 344478724 10 1304 + 046380 1320 38 04 2 344478724 11 1304 + 046381 1320 38 05 2 344478724 12 1304 + 046382 1320 38 06 2 344478724 13 1304 + 046383 1320 38 07 2 344478724 14 1304 + 046384 1320 38 08 2 344478724 15 1304 + 046385 1320 39 01 2 344479748 00 1305 + 046386 1320 39 02 2 344479748 01 1305 + 046387 1320 39 03 2 344479748 02 1305 + 046388 1320 39 04 2 344479748 03 1305 + 046389 1320 39 05 2 344479748 04 1305 + 046390 1320 39 06 2 344479748 05 1305 + 046391 1320 39 07 2 344479748 06 1305 + 046392 1320 39 08 2 344479748 07 1305 + 046393 1320 40 01 2 344479748 08 1305 + 046394 1320 40 02 2 344479748 09 1305 + 046395 1320 40 03 2 344479748 10 1305 + 046396 1320 40 04 2 344479748 11 1305 + 046397 1320 40 05 2 344479748 12 1305 + 046398 1320 40 06 2 344479748 13 1305 + 046399 1320 40 07 2 344479748 14 1305 + 046400 1320 40 08 2 344479748 15 1305 + 046401 1320 41 01 2 344843268 00 1466 + 046402 1320 41 02 2 344843268 01 1466 + 046403 1320 41 03 2 344843268 02 1466 + 046404 1320 41 04 2 344843268 03 1466 + 046405 1320 41 05 2 344843268 04 1466 + 046406 1320 41 06 2 344843268 05 1466 + 046407 1320 41 07 2 344843268 06 1466 + 046408 1320 41 08 2 344843268 07 1466 + 046409 1320 42 01 2 344843268 08 1466 + 046410 1320 42 02 2 344843268 09 1466 + 046411 1320 42 03 2 344843268 10 1466 + 046412 1320 42 04 2 344843268 11 1466 + 046413 1320 42 05 2 344843268 12 1466 + 046414 1320 42 06 2 344843268 13 1466 + 046415 1320 42 07 2 344843268 14 1466 + 046416 1320 42 08 2 344843268 15 1466 + 046417 1320 43 01 2 344844292 00 1467 + 046418 1320 43 02 2 344844292 01 1467 + 046419 1320 43 03 2 344844292 02 1467 + 046420 1320 43 04 2 344844292 03 1467 + 046421 1320 43 05 2 344844292 04 1467 + 046422 1320 43 06 2 344844292 05 1467 + 046423 1320 43 07 2 344844292 06 1467 + 046424 1320 43 08 2 344844292 07 1467 + 046425 1320 44 01 2 344844292 08 1467 + 046426 1320 44 02 2 344844292 09 1467 + 046427 1320 44 03 2 344844292 10 1467 + 046428 1320 44 04 2 344844292 11 1467 + 046429 1320 44 05 2 344844292 12 1467 + 046430 1320 44 06 2 344844292 13 1467 + 046431 1320 44 07 2 344844292 14 1467 + 046432 1320 44 08 2 344844292 15 1467 + 046433 1320 45 01 2 344740868 00 1416 + 046434 1320 45 02 2 344740868 01 1416 + 046435 1320 45 03 2 344740868 02 1416 + 046436 1320 45 04 2 344740868 03 1416 + 046437 1320 45 05 2 344740868 04 1416 + 046438 1320 45 06 2 344740868 05 1416 + 046439 1320 45 07 2 344740868 06 1416 + 046440 1320 45 08 2 344740868 07 1416 + 046441 1320 46 01 2 344740868 08 1416 + 046442 1320 46 02 2 344740868 09 1416 + 046443 1320 46 03 2 344740868 10 1416 + 046444 1320 46 04 2 344740868 11 1416 + 046445 1320 46 05 2 344740868 12 1416 + 046446 1320 46 06 2 344740868 13 1416 + 046447 1320 46 07 2 344740868 14 1416 + 046448 1320 46 08 2 344740868 15 1416 + 046449 1320 47 01 2 344741892 00 1417 + 046450 1320 47 02 2 344741892 01 1417 + 046451 1320 47 03 2 344741892 02 1417 + 046452 1320 47 04 2 344741892 03 1417 + 046453 1320 47 05 2 344741892 04 1417 + 046454 1320 47 06 2 344741892 05 1417 + 046455 1320 47 07 2 344741892 06 1417 + 046456 1320 47 08 2 344741892 07 1417 + 046457 1320 48 01 2 344741892 08 1417 + 046458 1320 48 02 2 344741892 09 1417 + 046459 1320 48 03 2 344741892 10 1417 + 046460 1320 48 04 2 344741892 11 1417 + 046461 1320 48 05 2 344741892 12 1417 + 046462 1320 48 06 2 344741892 13 1417 + 046463 1320 48 07 2 344741892 14 1417 + 046464 1320 48 08 2 344741892 15 1417 + 046465 1321 01 01 2 344314884 00 1240 + 046466 1321 01 02 2 344314884 01 1240 + 046467 1321 01 03 2 344314884 02 1240 + 046468 1321 01 04 2 344314884 03 1240 + 046469 1321 01 05 2 344314884 04 1240 + 046470 1321 01 06 2 344314884 05 1240 + 046471 1321 01 07 2 344314884 06 1240 + 046472 1321 01 08 2 344314884 07 1240 + 046473 1321 02 01 2 344314884 08 1240 + 046474 1321 02 02 2 344314884 09 1240 + 046475 1321 02 03 2 344314884 10 1240 + 046476 1321 02 04 2 344314884 11 1240 + 046477 1321 02 05 2 344314884 12 1240 + 046478 1321 02 06 2 344314884 13 1240 + 046479 1321 02 07 2 344314884 14 1240 + 046480 1321 02 08 2 344314884 15 1240 + 046481 1321 03 01 2 344315908 00 1241 + 046482 1321 03 02 2 344315908 01 1241 + 046483 1321 03 03 2 344315908 02 1241 + 046484 1321 03 04 2 344315908 03 1241 + 046485 1321 03 05 2 344315908 04 1241 + 046486 1321 03 06 2 344315908 05 1241 + 046487 1321 03 07 2 344315908 06 1241 + 046488 1321 03 08 2 344315908 07 1241 + 046489 1321 04 01 2 344315908 08 1241 + 046490 1321 04 02 2 344315908 09 1241 + 046491 1321 04 03 2 344315908 10 1241 + 046492 1321 04 04 2 344315908 11 1241 + 046493 1321 04 05 2 344315908 12 1241 + 046494 1321 04 06 2 344315908 13 1241 + 046495 1321 04 07 2 344315908 14 1241 + 046496 1321 04 08 2 344315908 15 1241 + 046497 1321 05 01 2 344212484 00 1190 + 046498 1321 05 02 2 344212484 01 1190 + 046499 1321 05 03 2 344212484 02 1190 + 046500 1321 05 04 2 344212484 03 1190 + 046501 1321 05 05 2 344212484 04 1190 + 046502 1321 05 06 2 344212484 05 1190 + 046503 1321 05 07 2 344212484 06 1190 + 046504 1321 05 08 2 344212484 07 1190 + 046505 1321 06 01 2 344212484 08 1190 + 046506 1321 06 02 2 344212484 09 1190 + 046507 1321 06 03 2 344212484 10 1190 + 046508 1321 06 04 2 344212484 11 1190 + 046509 1321 06 05 2 344212484 12 1190 + 046510 1321 06 06 2 344212484 13 1190 + 046511 1321 06 07 2 344212484 14 1190 + 046512 1321 06 08 2 344212484 15 1190 + 046513 1321 07 01 2 344213508 00 1191 + 046514 1321 07 02 2 344213508 01 1191 + 046515 1321 07 03 2 344213508 02 1191 + 046516 1321 07 04 2 344213508 03 1191 + 046517 1321 07 05 2 344213508 04 1191 + 046518 1321 07 06 2 344213508 05 1191 + 046519 1321 07 07 2 344213508 06 1191 + 046520 1321 07 08 2 344213508 07 1191 + 046521 1321 08 01 2 344213508 08 1191 + 046522 1321 08 02 2 344213508 09 1191 + 046523 1321 08 03 2 344213508 10 1191 + 046524 1321 08 04 2 344213508 11 1191 + 046525 1321 08 05 2 344213508 12 1191 + 046526 1321 08 06 2 344213508 13 1191 + 046527 1321 08 07 2 344213508 14 1191 + 046528 1321 08 08 2 344213508 15 1191 + 046529 1321 09 01 2 344577028 00 1352 + 046530 1321 09 02 2 344577028 01 1352 + 046531 1321 09 03 2 344577028 02 1352 + 046532 1321 09 04 2 344577028 03 1352 + 046533 1321 09 05 2 344577028 04 1352 + 046534 1321 09 06 2 344577028 05 1352 + 046535 1321 09 07 2 344577028 06 1352 + 046536 1321 09 08 2 344577028 07 1352 + 046537 1321 10 01 2 344577028 08 1352 + 046538 1321 10 02 2 344577028 09 1352 + 046539 1321 10 03 2 344577028 10 1352 + 046540 1321 10 04 2 344577028 11 1352 + 046541 1321 10 05 2 344577028 12 1352 + 046542 1321 10 06 2 344577028 13 1352 + 046543 1321 10 07 2 344577028 14 1352 + 046544 1321 10 08 2 344577028 15 1352 + 046545 1321 11 01 2 344578052 00 1353 + 046546 1321 11 02 2 344578052 01 1353 + 046547 1321 11 03 2 344578052 02 1353 + 046548 1321 11 04 2 344578052 03 1353 + 046549 1321 11 05 2 344578052 04 1353 + 046550 1321 11 06 2 344578052 05 1353 + 046551 1321 11 07 2 344578052 06 1353 + 046552 1321 11 08 2 344578052 07 1353 + 046553 1321 12 01 2 344578052 08 1353 + 046554 1321 12 02 2 344578052 09 1353 + 046555 1321 12 03 2 344578052 10 1353 + 046556 1321 12 04 2 344578052 11 1353 + 046557 1321 12 05 2 344578052 12 1353 + 046558 1321 12 06 2 344578052 13 1353 + 046559 1321 12 07 2 344578052 14 1353 + 046560 1321 12 08 2 344578052 15 1353 + 046561 1321 13 01 2 344474628 00 1302 + 046562 1321 13 02 2 344474628 01 1302 + 046563 1321 13 03 2 344474628 02 1302 + 046564 1321 13 04 2 344474628 03 1302 + 046565 1321 13 05 2 344474628 04 1302 + 046566 1321 13 06 2 344474628 05 1302 + 046567 1321 13 07 2 344474628 06 1302 + 046568 1321 13 08 2 344474628 07 1302 + 046569 1321 14 01 2 344474628 08 1302 + 046570 1321 14 02 2 344474628 09 1302 + 046571 1321 14 03 2 344474628 10 1302 + 046572 1321 14 04 2 344474628 11 1302 + 046573 1321 14 05 2 344474628 12 1302 + 046574 1321 14 06 2 344474628 13 1302 + 046575 1321 14 07 2 344474628 14 1302 + 046576 1321 14 08 2 344474628 15 1302 + 046577 1321 15 01 2 344475652 00 1303 + 046578 1321 15 02 2 344475652 01 1303 + 046579 1321 15 03 2 344475652 02 1303 + 046580 1321 15 04 2 344475652 03 1303 + 046581 1321 15 05 2 344475652 04 1303 + 046582 1321 15 06 2 344475652 05 1303 + 046583 1321 15 07 2 344475652 06 1303 + 046584 1321 15 08 2 344475652 07 1303 + 046585 1321 16 01 2 344475652 08 1303 + 046586 1321 16 02 2 344475652 09 1303 + 046587 1321 16 03 2 344475652 10 1303 + 046588 1321 16 04 2 344475652 11 1303 + 046589 1321 16 05 2 344475652 12 1303 + 046590 1321 16 06 2 344475652 13 1303 + 046591 1321 16 07 2 344475652 14 1303 + 046592 1321 16 08 2 344475652 15 1303 + 046593 1321 17 01 2 344839172 00 1464 + 046594 1321 17 02 2 344839172 01 1464 + 046595 1321 17 03 2 344839172 02 1464 + 046596 1321 17 04 2 344839172 03 1464 + 046597 1321 17 05 2 344839172 04 1464 + 046598 1321 17 06 2 344839172 05 1464 + 046599 1321 17 07 2 344839172 06 1464 + 046600 1321 17 08 2 344839172 07 1464 + 046601 1321 18 01 2 344839172 08 1464 + 046602 1321 18 02 2 344839172 09 1464 + 046603 1321 18 03 2 344839172 10 1464 + 046604 1321 18 04 2 344839172 11 1464 + 046605 1321 18 05 2 344839172 12 1464 + 046606 1321 18 06 2 344839172 13 1464 + 046607 1321 18 07 2 344839172 14 1464 + 046608 1321 18 08 2 344839172 15 1464 + 046609 1321 19 01 2 344840196 00 1465 + 046610 1321 19 02 2 344840196 01 1465 + 046611 1321 19 03 2 344840196 02 1465 + 046612 1321 19 04 2 344840196 03 1465 + 046613 1321 19 05 2 344840196 04 1465 + 046614 1321 19 06 2 344840196 05 1465 + 046615 1321 19 07 2 344840196 06 1465 + 046616 1321 19 08 2 344840196 07 1465 + 046617 1321 20 01 2 344840196 08 1465 + 046618 1321 20 02 2 344840196 09 1465 + 046619 1321 20 03 2 344840196 10 1465 + 046620 1321 20 04 2 344840196 11 1465 + 046621 1321 20 05 2 344840196 12 1465 + 046622 1321 20 06 2 344840196 13 1465 + 046623 1321 20 07 2 344840196 14 1465 + 046624 1321 20 08 2 344840196 15 1465 + 046625 1321 21 01 2 344736772 00 1414 + 046626 1321 21 02 2 344736772 01 1414 + 046627 1321 21 03 2 344736772 02 1414 + 046628 1321 21 04 2 344736772 03 1414 + 046629 1321 21 05 2 344736772 04 1414 + 046630 1321 21 06 2 344736772 05 1414 + 046631 1321 21 07 2 344736772 06 1414 + 046632 1321 21 08 2 344736772 07 1414 + 046633 1321 22 01 2 344736772 08 1414 + 046634 1321 22 02 2 344736772 09 1414 + 046635 1321 22 03 2 344736772 10 1414 + 046636 1321 22 04 2 344736772 11 1414 + 046637 1321 22 05 2 344736772 12 1414 + 046638 1321 22 06 2 344736772 13 1414 + 046639 1321 22 07 2 344736772 14 1414 + 046640 1321 22 08 2 344736772 15 1414 + 046641 1321 23 01 2 344737796 00 1415 + 046642 1321 23 02 2 344737796 01 1415 + 046643 1321 23 03 2 344737796 02 1415 + 046644 1321 23 04 2 344737796 03 1415 + 046645 1321 23 05 2 344737796 04 1415 + 046646 1321 23 06 2 344737796 05 1415 + 046647 1321 23 07 2 344737796 06 1415 + 046648 1321 23 08 2 344737796 07 1415 + 046649 1321 24 01 2 344737796 08 1415 + 046650 1321 24 02 2 344737796 09 1415 + 046651 1321 24 03 2 344737796 10 1415 + 046652 1321 24 04 2 344737796 11 1415 + 046653 1321 24 05 2 344737796 12 1415 + 046654 1321 24 06 2 344737796 13 1415 + 046655 1321 24 07 2 344737796 14 1415 + 046656 1321 24 08 2 344737796 15 1415 + 046657 1321 25 01 2 344310788 00 1238 + 046658 1321 25 02 2 344310788 01 1238 + 046659 1321 25 03 2 344310788 02 1238 + 046660 1321 25 04 2 344310788 03 1238 + 046661 1321 25 05 2 344310788 04 1238 + 046662 1321 25 06 2 344310788 05 1238 + 046663 1321 25 07 2 344310788 06 1238 + 046664 1321 25 08 2 344310788 07 1238 + 046665 1321 26 01 2 344310788 08 1238 + 046666 1321 26 02 2 344310788 09 1238 + 046667 1321 26 03 2 344310788 10 1238 + 046668 1321 26 04 2 344310788 11 1238 + 046669 1321 26 05 2 344310788 12 1238 + 046670 1321 26 06 2 344310788 13 1238 + 046671 1321 26 07 2 344310788 14 1238 + 046672 1321 26 08 2 344310788 15 1238 + 046673 1321 27 01 2 344311812 00 1239 + 046674 1321 27 02 2 344311812 01 1239 + 046675 1321 27 03 2 344311812 02 1239 + 046676 1321 27 04 2 344311812 03 1239 + 046677 1321 27 05 2 344311812 04 1239 + 046678 1321 27 06 2 344311812 05 1239 + 046679 1321 27 07 2 344311812 06 1239 + 046680 1321 27 08 2 344311812 07 1239 + 046681 1321 28 01 2 344311812 08 1239 + 046682 1321 28 02 2 344311812 09 1239 + 046683 1321 28 03 2 344311812 10 1239 + 046684 1321 28 04 2 344311812 11 1239 + 046685 1321 28 05 2 344311812 12 1239 + 046686 1321 28 06 2 344311812 13 1239 + 046687 1321 28 07 2 344311812 14 1239 + 046688 1321 28 08 2 344311812 15 1239 + 046689 1321 29 01 2 344306692 00 1236 + 046690 1321 29 02 2 344306692 01 1236 + 046691 1321 29 03 2 344306692 02 1236 + 046692 1321 29 04 2 344306692 03 1236 + 046693 1321 29 05 2 344306692 04 1236 + 046694 1321 29 06 2 344306692 05 1236 + 046695 1321 29 07 2 344306692 06 1236 + 046696 1321 29 08 2 344306692 07 1236 + 046697 1321 30 01 2 344306692 08 1236 + 046698 1321 30 02 2 344306692 09 1236 + 046699 1321 30 03 2 344306692 10 1236 + 046700 1321 30 04 2 344306692 11 1236 + 046701 1321 30 05 2 344306692 12 1236 + 046702 1321 30 06 2 344306692 13 1236 + 046703 1321 30 07 2 344306692 14 1236 + 046704 1321 30 08 2 344306692 15 1236 + 046705 1321 31 01 2 344307716 00 1237 + 046706 1321 31 02 2 344307716 01 1237 + 046707 1321 31 03 2 344307716 02 1237 + 046708 1321 31 04 2 344307716 03 1237 + 046709 1321 31 05 2 344307716 04 1237 + 046710 1321 31 06 2 344307716 05 1237 + 046711 1321 31 07 2 344307716 06 1237 + 046712 1321 31 08 2 344307716 07 1237 + 046713 1321 32 01 2 344307716 08 1237 + 046714 1321 32 02 2 344307716 09 1237 + 046715 1321 32 03 2 344307716 10 1237 + 046716 1321 32 04 2 344307716 11 1237 + 046717 1321 32 05 2 344307716 12 1237 + 046718 1321 32 06 2 344307716 13 1237 + 046719 1321 32 07 2 344307716 14 1237 + 046720 1321 32 08 2 344307716 15 1237 + 046721 1321 33 01 2 344572932 00 1350 + 046722 1321 33 02 2 344572932 01 1350 + 046723 1321 33 03 2 344572932 02 1350 + 046724 1321 33 04 2 344572932 03 1350 + 046725 1321 33 05 2 344572932 04 1350 + 046726 1321 33 06 2 344572932 05 1350 + 046727 1321 33 07 2 344572932 06 1350 + 046728 1321 33 08 2 344572932 07 1350 + 046729 1321 34 01 2 344572932 08 1350 + 046730 1321 34 02 2 344572932 09 1350 + 046731 1321 34 03 2 344572932 10 1350 + 046732 1321 34 04 2 344572932 11 1350 + 046733 1321 34 05 2 344572932 12 1350 + 046734 1321 34 06 2 344572932 13 1350 + 046735 1321 34 07 2 344572932 14 1350 + 046736 1321 34 08 2 344572932 15 1350 + 046737 1321 35 01 2 344573956 00 1351 + 046738 1321 35 02 2 344573956 01 1351 + 046739 1321 35 03 2 344573956 02 1351 + 046740 1321 35 04 2 344573956 03 1351 + 046741 1321 35 05 2 344573956 04 1351 + 046742 1321 35 06 2 344573956 05 1351 + 046743 1321 35 07 2 344573956 06 1351 + 046744 1321 35 08 2 344573956 07 1351 + 046745 1321 36 01 2 344573956 08 1351 + 046746 1321 36 02 2 344573956 09 1351 + 046747 1321 36 03 2 344573956 10 1351 + 046748 1321 36 04 2 344573956 11 1351 + 046749 1321 36 05 2 344573956 12 1351 + 046750 1321 36 06 2 344573956 13 1351 + 046751 1321 36 07 2 344573956 14 1351 + 046752 1321 36 08 2 344573956 15 1351 + 046753 1321 37 01 2 344568836 00 1348 + 046754 1321 37 02 2 344568836 01 1348 + 046755 1321 37 03 2 344568836 02 1348 + 046756 1321 37 04 2 344568836 03 1348 + 046757 1321 37 05 2 344568836 04 1348 + 046758 1321 37 06 2 344568836 05 1348 + 046759 1321 37 07 2 344568836 06 1348 + 046760 1321 37 08 2 344568836 07 1348 + 046761 1321 38 01 2 344568836 08 1348 + 046762 1321 38 02 2 344568836 09 1348 + 046763 1321 38 03 2 344568836 10 1348 + 046764 1321 38 04 2 344568836 11 1348 + 046765 1321 38 05 2 344568836 12 1348 + 046766 1321 38 06 2 344568836 13 1348 + 046767 1321 38 07 2 344568836 14 1348 + 046768 1321 38 08 2 344568836 15 1348 + 046769 1321 39 01 2 344569860 00 1349 + 046770 1321 39 02 2 344569860 01 1349 + 046771 1321 39 03 2 344569860 02 1349 + 046772 1321 39 04 2 344569860 03 1349 + 046773 1321 39 05 2 344569860 04 1349 + 046774 1321 39 06 2 344569860 05 1349 + 046775 1321 39 07 2 344569860 06 1349 + 046776 1321 39 08 2 344569860 07 1349 + 046777 1321 40 01 2 344569860 08 1349 + 046778 1321 40 02 2 344569860 09 1349 + 046779 1321 40 03 2 344569860 10 1349 + 046780 1321 40 04 2 344569860 11 1349 + 046781 1321 40 05 2 344569860 12 1349 + 046782 1321 40 06 2 344569860 13 1349 + 046783 1321 40 07 2 344569860 14 1349 + 046784 1321 40 08 2 344569860 15 1349 + 046785 1321 41 01 2 344835076 00 1462 + 046786 1321 41 02 2 344835076 01 1462 + 046787 1321 41 03 2 344835076 02 1462 + 046788 1321 41 04 2 344835076 03 1462 + 046789 1321 41 05 2 344835076 04 1462 + 046790 1321 41 06 2 344835076 05 1462 + 046791 1321 41 07 2 344835076 06 1462 + 046792 1321 41 08 2 344835076 07 1462 + 046793 1321 42 01 2 344835076 08 1462 + 046794 1321 42 02 2 344835076 09 1462 + 046795 1321 42 03 2 344835076 10 1462 + 046796 1321 42 04 2 344835076 11 1462 + 046797 1321 42 05 2 344835076 12 1462 + 046798 1321 42 06 2 344835076 13 1462 + 046799 1321 42 07 2 344835076 14 1462 + 046800 1321 42 08 2 344835076 15 1462 + 046801 1321 43 01 2 344836100 00 1463 + 046802 1321 43 02 2 344836100 01 1463 + 046803 1321 43 03 2 344836100 02 1463 + 046804 1321 43 04 2 344836100 03 1463 + 046805 1321 43 05 2 344836100 04 1463 + 046806 1321 43 06 2 344836100 05 1463 + 046807 1321 43 07 2 344836100 06 1463 + 046808 1321 43 08 2 344836100 07 1463 + 046809 1321 44 01 2 344836100 08 1463 + 046810 1321 44 02 2 344836100 09 1463 + 046811 1321 44 03 2 344836100 10 1463 + 046812 1321 44 04 2 344836100 11 1463 + 046813 1321 44 05 2 344836100 12 1463 + 046814 1321 44 06 2 344836100 13 1463 + 046815 1321 44 07 2 344836100 14 1463 + 046816 1321 44 08 2 344836100 15 1463 + 046817 1321 45 01 2 344830980 00 1460 + 046818 1321 45 02 2 344830980 01 1460 + 046819 1321 45 03 2 344830980 02 1460 + 046820 1321 45 04 2 344830980 03 1460 + 046821 1321 45 05 2 344830980 04 1460 + 046822 1321 45 06 2 344830980 05 1460 + 046823 1321 45 07 2 344830980 06 1460 + 046824 1321 45 08 2 344830980 07 1460 + 046825 1321 46 01 2 344830980 08 1460 + 046826 1321 46 02 2 344830980 09 1460 + 046827 1321 46 03 2 344830980 10 1460 + 046828 1321 46 04 2 344830980 11 1460 + 046829 1321 46 05 2 344830980 12 1460 + 046830 1321 46 06 2 344830980 13 1460 + 046831 1321 46 07 2 344830980 14 1460 + 046832 1321 46 08 2 344830980 15 1460 + 046833 1321 47 01 2 344832004 00 1461 + 046834 1321 47 02 2 344832004 01 1461 + 046835 1321 47 03 2 344832004 02 1461 + 046836 1321 47 04 2 344832004 03 1461 + 046837 1321 47 05 2 344832004 04 1461 + 046838 1321 47 06 2 344832004 05 1461 + 046839 1321 47 07 2 344832004 06 1461 + 046840 1321 47 08 2 344832004 07 1461 + 046841 1321 48 01 2 344832004 08 1461 + 046842 1321 48 02 2 344832004 09 1461 + 046843 1321 48 03 2 344832004 10 1461 + 046844 1321 48 04 2 344832004 11 1461 + 046845 1321 48 05 2 344832004 12 1461 + 046846 1321 48 06 2 344832004 13 1461 + 046847 1321 48 07 2 344832004 14 1461 + 046848 1321 48 08 2 344832004 15 1461 + 046849 1322 01 01 2 344208388 00 1188 + 046850 1322 01 02 2 344208388 01 1188 + 046851 1322 01 03 2 344208388 02 1188 + 046852 1322 01 04 2 344208388 03 1188 + 046853 1322 01 05 2 344208388 04 1188 + 046854 1322 01 06 2 344208388 05 1188 + 046855 1322 01 07 2 344208388 06 1188 + 046856 1322 01 08 2 344208388 07 1188 + 046857 1322 02 01 2 344208388 08 1188 + 046858 1322 02 02 2 344208388 09 1188 + 046859 1322 02 03 2 344208388 10 1188 + 046860 1322 02 04 2 344208388 11 1188 + 046861 1322 02 05 2 344208388 12 1188 + 046862 1322 02 06 2 344208388 13 1188 + 046863 1322 02 07 2 344208388 14 1188 + 046864 1322 02 08 2 344208388 15 1188 + 046865 1322 03 01 2 344209412 00 1189 + 046866 1322 03 02 2 344209412 01 1189 + 046867 1322 03 03 2 344209412 02 1189 + 046868 1322 03 04 2 344209412 03 1189 + 046869 1322 03 05 2 344209412 04 1189 + 046870 1322 03 06 2 344209412 05 1189 + 046871 1322 03 07 2 344209412 06 1189 + 046872 1322 03 08 2 344209412 07 1189 + 046873 1322 04 01 2 344209412 08 1189 + 046874 1322 04 02 2 344209412 09 1189 + 046875 1322 04 03 2 344209412 10 1189 + 046876 1322 04 04 2 344209412 11 1189 + 046877 1322 04 05 2 344209412 12 1189 + 046878 1322 04 06 2 344209412 13 1189 + 046879 1322 04 07 2 344209412 14 1189 + 046880 1322 04 08 2 344209412 15 1189 + 046881 1322 05 01 2 344302596 00 1234 + 046882 1322 05 02 2 344302596 01 1234 + 046883 1322 05 03 2 344302596 02 1234 + 046884 1322 05 04 2 344302596 03 1234 + 046885 1322 05 05 2 344302596 04 1234 + 046886 1322 05 06 2 344302596 05 1234 + 046887 1322 05 07 2 344302596 06 1234 + 046888 1322 05 08 2 344302596 07 1234 + 046889 1322 06 01 2 344302596 08 1234 + 046890 1322 06 02 2 344302596 09 1234 + 046891 1322 06 03 2 344302596 10 1234 + 046892 1322 06 04 2 344302596 11 1234 + 046893 1322 06 05 2 344302596 12 1234 + 046894 1322 06 06 2 344302596 13 1234 + 046895 1322 06 07 2 344302596 14 1234 + 046896 1322 06 08 2 344302596 15 1234 + 046897 1322 07 01 2 344303620 00 1235 + 046898 1322 07 02 2 344303620 01 1235 + 046899 1322 07 03 2 344303620 02 1235 + 046900 1322 07 04 2 344303620 03 1235 + 046901 1322 07 05 2 344303620 04 1235 + 046902 1322 07 06 2 344303620 05 1235 + 046903 1322 07 07 2 344303620 06 1235 + 046904 1322 07 08 2 344303620 07 1235 + 046905 1322 08 01 2 344303620 08 1235 + 046906 1322 08 02 2 344303620 09 1235 + 046907 1322 08 03 2 344303620 10 1235 + 046908 1322 08 04 2 344303620 11 1235 + 046909 1322 08 05 2 344303620 12 1235 + 046910 1322 08 06 2 344303620 13 1235 + 046911 1322 08 07 2 344303620 14 1235 + 046912 1322 08 08 2 344303620 15 1235 + 046913 1322 09 01 2 344470532 00 1300 + 046914 1322 09 02 2 344470532 01 1300 + 046915 1322 09 03 2 344470532 02 1300 + 046916 1322 09 04 2 344470532 03 1300 + 046917 1322 09 05 2 344470532 04 1300 + 046918 1322 09 06 2 344470532 05 1300 + 046919 1322 09 07 2 344470532 06 1300 + 046920 1322 09 08 2 344470532 07 1300 + 046921 1322 10 01 2 344470532 08 1300 + 046922 1322 10 02 2 344470532 09 1300 + 046923 1322 10 03 2 344470532 10 1300 + 046924 1322 10 04 2 344470532 11 1300 + 046925 1322 10 05 2 344470532 12 1300 + 046926 1322 10 06 2 344470532 13 1300 + 046927 1322 10 07 2 344470532 14 1300 + 046928 1322 10 08 2 344470532 15 1300 + 046929 1322 11 01 2 344471556 00 1301 + 046930 1322 11 02 2 344471556 01 1301 + 046931 1322 11 03 2 344471556 02 1301 + 046932 1322 11 04 2 344471556 03 1301 + 046933 1322 11 05 2 344471556 04 1301 + 046934 1322 11 06 2 344471556 05 1301 + 046935 1322 11 07 2 344471556 06 1301 + 046936 1322 11 08 2 344471556 07 1301 + 046937 1322 12 01 2 344471556 08 1301 + 046938 1322 12 02 2 344471556 09 1301 + 046939 1322 12 03 2 344471556 10 1301 + 046940 1322 12 04 2 344471556 11 1301 + 046941 1322 12 05 2 344471556 12 1301 + 046942 1322 12 06 2 344471556 13 1301 + 046943 1322 12 07 2 344471556 14 1301 + 046944 1322 12 08 2 344471556 15 1301 + 046945 1322 13 01 2 344564740 00 1346 + 046946 1322 13 02 2 344564740 01 1346 + 046947 1322 13 03 2 344564740 02 1346 + 046948 1322 13 04 2 344564740 03 1346 + 046949 1322 13 05 2 344564740 04 1346 + 046950 1322 13 06 2 344564740 05 1346 + 046951 1322 13 07 2 344564740 06 1346 + 046952 1322 13 08 2 344564740 07 1346 + 046953 1322 14 01 2 344564740 08 1346 + 046954 1322 14 02 2 344564740 09 1346 + 046955 1322 14 03 2 344564740 10 1346 + 046956 1322 14 04 2 344564740 11 1346 + 046957 1322 14 05 2 344564740 12 1346 + 046958 1322 14 06 2 344564740 13 1346 + 046959 1322 14 07 2 344564740 14 1346 + 046960 1322 14 08 2 344564740 15 1346 + 046961 1322 15 01 2 344565764 00 1347 + 046962 1322 15 02 2 344565764 01 1347 + 046963 1322 15 03 2 344565764 02 1347 + 046964 1322 15 04 2 344565764 03 1347 + 046965 1322 15 05 2 344565764 04 1347 + 046966 1322 15 06 2 344565764 05 1347 + 046967 1322 15 07 2 344565764 06 1347 + 046968 1322 15 08 2 344565764 07 1347 + 046969 1322 16 01 2 344565764 08 1347 + 046970 1322 16 02 2 344565764 09 1347 + 046971 1322 16 03 2 344565764 10 1347 + 046972 1322 16 04 2 344565764 11 1347 + 046973 1322 16 05 2 344565764 12 1347 + 046974 1322 16 06 2 344565764 13 1347 + 046975 1322 16 07 2 344565764 14 1347 + 046976 1322 16 08 2 344565764 15 1347 + 046977 1322 17 01 2 344732676 00 1412 + 046978 1322 17 02 2 344732676 01 1412 + 046979 1322 17 03 2 344732676 02 1412 + 046980 1322 17 04 2 344732676 03 1412 + 046981 1322 17 05 2 344732676 04 1412 + 046982 1322 17 06 2 344732676 05 1412 + 046983 1322 17 07 2 344732676 06 1412 + 046984 1322 17 08 2 344732676 07 1412 + 046985 1322 18 01 2 344732676 08 1412 + 046986 1322 18 02 2 344732676 09 1412 + 046987 1322 18 03 2 344732676 10 1412 + 046988 1322 18 04 2 344732676 11 1412 + 046989 1322 18 05 2 344732676 12 1412 + 046990 1322 18 06 2 344732676 13 1412 + 046991 1322 18 07 2 344732676 14 1412 + 046992 1322 18 08 2 344732676 15 1412 + 046993 1322 19 01 2 344733700 00 1413 + 046994 1322 19 02 2 344733700 01 1413 + 046995 1322 19 03 2 344733700 02 1413 + 046996 1322 19 04 2 344733700 03 1413 + 046997 1322 19 05 2 344733700 04 1413 + 046998 1322 19 06 2 344733700 05 1413 + 046999 1322 19 07 2 344733700 06 1413 + 047000 1322 19 08 2 344733700 07 1413 + 047001 1322 20 01 2 344733700 08 1413 + 047002 1322 20 02 2 344733700 09 1413 + 047003 1322 20 03 2 344733700 10 1413 + 047004 1322 20 04 2 344733700 11 1413 + 047005 1322 20 05 2 344733700 12 1413 + 047006 1322 20 06 2 344733700 13 1413 + 047007 1322 20 07 2 344733700 14 1413 + 047008 1322 20 08 2 344733700 15 1413 + 047009 1322 21 01 2 344826884 00 1458 + 047010 1322 21 02 2 344826884 01 1458 + 047011 1322 21 03 2 344826884 02 1458 + 047012 1322 21 04 2 344826884 03 1458 + 047013 1322 21 05 2 344826884 04 1458 + 047014 1322 21 06 2 344826884 05 1458 + 047015 1322 21 07 2 344826884 06 1458 + 047016 1322 21 08 2 344826884 07 1458 + 047017 1322 22 01 2 344826884 08 1458 + 047018 1322 22 02 2 344826884 09 1458 + 047019 1322 22 03 2 344826884 10 1458 + 047020 1322 22 04 2 344826884 11 1458 + 047021 1322 22 05 2 344826884 12 1458 + 047022 1322 22 06 2 344826884 13 1458 + 047023 1322 22 07 2 344826884 14 1458 + 047024 1322 22 08 2 344826884 15 1458 + 047025 1322 23 01 2 344827908 00 1459 + 047026 1322 23 02 2 344827908 01 1459 + 047027 1322 23 03 2 344827908 02 1459 + 047028 1322 23 04 2 344827908 03 1459 + 047029 1322 23 05 2 344827908 04 1459 + 047030 1322 23 06 2 344827908 05 1459 + 047031 1322 23 07 2 344827908 06 1459 + 047032 1322 23 08 2 344827908 07 1459 + 047033 1322 24 01 2 344827908 08 1459 + 047034 1322 24 02 2 344827908 09 1459 + 047035 1322 24 03 2 344827908 10 1459 + 047036 1322 24 04 2 344827908 11 1459 + 047037 1322 24 05 2 344827908 12 1459 + 047038 1322 24 06 2 344827908 13 1459 + 047039 1322 24 07 2 344827908 14 1459 + 047040 1322 24 08 2 344827908 15 1459 + 047041 1322 25 01 2 344298500 00 1232 + 047042 1322 25 02 2 344298500 01 1232 + 047043 1322 25 03 2 344298500 02 1232 + 047044 1322 25 04 2 344298500 03 1232 + 047045 1322 25 05 2 344298500 04 1232 + 047046 1322 25 06 2 344298500 05 1232 + 047047 1322 25 07 2 344298500 06 1232 + 047048 1322 25 08 2 344298500 07 1232 + 047049 1322 26 01 2 344298500 08 1232 + 047050 1322 26 02 2 344298500 09 1232 + 047051 1322 26 03 2 344298500 10 1232 + 047052 1322 26 04 2 344298500 11 1232 + 047053 1322 26 05 2 344298500 12 1232 + 047054 1322 26 06 2 344298500 13 1232 + 047055 1322 26 07 2 344298500 14 1232 + 047056 1322 26 08 2 344298500 15 1232 + 047057 1322 27 01 2 344299524 00 1233 + 047058 1322 27 02 2 344299524 01 1233 + 047059 1322 27 03 2 344299524 02 1233 + 047060 1322 27 04 2 344299524 03 1233 + 047061 1322 27 05 2 344299524 04 1233 + 047062 1322 27 06 2 344299524 05 1233 + 047063 1322 27 07 2 344299524 06 1233 + 047064 1322 27 08 2 344299524 07 1233 + 047065 1322 28 01 2 344299524 08 1233 + 047066 1322 28 02 2 344299524 09 1233 + 047067 1322 28 03 2 344299524 10 1233 + 047068 1322 28 04 2 344299524 11 1233 + 047069 1322 28 05 2 344299524 12 1233 + 047070 1322 28 06 2 344299524 13 1233 + 047071 1322 28 07 2 344299524 14 1233 + 047072 1322 28 08 2 344299524 15 1233 + 047073 1322 29 01 2 344294404 00 1230 + 047074 1322 29 02 2 344294404 01 1230 + 047075 1322 29 03 2 344294404 02 1230 + 047076 1322 29 04 2 344294404 03 1230 + 047077 1322 29 05 2 344294404 04 1230 + 047078 1322 29 06 2 344294404 05 1230 + 047079 1322 29 07 2 344294404 06 1230 + 047080 1322 29 08 2 344294404 07 1230 + 047081 1322 30 01 2 344294404 08 1230 + 047082 1322 30 02 2 344294404 09 1230 + 047083 1322 30 03 2 344294404 10 1230 + 047084 1322 30 04 2 344294404 11 1230 + 047085 1322 30 05 2 344294404 12 1230 + 047086 1322 30 06 2 344294404 13 1230 + 047087 1322 30 07 2 344294404 14 1230 + 047088 1322 30 08 2 344294404 15 1230 + 047089 1322 31 01 2 344295428 00 1231 + 047090 1322 31 02 2 344295428 01 1231 + 047091 1322 31 03 2 344295428 02 1231 + 047092 1322 31 04 2 344295428 03 1231 + 047093 1322 31 05 2 344295428 04 1231 + 047094 1322 31 06 2 344295428 05 1231 + 047095 1322 31 07 2 344295428 06 1231 + 047096 1322 31 08 2 344295428 07 1231 + 047097 1322 32 01 2 344295428 08 1231 + 047098 1322 32 02 2 344295428 09 1231 + 047099 1322 32 03 2 344295428 10 1231 + 047100 1322 32 04 2 344295428 11 1231 + 047101 1322 32 05 2 344295428 12 1231 + 047102 1322 32 06 2 344295428 13 1231 + 047103 1322 32 07 2 344295428 14 1231 + 047104 1322 32 08 2 344295428 15 1231 + 047105 1322 33 01 2 344560644 00 1344 + 047106 1322 33 02 2 344560644 01 1344 + 047107 1322 33 03 2 344560644 02 1344 + 047108 1322 33 04 2 344560644 03 1344 + 047109 1322 33 05 2 344560644 04 1344 + 047110 1322 33 06 2 344560644 05 1344 + 047111 1322 33 07 2 344560644 06 1344 + 047112 1322 33 08 2 344560644 07 1344 + 047113 1322 34 01 2 344560644 08 1344 + 047114 1322 34 02 2 344560644 09 1344 + 047115 1322 34 03 2 344560644 10 1344 + 047116 1322 34 04 2 344560644 11 1344 + 047117 1322 34 05 2 344560644 12 1344 + 047118 1322 34 06 2 344560644 13 1344 + 047119 1322 34 07 2 344560644 14 1344 + 047120 1322 34 08 2 344560644 15 1344 + 047121 1322 35 01 2 344561668 00 1345 + 047122 1322 35 02 2 344561668 01 1345 + 047123 1322 35 03 2 344561668 02 1345 + 047124 1322 35 04 2 344561668 03 1345 + 047125 1322 35 05 2 344561668 04 1345 + 047126 1322 35 06 2 344561668 05 1345 + 047127 1322 35 07 2 344561668 06 1345 + 047128 1322 35 08 2 344561668 07 1345 + 047129 1322 36 01 2 344561668 08 1345 + 047130 1322 36 02 2 344561668 09 1345 + 047131 1322 36 03 2 344561668 10 1345 + 047132 1322 36 04 2 344561668 11 1345 + 047133 1322 36 05 2 344561668 12 1345 + 047134 1322 36 06 2 344561668 13 1345 + 047135 1322 36 07 2 344561668 14 1345 + 047136 1322 36 08 2 344561668 15 1345 + 047137 1322 37 01 2 344556548 00 1342 + 047138 1322 37 02 2 344556548 01 1342 + 047139 1322 37 03 2 344556548 02 1342 + 047140 1322 37 04 2 344556548 03 1342 + 047141 1322 37 05 2 344556548 04 1342 + 047142 1322 37 06 2 344556548 05 1342 + 047143 1322 37 07 2 344556548 06 1342 + 047144 1322 37 08 2 344556548 07 1342 + 047145 1322 38 01 2 344556548 08 1342 + 047146 1322 38 02 2 344556548 09 1342 + 047147 1322 38 03 2 344556548 10 1342 + 047148 1322 38 04 2 344556548 11 1342 + 047149 1322 38 05 2 344556548 12 1342 + 047150 1322 38 06 2 344556548 13 1342 + 047151 1322 38 07 2 344556548 14 1342 + 047152 1322 38 08 2 344556548 15 1342 + 047153 1322 39 01 2 344557572 00 1343 + 047154 1322 39 02 2 344557572 01 1343 + 047155 1322 39 03 2 344557572 02 1343 + 047156 1322 39 04 2 344557572 03 1343 + 047157 1322 39 05 2 344557572 04 1343 + 047158 1322 39 06 2 344557572 05 1343 + 047159 1322 39 07 2 344557572 06 1343 + 047160 1322 39 08 2 344557572 07 1343 + 047161 1322 40 01 2 344557572 08 1343 + 047162 1322 40 02 2 344557572 09 1343 + 047163 1322 40 03 2 344557572 10 1343 + 047164 1322 40 04 2 344557572 11 1343 + 047165 1322 40 05 2 344557572 12 1343 + 047166 1322 40 06 2 344557572 13 1343 + 047167 1322 40 07 2 344557572 14 1343 + 047168 1322 40 08 2 344557572 15 1343 + 047169 1322 41 01 2 344822788 00 1456 + 047170 1322 41 02 2 344822788 01 1456 + 047171 1322 41 03 2 344822788 02 1456 + 047172 1322 41 04 2 344822788 03 1456 + 047173 1322 41 05 2 344822788 04 1456 + 047174 1322 41 06 2 344822788 05 1456 + 047175 1322 41 07 2 344822788 06 1456 + 047176 1322 41 08 2 344822788 07 1456 + 047177 1322 42 01 2 344822788 08 1456 + 047178 1322 42 02 2 344822788 09 1456 + 047179 1322 42 03 2 344822788 10 1456 + 047180 1322 42 04 2 344822788 11 1456 + 047181 1322 42 05 2 344822788 12 1456 + 047182 1322 42 06 2 344822788 13 1456 + 047183 1322 42 07 2 344822788 14 1456 + 047184 1322 42 08 2 344822788 15 1456 + 047185 1322 43 01 2 344823812 00 1457 + 047186 1322 43 02 2 344823812 01 1457 + 047187 1322 43 03 2 344823812 02 1457 + 047188 1322 43 04 2 344823812 03 1457 + 047189 1322 43 05 2 344823812 04 1457 + 047190 1322 43 06 2 344823812 05 1457 + 047191 1322 43 07 2 344823812 06 1457 + 047192 1322 43 08 2 344823812 07 1457 + 047193 1322 44 01 2 344823812 08 1457 + 047194 1322 44 02 2 344823812 09 1457 + 047195 1322 44 03 2 344823812 10 1457 + 047196 1322 44 04 2 344823812 11 1457 + 047197 1322 44 05 2 344823812 12 1457 + 047198 1322 44 06 2 344823812 13 1457 + 047199 1322 44 07 2 344823812 14 1457 + 047200 1322 44 08 2 344823812 15 1457 + 047201 1322 45 01 2 344818692 00 1454 + 047202 1322 45 02 2 344818692 01 1454 + 047203 1322 45 03 2 344818692 02 1454 + 047204 1322 45 04 2 344818692 03 1454 + 047205 1322 45 05 2 344818692 04 1454 + 047206 1322 45 06 2 344818692 05 1454 + 047207 1322 45 07 2 344818692 06 1454 + 047208 1322 45 08 2 344818692 07 1454 + 047209 1322 46 01 2 344818692 08 1454 + 047210 1322 46 02 2 344818692 09 1454 + 047211 1322 46 03 2 344818692 10 1454 + 047212 1322 46 04 2 344818692 11 1454 + 047213 1322 46 05 2 344818692 12 1454 + 047214 1322 46 06 2 344818692 13 1454 + 047215 1322 46 07 2 344818692 14 1454 + 047216 1322 46 08 2 344818692 15 1454 + 047217 1322 47 01 2 344819716 00 1455 + 047218 1322 47 02 2 344819716 01 1455 + 047219 1322 47 03 2 344819716 02 1455 + 047220 1322 47 04 2 344819716 03 1455 + 047221 1322 47 05 2 344819716 04 1455 + 047222 1322 47 06 2 344819716 05 1455 + 047223 1322 47 07 2 344819716 06 1455 + 047224 1322 47 08 2 344819716 07 1455 + 047225 1322 48 01 2 344819716 08 1455 + 047226 1322 48 02 2 344819716 09 1455 + 047227 1322 48 03 2 344819716 10 1455 + 047228 1322 48 04 2 344819716 11 1455 + 047229 1322 48 05 2 344819716 12 1455 + 047230 1322 48 06 2 344819716 13 1455 + 047231 1322 48 07 2 344819716 14 1455 + 047232 1322 48 08 2 344819716 15 1455 + 047233 1323 01 01 2 344204292 00 1186 + 047234 1323 01 02 2 344204292 01 1186 + 047235 1323 01 03 2 344204292 02 1186 + 047236 1323 01 04 2 344204292 03 1186 + 047237 1323 01 05 2 344204292 04 1186 + 047238 1323 01 06 2 344204292 05 1186 + 047239 1323 01 07 2 344204292 06 1186 + 047240 1323 01 08 2 344204292 07 1186 + 047241 1323 02 01 2 344204292 08 1186 + 047242 1323 02 02 2 344204292 09 1186 + 047243 1323 02 03 2 344204292 10 1186 + 047244 1323 02 04 2 344204292 11 1186 + 047245 1323 02 05 2 344204292 12 1186 + 047246 1323 02 06 2 344204292 13 1186 + 047247 1323 02 07 2 344204292 14 1186 + 047248 1323 02 08 2 344204292 15 1186 + 047249 1323 03 01 2 344205316 00 1187 + 047250 1323 03 02 2 344205316 01 1187 + 047251 1323 03 03 2 344205316 02 1187 + 047252 1323 03 04 2 344205316 03 1187 + 047253 1323 03 05 2 344205316 04 1187 + 047254 1323 03 06 2 344205316 05 1187 + 047255 1323 03 07 2 344205316 06 1187 + 047256 1323 03 08 2 344205316 07 1187 + 047257 1323 04 01 2 344205316 08 1187 + 047258 1323 04 02 2 344205316 09 1187 + 047259 1323 04 03 2 344205316 10 1187 + 047260 1323 04 04 2 344205316 11 1187 + 047261 1323 04 05 2 344205316 12 1187 + 047262 1323 04 06 2 344205316 13 1187 + 047263 1323 04 07 2 344205316 14 1187 + 047264 1323 04 08 2 344205316 15 1187 + 047265 1323 05 01 2 344290308 00 1228 + 047266 1323 05 02 2 344290308 01 1228 + 047267 1323 05 03 2 344290308 02 1228 + 047268 1323 05 04 2 344290308 03 1228 + 047269 1323 05 05 2 344290308 04 1228 + 047270 1323 05 06 2 344290308 05 1228 + 047271 1323 05 07 2 344290308 06 1228 + 047272 1323 05 08 2 344290308 07 1228 + 047273 1323 06 01 2 344290308 08 1228 + 047274 1323 06 02 2 344290308 09 1228 + 047275 1323 06 03 2 344290308 10 1228 + 047276 1323 06 04 2 344290308 11 1228 + 047277 1323 06 05 2 344290308 12 1228 + 047278 1323 06 06 2 344290308 13 1228 + 047279 1323 06 07 2 344290308 14 1228 + 047280 1323 06 08 2 344290308 15 1228 + 047281 1323 07 01 2 344291332 00 1229 + 047282 1323 07 02 2 344291332 01 1229 + 047283 1323 07 03 2 344291332 02 1229 + 047284 1323 07 04 2 344291332 03 1229 + 047285 1323 07 05 2 344291332 04 1229 + 047286 1323 07 06 2 344291332 05 1229 + 047287 1323 07 07 2 344291332 06 1229 + 047288 1323 07 08 2 344291332 07 1229 + 047289 1323 08 01 2 344291332 08 1229 + 047290 1323 08 02 2 344291332 09 1229 + 047291 1323 08 03 2 344291332 10 1229 + 047292 1323 08 04 2 344291332 11 1229 + 047293 1323 08 05 2 344291332 12 1229 + 047294 1323 08 06 2 344291332 13 1229 + 047295 1323 08 07 2 344291332 14 1229 + 047296 1323 08 08 2 344291332 15 1229 + 047297 1323 09 01 2 344466436 00 1298 + 047298 1323 09 02 2 344466436 01 1298 + 047299 1323 09 03 2 344466436 02 1298 + 047300 1323 09 04 2 344466436 03 1298 + 047301 1323 09 05 2 344466436 04 1298 + 047302 1323 09 06 2 344466436 05 1298 + 047303 1323 09 07 2 344466436 06 1298 + 047304 1323 09 08 2 344466436 07 1298 + 047305 1323 10 01 2 344466436 08 1298 + 047306 1323 10 02 2 344466436 09 1298 + 047307 1323 10 03 2 344466436 10 1298 + 047308 1323 10 04 2 344466436 11 1298 + 047309 1323 10 05 2 344466436 12 1298 + 047310 1323 10 06 2 344466436 13 1298 + 047311 1323 10 07 2 344466436 14 1298 + 047312 1323 10 08 2 344466436 15 1298 + 047313 1323 11 01 2 344467460 00 1299 + 047314 1323 11 02 2 344467460 01 1299 + 047315 1323 11 03 2 344467460 02 1299 + 047316 1323 11 04 2 344467460 03 1299 + 047317 1323 11 05 2 344467460 04 1299 + 047318 1323 11 06 2 344467460 05 1299 + 047319 1323 11 07 2 344467460 06 1299 + 047320 1323 11 08 2 344467460 07 1299 + 047321 1323 12 01 2 344467460 08 1299 + 047322 1323 12 02 2 344467460 09 1299 + 047323 1323 12 03 2 344467460 10 1299 + 047324 1323 12 04 2 344467460 11 1299 + 047325 1323 12 05 2 344467460 12 1299 + 047326 1323 12 06 2 344467460 13 1299 + 047327 1323 12 07 2 344467460 14 1299 + 047328 1323 12 08 2 344467460 15 1299 + 047329 1323 13 01 2 344552452 00 1340 + 047330 1323 13 02 2 344552452 01 1340 + 047331 1323 13 03 2 344552452 02 1340 + 047332 1323 13 04 2 344552452 03 1340 + 047333 1323 13 05 2 344552452 04 1340 + 047334 1323 13 06 2 344552452 05 1340 + 047335 1323 13 07 2 344552452 06 1340 + 047336 1323 13 08 2 344552452 07 1340 + 047337 1323 14 01 2 344552452 08 1340 + 047338 1323 14 02 2 344552452 09 1340 + 047339 1323 14 03 2 344552452 10 1340 + 047340 1323 14 04 2 344552452 11 1340 + 047341 1323 14 05 2 344552452 12 1340 + 047342 1323 14 06 2 344552452 13 1340 + 047343 1323 14 07 2 344552452 14 1340 + 047344 1323 14 08 2 344552452 15 1340 + 047345 1323 15 01 2 344553476 00 1341 + 047346 1323 15 02 2 344553476 01 1341 + 047347 1323 15 03 2 344553476 02 1341 + 047348 1323 15 04 2 344553476 03 1341 + 047349 1323 15 05 2 344553476 04 1341 + 047350 1323 15 06 2 344553476 05 1341 + 047351 1323 15 07 2 344553476 06 1341 + 047352 1323 15 08 2 344553476 07 1341 + 047353 1323 16 01 2 344553476 08 1341 + 047354 1323 16 02 2 344553476 09 1341 + 047355 1323 16 03 2 344553476 10 1341 + 047356 1323 16 04 2 344553476 11 1341 + 047357 1323 16 05 2 344553476 12 1341 + 047358 1323 16 06 2 344553476 13 1341 + 047359 1323 16 07 2 344553476 14 1341 + 047360 1323 16 08 2 344553476 15 1341 + 047361 1323 17 01 2 344728580 00 1410 + 047362 1323 17 02 2 344728580 01 1410 + 047363 1323 17 03 2 344728580 02 1410 + 047364 1323 17 04 2 344728580 03 1410 + 047365 1323 17 05 2 344728580 04 1410 + 047366 1323 17 06 2 344728580 05 1410 + 047367 1323 17 07 2 344728580 06 1410 + 047368 1323 17 08 2 344728580 07 1410 + 047369 1323 18 01 2 344728580 08 1410 + 047370 1323 18 02 2 344728580 09 1410 + 047371 1323 18 03 2 344728580 10 1410 + 047372 1323 18 04 2 344728580 11 1410 + 047373 1323 18 05 2 344728580 12 1410 + 047374 1323 18 06 2 344728580 13 1410 + 047375 1323 18 07 2 344728580 14 1410 + 047376 1323 18 08 2 344728580 15 1410 + 047377 1323 19 01 2 344729604 00 1411 + 047378 1323 19 02 2 344729604 01 1411 + 047379 1323 19 03 2 344729604 02 1411 + 047380 1323 19 04 2 344729604 03 1411 + 047381 1323 19 05 2 344729604 04 1411 + 047382 1323 19 06 2 344729604 05 1411 + 047383 1323 19 07 2 344729604 06 1411 + 047384 1323 19 08 2 344729604 07 1411 + 047385 1323 20 01 2 344729604 08 1411 + 047386 1323 20 02 2 344729604 09 1411 + 047387 1323 20 03 2 344729604 10 1411 + 047388 1323 20 04 2 344729604 11 1411 + 047389 1323 20 05 2 344729604 12 1411 + 047390 1323 20 06 2 344729604 13 1411 + 047391 1323 20 07 2 344729604 14 1411 + 047392 1323 20 08 2 344729604 15 1411 + 047393 1323 21 01 2 344814596 00 1452 + 047394 1323 21 02 2 344814596 01 1452 + 047395 1323 21 03 2 344814596 02 1452 + 047396 1323 21 04 2 344814596 03 1452 + 047397 1323 21 05 2 344814596 04 1452 + 047398 1323 21 06 2 344814596 05 1452 + 047399 1323 21 07 2 344814596 06 1452 + 047400 1323 21 08 2 344814596 07 1452 + 047401 1323 22 01 2 344814596 08 1452 + 047402 1323 22 02 2 344814596 09 1452 + 047403 1323 22 03 2 344814596 10 1452 + 047404 1323 22 04 2 344814596 11 1452 + 047405 1323 22 05 2 344814596 12 1452 + 047406 1323 22 06 2 344814596 13 1452 + 047407 1323 22 07 2 344814596 14 1452 + 047408 1323 22 08 2 344814596 15 1452 + 047409 1323 23 01 2 344815620 00 1453 + 047410 1323 23 02 2 344815620 01 1453 + 047411 1323 23 03 2 344815620 02 1453 + 047412 1323 23 04 2 344815620 03 1453 + 047413 1323 23 05 2 344815620 04 1453 + 047414 1323 23 06 2 344815620 05 1453 + 047415 1323 23 07 2 344815620 06 1453 + 047416 1323 23 08 2 344815620 07 1453 + 047417 1323 24 01 2 344815620 08 1453 + 047418 1323 24 02 2 344815620 09 1453 + 047419 1323 24 03 2 344815620 10 1453 + 047420 1323 24 04 2 344815620 11 1453 + 047421 1323 24 05 2 344815620 12 1453 + 047422 1323 24 06 2 344815620 13 1453 + 047423 1323 24 07 2 344815620 14 1453 + 047424 1323 24 08 2 344815620 15 1453 + 047425 1323 25 01 2 344425476 00 1294 + 047426 1323 25 02 2 344425476 01 1294 + 047427 1323 25 03 2 344425476 02 1294 + 047428 1323 25 04 2 344425476 03 1294 + 047429 1323 25 05 2 344425476 04 1294 + 047430 1323 25 06 2 344425476 05 1294 + 047431 1323 25 07 2 344425476 06 1294 + 047432 1323 25 08 2 344425476 07 1294 + 047433 1323 26 01 2 344425476 08 1294 + 047434 1323 26 02 2 344425476 09 1294 + 047435 1323 26 03 2 344425476 10 1294 + 047436 1323 26 04 2 344425476 11 1294 + 047437 1323 26 05 2 344425476 12 1294 + 047438 1323 26 06 2 344425476 13 1294 + 047439 1323 26 07 2 344425476 14 1294 + 047440 1323 26 08 2 344425476 15 1294 + 047441 1323 27 01 2 344426500 00 1295 + 047442 1323 27 02 2 344426500 01 1295 + 047443 1323 27 03 2 344426500 02 1295 + 047444 1323 27 04 2 344426500 03 1295 + 047445 1323 27 05 2 344426500 04 1295 + 047446 1323 27 06 2 344426500 05 1295 + 047447 1323 27 07 2 344426500 06 1295 + 047448 1323 27 08 2 344426500 07 1295 + 047449 1323 28 01 2 344426500 08 1295 + 047450 1323 28 02 2 344426500 09 1295 + 047451 1323 28 03 2 344426500 10 1295 + 047452 1323 28 04 2 344426500 11 1295 + 047453 1323 28 05 2 344426500 12 1295 + 047454 1323 28 06 2 344426500 13 1295 + 047455 1323 28 07 2 344426500 14 1295 + 047456 1323 28 08 2 344426500 15 1295 + 047457 1323 29 01 2 344200196 00 1184 + 047458 1323 29 02 2 344200196 01 1184 + 047459 1323 29 03 2 344200196 02 1184 + 047460 1323 29 04 2 344200196 03 1184 + 047461 1323 29 05 2 344200196 04 1184 + 047462 1323 29 06 2 344200196 05 1184 + 047463 1323 29 07 2 344200196 06 1184 + 047464 1323 29 08 2 344200196 07 1184 + 047465 1323 30 01 2 344200196 08 1184 + 047466 1323 30 02 2 344200196 09 1184 + 047467 1323 30 03 2 344200196 10 1184 + 047468 1323 30 04 2 344200196 11 1184 + 047469 1323 30 05 2 344200196 12 1184 + 047470 1323 30 06 2 344200196 13 1184 + 047471 1323 30 07 2 344200196 14 1184 + 047472 1323 30 08 2 344200196 15 1184 + 047473 1323 31 01 2 344201220 00 1185 + 047474 1323 31 02 2 344201220 01 1185 + 047475 1323 31 03 2 344201220 02 1185 + 047476 1323 31 04 2 344201220 03 1185 + 047477 1323 31 05 2 344201220 04 1185 + 047478 1323 31 06 2 344201220 05 1185 + 047479 1323 31 07 2 344201220 06 1185 + 047480 1323 31 08 2 344201220 07 1185 + 047481 1323 32 01 2 344201220 08 1185 + 047482 1323 32 02 2 344201220 09 1185 + 047483 1323 32 03 2 344201220 10 1185 + 047484 1323 32 04 2 344201220 11 1185 + 047485 1323 32 05 2 344201220 12 1185 + 047486 1323 32 06 2 344201220 13 1185 + 047487 1323 32 07 2 344201220 14 1185 + 047488 1323 32 08 2 344201220 15 1185 + 047489 1323 33 01 2 344687620 00 1406 + 047490 1323 33 02 2 344687620 01 1406 + 047491 1323 33 03 2 344687620 02 1406 + 047492 1323 33 04 2 344687620 03 1406 + 047493 1323 33 05 2 344687620 04 1406 + 047494 1323 33 06 2 344687620 05 1406 + 047495 1323 33 07 2 344687620 06 1406 + 047496 1323 33 08 2 344687620 07 1406 + 047497 1323 34 01 2 344687620 08 1406 + 047498 1323 34 02 2 344687620 09 1406 + 047499 1323 34 03 2 344687620 10 1406 + 047500 1323 34 04 2 344687620 11 1406 + 047501 1323 34 05 2 344687620 12 1406 + 047502 1323 34 06 2 344687620 13 1406 + 047503 1323 34 07 2 344687620 14 1406 + 047504 1323 34 08 2 344687620 15 1406 + 047505 1323 35 01 2 344688644 00 1407 + 047506 1323 35 02 2 344688644 01 1407 + 047507 1323 35 03 2 344688644 02 1407 + 047508 1323 35 04 2 344688644 03 1407 + 047509 1323 35 05 2 344688644 04 1407 + 047510 1323 35 06 2 344688644 05 1407 + 047511 1323 35 07 2 344688644 06 1407 + 047512 1323 35 08 2 344688644 07 1407 + 047513 1323 36 01 2 344688644 08 1407 + 047514 1323 36 02 2 344688644 09 1407 + 047515 1323 36 03 2 344688644 10 1407 + 047516 1323 36 04 2 344688644 11 1407 + 047517 1323 36 05 2 344688644 12 1407 + 047518 1323 36 06 2 344688644 13 1407 + 047519 1323 36 07 2 344688644 14 1407 + 047520 1323 36 08 2 344688644 15 1407 + 047521 1323 37 01 2 344462340 00 1296 + 047522 1323 37 02 2 344462340 01 1296 + 047523 1323 37 03 2 344462340 02 1296 + 047524 1323 37 04 2 344462340 03 1296 + 047525 1323 37 05 2 344462340 04 1296 + 047526 1323 37 06 2 344462340 05 1296 + 047527 1323 37 07 2 344462340 06 1296 + 047528 1323 37 08 2 344462340 07 1296 + 047529 1323 38 01 2 344462340 08 1296 + 047530 1323 38 02 2 344462340 09 1296 + 047531 1323 38 03 2 344462340 10 1296 + 047532 1323 38 04 2 344462340 11 1296 + 047533 1323 38 05 2 344462340 12 1296 + 047534 1323 38 06 2 344462340 13 1296 + 047535 1323 38 07 2 344462340 14 1296 + 047536 1323 38 08 2 344462340 15 1296 + 047537 1323 39 01 2 344463364 00 1297 + 047538 1323 39 02 2 344463364 01 1297 + 047539 1323 39 03 2 344463364 02 1297 + 047540 1323 39 04 2 344463364 03 1297 + 047541 1323 39 05 2 344463364 04 1297 + 047542 1323 39 06 2 344463364 05 1297 + 047543 1323 39 07 2 344463364 06 1297 + 047544 1323 39 08 2 344463364 07 1297 + 047545 1323 40 01 2 344463364 08 1297 + 047546 1323 40 02 2 344463364 09 1297 + 047547 1323 40 03 2 344463364 10 1297 + 047548 1323 40 04 2 344463364 11 1297 + 047549 1323 40 05 2 344463364 12 1297 + 047550 1323 40 06 2 344463364 13 1297 + 047551 1323 40 07 2 344463364 14 1297 + 047552 1323 40 08 2 344463364 15 1297 + 047553 1323 41 01 2 344949764 00 1518 + 047554 1323 41 02 2 344949764 01 1518 + 047555 1323 41 03 2 344949764 02 1518 + 047556 1323 41 04 2 344949764 03 1518 + 047557 1323 41 05 2 344949764 04 1518 + 047558 1323 41 06 2 344949764 05 1518 + 047559 1323 41 07 2 344949764 06 1518 + 047560 1323 41 08 2 344949764 07 1518 + 047561 1323 42 01 2 344949764 08 1518 + 047562 1323 42 02 2 344949764 09 1518 + 047563 1323 42 03 2 344949764 10 1518 + 047564 1323 42 04 2 344949764 11 1518 + 047565 1323 42 05 2 344949764 12 1518 + 047566 1323 42 06 2 344949764 13 1518 + 047567 1323 42 07 2 344949764 14 1518 + 047568 1323 42 08 2 344949764 15 1518 + 047569 1323 43 01 2 344950788 00 1519 + 047570 1323 43 02 2 344950788 01 1519 + 047571 1323 43 03 2 344950788 02 1519 + 047572 1323 43 04 2 344950788 03 1519 + 047573 1323 43 05 2 344950788 04 1519 + 047574 1323 43 06 2 344950788 05 1519 + 047575 1323 43 07 2 344950788 06 1519 + 047576 1323 43 08 2 344950788 07 1519 + 047577 1323 44 01 2 344950788 08 1519 + 047578 1323 44 02 2 344950788 09 1519 + 047579 1323 44 03 2 344950788 10 1519 + 047580 1323 44 04 2 344950788 11 1519 + 047581 1323 44 05 2 344950788 12 1519 + 047582 1323 44 06 2 344950788 13 1519 + 047583 1323 44 07 2 344950788 14 1519 + 047584 1323 44 08 2 344950788 15 1519 + 047585 1323 45 01 2 344724484 00 1408 + 047586 1323 45 02 2 344724484 01 1408 + 047587 1323 45 03 2 344724484 02 1408 + 047588 1323 45 04 2 344724484 03 1408 + 047589 1323 45 05 2 344724484 04 1408 + 047590 1323 45 06 2 344724484 05 1408 + 047591 1323 45 07 2 344724484 06 1408 + 047592 1323 45 08 2 344724484 07 1408 + 047593 1323 46 01 2 344724484 08 1408 + 047594 1323 46 02 2 344724484 09 1408 + 047595 1323 46 03 2 344724484 10 1408 + 047596 1323 46 04 2 344724484 11 1408 + 047597 1323 46 05 2 344724484 12 1408 + 047598 1323 46 06 2 344724484 13 1408 + 047599 1323 46 07 2 344724484 14 1408 + 047600 1323 46 08 2 344724484 15 1408 + 047601 1323 47 01 2 344725508 00 1409 + 047602 1323 47 02 2 344725508 01 1409 + 047603 1323 47 03 2 344725508 02 1409 + 047604 1323 47 04 2 344725508 03 1409 + 047605 1323 47 05 2 344725508 04 1409 + 047606 1323 47 06 2 344725508 05 1409 + 047607 1323 47 07 2 344725508 06 1409 + 047608 1323 47 08 2 344725508 07 1409 + 047609 1323 48 01 2 344725508 08 1409 + 047610 1323 48 02 2 344725508 09 1409 + 047611 1323 48 03 2 344725508 10 1409 + 047612 1323 48 04 2 344725508 11 1409 + 047613 1323 48 05 2 344725508 12 1409 + 047614 1323 48 06 2 344725508 13 1409 + 047615 1323 48 07 2 344725508 14 1409 + 047616 1323 48 08 2 344725508 15 1409 + 047617 1324 01 01 2 344421380 00 1292 + 047618 1324 01 02 2 344421380 01 1292 + 047619 1324 01 03 2 344421380 02 1292 + 047620 1324 01 04 2 344421380 03 1292 + 047621 1324 01 05 2 344421380 04 1292 + 047622 1324 01 06 2 344421380 05 1292 + 047623 1324 01 07 2 344421380 06 1292 + 047624 1324 01 08 2 344421380 07 1292 + 047625 1324 02 01 2 344421380 08 1292 + 047626 1324 02 02 2 344421380 09 1292 + 047627 1324 02 03 2 344421380 10 1292 + 047628 1324 02 04 2 344421380 11 1292 + 047629 1324 02 05 2 344421380 12 1292 + 047630 1324 02 06 2 344421380 13 1292 + 047631 1324 02 07 2 344421380 14 1292 + 047632 1324 02 08 2 344421380 15 1292 + 047633 1324 03 01 2 344422404 00 1293 + 047634 1324 03 02 2 344422404 01 1293 + 047635 1324 03 03 2 344422404 02 1293 + 047636 1324 03 04 2 344422404 03 1293 + 047637 1324 03 05 2 344422404 04 1293 + 047638 1324 03 06 2 344422404 05 1293 + 047639 1324 03 07 2 344422404 06 1293 + 047640 1324 03 08 2 344422404 07 1293 + 047641 1324 04 01 2 344422404 08 1293 + 047642 1324 04 02 2 344422404 09 1293 + 047643 1324 04 03 2 344422404 10 1293 + 047644 1324 04 04 2 344422404 11 1293 + 047645 1324 04 05 2 344422404 12 1293 + 047646 1324 04 06 2 344422404 13 1293 + 047647 1324 04 07 2 344422404 14 1293 + 047648 1324 04 08 2 344422404 15 1293 + 047649 1324 05 01 2 344286212 00 1226 + 047650 1324 05 02 2 344286212 01 1226 + 047651 1324 05 03 2 344286212 02 1226 + 047652 1324 05 04 2 344286212 03 1226 + 047653 1324 05 05 2 344286212 04 1226 + 047654 1324 05 06 2 344286212 05 1226 + 047655 1324 05 07 2 344286212 06 1226 + 047656 1324 05 08 2 344286212 07 1226 + 047657 1324 06 01 2 344286212 08 1226 + 047658 1324 06 02 2 344286212 09 1226 + 047659 1324 06 03 2 344286212 10 1226 + 047660 1324 06 04 2 344286212 11 1226 + 047661 1324 06 05 2 344286212 12 1226 + 047662 1324 06 06 2 344286212 13 1226 + 047663 1324 06 07 2 344286212 14 1226 + 047664 1324 06 08 2 344286212 15 1226 + 047665 1324 07 01 2 344287236 00 1227 + 047666 1324 07 02 2 344287236 01 1227 + 047667 1324 07 03 2 344287236 02 1227 + 047668 1324 07 04 2 344287236 03 1227 + 047669 1324 07 05 2 344287236 04 1227 + 047670 1324 07 06 2 344287236 05 1227 + 047671 1324 07 07 2 344287236 06 1227 + 047672 1324 07 08 2 344287236 07 1227 + 047673 1324 08 01 2 344287236 08 1227 + 047674 1324 08 02 2 344287236 09 1227 + 047675 1324 08 03 2 344287236 10 1227 + 047676 1324 08 04 2 344287236 11 1227 + 047677 1324 08 05 2 344287236 12 1227 + 047678 1324 08 06 2 344287236 13 1227 + 047679 1324 08 07 2 344287236 14 1227 + 047680 1324 08 08 2 344287236 15 1227 + 047681 1324 09 01 2 344683524 00 1404 + 047682 1324 09 02 2 344683524 01 1404 + 047683 1324 09 03 2 344683524 02 1404 + 047684 1324 09 04 2 344683524 03 1404 + 047685 1324 09 05 2 344683524 04 1404 + 047686 1324 09 06 2 344683524 05 1404 + 047687 1324 09 07 2 344683524 06 1404 + 047688 1324 09 08 2 344683524 07 1404 + 047689 1324 10 01 2 344683524 08 1404 + 047690 1324 10 02 2 344683524 09 1404 + 047691 1324 10 03 2 344683524 10 1404 + 047692 1324 10 04 2 344683524 11 1404 + 047693 1324 10 05 2 344683524 12 1404 + 047694 1324 10 06 2 344683524 13 1404 + 047695 1324 10 07 2 344683524 14 1404 + 047696 1324 10 08 2 344683524 15 1404 + 047697 1324 11 01 2 344684548 00 1405 + 047698 1324 11 02 2 344684548 01 1405 + 047699 1324 11 03 2 344684548 02 1405 + 047700 1324 11 04 2 344684548 03 1405 + 047701 1324 11 05 2 344684548 04 1405 + 047702 1324 11 06 2 344684548 05 1405 + 047703 1324 11 07 2 344684548 06 1405 + 047704 1324 11 08 2 344684548 07 1405 + 047705 1324 12 01 2 344684548 08 1405 + 047706 1324 12 02 2 344684548 09 1405 + 047707 1324 12 03 2 344684548 10 1405 + 047708 1324 12 04 2 344684548 11 1405 + 047709 1324 12 05 2 344684548 12 1405 + 047710 1324 12 06 2 344684548 13 1405 + 047711 1324 12 07 2 344684548 14 1405 + 047712 1324 12 08 2 344684548 15 1405 + 047713 1324 13 01 2 344548356 00 1338 + 047714 1324 13 02 2 344548356 01 1338 + 047715 1324 13 03 2 344548356 02 1338 + 047716 1324 13 04 2 344548356 03 1338 + 047717 1324 13 05 2 344548356 04 1338 + 047718 1324 13 06 2 344548356 05 1338 + 047719 1324 13 07 2 344548356 06 1338 + 047720 1324 13 08 2 344548356 07 1338 + 047721 1324 14 01 2 344548356 08 1338 + 047722 1324 14 02 2 344548356 09 1338 + 047723 1324 14 03 2 344548356 10 1338 + 047724 1324 14 04 2 344548356 11 1338 + 047725 1324 14 05 2 344548356 12 1338 + 047726 1324 14 06 2 344548356 13 1338 + 047727 1324 14 07 2 344548356 14 1338 + 047728 1324 14 08 2 344548356 15 1338 + 047729 1324 15 01 2 344549380 00 1339 + 047730 1324 15 02 2 344549380 01 1339 + 047731 1324 15 03 2 344549380 02 1339 + 047732 1324 15 04 2 344549380 03 1339 + 047733 1324 15 05 2 344549380 04 1339 + 047734 1324 15 06 2 344549380 05 1339 + 047735 1324 15 07 2 344549380 06 1339 + 047736 1324 15 08 2 344549380 07 1339 + 047737 1324 16 01 2 344549380 08 1339 + 047738 1324 16 02 2 344549380 09 1339 + 047739 1324 16 03 2 344549380 10 1339 + 047740 1324 16 04 2 344549380 11 1339 + 047741 1324 16 05 2 344549380 12 1339 + 047742 1324 16 06 2 344549380 13 1339 + 047743 1324 16 07 2 344549380 14 1339 + 047744 1324 16 08 2 344549380 15 1339 + 047745 1324 17 01 2 344945668 00 1516 + 047746 1324 17 02 2 344945668 01 1516 + 047747 1324 17 03 2 344945668 02 1516 + 047748 1324 17 04 2 344945668 03 1516 + 047749 1324 17 05 2 344945668 04 1516 + 047750 1324 17 06 2 344945668 05 1516 + 047751 1324 17 07 2 344945668 06 1516 + 047752 1324 17 08 2 344945668 07 1516 + 047753 1324 18 01 2 344945668 08 1516 + 047754 1324 18 02 2 344945668 09 1516 + 047755 1324 18 03 2 344945668 10 1516 + 047756 1324 18 04 2 344945668 11 1516 + 047757 1324 18 05 2 344945668 12 1516 + 047758 1324 18 06 2 344945668 13 1516 + 047759 1324 18 07 2 344945668 14 1516 + 047760 1324 18 08 2 344945668 15 1516 + 047761 1324 19 01 2 344946692 00 1517 + 047762 1324 19 02 2 344946692 01 1517 + 047763 1324 19 03 2 344946692 02 1517 + 047764 1324 19 04 2 344946692 03 1517 + 047765 1324 19 05 2 344946692 04 1517 + 047766 1324 19 06 2 344946692 05 1517 + 047767 1324 19 07 2 344946692 06 1517 + 047768 1324 19 08 2 344946692 07 1517 + 047769 1324 20 01 2 344946692 08 1517 + 047770 1324 20 02 2 344946692 09 1517 + 047771 1324 20 03 2 344946692 10 1517 + 047772 1324 20 04 2 344946692 11 1517 + 047773 1324 20 05 2 344946692 12 1517 + 047774 1324 20 06 2 344946692 13 1517 + 047775 1324 20 07 2 344946692 14 1517 + 047776 1324 20 08 2 344946692 15 1517 + 047777 1324 21 01 2 344810500 00 1450 + 047778 1324 21 02 2 344810500 01 1450 + 047779 1324 21 03 2 344810500 02 1450 + 047780 1324 21 04 2 344810500 03 1450 + 047781 1324 21 05 2 344810500 04 1450 + 047782 1324 21 06 2 344810500 05 1450 + 047783 1324 21 07 2 344810500 06 1450 + 047784 1324 21 08 2 344810500 07 1450 + 047785 1324 22 01 2 344810500 08 1450 + 047786 1324 22 02 2 344810500 09 1450 + 047787 1324 22 03 2 344810500 10 1450 + 047788 1324 22 04 2 344810500 11 1450 + 047789 1324 22 05 2 344810500 12 1450 + 047790 1324 22 06 2 344810500 13 1450 + 047791 1324 22 07 2 344810500 14 1450 + 047792 1324 22 08 2 344810500 15 1450 + 047793 1324 23 01 2 344811524 00 1451 + 047794 1324 23 02 2 344811524 01 1451 + 047795 1324 23 03 2 344811524 02 1451 + 047796 1324 23 04 2 344811524 03 1451 + 047797 1324 23 05 2 344811524 04 1451 + 047798 1324 23 06 2 344811524 05 1451 + 047799 1324 23 07 2 344811524 06 1451 + 047800 1324 23 08 2 344811524 07 1451 + 047801 1324 24 01 2 344811524 08 1451 + 047802 1324 24 02 2 344811524 09 1451 + 047803 1324 24 03 2 344811524 10 1451 + 047804 1324 24 04 2 344811524 11 1451 + 047805 1324 24 05 2 344811524 12 1451 + 047806 1324 24 06 2 344811524 13 1451 + 047807 1324 24 07 2 344811524 14 1451 + 047808 1324 24 08 2 344811524 15 1451 + 047809 1324 25 01 2 344417284 00 1290 + 047810 1324 25 02 2 344417284 01 1290 + 047811 1324 25 03 2 344417284 02 1290 + 047812 1324 25 04 2 344417284 03 1290 + 047813 1324 25 05 2 344417284 04 1290 + 047814 1324 25 06 2 344417284 05 1290 + 047815 1324 25 07 2 344417284 06 1290 + 047816 1324 25 08 2 344417284 07 1290 + 047817 1324 26 01 2 344417284 08 1290 + 047818 1324 26 02 2 344417284 09 1290 + 047819 1324 26 03 2 344417284 10 1290 + 047820 1324 26 04 2 344417284 11 1290 + 047821 1324 26 05 2 344417284 12 1290 + 047822 1324 26 06 2 344417284 13 1290 + 047823 1324 26 07 2 344417284 14 1290 + 047824 1324 26 08 2 344417284 15 1290 + 047825 1324 27 01 2 344418308 00 1291 + 047826 1324 27 02 2 344418308 01 1291 + 047827 1324 27 03 2 344418308 02 1291 + 047828 1324 27 04 2 344418308 03 1291 + 047829 1324 27 05 2 344418308 04 1291 + 047830 1324 27 06 2 344418308 05 1291 + 047831 1324 27 07 2 344418308 06 1291 + 047832 1324 27 08 2 344418308 07 1291 + 047833 1324 28 01 2 344418308 08 1291 + 047834 1324 28 02 2 344418308 09 1291 + 047835 1324 28 03 2 344418308 10 1291 + 047836 1324 28 04 2 344418308 11 1291 + 047837 1324 28 05 2 344418308 12 1291 + 047838 1324 28 06 2 344418308 13 1291 + 047839 1324 28 07 2 344418308 14 1291 + 047840 1324 28 08 2 344418308 15 1291 + 047841 1324 29 01 2 344282116 00 1224 + 047842 1324 29 02 2 344282116 01 1224 + 047843 1324 29 03 2 344282116 02 1224 + 047844 1324 29 04 2 344282116 03 1224 + 047845 1324 29 05 2 344282116 04 1224 + 047846 1324 29 06 2 344282116 05 1224 + 047847 1324 29 07 2 344282116 06 1224 + 047848 1324 29 08 2 344282116 07 1224 + 047849 1324 30 01 2 344282116 08 1224 + 047850 1324 30 02 2 344282116 09 1224 + 047851 1324 30 03 2 344282116 10 1224 + 047852 1324 30 04 2 344282116 11 1224 + 047853 1324 30 05 2 344282116 12 1224 + 047854 1324 30 06 2 344282116 13 1224 + 047855 1324 30 07 2 344282116 14 1224 + 047856 1324 30 08 2 344282116 15 1224 + 047857 1324 31 01 2 344283140 00 1225 + 047858 1324 31 02 2 344283140 01 1225 + 047859 1324 31 03 2 344283140 02 1225 + 047860 1324 31 04 2 344283140 03 1225 + 047861 1324 31 05 2 344283140 04 1225 + 047862 1324 31 06 2 344283140 05 1225 + 047863 1324 31 07 2 344283140 06 1225 + 047864 1324 31 08 2 344283140 07 1225 + 047865 1324 32 01 2 344283140 08 1225 + 047866 1324 32 02 2 344283140 09 1225 + 047867 1324 32 03 2 344283140 10 1225 + 047868 1324 32 04 2 344283140 11 1225 + 047869 1324 32 05 2 344283140 12 1225 + 047870 1324 32 06 2 344283140 13 1225 + 047871 1324 32 07 2 344283140 14 1225 + 047872 1324 32 08 2 344283140 15 1225 + 047873 1324 33 01 2 344679428 00 1402 + 047874 1324 33 02 2 344679428 01 1402 + 047875 1324 33 03 2 344679428 02 1402 + 047876 1324 33 04 2 344679428 03 1402 + 047877 1324 33 05 2 344679428 04 1402 + 047878 1324 33 06 2 344679428 05 1402 + 047879 1324 33 07 2 344679428 06 1402 + 047880 1324 33 08 2 344679428 07 1402 + 047881 1324 34 01 2 344679428 08 1402 + 047882 1324 34 02 2 344679428 09 1402 + 047883 1324 34 03 2 344679428 10 1402 + 047884 1324 34 04 2 344679428 11 1402 + 047885 1324 34 05 2 344679428 12 1402 + 047886 1324 34 06 2 344679428 13 1402 + 047887 1324 34 07 2 344679428 14 1402 + 047888 1324 34 08 2 344679428 15 1402 + 047889 1324 35 01 2 344680452 00 1403 + 047890 1324 35 02 2 344680452 01 1403 + 047891 1324 35 03 2 344680452 02 1403 + 047892 1324 35 04 2 344680452 03 1403 + 047893 1324 35 05 2 344680452 04 1403 + 047894 1324 35 06 2 344680452 05 1403 + 047895 1324 35 07 2 344680452 06 1403 + 047896 1324 35 08 2 344680452 07 1403 + 047897 1324 36 01 2 344680452 08 1403 + 047898 1324 36 02 2 344680452 09 1403 + 047899 1324 36 03 2 344680452 10 1403 + 047900 1324 36 04 2 344680452 11 1403 + 047901 1324 36 05 2 344680452 12 1403 + 047902 1324 36 06 2 344680452 13 1403 + 047903 1324 36 07 2 344680452 14 1403 + 047904 1324 36 08 2 344680452 15 1403 + 047905 1324 37 01 2 344544260 00 1336 + 047906 1324 37 02 2 344544260 01 1336 + 047907 1324 37 03 2 344544260 02 1336 + 047908 1324 37 04 2 344544260 03 1336 + 047909 1324 37 05 2 344544260 04 1336 + 047910 1324 37 06 2 344544260 05 1336 + 047911 1324 37 07 2 344544260 06 1336 + 047912 1324 37 08 2 344544260 07 1336 + 047913 1324 38 01 2 344544260 08 1336 + 047914 1324 38 02 2 344544260 09 1336 + 047915 1324 38 03 2 344544260 10 1336 + 047916 1324 38 04 2 344544260 11 1336 + 047917 1324 38 05 2 344544260 12 1336 + 047918 1324 38 06 2 344544260 13 1336 + 047919 1324 38 07 2 344544260 14 1336 + 047920 1324 38 08 2 344544260 15 1336 + 047921 1324 39 01 2 344545284 00 1337 + 047922 1324 39 02 2 344545284 01 1337 + 047923 1324 39 03 2 344545284 02 1337 + 047924 1324 39 04 2 344545284 03 1337 + 047925 1324 39 05 2 344545284 04 1337 + 047926 1324 39 06 2 344545284 05 1337 + 047927 1324 39 07 2 344545284 06 1337 + 047928 1324 39 08 2 344545284 07 1337 + 047929 1324 40 01 2 344545284 08 1337 + 047930 1324 40 02 2 344545284 09 1337 + 047931 1324 40 03 2 344545284 10 1337 + 047932 1324 40 04 2 344545284 11 1337 + 047933 1324 40 05 2 344545284 12 1337 + 047934 1324 40 06 2 344545284 13 1337 + 047935 1324 40 07 2 344545284 14 1337 + 047936 1324 40 08 2 344545284 15 1337 + 047937 1324 41 01 2 344941572 00 1514 + 047938 1324 41 02 2 344941572 01 1514 + 047939 1324 41 03 2 344941572 02 1514 + 047940 1324 41 04 2 344941572 03 1514 + 047941 1324 41 05 2 344941572 04 1514 + 047942 1324 41 06 2 344941572 05 1514 + 047943 1324 41 07 2 344941572 06 1514 + 047944 1324 41 08 2 344941572 07 1514 + 047945 1324 42 01 2 344941572 08 1514 + 047946 1324 42 02 2 344941572 09 1514 + 047947 1324 42 03 2 344941572 10 1514 + 047948 1324 42 04 2 344941572 11 1514 + 047949 1324 42 05 2 344941572 12 1514 + 047950 1324 42 06 2 344941572 13 1514 + 047951 1324 42 07 2 344941572 14 1514 + 047952 1324 42 08 2 344941572 15 1514 + 047953 1324 43 01 2 344942596 00 1515 + 047954 1324 43 02 2 344942596 01 1515 + 047955 1324 43 03 2 344942596 02 1515 + 047956 1324 43 04 2 344942596 03 1515 + 047957 1324 43 05 2 344942596 04 1515 + 047958 1324 43 06 2 344942596 05 1515 + 047959 1324 43 07 2 344942596 06 1515 + 047960 1324 43 08 2 344942596 07 1515 + 047961 1324 44 01 2 344942596 08 1515 + 047962 1324 44 02 2 344942596 09 1515 + 047963 1324 44 03 2 344942596 10 1515 + 047964 1324 44 04 2 344942596 11 1515 + 047965 1324 44 05 2 344942596 12 1515 + 047966 1324 44 06 2 344942596 13 1515 + 047967 1324 44 07 2 344942596 14 1515 + 047968 1324 44 08 2 344942596 15 1515 + 047969 1324 45 01 2 344806404 00 1448 + 047970 1324 45 02 2 344806404 01 1448 + 047971 1324 45 03 2 344806404 02 1448 + 047972 1324 45 04 2 344806404 03 1448 + 047973 1324 45 05 2 344806404 04 1448 + 047974 1324 45 06 2 344806404 05 1448 + 047975 1324 45 07 2 344806404 06 1448 + 047976 1324 45 08 2 344806404 07 1448 + 047977 1324 46 01 2 344806404 08 1448 + 047978 1324 46 02 2 344806404 09 1448 + 047979 1324 46 03 2 344806404 10 1448 + 047980 1324 46 04 2 344806404 11 1448 + 047981 1324 46 05 2 344806404 12 1448 + 047982 1324 46 06 2 344806404 13 1448 + 047983 1324 46 07 2 344806404 14 1448 + 047984 1324 46 08 2 344806404 15 1448 + 047985 1324 47 01 2 344807428 00 1449 + 047986 1324 47 02 2 344807428 01 1449 + 047987 1324 47 03 2 344807428 02 1449 + 047988 1324 47 04 2 344807428 03 1449 + 047989 1324 47 05 2 344807428 04 1449 + 047990 1324 47 06 2 344807428 05 1449 + 047991 1324 47 07 2 344807428 06 1449 + 047992 1324 47 08 2 344807428 07 1449 + 047993 1324 48 01 2 344807428 08 1449 + 047994 1324 48 02 2 344807428 09 1449 + 047995 1324 48 03 2 344807428 10 1449 + 047996 1324 48 04 2 344807428 11 1449 + 047997 1324 48 05 2 344807428 12 1449 + 047998 1324 48 06 2 344807428 13 1449 + 047999 1324 48 07 2 344807428 14 1449 + 048000 1324 48 08 2 344807428 15 1449 + 048001 1325 01 01 2 344413188 00 1288 + 048002 1325 01 02 2 344413188 01 1288 + 048003 1325 01 03 2 344413188 02 1288 + 048004 1325 01 04 2 344413188 03 1288 + 048005 1325 01 05 2 344413188 04 1288 + 048006 1325 01 06 2 344413188 05 1288 + 048007 1325 01 07 2 344413188 06 1288 + 048008 1325 01 08 2 344413188 07 1288 + 048009 1325 02 01 2 344413188 08 1288 + 048010 1325 02 02 2 344413188 09 1288 + 048011 1325 02 03 2 344413188 10 1288 + 048012 1325 02 04 2 344413188 11 1288 + 048013 1325 02 05 2 344413188 12 1288 + 048014 1325 02 06 2 344413188 13 1288 + 048015 1325 02 07 2 344413188 14 1288 + 048016 1325 02 08 2 344413188 15 1288 + 048017 1325 03 01 2 344414212 00 1289 + 048018 1325 03 02 2 344414212 01 1289 + 048019 1325 03 03 2 344414212 02 1289 + 048020 1325 03 04 2 344414212 03 1289 + 048021 1325 03 05 2 344414212 04 1289 + 048022 1325 03 06 2 344414212 05 1289 + 048023 1325 03 07 2 344414212 06 1289 + 048024 1325 03 08 2 344414212 07 1289 + 048025 1325 04 01 2 344414212 08 1289 + 048026 1325 04 02 2 344414212 09 1289 + 048027 1325 04 03 2 344414212 10 1289 + 048028 1325 04 04 2 344414212 11 1289 + 048029 1325 04 05 2 344414212 12 1289 + 048030 1325 04 06 2 344414212 13 1289 + 048031 1325 04 07 2 344414212 14 1289 + 048032 1325 04 08 2 344414212 15 1289 + 048033 1325 05 01 2 344409092 00 1286 + 048034 1325 05 02 2 344409092 01 1286 + 048035 1325 05 03 2 344409092 02 1286 + 048036 1325 05 04 2 344409092 03 1286 + 048037 1325 05 05 2 344409092 04 1286 + 048038 1325 05 06 2 344409092 05 1286 + 048039 1325 05 07 2 344409092 06 1286 + 048040 1325 05 08 2 344409092 07 1286 + 048041 1325 06 01 2 344409092 08 1286 + 048042 1325 06 02 2 344409092 09 1286 + 048043 1325 06 03 2 344409092 10 1286 + 048044 1325 06 04 2 344409092 11 1286 + 048045 1325 06 05 2 344409092 12 1286 + 048046 1325 06 06 2 344409092 13 1286 + 048047 1325 06 07 2 344409092 14 1286 + 048048 1325 06 08 2 344409092 15 1286 + 048049 1325 07 01 2 344410116 00 1287 + 048050 1325 07 02 2 344410116 01 1287 + 048051 1325 07 03 2 344410116 02 1287 + 048052 1325 07 04 2 344410116 03 1287 + 048053 1325 07 05 2 344410116 04 1287 + 048054 1325 07 06 2 344410116 05 1287 + 048055 1325 07 07 2 344410116 06 1287 + 048056 1325 07 08 2 344410116 07 1287 + 048057 1325 08 01 2 344410116 08 1287 + 048058 1325 08 02 2 344410116 09 1287 + 048059 1325 08 03 2 344410116 10 1287 + 048060 1325 08 04 2 344410116 11 1287 + 048061 1325 08 05 2 344410116 12 1287 + 048062 1325 08 06 2 344410116 13 1287 + 048063 1325 08 07 2 344410116 14 1287 + 048064 1325 08 08 2 344410116 15 1287 + 048065 1325 09 01 2 344675332 00 1400 + 048066 1325 09 02 2 344675332 01 1400 + 048067 1325 09 03 2 344675332 02 1400 + 048068 1325 09 04 2 344675332 03 1400 + 048069 1325 09 05 2 344675332 04 1400 + 048070 1325 09 06 2 344675332 05 1400 + 048071 1325 09 07 2 344675332 06 1400 + 048072 1325 09 08 2 344675332 07 1400 + 048073 1325 10 01 2 344675332 08 1400 + 048074 1325 10 02 2 344675332 09 1400 + 048075 1325 10 03 2 344675332 10 1400 + 048076 1325 10 04 2 344675332 11 1400 + 048077 1325 10 05 2 344675332 12 1400 + 048078 1325 10 06 2 344675332 13 1400 + 048079 1325 10 07 2 344675332 14 1400 + 048080 1325 10 08 2 344675332 15 1400 + 048081 1325 11 01 2 344676356 00 1401 + 048082 1325 11 02 2 344676356 01 1401 + 048083 1325 11 03 2 344676356 02 1401 + 048084 1325 11 04 2 344676356 03 1401 + 048085 1325 11 05 2 344676356 04 1401 + 048086 1325 11 06 2 344676356 05 1401 + 048087 1325 11 07 2 344676356 06 1401 + 048088 1325 11 08 2 344676356 07 1401 + 048089 1325 12 01 2 344676356 08 1401 + 048090 1325 12 02 2 344676356 09 1401 + 048091 1325 12 03 2 344676356 10 1401 + 048092 1325 12 04 2 344676356 11 1401 + 048093 1325 12 05 2 344676356 12 1401 + 048094 1325 12 06 2 344676356 13 1401 + 048095 1325 12 07 2 344676356 14 1401 + 048096 1325 12 08 2 344676356 15 1401 + 048097 1325 13 01 2 344671236 00 1398 + 048098 1325 13 02 2 344671236 01 1398 + 048099 1325 13 03 2 344671236 02 1398 + 048100 1325 13 04 2 344671236 03 1398 + 048101 1325 13 05 2 344671236 04 1398 + 048102 1325 13 06 2 344671236 05 1398 + 048103 1325 13 07 2 344671236 06 1398 + 048104 1325 13 08 2 344671236 07 1398 + 048105 1325 14 01 2 344671236 08 1398 + 048106 1325 14 02 2 344671236 09 1398 + 048107 1325 14 03 2 344671236 10 1398 + 048108 1325 14 04 2 344671236 11 1398 + 048109 1325 14 05 2 344671236 12 1398 + 048110 1325 14 06 2 344671236 13 1398 + 048111 1325 14 07 2 344671236 14 1398 + 048112 1325 14 08 2 344671236 15 1398 + 048113 1325 15 01 2 344672260 00 1399 + 048114 1325 15 02 2 344672260 01 1399 + 048115 1325 15 03 2 344672260 02 1399 + 048116 1325 15 04 2 344672260 03 1399 + 048117 1325 15 05 2 344672260 04 1399 + 048118 1325 15 06 2 344672260 05 1399 + 048119 1325 15 07 2 344672260 06 1399 + 048120 1325 15 08 2 344672260 07 1399 + 048121 1325 16 01 2 344672260 08 1399 + 048122 1325 16 02 2 344672260 09 1399 + 048123 1325 16 03 2 344672260 10 1399 + 048124 1325 16 04 2 344672260 11 1399 + 048125 1325 16 05 2 344672260 12 1399 + 048126 1325 16 06 2 344672260 13 1399 + 048127 1325 16 07 2 344672260 14 1399 + 048128 1325 16 08 2 344672260 15 1399 + 048129 1325 17 01 2 344937476 00 1512 + 048130 1325 17 02 2 344937476 01 1512 + 048131 1325 17 03 2 344937476 02 1512 + 048132 1325 17 04 2 344937476 03 1512 + 048133 1325 17 05 2 344937476 04 1512 + 048134 1325 17 06 2 344937476 05 1512 + 048135 1325 17 07 2 344937476 06 1512 + 048136 1325 17 08 2 344937476 07 1512 + 048137 1325 18 01 2 344937476 08 1512 + 048138 1325 18 02 2 344937476 09 1512 + 048139 1325 18 03 2 344937476 10 1512 + 048140 1325 18 04 2 344937476 11 1512 + 048141 1325 18 05 2 344937476 12 1512 + 048142 1325 18 06 2 344937476 13 1512 + 048143 1325 18 07 2 344937476 14 1512 + 048144 1325 18 08 2 344937476 15 1512 + 048145 1325 19 01 2 344938500 00 1513 + 048146 1325 19 02 2 344938500 01 1513 + 048147 1325 19 03 2 344938500 02 1513 + 048148 1325 19 04 2 344938500 03 1513 + 048149 1325 19 05 2 344938500 04 1513 + 048150 1325 19 06 2 344938500 05 1513 + 048151 1325 19 07 2 344938500 06 1513 + 048152 1325 19 08 2 344938500 07 1513 + 048153 1325 20 01 2 344938500 08 1513 + 048154 1325 20 02 2 344938500 09 1513 + 048155 1325 20 03 2 344938500 10 1513 + 048156 1325 20 04 2 344938500 11 1513 + 048157 1325 20 05 2 344938500 12 1513 + 048158 1325 20 06 2 344938500 13 1513 + 048159 1325 20 07 2 344938500 14 1513 + 048160 1325 20 08 2 344938500 15 1513 + 048161 1325 21 01 2 344933380 00 1510 + 048162 1325 21 02 2 344933380 01 1510 + 048163 1325 21 03 2 344933380 02 1510 + 048164 1325 21 04 2 344933380 03 1510 + 048165 1325 21 05 2 344933380 04 1510 + 048166 1325 21 06 2 344933380 05 1510 + 048167 1325 21 07 2 344933380 06 1510 + 048168 1325 21 08 2 344933380 07 1510 + 048169 1325 22 01 2 344933380 08 1510 + 048170 1325 22 02 2 344933380 09 1510 + 048171 1325 22 03 2 344933380 10 1510 + 048172 1325 22 04 2 344933380 11 1510 + 048173 1325 22 05 2 344933380 12 1510 + 048174 1325 22 06 2 344933380 13 1510 + 048175 1325 22 07 2 344933380 14 1510 + 048176 1325 22 08 2 344933380 15 1510 + 048177 1325 23 01 2 344934404 00 1511 + 048178 1325 23 02 2 344934404 01 1511 + 048179 1325 23 03 2 344934404 02 1511 + 048180 1325 23 04 2 344934404 03 1511 + 048181 1325 23 05 2 344934404 04 1511 + 048182 1325 23 06 2 344934404 05 1511 + 048183 1325 23 07 2 344934404 06 1511 + 048184 1325 23 08 2 344934404 07 1511 + 048185 1325 24 01 2 344934404 08 1511 + 048186 1325 24 02 2 344934404 09 1511 + 048187 1325 24 03 2 344934404 10 1511 + 048188 1325 24 04 2 344934404 11 1511 + 048189 1325 24 05 2 344934404 12 1511 + 048190 1325 24 06 2 344934404 13 1511 + 048191 1325 24 07 2 344934404 14 1511 + 048192 1325 24 08 2 344934404 15 1511 + 048193 1325 25 01 2 344278020 00 1222 + 048194 1325 25 02 2 344278020 01 1222 + 048195 1325 25 03 2 344278020 02 1222 + 048196 1325 25 04 2 344278020 03 1222 + 048197 1325 25 05 2 344278020 04 1222 + 048198 1325 25 06 2 344278020 05 1222 + 048199 1325 25 07 2 344278020 06 1222 + 048200 1325 25 08 2 344278020 07 1222 + 048201 1325 26 01 2 344278020 08 1222 + 048202 1325 26 02 2 344278020 09 1222 + 048203 1325 26 03 2 344278020 10 1222 + 048204 1325 26 04 2 344278020 11 1222 + 048205 1325 26 05 2 344278020 12 1222 + 048206 1325 26 06 2 344278020 13 1222 + 048207 1325 26 07 2 344278020 14 1222 + 048208 1325 26 08 2 344278020 15 1222 + 048209 1325 27 01 2 344279044 00 1223 + 048210 1325 27 02 2 344279044 01 1223 + 048211 1325 27 03 2 344279044 02 1223 + 048212 1325 27 04 2 344279044 03 1223 + 048213 1325 27 05 2 344279044 04 1223 + 048214 1325 27 06 2 344279044 05 1223 + 048215 1325 27 07 2 344279044 06 1223 + 048216 1325 27 08 2 344279044 07 1223 + 048217 1325 28 01 2 344279044 08 1223 + 048218 1325 28 02 2 344279044 09 1223 + 048219 1325 28 03 2 344279044 10 1223 + 048220 1325 28 04 2 344279044 11 1223 + 048221 1325 28 05 2 344279044 12 1223 + 048222 1325 28 06 2 344279044 13 1223 + 048223 1325 28 07 2 344279044 14 1223 + 048224 1325 28 08 2 344279044 15 1223 + 048225 1325 29 01 2 344404996 00 1284 + 048226 1325 29 02 2 344404996 01 1284 + 048227 1325 29 03 2 344404996 02 1284 + 048228 1325 29 04 2 344404996 03 1284 + 048229 1325 29 05 2 344404996 04 1284 + 048230 1325 29 06 2 344404996 05 1284 + 048231 1325 29 07 2 344404996 06 1284 + 048232 1325 29 08 2 344404996 07 1284 + 048233 1325 30 01 2 344404996 08 1284 + 048234 1325 30 02 2 344404996 09 1284 + 048235 1325 30 03 2 344404996 10 1284 + 048236 1325 30 04 2 344404996 11 1284 + 048237 1325 30 05 2 344404996 12 1284 + 048238 1325 30 06 2 344404996 13 1284 + 048239 1325 30 07 2 344404996 14 1284 + 048240 1325 30 08 2 344404996 15 1284 + 048241 1325 31 01 2 344406020 00 1285 + 048242 1325 31 02 2 344406020 01 1285 + 048243 1325 31 03 2 344406020 02 1285 + 048244 1325 31 04 2 344406020 03 1285 + 048245 1325 31 05 2 344406020 04 1285 + 048246 1325 31 06 2 344406020 05 1285 + 048247 1325 31 07 2 344406020 06 1285 + 048248 1325 31 08 2 344406020 07 1285 + 048249 1325 32 01 2 344406020 08 1285 + 048250 1325 32 02 2 344406020 09 1285 + 048251 1325 32 03 2 344406020 10 1285 + 048252 1325 32 04 2 344406020 11 1285 + 048253 1325 32 05 2 344406020 12 1285 + 048254 1325 32 06 2 344406020 13 1285 + 048255 1325 32 07 2 344406020 14 1285 + 048256 1325 32 08 2 344406020 15 1285 + 048257 1325 33 01 2 344540164 00 1334 + 048258 1325 33 02 2 344540164 01 1334 + 048259 1325 33 03 2 344540164 02 1334 + 048260 1325 33 04 2 344540164 03 1334 + 048261 1325 33 05 2 344540164 04 1334 + 048262 1325 33 06 2 344540164 05 1334 + 048263 1325 33 07 2 344540164 06 1334 + 048264 1325 33 08 2 344540164 07 1334 + 048265 1325 34 01 2 344540164 08 1334 + 048266 1325 34 02 2 344540164 09 1334 + 048267 1325 34 03 2 344540164 10 1334 + 048268 1325 34 04 2 344540164 11 1334 + 048269 1325 34 05 2 344540164 12 1334 + 048270 1325 34 06 2 344540164 13 1334 + 048271 1325 34 07 2 344540164 14 1334 + 048272 1325 34 08 2 344540164 15 1334 + 048273 1325 35 01 2 344541188 00 1335 + 048274 1325 35 02 2 344541188 01 1335 + 048275 1325 35 03 2 344541188 02 1335 + 048276 1325 35 04 2 344541188 03 1335 + 048277 1325 35 05 2 344541188 04 1335 + 048278 1325 35 06 2 344541188 05 1335 + 048279 1325 35 07 2 344541188 06 1335 + 048280 1325 35 08 2 344541188 07 1335 + 048281 1325 36 01 2 344541188 08 1335 + 048282 1325 36 02 2 344541188 09 1335 + 048283 1325 36 03 2 344541188 10 1335 + 048284 1325 36 04 2 344541188 11 1335 + 048285 1325 36 05 2 344541188 12 1335 + 048286 1325 36 06 2 344541188 13 1335 + 048287 1325 36 07 2 344541188 14 1335 + 048288 1325 36 08 2 344541188 15 1335 + 048289 1325 37 01 2 344667140 00 1396 + 048290 1325 37 02 2 344667140 01 1396 + 048291 1325 37 03 2 344667140 02 1396 + 048292 1325 37 04 2 344667140 03 1396 + 048293 1325 37 05 2 344667140 04 1396 + 048294 1325 37 06 2 344667140 05 1396 + 048295 1325 37 07 2 344667140 06 1396 + 048296 1325 37 08 2 344667140 07 1396 + 048297 1325 38 01 2 344667140 08 1396 + 048298 1325 38 02 2 344667140 09 1396 + 048299 1325 38 03 2 344667140 10 1396 + 048300 1325 38 04 2 344667140 11 1396 + 048301 1325 38 05 2 344667140 12 1396 + 048302 1325 38 06 2 344667140 13 1396 + 048303 1325 38 07 2 344667140 14 1396 + 048304 1325 38 08 2 344667140 15 1396 + 048305 1325 39 01 2 344668164 00 1397 + 048306 1325 39 02 2 344668164 01 1397 + 048307 1325 39 03 2 344668164 02 1397 + 048308 1325 39 04 2 344668164 03 1397 + 048309 1325 39 05 2 344668164 04 1397 + 048310 1325 39 06 2 344668164 05 1397 + 048311 1325 39 07 2 344668164 06 1397 + 048312 1325 39 08 2 344668164 07 1397 + 048313 1325 40 01 2 344668164 08 1397 + 048314 1325 40 02 2 344668164 09 1397 + 048315 1325 40 03 2 344668164 10 1397 + 048316 1325 40 04 2 344668164 11 1397 + 048317 1325 40 05 2 344668164 12 1397 + 048318 1325 40 06 2 344668164 13 1397 + 048319 1325 40 07 2 344668164 14 1397 + 048320 1325 40 08 2 344668164 15 1397 + 048321 1325 41 01 2 344802308 00 1446 + 048322 1325 41 02 2 344802308 01 1446 + 048323 1325 41 03 2 344802308 02 1446 + 048324 1325 41 04 2 344802308 03 1446 + 048325 1325 41 05 2 344802308 04 1446 + 048326 1325 41 06 2 344802308 05 1446 + 048327 1325 41 07 2 344802308 06 1446 + 048328 1325 41 08 2 344802308 07 1446 + 048329 1325 42 01 2 344802308 08 1446 + 048330 1325 42 02 2 344802308 09 1446 + 048331 1325 42 03 2 344802308 10 1446 + 048332 1325 42 04 2 344802308 11 1446 + 048333 1325 42 05 2 344802308 12 1446 + 048334 1325 42 06 2 344802308 13 1446 + 048335 1325 42 07 2 344802308 14 1446 + 048336 1325 42 08 2 344802308 15 1446 + 048337 1325 43 01 2 344803332 00 1447 + 048338 1325 43 02 2 344803332 01 1447 + 048339 1325 43 03 2 344803332 02 1447 + 048340 1325 43 04 2 344803332 03 1447 + 048341 1325 43 05 2 344803332 04 1447 + 048342 1325 43 06 2 344803332 05 1447 + 048343 1325 43 07 2 344803332 06 1447 + 048344 1325 43 08 2 344803332 07 1447 + 048345 1325 44 01 2 344803332 08 1447 + 048346 1325 44 02 2 344803332 09 1447 + 048347 1325 44 03 2 344803332 10 1447 + 048348 1325 44 04 2 344803332 11 1447 + 048349 1325 44 05 2 344803332 12 1447 + 048350 1325 44 06 2 344803332 13 1447 + 048351 1325 44 07 2 344803332 14 1447 + 048352 1325 44 08 2 344803332 15 1447 + 048353 1325 45 01 2 344929284 00 1508 + 048354 1325 45 02 2 344929284 01 1508 + 048355 1325 45 03 2 344929284 02 1508 + 048356 1325 45 04 2 344929284 03 1508 + 048357 1325 45 05 2 344929284 04 1508 + 048358 1325 45 06 2 344929284 05 1508 + 048359 1325 45 07 2 344929284 06 1508 + 048360 1325 45 08 2 344929284 07 1508 + 048361 1325 46 01 2 344929284 08 1508 + 048362 1325 46 02 2 344929284 09 1508 + 048363 1325 46 03 2 344929284 10 1508 + 048364 1325 46 04 2 344929284 11 1508 + 048365 1325 46 05 2 344929284 12 1508 + 048366 1325 46 06 2 344929284 13 1508 + 048367 1325 46 07 2 344929284 14 1508 + 048368 1325 46 08 2 344929284 15 1508 + 048369 1325 47 01 2 344930308 00 1509 + 048370 1325 47 02 2 344930308 01 1509 + 048371 1325 47 03 2 344930308 02 1509 + 048372 1325 47 04 2 344930308 03 1509 + 048373 1325 47 05 2 344930308 04 1509 + 048374 1325 47 06 2 344930308 05 1509 + 048375 1325 47 07 2 344930308 06 1509 + 048376 1325 47 08 2 344930308 07 1509 + 048377 1325 48 01 2 344930308 08 1509 + 048378 1325 48 02 2 344930308 09 1509 + 048379 1325 48 03 2 344930308 10 1509 + 048380 1325 48 04 2 344930308 11 1509 + 048381 1325 48 05 2 344930308 12 1509 + 048382 1325 48 06 2 344930308 13 1509 + 048383 1325 48 07 2 344930308 14 1509 + 048384 1325 48 08 2 344930308 15 1509 + 048385 1326 01 01 2 344273924 00 1220 + 048386 1326 01 02 2 344273924 01 1220 + 048387 1326 01 03 2 344273924 02 1220 + 048388 1326 01 04 2 344273924 03 1220 + 048389 1326 01 05 2 344273924 04 1220 + 048390 1326 01 06 2 344273924 05 1220 + 048391 1326 01 07 2 344273924 06 1220 + 048392 1326 01 08 2 344273924 07 1220 + 048393 1326 02 01 2 344273924 08 1220 + 048394 1326 02 02 2 344273924 09 1220 + 048395 1326 02 03 2 344273924 10 1220 + 048396 1326 02 04 2 344273924 11 1220 + 048397 1326 02 05 2 344273924 12 1220 + 048398 1326 02 06 2 344273924 13 1220 + 048399 1326 02 07 2 344273924 14 1220 + 048400 1326 02 08 2 344273924 15 1220 + 048401 1326 03 01 2 344274948 00 1221 + 048402 1326 03 02 2 344274948 01 1221 + 048403 1326 03 03 2 344274948 02 1221 + 048404 1326 03 04 2 344274948 03 1221 + 048405 1326 03 05 2 344274948 04 1221 + 048406 1326 03 06 2 344274948 05 1221 + 048407 1326 03 07 2 344274948 06 1221 + 048408 1326 03 08 2 344274948 07 1221 + 048409 1326 04 01 2 344274948 08 1221 + 048410 1326 04 02 2 344274948 09 1221 + 048411 1326 04 03 2 344274948 10 1221 + 048412 1326 04 04 2 344274948 11 1221 + 048413 1326 04 05 2 344274948 12 1221 + 048414 1326 04 06 2 344274948 13 1221 + 048415 1326 04 07 2 344274948 14 1221 + 048416 1326 04 08 2 344274948 15 1221 + 048417 1326 05 01 2 344400900 00 1282 + 048418 1326 05 02 2 344400900 01 1282 + 048419 1326 05 03 2 344400900 02 1282 + 048420 1326 05 04 2 344400900 03 1282 + 048421 1326 05 05 2 344400900 04 1282 + 048422 1326 05 06 2 344400900 05 1282 + 048423 1326 05 07 2 344400900 06 1282 + 048424 1326 05 08 2 344400900 07 1282 + 048425 1326 06 01 2 344400900 08 1282 + 048426 1326 06 02 2 344400900 09 1282 + 048427 1326 06 03 2 344400900 10 1282 + 048428 1326 06 04 2 344400900 11 1282 + 048429 1326 06 05 2 344400900 12 1282 + 048430 1326 06 06 2 344400900 13 1282 + 048431 1326 06 07 2 344400900 14 1282 + 048432 1326 06 08 2 344400900 15 1282 + 048433 1326 07 01 2 344401924 00 1283 + 048434 1326 07 02 2 344401924 01 1283 + 048435 1326 07 03 2 344401924 02 1283 + 048436 1326 07 04 2 344401924 03 1283 + 048437 1326 07 05 2 344401924 04 1283 + 048438 1326 07 06 2 344401924 05 1283 + 048439 1326 07 07 2 344401924 06 1283 + 048440 1326 07 08 2 344401924 07 1283 + 048441 1326 08 01 2 344401924 08 1283 + 048442 1326 08 02 2 344401924 09 1283 + 048443 1326 08 03 2 344401924 10 1283 + 048444 1326 08 04 2 344401924 11 1283 + 048445 1326 08 05 2 344401924 12 1283 + 048446 1326 08 06 2 344401924 13 1283 + 048447 1326 08 07 2 344401924 14 1283 + 048448 1326 08 08 2 344401924 15 1283 + 048449 1326 09 01 2 344536068 00 1332 + 048450 1326 09 02 2 344536068 01 1332 + 048451 1326 09 03 2 344536068 02 1332 + 048452 1326 09 04 2 344536068 03 1332 + 048453 1326 09 05 2 344536068 04 1332 + 048454 1326 09 06 2 344536068 05 1332 + 048455 1326 09 07 2 344536068 06 1332 + 048456 1326 09 08 2 344536068 07 1332 + 048457 1326 10 01 2 344536068 08 1332 + 048458 1326 10 02 2 344536068 09 1332 + 048459 1326 10 03 2 344536068 10 1332 + 048460 1326 10 04 2 344536068 11 1332 + 048461 1326 10 05 2 344536068 12 1332 + 048462 1326 10 06 2 344536068 13 1332 + 048463 1326 10 07 2 344536068 14 1332 + 048464 1326 10 08 2 344536068 15 1332 + 048465 1326 11 01 2 344537092 00 1333 + 048466 1326 11 02 2 344537092 01 1333 + 048467 1326 11 03 2 344537092 02 1333 + 048468 1326 11 04 2 344537092 03 1333 + 048469 1326 11 05 2 344537092 04 1333 + 048470 1326 11 06 2 344537092 05 1333 + 048471 1326 11 07 2 344537092 06 1333 + 048472 1326 11 08 2 344537092 07 1333 + 048473 1326 12 01 2 344537092 08 1333 + 048474 1326 12 02 2 344537092 09 1333 + 048475 1326 12 03 2 344537092 10 1333 + 048476 1326 12 04 2 344537092 11 1333 + 048477 1326 12 05 2 344537092 12 1333 + 048478 1326 12 06 2 344537092 13 1333 + 048479 1326 12 07 2 344537092 14 1333 + 048480 1326 12 08 2 344537092 15 1333 + 048481 1326 13 01 2 344663044 00 1394 + 048482 1326 13 02 2 344663044 01 1394 + 048483 1326 13 03 2 344663044 02 1394 + 048484 1326 13 04 2 344663044 03 1394 + 048485 1326 13 05 2 344663044 04 1394 + 048486 1326 13 06 2 344663044 05 1394 + 048487 1326 13 07 2 344663044 06 1394 + 048488 1326 13 08 2 344663044 07 1394 + 048489 1326 14 01 2 344663044 08 1394 + 048490 1326 14 02 2 344663044 09 1394 + 048491 1326 14 03 2 344663044 10 1394 + 048492 1326 14 04 2 344663044 11 1394 + 048493 1326 14 05 2 344663044 12 1394 + 048494 1326 14 06 2 344663044 13 1394 + 048495 1326 14 07 2 344663044 14 1394 + 048496 1326 14 08 2 344663044 15 1394 + 048497 1326 15 01 2 344664068 00 1395 + 048498 1326 15 02 2 344664068 01 1395 + 048499 1326 15 03 2 344664068 02 1395 + 048500 1326 15 04 2 344664068 03 1395 + 048501 1326 15 05 2 344664068 04 1395 + 048502 1326 15 06 2 344664068 05 1395 + 048503 1326 15 07 2 344664068 06 1395 + 048504 1326 15 08 2 344664068 07 1395 + 048505 1326 16 01 2 344664068 08 1395 + 048506 1326 16 02 2 344664068 09 1395 + 048507 1326 16 03 2 344664068 10 1395 + 048508 1326 16 04 2 344664068 11 1395 + 048509 1326 16 05 2 344664068 12 1395 + 048510 1326 16 06 2 344664068 13 1395 + 048511 1326 16 07 2 344664068 14 1395 + 048512 1326 16 08 2 344664068 15 1395 + 048513 1326 17 01 2 344798212 00 1444 + 048514 1326 17 02 2 344798212 01 1444 + 048515 1326 17 03 2 344798212 02 1444 + 048516 1326 17 04 2 344798212 03 1444 + 048517 1326 17 05 2 344798212 04 1444 + 048518 1326 17 06 2 344798212 05 1444 + 048519 1326 17 07 2 344798212 06 1444 + 048520 1326 17 08 2 344798212 07 1444 + 048521 1326 18 01 2 344798212 08 1444 + 048522 1326 18 02 2 344798212 09 1444 + 048523 1326 18 03 2 344798212 10 1444 + 048524 1326 18 04 2 344798212 11 1444 + 048525 1326 18 05 2 344798212 12 1444 + 048526 1326 18 06 2 344798212 13 1444 + 048527 1326 18 07 2 344798212 14 1444 + 048528 1326 18 08 2 344798212 15 1444 + 048529 1326 19 01 2 344799236 00 1445 + 048530 1326 19 02 2 344799236 01 1445 + 048531 1326 19 03 2 344799236 02 1445 + 048532 1326 19 04 2 344799236 03 1445 + 048533 1326 19 05 2 344799236 04 1445 + 048534 1326 19 06 2 344799236 05 1445 + 048535 1326 19 07 2 344799236 06 1445 + 048536 1326 19 08 2 344799236 07 1445 + 048537 1326 20 01 2 344799236 08 1445 + 048538 1326 20 02 2 344799236 09 1445 + 048539 1326 20 03 2 344799236 10 1445 + 048540 1326 20 04 2 344799236 11 1445 + 048541 1326 20 05 2 344799236 12 1445 + 048542 1326 20 06 2 344799236 13 1445 + 048543 1326 20 07 2 344799236 14 1445 + 048544 1326 20 08 2 344799236 15 1445 + 048545 1326 21 01 2 344925188 00 1506 + 048546 1326 21 02 2 344925188 01 1506 + 048547 1326 21 03 2 344925188 02 1506 + 048548 1326 21 04 2 344925188 03 1506 + 048549 1326 21 05 2 344925188 04 1506 + 048550 1326 21 06 2 344925188 05 1506 + 048551 1326 21 07 2 344925188 06 1506 + 048552 1326 21 08 2 344925188 07 1506 + 048553 1326 22 01 2 344925188 08 1506 + 048554 1326 22 02 2 344925188 09 1506 + 048555 1326 22 03 2 344925188 10 1506 + 048556 1326 22 04 2 344925188 11 1506 + 048557 1326 22 05 2 344925188 12 1506 + 048558 1326 22 06 2 344925188 13 1506 + 048559 1326 22 07 2 344925188 14 1506 + 048560 1326 22 08 2 344925188 15 1506 + 048561 1326 23 01 2 344926212 00 1507 + 048562 1326 23 02 2 344926212 01 1507 + 048563 1326 23 03 2 344926212 02 1507 + 048564 1326 23 04 2 344926212 03 1507 + 048565 1326 23 05 2 344926212 04 1507 + 048566 1326 23 06 2 344926212 05 1507 + 048567 1326 23 07 2 344926212 06 1507 + 048568 1326 23 08 2 344926212 07 1507 + 048569 1326 24 01 2 344926212 08 1507 + 048570 1326 24 02 2 344926212 09 1507 + 048571 1326 24 03 2 344926212 10 1507 + 048572 1326 24 04 2 344926212 11 1507 + 048573 1326 24 05 2 344926212 12 1507 + 048574 1326 24 06 2 344926212 13 1507 + 048575 1326 24 07 2 344926212 14 1507 + 048576 1326 24 08 2 344926212 15 1507 + 048577 1326 25 01 2 344269828 00 1218 + 048578 1326 25 02 2 344269828 01 1218 + 048579 1326 25 03 2 344269828 02 1218 + 048580 1326 25 04 2 344269828 03 1218 + 048581 1326 25 05 2 344269828 04 1218 + 048582 1326 25 06 2 344269828 05 1218 + 048583 1326 25 07 2 344269828 06 1218 + 048584 1326 25 08 2 344269828 07 1218 + 048585 1326 26 01 2 344269828 08 1218 + 048586 1326 26 02 2 344269828 09 1218 + 048587 1326 26 03 2 344269828 10 1218 + 048588 1326 26 04 2 344269828 11 1218 + 048589 1326 26 05 2 344269828 12 1218 + 048590 1326 26 06 2 344269828 13 1218 + 048591 1326 26 07 2 344269828 14 1218 + 048592 1326 26 08 2 344269828 15 1218 + 048593 1326 27 01 2 344270852 00 1219 + 048594 1326 27 02 2 344270852 01 1219 + 048595 1326 27 03 2 344270852 02 1219 + 048596 1326 27 04 2 344270852 03 1219 + 048597 1326 27 05 2 344270852 04 1219 + 048598 1326 27 06 2 344270852 05 1219 + 048599 1326 27 07 2 344270852 06 1219 + 048600 1326 27 08 2 344270852 07 1219 + 048601 1326 28 01 2 344270852 08 1219 + 048602 1326 28 02 2 344270852 09 1219 + 048603 1326 28 03 2 344270852 10 1219 + 048604 1326 28 04 2 344270852 11 1219 + 048605 1326 28 05 2 344270852 12 1219 + 048606 1326 28 06 2 344270852 13 1219 + 048607 1326 28 07 2 344270852 14 1219 + 048608 1326 28 08 2 344270852 15 1219 + 048609 1326 29 01 2 344396804 00 1280 + 048610 1326 29 02 2 344396804 01 1280 + 048611 1326 29 03 2 344396804 02 1280 + 048612 1326 29 04 2 344396804 03 1280 + 048613 1326 29 05 2 344396804 04 1280 + 048614 1326 29 06 2 344396804 05 1280 + 048615 1326 29 07 2 344396804 06 1280 + 048616 1326 29 08 2 344396804 07 1280 + 048617 1326 30 01 2 344396804 08 1280 + 048618 1326 30 02 2 344396804 09 1280 + 048619 1326 30 03 2 344396804 10 1280 + 048620 1326 30 04 2 344396804 11 1280 + 048621 1326 30 05 2 344396804 12 1280 + 048622 1326 30 06 2 344396804 13 1280 + 048623 1326 30 07 2 344396804 14 1280 + 048624 1326 30 08 2 344396804 15 1280 + 048625 1326 31 01 2 344397828 00 1281 + 048626 1326 31 02 2 344397828 01 1281 + 048627 1326 31 03 2 344397828 02 1281 + 048628 1326 31 04 2 344397828 03 1281 + 048629 1326 31 05 2 344397828 04 1281 + 048630 1326 31 06 2 344397828 05 1281 + 048631 1326 31 07 2 344397828 06 1281 + 048632 1326 31 08 2 344397828 07 1281 + 048633 1326 32 01 2 344397828 08 1281 + 048634 1326 32 02 2 344397828 09 1281 + 048635 1326 32 03 2 344397828 10 1281 + 048636 1326 32 04 2 344397828 11 1281 + 048637 1326 32 05 2 344397828 12 1281 + 048638 1326 32 06 2 344397828 13 1281 + 048639 1326 32 07 2 344397828 14 1281 + 048640 1326 32 08 2 344397828 15 1281 + 048641 1326 33 01 2 344531972 00 1330 + 048642 1326 33 02 2 344531972 01 1330 + 048643 1326 33 03 2 344531972 02 1330 + 048644 1326 33 04 2 344531972 03 1330 + 048645 1326 33 05 2 344531972 04 1330 + 048646 1326 33 06 2 344531972 05 1330 + 048647 1326 33 07 2 344531972 06 1330 + 048648 1326 33 08 2 344531972 07 1330 + 048649 1326 34 01 2 344531972 08 1330 + 048650 1326 34 02 2 344531972 09 1330 + 048651 1326 34 03 2 344531972 10 1330 + 048652 1326 34 04 2 344531972 11 1330 + 048653 1326 34 05 2 344531972 12 1330 + 048654 1326 34 06 2 344531972 13 1330 + 048655 1326 34 07 2 344531972 14 1330 + 048656 1326 34 08 2 344531972 15 1330 + 048657 1326 35 01 2 344532996 00 1331 + 048658 1326 35 02 2 344532996 01 1331 + 048659 1326 35 03 2 344532996 02 1331 + 048660 1326 35 04 2 344532996 03 1331 + 048661 1326 35 05 2 344532996 04 1331 + 048662 1326 35 06 2 344532996 05 1331 + 048663 1326 35 07 2 344532996 06 1331 + 048664 1326 35 08 2 344532996 07 1331 + 048665 1326 36 01 2 344532996 08 1331 + 048666 1326 36 02 2 344532996 09 1331 + 048667 1326 36 03 2 344532996 10 1331 + 048668 1326 36 04 2 344532996 11 1331 + 048669 1326 36 05 2 344532996 12 1331 + 048670 1326 36 06 2 344532996 13 1331 + 048671 1326 36 07 2 344532996 14 1331 + 048672 1326 36 08 2 344532996 15 1331 + 048673 1326 37 01 2 344658948 00 1392 + 048674 1326 37 02 2 344658948 01 1392 + 048675 1326 37 03 2 344658948 02 1392 + 048676 1326 37 04 2 344658948 03 1392 + 048677 1326 37 05 2 344658948 04 1392 + 048678 1326 37 06 2 344658948 05 1392 + 048679 1326 37 07 2 344658948 06 1392 + 048680 1326 37 08 2 344658948 07 1392 + 048681 1326 38 01 2 344658948 08 1392 + 048682 1326 38 02 2 344658948 09 1392 + 048683 1326 38 03 2 344658948 10 1392 + 048684 1326 38 04 2 344658948 11 1392 + 048685 1326 38 05 2 344658948 12 1392 + 048686 1326 38 06 2 344658948 13 1392 + 048687 1326 38 07 2 344658948 14 1392 + 048688 1326 38 08 2 344658948 15 1392 + 048689 1326 39 01 2 344659972 00 1393 + 048690 1326 39 02 2 344659972 01 1393 + 048691 1326 39 03 2 344659972 02 1393 + 048692 1326 39 04 2 344659972 03 1393 + 048693 1326 39 05 2 344659972 04 1393 + 048694 1326 39 06 2 344659972 05 1393 + 048695 1326 39 07 2 344659972 06 1393 + 048696 1326 39 08 2 344659972 07 1393 + 048697 1326 40 01 2 344659972 08 1393 + 048698 1326 40 02 2 344659972 09 1393 + 048699 1326 40 03 2 344659972 10 1393 + 048700 1326 40 04 2 344659972 11 1393 + 048701 1326 40 05 2 344659972 12 1393 + 048702 1326 40 06 2 344659972 13 1393 + 048703 1326 40 07 2 344659972 14 1393 + 048704 1326 40 08 2 344659972 15 1393 + 048705 1326 41 01 2 344794116 00 1442 + 048706 1326 41 02 2 344794116 01 1442 + 048707 1326 41 03 2 344794116 02 1442 + 048708 1326 41 04 2 344794116 03 1442 + 048709 1326 41 05 2 344794116 04 1442 + 048710 1326 41 06 2 344794116 05 1442 + 048711 1326 41 07 2 344794116 06 1442 + 048712 1326 41 08 2 344794116 07 1442 + 048713 1326 42 01 2 344794116 08 1442 + 048714 1326 42 02 2 344794116 09 1442 + 048715 1326 42 03 2 344794116 10 1442 + 048716 1326 42 04 2 344794116 11 1442 + 048717 1326 42 05 2 344794116 12 1442 + 048718 1326 42 06 2 344794116 13 1442 + 048719 1326 42 07 2 344794116 14 1442 + 048720 1326 42 08 2 344794116 15 1442 + 048721 1326 43 01 2 344795140 00 1443 + 048722 1326 43 02 2 344795140 01 1443 + 048723 1326 43 03 2 344795140 02 1443 + 048724 1326 43 04 2 344795140 03 1443 + 048725 1326 43 05 2 344795140 04 1443 + 048726 1326 43 06 2 344795140 05 1443 + 048727 1326 43 07 2 344795140 06 1443 + 048728 1326 43 08 2 344795140 07 1443 + 048729 1326 44 01 2 344795140 08 1443 + 048730 1326 44 02 2 344795140 09 1443 + 048731 1326 44 03 2 344795140 10 1443 + 048732 1326 44 04 2 344795140 11 1443 + 048733 1326 44 05 2 344795140 12 1443 + 048734 1326 44 06 2 344795140 13 1443 + 048735 1326 44 07 2 344795140 14 1443 + 048736 1326 44 08 2 344795140 15 1443 + 048737 1326 45 01 2 344921092 00 1504 + 048738 1326 45 02 2 344921092 01 1504 + 048739 1326 45 03 2 344921092 02 1504 + 048740 1326 45 04 2 344921092 03 1504 + 048741 1326 45 05 2 344921092 04 1504 + 048742 1326 45 06 2 344921092 05 1504 + 048743 1326 45 07 2 344921092 06 1504 + 048744 1326 45 08 2 344921092 07 1504 + 048745 1326 46 01 2 344921092 08 1504 + 048746 1326 46 02 2 344921092 09 1504 + 048747 1326 46 03 2 344921092 10 1504 + 048748 1326 46 04 2 344921092 11 1504 + 048749 1326 46 05 2 344921092 12 1504 + 048750 1326 46 06 2 344921092 13 1504 + 048751 1326 46 07 2 344921092 14 1504 + 048752 1326 46 08 2 344921092 15 1504 + 048753 1326 47 01 2 344922116 00 1505 + 048754 1326 47 02 2 344922116 01 1505 + 048755 1326 47 03 2 344922116 02 1505 + 048756 1326 47 04 2 344922116 03 1505 + 048757 1326 47 05 2 344922116 04 1505 + 048758 1326 47 06 2 344922116 05 1505 + 048759 1326 47 07 2 344922116 06 1505 + 048760 1326 47 08 2 344922116 07 1505 + 048761 1326 48 01 2 344922116 08 1505 + 048762 1326 48 02 2 344922116 09 1505 + 048763 1326 48 03 2 344922116 10 1505 + 048764 1326 48 04 2 344922116 11 1505 + 048765 1326 48 05 2 344922116 12 1505 + 048766 1326 48 06 2 344922116 13 1505 + 048767 1326 48 07 2 344922116 14 1505 + 048768 1326 48 08 2 344922116 15 1505 + 048769 9999 99 99 0 9999 99 9999 + 048770 9999 99 99 0 9999 99 9999 + 048771 9999 99 99 0 9999 99 9999 + 048772 9999 99 99 0 9999 99 9999 + 048773 9999 99 99 0 9999 99 9999 + 048774 9999 99 99 0 9999 99 9999 + 048775 9999 99 99 0 9999 99 9999 + 048776 9999 99 99 0 9999 99 9999 + 048777 9999 99 99 0 9999 99 9999 + 048778 9999 99 99 0 9999 99 9999 + 048779 9999 99 99 0 9999 99 9999 + 048780 9999 99 99 0 9999 99 9999 + 048781 9999 99 99 0 9999 99 9999 + 048782 9999 99 99 0 9999 99 9999 + 048783 9999 99 99 0 9999 99 9999 + 048784 9999 99 99 0 9999 99 9999 + 048785 9999 99 99 0 9999 99 9999 + 048786 9999 99 99 0 9999 99 9999 + 048787 9999 99 99 0 9999 99 9999 + 048788 9999 99 99 0 9999 99 9999 + 048789 9999 99 99 0 9999 99 9999 + 048790 9999 99 99 0 9999 99 9999 + 048791 9999 99 99 0 9999 99 9999 + 048792 9999 99 99 0 9999 99 9999 + 048793 9999 99 99 0 9999 99 9999 + 048794 9999 99 99 0 9999 99 9999 + 048795 9999 99 99 0 9999 99 9999 + 048796 9999 99 99 0 9999 99 9999 + 048797 9999 99 99 0 9999 99 9999 + 048798 9999 99 99 0 9999 99 9999 + 048799 9999 99 99 0 9999 99 9999 + 048800 9999 99 99 0 9999 99 9999 + 048801 9999 99 99 0 9999 99 9999 + 048802 9999 99 99 0 9999 99 9999 + 048803 9999 99 99 0 9999 99 9999 + 048804 9999 99 99 0 9999 99 9999 + 048805 9999 99 99 0 9999 99 9999 + 048806 9999 99 99 0 9999 99 9999 + 048807 9999 99 99 0 9999 99 9999 + 048808 9999 99 99 0 9999 99 9999 + 048809 9999 99 99 0 9999 99 9999 + 048810 9999 99 99 0 9999 99 9999 + 048811 9999 99 99 0 9999 99 9999 + 048812 9999 99 99 0 9999 99 9999 + 048813 9999 99 99 0 9999 99 9999 + 048814 9999 99 99 0 9999 99 9999 + 048815 9999 99 99 0 9999 99 9999 + 048816 9999 99 99 0 9999 99 9999 + 048817 9999 99 99 0 9999 99 9999 + 048818 9999 99 99 0 9999 99 9999 + 048819 9999 99 99 0 9999 99 9999 + 048820 9999 99 99 0 9999 99 9999 + 048821 9999 99 99 0 9999 99 9999 + 048822 9999 99 99 0 9999 99 9999 + 048823 9999 99 99 0 9999 99 9999 + 048824 9999 99 99 0 9999 99 9999 + 048825 9999 99 99 0 9999 99 9999 + 048826 9999 99 99 0 9999 99 9999 + 048827 9999 99 99 0 9999 99 9999 + 048828 9999 99 99 0 9999 99 9999 + 048829 9999 99 99 0 9999 99 9999 + 048830 9999 99 99 0 9999 99 9999 + 048831 9999 99 99 0 9999 99 9999 + 048832 9999 99 99 0 9999 99 9999 + 048833 9999 99 99 0 9999 99 9999 + 048834 9999 99 99 0 9999 99 9999 + 048835 9999 99 99 0 9999 99 9999 + 048836 9999 99 99 0 9999 99 9999 + 048837 9999 99 99 0 9999 99 9999 + 048838 9999 99 99 0 9999 99 9999 + 048839 9999 99 99 0 9999 99 9999 + 048840 9999 99 99 0 9999 99 9999 + 048841 9999 99 99 0 9999 99 9999 + 048842 9999 99 99 0 9999 99 9999 + 048843 9999 99 99 0 9999 99 9999 + 048844 9999 99 99 0 9999 99 9999 + 048845 9999 99 99 0 9999 99 9999 + 048846 9999 99 99 0 9999 99 9999 + 048847 9999 99 99 0 9999 99 9999 + 048848 9999 99 99 0 9999 99 9999 + 048849 9999 99 99 0 9999 99 9999 + 048850 9999 99 99 0 9999 99 9999 + 048851 9999 99 99 0 9999 99 9999 + 048852 9999 99 99 0 9999 99 9999 + 048853 9999 99 99 0 9999 99 9999 + 048854 9999 99 99 0 9999 99 9999 + 048855 9999 99 99 0 9999 99 9999 + 048856 9999 99 99 0 9999 99 9999 + 048857 9999 99 99 0 9999 99 9999 + 048858 9999 99 99 0 9999 99 9999 + 048859 9999 99 99 0 9999 99 9999 + 048860 9999 99 99 0 9999 99 9999 + 048861 9999 99 99 0 9999 99 9999 + 048862 9999 99 99 0 9999 99 9999 + 048863 9999 99 99 0 9999 99 9999 + 048864 9999 99 99 0 9999 99 9999 + 048865 9999 99 99 0 9999 99 9999 + 048866 9999 99 99 0 9999 99 9999 + 048867 9999 99 99 0 9999 99 9999 + 048868 9999 99 99 0 9999 99 9999 + 048869 9999 99 99 0 9999 99 9999 + 048870 9999 99 99 0 9999 99 9999 + 048871 9999 99 99 0 9999 99 9999 + 048872 9999 99 99 0 9999 99 9999 + 048873 9999 99 99 0 9999 99 9999 + 048874 9999 99 99 0 9999 99 9999 + 048875 9999 99 99 0 9999 99 9999 + 048876 9999 99 99 0 9999 99 9999 + 048877 9999 99 99 0 9999 99 9999 + 048878 9999 99 99 0 9999 99 9999 + 048879 9999 99 99 0 9999 99 9999 + 048880 9999 99 99 0 9999 99 9999 + 048881 9999 99 99 0 9999 99 9999 + 048882 9999 99 99 0 9999 99 9999 + 048883 9999 99 99 0 9999 99 9999 + 048884 9999 99 99 0 9999 99 9999 + 048885 9999 99 99 0 9999 99 9999 + 048886 9999 99 99 0 9999 99 9999 + 048887 9999 99 99 0 9999 99 9999 + 048888 9999 99 99 0 9999 99 9999 + 048889 9999 99 99 0 9999 99 9999 + 048890 9999 99 99 0 9999 99 9999 + 048891 9999 99 99 0 9999 99 9999 + 048892 9999 99 99 0 9999 99 9999 + 048893 9999 99 99 0 9999 99 9999 + 048894 9999 99 99 0 9999 99 9999 + 048895 9999 99 99 0 9999 99 9999 + 048896 9999 99 99 0 9999 99 9999 + 048897 9999 99 99 0 9999 99 9999 + 048898 9999 99 99 0 9999 99 9999 + 048899 9999 99 99 0 9999 99 9999 + 048900 9999 99 99 0 9999 99 9999 + 048901 9999 99 99 0 9999 99 9999 + 048902 9999 99 99 0 9999 99 9999 + 048903 9999 99 99 0 9999 99 9999 + 048904 9999 99 99 0 9999 99 9999 + 048905 9999 99 99 0 9999 99 9999 + 048906 9999 99 99 0 9999 99 9999 + 048907 9999 99 99 0 9999 99 9999 + 048908 9999 99 99 0 9999 99 9999 + 048909 9999 99 99 0 9999 99 9999 + 048910 9999 99 99 0 9999 99 9999 + 048911 9999 99 99 0 9999 99 9999 + 048912 9999 99 99 0 9999 99 9999 + 048913 9999 99 99 0 9999 99 9999 + 048914 9999 99 99 0 9999 99 9999 + 048915 9999 99 99 0 9999 99 9999 + 048916 9999 99 99 0 9999 99 9999 + 048917 9999 99 99 0 9999 99 9999 + 048918 9999 99 99 0 9999 99 9999 + 048919 9999 99 99 0 9999 99 9999 + 048920 9999 99 99 0 9999 99 9999 + 048921 9999 99 99 0 9999 99 9999 + 048922 9999 99 99 0 9999 99 9999 + 048923 9999 99 99 0 9999 99 9999 + 048924 9999 99 99 0 9999 99 9999 + 048925 9999 99 99 0 9999 99 9999 + 048926 9999 99 99 0 9999 99 9999 + 048927 9999 99 99 0 9999 99 9999 + 048928 9999 99 99 0 9999 99 9999 + 048929 9999 99 99 0 9999 99 9999 + 048930 9999 99 99 0 9999 99 9999 + 048931 9999 99 99 0 9999 99 9999 + 048932 9999 99 99 0 9999 99 9999 + 048933 9999 99 99 0 9999 99 9999 + 048934 9999 99 99 0 9999 99 9999 + 048935 9999 99 99 0 9999 99 9999 + 048936 9999 99 99 0 9999 99 9999 + 048937 9999 99 99 0 9999 99 9999 + 048938 9999 99 99 0 9999 99 9999 + 048939 9999 99 99 0 9999 99 9999 + 048940 9999 99 99 0 9999 99 9999 + 048941 9999 99 99 0 9999 99 9999 + 048942 9999 99 99 0 9999 99 9999 + 048943 9999 99 99 0 9999 99 9999 + 048944 9999 99 99 0 9999 99 9999 + 048945 9999 99 99 0 9999 99 9999 + 048946 9999 99 99 0 9999 99 9999 + 048947 9999 99 99 0 9999 99 9999 + 048948 9999 99 99 0 9999 99 9999 + 048949 9999 99 99 0 9999 99 9999 + 048950 9999 99 99 0 9999 99 9999 + 048951 9999 99 99 0 9999 99 9999 + 048952 9999 99 99 0 9999 99 9999 + 048953 9999 99 99 0 9999 99 9999 + 048954 9999 99 99 0 9999 99 9999 + 048955 9999 99 99 0 9999 99 9999 + 048956 9999 99 99 0 9999 99 9999 + 048957 9999 99 99 0 9999 99 9999 + 048958 9999 99 99 0 9999 99 9999 + 048959 9999 99 99 0 9999 99 9999 + 048960 9999 99 99 0 9999 99 9999 + 048961 9999 99 99 0 9999 99 9999 + 048962 9999 99 99 0 9999 99 9999 + 048963 9999 99 99 0 9999 99 9999 + 048964 9999 99 99 0 9999 99 9999 + 048965 9999 99 99 0 9999 99 9999 + 048966 9999 99 99 0 9999 99 9999 + 048967 9999 99 99 0 9999 99 9999 + 048968 9999 99 99 0 9999 99 9999 + 048969 9999 99 99 0 9999 99 9999 + 048970 9999 99 99 0 9999 99 9999 + 048971 9999 99 99 0 9999 99 9999 + 048972 9999 99 99 0 9999 99 9999 + 048973 9999 99 99 0 9999 99 9999 + 048974 9999 99 99 0 9999 99 9999 + 048975 9999 99 99 0 9999 99 9999 + 048976 9999 99 99 0 9999 99 9999 + 048977 9999 99 99 0 9999 99 9999 + 048978 9999 99 99 0 9999 99 9999 + 048979 9999 99 99 0 9999 99 9999 + 048980 9999 99 99 0 9999 99 9999 + 048981 9999 99 99 0 9999 99 9999 + 048982 9999 99 99 0 9999 99 9999 + 048983 9999 99 99 0 9999 99 9999 + 048984 9999 99 99 0 9999 99 9999 + 048985 9999 99 99 0 9999 99 9999 + 048986 9999 99 99 0 9999 99 9999 + 048987 9999 99 99 0 9999 99 9999 + 048988 9999 99 99 0 9999 99 9999 + 048989 9999 99 99 0 9999 99 9999 + 048990 9999 99 99 0 9999 99 9999 + 048991 9999 99 99 0 9999 99 9999 + 048992 9999 99 99 0 9999 99 9999 + 048993 9999 99 99 0 9999 99 9999 + 048994 9999 99 99 0 9999 99 9999 + 048995 9999 99 99 0 9999 99 9999 + 048996 9999 99 99 0 9999 99 9999 + 048997 9999 99 99 0 9999 99 9999 + 048998 9999 99 99 0 9999 99 9999 + 048999 9999 99 99 0 9999 99 9999 + 049000 9999 99 99 0 9999 99 9999 + 049001 9999 99 99 0 9999 99 9999 + 049002 9999 99 99 0 9999 99 9999 + 049003 9999 99 99 0 9999 99 9999 + 049004 9999 99 99 0 9999 99 9999 + 049005 9999 99 99 0 9999 99 9999 + 049006 9999 99 99 0 9999 99 9999 + 049007 9999 99 99 0 9999 99 9999 + 049008 9999 99 99 0 9999 99 9999 + 049009 9999 99 99 0 9999 99 9999 + 049010 9999 99 99 0 9999 99 9999 + 049011 9999 99 99 0 9999 99 9999 + 049012 9999 99 99 0 9999 99 9999 + 049013 9999 99 99 0 9999 99 9999 + 049014 9999 99 99 0 9999 99 9999 + 049015 9999 99 99 0 9999 99 9999 + 049016 9999 99 99 0 9999 99 9999 + 049017 9999 99 99 0 9999 99 9999 + 049018 9999 99 99 0 9999 99 9999 + 049019 9999 99 99 0 9999 99 9999 + 049020 9999 99 99 0 9999 99 9999 + 049021 9999 99 99 0 9999 99 9999 + 049022 9999 99 99 0 9999 99 9999 + 049023 9999 99 99 0 9999 99 9999 + 049024 9999 99 99 0 9999 99 9999 + 049025 9999 99 99 0 9999 99 9999 + 049026 9999 99 99 0 9999 99 9999 + 049027 9999 99 99 0 9999 99 9999 + 049028 9999 99 99 0 9999 99 9999 + 049029 9999 99 99 0 9999 99 9999 + 049030 9999 99 99 0 9999 99 9999 + 049031 9999 99 99 0 9999 99 9999 + 049032 9999 99 99 0 9999 99 9999 + 049033 9999 99 99 0 9999 99 9999 + 049034 9999 99 99 0 9999 99 9999 + 049035 9999 99 99 0 9999 99 9999 + 049036 9999 99 99 0 9999 99 9999 + 049037 9999 99 99 0 9999 99 9999 + 049038 9999 99 99 0 9999 99 9999 + 049039 9999 99 99 0 9999 99 9999 + 049040 9999 99 99 0 9999 99 9999 + 049041 9999 99 99 0 9999 99 9999 + 049042 9999 99 99 0 9999 99 9999 + 049043 9999 99 99 0 9999 99 9999 + 049044 9999 99 99 0 9999 99 9999 + 049045 9999 99 99 0 9999 99 9999 + 049046 9999 99 99 0 9999 99 9999 + 049047 9999 99 99 0 9999 99 9999 + 049048 9999 99 99 0 9999 99 9999 + 049049 9999 99 99 0 9999 99 9999 + 049050 9999 99 99 0 9999 99 9999 + 049051 9999 99 99 0 9999 99 9999 + 049052 9999 99 99 0 9999 99 9999 + 049053 9999 99 99 0 9999 99 9999 + 049054 9999 99 99 0 9999 99 9999 + 049055 9999 99 99 0 9999 99 9999 + 049056 9999 99 99 0 9999 99 9999 + 049057 9999 99 99 0 9999 99 9999 + 049058 9999 99 99 0 9999 99 9999 + 049059 9999 99 99 0 9999 99 9999 + 049060 9999 99 99 0 9999 99 9999 + 049061 9999 99 99 0 9999 99 9999 + 049062 9999 99 99 0 9999 99 9999 + 049063 9999 99 99 0 9999 99 9999 + 049064 9999 99 99 0 9999 99 9999 + 049065 9999 99 99 0 9999 99 9999 + 049066 9999 99 99 0 9999 99 9999 + 049067 9999 99 99 0 9999 99 9999 + 049068 9999 99 99 0 9999 99 9999 + 049069 9999 99 99 0 9999 99 9999 + 049070 9999 99 99 0 9999 99 9999 + 049071 9999 99 99 0 9999 99 9999 + 049072 9999 99 99 0 9999 99 9999 + 049073 9999 99 99 0 9999 99 9999 + 049074 9999 99 99 0 9999 99 9999 + 049075 9999 99 99 0 9999 99 9999 + 049076 9999 99 99 0 9999 99 9999 + 049077 9999 99 99 0 9999 99 9999 + 049078 9999 99 99 0 9999 99 9999 + 049079 9999 99 99 0 9999 99 9999 + 049080 9999 99 99 0 9999 99 9999 + 049081 9999 99 99 0 9999 99 9999 + 049082 9999 99 99 0 9999 99 9999 + 049083 9999 99 99 0 9999 99 9999 + 049084 9999 99 99 0 9999 99 9999 + 049085 9999 99 99 0 9999 99 9999 + 049086 9999 99 99 0 9999 99 9999 + 049087 9999 99 99 0 9999 99 9999 + 049088 9999 99 99 0 9999 99 9999 + 049089 9999 99 99 0 9999 99 9999 + 049090 9999 99 99 0 9999 99 9999 + 049091 9999 99 99 0 9999 99 9999 + 049092 9999 99 99 0 9999 99 9999 + 049093 9999 99 99 0 9999 99 9999 + 049094 9999 99 99 0 9999 99 9999 + 049095 9999 99 99 0 9999 99 9999 + 049096 9999 99 99 0 9999 99 9999 + 049097 9999 99 99 0 9999 99 9999 + 049098 9999 99 99 0 9999 99 9999 + 049099 9999 99 99 0 9999 99 9999 + 049100 9999 99 99 0 9999 99 9999 + 049101 9999 99 99 0 9999 99 9999 + 049102 9999 99 99 0 9999 99 9999 + 049103 9999 99 99 0 9999 99 9999 + 049104 9999 99 99 0 9999 99 9999 + 049105 9999 99 99 0 9999 99 9999 + 049106 9999 99 99 0 9999 99 9999 + 049107 9999 99 99 0 9999 99 9999 + 049108 9999 99 99 0 9999 99 9999 + 049109 9999 99 99 0 9999 99 9999 + 049110 9999 99 99 0 9999 99 9999 + 049111 9999 99 99 0 9999 99 9999 + 049112 9999 99 99 0 9999 99 9999 + 049113 9999 99 99 0 9999 99 9999 + 049114 9999 99 99 0 9999 99 9999 + 049115 9999 99 99 0 9999 99 9999 + 049116 9999 99 99 0 9999 99 9999 + 049117 9999 99 99 0 9999 99 9999 + 049118 9999 99 99 0 9999 99 9999 + 049119 9999 99 99 0 9999 99 9999 + 049120 9999 99 99 0 9999 99 9999 + 049121 9999 99 99 0 9999 99 9999 + 049122 9999 99 99 0 9999 99 9999 + 049123 9999 99 99 0 9999 99 9999 + 049124 9999 99 99 0 9999 99 9999 + 049125 9999 99 99 0 9999 99 9999 + 049126 9999 99 99 0 9999 99 9999 + 049127 9999 99 99 0 9999 99 9999 + 049128 9999 99 99 0 9999 99 9999 + 049129 9999 99 99 0 9999 99 9999 + 049130 9999 99 99 0 9999 99 9999 + 049131 9999 99 99 0 9999 99 9999 + 049132 9999 99 99 0 9999 99 9999 + 049133 9999 99 99 0 9999 99 9999 + 049134 9999 99 99 0 9999 99 9999 + 049135 9999 99 99 0 9999 99 9999 + 049136 9999 99 99 0 9999 99 9999 + 049137 9999 99 99 0 9999 99 9999 + 049138 9999 99 99 0 9999 99 9999 + 049139 9999 99 99 0 9999 99 9999 + 049140 9999 99 99 0 9999 99 9999 + 049141 9999 99 99 0 9999 99 9999 + 049142 9999 99 99 0 9999 99 9999 + 049143 9999 99 99 0 9999 99 9999 + 049144 9999 99 99 0 9999 99 9999 + 049145 9999 99 99 0 9999 99 9999 + 049146 9999 99 99 0 9999 99 9999 + 049147 9999 99 99 0 9999 99 9999 + 049148 9999 99 99 0 9999 99 9999 + 049149 9999 99 99 0 9999 99 9999 + 049150 9999 99 99 0 9999 99 9999 + 049151 9999 99 99 0 9999 99 9999 + 049152 9999 99 99 0 9999 99 9999 + 049153 9999 99 99 0 9999 99 9999 + 049154 9999 99 99 0 9999 99 9999 + 049155 9999 99 99 0 9999 99 9999 + 049156 9999 99 99 0 9999 99 9999 + 049157 9999 99 99 0 9999 99 9999 + 049158 9999 99 99 0 9999 99 9999 + 049159 9999 99 99 0 9999 99 9999 + 049160 9999 99 99 0 9999 99 9999 + 049161 9999 99 99 0 9999 99 9999 + 049162 9999 99 99 0 9999 99 9999 + 049163 9999 99 99 0 9999 99 9999 + 049164 9999 99 99 0 9999 99 9999 + 049165 9999 99 99 0 9999 99 9999 + 049166 9999 99 99 0 9999 99 9999 + 049167 9999 99 99 0 9999 99 9999 + 049168 9999 99 99 0 9999 99 9999 + 049169 9999 99 99 0 9999 99 9999 + 049170 9999 99 99 0 9999 99 9999 + 049171 9999 99 99 0 9999 99 9999 + 049172 9999 99 99 0 9999 99 9999 + 049173 9999 99 99 0 9999 99 9999 + 049174 9999 99 99 0 9999 99 9999 + 049175 9999 99 99 0 9999 99 9999 + 049176 9999 99 99 0 9999 99 9999 + 049177 9999 99 99 0 9999 99 9999 + 049178 9999 99 99 0 9999 99 9999 + 049179 9999 99 99 0 9999 99 9999 + 049180 9999 99 99 0 9999 99 9999 + 049181 9999 99 99 0 9999 99 9999 + 049182 9999 99 99 0 9999 99 9999 + 049183 9999 99 99 0 9999 99 9999 + 049184 9999 99 99 0 9999 99 9999 + 049185 9999 99 99 0 9999 99 9999 + 049186 9999 99 99 0 9999 99 9999 + 049187 9999 99 99 0 9999 99 9999 + 049188 9999 99 99 0 9999 99 9999 + 049189 9999 99 99 0 9999 99 9999 + 049190 9999 99 99 0 9999 99 9999 + 049191 9999 99 99 0 9999 99 9999 + 049192 9999 99 99 0 9999 99 9999 + 049193 9999 99 99 0 9999 99 9999 + 049194 9999 99 99 0 9999 99 9999 + 049195 9999 99 99 0 9999 99 9999 + 049196 9999 99 99 0 9999 99 9999 + 049197 9999 99 99 0 9999 99 9999 + 049198 9999 99 99 0 9999 99 9999 + 049199 9999 99 99 0 9999 99 9999 + 049200 9999 99 99 0 9999 99 9999 + 049201 9999 99 99 0 9999 99 9999 + 049202 9999 99 99 0 9999 99 9999 + 049203 9999 99 99 0 9999 99 9999 + 049204 9999 99 99 0 9999 99 9999 + 049205 9999 99 99 0 9999 99 9999 + 049206 9999 99 99 0 9999 99 9999 + 049207 9999 99 99 0 9999 99 9999 + 049208 9999 99 99 0 9999 99 9999 + 049209 9999 99 99 0 9999 99 9999 + 049210 9999 99 99 0 9999 99 9999 + 049211 9999 99 99 0 9999 99 9999 + 049212 9999 99 99 0 9999 99 9999 + 049213 9999 99 99 0 9999 99 9999 + 049214 9999 99 99 0 9999 99 9999 + 049215 9999 99 99 0 9999 99 9999 + 049216 9999 99 99 0 9999 99 9999 + 049217 9999 99 99 0 9999 99 9999 + 049218 9999 99 99 0 9999 99 9999 + 049219 9999 99 99 0 9999 99 9999 + 049220 9999 99 99 0 9999 99 9999 + 049221 9999 99 99 0 9999 99 9999 + 049222 9999 99 99 0 9999 99 9999 + 049223 9999 99 99 0 9999 99 9999 + 049224 9999 99 99 0 9999 99 9999 + 049225 9999 99 99 0 9999 99 9999 + 049226 9999 99 99 0 9999 99 9999 + 049227 9999 99 99 0 9999 99 9999 + 049228 9999 99 99 0 9999 99 9999 + 049229 9999 99 99 0 9999 99 9999 + 049230 9999 99 99 0 9999 99 9999 + 049231 9999 99 99 0 9999 99 9999 + 049232 9999 99 99 0 9999 99 9999 + 049233 9999 99 99 0 9999 99 9999 + 049234 9999 99 99 0 9999 99 9999 + 049235 9999 99 99 0 9999 99 9999 + 049236 9999 99 99 0 9999 99 9999 + 049237 9999 99 99 0 9999 99 9999 + 049238 9999 99 99 0 9999 99 9999 + 049239 9999 99 99 0 9999 99 9999 + 049240 9999 99 99 0 9999 99 9999 + 049241 9999 99 99 0 9999 99 9999 + 049242 9999 99 99 0 9999 99 9999 + 049243 9999 99 99 0 9999 99 9999 + 049244 9999 99 99 0 9999 99 9999 + 049245 9999 99 99 0 9999 99 9999 + 049246 9999 99 99 0 9999 99 9999 + 049247 9999 99 99 0 9999 99 9999 + 049248 9999 99 99 0 9999 99 9999 + 049249 9999 99 99 0 9999 99 9999 + 049250 9999 99 99 0 9999 99 9999 + 049251 9999 99 99 0 9999 99 9999 + 049252 9999 99 99 0 9999 99 9999 + 049253 9999 99 99 0 9999 99 9999 + 049254 9999 99 99 0 9999 99 9999 + 049255 9999 99 99 0 9999 99 9999 + 049256 9999 99 99 0 9999 99 9999 + 049257 9999 99 99 0 9999 99 9999 + 049258 9999 99 99 0 9999 99 9999 + 049259 9999 99 99 0 9999 99 9999 + 049260 9999 99 99 0 9999 99 9999 + 049261 9999 99 99 0 9999 99 9999 + 049262 9999 99 99 0 9999 99 9999 + 049263 9999 99 99 0 9999 99 9999 + 049264 9999 99 99 0 9999 99 9999 + 049265 9999 99 99 0 9999 99 9999 + 049266 9999 99 99 0 9999 99 9999 + 049267 9999 99 99 0 9999 99 9999 + 049268 9999 99 99 0 9999 99 9999 + 049269 9999 99 99 0 9999 99 9999 + 049270 9999 99 99 0 9999 99 9999 + 049271 9999 99 99 0 9999 99 9999 + 049272 9999 99 99 0 9999 99 9999 + 049273 9999 99 99 0 9999 99 9999 + 049274 9999 99 99 0 9999 99 9999 + 049275 9999 99 99 0 9999 99 9999 + 049276 9999 99 99 0 9999 99 9999 + 049277 9999 99 99 0 9999 99 9999 + 049278 9999 99 99 0 9999 99 9999 + 049279 9999 99 99 0 9999 99 9999 + 049280 9999 99 99 0 9999 99 9999 + 049281 9999 99 99 0 9999 99 9999 + 049282 9999 99 99 0 9999 99 9999 + 049283 9999 99 99 0 9999 99 9999 + 049284 9999 99 99 0 9999 99 9999 + 049285 9999 99 99 0 9999 99 9999 + 049286 9999 99 99 0 9999 99 9999 + 049287 9999 99 99 0 9999 99 9999 + 049288 9999 99 99 0 9999 99 9999 + 049289 9999 99 99 0 9999 99 9999 + 049290 9999 99 99 0 9999 99 9999 + 049291 9999 99 99 0 9999 99 9999 + 049292 9999 99 99 0 9999 99 9999 + 049293 9999 99 99 0 9999 99 9999 + 049294 9999 99 99 0 9999 99 9999 + 049295 9999 99 99 0 9999 99 9999 + 049296 9999 99 99 0 9999 99 9999 + 049297 9999 99 99 0 9999 99 9999 + 049298 9999 99 99 0 9999 99 9999 + 049299 9999 99 99 0 9999 99 9999 + 049300 9999 99 99 0 9999 99 9999 + 049301 9999 99 99 0 9999 99 9999 + 049302 9999 99 99 0 9999 99 9999 + 049303 9999 99 99 0 9999 99 9999 + 049304 9999 99 99 0 9999 99 9999 + 049305 9999 99 99 0 9999 99 9999 + 049306 9999 99 99 0 9999 99 9999 + 049307 9999 99 99 0 9999 99 9999 + 049308 9999 99 99 0 9999 99 9999 + 049309 9999 99 99 0 9999 99 9999 + 049310 9999 99 99 0 9999 99 9999 + 049311 9999 99 99 0 9999 99 9999 + 049312 9999 99 99 0 9999 99 9999 + 049313 9999 99 99 0 9999 99 9999 + 049314 9999 99 99 0 9999 99 9999 + 049315 9999 99 99 0 9999 99 9999 + 049316 9999 99 99 0 9999 99 9999 + 049317 9999 99 99 0 9999 99 9999 + 049318 9999 99 99 0 9999 99 9999 + 049319 9999 99 99 0 9999 99 9999 + 049320 9999 99 99 0 9999 99 9999 + 049321 9999 99 99 0 9999 99 9999 + 049322 9999 99 99 0 9999 99 9999 + 049323 9999 99 99 0 9999 99 9999 + 049324 9999 99 99 0 9999 99 9999 + 049325 9999 99 99 0 9999 99 9999 + 049326 9999 99 99 0 9999 99 9999 + 049327 9999 99 99 0 9999 99 9999 + 049328 9999 99 99 0 9999 99 9999 + 049329 9999 99 99 0 9999 99 9999 + 049330 9999 99 99 0 9999 99 9999 + 049331 9999 99 99 0 9999 99 9999 + 049332 9999 99 99 0 9999 99 9999 + 049333 9999 99 99 0 9999 99 9999 + 049334 9999 99 99 0 9999 99 9999 + 049335 9999 99 99 0 9999 99 9999 + 049336 9999 99 99 0 9999 99 9999 + 049337 9999 99 99 0 9999 99 9999 + 049338 9999 99 99 0 9999 99 9999 + 049339 9999 99 99 0 9999 99 9999 + 049340 9999 99 99 0 9999 99 9999 + 049341 9999 99 99 0 9999 99 9999 + 049342 9999 99 99 0 9999 99 9999 + 049343 9999 99 99 0 9999 99 9999 + 049344 9999 99 99 0 9999 99 9999 + 049345 9999 99 99 0 9999 99 9999 + 049346 9999 99 99 0 9999 99 9999 + 049347 9999 99 99 0 9999 99 9999 + 049348 9999 99 99 0 9999 99 9999 + 049349 9999 99 99 0 9999 99 9999 + 049350 9999 99 99 0 9999 99 9999 + 049351 9999 99 99 0 9999 99 9999 + 049352 9999 99 99 0 9999 99 9999 + 049353 9999 99 99 0 9999 99 9999 + 049354 9999 99 99 0 9999 99 9999 + 049355 9999 99 99 0 9999 99 9999 + 049356 9999 99 99 0 9999 99 9999 + 049357 9999 99 99 0 9999 99 9999 + 049358 9999 99 99 0 9999 99 9999 + 049359 9999 99 99 0 9999 99 9999 + 049360 9999 99 99 0 9999 99 9999 + 049361 9999 99 99 0 9999 99 9999 + 049362 9999 99 99 0 9999 99 9999 + 049363 9999 99 99 0 9999 99 9999 + 049364 9999 99 99 0 9999 99 9999 + 049365 9999 99 99 0 9999 99 9999 + 049366 9999 99 99 0 9999 99 9999 + 049367 9999 99 99 0 9999 99 9999 + 049368 9999 99 99 0 9999 99 9999 + 049369 9999 99 99 0 9999 99 9999 + 049370 9999 99 99 0 9999 99 9999 + 049371 9999 99 99 0 9999 99 9999 + 049372 9999 99 99 0 9999 99 9999 + 049373 9999 99 99 0 9999 99 9999 + 049374 9999 99 99 0 9999 99 9999 + 049375 9999 99 99 0 9999 99 9999 + 049376 9999 99 99 0 9999 99 9999 + 049377 9999 99 99 0 9999 99 9999 + 049378 9999 99 99 0 9999 99 9999 + 049379 9999 99 99 0 9999 99 9999 + 049380 9999 99 99 0 9999 99 9999 + 049381 9999 99 99 0 9999 99 9999 + 049382 9999 99 99 0 9999 99 9999 + 049383 9999 99 99 0 9999 99 9999 + 049384 9999 99 99 0 9999 99 9999 + 049385 9999 99 99 0 9999 99 9999 + 049386 9999 99 99 0 9999 99 9999 + 049387 9999 99 99 0 9999 99 9999 + 049388 9999 99 99 0 9999 99 9999 + 049389 9999 99 99 0 9999 99 9999 + 049390 9999 99 99 0 9999 99 9999 + 049391 9999 99 99 0 9999 99 9999 + 049392 9999 99 99 0 9999 99 9999 + 049393 9999 99 99 0 9999 99 9999 + 049394 9999 99 99 0 9999 99 9999 + 049395 9999 99 99 0 9999 99 9999 + 049396 9999 99 99 0 9999 99 9999 + 049397 9999 99 99 0 9999 99 9999 + 049398 9999 99 99 0 9999 99 9999 + 049399 9999 99 99 0 9999 99 9999 + 049400 9999 99 99 0 9999 99 9999 + 049401 9999 99 99 0 9999 99 9999 + 049402 9999 99 99 0 9999 99 9999 + 049403 9999 99 99 0 9999 99 9999 + 049404 9999 99 99 0 9999 99 9999 + 049405 9999 99 99 0 9999 99 9999 + 049406 9999 99 99 0 9999 99 9999 + 049407 9999 99 99 0 9999 99 9999 + 049408 9999 99 99 0 9999 99 9999 + 049409 9999 99 99 0 9999 99 9999 + 049410 9999 99 99 0 9999 99 9999 + 049411 9999 99 99 0 9999 99 9999 + 049412 9999 99 99 0 9999 99 9999 + 049413 9999 99 99 0 9999 99 9999 + 049414 9999 99 99 0 9999 99 9999 + 049415 9999 99 99 0 9999 99 9999 + 049416 9999 99 99 0 9999 99 9999 + 049417 9999 99 99 0 9999 99 9999 + 049418 9999 99 99 0 9999 99 9999 + 049419 9999 99 99 0 9999 99 9999 + 049420 9999 99 99 0 9999 99 9999 + 049421 9999 99 99 0 9999 99 9999 + 049422 9999 99 99 0 9999 99 9999 + 049423 9999 99 99 0 9999 99 9999 + 049424 9999 99 99 0 9999 99 9999 + 049425 9999 99 99 0 9999 99 9999 + 049426 9999 99 99 0 9999 99 9999 + 049427 9999 99 99 0 9999 99 9999 + 049428 9999 99 99 0 9999 99 9999 + 049429 9999 99 99 0 9999 99 9999 + 049430 9999 99 99 0 9999 99 9999 + 049431 9999 99 99 0 9999 99 9999 + 049432 9999 99 99 0 9999 99 9999 + 049433 9999 99 99 0 9999 99 9999 + 049434 9999 99 99 0 9999 99 9999 + 049435 9999 99 99 0 9999 99 9999 + 049436 9999 99 99 0 9999 99 9999 + 049437 9999 99 99 0 9999 99 9999 + 049438 9999 99 99 0 9999 99 9999 + 049439 9999 99 99 0 9999 99 9999 + 049440 9999 99 99 0 9999 99 9999 + 049441 9999 99 99 0 9999 99 9999 + 049442 9999 99 99 0 9999 99 9999 + 049443 9999 99 99 0 9999 99 9999 + 049444 9999 99 99 0 9999 99 9999 + 049445 9999 99 99 0 9999 99 9999 + 049446 9999 99 99 0 9999 99 9999 + 049447 9999 99 99 0 9999 99 9999 + 049448 9999 99 99 0 9999 99 9999 + 049449 9999 99 99 0 9999 99 9999 + 049450 9999 99 99 0 9999 99 9999 + 049451 9999 99 99 0 9999 99 9999 + 049452 9999 99 99 0 9999 99 9999 + 049453 9999 99 99 0 9999 99 9999 + 049454 9999 99 99 0 9999 99 9999 + 049455 9999 99 99 0 9999 99 9999 + 049456 9999 99 99 0 9999 99 9999 + 049457 9999 99 99 0 9999 99 9999 + 049458 9999 99 99 0 9999 99 9999 + 049459 9999 99 99 0 9999 99 9999 + 049460 9999 99 99 0 9999 99 9999 + 049461 9999 99 99 0 9999 99 9999 + 049462 9999 99 99 0 9999 99 9999 + 049463 9999 99 99 0 9999 99 9999 + 049464 9999 99 99 0 9999 99 9999 + 049465 9999 99 99 0 9999 99 9999 + 049466 9999 99 99 0 9999 99 9999 + 049467 9999 99 99 0 9999 99 9999 + 049468 9999 99 99 0 9999 99 9999 + 049469 9999 99 99 0 9999 99 9999 + 049470 9999 99 99 0 9999 99 9999 + 049471 9999 99 99 0 9999 99 9999 + 049472 9999 99 99 0 9999 99 9999 + 049473 9999 99 99 0 9999 99 9999 + 049474 9999 99 99 0 9999 99 9999 + 049475 9999 99 99 0 9999 99 9999 + 049476 9999 99 99 0 9999 99 9999 + 049477 9999 99 99 0 9999 99 9999 + 049478 9999 99 99 0 9999 99 9999 + 049479 9999 99 99 0 9999 99 9999 + 049480 9999 99 99 0 9999 99 9999 + 049481 9999 99 99 0 9999 99 9999 + 049482 9999 99 99 0 9999 99 9999 + 049483 9999 99 99 0 9999 99 9999 + 049484 9999 99 99 0 9999 99 9999 + 049485 9999 99 99 0 9999 99 9999 + 049486 9999 99 99 0 9999 99 9999 + 049487 9999 99 99 0 9999 99 9999 + 049488 9999 99 99 0 9999 99 9999 + 049489 9999 99 99 0 9999 99 9999 + 049490 9999 99 99 0 9999 99 9999 + 049491 9999 99 99 0 9999 99 9999 + 049492 9999 99 99 0 9999 99 9999 + 049493 9999 99 99 0 9999 99 9999 + 049494 9999 99 99 0 9999 99 9999 + 049495 9999 99 99 0 9999 99 9999 + 049496 9999 99 99 0 9999 99 9999 + 049497 9999 99 99 0 9999 99 9999 + 049498 9999 99 99 0 9999 99 9999 + 049499 9999 99 99 0 9999 99 9999 + 049500 9999 99 99 0 9999 99 9999 + 049501 9999 99 99 0 9999 99 9999 + 049502 9999 99 99 0 9999 99 9999 + 049503 9999 99 99 0 9999 99 9999 + 049504 9999 99 99 0 9999 99 9999 + 049505 9999 99 99 0 9999 99 9999 + 049506 9999 99 99 0 9999 99 9999 + 049507 9999 99 99 0 9999 99 9999 + 049508 9999 99 99 0 9999 99 9999 + 049509 9999 99 99 0 9999 99 9999 + 049510 9999 99 99 0 9999 99 9999 + 049511 9999 99 99 0 9999 99 9999 + 049512 9999 99 99 0 9999 99 9999 + 049513 9999 99 99 0 9999 99 9999 + 049514 9999 99 99 0 9999 99 9999 + 049515 9999 99 99 0 9999 99 9999 + 049516 9999 99 99 0 9999 99 9999 + 049517 9999 99 99 0 9999 99 9999 + 049518 9999 99 99 0 9999 99 9999 + 049519 9999 99 99 0 9999 99 9999 + 049520 9999 99 99 0 9999 99 9999 + 049521 9999 99 99 0 9999 99 9999 + 049522 9999 99 99 0 9999 99 9999 + 049523 9999 99 99 0 9999 99 9999 + 049524 9999 99 99 0 9999 99 9999 + 049525 9999 99 99 0 9999 99 9999 + 049526 9999 99 99 0 9999 99 9999 + 049527 9999 99 99 0 9999 99 9999 + 049528 9999 99 99 0 9999 99 9999 + 049529 9999 99 99 0 9999 99 9999 + 049530 9999 99 99 0 9999 99 9999 + 049531 9999 99 99 0 9999 99 9999 + 049532 9999 99 99 0 9999 99 9999 + 049533 9999 99 99 0 9999 99 9999 + 049534 9999 99 99 0 9999 99 9999 + 049535 9999 99 99 0 9999 99 9999 + 049536 9999 99 99 0 9999 99 9999 + 049537 9999 99 99 0 9999 99 9999 + 049538 9999 99 99 0 9999 99 9999 + 049539 9999 99 99 0 9999 99 9999 + 049540 9999 99 99 0 9999 99 9999 + 049541 9999 99 99 0 9999 99 9999 + 049542 9999 99 99 0 9999 99 9999 + 049543 9999 99 99 0 9999 99 9999 + 049544 9999 99 99 0 9999 99 9999 + 049545 9999 99 99 0 9999 99 9999 + 049546 9999 99 99 0 9999 99 9999 + 049547 9999 99 99 0 9999 99 9999 + 049548 9999 99 99 0 9999 99 9999 + 049549 9999 99 99 0 9999 99 9999 + 049550 9999 99 99 0 9999 99 9999 + 049551 9999 99 99 0 9999 99 9999 + 049552 9999 99 99 0 9999 99 9999 + 049553 9999 99 99 0 9999 99 9999 + 049554 9999 99 99 0 9999 99 9999 + 049555 9999 99 99 0 9999 99 9999 + 049556 9999 99 99 0 9999 99 9999 + 049557 9999 99 99 0 9999 99 9999 + 049558 9999 99 99 0 9999 99 9999 + 049559 9999 99 99 0 9999 99 9999 + 049560 9999 99 99 0 9999 99 9999 + 049561 9999 99 99 0 9999 99 9999 + 049562 9999 99 99 0 9999 99 9999 + 049563 9999 99 99 0 9999 99 9999 + 049564 9999 99 99 0 9999 99 9999 + 049565 9999 99 99 0 9999 99 9999 + 049566 9999 99 99 0 9999 99 9999 + 049567 9999 99 99 0 9999 99 9999 + 049568 9999 99 99 0 9999 99 9999 + 049569 9999 99 99 0 9999 99 9999 + 049570 9999 99 99 0 9999 99 9999 + 049571 9999 99 99 0 9999 99 9999 + 049572 9999 99 99 0 9999 99 9999 + 049573 9999 99 99 0 9999 99 9999 + 049574 9999 99 99 0 9999 99 9999 + 049575 9999 99 99 0 9999 99 9999 + 049576 9999 99 99 0 9999 99 9999 + 049577 9999 99 99 0 9999 99 9999 + 049578 9999 99 99 0 9999 99 9999 + 049579 9999 99 99 0 9999 99 9999 + 049580 9999 99 99 0 9999 99 9999 + 049581 9999 99 99 0 9999 99 9999 + 049582 9999 99 99 0 9999 99 9999 + 049583 9999 99 99 0 9999 99 9999 + 049584 9999 99 99 0 9999 99 9999 + 049585 9999 99 99 0 9999 99 9999 + 049586 9999 99 99 0 9999 99 9999 + 049587 9999 99 99 0 9999 99 9999 + 049588 9999 99 99 0 9999 99 9999 + 049589 9999 99 99 0 9999 99 9999 + 049590 9999 99 99 0 9999 99 9999 + 049591 9999 99 99 0 9999 99 9999 + 049592 9999 99 99 0 9999 99 9999 + 049593 9999 99 99 0 9999 99 9999 + 049594 9999 99 99 0 9999 99 9999 + 049595 9999 99 99 0 9999 99 9999 + 049596 9999 99 99 0 9999 99 9999 + 049597 9999 99 99 0 9999 99 9999 + 049598 9999 99 99 0 9999 99 9999 + 049599 9999 99 99 0 9999 99 9999 + 049600 9999 99 99 0 9999 99 9999 + 049601 9999 99 99 0 9999 99 9999 + 049602 9999 99 99 0 9999 99 9999 + 049603 9999 99 99 0 9999 99 9999 + 049604 9999 99 99 0 9999 99 9999 + 049605 9999 99 99 0 9999 99 9999 + 049606 9999 99 99 0 9999 99 9999 + 049607 9999 99 99 0 9999 99 9999 + 049608 9999 99 99 0 9999 99 9999 + 049609 9999 99 99 0 9999 99 9999 + 049610 9999 99 99 0 9999 99 9999 + 049611 9999 99 99 0 9999 99 9999 + 049612 9999 99 99 0 9999 99 9999 + 049613 9999 99 99 0 9999 99 9999 + 049614 9999 99 99 0 9999 99 9999 + 049615 9999 99 99 0 9999 99 9999 + 049616 9999 99 99 0 9999 99 9999 + 049617 9999 99 99 0 9999 99 9999 + 049618 9999 99 99 0 9999 99 9999 + 049619 9999 99 99 0 9999 99 9999 + 049620 9999 99 99 0 9999 99 9999 + 049621 9999 99 99 0 9999 99 9999 + 049622 9999 99 99 0 9999 99 9999 + 049623 9999 99 99 0 9999 99 9999 + 049624 9999 99 99 0 9999 99 9999 + 049625 9999 99 99 0 9999 99 9999 + 049626 9999 99 99 0 9999 99 9999 + 049627 9999 99 99 0 9999 99 9999 + 049628 9999 99 99 0 9999 99 9999 + 049629 9999 99 99 0 9999 99 9999 + 049630 9999 99 99 0 9999 99 9999 + 049631 9999 99 99 0 9999 99 9999 + 049632 9999 99 99 0 9999 99 9999 + 049633 9999 99 99 0 9999 99 9999 + 049634 9999 99 99 0 9999 99 9999 + 049635 9999 99 99 0 9999 99 9999 + 049636 9999 99 99 0 9999 99 9999 + 049637 9999 99 99 0 9999 99 9999 + 049638 9999 99 99 0 9999 99 9999 + 049639 9999 99 99 0 9999 99 9999 + 049640 9999 99 99 0 9999 99 9999 + 049641 9999 99 99 0 9999 99 9999 + 049642 9999 99 99 0 9999 99 9999 + 049643 9999 99 99 0 9999 99 9999 + 049644 9999 99 99 0 9999 99 9999 + 049645 9999 99 99 0 9999 99 9999 + 049646 9999 99 99 0 9999 99 9999 + 049647 9999 99 99 0 9999 99 9999 + 049648 9999 99 99 0 9999 99 9999 + 049649 9999 99 99 0 9999 99 9999 + 049650 9999 99 99 0 9999 99 9999 + 049651 9999 99 99 0 9999 99 9999 + 049652 9999 99 99 0 9999 99 9999 + 049653 9999 99 99 0 9999 99 9999 + 049654 9999 99 99 0 9999 99 9999 + 049655 9999 99 99 0 9999 99 9999 + 049656 9999 99 99 0 9999 99 9999 + 049657 9999 99 99 0 9999 99 9999 + 049658 9999 99 99 0 9999 99 9999 + 049659 9999 99 99 0 9999 99 9999 + 049660 9999 99 99 0 9999 99 9999 + 049661 9999 99 99 0 9999 99 9999 + 049662 9999 99 99 0 9999 99 9999 + 049663 9999 99 99 0 9999 99 9999 + 049664 9999 99 99 0 9999 99 9999 + 049665 9999 99 99 0 9999 99 9999 + 049666 9999 99 99 0 9999 99 9999 + 049667 9999 99 99 0 9999 99 9999 + 049668 9999 99 99 0 9999 99 9999 + 049669 9999 99 99 0 9999 99 9999 + 049670 9999 99 99 0 9999 99 9999 + 049671 9999 99 99 0 9999 99 9999 + 049672 9999 99 99 0 9999 99 9999 + 049673 9999 99 99 0 9999 99 9999 + 049674 9999 99 99 0 9999 99 9999 + 049675 9999 99 99 0 9999 99 9999 + 049676 9999 99 99 0 9999 99 9999 + 049677 9999 99 99 0 9999 99 9999 + 049678 9999 99 99 0 9999 99 9999 + 049679 9999 99 99 0 9999 99 9999 + 049680 9999 99 99 0 9999 99 9999 + 049681 9999 99 99 0 9999 99 9999 + 049682 9999 99 99 0 9999 99 9999 + 049683 9999 99 99 0 9999 99 9999 + 049684 9999 99 99 0 9999 99 9999 + 049685 9999 99 99 0 9999 99 9999 + 049686 9999 99 99 0 9999 99 9999 + 049687 9999 99 99 0 9999 99 9999 + 049688 9999 99 99 0 9999 99 9999 + 049689 9999 99 99 0 9999 99 9999 + 049690 9999 99 99 0 9999 99 9999 + 049691 9999 99 99 0 9999 99 9999 + 049692 9999 99 99 0 9999 99 9999 + 049693 9999 99 99 0 9999 99 9999 + 049694 9999 99 99 0 9999 99 9999 + 049695 9999 99 99 0 9999 99 9999 + 049696 9999 99 99 0 9999 99 9999 + 049697 9999 99 99 0 9999 99 9999 + 049698 9999 99 99 0 9999 99 9999 + 049699 9999 99 99 0 9999 99 9999 + 049700 9999 99 99 0 9999 99 9999 + 049701 9999 99 99 0 9999 99 9999 + 049702 9999 99 99 0 9999 99 9999 + 049703 9999 99 99 0 9999 99 9999 + 049704 9999 99 99 0 9999 99 9999 + 049705 9999 99 99 0 9999 99 9999 + 049706 9999 99 99 0 9999 99 9999 + 049707 9999 99 99 0 9999 99 9999 + 049708 9999 99 99 0 9999 99 9999 + 049709 9999 99 99 0 9999 99 9999 + 049710 9999 99 99 0 9999 99 9999 + 049711 9999 99 99 0 9999 99 9999 + 049712 9999 99 99 0 9999 99 9999 + 049713 9999 99 99 0 9999 99 9999 + 049714 9999 99 99 0 9999 99 9999 + 049715 9999 99 99 0 9999 99 9999 + 049716 9999 99 99 0 9999 99 9999 + 049717 9999 99 99 0 9999 99 9999 + 049718 9999 99 99 0 9999 99 9999 + 049719 9999 99 99 0 9999 99 9999 + 049720 9999 99 99 0 9999 99 9999 + 049721 9999 99 99 0 9999 99 9999 + 049722 9999 99 99 0 9999 99 9999 + 049723 9999 99 99 0 9999 99 9999 + 049724 9999 99 99 0 9999 99 9999 + 049725 9999 99 99 0 9999 99 9999 + 049726 9999 99 99 0 9999 99 9999 + 049727 9999 99 99 0 9999 99 9999 + 049728 9999 99 99 0 9999 99 9999 + 049729 9999 99 99 0 9999 99 9999 + 049730 9999 99 99 0 9999 99 9999 + 049731 9999 99 99 0 9999 99 9999 + 049732 9999 99 99 0 9999 99 9999 + 049733 9999 99 99 0 9999 99 9999 + 049734 9999 99 99 0 9999 99 9999 + 049735 9999 99 99 0 9999 99 9999 + 049736 9999 99 99 0 9999 99 9999 + 049737 9999 99 99 0 9999 99 9999 + 049738 9999 99 99 0 9999 99 9999 + 049739 9999 99 99 0 9999 99 9999 + 049740 9999 99 99 0 9999 99 9999 + 049741 9999 99 99 0 9999 99 9999 + 049742 9999 99 99 0 9999 99 9999 + 049743 9999 99 99 0 9999 99 9999 + 049744 9999 99 99 0 9999 99 9999 + 049745 9999 99 99 0 9999 99 9999 + 049746 9999 99 99 0 9999 99 9999 + 049747 9999 99 99 0 9999 99 9999 + 049748 9999 99 99 0 9999 99 9999 + 049749 9999 99 99 0 9999 99 9999 + 049750 9999 99 99 0 9999 99 9999 + 049751 9999 99 99 0 9999 99 9999 + 049752 9999 99 99 0 9999 99 9999 + 049753 9999 99 99 0 9999 99 9999 + 049754 9999 99 99 0 9999 99 9999 + 049755 9999 99 99 0 9999 99 9999 + 049756 9999 99 99 0 9999 99 9999 + 049757 9999 99 99 0 9999 99 9999 + 049758 9999 99 99 0 9999 99 9999 + 049759 9999 99 99 0 9999 99 9999 + 049760 9999 99 99 0 9999 99 9999 + 049761 9999 99 99 0 9999 99 9999 + 049762 9999 99 99 0 9999 99 9999 + 049763 9999 99 99 0 9999 99 9999 + 049764 9999 99 99 0 9999 99 9999 + 049765 9999 99 99 0 9999 99 9999 + 049766 9999 99 99 0 9999 99 9999 + 049767 9999 99 99 0 9999 99 9999 + 049768 9999 99 99 0 9999 99 9999 + 049769 9999 99 99 0 9999 99 9999 + 049770 9999 99 99 0 9999 99 9999 + 049771 9999 99 99 0 9999 99 9999 + 049772 9999 99 99 0 9999 99 9999 + 049773 9999 99 99 0 9999 99 9999 + 049774 9999 99 99 0 9999 99 9999 + 049775 9999 99 99 0 9999 99 9999 + 049776 9999 99 99 0 9999 99 9999 + 049777 9999 99 99 0 9999 99 9999 + 049778 9999 99 99 0 9999 99 9999 + 049779 9999 99 99 0 9999 99 9999 + 049780 9999 99 99 0 9999 99 9999 + 049781 9999 99 99 0 9999 99 9999 + 049782 9999 99 99 0 9999 99 9999 + 049783 9999 99 99 0 9999 99 9999 + 049784 9999 99 99 0 9999 99 9999 + 049785 9999 99 99 0 9999 99 9999 + 049786 9999 99 99 0 9999 99 9999 + 049787 9999 99 99 0 9999 99 9999 + 049788 9999 99 99 0 9999 99 9999 + 049789 9999 99 99 0 9999 99 9999 + 049790 9999 99 99 0 9999 99 9999 + 049791 9999 99 99 0 9999 99 9999 + 049792 9999 99 99 0 9999 99 9999 + 049793 9999 99 99 0 9999 99 9999 + 049794 9999 99 99 0 9999 99 9999 + 049795 9999 99 99 0 9999 99 9999 + 049796 9999 99 99 0 9999 99 9999 + 049797 9999 99 99 0 9999 99 9999 + 049798 9999 99 99 0 9999 99 9999 + 049799 9999 99 99 0 9999 99 9999 + 049800 9999 99 99 0 9999 99 9999 + 049801 9999 99 99 0 9999 99 9999 + 049802 9999 99 99 0 9999 99 9999 + 049803 9999 99 99 0 9999 99 9999 + 049804 9999 99 99 0 9999 99 9999 + 049805 9999 99 99 0 9999 99 9999 + 049806 9999 99 99 0 9999 99 9999 + 049807 9999 99 99 0 9999 99 9999 + 049808 9999 99 99 0 9999 99 9999 + 049809 9999 99 99 0 9999 99 9999 + 049810 9999 99 99 0 9999 99 9999 + 049811 9999 99 99 0 9999 99 9999 + 049812 9999 99 99 0 9999 99 9999 + 049813 9999 99 99 0 9999 99 9999 + 049814 9999 99 99 0 9999 99 9999 + 049815 9999 99 99 0 9999 99 9999 + 049816 9999 99 99 0 9999 99 9999 + 049817 9999 99 99 0 9999 99 9999 + 049818 9999 99 99 0 9999 99 9999 + 049819 9999 99 99 0 9999 99 9999 + 049820 9999 99 99 0 9999 99 9999 + 049821 9999 99 99 0 9999 99 9999 + 049822 9999 99 99 0 9999 99 9999 + 049823 9999 99 99 0 9999 99 9999 + 049824 9999 99 99 0 9999 99 9999 + 049825 9999 99 99 0 9999 99 9999 + 049826 9999 99 99 0 9999 99 9999 + 049827 9999 99 99 0 9999 99 9999 + 049828 9999 99 99 0 9999 99 9999 + 049829 9999 99 99 0 9999 99 9999 + 049830 9999 99 99 0 9999 99 9999 + 049831 9999 99 99 0 9999 99 9999 + 049832 9999 99 99 0 9999 99 9999 + 049833 9999 99 99 0 9999 99 9999 + 049834 9999 99 99 0 9999 99 9999 + 049835 9999 99 99 0 9999 99 9999 + 049836 9999 99 99 0 9999 99 9999 + 049837 9999 99 99 0 9999 99 9999 + 049838 9999 99 99 0 9999 99 9999 + 049839 9999 99 99 0 9999 99 9999 + 049840 9999 99 99 0 9999 99 9999 + 049841 9999 99 99 0 9999 99 9999 + 049842 9999 99 99 0 9999 99 9999 + 049843 9999 99 99 0 9999 99 9999 + 049844 9999 99 99 0 9999 99 9999 + 049845 9999 99 99 0 9999 99 9999 + 049846 9999 99 99 0 9999 99 9999 + 049847 9999 99 99 0 9999 99 9999 + 049848 9999 99 99 0 9999 99 9999 + 049849 9999 99 99 0 9999 99 9999 + 049850 9999 99 99 0 9999 99 9999 + 049851 9999 99 99 0 9999 99 9999 + 049852 9999 99 99 0 9999 99 9999 + 049853 9999 99 99 0 9999 99 9999 + 049854 9999 99 99 0 9999 99 9999 + 049855 9999 99 99 0 9999 99 9999 + 049856 9999 99 99 0 9999 99 9999 + 049857 9999 99 99 0 9999 99 9999 + 049858 9999 99 99 0 9999 99 9999 + 049859 9999 99 99 0 9999 99 9999 + 049860 9999 99 99 0 9999 99 9999 + 049861 9999 99 99 0 9999 99 9999 + 049862 9999 99 99 0 9999 99 9999 + 049863 9999 99 99 0 9999 99 9999 + 049864 9999 99 99 0 9999 99 9999 + 049865 9999 99 99 0 9999 99 9999 + 049866 9999 99 99 0 9999 99 9999 + 049867 9999 99 99 0 9999 99 9999 + 049868 9999 99 99 0 9999 99 9999 + 049869 9999 99 99 0 9999 99 9999 + 049870 9999 99 99 0 9999 99 9999 + 049871 9999 99 99 0 9999 99 9999 + 049872 9999 99 99 0 9999 99 9999 + 049873 9999 99 99 0 9999 99 9999 + 049874 9999 99 99 0 9999 99 9999 + 049875 9999 99 99 0 9999 99 9999 + 049876 9999 99 99 0 9999 99 9999 + 049877 9999 99 99 0 9999 99 9999 + 049878 9999 99 99 0 9999 99 9999 + 049879 9999 99 99 0 9999 99 9999 + 049880 9999 99 99 0 9999 99 9999 + 049881 9999 99 99 0 9999 99 9999 + 049882 9999 99 99 0 9999 99 9999 + 049883 9999 99 99 0 9999 99 9999 + 049884 9999 99 99 0 9999 99 9999 + 049885 9999 99 99 0 9999 99 9999 + 049886 9999 99 99 0 9999 99 9999 + 049887 9999 99 99 0 9999 99 9999 + 049888 9999 99 99 0 9999 99 9999 + 049889 9999 99 99 0 9999 99 9999 + 049890 9999 99 99 0 9999 99 9999 + 049891 9999 99 99 0 9999 99 9999 + 049892 9999 99 99 0 9999 99 9999 + 049893 9999 99 99 0 9999 99 9999 + 049894 9999 99 99 0 9999 99 9999 + 049895 9999 99 99 0 9999 99 9999 + 049896 9999 99 99 0 9999 99 9999 + 049897 9999 99 99 0 9999 99 9999 + 049898 9999 99 99 0 9999 99 9999 + 049899 9999 99 99 0 9999 99 9999 + 049900 9999 99 99 0 9999 99 9999 + 049901 9999 99 99 0 9999 99 9999 + 049902 9999 99 99 0 9999 99 9999 + 049903 9999 99 99 0 9999 99 9999 + 049904 9999 99 99 0 9999 99 9999 + 049905 9999 99 99 0 9999 99 9999 + 049906 9999 99 99 0 9999 99 9999 + 049907 9999 99 99 0 9999 99 9999 + 049908 9999 99 99 0 9999 99 9999 + 049909 9999 99 99 0 9999 99 9999 + 049910 9999 99 99 0 9999 99 9999 + 049911 9999 99 99 0 9999 99 9999 + 049912 9999 99 99 0 9999 99 9999 + 049913 9999 99 99 0 9999 99 9999 + 049914 9999 99 99 0 9999 99 9999 + 049915 9999 99 99 0 9999 99 9999 + 049916 9999 99 99 0 9999 99 9999 + 049917 9999 99 99 0 9999 99 9999 + 049918 9999 99 99 0 9999 99 9999 + 049919 9999 99 99 0 9999 99 9999 + 049920 9999 99 99 0 9999 99 9999 + 049921 9999 99 99 0 9999 99 9999 + 049922 9999 99 99 0 9999 99 9999 + 049923 9999 99 99 0 9999 99 9999 + 049924 9999 99 99 0 9999 99 9999 + 049925 9999 99 99 0 9999 99 9999 + 049926 9999 99 99 0 9999 99 9999 + 049927 9999 99 99 0 9999 99 9999 + 049928 9999 99 99 0 9999 99 9999 + 049929 9999 99 99 0 9999 99 9999 + 049930 9999 99 99 0 9999 99 9999 + 049931 9999 99 99 0 9999 99 9999 + 049932 9999 99 99 0 9999 99 9999 + 049933 9999 99 99 0 9999 99 9999 + 049934 9999 99 99 0 9999 99 9999 + 049935 9999 99 99 0 9999 99 9999 + 049936 9999 99 99 0 9999 99 9999 + 049937 9999 99 99 0 9999 99 9999 + 049938 9999 99 99 0 9999 99 9999 + 049939 9999 99 99 0 9999 99 9999 + 049940 9999 99 99 0 9999 99 9999 + 049941 9999 99 99 0 9999 99 9999 + 049942 9999 99 99 0 9999 99 9999 + 049943 9999 99 99 0 9999 99 9999 + 049944 9999 99 99 0 9999 99 9999 + 049945 9999 99 99 0 9999 99 9999 + 049946 9999 99 99 0 9999 99 9999 + 049947 9999 99 99 0 9999 99 9999 + 049948 9999 99 99 0 9999 99 9999 + 049949 9999 99 99 0 9999 99 9999 + 049950 9999 99 99 0 9999 99 9999 + 049951 9999 99 99 0 9999 99 9999 + 049952 9999 99 99 0 9999 99 9999 + 049953 9999 99 99 0 9999 99 9999 + 049954 9999 99 99 0 9999 99 9999 + 049955 9999 99 99 0 9999 99 9999 + 049956 9999 99 99 0 9999 99 9999 + 049957 9999 99 99 0 9999 99 9999 + 049958 9999 99 99 0 9999 99 9999 + 049959 9999 99 99 0 9999 99 9999 + 049960 9999 99 99 0 9999 99 9999 + 049961 9999 99 99 0 9999 99 9999 + 049962 9999 99 99 0 9999 99 9999 + 049963 9999 99 99 0 9999 99 9999 + 049964 9999 99 99 0 9999 99 9999 + 049965 9999 99 99 0 9999 99 9999 + 049966 9999 99 99 0 9999 99 9999 + 049967 9999 99 99 0 9999 99 9999 + 049968 9999 99 99 0 9999 99 9999 + 049969 9999 99 99 0 9999 99 9999 + 049970 9999 99 99 0 9999 99 9999 + 049971 9999 99 99 0 9999 99 9999 + 049972 9999 99 99 0 9999 99 9999 + 049973 9999 99 99 0 9999 99 9999 + 049974 9999 99 99 0 9999 99 9999 + 049975 9999 99 99 0 9999 99 9999 + 049976 9999 99 99 0 9999 99 9999 + 049977 9999 99 99 0 9999 99 9999 + 049978 9999 99 99 0 9999 99 9999 + 049979 9999 99 99 0 9999 99 9999 + 049980 9999 99 99 0 9999 99 9999 + 049981 9999 99 99 0 9999 99 9999 + 049982 9999 99 99 0 9999 99 9999 + 049983 9999 99 99 0 9999 99 9999 + 049984 9999 99 99 0 9999 99 9999 + 049985 9999 99 99 0 9999 99 9999 + 049986 9999 99 99 0 9999 99 9999 + 049987 9999 99 99 0 9999 99 9999 + 049988 9999 99 99 0 9999 99 9999 + 049989 9999 99 99 0 9999 99 9999 + 049990 9999 99 99 0 9999 99 9999 + 049991 9999 99 99 0 9999 99 9999 + 049992 9999 99 99 0 9999 99 9999 + 049993 9999 99 99 0 9999 99 9999 + 049994 9999 99 99 0 9999 99 9999 + 049995 9999 99 99 0 9999 99 9999 + 049996 9999 99 99 0 9999 99 9999 + 049997 9999 99 99 0 9999 99 9999 + 049998 9999 99 99 0 9999 99 9999 + 049999 9999 99 99 0 9999 99 9999 + 050000 9999 99 99 0 9999 99 9999 + 050001 9999 99 99 0 9999 99 9999 + 050002 9999 99 99 0 9999 99 9999 + 050003 9999 99 99 0 9999 99 9999 + 050004 9999 99 99 0 9999 99 9999 + 050005 9999 99 99 0 9999 99 9999 + 050006 9999 99 99 0 9999 99 9999 + 050007 9999 99 99 0 9999 99 9999 + 050008 9999 99 99 0 9999 99 9999 + 050009 9999 99 99 0 9999 99 9999 + 050010 9999 99 99 0 9999 99 9999 + 050011 9999 99 99 0 9999 99 9999 + 050012 9999 99 99 0 9999 99 9999 + 050013 9999 99 99 0 9999 99 9999 + 050014 9999 99 99 0 9999 99 9999 + 050015 9999 99 99 0 9999 99 9999 + 050016 9999 99 99 0 9999 99 9999 + 050017 9999 99 99 0 9999 99 9999 + 050018 9999 99 99 0 9999 99 9999 + 050019 9999 99 99 0 9999 99 9999 + 050020 9999 99 99 0 9999 99 9999 + 050021 9999 99 99 0 9999 99 9999 + 050022 9999 99 99 0 9999 99 9999 + 050023 9999 99 99 0 9999 99 9999 + 050024 9999 99 99 0 9999 99 9999 + 050025 9999 99 99 0 9999 99 9999 + 050026 9999 99 99 0 9999 99 9999 + 050027 9999 99 99 0 9999 99 9999 + 050028 9999 99 99 0 9999 99 9999 + 050029 9999 99 99 0 9999 99 9999 + 050030 9999 99 99 0 9999 99 9999 + 050031 9999 99 99 0 9999 99 9999 + 050032 9999 99 99 0 9999 99 9999 + 050033 9999 99 99 0 9999 99 9999 + 050034 9999 99 99 0 9999 99 9999 + 050035 9999 99 99 0 9999 99 9999 + 050036 9999 99 99 0 9999 99 9999 + 050037 9999 99 99 0 9999 99 9999 + 050038 9999 99 99 0 9999 99 9999 + 050039 9999 99 99 0 9999 99 9999 + 050040 9999 99 99 0 9999 99 9999 + 050041 9999 99 99 0 9999 99 9999 + 050042 9999 99 99 0 9999 99 9999 + 050043 9999 99 99 0 9999 99 9999 + 050044 9999 99 99 0 9999 99 9999 + 050045 9999 99 99 0 9999 99 9999 + 050046 9999 99 99 0 9999 99 9999 + 050047 9999 99 99 0 9999 99 9999 + 050048 9999 99 99 0 9999 99 9999 + 050049 9999 99 99 0 9999 99 9999 + 050050 9999 99 99 0 9999 99 9999 + 050051 9999 99 99 0 9999 99 9999 + 050052 9999 99 99 0 9999 99 9999 + 050053 9999 99 99 0 9999 99 9999 + 050054 9999 99 99 0 9999 99 9999 + 050055 9999 99 99 0 9999 99 9999 + 050056 9999 99 99 0 9999 99 9999 + 050057 9999 99 99 0 9999 99 9999 + 050058 9999 99 99 0 9999 99 9999 + 050059 9999 99 99 0 9999 99 9999 + 050060 9999 99 99 0 9999 99 9999 + 050061 9999 99 99 0 9999 99 9999 + 050062 9999 99 99 0 9999 99 9999 + 050063 9999 99 99 0 9999 99 9999 + 050064 9999 99 99 0 9999 99 9999 + 050065 9999 99 99 0 9999 99 9999 + 050066 9999 99 99 0 9999 99 9999 + 050067 9999 99 99 0 9999 99 9999 + 050068 9999 99 99 0 9999 99 9999 + 050069 9999 99 99 0 9999 99 9999 + 050070 9999 99 99 0 9999 99 9999 + 050071 9999 99 99 0 9999 99 9999 + 050072 9999 99 99 0 9999 99 9999 + 050073 9999 99 99 0 9999 99 9999 + 050074 9999 99 99 0 9999 99 9999 + 050075 9999 99 99 0 9999 99 9999 + 050076 9999 99 99 0 9999 99 9999 + 050077 9999 99 99 0 9999 99 9999 + 050078 9999 99 99 0 9999 99 9999 + 050079 9999 99 99 0 9999 99 9999 + 050080 9999 99 99 0 9999 99 9999 + 050081 9999 99 99 0 9999 99 9999 + 050082 9999 99 99 0 9999 99 9999 + 050083 9999 99 99 0 9999 99 9999 + 050084 9999 99 99 0 9999 99 9999 + 050085 9999 99 99 0 9999 99 9999 + 050086 9999 99 99 0 9999 99 9999 + 050087 9999 99 99 0 9999 99 9999 + 050088 9999 99 99 0 9999 99 9999 + 050089 9999 99 99 0 9999 99 9999 + 050090 9999 99 99 0 9999 99 9999 + 050091 9999 99 99 0 9999 99 9999 + 050092 9999 99 99 0 9999 99 9999 + 050093 9999 99 99 0 9999 99 9999 + 050094 9999 99 99 0 9999 99 9999 + 050095 9999 99 99 0 9999 99 9999 + 050096 9999 99 99 0 9999 99 9999 + 050097 9999 99 99 0 9999 99 9999 + 050098 9999 99 99 0 9999 99 9999 + 050099 9999 99 99 0 9999 99 9999 + 050100 9999 99 99 0 9999 99 9999 + 050101 9999 99 99 0 9999 99 9999 + 050102 9999 99 99 0 9999 99 9999 + 050103 9999 99 99 0 9999 99 9999 + 050104 9999 99 99 0 9999 99 9999 + 050105 9999 99 99 0 9999 99 9999 + 050106 9999 99 99 0 9999 99 9999 + 050107 9999 99 99 0 9999 99 9999 + 050108 9999 99 99 0 9999 99 9999 + 050109 9999 99 99 0 9999 99 9999 + 050110 9999 99 99 0 9999 99 9999 + 050111 9999 99 99 0 9999 99 9999 + 050112 9999 99 99 0 9999 99 9999 + 050113 9999 99 99 0 9999 99 9999 + 050114 9999 99 99 0 9999 99 9999 + 050115 9999 99 99 0 9999 99 9999 + 050116 9999 99 99 0 9999 99 9999 + 050117 9999 99 99 0 9999 99 9999 + 050118 9999 99 99 0 9999 99 9999 + 050119 9999 99 99 0 9999 99 9999 + 050120 9999 99 99 0 9999 99 9999 + 050121 9999 99 99 0 9999 99 9999 + 050122 9999 99 99 0 9999 99 9999 + 050123 9999 99 99 0 9999 99 9999 + 050124 9999 99 99 0 9999 99 9999 + 050125 9999 99 99 0 9999 99 9999 + 050126 9999 99 99 0 9999 99 9999 + 050127 9999 99 99 0 9999 99 9999 + 050128 9999 99 99 0 9999 99 9999 + 050129 9999 99 99 0 9999 99 9999 + 050130 9999 99 99 0 9999 99 9999 + 050131 9999 99 99 0 9999 99 9999 + 050132 9999 99 99 0 9999 99 9999 + 050133 9999 99 99 0 9999 99 9999 + 050134 9999 99 99 0 9999 99 9999 + 050135 9999 99 99 0 9999 99 9999 + 050136 9999 99 99 0 9999 99 9999 + 050137 9999 99 99 0 9999 99 9999 + 050138 9999 99 99 0 9999 99 9999 + 050139 9999 99 99 0 9999 99 9999 + 050140 9999 99 99 0 9999 99 9999 + 050141 9999 99 99 0 9999 99 9999 + 050142 9999 99 99 0 9999 99 9999 + 050143 9999 99 99 0 9999 99 9999 + 050144 9999 99 99 0 9999 99 9999 + 050145 9999 99 99 0 9999 99 9999 + 050146 9999 99 99 0 9999 99 9999 + 050147 9999 99 99 0 9999 99 9999 + 050148 9999 99 99 0 9999 99 9999 + 050149 9999 99 99 0 9999 99 9999 + 050150 9999 99 99 0 9999 99 9999 + 050151 9999 99 99 0 9999 99 9999 + 050152 9999 99 99 0 9999 99 9999 + 050153 9999 99 99 0 9999 99 9999 + 050154 9999 99 99 0 9999 99 9999 + 050155 9999 99 99 0 9999 99 9999 + 050156 9999 99 99 0 9999 99 9999 + 050157 9999 99 99 0 9999 99 9999 + 050158 9999 99 99 0 9999 99 9999 + 050159 9999 99 99 0 9999 99 9999 + 050160 9999 99 99 0 9999 99 9999 + 050161 9999 99 99 0 9999 99 9999 + 050162 9999 99 99 0 9999 99 9999 + 050163 9999 99 99 0 9999 99 9999 + 050164 9999 99 99 0 9999 99 9999 + 050165 9999 99 99 0 9999 99 9999 + 050166 9999 99 99 0 9999 99 9999 + 050167 9999 99 99 0 9999 99 9999 + 050168 9999 99 99 0 9999 99 9999 + 050169 9999 99 99 0 9999 99 9999 + 050170 9999 99 99 0 9999 99 9999 + 050171 9999 99 99 0 9999 99 9999 + 050172 9999 99 99 0 9999 99 9999 + 050173 9999 99 99 0 9999 99 9999 + 050174 9999 99 99 0 9999 99 9999 + 050175 9999 99 99 0 9999 99 9999 + 050176 9999 99 99 0 9999 99 9999 + 050177 9999 99 99 0 9999 99 9999 + 050178 9999 99 99 0 9999 99 9999 + 050179 9999 99 99 0 9999 99 9999 + 050180 9999 99 99 0 9999 99 9999 + 050181 9999 99 99 0 9999 99 9999 + 050182 9999 99 99 0 9999 99 9999 + 050183 9999 99 99 0 9999 99 9999 + 050184 9999 99 99 0 9999 99 9999 + 050185 9999 99 99 0 9999 99 9999 + 050186 9999 99 99 0 9999 99 9999 + 050187 9999 99 99 0 9999 99 9999 + 050188 9999 99 99 0 9999 99 9999 + 050189 9999 99 99 0 9999 99 9999 + 050190 9999 99 99 0 9999 99 9999 + 050191 9999 99 99 0 9999 99 9999 + 050192 9999 99 99 0 9999 99 9999 + 050193 9999 99 99 0 9999 99 9999 + 050194 9999 99 99 0 9999 99 9999 + 050195 9999 99 99 0 9999 99 9999 + 050196 9999 99 99 0 9999 99 9999 + 050197 9999 99 99 0 9999 99 9999 + 050198 9999 99 99 0 9999 99 9999 + 050199 9999 99 99 0 9999 99 9999 + 050200 9999 99 99 0 9999 99 9999 + 050201 9999 99 99 0 9999 99 9999 + 050202 9999 99 99 0 9999 99 9999 + 050203 9999 99 99 0 9999 99 9999 + 050204 9999 99 99 0 9999 99 9999 + 050205 9999 99 99 0 9999 99 9999 + 050206 9999 99 99 0 9999 99 9999 + 050207 9999 99 99 0 9999 99 9999 + 050208 9999 99 99 0 9999 99 9999 + 050209 9999 99 99 0 9999 99 9999 + 050210 9999 99 99 0 9999 99 9999 + 050211 9999 99 99 0 9999 99 9999 + 050212 9999 99 99 0 9999 99 9999 + 050213 9999 99 99 0 9999 99 9999 + 050214 9999 99 99 0 9999 99 9999 + 050215 9999 99 99 0 9999 99 9999 + 050216 9999 99 99 0 9999 99 9999 + 050217 9999 99 99 0 9999 99 9999 + 050218 9999 99 99 0 9999 99 9999 + 050219 9999 99 99 0 9999 99 9999 + 050220 9999 99 99 0 9999 99 9999 + 050221 9999 99 99 0 9999 99 9999 + 050222 9999 99 99 0 9999 99 9999 + 050223 9999 99 99 0 9999 99 9999 + 050224 9999 99 99 0 9999 99 9999 + 050225 9999 99 99 0 9999 99 9999 + 050226 9999 99 99 0 9999 99 9999 + 050227 9999 99 99 0 9999 99 9999 + 050228 9999 99 99 0 9999 99 9999 + 050229 9999 99 99 0 9999 99 9999 + 050230 9999 99 99 0 9999 99 9999 + 050231 9999 99 99 0 9999 99 9999 + 050232 9999 99 99 0 9999 99 9999 + 050233 9999 99 99 0 9999 99 9999 + 050234 9999 99 99 0 9999 99 9999 + 050235 9999 99 99 0 9999 99 9999 + 050236 9999 99 99 0 9999 99 9999 + 050237 9999 99 99 0 9999 99 9999 + 050238 9999 99 99 0 9999 99 9999 + 050239 9999 99 99 0 9999 99 9999 + 050240 9999 99 99 0 9999 99 9999 + 050241 9999 99 99 0 9999 99 9999 + 050242 9999 99 99 0 9999 99 9999 + 050243 9999 99 99 0 9999 99 9999 + 050244 9999 99 99 0 9999 99 9999 + 050245 9999 99 99 0 9999 99 9999 + 050246 9999 99 99 0 9999 99 9999 + 050247 9999 99 99 0 9999 99 9999 + 050248 9999 99 99 0 9999 99 9999 + 050249 9999 99 99 0 9999 99 9999 + 050250 9999 99 99 0 9999 99 9999 + 050251 9999 99 99 0 9999 99 9999 + 050252 9999 99 99 0 9999 99 9999 + 050253 9999 99 99 0 9999 99 9999 + 050254 9999 99 99 0 9999 99 9999 + 050255 9999 99 99 0 9999 99 9999 + 050256 9999 99 99 0 9999 99 9999 + 050257 9999 99 99 0 9999 99 9999 + 050258 9999 99 99 0 9999 99 9999 + 050259 9999 99 99 0 9999 99 9999 + 050260 9999 99 99 0 9999 99 9999 + 050261 9999 99 99 0 9999 99 9999 + 050262 9999 99 99 0 9999 99 9999 + 050263 9999 99 99 0 9999 99 9999 + 050264 9999 99 99 0 9999 99 9999 + 050265 9999 99 99 0 9999 99 9999 + 050266 9999 99 99 0 9999 99 9999 + 050267 9999 99 99 0 9999 99 9999 + 050268 9999 99 99 0 9999 99 9999 + 050269 9999 99 99 0 9999 99 9999 + 050270 9999 99 99 0 9999 99 9999 + 050271 9999 99 99 0 9999 99 9999 + 050272 9999 99 99 0 9999 99 9999 + 050273 9999 99 99 0 9999 99 9999 + 050274 9999 99 99 0 9999 99 9999 + 050275 9999 99 99 0 9999 99 9999 + 050276 9999 99 99 0 9999 99 9999 + 050277 9999 99 99 0 9999 99 9999 + 050278 9999 99 99 0 9999 99 9999 + 050279 9999 99 99 0 9999 99 9999 + 050280 9999 99 99 0 9999 99 9999 + 050281 9999 99 99 0 9999 99 9999 + 050282 9999 99 99 0 9999 99 9999 + 050283 9999 99 99 0 9999 99 9999 + 050284 9999 99 99 0 9999 99 9999 + 050285 9999 99 99 0 9999 99 9999 + 050286 9999 99 99 0 9999 99 9999 + 050287 9999 99 99 0 9999 99 9999 + 050288 9999 99 99 0 9999 99 9999 + 050289 9999 99 99 0 9999 99 9999 + 050290 9999 99 99 0 9999 99 9999 + 050291 9999 99 99 0 9999 99 9999 + 050292 9999 99 99 0 9999 99 9999 + 050293 9999 99 99 0 9999 99 9999 + 050294 9999 99 99 0 9999 99 9999 + 050295 9999 99 99 0 9999 99 9999 + 050296 9999 99 99 0 9999 99 9999 + 050297 9999 99 99 0 9999 99 9999 + 050298 9999 99 99 0 9999 99 9999 + 050299 9999 99 99 0 9999 99 9999 + 050300 9999 99 99 0 9999 99 9999 + 050301 9999 99 99 0 9999 99 9999 + 050302 9999 99 99 0 9999 99 9999 + 050303 9999 99 99 0 9999 99 9999 + 050304 9999 99 99 0 9999 99 9999 + 050305 9999 99 99 0 9999 99 9999 + 050306 9999 99 99 0 9999 99 9999 + 050307 9999 99 99 0 9999 99 9999 + 050308 9999 99 99 0 9999 99 9999 + 050309 9999 99 99 0 9999 99 9999 + 050310 9999 99 99 0 9999 99 9999 + 050311 9999 99 99 0 9999 99 9999 + 050312 9999 99 99 0 9999 99 9999 + 050313 9999 99 99 0 9999 99 9999 + 050314 9999 99 99 0 9999 99 9999 + 050315 9999 99 99 0 9999 99 9999 + 050316 9999 99 99 0 9999 99 9999 + 050317 9999 99 99 0 9999 99 9999 + 050318 9999 99 99 0 9999 99 9999 + 050319 9999 99 99 0 9999 99 9999 + 050320 9999 99 99 0 9999 99 9999 + 050321 9999 99 99 0 9999 99 9999 + 050322 9999 99 99 0 9999 99 9999 + 050323 9999 99 99 0 9999 99 9999 + 050324 9999 99 99 0 9999 99 9999 + 050325 9999 99 99 0 9999 99 9999 + 050326 9999 99 99 0 9999 99 9999 + 050327 9999 99 99 0 9999 99 9999 + 050328 9999 99 99 0 9999 99 9999 + 050329 9999 99 99 0 9999 99 9999 + 050330 9999 99 99 0 9999 99 9999 + 050331 9999 99 99 0 9999 99 9999 + 050332 9999 99 99 0 9999 99 9999 + 050333 9999 99 99 0 9999 99 9999 + 050334 9999 99 99 0 9999 99 9999 + 050335 9999 99 99 0 9999 99 9999 + 050336 9999 99 99 0 9999 99 9999 + 050337 9999 99 99 0 9999 99 9999 + 050338 9999 99 99 0 9999 99 9999 + 050339 9999 99 99 0 9999 99 9999 + 050340 9999 99 99 0 9999 99 9999 + 050341 9999 99 99 0 9999 99 9999 + 050342 9999 99 99 0 9999 99 9999 + 050343 9999 99 99 0 9999 99 9999 + 050344 9999 99 99 0 9999 99 9999 + 050345 9999 99 99 0 9999 99 9999 + 050346 9999 99 99 0 9999 99 9999 + 050347 9999 99 99 0 9999 99 9999 + 050348 9999 99 99 0 9999 99 9999 + 050349 9999 99 99 0 9999 99 9999 + 050350 9999 99 99 0 9999 99 9999 + 050351 9999 99 99 0 9999 99 9999 + 050352 9999 99 99 0 9999 99 9999 + 050353 9999 99 99 0 9999 99 9999 + 050354 9999 99 99 0 9999 99 9999 + 050355 9999 99 99 0 9999 99 9999 + 050356 9999 99 99 0 9999 99 9999 + 050357 9999 99 99 0 9999 99 9999 + 050358 9999 99 99 0 9999 99 9999 + 050359 9999 99 99 0 9999 99 9999 + 050360 9999 99 99 0 9999 99 9999 + 050361 9999 99 99 0 9999 99 9999 + 050362 9999 99 99 0 9999 99 9999 + 050363 9999 99 99 0 9999 99 9999 + 050364 9999 99 99 0 9999 99 9999 + 050365 9999 99 99 0 9999 99 9999 + 050366 9999 99 99 0 9999 99 9999 + 050367 9999 99 99 0 9999 99 9999 + 050368 9999 99 99 0 9999 99 9999 + 050369 9999 99 99 0 9999 99 9999 + 050370 9999 99 99 0 9999 99 9999 + 050371 9999 99 99 0 9999 99 9999 + 050372 9999 99 99 0 9999 99 9999 + 050373 9999 99 99 0 9999 99 9999 + 050374 9999 99 99 0 9999 99 9999 + 050375 9999 99 99 0 9999 99 9999 + 050376 9999 99 99 0 9999 99 9999 + 050377 9999 99 99 0 9999 99 9999 + 050378 9999 99 99 0 9999 99 9999 + 050379 9999 99 99 0 9999 99 9999 + 050380 9999 99 99 0 9999 99 9999 + 050381 9999 99 99 0 9999 99 9999 + 050382 9999 99 99 0 9999 99 9999 + 050383 9999 99 99 0 9999 99 9999 + 050384 9999 99 99 0 9999 99 9999 + 050385 9999 99 99 0 9999 99 9999 + 050386 9999 99 99 0 9999 99 9999 + 050387 9999 99 99 0 9999 99 9999 + 050388 9999 99 99 0 9999 99 9999 + 050389 9999 99 99 0 9999 99 9999 + 050390 9999 99 99 0 9999 99 9999 + 050391 9999 99 99 0 9999 99 9999 + 050392 9999 99 99 0 9999 99 9999 + 050393 9999 99 99 0 9999 99 9999 + 050394 9999 99 99 0 9999 99 9999 + 050395 9999 99 99 0 9999 99 9999 + 050396 9999 99 99 0 9999 99 9999 + 050397 9999 99 99 0 9999 99 9999 + 050398 9999 99 99 0 9999 99 9999 + 050399 9999 99 99 0 9999 99 9999 + 050400 9999 99 99 0 9999 99 9999 + 050401 9999 99 99 0 9999 99 9999 + 050402 9999 99 99 0 9999 99 9999 + 050403 9999 99 99 0 9999 99 9999 + 050404 9999 99 99 0 9999 99 9999 + 050405 9999 99 99 0 9999 99 9999 + 050406 9999 99 99 0 9999 99 9999 + 050407 9999 99 99 0 9999 99 9999 + 050408 9999 99 99 0 9999 99 9999 + 050409 9999 99 99 0 9999 99 9999 + 050410 9999 99 99 0 9999 99 9999 + 050411 9999 99 99 0 9999 99 9999 + 050412 9999 99 99 0 9999 99 9999 + 050413 9999 99 99 0 9999 99 9999 + 050414 9999 99 99 0 9999 99 9999 + 050415 9999 99 99 0 9999 99 9999 + 050416 9999 99 99 0 9999 99 9999 + 050417 9999 99 99 0 9999 99 9999 + 050418 9999 99 99 0 9999 99 9999 + 050419 9999 99 99 0 9999 99 9999 + 050420 9999 99 99 0 9999 99 9999 + 050421 9999 99 99 0 9999 99 9999 + 050422 9999 99 99 0 9999 99 9999 + 050423 9999 99 99 0 9999 99 9999 + 050424 9999 99 99 0 9999 99 9999 + 050425 9999 99 99 0 9999 99 9999 + 050426 9999 99 99 0 9999 99 9999 + 050427 9999 99 99 0 9999 99 9999 + 050428 9999 99 99 0 9999 99 9999 + 050429 9999 99 99 0 9999 99 9999 + 050430 9999 99 99 0 9999 99 9999 + 050431 9999 99 99 0 9999 99 9999 + 050432 9999 99 99 0 9999 99 9999 + 050433 9999 99 99 0 9999 99 9999 + 050434 9999 99 99 0 9999 99 9999 + 050435 9999 99 99 0 9999 99 9999 + 050436 9999 99 99 0 9999 99 9999 + 050437 9999 99 99 0 9999 99 9999 + 050438 9999 99 99 0 9999 99 9999 + 050439 9999 99 99 0 9999 99 9999 + 050440 9999 99 99 0 9999 99 9999 + 050441 9999 99 99 0 9999 99 9999 + 050442 9999 99 99 0 9999 99 9999 + 050443 9999 99 99 0 9999 99 9999 + 050444 9999 99 99 0 9999 99 9999 + 050445 9999 99 99 0 9999 99 9999 + 050446 9999 99 99 0 9999 99 9999 + 050447 9999 99 99 0 9999 99 9999 + 050448 9999 99 99 0 9999 99 9999 + 050449 9999 99 99 0 9999 99 9999 + 050450 9999 99 99 0 9999 99 9999 + 050451 9999 99 99 0 9999 99 9999 + 050452 9999 99 99 0 9999 99 9999 + 050453 9999 99 99 0 9999 99 9999 + 050454 9999 99 99 0 9999 99 9999 + 050455 9999 99 99 0 9999 99 9999 + 050456 9999 99 99 0 9999 99 9999 + 050457 9999 99 99 0 9999 99 9999 + 050458 9999 99 99 0 9999 99 9999 + 050459 9999 99 99 0 9999 99 9999 + 050460 9999 99 99 0 9999 99 9999 + 050461 9999 99 99 0 9999 99 9999 + 050462 9999 99 99 0 9999 99 9999 + 050463 9999 99 99 0 9999 99 9999 + 050464 9999 99 99 0 9999 99 9999 + 050465 9999 99 99 0 9999 99 9999 + 050466 9999 99 99 0 9999 99 9999 + 050467 9999 99 99 0 9999 99 9999 + 050468 9999 99 99 0 9999 99 9999 + 050469 9999 99 99 0 9999 99 9999 + 050470 9999 99 99 0 9999 99 9999 + 050471 9999 99 99 0 9999 99 9999 + 050472 9999 99 99 0 9999 99 9999 + 050473 9999 99 99 0 9999 99 9999 + 050474 9999 99 99 0 9999 99 9999 + 050475 9999 99 99 0 9999 99 9999 + 050476 9999 99 99 0 9999 99 9999 + 050477 9999 99 99 0 9999 99 9999 + 050478 9999 99 99 0 9999 99 9999 + 050479 9999 99 99 0 9999 99 9999 + 050480 9999 99 99 0 9999 99 9999 + 050481 9999 99 99 0 9999 99 9999 + 050482 9999 99 99 0 9999 99 9999 + 050483 9999 99 99 0 9999 99 9999 + 050484 9999 99 99 0 9999 99 9999 + 050485 9999 99 99 0 9999 99 9999 + 050486 9999 99 99 0 9999 99 9999 + 050487 9999 99 99 0 9999 99 9999 + 050488 9999 99 99 0 9999 99 9999 + 050489 9999 99 99 0 9999 99 9999 + 050490 9999 99 99 0 9999 99 9999 + 050491 9999 99 99 0 9999 99 9999 + 050492 9999 99 99 0 9999 99 9999 + 050493 9999 99 99 0 9999 99 9999 + 050494 9999 99 99 0 9999 99 9999 + 050495 9999 99 99 0 9999 99 9999 + 050496 9999 99 99 0 9999 99 9999 + 050497 9999 99 99 0 9999 99 9999 + 050498 9999 99 99 0 9999 99 9999 + 050499 9999 99 99 0 9999 99 9999 + 050500 9999 99 99 0 9999 99 9999 + 050501 9999 99 99 0 9999 99 9999 + 050502 9999 99 99 0 9999 99 9999 + 050503 9999 99 99 0 9999 99 9999 + 050504 9999 99 99 0 9999 99 9999 + 050505 9999 99 99 0 9999 99 9999 + 050506 9999 99 99 0 9999 99 9999 + 050507 9999 99 99 0 9999 99 9999 + 050508 9999 99 99 0 9999 99 9999 + 050509 9999 99 99 0 9999 99 9999 + 050510 9999 99 99 0 9999 99 9999 + 050511 9999 99 99 0 9999 99 9999 + 050512 9999 99 99 0 9999 99 9999 + 050513 9999 99 99 0 9999 99 9999 + 050514 9999 99 99 0 9999 99 9999 + 050515 9999 99 99 0 9999 99 9999 + 050516 9999 99 99 0 9999 99 9999 + 050517 9999 99 99 0 9999 99 9999 + 050518 9999 99 99 0 9999 99 9999 + 050519 9999 99 99 0 9999 99 9999 + 050520 9999 99 99 0 9999 99 9999 + 050521 9999 99 99 0 9999 99 9999 + 050522 9999 99 99 0 9999 99 9999 + 050523 9999 99 99 0 9999 99 9999 + 050524 9999 99 99 0 9999 99 9999 + 050525 9999 99 99 0 9999 99 9999 + 050526 9999 99 99 0 9999 99 9999 + 050527 9999 99 99 0 9999 99 9999 + 050528 9999 99 99 0 9999 99 9999 + 050529 9999 99 99 0 9999 99 9999 + 050530 9999 99 99 0 9999 99 9999 + 050531 9999 99 99 0 9999 99 9999 + 050532 9999 99 99 0 9999 99 9999 + 050533 9999 99 99 0 9999 99 9999 + 050534 9999 99 99 0 9999 99 9999 + 050535 9999 99 99 0 9999 99 9999 + 050536 9999 99 99 0 9999 99 9999 + 050537 9999 99 99 0 9999 99 9999 + 050538 9999 99 99 0 9999 99 9999 + 050539 9999 99 99 0 9999 99 9999 + 050540 9999 99 99 0 9999 99 9999 + 050541 9999 99 99 0 9999 99 9999 + 050542 9999 99 99 0 9999 99 9999 + 050543 9999 99 99 0 9999 99 9999 + 050544 9999 99 99 0 9999 99 9999 + 050545 9999 99 99 0 9999 99 9999 + 050546 9999 99 99 0 9999 99 9999 + 050547 9999 99 99 0 9999 99 9999 + 050548 9999 99 99 0 9999 99 9999 + 050549 9999 99 99 0 9999 99 9999 + 050550 9999 99 99 0 9999 99 9999 + 050551 9999 99 99 0 9999 99 9999 + 050552 9999 99 99 0 9999 99 9999 + 050553 9999 99 99 0 9999 99 9999 + 050554 9999 99 99 0 9999 99 9999 + 050555 9999 99 99 0 9999 99 9999 + 050556 9999 99 99 0 9999 99 9999 + 050557 9999 99 99 0 9999 99 9999 + 050558 9999 99 99 0 9999 99 9999 + 050559 9999 99 99 0 9999 99 9999 + 050560 9999 99 99 0 9999 99 9999 + 050561 9999 99 99 0 9999 99 9999 + 050562 9999 99 99 0 9999 99 9999 + 050563 9999 99 99 0 9999 99 9999 + 050564 9999 99 99 0 9999 99 9999 + 050565 9999 99 99 0 9999 99 9999 + 050566 9999 99 99 0 9999 99 9999 + 050567 9999 99 99 0 9999 99 9999 + 050568 9999 99 99 0 9999 99 9999 + 050569 9999 99 99 0 9999 99 9999 + 050570 9999 99 99 0 9999 99 9999 + 050571 9999 99 99 0 9999 99 9999 + 050572 9999 99 99 0 9999 99 9999 + 050573 9999 99 99 0 9999 99 9999 + 050574 9999 99 99 0 9999 99 9999 + 050575 9999 99 99 0 9999 99 9999 + 050576 9999 99 99 0 9999 99 9999 + 050577 9999 99 99 0 9999 99 9999 + 050578 9999 99 99 0 9999 99 9999 + 050579 9999 99 99 0 9999 99 9999 + 050580 9999 99 99 0 9999 99 9999 + 050581 9999 99 99 0 9999 99 9999 + 050582 9999 99 99 0 9999 99 9999 + 050583 9999 99 99 0 9999 99 9999 + 050584 9999 99 99 0 9999 99 9999 + 050585 9999 99 99 0 9999 99 9999 + 050586 9999 99 99 0 9999 99 9999 + 050587 9999 99 99 0 9999 99 9999 + 050588 9999 99 99 0 9999 99 9999 + 050589 9999 99 99 0 9999 99 9999 + 050590 9999 99 99 0 9999 99 9999 + 050591 9999 99 99 0 9999 99 9999 + 050592 9999 99 99 0 9999 99 9999 + 050593 9999 99 99 0 9999 99 9999 + 050594 9999 99 99 0 9999 99 9999 + 050595 9999 99 99 0 9999 99 9999 + 050596 9999 99 99 0 9999 99 9999 + 050597 9999 99 99 0 9999 99 9999 + 050598 9999 99 99 0 9999 99 9999 + 050599 9999 99 99 0 9999 99 9999 + 050600 9999 99 99 0 9999 99 9999 + 050601 9999 99 99 0 9999 99 9999 + 050602 9999 99 99 0 9999 99 9999 + 050603 9999 99 99 0 9999 99 9999 + 050604 9999 99 99 0 9999 99 9999 + 050605 9999 99 99 0 9999 99 9999 + 050606 9999 99 99 0 9999 99 9999 + 050607 9999 99 99 0 9999 99 9999 + 050608 9999 99 99 0 9999 99 9999 + 050609 9999 99 99 0 9999 99 9999 + 050610 9999 99 99 0 9999 99 9999 + 050611 9999 99 99 0 9999 99 9999 + 050612 9999 99 99 0 9999 99 9999 + 050613 9999 99 99 0 9999 99 9999 + 050614 9999 99 99 0 9999 99 9999 + 050615 9999 99 99 0 9999 99 9999 + 050616 9999 99 99 0 9999 99 9999 + 050617 9999 99 99 0 9999 99 9999 + 050618 9999 99 99 0 9999 99 9999 + 050619 9999 99 99 0 9999 99 9999 + 050620 9999 99 99 0 9999 99 9999 + 050621 9999 99 99 0 9999 99 9999 + 050622 9999 99 99 0 9999 99 9999 + 050623 9999 99 99 0 9999 99 9999 + 050624 9999 99 99 0 9999 99 9999 + 050625 9999 99 99 0 9999 99 9999 + 050626 9999 99 99 0 9999 99 9999 + 050627 9999 99 99 0 9999 99 9999 + 050628 9999 99 99 0 9999 99 9999 + 050629 9999 99 99 0 9999 99 9999 + 050630 9999 99 99 0 9999 99 9999 + 050631 9999 99 99 0 9999 99 9999 + 050632 9999 99 99 0 9999 99 9999 + 050633 9999 99 99 0 9999 99 9999 + 050634 9999 99 99 0 9999 99 9999 + 050635 9999 99 99 0 9999 99 9999 + 050636 9999 99 99 0 9999 99 9999 + 050637 9999 99 99 0 9999 99 9999 + 050638 9999 99 99 0 9999 99 9999 + 050639 9999 99 99 0 9999 99 9999 + 050640 9999 99 99 0 9999 99 9999 + 050641 9999 99 99 0 9999 99 9999 + 050642 9999 99 99 0 9999 99 9999 + 050643 9999 99 99 0 9999 99 9999 + 050644 9999 99 99 0 9999 99 9999 + 050645 9999 99 99 0 9999 99 9999 + 050646 9999 99 99 0 9999 99 9999 + 050647 9999 99 99 0 9999 99 9999 + 050648 9999 99 99 0 9999 99 9999 + 050649 9999 99 99 0 9999 99 9999 + 050650 9999 99 99 0 9999 99 9999 + 050651 9999 99 99 0 9999 99 9999 + 050652 9999 99 99 0 9999 99 9999 + 050653 9999 99 99 0 9999 99 9999 + 050654 9999 99 99 0 9999 99 9999 + 050655 9999 99 99 0 9999 99 9999 + 050656 9999 99 99 0 9999 99 9999 + 050657 9999 99 99 0 9999 99 9999 + 050658 9999 99 99 0 9999 99 9999 + 050659 9999 99 99 0 9999 99 9999 + 050660 9999 99 99 0 9999 99 9999 + 050661 9999 99 99 0 9999 99 9999 + 050662 9999 99 99 0 9999 99 9999 + 050663 9999 99 99 0 9999 99 9999 + 050664 9999 99 99 0 9999 99 9999 + 050665 9999 99 99 0 9999 99 9999 + 050666 9999 99 99 0 9999 99 9999 + 050667 9999 99 99 0 9999 99 9999 + 050668 9999 99 99 0 9999 99 9999 + 050669 9999 99 99 0 9999 99 9999 + 050670 9999 99 99 0 9999 99 9999 + 050671 9999 99 99 0 9999 99 9999 + 050672 9999 99 99 0 9999 99 9999 + 050673 9999 99 99 0 9999 99 9999 + 050674 9999 99 99 0 9999 99 9999 + 050675 9999 99 99 0 9999 99 9999 + 050676 9999 99 99 0 9999 99 9999 + 050677 9999 99 99 0 9999 99 9999 + 050678 9999 99 99 0 9999 99 9999 + 050679 9999 99 99 0 9999 99 9999 + 050680 9999 99 99 0 9999 99 9999 + 050681 9999 99 99 0 9999 99 9999 + 050682 9999 99 99 0 9999 99 9999 + 050683 9999 99 99 0 9999 99 9999 + 050684 9999 99 99 0 9999 99 9999 + 050685 9999 99 99 0 9999 99 9999 + 050686 9999 99 99 0 9999 99 9999 + 050687 9999 99 99 0 9999 99 9999 + 050688 9999 99 99 0 9999 99 9999 + 050689 1332 01 01 2 344224772 00 1196 + 050690 1332 01 02 2 344224772 01 1196 + 050691 1332 01 03 2 344224772 02 1196 + 050692 1332 01 04 2 344224772 03 1196 + 050693 1332 01 05 2 344224772 04 1196 + 050694 1332 01 06 2 344224772 05 1196 + 050695 1332 01 07 2 344224772 06 1196 + 050696 1332 01 08 2 344224772 07 1196 + 050697 1332 02 01 2 344224772 08 1196 + 050698 1332 02 02 2 344224772 09 1196 + 050699 1332 02 03 2 344224772 10 1196 + 050700 1332 02 04 2 344224772 11 1196 + 050701 1332 02 05 2 344224772 12 1196 + 050702 1332 02 06 2 344224772 13 1196 + 050703 1332 02 07 2 344224772 14 1196 + 050704 1332 02 08 2 344224772 15 1196 + 050705 1332 03 01 2 344225796 00 1197 + 050706 1332 03 02 2 344225796 01 1197 + 050707 1332 03 03 2 344225796 02 1197 + 050708 1332 03 04 2 344225796 03 1197 + 050709 1332 03 05 2 344225796 04 1197 + 050710 1332 03 06 2 344225796 05 1197 + 050711 1332 03 07 2 344225796 06 1197 + 050712 1332 03 08 2 344225796 07 1197 + 050713 1332 04 01 2 344225796 08 1197 + 050714 1332 04 02 2 344225796 09 1197 + 050715 1332 04 03 2 344225796 10 1197 + 050716 1332 04 04 2 344225796 11 1197 + 050717 1332 04 05 2 344225796 12 1197 + 050718 1332 04 06 2 344225796 13 1197 + 050719 1332 04 07 2 344225796 14 1197 + 050720 1332 04 08 2 344225796 15 1197 + 050721 1332 05 01 2 344327172 00 1246 + 050722 1332 05 02 2 344327172 01 1246 + 050723 1332 05 03 2 344327172 02 1246 + 050724 1332 05 04 2 344327172 03 1246 + 050725 1332 05 05 2 344327172 04 1246 + 050726 1332 05 06 2 344327172 05 1246 + 050727 1332 05 07 2 344327172 06 1246 + 050728 1332 05 08 2 344327172 07 1246 + 050729 1332 06 01 2 344327172 08 1246 + 050730 1332 06 02 2 344327172 09 1246 + 050731 1332 06 03 2 344327172 10 1246 + 050732 1332 06 04 2 344327172 11 1246 + 050733 1332 06 05 2 344327172 12 1246 + 050734 1332 06 06 2 344327172 13 1246 + 050735 1332 06 07 2 344327172 14 1246 + 050736 1332 06 08 2 344327172 15 1246 + 050737 1332 07 01 2 344328196 00 1247 + 050738 1332 07 02 2 344328196 01 1247 + 050739 1332 07 03 2 344328196 02 1247 + 050740 1332 07 04 2 344328196 03 1247 + 050741 1332 07 05 2 344328196 04 1247 + 050742 1332 07 06 2 344328196 05 1247 + 050743 1332 07 07 2 344328196 06 1247 + 050744 1332 07 08 2 344328196 07 1247 + 050745 1332 08 01 2 344328196 08 1247 + 050746 1332 08 02 2 344328196 09 1247 + 050747 1332 08 03 2 344328196 10 1247 + 050748 1332 08 04 2 344328196 11 1247 + 050749 1332 08 05 2 344328196 12 1247 + 050750 1332 08 06 2 344328196 13 1247 + 050751 1332 08 07 2 344328196 14 1247 + 050752 1332 08 08 2 344328196 15 1247 + 050753 1332 09 01 2 344486916 00 1308 + 050754 1332 09 02 2 344486916 01 1308 + 050755 1332 09 03 2 344486916 02 1308 + 050756 1332 09 04 2 344486916 03 1308 + 050757 1332 09 05 2 344486916 04 1308 + 050758 1332 09 06 2 344486916 05 1308 + 050759 1332 09 07 2 344486916 06 1308 + 050760 1332 09 08 2 344486916 07 1308 + 050761 1332 10 01 2 344486916 08 1308 + 050762 1332 10 02 2 344486916 09 1308 + 050763 1332 10 03 2 344486916 10 1308 + 050764 1332 10 04 2 344486916 11 1308 + 050765 1332 10 05 2 344486916 12 1308 + 050766 1332 10 06 2 344486916 13 1308 + 050767 1332 10 07 2 344486916 14 1308 + 050768 1332 10 08 2 344486916 15 1308 + 050769 1332 11 01 2 344487940 00 1309 + 050770 1332 11 02 2 344487940 01 1309 + 050771 1332 11 03 2 344487940 02 1309 + 050772 1332 11 04 2 344487940 03 1309 + 050773 1332 11 05 2 344487940 04 1309 + 050774 1332 11 06 2 344487940 05 1309 + 050775 1332 11 07 2 344487940 06 1309 + 050776 1332 11 08 2 344487940 07 1309 + 050777 1332 12 01 2 344487940 08 1309 + 050778 1332 12 02 2 344487940 09 1309 + 050779 1332 12 03 2 344487940 10 1309 + 050780 1332 12 04 2 344487940 11 1309 + 050781 1332 12 05 2 344487940 12 1309 + 050782 1332 12 06 2 344487940 13 1309 + 050783 1332 12 07 2 344487940 14 1309 + 050784 1332 12 08 2 344487940 15 1309 + 050785 1332 13 01 2 344589316 00 1358 + 050786 1332 13 02 2 344589316 01 1358 + 050787 1332 13 03 2 344589316 02 1358 + 050788 1332 13 04 2 344589316 03 1358 + 050789 1332 13 05 2 344589316 04 1358 + 050790 1332 13 06 2 344589316 05 1358 + 050791 1332 13 07 2 344589316 06 1358 + 050792 1332 13 08 2 344589316 07 1358 + 050793 1332 14 01 2 344589316 08 1358 + 050794 1332 14 02 2 344589316 09 1358 + 050795 1332 14 03 2 344589316 10 1358 + 050796 1332 14 04 2 344589316 11 1358 + 050797 1332 14 05 2 344589316 12 1358 + 050798 1332 14 06 2 344589316 13 1358 + 050799 1332 14 07 2 344589316 14 1358 + 050800 1332 14 08 2 344589316 15 1358 + 050801 1332 15 01 2 344590340 00 1359 + 050802 1332 15 02 2 344590340 01 1359 + 050803 1332 15 03 2 344590340 02 1359 + 050804 1332 15 04 2 344590340 03 1359 + 050805 1332 15 05 2 344590340 04 1359 + 050806 1332 15 06 2 344590340 05 1359 + 050807 1332 15 07 2 344590340 06 1359 + 050808 1332 15 08 2 344590340 07 1359 + 050809 1332 16 01 2 344590340 08 1359 + 050810 1332 16 02 2 344590340 09 1359 + 050811 1332 16 03 2 344590340 10 1359 + 050812 1332 16 04 2 344590340 11 1359 + 050813 1332 16 05 2 344590340 12 1359 + 050814 1332 16 06 2 344590340 13 1359 + 050815 1332 16 07 2 344590340 14 1359 + 050816 1332 16 08 2 344590340 15 1359 + 050817 1332 17 01 2 344749060 00 1420 + 050818 1332 17 02 2 344749060 01 1420 + 050819 1332 17 03 2 344749060 02 1420 + 050820 1332 17 04 2 344749060 03 1420 + 050821 1332 17 05 2 344749060 04 1420 + 050822 1332 17 06 2 344749060 05 1420 + 050823 1332 17 07 2 344749060 06 1420 + 050824 1332 17 08 2 344749060 07 1420 + 050825 1332 18 01 2 344749060 08 1420 + 050826 1332 18 02 2 344749060 09 1420 + 050827 1332 18 03 2 344749060 10 1420 + 050828 1332 18 04 2 344749060 11 1420 + 050829 1332 18 05 2 344749060 12 1420 + 050830 1332 18 06 2 344749060 13 1420 + 050831 1332 18 07 2 344749060 14 1420 + 050832 1332 18 08 2 344749060 15 1420 + 050833 1332 19 01 2 344750084 00 1421 + 050834 1332 19 02 2 344750084 01 1421 + 050835 1332 19 03 2 344750084 02 1421 + 050836 1332 19 04 2 344750084 03 1421 + 050837 1332 19 05 2 344750084 04 1421 + 050838 1332 19 06 2 344750084 05 1421 + 050839 1332 19 07 2 344750084 06 1421 + 050840 1332 19 08 2 344750084 07 1421 + 050841 1332 20 01 2 344750084 08 1421 + 050842 1332 20 02 2 344750084 09 1421 + 050843 1332 20 03 2 344750084 10 1421 + 050844 1332 20 04 2 344750084 11 1421 + 050845 1332 20 05 2 344750084 12 1421 + 050846 1332 20 06 2 344750084 13 1421 + 050847 1332 20 07 2 344750084 14 1421 + 050848 1332 20 08 2 344750084 15 1421 + 050849 1332 21 01 2 344851460 00 1470 + 050850 1332 21 02 2 344851460 01 1470 + 050851 1332 21 03 2 344851460 02 1470 + 050852 1332 21 04 2 344851460 03 1470 + 050853 1332 21 05 2 344851460 04 1470 + 050854 1332 21 06 2 344851460 05 1470 + 050855 1332 21 07 2 344851460 06 1470 + 050856 1332 21 08 2 344851460 07 1470 + 050857 1332 22 01 2 344851460 08 1470 + 050858 1332 22 02 2 344851460 09 1470 + 050859 1332 22 03 2 344851460 10 1470 + 050860 1332 22 04 2 344851460 11 1470 + 050861 1332 22 05 2 344851460 12 1470 + 050862 1332 22 06 2 344851460 13 1470 + 050863 1332 22 07 2 344851460 14 1470 + 050864 1332 22 08 2 344851460 15 1470 + 050865 1332 23 01 2 344852484 00 1471 + 050866 1332 23 02 2 344852484 01 1471 + 050867 1332 23 03 2 344852484 02 1471 + 050868 1332 23 04 2 344852484 03 1471 + 050869 1332 23 05 2 344852484 04 1471 + 050870 1332 23 06 2 344852484 05 1471 + 050871 1332 23 07 2 344852484 06 1471 + 050872 1332 23 08 2 344852484 07 1471 + 050873 1332 24 01 2 344852484 08 1471 + 050874 1332 24 02 2 344852484 09 1471 + 050875 1332 24 03 2 344852484 10 1471 + 050876 1332 24 04 2 344852484 11 1471 + 050877 1332 24 05 2 344852484 12 1471 + 050878 1332 24 06 2 344852484 13 1471 + 050879 1332 24 07 2 344852484 14 1471 + 050880 1332 24 08 2 344852484 15 1471 + 050881 1332 25 01 2 344228868 00 1198 + 050882 1332 25 02 2 344228868 01 1198 + 050883 1332 25 03 2 344228868 02 1198 + 050884 1332 25 04 2 344228868 03 1198 + 050885 1332 25 05 2 344228868 04 1198 + 050886 1332 25 06 2 344228868 05 1198 + 050887 1332 25 07 2 344228868 06 1198 + 050888 1332 25 08 2 344228868 07 1198 + 050889 1332 26 01 2 344228868 08 1198 + 050890 1332 26 02 2 344228868 09 1198 + 050891 1332 26 03 2 344228868 10 1198 + 050892 1332 26 04 2 344228868 11 1198 + 050893 1332 26 05 2 344228868 12 1198 + 050894 1332 26 06 2 344228868 13 1198 + 050895 1332 26 07 2 344228868 14 1198 + 050896 1332 26 08 2 344228868 15 1198 + 050897 1332 27 01 2 344229892 00 1199 + 050898 1332 27 02 2 344229892 01 1199 + 050899 1332 27 03 2 344229892 02 1199 + 050900 1332 27 04 2 344229892 03 1199 + 050901 1332 27 05 2 344229892 04 1199 + 050902 1332 27 06 2 344229892 05 1199 + 050903 1332 27 07 2 344229892 06 1199 + 050904 1332 27 08 2 344229892 07 1199 + 050905 1332 28 01 2 344229892 08 1199 + 050906 1332 28 02 2 344229892 09 1199 + 050907 1332 28 03 2 344229892 10 1199 + 050908 1332 28 04 2 344229892 11 1199 + 050909 1332 28 05 2 344229892 12 1199 + 050910 1332 28 06 2 344229892 13 1199 + 050911 1332 28 07 2 344229892 14 1199 + 050912 1332 28 08 2 344229892 15 1199 + 050913 1332 29 01 2 344331268 00 1248 + 050914 1332 29 02 2 344331268 01 1248 + 050915 1332 29 03 2 344331268 02 1248 + 050916 1332 29 04 2 344331268 03 1248 + 050917 1332 29 05 2 344331268 04 1248 + 050918 1332 29 06 2 344331268 05 1248 + 050919 1332 29 07 2 344331268 06 1248 + 050920 1332 29 08 2 344331268 07 1248 + 050921 1332 30 01 2 344331268 08 1248 + 050922 1332 30 02 2 344331268 09 1248 + 050923 1332 30 03 2 344331268 10 1248 + 050924 1332 30 04 2 344331268 11 1248 + 050925 1332 30 05 2 344331268 12 1248 + 050926 1332 30 06 2 344331268 13 1248 + 050927 1332 30 07 2 344331268 14 1248 + 050928 1332 30 08 2 344331268 15 1248 + 050929 1332 31 01 2 344332292 00 1249 + 050930 1332 31 02 2 344332292 01 1249 + 050931 1332 31 03 2 344332292 02 1249 + 050932 1332 31 04 2 344332292 03 1249 + 050933 1332 31 05 2 344332292 04 1249 + 050934 1332 31 06 2 344332292 05 1249 + 050935 1332 31 07 2 344332292 06 1249 + 050936 1332 31 08 2 344332292 07 1249 + 050937 1332 32 01 2 344332292 08 1249 + 050938 1332 32 02 2 344332292 09 1249 + 050939 1332 32 03 2 344332292 10 1249 + 050940 1332 32 04 2 344332292 11 1249 + 050941 1332 32 05 2 344332292 12 1249 + 050942 1332 32 06 2 344332292 13 1249 + 050943 1332 32 07 2 344332292 14 1249 + 050944 1332 32 08 2 344332292 15 1249 + 050945 1332 33 01 2 344491012 00 1310 + 050946 1332 33 02 2 344491012 01 1310 + 050947 1332 33 03 2 344491012 02 1310 + 050948 1332 33 04 2 344491012 03 1310 + 050949 1332 33 05 2 344491012 04 1310 + 050950 1332 33 06 2 344491012 05 1310 + 050951 1332 33 07 2 344491012 06 1310 + 050952 1332 33 08 2 344491012 07 1310 + 050953 1332 34 01 2 344491012 08 1310 + 050954 1332 34 02 2 344491012 09 1310 + 050955 1332 34 03 2 344491012 10 1310 + 050956 1332 34 04 2 344491012 11 1310 + 050957 1332 34 05 2 344491012 12 1310 + 050958 1332 34 06 2 344491012 13 1310 + 050959 1332 34 07 2 344491012 14 1310 + 050960 1332 34 08 2 344491012 15 1310 + 050961 1332 35 01 2 344492036 00 1311 + 050962 1332 35 02 2 344492036 01 1311 + 050963 1332 35 03 2 344492036 02 1311 + 050964 1332 35 04 2 344492036 03 1311 + 050965 1332 35 05 2 344492036 04 1311 + 050966 1332 35 06 2 344492036 05 1311 + 050967 1332 35 07 2 344492036 06 1311 + 050968 1332 35 08 2 344492036 07 1311 + 050969 1332 36 01 2 344492036 08 1311 + 050970 1332 36 02 2 344492036 09 1311 + 050971 1332 36 03 2 344492036 10 1311 + 050972 1332 36 04 2 344492036 11 1311 + 050973 1332 36 05 2 344492036 12 1311 + 050974 1332 36 06 2 344492036 13 1311 + 050975 1332 36 07 2 344492036 14 1311 + 050976 1332 36 08 2 344492036 15 1311 + 050977 1332 37 01 2 344593412 00 1360 + 050978 1332 37 02 2 344593412 01 1360 + 050979 1332 37 03 2 344593412 02 1360 + 050980 1332 37 04 2 344593412 03 1360 + 050981 1332 37 05 2 344593412 04 1360 + 050982 1332 37 06 2 344593412 05 1360 + 050983 1332 37 07 2 344593412 06 1360 + 050984 1332 37 08 2 344593412 07 1360 + 050985 1332 38 01 2 344593412 08 1360 + 050986 1332 38 02 2 344593412 09 1360 + 050987 1332 38 03 2 344593412 10 1360 + 050988 1332 38 04 2 344593412 11 1360 + 050989 1332 38 05 2 344593412 12 1360 + 050990 1332 38 06 2 344593412 13 1360 + 050991 1332 38 07 2 344593412 14 1360 + 050992 1332 38 08 2 344593412 15 1360 + 050993 1332 39 01 2 344594436 00 1361 + 050994 1332 39 02 2 344594436 01 1361 + 050995 1332 39 03 2 344594436 02 1361 + 050996 1332 39 04 2 344594436 03 1361 + 050997 1332 39 05 2 344594436 04 1361 + 050998 1332 39 06 2 344594436 05 1361 + 050999 1332 39 07 2 344594436 06 1361 + 051000 1332 39 08 2 344594436 07 1361 + 051001 1332 40 01 2 344594436 08 1361 + 051002 1332 40 02 2 344594436 09 1361 + 051003 1332 40 03 2 344594436 10 1361 + 051004 1332 40 04 2 344594436 11 1361 + 051005 1332 40 05 2 344594436 12 1361 + 051006 1332 40 06 2 344594436 13 1361 + 051007 1332 40 07 2 344594436 14 1361 + 051008 1332 40 08 2 344594436 15 1361 + 051009 1332 41 01 2 344753156 00 1422 + 051010 1332 41 02 2 344753156 01 1422 + 051011 1332 41 03 2 344753156 02 1422 + 051012 1332 41 04 2 344753156 03 1422 + 051013 1332 41 05 2 344753156 04 1422 + 051014 1332 41 06 2 344753156 05 1422 + 051015 1332 41 07 2 344753156 06 1422 + 051016 1332 41 08 2 344753156 07 1422 + 051017 1332 42 01 2 344753156 08 1422 + 051018 1332 42 02 2 344753156 09 1422 + 051019 1332 42 03 2 344753156 10 1422 + 051020 1332 42 04 2 344753156 11 1422 + 051021 1332 42 05 2 344753156 12 1422 + 051022 1332 42 06 2 344753156 13 1422 + 051023 1332 42 07 2 344753156 14 1422 + 051024 1332 42 08 2 344753156 15 1422 + 051025 1332 43 01 2 344754180 00 1423 + 051026 1332 43 02 2 344754180 01 1423 + 051027 1332 43 03 2 344754180 02 1423 + 051028 1332 43 04 2 344754180 03 1423 + 051029 1332 43 05 2 344754180 04 1423 + 051030 1332 43 06 2 344754180 05 1423 + 051031 1332 43 07 2 344754180 06 1423 + 051032 1332 43 08 2 344754180 07 1423 + 051033 1332 44 01 2 344754180 08 1423 + 051034 1332 44 02 2 344754180 09 1423 + 051035 1332 44 03 2 344754180 10 1423 + 051036 1332 44 04 2 344754180 11 1423 + 051037 1332 44 05 2 344754180 12 1423 + 051038 1332 44 06 2 344754180 13 1423 + 051039 1332 44 07 2 344754180 14 1423 + 051040 1332 44 08 2 344754180 15 1423 + 051041 1332 45 01 2 344855556 00 1472 + 051042 1332 45 02 2 344855556 01 1472 + 051043 1332 45 03 2 344855556 02 1472 + 051044 1332 45 04 2 344855556 03 1472 + 051045 1332 45 05 2 344855556 04 1472 + 051046 1332 45 06 2 344855556 05 1472 + 051047 1332 45 07 2 344855556 06 1472 + 051048 1332 45 08 2 344855556 07 1472 + 051049 1332 46 01 2 344855556 08 1472 + 051050 1332 46 02 2 344855556 09 1472 + 051051 1332 46 03 2 344855556 10 1472 + 051052 1332 46 04 2 344855556 11 1472 + 051053 1332 46 05 2 344855556 12 1472 + 051054 1332 46 06 2 344855556 13 1472 + 051055 1332 46 07 2 344855556 14 1472 + 051056 1332 46 08 2 344855556 15 1472 + 051057 1332 47 01 2 344856580 00 1473 + 051058 1332 47 02 2 344856580 01 1473 + 051059 1332 47 03 2 344856580 02 1473 + 051060 1332 47 04 2 344856580 03 1473 + 051061 1332 47 05 2 344856580 04 1473 + 051062 1332 47 06 2 344856580 05 1473 + 051063 1332 47 07 2 344856580 06 1473 + 051064 1332 47 08 2 344856580 07 1473 + 051065 1332 48 01 2 344856580 08 1473 + 051066 1332 48 02 2 344856580 09 1473 + 051067 1332 48 03 2 344856580 10 1473 + 051068 1332 48 04 2 344856580 11 1473 + 051069 1332 48 05 2 344856580 12 1473 + 051070 1332 48 06 2 344856580 13 1473 + 051071 1332 48 07 2 344856580 14 1473 + 051072 1332 48 08 2 344856580 15 1473 + 051073 1333 01 01 2 344232964 00 1200 + 051074 1333 01 02 2 344232964 01 1200 + 051075 1333 01 03 2 344232964 02 1200 + 051076 1333 01 04 2 344232964 03 1200 + 051077 1333 01 05 2 344232964 04 1200 + 051078 1333 01 06 2 344232964 05 1200 + 051079 1333 01 07 2 344232964 06 1200 + 051080 1333 01 08 2 344232964 07 1200 + 051081 1333 02 01 2 344232964 08 1200 + 051082 1333 02 02 2 344232964 09 1200 + 051083 1333 02 03 2 344232964 10 1200 + 051084 1333 02 04 2 344232964 11 1200 + 051085 1333 02 05 2 344232964 12 1200 + 051086 1333 02 06 2 344232964 13 1200 + 051087 1333 02 07 2 344232964 14 1200 + 051088 1333 02 08 2 344232964 15 1200 + 051089 1333 03 01 2 344233988 00 1201 + 051090 1333 03 02 2 344233988 01 1201 + 051091 1333 03 03 2 344233988 02 1201 + 051092 1333 03 04 2 344233988 03 1201 + 051093 1333 03 05 2 344233988 04 1201 + 051094 1333 03 06 2 344233988 05 1201 + 051095 1333 03 07 2 344233988 06 1201 + 051096 1333 03 08 2 344233988 07 1201 + 051097 1333 04 01 2 344233988 08 1201 + 051098 1333 04 02 2 344233988 09 1201 + 051099 1333 04 03 2 344233988 10 1201 + 051100 1333 04 04 2 344233988 11 1201 + 051101 1333 04 05 2 344233988 12 1201 + 051102 1333 04 06 2 344233988 13 1201 + 051103 1333 04 07 2 344233988 14 1201 + 051104 1333 04 08 2 344233988 15 1201 + 051105 1333 05 01 2 344335364 00 1250 + 051106 1333 05 02 2 344335364 01 1250 + 051107 1333 05 03 2 344335364 02 1250 + 051108 1333 05 04 2 344335364 03 1250 + 051109 1333 05 05 2 344335364 04 1250 + 051110 1333 05 06 2 344335364 05 1250 + 051111 1333 05 07 2 344335364 06 1250 + 051112 1333 05 08 2 344335364 07 1250 + 051113 1333 06 01 2 344335364 08 1250 + 051114 1333 06 02 2 344335364 09 1250 + 051115 1333 06 03 2 344335364 10 1250 + 051116 1333 06 04 2 344335364 11 1250 + 051117 1333 06 05 2 344335364 12 1250 + 051118 1333 06 06 2 344335364 13 1250 + 051119 1333 06 07 2 344335364 14 1250 + 051120 1333 06 08 2 344335364 15 1250 + 051121 1333 07 01 2 344336388 00 1251 + 051122 1333 07 02 2 344336388 01 1251 + 051123 1333 07 03 2 344336388 02 1251 + 051124 1333 07 04 2 344336388 03 1251 + 051125 1333 07 05 2 344336388 04 1251 + 051126 1333 07 06 2 344336388 05 1251 + 051127 1333 07 07 2 344336388 06 1251 + 051128 1333 07 08 2 344336388 07 1251 + 051129 1333 08 01 2 344336388 08 1251 + 051130 1333 08 02 2 344336388 09 1251 + 051131 1333 08 03 2 344336388 10 1251 + 051132 1333 08 04 2 344336388 11 1251 + 051133 1333 08 05 2 344336388 12 1251 + 051134 1333 08 06 2 344336388 13 1251 + 051135 1333 08 07 2 344336388 14 1251 + 051136 1333 08 08 2 344336388 15 1251 + 051137 1333 09 01 2 344495108 00 1312 + 051138 1333 09 02 2 344495108 01 1312 + 051139 1333 09 03 2 344495108 02 1312 + 051140 1333 09 04 2 344495108 03 1312 + 051141 1333 09 05 2 344495108 04 1312 + 051142 1333 09 06 2 344495108 05 1312 + 051143 1333 09 07 2 344495108 06 1312 + 051144 1333 09 08 2 344495108 07 1312 + 051145 1333 10 01 2 344495108 08 1312 + 051146 1333 10 02 2 344495108 09 1312 + 051147 1333 10 03 2 344495108 10 1312 + 051148 1333 10 04 2 344495108 11 1312 + 051149 1333 10 05 2 344495108 12 1312 + 051150 1333 10 06 2 344495108 13 1312 + 051151 1333 10 07 2 344495108 14 1312 + 051152 1333 10 08 2 344495108 15 1312 + 051153 1333 11 01 2 344496132 00 1313 + 051154 1333 11 02 2 344496132 01 1313 + 051155 1333 11 03 2 344496132 02 1313 + 051156 1333 11 04 2 344496132 03 1313 + 051157 1333 11 05 2 344496132 04 1313 + 051158 1333 11 06 2 344496132 05 1313 + 051159 1333 11 07 2 344496132 06 1313 + 051160 1333 11 08 2 344496132 07 1313 + 051161 1333 12 01 2 344496132 08 1313 + 051162 1333 12 02 2 344496132 09 1313 + 051163 1333 12 03 2 344496132 10 1313 + 051164 1333 12 04 2 344496132 11 1313 + 051165 1333 12 05 2 344496132 12 1313 + 051166 1333 12 06 2 344496132 13 1313 + 051167 1333 12 07 2 344496132 14 1313 + 051168 1333 12 08 2 344496132 15 1313 + 051169 1333 13 01 2 344597508 00 1362 + 051170 1333 13 02 2 344597508 01 1362 + 051171 1333 13 03 2 344597508 02 1362 + 051172 1333 13 04 2 344597508 03 1362 + 051173 1333 13 05 2 344597508 04 1362 + 051174 1333 13 06 2 344597508 05 1362 + 051175 1333 13 07 2 344597508 06 1362 + 051176 1333 13 08 2 344597508 07 1362 + 051177 1333 14 01 2 344597508 08 1362 + 051178 1333 14 02 2 344597508 09 1362 + 051179 1333 14 03 2 344597508 10 1362 + 051180 1333 14 04 2 344597508 11 1362 + 051181 1333 14 05 2 344597508 12 1362 + 051182 1333 14 06 2 344597508 13 1362 + 051183 1333 14 07 2 344597508 14 1362 + 051184 1333 14 08 2 344597508 15 1362 + 051185 1333 15 01 2 344598532 00 1363 + 051186 1333 15 02 2 344598532 01 1363 + 051187 1333 15 03 2 344598532 02 1363 + 051188 1333 15 04 2 344598532 03 1363 + 051189 1333 15 05 2 344598532 04 1363 + 051190 1333 15 06 2 344598532 05 1363 + 051191 1333 15 07 2 344598532 06 1363 + 051192 1333 15 08 2 344598532 07 1363 + 051193 1333 16 01 2 344598532 08 1363 + 051194 1333 16 02 2 344598532 09 1363 + 051195 1333 16 03 2 344598532 10 1363 + 051196 1333 16 04 2 344598532 11 1363 + 051197 1333 16 05 2 344598532 12 1363 + 051198 1333 16 06 2 344598532 13 1363 + 051199 1333 16 07 2 344598532 14 1363 + 051200 1333 16 08 2 344598532 15 1363 + 051201 1333 17 01 2 344757252 00 1424 + 051202 1333 17 02 2 344757252 01 1424 + 051203 1333 17 03 2 344757252 02 1424 + 051204 1333 17 04 2 344757252 03 1424 + 051205 1333 17 05 2 344757252 04 1424 + 051206 1333 17 06 2 344757252 05 1424 + 051207 1333 17 07 2 344757252 06 1424 + 051208 1333 17 08 2 344757252 07 1424 + 051209 1333 18 01 2 344757252 08 1424 + 051210 1333 18 02 2 344757252 09 1424 + 051211 1333 18 03 2 344757252 10 1424 + 051212 1333 18 04 2 344757252 11 1424 + 051213 1333 18 05 2 344757252 12 1424 + 051214 1333 18 06 2 344757252 13 1424 + 051215 1333 18 07 2 344757252 14 1424 + 051216 1333 18 08 2 344757252 15 1424 + 051217 1333 19 01 2 344758276 00 1425 + 051218 1333 19 02 2 344758276 01 1425 + 051219 1333 19 03 2 344758276 02 1425 + 051220 1333 19 04 2 344758276 03 1425 + 051221 1333 19 05 2 344758276 04 1425 + 051222 1333 19 06 2 344758276 05 1425 + 051223 1333 19 07 2 344758276 06 1425 + 051224 1333 19 08 2 344758276 07 1425 + 051225 1333 20 01 2 344758276 08 1425 + 051226 1333 20 02 2 344758276 09 1425 + 051227 1333 20 03 2 344758276 10 1425 + 051228 1333 20 04 2 344758276 11 1425 + 051229 1333 20 05 2 344758276 12 1425 + 051230 1333 20 06 2 344758276 13 1425 + 051231 1333 20 07 2 344758276 14 1425 + 051232 1333 20 08 2 344758276 15 1425 + 051233 1333 21 01 2 344859652 00 1474 + 051234 1333 21 02 2 344859652 01 1474 + 051235 1333 21 03 2 344859652 02 1474 + 051236 1333 21 04 2 344859652 03 1474 + 051237 1333 21 05 2 344859652 04 1474 + 051238 1333 21 06 2 344859652 05 1474 + 051239 1333 21 07 2 344859652 06 1474 + 051240 1333 21 08 2 344859652 07 1474 + 051241 1333 22 01 2 344859652 08 1474 + 051242 1333 22 02 2 344859652 09 1474 + 051243 1333 22 03 2 344859652 10 1474 + 051244 1333 22 04 2 344859652 11 1474 + 051245 1333 22 05 2 344859652 12 1474 + 051246 1333 22 06 2 344859652 13 1474 + 051247 1333 22 07 2 344859652 14 1474 + 051248 1333 22 08 2 344859652 15 1474 + 051249 1333 23 01 2 344860676 00 1475 + 051250 1333 23 02 2 344860676 01 1475 + 051251 1333 23 03 2 344860676 02 1475 + 051252 1333 23 04 2 344860676 03 1475 + 051253 1333 23 05 2 344860676 04 1475 + 051254 1333 23 06 2 344860676 05 1475 + 051255 1333 23 07 2 344860676 06 1475 + 051256 1333 23 08 2 344860676 07 1475 + 051257 1333 24 01 2 344860676 08 1475 + 051258 1333 24 02 2 344860676 09 1475 + 051259 1333 24 03 2 344860676 10 1475 + 051260 1333 24 04 2 344860676 11 1475 + 051261 1333 24 05 2 344860676 12 1475 + 051262 1333 24 06 2 344860676 13 1475 + 051263 1333 24 07 2 344860676 14 1475 + 051264 1333 24 08 2 344860676 15 1475 + 051265 1333 25 01 2 344343556 00 1254 + 051266 1333 25 02 2 344343556 01 1254 + 051267 1333 25 03 2 344343556 02 1254 + 051268 1333 25 04 2 344343556 03 1254 + 051269 1333 25 05 2 344343556 04 1254 + 051270 1333 25 06 2 344343556 05 1254 + 051271 1333 25 07 2 344343556 06 1254 + 051272 1333 25 08 2 344343556 07 1254 + 051273 1333 26 01 2 344343556 08 1254 + 051274 1333 26 02 2 344343556 09 1254 + 051275 1333 26 03 2 344343556 10 1254 + 051276 1333 26 04 2 344343556 11 1254 + 051277 1333 26 05 2 344343556 12 1254 + 051278 1333 26 06 2 344343556 13 1254 + 051279 1333 26 07 2 344343556 14 1254 + 051280 1333 26 08 2 344343556 15 1254 + 051281 1333 27 01 2 344344580 00 1255 + 051282 1333 27 02 2 344344580 01 1255 + 051283 1333 27 03 2 344344580 02 1255 + 051284 1333 27 04 2 344344580 03 1255 + 051285 1333 27 05 2 344344580 04 1255 + 051286 1333 27 06 2 344344580 05 1255 + 051287 1333 27 07 2 344344580 06 1255 + 051288 1333 27 08 2 344344580 07 1255 + 051289 1333 28 01 2 344344580 08 1255 + 051290 1333 28 02 2 344344580 09 1255 + 051291 1333 28 03 2 344344580 10 1255 + 051292 1333 28 04 2 344344580 11 1255 + 051293 1333 28 05 2 344344580 12 1255 + 051294 1333 28 06 2 344344580 13 1255 + 051295 1333 28 07 2 344344580 14 1255 + 051296 1333 28 08 2 344344580 15 1255 + 051297 1333 29 01 2 344339460 00 1252 + 051298 1333 29 02 2 344339460 01 1252 + 051299 1333 29 03 2 344339460 02 1252 + 051300 1333 29 04 2 344339460 03 1252 + 051301 1333 29 05 2 344339460 04 1252 + 051302 1333 29 06 2 344339460 05 1252 + 051303 1333 29 07 2 344339460 06 1252 + 051304 1333 29 08 2 344339460 07 1252 + 051305 1333 30 01 2 344339460 08 1252 + 051306 1333 30 02 2 344339460 09 1252 + 051307 1333 30 03 2 344339460 10 1252 + 051308 1333 30 04 2 344339460 11 1252 + 051309 1333 30 05 2 344339460 12 1252 + 051310 1333 30 06 2 344339460 13 1252 + 051311 1333 30 07 2 344339460 14 1252 + 051312 1333 30 08 2 344339460 15 1252 + 051313 1333 31 01 2 344340484 00 1253 + 051314 1333 31 02 2 344340484 01 1253 + 051315 1333 31 03 2 344340484 02 1253 + 051316 1333 31 04 2 344340484 03 1253 + 051317 1333 31 05 2 344340484 04 1253 + 051318 1333 31 06 2 344340484 05 1253 + 051319 1333 31 07 2 344340484 06 1253 + 051320 1333 31 08 2 344340484 07 1253 + 051321 1333 32 01 2 344340484 08 1253 + 051322 1333 32 02 2 344340484 09 1253 + 051323 1333 32 03 2 344340484 10 1253 + 051324 1333 32 04 2 344340484 11 1253 + 051325 1333 32 05 2 344340484 12 1253 + 051326 1333 32 06 2 344340484 13 1253 + 051327 1333 32 07 2 344340484 14 1253 + 051328 1333 32 08 2 344340484 15 1253 + 051329 1333 33 01 2 344605700 00 1366 + 051330 1333 33 02 2 344605700 01 1366 + 051331 1333 33 03 2 344605700 02 1366 + 051332 1333 33 04 2 344605700 03 1366 + 051333 1333 33 05 2 344605700 04 1366 + 051334 1333 33 06 2 344605700 05 1366 + 051335 1333 33 07 2 344605700 06 1366 + 051336 1333 33 08 2 344605700 07 1366 + 051337 1333 34 01 2 344605700 08 1366 + 051338 1333 34 02 2 344605700 09 1366 + 051339 1333 34 03 2 344605700 10 1366 + 051340 1333 34 04 2 344605700 11 1366 + 051341 1333 34 05 2 344605700 12 1366 + 051342 1333 34 06 2 344605700 13 1366 + 051343 1333 34 07 2 344605700 14 1366 + 051344 1333 34 08 2 344605700 15 1366 + 051345 1333 35 01 2 344606724 00 1367 + 051346 1333 35 02 2 344606724 01 1367 + 051347 1333 35 03 2 344606724 02 1367 + 051348 1333 35 04 2 344606724 03 1367 + 051349 1333 35 05 2 344606724 04 1367 + 051350 1333 35 06 2 344606724 05 1367 + 051351 1333 35 07 2 344606724 06 1367 + 051352 1333 35 08 2 344606724 07 1367 + 051353 1333 36 01 2 344606724 08 1367 + 051354 1333 36 02 2 344606724 09 1367 + 051355 1333 36 03 2 344606724 10 1367 + 051356 1333 36 04 2 344606724 11 1367 + 051357 1333 36 05 2 344606724 12 1367 + 051358 1333 36 06 2 344606724 13 1367 + 051359 1333 36 07 2 344606724 14 1367 + 051360 1333 36 08 2 344606724 15 1367 + 051361 1333 37 01 2 344601604 00 1364 + 051362 1333 37 02 2 344601604 01 1364 + 051363 1333 37 03 2 344601604 02 1364 + 051364 1333 37 04 2 344601604 03 1364 + 051365 1333 37 05 2 344601604 04 1364 + 051366 1333 37 06 2 344601604 05 1364 + 051367 1333 37 07 2 344601604 06 1364 + 051368 1333 37 08 2 344601604 07 1364 + 051369 1333 38 01 2 344601604 08 1364 + 051370 1333 38 02 2 344601604 09 1364 + 051371 1333 38 03 2 344601604 10 1364 + 051372 1333 38 04 2 344601604 11 1364 + 051373 1333 38 05 2 344601604 12 1364 + 051374 1333 38 06 2 344601604 13 1364 + 051375 1333 38 07 2 344601604 14 1364 + 051376 1333 38 08 2 344601604 15 1364 + 051377 1333 39 01 2 344602628 00 1365 + 051378 1333 39 02 2 344602628 01 1365 + 051379 1333 39 03 2 344602628 02 1365 + 051380 1333 39 04 2 344602628 03 1365 + 051381 1333 39 05 2 344602628 04 1365 + 051382 1333 39 06 2 344602628 05 1365 + 051383 1333 39 07 2 344602628 06 1365 + 051384 1333 39 08 2 344602628 07 1365 + 051385 1333 40 01 2 344602628 08 1365 + 051386 1333 40 02 2 344602628 09 1365 + 051387 1333 40 03 2 344602628 10 1365 + 051388 1333 40 04 2 344602628 11 1365 + 051389 1333 40 05 2 344602628 12 1365 + 051390 1333 40 06 2 344602628 13 1365 + 051391 1333 40 07 2 344602628 14 1365 + 051392 1333 40 08 2 344602628 15 1365 + 051393 1333 41 01 2 344867844 00 1478 + 051394 1333 41 02 2 344867844 01 1478 + 051395 1333 41 03 2 344867844 02 1478 + 051396 1333 41 04 2 344867844 03 1478 + 051397 1333 41 05 2 344867844 04 1478 + 051398 1333 41 06 2 344867844 05 1478 + 051399 1333 41 07 2 344867844 06 1478 + 051400 1333 41 08 2 344867844 07 1478 + 051401 1333 42 01 2 344867844 08 1478 + 051402 1333 42 02 2 344867844 09 1478 + 051403 1333 42 03 2 344867844 10 1478 + 051404 1333 42 04 2 344867844 11 1478 + 051405 1333 42 05 2 344867844 12 1478 + 051406 1333 42 06 2 344867844 13 1478 + 051407 1333 42 07 2 344867844 14 1478 + 051408 1333 42 08 2 344867844 15 1478 + 051409 1333 43 01 2 344868868 00 1479 + 051410 1333 43 02 2 344868868 01 1479 + 051411 1333 43 03 2 344868868 02 1479 + 051412 1333 43 04 2 344868868 03 1479 + 051413 1333 43 05 2 344868868 04 1479 + 051414 1333 43 06 2 344868868 05 1479 + 051415 1333 43 07 2 344868868 06 1479 + 051416 1333 43 08 2 344868868 07 1479 + 051417 1333 44 01 2 344868868 08 1479 + 051418 1333 44 02 2 344868868 09 1479 + 051419 1333 44 03 2 344868868 10 1479 + 051420 1333 44 04 2 344868868 11 1479 + 051421 1333 44 05 2 344868868 12 1479 + 051422 1333 44 06 2 344868868 13 1479 + 051423 1333 44 07 2 344868868 14 1479 + 051424 1333 44 08 2 344868868 15 1479 + 051425 1333 45 01 2 344863748 00 1476 + 051426 1333 45 02 2 344863748 01 1476 + 051427 1333 45 03 2 344863748 02 1476 + 051428 1333 45 04 2 344863748 03 1476 + 051429 1333 45 05 2 344863748 04 1476 + 051430 1333 45 06 2 344863748 05 1476 + 051431 1333 45 07 2 344863748 06 1476 + 051432 1333 45 08 2 344863748 07 1476 + 051433 1333 46 01 2 344863748 08 1476 + 051434 1333 46 02 2 344863748 09 1476 + 051435 1333 46 03 2 344863748 10 1476 + 051436 1333 46 04 2 344863748 11 1476 + 051437 1333 46 05 2 344863748 12 1476 + 051438 1333 46 06 2 344863748 13 1476 + 051439 1333 46 07 2 344863748 14 1476 + 051440 1333 46 08 2 344863748 15 1476 + 051441 1333 47 01 2 344864772 00 1477 + 051442 1333 47 02 2 344864772 01 1477 + 051443 1333 47 03 2 344864772 02 1477 + 051444 1333 47 04 2 344864772 03 1477 + 051445 1333 47 05 2 344864772 04 1477 + 051446 1333 47 06 2 344864772 05 1477 + 051447 1333 47 07 2 344864772 06 1477 + 051448 1333 47 08 2 344864772 07 1477 + 051449 1333 48 01 2 344864772 08 1477 + 051450 1333 48 02 2 344864772 09 1477 + 051451 1333 48 03 2 344864772 10 1477 + 051452 1333 48 04 2 344864772 11 1477 + 051453 1333 48 05 2 344864772 12 1477 + 051454 1333 48 06 2 344864772 13 1477 + 051455 1333 48 07 2 344864772 14 1477 + 051456 1333 48 08 2 344864772 15 1477 + 051457 1334 01 01 2 344347652 00 1256 + 051458 1334 01 02 2 344347652 01 1256 + 051459 1334 01 03 2 344347652 02 1256 + 051460 1334 01 04 2 344347652 03 1256 + 051461 1334 01 05 2 344347652 04 1256 + 051462 1334 01 06 2 344347652 05 1256 + 051463 1334 01 07 2 344347652 06 1256 + 051464 1334 01 08 2 344347652 07 1256 + 051465 1334 02 01 2 344347652 08 1256 + 051466 1334 02 02 2 344347652 09 1256 + 051467 1334 02 03 2 344347652 10 1256 + 051468 1334 02 04 2 344347652 11 1256 + 051469 1334 02 05 2 344347652 12 1256 + 051470 1334 02 06 2 344347652 13 1256 + 051471 1334 02 07 2 344347652 14 1256 + 051472 1334 02 08 2 344347652 15 1256 + 051473 1334 03 01 2 344348676 00 1257 + 051474 1334 03 02 2 344348676 01 1257 + 051475 1334 03 03 2 344348676 02 1257 + 051476 1334 03 04 2 344348676 03 1257 + 051477 1334 03 05 2 344348676 04 1257 + 051478 1334 03 06 2 344348676 05 1257 + 051479 1334 03 07 2 344348676 06 1257 + 051480 1334 03 08 2 344348676 07 1257 + 051481 1334 04 01 2 344348676 08 1257 + 051482 1334 04 02 2 344348676 09 1257 + 051483 1334 04 03 2 344348676 10 1257 + 051484 1334 04 04 2 344348676 11 1257 + 051485 1334 04 05 2 344348676 12 1257 + 051486 1334 04 06 2 344348676 13 1257 + 051487 1334 04 07 2 344348676 14 1257 + 051488 1334 04 08 2 344348676 15 1257 + 051489 1334 05 01 2 344237060 00 1202 + 051490 1334 05 02 2 344237060 01 1202 + 051491 1334 05 03 2 344237060 02 1202 + 051492 1334 05 04 2 344237060 03 1202 + 051493 1334 05 05 2 344237060 04 1202 + 051494 1334 05 06 2 344237060 05 1202 + 051495 1334 05 07 2 344237060 06 1202 + 051496 1334 05 08 2 344237060 07 1202 + 051497 1334 06 01 2 344237060 08 1202 + 051498 1334 06 02 2 344237060 09 1202 + 051499 1334 06 03 2 344237060 10 1202 + 051500 1334 06 04 2 344237060 11 1202 + 051501 1334 06 05 2 344237060 12 1202 + 051502 1334 06 06 2 344237060 13 1202 + 051503 1334 06 07 2 344237060 14 1202 + 051504 1334 06 08 2 344237060 15 1202 + 051505 1334 07 01 2 344238084 00 1203 + 051506 1334 07 02 2 344238084 01 1203 + 051507 1334 07 03 2 344238084 02 1203 + 051508 1334 07 04 2 344238084 03 1203 + 051509 1334 07 05 2 344238084 04 1203 + 051510 1334 07 06 2 344238084 05 1203 + 051511 1334 07 07 2 344238084 06 1203 + 051512 1334 07 08 2 344238084 07 1203 + 051513 1334 08 01 2 344238084 08 1203 + 051514 1334 08 02 2 344238084 09 1203 + 051515 1334 08 03 2 344238084 10 1203 + 051516 1334 08 04 2 344238084 11 1203 + 051517 1334 08 05 2 344238084 12 1203 + 051518 1334 08 06 2 344238084 13 1203 + 051519 1334 08 07 2 344238084 14 1203 + 051520 1334 08 08 2 344238084 15 1203 + 051521 1334 09 01 2 344609796 00 1368 + 051522 1334 09 02 2 344609796 01 1368 + 051523 1334 09 03 2 344609796 02 1368 + 051524 1334 09 04 2 344609796 03 1368 + 051525 1334 09 05 2 344609796 04 1368 + 051526 1334 09 06 2 344609796 05 1368 + 051527 1334 09 07 2 344609796 06 1368 + 051528 1334 09 08 2 344609796 07 1368 + 051529 1334 10 01 2 344609796 08 1368 + 051530 1334 10 02 2 344609796 09 1368 + 051531 1334 10 03 2 344609796 10 1368 + 051532 1334 10 04 2 344609796 11 1368 + 051533 1334 10 05 2 344609796 12 1368 + 051534 1334 10 06 2 344609796 13 1368 + 051535 1334 10 07 2 344609796 14 1368 + 051536 1334 10 08 2 344609796 15 1368 + 051537 1334 11 01 2 344610820 00 1369 + 051538 1334 11 02 2 344610820 01 1369 + 051539 1334 11 03 2 344610820 02 1369 + 051540 1334 11 04 2 344610820 03 1369 + 051541 1334 11 05 2 344610820 04 1369 + 051542 1334 11 06 2 344610820 05 1369 + 051543 1334 11 07 2 344610820 06 1369 + 051544 1334 11 08 2 344610820 07 1369 + 051545 1334 12 01 2 344610820 08 1369 + 051546 1334 12 02 2 344610820 09 1369 + 051547 1334 12 03 2 344610820 10 1369 + 051548 1334 12 04 2 344610820 11 1369 + 051549 1334 12 05 2 344610820 12 1369 + 051550 1334 12 06 2 344610820 13 1369 + 051551 1334 12 07 2 344610820 14 1369 + 051552 1334 12 08 2 344610820 15 1369 + 051553 1334 13 01 2 344499204 00 1314 + 051554 1334 13 02 2 344499204 01 1314 + 051555 1334 13 03 2 344499204 02 1314 + 051556 1334 13 04 2 344499204 03 1314 + 051557 1334 13 05 2 344499204 04 1314 + 051558 1334 13 06 2 344499204 05 1314 + 051559 1334 13 07 2 344499204 06 1314 + 051560 1334 13 08 2 344499204 07 1314 + 051561 1334 14 01 2 344499204 08 1314 + 051562 1334 14 02 2 344499204 09 1314 + 051563 1334 14 03 2 344499204 10 1314 + 051564 1334 14 04 2 344499204 11 1314 + 051565 1334 14 05 2 344499204 12 1314 + 051566 1334 14 06 2 344499204 13 1314 + 051567 1334 14 07 2 344499204 14 1314 + 051568 1334 14 08 2 344499204 15 1314 + 051569 1334 15 01 2 344500228 00 1315 + 051570 1334 15 02 2 344500228 01 1315 + 051571 1334 15 03 2 344500228 02 1315 + 051572 1334 15 04 2 344500228 03 1315 + 051573 1334 15 05 2 344500228 04 1315 + 051574 1334 15 06 2 344500228 05 1315 + 051575 1334 15 07 2 344500228 06 1315 + 051576 1334 15 08 2 344500228 07 1315 + 051577 1334 16 01 2 344500228 08 1315 + 051578 1334 16 02 2 344500228 09 1315 + 051579 1334 16 03 2 344500228 10 1315 + 051580 1334 16 04 2 344500228 11 1315 + 051581 1334 16 05 2 344500228 12 1315 + 051582 1334 16 06 2 344500228 13 1315 + 051583 1334 16 07 2 344500228 14 1315 + 051584 1334 16 08 2 344500228 15 1315 + 051585 1334 17 01 2 344871940 00 1480 + 051586 1334 17 02 2 344871940 01 1480 + 051587 1334 17 03 2 344871940 02 1480 + 051588 1334 17 04 2 344871940 03 1480 + 051589 1334 17 05 2 344871940 04 1480 + 051590 1334 17 06 2 344871940 05 1480 + 051591 1334 17 07 2 344871940 06 1480 + 051592 1334 17 08 2 344871940 07 1480 + 051593 1334 18 01 2 344871940 08 1480 + 051594 1334 18 02 2 344871940 09 1480 + 051595 1334 18 03 2 344871940 10 1480 + 051596 1334 18 04 2 344871940 11 1480 + 051597 1334 18 05 2 344871940 12 1480 + 051598 1334 18 06 2 344871940 13 1480 + 051599 1334 18 07 2 344871940 14 1480 + 051600 1334 18 08 2 344871940 15 1480 + 051601 1334 19 01 2 344872964 00 1481 + 051602 1334 19 02 2 344872964 01 1481 + 051603 1334 19 03 2 344872964 02 1481 + 051604 1334 19 04 2 344872964 03 1481 + 051605 1334 19 05 2 344872964 04 1481 + 051606 1334 19 06 2 344872964 05 1481 + 051607 1334 19 07 2 344872964 06 1481 + 051608 1334 19 08 2 344872964 07 1481 + 051609 1334 20 01 2 344872964 08 1481 + 051610 1334 20 02 2 344872964 09 1481 + 051611 1334 20 03 2 344872964 10 1481 + 051612 1334 20 04 2 344872964 11 1481 + 051613 1334 20 05 2 344872964 12 1481 + 051614 1334 20 06 2 344872964 13 1481 + 051615 1334 20 07 2 344872964 14 1481 + 051616 1334 20 08 2 344872964 15 1481 + 051617 1334 21 01 2 344761348 00 1426 + 051618 1334 21 02 2 344761348 01 1426 + 051619 1334 21 03 2 344761348 02 1426 + 051620 1334 21 04 2 344761348 03 1426 + 051621 1334 21 05 2 344761348 04 1426 + 051622 1334 21 06 2 344761348 05 1426 + 051623 1334 21 07 2 344761348 06 1426 + 051624 1334 21 08 2 344761348 07 1426 + 051625 1334 22 01 2 344761348 08 1426 + 051626 1334 22 02 2 344761348 09 1426 + 051627 1334 22 03 2 344761348 10 1426 + 051628 1334 22 04 2 344761348 11 1426 + 051629 1334 22 05 2 344761348 12 1426 + 051630 1334 22 06 2 344761348 13 1426 + 051631 1334 22 07 2 344761348 14 1426 + 051632 1334 22 08 2 344761348 15 1426 + 051633 1334 23 01 2 344762372 00 1427 + 051634 1334 23 02 2 344762372 01 1427 + 051635 1334 23 03 2 344762372 02 1427 + 051636 1334 23 04 2 344762372 03 1427 + 051637 1334 23 05 2 344762372 04 1427 + 051638 1334 23 06 2 344762372 05 1427 + 051639 1334 23 07 2 344762372 06 1427 + 051640 1334 23 08 2 344762372 07 1427 + 051641 1334 24 01 2 344762372 08 1427 + 051642 1334 24 02 2 344762372 09 1427 + 051643 1334 24 03 2 344762372 10 1427 + 051644 1334 24 04 2 344762372 11 1427 + 051645 1334 24 05 2 344762372 12 1427 + 051646 1334 24 06 2 344762372 13 1427 + 051647 1334 24 07 2 344762372 14 1427 + 051648 1334 24 08 2 344762372 15 1427 + 051649 1334 25 01 2 344351748 00 1258 + 051650 1334 25 02 2 344351748 01 1258 + 051651 1334 25 03 2 344351748 02 1258 + 051652 1334 25 04 2 344351748 03 1258 + 051653 1334 25 05 2 344351748 04 1258 + 051654 1334 25 06 2 344351748 05 1258 + 051655 1334 25 07 2 344351748 06 1258 + 051656 1334 25 08 2 344351748 07 1258 + 051657 1334 26 01 2 344351748 08 1258 + 051658 1334 26 02 2 344351748 09 1258 + 051659 1334 26 03 2 344351748 10 1258 + 051660 1334 26 04 2 344351748 11 1258 + 051661 1334 26 05 2 344351748 12 1258 + 051662 1334 26 06 2 344351748 13 1258 + 051663 1334 26 07 2 344351748 14 1258 + 051664 1334 26 08 2 344351748 15 1258 + 051665 1334 27 01 2 344352772 00 1259 + 051666 1334 27 02 2 344352772 01 1259 + 051667 1334 27 03 2 344352772 02 1259 + 051668 1334 27 04 2 344352772 03 1259 + 051669 1334 27 05 2 344352772 04 1259 + 051670 1334 27 06 2 344352772 05 1259 + 051671 1334 27 07 2 344352772 06 1259 + 051672 1334 27 08 2 344352772 07 1259 + 051673 1334 28 01 2 344352772 08 1259 + 051674 1334 28 02 2 344352772 09 1259 + 051675 1334 28 03 2 344352772 10 1259 + 051676 1334 28 04 2 344352772 11 1259 + 051677 1334 28 05 2 344352772 12 1259 + 051678 1334 28 06 2 344352772 13 1259 + 051679 1334 28 07 2 344352772 14 1259 + 051680 1334 28 08 2 344352772 15 1259 + 051681 1334 29 01 2 344241156 00 1204 + 051682 1334 29 02 2 344241156 01 1204 + 051683 1334 29 03 2 344241156 02 1204 + 051684 1334 29 04 2 344241156 03 1204 + 051685 1334 29 05 2 344241156 04 1204 + 051686 1334 29 06 2 344241156 05 1204 + 051687 1334 29 07 2 344241156 06 1204 + 051688 1334 29 08 2 344241156 07 1204 + 051689 1334 30 01 2 344241156 08 1204 + 051690 1334 30 02 2 344241156 09 1204 + 051691 1334 30 03 2 344241156 10 1204 + 051692 1334 30 04 2 344241156 11 1204 + 051693 1334 30 05 2 344241156 12 1204 + 051694 1334 30 06 2 344241156 13 1204 + 051695 1334 30 07 2 344241156 14 1204 + 051696 1334 30 08 2 344241156 15 1204 + 051697 1334 31 01 2 344242180 00 1205 + 051698 1334 31 02 2 344242180 01 1205 + 051699 1334 31 03 2 344242180 02 1205 + 051700 1334 31 04 2 344242180 03 1205 + 051701 1334 31 05 2 344242180 04 1205 + 051702 1334 31 06 2 344242180 05 1205 + 051703 1334 31 07 2 344242180 06 1205 + 051704 1334 31 08 2 344242180 07 1205 + 051705 1334 32 01 2 344242180 08 1205 + 051706 1334 32 02 2 344242180 09 1205 + 051707 1334 32 03 2 344242180 10 1205 + 051708 1334 32 04 2 344242180 11 1205 + 051709 1334 32 05 2 344242180 12 1205 + 051710 1334 32 06 2 344242180 13 1205 + 051711 1334 32 07 2 344242180 14 1205 + 051712 1334 32 08 2 344242180 15 1205 + 051713 1334 33 01 2 344613892 00 1370 + 051714 1334 33 02 2 344613892 01 1370 + 051715 1334 33 03 2 344613892 02 1370 + 051716 1334 33 04 2 344613892 03 1370 + 051717 1334 33 05 2 344613892 04 1370 + 051718 1334 33 06 2 344613892 05 1370 + 051719 1334 33 07 2 344613892 06 1370 + 051720 1334 33 08 2 344613892 07 1370 + 051721 1334 34 01 2 344613892 08 1370 + 051722 1334 34 02 2 344613892 09 1370 + 051723 1334 34 03 2 344613892 10 1370 + 051724 1334 34 04 2 344613892 11 1370 + 051725 1334 34 05 2 344613892 12 1370 + 051726 1334 34 06 2 344613892 13 1370 + 051727 1334 34 07 2 344613892 14 1370 + 051728 1334 34 08 2 344613892 15 1370 + 051729 1334 35 01 2 344614916 00 1371 + 051730 1334 35 02 2 344614916 01 1371 + 051731 1334 35 03 2 344614916 02 1371 + 051732 1334 35 04 2 344614916 03 1371 + 051733 1334 35 05 2 344614916 04 1371 + 051734 1334 35 06 2 344614916 05 1371 + 051735 1334 35 07 2 344614916 06 1371 + 051736 1334 35 08 2 344614916 07 1371 + 051737 1334 36 01 2 344614916 08 1371 + 051738 1334 36 02 2 344614916 09 1371 + 051739 1334 36 03 2 344614916 10 1371 + 051740 1334 36 04 2 344614916 11 1371 + 051741 1334 36 05 2 344614916 12 1371 + 051742 1334 36 06 2 344614916 13 1371 + 051743 1334 36 07 2 344614916 14 1371 + 051744 1334 36 08 2 344614916 15 1371 + 051745 1334 37 01 2 344503300 00 1316 + 051746 1334 37 02 2 344503300 01 1316 + 051747 1334 37 03 2 344503300 02 1316 + 051748 1334 37 04 2 344503300 03 1316 + 051749 1334 37 05 2 344503300 04 1316 + 051750 1334 37 06 2 344503300 05 1316 + 051751 1334 37 07 2 344503300 06 1316 + 051752 1334 37 08 2 344503300 07 1316 + 051753 1334 38 01 2 344503300 08 1316 + 051754 1334 38 02 2 344503300 09 1316 + 051755 1334 38 03 2 344503300 10 1316 + 051756 1334 38 04 2 344503300 11 1316 + 051757 1334 38 05 2 344503300 12 1316 + 051758 1334 38 06 2 344503300 13 1316 + 051759 1334 38 07 2 344503300 14 1316 + 051760 1334 38 08 2 344503300 15 1316 + 051761 1334 39 01 2 344504324 00 1317 + 051762 1334 39 02 2 344504324 01 1317 + 051763 1334 39 03 2 344504324 02 1317 + 051764 1334 39 04 2 344504324 03 1317 + 051765 1334 39 05 2 344504324 04 1317 + 051766 1334 39 06 2 344504324 05 1317 + 051767 1334 39 07 2 344504324 06 1317 + 051768 1334 39 08 2 344504324 07 1317 + 051769 1334 40 01 2 344504324 08 1317 + 051770 1334 40 02 2 344504324 09 1317 + 051771 1334 40 03 2 344504324 10 1317 + 051772 1334 40 04 2 344504324 11 1317 + 051773 1334 40 05 2 344504324 12 1317 + 051774 1334 40 06 2 344504324 13 1317 + 051775 1334 40 07 2 344504324 14 1317 + 051776 1334 40 08 2 344504324 15 1317 + 051777 1334 41 01 2 344876036 00 1482 + 051778 1334 41 02 2 344876036 01 1482 + 051779 1334 41 03 2 344876036 02 1482 + 051780 1334 41 04 2 344876036 03 1482 + 051781 1334 41 05 2 344876036 04 1482 + 051782 1334 41 06 2 344876036 05 1482 + 051783 1334 41 07 2 344876036 06 1482 + 051784 1334 41 08 2 344876036 07 1482 + 051785 1334 42 01 2 344876036 08 1482 + 051786 1334 42 02 2 344876036 09 1482 + 051787 1334 42 03 2 344876036 10 1482 + 051788 1334 42 04 2 344876036 11 1482 + 051789 1334 42 05 2 344876036 12 1482 + 051790 1334 42 06 2 344876036 13 1482 + 051791 1334 42 07 2 344876036 14 1482 + 051792 1334 42 08 2 344876036 15 1482 + 051793 1334 43 01 2 344877060 00 1483 + 051794 1334 43 02 2 344877060 01 1483 + 051795 1334 43 03 2 344877060 02 1483 + 051796 1334 43 04 2 344877060 03 1483 + 051797 1334 43 05 2 344877060 04 1483 + 051798 1334 43 06 2 344877060 05 1483 + 051799 1334 43 07 2 344877060 06 1483 + 051800 1334 43 08 2 344877060 07 1483 + 051801 1334 44 01 2 344877060 08 1483 + 051802 1334 44 02 2 344877060 09 1483 + 051803 1334 44 03 2 344877060 10 1483 + 051804 1334 44 04 2 344877060 11 1483 + 051805 1334 44 05 2 344877060 12 1483 + 051806 1334 44 06 2 344877060 13 1483 + 051807 1334 44 07 2 344877060 14 1483 + 051808 1334 44 08 2 344877060 15 1483 + 051809 1334 45 01 2 344765444 00 1428 + 051810 1334 45 02 2 344765444 01 1428 + 051811 1334 45 03 2 344765444 02 1428 + 051812 1334 45 04 2 344765444 03 1428 + 051813 1334 45 05 2 344765444 04 1428 + 051814 1334 45 06 2 344765444 05 1428 + 051815 1334 45 07 2 344765444 06 1428 + 051816 1334 45 08 2 344765444 07 1428 + 051817 1334 46 01 2 344765444 08 1428 + 051818 1334 46 02 2 344765444 09 1428 + 051819 1334 46 03 2 344765444 10 1428 + 051820 1334 46 04 2 344765444 11 1428 + 051821 1334 46 05 2 344765444 12 1428 + 051822 1334 46 06 2 344765444 13 1428 + 051823 1334 46 07 2 344765444 14 1428 + 051824 1334 46 08 2 344765444 15 1428 + 051825 1334 47 01 2 344766468 00 1429 + 051826 1334 47 02 2 344766468 01 1429 + 051827 1334 47 03 2 344766468 02 1429 + 051828 1334 47 04 2 344766468 03 1429 + 051829 1334 47 05 2 344766468 04 1429 + 051830 1334 47 06 2 344766468 05 1429 + 051831 1334 47 07 2 344766468 06 1429 + 051832 1334 47 08 2 344766468 07 1429 + 051833 1334 48 01 2 344766468 08 1429 + 051834 1334 48 02 2 344766468 09 1429 + 051835 1334 48 03 2 344766468 10 1429 + 051836 1334 48 04 2 344766468 11 1429 + 051837 1334 48 05 2 344766468 12 1429 + 051838 1334 48 06 2 344766468 13 1429 + 051839 1334 48 07 2 344766468 14 1429 + 051840 1334 48 08 2 344766468 15 1429 + 051841 1335 01 01 2 344355844 00 1260 + 051842 1335 01 02 2 344355844 01 1260 + 051843 1335 01 03 2 344355844 02 1260 + 051844 1335 01 04 2 344355844 03 1260 + 051845 1335 01 05 2 344355844 04 1260 + 051846 1335 01 06 2 344355844 05 1260 + 051847 1335 01 07 2 344355844 06 1260 + 051848 1335 01 08 2 344355844 07 1260 + 051849 1335 02 01 2 344355844 08 1260 + 051850 1335 02 02 2 344355844 09 1260 + 051851 1335 02 03 2 344355844 10 1260 + 051852 1335 02 04 2 344355844 11 1260 + 051853 1335 02 05 2 344355844 12 1260 + 051854 1335 02 06 2 344355844 13 1260 + 051855 1335 02 07 2 344355844 14 1260 + 051856 1335 02 08 2 344355844 15 1260 + 051857 1335 03 01 2 344356868 00 1261 + 051858 1335 03 02 2 344356868 01 1261 + 051859 1335 03 03 2 344356868 02 1261 + 051860 1335 03 04 2 344356868 03 1261 + 051861 1335 03 05 2 344356868 04 1261 + 051862 1335 03 06 2 344356868 05 1261 + 051863 1335 03 07 2 344356868 06 1261 + 051864 1335 03 08 2 344356868 07 1261 + 051865 1335 04 01 2 344356868 08 1261 + 051866 1335 04 02 2 344356868 09 1261 + 051867 1335 04 03 2 344356868 10 1261 + 051868 1335 04 04 2 344356868 11 1261 + 051869 1335 04 05 2 344356868 12 1261 + 051870 1335 04 06 2 344356868 13 1261 + 051871 1335 04 07 2 344356868 14 1261 + 051872 1335 04 08 2 344356868 15 1261 + 051873 1335 05 01 2 344245252 00 1206 + 051874 1335 05 02 2 344245252 01 1206 + 051875 1335 05 03 2 344245252 02 1206 + 051876 1335 05 04 2 344245252 03 1206 + 051877 1335 05 05 2 344245252 04 1206 + 051878 1335 05 06 2 344245252 05 1206 + 051879 1335 05 07 2 344245252 06 1206 + 051880 1335 05 08 2 344245252 07 1206 + 051881 1335 06 01 2 344245252 08 1206 + 051882 1335 06 02 2 344245252 09 1206 + 051883 1335 06 03 2 344245252 10 1206 + 051884 1335 06 04 2 344245252 11 1206 + 051885 1335 06 05 2 344245252 12 1206 + 051886 1335 06 06 2 344245252 13 1206 + 051887 1335 06 07 2 344245252 14 1206 + 051888 1335 06 08 2 344245252 15 1206 + 051889 1335 07 01 2 344246276 00 1207 + 051890 1335 07 02 2 344246276 01 1207 + 051891 1335 07 03 2 344246276 02 1207 + 051892 1335 07 04 2 344246276 03 1207 + 051893 1335 07 05 2 344246276 04 1207 + 051894 1335 07 06 2 344246276 05 1207 + 051895 1335 07 07 2 344246276 06 1207 + 051896 1335 07 08 2 344246276 07 1207 + 051897 1335 08 01 2 344246276 08 1207 + 051898 1335 08 02 2 344246276 09 1207 + 051899 1335 08 03 2 344246276 10 1207 + 051900 1335 08 04 2 344246276 11 1207 + 051901 1335 08 05 2 344246276 12 1207 + 051902 1335 08 06 2 344246276 13 1207 + 051903 1335 08 07 2 344246276 14 1207 + 051904 1335 08 08 2 344246276 15 1207 + 051905 1335 09 01 2 344617988 00 1372 + 051906 1335 09 02 2 344617988 01 1372 + 051907 1335 09 03 2 344617988 02 1372 + 051908 1335 09 04 2 344617988 03 1372 + 051909 1335 09 05 2 344617988 04 1372 + 051910 1335 09 06 2 344617988 05 1372 + 051911 1335 09 07 2 344617988 06 1372 + 051912 1335 09 08 2 344617988 07 1372 + 051913 1335 10 01 2 344617988 08 1372 + 051914 1335 10 02 2 344617988 09 1372 + 051915 1335 10 03 2 344617988 10 1372 + 051916 1335 10 04 2 344617988 11 1372 + 051917 1335 10 05 2 344617988 12 1372 + 051918 1335 10 06 2 344617988 13 1372 + 051919 1335 10 07 2 344617988 14 1372 + 051920 1335 10 08 2 344617988 15 1372 + 051921 1335 11 01 2 344619012 00 1373 + 051922 1335 11 02 2 344619012 01 1373 + 051923 1335 11 03 2 344619012 02 1373 + 051924 1335 11 04 2 344619012 03 1373 + 051925 1335 11 05 2 344619012 04 1373 + 051926 1335 11 06 2 344619012 05 1373 + 051927 1335 11 07 2 344619012 06 1373 + 051928 1335 11 08 2 344619012 07 1373 + 051929 1335 12 01 2 344619012 08 1373 + 051930 1335 12 02 2 344619012 09 1373 + 051931 1335 12 03 2 344619012 10 1373 + 051932 1335 12 04 2 344619012 11 1373 + 051933 1335 12 05 2 344619012 12 1373 + 051934 1335 12 06 2 344619012 13 1373 + 051935 1335 12 07 2 344619012 14 1373 + 051936 1335 12 08 2 344619012 15 1373 + 051937 1335 13 01 2 344507396 00 1318 + 051938 1335 13 02 2 344507396 01 1318 + 051939 1335 13 03 2 344507396 02 1318 + 051940 1335 13 04 2 344507396 03 1318 + 051941 1335 13 05 2 344507396 04 1318 + 051942 1335 13 06 2 344507396 05 1318 + 051943 1335 13 07 2 344507396 06 1318 + 051944 1335 13 08 2 344507396 07 1318 + 051945 1335 14 01 2 344507396 08 1318 + 051946 1335 14 02 2 344507396 09 1318 + 051947 1335 14 03 2 344507396 10 1318 + 051948 1335 14 04 2 344507396 11 1318 + 051949 1335 14 05 2 344507396 12 1318 + 051950 1335 14 06 2 344507396 13 1318 + 051951 1335 14 07 2 344507396 14 1318 + 051952 1335 14 08 2 344507396 15 1318 + 051953 1335 15 01 2 344508420 00 1319 + 051954 1335 15 02 2 344508420 01 1319 + 051955 1335 15 03 2 344508420 02 1319 + 051956 1335 15 04 2 344508420 03 1319 + 051957 1335 15 05 2 344508420 04 1319 + 051958 1335 15 06 2 344508420 05 1319 + 051959 1335 15 07 2 344508420 06 1319 + 051960 1335 15 08 2 344508420 07 1319 + 051961 1335 16 01 2 344508420 08 1319 + 051962 1335 16 02 2 344508420 09 1319 + 051963 1335 16 03 2 344508420 10 1319 + 051964 1335 16 04 2 344508420 11 1319 + 051965 1335 16 05 2 344508420 12 1319 + 051966 1335 16 06 2 344508420 13 1319 + 051967 1335 16 07 2 344508420 14 1319 + 051968 1335 16 08 2 344508420 15 1319 + 051969 1335 17 01 2 344880132 00 1484 + 051970 1335 17 02 2 344880132 01 1484 + 051971 1335 17 03 2 344880132 02 1484 + 051972 1335 17 04 2 344880132 03 1484 + 051973 1335 17 05 2 344880132 04 1484 + 051974 1335 17 06 2 344880132 05 1484 + 051975 1335 17 07 2 344880132 06 1484 + 051976 1335 17 08 2 344880132 07 1484 + 051977 1335 18 01 2 344880132 08 1484 + 051978 1335 18 02 2 344880132 09 1484 + 051979 1335 18 03 2 344880132 10 1484 + 051980 1335 18 04 2 344880132 11 1484 + 051981 1335 18 05 2 344880132 12 1484 + 051982 1335 18 06 2 344880132 13 1484 + 051983 1335 18 07 2 344880132 14 1484 + 051984 1335 18 08 2 344880132 15 1484 + 051985 1335 19 01 2 344881156 00 1485 + 051986 1335 19 02 2 344881156 01 1485 + 051987 1335 19 03 2 344881156 02 1485 + 051988 1335 19 04 2 344881156 03 1485 + 051989 1335 19 05 2 344881156 04 1485 + 051990 1335 19 06 2 344881156 05 1485 + 051991 1335 19 07 2 344881156 06 1485 + 051992 1335 19 08 2 344881156 07 1485 + 051993 1335 20 01 2 344881156 08 1485 + 051994 1335 20 02 2 344881156 09 1485 + 051995 1335 20 03 2 344881156 10 1485 + 051996 1335 20 04 2 344881156 11 1485 + 051997 1335 20 05 2 344881156 12 1485 + 051998 1335 20 06 2 344881156 13 1485 + 051999 1335 20 07 2 344881156 14 1485 + 052000 1335 20 08 2 344881156 15 1485 + 052001 1335 21 01 2 344769540 00 1430 + 052002 1335 21 02 2 344769540 01 1430 + 052003 1335 21 03 2 344769540 02 1430 + 052004 1335 21 04 2 344769540 03 1430 + 052005 1335 21 05 2 344769540 04 1430 + 052006 1335 21 06 2 344769540 05 1430 + 052007 1335 21 07 2 344769540 06 1430 + 052008 1335 21 08 2 344769540 07 1430 + 052009 1335 22 01 2 344769540 08 1430 + 052010 1335 22 02 2 344769540 09 1430 + 052011 1335 22 03 2 344769540 10 1430 + 052012 1335 22 04 2 344769540 11 1430 + 052013 1335 22 05 2 344769540 12 1430 + 052014 1335 22 06 2 344769540 13 1430 + 052015 1335 22 07 2 344769540 14 1430 + 052016 1335 22 08 2 344769540 15 1430 + 052017 1335 23 01 2 344770564 00 1431 + 052018 1335 23 02 2 344770564 01 1431 + 052019 1335 23 03 2 344770564 02 1431 + 052020 1335 23 04 2 344770564 03 1431 + 052021 1335 23 05 2 344770564 04 1431 + 052022 1335 23 06 2 344770564 05 1431 + 052023 1335 23 07 2 344770564 06 1431 + 052024 1335 23 08 2 344770564 07 1431 + 052025 1335 24 01 2 344770564 08 1431 + 052026 1335 24 02 2 344770564 09 1431 + 052027 1335 24 03 2 344770564 10 1431 + 052028 1335 24 04 2 344770564 11 1431 + 052029 1335 24 05 2 344770564 12 1431 + 052030 1335 24 06 2 344770564 13 1431 + 052031 1335 24 07 2 344770564 14 1431 + 052032 1335 24 08 2 344770564 15 1431 + 052033 1335 25 01 2 344249348 00 1208 + 052034 1335 25 02 2 344249348 01 1208 + 052035 1335 25 03 2 344249348 02 1208 + 052036 1335 25 04 2 344249348 03 1208 + 052037 1335 25 05 2 344249348 04 1208 + 052038 1335 25 06 2 344249348 05 1208 + 052039 1335 25 07 2 344249348 06 1208 + 052040 1335 25 08 2 344249348 07 1208 + 052041 1335 26 01 2 344249348 08 1208 + 052042 1335 26 02 2 344249348 09 1208 + 052043 1335 26 03 2 344249348 10 1208 + 052044 1335 26 04 2 344249348 11 1208 + 052045 1335 26 05 2 344249348 12 1208 + 052046 1335 26 06 2 344249348 13 1208 + 052047 1335 26 07 2 344249348 14 1208 + 052048 1335 26 08 2 344249348 15 1208 + 052049 1335 27 01 2 344250372 00 1209 + 052050 1335 27 02 2 344250372 01 1209 + 052051 1335 27 03 2 344250372 02 1209 + 052052 1335 27 04 2 344250372 03 1209 + 052053 1335 27 05 2 344250372 04 1209 + 052054 1335 27 06 2 344250372 05 1209 + 052055 1335 27 07 2 344250372 06 1209 + 052056 1335 27 08 2 344250372 07 1209 + 052057 1335 28 01 2 344250372 08 1209 + 052058 1335 28 02 2 344250372 09 1209 + 052059 1335 28 03 2 344250372 10 1209 + 052060 1335 28 04 2 344250372 11 1209 + 052061 1335 28 05 2 344250372 12 1209 + 052062 1335 28 06 2 344250372 13 1209 + 052063 1335 28 07 2 344250372 14 1209 + 052064 1335 28 08 2 344250372 15 1209 + 052065 1335 29 01 2 344359940 00 1262 + 052066 1335 29 02 2 344359940 01 1262 + 052067 1335 29 03 2 344359940 02 1262 + 052068 1335 29 04 2 344359940 03 1262 + 052069 1335 29 05 2 344359940 04 1262 + 052070 1335 29 06 2 344359940 05 1262 + 052071 1335 29 07 2 344359940 06 1262 + 052072 1335 29 08 2 344359940 07 1262 + 052073 1335 30 01 2 344359940 08 1262 + 052074 1335 30 02 2 344359940 09 1262 + 052075 1335 30 03 2 344359940 10 1262 + 052076 1335 30 04 2 344359940 11 1262 + 052077 1335 30 05 2 344359940 12 1262 + 052078 1335 30 06 2 344359940 13 1262 + 052079 1335 30 07 2 344359940 14 1262 + 052080 1335 30 08 2 344359940 15 1262 + 052081 1335 31 01 2 344360964 00 1263 + 052082 1335 31 02 2 344360964 01 1263 + 052083 1335 31 03 2 344360964 02 1263 + 052084 1335 31 04 2 344360964 03 1263 + 052085 1335 31 05 2 344360964 04 1263 + 052086 1335 31 06 2 344360964 05 1263 + 052087 1335 31 07 2 344360964 06 1263 + 052088 1335 31 08 2 344360964 07 1263 + 052089 1335 32 01 2 344360964 08 1263 + 052090 1335 32 02 2 344360964 09 1263 + 052091 1335 32 03 2 344360964 10 1263 + 052092 1335 32 04 2 344360964 11 1263 + 052093 1335 32 05 2 344360964 12 1263 + 052094 1335 32 06 2 344360964 13 1263 + 052095 1335 32 07 2 344360964 14 1263 + 052096 1335 32 08 2 344360964 15 1263 + 052097 1335 33 01 2 344511492 00 1320 + 052098 1335 33 02 2 344511492 01 1320 + 052099 1335 33 03 2 344511492 02 1320 + 052100 1335 33 04 2 344511492 03 1320 + 052101 1335 33 05 2 344511492 04 1320 + 052102 1335 33 06 2 344511492 05 1320 + 052103 1335 33 07 2 344511492 06 1320 + 052104 1335 33 08 2 344511492 07 1320 + 052105 1335 34 01 2 344511492 08 1320 + 052106 1335 34 02 2 344511492 09 1320 + 052107 1335 34 03 2 344511492 10 1320 + 052108 1335 34 04 2 344511492 11 1320 + 052109 1335 34 05 2 344511492 12 1320 + 052110 1335 34 06 2 344511492 13 1320 + 052111 1335 34 07 2 344511492 14 1320 + 052112 1335 34 08 2 344511492 15 1320 + 052113 1335 35 01 2 344512516 00 1321 + 052114 1335 35 02 2 344512516 01 1321 + 052115 1335 35 03 2 344512516 02 1321 + 052116 1335 35 04 2 344512516 03 1321 + 052117 1335 35 05 2 344512516 04 1321 + 052118 1335 35 06 2 344512516 05 1321 + 052119 1335 35 07 2 344512516 06 1321 + 052120 1335 35 08 2 344512516 07 1321 + 052121 1335 36 01 2 344512516 08 1321 + 052122 1335 36 02 2 344512516 09 1321 + 052123 1335 36 03 2 344512516 10 1321 + 052124 1335 36 04 2 344512516 11 1321 + 052125 1335 36 05 2 344512516 12 1321 + 052126 1335 36 06 2 344512516 13 1321 + 052127 1335 36 07 2 344512516 14 1321 + 052128 1335 36 08 2 344512516 15 1321 + 052129 1335 37 01 2 344622084 00 1374 + 052130 1335 37 02 2 344622084 01 1374 + 052131 1335 37 03 2 344622084 02 1374 + 052132 1335 37 04 2 344622084 03 1374 + 052133 1335 37 05 2 344622084 04 1374 + 052134 1335 37 06 2 344622084 05 1374 + 052135 1335 37 07 2 344622084 06 1374 + 052136 1335 37 08 2 344622084 07 1374 + 052137 1335 38 01 2 344622084 08 1374 + 052138 1335 38 02 2 344622084 09 1374 + 052139 1335 38 03 2 344622084 10 1374 + 052140 1335 38 04 2 344622084 11 1374 + 052141 1335 38 05 2 344622084 12 1374 + 052142 1335 38 06 2 344622084 13 1374 + 052143 1335 38 07 2 344622084 14 1374 + 052144 1335 38 08 2 344622084 15 1374 + 052145 1335 39 01 2 344623108 00 1375 + 052146 1335 39 02 2 344623108 01 1375 + 052147 1335 39 03 2 344623108 02 1375 + 052148 1335 39 04 2 344623108 03 1375 + 052149 1335 39 05 2 344623108 04 1375 + 052150 1335 39 06 2 344623108 05 1375 + 052151 1335 39 07 2 344623108 06 1375 + 052152 1335 39 08 2 344623108 07 1375 + 052153 1335 40 01 2 344623108 08 1375 + 052154 1335 40 02 2 344623108 09 1375 + 052155 1335 40 03 2 344623108 10 1375 + 052156 1335 40 04 2 344623108 11 1375 + 052157 1335 40 05 2 344623108 12 1375 + 052158 1335 40 06 2 344623108 13 1375 + 052159 1335 40 07 2 344623108 14 1375 + 052160 1335 40 08 2 344623108 15 1375 + 052161 1335 41 01 2 344773636 00 1432 + 052162 1335 41 02 2 344773636 01 1432 + 052163 1335 41 03 2 344773636 02 1432 + 052164 1335 41 04 2 344773636 03 1432 + 052165 1335 41 05 2 344773636 04 1432 + 052166 1335 41 06 2 344773636 05 1432 + 052167 1335 41 07 2 344773636 06 1432 + 052168 1335 41 08 2 344773636 07 1432 + 052169 1335 42 01 2 344773636 08 1432 + 052170 1335 42 02 2 344773636 09 1432 + 052171 1335 42 03 2 344773636 10 1432 + 052172 1335 42 04 2 344773636 11 1432 + 052173 1335 42 05 2 344773636 12 1432 + 052174 1335 42 06 2 344773636 13 1432 + 052175 1335 42 07 2 344773636 14 1432 + 052176 1335 42 08 2 344773636 15 1432 + 052177 1335 43 01 2 344774660 00 1433 + 052178 1335 43 02 2 344774660 01 1433 + 052179 1335 43 03 2 344774660 02 1433 + 052180 1335 43 04 2 344774660 03 1433 + 052181 1335 43 05 2 344774660 04 1433 + 052182 1335 43 06 2 344774660 05 1433 + 052183 1335 43 07 2 344774660 06 1433 + 052184 1335 43 08 2 344774660 07 1433 + 052185 1335 44 01 2 344774660 08 1433 + 052186 1335 44 02 2 344774660 09 1433 + 052187 1335 44 03 2 344774660 10 1433 + 052188 1335 44 04 2 344774660 11 1433 + 052189 1335 44 05 2 344774660 12 1433 + 052190 1335 44 06 2 344774660 13 1433 + 052191 1335 44 07 2 344774660 14 1433 + 052192 1335 44 08 2 344774660 15 1433 + 052193 1335 45 01 2 344884228 00 1486 + 052194 1335 45 02 2 344884228 01 1486 + 052195 1335 45 03 2 344884228 02 1486 + 052196 1335 45 04 2 344884228 03 1486 + 052197 1335 45 05 2 344884228 04 1486 + 052198 1335 45 06 2 344884228 05 1486 + 052199 1335 45 07 2 344884228 06 1486 + 052200 1335 45 08 2 344884228 07 1486 + 052201 1335 46 01 2 344884228 08 1486 + 052202 1335 46 02 2 344884228 09 1486 + 052203 1335 46 03 2 344884228 10 1486 + 052204 1335 46 04 2 344884228 11 1486 + 052205 1335 46 05 2 344884228 12 1486 + 052206 1335 46 06 2 344884228 13 1486 + 052207 1335 46 07 2 344884228 14 1486 + 052208 1335 46 08 2 344884228 15 1486 + 052209 1335 47 01 2 344885252 00 1487 + 052210 1335 47 02 2 344885252 01 1487 + 052211 1335 47 03 2 344885252 02 1487 + 052212 1335 47 04 2 344885252 03 1487 + 052213 1335 47 05 2 344885252 04 1487 + 052214 1335 47 06 2 344885252 05 1487 + 052215 1335 47 07 2 344885252 06 1487 + 052216 1335 47 08 2 344885252 07 1487 + 052217 1335 48 01 2 344885252 08 1487 + 052218 1335 48 02 2 344885252 09 1487 + 052219 1335 48 03 2 344885252 10 1487 + 052220 1335 48 04 2 344885252 11 1487 + 052221 1335 48 05 2 344885252 12 1487 + 052222 1335 48 06 2 344885252 13 1487 + 052223 1335 48 07 2 344885252 14 1487 + 052224 1335 48 08 2 344885252 15 1487 + 052225 1336 01 01 2 344368132 00 1266 + 052226 1336 01 02 2 344368132 01 1266 + 052227 1336 01 03 2 344368132 02 1266 + 052228 1336 01 04 2 344368132 03 1266 + 052229 1336 01 05 2 344368132 04 1266 + 052230 1336 01 06 2 344368132 05 1266 + 052231 1336 01 07 2 344368132 06 1266 + 052232 1336 01 08 2 344368132 07 1266 + 052233 1336 02 01 2 344368132 08 1266 + 052234 1336 02 02 2 344368132 09 1266 + 052235 1336 02 03 2 344368132 10 1266 + 052236 1336 02 04 2 344368132 11 1266 + 052237 1336 02 05 2 344368132 12 1266 + 052238 1336 02 06 2 344368132 13 1266 + 052239 1336 02 07 2 344368132 14 1266 + 052240 1336 02 08 2 344368132 15 1266 + 052241 1336 03 01 2 344369156 00 1267 + 052242 1336 03 02 2 344369156 01 1267 + 052243 1336 03 03 2 344369156 02 1267 + 052244 1336 03 04 2 344369156 03 1267 + 052245 1336 03 05 2 344369156 04 1267 + 052246 1336 03 06 2 344369156 05 1267 + 052247 1336 03 07 2 344369156 06 1267 + 052248 1336 03 08 2 344369156 07 1267 + 052249 1336 04 01 2 344369156 08 1267 + 052250 1336 04 02 2 344369156 09 1267 + 052251 1336 04 03 2 344369156 10 1267 + 052252 1336 04 04 2 344369156 11 1267 + 052253 1336 04 05 2 344369156 12 1267 + 052254 1336 04 06 2 344369156 13 1267 + 052255 1336 04 07 2 344369156 14 1267 + 052256 1336 04 08 2 344369156 15 1267 + 052257 1336 05 01 2 344364036 00 1264 + 052258 1336 05 02 2 344364036 01 1264 + 052259 1336 05 03 2 344364036 02 1264 + 052260 1336 05 04 2 344364036 03 1264 + 052261 1336 05 05 2 344364036 04 1264 + 052262 1336 05 06 2 344364036 05 1264 + 052263 1336 05 07 2 344364036 06 1264 + 052264 1336 05 08 2 344364036 07 1264 + 052265 1336 06 01 2 344364036 08 1264 + 052266 1336 06 02 2 344364036 09 1264 + 052267 1336 06 03 2 344364036 10 1264 + 052268 1336 06 04 2 344364036 11 1264 + 052269 1336 06 05 2 344364036 12 1264 + 052270 1336 06 06 2 344364036 13 1264 + 052271 1336 06 07 2 344364036 14 1264 + 052272 1336 06 08 2 344364036 15 1264 + 052273 1336 07 01 2 344365060 00 1265 + 052274 1336 07 02 2 344365060 01 1265 + 052275 1336 07 03 2 344365060 02 1265 + 052276 1336 07 04 2 344365060 03 1265 + 052277 1336 07 05 2 344365060 04 1265 + 052278 1336 07 06 2 344365060 05 1265 + 052279 1336 07 07 2 344365060 06 1265 + 052280 1336 07 08 2 344365060 07 1265 + 052281 1336 08 01 2 344365060 08 1265 + 052282 1336 08 02 2 344365060 09 1265 + 052283 1336 08 03 2 344365060 10 1265 + 052284 1336 08 04 2 344365060 11 1265 + 052285 1336 08 05 2 344365060 12 1265 + 052286 1336 08 06 2 344365060 13 1265 + 052287 1336 08 07 2 344365060 14 1265 + 052288 1336 08 08 2 344365060 15 1265 + 052289 1336 09 01 2 344630276 00 1378 + 052290 1336 09 02 2 344630276 01 1378 + 052291 1336 09 03 2 344630276 02 1378 + 052292 1336 09 04 2 344630276 03 1378 + 052293 1336 09 05 2 344630276 04 1378 + 052294 1336 09 06 2 344630276 05 1378 + 052295 1336 09 07 2 344630276 06 1378 + 052296 1336 09 08 2 344630276 07 1378 + 052297 1336 10 01 2 344630276 08 1378 + 052298 1336 10 02 2 344630276 09 1378 + 052299 1336 10 03 2 344630276 10 1378 + 052300 1336 10 04 2 344630276 11 1378 + 052301 1336 10 05 2 344630276 12 1378 + 052302 1336 10 06 2 344630276 13 1378 + 052303 1336 10 07 2 344630276 14 1378 + 052304 1336 10 08 2 344630276 15 1378 + 052305 1336 11 01 2 344631300 00 1379 + 052306 1336 11 02 2 344631300 01 1379 + 052307 1336 11 03 2 344631300 02 1379 + 052308 1336 11 04 2 344631300 03 1379 + 052309 1336 11 05 2 344631300 04 1379 + 052310 1336 11 06 2 344631300 05 1379 + 052311 1336 11 07 2 344631300 06 1379 + 052312 1336 11 08 2 344631300 07 1379 + 052313 1336 12 01 2 344631300 08 1379 + 052314 1336 12 02 2 344631300 09 1379 + 052315 1336 12 03 2 344631300 10 1379 + 052316 1336 12 04 2 344631300 11 1379 + 052317 1336 12 05 2 344631300 12 1379 + 052318 1336 12 06 2 344631300 13 1379 + 052319 1336 12 07 2 344631300 14 1379 + 052320 1336 12 08 2 344631300 15 1379 + 052321 1336 13 01 2 344626180 00 1376 + 052322 1336 13 02 2 344626180 01 1376 + 052323 1336 13 03 2 344626180 02 1376 + 052324 1336 13 04 2 344626180 03 1376 + 052325 1336 13 05 2 344626180 04 1376 + 052326 1336 13 06 2 344626180 05 1376 + 052327 1336 13 07 2 344626180 06 1376 + 052328 1336 13 08 2 344626180 07 1376 + 052329 1336 14 01 2 344626180 08 1376 + 052330 1336 14 02 2 344626180 09 1376 + 052331 1336 14 03 2 344626180 10 1376 + 052332 1336 14 04 2 344626180 11 1376 + 052333 1336 14 05 2 344626180 12 1376 + 052334 1336 14 06 2 344626180 13 1376 + 052335 1336 14 07 2 344626180 14 1376 + 052336 1336 14 08 2 344626180 15 1376 + 052337 1336 15 01 2 344627204 00 1377 + 052338 1336 15 02 2 344627204 01 1377 + 052339 1336 15 03 2 344627204 02 1377 + 052340 1336 15 04 2 344627204 03 1377 + 052341 1336 15 05 2 344627204 04 1377 + 052342 1336 15 06 2 344627204 05 1377 + 052343 1336 15 07 2 344627204 06 1377 + 052344 1336 15 08 2 344627204 07 1377 + 052345 1336 16 01 2 344627204 08 1377 + 052346 1336 16 02 2 344627204 09 1377 + 052347 1336 16 03 2 344627204 10 1377 + 052348 1336 16 04 2 344627204 11 1377 + 052349 1336 16 05 2 344627204 12 1377 + 052350 1336 16 06 2 344627204 13 1377 + 052351 1336 16 07 2 344627204 14 1377 + 052352 1336 16 08 2 344627204 15 1377 + 052353 1336 17 01 2 344892420 00 1490 + 052354 1336 17 02 2 344892420 01 1490 + 052355 1336 17 03 2 344892420 02 1490 + 052356 1336 17 04 2 344892420 03 1490 + 052357 1336 17 05 2 344892420 04 1490 + 052358 1336 17 06 2 344892420 05 1490 + 052359 1336 17 07 2 344892420 06 1490 + 052360 1336 17 08 2 344892420 07 1490 + 052361 1336 18 01 2 344892420 08 1490 + 052362 1336 18 02 2 344892420 09 1490 + 052363 1336 18 03 2 344892420 10 1490 + 052364 1336 18 04 2 344892420 11 1490 + 052365 1336 18 05 2 344892420 12 1490 + 052366 1336 18 06 2 344892420 13 1490 + 052367 1336 18 07 2 344892420 14 1490 + 052368 1336 18 08 2 344892420 15 1490 + 052369 1336 19 01 2 344893444 00 1491 + 052370 1336 19 02 2 344893444 01 1491 + 052371 1336 19 03 2 344893444 02 1491 + 052372 1336 19 04 2 344893444 03 1491 + 052373 1336 19 05 2 344893444 04 1491 + 052374 1336 19 06 2 344893444 05 1491 + 052375 1336 19 07 2 344893444 06 1491 + 052376 1336 19 08 2 344893444 07 1491 + 052377 1336 20 01 2 344893444 08 1491 + 052378 1336 20 02 2 344893444 09 1491 + 052379 1336 20 03 2 344893444 10 1491 + 052380 1336 20 04 2 344893444 11 1491 + 052381 1336 20 05 2 344893444 12 1491 + 052382 1336 20 06 2 344893444 13 1491 + 052383 1336 20 07 2 344893444 14 1491 + 052384 1336 20 08 2 344893444 15 1491 + 052385 1336 21 01 2 344888324 00 1488 + 052386 1336 21 02 2 344888324 01 1488 + 052387 1336 21 03 2 344888324 02 1488 + 052388 1336 21 04 2 344888324 03 1488 + 052389 1336 21 05 2 344888324 04 1488 + 052390 1336 21 06 2 344888324 05 1488 + 052391 1336 21 07 2 344888324 06 1488 + 052392 1336 21 08 2 344888324 07 1488 + 052393 1336 22 01 2 344888324 08 1488 + 052394 1336 22 02 2 344888324 09 1488 + 052395 1336 22 03 2 344888324 10 1488 + 052396 1336 22 04 2 344888324 11 1488 + 052397 1336 22 05 2 344888324 12 1488 + 052398 1336 22 06 2 344888324 13 1488 + 052399 1336 22 07 2 344888324 14 1488 + 052400 1336 22 08 2 344888324 15 1488 + 052401 1336 23 01 2 344889348 00 1489 + 052402 1336 23 02 2 344889348 01 1489 + 052403 1336 23 03 2 344889348 02 1489 + 052404 1336 23 04 2 344889348 03 1489 + 052405 1336 23 05 2 344889348 04 1489 + 052406 1336 23 06 2 344889348 05 1489 + 052407 1336 23 07 2 344889348 06 1489 + 052408 1336 23 08 2 344889348 07 1489 + 052409 1336 24 01 2 344889348 08 1489 + 052410 1336 24 02 2 344889348 09 1489 + 052411 1336 24 03 2 344889348 10 1489 + 052412 1336 24 04 2 344889348 11 1489 + 052413 1336 24 05 2 344889348 12 1489 + 052414 1336 24 06 2 344889348 13 1489 + 052415 1336 24 07 2 344889348 14 1489 + 052416 1336 24 08 2 344889348 15 1489 + 052417 1336 25 01 2 344253444 00 1210 + 052418 1336 25 02 2 344253444 01 1210 + 052419 1336 25 03 2 344253444 02 1210 + 052420 1336 25 04 2 344253444 03 1210 + 052421 1336 25 05 2 344253444 04 1210 + 052422 1336 25 06 2 344253444 05 1210 + 052423 1336 25 07 2 344253444 06 1210 + 052424 1336 25 08 2 344253444 07 1210 + 052425 1336 26 01 2 344253444 08 1210 + 052426 1336 26 02 2 344253444 09 1210 + 052427 1336 26 03 2 344253444 10 1210 + 052428 1336 26 04 2 344253444 11 1210 + 052429 1336 26 05 2 344253444 12 1210 + 052430 1336 26 06 2 344253444 13 1210 + 052431 1336 26 07 2 344253444 14 1210 + 052432 1336 26 08 2 344253444 15 1210 + 052433 1336 27 01 2 344254468 00 1211 + 052434 1336 27 02 2 344254468 01 1211 + 052435 1336 27 03 2 344254468 02 1211 + 052436 1336 27 04 2 344254468 03 1211 + 052437 1336 27 05 2 344254468 04 1211 + 052438 1336 27 06 2 344254468 05 1211 + 052439 1336 27 07 2 344254468 06 1211 + 052440 1336 27 08 2 344254468 07 1211 + 052441 1336 28 01 2 344254468 08 1211 + 052442 1336 28 02 2 344254468 09 1211 + 052443 1336 28 03 2 344254468 10 1211 + 052444 1336 28 04 2 344254468 11 1211 + 052445 1336 28 05 2 344254468 12 1211 + 052446 1336 28 06 2 344254468 13 1211 + 052447 1336 28 07 2 344254468 14 1211 + 052448 1336 28 08 2 344254468 15 1211 + 052449 1336 29 01 2 344372228 00 1268 + 052450 1336 29 02 2 344372228 01 1268 + 052451 1336 29 03 2 344372228 02 1268 + 052452 1336 29 04 2 344372228 03 1268 + 052453 1336 29 05 2 344372228 04 1268 + 052454 1336 29 06 2 344372228 05 1268 + 052455 1336 29 07 2 344372228 06 1268 + 052456 1336 29 08 2 344372228 07 1268 + 052457 1336 30 01 2 344372228 08 1268 + 052458 1336 30 02 2 344372228 09 1268 + 052459 1336 30 03 2 344372228 10 1268 + 052460 1336 30 04 2 344372228 11 1268 + 052461 1336 30 05 2 344372228 12 1268 + 052462 1336 30 06 2 344372228 13 1268 + 052463 1336 30 07 2 344372228 14 1268 + 052464 1336 30 08 2 344372228 15 1268 + 052465 1336 31 01 2 344373252 00 1269 + 052466 1336 31 02 2 344373252 01 1269 + 052467 1336 31 03 2 344373252 02 1269 + 052468 1336 31 04 2 344373252 03 1269 + 052469 1336 31 05 2 344373252 04 1269 + 052470 1336 31 06 2 344373252 05 1269 + 052471 1336 31 07 2 344373252 06 1269 + 052472 1336 31 08 2 344373252 07 1269 + 052473 1336 32 01 2 344373252 08 1269 + 052474 1336 32 02 2 344373252 09 1269 + 052475 1336 32 03 2 344373252 10 1269 + 052476 1336 32 04 2 344373252 11 1269 + 052477 1336 32 05 2 344373252 12 1269 + 052478 1336 32 06 2 344373252 13 1269 + 052479 1336 32 07 2 344373252 14 1269 + 052480 1336 32 08 2 344373252 15 1269 + 052481 1336 33 01 2 344515588 00 1322 + 052482 1336 33 02 2 344515588 01 1322 + 052483 1336 33 03 2 344515588 02 1322 + 052484 1336 33 04 2 344515588 03 1322 + 052485 1336 33 05 2 344515588 04 1322 + 052486 1336 33 06 2 344515588 05 1322 + 052487 1336 33 07 2 344515588 06 1322 + 052488 1336 33 08 2 344515588 07 1322 + 052489 1336 34 01 2 344515588 08 1322 + 052490 1336 34 02 2 344515588 09 1322 + 052491 1336 34 03 2 344515588 10 1322 + 052492 1336 34 04 2 344515588 11 1322 + 052493 1336 34 05 2 344515588 12 1322 + 052494 1336 34 06 2 344515588 13 1322 + 052495 1336 34 07 2 344515588 14 1322 + 052496 1336 34 08 2 344515588 15 1322 + 052497 1336 35 01 2 344516612 00 1323 + 052498 1336 35 02 2 344516612 01 1323 + 052499 1336 35 03 2 344516612 02 1323 + 052500 1336 35 04 2 344516612 03 1323 + 052501 1336 35 05 2 344516612 04 1323 + 052502 1336 35 06 2 344516612 05 1323 + 052503 1336 35 07 2 344516612 06 1323 + 052504 1336 35 08 2 344516612 07 1323 + 052505 1336 36 01 2 344516612 08 1323 + 052506 1336 36 02 2 344516612 09 1323 + 052507 1336 36 03 2 344516612 10 1323 + 052508 1336 36 04 2 344516612 11 1323 + 052509 1336 36 05 2 344516612 12 1323 + 052510 1336 36 06 2 344516612 13 1323 + 052511 1336 36 07 2 344516612 14 1323 + 052512 1336 36 08 2 344516612 15 1323 + 052513 1336 37 01 2 344634372 00 1380 + 052514 1336 37 02 2 344634372 01 1380 + 052515 1336 37 03 2 344634372 02 1380 + 052516 1336 37 04 2 344634372 03 1380 + 052517 1336 37 05 2 344634372 04 1380 + 052518 1336 37 06 2 344634372 05 1380 + 052519 1336 37 07 2 344634372 06 1380 + 052520 1336 37 08 2 344634372 07 1380 + 052521 1336 38 01 2 344634372 08 1380 + 052522 1336 38 02 2 344634372 09 1380 + 052523 1336 38 03 2 344634372 10 1380 + 052524 1336 38 04 2 344634372 11 1380 + 052525 1336 38 05 2 344634372 12 1380 + 052526 1336 38 06 2 344634372 13 1380 + 052527 1336 38 07 2 344634372 14 1380 + 052528 1336 38 08 2 344634372 15 1380 + 052529 1336 39 01 2 344635396 00 1381 + 052530 1336 39 02 2 344635396 01 1381 + 052531 1336 39 03 2 344635396 02 1381 + 052532 1336 39 04 2 344635396 03 1381 + 052533 1336 39 05 2 344635396 04 1381 + 052534 1336 39 06 2 344635396 05 1381 + 052535 1336 39 07 2 344635396 06 1381 + 052536 1336 39 08 2 344635396 07 1381 + 052537 1336 40 01 2 344635396 08 1381 + 052538 1336 40 02 2 344635396 09 1381 + 052539 1336 40 03 2 344635396 10 1381 + 052540 1336 40 04 2 344635396 11 1381 + 052541 1336 40 05 2 344635396 12 1381 + 052542 1336 40 06 2 344635396 13 1381 + 052543 1336 40 07 2 344635396 14 1381 + 052544 1336 40 08 2 344635396 15 1381 + 052545 1336 41 01 2 344777732 00 1434 + 052546 1336 41 02 2 344777732 01 1434 + 052547 1336 41 03 2 344777732 02 1434 + 052548 1336 41 04 2 344777732 03 1434 + 052549 1336 41 05 2 344777732 04 1434 + 052550 1336 41 06 2 344777732 05 1434 + 052551 1336 41 07 2 344777732 06 1434 + 052552 1336 41 08 2 344777732 07 1434 + 052553 1336 42 01 2 344777732 08 1434 + 052554 1336 42 02 2 344777732 09 1434 + 052555 1336 42 03 2 344777732 10 1434 + 052556 1336 42 04 2 344777732 11 1434 + 052557 1336 42 05 2 344777732 12 1434 + 052558 1336 42 06 2 344777732 13 1434 + 052559 1336 42 07 2 344777732 14 1434 + 052560 1336 42 08 2 344777732 15 1434 + 052561 1336 43 01 2 344778756 00 1435 + 052562 1336 43 02 2 344778756 01 1435 + 052563 1336 43 03 2 344778756 02 1435 + 052564 1336 43 04 2 344778756 03 1435 + 052565 1336 43 05 2 344778756 04 1435 + 052566 1336 43 06 2 344778756 05 1435 + 052567 1336 43 07 2 344778756 06 1435 + 052568 1336 43 08 2 344778756 07 1435 + 052569 1336 44 01 2 344778756 08 1435 + 052570 1336 44 02 2 344778756 09 1435 + 052571 1336 44 03 2 344778756 10 1435 + 052572 1336 44 04 2 344778756 11 1435 + 052573 1336 44 05 2 344778756 12 1435 + 052574 1336 44 06 2 344778756 13 1435 + 052575 1336 44 07 2 344778756 14 1435 + 052576 1336 44 08 2 344778756 15 1435 + 052577 1336 45 01 2 344896516 00 1492 + 052578 1336 45 02 2 344896516 01 1492 + 052579 1336 45 03 2 344896516 02 1492 + 052580 1336 45 04 2 344896516 03 1492 + 052581 1336 45 05 2 344896516 04 1492 + 052582 1336 45 06 2 344896516 05 1492 + 052583 1336 45 07 2 344896516 06 1492 + 052584 1336 45 08 2 344896516 07 1492 + 052585 1336 46 01 2 344896516 08 1492 + 052586 1336 46 02 2 344896516 09 1492 + 052587 1336 46 03 2 344896516 10 1492 + 052588 1336 46 04 2 344896516 11 1492 + 052589 1336 46 05 2 344896516 12 1492 + 052590 1336 46 06 2 344896516 13 1492 + 052591 1336 46 07 2 344896516 14 1492 + 052592 1336 46 08 2 344896516 15 1492 + 052593 1336 47 01 2 344897540 00 1493 + 052594 1336 47 02 2 344897540 01 1493 + 052595 1336 47 03 2 344897540 02 1493 + 052596 1336 47 04 2 344897540 03 1493 + 052597 1336 47 05 2 344897540 04 1493 + 052598 1336 47 06 2 344897540 05 1493 + 052599 1336 47 07 2 344897540 06 1493 + 052600 1336 47 08 2 344897540 07 1493 + 052601 1336 48 01 2 344897540 08 1493 + 052602 1336 48 02 2 344897540 09 1493 + 052603 1336 48 03 2 344897540 10 1493 + 052604 1336 48 04 2 344897540 11 1493 + 052605 1336 48 05 2 344897540 12 1493 + 052606 1336 48 06 2 344897540 13 1493 + 052607 1336 48 07 2 344897540 14 1493 + 052608 1336 48 08 2 344897540 15 1493 + 052609 1337 01 01 2 344380420 00 1272 + 052610 1337 01 02 2 344380420 01 1272 + 052611 1337 01 03 2 344380420 02 1272 + 052612 1337 01 04 2 344380420 03 1272 + 052613 1337 01 05 2 344380420 04 1272 + 052614 1337 01 06 2 344380420 05 1272 + 052615 1337 01 07 2 344380420 06 1272 + 052616 1337 01 08 2 344380420 07 1272 + 052617 1337 02 01 2 344380420 08 1272 + 052618 1337 02 02 2 344380420 09 1272 + 052619 1337 02 03 2 344380420 10 1272 + 052620 1337 02 04 2 344380420 11 1272 + 052621 1337 02 05 2 344380420 12 1272 + 052622 1337 02 06 2 344380420 13 1272 + 052623 1337 02 07 2 344380420 14 1272 + 052624 1337 02 08 2 344380420 15 1272 + 052625 1337 03 01 2 344381444 00 1273 + 052626 1337 03 02 2 344381444 01 1273 + 052627 1337 03 03 2 344381444 02 1273 + 052628 1337 03 04 2 344381444 03 1273 + 052629 1337 03 05 2 344381444 04 1273 + 052630 1337 03 06 2 344381444 05 1273 + 052631 1337 03 07 2 344381444 06 1273 + 052632 1337 03 08 2 344381444 07 1273 + 052633 1337 04 01 2 344381444 08 1273 + 052634 1337 04 02 2 344381444 09 1273 + 052635 1337 04 03 2 344381444 10 1273 + 052636 1337 04 04 2 344381444 11 1273 + 052637 1337 04 05 2 344381444 12 1273 + 052638 1337 04 06 2 344381444 13 1273 + 052639 1337 04 07 2 344381444 14 1273 + 052640 1337 04 08 2 344381444 15 1273 + 052641 1337 05 01 2 344376324 00 1270 + 052642 1337 05 02 2 344376324 01 1270 + 052643 1337 05 03 2 344376324 02 1270 + 052644 1337 05 04 2 344376324 03 1270 + 052645 1337 05 05 2 344376324 04 1270 + 052646 1337 05 06 2 344376324 05 1270 + 052647 1337 05 07 2 344376324 06 1270 + 052648 1337 05 08 2 344376324 07 1270 + 052649 1337 06 01 2 344376324 08 1270 + 052650 1337 06 02 2 344376324 09 1270 + 052651 1337 06 03 2 344376324 10 1270 + 052652 1337 06 04 2 344376324 11 1270 + 052653 1337 06 05 2 344376324 12 1270 + 052654 1337 06 06 2 344376324 13 1270 + 052655 1337 06 07 2 344376324 14 1270 + 052656 1337 06 08 2 344376324 15 1270 + 052657 1337 07 01 2 344377348 00 1271 + 052658 1337 07 02 2 344377348 01 1271 + 052659 1337 07 03 2 344377348 02 1271 + 052660 1337 07 04 2 344377348 03 1271 + 052661 1337 07 05 2 344377348 04 1271 + 052662 1337 07 06 2 344377348 05 1271 + 052663 1337 07 07 2 344377348 06 1271 + 052664 1337 07 08 2 344377348 07 1271 + 052665 1337 08 01 2 344377348 08 1271 + 052666 1337 08 02 2 344377348 09 1271 + 052667 1337 08 03 2 344377348 10 1271 + 052668 1337 08 04 2 344377348 11 1271 + 052669 1337 08 05 2 344377348 12 1271 + 052670 1337 08 06 2 344377348 13 1271 + 052671 1337 08 07 2 344377348 14 1271 + 052672 1337 08 08 2 344377348 15 1271 + 052673 1337 09 01 2 344642564 00 1384 + 052674 1337 09 02 2 344642564 01 1384 + 052675 1337 09 03 2 344642564 02 1384 + 052676 1337 09 04 2 344642564 03 1384 + 052677 1337 09 05 2 344642564 04 1384 + 052678 1337 09 06 2 344642564 05 1384 + 052679 1337 09 07 2 344642564 06 1384 + 052680 1337 09 08 2 344642564 07 1384 + 052681 1337 10 01 2 344642564 08 1384 + 052682 1337 10 02 2 344642564 09 1384 + 052683 1337 10 03 2 344642564 10 1384 + 052684 1337 10 04 2 344642564 11 1384 + 052685 1337 10 05 2 344642564 12 1384 + 052686 1337 10 06 2 344642564 13 1384 + 052687 1337 10 07 2 344642564 14 1384 + 052688 1337 10 08 2 344642564 15 1384 + 052689 1337 11 01 2 344643588 00 1385 + 052690 1337 11 02 2 344643588 01 1385 + 052691 1337 11 03 2 344643588 02 1385 + 052692 1337 11 04 2 344643588 03 1385 + 052693 1337 11 05 2 344643588 04 1385 + 052694 1337 11 06 2 344643588 05 1385 + 052695 1337 11 07 2 344643588 06 1385 + 052696 1337 11 08 2 344643588 07 1385 + 052697 1337 12 01 2 344643588 08 1385 + 052698 1337 12 02 2 344643588 09 1385 + 052699 1337 12 03 2 344643588 10 1385 + 052700 1337 12 04 2 344643588 11 1385 + 052701 1337 12 05 2 344643588 12 1385 + 052702 1337 12 06 2 344643588 13 1385 + 052703 1337 12 07 2 344643588 14 1385 + 052704 1337 12 08 2 344643588 15 1385 + 052705 1337 13 01 2 344638468 00 1382 + 052706 1337 13 02 2 344638468 01 1382 + 052707 1337 13 03 2 344638468 02 1382 + 052708 1337 13 04 2 344638468 03 1382 + 052709 1337 13 05 2 344638468 04 1382 + 052710 1337 13 06 2 344638468 05 1382 + 052711 1337 13 07 2 344638468 06 1382 + 052712 1337 13 08 2 344638468 07 1382 + 052713 1337 14 01 2 344638468 08 1382 + 052714 1337 14 02 2 344638468 09 1382 + 052715 1337 14 03 2 344638468 10 1382 + 052716 1337 14 04 2 344638468 11 1382 + 052717 1337 14 05 2 344638468 12 1382 + 052718 1337 14 06 2 344638468 13 1382 + 052719 1337 14 07 2 344638468 14 1382 + 052720 1337 14 08 2 344638468 15 1382 + 052721 1337 15 01 2 344639492 00 1383 + 052722 1337 15 02 2 344639492 01 1383 + 052723 1337 15 03 2 344639492 02 1383 + 052724 1337 15 04 2 344639492 03 1383 + 052725 1337 15 05 2 344639492 04 1383 + 052726 1337 15 06 2 344639492 05 1383 + 052727 1337 15 07 2 344639492 06 1383 + 052728 1337 15 08 2 344639492 07 1383 + 052729 1337 16 01 2 344639492 08 1383 + 052730 1337 16 02 2 344639492 09 1383 + 052731 1337 16 03 2 344639492 10 1383 + 052732 1337 16 04 2 344639492 11 1383 + 052733 1337 16 05 2 344639492 12 1383 + 052734 1337 16 06 2 344639492 13 1383 + 052735 1337 16 07 2 344639492 14 1383 + 052736 1337 16 08 2 344639492 15 1383 + 052737 1337 17 01 2 344904708 00 1496 + 052738 1337 17 02 2 344904708 01 1496 + 052739 1337 17 03 2 344904708 02 1496 + 052740 1337 17 04 2 344904708 03 1496 + 052741 1337 17 05 2 344904708 04 1496 + 052742 1337 17 06 2 344904708 05 1496 + 052743 1337 17 07 2 344904708 06 1496 + 052744 1337 17 08 2 344904708 07 1496 + 052745 1337 18 01 2 344904708 08 1496 + 052746 1337 18 02 2 344904708 09 1496 + 052747 1337 18 03 2 344904708 10 1496 + 052748 1337 18 04 2 344904708 11 1496 + 052749 1337 18 05 2 344904708 12 1496 + 052750 1337 18 06 2 344904708 13 1496 + 052751 1337 18 07 2 344904708 14 1496 + 052752 1337 18 08 2 344904708 15 1496 + 052753 1337 19 01 2 344905732 00 1497 + 052754 1337 19 02 2 344905732 01 1497 + 052755 1337 19 03 2 344905732 02 1497 + 052756 1337 19 04 2 344905732 03 1497 + 052757 1337 19 05 2 344905732 04 1497 + 052758 1337 19 06 2 344905732 05 1497 + 052759 1337 19 07 2 344905732 06 1497 + 052760 1337 19 08 2 344905732 07 1497 + 052761 1337 20 01 2 344905732 08 1497 + 052762 1337 20 02 2 344905732 09 1497 + 052763 1337 20 03 2 344905732 10 1497 + 052764 1337 20 04 2 344905732 11 1497 + 052765 1337 20 05 2 344905732 12 1497 + 052766 1337 20 06 2 344905732 13 1497 + 052767 1337 20 07 2 344905732 14 1497 + 052768 1337 20 08 2 344905732 15 1497 + 052769 1337 21 01 2 344900612 00 1494 + 052770 1337 21 02 2 344900612 01 1494 + 052771 1337 21 03 2 344900612 02 1494 + 052772 1337 21 04 2 344900612 03 1494 + 052773 1337 21 05 2 344900612 04 1494 + 052774 1337 21 06 2 344900612 05 1494 + 052775 1337 21 07 2 344900612 06 1494 + 052776 1337 21 08 2 344900612 07 1494 + 052777 1337 22 01 2 344900612 08 1494 + 052778 1337 22 02 2 344900612 09 1494 + 052779 1337 22 03 2 344900612 10 1494 + 052780 1337 22 04 2 344900612 11 1494 + 052781 1337 22 05 2 344900612 12 1494 + 052782 1337 22 06 2 344900612 13 1494 + 052783 1337 22 07 2 344900612 14 1494 + 052784 1337 22 08 2 344900612 15 1494 + 052785 1337 23 01 2 344901636 00 1495 + 052786 1337 23 02 2 344901636 01 1495 + 052787 1337 23 03 2 344901636 02 1495 + 052788 1337 23 04 2 344901636 03 1495 + 052789 1337 23 05 2 344901636 04 1495 + 052790 1337 23 06 2 344901636 05 1495 + 052791 1337 23 07 2 344901636 06 1495 + 052792 1337 23 08 2 344901636 07 1495 + 052793 1337 24 01 2 344901636 08 1495 + 052794 1337 24 02 2 344901636 09 1495 + 052795 1337 24 03 2 344901636 10 1495 + 052796 1337 24 04 2 344901636 11 1495 + 052797 1337 24 05 2 344901636 12 1495 + 052798 1337 24 06 2 344901636 13 1495 + 052799 1337 24 07 2 344901636 14 1495 + 052800 1337 24 08 2 344901636 15 1495 + 052801 1337 25 01 2 344384516 00 1274 + 052802 1337 25 02 2 344384516 01 1274 + 052803 1337 25 03 2 344384516 02 1274 + 052804 1337 25 04 2 344384516 03 1274 + 052805 1337 25 05 2 344384516 04 1274 + 052806 1337 25 06 2 344384516 05 1274 + 052807 1337 25 07 2 344384516 06 1274 + 052808 1337 25 08 2 344384516 07 1274 + 052809 1337 26 01 2 344384516 08 1274 + 052810 1337 26 02 2 344384516 09 1274 + 052811 1337 26 03 2 344384516 10 1274 + 052812 1337 26 04 2 344384516 11 1274 + 052813 1337 26 05 2 344384516 12 1274 + 052814 1337 26 06 2 344384516 13 1274 + 052815 1337 26 07 2 344384516 14 1274 + 052816 1337 26 08 2 344384516 15 1274 + 052817 1337 27 01 2 344385540 00 1275 + 052818 1337 27 02 2 344385540 01 1275 + 052819 1337 27 03 2 344385540 02 1275 + 052820 1337 27 04 2 344385540 03 1275 + 052821 1337 27 05 2 344385540 04 1275 + 052822 1337 27 06 2 344385540 05 1275 + 052823 1337 27 07 2 344385540 06 1275 + 052824 1337 27 08 2 344385540 07 1275 + 052825 1337 28 01 2 344385540 08 1275 + 052826 1337 28 02 2 344385540 09 1275 + 052827 1337 28 03 2 344385540 10 1275 + 052828 1337 28 04 2 344385540 11 1275 + 052829 1337 28 05 2 344385540 12 1275 + 052830 1337 28 06 2 344385540 13 1275 + 052831 1337 28 07 2 344385540 14 1275 + 052832 1337 28 08 2 344385540 15 1275 + 052833 1337 29 01 2 344257540 00 1212 + 052834 1337 29 02 2 344257540 01 1212 + 052835 1337 29 03 2 344257540 02 1212 + 052836 1337 29 04 2 344257540 03 1212 + 052837 1337 29 05 2 344257540 04 1212 + 052838 1337 29 06 2 344257540 05 1212 + 052839 1337 29 07 2 344257540 06 1212 + 052840 1337 29 08 2 344257540 07 1212 + 052841 1337 30 01 2 344257540 08 1212 + 052842 1337 30 02 2 344257540 09 1212 + 052843 1337 30 03 2 344257540 10 1212 + 052844 1337 30 04 2 344257540 11 1212 + 052845 1337 30 05 2 344257540 12 1212 + 052846 1337 30 06 2 344257540 13 1212 + 052847 1337 30 07 2 344257540 14 1212 + 052848 1337 30 08 2 344257540 15 1212 + 052849 1337 31 01 2 344258564 00 1213 + 052850 1337 31 02 2 344258564 01 1213 + 052851 1337 31 03 2 344258564 02 1213 + 052852 1337 31 04 2 344258564 03 1213 + 052853 1337 31 05 2 344258564 04 1213 + 052854 1337 31 06 2 344258564 05 1213 + 052855 1337 31 07 2 344258564 06 1213 + 052856 1337 31 08 2 344258564 07 1213 + 052857 1337 32 01 2 344258564 08 1213 + 052858 1337 32 02 2 344258564 09 1213 + 052859 1337 32 03 2 344258564 10 1213 + 052860 1337 32 04 2 344258564 11 1213 + 052861 1337 32 05 2 344258564 12 1213 + 052862 1337 32 06 2 344258564 13 1213 + 052863 1337 32 07 2 344258564 14 1213 + 052864 1337 32 08 2 344258564 15 1213 + 052865 1337 33 01 2 344646660 00 1386 + 052866 1337 33 02 2 344646660 01 1386 + 052867 1337 33 03 2 344646660 02 1386 + 052868 1337 33 04 2 344646660 03 1386 + 052869 1337 33 05 2 344646660 04 1386 + 052870 1337 33 06 2 344646660 05 1386 + 052871 1337 33 07 2 344646660 06 1386 + 052872 1337 33 08 2 344646660 07 1386 + 052873 1337 34 01 2 344646660 08 1386 + 052874 1337 34 02 2 344646660 09 1386 + 052875 1337 34 03 2 344646660 10 1386 + 052876 1337 34 04 2 344646660 11 1386 + 052877 1337 34 05 2 344646660 12 1386 + 052878 1337 34 06 2 344646660 13 1386 + 052879 1337 34 07 2 344646660 14 1386 + 052880 1337 34 08 2 344646660 15 1386 + 052881 1337 35 01 2 344647684 00 1387 + 052882 1337 35 02 2 344647684 01 1387 + 052883 1337 35 03 2 344647684 02 1387 + 052884 1337 35 04 2 344647684 03 1387 + 052885 1337 35 05 2 344647684 04 1387 + 052886 1337 35 06 2 344647684 05 1387 + 052887 1337 35 07 2 344647684 06 1387 + 052888 1337 35 08 2 344647684 07 1387 + 052889 1337 36 01 2 344647684 08 1387 + 052890 1337 36 02 2 344647684 09 1387 + 052891 1337 36 03 2 344647684 10 1387 + 052892 1337 36 04 2 344647684 11 1387 + 052893 1337 36 05 2 344647684 12 1387 + 052894 1337 36 06 2 344647684 13 1387 + 052895 1337 36 07 2 344647684 14 1387 + 052896 1337 36 08 2 344647684 15 1387 + 052897 1337 37 01 2 344519684 00 1324 + 052898 1337 37 02 2 344519684 01 1324 + 052899 1337 37 03 2 344519684 02 1324 + 052900 1337 37 04 2 344519684 03 1324 + 052901 1337 37 05 2 344519684 04 1324 + 052902 1337 37 06 2 344519684 05 1324 + 052903 1337 37 07 2 344519684 06 1324 + 052904 1337 37 08 2 344519684 07 1324 + 052905 1337 38 01 2 344519684 08 1324 + 052906 1337 38 02 2 344519684 09 1324 + 052907 1337 38 03 2 344519684 10 1324 + 052908 1337 38 04 2 344519684 11 1324 + 052909 1337 38 05 2 344519684 12 1324 + 052910 1337 38 06 2 344519684 13 1324 + 052911 1337 38 07 2 344519684 14 1324 + 052912 1337 38 08 2 344519684 15 1324 + 052913 1337 39 01 2 344520708 00 1325 + 052914 1337 39 02 2 344520708 01 1325 + 052915 1337 39 03 2 344520708 02 1325 + 052916 1337 39 04 2 344520708 03 1325 + 052917 1337 39 05 2 344520708 04 1325 + 052918 1337 39 06 2 344520708 05 1325 + 052919 1337 39 07 2 344520708 06 1325 + 052920 1337 39 08 2 344520708 07 1325 + 052921 1337 40 01 2 344520708 08 1325 + 052922 1337 40 02 2 344520708 09 1325 + 052923 1337 40 03 2 344520708 10 1325 + 052924 1337 40 04 2 344520708 11 1325 + 052925 1337 40 05 2 344520708 12 1325 + 052926 1337 40 06 2 344520708 13 1325 + 052927 1337 40 07 2 344520708 14 1325 + 052928 1337 40 08 2 344520708 15 1325 + 052929 1337 41 01 2 344908804 00 1498 + 052930 1337 41 02 2 344908804 01 1498 + 052931 1337 41 03 2 344908804 02 1498 + 052932 1337 41 04 2 344908804 03 1498 + 052933 1337 41 05 2 344908804 04 1498 + 052934 1337 41 06 2 344908804 05 1498 + 052935 1337 41 07 2 344908804 06 1498 + 052936 1337 41 08 2 344908804 07 1498 + 052937 1337 42 01 2 344908804 08 1498 + 052938 1337 42 02 2 344908804 09 1498 + 052939 1337 42 03 2 344908804 10 1498 + 052940 1337 42 04 2 344908804 11 1498 + 052941 1337 42 05 2 344908804 12 1498 + 052942 1337 42 06 2 344908804 13 1498 + 052943 1337 42 07 2 344908804 14 1498 + 052944 1337 42 08 2 344908804 15 1498 + 052945 1337 43 01 2 344909828 00 1499 + 052946 1337 43 02 2 344909828 01 1499 + 052947 1337 43 03 2 344909828 02 1499 + 052948 1337 43 04 2 344909828 03 1499 + 052949 1337 43 05 2 344909828 04 1499 + 052950 1337 43 06 2 344909828 05 1499 + 052951 1337 43 07 2 344909828 06 1499 + 052952 1337 43 08 2 344909828 07 1499 + 052953 1337 44 01 2 344909828 08 1499 + 052954 1337 44 02 2 344909828 09 1499 + 052955 1337 44 03 2 344909828 10 1499 + 052956 1337 44 04 2 344909828 11 1499 + 052957 1337 44 05 2 344909828 12 1499 + 052958 1337 44 06 2 344909828 13 1499 + 052959 1337 44 07 2 344909828 14 1499 + 052960 1337 44 08 2 344909828 15 1499 + 052961 1337 45 01 2 344781828 00 1436 + 052962 1337 45 02 2 344781828 01 1436 + 052963 1337 45 03 2 344781828 02 1436 + 052964 1337 45 04 2 344781828 03 1436 + 052965 1337 45 05 2 344781828 04 1436 + 052966 1337 45 06 2 344781828 05 1436 + 052967 1337 45 07 2 344781828 06 1436 + 052968 1337 45 08 2 344781828 07 1436 + 052969 1337 46 01 2 344781828 08 1436 + 052970 1337 46 02 2 344781828 09 1436 + 052971 1337 46 03 2 344781828 10 1436 + 052972 1337 46 04 2 344781828 11 1436 + 052973 1337 46 05 2 344781828 12 1436 + 052974 1337 46 06 2 344781828 13 1436 + 052975 1337 46 07 2 344781828 14 1436 + 052976 1337 46 08 2 344781828 15 1436 + 052977 1337 47 01 2 344782852 00 1437 + 052978 1337 47 02 2 344782852 01 1437 + 052979 1337 47 03 2 344782852 02 1437 + 052980 1337 47 04 2 344782852 03 1437 + 052981 1337 47 05 2 344782852 04 1437 + 052982 1337 47 06 2 344782852 05 1437 + 052983 1337 47 07 2 344782852 06 1437 + 052984 1337 47 08 2 344782852 07 1437 + 052985 1337 48 01 2 344782852 08 1437 + 052986 1337 48 02 2 344782852 09 1437 + 052987 1337 48 03 2 344782852 10 1437 + 052988 1337 48 04 2 344782852 11 1437 + 052989 1337 48 05 2 344782852 12 1437 + 052990 1337 48 06 2 344782852 13 1437 + 052991 1337 48 07 2 344782852 14 1437 + 052992 1337 48 08 2 344782852 15 1437 + 052993 1338 01 01 2 344388612 00 1276 + 052994 1338 01 02 2 344388612 01 1276 + 052995 1338 01 03 2 344388612 02 1276 + 052996 1338 01 04 2 344388612 03 1276 + 052997 1338 01 05 2 344388612 04 1276 + 052998 1338 01 06 2 344388612 05 1276 + 052999 1338 01 07 2 344388612 06 1276 + 053000 1338 01 08 2 344388612 07 1276 + 053001 1338 02 01 2 344388612 08 1276 + 053002 1338 02 02 2 344388612 09 1276 + 053003 1338 02 03 2 344388612 10 1276 + 053004 1338 02 04 2 344388612 11 1276 + 053005 1338 02 05 2 344388612 12 1276 + 053006 1338 02 06 2 344388612 13 1276 + 053007 1338 02 07 2 344388612 14 1276 + 053008 1338 02 08 2 344388612 15 1276 + 053009 1338 03 01 2 344389636 00 1277 + 053010 1338 03 02 2 344389636 01 1277 + 053011 1338 03 03 2 344389636 02 1277 + 053012 1338 03 04 2 344389636 03 1277 + 053013 1338 03 05 2 344389636 04 1277 + 053014 1338 03 06 2 344389636 05 1277 + 053015 1338 03 07 2 344389636 06 1277 + 053016 1338 03 08 2 344389636 07 1277 + 053017 1338 04 01 2 344389636 08 1277 + 053018 1338 04 02 2 344389636 09 1277 + 053019 1338 04 03 2 344389636 10 1277 + 053020 1338 04 04 2 344389636 11 1277 + 053021 1338 04 05 2 344389636 12 1277 + 053022 1338 04 06 2 344389636 13 1277 + 053023 1338 04 07 2 344389636 14 1277 + 053024 1338 04 08 2 344389636 15 1277 + 053025 1338 05 01 2 344261636 00 1214 + 053026 1338 05 02 2 344261636 01 1214 + 053027 1338 05 03 2 344261636 02 1214 + 053028 1338 05 04 2 344261636 03 1214 + 053029 1338 05 05 2 344261636 04 1214 + 053030 1338 05 06 2 344261636 05 1214 + 053031 1338 05 07 2 344261636 06 1214 + 053032 1338 05 08 2 344261636 07 1214 + 053033 1338 06 01 2 344261636 08 1214 + 053034 1338 06 02 2 344261636 09 1214 + 053035 1338 06 03 2 344261636 10 1214 + 053036 1338 06 04 2 344261636 11 1214 + 053037 1338 06 05 2 344261636 12 1214 + 053038 1338 06 06 2 344261636 13 1214 + 053039 1338 06 07 2 344261636 14 1214 + 053040 1338 06 08 2 344261636 15 1214 + 053041 1338 07 01 2 344262660 00 1215 + 053042 1338 07 02 2 344262660 01 1215 + 053043 1338 07 03 2 344262660 02 1215 + 053044 1338 07 04 2 344262660 03 1215 + 053045 1338 07 05 2 344262660 04 1215 + 053046 1338 07 06 2 344262660 05 1215 + 053047 1338 07 07 2 344262660 06 1215 + 053048 1338 07 08 2 344262660 07 1215 + 053049 1338 08 01 2 344262660 08 1215 + 053050 1338 08 02 2 344262660 09 1215 + 053051 1338 08 03 2 344262660 10 1215 + 053052 1338 08 04 2 344262660 11 1215 + 053053 1338 08 05 2 344262660 12 1215 + 053054 1338 08 06 2 344262660 13 1215 + 053055 1338 08 07 2 344262660 14 1215 + 053056 1338 08 08 2 344262660 15 1215 + 053057 1338 09 01 2 344650756 00 1388 + 053058 1338 09 02 2 344650756 01 1388 + 053059 1338 09 03 2 344650756 02 1388 + 053060 1338 09 04 2 344650756 03 1388 + 053061 1338 09 05 2 344650756 04 1388 + 053062 1338 09 06 2 344650756 05 1388 + 053063 1338 09 07 2 344650756 06 1388 + 053064 1338 09 08 2 344650756 07 1388 + 053065 1338 10 01 2 344650756 08 1388 + 053066 1338 10 02 2 344650756 09 1388 + 053067 1338 10 03 2 344650756 10 1388 + 053068 1338 10 04 2 344650756 11 1388 + 053069 1338 10 05 2 344650756 12 1388 + 053070 1338 10 06 2 344650756 13 1388 + 053071 1338 10 07 2 344650756 14 1388 + 053072 1338 10 08 2 344650756 15 1388 + 053073 1338 11 01 2 344651780 00 1389 + 053074 1338 11 02 2 344651780 01 1389 + 053075 1338 11 03 2 344651780 02 1389 + 053076 1338 11 04 2 344651780 03 1389 + 053077 1338 11 05 2 344651780 04 1389 + 053078 1338 11 06 2 344651780 05 1389 + 053079 1338 11 07 2 344651780 06 1389 + 053080 1338 11 08 2 344651780 07 1389 + 053081 1338 12 01 2 344651780 08 1389 + 053082 1338 12 02 2 344651780 09 1389 + 053083 1338 12 03 2 344651780 10 1389 + 053084 1338 12 04 2 344651780 11 1389 + 053085 1338 12 05 2 344651780 12 1389 + 053086 1338 12 06 2 344651780 13 1389 + 053087 1338 12 07 2 344651780 14 1389 + 053088 1338 12 08 2 344651780 15 1389 + 053089 1338 13 01 2 344523780 00 1326 + 053090 1338 13 02 2 344523780 01 1326 + 053091 1338 13 03 2 344523780 02 1326 + 053092 1338 13 04 2 344523780 03 1326 + 053093 1338 13 05 2 344523780 04 1326 + 053094 1338 13 06 2 344523780 05 1326 + 053095 1338 13 07 2 344523780 06 1326 + 053096 1338 13 08 2 344523780 07 1326 + 053097 1338 14 01 2 344523780 08 1326 + 053098 1338 14 02 2 344523780 09 1326 + 053099 1338 14 03 2 344523780 10 1326 + 053100 1338 14 04 2 344523780 11 1326 + 053101 1338 14 05 2 344523780 12 1326 + 053102 1338 14 06 2 344523780 13 1326 + 053103 1338 14 07 2 344523780 14 1326 + 053104 1338 14 08 2 344523780 15 1326 + 053105 1338 15 01 2 344524804 00 1327 + 053106 1338 15 02 2 344524804 01 1327 + 053107 1338 15 03 2 344524804 02 1327 + 053108 1338 15 04 2 344524804 03 1327 + 053109 1338 15 05 2 344524804 04 1327 + 053110 1338 15 06 2 344524804 05 1327 + 053111 1338 15 07 2 344524804 06 1327 + 053112 1338 15 08 2 344524804 07 1327 + 053113 1338 16 01 2 344524804 08 1327 + 053114 1338 16 02 2 344524804 09 1327 + 053115 1338 16 03 2 344524804 10 1327 + 053116 1338 16 04 2 344524804 11 1327 + 053117 1338 16 05 2 344524804 12 1327 + 053118 1338 16 06 2 344524804 13 1327 + 053119 1338 16 07 2 344524804 14 1327 + 053120 1338 16 08 2 344524804 15 1327 + 053121 1338 17 01 2 344912900 00 1500 + 053122 1338 17 02 2 344912900 01 1500 + 053123 1338 17 03 2 344912900 02 1500 + 053124 1338 17 04 2 344912900 03 1500 + 053125 1338 17 05 2 344912900 04 1500 + 053126 1338 17 06 2 344912900 05 1500 + 053127 1338 17 07 2 344912900 06 1500 + 053128 1338 17 08 2 344912900 07 1500 + 053129 1338 18 01 2 344912900 08 1500 + 053130 1338 18 02 2 344912900 09 1500 + 053131 1338 18 03 2 344912900 10 1500 + 053132 1338 18 04 2 344912900 11 1500 + 053133 1338 18 05 2 344912900 12 1500 + 053134 1338 18 06 2 344912900 13 1500 + 053135 1338 18 07 2 344912900 14 1500 + 053136 1338 18 08 2 344912900 15 1500 + 053137 1338 19 01 2 344913924 00 1501 + 053138 1338 19 02 2 344913924 01 1501 + 053139 1338 19 03 2 344913924 02 1501 + 053140 1338 19 04 2 344913924 03 1501 + 053141 1338 19 05 2 344913924 04 1501 + 053142 1338 19 06 2 344913924 05 1501 + 053143 1338 19 07 2 344913924 06 1501 + 053144 1338 19 08 2 344913924 07 1501 + 053145 1338 20 01 2 344913924 08 1501 + 053146 1338 20 02 2 344913924 09 1501 + 053147 1338 20 03 2 344913924 10 1501 + 053148 1338 20 04 2 344913924 11 1501 + 053149 1338 20 05 2 344913924 12 1501 + 053150 1338 20 06 2 344913924 13 1501 + 053151 1338 20 07 2 344913924 14 1501 + 053152 1338 20 08 2 344913924 15 1501 + 053153 1338 21 01 2 344785924 00 1438 + 053154 1338 21 02 2 344785924 01 1438 + 053155 1338 21 03 2 344785924 02 1438 + 053156 1338 21 04 2 344785924 03 1438 + 053157 1338 21 05 2 344785924 04 1438 + 053158 1338 21 06 2 344785924 05 1438 + 053159 1338 21 07 2 344785924 06 1438 + 053160 1338 21 08 2 344785924 07 1438 + 053161 1338 22 01 2 344785924 08 1438 + 053162 1338 22 02 2 344785924 09 1438 + 053163 1338 22 03 2 344785924 10 1438 + 053164 1338 22 04 2 344785924 11 1438 + 053165 1338 22 05 2 344785924 12 1438 + 053166 1338 22 06 2 344785924 13 1438 + 053167 1338 22 07 2 344785924 14 1438 + 053168 1338 22 08 2 344785924 15 1438 + 053169 1338 23 01 2 344786948 00 1439 + 053170 1338 23 02 2 344786948 01 1439 + 053171 1338 23 03 2 344786948 02 1439 + 053172 1338 23 04 2 344786948 03 1439 + 053173 1338 23 05 2 344786948 04 1439 + 053174 1338 23 06 2 344786948 05 1439 + 053175 1338 23 07 2 344786948 06 1439 + 053176 1338 23 08 2 344786948 07 1439 + 053177 1338 24 01 2 344786948 08 1439 + 053178 1338 24 02 2 344786948 09 1439 + 053179 1338 24 03 2 344786948 10 1439 + 053180 1338 24 04 2 344786948 11 1439 + 053181 1338 24 05 2 344786948 12 1439 + 053182 1338 24 06 2 344786948 13 1439 + 053183 1338 24 07 2 344786948 14 1439 + 053184 1338 24 08 2 344786948 15 1439 + 053185 1338 25 01 2 344392708 00 1278 + 053186 1338 25 02 2 344392708 01 1278 + 053187 1338 25 03 2 344392708 02 1278 + 053188 1338 25 04 2 344392708 03 1278 + 053189 1338 25 05 2 344392708 04 1278 + 053190 1338 25 06 2 344392708 05 1278 + 053191 1338 25 07 2 344392708 06 1278 + 053192 1338 25 08 2 344392708 07 1278 + 053193 1338 26 01 2 344392708 08 1278 + 053194 1338 26 02 2 344392708 09 1278 + 053195 1338 26 03 2 344392708 10 1278 + 053196 1338 26 04 2 344392708 11 1278 + 053197 1338 26 05 2 344392708 12 1278 + 053198 1338 26 06 2 344392708 13 1278 + 053199 1338 26 07 2 344392708 14 1278 + 053200 1338 26 08 2 344392708 15 1278 + 053201 1338 27 01 2 344393732 00 1279 + 053202 1338 27 02 2 344393732 01 1279 + 053203 1338 27 03 2 344393732 02 1279 + 053204 1338 27 04 2 344393732 03 1279 + 053205 1338 27 05 2 344393732 04 1279 + 053206 1338 27 06 2 344393732 05 1279 + 053207 1338 27 07 2 344393732 06 1279 + 053208 1338 27 08 2 344393732 07 1279 + 053209 1338 28 01 2 344393732 08 1279 + 053210 1338 28 02 2 344393732 09 1279 + 053211 1338 28 03 2 344393732 10 1279 + 053212 1338 28 04 2 344393732 11 1279 + 053213 1338 28 05 2 344393732 12 1279 + 053214 1338 28 06 2 344393732 13 1279 + 053215 1338 28 07 2 344393732 14 1279 + 053216 1338 28 08 2 344393732 15 1279 + 053217 1338 29 01 2 344265732 00 1216 + 053218 1338 29 02 2 344265732 01 1216 + 053219 1338 29 03 2 344265732 02 1216 + 053220 1338 29 04 2 344265732 03 1216 + 053221 1338 29 05 2 344265732 04 1216 + 053222 1338 29 06 2 344265732 05 1216 + 053223 1338 29 07 2 344265732 06 1216 + 053224 1338 29 08 2 344265732 07 1216 + 053225 1338 30 01 2 344265732 08 1216 + 053226 1338 30 02 2 344265732 09 1216 + 053227 1338 30 03 2 344265732 10 1216 + 053228 1338 30 04 2 344265732 11 1216 + 053229 1338 30 05 2 344265732 12 1216 + 053230 1338 30 06 2 344265732 13 1216 + 053231 1338 30 07 2 344265732 14 1216 + 053232 1338 30 08 2 344265732 15 1216 + 053233 1338 31 01 2 344266756 00 1217 + 053234 1338 31 02 2 344266756 01 1217 + 053235 1338 31 03 2 344266756 02 1217 + 053236 1338 31 04 2 344266756 03 1217 + 053237 1338 31 05 2 344266756 04 1217 + 053238 1338 31 06 2 344266756 05 1217 + 053239 1338 31 07 2 344266756 06 1217 + 053240 1338 31 08 2 344266756 07 1217 + 053241 1338 32 01 2 344266756 08 1217 + 053242 1338 32 02 2 344266756 09 1217 + 053243 1338 32 03 2 344266756 10 1217 + 053244 1338 32 04 2 344266756 11 1217 + 053245 1338 32 05 2 344266756 12 1217 + 053246 1338 32 06 2 344266756 13 1217 + 053247 1338 32 07 2 344266756 14 1217 + 053248 1338 32 08 2 344266756 15 1217 + 053249 1338 33 01 2 344654852 00 1390 + 053250 1338 33 02 2 344654852 01 1390 + 053251 1338 33 03 2 344654852 02 1390 + 053252 1338 33 04 2 344654852 03 1390 + 053253 1338 33 05 2 344654852 04 1390 + 053254 1338 33 06 2 344654852 05 1390 + 053255 1338 33 07 2 344654852 06 1390 + 053256 1338 33 08 2 344654852 07 1390 + 053257 1338 34 01 2 344654852 08 1390 + 053258 1338 34 02 2 344654852 09 1390 + 053259 1338 34 03 2 344654852 10 1390 + 053260 1338 34 04 2 344654852 11 1390 + 053261 1338 34 05 2 344654852 12 1390 + 053262 1338 34 06 2 344654852 13 1390 + 053263 1338 34 07 2 344654852 14 1390 + 053264 1338 34 08 2 344654852 15 1390 + 053265 1338 35 01 2 344655876 00 1391 + 053266 1338 35 02 2 344655876 01 1391 + 053267 1338 35 03 2 344655876 02 1391 + 053268 1338 35 04 2 344655876 03 1391 + 053269 1338 35 05 2 344655876 04 1391 + 053270 1338 35 06 2 344655876 05 1391 + 053271 1338 35 07 2 344655876 06 1391 + 053272 1338 35 08 2 344655876 07 1391 + 053273 1338 36 01 2 344655876 08 1391 + 053274 1338 36 02 2 344655876 09 1391 + 053275 1338 36 03 2 344655876 10 1391 + 053276 1338 36 04 2 344655876 11 1391 + 053277 1338 36 05 2 344655876 12 1391 + 053278 1338 36 06 2 344655876 13 1391 + 053279 1338 36 07 2 344655876 14 1391 + 053280 1338 36 08 2 344655876 15 1391 + 053281 1338 37 01 2 344527876 00 1328 + 053282 1338 37 02 2 344527876 01 1328 + 053283 1338 37 03 2 344527876 02 1328 + 053284 1338 37 04 2 344527876 03 1328 + 053285 1338 37 05 2 344527876 04 1328 + 053286 1338 37 06 2 344527876 05 1328 + 053287 1338 37 07 2 344527876 06 1328 + 053288 1338 37 08 2 344527876 07 1328 + 053289 1338 38 01 2 344527876 08 1328 + 053290 1338 38 02 2 344527876 09 1328 + 053291 1338 38 03 2 344527876 10 1328 + 053292 1338 38 04 2 344527876 11 1328 + 053293 1338 38 05 2 344527876 12 1328 + 053294 1338 38 06 2 344527876 13 1328 + 053295 1338 38 07 2 344527876 14 1328 + 053296 1338 38 08 2 344527876 15 1328 + 053297 1338 39 01 2 344528900 00 1329 + 053298 1338 39 02 2 344528900 01 1329 + 053299 1338 39 03 2 344528900 02 1329 + 053300 1338 39 04 2 344528900 03 1329 + 053301 1338 39 05 2 344528900 04 1329 + 053302 1338 39 06 2 344528900 05 1329 + 053303 1338 39 07 2 344528900 06 1329 + 053304 1338 39 08 2 344528900 07 1329 + 053305 1338 40 01 2 344528900 08 1329 + 053306 1338 40 02 2 344528900 09 1329 + 053307 1338 40 03 2 344528900 10 1329 + 053308 1338 40 04 2 344528900 11 1329 + 053309 1338 40 05 2 344528900 12 1329 + 053310 1338 40 06 2 344528900 13 1329 + 053311 1338 40 07 2 344528900 14 1329 + 053312 1338 40 08 2 344528900 15 1329 + 053313 1338 41 01 2 344916996 00 1502 + 053314 1338 41 02 2 344916996 01 1502 + 053315 1338 41 03 2 344916996 02 1502 + 053316 1338 41 04 2 344916996 03 1502 + 053317 1338 41 05 2 344916996 04 1502 + 053318 1338 41 06 2 344916996 05 1502 + 053319 1338 41 07 2 344916996 06 1502 + 053320 1338 41 08 2 344916996 07 1502 + 053321 1338 42 01 2 344916996 08 1502 + 053322 1338 42 02 2 344916996 09 1502 + 053323 1338 42 03 2 344916996 10 1502 + 053324 1338 42 04 2 344916996 11 1502 + 053325 1338 42 05 2 344916996 12 1502 + 053326 1338 42 06 2 344916996 13 1502 + 053327 1338 42 07 2 344916996 14 1502 + 053328 1338 42 08 2 344916996 15 1502 + 053329 1338 43 01 2 344918020 00 1503 + 053330 1338 43 02 2 344918020 01 1503 + 053331 1338 43 03 2 344918020 02 1503 + 053332 1338 43 04 2 344918020 03 1503 + 053333 1338 43 05 2 344918020 04 1503 + 053334 1338 43 06 2 344918020 05 1503 + 053335 1338 43 07 2 344918020 06 1503 + 053336 1338 43 08 2 344918020 07 1503 + 053337 1338 44 01 2 344918020 08 1503 + 053338 1338 44 02 2 344918020 09 1503 + 053339 1338 44 03 2 344918020 10 1503 + 053340 1338 44 04 2 344918020 11 1503 + 053341 1338 44 05 2 344918020 12 1503 + 053342 1338 44 06 2 344918020 13 1503 + 053343 1338 44 07 2 344918020 14 1503 + 053344 1338 44 08 2 344918020 15 1503 + 053345 1338 45 01 2 344790020 00 1440 + 053346 1338 45 02 2 344790020 01 1440 + 053347 1338 45 03 2 344790020 02 1440 + 053348 1338 45 04 2 344790020 03 1440 + 053349 1338 45 05 2 344790020 04 1440 + 053350 1338 45 06 2 344790020 05 1440 + 053351 1338 45 07 2 344790020 06 1440 + 053352 1338 45 08 2 344790020 07 1440 + 053353 1338 46 01 2 344790020 08 1440 + 053354 1338 46 02 2 344790020 09 1440 + 053355 1338 46 03 2 344790020 10 1440 + 053356 1338 46 04 2 344790020 11 1440 + 053357 1338 46 05 2 344790020 12 1440 + 053358 1338 46 06 2 344790020 13 1440 + 053359 1338 46 07 2 344790020 14 1440 + 053360 1338 46 08 2 344790020 15 1440 + 053361 1338 47 01 2 344791044 00 1441 + 053362 1338 47 02 2 344791044 01 1441 + 053363 1338 47 03 2 344791044 02 1441 + 053364 1338 47 04 2 344791044 03 1441 + 053365 1338 47 05 2 344791044 04 1441 + 053366 1338 47 06 2 344791044 05 1441 + 053367 1338 47 07 2 344791044 06 1441 + 053368 1338 47 08 2 344791044 07 1441 + 053369 1338 48 01 2 344791044 08 1441 + 053370 1338 48 02 2 344791044 09 1441 + 053371 1338 48 03 2 344791044 10 1441 + 053372 1338 48 04 2 344791044 11 1441 + 053373 1338 48 05 2 344791044 12 1441 + 053374 1338 48 06 2 344791044 13 1441 + 053375 1338 48 07 2 344791044 14 1441 + 053376 1338 48 08 2 344791044 15 1441 diff --git a/EventFilter/SiPixelRawToDigi/test/README b/EventFilter/SiPixelRawToDigi/test/README new file mode 100644 index 0000000000000..d824712f8edf9 --- /dev/null +++ b/EventFilter/SiPixelRawToDigi/test/README @@ -0,0 +1,48 @@ +*********************************************************************** +* * +* Instructions to compile and Run GPU RawToDigi only * +* 15 November 2017 * +* * +* Input File: Raw Data in root format * +* * +* Output part1: Index(or pixel_no), xcord, ycord & adc * +* Output part2: Start & End Index of each module in part 1 * +* The output CAN BE stored in the text file if you WANT in * +* GPU_RawToDigi_Output_Part1_Event_NtoN+128.txt * +* GPU_RawToDigi_Output_Part2_Event_NtoN+128.txt * +* The file RawId_moduleId.txt contains RawId(DetId) for module index * +*********************************************************************** + +file type:/eos/cms/store/relval/CMSSW_9_4_0/RelValTTbar_13/GEN-SIM-DIGI-RAW/PU25ns_94X_upgrade2018_realistic_v5-v1/10000/ + +Input file: /store/relval/CMSSW_9_4_0/RelValTTbar_13/GEN-SIM-DIGI-RAW/PU25ns_94X_upgrade2018_realistic_v5-v1/10000/F87005CD-CBC8-E711-A9F5-0CC47A4D7694.root +Please change the input file path or name in python script +EventFilter/SiPixelRawToDigi/test/runRawToDigi_GPU_phase1.py + +0. login to felk40 + > ssh username@lxplus.cern.ch + > ssh felk40 + + +1. Download the code from repository: + > cmsrel CMSSW_9_4_0 + > cd CMSSW_9_4_0/src + > cmsenv + > git cms-merge-topic sushildubey171:GPU_RawToDigi_C940 + > scram setup cuda + > scram b -j8 + + +2. Run: + Before running, please make sure that there is proper + reference of the input file in the runRawToDigi_GPU_phase1.py + > cd EventFilter/SiPixelRawToDigi/test + > cmsRun runRawToDigi_GPU_phase1.py + + +3. Output: + Upon successful execution it will dispaly message on the console. + It can produce output files for debugging according to value of + r2d_debug variable in SiPixelRawToDigi.cc + located in CMSSW_9_4_0/src/EventFilter/SiPixelRawToDigi/plugins/ + The output is stored in the test directory \ No newline at end of file diff --git a/EventFilter/SiPixelRawToDigi/test/RawId_moduleId.txt b/EventFilter/SiPixelRawToDigi/test/RawId_moduleId.txt new file mode 100644 index 0000000000000..186628d99b55f --- /dev/null +++ b/EventFilter/SiPixelRawToDigi/test/RawId_moduleId.txt @@ -0,0 +1,1857 @@ +RawId Module no: +303042564 0 +303042568 1 +303042572 2 +303042576 3 +303042580 4 +303042584 5 +303042588 6 +303042592 7 +303046660 8 +303046664 9 +303046668 10 +303046672 11 +303046676 12 +303046680 13 +303046684 14 +303046688 15 +303050756 16 +303050760 17 +303050764 18 +303050768 19 +303050772 20 +303050776 21 +303050780 22 +303050784 23 +303054852 24 +303054856 25 +303054860 26 +303054864 27 +303054868 28 +303054872 29 +303054876 30 +303054880 31 +303058948 32 +303058952 33 +303058956 34 +303058960 35 +303058964 36 +303058968 37 +303058972 38 +303058976 39 +303063044 40 +303063048 41 +303063052 42 +303063056 43 +303063060 44 +303063064 45 +303063068 46 +303063072 47 +303067140 48 +303067144 49 +303067148 50 +303067152 51 +303067156 52 +303067160 53 +303067164 54 +303067168 55 +303071236 56 +303071240 57 +303071244 58 +303071248 59 +303071252 60 +303071256 61 +303071260 62 +303071264 63 +303075332 64 +303075336 65 +303075340 66 +303075344 67 +303075348 68 +303075352 69 +303075356 70 +303075360 71 +303079428 72 +303079432 73 +303079436 74 +303079440 75 +303079444 76 +303079448 77 +303079452 78 +303079456 79 +303083524 80 +303083528 81 +303083532 82 +303083536 83 +303083540 84 +303083544 85 +303083548 86 +303083552 87 +303087620 88 +303087624 89 +303087628 90 +303087632 91 +303087636 92 +303087640 93 +303087644 94 +303087648 95 +304091140 96 +304091144 97 +304091148 98 +304091152 99 +304091156 100 +304091160 101 +304091164 102 +304091168 103 +304095236 104 +304095240 105 +304095244 106 +304095248 107 +304095252 108 +304095256 109 +304095260 110 +304095264 111 +304099332 112 +304099336 113 +304099340 114 +304099344 115 +304099348 116 +304099352 117 +304099356 118 +304099360 119 +304103428 120 +304103432 121 +304103436 122 +304103440 123 +304103444 124 +304103448 125 +304103452 126 +304103456 127 +304107524 128 +304107528 129 +304107532 130 +304107536 131 +304107540 132 +304107544 133 +304107548 134 +304107552 135 +304111620 136 +304111624 137 +304111628 138 +304111632 139 +304111636 140 +304111640 141 +304111644 142 +304111648 143 +304115716 144 +304115720 145 +304115724 146 +304115728 147 +304115732 148 +304115736 149 +304115740 150 +304115744 151 +304119812 152 +304119816 153 +304119820 154 +304119824 155 +304119828 156 +304119832 157 +304119836 158 +304119840 159 +304123908 160 +304123912 161 +304123916 162 +304123920 163 +304123924 164 +304123928 165 +304123932 166 +304123936 167 +304128004 168 +304128008 169 +304128012 170 +304128016 171 +304128020 172 +304128024 173 +304128028 174 +304128032 175 +304132100 176 +304132104 177 +304132108 178 +304132112 179 +304132116 180 +304132120 181 +304132124 182 +304132128 183 +304136196 184 +304136200 185 +304136204 186 +304136208 187 +304136212 188 +304136216 189 +304136220 190 +304136224 191 +304140292 192 +304140296 193 +304140300 194 +304140304 195 +304140308 196 +304140312 197 +304140316 198 +304140320 199 +304144388 200 +304144392 201 +304144396 202 +304144400 203 +304144404 204 +304144408 205 +304144412 206 +304144416 207 +304148484 208 +304148488 209 +304148492 210 +304148496 211 +304148500 212 +304148504 213 +304148508 214 +304148512 215 +304152580 216 +304152584 217 +304152588 218 +304152592 219 +304152596 220 +304152600 221 +304152604 222 +304152608 223 +304156676 224 +304156680 225 +304156684 226 +304156688 227 +304156692 228 +304156696 229 +304156700 230 +304156704 231 +304160772 232 +304160776 233 +304160780 234 +304160784 235 +304160788 236 +304160792 237 +304160796 238 +304160800 239 +304164868 240 +304164872 241 +304164876 242 +304164880 243 +304164884 244 +304164888 245 +304164892 246 +304164896 247 +304168964 248 +304168968 249 +304168972 250 +304168976 251 +304168980 252 +304168984 253 +304168988 254 +304168992 255 +304173060 256 +304173064 257 +304173068 258 +304173072 259 +304173076 260 +304173080 261 +304173084 262 +304173088 263 +304177156 264 +304177160 265 +304177164 266 +304177168 267 +304177172 268 +304177176 269 +304177180 270 +304177184 271 +304181252 272 +304181256 273 +304181260 274 +304181264 275 +304181268 276 +304181272 277 +304181276 278 +304181280 279 +304185348 280 +304185352 281 +304185356 282 +304185360 283 +304185364 284 +304185368 285 +304185372 286 +304185376 287 +304189444 288 +304189448 289 +304189452 290 +304189456 291 +304189460 292 +304189464 293 +304189468 294 +304189472 295 +304193540 296 +304193544 297 +304193548 298 +304193552 299 +304193556 300 +304193560 301 +304193564 302 +304193568 303 +304197636 304 +304197640 305 +304197644 306 +304197648 307 +304197652 308 +304197656 309 +304197660 310 +304197664 311 +304201732 312 +304201736 313 +304201740 314 +304201744 315 +304201748 316 +304201752 317 +304201756 318 +304201760 319 +305139716 320 +305139720 321 +305139724 322 +305139728 323 +305139732 324 +305139736 325 +305139740 326 +305139744 327 +305143812 328 +305143816 329 +305143820 330 +305143824 331 +305143828 332 +305143832 333 +305143836 334 +305143840 335 +305147908 336 +305147912 337 +305147916 338 +305147920 339 +305147924 340 +305147928 341 +305147932 342 +305147936 343 +305152004 344 +305152008 345 +305152012 346 +305152016 347 +305152020 348 +305152024 349 +305152028 350 +305152032 351 +305156100 352 +305156104 353 +305156108 354 +305156112 355 +305156116 356 +305156120 357 +305156124 358 +305156128 359 +305160196 360 +305160200 361 +305160204 362 +305160208 363 +305160212 364 +305160216 365 +305160220 366 +305160224 367 +305164292 368 +305164296 369 +305164300 370 +305164304 371 +305164308 372 +305164312 373 +305164316 374 +305164320 375 +305168388 376 +305168392 377 +305168396 378 +305168400 379 +305168404 380 +305168408 381 +305168412 382 +305168416 383 +305172484 384 +305172488 385 +305172492 386 +305172496 387 +305172500 388 +305172504 389 +305172508 390 +305172512 391 +305176580 392 +305176584 393 +305176588 394 +305176592 395 +305176596 396 +305176600 397 +305176604 398 +305176608 399 +305180676 400 +305180680 401 +305180684 402 +305180688 403 +305180692 404 +305180696 405 +305180700 406 +305180704 407 +305184772 408 +305184776 409 +305184780 410 +305184784 411 +305184788 412 +305184792 413 +305184796 414 +305184800 415 +305188868 416 +305188872 417 +305188876 418 +305188880 419 +305188884 420 +305188888 421 +305188892 422 +305188896 423 +305192964 424 +305192968 425 +305192972 426 +305192976 427 +305192980 428 +305192984 429 +305192988 430 +305192992 431 +305197060 432 +305197064 433 +305197068 434 +305197072 435 +305197076 436 +305197080 437 +305197084 438 +305197088 439 +305201156 440 +305201160 441 +305201164 442 +305201168 443 +305201172 444 +305201176 445 +305201180 446 +305201184 447 +305205252 448 +305205256 449 +305205260 450 +305205264 451 +305205268 452 +305205272 453 +305205276 454 +305205280 455 +305209348 456 +305209352 457 +305209356 458 +305209360 459 +305209364 460 +305209368 461 +305209372 462 +305209376 463 +305213444 464 +305213448 465 +305213452 466 +305213456 467 +305213460 468 +305213464 469 +305213468 470 +305213472 471 +305217540 472 +305217544 473 +305217548 474 +305217552 475 +305217556 476 +305217560 477 +305217564 478 +305217568 479 +305221636 480 +305221640 481 +305221644 482 +305221648 483 +305221652 484 +305221656 485 +305221660 486 +305221664 487 +305225732 488 +305225736 489 +305225740 490 +305225744 491 +305225748 492 +305225752 493 +305225756 494 +305225760 495 +305229828 496 +305229832 497 +305229836 498 +305229840 499 +305229844 500 +305229848 501 +305229852 502 +305229856 503 +305233924 504 +305233928 505 +305233932 506 +305233936 507 +305233940 508 +305233944 509 +305233948 510 +305233952 511 +305238020 512 +305238024 513 +305238028 514 +305238032 515 +305238036 516 +305238040 517 +305238044 518 +305238048 519 +305242116 520 +305242120 521 +305242124 522 +305242128 523 +305242132 524 +305242136 525 +305242140 526 +305242144 527 +305246212 528 +305246216 529 +305246220 530 +305246224 531 +305246228 532 +305246232 533 +305246236 534 +305246240 535 +305250308 536 +305250312 537 +305250316 538 +305250320 539 +305250324 540 +305250328 541 +305250332 542 +305250336 543 +305254404 544 +305254408 545 +305254412 546 +305254416 547 +305254420 548 +305254424 549 +305254428 550 +305254432 551 +305258500 552 +305258504 553 +305258508 554 +305258512 555 +305258516 556 +305258520 557 +305258524 558 +305258528 559 +305262596 560 +305262600 561 +305262604 562 +305262608 563 +305262612 564 +305262616 565 +305262620 566 +305262624 567 +305266692 568 +305266696 569 +305266700 570 +305266704 571 +305266708 572 +305266712 573 +305266716 574 +305266720 575 +305270788 576 +305270792 577 +305270796 578 +305270800 579 +305270804 580 +305270808 581 +305270812 582 +305270816 583 +305274884 584 +305274888 585 +305274892 586 +305274896 587 +305274900 588 +305274904 589 +305274908 590 +305274912 591 +305278980 592 +305278984 593 +305278988 594 +305278992 595 +305278996 596 +305279000 597 +305279004 598 +305279008 599 +305283076 600 +305283080 601 +305283084 602 +305283088 603 +305283092 604 +305283096 605 +305283100 606 +305283104 607 +305287172 608 +305287176 609 +305287180 610 +305287184 611 +305287188 612 +305287192 613 +305287196 614 +305287200 615 +305291268 616 +305291272 617 +305291276 618 +305291280 619 +305291284 620 +305291288 621 +305291292 622 +305291296 623 +305295364 624 +305295368 625 +305295372 626 +305295376 627 +305295380 628 +305295384 629 +305295388 630 +305295392 631 +305299460 632 +305299464 633 +305299468 634 +305299472 635 +305299476 636 +305299480 637 +305299484 638 +305299488 639 +305303556 640 +305303560 641 +305303564 642 +305303568 643 +305303572 644 +305303576 645 +305303580 646 +305303584 647 +305307652 648 +305307656 649 +305307660 650 +305307664 651 +305307668 652 +305307672 653 +305307676 654 +305307680 655 +305311748 656 +305311752 657 +305311756 658 +305311760 659 +305311764 660 +305311768 661 +305311772 662 +305311776 663 +305315844 664 +305315848 665 +305315852 666 +305315856 667 +305315860 668 +305315864 669 +305315868 670 +305315872 671 +306188292 672 +306188296 673 +306188300 674 +306188304 675 +306188308 676 +306188312 677 +306188316 678 +306188320 679 +306192388 680 +306192392 681 +306192396 682 +306192400 683 +306192404 684 +306192408 685 +306192412 686 +306192416 687 +306196484 688 +306196488 689 +306196492 690 +306196496 691 +306196500 692 +306196504 693 +306196508 694 +306196512 695 +306200580 696 +306200584 697 +306200588 698 +306200592 699 +306200596 700 +306200600 701 +306200604 702 +306200608 703 +306204676 704 +306204680 705 +306204684 706 +306204688 707 +306204692 708 +306204696 709 +306204700 710 +306204704 711 +306208772 712 +306208776 713 +306208780 714 +306208784 715 +306208788 716 +306208792 717 +306208796 718 +306208800 719 +306212868 720 +306212872 721 +306212876 722 +306212880 723 +306212884 724 +306212888 725 +306212892 726 +306212896 727 +306216964 728 +306216968 729 +306216972 730 +306216976 731 +306216980 732 +306216984 733 +306216988 734 +306216992 735 +306221060 736 +306221064 737 +306221068 738 +306221072 739 +306221076 740 +306221080 741 +306221084 742 +306221088 743 +306225156 744 +306225160 745 +306225164 746 +306225168 747 +306225172 748 +306225176 749 +306225180 750 +306225184 751 +306229252 752 +306229256 753 +306229260 754 +306229264 755 +306229268 756 +306229272 757 +306229276 758 +306229280 759 +306233348 760 +306233352 761 +306233356 762 +306233360 763 +306233364 764 +306233368 765 +306233372 766 +306233376 767 +306237444 768 +306237448 769 +306237452 770 +306237456 771 +306237460 772 +306237464 773 +306237468 774 +306237472 775 +306241540 776 +306241544 777 +306241548 778 +306241552 779 +306241556 780 +306241560 781 +306241564 782 +306241568 783 +306245636 784 +306245640 785 +306245644 786 +306245648 787 +306245652 788 +306245656 789 +306245660 790 +306245664 791 +306249732 792 +306249736 793 +306249740 794 +306249744 795 +306249748 796 +306249752 797 +306249756 798 +306249760 799 +306253828 800 +306253832 801 +306253836 802 +306253840 803 +306253844 804 +306253848 805 +306253852 806 +306253856 807 +306257924 808 +306257928 809 +306257932 810 +306257936 811 +306257940 812 +306257944 813 +306257948 814 +306257952 815 +306262020 816 +306262024 817 +306262028 818 +306262032 819 +306262036 820 +306262040 821 +306262044 822 +306262048 823 +306266116 824 +306266120 825 +306266124 826 +306266128 827 +306266132 828 +306266136 829 +306266140 830 +306266144 831 +306270212 832 +306270216 833 +306270220 834 +306270224 835 +306270228 836 +306270232 837 +306270236 838 +306270240 839 +306274308 840 +306274312 841 +306274316 842 +306274320 843 +306274324 844 +306274328 845 +306274332 846 +306274336 847 +306278404 848 +306278408 849 +306278412 850 +306278416 851 +306278420 852 +306278424 853 +306278428 854 +306278432 855 +306282500 856 +306282504 857 +306282508 858 +306282512 859 +306282516 860 +306282520 861 +306282524 862 +306282528 863 +306286596 864 +306286600 865 +306286604 866 +306286608 867 +306286612 868 +306286616 869 +306286620 870 +306286624 871 +306290692 872 +306290696 873 +306290700 874 +306290704 875 +306290708 876 +306290712 877 +306290716 878 +306290720 879 +306294788 880 +306294792 881 +306294796 882 +306294800 883 +306294804 884 +306294808 885 +306294812 886 +306294816 887 +306298884 888 +306298888 889 +306298892 890 +306298896 891 +306298900 892 +306298904 893 +306298908 894 +306298912 895 +306302980 896 +306302984 897 +306302988 898 +306302992 899 +306302996 900 +306303000 901 +306303004 902 +306303008 903 +306307076 904 +306307080 905 +306307084 906 +306307088 907 +306307092 908 +306307096 909 +306307100 910 +306307104 911 +306311172 912 +306311176 913 +306311180 914 +306311184 915 +306311188 916 +306311192 917 +306311196 918 +306311200 919 +306315268 920 +306315272 921 +306315276 922 +306315280 923 +306315284 924 +306315288 925 +306315292 926 +306315296 927 +306319364 928 +306319368 929 +306319372 930 +306319376 931 +306319380 932 +306319384 933 +306319388 934 +306319392 935 +306323460 936 +306323464 937 +306323468 938 +306323472 939 +306323476 940 +306323480 941 +306323484 942 +306323488 943 +306327556 944 +306327560 945 +306327564 946 +306327568 947 +306327572 948 +306327576 949 +306327580 950 +306327584 951 +306331652 952 +306331656 953 +306331660 954 +306331664 955 +306331668 956 +306331672 957 +306331676 958 +306331680 959 +306335748 960 +306335752 961 +306335756 962 +306335760 963 +306335764 964 +306335768 965 +306335772 966 +306335776 967 +306339844 968 +306339848 969 +306339852 970 +306339856 971 +306339860 972 +306339864 973 +306339868 974 +306339872 975 +306343940 976 +306343944 977 +306343948 978 +306343952 979 +306343956 980 +306343960 981 +306343964 982 +306343968 983 +306348036 984 +306348040 985 +306348044 986 +306348048 987 +306348052 988 +306348056 989 +306348060 990 +306348064 991 +306352132 992 +306352136 993 +306352140 994 +306352144 995 +306352148 996 +306352152 997 +306352156 998 +306352160 999 +306356228 1000 +306356232 1001 +306356236 1002 +306356240 1003 +306356244 1004 +306356248 1005 +306356252 1006 +306356256 1007 +306360324 1008 +306360328 1009 +306360332 1010 +306360336 1011 +306360340 1012 +306360344 1013 +306360348 1014 +306360352 1015 +306364420 1016 +306364424 1017 +306364428 1018 +306364432 1019 +306364436 1020 +306364440 1021 +306364444 1022 +306364448 1023 +306368516 1024 +306368520 1025 +306368524 1026 +306368528 1027 +306368532 1028 +306368536 1029 +306368540 1030 +306368544 1031 +306372612 1032 +306372616 1033 +306372620 1034 +306372624 1035 +306372628 1036 +306372632 1037 +306372636 1038 +306372640 1039 +306376708 1040 +306376712 1041 +306376716 1042 +306376720 1043 +306376724 1044 +306376728 1045 +306376732 1046 +306376736 1047 +306380804 1048 +306380808 1049 +306380812 1050 +306380816 1051 +306380820 1052 +306380824 1053 +306380828 1054 +306380832 1055 +306384900 1056 +306384904 1057 +306384908 1058 +306384912 1059 +306384916 1060 +306384920 1061 +306384924 1062 +306384928 1063 +306388996 1064 +306389000 1065 +306389004 1066 +306389008 1067 +306389012 1068 +306389016 1069 +306389020 1070 +306389024 1071 +306393092 1072 +306393096 1073 +306393100 1074 +306393104 1075 +306393108 1076 +306393112 1077 +306393116 1078 +306393120 1079 +306397188 1080 +306397192 1081 +306397196 1082 +306397200 1083 +306397204 1084 +306397208 1085 +306397212 1086 +306397216 1087 +306401284 1088 +306401288 1089 +306401292 1090 +306401296 1091 +306401300 1092 +306401304 1093 +306401308 1094 +306401312 1095 +306405380 1096 +306405384 1097 +306405388 1098 +306405392 1099 +306405396 1100 +306405400 1101 +306405404 1102 +306405408 1103 +306409476 1104 +306409480 1105 +306409484 1106 +306409488 1107 +306409492 1108 +306409496 1109 +306409500 1110 +306409504 1111 +306413572 1112 +306413576 1113 +306413580 1114 +306413584 1115 +306413588 1116 +306413592 1117 +306413596 1118 +306413600 1119 +306417668 1120 +306417672 1121 +306417676 1122 +306417680 1123 +306417684 1124 +306417688 1125 +306417692 1126 +306417696 1127 +306421764 1128 +306421768 1129 +306421772 1130 +306421776 1131 +306421780 1132 +306421784 1133 +306421788 1134 +306421792 1135 +306425860 1136 +306425864 1137 +306425868 1138 +306425872 1139 +306425876 1140 +306425880 1141 +306425884 1142 +306425888 1143 +306429956 1144 +306429960 1145 +306429964 1146 +306429968 1147 +306429972 1148 +306429976 1149 +306429980 1150 +306429984 1151 +306434052 1152 +306434056 1153 +306434060 1154 +306434064 1155 +306434068 1156 +306434072 1157 +306434076 1158 +306434080 1159 +306438148 1160 +306438152 1161 +306438156 1162 +306438160 1163 +306438164 1164 +306438168 1165 +306438172 1166 +306438176 1167 +306442244 1168 +306442248 1169 +306442252 1170 +306442256 1171 +306442260 1172 +306442264 1173 +306442268 1174 +306442272 1175 +306446340 1176 +306446344 1177 +306446348 1178 +306446352 1179 +306446356 1180 +306446360 1181 +306446364 1182 +306446368 1183 +344200196 1184 +344201220 1185 +344204292 1186 +344205316 1187 +344208388 1188 +344209412 1189 +344212484 1190 +344213508 1191 +344216580 1192 +344217604 1193 +344220676 1194 +344221700 1195 +344224772 1196 +344225796 1197 +344228868 1198 +344229892 1199 +344232964 1200 +344233988 1201 +344237060 1202 +344238084 1203 +344241156 1204 +344242180 1205 +344245252 1206 +344246276 1207 +344249348 1208 +344250372 1209 +344253444 1210 +344254468 1211 +344257540 1212 +344258564 1213 +344261636 1214 +344262660 1215 +344265732 1216 +344266756 1217 +344269828 1218 +344270852 1219 +344273924 1220 +344274948 1221 +344278020 1222 +344279044 1223 +344282116 1224 +344283140 1225 +344286212 1226 +344287236 1227 +344290308 1228 +344291332 1229 +344294404 1230 +344295428 1231 +344298500 1232 +344299524 1233 +344302596 1234 +344303620 1235 +344306692 1236 +344307716 1237 +344310788 1238 +344311812 1239 +344314884 1240 +344315908 1241 +344318980 1242 +344320004 1243 +344323076 1244 +344324100 1245 +344327172 1246 +344328196 1247 +344331268 1248 +344332292 1249 +344335364 1250 +344336388 1251 +344339460 1252 +344340484 1253 +344343556 1254 +344344580 1255 +344347652 1256 +344348676 1257 +344351748 1258 +344352772 1259 +344355844 1260 +344356868 1261 +344359940 1262 +344360964 1263 +344364036 1264 +344365060 1265 +344368132 1266 +344369156 1267 +344372228 1268 +344373252 1269 +344376324 1270 +344377348 1271 +344380420 1272 +344381444 1273 +344384516 1274 +344385540 1275 +344388612 1276 +344389636 1277 +344392708 1278 +344393732 1279 +344396804 1280 +344397828 1281 +344400900 1282 +344401924 1283 +344404996 1284 +344406020 1285 +344409092 1286 +344410116 1287 +344413188 1288 +344414212 1289 +344417284 1290 +344418308 1291 +344421380 1292 +344422404 1293 +344425476 1294 +344426500 1295 +344462340 1296 +344463364 1297 +344466436 1298 +344467460 1299 +344470532 1300 +344471556 1301 +344474628 1302 +344475652 1303 +344478724 1304 +344479748 1305 +344482820 1306 +344483844 1307 +344486916 1308 +344487940 1309 +344491012 1310 +344492036 1311 +344495108 1312 +344496132 1313 +344499204 1314 +344500228 1315 +344503300 1316 +344504324 1317 +344507396 1318 +344508420 1319 +344511492 1320 +344512516 1321 +344515588 1322 +344516612 1323 +344519684 1324 +344520708 1325 +344523780 1326 +344524804 1327 +344527876 1328 +344528900 1329 +344531972 1330 +344532996 1331 +344536068 1332 +344537092 1333 +344540164 1334 +344541188 1335 +344544260 1336 +344545284 1337 +344548356 1338 +344549380 1339 +344552452 1340 +344553476 1341 +344556548 1342 +344557572 1343 +344560644 1344 +344561668 1345 +344564740 1346 +344565764 1347 +344568836 1348 +344569860 1349 +344572932 1350 +344573956 1351 +344577028 1352 +344578052 1353 +344581124 1354 +344582148 1355 +344585220 1356 +344586244 1357 +344589316 1358 +344590340 1359 +344593412 1360 +344594436 1361 +344597508 1362 +344598532 1363 +344601604 1364 +344602628 1365 +344605700 1366 +344606724 1367 +344609796 1368 +344610820 1369 +344613892 1370 +344614916 1371 +344617988 1372 +344619012 1373 +344622084 1374 +344623108 1375 +344626180 1376 +344627204 1377 +344630276 1378 +344631300 1379 +344634372 1380 +344635396 1381 +344638468 1382 +344639492 1383 +344642564 1384 +344643588 1385 +344646660 1386 +344647684 1387 +344650756 1388 +344651780 1389 +344654852 1390 +344655876 1391 +344658948 1392 +344659972 1393 +344663044 1394 +344664068 1395 +344667140 1396 +344668164 1397 +344671236 1398 +344672260 1399 +344675332 1400 +344676356 1401 +344679428 1402 +344680452 1403 +344683524 1404 +344684548 1405 +344687620 1406 +344688644 1407 +344724484 1408 +344725508 1409 +344728580 1410 +344729604 1411 +344732676 1412 +344733700 1413 +344736772 1414 +344737796 1415 +344740868 1416 +344741892 1417 +344744964 1418 +344745988 1419 +344749060 1420 +344750084 1421 +344753156 1422 +344754180 1423 +344757252 1424 +344758276 1425 +344761348 1426 +344762372 1427 +344765444 1428 +344766468 1429 +344769540 1430 +344770564 1431 +344773636 1432 +344774660 1433 +344777732 1434 +344778756 1435 +344781828 1436 +344782852 1437 +344785924 1438 +344786948 1439 +344790020 1440 +344791044 1441 +344794116 1442 +344795140 1443 +344798212 1444 +344799236 1445 +344802308 1446 +344803332 1447 +344806404 1448 +344807428 1449 +344810500 1450 +344811524 1451 +344814596 1452 +344815620 1453 +344818692 1454 +344819716 1455 +344822788 1456 +344823812 1457 +344826884 1458 +344827908 1459 +344830980 1460 +344832004 1461 +344835076 1462 +344836100 1463 +344839172 1464 +344840196 1465 +344843268 1466 +344844292 1467 +344847364 1468 +344848388 1469 +344851460 1470 +344852484 1471 +344855556 1472 +344856580 1473 +344859652 1474 +344860676 1475 +344863748 1476 +344864772 1477 +344867844 1478 +344868868 1479 +344871940 1480 +344872964 1481 +344876036 1482 +344877060 1483 +344880132 1484 +344881156 1485 +344884228 1486 +344885252 1487 +344888324 1488 +344889348 1489 +344892420 1490 +344893444 1491 +344896516 1492 +344897540 1493 +344900612 1494 +344901636 1495 +344904708 1496 +344905732 1497 +344908804 1498 +344909828 1499 +344912900 1500 +344913924 1501 +344916996 1502 +344918020 1503 +344921092 1504 +344922116 1505 +344925188 1506 +344926212 1507 +344929284 1508 +344930308 1509 +344933380 1510 +344934404 1511 +344937476 1512 +344938500 1513 +344941572 1514 +344942596 1515 +344945668 1516 +344946692 1517 +344949764 1518 +344950788 1519 +352588804 1520 +352589828 1521 +352592900 1522 +352593924 1523 +352596996 1524 +352598020 1525 +352601092 1526 +352602116 1527 +352605188 1528 +352606212 1529 +352609284 1530 +352610308 1531 +352613380 1532 +352614404 1533 +352617476 1534 +352618500 1535 +352621572 1536 +352622596 1537 +352625668 1538 +352626692 1539 +352629764 1540 +352630788 1541 +352633860 1542 +352634884 1543 +352637956 1544 +352638980 1545 +352642052 1546 +352643076 1547 +352646148 1548 +352647172 1549 +352650244 1550 +352651268 1551 +352654340 1552 +352655364 1553 +352658436 1554 +352659460 1555 +352662532 1556 +352663556 1557 +352666628 1558 +352667652 1559 +352670724 1560 +352671748 1561 +352674820 1562 +352675844 1563 +352678916 1564 +352679940 1565 +352683012 1566 +352684036 1567 +352687108 1568 +352688132 1569 +352691204 1570 +352692228 1571 +352695300 1572 +352696324 1573 +352699396 1574 +352700420 1575 +352703492 1576 +352704516 1577 +352707588 1578 +352708612 1579 +352711684 1580 +352712708 1581 +352715780 1582 +352716804 1583 +352719876 1584 +352720900 1585 +352723972 1586 +352724996 1587 +352728068 1588 +352729092 1589 +352732164 1590 +352733188 1591 +352736260 1592 +352737284 1593 +352740356 1594 +352741380 1595 +352744452 1596 +352745476 1597 +352748548 1598 +352749572 1599 +352752644 1600 +352753668 1601 +352756740 1602 +352757764 1603 +352760836 1604 +352761860 1605 +352764932 1606 +352765956 1607 +352769028 1608 +352770052 1609 +352773124 1610 +352774148 1611 +352777220 1612 +352778244 1613 +352781316 1614 +352782340 1615 +352785412 1616 +352786436 1617 +352789508 1618 +352790532 1619 +352793604 1620 +352794628 1621 +352797700 1622 +352798724 1623 +352801796 1624 +352802820 1625 +352805892 1626 +352806916 1627 +352809988 1628 +352811012 1629 +352814084 1630 +352815108 1631 +352850948 1632 +352851972 1633 +352855044 1634 +352856068 1635 +352859140 1636 +352860164 1637 +352863236 1638 +352864260 1639 +352867332 1640 +352868356 1641 +352871428 1642 +352872452 1643 +352875524 1644 +352876548 1645 +352879620 1646 +352880644 1647 +352883716 1648 +352884740 1649 +352887812 1650 +352888836 1651 +352891908 1652 +352892932 1653 +352896004 1654 +352897028 1655 +352900100 1656 +352901124 1657 +352904196 1658 +352905220 1659 +352908292 1660 +352909316 1661 +352912388 1662 +352913412 1663 +352916484 1664 +352917508 1665 +352920580 1666 +352921604 1667 +352924676 1668 +352925700 1669 +352928772 1670 +352929796 1671 +352932868 1672 +352933892 1673 +352936964 1674 +352937988 1675 +352941060 1676 +352942084 1677 +352945156 1678 +352946180 1679 +352949252 1680 +352950276 1681 +352953348 1682 +352954372 1683 +352957444 1684 +352958468 1685 +352961540 1686 +352962564 1687 +352965636 1688 +352966660 1689 +352969732 1690 +352970756 1691 +352973828 1692 +352974852 1693 +352977924 1694 +352978948 1695 +352982020 1696 +352983044 1697 +352986116 1698 +352987140 1699 +352990212 1700 +352991236 1701 +352994308 1702 +352995332 1703 +352998404 1704 +352999428 1705 +353002500 1706 +353003524 1707 +353006596 1708 +353007620 1709 +353010692 1710 +353011716 1711 +353014788 1712 +353015812 1713 +353018884 1714 +353019908 1715 +353022980 1716 +353024004 1717 +353027076 1718 +353028100 1719 +353031172 1720 +353032196 1721 +353035268 1722 +353036292 1723 +353039364 1724 +353040388 1725 +353043460 1726 +353044484 1727 +353047556 1728 +353048580 1729 +353051652 1730 +353052676 1731 +353055748 1732 +353056772 1733 +353059844 1734 +353060868 1735 +353063940 1736 +353064964 1737 +353068036 1738 +353069060 1739 +353072132 1740 +353073156 1741 +353076228 1742 +353077252 1743 +353113092 1744 +353114116 1745 +353117188 1746 +353118212 1747 +353121284 1748 +353122308 1749 +353125380 1750 +353126404 1751 +353129476 1752 +353130500 1753 +353133572 1754 +353134596 1755 +353137668 1756 +353138692 1757 +353141764 1758 +353142788 1759 +353145860 1760 +353146884 1761 +353149956 1762 +353150980 1763 +353154052 1764 +353155076 1765 +353158148 1766 +353159172 1767 +353162244 1768 +353163268 1769 +353166340 1770 +353167364 1771 +353170436 1772 +353171460 1773 +353174532 1774 +353175556 1775 +353178628 1776 +353179652 1777 +353182724 1778 +353183748 1779 +353186820 1780 +353187844 1781 +353190916 1782 +353191940 1783 +353195012 1784 +353196036 1785 +353199108 1786 +353200132 1787 +353203204 1788 +353204228 1789 +353207300 1790 +353208324 1791 +353211396 1792 +353212420 1793 +353215492 1794 +353216516 1795 +353219588 1796 +353220612 1797 +353223684 1798 +353224708 1799 +353227780 1800 +353228804 1801 +353231876 1802 +353232900 1803 +353235972 1804 +353236996 1805 +353240068 1806 +353241092 1807 +353244164 1808 +353245188 1809 +353248260 1810 +353249284 1811 +353252356 1812 +353253380 1813 +353256452 1814 +353257476 1815 +353260548 1816 +353261572 1817 +353264644 1818 +353265668 1819 +353268740 1820 +353269764 1821 +353272836 1822 +353273860 1823 +353276932 1824 +353277956 1825 +353281028 1826 +353282052 1827 +353285124 1828 +353286148 1829 +353289220 1830 +353290244 1831 +353293316 1832 +353294340 1833 +353297412 1834 +353298436 1835 +353301508 1836 +353302532 1837 +353305604 1838 +353306628 1839 +353309700 1840 +353310724 1841 +353313796 1842 +353314820 1843 +353317892 1844 +353318916 1845 +353321988 1846 +353323012 1847 +353326084 1848 +353327108 1849 +353330180 1850 +353331204 1851 +353334276 1852 +353335300 1853 +353338372 1854 +353339396 1855 \ No newline at end of file diff --git a/EventFilter/SiPixelRawToDigi/test/log.log b/EventFilter/SiPixelRawToDigi/test/log.log new file mode 100644 index 0000000000000..d055817a41747 --- /dev/null +++ b/EventFilter/SiPixelRawToDigi/test/log.log @@ -0,0 +1,3 @@ +09-Nov-2017 15:59:15 CET Initiating request to open file file:/afs/cern.ch/work/s/sdubey/data/Raw_Data_Phase1/7C654D7C-9E40-E711-8690-0025905A48BC.root +09-Nov-2017 15:59:16 CET Successfully opened file file:/afs/cern.ch/work/s/sdubey/data/Raw_Data_Phase1/7C654D7C-9E40-E711-8690-0025905A48BC.root +09-Nov-2017 15:59:46 CET Closed file file:/afs/cern.ch/work/s/sdubey/data/Raw_Data_Phase1/7C654D7C-9E40-E711-8690-0025905A48BC.root diff --git a/EventFilter/SiPixelRawToDigi/test/runRawToDigi_GPU_phase1.py b/EventFilter/SiPixelRawToDigi/test/runRawToDigi_GPU_phase1.py new file mode 100644 index 0000000000000..e3b14d507740c --- /dev/null +++ b/EventFilter/SiPixelRawToDigi/test/runRawToDigi_GPU_phase1.py @@ -0,0 +1,75 @@ +import FWCore.ParameterSet.Config as cms + +process = cms.Process("MyRawToDigi") + +process.load("FWCore.MessageLogger.MessageLogger_cfi") +#process.load('Configuration.StandardSequences.GeometryRecoDB_cff') +process.load('Configuration.Geometry.GeometryExtended2017Reco_cff') +#process.load('Configuration.Geometry.GeometryExtended2017NewFPixReco_cff') + +#process.load("Configuration.StandardSequences.MagneticField_38T_cff") +#process.load('Configuration.StandardSequences.MagneticField_AutoFromDBCurrent_cff') +process.load("Configuration.StandardSequences.Services_cff") + +process.load("Configuration.StandardSequences.FrontierConditions_GlobalTag_cff") +from Configuration.AlCa.GlobalTag import GlobalTag +# to use no All +# 2015 +#process.GlobalTag.globaltag = 'GR_P_V56' # for 247607 +#process.GlobalTag.globaltag = 'PRE_R_71_V3' #2014 + +#2017 +#process.GlobalTag.globaltag='81X_upgrade2017_realistic_v26' +# AUTO conditions +#process.GlobalTag = GlobalTag(process.GlobalTag, 'auto:run2_data', '') +#process.GlobalTag = GlobalTag(process.GlobalTag, 'auto:run1_data', '') +#process.GlobalTag = GlobalTag(process.GlobalTag, 'auto:run2_mc', '') +#process.GlobalTag = GlobalTag(process.GlobalTag, 'auto:run2_design', '') +#process.GlobalTag = GlobalTag(process.GlobalTag, 'auto:upgrade2017', '') +#process.GlobalTag = GlobalTag(process.GlobalTag, '76X_upgrade2017_design_v8', '') +#process.GlobalTag.globaltag ="81X_dataRun2_relval_v14" +#process.GlobalTag = GlobalTag(process.GlobalTag, 'auto:phase1_2017_realistic', '') +process.GlobalTag = GlobalTag(process.GlobalTag, 'auto:phase1_2018_realistic', '') +process.maxEvents = cms.untracked.PSet( input = cms.untracked.int32(128)) + +process.source = cms.Source("PoolSource", +fileNames = cms.untracked.vstring( +# 'file:/afs/cern.ch/work/d/dkotlins/public/MC/mu_phase1/pt100_81/raw/raw1_formatfix.root' +#'root://cms-xrd-global.cern.ch//store/relval/CMSSW_8_1_0/RelValMinBias_13/GEN-SIM-DIGI-RAW/81X_upgrade2017_realistic_v26_HLT2017Trk-v1/10000/06A2997E-3BC1-E611-B286-0CC47A78A30E.root' +#2018 CMSSW_9_4_0 +'/store/relval/CMSSW_9_4_0/RelValTTbar_13/GEN-SIM-DIGI-RAW/PU25ns_94X_upgrade2018_realistic_v5-v1/10000/F87005CD-CBC8-E711-A9F5-0CC47A4D7694.root' + +#2017 CMSSW_9_2_0 +# download this file +# /store/relval/CMSSW_9_2_0/RelValTTbar_13/GEN-SIM-DIGI-RAW/PU25ns_91X_upgrade2017_realistic_v5_PU50-v1/10000/7C654D7C-9E40-E711-8690-0025905A48BC.root +#'file:/afs/cern.ch/work/s/sdubey/data/Raw_Data_Phase1/7C654D7C-9E40-E711-8690-0025905A48BC.root' +#'file:/home/fpantale/data/920/PU50/085D5AAF-9E40-E711-B12A-0025905A609E.root' +#2016 CMSSW_8_1_0 +#'file:/afs/cern.ch/work/s/sdubey/data/Raw_Data_Phase1/0216ABF7-19B1-E611-8786-0025905A60F8.root' +#'file:/afs/cern.ch/work/s/sdubey/data/9279A7C3-59ED-E511-95C8-0025905A60F8.root' +#'file:/afs/cern.ch/work/s/sdubey/data/RawToDigi/2EF61B7D-F216-E211-98C3-001D09F28D54.root' +#'file:/afs/cern.ch/work/s/sdubey/data/RawToDigi/data_phase1/0A176EE8-38C1-E611-B912-0CC47A4D765A.root' +#'/store/backfill/1/data/Tier0_Test_SUPERBUNNIES_vocms015/Commissioning/RAW/v82/000/276/357/00000/1AA497F3-EC6D-E611-A6B3-02163E0146CB.root' +#'/store/relval/CMSSW_8_1_0/MET/RAW-RECO/HighMET-81X_dataRun2_relval_v14_RelVal_met2016B-v1/10000/182C5786-C8BE-E611-B1C2-0CC47A7 8A33E.root' + ) +) +#file=/store/relval/CMSSW_8_1_0/RelValMinBias_13/GEN-SIM-DIGI-RAW/81X_upgrade2017_realistic_v26_HLT2017Trk-v1/10000/06A2997E-3BC1-E611-B286-0CC47A78A30E.root + + +process.load("EventFilter.SiPixelRawToDigi.SiPixelRawToDigi_cfi") + +process.siPixelDigis.InputLabel = 'rawDataCollector' +process.siPixelDigis.IncludeErrors = False #True +process.siPixelDigis.Timing = False +process.siPixelDigis.UsePhase1 = cms.bool(True) +# do the calibration ADC -> Electrons as required in clustering and apply the channel threshold +process.siPixelDigis.ConvertADCtoElectrons = cms.bool(False) + +process.MessageLogger = cms.Service("MessageLogger", + #debugModules = cms.untracked.vstring('siPixelDigis'), + destinations = cms.untracked.vstring('log'), + log = cms.untracked.PSet( threshold = cms.untracked.string('WARNING')) + #log = cms.untracked.PSet( threshold = cms.untracked.string('DEBUG')) +) + +process.p = cms.Path(process.siPixelDigis) From d61cd517d6544a69d3e07367933f4ebac84ecffb Mon Sep 17 00:00:00 2001 From: Andrea Bocci Date: Thu, 16 Nov 2017 18:19:13 +0100 Subject: [PATCH 02/88] Cleanup the CUDA code, and recover the CPU code - remove log files - rename CUDA plugins to avoid conflict with standard ones - recover non-GPU code --- .../SiPixelRawToDigi/plugins/BuildFile.xml | 7 +- .../plugins/SiPixelRawToDigi.cc | 288 ++++++------- .../plugins/SiPixelRawToDigi.h | 15 - .../plugins/SiPixelRawToDigiGPU.cc | 382 ++++++++++++++++++ .../plugins/SiPixelRawToDigiGPU.h | 80 ++++ EventFilter/SiPixelRawToDigi/test/log.log | 3 - 6 files changed, 583 insertions(+), 192 deletions(-) create mode 100644 EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc create mode 100644 EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.h delete mode 100644 EventFilter/SiPixelRawToDigi/test/log.log diff --git a/EventFilter/SiPixelRawToDigi/plugins/BuildFile.xml b/EventFilter/SiPixelRawToDigi/plugins/BuildFile.xml index c8cd3e9d29e08..c5d495b7f4b9f 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/BuildFile.xml +++ b/EventFilter/SiPixelRawToDigi/plugins/BuildFile.xml @@ -1,5 +1,8 @@ - - + + + + + diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigi.cc b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigi.cc index 15fb0e2b99333..9b93f63741df4 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigi.cc +++ b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigi.cc @@ -6,8 +6,7 @@ // Jan 2016 Tamas Almos Vami (Tav) (Wigner RCP) -- Cabling Map label option // Jul 2017 Viktor Veszpremi -- added PixelFEDChannel -// This code is an entry point for GPU based pixel track reconstruction for HLT -// Modified by Sushil and Shashi for this purpose July-2017 +#include "SiPixelRawToDigi.h" #include "DataFormats/Common/interface/Handle.h" #include "FWCore/Framework/interface/ESHandle.h" @@ -37,26 +36,8 @@ #include "EventFilter/SiPixelRawToDigi/interface/PixelUnpackingRegions.h" #include "FWCore/Framework/interface/ConsumesCollector.h" -#include "FWCore/PluginManager/interface/ModuleDef.h" -#include "FWCore/Framework/interface/MakerMacros.h" - #include "TH1D.h" #include "TFile.h" -#include "SiPixelRawToDigi.h" -#include -#include -#include -#include - -#include // for GPU -#include // for pinned memory -#include "EventInfoGPU.h" // Event Info -// device memory intialization for RawTodigi -#include "RawToDigiMem.h" -// // device memory initialization for CPE -// #include "CPEGPUMem.h" -// //device memory initialization for clustering -// #include "PixelClusterMem.h" using namespace std; @@ -122,37 +103,7 @@ SiPixelRawToDigi::SiPixelRawToDigi( const edm::ParameterSet& conf ) } //CablingMap could have a label //Tav cablingMapLabel = config_.getParameter ("CablingMapLabel"); - - //GPU specific - convertADCtoElectrons = config_.getParameter("ConvertADCtoElectrons"); - const int MAX_FED = 150; - const int MAX_WORD = 2000; - int WSIZE = MAX_FED*MAX_WORD*NEVENT*sizeof(unsigned int); - int FSIZE = 2*MAX_FED*NEVENT*sizeof(unsigned int)+sizeof(unsigned int); - - //word = (unsigned int*)malloc(WSIZE); - cudaMallocHost((void**)&word, WSIZE); - //fedIndex =(unsigned int*)malloc(FSIZE); - cudaMallocHost((void**)&fedIndex, FSIZE); - eventIndex = (unsigned int*)malloc((NEVENT+1)*sizeof(unsigned int)); - eventIndex[0] =0; - // to store the output of RawToDigi - xx_h = new uint[WSIZE]; - yy_h = new uint[WSIZE]; - adc_h = new uint[WSIZE]; - - mIndexStart_h = new int[NEVENT*NMODULE +1]; - mIndexEnd_h = new int[NEVENT*NMODULE +1]; - - // allocate memory for RawToDigi on GPU - initDeviceMemory(); - - // // allocate auxilary memory for clustering - // initDeviceMemCluster(); - - // // allocate memory for CPE on GPU - // initDeviceMemCPE(); - + } @@ -167,22 +118,7 @@ SiPixelRawToDigi::~SiPixelRawToDigi() { hCPU->Write(); hDigi->Write(); } - // free(word); - cudaFreeHost(word); - // free(fedIndex); - cudaFreeHost(fedIndex); - free(eventIndex); - delete[] xx_h; - delete[] yy_h; - delete[] adc_h; - delete[] mIndexStart_h; - delete[] mIndexEnd_h; - // free device memory used for RawToDigi on GPU - freeMemory(); - // free auxilary memory used for clustering - // freeDeviceMemCluster(); - // free device memory used for CPE on GPU - // freeDeviceMemCPE(); + } void @@ -216,7 +152,6 @@ SiPixelRawToDigi::fillDescriptions(edm::ConfigurationDescriptions& descriptions) desc.add("UsePhase1",false)->setComment("## Use phase1"); desc.add("CablingMapLabel","")->setComment("CablingMap label"); //Tav desc.addOptional("CheckPixelOrder"); // never used, kept for back-compatibility - desc.add("ConvertADCtoElectrons", false)->setComment("## do the calibration ADC-> Electron and apply the threshold, requried for clustering"); descriptions.add("siPixelRawToDigi",desc); } @@ -227,20 +162,19 @@ SiPixelRawToDigi::fillDescriptions(edm::ConfigurationDescriptions& descriptions) void SiPixelRawToDigi::produce( edm::Event& ev, const edm::EventSetup& es) { - //const uint32_t dummydetid = 0xffffffff; - //debug = edm::MessageDrop::instance()->debugEnabled; + const uint32_t dummydetid = 0xffffffff; + debug = edm::MessageDrop::instance()->debugEnabled; - // initialize cabling map or update if necessary +// initialize cabling map or update if necessary if (recordWatcher.check( es )) { // cabling map, which maps online address (fed->link->ROC->local pixel) to offline (DetId->global pixel) edm::ESTransientHandle cablingMap; es.get().get( cablingMapLabel, cablingMap ); //Tav fedIds = cablingMap->fedIds(); - // cabling_ = cablingMap->cablingTree(); - // LogDebug("map version:")<< cabling_->version(); + cabling_ = cablingMap->cablingTree(); + LogDebug("map version:")<< cabling_->version(); } - -/* // initialize quality record or update if necessary +// initialize quality record or update if necessary if (qualityWatcher.check( es )&&useQuality) { // quality info for dead pixel modules or ROCs edm::ESHandle qualityInfo; @@ -249,12 +183,12 @@ void SiPixelRawToDigi::produce( edm::Event& ev, if (!badPixelInfo_) { edm::LogError("SiPixelQualityNotPresent")<<" Configured to use SiPixelQuality, but SiPixelQuality not present"< buffers; ev.getByToken(tFEDRawDataCollection, buffers); - /*// create product (digis & errors) +// create product (digis & errors) auto collection = std::make_unique>(); // collection->reserve(8*1024); auto errorcollection = std::make_unique>(); @@ -278,105 +212,115 @@ void SiPixelRawToDigi::produce( edm::Event& ev, formatter.setModulesToUnpack(regions_->modulesToUnpack()); LogDebug("SiPixelRawToDigi") << "region2unpack #feds: "<nFEDs(); LogDebug("SiPixelRawToDigi") << "region2unpack #modules (BPIX,EPIX,total): "<nBarrelModules()<<" "<nForwardModules()<<" "<nModules(); - }*/ - // GPU specific: Data extraction for RawToDigi GPU - static unsigned int wordCounterGPU =0; - unsigned int fedCounter = 0; - const unsigned int MAX_FED = 150; - static int eventCount = 0; - bool errorsInEvent = false; - - ErrorChecker errorcheck; + } + for (auto aFed = fedIds.begin(); aFed != fedIds.end(); ++aFed) { int fedId = *aFed; - - // for GPU - // first 150 index stores the fedId and next 150 will store the - // start index of word in that fed - fedIndex[2*MAX_FED*eventCount+fedCounter] = fedId-1200; - fedIndex[MAX_FED + 2*MAX_FED*eventCount+fedCounter] = wordCounterGPU; // MAX_FED = 150 - fedCounter++; - //get event data for this fed - const FEDRawData& rawData = buffers->FEDData( fedId ); - //GPU specific + if(!usePilotBlade && (fedId==40) ) continue; // skip pilot blade data + + if (regions_ && !regions_->mayUnpackFED(fedId)) continue; + + if(debug) LogDebug("SiPixelRawToDigi")<< " PRODUCE DIGI FOR FED: " << fedId << endl; + PixelDataFormatter::Errors errors; - int nWords = rawData.size()/sizeof(Word64); - if(nWords==0) { - word[wordCounterGPU++] =0; - continue; - } - - // check CRC bit - const Word64* trailer = reinterpret_cast(rawData.data())+(nWords-1); - if(!errorcheck.checkCRC(errorsInEvent, fedId, trailer, errors)) { - word[wordCounterGPU++] =0; - continue; - } - // check headers - const Word64* header = reinterpret_cast(rawData.data()); header--; - bool moreHeaders = true; - while (moreHeaders) { - header++; - //LogTrace("")<<"HEADER: " << print(*header); - bool headerStatus = errorcheck.checkHeader(errorsInEvent, fedId, header, errors); - moreHeaders = headerStatus; - } + //get event data for this fed + const FEDRawData& fedRawData = buffers->FEDData( fedId ); + + //convert data to digi and strip off errors + formatter.interpretRawData( errorsInEvent, fedId, fedRawData, *collection, errors); + + //pack errors into collection + if(includeErrors) { + typedef PixelDataFormatter::Errors::iterator IE; + for (IE is = errors.begin(); is != errors.end(); is++) { + uint32_t errordetid = is->first; + if (errordetid==dummydetid) { // errors given dummy detId must be sorted by Fed + nodeterrors.insert( nodeterrors.end(), errors[errordetid].begin(), errors[errordetid].end() ); + } else { + edm::DetSet& errorDetSet = errorcollection->find_or_insert(errordetid); + errorDetSet.data.insert(errorDetSet.data.end(), is->second.begin(), is->second.end()); + // Fill detid of the detectors where there is error AND the error number is listed + // in the configurable error list in the job option cfi. + // Code needs to be here, because there can be a set of errors for each + // entry in the for loop over PixelDataFormatter::Errors + + std::vector disabledChannelsDetSet; + + for (auto const& aPixelError : errorDetSet) { + // For the time being, we extend the error handling functionality with ErrorType 25 + // In the future, we should sort out how the usage of tkerrorlist can be generalized + if (aPixelError.getType()==25) { + assert(aPixelError.getFedId()==fedId); + const sipixelobjects::PixelFEDCabling* fed = cabling_->fed(fedId); + if (fed) { + cms_uint32_t linkId = formatter.linkId(aPixelError.getWord32()); + const sipixelobjects::PixelFEDLink* link = fed->link(linkId); + if (link) { + // The "offline" 0..15 numbering is fixed by definition, also, the FrameConversion depends on it + // in contrast, the ROC-in-channel numbering is determined by hardware --> better to use the "offline" scheme + PixelFEDChannel ch = {fed->id(), linkId, 25, 0}; + for (unsigned int iRoc=1; iRoc<=link->numberOfROCs(); iRoc++) { + const sipixelobjects::PixelROC * roc = link->roc(iRoc); + if (roc->idInDetUnit()idInDetUnit(); + if (roc->idInDetUnit()>ch.roc_last) ch.roc_last=roc->idInDetUnit(); + } + disabledChannelsDetSet.push_back(ch); + } + } + } else { + // fill list of detIds to be turned off by tracking + if(!tkerrorlist.empty()) { + std::vector::iterator it_find = find(tkerrorlist.begin(), tkerrorlist.end(), aPixelError.getType()); + if(it_find != tkerrorlist.end()){ + tkerror_detidcollection->push_back(errordetid); + } + } + } + + // fill list of detIds with errors to be studied + if(!usererrorlist.empty()) { + std::vector::iterator it_find = find(usererrorlist.begin(), usererrorlist.end(), aPixelError.getType()); + if(it_find != usererrorlist.end()){ + usererror_detidcollection->push_back(errordetid); + } + } + + } // loop on DetSet of errors + + if (!disabledChannelsDetSet.empty()) { + disabled_channelcollection->insert(errordetid, disabledChannelsDetSet.data(), disabledChannelsDetSet.size()); + } + + } // if error assigned to a real DetId + } // loop on errors in event for this FED + } // if errors to be included in the event + } // loop on FED data to be unpacked + + if(includeErrors) { + edm::DetSet& errorDetSet = errorcollection->find_or_insert(dummydetid); + errorDetSet.data = nodeterrors; + } + if (errorsInEvent) LogDebug("SiPixelRawToDigi") << "Error words were stored in this event"; - // check trailers - bool moreTrailers = true; - trailer++; - while (moreTrailers) { - trailer--; - //LogTrace("")<<"TRAILER: " << print(*trailer); - bool trailerStatus = errorcheck.checkTrailer(errorsInEvent, fedId, nWords, trailer, errors); - moreTrailers = trailerStatus; - } + if (theTimer) { + theTimer->stop(); + LogDebug("SiPixelRawToDigi") << "TIMING IS: (real)" << theTimer->realTime() ; + ndigis += formatter.nDigis(); + nwords += formatter.nWords(); + LogDebug("SiPixelRawToDigi") << " (Words/Digis) this ev: " + <Fill( theTimer->realTime() ); + hDigi->Fill(formatter.nDigis()); + } - const Word32 * bw =(const Word32 *)(header+1); - const Word32 * ew =(const Word32 *)(trailer); - if ( *(ew-1) == 0 ) { ew--; } - for (auto ww = bw; ww < ew; ++ww) { - word[wordCounterGPU++] = *ww; - } - } // end of for loop - - // GPU specific: RawToDigi -> clustering -> CPE - eventCount++; - eventIndex[eventCount] = wordCounterGPU; - static int ec=1; - cout<<"Data read for event: "< { static void fillDescriptions(edm::ConfigurationDescriptions& descriptions); /// get data, convert to digis attach againe to Event - void produce( edm::Event&, const edm::EventSetup& ) override; private: @@ -62,19 +61,5 @@ class SiPixelRawToDigi : public edm::stream::EDProducer<> { bool usePilotBlade; bool usePhase1; std::string cablingMapLabel; - typedef cms_uint32_t Word32; - typedef cms_uint64_t Word64; - - bool convertADCtoElectrons; - unsigned int *word; // to hold input for rawtodigi - unsigned int *fedIndex; // to hold fed index inside word[] array for rawtodigi on GPU - unsigned int *eventIndex; // to store staring index of each event in word[] array - - // to store the output - // uint *word_h, *fedIndex_h, *eventIndex_h; // host copy of input data - uint *xx_h, *yy_h, *adc_h; // host copy of output - // store the start and end index for each module (total 1856 modules-phase 1) - int *mIndexStart_h, *mIndexEnd_h; - }; #endif diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc new file mode 100644 index 0000000000000..7bfad96bddebb --- /dev/null +++ b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc @@ -0,0 +1,382 @@ +// Skip FED40 pilot-blade +// Include parameter driven interface to SiPixelQuality for study purposes +// exclude ROC(raw) based on bad ROC list in SiPixelQuality +// enabled by: process.siPixelDigis.UseQualityInfo = True (BY DEFAULT NOT USED) +// 20-10-2010 Andrew York (Tennessee) +// Jan 2016 Tamas Almos Vami (Tav) (Wigner RCP) -- Cabling Map label option +// Jul 2017 Viktor Veszpremi -- added PixelFEDChannel + +// This code is an entry point for GPU based pixel track reconstruction for HLT +// Modified by Sushil and Shashi for this purpose July-2017 + +#include "DataFormats/Common/interface/Handle.h" +#include "FWCore/Framework/interface/ESHandle.h" +#include "FWCore/Framework/interface/ESTransientHandle.h" +#include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h" +#include "FWCore/ParameterSet/interface/ParameterSetDescription.h" + +#include "FWCore/MessageLogger/interface/MessageLogger.h" + +#include "DataFormats/SiPixelDigi/interface/PixelDigi.h" + +#include "DataFormats/SiPixelRawData/interface/SiPixelRawDataError.h" + +#include "DataFormats/Common/interface/DetSetVector.h" +#include "DataFormats/FEDRawData/interface/FEDRawDataCollection.h" +#include "DataFormats/FEDRawData/interface/FEDRawData.h" + +#include "DataFormats/FEDRawData/interface/FEDNumbering.h" +#include "DataFormats/DetId/interface/DetIdCollection.h" +#include "CondFormats/SiPixelObjects/interface/SiPixelFedCablingMap.h" +#include "CondFormats/SiPixelObjects/interface/SiPixelFedCablingTree.h" +#include "EventFilter/SiPixelRawToDigi/interface/PixelDataFormatter.h" + +#include "CondFormats/SiPixelObjects/interface/SiPixelQuality.h" + +#include "DataFormats/SiPixelDetId/interface/PixelFEDChannel.h" +#include "EventFilter/SiPixelRawToDigi/interface/PixelUnpackingRegions.h" +#include "FWCore/Framework/interface/ConsumesCollector.h" + +#include "FWCore/PluginManager/interface/ModuleDef.h" +#include "FWCore/Framework/interface/MakerMacros.h" + +#include "TH1D.h" +#include "TFile.h" +#include "SiPixelRawToDigiGPU.h" +#include +#include +#include +#include + +#include // for GPU +#include // for pinned memory +#include "EventInfoGPU.h" // Event Info +// device memory intialization for RawTodigi +#include "RawToDigiMem.h" +// // device memory initialization for CPE +// #include "CPEGPUMem.h" +// //device memory initialization for clustering +// #include "PixelClusterMem.h" + +using namespace std; + +// ----------------------------------------------------------------------------- +SiPixelRawToDigiGPU::SiPixelRawToDigiGPU( const edm::ParameterSet& conf ) + : config_(conf), + badPixelInfo_(nullptr), + regions_(nullptr), + hCPU(nullptr), hDigi(nullptr) +{ + + includeErrors = config_.getParameter("IncludeErrors"); + useQuality = config_.getParameter("UseQualityInfo"); + if (config_.exists("ErrorList")) { + tkerrorlist = config_.getParameter > ("ErrorList"); + } + if (config_.exists("UserErrorList")) { + usererrorlist = config_.getParameter > ("UserErrorList"); + } + tFEDRawDataCollection = consumes (config_.getParameter("InputLabel")); + + //start counters + ndigis = 0; + nwords = 0; + + // Products + produces< edm::DetSetVector >(); + if(includeErrors){ + produces< edm::DetSetVector >(); + produces(); + produces("UserErrorModules"); + produces >(); + } + + // regions + if (config_.exists("Regions")) { + if(!config_.getParameter("Regions").getParameterNames().empty()) + { + regions_ = new PixelUnpackingRegions(config_, consumesCollector()); + } + } + + // Timing + bool timing = config_.getUntrackedParameter("Timing",false); + if (timing) { + theTimer.reset( new edm::CPUTimer ); + hCPU = new TH1D ("hCPU","hCPU",100,0.,0.050); + hDigi = new TH1D("hDigi","hDigi",50,0.,15000.); + } + + // Control the usage of pilot-blade data, FED=40 + usePilotBlade = false; + if (config_.exists("UsePilotBlade")) { + usePilotBlade = config_.getParameter ("UsePilotBlade"); + if(usePilotBlade) edm::LogInfo("SiPixelRawToDigiGPU") << " Use pilot blade data (FED 40)"; + } + + // Control the usage of phase1 + usePhase1 = false; + if (config_.exists("UsePhase1")) { + usePhase1 = config_.getParameter ("UsePhase1"); + if(usePhase1) edm::LogInfo("SiPixelRawToDigiGPU") << " Using phase1"; + } + //CablingMap could have a label //Tav + cablingMapLabel = config_.getParameter ("CablingMapLabel"); + + //GPU specific + convertADCtoElectrons = config_.getParameter("ConvertADCtoElectrons"); + const int MAX_FED = 150; + const int MAX_WORD = 2000; + int WSIZE = MAX_FED*MAX_WORD*NEVENT*sizeof(unsigned int); + int FSIZE = 2*MAX_FED*NEVENT*sizeof(unsigned int)+sizeof(unsigned int); + + //word = (unsigned int*)malloc(WSIZE); + cudaMallocHost((void**)&word, WSIZE); + //fedIndex =(unsigned int*)malloc(FSIZE); + cudaMallocHost((void**)&fedIndex, FSIZE); + eventIndex = (unsigned int*)malloc((NEVENT+1)*sizeof(unsigned int)); + eventIndex[0] =0; + // to store the output of RawToDigi + xx_h = new uint[WSIZE]; + yy_h = new uint[WSIZE]; + adc_h = new uint[WSIZE]; + + mIndexStart_h = new int[NEVENT*NMODULE +1]; + mIndexEnd_h = new int[NEVENT*NMODULE +1]; + + // allocate memory for RawToDigi on GPU + initDeviceMemory(); + + // // allocate auxilary memory for clustering + // initDeviceMemCluster(); + + // // allocate memory for CPE on GPU + // initDeviceMemCPE(); + +} + + +// ----------------------------------------------------------------------------- +SiPixelRawToDigiGPU::~SiPixelRawToDigiGPU() { + edm::LogInfo("SiPixelRawToDigiGPU") << " HERE ** SiPixelRawToDigiGPU destructor!"; + + if (regions_) delete regions_; + + if (theTimer) { + TFile rootFile("analysis.root", "RECREATE", "my histograms"); + hCPU->Write(); + hDigi->Write(); + } + // free(word); + cudaFreeHost(word); + // free(fedIndex); + cudaFreeHost(fedIndex); + free(eventIndex); + delete[] xx_h; + delete[] yy_h; + delete[] adc_h; + delete[] mIndexStart_h; + delete[] mIndexEnd_h; + // free device memory used for RawToDigi on GPU + freeMemory(); + // free auxilary memory used for clustering + // freeDeviceMemCluster(); + // free device memory used for CPE on GPU + // freeDeviceMemCPE(); +} + +void +SiPixelRawToDigiGPU::fillDescriptions(edm::ConfigurationDescriptions& descriptions) { + edm::ParameterSetDescription desc; + desc.add("IncludeErrors",true); + desc.add("UseQualityInfo",false); + { + std::vector temp1; + temp1.reserve(1); + temp1.push_back(29); + desc.add >("ErrorList",temp1)->setComment("## ErrorList: list of error codes used by tracking to invalidate modules"); + } + { + std::vector temp1; + temp1.reserve(1); + temp1.push_back(40); + desc.add >("UserErrorList",temp1)->setComment("## UserErrorList: list of error codes used by Pixel experts for investigation"); + } + desc.add("InputLabel",edm::InputTag("siPixelRawData")); + { + edm::ParameterSetDescription psd0; + psd0.addOptional>("inputs"); + psd0.addOptional>("deltaPhi"); + psd0.addOptional>("maxZ"); + psd0.addOptional("beamSpot"); + desc.add("Regions",psd0)->setComment("## Empty Regions PSet means complete unpacking"); + } + desc.addUntracked("Timing",false); + desc.add("UsePilotBlade",false)->setComment("## Use pilot blades"); + desc.add("UsePhase1",false)->setComment("## Use phase1"); + desc.add("CablingMapLabel","")->setComment("CablingMap label"); //Tav + desc.addOptional("CheckPixelOrder"); // never used, kept for back-compatibility + desc.add("ConvertADCtoElectrons", false)->setComment("## do the calibration ADC-> Electron and apply the threshold, requried for clustering"); + descriptions.add("siPixelRawToDigi",desc); +} + +// ----------------------------------------------------------------------------- + + +// ----------------------------------------------------------------------------- +void SiPixelRawToDigiGPU::produce( edm::Event& ev, + const edm::EventSetup& es) +{ + //const uint32_t dummydetid = 0xffffffff; + //debug = edm::MessageDrop::instance()->debugEnabled; + + // initialize cabling map or update if necessary + if (recordWatcher.check( es )) { + // cabling map, which maps online address (fed->link->ROC->local pixel) to offline (DetId->global pixel) + edm::ESTransientHandle cablingMap; + es.get().get( cablingMapLabel, cablingMap ); //Tav + fedIds = cablingMap->fedIds(); + // cabling_ = cablingMap->cablingTree(); + // LogDebug("map version:")<< cabling_->version(); + } + +/* // initialize quality record or update if necessary + if (qualityWatcher.check( es )&&useQuality) { + // quality info for dead pixel modules or ROCs + edm::ESHandle qualityInfo; + es.get().get( qualityInfo ); + badPixelInfo_ = qualityInfo.product(); + if (!badPixelInfo_) { + edm::LogError("SiPixelQualityNotPresent")<<" Configured to use SiPixelQuality, but SiPixelQuality not present"< buffers; + ev.getByToken(tFEDRawDataCollection, buffers); + + /*// create product (digis & errors) + auto collection = std::make_unique>(); + // collection->reserve(8*1024); + auto errorcollection = std::make_unique>(); + auto tkerror_detidcollection = std::make_unique(); + auto usererror_detidcollection = std::make_unique(); + auto disabled_channelcollection = std::make_unique >(); + + //PixelDataFormatter formatter(cabling_.get()); // phase 0 only + PixelDataFormatter formatter(cabling_.get(), usePhase1); // for phase 1 & 0 + + formatter.setErrorStatus(includeErrors); + + if (useQuality) formatter.setQualityStatus(useQuality, badPixelInfo_); + + if (theTimer) theTimer->start(); + bool errorsInEvent = false; + PixelDataFormatter::DetErrors nodeterrors; + + if (regions_) { + regions_->run(ev, es); + formatter.setModulesToUnpack(regions_->modulesToUnpack()); + LogDebug("SiPixelRawToDigiGPU") << "region2unpack #feds: "<nFEDs(); + LogDebug("SiPixelRawToDigiGPU") << "region2unpack #modules (BPIX,EPIX,total): "<nBarrelModules()<<" "<nForwardModules()<<" "<nModules(); + }*/ + // GPU specific: Data extraction for RawToDigi GPU + static unsigned int wordCounterGPU =0; + unsigned int fedCounter = 0; + const unsigned int MAX_FED = 150; + static int eventCount = 0; + bool errorsInEvent = false; + + ErrorChecker errorcheck; + for (auto aFed = fedIds.begin(); aFed != fedIds.end(); ++aFed) { + int fedId = *aFed; + + // for GPU + // first 150 index stores the fedId and next 150 will store the + // start index of word in that fed + fedIndex[2*MAX_FED*eventCount+fedCounter] = fedId-1200; + fedIndex[MAX_FED + 2*MAX_FED*eventCount+fedCounter] = wordCounterGPU; // MAX_FED = 150 + fedCounter++; + + //get event data for this fed + const FEDRawData& rawData = buffers->FEDData( fedId ); + //GPU specific + PixelDataFormatter::Errors errors; + int nWords = rawData.size()/sizeof(Word64); + if(nWords==0) { + word[wordCounterGPU++] =0; + continue; + } + + // check CRC bit + const Word64* trailer = reinterpret_cast(rawData.data())+(nWords-1); + if(!errorcheck.checkCRC(errorsInEvent, fedId, trailer, errors)) { + word[wordCounterGPU++] =0; + continue; + } + + // check headers + const Word64* header = reinterpret_cast(rawData.data()); header--; + bool moreHeaders = true; + while (moreHeaders) { + header++; + //LogTrace("")<<"HEADER: " << print(*header); + bool headerStatus = errorcheck.checkHeader(errorsInEvent, fedId, header, errors); + moreHeaders = headerStatus; + } + + // check trailers + bool moreTrailers = true; + trailer++; + while (moreTrailers) { + trailer--; + //LogTrace("")<<"TRAILER: " << print(*trailer); + bool trailerStatus = errorcheck.checkTrailer(errorsInEvent, fedId, nWords, trailer, errors); + moreTrailers = trailerStatus; + } + + const Word32 * bw =(const Word32 *)(header+1); + const Word32 * ew =(const Word32 *)(trailer); + if ( *(ew-1) == 0 ) { ew--; } + for (auto ww = bw; ww < ew; ++ww) { + word[wordCounterGPU++] = *ww; + } + } // end of for loop + + // GPU specific: RawToDigi -> clustering -> CPE + eventCount++; + eventIndex[eventCount] = wordCounterGPU; + static int ec=1; + cout<<"Data read for event: "< { +public: + + /// ctor + explicit SiPixelRawToDigiGPU( const edm::ParameterSet& ); + + /// dtor + ~SiPixelRawToDigiGPU() override; + + static void fillDescriptions(edm::ConfigurationDescriptions& descriptions); + + /// get data, convert to digis attach againe to Event + + void produce( edm::Event&, const edm::EventSetup& ) override; + +private: + + edm::ParameterSet config_; + std::unique_ptr cabling_; + const SiPixelQuality* badPixelInfo_; + PixelUnpackingRegions* regions_; + edm::EDGetTokenT tFEDRawDataCollection; + + TH1D *hCPU, *hDigi; + std::unique_ptr theTimer; + bool includeErrors; + bool useQuality; + bool debug; + std::vector tkerrorlist; + std::vector usererrorlist; + std::vector fedIds; + edm::ESWatcher recordWatcher; + edm::ESWatcher qualityWatcher; + edm::InputTag label; + int ndigis; + int nwords; + bool usePilotBlade; + bool usePhase1; + std::string cablingMapLabel; + typedef cms_uint32_t Word32; + typedef cms_uint64_t Word64; + + bool convertADCtoElectrons; + unsigned int *word; // to hold input for rawtodigi + unsigned int *fedIndex; // to hold fed index inside word[] array for rawtodigi on GPU + unsigned int *eventIndex; // to store staring index of each event in word[] array + + // to store the output + // uint *word_h, *fedIndex_h, *eventIndex_h; // host copy of input data + uint *xx_h, *yy_h, *adc_h; // host copy of output + // store the start and end index for each module (total 1856 modules-phase 1) + int *mIndexStart_h, *mIndexEnd_h; + +}; +#endif diff --git a/EventFilter/SiPixelRawToDigi/test/log.log b/EventFilter/SiPixelRawToDigi/test/log.log deleted file mode 100644 index d055817a41747..0000000000000 --- a/EventFilter/SiPixelRawToDigi/test/log.log +++ /dev/null @@ -1,3 +0,0 @@ -09-Nov-2017 15:59:15 CET Initiating request to open file file:/afs/cern.ch/work/s/sdubey/data/Raw_Data_Phase1/7C654D7C-9E40-E711-8690-0025905A48BC.root -09-Nov-2017 15:59:16 CET Successfully opened file file:/afs/cern.ch/work/s/sdubey/data/Raw_Data_Phase1/7C654D7C-9E40-E711-8690-0025905A48BC.root -09-Nov-2017 15:59:46 CET Closed file file:/afs/cern.ch/work/s/sdubey/data/Raw_Data_Phase1/7C654D7C-9E40-E711-8690-0025905A48BC.root From 3d41fc6e2ee1fee18c1ad29af029be6c45b8d56c Mon Sep 17 00:00:00 2001 From: Cesare Calabria Date: Sun, 26 Nov 2017 15:09:34 +0100 Subject: [PATCH 03/88] Better integration in CMSSW, validation, cleanup and fixes - fill siPixel digi collection - other changes - add DQM validation - fix column binning --- .../SiPixelRawToDigi/plugins/EventInfoGPU.h | 2 +- .../SiPixelRawToDigi/plugins/RawToDigiGPU.cu | 35 +-- .../SiPixelRawToDigi/plugins/RawToDigiGPU.h | 4 +- .../SiPixelRawToDigi/plugins/RawToDigiMem.h | 3 +- .../plugins/SiPixelRawToDigiGPU.cc | 67 ++++-- .../plugins/SiPixelRawToDigiGPU.h | 4 +- .../python/SiPixelRawToDigi_cfi.py | 20 ++ .../test/runRawToDigi_GPU_phase1.py | 213 +++++++++++++----- 8 files changed, 249 insertions(+), 99 deletions(-) diff --git a/EventFilter/SiPixelRawToDigi/plugins/EventInfoGPU.h b/EventFilter/SiPixelRawToDigi/plugins/EventInfoGPU.h index 447cf32789033..1170717e4adf8 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/EventInfoGPU.h +++ b/EventFilter/SiPixelRawToDigi/plugins/EventInfoGPU.h @@ -4,7 +4,7 @@ #ifndef EVENTINFO_GPU #define EVENTINFO_GPU -const int NEVENT = 128 ; //optimal number of events to run simultaneously, +const int NEVENT = 1 ; //optimal number of events to run simultaneously, // using 4 cuda stream, hence it should be multiple of 4 const int NMODULE = 1856; // for phase 1, we have 1856 modules diff --git a/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.cu b/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.cu index fab50d47e6d78..caf27d810fc80 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.cu +++ b/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.cu @@ -98,6 +98,7 @@ void initDeviceMemory() { cudaMalloc((void**)&yy_adc, MAX_WORD_SIZE); cudaMalloc((void**)&adc_d, MAX_WORD_SIZE); cudaMalloc((void**)&layer_d , MAX_WORD_SIZE); + cudaMalloc((void**)&rawIdArr_d, MAX_WORD_SIZE); // to store the x and y coordinate cudaMalloc((void**)&moduleId_d, MAX_WORD_SIZE); cudaMalloc((void**)&mIndexStart_d, MSIZE); @@ -125,6 +126,7 @@ void freeMemory() { cudaFree(yy_d); cudaFree(xx_adc); cudaFree(yy_adc); + cudaFree(rawIdArr_d); cudaFree(moduleId_d); cudaFree(mIndexStart_d); @@ -293,7 +295,7 @@ __global__ void applyADCthreshold_kernel // Kernel to perform Raw to Digi conversion __global__ void RawToDigi_kernel(const CablingMap *Map,const uint *Word,const uint *fedIndex, uint *eventIndex,const uint stream, uint *XX, uint *YY, uint *moduleId, int *mIndexStart, - int *mIndexEnd, uint *ADC, uint *layerArr) + int *mIndexEnd, uint *ADC, uint *layerArr, uint *rawIdArr) { uint blockId = blockIdx.x; uint eventno = blockIdx.y + gridDim.y*stream; @@ -314,17 +316,18 @@ __global__ void RawToDigi_kernel(const CablingMap *Map,const uint *Word,const ui //if(threadId==0) printf("Event: %u blockId: %u start: %u end: %u\n", eventno, blockId, begin, end); int no_itr = (end - begin)/blockDim.x + 1; // to deal with number of hits greater than blockDim.x #pragma unroll - for(int i =0; i>>(Map,word_d, fedIndex_d,eventIndex_d,i, xx_d, yy_d, moduleId_d, - mIndexStart_d, mIndexEnd_d, adc_d,layer_d); + mIndexStart_d, mIndexEnd_d, adc_d, layer_d, rawIdArr_d); } checkCUDAError("Error in RawToDigi_kernel"); @@ -509,12 +515,12 @@ void RawToDigi_wrapper (const uint wordCounter, uint *word, const uint fedCounte //cudaDeviceSynchronize(); // kernel to apply adc threashold on the channel - ADCThreshold adcThreshold; - uint numThreads = 512; - uint numBlocks = wordCounter/512 +1; - applyADCthreshold_kernel<<>>(xx_d, yy_d,layer_d,adc_d,wordCounter,adcThreshold, xx_adc, yy_adc); - cudaDeviceSynchronize(); - checkCUDAError("Error in applying ADC threshold"); + //ADCThreshold adcThreshold; + //uint numThreads = 512; + //uint numBlocks = wordCounter/512 +1; + //applyADCthreshold_kernel<<>>(xx_d, yy_d,layer_d,adc_d, wordCounter, adcThreshold, xx_adc, yy_adc); + //cudaDeviceSynchronize(); + //checkCUDAError("Error in applying ADC threshold"); cout << "Raw data is converted into digi for " << NEVENT << " Events" << endl; // copy data to host variable @@ -528,6 +534,7 @@ void RawToDigi_wrapper (const uint wordCounter, uint *word, const uint fedCounte cudaMemcpy(yy_h, yy_d, wordCounter*sizeof(uint), cudaMemcpyDeviceToHost); } cudaMemcpy(adc_h, adc_d, wordCounter*sizeof(uint), cudaMemcpyDeviceToHost); + cudaMemcpy(rawIdArr_h, rawIdArr_d, wordCounter*sizeof(uint), cudaMemcpyDeviceToHost); cudaMemcpy(mIndexStart_h, mIndexStart_d, NEVENT*NMODULE*sizeof(int), cudaMemcpyDeviceToHost); cudaMemcpy(mIndexEnd_h, mIndexEnd_d, NEVENT*NMODULE*sizeof(int), cudaMemcpyDeviceToHost); diff --git a/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.h b/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.h index ede7f9f7f3583..8e8bd8ad40bb8 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.h +++ b/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.h @@ -43,7 +43,7 @@ const uint numColsInRoc = 52; const uint MAX_LINK = 48; //maximum links/channels for phase1 const uint MAX_ROC = 8; const uint MAX_WORD = 2000;//500; - const int NSTREAM = 4; + const int NSTREAM = 1; const uint ADC_shift = 0; const uint PXID_shift = ADC_shift + ADC_bits; @@ -82,7 +82,7 @@ struct CablingMap{ //CablingMap *Map; //GPU specific uint *word_d, *fedIndex_d, *eventIndex_d; // Device copy of input data - uint *xx_d, *yy_d,*xx_adc, *yy_adc, *moduleId_d, *adc_d, *layer_d; // Device copy + uint *xx_d, *yy_d,*xx_adc, *yy_adc, *moduleId_d, *adc_d, *layer_d, *rawIdArr_d; // Device copy // store the start and end index for each module (total 1856 modules-phase 1) cudaStream_t stream[NSTREAM]; int *mIndexStart_d, *mIndexEnd_d; diff --git a/EventFilter/SiPixelRawToDigi/plugins/RawToDigiMem.h b/EventFilter/SiPixelRawToDigi/plugins/RawToDigiMem.h index 8fa2cc2f687c1..bd1d3adeefcae 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/RawToDigiMem.h +++ b/EventFilter/SiPixelRawToDigi/plugins/RawToDigiMem.h @@ -2,14 +2,13 @@ * */ - #ifndef RAWTODIGI_CPU_GPU_H #define RAWTODIGI_CPU_GPU_H // wrapper function to call RawToDigi on the GPU from host side void RawToDigi_wrapper (const uint wordCounter, uint *word, const uint fedCounter, uint *fedIndex, uint *eventIndex, bool convertADCtoElectrons, uint *xx_h, uint *yy_h, uint *adc_h, int *mIndexStart_h, - int *mIndexEnd_h); + int *mIndexEnd_h, uint *rawIdArr_h); void initCablingMap(); void initDeviceMemory(); diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc index 7bfad96bddebb..c6afd53d3b108 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc +++ b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc @@ -140,6 +140,7 @@ SiPixelRawToDigiGPU::SiPixelRawToDigiGPU( const edm::ParameterSet& conf ) xx_h = new uint[WSIZE]; yy_h = new uint[WSIZE]; adc_h = new uint[WSIZE]; + rawIdArr_h = new uint[WSIZE]; mIndexStart_h = new int[NEVENT*NMODULE +1]; mIndexEnd_h = new int[NEVENT*NMODULE +1]; @@ -175,6 +176,7 @@ SiPixelRawToDigiGPU::~SiPixelRawToDigiGPU() { delete[] xx_h; delete[] yy_h; delete[] adc_h; + delete[] rawIdArr_h; delete[] mIndexStart_h; delete[] mIndexEnd_h; // free device memory used for RawToDigi on GPU @@ -217,7 +219,7 @@ SiPixelRawToDigiGPU::fillDescriptions(edm::ConfigurationDescriptions& descriptio desc.add("CablingMapLabel","")->setComment("CablingMap label"); //Tav desc.addOptional("CheckPixelOrder"); // never used, kept for back-compatibility desc.add("ConvertADCtoElectrons", false)->setComment("## do the calibration ADC-> Electron and apply the threshold, requried for clustering"); - descriptions.add("siPixelRawToDigi",desc); + descriptions.add("siPixelRawToDigiGPU",desc); } // ----------------------------------------------------------------------------- @@ -254,9 +256,9 @@ void SiPixelRawToDigiGPU::produce( edm::Event& ev, edm::Handle buffers; ev.getByToken(tFEDRawDataCollection, buffers); - /*// create product (digis & errors) + // create product (digis & errors) auto collection = std::make_unique>(); - // collection->reserve(8*1024); + /*// collection->reserve(8*1024); auto errorcollection = std::make_unique>(); auto tkerror_detidcollection = std::make_unique(); auto usererror_detidcollection = std::make_unique(); @@ -285,7 +287,9 @@ void SiPixelRawToDigiGPU::produce( edm::Event& ev, const unsigned int MAX_FED = 150; static int eventCount = 0; bool errorsInEvent = false; - + + edm::DetSet * detDigis=nullptr; + ErrorChecker errorcheck; for (auto aFed = fedIds.begin(); aFed != fedIds.end(); ++aFed) { int fedId = *aFed; @@ -345,37 +349,68 @@ void SiPixelRawToDigiGPU::produce( edm::Event& ev, // GPU specific: RawToDigi -> clustering -> CPE eventCount++; eventIndex[eventCount] = wordCounterGPU; - static int ec=1; + static int ec = 1; cout<<"Data read for event: "<::const_iterator it; + for (it = collection->begin(); it != collection->end(); ++it) { + for(PixelDigi const& digi : *it) { + + std::cout<<"RawID: "<detId())<<", row: "< { public: - + /// ctor explicit SiPixelRawToDigiGPU( const edm::ParameterSet& ); @@ -72,7 +72,7 @@ class SiPixelRawToDigiGPU : public edm::stream::EDProducer<> { // to store the output // uint *word_h, *fedIndex_h, *eventIndex_h; // host copy of input data - uint *xx_h, *yy_h, *adc_h; // host copy of output + uint *xx_h, *yy_h, *adc_h, *rawIdArr_h; // host copy of output // store the start and end index for each module (total 1856 modules-phase 1) int *mIndexStart_h, *mIndexEnd_h; diff --git a/EventFilter/SiPixelRawToDigi/python/SiPixelRawToDigi_cfi.py b/EventFilter/SiPixelRawToDigi/python/SiPixelRawToDigi_cfi.py index fda0b69fa46a1..feb5089785f1d 100644 --- a/EventFilter/SiPixelRawToDigi/python/SiPixelRawToDigi_cfi.py +++ b/EventFilter/SiPixelRawToDigi/python/SiPixelRawToDigi_cfi.py @@ -1,5 +1,6 @@ import FWCore.ParameterSet.Config as cms import EventFilter.SiPixelRawToDigi.siPixelRawToDigi_cfi +import EventFilter.SiPixelRawToDigi.siPixelRawToDigiGPU_cfi siPixelDigis = EventFilter.SiPixelRawToDigi.siPixelRawToDigi_cfi.siPixelRawToDigi.clone() siPixelDigis.Timing = cms.untracked.bool(False) @@ -18,5 +19,24 @@ siPixelDigis.Regions = cms.PSet( ) siPixelDigis.CablingMapLabel = cms.string("") +siPixelDigisGPU = EventFilter.SiPixelRawToDigi.siPixelRawToDigiGPU_cfi.siPixelRawToDigiGPU.clone() +siPixelDigisGPU.Timing = cms.untracked.bool(False) +siPixelDigisGPU.IncludeErrors = cms.bool(False) +siPixelDigisGPU.InputLabel = cms.InputTag("rawDataCollector") +siPixelDigisGPU.UseQualityInfo = cms.bool(False) +## ErrorList: list of error codes used by tracking to invalidate modules +siPixelDigisGPU.ErrorList = cms.vint32(29) +## UserErrorList: list of error codes used by Pixel experts for investigation +siPixelDigisGPU.UserErrorList = cms.vint32(40) +## Use pilot blades +siPixelDigisGPU.UsePilotBlade = cms.bool(False) +## Use phase1 +siPixelDigisGPU.UsePhase1 = cms.bool(False) +## Empty Regions PSet means complete unpacking +siPixelDigisGPU.Regions = cms.PSet( ) +siPixelDigisGPU.CablingMapLabel = cms.string("") + from Configuration.Eras.Modifier_phase1Pixel_cff import phase1Pixel phase1Pixel.toModify(siPixelDigis, UsePhase1=True) +phase1Pixel.toModify(siPixelDigisGPU, UsePhase1=True) + diff --git a/EventFilter/SiPixelRawToDigi/test/runRawToDigi_GPU_phase1.py b/EventFilter/SiPixelRawToDigi/test/runRawToDigi_GPU_phase1.py index e3b14d507740c..5065f493478b2 100644 --- a/EventFilter/SiPixelRawToDigi/test/runRawToDigi_GPU_phase1.py +++ b/EventFilter/SiPixelRawToDigi/test/runRawToDigi_GPU_phase1.py @@ -1,75 +1,164 @@ import FWCore.ParameterSet.Config as cms -process = cms.Process("MyRawToDigi") +from Configuration.StandardSequences.Eras import eras -process.load("FWCore.MessageLogger.MessageLogger_cfi") -#process.load('Configuration.StandardSequences.GeometryRecoDB_cff') -process.load('Configuration.Geometry.GeometryExtended2017Reco_cff') -#process.load('Configuration.Geometry.GeometryExtended2017NewFPixReco_cff') +process = cms.Process('MyDigis',eras.Run2_2017) -#process.load("Configuration.StandardSequences.MagneticField_38T_cff") -#process.load('Configuration.StandardSequences.MagneticField_AutoFromDBCurrent_cff') -process.load("Configuration.StandardSequences.Services_cff") +# import of standard configurations +process.load('Configuration.StandardSequences.Services_cff') +process.load('SimGeneral.HepPDTESSource.pythiapdt_cfi') +process.load('FWCore.MessageService.MessageLogger_cfi') +process.load('Configuration.EventContent.EventContent_cff') +process.load('SimGeneral.MixingModule.mixNoPU_cfi') +process.load('Configuration.StandardSequences.GeometryRecoDB_cff') +process.load('Configuration.StandardSequences.MagneticField_cff') +process.load('Configuration.StandardSequences.RawToDigi_cff') +process.load('Configuration.StandardSequences.L1Reco_cff') +process.load('Configuration.StandardSequences.Reconstruction_cff') +process.load('CommonTools.ParticleFlow.EITopPAG_cff') +process.load('PhysicsTools.PatAlgos.slimming.metFilterPaths_cff') +process.load('Configuration.StandardSequences.PATMC_cff') +process.load('Configuration.StandardSequences.Validation_cff') +process.load('DQMOffline.Configuration.DQMOfflineMC_cff') +process.load('Configuration.StandardSequences.FrontierConditions_GlobalTag_cff') +process.load('Configuration.StandardSequences.DQMSaverAtRunEnd_cff') -process.load("Configuration.StandardSequences.FrontierConditions_GlobalTag_cff") -from Configuration.AlCa.GlobalTag import GlobalTag -# to use no All -# 2015 -#process.GlobalTag.globaltag = 'GR_P_V56' # for 247607 -#process.GlobalTag.globaltag = 'PRE_R_71_V3' #2014 - -#2017 -#process.GlobalTag.globaltag='81X_upgrade2017_realistic_v26' -# AUTO conditions -#process.GlobalTag = GlobalTag(process.GlobalTag, 'auto:run2_data', '') -#process.GlobalTag = GlobalTag(process.GlobalTag, 'auto:run1_data', '') -#process.GlobalTag = GlobalTag(process.GlobalTag, 'auto:run2_mc', '') -#process.GlobalTag = GlobalTag(process.GlobalTag, 'auto:run2_design', '') -#process.GlobalTag = GlobalTag(process.GlobalTag, 'auto:upgrade2017', '') -#process.GlobalTag = GlobalTag(process.GlobalTag, '76X_upgrade2017_design_v8', '') -#process.GlobalTag.globaltag ="81X_dataRun2_relval_v14" -#process.GlobalTag = GlobalTag(process.GlobalTag, 'auto:phase1_2017_realistic', '') -process.GlobalTag = GlobalTag(process.GlobalTag, 'auto:phase1_2018_realistic', '') -process.maxEvents = cms.untracked.PSet( input = cms.untracked.int32(128)) +process.maxEvents = cms.untracked.PSet( + input = cms.untracked.int32(10) +) +# Input source process.source = cms.Source("PoolSource", -fileNames = cms.untracked.vstring( -# 'file:/afs/cern.ch/work/d/dkotlins/public/MC/mu_phase1/pt100_81/raw/raw1_formatfix.root' -#'root://cms-xrd-global.cern.ch//store/relval/CMSSW_8_1_0/RelValMinBias_13/GEN-SIM-DIGI-RAW/81X_upgrade2017_realistic_v26_HLT2017Trk-v1/10000/06A2997E-3BC1-E611-B286-0CC47A78A30E.root' -#2018 CMSSW_9_4_0 -'/store/relval/CMSSW_9_4_0/RelValTTbar_13/GEN-SIM-DIGI-RAW/PU25ns_94X_upgrade2018_realistic_v5-v1/10000/F87005CD-CBC8-E711-A9F5-0CC47A4D7694.root' - -#2017 CMSSW_9_2_0 -# download this file -# /store/relval/CMSSW_9_2_0/RelValTTbar_13/GEN-SIM-DIGI-RAW/PU25ns_91X_upgrade2017_realistic_v5_PU50-v1/10000/7C654D7C-9E40-E711-8690-0025905A48BC.root -#'file:/afs/cern.ch/work/s/sdubey/data/Raw_Data_Phase1/7C654D7C-9E40-E711-8690-0025905A48BC.root' -#'file:/home/fpantale/data/920/PU50/085D5AAF-9E40-E711-B12A-0025905A609E.root' -#2016 CMSSW_8_1_0 -#'file:/afs/cern.ch/work/s/sdubey/data/Raw_Data_Phase1/0216ABF7-19B1-E611-8786-0025905A60F8.root' -#'file:/afs/cern.ch/work/s/sdubey/data/9279A7C3-59ED-E511-95C8-0025905A60F8.root' -#'file:/afs/cern.ch/work/s/sdubey/data/RawToDigi/2EF61B7D-F216-E211-98C3-001D09F28D54.root' -#'file:/afs/cern.ch/work/s/sdubey/data/RawToDigi/data_phase1/0A176EE8-38C1-E611-B912-0CC47A4D765A.root' -#'/store/backfill/1/data/Tier0_Test_SUPERBUNNIES_vocms015/Commissioning/RAW/v82/000/276/357/00000/1AA497F3-EC6D-E611-A6B3-02163E0146CB.root' -#'/store/relval/CMSSW_8_1_0/MET/RAW-RECO/HighMET-81X_dataRun2_relval_v14_RelVal_met2016B-v1/10000/182C5786-C8BE-E611-B1C2-0CC47A7 8A33E.root' - ) + fileNames = cms.untracked.vstring( + 'file:step2.root', +# '/store/relval/CMSSW_9_4_0_pre3/RelValTTbar_13/GEN-SIM-RECO/PU25ns_94X_mc2017_realistic_v4_highPU_AVE50-v1/10000/22E2A744-E3BA-E711-A1A8-5065F3815241.root', + ), + secondaryFileNames = cms.untracked.vstring( +# '/store/relval/CMSSW_9_4_0_pre3/RelValTTbar_13/GEN-SIM-DIGI-RAW/PU25ns_94X_mc2017_realistic_v4_highPU_AVE50-v1/10000/62236337-BEBA-E711-9962-4C79BA1810EB.root', +# '/store/relval/CMSSW_9_4_0_pre3/RelValTTbar_13/GEN-SIM-DIGI-RAW/PU25ns_94X_mc2017_realistic_v4_highPU_AVE50-v1/10000/D6384D37-BEBA-E711-B24C-4C79BA180B9F.root', + ) ) -#file=/store/relval/CMSSW_8_1_0/RelValMinBias_13/GEN-SIM-DIGI-RAW/81X_upgrade2017_realistic_v26_HLT2017Trk-v1/10000/06A2997E-3BC1-E611-B286-0CC47A78A30E.root +process.options = cms.untracked.PSet( + Rethrow = cms.untracked.vstring('ProductNotFound'), + fileMode = cms.untracked.string('FULLMERGE') +) -process.load("EventFilter.SiPixelRawToDigi.SiPixelRawToDigi_cfi") +# Production Info +process.configurationMetadata = cms.untracked.PSet( + annotation = cms.untracked.string('step3 nevts:10'), + name = cms.untracked.string('Applications'), + version = cms.untracked.string('$Revision: 1.19 $') +) + +# Output definition + +process.FEVTDEBUGHLToutput = cms.OutputModule("PoolOutputModule", + dataset = cms.untracked.PSet( + dataTier = cms.untracked.string('GEN-SIM-DIGI-RAW'), + filterName = cms.untracked.string('') + ), + fileName = cms.untracked.string('file:digi.root'), +# outputCommands = cms.untracked.vstring("drop *", "keep *_simSiPixelDigis_*_*", "keep *_siPixelDigisGPU_*_*"), + outputCommands = cms.untracked.vstring("keep *"), + splitLevel = cms.untracked.int32(0) +) -process.siPixelDigis.InputLabel = 'rawDataCollector' -process.siPixelDigis.IncludeErrors = False #True -process.siPixelDigis.Timing = False -process.siPixelDigis.UsePhase1 = cms.bool(True) -# do the calibration ADC -> Electrons as required in clustering and apply the channel threshold -process.siPixelDigis.ConvertADCtoElectrons = cms.bool(False) - -process.MessageLogger = cms.Service("MessageLogger", - #debugModules = cms.untracked.vstring('siPixelDigis'), - destinations = cms.untracked.vstring('log'), - log = cms.untracked.PSet( threshold = cms.untracked.string('WARNING')) - #log = cms.untracked.PSet( threshold = cms.untracked.string('DEBUG')) +process.DQMoutput = cms.OutputModule("DQMRootOutputModule", + dataset = cms.untracked.PSet( + dataTier = cms.untracked.string('DQMIO'), + filterName = cms.untracked.string('') + ), + fileName = cms.untracked.string('file:step3_inDQM.root'), + outputCommands = process.DQMEventContent.outputCommands, + splitLevel = cms.untracked.int32(0) ) -process.p = cms.Path(process.siPixelDigis) + +# Additional output definition + +# Other statements +from Configuration.AlCa.GlobalTag import GlobalTag +process.GlobalTag = GlobalTag(process.GlobalTag, 'auto:phase1_2017_design', '') + +process.load("EventFilter.SiPixelRawToDigi.SiPixelRawToDigi_cfi") +process.siPixelClustersPreSplitting.src = cms.InputTag("siPixelDigisGPU") + +from Validation.SiPixelPhase1DigisV.SiPixelPhase1DigisV_cfi import * + +SiPixelPhase1DigisADCGPU = SiPixelPhase1DigisADC.clone() +SiPixelPhase1DigisNdigisGPU = SiPixelPhase1DigisNdigis.clone() +SiPixelPhase1DigisRowsGPU = SiPixelPhase1DigisRows.clone() +SiPixelPhase1DigisColumnsGPU = SiPixelPhase1DigisColumns.clone() +SiPixelPhase1DigisADCGPU.topFolderName = "PixelPhase1V/DigisGPU" +SiPixelPhase1DigisNdigisGPU.topFolderName = "PixelPhase1V/DigisGPU" +SiPixelPhase1DigisRowsGPU.topFolderName = "PixelPhase1V/DigisGPU" +SiPixelPhase1DigisColumnsGPU.topFolderName = "PixelPhase1V/DigisGPU" +SiPixelPhase1DigisColumns.range_max = 450 +SiPixelPhase1DigisColumns.range_nbins = 450 +SiPixelPhase1DigisColumnsGPU.range_max = 450 +SiPixelPhase1DigisColumnsGPU.range_nbins = 450 +SiPixelPhase1DigisConfGPU = cms.VPSet(SiPixelPhase1DigisADCGPU, + SiPixelPhase1DigisNdigisGPU, + SiPixelPhase1DigisRowsGPU, + SiPixelPhase1DigisColumnsGPU) + +process.SiPixelPhase1DigisAnalyzerVGPU = process.SiPixelPhase1DigisAnalyzerV.clone() +process.SiPixelPhase1DigisHarvesterVGPU = process.SiPixelPhase1DigisHarvesterV.clone() +process.SiPixelPhase1DigisAnalyzerVGPU.src = cms.InputTag("siPixelDigisGPU") +process.SiPixelPhase1DigisAnalyzerVGPU.histograms = SiPixelPhase1DigisConfGPU +process.SiPixelPhase1DigisHarvesterVGPU.histograms = SiPixelPhase1DigisConfGPU + + +# Path and EndPath definitions +process.raw2digi_step = cms.Path(process.siPixelDigis) +process.raw2digiGPU_step = cms.Path(process.siPixelDigisGPU) +process.clustering = cms.Path(process.siPixelClustersPreSplitting) +process.validation_step = cms.Path(process.SiPixelPhase1DigisAnalyzerV + process.SiPixelPhase1DigisAnalyzerVGPU) +process.harvesting_step = cms.Path(process.SiPixelPhase1DigisHarvesterV + process.SiPixelPhase1DigisHarvesterVGPU) +process.RECOSIMoutput_step = cms.EndPath(process.FEVTDEBUGHLToutput) +process.DQMoutput_step = cms.EndPath(process.DQMoutput) +process.dqmsave_step = cms.Path(process.DQMSaver) + +# Schedule definition +process.schedule = cms.Schedule(#process.raw2digi_step, + process.raw2digiGPU_step, +# process.clustering, + process.validation_step, + process.harvesting_step, + process.RECOSIMoutput_step, + process.DQMoutput_step, + process.dqmsave_step) + + +# customisation of the process. + +# Automatic addition of the customisation function from SimGeneral.MixingModule.fullMixCustomize_cff +from SimGeneral.MixingModule.fullMixCustomize_cff import setCrossingFrameOn + +#call to customisation function setCrossingFrameOn imported from SimGeneral.MixingModule.fullMixCustomize_cff +process = setCrossingFrameOn(process) + +# End of customisation functions +#do not add changes to your config after this point (unless you know what you are doing) +from FWCore.ParameterSet.Utilities import convertToUnscheduled +process=convertToUnscheduled(process) + +# customisation of the process. + +# Automatic addition of the customisation function from PhysicsTools.PatAlgos.slimming.miniAOD_tools +from PhysicsTools.PatAlgos.slimming.miniAOD_tools import miniAOD_customizeAllMC + +#call to customisation function miniAOD_customizeAllMC imported from PhysicsTools.PatAlgos.slimming.miniAOD_tools +process = miniAOD_customizeAllMC(process) + +# End of customisation functions + +# Customisation from command line + +# Add early deletion of temporary data products to reduce peak memory need +from Configuration.StandardSequences.earlyDeleteSettings_cff import customiseEarlyDelete +process = customiseEarlyDelete(process) +# End adding early deletion + + From 33103216779ca325b112e7f07a4272a25a4f66d1 Mon Sep 17 00:00:00 2001 From: Sushil Dubey Date: Fri, 1 Dec 2017 12:57:47 +0100 Subject: [PATCH 04/88] Make class for reading GPU friendly cabling map --- .../SiPixelRawToDigi/plugins/CablingMapGPU.h | 12 +++ .../plugins/SiPixelFedCablingMapGPU.cc | 84 +++++++++++++++++++ .../plugins/SiPixelFedCablingMapGPU.h | 26 ++++++ 3 files changed, 122 insertions(+) create mode 100644 EventFilter/SiPixelRawToDigi/plugins/CablingMapGPU.h create mode 100644 EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.cc create mode 100644 EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.h diff --git a/EventFilter/SiPixelRawToDigi/plugins/CablingMapGPU.h b/EventFilter/SiPixelRawToDigi/plugins/CablingMapGPU.h new file mode 100644 index 0000000000000..9753ffefb767a --- /dev/null +++ b/EventFilter/SiPixelRawToDigi/plugins/CablingMapGPU.h @@ -0,0 +1,12 @@ +// Sushil Dubey, Shashi Dugad, TIFR, December 2017 +#ifndef CablingMap_H +#define CablingMap_H + +struct CablingMap{ + unsigned int size; + unsigned int *RawId; + unsigned int *rocInDet; + unsigned int *moduleId; +}; + +#endif \ No newline at end of file diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.cc b/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.cc new file mode 100644 index 0000000000000..bf4fa16c5c609 --- /dev/null +++ b/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.cc @@ -0,0 +1,84 @@ +// Sushil Dubey, Shashi Dugad, TIFR, December 2017 +#include +#include +#include +#include +#include +#include + +using namespace std; + +#include "SiPixelFedCablingMapGPU.h" + +SiPixelFedCablingMapGPU::SiPixelFedCablingMapGPU(edm::ESTransientHandle cablingMap) { + fedIds = cablingMap->fedIds(); + cabling_ = cablingMap->cablingTree(); +} + +void SiPixelFedCablingMapGPU::process(CablingMap* &cablingMapGPU) { + int MAX_SIZE = MAX_FED * MAX_LINK * MAX_ROC; + unsigned int *RawId = new unsigned int[MAX_SIZE]; + unsigned int *rocInDet = new unsigned int[MAX_SIZE]; + unsigned int *moduleId = new unsigned int[MAX_SIZE]; + + std::set rawIdSet; + + unsigned int startFed = *(fedIds.begin()); + unsigned int endFed = *(fedIds.end() - 1); + + sipixelobjects::CablingPathToDetUnit path; + //sipixelobjects::PixelROC* pixelRoc = nullptr; + int index = 1; + + for(unsigned int fed = startFed; fed <= endFed; fed++) { + for(unsigned int link = 1; link <= MAX_LINK; link++) { + for(unsigned int roc = 1; roc <= MAX_ROC; roc++) { + path = {fed, link, roc}; + const sipixelobjects::PixelROC* pixelRoc = cabling_->findItem(path); + if(pixelRoc != nullptr) { + RawId[index] = pixelRoc->rawId(); + rocInDet[index] = pixelRoc->idInDetUnit(); + rawIdSet.insert(RawId[index]); + } + else { // store some dummy number + RawId[index] = 9999; + rocInDet[index] = 9999; + } + index++; + } + } + } // end of fed loop + +//Given FedId, Link and idinLnk; use the following formula +//to get the RawId and idinDU +//index = (FedID-1200) * MAX_LINK* MAX_ROC + (Link-1)* MAX_ROC + idinLnk; +//where, MAX_LINK = 48, MAX_ROC = 8 for Phase1 as mentioned Danek's email +//FedID varies between 1200 to 1338 (In total 108 FED's) +//Link varies between 1 to 48 +//idinLnk varies between 1 to 8 + std::map detIdMap; + int module = 0; + for(auto it = rawIdSet.begin(); it !=rawIdSet.end(); it++) { + detIdMap.emplace(*it, module); + module++; + } + + for(int i = 1; i < index; i++) { + cablingMapGPU->RawId[i] = RawId[i]; + cablingMapGPU->rocInDet[i] = rocInDet[i]; + if(RawId[i] == 9999) { + cablingMapGPU->moduleId[i] = 9999; + } + else { + if(detIdMap.find(RawId[i]) == detIdMap.end()) {cout << " Not found: "<< RawId[i] << endl; break;} + auto it = detIdMap.find(RawId[i]); + cablingMapGPU->moduleId[i] = it->second; + } + //std::cout << cablingMapGPU->RawId[i] << setw(6) << cablingMapGPU->rocInDet[i] << setw(6) << cablingMapGPU->moduleId[i] << std::endl; + } + //cout << "size: "<< index << endl; + cablingMapGPU->size = index-1; + delete[] RawId; + delete[] rocInDet; + delete[] moduleId; +} diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.h b/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.h new file mode 100644 index 0000000000000..da0a035d659b3 --- /dev/null +++ b/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.h @@ -0,0 +1,26 @@ +// Sushil Dubey, Shashi Dugad, TIFR, December 2017 +#ifndef SiPixelFedCablingMapGPUU_H +#define SiPixelFedCablingMapGPU_H + +#include "FWCore/Framework/interface/ESTransientHandle.h" +#include "CondFormats/SiPixelObjects/interface/SiPixelFedCablingMap.h" +#include "CondFormats/SiPixelObjects/interface/SiPixelFedCablingTree.h" +#include "CablingMapGPU.h" + + +class SiPixelFedCablingMapGPU { +public: + SiPixelFedCablingMapGPU(edm::ESTransientHandle cablingMap); + ~ SiPixelFedCablingMapGPU() {} + void process(CablingMap* &cablingMapGPU) ; + +private: + edm::ESTransientHandle cablingMap; + std::vector fedIds; + std::unique_ptr cabling_; + const unsigned int MAX_FED = 150; + const unsigned int MAX_LINK = 48; + const unsigned int MAX_ROC = 8; +}; + +#endif \ No newline at end of file From a5da3ac67333d16e75c7a5c7a848a4c226dcd71e Mon Sep 17 00:00:00 2001 From: Sushil Dubey Date: Fri, 1 Dec 2017 13:01:16 +0100 Subject: [PATCH 05/88] Direct access to cabling map for GPU RawToDigi --- .../SiPixelRawToDigi/plugins/BuildFile.xml | 2 +- .../SiPixelRawToDigi/plugins/RawToDigiGPU.cu | 77 ++++++++++--------- .../SiPixelRawToDigi/plugins/RawToDigiGPU.h | 10 +-- .../SiPixelRawToDigi/plugins/RawToDigiMem.h | 4 +- .../plugins/SiPixelRawToDigiGPU.cc | 46 ++++++++--- .../plugins/SiPixelRawToDigiGPU.h | 1 + .../test/runRawToDigi_GPU_phase1.py | 6 +- 7 files changed, 86 insertions(+), 60 deletions(-) diff --git a/EventFilter/SiPixelRawToDigi/plugins/BuildFile.xml b/EventFilter/SiPixelRawToDigi/plugins/BuildFile.xml index c5d495b7f4b9f..46e82326f10af 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/BuildFile.xml +++ b/EventFilter/SiPixelRawToDigi/plugins/BuildFile.xml @@ -2,7 +2,7 @@ - + diff --git a/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.cu b/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.cu index caf27d810fc80..f13b59ca59422 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.cu +++ b/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.cu @@ -31,6 +31,8 @@ #include "EventInfoGPU.h" #include "RawToDigiGPU.h" #include "RawToDigiMem.h" +#include "CablingMapGPU.h" + using namespace std; // // forward declaration of pixelCluster_wrapper() @@ -51,37 +53,37 @@ void checkCUDAError(const char *msg) { } -// New cabling Map -void initCablingMap() { - ifstream mapFile; - mapFile.open("Pixel_Phase1_Raw2Digi_GPU_Cabling_Map.dat"); - if(!mapFile) { - cout<<"Cabling Map file does not exist !"<> Index>>FedId>>Link>>idinLNK>>B_F>>RawID>>idinDU>>ModuleID; - Map->RawId[i] = RawID; - Map->rocInDet[i] = idinDU; - Map->moduleId[i] = ModuleID; - i++; - } - mapFile.close(); - cout<<"Cabling Map uploaded successfully!"<> Index>>FedId>>Link>>idinLNK>>B_F>>RawID>>idinDU>>ModuleID; +// Map->RawId[i] = RawID; +// Map->rocInDet[i] = idinDU; +// Map->moduleId[i] = ModuleID; +// i++; +// } +// mapFile.close(); +// cout<<"Cabling Map uploaded successfully!"<RawId, sizeByte); - cudaMallocManaged((void**)&Map->rocInDet, sizeByte); - cudaMallocManaged((void**)&Map->moduleId, sizeByte); + // int sizeByte = MAX_FED * MAX_LINK * MAX_ROC * sizeof(uint)+sizeof(uint); + // // Unified memory for cabling map + // cudaMallocManaged((void**)&Map, sizeof(CablingMap)); + // cudaMallocManaged((void**)&Map->RawId, sizeByte); + // cudaMallocManaged((void**)&Map->rocInDet, sizeByte); + // cudaMallocManaged((void**)&Map->moduleId, sizeByte); // Number of words for all the feds uint MAX_WORD_SIZE = MAX_FED*MAX_WORD*NEVENT*sizeof(uint); uint FSIZE = 2*MAX_FED*NEVENT*sizeof(uint)+sizeof(uint); @@ -110,7 +112,7 @@ void initDeviceMemory() { cout<<"Memory Allocated successfully !\n"; // Upload the cabling Map - initCablingMap(); + // initCablingMap(); } @@ -132,10 +134,10 @@ void freeMemory() { cudaFree(mIndexStart_d); cudaFree(mIndexEnd_d); - cudaFree(Map->RawId); - cudaFree(Map->rocInDet); - cudaFree(Map->moduleId); - cudaFree(Map); + // cudaFree(Map->RawId); + // cudaFree(Map->rocInDet); + // cudaFree(Map->moduleId); + // cudaFree(Map); // destroy the stream for(int i=0;i>>(Map,word_d, fedIndex_d,eventIndex_d,i, xx_d, yy_d, moduleId_d, - mIndexStart_d, mIndexEnd_d, adc_d, layer_d, rawIdArr_d); + + RawToDigi_kernel<<>>(cablingMapDevice, word_d, fedIndex_d,eventIndex_d,i, xx_d, yy_d, moduleId_d, + mIndexStart_d, mIndexEnd_d, adc_d,layer_d, rawIdArr_d); } checkCUDAError("Error in RawToDigi_kernel"); diff --git a/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.h b/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.h index 8e8bd8ad40bb8..83b8e48acd3c4 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.h +++ b/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.h @@ -4,6 +4,8 @@ #ifndef RAWTODIGIGPU_H #define RAWTODIGIGPU_H + +#include "CablingMapGPU.h" //typedef unsigned long long Word64; typedef unsigned int uint; @@ -73,12 +75,6 @@ struct Pixel { uint col; }; -struct CablingMap{ - uint *RawId; - uint *rocInDet; - uint *moduleId; -}; - //CablingMap *Map; //GPU specific uint *word_d, *fedIndex_d, *eventIndex_d; // Device copy of input data @@ -86,5 +82,5 @@ struct CablingMap{ // store the start and end index for each module (total 1856 modules-phase 1) cudaStream_t stream[NSTREAM]; int *mIndexStart_d, *mIndexEnd_d; - CablingMap *Map; + // CablingMap *Map; #endif diff --git a/EventFilter/SiPixelRawToDigi/plugins/RawToDigiMem.h b/EventFilter/SiPixelRawToDigi/plugins/RawToDigiMem.h index bd1d3adeefcae..7216558e1515a 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/RawToDigiMem.h +++ b/EventFilter/SiPixelRawToDigi/plugins/RawToDigiMem.h @@ -6,11 +6,11 @@ #define RAWTODIGI_CPU_GPU_H // wrapper function to call RawToDigi on the GPU from host side -void RawToDigi_wrapper (const uint wordCounter, uint *word, const uint fedCounter, uint *fedIndex, +void RawToDigi_wrapper (const CablingMap* cablingMapDevice, const uint wordCounter, uint *word, const uint fedCounter, uint *fedIndex, uint *eventIndex, bool convertADCtoElectrons, uint *xx_h, uint *yy_h, uint *adc_h, int *mIndexStart_h, int *mIndexEnd_h, uint *rawIdArr_h); -void initCablingMap(); +// void initCablingMap(); void initDeviceMemory(); void freeMemory(); diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc index c6afd53d3b108..e94653a9cb8ae 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc +++ b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc @@ -42,6 +42,7 @@ #include "TH1D.h" #include "TFile.h" +#include "SiPixelFedCablingMapGPU.h" #include "SiPixelRawToDigiGPU.h" #include #include @@ -125,15 +126,26 @@ SiPixelRawToDigiGPU::SiPixelRawToDigiGPU( const edm::ParameterSet& conf ) //GPU specific convertADCtoElectrons = config_.getParameter("ConvertADCtoElectrons"); - const int MAX_FED = 150; + const unsigned int MAX_FED = 150; + const unsigned int MAX_LINK = 48; + const unsigned int MAX_ROC = 8; const int MAX_WORD = 2000; + + const int MAX_SIZE_BYTE = MAX_FED * MAX_LINK * MAX_ROC*sizeof(unsigned int); + // device copy of GPU friendly cablng map + + cudaMallocManaged((void**)&cablingMapGPU, sizeof(CablingMap)); + cudaMallocManaged((void**)&cablingMapGPU->RawId, MAX_SIZE_BYTE); + cudaMallocManaged((void**)&cablingMapGPU->rocInDet, MAX_SIZE_BYTE); + cudaMallocManaged((void**)&cablingMapGPU->moduleId, MAX_SIZE_BYTE); + int WSIZE = MAX_FED*MAX_WORD*NEVENT*sizeof(unsigned int); int FSIZE = 2*MAX_FED*NEVENT*sizeof(unsigned int)+sizeof(unsigned int); - //word = (unsigned int*)malloc(WSIZE); - cudaMallocHost((void**)&word, WSIZE); - //fedIndex =(unsigned int*)malloc(FSIZE); - cudaMallocHost((void**)&fedIndex, FSIZE); + word = (unsigned int*)malloc(WSIZE); + //cudaMallocHost((void**)&word, WSIZE); + fedIndex =(unsigned int*)malloc(FSIZE); + //cudaMallocHost((void**)&fedIndex, FSIZE); eventIndex = (unsigned int*)malloc((NEVENT+1)*sizeof(unsigned int)); eventIndex[0] =0; // to store the output of RawToDigi @@ -168,17 +180,24 @@ SiPixelRawToDigiGPU::~SiPixelRawToDigiGPU() { hCPU->Write(); hDigi->Write(); } - // free(word); - cudaFreeHost(word); - // free(fedIndex); - cudaFreeHost(fedIndex); + free(word); + // cudaFreeHost(word); + free(fedIndex); + // cudaFreeHost(fedIndex); free(eventIndex); + delete[] xx_h; delete[] yy_h; delete[] adc_h; delete[] rawIdArr_h; delete[] mIndexStart_h; delete[] mIndexEnd_h; + + // release device memory for cabling map + cudaFree(cablingMapGPU->RawId); + cudaFree(cablingMapGPU->rocInDet); + cudaFree(cablingMapGPU->moduleId); + cudaFree(cablingMapGPU); // free device memory used for RawToDigi on GPU freeMemory(); // free auxilary memory used for clustering @@ -238,6 +257,13 @@ void SiPixelRawToDigiGPU::produce( edm::Event& ev, edm::ESTransientHandle cablingMap; es.get().get( cablingMapLabel, cablingMap ); //Tav fedIds = cablingMap->fedIds(); + // for(auto it = fedIds.begin(); it !=fedIds.end(); it++) { + // cout << *it << endl; + // } + // A new and simplified GPU friendly cabling map + SiPixelFedCablingMapGPU cablingMapRcd(cablingMap); + cablingMapRcd.process(cablingMapGPU); + // cabling_ = cablingMap->cablingTree(); // LogDebug("map version:")<< cabling_->version(); } @@ -353,7 +379,7 @@ void SiPixelRawToDigiGPU::produce( edm::Event& ev, cout<<"Data read for event: "< { uint *xx_h, *yy_h, *adc_h, *rawIdArr_h; // host copy of output // store the start and end index for each module (total 1856 modules-phase 1) int *mIndexStart_h, *mIndexEnd_h; + CablingMap *cablingMapGPU; }; #endif diff --git a/EventFilter/SiPixelRawToDigi/test/runRawToDigi_GPU_phase1.py b/EventFilter/SiPixelRawToDigi/test/runRawToDigi_GPU_phase1.py index 5065f493478b2..036d8450b54d3 100644 --- a/EventFilter/SiPixelRawToDigi/test/runRawToDigi_GPU_phase1.py +++ b/EventFilter/SiPixelRawToDigi/test/runRawToDigi_GPU_phase1.py @@ -31,11 +31,11 @@ process.source = cms.Source("PoolSource", fileNames = cms.untracked.vstring( 'file:step2.root', -# '/store/relval/CMSSW_9_4_0_pre3/RelValTTbar_13/GEN-SIM-RECO/PU25ns_94X_mc2017_realistic_v4_highPU_AVE50-v1/10000/22E2A744-E3BA-E711-A1A8-5065F3815241.root', +# '/store/relval/CMSSW_9_4_0_pre3/RelValTTbar_13/GEN-SIM-RECO/PU25ns_94X_mc2017_realistic_v4_highPU_AVE50-v1/10000/22E2A744-E3BA-E711-A1A8-5065F3815241.root', ), secondaryFileNames = cms.untracked.vstring( -# '/store/relval/CMSSW_9_4_0_pre3/RelValTTbar_13/GEN-SIM-DIGI-RAW/PU25ns_94X_mc2017_realistic_v4_highPU_AVE50-v1/10000/62236337-BEBA-E711-9962-4C79BA1810EB.root', -# '/store/relval/CMSSW_9_4_0_pre3/RelValTTbar_13/GEN-SIM-DIGI-RAW/PU25ns_94X_mc2017_realistic_v4_highPU_AVE50-v1/10000/D6384D37-BEBA-E711-B24C-4C79BA180B9F.root', +# '/store/relval/CMSSW_9_4_0_pre3/RelValTTbar_13/GEN-SIM-DIGI-RAW/PU25ns_94X_mc2017_realistic_v4_highPU_AVE50-v1/10000/62236337-BEBA-E711-9962-4C79BA1810EB.root', +# '/store/relval/CMSSW_9_4_0_pre3/RelValTTbar_13/GEN-SIM-DIGI-RAW/PU25ns_94X_mc2017_realistic_v4_highPU_AVE50-v1/10000/D6384D37-BEBA-E711-B24C-4C79BA180B9F.root', ) ) From 571b52f5cde0ed78ba68a8dc32c9e908f54af4f2 Mon Sep 17 00:00:00 2001 From: Cesare Calabria Date: Thu, 7 Dec 2017 16:42:12 +0100 Subject: [PATCH 06/88] Unpack errors, bad ROCs, improve validation, fixes and cleanup - changes for validation - add and unpack errors - add module to unpacking and bad rocs - map fixes --- .../SiPixelRawToDigi/plugins/CablingMapGPU.h | 11 +- .../SiPixelRawToDigi/plugins/RawToDigiGPU.cu | 391 ++++++++++++++---- .../SiPixelRawToDigi/plugins/RawToDigiGPU.h | 8 +- .../SiPixelRawToDigi/plugins/RawToDigiMem.h | 3 +- .../plugins/SiPixelFedCablingMapGPU.cc | 53 ++- .../plugins/SiPixelFedCablingMapGPU.h | 5 +- .../plugins/SiPixelRawToDigiGPU.cc | 241 ++++++++--- .../plugins/SiPixelRawToDigiGPU.h | 1 + .../python/SiPixelRawToDigi_cfi.py | 2 +- .../test/runRawToDigi_GPU_phase1.py | 144 ++++++- 10 files changed, 697 insertions(+), 162 deletions(-) diff --git a/EventFilter/SiPixelRawToDigi/plugins/CablingMapGPU.h b/EventFilter/SiPixelRawToDigi/plugins/CablingMapGPU.h index 9753ffefb767a..dfd34ff879234 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/CablingMapGPU.h +++ b/EventFilter/SiPixelRawToDigi/plugins/CablingMapGPU.h @@ -2,11 +2,16 @@ #ifndef CablingMap_H #define CablingMap_H -struct CablingMap{ - unsigned int size; +struct CablingMap{ + unsigned int size; + unsigned int *fed; + unsigned int *link; + unsigned int *roc; unsigned int *RawId; unsigned int *rocInDet; unsigned int *moduleId; + bool *modToUnp; + bool *badRocs; }; -#endif \ No newline at end of file +#endif diff --git a/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.cu b/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.cu index f13b59ca59422..71ed5640c1301 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.cu +++ b/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.cu @@ -53,34 +53,10 @@ void checkCUDAError(const char *msg) { } -// // New cabling Map -// void initCablingMap() { -// ifstream mapFile; -// mapFile.open("Pixel_Phase1_Raw2Digi_GPU_Cabling_Map.dat"); -// if(!mapFile) { -// cout<<"Cabling Map file does not exist !"<> Index>>FedId>>Link>>idinLNK>>B_F>>RawID>>idinDU>>ModuleID; -// Map->RawId[i] = RawID; -// Map->rocInDet[i] = idinDU; -// Map->moduleId[i] = ModuleID; -// i++; -// } -// mapFile.close(); -// cout<<"Cabling Map uploaded successfully!"<RawId, sizeByte); // cudaMallocManaged((void**)&Map->rocInDet, sizeByte); // cudaMallocManaged((void**)&Map->moduleId, sizeByte); @@ -100,7 +76,12 @@ void initDeviceMemory() { cudaMalloc((void**)&yy_adc, MAX_WORD_SIZE); cudaMalloc((void**)&adc_d, MAX_WORD_SIZE); cudaMalloc((void**)&layer_d , MAX_WORD_SIZE); - cudaMalloc((void**)&rawIdArr_d, MAX_WORD_SIZE); // to store the x and y coordinate + cudaMalloc((void**)&rawIdArr_d, MAX_WORD_SIZE); + + cudaMalloc((void**)&errType_d, MAX_WORD_SIZE); + cudaMalloc((void**)&errWord_d, MAX_WORD_SIZE); + cudaMalloc((void**)&errFedID_d, MAX_WORD_SIZE); + cudaMalloc((void**)&errRawID_d, MAX_WORD_SIZE); cudaMalloc((void**)&moduleId_d, MAX_WORD_SIZE); cudaMalloc((void**)&mIndexStart_d, MSIZE); @@ -116,6 +97,7 @@ void initDeviceMemory() { } + void freeMemory() { //GPU specific @@ -147,41 +129,50 @@ void freeMemory() { } + __device__ uint getLink(uint ww) { //printf("Link_shift: %d LINK_mask: %d\n", LINK_shift, LINK_mask); return ((ww >> LINK_shift) & LINK_mask); } + __device__ uint getRoc(uint ww) { return ((ww >> ROC_shift ) & ROC_mask); } + + __device__ uint getADC(uint ww) { return ((ww >> ADC_shift) & ADC_mask); } + __device__ bool isBarrel(uint rawId) { return (1==((rawId>>25)&0x7)); } + + //__device__ uint FED_START = 1200; + __device__ DetIdGPU getRawId(const CablingMap *Map, uint fed, uint link, uint roc) { - uint index = fed * MAX_LINK* MAX_ROC + (link-1)* MAX_ROC + roc; + uint index = fed * MAX_LINK * MAX_ROC + (link-1) * MAX_ROC + roc; DetIdGPU detId = {Map->RawId[index], Map->rocInDet[index], Map->moduleId[index]}; return detId; } + //reference http://cmsdoxygen.web.cern.ch/cmsdoxygen/CMSSW_9_2_0/doc/html/dd/d31/FrameConversion_8cc_source.html //http://cmslxr.fnal.gov/source/CondFormats/SiPixelObjects/src/PixelROC.cc?v=CMSSW_9_2_0#0071 // Convert local pixel to global pixel -__device__ Pixel frameConversion(bool bpix, int side, uint layer,uint rocIdInDetUnit, Pixel local) { +__device__ Pixel frameConversion(bool bpix, int side, uint layer, uint rocIdInDetUnit, Pixel local) { int slopeRow = 0, slopeCol = 0; int rowOffset = 0, colOffset = 0; if(bpix) { - if(side==-1 && layer!=1) { // -Z side: 4 non-flipped modules oriented like 'dddd', except Layer 1 - if (rocIdInDetUnit <8) { + if(side == -1 && layer != 1) { // -Z side: 4 non-flipped modules oriented like 'dddd', except Layer 1 + if (rocIdInDetUnit < 8) { slopeRow = 1; slopeCol = -1; rowOffset = 0; @@ -195,7 +186,7 @@ __device__ Pixel frameConversion(bool bpix, int side, uint layer,uint rocIdInDet } // if roc } else { // +Z side: 4 non-flipped modules oriented like 'pppp', but all 8 in layer1 - if(rocIdInDetUnit <8) { + if(rocIdInDetUnit < 8) { slopeRow = -1; slopeCol = 1; rowOffset = 2*numRowsInRoc-1; @@ -245,12 +236,195 @@ __device__ Pixel frameConversion(bool bpix, int side, uint layer,uint rocIdInDet uint gRow = rowOffset+slopeRow*local.row; uint gCol = colOffset+slopeCol*local.col; - //printf("Inside frameConversion gRow: %u gCol: %u\n",gRow, gCol); + //printf("Inside frameConversion row: %u, column: %u\n",gRow, gCol); Pixel global = {gRow, gCol}; return global; } +__device__ uint conversionError(uint fedId, uint status, bool debug = false) +{ + + uint errorType = 0; + + switch (status) { + case(1) : { + if(debug) printf("Error in Fed: %i, invalid channel Id (errorType=35)", fedId ); + errorType = 35; + break; + } + case(2) : { + if(debug) printf("Error in Fed: %i, invalid ROC Id (errorType=36)", fedId); + errorType = 36; + break; + } + case(3) : { + if(debug) printf("Error in Fed: %i, invalid dcol/pixel value (errorType=37)", fedId); + errorType = 37; + break; + } + case(4) : { + if(debug) printf("Error in Fed: %i, dcol/pixel read out of order (errorType=38)", fedId); + errorType = 38; + break; + } + default: if(debug) printf("Cabling check returned unexpected result, status = %i", status); + }; + + return errorType; + +} + + +__device__ bool rocRowColIsValid(uint rocRow, uint rocCol) +{ + uint numRowsInRoc = 80; + uint numColsInRoc = 52; + + /// row and collumn in ROC representation + return ( (rocRow < numRowsInRoc) & (rocCol < numColsInRoc) ); +} + + +__device__ bool dcolIsValid(uint dcol, uint pxid) +{ + return ( (dcol < 26) & (2 <= pxid) & (pxid < 162) ); +} + + +__device__ uint checkROC(uint errorWord, uint fedId, uint link, const CablingMap *Map, bool debug = false) +{ + + int errorType = (errorWord >> ROC_shift) & ERROR_mask; + bool errorFound = false; + + switch (errorType) { + case(25) : { + uint index = fedId * MAX_LINK * MAX_ROC + (link-1) * MAX_ROC + 1; + if(index > 1 && index <= Map->size){ + if(!(link == Map->link[index] && 1 == Map->roc[index])) errorFound = false; + } + else{ + errorFound = true; + if(debug) printf("Invalid ROC = 25 found (errorType=25)"); + } + break; + } + case(26) : { + if(debug) printf("Gap word found (errorType=26)"); + errorFound = true; + break; + } + case(27) : { + if(debug) printf("Dummy word found (errorType=27)"); + errorFound = true; + break; + } + case(28) : { + if(debug) printf("Error fifo nearly full (errorType=28)"); + errorFound = true; + break; + } + case(29) : { + if(debug) printf("Timeout on a channel (errorType=29)"); + if ((errorWord >> OMIT_ERR_shift) & OMIT_ERR_mask) { + if(debug) printf("...first errorType=29 error, this gets masked out"); + } + errorFound = true; + break; + } + case(30) : { + if(debug) printf("TBM error trailer (errorType=30)"); + int StateMatch_bits = 4; + int StateMatch_shift = 8; + uint32_t StateMatch_mask = ~(~uint32_t(0) << StateMatch_bits); + int StateMatch = (errorWord >> StateMatch_shift) & StateMatch_mask; + if( StateMatch != 1 && StateMatch != 8 ) { + if(debug) printf("FED error 30 with unexpected State Bits (errorType=30)"); + } + if( StateMatch==1 ) errorType = 40; // 1=Overflow -> 40, 8=number of ROCs -> 30 + errorFound = true; + break; + } + case(31) : { + if(debug) printf("Event number error (errorType=31)"); + errorFound = true; + break; + } + default: errorFound = false; + + }; + + return errorFound? errorType : 0; + +} + + +__device__ uint getErrRawID(uint fedId, uint errWord, uint errorType, const CablingMap *Map, bool debug = false) +{ + + uint rID = 0xffffffff; + + switch (errorType) { + case 25 : case 30 : case 31 : case 36 : case 40 : { + // set dummy values for cabling just to get detId from link + //cabling.dcol = 0; + //cabling.pxid = 2; + uint roc = 1; + uint link = (errWord >> LINK_shift) & LINK_mask; + + rID = getRawId(Map, fedId, link, roc).RawId; + break; + } + case 29 : { + int chanNmbr = 0; + const int DB0_shift = 0; + const int DB1_shift = DB0_shift + 1; + const int DB2_shift = DB1_shift + 1; + const int DB3_shift = DB2_shift + 1; + const int DB4_shift = DB3_shift + 1; + const uint DataBit_mask = ~(~uint(0) << 1); + + int CH1 = (errWord >> DB0_shift) & DataBit_mask; + int CH2 = (errWord >> DB1_shift) & DataBit_mask; + int CH3 = (errWord >> DB2_shift) & DataBit_mask; + int CH4 = (errWord >> DB3_shift) & DataBit_mask; + int CH5 = (errWord >> DB4_shift) & DataBit_mask; + int BLOCK_bits = 3; + int BLOCK_shift = 8; + uint BLOCK_mask = ~(~uint(0) << BLOCK_bits); + int BLOCK = (errWord >> BLOCK_shift) & BLOCK_mask; + int localCH = 1*CH1+2*CH2+3*CH3+4*CH4+5*CH5; + if (BLOCK%2==0) chanNmbr=(BLOCK/2)*9+localCH; + else chanNmbr = ((BLOCK-1)/2)*9+4+localCH; + if ((chanNmbr < 1)||(chanNmbr > 36)) break; // signifies unexpected result + + // set dummy values for cabling just to get detId from link if in Barrel + //cabling.dcol = 0; + //cabling.pxid = 2; + uint roc = 1; + uint link = chanNmbr; + rID = getRawId(Map, fedId, link, roc).RawId; + break; + } + case 37 : case 38: { + //cabling.dcol = 0; + //cabling.pxid = 2; + uint roc = (errWord >> ROC_shift) & ROC_mask; + uint link = (errWord >> LINK_shift) & LINK_mask; + rID = getRawId(Map, fedId, link, roc).RawId; + break; + } + + default : break; + + }; + + return rID; + +} + + /*---------- * Name: applyADCthreshold_kernel() * Desc: converts adc count to electrons and then applies the @@ -295,26 +469,31 @@ __global__ void applyADCthreshold_kernel // Kernel to perform Raw to Digi conversion -__global__ void RawToDigi_kernel(const CablingMap *Map,const uint *Word,const uint *fedIndex, - uint *eventIndex,const uint stream, uint *XX, uint *YY, uint *moduleId, int *mIndexStart, - int *mIndexEnd, uint *ADC, uint *layerArr, uint *rawIdArr) +__global__ void RawToDigi_kernel(const CablingMap *Map, const uint *Word, const uint *fedIndex, + uint *eventIndex, const uint stream, uint *XX, uint *YY, uint *moduleId, int *mIndexStart, + int *mIndexEnd, uint *ADC, uint *layerArr, uint *rawIdArr, + uint *errType, uint *errWord, uint *errFedID, uint *errRawID, + bool useQualityInfo, bool includeErrors, bool debug) { uint blockId = blockIdx.x; uint eventno = blockIdx.y + gridDim.y*stream; //const uint eventOffset = eventIndex[eventno]; - uint fedOffset = 2*MAX_FED*eventno; - - uint fedId = fedIndex[fedOffset+blockId]; + uint fedOffset = 2*MAX_FED*eventno; + uint fedId = fedIndex[fedOffset + blockId]; uint threadId = threadIdx.x; - uint begin = fedIndex[fedOffset + MAX_FED+blockId]; - uint end = fedIndex[fedOffset + MAX_FED+blockId+1]; + uint begin = fedIndex[fedOffset + MAX_FED + blockId]; + uint end = fedIndex[fedOffset + MAX_FED + blockId + 1]; - if(blockIdx.x==gridDim.x-1) { - end = eventIndex[eventno+1]; // for last fed to get the end index + if(blockIdx.x == gridDim.x - 1) { + end = eventIndex[eventno + 1]; // for last fed to get the end index } + uint link = 0; + uint roc = 0; + + bool skipROC = false; //if(threadId==0) printf("Event: %u blockId: %u start: %u end: %u\n", eventno, blockId, begin, end); int no_itr = (end - begin)/blockDim.x + 1; // to deal with number of hits greater than blockDim.x #pragma unroll @@ -330,41 +509,85 @@ __global__ void RawToDigi_kernel(const CablingMap *Map,const uint *Word,const ui layerArr[gIndex] = 0; moduleId[gIndex] = 9999; //9999 is the indication of bad module, taken care later rawIdArr[gIndex] = 9999; - continue ; // 0: bad word, - } - uint link = getLink(ww); // Extract link - uint roc = getRoc(ww); // Extract Roc in link + continue ; // 0: bad word, + } + + uint nlink = getLink(ww); // Extract link + uint nroc = getRoc(ww); // Extract Roc in link + if (!((nlink != link) | (nroc != roc))) continue; + link = nlink; + roc = nroc; + + uint errorType = checkROC(ww, fedId, link, Map, debug); + skipROC = (roc < maxROCIndex) ? false : (errorType != 0); + if (skipROC && includeErrors) { + uint rID = getErrRawID(fedId, ww, errorType, Map, debug); //write the function + errType[gIndex] = errorType; + errWord[gIndex] = ww; + errFedID[gIndex] = fedId; + errRawID[gIndex] = rID; + continue; + } + /*rocp = converter.toRoc(link,roc); //Apparently this check is not needed, we don't have this conversion + if unlikely(!rocp) { + errorsInEvent = true; + conversionError(fedId, &converter, 2, ww, errors); + skipROC=true; + continue; + }*/ + DetIdGPU detId = getRawId(Map, fedId, link, roc); uint rawId = detId.RawId; uint rocIdInDetUnit = detId.rocInDet; bool barrel = isBarrel(rawId); + + uint index = fedId * MAX_LINK * MAX_ROC + (link-1) * MAX_ROC + roc; + if (useQualityInfo) { + + skipROC = Map->badRocs[index]; + if (skipROC) continue; + + } + skipROC = Map->modToUnp[index]; + if (skipROC) continue; - uint layer =0;//, ladder =0; - int side =0, panel =0, module=0;//disk =0,blade =0 + uint layer = 0;//, ladder =0; + int side = 0, panel = 0, module = 0;//disk = 0,blade = 0 if(barrel) { - layer = (rawId >> layerStartBit_) & layerMask_; + layer = (rawId >> layerStartBit_) & layerMask_; //ladder = (rawId >> ladderStartBit_) & ladderMask_; module = (rawId >> moduleStartBit_) & moduleMask_; - side = (module<5)? -1:1; - + side = (module<5)? -1 : 1; } else { // endcap ids layer = 0; panel = (rawId >> panelStartBit_) & panelMask_; //disk = (rawId >> diskStartBit_) & diskMask_ ; - side = (panel==1)? -1:1; + side = (panel==1)? -1 : 1; //blade = (rawId>>bladeStartBit_) & bladeMask_; } + // ***special case of layer to 1 be handled here Pixel localPix; - if(layer==1) { + if(layer == 1) { uint col = (ww >> COL_shift) & COL_mask; uint row = (ww >> ROW_shift) & ROW_mask; localPix.row = row; localPix.col = col; + + if( !rocRowColIsValid(row, col) && includeErrors) { + uint error = conversionError(fedId, 3, debug); //use the device function and fill the arrays + errType[gIndex] = error; + errWord[gIndex] = ww; + errFedID[gIndex] = fedId; + errRawID[gIndex] = rawId; + printf("Error status: %i\n", error); + continue; + } + } else { // ***conversion rules for dcol and pxid @@ -374,15 +597,33 @@ __global__ void RawToDigi_kernel(const CablingMap *Map,const uint *Word,const ui uint col = dcol*2 + pxid%2; localPix.row = row; localPix.col = col; + + if( !dcolIsValid(dcol, pxid) && includeErrors) { + uint error = conversionError(fedId, 3, debug); + errType[gIndex] = error; + errWord[gIndex] = ww; + errFedID[gIndex] = fedId; + errRawID[gIndex] = rawId; + printf("Error status: %i\n", error); + continue; + } + } - Pixel globalPix = frameConversion(barrel, side, layer,rocIdInDetUnit, localPix); - XX[gIndex] = globalPix.row+1 ; // origin shifting by 1 0-159 - YY[gIndex] = globalPix.col+1 ; // origin shifting by 1 0-415 + Pixel globalPix = frameConversion(barrel, side, layer, rocIdInDetUnit, localPix); + //printf("GPU side: %i, layer: %i, roc: %i, lrow: %i, lcol: %i, grow: %i, gcol: %i, word: %i\n", side, layer, rocIdInDetUnit, localPix.row, localPix.col, globalPix.row, globalPix.col, ww); + XX[gIndex] = globalPix.row ; // origin shifting by 1 0-159 + YY[gIndex] = globalPix.col ; // origin shifting by 1 0-415 ADC[gIndex] = getADC(ww); layerArr[gIndex] = layer; moduleId[gIndex] = detId.moduleId; rawIdArr[gIndex] = rawId; + + errType[gIndex] = 0; + errWord[gIndex] = ww; + errFedID[gIndex] = fedId; + errRawID[gIndex] = rawId; + //fill error type } // end of if(gIndex < end) } // end of for(int i =0;i>>(cablingMapDevice, word_d, fedIndex_d,eventIndex_d,i, xx_d, yy_d, moduleId_d, - mIndexStart_d, mIndexEnd_d, adc_d,layer_d, rawIdArr_d); + RawToDigi_kernel<<>>(cablingMapDevice, word_d, fedIndex_d,eventIndex_d,i, xx_d, yy_d, moduleId_d, + mIndexStart_d, mIndexEnd_d, adc_d,layer_d, rawIdArr_d, errType_d, errWord_d, errFedID_d, errRawID_d, useQualityInfo, includeErrors, debug); } checkCUDAError("Error in RawToDigi_kernel"); - for (int i = 0; i cablingMap) { fedIds = cablingMap->fedIds(); cabling_ = cablingMap->cablingTree(); } -void SiPixelFedCablingMapGPU::process(CablingMap* &cablingMapGPU) { +void SiPixelFedCablingMapGPU::process(CablingMap* &cablingMapGPU, const SiPixelQuality* badPixelInfo, std::set modules) { int MAX_SIZE = MAX_FED * MAX_LINK * MAX_ROC; + unsigned int *fedMap = new unsigned int[MAX_SIZE]; + unsigned int *linkMap = new unsigned int[MAX_SIZE]; + unsigned int *rocMap = new unsigned int[MAX_SIZE]; unsigned int *RawId = new unsigned int[MAX_SIZE]; unsigned int *rocInDet = new unsigned int[MAX_SIZE]; unsigned int *moduleId = new unsigned int[MAX_SIZE]; + bool *badRocs = new bool[MAX_SIZE]; + bool *modToUnp = new bool[MAX_SIZE]; std::set rawIdSet; @@ -35,20 +41,41 @@ void SiPixelFedCablingMapGPU::process(CablingMap* &cablingMapGPU) { for(unsigned int roc = 1; roc <= MAX_ROC; roc++) { path = {fed, link, roc}; const sipixelobjects::PixelROC* pixelRoc = cabling_->findItem(path); + fedMap[index] = fed; + linkMap[index] = link; + rocMap[index] = roc; if(pixelRoc != nullptr) { RawId[index] = pixelRoc->rawId(); rocInDet[index] = pixelRoc->idInDetUnit(); rawIdSet.insert(RawId[index]); + + if(badPixelInfo != nullptr){ + + cout<< modules.size() <rawId()) == modules.end()); + badRocs[index] = badPixelInfo->IsRocBad(pixelRoc->rawId(), pixelRoc->idInDetUnit()); + + } + else{ + + modToUnp[index] = false; + badRocs[index] = true; + + } + } else { // store some dummy number RawId[index] = 9999; rocInDet[index] = 9999; + modToUnp[index] = false; + badRocs[index] = true; } index++; } } } // end of fed loop + //Given FedId, Link and idinLnk; use the following formula //to get the RawId and idinDU //index = (FedID-1200) * MAX_LINK* MAX_ROC + (Link-1)* MAX_ROC + idinLnk; @@ -58,27 +85,43 @@ void SiPixelFedCablingMapGPU::process(CablingMap* &cablingMapGPU) { //idinLnk varies between 1 to 8 std::map detIdMap; int module = 0; - for(auto it = rawIdSet.begin(); it !=rawIdSet.end(); it++) { + for(auto it = rawIdSet.begin(); it != rawIdSet.end(); it++) { detIdMap.emplace(*it, module); module++; } - for(int i = 1; i < index; i++) { + for(int i = 1; i < index; i++) { + cablingMapGPU->fed[i] = fedMap[i]; + cablingMapGPU->link[i] = linkMap[i]; + cablingMapGPU->roc[i] = rocMap[i]; cablingMapGPU->RawId[i] = RawId[i]; cablingMapGPU->rocInDet[i] = rocInDet[i]; + cablingMapGPU->badRocs[i] = badRocs[i]; + cablingMapGPU->modToUnp[i] = modToUnp[i]; + if(RawId[i] == 9999) { cablingMapGPU->moduleId[i] = 9999; } else { - if(detIdMap.find(RawId[i]) == detIdMap.end()) {cout << " Not found: "<< RawId[i] << endl; break;} + if(detIdMap.find(RawId[i]) == detIdMap.end()) {LogDebug("SiPixelFedCablingMapGPU") << " Not found: "<< RawId[i] << endl; break;} auto it = detIdMap.find(RawId[i]); cablingMapGPU->moduleId[i] = it->second; } - //std::cout << cablingMapGPU->RawId[i] << setw(6) << cablingMapGPU->rocInDet[i] << setw(6) << cablingMapGPU->moduleId[i] << std::endl; + LogDebug("SiPixelFedCablingMapGPU") <<"----------------------------------------------------------------------------"<fed[i] << setw(20) << cablingMapGPU->link[i] << setw(20) << cablingMapGPU->roc[i] << std::endl; + LogDebug("SiPixelFedCablingMapGPU") << i << setw(20) << cablingMapGPU->RawId[i] << setw(20) << cablingMapGPU->rocInDet[i] << setw(20) << cablingMapGPU->moduleId[i] << std::endl; + LogDebug("SiPixelFedCablingMapGPU") << i << setw(20) << cablingMapGPU->badRocs[i] << setw(20) << cablingMapGPU->modToUnp[i] << std::endl; + LogDebug("SiPixelFedCablingMapGPU") <<"----------------------------------------------------------------------------"<size = index-1; + + delete[] fedMap; + delete[] linkMap; + delete[] rocMap; delete[] RawId; delete[] rocInDet; delete[] moduleId; + delete[] badRocs; + delete[] modToUnp; } diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.h b/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.h index da0a035d659b3..b0fff9deeaf99 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.h +++ b/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.h @@ -5,6 +5,7 @@ #include "FWCore/Framework/interface/ESTransientHandle.h" #include "CondFormats/SiPixelObjects/interface/SiPixelFedCablingMap.h" #include "CondFormats/SiPixelObjects/interface/SiPixelFedCablingTree.h" +#include "CondFormats/SiPixelObjects/interface/SiPixelQuality.h" #include "CablingMapGPU.h" @@ -12,7 +13,7 @@ class SiPixelFedCablingMapGPU { public: SiPixelFedCablingMapGPU(edm::ESTransientHandle cablingMap); ~ SiPixelFedCablingMapGPU() {} - void process(CablingMap* &cablingMapGPU) ; + void process(CablingMap* &cablingMapGPU, const SiPixelQuality* badPixelInfo, std::set modules); private: edm::ESTransientHandle cablingMap; @@ -23,4 +24,4 @@ class SiPixelFedCablingMapGPU { const unsigned int MAX_ROC = 8; }; -#endif \ No newline at end of file +#endif diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc index e94653a9cb8ae..b6eb2918fd591 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc +++ b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc @@ -132,12 +132,18 @@ SiPixelRawToDigiGPU::SiPixelRawToDigiGPU( const edm::ParameterSet& conf ) const int MAX_WORD = 2000; const int MAX_SIZE_BYTE = MAX_FED * MAX_LINK * MAX_ROC*sizeof(unsigned int); + const int MAX_SIZE_BYTE_BOOL = MAX_FED * MAX_LINK * MAX_ROC*sizeof(bool); // device copy of GPU friendly cablng map cudaMallocManaged((void**)&cablingMapGPU, sizeof(CablingMap)); + cudaMallocManaged((void**)&cablingMapGPU->fed, MAX_SIZE_BYTE); + cudaMallocManaged((void**)&cablingMapGPU->link, MAX_SIZE_BYTE); + cudaMallocManaged((void**)&cablingMapGPU->roc, MAX_SIZE_BYTE); cudaMallocManaged((void**)&cablingMapGPU->RawId, MAX_SIZE_BYTE); cudaMallocManaged((void**)&cablingMapGPU->rocInDet, MAX_SIZE_BYTE); cudaMallocManaged((void**)&cablingMapGPU->moduleId, MAX_SIZE_BYTE); + cudaMallocManaged((void**)&cablingMapGPU->badRocs, MAX_SIZE_BYTE_BOOL); + cudaMallocManaged((void**)&cablingMapGPU->modToUnp, MAX_SIZE_BYTE_BOOL); int WSIZE = MAX_FED*MAX_WORD*NEVENT*sizeof(unsigned int); int FSIZE = 2*MAX_FED*NEVENT*sizeof(unsigned int)+sizeof(unsigned int); @@ -153,6 +159,10 @@ SiPixelRawToDigiGPU::SiPixelRawToDigiGPU( const edm::ParameterSet& conf ) yy_h = new uint[WSIZE]; adc_h = new uint[WSIZE]; rawIdArr_h = new uint[WSIZE]; + errType_h = new uint[WSIZE]; + errRawID_h = new uint[WSIZE]; + errWord_h = new uint[WSIZE]; + errFedID_h = new uint[WSIZE]; mIndexStart_h = new int[NEVENT*NMODULE +1]; mIndexEnd_h = new int[NEVENT*NMODULE +1]; @@ -190,13 +200,22 @@ SiPixelRawToDigiGPU::~SiPixelRawToDigiGPU() { delete[] yy_h; delete[] adc_h; delete[] rawIdArr_h; + delete[] errType_h; + delete[] errRawID_h; + delete[] errWord_h; + delete[] errFedID_h; delete[] mIndexStart_h; delete[] mIndexEnd_h; // release device memory for cabling map + cudaFree(cablingMapGPU->fed); + cudaFree(cablingMapGPU->link); + cudaFree(cablingMapGPU->roc); cudaFree(cablingMapGPU->RawId); cudaFree(cablingMapGPU->rocInDet); cudaFree(cablingMapGPU->moduleId); + cudaFree(cablingMapGPU->modToUnp); + cudaFree(cablingMapGPU->badRocs); cudaFree(cablingMapGPU); // free device memory used for RawToDigi on GPU freeMemory(); @@ -248,8 +267,30 @@ SiPixelRawToDigiGPU::fillDescriptions(edm::ConfigurationDescriptions& descriptio void SiPixelRawToDigiGPU::produce( edm::Event& ev, const edm::EventSetup& es) { - //const uint32_t dummydetid = 0xffffffff; - //debug = edm::MessageDrop::instance()->debugEnabled; + + int theWordCounter = 0; + int theDigiCounter = 0; + const uint32_t dummydetid = 0xffffffff; + debug = edm::MessageDrop::instance()->debugEnabled; + + // initialize quality record or update if necessary + if (qualityWatcher.check( es ) && useQuality) { + // quality info for dead pixel modules or ROCs + edm::ESHandle qualityInfo; + es.get().get( qualityInfo ); + badPixelInfo_ = qualityInfo.product(); + if (!badPixelInfo_) { + edm::LogError("SiPixelQualityNotPresent")<<" Configured to use SiPixelQuality, but SiPixelQuality not present"< modules; + if (regions_) { + regions_->run(ev, es); + LogDebug("SiPixelRawToDigiGPU") << "region2unpack #feds: "<nFEDs(); + LogDebug("SiPixelRawToDigiGPU") << "region2unpack #modules (BPIX,EPIX,total): "<nBarrelModules()<<" "<nForwardModules()<<" "<nModules(); + modules = *(regions_->modulesToUnpack()); + } // initialize cabling map or update if necessary if (recordWatcher.check( es )) { @@ -257,58 +298,34 @@ void SiPixelRawToDigiGPU::produce( edm::Event& ev, edm::ESTransientHandle cablingMap; es.get().get( cablingMapLabel, cablingMap ); //Tav fedIds = cablingMap->fedIds(); - // for(auto it = fedIds.begin(); it !=fedIds.end(); it++) { - // cout << *it << endl; - // } + cabling_ = cablingMap->cablingTree(); + LogDebug("map version:")<< cabling_->version(); // A new and simplified GPU friendly cabling map SiPixelFedCablingMapGPU cablingMapRcd(cablingMap); - cablingMapRcd.process(cablingMapGPU); - - // cabling_ = cablingMap->cablingTree(); - // LogDebug("map version:")<< cabling_->version(); + cablingMapRcd.process(cablingMapGPU, badPixelInfo_, modules); } -/* // initialize quality record or update if necessary - if (qualityWatcher.check( es )&&useQuality) { - // quality info for dead pixel modules or ROCs - edm::ESHandle qualityInfo; - es.get().get( qualityInfo ); - badPixelInfo_ = qualityInfo.product(); - if (!badPixelInfo_) { - edm::LogError("SiPixelQualityNotPresent")<<" Configured to use SiPixelQuality, but SiPixelQuality not present"< buffers; ev.getByToken(tFEDRawDataCollection, buffers); // create product (digis & errors) auto collection = std::make_unique>(); - /*// collection->reserve(8*1024); + // collection->reserve(8*1024); auto errorcollection = std::make_unique>(); auto tkerror_detidcollection = std::make_unique(); auto usererror_detidcollection = std::make_unique(); auto disabled_channelcollection = std::make_unique >(); - + //PixelDataFormatter formatter(cabling_.get()); // phase 0 only PixelDataFormatter formatter(cabling_.get(), usePhase1); // for phase 1 & 0 - - formatter.setErrorStatus(includeErrors); - - if (useQuality) formatter.setQualityStatus(useQuality, badPixelInfo_); - - if (theTimer) theTimer->start(); - bool errorsInEvent = false; + PixelDataFormatter::DetErrors nodeterrors; + PixelDataFormatter::Errors errors; - if (regions_) { - regions_->run(ev, es); - formatter.setModulesToUnpack(regions_->modulesToUnpack()); - LogDebug("SiPixelRawToDigiGPU") << "region2unpack #feds: "<nFEDs(); - LogDebug("SiPixelRawToDigiGPU") << "region2unpack #modules (BPIX,EPIX,total): "<nBarrelModules()<<" "<nForwardModules()<<" "<nModules(); - }*/ + if (theTimer) theTimer->start(); + // GPU specific: Data extraction for RawToDigi GPU - static unsigned int wordCounterGPU =0; + static unsigned int wordCounterGPU = 0; unsigned int fedCounter = 0; const unsigned int MAX_FED = 150; static int eventCount = 0; @@ -318,29 +335,34 @@ void SiPixelRawToDigiGPU::produce( edm::Event& ev, ErrorChecker errorcheck; for (auto aFed = fedIds.begin(); aFed != fedIds.end(); ++aFed) { + int fedId = *aFed; + + if(!usePilotBlade && (fedId==40) ) continue; // skip pilot blade data + if (regions_ && !regions_->mayUnpackFED(fedId)) continue; + if(debug) LogDebug("SiPixelRawToDigiGPU")<< " PRODUCE DIGI FOR FED: " << fedId << endl; // for GPU // first 150 index stores the fedId and next 150 will store the // start index of word in that fed - fedIndex[2*MAX_FED*eventCount+fedCounter] = fedId-1200; - fedIndex[MAX_FED + 2*MAX_FED*eventCount+fedCounter] = wordCounterGPU; // MAX_FED = 150 + fedIndex[2*MAX_FED*eventCount + fedCounter] = fedId - 1200; + fedIndex[MAX_FED + 2*MAX_FED*eventCount + fedCounter] = wordCounterGPU; // MAX_FED = 150 fedCounter++; //get event data for this fed const FEDRawData& rawData = buffers->FEDData( fedId ); - //GPU specific - PixelDataFormatter::Errors errors; + + //GPU specific int nWords = rawData.size()/sizeof(Word64); - if(nWords==0) { - word[wordCounterGPU++] =0; + if(nWords == 0) { + word[wordCounterGPU++] = 0; continue; - } - + } + // check CRC bit const Word64* trailer = reinterpret_cast(rawData.data())+(nWords-1); if(!errorcheck.checkCRC(errorsInEvent, fedId, trailer, errors)) { - word[wordCounterGPU++] =0; + word[wordCounterGPU++] = 0; continue; } @@ -363,11 +385,14 @@ void SiPixelRawToDigiGPU::produce( edm::Event& ev, bool trailerStatus = errorcheck.checkTrailer(errorsInEvent, fedId, nWords, trailer, errors); moreTrailers = trailerStatus; } + + theWordCounter += 2*(nWords-2); const Word32 * bw =(const Word32 *)(header+1); const Word32 * ew =(const Word32 *)(trailer); - if ( *(ew-1) == 0 ) { ew--; } + if ( *(ew-1) == 0 ) { ew--; theWordCounter--;} for (auto ww = bw; ww < ew; ++ww) { + if unlikely(ww==0) theWordCounter--; word[wordCounterGPU++] = *ww; } } // end of for loop @@ -377,11 +402,12 @@ void SiPixelRawToDigiGPU::produce( edm::Event& ev, eventIndex[eventCount] = wordCounterGPU; static int ec = 1; cout<<"Data read for event: "<::const_iterator it; for (it = collection->begin(); it != collection->end(); ++it) { for(PixelDigi const& digi : *it) { @@ -428,14 +461,100 @@ void SiPixelRawToDigiGPU::produce( edm::Event& ev, } } + if (theTimer) { + theTimer->stop(); + LogDebug("SiPixelRawToDigiGPU") << "TIMING IS: (real)" << theTimer->realTime() ; + ndigis += theDigiCounter; + nwords += theWordCounter; + LogDebug("SiPixelRawToDigiGPU") << " (Words/Digis) this ev: " + <Fill( theTimer->realTime() ); + hDigi->Fill(theDigiCounter); + } + + //pack errors into collection + if(includeErrors) { + + typedef PixelDataFormatter::Errors::iterator IE; + for (IE is = errors.begin(); is != errors.end(); is++) { + + uint32_t errordetid = is->first; + if (errordetid == dummydetid) {// errors given dummy detId must be sorted by Fed + nodeterrors.insert( nodeterrors.end(), errors[errordetid].begin(), errors[errordetid].end() ); + } + else { + edm::DetSet& errorDetSet = errorcollection->find_or_insert(errordetid); + errorDetSet.data.insert(errorDetSet.data.end(), is->second.begin(), is->second.end()); + // Fill detid of the detectors where there is error AND the error number is listed + // in the configurable error list in the job option cfi. + // Code needs to be here, because there can be a set of errors for each + // entry in the for loop over PixelDataFormatter::Errors + + std::vector disabledChannelsDetSet; + + for (auto const& aPixelError : errorDetSet) { + // For the time being, we extend the error handling functionality with ErrorType 25 + // In the future, we should sort out how the usage of tkerrorlist can be generalized + if (aPixelError.getType() == 25) { + int fedId = aPixelError.getFedId(); + const sipixelobjects::PixelFEDCabling* fed = cabling_->fed(fedId); + if (fed) { + cms_uint32_t linkId = formatter.linkId(aPixelError.getWord32()); + const sipixelobjects::PixelFEDLink* link = fed->link(linkId); + if (link) { + // The "offline" 0..15 numbering is fixed by definition, also, the FrameConversion depends on it + // in contrast, the ROC-in-channel numbering is determined by hardware --> better to use the "offline" scheme + PixelFEDChannel ch = {fed->id(), linkId, 25, 0}; + for (unsigned int iRoc = 1; iRoc <= link->numberOfROCs(); iRoc++) { + const sipixelobjects::PixelROC * roc = link->roc(iRoc); + if (roc->idInDetUnit() < ch.roc_first) ch.roc_first = roc->idInDetUnit(); + if (roc->idInDetUnit() > ch.roc_last) ch.roc_last = roc->idInDetUnit(); + } + disabledChannelsDetSet.push_back(ch); + } + } + } + else { + // fill list of detIds to be turned off by tracking + if(!tkerrorlist.empty()) { + std::vector::iterator it_find = find(tkerrorlist.begin(), tkerrorlist.end(), aPixelError.getType()); + if(it_find != tkerrorlist.end()){ + tkerror_detidcollection->push_back(errordetid); + } + } + } + + // fill list of detIds with errors to be studied + if(!usererrorlist.empty()) { + std::vector::iterator it_find = find(usererrorlist.begin(), usererrorlist.end(), aPixelError.getType()); + if(it_find != usererrorlist.end()){ + usererror_detidcollection->push_back(errordetid); + } + } + + } // loop on DetSet of errors + + if (!disabledChannelsDetSet.empty()) { + disabled_channelcollection->insert(errordetid, disabledChannelsDetSet.data(), disabledChannelsDetSet.size()); + } + + } // if error assigned to a real DetId + } // loop on errors in event for this FED + } // if errors to be included in the event + + if(includeErrors) { + edm::DetSet& errorDetSet = errorcollection->find_or_insert(dummydetid); + errorDetSet.data = nodeterrors; + } + //send digis and errors back to framework ev.put(std::move(collection)); -// if(includeErrors){ -// ev.put(std::move(errorcollection)); -// ev.put(std::move(tkerror_detidcollection)); -// ev.put(std::move(usererror_detidcollection), "UserErrorModules"); -// ev.put(std::move(disabled_channelcollection)); -// } + if(includeErrors){ + ev.put(std::move(errorcollection)); + ev.put(std::move(tkerror_detidcollection)); + ev.put(std::move(usererror_detidcollection), "UserErrorModules"); + ev.put(std::move(disabled_channelcollection)); + } } //end of produce function diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.h b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.h index b34887122d8bf..2d166b85d5f6b 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.h +++ b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.h @@ -73,6 +73,7 @@ class SiPixelRawToDigiGPU : public edm::stream::EDProducer<> { // to store the output // uint *word_h, *fedIndex_h, *eventIndex_h; // host copy of input data uint *xx_h, *yy_h, *adc_h, *rawIdArr_h; // host copy of output + uint *errType_h, *errWord_h, *errFedID_h, *errRawID_h; // host copy of output // store the start and end index for each module (total 1856 modules-phase 1) int *mIndexStart_h, *mIndexEnd_h; CablingMap *cablingMapGPU; diff --git a/EventFilter/SiPixelRawToDigi/python/SiPixelRawToDigi_cfi.py b/EventFilter/SiPixelRawToDigi/python/SiPixelRawToDigi_cfi.py index feb5089785f1d..aabe584943683 100644 --- a/EventFilter/SiPixelRawToDigi/python/SiPixelRawToDigi_cfi.py +++ b/EventFilter/SiPixelRawToDigi/python/SiPixelRawToDigi_cfi.py @@ -21,7 +21,7 @@ siPixelDigisGPU = EventFilter.SiPixelRawToDigi.siPixelRawToDigiGPU_cfi.siPixelRawToDigiGPU.clone() siPixelDigisGPU.Timing = cms.untracked.bool(False) -siPixelDigisGPU.IncludeErrors = cms.bool(False) +siPixelDigisGPU.IncludeErrors = cms.bool(True) siPixelDigisGPU.InputLabel = cms.InputTag("rawDataCollector") siPixelDigisGPU.UseQualityInfo = cms.bool(False) ## ErrorList: list of error codes used by tracking to invalidate modules diff --git a/EventFilter/SiPixelRawToDigi/test/runRawToDigi_GPU_phase1.py b/EventFilter/SiPixelRawToDigi/test/runRawToDigi_GPU_phase1.py index 036d8450b54d3..b9b1da135e96d 100644 --- a/EventFilter/SiPixelRawToDigi/test/runRawToDigi_GPU_phase1.py +++ b/EventFilter/SiPixelRawToDigi/test/runRawToDigi_GPU_phase1.py @@ -2,7 +2,7 @@ from Configuration.StandardSequences.Eras import eras -process = cms.Process('MyDigis',eras.Run2_2017) +process = cms.Process('MyDigis',eras.Run2_2018) # import of standard configurations process.load('Configuration.StandardSequences.Services_cff') @@ -30,12 +30,16 @@ # Input source process.source = cms.Source("PoolSource", fileNames = cms.untracked.vstring( - 'file:step2.root', -# '/store/relval/CMSSW_9_4_0_pre3/RelValTTbar_13/GEN-SIM-RECO/PU25ns_94X_mc2017_realistic_v4_highPU_AVE50-v1/10000/22E2A744-E3BA-E711-A1A8-5065F3815241.root', + '/store/relval/CMSSW_9_4_0/RelValTTbar_13/GEN-SIM-RECO/94X_upgrade2018_realistic_v5-v1/10000/58452C1E-A7C8-E711-A56A-0025905A60CE.root', + #'/store/relval/CMSSW_9_4_0_pre3/RelValTTbar_13/GEN-SIM-RECO/PU25ns_94X_mc2017_realistic_v4_highPU_AVE50-v1/10000/22E2A744-E3BA-E711-A1A8-5065F3815241.root', ), secondaryFileNames = cms.untracked.vstring( -# '/store/relval/CMSSW_9_4_0_pre3/RelValTTbar_13/GEN-SIM-DIGI-RAW/PU25ns_94X_mc2017_realistic_v4_highPU_AVE50-v1/10000/62236337-BEBA-E711-9962-4C79BA1810EB.root', -# '/store/relval/CMSSW_9_4_0_pre3/RelValTTbar_13/GEN-SIM-DIGI-RAW/PU25ns_94X_mc2017_realistic_v4_highPU_AVE50-v1/10000/D6384D37-BEBA-E711-B24C-4C79BA180B9F.root', + #'/store/relval/CMSSW_9_4_0_pre3/RelValTTbar_13/GEN-SIM-DIGI-RAW/PU25ns_94X_mc2017_realistic_v4_highPU_AVE50-v1/10000/62236337-BEBA-E711-9962-4C79BA1810EB.root', + #'/store/relval/CMSSW_9_4_0_pre3/RelValTTbar_13/GEN-SIM-DIGI-RAW/PU25ns_94X_mc2017_realistic_v4_highPU_AVE50-v1/10000/D6384D37-BEBA-E711-B24C-4C79BA180B9F.root', + '/store/relval/CMSSW_9_4_0/RelValTTbar_13/GEN-SIM-DIGI-RAW/94X_upgrade2018_realistic_v5-v1/10000/0CA1E1A7-9EC8-E711-A286-0025905A612A.root', + '/store/relval/CMSSW_9_4_0/RelValTTbar_13/GEN-SIM-DIGI-RAW/94X_upgrade2018_realistic_v5-v1/10000/C27D6BA2-9BC8-E711-957F-003048FFD798.root', + '/store/relval/CMSSW_9_4_0/RelValTTbar_13/GEN-SIM-DIGI-RAW/94X_upgrade2018_realistic_v5-v1/10000/D4FD26AC-99C8-E711-99A0-0CC47A7C3432.root', + '/store/relval/CMSSW_9_4_0/RelValTTbar_13/GEN-SIM-DIGI-RAW/94X_upgrade2018_realistic_v5-v1/10000/EE36487F-9DC8-E711-9FBD-0CC47A7C3636.root', ) ) @@ -52,15 +56,14 @@ ) # Output definition - +process.FEVTDEBUGHLTEventContent.outputCommands.append('keep *_*_*_MyDigis') process.FEVTDEBUGHLToutput = cms.OutputModule("PoolOutputModule", dataset = cms.untracked.PSet( dataTier = cms.untracked.string('GEN-SIM-DIGI-RAW'), filterName = cms.untracked.string('') ), fileName = cms.untracked.string('file:digi.root'), -# outputCommands = cms.untracked.vstring("drop *", "keep *_simSiPixelDigis_*_*", "keep *_siPixelDigisGPU_*_*"), - outputCommands = cms.untracked.vstring("keep *"), + outputCommands = process.FEVTDEBUGHLTEventContent.outputCommands, splitLevel = cms.untracked.int32(0) ) @@ -79,10 +82,19 @@ # Other statements from Configuration.AlCa.GlobalTag import GlobalTag -process.GlobalTag = GlobalTag(process.GlobalTag, 'auto:phase1_2017_design', '') +process.GlobalTag = GlobalTag(process.GlobalTag, 'auto:phase1_2018_realistic', '') process.load("EventFilter.SiPixelRawToDigi.SiPixelRawToDigi_cfi") -process.siPixelClustersPreSplitting.src = cms.InputTag("siPixelDigisGPU") +process.siPixelClustersPreSplittingGPU = process.siPixelClustersPreSplitting.clone() +process.siPixelClustersPreSplittingGPU.src = "siPixelDigisGPU" +process.siPixelClustersGPU = process.siPixelClusters.clone() +process.siPixelClustersGPU.pixelClusters = "siPixelClustersPreSplittingGPU" +process.siPixelRecHitsGPU = process.siPixelRecHits.clone() +process.siPixelRecHitsGPU.src = "siPixelClustersGPU" +process.siPixelRecHitsPreSplittingGPU = process.siPixelRecHitsPreSplitting.clone() +process.siPixelRecHitsPreSplittingGPU.src = "siPixelClustersPreSplittingGPU" + +### Digi validation from Validation.SiPixelPhase1DigisV.SiPixelPhase1DigisV_cfi import * @@ -102,33 +114,131 @@ SiPixelPhase1DigisNdigisGPU, SiPixelPhase1DigisRowsGPU, SiPixelPhase1DigisColumnsGPU) - process.SiPixelPhase1DigisAnalyzerVGPU = process.SiPixelPhase1DigisAnalyzerV.clone() process.SiPixelPhase1DigisHarvesterVGPU = process.SiPixelPhase1DigisHarvesterV.clone() process.SiPixelPhase1DigisAnalyzerVGPU.src = cms.InputTag("siPixelDigisGPU") process.SiPixelPhase1DigisAnalyzerVGPU.histograms = SiPixelPhase1DigisConfGPU process.SiPixelPhase1DigisHarvesterVGPU.histograms = SiPixelPhase1DigisConfGPU +### Cluster validation + +from Validation.SiPixelPhase1TrackClustersV.SiPixelPhase1TrackClustersV_cfi import * + +SiPixelPhase1TrackClustersChargeGPU = SiPixelPhase1TrackClustersCharge.clone() +SiPixelPhase1TrackClustersSizeXGPU = SiPixelPhase1TrackClustersSizeX.clone() +SiPixelPhase1TrackClustersSizeYGPU = SiPixelPhase1TrackClustersSizeY.clone() +SiPixelPhase1TrackClustersChargeGPU.topFolderName = "PixelPhase1V/ClustersGPU" +SiPixelPhase1TrackClustersSizeXGPU.topFolderName = "PixelPhase1V/ClustersGPU" +SiPixelPhase1TrackClustersSizeYGPU.topFolderName = "PixelPhase1V/ClustersGPU" +SiPixelPhase1TrackClustersConfGPU = cms.VPSet( + SiPixelPhase1TrackClustersChargeGPU, + SiPixelPhase1TrackClustersSizeXGPU, + SiPixelPhase1TrackClustersSizeYGPU + ) +process.SiPixelPhase1TrackClustersAnalyzerVGPU = process.SiPixelPhase1TrackClustersAnalyzerV.clone() +process.SiPixelPhase1TrackClustersHarvesterVGPU = process.SiPixelPhase1TrackClustersHarvesterV.clone() +process.SiPixelPhase1TrackClustersAnalyzerVGPU.clusters = "siPixelClustersGPU" +process.SiPixelPhase1TrackClustersAnalyzerVGPU.histograms = SiPixelPhase1TrackClustersConfGPU +process.SiPixelPhase1TrackClustersHarvesterVGPU.histograms = SiPixelPhase1TrackClustersConfGPU + +### RecHit validation + +from Validation.SiPixelPhase1RecHitsV.SiPixelPhase1RecHitsV_cfi import * + +SiPixelPhase1RecHitsInTimeEventsGPU = SiPixelPhase1RecHitsInTimeEvents.clone() +SiPixelPhase1RecHitsOutTimeEventsGPU = SiPixelPhase1RecHitsOutTimeEvents.clone() +SiPixelPhase1RecHitsNSimHitsGPU = SiPixelPhase1RecHitsNSimHits.clone() +SiPixelPhase1RecHitsPosXGPU = SiPixelPhase1RecHitsPosX.clone() +SiPixelPhase1RecHitsPosYGPU = SiPixelPhase1RecHitsPosY.clone() +SiPixelPhase1RecHitsResXGPU = SiPixelPhase1RecHitsResX.clone() +SiPixelPhase1RecHitsResYGPU = SiPixelPhase1RecHitsResY.clone() +SiPixelPhase1RecHitsErrorXGPU = SiPixelPhase1RecHitsErrorX.clone() +SiPixelPhase1RecHitsErrorYGPU = SiPixelPhase1RecHitsErrorY.clone() +SiPixelPhase1RecHitsPullXGPU = SiPixelPhase1RecHitsPullX.clone() +SiPixelPhase1RecHitsPullYGPU = SiPixelPhase1RecHitsPullY.clone() + +SiPixelPhase1RecHitsInTimeEventsGPU.topFolderName = "PixelPhase1V/RecHitsGPU" +SiPixelPhase1RecHitsOutTimeEventsGPU.topFolderName = "PixelPhase1V/RecHitsGPU" +SiPixelPhase1RecHitsNSimHitsGPU.topFolderName = "PixelPhase1V/RecHitsGPU" +SiPixelPhase1RecHitsPosXGPU.topFolderName = "PixelPhase1V/RecHitsGPU" +SiPixelPhase1RecHitsPosYGPU.topFolderName = "PixelPhase1V/RecHitsGPU" +SiPixelPhase1RecHitsResXGPU.topFolderName = "PixelPhase1V/RecHitsGPU" +SiPixelPhase1RecHitsResYGPU.topFolderName = "PixelPhase1V/RecHitsGPU" +SiPixelPhase1RecHitsErrorXGPU.topFolderName = "PixelPhase1V/RecHitsGPU" +SiPixelPhase1RecHitsErrorYGPU.topFolderName = "PixelPhase1V/RecHitsGPU" +SiPixelPhase1RecHitsPullXGPU.topFolderName = "PixelPhase1V/RecHitsGPU" +SiPixelPhase1RecHitsPullYGPU.topFolderName = "PixelPhase1V/RecHitsGPU" +SiPixelPhase1RecHitsConfGPU = cms.VPSet( + SiPixelPhase1RecHitsInTimeEventsGPU, + SiPixelPhase1RecHitsOutTimeEventsGPU, + SiPixelPhase1RecHitsNSimHitsGPU, + SiPixelPhase1RecHitsPosXGPU, + SiPixelPhase1RecHitsPosYGPU, + SiPixelPhase1RecHitsResXGPU, + SiPixelPhase1RecHitsResYGPU, + SiPixelPhase1RecHitsErrorXGPU, + SiPixelPhase1RecHitsErrorYGPU, + SiPixelPhase1RecHitsPullXGPU, + SiPixelPhase1RecHitsPullYGPU, + ) +process.SiPixelPhase1RecHitsAnalyzerVGPU = process.SiPixelPhase1RecHitsAnalyzerV.clone() +process.SiPixelPhase1RecHitsHarvesterVGPU = process.SiPixelPhase1RecHitsHarvesterV.clone() +process.SiPixelPhase1RecHitsAnalyzerVGPU.src = "siPixelRecHitsGPU" +process.SiPixelPhase1RecHitsAnalyzerVGPU.histograms = SiPixelPhase1RecHitsConfGPU +process.SiPixelPhase1RecHitsHarvesterVGPU.histograms = SiPixelPhase1RecHitsConfGPU + +process.InitialStepPreSplitting = cms.Sequence( + #process.trackerClusterCheckPreSplitting + #+process.initialStepSeedLayersPreSplitting + #+process.initialStepTrackingRegionsPreSplitting + #+process.initialStepHitDoubletsPreSplitting + #+process.initialStepHitQuadrupletsPreSplitting + #+process.initialStepSeedsPreSplitting + #+process.initialStepTrackCandidatesPreSplitting + process.initialStepTracksPreSplitting + +process.firstStepPrimaryVerticesPreSplitting + +process.caloTowerForTrkPreSplitting + +process.ak4CaloJetsForTrkPreSplitting + +process.jetsForCoreTrackingPreSplitting + #+process.initialStepTrackRefsForJetsPreSplitting + #+process.caloTowerForTrkPreSplitting + #+process.ak4CaloJetsForTrkPreSplitting + #+process.jetsForCoreTrackingPreSplitting +# +process.siPixelClusters +# +process.siPixelRecHits +# +process.MeasurementTrackerEvent +# +process.siPixelClusterShapeCache + ) # Path and EndPath definitions process.raw2digi_step = cms.Path(process.siPixelDigis) process.raw2digiGPU_step = cms.Path(process.siPixelDigisGPU) -process.clustering = cms.Path(process.siPixelClustersPreSplitting) -process.validation_step = cms.Path(process.SiPixelPhase1DigisAnalyzerV + process.SiPixelPhase1DigisAnalyzerVGPU) -process.harvesting_step = cms.Path(process.SiPixelPhase1DigisHarvesterV + process.SiPixelPhase1DigisHarvesterVGPU) +process.clustering = cms.Path(process.InitialStepPreSplitting + process.siPixelClustersPreSplittingGPU + process.siPixelClustersGPU) +process.rechits = cms.Path(process.siPixelRecHitsGPU + process.siPixelRecHitsPreSplittingGPU) + +process.validation_step = cms.Path(process.SiPixelPhase1DigisAnalyzerV + process.SiPixelPhase1TrackClustersAnalyzerV + process.SiPixelPhase1RecHitsAnalyzerV) +process.harvesting_step = cms.Path(process.SiPixelPhase1DigisHarvesterV + process.SiPixelPhase1TrackClustersHarvesterV + process.SiPixelPhase1RecHitsHarvesterV) + +process.validationGPU_step = cms.Path(process.SiPixelPhase1DigisAnalyzerVGPU + process.SiPixelPhase1TrackClustersAnalyzerVGPU + process.SiPixelPhase1RecHitsAnalyzerVGPU) +process.harvestingGPU_step = cms.Path(process.SiPixelPhase1DigisHarvesterVGPU + process.SiPixelPhase1TrackClustersHarvesterVGPU + process.SiPixelPhase1RecHitsHarvesterVGPU) process.RECOSIMoutput_step = cms.EndPath(process.FEVTDEBUGHLToutput) process.DQMoutput_step = cms.EndPath(process.DQMoutput) process.dqmsave_step = cms.Path(process.DQMSaver) # Schedule definition -process.schedule = cms.Schedule(#process.raw2digi_step, +process.schedule = cms.Schedule( +# process.raw2digi_step, process.raw2digiGPU_step, -# process.clustering, + process.clustering, + process.rechits, process.validation_step, process.harvesting_step, + process.validationGPU_step, + process.harvestingGPU_step, process.RECOSIMoutput_step, process.DQMoutput_step, - process.dqmsave_step) + process.dqmsave_step + ) # customisation of the process. From 6987e1540ed2bd580b83f4cd36236c69540cf5f5 Mon Sep 17 00:00:00 2001 From: Andrea Bocci Date: Mon, 22 Jan 2018 17:21:44 +0100 Subject: [PATCH 07/88] Clean up and debug - remove `static` variables - comment out the debug code - general clean up --- .../SiPixelRawToDigi/plugins/CablingMapGPU.h | 17 - .../SiPixelRawToDigi/plugins/CudaError.h | 9 - .../SiPixelRawToDigi/plugins/RawToDigiGPU.cu | 672 ++++++++---------- .../SiPixelRawToDigi/plugins/RawToDigiGPU.h | 184 +++-- .../SiPixelRawToDigi/plugins/RawToDigiMem.h | 33 - .../plugins/SiPixelFedCablingMapGPU.cc | 155 ++-- .../plugins/SiPixelFedCablingMapGPU.h | 86 ++- .../plugins/SiPixelRawToDigiGPU.cc | 307 ++++---- .../plugins/SiPixelRawToDigiGPU.h | 18 +- .../SiPixelRawToDigi/plugins/cudaCheck.h | 38 + 10 files changed, 736 insertions(+), 783 deletions(-) delete mode 100644 EventFilter/SiPixelRawToDigi/plugins/CablingMapGPU.h delete mode 100644 EventFilter/SiPixelRawToDigi/plugins/CudaError.h delete mode 100644 EventFilter/SiPixelRawToDigi/plugins/RawToDigiMem.h create mode 100644 EventFilter/SiPixelRawToDigi/plugins/cudaCheck.h diff --git a/EventFilter/SiPixelRawToDigi/plugins/CablingMapGPU.h b/EventFilter/SiPixelRawToDigi/plugins/CablingMapGPU.h deleted file mode 100644 index dfd34ff879234..0000000000000 --- a/EventFilter/SiPixelRawToDigi/plugins/CablingMapGPU.h +++ /dev/null @@ -1,17 +0,0 @@ -// Sushil Dubey, Shashi Dugad, TIFR, December 2017 -#ifndef CablingMap_H -#define CablingMap_H - -struct CablingMap{ - unsigned int size; - unsigned int *fed; - unsigned int *link; - unsigned int *roc; - unsigned int *RawId; - unsigned int *rocInDet; - unsigned int *moduleId; - bool *modToUnp; - bool *badRocs; -}; - -#endif diff --git a/EventFilter/SiPixelRawToDigi/plugins/CudaError.h b/EventFilter/SiPixelRawToDigi/plugins/CudaError.h deleted file mode 100644 index cb673499700ed..0000000000000 --- a/EventFilter/SiPixelRawToDigi/plugins/CudaError.h +++ /dev/null @@ -1,9 +0,0 @@ -/*Sushil Dubey, Shashi Dugad, TIFR -* -*/ -#ifndef CUDA_ERROR_H -#define CUDA_ERROR_H - -void checkCUDAError(const char *msg); - -#endif diff --git a/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.cu b/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.cu index 71ed5640c1301..b4bee205d22b2 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.cu +++ b/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.cu @@ -2,178 +2,134 @@ * * File Name: RawToDigiGPU.cu * Description: It converts Raw data into Digi Format on GPU - * then it converts adc -> electron and + * then it converts adc -> electron and * applies the adc threshold to needed for clustering * Finaly the Output of RawToDigi data is given to pixelClusterizer * -**/ +**/ // System includes -#include -#include -#include -#include +#include +#include +#include #include #include #include #include #include + +// CUDA runtime +#include +#include #include #include #include #include #include -// CUDA runtime -#include -#include -#include "CudaError.h" +#include "cudaCheck.h" #include "EventInfoGPU.h" #include "RawToDigiGPU.h" -#include "RawToDigiMem.h" -#include "CablingMapGPU.h" - -using namespace std; - -// // forward declaration of pixelCluster_wrapper() -// void PixelCluster_Wrapper(uint *xx_adc, uint *yy_adc, uint *adc_d,const uint wordCounter, -// const int *mIndexStart, const int *mIndexEnd); - -/* - This functions checks for cuda error - Input: debug message - Output: returns cuda error message -*/ -void checkCUDAError(const char *msg) { - cudaError_t err = cudaGetLastError(); - if( cudaSuccess != err) { - fprintf(stderr, "Cuda error: %s: %s.\n", msg, cudaGetErrorString( err) ); - exit(-1); - } +#include "SiPixelFedCablingMapGPU.h" + + +context initDeviceMemory() { + context c; + + // Number of words for all the feds + uint32_t MAX_WORD_SIZE = MAX_FED * MAX_WORD * NEVENT * sizeof(uint32_t); + uint32_t FSIZE = 2*MAX_FED*NEVENT*sizeof(uint32_t)+sizeof(uint32_t); + uint32_t MSIZE = NMODULE*NEVENT*sizeof(int)+sizeof(int); + + cudaCheck(cudaMalloc((void**) & c.eventIndex_d, (NEVENT+1)*sizeof(uint32_t))); + cudaCheck(cudaMalloc((void**) & c.word_d, MAX_WORD_SIZE)); + cudaCheck(cudaMalloc((void**) & c.fedIndex_d, FSIZE)); + cudaCheck(cudaMalloc((void**) & c.xx_d, MAX_WORD_SIZE)); // to store the x and y coordinate + cudaCheck(cudaMalloc((void**) & c.yy_d, MAX_WORD_SIZE)); + cudaCheck(cudaMalloc((void**) & c.xx_adc, MAX_WORD_SIZE)); // to store the x and y coordinate + cudaCheck(cudaMalloc((void**) & c.yy_adc, MAX_WORD_SIZE)); + cudaCheck(cudaMalloc((void**) & c.adc_d, MAX_WORD_SIZE)); + cudaCheck(cudaMalloc((void**) & c.layer_d , MAX_WORD_SIZE)); + cudaCheck(cudaMalloc((void**) & c.rawIdArr_d, MAX_WORD_SIZE)); + cudaCheck(cudaMalloc((void**) & c.errType_d, MAX_WORD_SIZE)); + cudaCheck(cudaMalloc((void**) & c.errWord_d, MAX_WORD_SIZE)); + cudaCheck(cudaMalloc((void**) & c.errFedID_d, MAX_WORD_SIZE)); + cudaCheck(cudaMalloc((void**) & c.errRawID_d, MAX_WORD_SIZE)); + cudaCheck(cudaMalloc((void**) & c.moduleId_d, MAX_WORD_SIZE)); + cudaCheck(cudaMalloc((void**) & c.mIndexStart_d, MSIZE)); + cudaCheck(cudaMalloc((void**) & c.mIndexEnd_d, MSIZE)); + + // create a CUDA stream + cudaCheck(cudaStreamCreate(&c.stream)); + + return c; } -void initDeviceMemory() { - // int sizeByte = MAX_FED * MAX_LINK * MAX_ROC * sizeof(uint)+sizeof(uint); - // // Unified memory for cabling map - // cudaMallocManaged((void**)&Map, sizeof(CablingMap)); - // cudaMallocManaged((void**)&Map->RawId, sizeByte); - // cudaMallocManaged((void**)&Map->rocInDet, sizeByte); - // cudaMallocManaged((void**)&Map->moduleId, sizeByte); - // Number of words for all the feds - uint MAX_WORD_SIZE = MAX_FED*MAX_WORD*NEVENT*sizeof(uint); - uint FSIZE = 2*MAX_FED*NEVENT*sizeof(uint)+sizeof(uint); - - int MSIZE = NMODULE*NEVENT*sizeof(int)+sizeof(int); - - cudaMalloc((void**)&eventIndex_d, (NEVENT+1)*sizeof(uint)); - - cudaMalloc((void**)&word_d, MAX_WORD_SIZE); - cudaMalloc((void**)&fedIndex_d, FSIZE); - cudaMalloc((void**)&xx_d, MAX_WORD_SIZE); // to store the x and y coordinate - cudaMalloc((void**)&yy_d, MAX_WORD_SIZE); - cudaMalloc((void**)&xx_adc, MAX_WORD_SIZE); // to store the x and y coordinate - cudaMalloc((void**)&yy_adc, MAX_WORD_SIZE); - cudaMalloc((void**)&adc_d, MAX_WORD_SIZE); - cudaMalloc((void**)&layer_d , MAX_WORD_SIZE); - cudaMalloc((void**)&rawIdArr_d, MAX_WORD_SIZE); - - cudaMalloc((void**)&errType_d, MAX_WORD_SIZE); - cudaMalloc((void**)&errWord_d, MAX_WORD_SIZE); - cudaMalloc((void**)&errFedID_d, MAX_WORD_SIZE); - cudaMalloc((void**)&errRawID_d, MAX_WORD_SIZE); - - cudaMalloc((void**)&moduleId_d, MAX_WORD_SIZE); - cudaMalloc((void**)&mIndexStart_d, MSIZE); - cudaMalloc((void**)&mIndexEnd_d, MSIZE); - // create stream for RawToDigi - for(int i=0;iRawId); - // cudaFree(Map->rocInDet); - // cudaFree(Map->moduleId); - // cudaFree(Map); - - // destroy the stream - for(int i=0;i> LINK_shift) & LINK_mask); } -__device__ uint getRoc(uint ww) { +__device__ uint32_t getRoc(uint32_t ww) { return ((ww >> ROC_shift ) & ROC_mask); } -__device__ uint getADC(uint ww) { +__device__ uint32_t getADC(uint32_t ww) { return ((ww >> ADC_shift) & ADC_mask); } -__device__ bool isBarrel(uint rawId) { +__device__ bool isBarrel(uint32_t rawId) { return (1==((rawId>>25)&0x7)); } -//__device__ uint FED_START = 1200; +//__device__ uint32_t FED_START = 1200; -__device__ DetIdGPU getRawId(const CablingMap *Map, uint fed, uint link, uint roc) { - uint index = fed * MAX_LINK * MAX_ROC + (link-1) * MAX_ROC + roc; - DetIdGPU detId = {Map->RawId[index], Map->rocInDet[index], Map->moduleId[index]}; - return detId; +__device__ DetIdGPU getRawId(const SiPixelFedCablingMapGPU *Map, uint32_t fed, uint32_t link, uint32_t roc) { + uint32_t index = fed * MAX_LINK * MAX_ROC + (link-1) * MAX_ROC + roc; + DetIdGPU detId = { Map->RawId[index], Map->rocInDet[index], Map->moduleId[index] }; + return detId; } //reference http://cmsdoxygen.web.cern.ch/cmsdoxygen/CMSSW_9_2_0/doc/html/dd/d31/FrameConversion_8cc_source.html //http://cmslxr.fnal.gov/source/CondFormats/SiPixelObjects/src/PixelROC.cc?v=CMSSW_9_2_0#0071 // Convert local pixel to global pixel -__device__ Pixel frameConversion(bool bpix, int side, uint layer, uint rocIdInDetUnit, Pixel local) { - +__device__ Pixel frameConversion(bool bpix, int side, uint32_t layer, uint32_t rocIdInDetUnit, Pixel local) { + int slopeRow = 0, slopeCol = 0; int rowOffset = 0, colOffset = 0; - if(bpix) { - - if(side == -1 && layer != 1) { // -Z side: 4 non-flipped modules oriented like 'dddd', except Layer 1 + if (bpix) { + + if (side == -1 && layer != 1) { // -Z side: 4 non-flipped modules oriented like 'dddd', except Layer 1 if (rocIdInDetUnit < 8) { - slopeRow = 1; + slopeRow = 1; slopeCol = -1; rowOffset = 0; colOffset = (8-rocIdInDetUnit)*numColsInRoc-1; @@ -186,7 +142,7 @@ __device__ Pixel frameConversion(bool bpix, int side, uint layer, uint rocIdInDe } // if roc } else { // +Z side: 4 non-flipped modules oriented like 'pppp', but all 8 in layer1 - if(rocIdInDetUnit < 8) { + if (rocIdInDetUnit < 8) { slopeRow = -1; slopeCol = 1; rowOffset = 2*numRowsInRoc-1; @@ -202,7 +158,7 @@ __device__ Pixel frameConversion(bool bpix, int side, uint layer, uint rocIdInDe } else { // fpix - if(side==-1) { // pannel 1 + if (side==-1) { // pannel 1 if (rocIdInDetUnit < 8) { slopeRow = 1; slopeCol = -1; @@ -234,120 +190,120 @@ __device__ Pixel frameConversion(bool bpix, int side, uint layer, uint rocIdInDe } - uint gRow = rowOffset+slopeRow*local.row; - uint gCol = colOffset+slopeCol*local.col; + uint32_t gRow = rowOffset+slopeRow*local.row; + uint32_t gCol = colOffset+slopeCol*local.col; //printf("Inside frameConversion row: %u, column: %u\n",gRow, gCol); Pixel global = {gRow, gCol}; return global; } -__device__ uint conversionError(uint fedId, uint status, bool debug = false) +__device__ uint32_t conversionError(uint32_t fedId, uint32_t status, bool debug = false) { - - uint errorType = 0; - + + uint32_t errorType = 0; + switch (status) { case(1) : { - if(debug) printf("Error in Fed: %i, invalid channel Id (errorType=35)", fedId ); + if (debug) printf("Error in Fed: %i, invalid channel Id (errorType=35)", fedId ); errorType = 35; break; } case(2) : { - if(debug) printf("Error in Fed: %i, invalid ROC Id (errorType=36)", fedId); + if (debug) printf("Error in Fed: %i, invalid ROC Id (errorType=36)", fedId); errorType = 36; break; } case(3) : { - if(debug) printf("Error in Fed: %i, invalid dcol/pixel value (errorType=37)", fedId); + if (debug) printf("Error in Fed: %i, invalid dcol/pixel value (errorType=37)", fedId); errorType = 37; break; } case(4) : { - if(debug) printf("Error in Fed: %i, dcol/pixel read out of order (errorType=38)", fedId); + if (debug) printf("Error in Fed: %i, dcol/pixel read out of order (errorType=38)", fedId); errorType = 38; break; } - default: if(debug) printf("Cabling check returned unexpected result, status = %i", status); + default: if (debug) printf("Cabling check returned unexpected result, status = %i", status); }; - + return errorType; - + } -__device__ bool rocRowColIsValid(uint rocRow, uint rocCol) +__device__ bool rocRowColIsValid(uint32_t rocRow, uint32_t rocCol) { - uint numRowsInRoc = 80; - uint numColsInRoc = 52; - + uint32_t numRowsInRoc = 80; + uint32_t numColsInRoc = 52; + /// row and collumn in ROC representation return ( (rocRow < numRowsInRoc) & (rocCol < numColsInRoc) ); } -__device__ bool dcolIsValid(uint dcol, uint pxid) +__device__ bool dcolIsValid(uint32_t dcol, uint32_t pxid) { return ( (dcol < 26) & (2 <= pxid) & (pxid < 162) ); } -__device__ uint checkROC(uint errorWord, uint fedId, uint link, const CablingMap *Map, bool debug = false) +__device__ uint32_t checkROC(uint32_t errorWord, uint32_t fedId, uint32_t link, const SiPixelFedCablingMapGPU *Map, bool debug = false) { - + int errorType = (errorWord >> ROC_shift) & ERROR_mask; bool errorFound = false; switch (errorType) { case(25) : { - uint index = fedId * MAX_LINK * MAX_ROC + (link-1) * MAX_ROC + 1; - if(index > 1 && index <= Map->size){ - if(!(link == Map->link[index] && 1 == Map->roc[index])) errorFound = false; + uint32_t index = fedId * MAX_LINK * MAX_ROC + (link-1) * MAX_ROC + 1; + if (index > 1 && index <= Map->size){ + if (!(link == Map->link[index] && 1 == Map->roc[index])) errorFound = false; } else{ errorFound = true; - if(debug) printf("Invalid ROC = 25 found (errorType=25)"); + if (debug) printf("Invalid ROC = 25 found (errorType=25)"); } break; } case(26) : { - if(debug) printf("Gap word found (errorType=26)"); + if (debug) printf("Gap word found (errorType=26)"); errorFound = true; break; } case(27) : { - if(debug) printf("Dummy word found (errorType=27)"); + if (debug) printf("Dummy word found (errorType=27)"); errorFound = true; break; } case(28) : { - if(debug) printf("Error fifo nearly full (errorType=28)"); + if (debug) printf("Error fifo nearly full (errorType=28)"); errorFound = true; break; } case(29) : { - if(debug) printf("Timeout on a channel (errorType=29)"); + if (debug) printf("Timeout on a channel (errorType=29)"); if ((errorWord >> OMIT_ERR_shift) & OMIT_ERR_mask) { - if(debug) printf("...first errorType=29 error, this gets masked out"); + if (debug) printf("...first errorType=29 error, this gets masked out"); } errorFound = true; break; } case(30) : { - if(debug) printf("TBM error trailer (errorType=30)"); + if (debug) printf("TBM error trailer (errorType=30)"); int StateMatch_bits = 4; int StateMatch_shift = 8; uint32_t StateMatch_mask = ~(~uint32_t(0) << StateMatch_bits); int StateMatch = (errorWord >> StateMatch_shift) & StateMatch_mask; - if( StateMatch != 1 && StateMatch != 8 ) { - if(debug) printf("FED error 30 with unexpected State Bits (errorType=30)"); + if ( StateMatch != 1 && StateMatch != 8 ) { + if (debug) printf("FED error 30 with unexpected State Bits (errorType=30)"); } - if( StateMatch==1 ) errorType = 40; // 1=Overflow -> 40, 8=number of ROCs -> 30 + if ( StateMatch==1 ) errorType = 40; // 1=Overflow -> 40, 8=number of ROCs -> 30 errorFound = true; break; } case(31) : { - if(debug) printf("Event number error (errorType=31)"); + if (debug) printf("Event number error (errorType=31)"); errorFound = true; break; } @@ -356,23 +312,23 @@ __device__ uint checkROC(uint errorWord, uint fedId, uint link, const CablingMap }; return errorFound? errorType : 0; - + } -__device__ uint getErrRawID(uint fedId, uint errWord, uint errorType, const CablingMap *Map, bool debug = false) +__device__ uint32_t getErrRawID(uint32_t fedId, uint32_t errWord, uint32_t errorType, const SiPixelFedCablingMapGPU *Map, bool debug = false) { - - uint rID = 0xffffffff; + + uint32_t rID = 0xffffffff; switch (errorType) { case 25 : case 30 : case 31 : case 36 : case 40 : { // set dummy values for cabling just to get detId from link //cabling.dcol = 0; //cabling.pxid = 2; - uint roc = 1; - uint link = (errWord >> LINK_shift) & LINK_mask; - + uint32_t roc = 1; + uint32_t link = (errWord >> LINK_shift) & LINK_mask; + rID = getRawId(Map, fedId, link, roc).RawId; break; } @@ -383,7 +339,7 @@ __device__ uint getErrRawID(uint fedId, uint errWord, uint errorType, const Cabl const int DB2_shift = DB1_shift + 1; const int DB3_shift = DB2_shift + 1; const int DB4_shift = DB3_shift + 1; - const uint DataBit_mask = ~(~uint(0) << 1); + const uint32_t DataBit_mask = ~(~uint32_t(0) << 1); int CH1 = (errWord >> DB0_shift) & DataBit_mask; int CH2 = (errWord >> DB1_shift) & DataBit_mask; @@ -392,60 +348,60 @@ __device__ uint getErrRawID(uint fedId, uint errWord, uint errorType, const Cabl int CH5 = (errWord >> DB4_shift) & DataBit_mask; int BLOCK_bits = 3; int BLOCK_shift = 8; - uint BLOCK_mask = ~(~uint(0) << BLOCK_bits); + uint32_t BLOCK_mask = ~(~uint32_t(0) << BLOCK_bits); int BLOCK = (errWord >> BLOCK_shift) & BLOCK_mask; int localCH = 1*CH1+2*CH2+3*CH3+4*CH4+5*CH5; if (BLOCK%2==0) chanNmbr=(BLOCK/2)*9+localCH; else chanNmbr = ((BLOCK-1)/2)*9+4+localCH; if ((chanNmbr < 1)||(chanNmbr > 36)) break; // signifies unexpected result - + // set dummy values for cabling just to get detId from link if in Barrel //cabling.dcol = 0; //cabling.pxid = 2; - uint roc = 1; - uint link = chanNmbr; + uint32_t roc = 1; + uint32_t link = chanNmbr; rID = getRawId(Map, fedId, link, roc).RawId; break; } case 37 : case 38: { //cabling.dcol = 0; //cabling.pxid = 2; - uint roc = (errWord >> ROC_shift) & ROC_mask; - uint link = (errWord >> LINK_shift) & LINK_mask; + uint32_t roc = (errWord >> ROC_shift) & ROC_mask; + uint32_t link = (errWord >> LINK_shift) & LINK_mask; rID = getRawId(Map, fedId, link, roc).RawId; break; } - + default : break; - + }; - + return rID; - + } /*---------- * Name: applyADCthreshold_kernel() -* Desc: converts adc count to electrons and then applies the -* threshold on each channel. +* Desc: converts adc count to electrons and then applies the +* threshold on each channel. * make pixel to 0 if it is below the threshold * Input: xx_d[], yy_d[], layer_d[], wordCounter, adc[], ADCThreshold *----------- -* Output: xx_adc[], yy_adc[] with pixel threshold applied +* Output: xx_adc[], yy_adc[] with pixel threshold applied */ // kernel to apply adc threshold on the channels __global__ void applyADCthreshold_kernel -(const uint *xx_d, const uint *yy_d, const uint *layer_d, uint *adc, const uint wordCounter, - const ADCThreshold adcThreshold, uint *xx_adc, uint *yy_adc ) { +(const uint32_t *xx_d, const uint32_t *yy_d, const uint32_t *layer_d, uint32_t *adc, const uint32_t wordCounter, + const ADCThreshold adcThreshold, uint32_t *xx_adc, uint32_t *yy_adc ) { int tid = threadIdx.x; int gIndex = blockDim.x*blockIdx.x+tid; - if(gIndex=adcThreshold.theFirstStack_) { if (adcThreshold.theStackADC_==1 && adcOld==1) { adcNew = int(255*135); // Arbitrarily use overflow value. @@ -454,8 +410,8 @@ __global__ void applyADCthreshold_kernel adcNew = int((adcOld-1) * gain * 255/float(adcThreshold.theStackADC_-1)); } } - - if(adcNew >adcThreshold.thePixelThreshold ) { + + if (adcNew >adcThreshold.thePixelThreshold ) { xx_adc[gIndex]=xx_d[gIndex]; yy_adc[gIndex]=yy_d[gIndex]; } @@ -465,65 +421,71 @@ __global__ void applyADCthreshold_kernel } adc[gIndex] = adcNew; } -} +} // Kernel to perform Raw to Digi conversion -__global__ void RawToDigi_kernel(const CablingMap *Map, const uint *Word, const uint *fedIndex, - uint *eventIndex, const uint stream, uint *XX, uint *YY, uint *moduleId, int *mIndexStart, - int *mIndexEnd, uint *ADC, uint *layerArr, uint *rawIdArr, - uint *errType, uint *errWord, uint *errFedID, uint *errRawID, +__global__ void RawToDigi_kernel(const SiPixelFedCablingMapGPU *Map, const uint32_t *Word, const uint32_t *fedIndex, + uint32_t *eventIndex, uint32_t *XX, uint32_t *YY, uint32_t *moduleId, int *mIndexStart, + int *mIndexEnd, uint32_t *ADC, uint32_t *layerArr, uint32_t *rawIdArr, + uint32_t *errType, uint32_t *errWord, uint32_t *errFedID, uint32_t *errRawID, bool useQualityInfo, bool includeErrors, bool debug) { - uint blockId = blockIdx.x; - uint eventno = blockIdx.y + gridDim.y*stream; - - //const uint eventOffset = eventIndex[eventno]; - uint fedOffset = 2*MAX_FED*eventno; - uint fedId = fedIndex[fedOffset + blockId]; - uint threadId = threadIdx.x; - - uint begin = fedIndex[fedOffset + MAX_FED + blockId]; - uint end = fedIndex[fedOffset + MAX_FED + blockId + 1]; - - if(blockIdx.x == gridDim.x - 1) { + uint32_t blockId = blockIdx.x; + uint32_t eventno = blockIdx.y; + + //const uint32_t eventOffset = eventIndex[eventno]; + uint32_t fedOffset = 2*MAX_FED*eventno; + uint32_t fedId = fedIndex[fedOffset + blockId]; + uint32_t threadId = threadIdx.x; + + uint32_t begin = fedIndex[fedOffset + MAX_FED + blockId]; + uint32_t end = fedIndex[fedOffset + MAX_FED + blockId + 1]; + + if (blockIdx.x == gridDim.x - 1) { end = eventIndex[eventno + 1]; // for last fed to get the end index } - uint link = 0; - uint roc = 0; + uint32_t link = 0; + uint32_t roc = 0; bool skipROC = false; - //if(threadId==0) printf("Event: %u blockId: %u start: %u end: %u\n", eventno, blockId, begin, end); - int no_itr = (end - begin)/blockDim.x + 1; // to deal with number of hits greater than blockDim.x + //if (threadId==0) printf("Event: %u blockId: %u start: %u end: %u\n", eventno, blockId, begin, end); + int no_itr = (end - begin)/blockDim.x + 1; // to deal with number of hits greater than blockDim.x #pragma unroll - for(int i = 0; i < no_itr; i++) { // use a static number to optimize this loop - uint gIndex = begin + threadId + i*blockDim.x; - if(gIndex < end) { - uint ww = Word[gIndex]; // Array containing 32 bit raw data - if(ww == 0) { + for (int i = 0; i < no_itr; i++) { + uint32_t gIndex = begin + threadId + i*blockDim.x; + if (gIndex < end) { + uint32_t ww = Word[gIndex]; // Array containing 32 bit raw data + if (includeErrors) { + errType[gIndex] = 0; + errWord[gIndex] = ww; + errFedID[gIndex] = fedId; + errRawID[gIndex] = 0; + } + if (ww == 0) { //noise and dead channels are ignored XX[gIndex] = 0; // 0 is an indicator of a noise/dead channel YY[gIndex] = 0; // skip these pixels during clusterization ADC[gIndex] = 0; - layerArr[gIndex] = 0; + layerArr[gIndex] = 0; moduleId[gIndex] = 9999; //9999 is the indication of bad module, taken care later rawIdArr[gIndex] = 9999; continue ; // 0: bad word, } - - uint nlink = getLink(ww); // Extract link - uint nroc = getRoc(ww); // Extract Roc in link + + uint32_t nlink = getLink(ww); // Extract link + uint32_t nroc = getRoc(ww); // Extract Roc in link if (!((nlink != link) | (nroc != roc))) continue; link = nlink; roc = nroc; - - uint errorType = checkROC(ww, fedId, link, Map, debug); + + uint32_t errorType = checkROC(ww, fedId, link, Map, debug); skipROC = (roc < maxROCIndex) ? false : (errorType != 0); - if (skipROC && includeErrors) { - uint rID = getErrRawID(fedId, ww, errorType, Map, debug); //write the function - errType[gIndex] = errorType; - errWord[gIndex] = ww; + if (includeErrors and skipROC) { + uint32_t rID = getErrRawID(fedId, ww, errorType, Map, debug); //write the function + errType[gIndex] = errorType; + errWord[gIndex] = ww; errFedID[gIndex] = fedId; errRawID[gIndex] = rID; continue; @@ -535,27 +497,27 @@ __global__ void RawToDigi_kernel(const CablingMap *Map, const uint *Word, const skipROC=true; continue; }*/ - + DetIdGPU detId = getRawId(Map, fedId, link, roc); - uint rawId = detId.RawId; - uint rocIdInDetUnit = detId.rocInDet; - + uint32_t rawId = detId.RawId; + uint32_t rocIdInDetUnit = detId.rocInDet; + bool barrel = isBarrel(rawId); - - uint index = fedId * MAX_LINK * MAX_ROC + (link-1) * MAX_ROC + roc; + + uint32_t index = fedId * MAX_LINK * MAX_ROC + (link-1) * MAX_ROC + roc; if (useQualityInfo) { - + skipROC = Map->badRocs[index]; if (skipROC) continue; - + } skipROC = Map->modToUnp[index]; if (skipROC) continue; - - uint layer = 0;//, ladder =0; + + uint32_t layer = 0;//, ladder =0; int side = 0, panel = 0, module = 0;//disk = 0,blade = 0 - - if(barrel) { + + if (barrel) { layer = (rawId >> layerStartBit_) & layerMask_; //ladder = (rawId >> ladderStartBit_) & ladderMask_; module = (rawId >> moduleStartBit_) & moduleMask_; @@ -569,47 +531,44 @@ __global__ void RawToDigi_kernel(const CablingMap *Map, const uint *Word, const side = (panel==1)? -1 : 1; //blade = (rawId>>bladeStartBit_) & bladeMask_; } - + // ***special case of layer to 1 be handled here Pixel localPix; - if(layer == 1) { - uint col = (ww >> COL_shift) & COL_mask; - uint row = (ww >> ROW_shift) & ROW_mask; + if (layer == 1) { + uint32_t col = (ww >> COL_shift) & COL_mask; + uint32_t row = (ww >> ROW_shift) & ROW_mask; localPix.row = row; localPix.col = col; - - if( !rocRowColIsValid(row, col) && includeErrors) { - uint error = conversionError(fedId, 3, debug); //use the device function and fill the arrays - errType[gIndex] = error; - errWord[gIndex] = ww; - errFedID[gIndex] = fedId; - errRawID[gIndex] = rawId; - printf("Error status: %i\n", error); - continue; + if (includeErrors) { + if (not rocRowColIsValid(row, col)) { + uint32_t error = conversionError(fedId, 3, debug); //use the device function and fill the arrays + errType[gIndex] = error; + errWord[gIndex] = ww; + errFedID[gIndex] = fedId; + errRawID[gIndex] = rawId; + printf("Error status: %i\n", error); + continue; + } } - - } - else { + } else { // ***conversion rules for dcol and pxid - uint dcol = (ww >> DCOL_shift) & DCOL_mask; - uint pxid = (ww >> PXID_shift) & PXID_mask; - uint row = numRowsInRoc - pxid/2; - uint col = dcol*2 + pxid%2; + uint32_t dcol = (ww >> DCOL_shift) & DCOL_mask; + uint32_t pxid = (ww >> PXID_shift) & PXID_mask; + uint32_t row = numRowsInRoc - pxid/2; + uint32_t col = dcol*2 + pxid%2; localPix.row = row; localPix.col = col; - - if( !dcolIsValid(dcol, pxid) && includeErrors) { - uint error = conversionError(fedId, 3, debug); + if (includeErrors and not dcolIsValid(dcol, pxid)) { + uint32_t error = conversionError(fedId, 3, debug); errType[gIndex] = error; errWord[gIndex] = ww; errFedID[gIndex] = fedId; errRawID[gIndex] = rawId; printf("Error status: %i\n", error); continue; - } - + } } - + Pixel globalPix = frameConversion(barrel, side, layer, rocIdInDetUnit, localPix); //printf("GPU side: %i, layer: %i, roc: %i, lrow: %i, lcol: %i, grow: %i, gcol: %i, word: %i\n", side, layer, rocIdInDetUnit, localPix.row, localPix.col, globalPix.row, globalPix.col, ww); XX[gIndex] = globalPix.row ; // origin shifting by 1 0-159 @@ -618,15 +577,16 @@ __global__ void RawToDigi_kernel(const CablingMap *Map, const uint *Word, const layerArr[gIndex] = layer; moduleId[gIndex] = detId.moduleId; rawIdArr[gIndex] = rawId; - - errType[gIndex] = 0; - errWord[gIndex] = ww; - errFedID[gIndex] = fedId; - errRawID[gIndex] = rawId; - //fill error type - } // end of if(gIndex < end) + if (includeErrors) { + //fill error type + errType[gIndex] = 0; + errWord[gIndex] = ww; + errFedID[gIndex] = fedId; + errRawID[gIndex] = rawId; + } + } // end of if (gIndex < end) } // end of for(int i =0;imoduleId[gIndex+1]) { + if (moduleId[gIndex]==moduleId[gIndex+2] && moduleId[gIndex]>moduleId[gIndex+1]) { atomicExch(&moduleId[gIndex+1], atomicExch(&moduleId[gIndex], moduleId[gIndex+1])); //*swap all the digi id atomicExch(&XX[gIndex+1], atomicExch(&XX[gIndex], XX[gIndex+1])); @@ -671,128 +631,124 @@ __global__ void RawToDigi_kernel(const CablingMap *Map, const uint *Word, const // assign the previous valid moduleId to this pixel to remove 9999 // so that we can get the start & end index of module easily. __syncthreads(); // let the swapping finish first - - if(moduleId[gIndex] == 9999) { + + if (moduleId[gIndex] == 9999) { int m=gIndex; while(moduleId[--m] == 9999) {} //skip till you get the valid module moduleId[gIndex] = moduleId[m]; - } - } // end of if(gIndex moduleId[gIndex-1] ) { + if (moduleId[gIndex] > moduleId[gIndex-1] ) { mIndexStart[moduleOffset+ moduleId[gIndex]] = gIndex; - } - } //end of if(gIndex!= begin && (gIndex<(end-1)) ... - } //end of if(gIndex >>(cablingMapDevice, word_d, fedIndex_d,eventIndex_d,i, xx_d, yy_d, moduleId_d, - mIndexStart_d, mIndexEnd_d, adc_d,layer_d, rawIdArr_d, errType_d, errWord_d, errFedID_d, errRawID_d, useQualityInfo, includeErrors, debug); - } - - checkCUDAError("Error in RawToDigi_kernel"); - for (int i = 0; i < NSTREAM; i++) { - cudaStreamSynchronize(stream[i]); - checkCUDAError("Error in cuda stream cudaStreamSynchronize"); - } - checkCUDAError("Error in RawToDigi_kernel"); - //cudaDeviceSynchronize(); - - // kernel to apply adc threashold on the channel - //ADCThreshold adcThreshold; - //uint numThreads = 512; - //uint numBlocks = wordCounter/512 +1; - //applyADCthreshold_kernel<<>>(xx_d, yy_d,layer_d,adc_d, wordCounter, adcThreshold, xx_adc, yy_adc); - //cudaDeviceSynchronize(); - //checkCUDAError("Error in applying ADC threshold"); - cout << "Raw data is converted into digi for " << NEVENT << " Events" << endl; + fedOffset = 0; + wordOffset = eventIndex[0]; + // total no of words in blockY event to be trasfered on device + wordSize = (eventIndex[blockY] - eventIndex[0]); + cudaCheck(cudaMemcpyAsync(&c.word_d[wordOffset], &word[wordOffset], wordSize*sizeof(uint32_t), cudaMemcpyHostToDevice, c.stream)); + cudaCheck(cudaMemcpyAsync(&c.fedIndex_d[fedOffset], &fedIndex[fedOffset], FSIZE, cudaMemcpyHostToDevice, c.stream)); + + // Launch rawToDigi kernel + RawToDigi_kernel<<>>( + cablingMapDevice, + c.word_d, + c.fedIndex_d, + c.eventIndex_d, + c.xx_d, + c.yy_d, + c.moduleId_d, + c.mIndexStart_d, + c.mIndexEnd_d, + c.adc_d,c.layer_d, + c.rawIdArr_d, + c.errType_d, + c.errWord_d, + c.errFedID_d, + c.errRawID_d, + useQualityInfo, + includeErrors, + debug); + cudaCheck(cudaGetLastError()); // copy data to host variable // if you want to copy data after applying ADC threshold - if(convertADCtoElectrons) { - cudaMemcpy(xx_h, xx_adc, wordCounter*sizeof(uint), cudaMemcpyDeviceToHost); - cudaMemcpy(yy_h, yy_adc, wordCounter*sizeof(uint), cudaMemcpyDeviceToHost); - } - else { - cudaMemcpy(xx_h, xx_d, wordCounter*sizeof(uint), cudaMemcpyDeviceToHost); - cudaMemcpy(yy_h, yy_d, wordCounter*sizeof(uint), cudaMemcpyDeviceToHost); + if (convertADCtoElectrons) { + cudaCheck(cudaMemcpyAsync(xx_h, c.xx_adc, wordCounter * sizeof(uint32_t), cudaMemcpyDeviceToHost, c.stream)); + cudaCheck(cudaMemcpyAsync(yy_h, c.yy_adc, wordCounter * sizeof(uint32_t), cudaMemcpyDeviceToHost, c.stream)); + } else { + cudaCheck(cudaMemcpyAsync(xx_h, c.xx_d, wordCounter*sizeof(uint32_t), cudaMemcpyDeviceToHost, c.stream)); + cudaCheck(cudaMemcpyAsync(yy_h, c.yy_d, wordCounter*sizeof(uint32_t), cudaMemcpyDeviceToHost, c.stream)); } - cudaMemcpy(adc_h, adc_d, wordCounter*sizeof(uint), cudaMemcpyDeviceToHost); - cudaMemcpy(rawIdArr_h, rawIdArr_d, wordCounter*sizeof(uint), cudaMemcpyDeviceToHost); - - cudaMemcpy(mIndexStart_h, mIndexStart_d, NEVENT*NMODULE*sizeof(int), cudaMemcpyDeviceToHost); - cudaMemcpy(mIndexEnd_h, mIndexEnd_d, NEVENT*NMODULE*sizeof(int), cudaMemcpyDeviceToHost); - - if(includeErrors){ - cudaMemcpy(errType_h, errType_d, wordCounter*sizeof(uint), cudaMemcpyDeviceToHost); - cudaMemcpy(errWord_h, errWord_d, wordCounter*sizeof(uint), cudaMemcpyDeviceToHost); - cudaMemcpy(errFedID_h, errFedID_d, wordCounter*sizeof(uint), cudaMemcpyDeviceToHost); - cudaMemcpy(errRawID_h, errRawID_d, wordCounter*sizeof(uint), cudaMemcpyDeviceToHost); + cudaCheck(cudaMemcpyAsync(adc_h, c.adc_d, wordCounter*sizeof(uint32_t), cudaMemcpyDeviceToHost, c.stream)); + cudaCheck(cudaMemcpyAsync(rawIdArr_h, c.rawIdArr_d, wordCounter*sizeof(uint32_t), cudaMemcpyDeviceToHost, c.stream)); + + cudaCheck(cudaMemcpyAsync(mIndexStart_h, c.mIndexStart_d, NEVENT*NMODULE*sizeof(int), cudaMemcpyDeviceToHost, c.stream)); + cudaCheck(cudaMemcpyAsync(mIndexEnd_h, c.mIndexEnd_d, NEVENT*NMODULE*sizeof(int), cudaMemcpyDeviceToHost, c.stream)); + + if (includeErrors) { + cudaCheck(cudaMemcpyAsync(errType_h, c.errType_d, wordCounter*sizeof(uint32_t), cudaMemcpyDeviceToHost, c.stream)); + cudaCheck(cudaMemcpyAsync(errWord_h, c.errWord_d, wordCounter*sizeof(uint32_t), cudaMemcpyDeviceToHost, c.stream)); + cudaCheck(cudaMemcpyAsync(errFedID_h, c.errFedID_d, wordCounter*sizeof(uint32_t), cudaMemcpyDeviceToHost, c.stream)); + cudaCheck(cudaMemcpyAsync(errRawID_h, c.errRawID_d, wordCounter*sizeof(uint32_t), cudaMemcpyDeviceToHost, c.stream)); } // End of Raw2Digi and passing data for cluserisation - // PixelCluster_Wrapper(xx_adc , yy_adc, adc_d,wordCounter, mIndexStart_d, mIndexEnd_d); + // PixelCluster_Wrapper(c.xx_adc , c.yy_adc, c.adc_d,wordCounter, c.mIndexStart_d, c.mIndexEnd_d); } diff --git a/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.h b/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.h index c96ef3642e03b..c2f34e136d523 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.h +++ b/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.h @@ -5,86 +5,124 @@ #ifndef RAWTODIGIGPU_H #define RAWTODIGIGPU_H -#include "CablingMapGPU.h" -//typedef unsigned long long Word64; -typedef unsigned int uint; - -const uint layerStartBit_ = 20; -const uint ladderStartBit_ = 12; -const uint moduleStartBit_ = 2; - -const uint panelStartBit_ = 10; -const uint diskStartBit_ = 18; -const uint bladeStartBit_ = 12; - -const uint layerMask_ = 0xF; -const uint ladderMask_ = 0xFF; -const uint moduleMask_ = 0x3FF; -const uint panelMask_ = 0x3; -const uint diskMask_ = 0xF; -const uint bladeMask_ = 0x3F; - -const uint LINK_bits = 6; -const uint ROC_bits = 5; -const uint DCOL_bits = 5; -const uint PXID_bits = 8; -const uint ADC_bits = 8; +#include + +#include "SiPixelFedCablingMapGPU.h" + +const uint32_t layerStartBit_ = 20; +const uint32_t ladderStartBit_ = 12; +const uint32_t moduleStartBit_ = 2; + +const uint32_t panelStartBit_ = 10; +const uint32_t diskStartBit_ = 18; +const uint32_t bladeStartBit_ = 12; + +const uint32_t layerMask_ = 0xF; +const uint32_t ladderMask_ = 0xFF; +const uint32_t moduleMask_ = 0x3FF; +const uint32_t panelMask_ = 0x3; +const uint32_t diskMask_ = 0xF; +const uint32_t bladeMask_ = 0x3F; + +const uint32_t LINK_bits = 6; +const uint32_t ROC_bits = 5; +const uint32_t DCOL_bits = 5; +const uint32_t PXID_bits = 8; +const uint32_t ADC_bits = 8; // special for layer 1 -const uint LINK_bits1 = 6; -const uint ROC_bits1 = 5; -const uint COL_bits1_l1 = 6; -const uint ROW_bits1_l1 = 7; -const uint OMIT_ERR_bits = 1; - -const uint maxROCIndex = 8; -const uint numRowsInRoc = 80; -const uint numColsInRoc = 52; - -// Maximum fed for phase1 is 150 but not all of them are filled -// Update the number FED based on maximum fed found in the cabling map - const uint MAX_FED = 150; - const uint MAX_LINK = 48; //maximum links/channels for phase1 - const uint MAX_ROC = 8; - const uint MAX_WORD = 2000;//500; - const int NSTREAM = 1; - - const uint ADC_shift = 0; - const uint PXID_shift = ADC_shift + ADC_bits; - const uint DCOL_shift = PXID_shift + PXID_bits; - const uint ROC_shift = DCOL_shift + DCOL_bits; - const uint LINK_shift = ROC_shift + ROC_bits1; +const uint32_t LINK_bits1 = 6; +const uint32_t ROC_bits1 = 5; +const uint32_t COL_bits1_l1 = 6; +const uint32_t ROW_bits1_l1 = 7; +const uint32_t OMIT_ERR_bits = 1; + +const uint32_t maxROCIndex = 8; +const uint32_t numRowsInRoc = 80; +const uint32_t numColsInRoc = 52; + +const uint32_t MAX_WORD = 2000; + +const uint32_t ADC_shift = 0; +const uint32_t PXID_shift = ADC_shift + ADC_bits; +const uint32_t DCOL_shift = PXID_shift + PXID_bits; +const uint32_t ROC_shift = DCOL_shift + DCOL_bits; +const uint32_t LINK_shift = ROC_shift + ROC_bits1; // special for layer 1 ROC - const uint ROW_shift = ADC_shift + ADC_bits; - const uint COL_shift = ROW_shift + ROW_bits1_l1; - const uint OMIT_ERR_shift = 20; - - const uint LINK_mask = ~(~uint(0) << LINK_bits1); - const uint ROC_mask = ~(~uint(0) << ROC_bits1); - const uint COL_mask = ~(~uint(0) << COL_bits1_l1); - const uint ROW_mask = ~(~uint(0) << ROW_bits1_l1); - const uint DCOL_mask = ~(~uint(0) << DCOL_bits); - const uint PXID_mask = ~(~uint(0) << PXID_bits); - const uint ADC_mask = ~(~uint(0) << ADC_bits); - const uint ERROR_mask = ~(~uint(0) << ROC_bits1); - const uint OMIT_ERR_mask = ~(~uint(0) << OMIT_ERR_bits); +const uint32_t ROW_shift = ADC_shift + ADC_bits; +const uint32_t COL_shift = ROW_shift + ROW_bits1_l1; +const uint32_t OMIT_ERR_shift = 20; + +const uint32_t LINK_mask = ~(~uint32_t(0) << LINK_bits1); +const uint32_t ROC_mask = ~(~uint32_t(0) << ROC_bits1); +const uint32_t COL_mask = ~(~uint32_t(0) << COL_bits1_l1); +const uint32_t ROW_mask = ~(~uint32_t(0) << ROW_bits1_l1); +const uint32_t DCOL_mask = ~(~uint32_t(0) << DCOL_bits); +const uint32_t PXID_mask = ~(~uint32_t(0) << PXID_bits); +const uint32_t ADC_mask = ~(~uint32_t(0) << ADC_bits); +const uint32_t ERROR_mask = ~(~uint32_t(0) << ROC_bits1); +const uint32_t OMIT_ERR_mask = ~(~uint32_t(0) << OMIT_ERR_bits); struct DetIdGPU { - uint RawId; - uint rocInDet; - uint moduleId; + uint32_t RawId; + uint32_t rocInDet; + uint32_t moduleId; }; struct Pixel { - uint row; - uint col; + uint32_t row; + uint32_t col; +}; + + +// configuration and memory buffers alocated on the GPU +struct context { + cudaStream_t stream; + + uint32_t * word_d; + uint32_t * fedIndex_d; + uint32_t * eventIndex_d; + uint32_t * xx_d; + uint32_t * yy_d; + uint32_t * xx_adc; + uint32_t * yy_adc; + uint32_t * moduleId_d; + uint32_t * adc_d; + uint32_t * layer_d; + uint32_t * rawIdArr_d; + uint32_t * errType_d; + uint32_t * errWord_d; + uint32_t * errFedID_d; + uint32_t * errRawID_d; + + // store the start and end index for each module (total 1856 modules-phase 1) + int *mIndexStart_d; + int *mIndexEnd_d; +}; + + +// wrapper function to call RawToDigi on the GPU from host side +void RawToDigi_wrapper(context &, const SiPixelFedCablingMapGPU* cablingMapDevice, const uint32_t wordCounter, uint32_t *word, const uint32_t fedCounter, uint32_t *fedIndex, + uint32_t *eventIndex, bool convertADCtoElectrons, uint32_t *xx_h, uint32_t *yy_h, uint32_t *adc_h, int *mIndexStart_h, + int *mIndexEnd_h, uint32_t *rawIdArr_h, uint32_t *errType_h, uint32_t *errWord_h, uint32_t *errFedID_h, uint32_t *errRawID_h, + bool useQualityInfo, bool includeErrors, bool debug = false); + +// void initCablingMap(); +context initDeviceMemory(); +void freeMemory(context &); + +// reference cmssw/RecoLocalTracker/SiPixelClusterizer +// all are runtime const, should be specified in python _cfg.py +struct ADCThreshold { + const int thePixelThreshold = 1000; // default Pixel threshold in electrons + const int theSeedThreshold = 1000; //seed thershold in electrons not used in our algo + const float theClusterThreshold = 4000; // Cluster threshold in electron + const int ConversionFactor = 65; // adc to electron conversion factor + + // following are the default value + // it should be i python script + const int theStackADC_ = 255; // the maximum adc count for stack layer + const int theFirstStack_ = 5; // the index of the fits stack layer + const double theElectronPerADCGain_ = 600; //ADC to electron conversion }; - //GPU specific - uint *word_d, *fedIndex_d, *eventIndex_d; // Device copy of input data - uint *xx_d, *yy_d,*xx_adc, *yy_adc, *moduleId_d, *adc_d, *layer_d, *rawIdArr_d; // Device copy - uint *errType_d, *errWord_d, *errFedID_d, *errRawID_d; // Device copy - // store the start and end index for each module (total 1856 modules-phase 1) - cudaStream_t stream[NSTREAM]; - int *mIndexStart_d, *mIndexEnd_d; - // CablingMap *Map; #endif diff --git a/EventFilter/SiPixelRawToDigi/plugins/RawToDigiMem.h b/EventFilter/SiPixelRawToDigi/plugins/RawToDigiMem.h deleted file mode 100644 index 40a99552cb368..0000000000000 --- a/EventFilter/SiPixelRawToDigi/plugins/RawToDigiMem.h +++ /dev/null @@ -1,33 +0,0 @@ -/* Sushil Dubey, Shashi Dugad, TIFR -* -*/ - -#ifndef RAWTODIGI_CPU_GPU_H -#define RAWTODIGI_CPU_GPU_H - -// wrapper function to call RawToDigi on the GPU from host side -void RawToDigi_wrapper (const CablingMap* cablingMapDevice, const uint wordCounter, uint *word, const uint fedCounter, uint *fedIndex, - uint *eventIndex, bool convertADCtoElectrons, uint *xx_h, uint *yy_h, uint *adc_h, int *mIndexStart_h, - int *mIndexEnd_h, uint *rawIdArr_h, uint *errType_h, uint *errWord_h, uint *errFedID_h, uint *errRawID_h, - bool useQualityInfo, bool includeErrors, bool debug = false); - -// void initCablingMap(); -void initDeviceMemory(); -void freeMemory(); - -// reference cmssw/RecoLocalTracker/SiPixelClusterizer -// all are runtime const, should be specified in python _cfg.py -struct ADCThreshold { - const int thePixelThreshold = 1000; // default Pixel threshold in electrons - const int theSeedThreshold = 1000; //seed thershold in electrons not used in our algo - const float theClusterThreshold = 4000; // Cluster threshold in electron - const int ConversionFactor = 65; // adc to electron conversion factor - - // following are the default value - // it should be i python script - const int theStackADC_ = 255; // the maximum adc count for stack layer - const int theFirstStack_ = 5; // the index of the fits stack layer - const double theElectronPerADCGain_ = 600; //ADC to electron conversion - -}; -#endif diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.cc b/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.cc index a9468ea3d60f5..1cc39d1d07616 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.cc +++ b/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.cc @@ -1,70 +1,60 @@ -// Sushil Dubey, Shashi Dugad, TIFR, December 2017 -#include #include -#include +#include +#include #include +#include #include -#include -using namespace std; +#include -#include "SiPixelFedCablingMapGPU.h" #include "FWCore/MessageLogger/interface/MessageLogger.h" +#include "CondFormats/SiPixelObjects/interface/SiPixelFedCablingMap.h" +#include "CondFormats/SiPixelObjects/interface/SiPixelFedCablingTree.h" +#include "CondFormats/SiPixelObjects/interface/SiPixelQuality.h" -SiPixelFedCablingMapGPU::SiPixelFedCablingMapGPU(edm::ESTransientHandle cablingMap) { - fedIds = cablingMap->fedIds(); - cabling_ = cablingMap->cablingTree(); -} +#include "SiPixelFedCablingMapGPU.h" +#include "SiPixelFedCablingMapGPU.h" -void SiPixelFedCablingMapGPU::process(CablingMap* &cablingMapGPU, const SiPixelQuality* badPixelInfo, std::set modules) { - int MAX_SIZE = MAX_FED * MAX_LINK * MAX_ROC; - unsigned int *fedMap = new unsigned int[MAX_SIZE]; - unsigned int *linkMap = new unsigned int[MAX_SIZE]; - unsigned int *rocMap = new unsigned int[MAX_SIZE]; - unsigned int *RawId = new unsigned int[MAX_SIZE]; - unsigned int *rocInDet = new unsigned int[MAX_SIZE]; - unsigned int *moduleId = new unsigned int[MAX_SIZE]; - bool *badRocs = new bool[MAX_SIZE]; - bool *modToUnp = new bool[MAX_SIZE]; +void processCablingMap(SiPixelFedCablingMap const& cablingMap, SiPixelFedCablingMapGPU* cablingMapGPU, SiPixelFedCablingMapGPU* cablingMapDevice, const SiPixelQuality* badPixelInfo, std::set const& modules) { + std::vector const& fedIds = cablingMap.fedIds(); + std::unique_ptr const& cabling = cablingMap.cablingTree(); - std::set rawIdSet; + std::vector fedMap(MAX_SIZE); + std::vector linkMap(MAX_SIZE); + std::vector rocMap(MAX_SIZE); + std::vector RawId(MAX_SIZE); + std::vector rocInDet(MAX_SIZE); + std::vector moduleId(MAX_SIZE); + std::vector badRocs(MAX_SIZE); + std::vector modToUnp(MAX_SIZE); + std::set rawIdSet; unsigned int startFed = *(fedIds.begin()); unsigned int endFed = *(fedIds.end() - 1); sipixelobjects::CablingPathToDetUnit path; - //sipixelobjects::PixelROC* pixelRoc = nullptr; int index = 1; - for(unsigned int fed = startFed; fed <= endFed; fed++) { - for(unsigned int link = 1; link <= MAX_LINK; link++) { - for(unsigned int roc = 1; roc <= MAX_ROC; roc++) { + for (unsigned int fed = startFed; fed <= endFed; fed++) { + for (unsigned int link = 1; link <= MAX_LINK; link++) { + for (unsigned int roc = 1; roc <= MAX_ROC; roc++) { path = {fed, link, roc}; - const sipixelobjects::PixelROC* pixelRoc = cabling_->findItem(path); + const sipixelobjects::PixelROC* pixelRoc = cabling->findItem(path); fedMap[index] = fed; linkMap[index] = link; rocMap[index] = roc; - if(pixelRoc != nullptr) { + if (pixelRoc != nullptr) { RawId[index] = pixelRoc->rawId(); rocInDet[index] = pixelRoc->idInDetUnit(); rawIdSet.insert(RawId[index]); - - if(badPixelInfo != nullptr){ - - cout<< modules.size() <rawId()) == modules.end()); - badRocs[index] = badPixelInfo->IsRocBad(pixelRoc->rawId(), pixelRoc->idInDetUnit()); - - } - else{ - - modToUnp[index] = false; - badRocs[index] = true; - - } - - } - else { // store some dummy number + if (badPixelInfo != nullptr){ + modToUnp[index] = (modules.size() != 0) && (modules.find(pixelRoc->rawId()) == modules.end()); + badRocs[index] = badPixelInfo->IsRocBad(pixelRoc->rawId(), pixelRoc->idInDetUnit()); + } else{ + modToUnp[index] = false; + badRocs[index] = true; + } + } else { // store some dummy number RawId[index] = 9999; rocInDet[index] = 9999; modToUnp[index] = false; @@ -73,55 +63,50 @@ void SiPixelFedCablingMapGPU::process(CablingMap* &cablingMapGPU, const SiPixelQ index++; } } - } // end of fed loop - + } // end of FED loop -//Given FedId, Link and idinLnk; use the following formula -//to get the RawId and idinDU -//index = (FedID-1200) * MAX_LINK* MAX_ROC + (Link-1)* MAX_ROC + idinLnk; -//where, MAX_LINK = 48, MAX_ROC = 8 for Phase1 as mentioned Danek's email -//FedID varies between 1200 to 1338 (In total 108 FED's) -//Link varies between 1 to 48 -//idinLnk varies between 1 to 8 + // Given FedId, Link and idinLnk; use the following formula + // to get the RawId and idinDU + // index = (FedID-1200) * MAX_LINK* MAX_ROC + (Link-1)* MAX_ROC + idinLnk; + // where, MAX_LINK = 48, MAX_ROC = 8 for Phase1 as mentioned Danek's email + // FedID varies between 1200 to 1338 (In total 108 FED's) + // Link varies between 1 to 48 + // idinLnk varies between 1 to 8 std::map detIdMap; - int module = 0; - for(auto it = rawIdSet.begin(); it != rawIdSet.end(); it++) { + int module = 0; + for (auto it = rawIdSet.begin(); it != rawIdSet.end(); it++) { detIdMap.emplace(*it, module); module++; } - for(int i = 1; i < index; i++) { - cablingMapGPU->fed[i] = fedMap[i]; - cablingMapGPU->link[i] = linkMap[i]; - cablingMapGPU->roc[i] = rocMap[i]; - cablingMapGPU->RawId[i] = RawId[i]; - cablingMapGPU->rocInDet[i] = rocInDet[i]; - cablingMapGPU->badRocs[i] = badRocs[i]; - cablingMapGPU->modToUnp[i] = modToUnp[i]; - - if(RawId[i] == 9999) { - cablingMapGPU->moduleId[i] = 9999; - } - else { - if(detIdMap.find(RawId[i]) == detIdMap.end()) {LogDebug("SiPixelFedCablingMapGPU") << " Not found: "<< RawId[i] << endl; break;} + cudaDeviceSynchronize(); + for (int i = 1; i < index; i++) { + if (RawId[i] == 9999) { + moduleId[i] = 9999; + } else { auto it = detIdMap.find(RawId[i]); - cablingMapGPU->moduleId[i] = it->second; + if (it == detIdMap.end()) { + LogDebug("SiPixelFedCablingMapGPU") << " Not found: " << RawId[i] << std::endl; + break; + } + moduleId[i] = it->second; } - LogDebug("SiPixelFedCablingMapGPU") <<"----------------------------------------------------------------------------"<fed[i] << setw(20) << cablingMapGPU->link[i] << setw(20) << cablingMapGPU->roc[i] << std::endl; - LogDebug("SiPixelFedCablingMapGPU") << i << setw(20) << cablingMapGPU->RawId[i] << setw(20) << cablingMapGPU->rocInDet[i] << setw(20) << cablingMapGPU->moduleId[i] << std::endl; - LogDebug("SiPixelFedCablingMapGPU") << i << setw(20) << cablingMapGPU->badRocs[i] << setw(20) << cablingMapGPU->modToUnp[i] << std::endl; - LogDebug("SiPixelFedCablingMapGPU") <<"----------------------------------------------------------------------------"<size = index-1; - - delete[] fedMap; - delete[] linkMap; - delete[] rocMap; - delete[] RawId; - delete[] rocInDet; - delete[] moduleId; - delete[] badRocs; - delete[] modToUnp; + cudaCheck(cudaMemcpy(cablingMapGPU->fed, fedMap.data(), fedMap.size() * sizeof(unsigned int), cudaMemcpyHostToDevice)); + cudaCheck(cudaMemcpy(cablingMapGPU->link, linkMap.data(), linkMap.size() * sizeof(unsigned int), cudaMemcpyHostToDevice)); + cudaCheck(cudaMemcpy(cablingMapGPU->roc, rocMap.data(), rocMap.size() * sizeof(unsigned int), cudaMemcpyHostToDevice)); + cudaCheck(cudaMemcpy(cablingMapGPU->RawId, RawId.data(), RawId.size() * sizeof(unsigned int), cudaMemcpyHostToDevice)); + cudaCheck(cudaMemcpy(cablingMapGPU->rocInDet, rocInDet.data(), rocInDet.size() * sizeof(unsigned int), cudaMemcpyHostToDevice)); + cudaCheck(cudaMemcpy(cablingMapGPU->moduleId, moduleId.data(), moduleId.size() * sizeof(unsigned int), cudaMemcpyHostToDevice)); + cudaCheck(cudaMemcpy(cablingMapGPU->badRocs, badRocs.data(), badRocs.size() * sizeof(unsigned char), cudaMemcpyHostToDevice)); + cudaCheck(cudaMemcpy(cablingMapGPU->modToUnp, modToUnp.data(), modToUnp.size() * sizeof(unsigned char), cudaMemcpyHostToDevice)); + cudaCheck(cudaMemcpy(cablingMapDevice, cablingMapGPU, sizeof(SiPixelFedCablingMapGPU), cudaMemcpyHostToDevice)); + cudaDeviceSynchronize(); } diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.h b/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.h index b0fff9deeaf99..a774799ef9281 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.h +++ b/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.h @@ -1,27 +1,63 @@ -// Sushil Dubey, Shashi Dugad, TIFR, December 2017 -#ifndef SiPixelFedCablingMapGPUU_H -#define SiPixelFedCablingMapGPU_H - -#include "FWCore/Framework/interface/ESTransientHandle.h" -#include "CondFormats/SiPixelObjects/interface/SiPixelFedCablingMap.h" -#include "CondFormats/SiPixelObjects/interface/SiPixelFedCablingTree.h" -#include "CondFormats/SiPixelObjects/interface/SiPixelQuality.h" -#include "CablingMapGPU.h" - - -class SiPixelFedCablingMapGPU { -public: - SiPixelFedCablingMapGPU(edm::ESTransientHandle cablingMap); - ~ SiPixelFedCablingMapGPU() {} - void process(CablingMap* &cablingMapGPU, const SiPixelQuality* badPixelInfo, std::set modules); - -private: - edm::ESTransientHandle cablingMap; - std::vector fedIds; - std::unique_ptr cabling_; - const unsigned int MAX_FED = 150; - const unsigned int MAX_LINK = 48; - const unsigned int MAX_ROC = 8; +#ifndef SiPixelFedCablingMapGPU_h +#define SiPixelFedCablingMapGPU_h + +#include + +#include "cudaCheck.h" + +class SiPixelFedCablingMap; +class SiPixelQuality; + +// Maximum fed for phase1 is 150 but not all of them are filled +// Update the number FED based on maximum fed found in the cabling map +const unsigned int MAX_FED = 150; +const unsigned int MAX_LINK = 48; // maximum links/channels for Phase 1 +const unsigned int MAX_ROC = 8; +const unsigned int MAX_SIZE = MAX_FED * MAX_LINK * MAX_ROC; +const unsigned int MAX_SIZE_BYTE_INT = MAX_SIZE * sizeof(unsigned int); +const unsigned int MAX_SIZE_BYTE_CHAR = MAX_SIZE * sizeof(unsigned char); + +struct SiPixelFedCablingMapGPU { + unsigned int size; + unsigned int * fed; + unsigned int * link; + unsigned int * roc; + unsigned int * RawId; + unsigned int * rocInDet; + unsigned int * moduleId; + unsigned char * modToUnp; + unsigned char * badRocs; }; -#endif +inline +void allocateCablingMap(SiPixelFedCablingMapGPU* & cablingMapHost, SiPixelFedCablingMapGPU* & cablingMapDevice) { + cablingMapHost = new SiPixelFedCablingMapGPU(); + cudaCheck(cudaMalloc((void**) & cablingMapDevice, sizeof(SiPixelFedCablingMapGPU))); + cudaCheck(cudaMalloc((void**) & cablingMapHost->fed, MAX_SIZE_BYTE_INT)); + cudaCheck(cudaMalloc((void**) & cablingMapHost->link, MAX_SIZE_BYTE_INT)); + cudaCheck(cudaMalloc((void**) & cablingMapHost->roc, MAX_SIZE_BYTE_INT)); + cudaCheck(cudaMalloc((void**) & cablingMapHost->RawId, MAX_SIZE_BYTE_INT)); + cudaCheck(cudaMalloc((void**) & cablingMapHost->rocInDet, MAX_SIZE_BYTE_INT)); + cudaCheck(cudaMalloc((void**) & cablingMapHost->moduleId, MAX_SIZE_BYTE_INT)); + cudaCheck(cudaMalloc((void**) & cablingMapHost->badRocs, MAX_SIZE_BYTE_CHAR)); + cudaCheck(cudaMalloc((void**) & cablingMapHost->modToUnp, MAX_SIZE_BYTE_CHAR)); + cudaCheck(cudaMemcpy(cablingMapDevice, cablingMapHost, sizeof(SiPixelFedCablingMapGPU), cudaMemcpyHostToDevice)); +} + +inline +void deallocateCablingMap(SiPixelFedCablingMapGPU* cablingMapHost, SiPixelFedCablingMapGPU* cablingMapDevice) { + cudaCheck(cudaFree(cablingMapHost->fed)); + cudaCheck(cudaFree(cablingMapHost->link)); + cudaCheck(cudaFree(cablingMapHost->roc)); + cudaCheck(cudaFree(cablingMapHost->RawId)); + cudaCheck(cudaFree(cablingMapHost->rocInDet)); + cudaCheck(cudaFree(cablingMapHost->moduleId)); + cudaCheck(cudaFree(cablingMapHost->modToUnp)); + cudaCheck(cudaFree(cablingMapHost->badRocs)); + cudaCheck(cudaFree(cablingMapDevice)); + delete cablingMapHost; +} + +void processCablingMap(SiPixelFedCablingMap const& cablingMap, SiPixelFedCablingMapGPU* cablingMapGPU, SiPixelFedCablingMapGPU* cablingMapDevice, const SiPixelQuality* badPixelInfo, std::set const& modules); + +#endif // SiPixelFedCablingMapGPU_h diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc index b6eb2918fd591..823dba1782c1e 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc +++ b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc @@ -9,61 +9,51 @@ // This code is an entry point for GPU based pixel track reconstruction for HLT // Modified by Sushil and Shashi for this purpose July-2017 -#include "DataFormats/Common/interface/Handle.h" -#include "FWCore/Framework/interface/ESHandle.h" -#include "FWCore/Framework/interface/ESTransientHandle.h" -#include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h" -#include "FWCore/ParameterSet/interface/ParameterSetDescription.h" - -#include "FWCore/MessageLogger/interface/MessageLogger.h" - -#include "DataFormats/SiPixelDigi/interface/PixelDigi.h" +#include +#include +#include +#include -#include "DataFormats/SiPixelRawData/interface/SiPixelRawDataError.h" +#include +#include -#include "DataFormats/Common/interface/DetSetVector.h" -#include "DataFormats/FEDRawData/interface/FEDRawDataCollection.h" -#include "DataFormats/FEDRawData/interface/FEDRawData.h" +#include +#include -#include "DataFormats/FEDRawData/interface/FEDNumbering.h" -#include "DataFormats/DetId/interface/DetIdCollection.h" #include "CondFormats/SiPixelObjects/interface/SiPixelFedCablingMap.h" #include "CondFormats/SiPixelObjects/interface/SiPixelFedCablingTree.h" -#include "EventFilter/SiPixelRawToDigi/interface/PixelDataFormatter.h" - #include "CondFormats/SiPixelObjects/interface/SiPixelQuality.h" - +#include "DataFormats/Common/interface/DetSetVector.h" +#include "DataFormats/Common/interface/Handle.h" +#include "DataFormats/DetId/interface/DetIdCollection.h" +#include "DataFormats/FEDRawData/interface/FEDNumbering.h" +#include "DataFormats/FEDRawData/interface/FEDRawData.h" +#include "DataFormats/FEDRawData/interface/FEDRawDataCollection.h" #include "DataFormats/SiPixelDetId/interface/PixelFEDChannel.h" +#include "DataFormats/SiPixelDigi/interface/PixelDigi.h" +#include "DataFormats/SiPixelRawData/interface/SiPixelRawDataError.h" +#include "EventFilter/SiPixelRawToDigi/interface/PixelDataFormatter.h" #include "EventFilter/SiPixelRawToDigi/interface/PixelUnpackingRegions.h" #include "FWCore/Framework/interface/ConsumesCollector.h" - +#include "FWCore/Framework/interface/ESHandle.h" +#include "FWCore/Framework/interface/ESTransientHandle.h" +#include "FWCore/MessageLogger/interface/MessageLogger.h" +#include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h" +#include "FWCore/ParameterSet/interface/ParameterSetDescription.h" #include "FWCore/PluginManager/interface/ModuleDef.h" #include "FWCore/Framework/interface/MakerMacros.h" -#include "TH1D.h" -#include "TFile.h" +#include "EventInfoGPU.h" +#include "RawToDigiGPU.h" #include "SiPixelFedCablingMapGPU.h" #include "SiPixelRawToDigiGPU.h" -#include -#include -#include -#include - -#include // for GPU -#include // for pinned memory -#include "EventInfoGPU.h" // Event Info -// device memory intialization for RawTodigi -#include "RawToDigiMem.h" -// // device memory initialization for CPE -// #include "CPEGPUMem.h" -// //device memory initialization for clustering -// #include "PixelClusterMem.h" +#include "cudaCheck.h" using namespace std; // ----------------------------------------------------------------------------- -SiPixelRawToDigiGPU::SiPixelRawToDigiGPU( const edm::ParameterSet& conf ) - : config_(conf), +SiPixelRawToDigiGPU::SiPixelRawToDigiGPU( const edm::ParameterSet& conf ) + : config_(conf), badPixelInfo_(nullptr), regions_(nullptr), hCPU(nullptr), hDigi(nullptr) @@ -85,7 +75,7 @@ SiPixelRawToDigiGPU::SiPixelRawToDigiGPU( const edm::ParameterSet& conf ) // Products produces< edm::DetSetVector >(); - if(includeErrors){ + if (includeErrors) { produces< edm::DetSetVector >(); produces(); produces("UserErrorModules"); @@ -94,7 +84,7 @@ SiPixelRawToDigiGPU::SiPixelRawToDigiGPU( const edm::ParameterSet& conf ) // regions if (config_.exists("Regions")) { - if(!config_.getParameter("Regions").getParameterNames().empty()) + if (!config_.getParameter("Regions").getParameterNames().empty()) { regions_ = new PixelUnpackingRegions(config_, consumesCollector()); } @@ -109,73 +99,56 @@ SiPixelRawToDigiGPU::SiPixelRawToDigiGPU( const edm::ParameterSet& conf ) } // Control the usage of pilot-blade data, FED=40 - usePilotBlade = false; + usePilotBlade = false; if (config_.exists("UsePilotBlade")) { usePilotBlade = config_.getParameter ("UsePilotBlade"); - if(usePilotBlade) edm::LogInfo("SiPixelRawToDigiGPU") << " Use pilot blade data (FED 40)"; + if (usePilotBlade) edm::LogInfo("SiPixelRawToDigiGPU") << " Use pilot blade data (FED 40)"; } // Control the usage of phase1 usePhase1 = false; if (config_.exists("UsePhase1")) { usePhase1 = config_.getParameter ("UsePhase1"); - if(usePhase1) edm::LogInfo("SiPixelRawToDigiGPU") << " Using phase1"; + if (usePhase1) edm::LogInfo("SiPixelRawToDigiGPU") << " Using phase1"; } //CablingMap could have a label //Tav cablingMapLabel = config_.getParameter ("CablingMapLabel"); - + //GPU specific convertADCtoElectrons = config_.getParameter("ConvertADCtoElectrons"); - const unsigned int MAX_FED = 150; - const unsigned int MAX_LINK = 48; - const unsigned int MAX_ROC = 8; - const int MAX_WORD = 2000; - const int MAX_SIZE_BYTE = MAX_FED * MAX_LINK * MAX_ROC*sizeof(unsigned int); - const int MAX_SIZE_BYTE_BOOL = MAX_FED * MAX_LINK * MAX_ROC*sizeof(bool); // device copy of GPU friendly cablng map - - cudaMallocManaged((void**)&cablingMapGPU, sizeof(CablingMap)); - cudaMallocManaged((void**)&cablingMapGPU->fed, MAX_SIZE_BYTE); - cudaMallocManaged((void**)&cablingMapGPU->link, MAX_SIZE_BYTE); - cudaMallocManaged((void**)&cablingMapGPU->roc, MAX_SIZE_BYTE); - cudaMallocManaged((void**)&cablingMapGPU->RawId, MAX_SIZE_BYTE); - cudaMallocManaged((void**)&cablingMapGPU->rocInDet, MAX_SIZE_BYTE); - cudaMallocManaged((void**)&cablingMapGPU->moduleId, MAX_SIZE_BYTE); - cudaMallocManaged((void**)&cablingMapGPU->badRocs, MAX_SIZE_BYTE_BOOL); - cudaMallocManaged((void**)&cablingMapGPU->modToUnp, MAX_SIZE_BYTE_BOOL); - - int WSIZE = MAX_FED*MAX_WORD*NEVENT*sizeof(unsigned int); - int FSIZE = 2*MAX_FED*NEVENT*sizeof(unsigned int)+sizeof(unsigned int); + allocateCablingMap(cablingMapGPUHost_, cablingMapGPUDevice_); + + int WSIZE = MAX_FED*MAX_WORD*NEVENT*sizeof(unsigned int); + int FSIZE = 2*MAX_FED*NEVENT*sizeof(unsigned int)+sizeof(unsigned int); word = (unsigned int*)malloc(WSIZE); - //cudaMallocHost((void**)&word, WSIZE); fedIndex =(unsigned int*)malloc(FSIZE); - //cudaMallocHost((void**)&fedIndex, FSIZE); eventIndex = (unsigned int*)malloc((NEVENT+1)*sizeof(unsigned int)); - eventIndex[0] =0; + eventIndex[0] = 0; // to store the output of RawToDigi - xx_h = new uint[WSIZE]; - yy_h = new uint[WSIZE]; - adc_h = new uint[WSIZE]; - rawIdArr_h = new uint[WSIZE]; - errType_h = new uint[WSIZE]; - errRawID_h = new uint[WSIZE]; - errWord_h = new uint[WSIZE]; - errFedID_h = new uint[WSIZE]; + xx_h = new uint32_t[WSIZE]; + yy_h = new uint32_t[WSIZE]; + adc_h = new uint32_t[WSIZE]; + rawIdArr_h = new uint32_t[WSIZE]; + errType_h = new uint32_t[WSIZE]; + errRawID_h = new uint32_t[WSIZE]; + errWord_h = new uint32_t[WSIZE]; + errFedID_h = new uint32_t[WSIZE]; mIndexStart_h = new int[NEVENT*NMODULE +1]; mIndexEnd_h = new int[NEVENT*NMODULE +1]; // allocate memory for RawToDigi on GPU - initDeviceMemory(); + context_ = initDeviceMemory(); // // allocate auxilary memory for clustering // initDeviceMemCluster(); // // allocate memory for CPE on GPU // initDeviceMemCPE(); - + } @@ -191,9 +164,7 @@ SiPixelRawToDigiGPU::~SiPixelRawToDigiGPU() { hDigi->Write(); } free(word); - // cudaFreeHost(word); free(fedIndex); - // cudaFreeHost(fedIndex); free(eventIndex); delete[] xx_h; @@ -208,17 +179,9 @@ SiPixelRawToDigiGPU::~SiPixelRawToDigiGPU() { delete[] mIndexEnd_h; // release device memory for cabling map - cudaFree(cablingMapGPU->fed); - cudaFree(cablingMapGPU->link); - cudaFree(cablingMapGPU->roc); - cudaFree(cablingMapGPU->RawId); - cudaFree(cablingMapGPU->rocInDet); - cudaFree(cablingMapGPU->moduleId); - cudaFree(cablingMapGPU->modToUnp); - cudaFree(cablingMapGPU->badRocs); - cudaFree(cablingMapGPU); + deallocateCablingMap(cablingMapGPUHost_, cablingMapGPUDevice_); // free device memory used for RawToDigi on GPU - freeMemory(); + freeMemory(context_); // free auxilary memory used for clustering // freeDeviceMemCluster(); // free device memory used for CPE on GPU @@ -261,18 +224,16 @@ SiPixelRawToDigiGPU::fillDescriptions(edm::ConfigurationDescriptions& descriptio } // ----------------------------------------------------------------------------- - - -// ----------------------------------------------------------------------------- -void SiPixelRawToDigiGPU::produce( edm::Event& ev, - const edm::EventSetup& es) +void +SiPixelRawToDigiGPU::produce( edm::Event& ev, const edm::EventSetup& es) { - + int theWordCounter = 0; int theDigiCounter = 0; const uint32_t dummydetid = 0xffffffff; - debug = edm::MessageDrop::instance()->debugEnabled; - + //debug = edm::MessageDrop::instance()->debugEnabled; + debug = false; + // initialize quality record or update if necessary if (qualityWatcher.check( es ) && useQuality) { // quality info for dead pixel modules or ROCs @@ -280,15 +241,15 @@ void SiPixelRawToDigiGPU::produce( edm::Event& ev, es.get().get( qualityInfo ); badPixelInfo_ = qualityInfo.product(); if (!badPixelInfo_) { - edm::LogError("SiPixelQualityNotPresent")<<" Configured to use SiPixelQuality, but SiPixelQuality not present"< modules; if (regions_) { regions_->run(ev, es); - LogDebug("SiPixelRawToDigiGPU") << "region2unpack #feds: "<nFEDs(); - LogDebug("SiPixelRawToDigiGPU") << "region2unpack #modules (BPIX,EPIX,total): "<nBarrelModules()<<" "<nForwardModules()<<" "<nModules(); + LogDebug("SiPixelRawToDigiGPU") << "region2unpack #feds: " << regions_->nFEDs(); + LogDebug("SiPixelRawToDigiGPU") << "region2unpack #modules (BPIX,EPIX,total): " << regions_->nBarrelModules() << " " << regions_->nForwardModules() << " " << regions_->nModules(); modules = *(regions_->modulesToUnpack()); } @@ -299,10 +260,9 @@ void SiPixelRawToDigiGPU::produce( edm::Event& ev, es.get().get( cablingMapLabel, cablingMap ); //Tav fedIds = cablingMap->fedIds(); cabling_ = cablingMap->cablingTree(); - LogDebug("map version:")<< cabling_->version(); - // A new and simplified GPU friendly cabling map - SiPixelFedCablingMapGPU cablingMapRcd(cablingMap); - cablingMapRcd.process(cablingMapGPU, badPixelInfo_, modules); + LogDebug("map version:") << cabling_->version(); + // convert the cabling map to a GPU-friendly version + processCablingMap(*cablingMap, cablingMapGPUHost_, cablingMapGPUDevice_, badPixelInfo_, modules); } edm::Handle buffers; @@ -315,33 +275,35 @@ void SiPixelRawToDigiGPU::produce( edm::Event& ev, auto tkerror_detidcollection = std::make_unique(); auto usererror_detidcollection = std::make_unique(); auto disabled_channelcollection = std::make_unique >(); - + //PixelDataFormatter formatter(cabling_.get()); // phase 0 only PixelDataFormatter formatter(cabling_.get(), usePhase1); // for phase 1 & 0 - + PixelDataFormatter::DetErrors nodeterrors; PixelDataFormatter::Errors errors; if (theTimer) theTimer->start(); - + // GPU specific: Data extraction for RawToDigi GPU - static unsigned int wordCounterGPU = 0; + unsigned int wordCounterGPU = 0; unsigned int fedCounter = 0; const unsigned int MAX_FED = 150; - static int eventCount = 0; + int eventCount = 0; bool errorsInEvent = false; - + edm::DetSet * detDigis=nullptr; ErrorChecker errorcheck; for (auto aFed = fedIds.begin(); aFed != fedIds.end(); ++aFed) { - + int fedId = *aFed; - - if(!usePilotBlade && (fedId==40) ) continue; // skip pilot blade data + + if (!usePilotBlade && (fedId==40) ) continue; // skip pilot blade data if (regions_ && !regions_->mayUnpackFED(fedId)) continue; - if(debug) LogDebug("SiPixelRawToDigiGPU")<< " PRODUCE DIGI FOR FED: " << fedId << endl; - + #if 0 + if (debug) LogDebug("SiPixelRawToDigiGPU") << " PRODUCE DIGI FOR FED: " << fedId << endl; + #endif + // for GPU // first 150 index stores the fedId and next 150 will store the // start index of word in that fed @@ -351,27 +313,27 @@ void SiPixelRawToDigiGPU::produce( edm::Event& ev, //get event data for this fed const FEDRawData& rawData = buffers->FEDData( fedId ); - + //GPU specific - int nWords = rawData.size()/sizeof(Word64); - if(nWords == 0) { + int nWords = rawData.size()/sizeof(cms_uint64_t); + if (nWords == 0) { word[wordCounterGPU++] = 0; continue; } - + // check CRC bit - const Word64* trailer = reinterpret_cast(rawData.data())+(nWords-1); - if(!errorcheck.checkCRC(errorsInEvent, fedId, trailer, errors)) { + const cms_uint64_t* trailer = reinterpret_cast(rawData.data())+(nWords-1); + if (!errorcheck.checkCRC(errorsInEvent, fedId, trailer, errors)) { word[wordCounterGPU++] = 0; continue; } // check headers - const Word64* header = reinterpret_cast(rawData.data()); header--; + const cms_uint64_t* header = reinterpret_cast(rawData.data()); header--; bool moreHeaders = true; while (moreHeaders) { header++; - //LogTrace("")<<"HEADER: " << print(*header); + //LogTrace("") << "HEADER: " << print(*header); bool headerStatus = errorcheck.checkHeader(errorsInEvent, fedId, header, errors); moreHeaders = headerStatus; } @@ -381,103 +343,100 @@ void SiPixelRawToDigiGPU::produce( edm::Event& ev, trailer++; while (moreTrailers) { trailer--; - //LogTrace("")<<"TRAILER: " << print(*trailer); + //LogTrace("") << "TRAILER: " << print(*trailer); bool trailerStatus = errorcheck.checkTrailer(errorsInEvent, fedId, nWords, trailer, errors); moreTrailers = trailerStatus; } - + theWordCounter += 2*(nWords-2); - const Word32 * bw =(const Word32 *)(header+1); - const Word32 * ew =(const Word32 *)(trailer); + const cms_uint32_t * bw = (const cms_uint32_t *)(header+1); + const cms_uint32_t * ew = (const cms_uint32_t *)(trailer); if ( *(ew-1) == 0 ) { ew--; theWordCounter--;} for (auto ww = bw; ww < ew; ++ww) { if unlikely(ww==0) theWordCounter--; word[wordCounterGPU++] = *ww; } } // end of for loop - + // GPU specific: RawToDigi -> clustering -> CPE eventCount++; eventIndex[eventCount] = wordCounterGPU; - static int ec = 1; - cout<<"Data read for event: "<::const_iterator it; for (it = collection->begin(); it != collection->end(); ++it) { - for(PixelDigi const& digi : *it) { - - std::cout<<"RawID: "<detId())<<", row: "<detId()) << ", row: " << digi.row() << ", col: " << digi.column() << ", adc: " << digi.adc() << std::endl; } } } - + #endif + if (theTimer) { theTimer->stop(); LogDebug("SiPixelRawToDigiGPU") << "TIMING IS: (real)" << theTimer->realTime() ; ndigis += theDigiCounter; nwords += theWordCounter; LogDebug("SiPixelRawToDigiGPU") << " (Words/Digis) this ev: " - <Fill( theTimer->realTime() ); + << theWordCounter << "/" << theDigiCounter << "--- all :" << nwords << "/" << ndigis; + hCPU->Fill(theTimer->realTime()); hDigi->Fill(theDigiCounter); } - + //pack errors into collection - if(includeErrors) { - + if (includeErrors) { + typedef PixelDataFormatter::Errors::iterator IE; for (IE is = errors.begin(); is != errors.end(); is++) { - + uint32_t errordetid = is->first; if (errordetid == dummydetid) {// errors given dummy detId must be sorted by Fed nodeterrors.insert( nodeterrors.end(), errors[errordetid].begin(), errors[errordetid].end() ); @@ -516,18 +475,18 @@ void SiPixelRawToDigiGPU::produce( edm::Event& ev, } else { // fill list of detIds to be turned off by tracking - if(!tkerrorlist.empty()) { + if (!tkerrorlist.empty()) { std::vector::iterator it_find = find(tkerrorlist.begin(), tkerrorlist.end(), aPixelError.getType()); - if(it_find != tkerrorlist.end()){ + if (it_find != tkerrorlist.end()) { tkerror_detidcollection->push_back(errordetid); } } } // fill list of detIds with errors to be studied - if(!usererrorlist.empty()) { + if (!usererrorlist.empty()) { std::vector::iterator it_find = find(usererrorlist.begin(), usererrorlist.end(), aPixelError.getType()); - if(it_find != usererrorlist.end()){ + if (it_find != usererrorlist.end()) { usererror_detidcollection->push_back(errordetid); } } @@ -541,21 +500,21 @@ void SiPixelRawToDigiGPU::produce( edm::Event& ev, } // if error assigned to a real DetId } // loop on errors in event for this FED } // if errors to be included in the event - - if(includeErrors) { + + if (includeErrors) { edm::DetSet& errorDetSet = errorcollection->find_or_insert(dummydetid); errorDetSet.data = nodeterrors; } - + //send digis and errors back to framework ev.put(std::move(collection)); - if(includeErrors){ + if (includeErrors) { ev.put(std::move(errorcollection)); ev.put(std::move(tkerror_detidcollection)); ev.put(std::move(usererror_detidcollection), "UserErrorModules"); ev.put(std::move(disabled_channelcollection)); } - + } //end of produce function //define as runnable module diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.h b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.h index 2d166b85d5f6b..a0092e04f8bf0 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.h +++ b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.h @@ -16,6 +16,7 @@ #include "DataFormats/FEDRawData/interface/FEDRawDataCollection.h" #include "FWCore/Framework/interface/ConsumesCollector.h" #include "FWCore/Utilities/interface/CPUTimer.h" +#include "RawToDigiGPU.h" class SiPixelFedCablingTree; class SiPixelFedCabling; @@ -35,11 +36,9 @@ class SiPixelRawToDigiGPU : public edm::stream::EDProducer<> { static void fillDescriptions(edm::ConfigurationDescriptions& descriptions); /// get data, convert to digis attach againe to Event - void produce( edm::Event&, const edm::EventSetup& ) override; private: - edm::ParameterSet config_; std::unique_ptr cabling_; const SiPixelQuality* badPixelInfo_; @@ -62,8 +61,6 @@ class SiPixelRawToDigiGPU : public edm::stream::EDProducer<> { bool usePilotBlade; bool usePhase1; std::string cablingMapLabel; - typedef cms_uint32_t Word32; - typedef cms_uint64_t Word64; bool convertADCtoElectrons; unsigned int *word; // to hold input for rawtodigi @@ -71,12 +68,15 @@ class SiPixelRawToDigiGPU : public edm::stream::EDProducer<> { unsigned int *eventIndex; // to store staring index of each event in word[] array // to store the output - // uint *word_h, *fedIndex_h, *eventIndex_h; // host copy of input data - uint *xx_h, *yy_h, *adc_h, *rawIdArr_h; // host copy of output - uint *errType_h, *errWord_h, *errFedID_h, *errRawID_h; // host copy of output + uint *xx_h, *yy_h, *adc_h, *rawIdArr_h; // host copy of output + uint *errType_h, *errWord_h, *errFedID_h, *errRawID_h; // host copy of output // store the start and end index for each module (total 1856 modules-phase 1) int *mIndexStart_h, *mIndexEnd_h; - CablingMap *cablingMapGPU; - + + // configuration and memory buffers alocated on the GPU + context context_; + SiPixelFedCablingMapGPU * cablingMapGPUHost_; + SiPixelFedCablingMapGPU * cablingMapGPUDevice_; }; + #endif diff --git a/EventFilter/SiPixelRawToDigi/plugins/cudaCheck.h b/EventFilter/SiPixelRawToDigi/plugins/cudaCheck.h new file mode 100644 index 0000000000000..374ff5063b26f --- /dev/null +++ b/EventFilter/SiPixelRawToDigi/plugins/cudaCheck.h @@ -0,0 +1,38 @@ +#ifndef EventFilter_SiPixelRawToDigi_cudaCheck_h +#define EventFilter_SiPixelRawToDigi_cudaCheck_h + +#include + +inline +bool cudaCheck_(const char* file, int line, const char* cmd, CUresult result) +{ + //std::cerr << file << ", line " << line << ": " << cmd << std::endl; + if (result == CUDA_SUCCESS) + return true; + + const char* error; + const char* message; + cuGetErrorName(result, &error); + cuGetErrorString(result, &message); + std::cerr << file << ", line " << line << ": " << error << ": " << message << std::endl; + abort(); + return false; +} + +inline +bool cudaCheck_(const char* file, int line, const char* cmd, cudaError_t result) +{ + //std::cerr << file << ", line " << line << ": " << cmd << std::endl; + if (result == cudaSuccess) + return true; + + const char* error = cudaGetErrorName(result); + const char* message = cudaGetErrorString(result); + std::cerr << file << ", line " << line << ": " << error << ": " << message << std::endl; + abort(); + return false; +} + +#define cudaCheck(ARG) (cudaCheck_(__FILE__, __LINE__, #ARG, (ARG))) + +#endif // EventFilter_SiPixelRawToDigi_cudaCheck_h From 3a854244566bb77fbbe97b771e3e0680f9b20a5b Mon Sep 17 00:00:00 2001 From: Felice Date: Wed, 24 Jan 2018 19:52:20 +0100 Subject: [PATCH 08/88] Set CUDA optimization flags --- EventFilter/SiPixelRawToDigi/plugins/BuildFile.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/EventFilter/SiPixelRawToDigi/plugins/BuildFile.xml b/EventFilter/SiPixelRawToDigi/plugins/BuildFile.xml index 46e82326f10af..dbdef7d428365 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/BuildFile.xml +++ b/EventFilter/SiPixelRawToDigi/plugins/BuildFile.xml @@ -5,4 +5,5 @@ + From 2317b9da2cedf5ffa4184299f85e200d2a666086 Mon Sep 17 00:00:00 2001 From: Felice Date: Wed, 24 Jan 2018 19:53:00 +0100 Subject: [PATCH 09/88] Some optimizations around the CUDA kernel --- .../SiPixelRawToDigi/plugins/RawToDigiGPU.cu | 162 ++++++++---------- .../SiPixelRawToDigi/plugins/RawToDigiGPU.h | 2 +- .../plugins/SiPixelRawToDigiGPU.cc | 137 ++++++--------- .../plugins/SiPixelRawToDigiGPU.h | 15 +- 4 files changed, 137 insertions(+), 179 deletions(-) diff --git a/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.cu b/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.cu index b4bee205d22b2..fdff39d255bc4 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.cu +++ b/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.cu @@ -37,11 +37,10 @@ context initDeviceMemory() { context c; // Number of words for all the feds - uint32_t MAX_WORD_SIZE = MAX_FED * MAX_WORD * NEVENT * sizeof(uint32_t); - uint32_t FSIZE = 2*MAX_FED*NEVENT*sizeof(uint32_t)+sizeof(uint32_t); - uint32_t MSIZE = NMODULE*NEVENT*sizeof(int)+sizeof(int); + constexpr uint32_t MAX_WORD_SIZE = MAX_FED * MAX_WORD * sizeof(uint32_t); + constexpr uint32_t FSIZE = 2*MAX_FED*sizeof(uint32_t)+sizeof(uint32_t); + constexpr uint32_t MSIZE = NMODULE*sizeof(int)+sizeof(int); - cudaCheck(cudaMalloc((void**) & c.eventIndex_d, (NEVENT+1)*sizeof(uint32_t))); cudaCheck(cudaMalloc((void**) & c.word_d, MAX_WORD_SIZE)); cudaCheck(cudaMalloc((void**) & c.fedIndex_d, FSIZE)); cudaCheck(cudaMalloc((void**) & c.xx_d, MAX_WORD_SIZE)); // to store the x and y coordinate @@ -68,7 +67,6 @@ context initDeviceMemory() { void freeMemory(context & c) { // free the GPU memory - cudaCheck(cudaFree(c.eventIndex_d)); cudaCheck(cudaFree(c.word_d)); cudaCheck(cudaFree(c.fedIndex_d)); cudaCheck(cudaFree(c.adc_d)); @@ -107,10 +105,8 @@ __device__ bool isBarrel(uint32_t rawId) { } -//__device__ uint32_t FED_START = 1200; - -__device__ DetIdGPU getRawId(const SiPixelFedCablingMapGPU *Map, uint32_t fed, uint32_t link, uint32_t roc) { +__device__ DetIdGPU getRawId(const SiPixelFedCablingMapGPU * Map, uint32_t fed, uint32_t link, uint32_t roc) { uint32_t index = fed * MAX_LINK * MAX_ROC + (link-1) * MAX_ROC + roc; DetIdGPU detId = { Map->RawId[index], Map->rocInDet[index], Map->moduleId[index] }; return detId; @@ -390,60 +386,61 @@ __device__ uint32_t getErrRawID(uint32_t fedId, uint32_t errWord, uint32_t error *----------- * Output: xx_adc[], yy_adc[] with pixel threshold applied */ -// kernel to apply adc threshold on the channels -__global__ void applyADCthreshold_kernel -(const uint32_t *xx_d, const uint32_t *yy_d, const uint32_t *layer_d, uint32_t *adc, const uint32_t wordCounter, - const ADCThreshold adcThreshold, uint32_t *xx_adc, uint32_t *yy_adc ) { - int tid = threadIdx.x; - int gIndex = blockDim.x*blockIdx.x+tid; - if (gIndex=adcThreshold.theFirstStack_) { - if (adcThreshold.theStackADC_==1 && adcOld==1) { - adcNew = int(255*135); // Arbitrarily use overflow value. - } - if (adcThreshold.theStackADC_ >1 && adcThreshold.theStackADC_!=255 && adcOld>=1){ - adcNew = int((adcOld-1) * gain * 255/float(adcThreshold.theStackADC_-1)); - } - } - - if (adcNew >adcThreshold.thePixelThreshold ) { - xx_adc[gIndex]=xx_d[gIndex]; - yy_adc[gIndex]=yy_d[gIndex]; - } - else { - xx_adc[gIndex]=0; // 0: dead pixel - yy_adc[gIndex]=0; - } - adc[gIndex] = adcNew; - } -} +// kernel to apply adc threshold on the channels + + +// Felice: gains and pedestals are not the same for each pixel. This code should be rewritten to take +// in account local gains/pedestals +// __global__ void applyADCthreshold_kernel(const uint32_t *xx_d, const uint32_t *yy_d, const uint32_t *layer_d, uint32_t *adc, const uint32_t wordCounter, +// const ADCThreshold adcThreshold, uint32_t *xx_adc, uint32_t *yy_adc ) { +// int tid = threadIdx.x; +// int gIndex = blockDim.x*blockIdx.x+tid; +// if (gIndex=adcThreshold.theFirstStack_) { +// if (adcThreshold.theStackADC_==1 && adcOld==1) { +// adcNew = int(255*135); // Arbitrarily use overflow value. +// } +// if (adcThreshold.theStackADC_ >1 && adcThreshold.theStackADC_!=255 && adcOld>=1){ +// adcNew = int((adcOld-1) * gain * 255/float(adcThreshold.theStackADC_-1)); +// } +// } +// +// if (adcNew >adcThreshold.thePixelThreshold ) { +// xx_adc[gIndex]=xx_d[gIndex]; +// yy_adc[gIndex]=yy_d[gIndex]; +// } +// else { +// xx_adc[gIndex]=0; // 0: dead pixel +// yy_adc[gIndex]=0; +// } +// adc[gIndex] = adcNew; +// } +// } // Kernel to perform Raw to Digi conversion -__global__ void RawToDigi_kernel(const SiPixelFedCablingMapGPU *Map, const uint32_t *Word, const uint32_t *fedIndex, - uint32_t *eventIndex, uint32_t *XX, uint32_t *YY, uint32_t *moduleId, int *mIndexStart, +__global__ void RawToDigi_kernel(const SiPixelFedCablingMapGPU *Map, const uint32_t wordCounter, const uint32_t *Word, const uint32_t *fedIndex, + uint32_t *XX, uint32_t *YY, uint32_t *moduleId, int *mIndexStart, int *mIndexEnd, uint32_t *ADC, uint32_t *layerArr, uint32_t *rawIdArr, uint32_t *errType, uint32_t *errWord, uint32_t *errFedID, uint32_t *errRawID, bool useQualityInfo, bool includeErrors, bool debug) { uint32_t blockId = blockIdx.x; - uint32_t eventno = blockIdx.y; //const uint32_t eventOffset = eventIndex[eventno]; - uint32_t fedOffset = 2*MAX_FED*eventno; - uint32_t fedId = fedIndex[fedOffset + blockId]; + uint32_t fedId = fedIndex[blockId]; uint32_t threadId = threadIdx.x; - uint32_t begin = fedIndex[fedOffset + MAX_FED + blockId]; - uint32_t end = fedIndex[fedOffset + MAX_FED + blockId + 1]; + uint32_t begin = fedIndex[MAX_FED + blockId]; + uint32_t end = fedIndex[MAX_FED + blockId + 1]; if (blockIdx.x == gridDim.x - 1) { - end = eventIndex[eventno + 1]; // for last fed to get the end index + end = wordCounter; // for last fed to get the end index } uint32_t link = 0; @@ -452,9 +449,8 @@ __global__ void RawToDigi_kernel(const SiPixelFedCablingMapGPU *Map, const uint3 bool skipROC = false; //if (threadId==0) printf("Event: %u blockId: %u start: %u end: %u\n", eventno, blockId, begin, end); int no_itr = (end - begin)/blockDim.x + 1; // to deal with number of hits greater than blockDim.x - #pragma unroll for (int i = 0; i < no_itr; i++) { - uint32_t gIndex = begin + threadId + i*blockDim.x; + auto gIndex = begin + threadId + i*blockDim.x; if (gIndex < end) { uint32_t ww = Word[gIndex]; // Array containing 32 bit raw data if (includeErrors) { @@ -479,10 +475,13 @@ __global__ void RawToDigi_kernel(const SiPixelFedCablingMapGPU *Map, const uint3 if (!((nlink != link) | (nroc != roc))) continue; link = nlink; roc = nroc; + DetIdGPU detId = getRawId(Map, fedId, link, roc); + uint32_t errorType = checkROC(ww, fedId, link, Map, debug); skipROC = (roc < maxROCIndex) ? false : (errorType != 0); - if (includeErrors and skipROC) { + if (includeErrors and skipROC) + { uint32_t rID = getErrRawID(fedId, ww, errorType, Map, debug); //write the function errType[gIndex] = errorType; errWord[gIndex] = ww; @@ -490,15 +489,8 @@ __global__ void RawToDigi_kernel(const SiPixelFedCablingMapGPU *Map, const uint3 errRawID[gIndex] = rID; continue; } - /*rocp = converter.toRoc(link,roc); //Apparently this check is not needed, we don't have this conversion - if unlikely(!rocp) { - errorsInEvent = true; - conversionError(fedId, &converter, 2, ww, errors); - skipROC=true; - continue; - }*/ - DetIdGPU detId = getRawId(Map, fedId, link, roc); + uint32_t rawId = detId.RawId; uint32_t rocIdInDetUnit = detId.rocInDet; @@ -517,9 +509,9 @@ __global__ void RawToDigi_kernel(const SiPixelFedCablingMapGPU *Map, const uint3 uint32_t layer = 0;//, ladder =0; int side = 0, panel = 0, module = 0;//disk = 0,blade = 0 - if (barrel) { + if (barrel) + { layer = (rawId >> layerStartBit_) & layerMask_; - //ladder = (rawId >> ladderStartBit_) & ladderMask_; module = (rawId >> moduleStartBit_) & moduleMask_; side = (module<5)? -1 : 1; } @@ -648,7 +640,7 @@ __global__ void RawToDigi_kernel(const SiPixelFedCablingMapGPU *Map, const uint3 // for start of fed for(int i = 0; i < no_itr; i++) { uint32_t gIndex = begin + threadId + i*blockDim.x; - uint32_t moduleOffset = NMODULE*eventno; + uint32_t moduleOffset = NMODULE; //if (threadId==0) printf("moduleOffset: %u\n",moduleOffset ); if (gIndex < end) { if (gIndex == begin) { @@ -676,41 +668,30 @@ __global__ void RawToDigi_kernel(const SiPixelFedCablingMapGPU *Map, const uint3 void RawToDigi_wrapper( context & c, const SiPixelFedCablingMapGPU* cablingMapDevice, const uint32_t wordCounter, uint32_t *word, const uint32_t fedCounter, uint32_t *fedIndex, - uint32_t *eventIndex, bool convertADCtoElectrons, uint32_t *xx_h, uint32_t *yy_h, uint32_t *adc_h, int *mIndexStart_h, + bool convertADCtoElectrons, uint32_t *xx_h, uint32_t *yy_h, uint32_t *adc_h, int *mIndexStart_h, int *mIndexEnd_h, uint32_t *rawIdArr_h, uint32_t *errType_h, uint32_t *errWord_h, uint32_t *errFedID_h, uint32_t *errRawID_h, bool useQualityInfo, bool includeErrors, bool debug) { - const int threads = 512; - const int blockX = 108; // only 108 feds are present - const int blockY = NEVENT; //blockIdx.y is the no of events processed in kernel concurrently - dim3 gridsize(blockX, blockY); + const int threadsPerBlock = 512; + const int blocks = 108; // only 108 feds are present - int MSIZE = NMODULE*NEVENT*sizeof(int)+sizeof(int); + int MSIZE = NMODULE*sizeof(int)+sizeof(int); // initialize moduleStart & moduleEnd with some constant(-1) // just to check if it updated in kernel or not cudaCheck(cudaMemsetAsync(c.mIndexStart_d, -1, MSIZE, c.stream)); cudaCheck(cudaMemsetAsync(c.mIndexEnd_d, -1, MSIZE, c.stream)); - cudaCheck(cudaMemcpyAsync(c.eventIndex_d, eventIndex, (NEVENT+1)*sizeof(uint32_t), cudaMemcpyHostToDevice, c.stream)); - int FSIZE = (blockY*2*MAX_FED +1)*sizeof(uint32_t); // 0 to 150:fedId, 150:300: fedIndex - - int fedOffset = 0; - int wordOffset = 0; - int wordSize = 0; - - fedOffset = 0; - wordOffset = eventIndex[0]; - // total no of words in blockY event to be trasfered on device - wordSize = (eventIndex[blockY] - eventIndex[0]); - cudaCheck(cudaMemcpyAsync(&c.word_d[wordOffset], &word[wordOffset], wordSize*sizeof(uint32_t), cudaMemcpyHostToDevice, c.stream)); - cudaCheck(cudaMemcpyAsync(&c.fedIndex_d[fedOffset], &fedIndex[fedOffset], FSIZE, cudaMemcpyHostToDevice, c.stream)); + int FSIZE = (2*MAX_FED +1)*sizeof(uint32_t); // 0 to 150:fedId, 150:300: fedIndex + // wordCounter is the total no of words in each event to be trasfered on device + cudaCheck(cudaMemcpyAsync(&c.word_d[0], &word[0], wordCounter*sizeof(uint32_t), cudaMemcpyHostToDevice, c.stream)); + cudaCheck(cudaMemcpyAsync(&c.fedIndex_d[0], &fedIndex[0], FSIZE, cudaMemcpyHostToDevice, c.stream)); // Launch rawToDigi kernel - RawToDigi_kernel<<>>( + RawToDigi_kernel<<>>( cablingMapDevice, + wordCounter, c.word_d, c.fedIndex_d, - c.eventIndex_d, c.xx_d, c.yy_d, c.moduleId_d, @@ -730,17 +711,18 @@ void RawToDigi_wrapper( // copy data to host variable // if you want to copy data after applying ADC threshold if (convertADCtoElectrons) { - cudaCheck(cudaMemcpyAsync(xx_h, c.xx_adc, wordCounter * sizeof(uint32_t), cudaMemcpyDeviceToHost, c.stream)); - cudaCheck(cudaMemcpyAsync(yy_h, c.yy_adc, wordCounter * sizeof(uint32_t), cudaMemcpyDeviceToHost, c.stream)); + cudaCheck(cudaMemcpy(xx_h, c.xx_adc, wordCounter * sizeof(uint32_t), cudaMemcpyDeviceToHost)); + cudaCheck(cudaMemcpy(yy_h, c.yy_adc, wordCounter * sizeof(uint32_t), cudaMemcpyDeviceToHost)); } else { - cudaCheck(cudaMemcpyAsync(xx_h, c.xx_d, wordCounter*sizeof(uint32_t), cudaMemcpyDeviceToHost, c.stream)); - cudaCheck(cudaMemcpyAsync(yy_h, c.yy_d, wordCounter*sizeof(uint32_t), cudaMemcpyDeviceToHost, c.stream)); + cudaCheck(cudaMemcpy(xx_h, c.xx_d, wordCounter*sizeof(uint32_t), cudaMemcpyDeviceToHost)); + cudaCheck(cudaMemcpy(yy_h, c.yy_d, wordCounter*sizeof(uint32_t), cudaMemcpyDeviceToHost)); } + cudaCheck(cudaMemcpyAsync(adc_h, c.adc_d, wordCounter*sizeof(uint32_t), cudaMemcpyDeviceToHost, c.stream)); cudaCheck(cudaMemcpyAsync(rawIdArr_h, c.rawIdArr_d, wordCounter*sizeof(uint32_t), cudaMemcpyDeviceToHost, c.stream)); - cudaCheck(cudaMemcpyAsync(mIndexStart_h, c.mIndexStart_d, NEVENT*NMODULE*sizeof(int), cudaMemcpyDeviceToHost, c.stream)); - cudaCheck(cudaMemcpyAsync(mIndexEnd_h, c.mIndexEnd_d, NEVENT*NMODULE*sizeof(int), cudaMemcpyDeviceToHost, c.stream)); + cudaCheck(cudaMemcpyAsync(mIndexStart_h, c.mIndexStart_d, NMODULE*sizeof(int), cudaMemcpyDeviceToHost, c.stream)); + cudaCheck(cudaMemcpyAsync(mIndexEnd_h, c.mIndexEnd_d, NMODULE*sizeof(int), cudaMemcpyDeviceToHost, c.stream)); if (includeErrors) { cudaCheck(cudaMemcpyAsync(errType_h, c.errType_d, wordCounter*sizeof(uint32_t), cudaMemcpyDeviceToHost, c.stream)); @@ -748,7 +730,7 @@ void RawToDigi_wrapper( cudaCheck(cudaMemcpyAsync(errFedID_h, c.errFedID_d, wordCounter*sizeof(uint32_t), cudaMemcpyDeviceToHost, c.stream)); cudaCheck(cudaMemcpyAsync(errRawID_h, c.errRawID_d, wordCounter*sizeof(uint32_t), cudaMemcpyDeviceToHost, c.stream)); } - + cudaStreamSynchronize(c.stream); // End of Raw2Digi and passing data for cluserisation // PixelCluster_Wrapper(c.xx_adc , c.yy_adc, c.adc_d,wordCounter, c.mIndexStart_d, c.mIndexEnd_d); } diff --git a/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.h b/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.h index c2f34e136d523..6d9b64ef6d0a7 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.h +++ b/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.h @@ -102,7 +102,7 @@ struct context { // wrapper function to call RawToDigi on the GPU from host side void RawToDigi_wrapper(context &, const SiPixelFedCablingMapGPU* cablingMapDevice, const uint32_t wordCounter, uint32_t *word, const uint32_t fedCounter, uint32_t *fedIndex, - uint32_t *eventIndex, bool convertADCtoElectrons, uint32_t *xx_h, uint32_t *yy_h, uint32_t *adc_h, int *mIndexStart_h, + bool convertADCtoElectrons, uint32_t *xx_h, uint32_t *yy_h, uint32_t *adc_h, int *mIndexStart_h, int *mIndexEnd_h, uint32_t *rawIdArr_h, uint32_t *errType_h, uint32_t *errWord_h, uint32_t *errFedID_h, uint32_t *errRawID_h, bool useQualityInfo, bool includeErrors, bool debug = false); diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc index 823dba1782c1e..fd8163e25ced4 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc +++ b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc @@ -111,34 +111,34 @@ SiPixelRawToDigiGPU::SiPixelRawToDigiGPU( const edm::ParameterSet& conf ) usePhase1 = config_.getParameter ("UsePhase1"); if (usePhase1) edm::LogInfo("SiPixelRawToDigiGPU") << " Using phase1"; } - //CablingMap could have a label //Tav + // CablingMap could have a label //Tav cablingMapLabel = config_.getParameter ("CablingMapLabel"); - //GPU specific + // GPU specific convertADCtoElectrons = config_.getParameter("ConvertADCtoElectrons"); // device copy of GPU friendly cablng map allocateCablingMap(cablingMapGPUHost_, cablingMapGPUDevice_); - int WSIZE = MAX_FED*MAX_WORD*NEVENT*sizeof(unsigned int); - int FSIZE = 2*MAX_FED*NEVENT*sizeof(unsigned int)+sizeof(unsigned int); + int WSIZE = MAX_FED*MAX_WORD*sizeof(unsigned int); + int FSIZE = 2*MAX_FED*sizeof(unsigned int)+sizeof(unsigned int); + cudaMallocHost(&word, sizeof(unsigned int)*WSIZE); + cudaMallocHost(&fedIndex, sizeof(unsigned int)*FSIZE); - word = (unsigned int*)malloc(WSIZE); - fedIndex =(unsigned int*)malloc(FSIZE); - eventIndex = (unsigned int*)malloc((NEVENT+1)*sizeof(unsigned int)); - eventIndex[0] = 0; // to store the output of RawToDigi - xx_h = new uint32_t[WSIZE]; - yy_h = new uint32_t[WSIZE]; - adc_h = new uint32_t[WSIZE]; - rawIdArr_h = new uint32_t[WSIZE]; - errType_h = new uint32_t[WSIZE]; - errRawID_h = new uint32_t[WSIZE]; - errWord_h = new uint32_t[WSIZE]; - errFedID_h = new uint32_t[WSIZE]; - - mIndexStart_h = new int[NEVENT*NMODULE +1]; - mIndexEnd_h = new int[NEVENT*NMODULE +1]; + cudaMallocHost(&xx_h, sizeof(uint32_t)*WSIZE); + cudaMallocHost(&yy_h, sizeof(uint32_t)*WSIZE); + cudaMallocHost(&adc_h, sizeof(uint32_t)*WSIZE); + cudaMallocHost(&rawIdArr_h, sizeof(uint32_t)*WSIZE); + cudaMallocHost(&errType_h, sizeof(uint32_t)*WSIZE); + cudaMallocHost(&errRawID_h, sizeof(uint32_t)*WSIZE); + cudaMallocHost(&errWord_h, sizeof(uint32_t)*WSIZE); + cudaMallocHost(&errFedID_h, sizeof(uint32_t)*WSIZE); + + // mIndexStart_h = new int[NMODULE+1]; + // mIndexEnd_h = new int[NMODULE+1]; + cudaMallocHost(&mIndexStart_h, sizeof(int)*(NMODULE+1)); + cudaMallocHost(&mIndexEnd_h, sizeof(int)*(NMODULE+1)); // allocate memory for RawToDigi on GPU context_ = initDeviceMemory(); @@ -148,7 +148,6 @@ SiPixelRawToDigiGPU::SiPixelRawToDigiGPU( const edm::ParameterSet& conf ) // // allocate memory for CPE on GPU // initDeviceMemCPE(); - } @@ -163,25 +162,25 @@ SiPixelRawToDigiGPU::~SiPixelRawToDigiGPU() { hCPU->Write(); hDigi->Write(); } - free(word); - free(fedIndex); - free(eventIndex); - - delete[] xx_h; - delete[] yy_h; - delete[] adc_h; - delete[] rawIdArr_h; - delete[] errType_h; - delete[] errRawID_h; - delete[] errWord_h; - delete[] errFedID_h; - delete[] mIndexStart_h; - delete[] mIndexEnd_h; + cudaFreeHost(word); + cudaFreeHost(fedIndex); + cudaFreeHost( xx_h); + cudaFreeHost( yy_h); + cudaFreeHost( adc_h); + cudaFreeHost( rawIdArr_h); + cudaFreeHost( errType_h); + cudaFreeHost( errRawID_h); + cudaFreeHost( errWord_h); + cudaFreeHost( errFedID_h); + cudaFreeHost( mIndexStart_h); + cudaFreeHost( mIndexEnd_h); // release device memory for cabling map deallocateCablingMap(cablingMapGPUHost_, cablingMapGPUDevice_); + // free device memory used for RawToDigi on GPU freeMemory(context_); + // free auxilary memory used for clustering // freeDeviceMemCluster(); // free device memory used for CPE on GPU @@ -227,7 +226,6 @@ SiPixelRawToDigiGPU::fillDescriptions(edm::ConfigurationDescriptions& descriptio void SiPixelRawToDigiGPU::produce( edm::Event& ev, const edm::EventSetup& es) { - int theWordCounter = 0; int theDigiCounter = 0; const uint32_t dummydetid = 0xffffffff; @@ -288,7 +286,6 @@ SiPixelRawToDigiGPU::produce( edm::Event& ev, const edm::EventSetup& es) unsigned int wordCounterGPU = 0; unsigned int fedCounter = 0; const unsigned int MAX_FED = 150; - int eventCount = 0; bool errorsInEvent = false; edm::DetSet * detDigis=nullptr; @@ -307,8 +304,8 @@ SiPixelRawToDigiGPU::produce( edm::Event& ev, const edm::EventSetup& es) // for GPU // first 150 index stores the fedId and next 150 will store the // start index of word in that fed - fedIndex[2*MAX_FED*eventCount + fedCounter] = fedId - 1200; - fedIndex[MAX_FED + 2*MAX_FED*eventCount + fedCounter] = wordCounterGPU; // MAX_FED = 150 + fedIndex[ fedCounter] = fedId - 1200; + fedIndex[MAX_FED +fedCounter] = wordCounterGPU; // MAX_FED = 150 fedCounter++; //get event data for this fed @@ -360,43 +357,35 @@ SiPixelRawToDigiGPU::produce( edm::Event& ev, const edm::EventSetup& es) } // end of for loop // GPU specific: RawToDigi -> clustering -> CPE - eventCount++; - eventIndex[eventCount] = wordCounterGPU; - if (eventCount == NEVENT) { - RawToDigi_wrapper(context_, cablingMapGPUDevice_, wordCounterGPU, word, fedCounter, fedIndex, eventIndex, convertADCtoElectrons, xx_h, yy_h, adc_h, mIndexStart_h, mIndexEnd_h, rawIdArr_h, errType_h, errWord_h, errFedID_h, errRawID_h, useQuality, includeErrors, debug); - #if 0 - if (debug) { - //write output to text file (for debugging purpose only) - int count = 1; - cout << "Writing output to the file " << endl; - ofstream ofileXY("GPU_RawToDigi_Output_Part1_Event_"+to_string((count-1)*NEVENT+1)+"to"+to_string(count*NEVENT)+".txt"); - ofileXY << " Index xcor ycor adc rawId" << endl; - for (uint32_t i = 0; i < wordCounterGPU; i++) { - ofileXY << setw(10) << i << setw(6) << xx_h[i] << setw(6) << yy_h[i] << setw(8) << adc_h[i] << setw(10) << rawIdArr_h[i] << endl; - } - //store the module index, which stores the index of x, y & adc for each module - ofstream ofileModule("GPU_RawToDigi_Output_Part2_Event_"+to_string((count-1)*NEVENT+1)+"to"+to_string(count*NEVENT)+".txt"); - ofileModule << "Event_No Module_no mIndexStart mIndexEnd " << endl; - for (int ev = (count-1)*NEVENT+1; ev <= count*NEVENT; ev++) { - for (int mod = 0; mod < NMODULE; mod++) { - ofileModule << setw(8) << ev << setw(8) << mod << setw(10) << mIndexStart_h[mod] << setw(10) << mIndexEnd_h[mod]<< endl; - } - } - count++; - ofileXY.close(); - ofileModule.close(); - } - #endif + + + RawToDigi_wrapper(context_, cablingMapGPUDevice_, wordCounterGPU, word, fedCounter, fedIndex, convertADCtoElectrons, xx_h, yy_h, adc_h, mIndexStart_h, mIndexEnd_h, rawIdArr_h, errType_h, errWord_h, errFedID_h, errRawID_h, useQuality, includeErrors, debug); + + for (uint32_t i = 0; i < wordCounterGPU; i++) { if (rawIdArr_h[i] != 9999) {; //to revise detDigis = &(*collection).find_or_insert(rawIdArr_h[i]); if ( (*detDigis).empty() ) (*detDigis).data.reserve(32); // avoid the first relocations + break; + } + } + + + for (uint32_t i = 0; i < wordCounterGPU; i++) { + if (rawIdArr_h[i] == 9999) + continue; + if ( (*detDigis).detId() != rawIdArr_h[i]) + { + detDigis = &(*collection).find_or_insert(rawIdArr_h[i]); + if ( (*detDigis).empty() ) + (*detDigis).data.reserve(32); // avoid the first relocations + } (*detDigis).data.emplace_back(xx_h[i], yy_h[i], adc_h[i]); theDigiCounter++; - } + if (errType_h[i] != 0) { SiPixelRawDataError error(errWord_h[i], errType_h[i], errFedID_h[i]); @@ -404,21 +393,9 @@ SiPixelRawToDigiGPU::produce( edm::Event& ev, const edm::EventSetup& es) } } - wordCounterGPU = 0; - eventCount = 0; - } - fedCounter =0; - #if 0 - if (debug) { - edm::DetSetVector::const_iterator it; - for (it = collection->begin(); it != collection->end(); ++it) { - for (PixelDigi const& digi : *it) { - std::cout << "RawID: " << DetId(it->detId()) << ", row: " << digi.row() << ", col: " << digi.column() << ", adc: " << digi.adc() << std::endl; - } - } - } - #endif + + fedCounter =0; if (theTimer) { theTimer->stop(); diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.h b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.h index a0092e04f8bf0..dc2cb652913d9 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.h +++ b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.h @@ -2,7 +2,7 @@ #define SiPixelRawToDigiGPU_H /** \class SiPixelRawToDigiGPU_H - * Plug-in module that performs Raw data to digi conversion + * Plug-in module that performs Raw data to digi conversion * for pixel subdetector */ @@ -26,7 +26,7 @@ class PixelUnpackingRegions; class SiPixelRawToDigiGPU : public edm::stream::EDProducer<> { public: - + /// ctor explicit SiPixelRawToDigiGPU( const edm::ParameterSet& ); @@ -43,7 +43,7 @@ class SiPixelRawToDigiGPU : public edm::stream::EDProducer<> { std::unique_ptr cabling_; const SiPixelQuality* badPixelInfo_; PixelUnpackingRegions* regions_; - edm::EDGetTokenT tFEDRawDataCollection; + edm::EDGetTokenT tFEDRawDataCollection; TH1D *hCPU, *hDigi; std::unique_ptr theTimer; @@ -61,17 +61,16 @@ class SiPixelRawToDigiGPU : public edm::stream::EDProducer<> { bool usePilotBlade; bool usePhase1; std::string cablingMapLabel; - + bool convertADCtoElectrons; unsigned int *word; // to hold input for rawtodigi unsigned int *fedIndex; // to hold fed index inside word[] array for rawtodigi on GPU - unsigned int *eventIndex; // to store staring index of each event in word[] array // to store the output - uint *xx_h, *yy_h, *adc_h, *rawIdArr_h; // host copy of output - uint *errType_h, *errWord_h, *errFedID_h, *errRawID_h; // host copy of output + uint32_t *xx_h, *yy_h, *adc_h, *rawIdArr_h; // host copy of output + uint32_t *errType_h, *errWord_h, *errFedID_h, *errRawID_h; // host copy of output // store the start and end index for each module (total 1856 modules-phase 1) - int *mIndexStart_h, *mIndexEnd_h; + int *mIndexStart_h, *mIndexEnd_h; // configuration and memory buffers alocated on the GPU context context_; From 6725ae4489da272ba28f7a849e1e6e9a5d6e8e73 Mon Sep 17 00:00:00 2001 From: Andrea Bocci Date: Fri, 2 Feb 2018 20:08:20 +0100 Subject: [PATCH 10/88] Various fixes to GPU implementation o the pixel unpacker - avoid hanging; - reproduce CPU unpacker resultsalso for data. --- .../SiPixelRawToDigi/plugins/BuildFile.xml | 2 +- .../SiPixelRawToDigi/plugins/RawToDigiGPU.cu | 188 +++++++----------- .../SiPixelRawToDigi/plugins/RawToDigiGPU.h | 94 ++++++++- .../plugins/SiPixelRawToDigiGPU.cc | 76 ++++--- .../plugins/SiPixelRawToDigiGPU.h | 4 +- 5 files changed, 197 insertions(+), 167 deletions(-) diff --git a/EventFilter/SiPixelRawToDigi/plugins/BuildFile.xml b/EventFilter/SiPixelRawToDigi/plugins/BuildFile.xml index dbdef7d428365..8a7d5cf5b1942 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/BuildFile.xml +++ b/EventFilter/SiPixelRawToDigi/plugins/BuildFile.xml @@ -5,5 +5,5 @@ - + diff --git a/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.cu b/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.cu index fdff39d255bc4..92bf3d3c410ca 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.cu +++ b/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.cu @@ -37,24 +37,26 @@ context initDeviceMemory() { context c; // Number of words for all the feds - constexpr uint32_t MAX_WORD_SIZE = MAX_FED * MAX_WORD * sizeof(uint32_t); - constexpr uint32_t FSIZE = 2*MAX_FED*sizeof(uint32_t)+sizeof(uint32_t); + constexpr uint32_t MAX_WORD08_SIZE = MAX_FED * MAX_WORD * sizeof(uint8_t); + constexpr uint32_t MAX_WORD32_SIZE = MAX_FED * MAX_WORD * sizeof(uint32_t); + constexpr uint32_t MAX_WORD16_SIZE = MAX_FED * MAX_WORD * sizeof(uint16_t); constexpr uint32_t MSIZE = NMODULE*sizeof(int)+sizeof(int); - cudaCheck(cudaMalloc((void**) & c.word_d, MAX_WORD_SIZE)); - cudaCheck(cudaMalloc((void**) & c.fedIndex_d, FSIZE)); - cudaCheck(cudaMalloc((void**) & c.xx_d, MAX_WORD_SIZE)); // to store the x and y coordinate - cudaCheck(cudaMalloc((void**) & c.yy_d, MAX_WORD_SIZE)); - cudaCheck(cudaMalloc((void**) & c.xx_adc, MAX_WORD_SIZE)); // to store the x and y coordinate - cudaCheck(cudaMalloc((void**) & c.yy_adc, MAX_WORD_SIZE)); - cudaCheck(cudaMalloc((void**) & c.adc_d, MAX_WORD_SIZE)); - cudaCheck(cudaMalloc((void**) & c.layer_d , MAX_WORD_SIZE)); - cudaCheck(cudaMalloc((void**) & c.rawIdArr_d, MAX_WORD_SIZE)); - cudaCheck(cudaMalloc((void**) & c.errType_d, MAX_WORD_SIZE)); - cudaCheck(cudaMalloc((void**) & c.errWord_d, MAX_WORD_SIZE)); - cudaCheck(cudaMalloc((void**) & c.errFedID_d, MAX_WORD_SIZE)); - cudaCheck(cudaMalloc((void**) & c.errRawID_d, MAX_WORD_SIZE)); - cudaCheck(cudaMalloc((void**) & c.moduleId_d, MAX_WORD_SIZE)); + cudaCheck(cudaMalloc((void**) & c.word_d, MAX_WORD32_SIZE)); + cudaCheck(cudaMalloc((void**) & c.fedId_d, MAX_WORD08_SIZE)); + cudaCheck(cudaMalloc((void**) & c.pdigi_d, MAX_WORD32_SIZE)); // to store thepacked digi + cudaCheck(cudaMalloc((void**) & c.xx_d, MAX_WORD16_SIZE)); // to store the x and y coordinate + cudaCheck(cudaMalloc((void**) & c.yy_d, MAX_WORD16_SIZE)); + cudaCheck(cudaMalloc((void**) & c.xx_adc, MAX_WORD16_SIZE)); // to store the x and y coordinate + cudaCheck(cudaMalloc((void**) & c.yy_adc, MAX_WORD16_SIZE)); + cudaCheck(cudaMalloc((void**) & c.adc_d, MAX_WORD16_SIZE)); + cudaCheck(cudaMalloc((void**) & c.layer_d , MAX_WORD16_SIZE)); + cudaCheck(cudaMalloc((void**) & c.rawIdArr_d, MAX_WORD32_SIZE)); + cudaCheck(cudaMalloc((void**) & c.errType_d, MAX_WORD32_SIZE)); + cudaCheck(cudaMalloc((void**) & c.errWord_d, MAX_WORD32_SIZE)); + cudaCheck(cudaMalloc((void**) & c.errFedID_d, MAX_WORD32_SIZE)); + cudaCheck(cudaMalloc((void**) & c.errRawID_d, MAX_WORD32_SIZE)); + cudaCheck(cudaMalloc((void**) & c.moduleId_d, MAX_WORD32_SIZE)); cudaCheck(cudaMalloc((void**) & c.mIndexStart_d, MSIZE)); cudaCheck(cudaMalloc((void**) & c.mIndexEnd_d, MSIZE)); @@ -68,7 +70,8 @@ context initDeviceMemory() { void freeMemory(context & c) { // free the GPU memory cudaCheck(cudaFree(c.word_d)); - cudaCheck(cudaFree(c.fedIndex_d)); + cudaCheck(cudaFree(c.fedId_d)); + cudaCheck(cudaFree(c.pdigi_d)); cudaCheck(cudaFree(c.adc_d)); cudaCheck(cudaFree(c.layer_d)); cudaCheck(cudaFree(c.xx_d)); @@ -199,6 +202,8 @@ __device__ uint32_t conversionError(uint32_t fedId, uint32_t status, bool debug uint32_t errorType = 0; + // debug = true; + switch (status) { case(1) : { if (debug) printf("Error in Fed: %i, invalid channel Id (errorType=35)", fedId ); @@ -252,14 +257,12 @@ __device__ uint32_t checkROC(uint32_t errorWord, uint32_t fedId, uint32_t link, switch (errorType) { case(25) : { + errorFound = true; uint32_t index = fedId * MAX_LINK * MAX_ROC + (link-1) * MAX_ROC + 1; if (index > 1 && index <= Map->size){ if (!(link == Map->link[index] && 1 == Map->roc[index])) errorFound = false; } - else{ - errorFound = true; - if (debug) printf("Invalid ROC = 25 found (errorType=25)"); - } + if (debug&errorFound) printf("Invalid ROC = 25 found (errorType=25)"); break; } case(26) : { @@ -424,34 +427,28 @@ __device__ uint32_t getErrRawID(uint32_t fedId, uint32_t errWord, uint32_t error // Kernel to perform Raw to Digi conversion -__global__ void RawToDigi_kernel(const SiPixelFedCablingMapGPU *Map, const uint32_t wordCounter, const uint32_t *Word, const uint32_t *fedIndex, - uint32_t *XX, uint32_t *YY, uint32_t *moduleId, int *mIndexStart, - int *mIndexEnd, uint32_t *ADC, uint32_t *layerArr, uint32_t *rawIdArr, +__global__ void RawToDigi_kernel(const SiPixelFedCablingMapGPU *Map, const uint32_t wordCounter, const uint32_t *Word, const uint8_t *fedIds, + uint16_t * XX, uint16_t * YY, uint16_t * ADC, + uint32_t * pdigi, uint32_t *moduleId, int *mIndexStart, + int *mIndexEnd, uint16_t *layerArr, uint32_t *rawIdArr, uint32_t *errType, uint32_t *errWord, uint32_t *errFedID, uint32_t *errRawID, bool useQualityInfo, bool includeErrors, bool debug) { uint32_t blockId = blockIdx.x; - //const uint32_t eventOffset = eventIndex[eventno]; - uint32_t fedId = fedIndex[blockId]; uint32_t threadId = threadIdx.x; - uint32_t begin = fedIndex[MAX_FED + blockId]; - uint32_t end = fedIndex[MAX_FED + blockId + 1]; - - if (blockIdx.x == gridDim.x - 1) { - end = wordCounter; // for last fed to get the end index - } - - uint32_t link = 0; - uint32_t roc = 0; - bool skipROC = false; //if (threadId==0) printf("Event: %u blockId: %u start: %u end: %u\n", eventno, blockId, begin, end); - int no_itr = (end - begin)/blockDim.x + 1; // to deal with number of hits greater than blockDim.x - for (int i = 0; i < no_itr; i++) { - auto gIndex = begin + threadId + i*blockDim.x; - if (gIndex < end) { + + for (int aaa=0; aaa<1; ++aaa) { + auto gIndex = threadId + blockId*blockDim.x; + if (gIndex < wordCounter) { + + uint32_t fedId = fedIds[gIndex/2]; // +1200; + pdigi[gIndex] = 0; + rawIdArr[gIndex] = 0; + uint32_t ww = Word[gIndex]; // Array containing 32 bit raw data if (includeErrors) { errType[gIndex] = 0; @@ -466,15 +463,12 @@ __global__ void RawToDigi_kernel(const SiPixelFedCablingMapGPU *Map, const uint3 ADC[gIndex] = 0; layerArr[gIndex] = 0; moduleId[gIndex] = 9999; //9999 is the indication of bad module, taken care later - rawIdArr[gIndex] = 9999; continue ; // 0: bad word, } - uint32_t nlink = getLink(ww); // Extract link - uint32_t nroc = getRoc(ww); // Extract Roc in link - if (!((nlink != link) | (nroc != roc))) continue; - link = nlink; - roc = nroc; + + uint32_t link = getLink(ww); // Extract link + uint32_t roc = getRoc(ww); // Extract Roc in link DetIdGPU detId = getRawId(Map, fedId, link, roc); @@ -538,7 +532,7 @@ __global__ void RawToDigi_kernel(const SiPixelFedCablingMapGPU *Map, const uint3 errWord[gIndex] = ww; errFedID[gIndex] = fedId; errRawID[gIndex] = rawId; - printf("Error status: %i\n", error); + // printf("BPIX1 Error status: %i\n", error); continue; } } @@ -556,7 +550,7 @@ __global__ void RawToDigi_kernel(const SiPixelFedCablingMapGPU *Map, const uint3 errWord[gIndex] = ww; errFedID[gIndex] = fedId; errRawID[gIndex] = rawId; - printf("Error status: %i\n", error); + // printf("Error status: %i %d %d %d %d\n", error, dcol, pxid, fedId, roc); continue; } } @@ -566,64 +560,29 @@ __global__ void RawToDigi_kernel(const SiPixelFedCablingMapGPU *Map, const uint3 XX[gIndex] = globalPix.row ; // origin shifting by 1 0-159 YY[gIndex] = globalPix.col ; // origin shifting by 1 0-415 ADC[gIndex] = getADC(ww); + pdigi[gIndex] = pack(globalPix.row,globalPix.col,ADC[gIndex]); layerArr[gIndex] = layer; moduleId[gIndex] = detId.moduleId; rawIdArr[gIndex] = rawId; - if (includeErrors) { - //fill error type - errType[gIndex] = 0; - errWord[gIndex] = ww; - errFedID[gIndex] = fedId; - errRawID[gIndex] = rawId; - } } // end of if (gIndex < end) - } // end of for(int i =0;imoduleId[gIndex+1]) { - atomicExch(&moduleId[gIndex+1], atomicExch(&moduleId[gIndex], moduleId[gIndex+1])); - //*swap all the digi id - atomicExch(&XX[gIndex+1], atomicExch(&XX[gIndex], XX[gIndex+1])); - atomicExch(&YY[gIndex+1], atomicExch(&YY[gIndex], YY[gIndex+1])); - atomicExch(&ADC[gIndex+1], atomicExch(&ADC[gIndex], ADC[gIndex+1])); - atomicExch(&layerArr[gIndex+1], atomicExch(&layerArr[gIndex], layerArr[gIndex+1])); - atomicExch(&rawIdArr[gIndex+1], atomicExch(&rawIdArr[gIndex], rawIdArr[gIndex+1])); - } + if (gIndex < end) { // moduleId== 9999 then pixel is bad with x=y=layer=adc=0 // this bad pixel will not affect the cluster, since for cluster // the origin is shifted at (1,1) so x=y=0 will be ignored // assign the previous valid moduleId to this pixel to remove 9999 // so that we can get the start & end index of module easily. - __syncthreads(); // let the swapping finish first - + if (moduleId[gIndex] == 9999) { int m=gIndex; while(moduleId[--m] == 9999) {} //skip till you get the valid module @@ -631,6 +590,7 @@ __global__ void RawToDigi_kernel(const SiPixelFedCablingMapGPU *Map, const uint3 } } // end of if (gIndex moduleId[gIndex-1] ) { @@ -661,19 +623,24 @@ __global__ void RawToDigi_kernel(const SiPixelFedCablingMapGPU *Map, const uint3 } //end of if (gIndex!= begin && (gIndex<(end-1)) ... } //end of if (gIndex >>( cablingMapDevice, wordCounter, c.word_d, - c.fedIndex_d, - c.xx_d, - c.yy_d, + c.fedId_d, + c.xx_d, c.yy_d, c.adc_d, + c.pdigi_d, c.moduleId_d, c.mIndexStart_d, c.mIndexEnd_d, - c.adc_d,c.layer_d, + c.layer_d, c.rawIdArr_d, c.errType_d, c.errWord_d, @@ -709,20 +678,15 @@ void RawToDigi_wrapper( cudaCheck(cudaGetLastError()); // copy data to host variable - // if you want to copy data after applying ADC threshold - if (convertADCtoElectrons) { - cudaCheck(cudaMemcpy(xx_h, c.xx_adc, wordCounter * sizeof(uint32_t), cudaMemcpyDeviceToHost)); - cudaCheck(cudaMemcpy(yy_h, c.yy_adc, wordCounter * sizeof(uint32_t), cudaMemcpyDeviceToHost)); - } else { - cudaCheck(cudaMemcpy(xx_h, c.xx_d, wordCounter*sizeof(uint32_t), cudaMemcpyDeviceToHost)); - cudaCheck(cudaMemcpy(yy_h, c.yy_d, wordCounter*sizeof(uint32_t), cudaMemcpyDeviceToHost)); - } - cudaCheck(cudaMemcpyAsync(adc_h, c.adc_d, wordCounter*sizeof(uint32_t), cudaMemcpyDeviceToHost, c.stream)); + cudaCheck(cudaMemcpyAsync(pdigi_h, c.pdigi_d, wordCounter*sizeof(uint32_t), cudaMemcpyDeviceToHost, c.stream)); cudaCheck(cudaMemcpyAsync(rawIdArr_h, c.rawIdArr_d, wordCounter*sizeof(uint32_t), cudaMemcpyDeviceToHost, c.stream)); + /* When proven useful/correct cudaCheck(cudaMemcpyAsync(mIndexStart_h, c.mIndexStart_d, NMODULE*sizeof(int), cudaMemcpyDeviceToHost, c.stream)); cudaCheck(cudaMemcpyAsync(mIndexEnd_h, c.mIndexEnd_d, NMODULE*sizeof(int), cudaMemcpyDeviceToHost, c.stream)); + */ + if (includeErrors) { cudaCheck(cudaMemcpyAsync(errType_h, c.errType_d, wordCounter*sizeof(uint32_t), cudaMemcpyDeviceToHost, c.stream)); diff --git a/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.h b/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.h index 6d9b64ef6d0a7..cb9ee02304ddf 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.h +++ b/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.h @@ -8,6 +8,7 @@ #include #include "SiPixelFedCablingMapGPU.h" +#include const uint32_t layerStartBit_ = 20; const uint32_t ladderStartBit_ = 12; @@ -74,20 +75,92 @@ struct Pixel { }; +namespace gpudetails{ + +class Packing { + public: + using PackedDigiType = uint32_t; + + // Constructor: pre-computes masks and shifts from field widths +__host__ __device__ +inline + constexpr Packing(unsigned int row_w, unsigned int column_w, + unsigned int time_w, unsigned int adc_w) : + row_width(row_w), column_width(column_w), adc_width(adc_w) + ,row_shift(0) + ,column_shift(row_shift + row_w) + ,time_shift(column_shift + column_w) + ,adc_shift(time_shift + time_w) + ,row_mask(~(~0U << row_w)) + ,column_mask( ~(~0U << column_w)) + ,time_mask(~(~0U << time_w)) + ,adc_mask(~(~0U << adc_w)) + ,rowcol_mask(~(~0U << (column_w+row_w))) + ,max_row(row_mask) + ,max_column(column_mask) + ,max_adc(adc_mask){} + + + uint32_t row_width; + uint32_t column_width; + uint32_t adc_width; + + uint32_t row_shift; + uint32_t column_shift; + uint32_t time_shift; + uint32_t adc_shift; + + PackedDigiType row_mask; + PackedDigiType column_mask; + PackedDigiType time_mask; + PackedDigiType adc_mask; + PackedDigiType rowcol_mask; + + + uint32_t max_row; + uint32_t max_column; + uint32_t max_adc; + }; + + +// const PixelChannelIdentifier::Packing PixelChannelIdentifier::thePacking( 11, 11, 0, 10); // row, col, time, adc + + +__host__ __device__ +inline +constexpr gpudetails::Packing packing() { return gpudetails::Packing(11, 11, 0, 10);} + +} + +// constexpr Packing thePacking = packing(); + +__host__ __device__ +inline uint32_t pack(uint32_t row, uint32_t col, uint32_t adc) { + constexpr gpudetails::Packing thePacking = gpudetails::packing(); + adc = std::min(adc, thePacking.max_adc); + + return (row << thePacking.row_shift) | + (col << thePacking.column_shift) | + (adc << thePacking.adc_shift); + +} + + // configuration and memory buffers alocated on the GPU struct context { cudaStream_t stream; uint32_t * word_d; - uint32_t * fedIndex_d; + uint8_t * fedId_d; uint32_t * eventIndex_d; - uint32_t * xx_d; - uint32_t * yy_d; - uint32_t * xx_adc; - uint32_t * yy_adc; + uint32_t * pdigi_d; + uint16_t * xx_d; + uint16_t * yy_d; + uint16_t * xx_adc; + uint16_t * yy_adc; uint32_t * moduleId_d; - uint32_t * adc_d; - uint32_t * layer_d; + uint16_t * adc_d; + uint16_t * layer_d; uint32_t * rawIdArr_d; uint32_t * errType_d; uint32_t * errWord_d; @@ -101,9 +174,10 @@ struct context { // wrapper function to call RawToDigi on the GPU from host side -void RawToDigi_wrapper(context &, const SiPixelFedCablingMapGPU* cablingMapDevice, const uint32_t wordCounter, uint32_t *word, const uint32_t fedCounter, uint32_t *fedIndex, - bool convertADCtoElectrons, uint32_t *xx_h, uint32_t *yy_h, uint32_t *adc_h, int *mIndexStart_h, - int *mIndexEnd_h, uint32_t *rawIdArr_h, uint32_t *errType_h, uint32_t *errWord_h, uint32_t *errFedID_h, uint32_t *errRawID_h, +void RawToDigi_wrapper(context &, const SiPixelFedCablingMapGPU* cablingMapDevice, const uint32_t wordCounter, uint32_t *word, + const uint32_t fedCounter, uint8_t *fedId_h, + bool convertADCtoElectrons, uint32_t * pdigi_h, int *mIndexStart_h, int *mIndexEnd_h, + uint32_t *rawIdArr_h, uint32_t *errType_h, uint32_t *errWord_h, uint32_t *errFedID_h, uint32_t *errRawID_h, bool useQualityInfo, bool includeErrors, bool debug = false); // void initCablingMap(); diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc index fd8163e25ced4..a73efa7c91d71 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc +++ b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc @@ -121,15 +121,13 @@ SiPixelRawToDigiGPU::SiPixelRawToDigiGPU( const edm::ParameterSet& conf ) allocateCablingMap(cablingMapGPUHost_, cablingMapGPUDevice_); int WSIZE = MAX_FED*MAX_WORD*sizeof(unsigned int); - int FSIZE = 2*MAX_FED*sizeof(unsigned int)+sizeof(unsigned int); cudaMallocHost(&word, sizeof(unsigned int)*WSIZE); - cudaMallocHost(&fedIndex, sizeof(unsigned int)*FSIZE); + cudaMallocHost(&fedId_h, sizeof(unsigned char)*WSIZE); // to store the output of RawToDigi - cudaMallocHost(&xx_h, sizeof(uint32_t)*WSIZE); - cudaMallocHost(&yy_h, sizeof(uint32_t)*WSIZE); - cudaMallocHost(&adc_h, sizeof(uint32_t)*WSIZE); + cudaMallocHost(&pdigi_h, sizeof(uint32_t)*WSIZE); cudaMallocHost(&rawIdArr_h, sizeof(uint32_t)*WSIZE); + cudaMallocHost(&errType_h, sizeof(uint32_t)*WSIZE); cudaMallocHost(&errRawID_h, sizeof(uint32_t)*WSIZE); cudaMallocHost(&errWord_h, sizeof(uint32_t)*WSIZE); @@ -163,10 +161,8 @@ SiPixelRawToDigiGPU::~SiPixelRawToDigiGPU() { hDigi->Write(); } cudaFreeHost(word); - cudaFreeHost(fedIndex); - cudaFreeHost( xx_h); - cudaFreeHost( yy_h); - cudaFreeHost( adc_h); + cudaFreeHost(fedId_h); + cudaFreeHost( pdigi_h); cudaFreeHost( rawIdArr_h); cudaFreeHost( errType_h); cudaFreeHost( errRawID_h); @@ -285,7 +281,6 @@ SiPixelRawToDigiGPU::produce( edm::Event& ev, const edm::EventSetup& es) // GPU specific: Data extraction for RawToDigi GPU unsigned int wordCounterGPU = 0; unsigned int fedCounter = 0; - const unsigned int MAX_FED = 150; bool errorsInEvent = false; edm::DetSet * detDigis=nullptr; @@ -304,8 +299,7 @@ SiPixelRawToDigiGPU::produce( edm::Event& ev, const edm::EventSetup& es) // for GPU // first 150 index stores the fedId and next 150 will store the // start index of word in that fed - fedIndex[ fedCounter] = fedId - 1200; - fedIndex[MAX_FED +fedCounter] = wordCounterGPU; // MAX_FED = 150 + assert(fedId>=1200); fedCounter++; //get event data for this fed @@ -314,14 +308,12 @@ SiPixelRawToDigiGPU::produce( edm::Event& ev, const edm::EventSetup& es) //GPU specific int nWords = rawData.size()/sizeof(cms_uint64_t); if (nWords == 0) { - word[wordCounterGPU++] = 0; continue; } // check CRC bit const cms_uint64_t* trailer = reinterpret_cast(rawData.data())+(nWords-1); if (!errorcheck.checkCRC(errorsInEvent, fedId, trailer, errors)) { - word[wordCounterGPU++] = 0; continue; } @@ -349,52 +341,52 @@ SiPixelRawToDigiGPU::produce( edm::Event& ev, const edm::EventSetup& es) const cms_uint32_t * bw = (const cms_uint32_t *)(header+1); const cms_uint32_t * ew = (const cms_uint32_t *)(trailer); - if ( *(ew-1) == 0 ) { ew--; theWordCounter--;} - for (auto ww = bw; ww < ew; ++ww) { - if unlikely(ww==0) theWordCounter--; - word[wordCounterGPU++] = *ww; - } + // if ( *(ew-1) == 0 ) { ew--; theWordCounter--;} + assert(0 == (ew-bw)%2); + std::memcpy(word+wordCounterGPU,bw,sizeof(cms_uint32_t)*(ew-bw)); + std::memset(fedId_h+wordCounterGPU/2,fedId - 1200,(ew-bw)/2); + wordCounterGPU+=(ew-bw); + } // end of for loop // GPU specific: RawToDigi -> clustering -> CPE - RawToDigi_wrapper(context_, cablingMapGPUDevice_, wordCounterGPU, word, fedCounter, fedIndex, convertADCtoElectrons, xx_h, yy_h, adc_h, mIndexStart_h, mIndexEnd_h, rawIdArr_h, errType_h, errWord_h, errFedID_h, errRawID_h, useQuality, includeErrors, debug); + RawToDigi_wrapper(context_, cablingMapGPUDevice_, wordCounterGPU, word, fedCounter, fedId_h, convertADCtoElectrons, pdigi_h, mIndexStart_h, mIndexEnd_h, + rawIdArr_h, errType_h, errWord_h, errFedID_h, errRawID_h, useQuality, includeErrors, debug); for (uint32_t i = 0; i < wordCounterGPU; i++) { - - if (rawIdArr_h[i] != 9999) {; //to revise - detDigis = &(*collection).find_or_insert(rawIdArr_h[i]); - if ( (*detDigis).empty() ) (*detDigis).data.reserve(32); // avoid the first relocations - break; - } + if (pdigi_h[i]==0) continue; + detDigis = &(*collection).find_or_insert(rawIdArr_h[i]); + if ( (*detDigis).empty() ) (*detDigis).data.reserve(32); // avoid the first relocations + break; } - for (uint32_t i = 0; i < wordCounterGPU; i++) { - if (rawIdArr_h[i] == 9999) - continue; + if (pdigi_h[i]==0) continue; + assert(rawIdArr_h[i] > 109999); if ( (*detDigis).detId() != rawIdArr_h[i]) { detDigis = &(*collection).find_or_insert(rawIdArr_h[i]); if ( (*detDigis).empty() ) (*detDigis).data.reserve(32); // avoid the first relocations } - (*detDigis).data.emplace_back(xx_h[i], yy_h[i], adc_h[i]); - theDigiCounter++; - + (*detDigis).data.emplace_back(pdigi_h[i]); + theDigiCounter++; + } + for (uint32_t i = 0; i < wordCounterGPU; i++) { if (errType_h[i] != 0) { - SiPixelRawDataError error(errWord_h[i], errType_h[i], errFedID_h[i]); + SiPixelRawDataError error(errWord_h[i], errType_h[i], errFedID_h[i]+1200); errors[errRawID_h[i]].push_back(error); } - } + fedCounter =0; if (theTimer) { @@ -438,18 +430,18 @@ SiPixelRawToDigiGPU::produce( edm::Event& ev, const edm::EventSetup& es) cms_uint32_t linkId = formatter.linkId(aPixelError.getWord32()); const sipixelobjects::PixelFEDLink* link = fed->link(linkId); if (link) { - // The "offline" 0..15 numbering is fixed by definition, also, the FrameConversion depends on it - // in contrast, the ROC-in-channel numbering is determined by hardware --> better to use the "offline" scheme - PixelFEDChannel ch = {fed->id(), linkId, 25, 0}; - for (unsigned int iRoc = 1; iRoc <= link->numberOfROCs(); iRoc++) { + // The "offline" 0..15 numbering is fixed by definition, also, the FrameConversion depends on it + // in contrast, the ROC-in-channel numbering is determined by hardware --> better to use the "offline" scheme + PixelFEDChannel ch = {fed->id(), linkId, 25, 0}; + for (unsigned int iRoc = 1; iRoc <= link->numberOfROCs(); iRoc++) { const sipixelobjects::PixelROC * roc = link->roc(iRoc); if (roc->idInDetUnit() < ch.roc_first) ch.roc_first = roc->idInDetUnit(); if (roc->idInDetUnit() > ch.roc_last) ch.roc_last = roc->idInDetUnit(); } - disabledChannelsDetSet.push_back(ch); - } - } - } + if (ch.roc_first { bool convertADCtoElectrons; unsigned int *word; // to hold input for rawtodigi - unsigned int *fedIndex; // to hold fed index inside word[] array for rawtodigi on GPU + unsigned char *fedId_h; // to hold fed index for each word // to store the output - uint32_t *xx_h, *yy_h, *adc_h, *rawIdArr_h; // host copy of output + uint32_t *pdigi_h, *rawIdArr_h; // host copy of output uint32_t *errType_h, *errWord_h, *errFedID_h, *errRawID_h; // host copy of output // store the start and end index for each module (total 1856 modules-phase 1) int *mIndexStart_h, *mIndexEnd_h; From d0a519c054fd2b091de6a2cec42584b806d3058d Mon Sep 17 00:00:00 2001 From: Cesare Date: Thu, 1 Feb 2018 11:16:38 +0100 Subject: [PATCH 11/88] Further fixes to the unpacking, and some clean up --- .../SiPixelRawToDigi/plugins/RawToDigiGPU.cu | 75 ++++++++++--------- .../SiPixelRawToDigi/plugins/RawToDigiGPU.h | 1 - .../plugins/SiPixelFedCablingMapGPU.cc | 23 +++--- .../plugins/SiPixelFedCablingMapGPU.h | 11 +-- .../plugins/SiPixelRawToDigiGPU.cc | 17 ++--- 5 files changed, 65 insertions(+), 62 deletions(-) diff --git a/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.cu b/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.cu index 92bf3d3c410ca..5e82b1ac00fea 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.cu +++ b/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.cu @@ -50,7 +50,7 @@ context initDeviceMemory() { cudaCheck(cudaMalloc((void**) & c.xx_adc, MAX_WORD16_SIZE)); // to store the x and y coordinate cudaCheck(cudaMalloc((void**) & c.yy_adc, MAX_WORD16_SIZE)); cudaCheck(cudaMalloc((void**) & c.adc_d, MAX_WORD16_SIZE)); - cudaCheck(cudaMalloc((void**) & c.layer_d , MAX_WORD16_SIZE)); + cudaCheck(cudaMalloc((void**) & c.layer_d, MAX_WORD16_SIZE)); cudaCheck(cudaMalloc((void**) & c.rawIdArr_d, MAX_WORD32_SIZE)); cudaCheck(cudaMalloc((void**) & c.errType_d, MAX_WORD32_SIZE)); cudaCheck(cudaMalloc((void**) & c.errWord_d, MAX_WORD32_SIZE)); @@ -72,14 +72,17 @@ void freeMemory(context & c) { cudaCheck(cudaFree(c.word_d)); cudaCheck(cudaFree(c.fedId_d)); cudaCheck(cudaFree(c.pdigi_d)); - cudaCheck(cudaFree(c.adc_d)); - cudaCheck(cudaFree(c.layer_d)); cudaCheck(cudaFree(c.xx_d)); cudaCheck(cudaFree(c.yy_d)); cudaCheck(cudaFree(c.xx_adc)); cudaCheck(cudaFree(c.yy_adc)); + cudaCheck(cudaFree(c.adc_d)); + cudaCheck(cudaFree(c.layer_d)); cudaCheck(cudaFree(c.rawIdArr_d)); - cudaCheck(cudaFree(c.moduleId_d)); + cudaCheck(cudaFree(c.errType_d)); + cudaCheck(cudaFree(c.errWord_d)); + cudaCheck(cudaFree(c.errFedID_d)); + cudaCheck(cudaFree(c.errRawID_d)); cudaCheck(cudaFree(c.mIndexStart_d)); cudaCheck(cudaFree(c.mIndexEnd_d)); @@ -121,7 +124,7 @@ __device__ DetIdGPU getRawId(const SiPixelFedCablingMapGPU * Map, uint32_t fed, // Convert local pixel to global pixel __device__ Pixel frameConversion(bool bpix, int side, uint32_t layer, uint32_t rocIdInDetUnit, Pixel local) { - int slopeRow = 0, slopeCol = 0; + int slopeRow = 0, slopeCol = 0; int rowOffset = 0, colOffset = 0; if (bpix) { @@ -206,26 +209,26 @@ __device__ uint32_t conversionError(uint32_t fedId, uint32_t status, bool debug switch (status) { case(1) : { - if (debug) printf("Error in Fed: %i, invalid channel Id (errorType=35)", fedId ); + if (debug) printf("Error in Fed: %i, invalid channel Id (errorType = 35\n)", fedId ); errorType = 35; break; } case(2) : { - if (debug) printf("Error in Fed: %i, invalid ROC Id (errorType=36)", fedId); + if (debug) printf("Error in Fed: %i, invalid ROC Id (errorType = 36)\n", fedId); errorType = 36; break; } case(3) : { - if (debug) printf("Error in Fed: %i, invalid dcol/pixel value (errorType=37)", fedId); + if (debug) printf("Error in Fed: %i, invalid dcol/pixel value (errorType = 37)\n", fedId); errorType = 37; break; } case(4) : { - if (debug) printf("Error in Fed: %i, dcol/pixel read out of order (errorType=38)", fedId); + if (debug) printf("Error in Fed: %i, dcol/pixel read out of order (errorType = 38)\n", fedId); errorType = 38; break; } - default: if (debug) printf("Cabling check returned unexpected result, status = %i", status); + default: if (debug) printf("Cabling check returned unexpected result, status = %i\n", status); }; return errorType; @@ -253,6 +256,7 @@ __device__ uint32_t checkROC(uint32_t errorWord, uint32_t fedId, uint32_t link, { int errorType = (errorWord >> ROC_shift) & ERROR_mask; + if (errorType < 25) return false; bool errorFound = false; switch (errorType) { @@ -262,47 +266,47 @@ __device__ uint32_t checkROC(uint32_t errorWord, uint32_t fedId, uint32_t link, if (index > 1 && index <= Map->size){ if (!(link == Map->link[index] && 1 == Map->roc[index])) errorFound = false; } - if (debug&errorFound) printf("Invalid ROC = 25 found (errorType=25)"); + if (debug&errorFound) printf("Invalid ROC = 25 found (errorType = 25)\n"); break; } case(26) : { - if (debug) printf("Gap word found (errorType=26)"); + if (debug) printf("Gap word found (errorType = 26)\n"); errorFound = true; break; } case(27) : { - if (debug) printf("Dummy word found (errorType=27)"); + if (debug) printf("Dummy word found (errorType = 27)\n"); errorFound = true; break; } case(28) : { - if (debug) printf("Error fifo nearly full (errorType=28)"); + if (debug) printf("Error fifo nearly full (errorType = 28)\n"); errorFound = true; break; } case(29) : { - if (debug) printf("Timeout on a channel (errorType=29)"); + if (debug) printf("Timeout on a channel (errorType = 29)\n"); if ((errorWord >> OMIT_ERR_shift) & OMIT_ERR_mask) { - if (debug) printf("...first errorType=29 error, this gets masked out"); + if (debug) printf("...first errorType=29 error, this gets masked out\n"); } errorFound = true; break; } case(30) : { - if (debug) printf("TBM error trailer (errorType=30)"); - int StateMatch_bits = 4; - int StateMatch_shift = 8; + if (debug) printf("TBM error trailer (errorType = 30)\n"); + int StateMatch_bits = 4; + int StateMatch_shift = 8; uint32_t StateMatch_mask = ~(~uint32_t(0) << StateMatch_bits); int StateMatch = (errorWord >> StateMatch_shift) & StateMatch_mask; if ( StateMatch != 1 && StateMatch != 8 ) { - if (debug) printf("FED error 30 with unexpected State Bits (errorType=30)"); + if (debug) printf("FED error 30 with unexpected State Bits (errorType = 30)\n"); } - if ( StateMatch==1 ) errorType = 40; // 1=Overflow -> 40, 8=number of ROCs -> 30 + if ( StateMatch == 1 ) errorType = 40; // 1=Overflow -> 40, 8=number of ROCs -> 30 errorFound = true; break; } case(31) : { - if (debug) printf("Event number error (errorType=31)"); + if (debug) printf("Event number error (errorType = 31)\n"); errorFound = true; break; } @@ -322,13 +326,14 @@ __device__ uint32_t getErrRawID(uint32_t fedId, uint32_t errWord, uint32_t error switch (errorType) { case 25 : case 30 : case 31 : case 36 : case 40 : { - // set dummy values for cabling just to get detId from link + //set dummy values for cabling just to get detId from link //cabling.dcol = 0; //cabling.pxid = 2; uint32_t roc = 1; uint32_t link = (errWord >> LINK_shift) & LINK_mask; - rID = getRawId(Map, fedId, link, roc).RawId; + uint32_t rID_temp = getRawId(Map, fedId, link, roc).RawId; + if(rID_temp != 9999) rID = rID_temp; break; } case 29 : { @@ -359,7 +364,8 @@ __device__ uint32_t getErrRawID(uint32_t fedId, uint32_t errWord, uint32_t error //cabling.pxid = 2; uint32_t roc = 1; uint32_t link = chanNmbr; - rID = getRawId(Map, fedId, link, roc).RawId; + uint32_t rID_temp = getRawId(Map, fedId, link, roc).RawId; + if(rID_temp != 9999) rID = rID_temp; break; } case 37 : case 38: { @@ -367,7 +373,8 @@ __device__ uint32_t getErrRawID(uint32_t fedId, uint32_t errWord, uint32_t error //cabling.pxid = 2; uint32_t roc = (errWord >> ROC_shift) & ROC_mask; uint32_t link = (errWord >> LINK_shift) & LINK_mask; - rID = getRawId(Map, fedId, link, roc).RawId; + uint32_t rID_temp = getRawId(Map, fedId, link, roc).RawId; + if(rID_temp != 9999) rID = rID_temp; break; } @@ -463,7 +470,7 @@ __global__ void RawToDigi_kernel(const SiPixelFedCablingMapGPU *Map, const uint3 ADC[gIndex] = 0; layerArr[gIndex] = 0; moduleId[gIndex] = 9999; //9999 is the indication of bad module, taken care later - continue ; // 0: bad word, + continue ; // 0: bad word } @@ -476,7 +483,7 @@ __global__ void RawToDigi_kernel(const SiPixelFedCablingMapGPU *Map, const uint3 skipROC = (roc < maxROCIndex) ? false : (errorType != 0); if (includeErrors and skipROC) { - uint32_t rID = getErrRawID(fedId, ww, errorType, Map, debug); //write the function + uint32_t rID = getErrRawID(fedId, ww, errorType, Map, debug); errType[gIndex] = errorType; errWord[gIndex] = ww; errFedID[gIndex] = fedId; @@ -487,7 +494,6 @@ __global__ void RawToDigi_kernel(const SiPixelFedCablingMapGPU *Map, const uint3 uint32_t rawId = detId.RawId; uint32_t rocIdInDetUnit = detId.rocInDet; - bool barrel = isBarrel(rawId); uint32_t index = fedId * MAX_LINK * MAX_ROC + (link-1) * MAX_ROC + roc; @@ -507,14 +513,14 @@ __global__ void RawToDigi_kernel(const SiPixelFedCablingMapGPU *Map, const uint3 { layer = (rawId >> layerStartBit_) & layerMask_; module = (rawId >> moduleStartBit_) & moduleMask_; - side = (module<5)? -1 : 1; + side = (module < 5)? -1 : 1; } else { // endcap ids layer = 0; panel = (rawId >> panelStartBit_) & panelMask_; //disk = (rawId >> diskStartBit_) & diskMask_ ; - side = (panel==1)? -1 : 1; + side = (panel == 1)? -1 : 1; //blade = (rawId>>bladeStartBit_) & bladeMask_; } @@ -532,7 +538,7 @@ __global__ void RawToDigi_kernel(const SiPixelFedCablingMapGPU *Map, const uint3 errWord[gIndex] = ww; errFedID[gIndex] = fedId; errRawID[gIndex] = rawId; - // printf("BPIX1 Error status: %i\n", error); + if(debug) printf("BPIX1 Error status: %i\n", error); continue; } } @@ -550,13 +556,12 @@ __global__ void RawToDigi_kernel(const SiPixelFedCablingMapGPU *Map, const uint3 errWord[gIndex] = ww; errFedID[gIndex] = fedId; errRawID[gIndex] = rawId; - // printf("Error status: %i %d %d %d %d\n", error, dcol, pxid, fedId, roc); + if(debug) printf("Error status: %i %d %d %d %d\n", error, dcol, pxid, fedId, roc); continue; } } Pixel globalPix = frameConversion(barrel, side, layer, rocIdInDetUnit, localPix); - //printf("GPU side: %i, layer: %i, roc: %i, lrow: %i, lcol: %i, grow: %i, gcol: %i, word: %i\n", side, layer, rocIdInDetUnit, localPix.row, localPix.col, globalPix.row, globalPix.col, ww); XX[gIndex] = globalPix.row ; // origin shifting by 1 0-159 YY[gIndex] = globalPix.col ; // origin shifting by 1 0-415 ADC[gIndex] = getADC(ww); @@ -650,7 +655,7 @@ void RawToDigi_wrapper( */ - assert(0 == wordCounter%2); + assert(0 == wordCounter%2); // wordCounter is the total no of words in each event to be trasfered on device cudaCheck(cudaMemcpyAsync(&c.word_d[0], &word[0], wordCounter*sizeof(uint32_t), cudaMemcpyHostToDevice, c.stream)); cudaCheck(cudaMemcpyAsync(&c.fedId_d[0], &fedId_h[0], wordCounter*sizeof(uint8_t)/2, cudaMemcpyHostToDevice, c.stream)); diff --git a/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.h b/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.h index cb9ee02304ddf..8a8349bb4411e 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.h +++ b/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.h @@ -152,7 +152,6 @@ struct context { uint32_t * word_d; uint8_t * fedId_d; - uint32_t * eventIndex_d; uint32_t * pdigi_d; uint16_t * xx_d; uint16_t * yy_d; diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.cc b/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.cc index 1cc39d1d07616..33e1ea428e2e6 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.cc +++ b/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.cc @@ -25,8 +25,8 @@ void processCablingMap(SiPixelFedCablingMap const& cablingMap, SiPixelFedCabling std::vector RawId(MAX_SIZE); std::vector rocInDet(MAX_SIZE); std::vector moduleId(MAX_SIZE); - std::vector badRocs(MAX_SIZE); - std::vector modToUnp(MAX_SIZE); + std::vector badRocs(MAX_SIZE); + std::vector modToUnp(MAX_SIZE); std::set rawIdSet; unsigned int startFed = *(fedIds.begin()); @@ -47,17 +47,15 @@ void processCablingMap(SiPixelFedCablingMap const& cablingMap, SiPixelFedCabling RawId[index] = pixelRoc->rawId(); rocInDet[index] = pixelRoc->idInDetUnit(); rawIdSet.insert(RawId[index]); - if (badPixelInfo != nullptr){ - modToUnp[index] = (modules.size() != 0) && (modules.find(pixelRoc->rawId()) == modules.end()); + modToUnp[index] = (modules.size() != 0) && (modules.find(pixelRoc->rawId()) == modules.end()); + if (badPixelInfo != nullptr) badRocs[index] = badPixelInfo->IsRocBad(pixelRoc->rawId(), pixelRoc->idInDetUnit()); - } else{ - modToUnp[index] = false; - badRocs[index] = true; - } + else + badRocs[index] = false; } else { // store some dummy number RawId[index] = 9999; rocInDet[index] = 9999; - modToUnp[index] = false; + modToUnp[index] = true; badRocs[index] = true; } index++; @@ -91,7 +89,7 @@ void processCablingMap(SiPixelFedCablingMap const& cablingMap, SiPixelFedCabling } moduleId[i] = it->second; } - LogDebug("SiPixelFed/CablingMapGPU") << "----------------------------------------------------------------------------" << std::endl; + LogDebug("SiPixelFedCablingMapGPU") << "----------------------------------------------------------------------------" << std::endl; LogDebug("SiPixelFedCablingMapGPU") << i << std::setw(20) << fedMap[i] << std::setw(20) << linkMap[i] << std::setw(20) << rocMap[i] << std::endl; LogDebug("SiPixelFedCablingMapGPU") << i << std::setw(20) << RawId[i] << std::setw(20) << rocInDet[i] << std::setw(20) << moduleId[i] << std::endl; LogDebug("SiPixelFedCablingMapGPU") << i << std::setw(20) << badRocs[i] << std::setw(20) << modToUnp[i] << std::endl; @@ -105,8 +103,9 @@ void processCablingMap(SiPixelFedCablingMap const& cablingMap, SiPixelFedCabling cudaCheck(cudaMemcpy(cablingMapGPU->RawId, RawId.data(), RawId.size() * sizeof(unsigned int), cudaMemcpyHostToDevice)); cudaCheck(cudaMemcpy(cablingMapGPU->rocInDet, rocInDet.data(), rocInDet.size() * sizeof(unsigned int), cudaMemcpyHostToDevice)); cudaCheck(cudaMemcpy(cablingMapGPU->moduleId, moduleId.data(), moduleId.size() * sizeof(unsigned int), cudaMemcpyHostToDevice)); - cudaCheck(cudaMemcpy(cablingMapGPU->badRocs, badRocs.data(), badRocs.size() * sizeof(unsigned char), cudaMemcpyHostToDevice)); - cudaCheck(cudaMemcpy(cablingMapGPU->modToUnp, modToUnp.data(), modToUnp.size() * sizeof(unsigned char), cudaMemcpyHostToDevice)); + cudaCheck(cudaMemcpy(cablingMapGPU->badRocs, badRocs.data(), badRocs.size() * sizeof(short int), cudaMemcpyHostToDevice)); + cudaCheck(cudaMemcpy(cablingMapGPU->modToUnp, modToUnp.data(), modToUnp.size() * sizeof(short int), cudaMemcpyHostToDevice)); cudaCheck(cudaMemcpy(cablingMapDevice, cablingMapGPU, sizeof(SiPixelFedCablingMapGPU), cudaMemcpyHostToDevice)); cudaDeviceSynchronize(); } + diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.h b/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.h index a774799ef9281..881acaeca0370 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.h +++ b/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.h @@ -15,7 +15,7 @@ const unsigned int MAX_LINK = 48; // maximum links/channels for Phase 1 const unsigned int MAX_ROC = 8; const unsigned int MAX_SIZE = MAX_FED * MAX_LINK * MAX_ROC; const unsigned int MAX_SIZE_BYTE_INT = MAX_SIZE * sizeof(unsigned int); -const unsigned int MAX_SIZE_BYTE_CHAR = MAX_SIZE * sizeof(unsigned char); +const unsigned int MAX_SIZE_BYTE_BOOL = MAX_SIZE * sizeof(short int); struct SiPixelFedCablingMapGPU { unsigned int size; @@ -25,8 +25,8 @@ struct SiPixelFedCablingMapGPU { unsigned int * RawId; unsigned int * rocInDet; unsigned int * moduleId; - unsigned char * modToUnp; - unsigned char * badRocs; + short int * modToUnp; + short int * badRocs; }; inline @@ -39,8 +39,8 @@ void allocateCablingMap(SiPixelFedCablingMapGPU* & cablingMapHost, SiPixelFedCab cudaCheck(cudaMalloc((void**) & cablingMapHost->RawId, MAX_SIZE_BYTE_INT)); cudaCheck(cudaMalloc((void**) & cablingMapHost->rocInDet, MAX_SIZE_BYTE_INT)); cudaCheck(cudaMalloc((void**) & cablingMapHost->moduleId, MAX_SIZE_BYTE_INT)); - cudaCheck(cudaMalloc((void**) & cablingMapHost->badRocs, MAX_SIZE_BYTE_CHAR)); - cudaCheck(cudaMalloc((void**) & cablingMapHost->modToUnp, MAX_SIZE_BYTE_CHAR)); + cudaCheck(cudaMalloc((void**) & cablingMapHost->badRocs, MAX_SIZE_BYTE_BOOL)); + cudaCheck(cudaMalloc((void**) & cablingMapHost->modToUnp, MAX_SIZE_BYTE_BOOL)); cudaCheck(cudaMemcpy(cablingMapDevice, cablingMapHost, sizeof(SiPixelFedCablingMapGPU), cudaMemcpyHostToDevice)); } @@ -61,3 +61,4 @@ void deallocateCablingMap(SiPixelFedCablingMapGPU* cablingMapHost, SiPixelFedCab void processCablingMap(SiPixelFedCablingMap const& cablingMap, SiPixelFedCablingMapGPU* cablingMapGPU, SiPixelFedCablingMapGPU* cablingMapDevice, const SiPixelQuality* badPixelInfo, std::set const& modules); #endif // SiPixelFedCablingMapGPU_h + diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc index a73efa7c91d71..3ba76af8deea8 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc +++ b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc @@ -162,14 +162,14 @@ SiPixelRawToDigiGPU::~SiPixelRawToDigiGPU() { } cudaFreeHost(word); cudaFreeHost(fedId_h); - cudaFreeHost( pdigi_h); - cudaFreeHost( rawIdArr_h); - cudaFreeHost( errType_h); - cudaFreeHost( errRawID_h); - cudaFreeHost( errWord_h); - cudaFreeHost( errFedID_h); - cudaFreeHost( mIndexStart_h); - cudaFreeHost( mIndexEnd_h); + cudaFreeHost(pdigi_h); + cudaFreeHost(rawIdArr_h); + cudaFreeHost(errType_h); + cudaFreeHost(errRawID_h); + cudaFreeHost(errWord_h); + cudaFreeHost(errFedID_h); + cudaFreeHost(mIndexStart_h); + cudaFreeHost(mIndexEnd_h); // release device memory for cabling map deallocateCablingMap(cablingMapGPUHost_, cablingMapGPUDevice_); @@ -386,7 +386,6 @@ SiPixelRawToDigiGPU::produce( edm::Event& ev, const edm::EventSetup& es) } - fedCounter =0; if (theTimer) { From 8755af61e280ded3a2b8102e42a6100805dab08e Mon Sep 17 00:00:00 2001 From: Felice Date: Fri, 9 Feb 2018 18:20:28 +0100 Subject: [PATCH 12/88] Simple `std::vector`-like sructure for concurrent `push_back` Implement `GPUSimpleVector`, a simple `std::vector`-like sructure that can be used on the CPU and GPU, with - pre-allocated storage - concurrent insertion at the end - random access to individual elements Also provide methods that do not rely on atomic operations for cases when concurrency is not needed. Include a cuda source file to test the `GPUSimpleVector` --- HeterogeneousCore/CUDAUtilities/BuildFile.xml | 2 + .../CUDAUtilities/interface/GPUSimpleVector.h | 95 +++++++++++++++++++ .../CUDAUtilities/test/BuildFile.xml | 3 + .../test/test_GPUSimpleVector.cu | 89 +++++++++++++++++ 4 files changed, 189 insertions(+) create mode 100644 HeterogeneousCore/CUDAUtilities/BuildFile.xml create mode 100644 HeterogeneousCore/CUDAUtilities/interface/GPUSimpleVector.h create mode 100644 HeterogeneousCore/CUDAUtilities/test/BuildFile.xml create mode 100644 HeterogeneousCore/CUDAUtilities/test/test_GPUSimpleVector.cu diff --git a/HeterogeneousCore/CUDAUtilities/BuildFile.xml b/HeterogeneousCore/CUDAUtilities/BuildFile.xml new file mode 100644 index 0000000000000..adfe5e217c073 --- /dev/null +++ b/HeterogeneousCore/CUDAUtilities/BuildFile.xml @@ -0,0 +1,2 @@ + + diff --git a/HeterogeneousCore/CUDAUtilities/interface/GPUSimpleVector.h b/HeterogeneousCore/CUDAUtilities/interface/GPUSimpleVector.h new file mode 100644 index 0000000000000..21353808bea01 --- /dev/null +++ b/HeterogeneousCore/CUDAUtilities/interface/GPUSimpleVector.h @@ -0,0 +1,95 @@ +// author: Felice Pantaleo, CERN, 2018 +#ifndef HeterogeneousCore_CUDAUtilities_GPUSimpleVector_h +#define HeterogeneousCore_CUDAUtilities_GPUSimpleVector_h + +#include +#include + +#include + +namespace GPU { +template struct SimpleVector { + // Constructors + __host__ __device__ SimpleVector(int capacity, T *data) // ownership of m_data stays within the caller + : m_size(0), m_data(data), m_capacity(capacity) { + static_assert(std::is_trivially_destructible::value); + } + + __host__ __device__ SimpleVector() : SimpleVector(0) {} + + __inline__ __host__ __device__ int push_back_unsafe(const T &element) { + auto previousSize = m_size; + m_size++; + if (previousSize < m_capacity) { + m_data[previousSize] = element; + return previousSize; + } else { + --m_size; + return -1; + } + } + + template __host__ __device__ int emplace_back_unsafe(Ts &&... args) { + auto previousSize = m_size; + m_size++; + if (previousSize < m_capacity) { + (new (&m_data[previousSize]) T(std::forward(args)...)); + return previousSize; + } else { + --m_size; + return -1; + } + } + + __inline__ __host__ __device__ T & back() const { + + if (m_size > 0) { + return m_data[m_size - 1]; + } else + return T(); //undefined behaviour + } + +#if defined(__NVCC__) || defined(__CUDACC__) + // thread-safe version of the vector, when used in a CUDA kernel + __device__ int push_back(const T &element) { + auto previousSize = atomicAdd(&m_size, 1); + if (previousSize < m_capacity) { + m_data[previousSize] = element; + return previousSize; + } else { + atomicSub(&m_size, 1); + return -1; + } + } + + template __device__ int emplace_back(Ts &&... args) { + auto previousSize = atomicAdd(&m_size, 1); + if (previousSize < m_capacity) { + (new (&m_data[previousSize]) T(std::forward(args)...)); + return previousSize; + } else { + atomicSub(&m_size, 1); + return -1; + } + } +#endif + + __inline__ __host__ __device__ T& operator[](int i) const { return m_data[i]; } + + __inline__ __host__ __device__ void reset() { m_size = 0; } + + __inline__ __host__ __device__ int size() const { return m_size; } + + __inline__ __host__ __device__ int capacity() const { return m_capacity; } + + __inline__ __host__ __device__ T *data() const { return m_data; } + +private: + int m_size; + int m_capacity; + + T *m_data; +}; +} // namespace GPU + +#endif // HeterogeneousCore_CUDAUtilities_GPUSimpleVector_h diff --git a/HeterogeneousCore/CUDAUtilities/test/BuildFile.xml b/HeterogeneousCore/CUDAUtilities/test/BuildFile.xml new file mode 100644 index 0000000000000..b202aa2f84304 --- /dev/null +++ b/HeterogeneousCore/CUDAUtilities/test/BuildFile.xml @@ -0,0 +1,3 @@ + + + diff --git a/HeterogeneousCore/CUDAUtilities/test/test_GPUSimpleVector.cu b/HeterogeneousCore/CUDAUtilities/test/test_GPUSimpleVector.cu new file mode 100644 index 0000000000000..68ba05757032f --- /dev/null +++ b/HeterogeneousCore/CUDAUtilities/test/test_GPUSimpleVector.cu @@ -0,0 +1,89 @@ +// author: Felice Pantaleo, CERN, 2018 +#include "../interface/GPUSimpleVector.h" +#include +#include +#include +#include +#include + +__global__ void vector_pushback(GPU::SimpleVector *foo) { + auto index = threadIdx.x + blockIdx.x * blockDim.x; + foo->push_back(index); +} + +__global__ void vector_reset(GPU::SimpleVector *foo) { + + foo->reset(); +} + +__global__ void vector_emplace_back(GPU::SimpleVector *foo) { + auto index = threadIdx.x + blockIdx.x * blockDim.x; + foo->emplace_back(index); +} + +int main() { + auto maxN = 10000; + GPU::SimpleVector *obj_ptr = nullptr; + GPU::SimpleVector *d_obj_ptr = nullptr; + GPU::SimpleVector *tmp_obj_ptr = nullptr; + int *data_ptr = nullptr; + int *d_data_ptr = nullptr; + + bool success = + cudaMallocHost(&obj_ptr, sizeof(GPU::SimpleVector)) == cudaSuccess && + cudaMallocHost(&data_ptr, maxN * sizeof(int)) == cudaSuccess && + cudaMalloc(&d_data_ptr, maxN * sizeof(int)) == cudaSuccess; + + auto v = new (obj_ptr) GPU::SimpleVector(maxN, data_ptr); + + cudaMallocHost(&tmp_obj_ptr, sizeof(GPU::SimpleVector)); + new (tmp_obj_ptr) GPU::SimpleVector(maxN, d_data_ptr); + assert(tmp_obj_ptr->size() == 0); + assert(tmp_obj_ptr->capacity() == static_cast(maxN)); + + success = + success && + cudaMalloc(&d_obj_ptr, sizeof(GPU::SimpleVector)) == cudaSuccess + // ... and copy the object to the device. + && cudaMemcpy(d_obj_ptr, tmp_obj_ptr, sizeof(GPU::SimpleVector), + cudaMemcpyHostToDevice) == cudaSuccess; + + int numBlocks = 5; + int numThreadsPerBlock = 256; + assert(success); + vector_pushback<<>>(d_obj_ptr); + + cudaMemcpy(obj_ptr, d_obj_ptr, sizeof(GPU::SimpleVector), + cudaMemcpyDeviceToHost); + + assert(obj_ptr->size() == (numBlocks * numThreadsPerBlock < maxN + ? numBlocks * numThreadsPerBlock + : maxN)); + vector_reset<<>>(d_obj_ptr); + + cudaMemcpy(obj_ptr, d_obj_ptr, sizeof(GPU::SimpleVector), + cudaMemcpyDeviceToHost); + + assert(obj_ptr->size() == 0); + + vector_emplace_back<<>>(d_obj_ptr); + + cudaMemcpy(obj_ptr, d_obj_ptr, sizeof(GPU::SimpleVector), + cudaMemcpyDeviceToHost); + + assert(obj_ptr->size() == (numBlocks * numThreadsPerBlock < maxN + ? numBlocks * numThreadsPerBlock + : maxN)); + + success = success and + cudaMemcpy(data_ptr, d_data_ptr, obj_ptr->size() * sizeof(int), + cudaMemcpyDeviceToHost) == cudaSuccess and + cudaFreeHost(obj_ptr) == cudaSuccess and + cudaFreeHost(data_ptr) == cudaSuccess and + cudaFreeHost(tmp_obj_ptr) == cudaSuccess and + cudaFree(d_data_ptr) == cudaSuccess and + cudaFree(d_obj_ptr) == cudaSuccess; + assert(success); + std::cout << "TEST PASSED" << std::endl; + return 0; +} From 30ad24b0e1f572fc270bef6002514466cc1d7f84 Mon Sep 17 00:00:00 2001 From: Vincenzo Innocente Date: Thu, 15 Feb 2018 16:25:59 +0100 Subject: [PATCH 13/88] Digital calibrator, concurrent clusterizer (optimized), CPE and RecHIts GPU implementation of the pixel clusterizer, CPU and RecHit producer --- .../SiPixelGainCalibrationServiceBase.h | 2 + .../interface/SiPixelGainCalibrationForHLT.h | 5 +- .../interface/SiPixelGainForHLTonGPU.h | 69 +++ .../GeometrySurface/interface/SOARotation.h | 160 +++++ .../GeometrySurface/test/BuildFile.xml | 15 + .../test/FrameTransformTest.cpp | 38 +- .../test/gpuFrameTransformKernel.cu | 43 ++ .../test/gpuFrameTransformTest.cpp | 126 ++++ .../SiPixelRawToDigi/plugins/BuildFile.xml | 1 + .../SiPixelRawToDigi/plugins/RawToDigiGPU.cu | 213 +++---- .../SiPixelRawToDigi/plugins/RawToDigiGPU.h | 24 +- .../plugins/SiPixelFedCablingMapGPU.cc | 103 +++- .../plugins/SiPixelFedCablingMapGPU.h | 10 +- .../plugins/SiPixelRawToDigiGPU.cc | 46 +- .../plugins/SiPixelRawToDigiGPU.h | 12 + .../SiPixelRawToDigi/plugins/cudaCheck.h | 1 + .../interface/phase1PixelTopology.h | 79 +++ .../TrackerGeometryBuilder/test/BuildFile.xml | 4 + .../test/phase1PixelTopology_t.cpp | 146 +++++ .../plugins/gpuCalibPixel.h | 125 ++++ .../plugins/gpuClustering.h | 168 ++++++ .../SiPixelClusterizer/test/BuildFile.xml | 7 + .../SiPixelClusterizer/test/gpuClustering.cu | 262 ++++++++ RecoLocalTracker/SiPixelRecHits/BuildFile.xml | 2 + .../SiPixelRecHits/interface/PixelCPEBase.h | 2 +- .../SiPixelRecHits/interface/PixelCPEFast.h | 112 ++++ .../SiPixelRecHits/interface/pixelCPEforGPU.h | 206 +++++++ .../SiPixelRecHits/plugins/BuildFile.xml | 4 +- .../plugins/PixelCPEFastESProducer.cc | 103 ++++ .../SiPixelRecHits/plugins/PixelRecHits.cu | 74 +++ .../SiPixelRecHits/plugins/PixelRecHits.h | 26 + .../plugins/SiPixelRecHitGPU.cc | 239 ++++++++ .../SiPixelRecHits/plugins/gpuPixelRecHits.h | 130 ++++ .../python/PixelCPEESProducers_cff.py | 1 + .../SiPixelRecHits/python/PixelCPEFast_cfi.py | 31 + .../python/SiPixelRecHitsGPU_cfi.py | 12 + .../SiPixelRecHits/src/PixelCPEFast.cc | 559 ++++++++++++++++++ 37 files changed, 3021 insertions(+), 139 deletions(-) create mode 100644 CondFormats/SiPixelObjects/interface/SiPixelGainForHLTonGPU.h create mode 100644 DataFormats/GeometrySurface/interface/SOARotation.h create mode 100644 DataFormats/GeometrySurface/test/gpuFrameTransformKernel.cu create mode 100644 DataFormats/GeometrySurface/test/gpuFrameTransformTest.cpp create mode 100644 Geometry/TrackerGeometryBuilder/interface/phase1PixelTopology.h create mode 100644 Geometry/TrackerGeometryBuilder/test/phase1PixelTopology_t.cpp create mode 100644 RecoLocalTracker/SiPixelClusterizer/plugins/gpuCalibPixel.h create mode 100644 RecoLocalTracker/SiPixelClusterizer/plugins/gpuClustering.h create mode 100644 RecoLocalTracker/SiPixelClusterizer/test/gpuClustering.cu create mode 100644 RecoLocalTracker/SiPixelRecHits/interface/PixelCPEFast.h create mode 100644 RecoLocalTracker/SiPixelRecHits/interface/pixelCPEforGPU.h create mode 100644 RecoLocalTracker/SiPixelRecHits/plugins/PixelCPEFastESProducer.cc create mode 100644 RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.cu create mode 100644 RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.h create mode 100644 RecoLocalTracker/SiPixelRecHits/plugins/SiPixelRecHitGPU.cc create mode 100644 RecoLocalTracker/SiPixelRecHits/plugins/gpuPixelRecHits.h create mode 100644 RecoLocalTracker/SiPixelRecHits/python/PixelCPEFast_cfi.py create mode 100644 RecoLocalTracker/SiPixelRecHits/python/SiPixelRecHitsGPU_cfi.py create mode 100644 RecoLocalTracker/SiPixelRecHits/src/PixelCPEFast.cc diff --git a/CalibTracker/SiPixelESProducers/interface/SiPixelGainCalibrationServiceBase.h b/CalibTracker/SiPixelESProducers/interface/SiPixelGainCalibrationServiceBase.h index 09ae4d2ee3ed0..bcd45dc5e7fbf 100644 --- a/CalibTracker/SiPixelESProducers/interface/SiPixelGainCalibrationServiceBase.h +++ b/CalibTracker/SiPixelESProducers/interface/SiPixelGainCalibrationServiceBase.h @@ -73,6 +73,8 @@ class SiPixelGainCalibrationServicePayloadGetter : public SiPixelGainCalibration void setESObjects(const edm::EventSetup& es ) override; + thePayloadObject const & payload() const { return *ped; } + std::vector getDetIds() override; double getGainLow() override; double getGainHigh() override; diff --git a/CondFormats/SiPixelObjects/interface/SiPixelGainCalibrationForHLT.h b/CondFormats/SiPixelObjects/interface/SiPixelGainCalibrationForHLT.h index c1c9c427eb7f9..8501285fc9748 100644 --- a/CondFormats/SiPixelObjects/interface/SiPixelGainCalibrationForHLT.h +++ b/CondFormats/SiPixelObjects/interface/SiPixelGainCalibrationForHLT.h @@ -73,6 +73,9 @@ class SiPixelGainCalibrationForHLT { float getPedLow() const { return minPed_; } float getPedHigh() const { return maxPed_; } + std::vector const & data() const { return v_pedestals;} + std::vector const & getIndexes() const { return indexes; } + // Set and get public methods void setData(float ped, float gain, std::vector& vped, bool thisColumnIsDead = false, bool thisColumnIsNoisy = false); void setDeadColumn(const int& nRows, std::vector& vped) { setData(0, 0 /*dummy values, not used*/, vped, true, false); } @@ -84,7 +87,7 @@ class SiPixelGainCalibrationForHLT { float getPed (const int& col, const int& row, const Range& range, const int& nCols, bool& isDeadColumn, bool& isNoisyColumn ) const; float getGain (const int& col, const int& row, const Range& range, const int& nCols, bool& isDeadColumn, bool& isNoisyColumn ) const; - private: +private: float encodeGain(const float& gain); float encodePed (const float& ped); diff --git a/CondFormats/SiPixelObjects/interface/SiPixelGainForHLTonGPU.h b/CondFormats/SiPixelObjects/interface/SiPixelGainForHLTonGPU.h new file mode 100644 index 0000000000000..12faeaaa9a845 --- /dev/null +++ b/CondFormats/SiPixelObjects/interface/SiPixelGainForHLTonGPU.h @@ -0,0 +1,69 @@ +#pragma once + +#include +#include +#include +#include + +struct SiPixelGainForHLTonGPU_DecodingStructure{ + uint8_t gain; + uint8_t ped; +}; + + +// copy of SiPixelGainCalibrationForHLT +class SiPixelGainForHLTonGPU { + + public: + + using DecodingStructure = SiPixelGainForHLTonGPU_DecodingStructure; + + using Range = std::pair; + + + inline __host__ __device__ + std::pair getPedAndGain(uint32_t moduleInd, int col, int row, bool& isDeadColumn, bool& isNoisyColumn ) const { + + + auto range = rangeAndCols[moduleInd].first; + auto nCols = rangeAndCols[moduleInd].second; + + // determine what averaged data block we are in (there should be 1 or 2 of these depending on if plaquette is 1 by X or 2 by X + unsigned int lengthOfColumnData = (range.second-range.first)/nCols; + unsigned int lengthOfAveragedDataInEachColumn = 2; // we always only have two values per column averaged block + unsigned int numberOfDataBlocksToSkip = row / numberOfRowsAveragedOver_; + + + auto offset = range.first + col*lengthOfColumnData + lengthOfAveragedDataInEachColumn*numberOfDataBlocksToSkip; + + assert(offset rangeAndCols[2000]; + + float minPed_, maxPed_, minGain_, maxGain_; + + float pedPrecision, gainPrecision; + + unsigned int numberOfRowsAveragedOver_; // this is 80!!!! + unsigned int nBinsToUseForEncoding_; + unsigned int deadFlag_; + unsigned int noisyFlag_; +}; + diff --git a/DataFormats/GeometrySurface/interface/SOARotation.h b/DataFormats/GeometrySurface/interface/SOARotation.h new file mode 100644 index 0000000000000..7f12f49cb1d49 --- /dev/null +++ b/DataFormats/GeometrySurface/interface/SOARotation.h @@ -0,0 +1,160 @@ +#pragma once + +template class TkRotation; + +// to be moved in an external common library??? + +/** Rotation matrix used by SOA (as in GPU + */ + +template +class SOARotation { +public: + + constexpr inline + SOARotation(){} + + constexpr inline + explicit SOARotation(T) : + R11( 1), R12( 0), R13( 0), + R21( 0), R22( 1), R23( 0), + R31( 0), R32( 0), R33( 1) {} + + constexpr inline + SOARotation( T xx, T xy, T xz, T yx, T yy, T yz, T zx, T zy, T zz) : + R11(xx), R12(xy), R13(xz), + R21(yx), R22(yy), R23(yz), + R31(zx), R32(zy), R33(zz) {} + + constexpr inline + SOARotation( const T* p) : + R11(p[0]), R12(p[1]), R13(p[2]), + R21(p[3]), R22(p[4]), R23(p[5]), + R31(p[6]), R32(p[7]), R33(p[8]) {} + + + template + constexpr inline + SOARotation( const TkRotation& a) : + R11(a.xx()), R12(a.xy()), R13(a.xz()), + R21(a.yx()), R22(a.yy()), R23(a.yz()), + R31(a.zx()), R32(a.zy()), R33(a.zz()) {} + + constexpr inline + SOARotation transposed() const { + return SOARotation( R11, R21, R31, + R12, R22, R32, + R13, R23, R33); + } + + // if frame this is to local + constexpr inline + void multiply(T const vx, T const vy, T const vz, + T & ux, T & uy, T & uz + ) const { + ux = R11*vx + R12*vy + R13*vz; + uy = R21*vx + R22*vy + R23*vz; + uz = R31*vx + R32*vy + R33*vz; + } + + // if frame this is to global + constexpr inline + void multiplyInverse (T const vx, T const vy, T const vz, + T & ux, T & uy, T & uz + ) const { + ux = R11*vx + R21*vy + R31*vz; + uy = R12*vx + R22*vy + R32*vz; + uz = R13*vx + R23*vy + R33*vz; + } + + + // if frame this is to global + constexpr inline + void multiplyInverse (T const vx, T const vy, + T & ux, T & uy, T & uz + ) const { + ux = R11*vx + R21*vy; + uy = R12*vx + R22*vy; + uz = R13*vx + R23*vy; + } + + + constexpr inline + T const &xx() const { return R11;} + constexpr inline + T const &xy() const { return R12;} + constexpr inline + T const &xz() const { return R13;} + constexpr inline + T const &yx() const { return R21;} + constexpr inline + T const &yy() const { return R22;} + constexpr inline + T const &yz() const { return R23;} + constexpr inline + T const &zx() const { return R31;} + constexpr inline + T const &zy() const { return R32;} + constexpr inline + T const &zz() const { return R33;} + +private: + + T R11, R12, R13; + T R21, R22, R23; + T R31, R32, R33; +}; + + +template +class SOAFrame { +public: + + constexpr inline + SOAFrame(){} + + constexpr inline + SOAFrame(T ix, T iy, T iz, SOARotation const & irot) : + px(ix),py(iy),pz(iz), rot(irot){} + + constexpr inline + SOARotation const & rotation() const { return rot;} + + constexpr inline + void toLocal(T const vx, T const vy, T const vz, + T & ux, T & uy, T & uz + ) const { + rot.multiply(vx-px,vy-py,vz-pz,ux,uy,uz); + } + + + constexpr inline + void toGlobal(T const vx, T const vy, T const vz, + T & ux, T & uy, T & uz + ) const { + rot.multiplyInverse(vx,vy,vz,ux,uy,uz); + ux+=px; uy+=py; uz+=pz; + } + + constexpr inline + void toGlobal(T const vx, T const vy, + T & ux, T & uy, T & uz + ) const { + rot.multiplyInverse(vx,vy,ux,uy,uz); + ux+=px; uy+=py; uz+=pz; + } + + + constexpr inline + T x() const { return px;} + constexpr inline + T y() const { return py;} + constexpr inline + T z() const { return pz;} + +private: + + T px, py, pz; + SOARotation rot; + +}; diff --git a/DataFormats/GeometrySurface/test/BuildFile.xml b/DataFormats/GeometrySurface/test/BuildFile.xml index c02a36305923e..b8b3d4d048c46 100644 --- a/DataFormats/GeometrySurface/test/BuildFile.xml +++ b/DataFormats/GeometrySurface/test/BuildFile.xml @@ -14,3 +14,18 @@ + + + + + + + + + + + + + + + diff --git a/DataFormats/GeometrySurface/test/FrameTransformTest.cpp b/DataFormats/GeometrySurface/test/FrameTransformTest.cpp index d95ffdd4a2897..bd4eb2006183b 100644 --- a/DataFormats/GeometrySurface/test/FrameTransformTest.cpp +++ b/DataFormats/GeometrySurface/test/FrameTransformTest.cpp @@ -1,4 +1,4 @@ -#include +#include "DataFormats/GeometrySurface/interface/SOARotation.h" #include "DataFormats/GeometrySurface/interface/TkRotation.h" #include "DataFormats/GeometrySurface/interface/GloballyPositioned.h" #include "DataFormats/GeometrySurface/interface/BoundPlane.h" @@ -7,12 +7,16 @@ #include +#include + using namespace std; template void go() { typedef TkRotation Rotation; + typedef SOARotation SRotation; typedef GloballyPositioned Frame; + typedef SOAFrame SFrame; typedef typename Frame::PositionType Position; typedef typename Frame::GlobalVector GlobalVector; typedef typename Frame::GlobalPoint GlobalPoint; @@ -23,6 +27,8 @@ void go() { std::cout << "size of Pos " << sizeof(Position) << std::endl; std::cout << "size of Point " << sizeof(GlobalPoint) << std::endl; std::cout << "size of Frame " << sizeof(Frame) << std::endl; + std::cout << "size of soa Rot " << sizeof(SRotation) << std::endl; + std::cout << "size of soa Frame " << sizeof(SFrame) << std::endl; double a = 0.01; double ca = cos(a); @@ -51,6 +57,7 @@ void go() { // Rotation r3 = r2*r1; Rotation r3 = r2*r1.transposed(); + SRotation sr3(r3); GlobalPoint pos2(f2.position()); LocalPoint lp3 = f1.toLocal(pos2); @@ -58,8 +65,20 @@ void go() { cout << "f3.position() " << f3.position() << endl; cout << "f3.rotation() " << endl << f3.rotation() << endl; + SFrame sf1(f1.position().x(), + f1.position().y(), + f1.position().z(), + f1.rotation() + ); + + SFrame sf3(f3.position().x(), + f3.position().y(), + f3.position().z(), + sr3 + ); + // test - GlobalPoint gp( 11,22,33); + GlobalPoint gp(11,22,33); LocalPoint p_in1 = f1.toLocal( gp); typename Frame::ToLocal ff1(f1); LocalPoint p_in2 = f2.toLocal( gp); @@ -69,8 +88,19 @@ void go() { cout << "p_in2 " << p_in2 << endl; cout << "p_in3 " << p_in3 << endl; - LocalPoint p_in1_from3( f3.toGlobal(p_in3).basicVector()); - cout << "p_in1_from3 + " << p_in1_from3 << endl; + LocalPoint p_in1_from3(f3.toGlobal(p_in3).basicVector()); + cout << "p_in1_from3 " << p_in1_from3 << endl; + + T xx,yy,zz; + sf1.toLocal(gp.x(),gp.y(),gp.z(), + xx,yy,zz); + cout << "p_in1 soa " << xx<<','< + + +__global__ +void toGlobal(SOAFrame const * frame, + float const * xl, float const * yl, + float * x, float * y, float * z, + uint32_t n) +{ + int i = blockDim.x * blockIdx.x + threadIdx.x; + if (i >= n) return; + + frame[0].toGlobal(xl[i],yl[i],x[i],y[i],z[i]); + + +} + +#include +#include +#include "cuda/api_wrappers.h" + + +void toGlobalWrapper(SOAFrame const * frame, + float const * xl, float const * yl, + float * x, float * y, float * z, + uint32_t n) { + + int threadsPerBlock = 256; + int blocksPerGrid = (n + threadsPerBlock - 1) / threadsPerBlock; + std::cout + << "CUDA toGlobal kernel launch with " << blocksPerGrid + << " blocks of " << threadsPerBlock << " threads" << std::endl; + + cuda::launch( + toGlobal, + { blocksPerGrid, threadsPerBlock }, + frame, xl, yl, x, y, z, + n + ); + +} + diff --git a/DataFormats/GeometrySurface/test/gpuFrameTransformTest.cpp b/DataFormats/GeometrySurface/test/gpuFrameTransformTest.cpp new file mode 100644 index 0000000000000..c1d5294af9f37 --- /dev/null +++ b/DataFormats/GeometrySurface/test/gpuFrameTransformTest.cpp @@ -0,0 +1,126 @@ +#include "DataFormats/GeometrySurface/interface/SOARotation.h" +#include + + + +void toGlobalWrapper(SOAFrame const * frame, + float const * xl, float const * yl, + float * x, float * y, float * z, + uint32_t n); + + + +#include "DataFormats/GeometrySurface/interface/TkRotation.h" +#include "DataFormats/GeometrySurface/interface/GloballyPositioned.h" + + +#include "cuda/api_wrappers.h" + + +#include +#include +#include +#include +#include +#include + + + +#include +#include + +int main(void) +{ + + typedef float T; + typedef TkRotation Rotation; + typedef SOARotation SRotation; + typedef GloballyPositioned Frame; + typedef SOAFrame SFrame; + typedef typename Frame::PositionType Position; + typedef typename Frame::GlobalVector GlobalVector; + typedef typename Frame::GlobalPoint GlobalPoint; + typedef typename Frame::LocalVector LocalVector; + typedef typename Frame::LocalPoint LocalPoint; + + + + if (cuda::device::count() == 0) { + std::cerr << "No CUDA devices on this system" << "\n"; + exit(EXIT_FAILURE); + } + + + + constexpr uint32_t size = 10000; + constexpr uint32_t size32 = size*sizeof(float); + + + float xl[size],yl[size]; + float x[size],y[size],z[size]; + // float xh[size],yh[size],zh[size]; + + + + + auto current_device = cuda::device::current::get(); + auto d_xl = cuda::memory::device::make_unique(current_device, size); + auto d_yl = cuda::memory::device::make_unique(current_device, size); + + auto d_x = cuda::memory::device::make_unique(current_device, size); + auto d_y = cuda::memory::device::make_unique(current_device, size); + auto d_z = cuda::memory::device::make_unique(current_device, size); + + double a = 0.01; + double ca = std::cos(a); + double sa = std::sin(a); + + Rotation r1(ca, sa, 0, + -sa, ca, 0, + 0, 0, 1); + Frame f1(Position(2,3,4), r1); + std::cout << "f1.position() " << f1.position() << std::endl; + std::cout << "f1.rotation() " << '\n' << f1.rotation() << std::endl; + + SFrame sf1(f1.position().x(), + f1.position().y(), + f1.position().z(), + f1.rotation() + ); + + + // auto d_sf = cuda::memory::device::make_unique(current_device, 1); + auto d_sf = cuda::memory::device::make_unique(current_device, sizeof(SFrame)); + cuda::memory::copy(d_sf.get(), &sf1, sizeof(SFrame)); + + + + for (auto i=0U; i + diff --git a/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.cu b/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.cu index 5e82b1ac00fea..b5d5bb0be9548 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.cu +++ b/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.cu @@ -8,6 +8,11 @@ * **/ +#include "RecoLocalTracker/SiPixelClusterizer/plugins/gpuCalibPixel.h" +#include "RecoLocalTracker/SiPixelClusterizer/plugins/gpuClustering.h" + + + // System includes #include #include @@ -32,33 +37,40 @@ #include "RawToDigiGPU.h" #include "SiPixelFedCablingMapGPU.h" - context initDeviceMemory() { + + using namespace gpuClustering; context c; // Number of words for all the feds constexpr uint32_t MAX_WORD08_SIZE = MAX_FED * MAX_WORD * sizeof(uint8_t); constexpr uint32_t MAX_WORD32_SIZE = MAX_FED * MAX_WORD * sizeof(uint32_t); constexpr uint32_t MAX_WORD16_SIZE = MAX_FED * MAX_WORD * sizeof(uint16_t); - constexpr uint32_t MSIZE = NMODULE*sizeof(int)+sizeof(int); cudaCheck(cudaMalloc((void**) & c.word_d, MAX_WORD32_SIZE)); cudaCheck(cudaMalloc((void**) & c.fedId_d, MAX_WORD08_SIZE)); cudaCheck(cudaMalloc((void**) & c.pdigi_d, MAX_WORD32_SIZE)); // to store thepacked digi cudaCheck(cudaMalloc((void**) & c.xx_d, MAX_WORD16_SIZE)); // to store the x and y coordinate cudaCheck(cudaMalloc((void**) & c.yy_d, MAX_WORD16_SIZE)); - cudaCheck(cudaMalloc((void**) & c.xx_adc, MAX_WORD16_SIZE)); // to store the x and y coordinate - cudaCheck(cudaMalloc((void**) & c.yy_adc, MAX_WORD16_SIZE)); cudaCheck(cudaMalloc((void**) & c.adc_d, MAX_WORD16_SIZE)); - cudaCheck(cudaMalloc((void**) & c.layer_d, MAX_WORD16_SIZE)); + + cudaCheck(cudaMalloc((void**) & c.moduleInd_d, MAX_WORD16_SIZE)); cudaCheck(cudaMalloc((void**) & c.rawIdArr_d, MAX_WORD32_SIZE)); cudaCheck(cudaMalloc((void**) & c.errType_d, MAX_WORD32_SIZE)); cudaCheck(cudaMalloc((void**) & c.errWord_d, MAX_WORD32_SIZE)); cudaCheck(cudaMalloc((void**) & c.errFedID_d, MAX_WORD32_SIZE)); cudaCheck(cudaMalloc((void**) & c.errRawID_d, MAX_WORD32_SIZE)); - cudaCheck(cudaMalloc((void**) & c.moduleId_d, MAX_WORD32_SIZE)); - cudaCheck(cudaMalloc((void**) & c.mIndexStart_d, MSIZE)); - cudaCheck(cudaMalloc((void**) & c.mIndexEnd_d, MSIZE)); + + + // for the clusterizer + cudaCheck(cudaMalloc((void**) & c.clus_d, MAX_WORD32_SIZE)); // cluser index in module + + cudaCheck(cudaMalloc((void**) & c.moduleStart_d, (MaxNumModules+1)*sizeof(uint32_t) )); + cudaCheck(cudaMalloc((void**) & c.clusInModule_d, (MaxNumModules)*sizeof(uint32_t) )); + cudaCheck(cudaMalloc((void**) & c.moduleId_d, (MaxNumModules)*sizeof(uint32_t) )); + + cudaCheck(cudaMalloc((void**) & c.debug_d, MAX_WORD32_SIZE)); + // create a CUDA stream cudaCheck(cudaStreamCreate(&c.stream)); @@ -74,17 +86,21 @@ void freeMemory(context & c) { cudaCheck(cudaFree(c.pdigi_d)); cudaCheck(cudaFree(c.xx_d)); cudaCheck(cudaFree(c.yy_d)); - cudaCheck(cudaFree(c.xx_adc)); - cudaCheck(cudaFree(c.yy_adc)); cudaCheck(cudaFree(c.adc_d)); - cudaCheck(cudaFree(c.layer_d)); + cudaCheck(cudaFree(c.moduleInd_d)); cudaCheck(cudaFree(c.rawIdArr_d)); cudaCheck(cudaFree(c.errType_d)); cudaCheck(cudaFree(c.errWord_d)); cudaCheck(cudaFree(c.errFedID_d)); cudaCheck(cudaFree(c.errRawID_d)); - cudaCheck(cudaFree(c.mIndexStart_d)); - cudaCheck(cudaFree(c.mIndexEnd_d)); + + // these are for the clusterizer (to be moved) + cudaCheck(cudaFree(c.moduleStart_d)); + cudaCheck(cudaFree(c.clus_d)); + cudaCheck(cudaFree(c.clusInModule_d)); + cudaCheck(cudaFree(c.moduleId_d)); + cudaCheck(cudaFree(c.debug_d)); + // destroy the CUDA stream cudaCheck(cudaStreamDestroy(c.stream)); @@ -436,8 +452,7 @@ __device__ uint32_t getErrRawID(uint32_t fedId, uint32_t errWord, uint32_t error // Kernel to perform Raw to Digi conversion __global__ void RawToDigi_kernel(const SiPixelFedCablingMapGPU *Map, const uint32_t wordCounter, const uint32_t *Word, const uint8_t *fedIds, uint16_t * XX, uint16_t * YY, uint16_t * ADC, - uint32_t * pdigi, uint32_t *moduleId, int *mIndexStart, - int *mIndexEnd, uint16_t *layerArr, uint32_t *rawIdArr, + uint32_t * pdigi, uint32_t *rawIdArr, uint16_t * moduleId, uint32_t *errType, uint32_t *errWord, uint32_t *errFedID, uint32_t *errRawID, bool useQualityInfo, bool includeErrors, bool debug) { @@ -448,13 +463,17 @@ __global__ void RawToDigi_kernel(const SiPixelFedCablingMapGPU *Map, const uint3 bool skipROC = false; //if (threadId==0) printf("Event: %u blockId: %u start: %u end: %u\n", eventno, blockId, begin, end); - for (int aaa=0; aaa<1; ++aaa) { + for (int aaa=0; aaa<1; ++aaa) { // too many coninue below.... (to be fixed) auto gIndex = threadId + blockId*blockDim.x; if (gIndex < wordCounter) { uint32_t fedId = fedIds[gIndex/2]; // +1200; + + // initialize (too many coninue below) pdigi[gIndex] = 0; rawIdArr[gIndex] = 0; + moduleId[gIndex] = 9999; + uint32_t ww = Word[gIndex]; // Array containing 32 bit raw data if (includeErrors) { @@ -468,8 +487,6 @@ __global__ void RawToDigi_kernel(const SiPixelFedCablingMapGPU *Map, const uint3 XX[gIndex] = 0; // 0 is an indicator of a noise/dead channel YY[gIndex] = 0; // skip these pixels during clusterization ADC[gIndex] = 0; - layerArr[gIndex] = 0; - moduleId[gIndex] = 9999; //9999 is the indication of bad module, taken care later continue ; // 0: bad word } @@ -566,94 +583,28 @@ __global__ void RawToDigi_kernel(const SiPixelFedCablingMapGPU *Map, const uint3 YY[gIndex] = globalPix.col ; // origin shifting by 1 0-415 ADC[gIndex] = getADC(ww); pdigi[gIndex] = pack(globalPix.row,globalPix.col,ADC[gIndex]); - layerArr[gIndex] = layer; moduleId[gIndex] = detId.moduleId; rawIdArr[gIndex] = rawId; } // end of if (gIndex < end) } // end fake loop - /* - * VI what below is either WRONG, or badly coded or just useless - - __syncthreads(); - - for(int i = 0; i < no_itr; i++) { - uint32_t gIndex = begin + threadId + i*blockDim.x; - - if (gIndex < end) { - // moduleId== 9999 then pixel is bad with x=y=layer=adc=0 - // this bad pixel will not affect the cluster, since for cluster - // the origin is shifted at (1,1) so x=y=0 will be ignored - // assign the previous valid moduleId to this pixel to remove 9999 - // so that we can get the start & end index of module easily. - - if (moduleId[gIndex] == 9999) { - int m=gIndex; - while(moduleId[--m] == 9999) {} //skip till you get the valid module - moduleId[gIndex] = moduleId[m]; - } - } // end of if (gIndex moduleId[gIndex-1] ) { - mIndexStart[moduleOffset+ moduleId[gIndex]] = gIndex; - } - } //end of if (gIndex!= begin && (gIndex<(end-1)) ... - } //end of if (gIndex >>( + c.moduleInd_d, + c.xx_d, c.yy_d, c.adc_d, + ped, + wordCounter + ); + + cudaCheck(cudaGetLastError()); + + std::cout + << "CUDA countModules kernel launch with " << blocks + << " blocks of " << threadsPerBlock << " threads\n"; + + + uint32_t nModules=0; + cudaCheck(cudaMemcpyAsync(c.moduleStart_d, &nModules, sizeof(uint32_t), cudaMemcpyHostToDevice, c.stream)); + + countModules<<>>(c.moduleInd_d, c.moduleStart_d, c.clus_d, wordCounter); + cudaCheck(cudaGetLastError()); + + cudaCheck(cudaMemcpyAsync(&nModules, c.moduleStart_d, sizeof(uint32_t), cudaMemcpyDeviceToHost, c.stream)); + + std::cout << "found " << nModules << " Modules active" << std::endl; + + + threadsPerBlock = 256; + blocks = nModules; + + std::cout + << "CUDA findClus kernel launch with " << blocks + << " blocks of " << threadsPerBlock << " threads\n"; + + cudaCheck(cudaMemsetAsync(c.clusInModule_d, 0, (MaxNumModules)*sizeof(uint32_t),c.stream)); + + /* + gpuCalibPixel::calibADCByModule<<>>( + c.moduleInd_d, + c.xx_d, c.yy_d, c.adc_d, + c.moduleStart_d, + ped, + wordCounter + ); + */ + + findClus<<>>( + c.moduleInd_d, + c.xx_d, c.yy_d, c.adc_d, + c.moduleStart_d, + c.clusInModule_d, c.moduleId_d, + c.clus_d, + c.debug_d, + wordCounter + ); + + cudaDeviceSynchronize(); + cudaCheck(cudaGetLastError()); + + nModulesActive = nModules; + + } // end clusterizer scope + } diff --git a/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.h b/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.h index 8a8349bb4411e..7eb62c051089a 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.h +++ b/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.h @@ -155,29 +155,33 @@ struct context { uint32_t * pdigi_d; uint16_t * xx_d; uint16_t * yy_d; - uint16_t * xx_adc; - uint16_t * yy_adc; - uint32_t * moduleId_d; uint16_t * adc_d; - uint16_t * layer_d; + + uint16_t * moduleInd_d; uint32_t * rawIdArr_d; uint32_t * errType_d; uint32_t * errWord_d; uint32_t * errFedID_d; uint32_t * errRawID_d; - // store the start and end index for each module (total 1856 modules-phase 1) - int *mIndexStart_d; - int *mIndexEnd_d; + + // these are for the clusterizer (to be moved) + uint32_t * moduleStart_d; + int32_t * clus_d; + uint32_t * clusInModule_d; + uint32_t * moduleId_d; + + uint32_t * debug_d; }; // wrapper function to call RawToDigi on the GPU from host side -void RawToDigi_wrapper(context &, const SiPixelFedCablingMapGPU* cablingMapDevice, const uint32_t wordCounter, uint32_t *word, +void RawToDigi_wrapper(context &, const SiPixelFedCablingMapGPU* cablingMapDevice, SiPixelGainForHLTonGPU * const ped, + const uint32_t wordCounter, uint32_t *word, const uint32_t fedCounter, uint8_t *fedId_h, - bool convertADCtoElectrons, uint32_t * pdigi_h, int *mIndexStart_h, int *mIndexEnd_h, + bool convertADCtoElectrons, uint32_t * pdigi_h, uint32_t *rawIdArr_h, uint32_t *errType_h, uint32_t *errWord_h, uint32_t *errFedID_h, uint32_t *errRawID_h, - bool useQualityInfo, bool includeErrors, bool debug = false); + bool useQualityInfo, bool includeErrors, bool debug, uint32_t & nModulesActive); // void initCablingMap(); context initDeviceMemory(); diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.cc b/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.cc index 33e1ea428e2e6..bf92d541a9488 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.cc +++ b/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.cc @@ -7,15 +7,21 @@ #include +#include "SiPixelFedCablingMapGPU.h" + #include "FWCore/MessageLogger/interface/MessageLogger.h" #include "CondFormats/SiPixelObjects/interface/SiPixelFedCablingMap.h" #include "CondFormats/SiPixelObjects/interface/SiPixelFedCablingTree.h" #include "CondFormats/SiPixelObjects/interface/SiPixelQuality.h" +#include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h" +#include "Geometry/CommonDetUnit/interface/GeomDetType.h" -#include "SiPixelFedCablingMapGPU.h" -#include "SiPixelFedCablingMapGPU.h" +#include "CondFormats/SiPixelObjects/interface/SiPixelGainCalibrationForHLT.h" +#include "CondFormats/SiPixelObjects/interface/SiPixelGainForHLTonGPU.h" -void processCablingMap(SiPixelFedCablingMap const& cablingMap, SiPixelFedCablingMapGPU* cablingMapGPU, SiPixelFedCablingMapGPU* cablingMapDevice, const SiPixelQuality* badPixelInfo, std::set const& modules) { +void processCablingMap(SiPixelFedCablingMap const& cablingMap, TrackerGeometry const& trackerGeom, + SiPixelFedCablingMapGPU* cablingMapGPU, SiPixelFedCablingMapGPU* cablingMapDevice, + const SiPixelQuality* badPixelInfo, std::set const& modules) { std::vector const& fedIds = cablingMap.fedIds(); std::unique_ptr const& cabling = cablingMap.cablingTree(); @@ -27,7 +33,6 @@ void processCablingMap(SiPixelFedCablingMap const& cablingMap, SiPixelFedCabling std::vector moduleId(MAX_SIZE); std::vector badRocs(MAX_SIZE); std::vector modToUnp(MAX_SIZE); - std::set rawIdSet; unsigned int startFed = *(fedIds.begin()); unsigned int endFed = *(fedIds.end() - 1); @@ -46,7 +51,6 @@ void processCablingMap(SiPixelFedCablingMap const& cablingMap, SiPixelFedCabling if (pixelRoc != nullptr) { RawId[index] = pixelRoc->rawId(); rocInDet[index] = pixelRoc->idInDetUnit(); - rawIdSet.insert(RawId[index]); modToUnp[index] = (modules.size() != 0) && (modules.find(pixelRoc->rawId()) == modules.end()); if (badPixelInfo != nullptr) badRocs[index] = badPixelInfo->IsRocBad(pixelRoc->rawId(), pixelRoc->idInDetUnit()); @@ -70,24 +74,22 @@ void processCablingMap(SiPixelFedCablingMap const& cablingMap, SiPixelFedCabling // FedID varies between 1200 to 1338 (In total 108 FED's) // Link varies between 1 to 48 // idinLnk varies between 1 to 8 - std::map detIdMap; - int module = 0; - for (auto it = rawIdSet.begin(); it != rawIdSet.end(); it++) { - detIdMap.emplace(*it, module); - module++; - } + cudaDeviceSynchronize(); + + for (int i = 1; i < index; i++) { if (RawId[i] == 9999) { moduleId[i] = 9999; } else { - auto it = detIdMap.find(RawId[i]); - if (it == detIdMap.end()) { +// std::cout << RawId[i] << std::endl; + auto gdet = trackerGeom.idToDetUnit(RawId[i]); + if (!gdet) { LogDebug("SiPixelFedCablingMapGPU") << " Not found: " << RawId[i] << std::endl; - break; + continue; } - moduleId[i] = it->second; + moduleId[i] = gdet->index(); } LogDebug("SiPixelFedCablingMapGPU") << "----------------------------------------------------------------------------" << std::endl; LogDebug("SiPixelFedCablingMapGPU") << i << std::setw(20) << fedMap[i] << std::setw(20) << linkMap[i] << std::setw(20) << rocMap[i] << std::endl; @@ -109,3 +111,74 @@ void processCablingMap(SiPixelFedCablingMap const& cablingMap, SiPixelFedCabling cudaDeviceSynchronize(); } +void +processGainCalibration(SiPixelGainCalibrationForHLT const & gains, TrackerGeometry const& geom, SiPixelGainForHLTonGPU * & gainsOnGPU, SiPixelGainForHLTonGPU::DecodingStructure * & gainDataOnGPU) { + + + // bizzarre logic (looking for fist strip-det) don't ask + auto const & dus = geom.detUnits(); + unsigned m_detectors = dus.size(); + for(unsigned int i=1;i<7;++i) { + if(geom.offsetDU(GeomDetEnumerators::tkDetEnum[i]) != dus.size() && + dus[geom.offsetDU(GeomDetEnumerators::tkDetEnum[i])]->type().isTrackerStrip()) { + if(geom.offsetDU(GeomDetEnumerators::tkDetEnum[i]) < m_detectors) m_detectors = geom.offsetDU(GeomDetEnumerators::tkDetEnum[i]); + } + } + + std::cout<<"caching calibs for "<(gg.nBinsToUseForEncoding_); + gg.gainPrecision = (gg.maxGain_-gg.minGain_)/static_cast(gg.nBinsToUseForEncoding_); + + std::cout << "precisions g " << gg.pedPrecision << ' ' << gg.gainPrecision << std::endl; + + // fill the index map + auto const & ind = gains.getIndexes(); + std::cout << ind.size() << " " << m_detectors << std::endl; + + for (auto i=0U; igeographicalId().rawId(),SiPixelGainCalibrationForHLT::StrictWeakOrdering()); + assert (p!=ind.end() && p->detid==dus[i]->geographicalId()); + assert(p->iend<=gains.data().size()); + assert(p->iend>=p->ibegin); + assert(0==p->ibegin%2); + assert(0==p->iend%2); + assert(p->ibegin!=p->iend); + assert(p->ncols>0); + gg.rangeAndCols[i] = std::make_pair(SiPixelGainForHLTonGPU::Range(p->ibegin,p->iend), p->ncols); + // if (ind[i].detid!=dus[i]->geographicalId()) std::cout << ind[i].detid<<"!="<geographicalId() << std::endl; + // gg.rangeAndCols[i] = std::make_pair(SiPixelGainForHLTonGPU::Range(ind[i].ibegin,ind[i].iend), ind[i].ncols); + } + + + cudaCheck(cudaMemcpy(gainsOnGPU,&gg,sizeof(SiPixelGainForHLTonGPU), cudaMemcpyHostToDevice)); + + + cudaDeviceSynchronize(); + +} diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.h b/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.h index 881acaeca0370..dc0bc1bf9b0d5 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.h +++ b/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.h @@ -7,6 +7,11 @@ class SiPixelFedCablingMap; class SiPixelQuality; +class TrackerGeometry; + +class SiPixelGainCalibrationForHLT; +class SiPixelGainForHLTonGPU; +struct SiPixelGainForHLTonGPU_DecodingStructure; // Maximum fed for phase1 is 150 but not all of them are filled // Update the number FED based on maximum fed found in the cabling map @@ -58,7 +63,10 @@ void deallocateCablingMap(SiPixelFedCablingMapGPU* cablingMapHost, SiPixelFedCab delete cablingMapHost; } -void processCablingMap(SiPixelFedCablingMap const& cablingMap, SiPixelFedCablingMapGPU* cablingMapGPU, SiPixelFedCablingMapGPU* cablingMapDevice, const SiPixelQuality* badPixelInfo, std::set const& modules); +void processCablingMap(SiPixelFedCablingMap const& cablingMap, TrackerGeometry const& trackerGeom, + SiPixelFedCablingMapGPU* cablingMapGPU, SiPixelFedCablingMapGPU* cablingMapDevice, const SiPixelQuality* badPixelInfo, std::set const& modules); + +void processGainCalibration(SiPixelGainCalibrationForHLT const & gains, TrackerGeometry const& trackerGeom, SiPixelGainForHLTonGPU * & gainsOnGPU, SiPixelGainForHLTonGPU_DecodingStructure * & gainDataOnGPU); #endif // SiPixelFedCablingMapGPU_h diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc index 3ba76af8deea8..a09be4ea2ed42 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc +++ b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc @@ -32,6 +32,10 @@ #include "DataFormats/SiPixelDetId/interface/PixelFEDChannel.h" #include "DataFormats/SiPixelDigi/interface/PixelDigi.h" #include "DataFormats/SiPixelRawData/interface/SiPixelRawDataError.h" + +#include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h" +#include "Geometry/Records/interface/TrackerDigiGeometryRecord.h" + #include "EventFilter/SiPixelRawToDigi/interface/PixelDataFormatter.h" #include "EventFilter/SiPixelRawToDigi/interface/PixelUnpackingRegions.h" #include "FWCore/Framework/interface/ConsumesCollector.h" @@ -43,6 +47,7 @@ #include "FWCore/PluginManager/interface/ModuleDef.h" #include "FWCore/Framework/interface/MakerMacros.h" + #include "EventInfoGPU.h" #include "RawToDigiGPU.h" #include "SiPixelFedCablingMapGPU.h" @@ -56,7 +61,8 @@ SiPixelRawToDigiGPU::SiPixelRawToDigiGPU( const edm::ParameterSet& conf ) : config_(conf), badPixelInfo_(nullptr), regions_(nullptr), - hCPU(nullptr), hDigi(nullptr) + hCPU(nullptr), hDigi(nullptr), + theSiPixelGainCalibration_(conf) { includeErrors = config_.getParameter("IncludeErrors"); @@ -69,6 +75,7 @@ SiPixelRawToDigiGPU::SiPixelRawToDigiGPU( const edm::ParameterSet& conf ) } tFEDRawDataCollection = consumes (config_.getParameter("InputLabel")); + //start counters ndigis = 0; nwords = 0; @@ -82,6 +89,9 @@ SiPixelRawToDigiGPU::SiPixelRawToDigiGPU( const edm::ParameterSet& conf ) produces >(); } + //GPU "product" + produces>(); + // regions if (config_.exists("Regions")) { if (!config_.getParameter("Regions").getParameterNames().empty()) @@ -174,6 +184,11 @@ SiPixelRawToDigiGPU::~SiPixelRawToDigiGPU() { // release device memory for cabling map deallocateCablingMap(cablingMapGPUHost_, cablingMapGPUDevice_); + // free gains device memory + cudaCheck(cudaFree(gainForHLTonGPU_)); + cudaCheck(cudaFree(gainDataOnGPU_)); + + // free device memory used for RawToDigi on GPU freeMemory(context_); @@ -222,6 +237,11 @@ SiPixelRawToDigiGPU::fillDescriptions(edm::ConfigurationDescriptions& descriptio void SiPixelRawToDigiGPU::produce( edm::Event& ev, const edm::EventSetup& es) { + + //Setup gain calibration service + theSiPixelGainCalibration_.setESObjects( es ); + + int theWordCounter = 0; int theDigiCounter = 0; const uint32_t dummydetid = 0xffffffff; @@ -249,14 +269,23 @@ SiPixelRawToDigiGPU::produce( edm::Event& ev, const edm::EventSetup& es) // initialize cabling map or update if necessary if (recordWatcher.check( es )) { + // tracker geometry: to make sure numbering of DetId is consistent... + edm::ESHandle geom; + // get the TrackerGeom + es.get().get( geom ); + // cabling map, which maps online address (fed->link->ROC->local pixel) to offline (DetId->global pixel) edm::ESTransientHandle cablingMap; es.get().get( cablingMapLabel, cablingMap ); //Tav fedIds = cablingMap->fedIds(); cabling_ = cablingMap->cablingTree(); LogDebug("map version:") << cabling_->version(); + // convert the cabling map to a GPU-friendly version - processCablingMap(*cablingMap, cablingMapGPUHost_, cablingMapGPUDevice_, badPixelInfo_, modules); + processCablingMap(*cablingMap, *geom.product(), cablingMapGPUHost_, cablingMapGPUDevice_, badPixelInfo_, modules); + + processGainCalibration(theSiPixelGainCalibration_.payload(), *geom.product(), gainForHLTonGPU_, gainDataOnGPU_); + } edm::Handle buffers; @@ -349,13 +378,20 @@ SiPixelRawToDigiGPU::produce( edm::Event& ev, const edm::EventSetup& es) } // end of for loop - // GPU specific: RawToDigi -> clustering -> CPE + // GPU specific: RawToDigi -> clustering + uint32_t nModulesActive=0; + RawToDigi_wrapper(context_, cablingMapGPUDevice_, gainForHLTonGPU_, wordCounterGPU, word, fedCounter, fedId_h, convertADCtoElectrons, pdigi_h, + rawIdArr_h, errType_h, errWord_h, errFedID_h, errRawID_h, useQuality, includeErrors, debug,nModulesActive); - RawToDigi_wrapper(context_, cablingMapGPUDevice_, wordCounterGPU, word, fedCounter, fedId_h, convertADCtoElectrons, pdigi_h, mIndexStart_h, mIndexEnd_h, - rawIdArr_h, errType_h, errWord_h, errFedID_h, errRawID_h, useQuality, includeErrors, debug); + auto gpuProd = std::make_unique>(); + gpuProd->resize(3); + (*gpuProd)[0]=uint64_t(&context_); + (*gpuProd)[1]=wordCounterGPU; + (*gpuProd)[2]=nModulesActive; + ev.put(std::move(gpuProd)); for (uint32_t i = 0; i < wordCounterGPU; i++) { diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.h b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.h index 868921c96e9dc..5b56edaab9282 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.h +++ b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.h @@ -14,6 +14,10 @@ #include "CondFormats/DataRecord/interface/SiPixelFedCablingMapRcd.h" #include "CondFormats/DataRecord/interface/SiPixelQualityRcd.h" #include "DataFormats/FEDRawData/interface/FEDRawDataCollection.h" + +#include "CalibTracker/SiPixelESProducers/interface/SiPixelGainCalibrationForHLTService.h" + + #include "FWCore/Framework/interface/ConsumesCollector.h" #include "FWCore/Utilities/interface/CPUTimer.h" #include "RawToDigiGPU.h" @@ -24,6 +28,8 @@ class SiPixelQuality; class TH1D; class PixelUnpackingRegions; +class SiPixelGainForHLTonGPU; +struct SiPixelGainForHLTonGPU_DecodingStructure; class SiPixelRawToDigiGPU : public edm::stream::EDProducer<> { public: @@ -76,6 +82,12 @@ class SiPixelRawToDigiGPU : public edm::stream::EDProducer<> { context context_; SiPixelFedCablingMapGPU * cablingMapGPUHost_; SiPixelFedCablingMapGPU * cablingMapGPUDevice_; + + // gain calib + SiPixelGainCalibrationForHLTService theSiPixelGainCalibration_; + SiPixelGainForHLTonGPU * gainForHLTonGPU_ = nullptr; + SiPixelGainForHLTonGPU_DecodingStructure * gainDataOnGPU_ = nullptr; + }; #endif diff --git a/EventFilter/SiPixelRawToDigi/plugins/cudaCheck.h b/EventFilter/SiPixelRawToDigi/plugins/cudaCheck.h index 374ff5063b26f..c2689f7016d43 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/cudaCheck.h +++ b/EventFilter/SiPixelRawToDigi/plugins/cudaCheck.h @@ -2,6 +2,7 @@ #define EventFilter_SiPixelRawToDigi_cudaCheck_h #include +#include inline bool cudaCheck_(const char* file, int line, const char* cmd, CUresult result) diff --git a/Geometry/TrackerGeometryBuilder/interface/phase1PixelTopology.h b/Geometry/TrackerGeometryBuilder/interface/phase1PixelTopology.h new file mode 100644 index 0000000000000..ecc5889a28481 --- /dev/null +++ b/Geometry/TrackerGeometryBuilder/interface/phase1PixelTopology.h @@ -0,0 +1,79 @@ +#pragma once + +#include + +namespace phase1PixelTopology { + + constexpr uint16_t numRowsInRoc = 80; + constexpr uint16_t numColsInRoc = 52; + constexpr uint16_t lastRowInRoc = 79; + constexpr uint16_t lastColInRoc = 51; + + constexpr uint16_t numRowsInModule = 2*80; + constexpr uint16_t numColsInModule = 8*52; + constexpr uint16_t lastRowInModule = 2*80-1; + constexpr uint16_t lastColInModule = 8*52-1; + + constexpr int16_t xOffset = -81; + constexpr int16_t yOffset = -54*4; + + + constexpr uint32_t numPixsInModule = uint32_t(numRowsInModule)* uint32_t(numColsInModule); + + + // this is for the ROC n<512 (upgrade 1024) + constexpr inline + uint16_t divu52(uint16_t n) { + n = n>>2; + uint16_t q = (n>>1) + (n>>4); + q = q + (q>>4) + (q>>5); q = q >> 3; + uint16_t r = n - q*13; + return q + ((r + 3) >> 4); + // return q + (r > 12); + } + + constexpr inline + bool isEdgeX(uint16_t px) { return (px==0) | (px==lastRowInModule);} + constexpr inline + bool isEdgeY(uint16_t py) { return (py==0) | (py==lastColInModule);} + + + constexpr inline + uint16_t toRocX(uint16_t px) { return (pxlastRowInRoc) shift+=1; + if (px>numRowsInRoc) shift+=1; + return px+shift; + } + + constexpr inline + uint16_t localY(uint16_t py) { + auto roc = divu52(py); + auto shift = 2*roc; + auto yInRoc = py - 52*roc; + if (yInRoc>0) shift+=1; + return py+shift; + } + +} + diff --git a/Geometry/TrackerGeometryBuilder/test/BuildFile.xml b/Geometry/TrackerGeometryBuilder/test/BuildFile.xml index 949f4d81bc9a9..f49fb540117d1 100644 --- a/Geometry/TrackerGeometryBuilder/test/BuildFile.xml +++ b/Geometry/TrackerGeometryBuilder/test/BuildFile.xml @@ -27,3 +27,7 @@ + + + + diff --git a/Geometry/TrackerGeometryBuilder/test/phase1PixelTopology_t.cpp b/Geometry/TrackerGeometryBuilder/test/phase1PixelTopology_t.cpp new file mode 100644 index 0000000000000..293febbbc7143 --- /dev/null +++ b/Geometry/TrackerGeometryBuilder/test/phase1PixelTopology_t.cpp @@ -0,0 +1,146 @@ +#include "Geometry/TrackerGeometryBuilder/interface/phase1PixelTopology.h" +#include +#include + +namespace { + + // original code from CMSSW_4_4 + + std::tuple localXori(int mpx) { + const float m_pitchx=1.f; + int binoffx = int(mpx); // truncate to int + float local_pitchx = m_pitchx; // defaultpitch + + if (binoffx>80) { // ROC 1 - handles x on edge cluster + binoffx=binoffx+2; + } else if (binoffx==80) { // ROC 1 + binoffx=binoffx+1; + local_pitchx = 2 * m_pitchx; + + } else if (binoffx==79) { // ROC 0 + binoffx=binoffx+0; + local_pitchx = 2 * m_pitchx; + } else if (binoffx>=0) { // ROC 0 + binoffx=binoffx+0; + + } else { // too small + assert("binoffx too small"==0); + } + + return std::make_tuple(binoffx,local_pitchx>m_pitchx); + } + + + std::tuple localYori(int mpy) { + const float m_pitchy=1.f; + int binoffy = int(mpy); // truncate to int + float local_pitchy = m_pitchy; // defaultpitch + + if (binoffy>416) { // ROC 8, not real ROC + binoffy=binoffy+17; + } else if (binoffy==416) { // ROC 8 + binoffy=binoffy+16; + local_pitchy = 2 * m_pitchy; + + } else if (binoffy==415) { // ROC 7, last big pixel + binoffy=binoffy+15; + local_pitchy = 2 * m_pitchy; + } else if (binoffy>364) { // ROC 7 + binoffy=binoffy+15; + } else if (binoffy==364) { // ROC 7 + binoffy=binoffy+14; + local_pitchy = 2 * m_pitchy; + + } else if (binoffy==363) { // ROC 6 + binoffy=binoffy+13; + local_pitchy = 2 * m_pitchy; + } else if (binoffy>312) { // ROC 6 + binoffy=binoffy+13; + } else if (binoffy==312) { // ROC 6 + binoffy=binoffy+12; + local_pitchy = 2 * m_pitchy; + + } else if (binoffy==311) { // ROC 5 + binoffy=binoffy+11; + local_pitchy = 2 * m_pitchy; + } else if (binoffy>260) { // ROC 5 + binoffy=binoffy+11; + } else if (binoffy==260) { // ROC 5 + binoffy=binoffy+10; + local_pitchy = 2 * m_pitchy; + + } else if (binoffy==259) { // ROC 4 + binoffy=binoffy+9; + local_pitchy = 2 * m_pitchy; + } else if (binoffy>208) { // ROC 4 + binoffy=binoffy+9; + } else if (binoffy==208) { // ROC 4 + binoffy=binoffy+8; + local_pitchy = 2 * m_pitchy; + + } else if (binoffy==207) { // ROC 3 + binoffy=binoffy+7; + local_pitchy = 2 * m_pitchy; + } else if (binoffy>156) { // ROC 3 + binoffy=binoffy+7; + } else if (binoffy==156) { // ROC 3 + binoffy=binoffy+6; + local_pitchy = 2 * m_pitchy; + + } else if (binoffy==155) { // ROC 2 + binoffy=binoffy+5; + local_pitchy = 2 * m_pitchy; + } else if (binoffy>104) { // ROC 2 + binoffy=binoffy+5; + } else if (binoffy==104) { // ROC 2 + binoffy=binoffy+4; + local_pitchy = 2 * m_pitchy; + + } else if (binoffy==103) { // ROC 1 + binoffy=binoffy+3; + local_pitchy = 2 * m_pitchy; + } else if (binoffy>52) { // ROC 1 + binoffy=binoffy+3; + } else if (binoffy==52) { // ROC 1 + binoffy=binoffy+2; + local_pitchy = 2 * m_pitchy; + + } else if (binoffy==51) { // ROC 0 + binoffy=binoffy+1; + local_pitchy = 2 * m_pitchy; + } else if (binoffy>0) { // ROC 0 + binoffy=binoffy+1; + } else if (binoffy==0) { // ROC 0 + binoffy=binoffy+0; + local_pitchy = 2 * m_pitchy; + } else { + assert("binoffy too small"==0); + } + + return std::make_tuple(binoffy,local_pitchy>m_pitchy); + } + +} + +#include +int main() { + + for (uint16_t ix=0; ix<80*2; ++ix) { + auto ori = localXori(ix); + auto xl = phase1PixelTopology::localX(ix); + auto bp = phase1PixelTopology::isBigPixX(ix); + if (std::get<0>(ori)!=xl) std::cout << "Error " << std::get<0>(ori) << "!=" << xl << std::endl; + assert(std::get<1>(ori)==bp); + } + + for (uint16_t iy=0; iy<52*8; ++iy) { + auto ori = localYori(iy); + auto yl = phase1PixelTopology::localY(iy); + auto bp = phase1PixelTopology::isBigPixY(iy); + if (std::get<0>(ori)!=yl) std::cout << "Error " << std::get<0>(ori) << "!=" << yl << std::endl; + assert(std::get<1>(ori)==bp); + } + + + return 0; +} diff --git a/RecoLocalTracker/SiPixelClusterizer/plugins/gpuCalibPixel.h b/RecoLocalTracker/SiPixelClusterizer/plugins/gpuCalibPixel.h new file mode 100644 index 0000000000000..fd2b28a4719e8 --- /dev/null +++ b/RecoLocalTracker/SiPixelClusterizer/plugins/gpuCalibPixel.h @@ -0,0 +1,125 @@ +#pragma once + +#include "CondFormats/SiPixelObjects/interface/SiPixelGainForHLTonGPU.h" + +#include +#include +#include + +namespace gpuCalibPixel { + + constexpr uint16_t InvId=9999; // must be > MaxNumModules + + constexpr float VCaltoElectronGain = 47; // L2-4: 47 +- 4.7 + constexpr float VCaltoElectronGain_L1 = 50; // L1: 49.6 +- 2.6 + constexpr float VCaltoElectronOffset = -60; // L2-4: -60 +- 130 + constexpr float VCaltoElectronOffset_L1 = -670; // L1: -670 +- 220 + + + __global__ void calibDigis(uint16_t * id, + uint16_t const * x, + uint16_t const * y, + uint16_t * adc, + SiPixelGainForHLTonGPU const * ped, + int numElements + ) +{ + + int i = blockDim.x * blockIdx.x + threadIdx.x; + if (i >= numElements) return; + if (InvId==id[i]) return; + + float conversionFactor = id[i]<96 ? VCaltoElectronGain_L1 : VCaltoElectronGain; + float offset = id[i]<96 ? VCaltoElectronOffset_L1 : VCaltoElectronOffset; + + bool isDeadColumn=false, isNoisyColumn=false; + + int row = x[i]; + int col = y[i]; + auto ret = ped->getPedAndGain(id[i], col, row, isDeadColumn, isNoisyColumn); + float pedestal = ret.first; float gain = ret.second; + // float pedestal = 0; float gain = 1.; + if ( isDeadColumn | isNoisyColumn ) + { + id[i]=InvId; adc[i] =0; + printf("bad pixel at %d in %d\n",i,id[i]); + } + else { + float vcal = adc[i] * gain - pedestal*gain; + adc[i] = std::max(100, int( vcal * conversionFactor + offset)); + } + + // if (threadIdx.x==0) + // printf ("calibrated %d\n",id[i]); + + __syncthreads(); + +} + + __global__ void calibADCByModule(uint16_t * id, + uint16_t const * x, + uint16_t const * y, + uint16_t * adc, + uint32_t * moduleStart, + SiPixelGainForHLTonGPU const * ped, + int numElements + ) +{ + + + auto first = moduleStart[1 + blockIdx.x]; + + auto me = id[first]; + + assert(me<2000); + + /// depends on "me" + + float conversionFactor = me<96 ? VCaltoElectronGain_L1 : VCaltoElectronGain; + float offset = me<96 ? VCaltoElectronOffset_L1 : VCaltoElectronOffset; + + +#ifdef GPU_DEBUG + if (me%100==1) + if (threadIdx.x==0) printf("start pixel calibration for module %d in block %d\n",me,blockIdx.x); +#endif + + first+=threadIdx.x; + + // __syncthreads(); + + float pedestal=0,gain=0; + bool isDeadColumn=false, isNoisyColumn=false; + int oldCol=-1, oldAveragedBlock=-1; + + for (int i=first; inumberOfRowsAveragedOver_; // 80.... ( row<80 will be faster...) + if ( (col!=oldCol) | ( averagedBlock != oldAveragedBlock) ) { + oldCol=col; oldAveragedBlock= averagedBlock; + auto ret = ped->getPedAndGain(me,col, row, isDeadColumn, isNoisyColumn); + pedestal = ret.first; gain = ret.second; + } + if ( isDeadColumn | isNoisyColumn ) + { id[i]=InvId; adc[i] =0; } + else { + float vcal = adc[i] * gain - pedestal*gain; + adc[i] = std::max(100, int( vcal * conversionFactor + offset)); + } + } + + __syncthreads(); + //reset start + if(0==threadIdx.x) { + auto & k = moduleStart[1 + blockIdx.x]; + while (id[k]==InvId) ++k; + } + + + } + + +} diff --git a/RecoLocalTracker/SiPixelClusterizer/plugins/gpuClustering.h b/RecoLocalTracker/SiPixelClusterizer/plugins/gpuClustering.h new file mode 100644 index 0000000000000..5ac7375e008cc --- /dev/null +++ b/RecoLocalTracker/SiPixelClusterizer/plugins/gpuClustering.h @@ -0,0 +1,168 @@ +#pragma once + +#include +#include +#include + +namespace gpuClustering { + + constexpr uint32_t MaxNumModules = 2000; + + constexpr uint32_t MaxNumPixels = 256*2000; // this does not mean maxPixelPerModule==256! + + constexpr uint16_t InvId=9999; // must be > MaxNumModules + + __global__ void countModules(uint16_t const * id, + uint32_t * moduleStart, + int32_t * clus, + int numElements){ + + int i = blockDim.x * blockIdx.x + threadIdx.x; + if (i >= numElements) return; + clus[i]=i; + if (InvId==id[i]) return; + auto j=i-1; + while(j>=0 && id[j]==InvId) --j; + if(j<0 || id[j]!=id[i]) { + // boundary... + auto loc = atomicInc(moduleStart,MaxNumModules); + moduleStart[loc+1]=i; + } + } + + + __global__ void findClus(uint16_t const * id, + uint16_t const * x, + uint16_t const * y, + uint16_t const * adc, + uint32_t const * moduleStart, + uint32_t * clusInModule, uint32_t * moduleId, + int32_t * clus, uint32_t * debug, + int numElements){ + + __shared__ bool go; + __shared__ int nclus; + + __shared__ int msize; + + auto first = moduleStart[1 + blockIdx.x]; + + auto me = id[first]; + + assert(me=numElements) return; + + go=true; + nclus=0; + + msize=numElements; + __syncthreads(); + + for (int i=first; i=msize) return; + + int jmax[10]; + auto niter = (msize-first)/blockDim.x; + assert(niter<10); + for (int i=0; i1) continue; + if (std::abs(int(y[j])-int(y[i]))>1) continue; + auto old = atomicMin(&clus[j],clus[i]); + if (old!=clus[i]) go=true; + atomicMin(&clus[i],old); + jmax[k]=j+1; + } + } + assert (k<=niter); + __syncthreads(); + } + + /* + // fast count (nice but not much useful) + auto laneId = threadIdx.x & 0x1f; + + for (int i=first; i=0) clus[i]=clus[clus[i]]; + } + + __syncthreads(); + for (int i=first; i + + + + + + diff --git a/RecoLocalTracker/SiPixelClusterizer/test/gpuClustering.cu b/RecoLocalTracker/SiPixelClusterizer/test/gpuClustering.cu new file mode 100644 index 0000000000000..ae0359cd683e0 --- /dev/null +++ b/RecoLocalTracker/SiPixelClusterizer/test/gpuClustering.cu @@ -0,0 +1,262 @@ +#include "RecoLocalTracker/SiPixelClusterizer/plugins/gpuClustering.h" + + +#include "cuda/api_wrappers.h" + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include + + + + +int main(void) +{ + if (cuda::device::count() == 0) { + std::cerr << "No CUDA devices on this system" << "\n"; + exit(EXIT_FAILURE); + } + + + using namespace gpuClustering; + + int numElements = MaxNumPixels; + + + // these in reality are already on GPU + auto h_id = std::make_unique(numElements); + auto h_x = std::make_unique(numElements); + auto h_y = std::make_unique(numElements); + auto h_adc = std::make_unique(numElements); + + auto h_clus = std::make_unique(numElements); + + auto h_debug = std::make_unique(numElements); + + + auto current_device = cuda::device::current::get(); + auto d_id = cuda::memory::device::make_unique(current_device, numElements); + auto d_x = cuda::memory::device::make_unique(current_device, numElements); + auto d_y = cuda::memory::device::make_unique(current_device, numElements); + auto d_adc = cuda::memory::device::make_unique(current_device, numElements); + + auto d_clus = cuda::memory::device::make_unique(current_device, numElements); + + auto d_moduleStart = cuda::memory::device::make_unique(current_device, MaxNumModules+1); + + auto d_clusInModule = cuda::memory::device::make_unique(current_device, MaxNumModules); + auto d_moduleId = cuda::memory::device::make_unique(current_device, MaxNumModules); + + auto d_debug = cuda::memory::device::make_unique(current_device, numElements); + + + // later random number + int n=0; + int ncl=0; + int y[10]={5,7,9,1,3,0,4,8,2,6}; + + { + // isolated + int id = 42; + int x = 10; + ++ncl; + h_id[n]=id; + h_x[n]=x; + h_y[n]=x; + h_adc[n]=100; + ++n; + // diagonal + ++ncl; + for (int x=20; x<25; ++x) { + h_id[n]=id; + h_x[n]=x; + h_y[n]=x; + h_adc[n]=100; + ++n; + } + ++ncl; + // reversed + for (int x=45; x>40; --x) { + h_id[n]=id; + h_x[n]=x; + h_y[n]=x; + h_adc[n]=100; + ++n; + } + ++ncl; + h_id[n++]=InvId; // error + // messy + int xx[5] = {21,25,23,24,22}; + for (int k=0; k<5; ++k) { + h_id[n]=id; + h_x[n]=xx[k]; + h_y[n]=20+xx[k]; + h_adc[n]=100; + ++n; + } + // holes + ++ncl; + for (int k=0; k<5; ++k) { + h_id[n]=id; + h_x[n]=xx[k]; + h_y[n]=100; + h_adc[n]=100; + ++n; + if (xx[k]%2==0) { + h_id[n]=id; + h_x[n]=xx[k]; + h_y[n]=101; + h_adc[n]=100; + ++n; + } + } + } + { + // id == 0 (make sure it works! + int id = 0; + int x = 10; + ++ncl; + h_id[n]=id; + h_x[n]=x; + h_y[n]=x; + h_adc[n]=100; + ++n; + } + + + // all odd id + for(int id=11; id<=1800; id+=2) { + if ( (id/20)%2) h_id[n++]=InvId; // error + for (int x=0; x<40; x+=4) { + ++ncl; + if ((id/10)%2) { + for (int k=0; k<10; ++k) { + h_id[n]=id; + h_x[n]=x; + h_y[n]=x+y[k]; + h_adc[n]=100; + ++n; + h_id[n]=id; + h_x[n]=x+1; + h_y[n]=x+y[k]+2; + h_adc[n]=100; + ++n; + } + } else { + for (int k=0; k<10; ++k) { + h_id[n]=id; + h_x[n]=x; + h_y[n]=x+y[9-k]; + h_adc[n]=100; + ++n; + if (y[k]==3) continue; // hole + if (id==51) {h_id[n++]=InvId; h_id[n++]=InvId; }// error + h_id[n]=id; + h_x[n]=x+1; + h_y[n]=x+y[k]+2; + h_adc[n]=100; + ++n; + } + } + } + } + std::cout << "created " << n << " digis in " << ncl << " clusters" << std::endl; + assert(n<=numElements); + size_t size32 = n * sizeof(unsigned int); + size_t size16 = n * sizeof(unsigned short); + size_t size8 = n * sizeof(uint8_t); + + uint32_t nModules=0; + cuda::memory::copy(d_moduleStart.get(),&nModules,sizeof(uint32_t)); + + cuda::memory::copy(d_id.get(), h_id.get(), size16); + cuda::memory::copy(d_x.get(), h_x.get(), size16); + cuda::memory::copy(d_y.get(), h_y.get(), size16); + cuda::memory::copy(d_adc.get(), h_adc.get(), size8); + cuda::memory::device::zero(d_debug.get(),size32); + // Launch CUDA Kernels + + + int threadsPerBlock = 256; + int blocksPerGrid = (numElements + threadsPerBlock - 1) / threadsPerBlock; + std::cout + << "CUDA countModules kernel launch with " << blocksPerGrid + << " blocks of " << threadsPerBlock << " threads\n"; + + cuda::launch( + countModules, + { blocksPerGrid, threadsPerBlock }, + d_id.get(), d_moduleStart.get() ,d_clus.get(),n + ); + + cuda::memory::copy(&nModules,d_moduleStart.get(),sizeof(uint32_t)); + + std::cout << "found " << nModules << " Modules active" << std::endl; + + + threadsPerBlock = 256; + blocksPerGrid = nModules; + + + + std::cout + << "CUDA findModules kernel launch with " << blocksPerGrid + << " blocks of " << threadsPerBlock << " threads\n"; + + cuda::memory::device::zero(d_clusInModule.get(),MaxNumModules*sizeof(uint32_t)); + + cuda::launch( + findClus, + { blocksPerGrid, threadsPerBlock }, + d_id.get(), d_x.get(), d_y.get(), d_adc.get(), + d_moduleStart.get(), + d_clusInModule.get(), d_moduleId.get(), + d_clus.get(), + d_debug.get(), + n + ); + + + uint32_t nclus[MaxNumModules], moduleId[nModules]; + cuda::memory::copy(h_clus.get(), d_clus.get(), size32); + cuda::memory::copy(&nclus,d_clusInModule.get(),MaxNumModules*sizeof(uint32_t)); + cuda::memory::copy(&moduleId,d_moduleId.get(),nModules*sizeof(uint32_t)); + + + cuda::memory::copy(h_debug.get(), d_debug.get(), size32); + + auto p = std::minmax_element(h_debug.get(),h_debug.get()+n); + std::cout << "debug " << *p.first << ' ' << *p.second << std::endl; + + + + + std::set clids; + std::vector seeds; + for (int i=0; i=0); + assert(h_clus[i] + + diff --git a/RecoLocalTracker/SiPixelRecHits/interface/PixelCPEBase.h b/RecoLocalTracker/SiPixelRecHits/interface/PixelCPEBase.h index 8058eb5f4d311..b7c04c98443d4 100644 --- a/RecoLocalTracker/SiPixelRecHits/interface/PixelCPEBase.h +++ b/RecoLocalTracker/SiPixelRecHits/interface/PixelCPEBase.h @@ -255,7 +255,7 @@ class PixelCPEBase : public PixelClusterParameterEstimator //--------------------------------------------------------------------------- // Geometrical services to subclasses. //--------------------------------------------------------------------------- -private: +protected: void computeAnglesFromDetPosition( DetParam const & theDetParam, ClusterParam & theClusterParam ) const; void computeAnglesFromTrajectory ( DetParam const & theDetParam, ClusterParam & theClusterParam, diff --git a/RecoLocalTracker/SiPixelRecHits/interface/PixelCPEFast.h b/RecoLocalTracker/SiPixelRecHits/interface/PixelCPEFast.h new file mode 100644 index 0000000000000..74b1573423f85 --- /dev/null +++ b/RecoLocalTracker/SiPixelRecHits/interface/PixelCPEFast.h @@ -0,0 +1,112 @@ +#pragma once + +#include "RecoLocalTracker/SiPixelRecHits/interface/pixelCPEforGPU.h" +#include "RecoLocalTracker/SiPixelRecHits/interface/PixelCPEBase.h" +#include "CalibTracker/SiPixelESProducers/interface/SiPixelCPEGenericDBErrorParametrization.h" + + +// The template header files +#include "RecoLocalTracker/SiPixelRecHits/interface/SiPixelTemplate.h" +#include "RecoLocalTracker/SiPixelRecHits/interface/SiPixelGenError.h" + + +#include +#include + + +class MagneticField; +class PixelCPEFast final : public PixelCPEBase +{ +public: + struct ClusterParamGeneric : ClusterParam + { + ClusterParamGeneric(const SiPixelCluster & cl) : ClusterParam(cl){} + // The truncation value pix_maximum is an angle-dependent cutoff on the + // individual pixel signals. It should be applied to all pixels in the + // cluster [signal_i = fminf(signal_i, pixmax)] before the column and row + // sums are made. Morris + int pixmx; + + // These are errors predicted by PIXELAV + float sigmay; // CPE Generic y-error for multi-pixel cluster + float sigmax; // CPE Generic x-error for multi-pixel cluster + float sy1 ; // CPE Generic y-error for single single-pixel + float sy2 ; // CPE Generic y-error for single double-pixel cluster + float sx1 ; // CPE Generic x-error for single single-pixel cluster + float sx2 ; // CPE Generic x-error for single double-pixel cluster + + }; + + PixelCPEFast(edm::ParameterSet const& conf, const MagneticField *, + const TrackerGeometry&, const TrackerTopology&, const SiPixelLorentzAngle *, + const SiPixelGenErrorDBObject *, const SiPixelLorentzAngle *); + + + ~PixelCPEFast(); +private: + ClusterParam * createClusterParam(const SiPixelCluster & cl) const override; + + LocalPoint localPosition (DetParam const & theDetParam, ClusterParam & theClusterParam) const override; + LocalError localError (DetParam const & theDetParam, ClusterParam & theClusterParam) const override; + + //-------------------------------------------------------------------- + // Methods. + //------------------------------------------------------------------ + static float + generic_position_formula( int size, //!< Size of this projection. + int Q_f, //!< Charge in the first pixel. + int Q_l, //!< Charge in the last pixel. + uint16_t upper_edge_first_pix, //!< As the name says. + uint16_t lower_edge_last_pix, //!< As the name says. + float lorentz_shift, //!< L-width + float theThickness, //detector thickness + float cot_angle, //!< cot of alpha_ or beta_ + float pitch, //!< thePitchX or thePitchY + bool first_is_big, //!< true if the first is big + bool last_is_big //!< true if the last is big + ); + + static void + collect_edge_charges(ClusterParam & theClusterParam, //!< input, the cluster + int & Q_f_X, //!< output, Q first in X + int & Q_l_X, //!< output, Q last in X + int & Q_f_Y, //!< output, Q first in Y + int & Q_l_Y, //!< output, Q last in Y + bool truncate + ); + + + bool UseErrorsFromTemplates_; + bool TruncatePixelCharge_; + + float EdgeClusterErrorX_; + float EdgeClusterErrorY_; + + std::vector xerr_barrel_l1_,yerr_barrel_l1_,xerr_barrel_ln_; + std::vector yerr_barrel_ln_,xerr_endcap_,yerr_endcap_; + float xerr_barrel_l1_def_, yerr_barrel_l1_def_,xerr_barrel_ln_def_; + float yerr_barrel_ln_def_, xerr_endcap_def_, yerr_endcap_def_; + + //--- DB Error Parametrization object, new light templates + std::vector< SiPixelGenErrorStore > thePixelGenError_; + + +public : + + void fillParamsForGpu(); + + // not needed if not used on CPU... + std::vector m_detParamsGPU; + pixelCPEforGPU::CommonParams m_commonParamsGPU; + + pixelCPEforGPU::ParamsOnGPU h_paramsOnGPU; + + pixelCPEforGPU::ParamsOnGPU * d_paramsOnGPU; // copy of the above on the Device + + +}; + + + + + diff --git a/RecoLocalTracker/SiPixelRecHits/interface/pixelCPEforGPU.h b/RecoLocalTracker/SiPixelRecHits/interface/pixelCPEforGPU.h new file mode 100644 index 0000000000000..900ae64969285 --- /dev/null +++ b/RecoLocalTracker/SiPixelRecHits/interface/pixelCPEforGPU.h @@ -0,0 +1,206 @@ +#pragma once + +#include "Geometry/TrackerGeometryBuilder/interface/phase1PixelTopology.h" +#include "DataFormats/GeometrySurface/interface/SOARotation.h" +#include +#include + +#include + +namespace pixelCPEforGPU { + + using Frame = SOAFrame; + using Rotation = SOARotation; + + // all modules are identical! + struct CommonParams { + float theThicknessB; + float theThicknessE; + float thePitchX; + float thePitchY; + }; + + struct DetParams { + + bool isBarrel; + bool isPosZ; + uint16_t layer; + uint16_t index; + uint32_t rawId; + + float shiftX; + float shiftY; + float chargeWidthX; + float chargeWidthY; + + float x0,y0,z0; // the vertex in the local coord of the detector + + Frame frame; + + }; + + + struct ParamsOnGPU { + CommonParams * m_commonParams; + DetParams * m_detParams; + + constexpr + CommonParams const & commonParams() const {return *m_commonParams;} + constexpr + DetParams const & detParams(int i) const {return m_detParams[i];} + + }; + + // SOA! (on device) + template + struct ClusParamsT { + uint32_t minRow[N]; + uint32_t maxRow[N]; + uint32_t minCol[N]; + uint32_t maxCol[N]; + + int32_t Q_f_X[N]; + int32_t Q_l_X[N]; + int32_t Q_f_Y[N]; + int32_t Q_l_Y[N]; + + int32_t charge[N]; + + float xpos[N]; + float ypos[N]; + }; + + + constexpr uint32_t MaxClusInModule=256; + using ClusParams = ClusParamsT<256>; + + constexpr inline + void computeAnglesFromDet(DetParams const & detParams, float const x, float const y, float & cotalpha, float & cotbeta) { + // x,y local position on det + auto gvx = x - detParams.x0; + auto gvy = y - detParams.y0; + auto gvz = -1.f/detParams.z0; + // normalization not required as only ratio used... + // calculate angles + cotalpha = gvx*gvz; + cotbeta = gvy*gvz; + } + + constexpr inline + float correction( + int sizeM1, + int Q_f, //!< Charge in the first pixel. + int Q_l, //!< Charge in the last pixel. + uint16_t upper_edge_first_pix, //!< As the name says. + uint16_t lower_edge_last_pix, //!< As the name says. + float lorentz_shift, //!< L-shift at half thickness + float theThickness, //detector thickness + float cot_angle, //!< cot of alpha_ or beta_ + float pitch, //!< thePitchX or thePitchY + bool first_is_big, //!< true if the first is big + bool last_is_big //!< true if the last is big + ) +{ + if (0==sizeM1) return 0; // size1 + float W_eff=0; + bool simple=true; + if (1==sizeM1) { // size 2 + //--- Width of the clusters minus the edge (first and last) pixels. + //--- In the note, they are denoted x_F and x_L (and y_F and y_L) + // assert(lower_edge_last_pix>=upper_edge_first_pix); + auto W_inner = pitch * float(lower_edge_last_pix-upper_edge_first_pix); // in cm + + //--- Predicted charge width from geometry + auto W_pred = theThickness * cot_angle // geometric correction (in cm) + - lorentz_shift; // (in cm) &&& check fpix! + + W_eff = std::abs( W_pred ) - W_inner; + + //--- If the observed charge width is inconsistent with the expectations + //--- based on the track, do *not* use W_pred-W_innner. Instead, replace + //--- it with an *average* effective charge width, which is the average + //--- length of the edge pixels. + // + simple = ( W_eff < 0.0f ) | ( W_eff > pitch ); // this produces "large" regressions for very small numeric differences... + + } + if (simple) { + //--- Total length of the two edge pixels (first+last) + float sum_of_edge = 2.0f; + if (first_is_big) sum_of_edge += 1.0f; + if (last_is_big) sum_of_edge += 1.0f; + W_eff = pitch * 0.5f * sum_of_edge; // ave. length of edge pixels (first+last) (cm) + } + + + //--- Finally, compute the position in this projection + float Qdiff = Q_l - Q_f; + float Qsum = Q_l + Q_f; + + //--- Temporary fix for clusters with both first and last pixel with charge = 0 + if(Qsum==0) Qsum=1.0f; + return 0.5f*(Qdiff/Qsum) * W_eff; + + } + + constexpr inline + void position(CommonParams const & comParams, DetParams const & detParams, ClusParams & cp, uint32_t ic) { + + //--- Upper Right corner of Lower Left pixel -- in measurement frame + uint16_t llx = cp.minRow[ic]+1; + uint16_t lly = cp.minCol[ic]+1; + + //--- Lower Left corner of Upper Right pixel -- in measurement frame + uint16_t urx = cp.maxRow[ic]; + uint16_t ury = cp.maxCol[ic]; + + auto llxl = phase1PixelTopology::localX(llx); + auto llyl = phase1PixelTopology::localY(lly); + auto urxl = phase1PixelTopology::localX(urx); + auto uryl = phase1PixelTopology::localY(ury); + + auto mx = llxl+urxl; + auto my = llyl+uryl; + + // apply the lorentz offset correction + auto xPos = detParams.shiftX + comParams.thePitchX*(0.5f*float(mx)+float(phase1PixelTopology::xOffset)); + auto yPos = detParams.shiftY + comParams.thePitchY*(0.5f*float(my)+float(phase1PixelTopology::yOffset)); + + float cotalpha=0, cotbeta=0; + + + computeAnglesFromDet(detParams, xPos, yPos, cotalpha, cotbeta); + + auto thickness = detParams.isBarrel ? comParams.theThicknessB : comParams.theThicknessE; + + auto xcorr = correction( + cp.maxRow[ic]-cp.minRow[ic], + cp.Q_f_X[ic], cp.Q_l_X[ic], + llxl, urxl, + detParams.chargeWidthX, // lorentz shift in cm + thickness, + cotalpha, + comParams.thePitchX, + phase1PixelTopology::isBigPixX( cp.minRow[ic] ), + phase1PixelTopology::isBigPixX( cp.maxRow[ic] ) + ); + + + auto ycorr = correction( + cp.maxCol[ic]-cp.minCol[ic], + cp.Q_f_Y[ic], cp.Q_l_Y[ic], + llyl, uryl, + detParams.chargeWidthY, // lorentz shift in cm + thickness, + cotbeta, + comParams.thePitchY, + phase1PixelTopology::isBigPixY( cp.minCol[ic] ), + phase1PixelTopology::isBigPixY( cp.maxCol[ic] ) + ); + + cp.xpos[ic]=xPos+xcorr; + cp.ypos[ic]=yPos+ycorr; + + } + +} diff --git a/RecoLocalTracker/SiPixelRecHits/plugins/BuildFile.xml b/RecoLocalTracker/SiPixelRecHits/plugins/BuildFile.xml index 0b477d0fb2d34..526d837e1ec01 100644 --- a/RecoLocalTracker/SiPixelRecHits/plugins/BuildFile.xml +++ b/RecoLocalTracker/SiPixelRecHits/plugins/BuildFile.xml @@ -2,6 +2,8 @@ - + + + diff --git a/RecoLocalTracker/SiPixelRecHits/plugins/PixelCPEFastESProducer.cc b/RecoLocalTracker/SiPixelRecHits/plugins/PixelCPEFastESProducer.cc new file mode 100644 index 0000000000000..344625cba01b6 --- /dev/null +++ b/RecoLocalTracker/SiPixelRecHits/plugins/PixelCPEFastESProducer.cc @@ -0,0 +1,103 @@ +#include "RecoLocalTracker/SiPixelRecHits/interface/PixelCPEFast.h" +#include "MagneticField/Engine/interface/MagneticField.h" +#include "MagneticField/Records/interface/IdealMagneticFieldRecord.h" +#include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h" +#include "Geometry/Records/interface/TrackerDigiGeometryRecord.h" +#include "Geometry/Records/interface/TrackerTopologyRcd.h" +#include "DataFormats/TrackerCommon/interface/TrackerTopology.h" + +#include "FWCore/Framework/interface/EventSetup.h" +#include "FWCore/Framework/interface/ESHandle.h" +#include "FWCore/Framework/interface/ModuleFactory.h" + +// new record +#include "CondFormats/DataRecord/interface/SiPixelGenErrorDBObjectRcd.h" + +#include "FWCore/Framework/interface/ESProducer.h" +#include "FWCore/ParameterSet/interface/ParameterSet.h" +#include "RecoLocalTracker/Records/interface/TkPixelCPERecord.h" +#include "RecoLocalTracker/ClusterParameterEstimator/interface/PixelClusterParameterEstimator.h" +#include + +class PixelCPEFastESProducer: public edm::ESProducer{ + public: + PixelCPEFastESProducer(const edm::ParameterSet & p); + std::shared_ptr produce(const TkPixelCPERecord &); + private: + std::shared_ptr cpe_; + edm::ParameterSet pset_; + edm::ESInputTag magname_; + bool UseErrorsFromTemplates_; +}; + + +#include +#include + +using namespace edm; + + + + +PixelCPEFastESProducer::PixelCPEFastESProducer(const edm::ParameterSet & p) +{ + std::string myname = p.getParameter("ComponentName"); + magname_ = p.existsAs("MagneticFieldRecord")? + p.getParameter("MagneticFieldRecord"):edm::ESInputTag(""); + UseErrorsFromTemplates_ = p.getParameter("UseErrorsFromTemplates"); + + + pset_ = p; + setWhatProduced(this,myname); + + +} + + +std::shared_ptr +PixelCPEFastESProducer::produce(const TkPixelCPERecord & iRecord){ + + ESHandle magfield; + iRecord.getRecord().get( magname_, magfield ); + + edm::ESHandle pDD; + iRecord.getRecord().get( pDD ); + + edm::ESHandle hTT; + iRecord.getRecord().getRecord().get(hTT); + + // Lorant angle for offsets + ESHandle lorentzAngle; + iRecord.getRecord().get(lorentzAngle ); + + // add the new la width object + ESHandle lorentzAngleWidth; + const SiPixelLorentzAngle * lorentzAngleWidthProduct = nullptr; + iRecord.getRecord().get("forWidth",lorentzAngleWidth ); + lorentzAngleWidthProduct = lorentzAngleWidth.product(); + + const SiPixelGenErrorDBObject * genErrorDBObjectProduct = nullptr; + + // Errors take only from new GenError + ESHandle genErrorDBObject; + if(UseErrorsFromTemplates_) { // do only when generrors are needed + iRecord.getRecord().get(genErrorDBObject); + genErrorDBObjectProduct = genErrorDBObject.product(); + //} else { + //std::cout<<" pass an empty GenError pointer"<( + pset_,magfield.product(),*pDD.product(), + *hTT.product(),lorentzAngle.product(), + genErrorDBObjectProduct,lorentzAngleWidthProduct); + + return cpe_; +} + + +#include "FWCore/Framework/interface/MakerMacros.h" +#include "FWCore/Utilities/interface/typelookup.h" +#include "FWCore/Framework/interface/eventsetuprecord_registration_macro.h" + +DEFINE_FWK_EVENTSETUP_MODULE(PixelCPEFastESProducer); + diff --git a/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.cu b/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.cu new file mode 100644 index 0000000000000..fb38fd3cfb24a --- /dev/null +++ b/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.cu @@ -0,0 +1,74 @@ +#include "PixelRecHits.h" +#include "gpuPixelRecHits.h" + +#include "RecoLocalTracker/SiPixelClusterizer/plugins/gpuClustering.h" + +#include "EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.h" // for context.... +#include "EventFilter/SiPixelRawToDigi/plugins/cudaCheck.h" + +// CUDA runtime +#include +#include +#include +#include + +HitsOnGPU allocHitsOnGPU() { + HitsOnGPU hh; + cudaCheck(cudaMalloc((void**) & hh.hitsModuleStart_d,(gpuClustering::MaxNumModules+1)*sizeof(uint32_t))); + cudaCheck(cudaMalloc((void**) & hh.charge_d,(gpuClustering::MaxNumModules*256)*sizeof(float))); + cudaCheck(cudaMalloc((void**) & hh.xg_d,(gpuClustering::MaxNumModules*256)*sizeof(float))); + cudaCheck(cudaMalloc((void**) & hh.yg_d,(gpuClustering::MaxNumModules*256)*sizeof(float))); + cudaCheck(cudaMalloc((void**) & hh.zg_d,(gpuClustering::MaxNumModules*256)*sizeof(float))); + cudaDeviceSynchronize(); + + return hh; +} + + +void pixelRecHits_wrapper( + context const & c, + pixelCPEforGPU::ParamsOnGPU const * cpeParams, + uint32_t ndigis, + uint32_t nModules, // active modules (with digis) + HitsOnGPU & hh +) +{ + + + uint32_t hitsModuleStart[gpuClustering::MaxNumModules+1]; + hitsModuleStart[0] =0; + cudaCheck(cudaMemcpyAsync(&hitsModuleStart[1], c.clusInModule_d, gpuClustering::MaxNumModules*sizeof(uint32_t), cudaMemcpyDeviceToHost, c.stream)); + + std::partial_sum(std::begin(hitsModuleStart),std::end(hitsModuleStart),std::begin(hitsModuleStart)); + + auto nhits = hitsModuleStart[gpuClustering::MaxNumModules]; + std::cout << " total number of clusters " << nhits << std::endl; + + cudaCheck(cudaMemcpyAsync(hh.hitsModuleStart_d, &hitsModuleStart, (gpuClustering::MaxNumModules+1)*sizeof(uint32_t), cudaMemcpyHostToDevice, c.stream)); + + + int threadsPerBlock = 256; + int blocks = nModules; + gpuPixelRecHits::getHits<<>>( + cpeParams, + c.moduleInd_d, + c.xx_d, c.yy_d, c.adc_d, + c.moduleStart_d, + c.clusInModule_d, c.moduleId_d, + c.clus_d, + ndigis, + hh.hitsModuleStart_d, + hh.charge_d, + hh.xg_d,hh.yg_d,hh.zg_d, + false + ); + + int32_t charge[nhits]; + cudaCheck(cudaMemcpyAsync(charge, hh.charge_d, nhits*sizeof(uint32_t), cudaMemcpyDeviceToHost, c.stream)); + int ngood=0; + auto l1 = hitsModuleStart[96]; + for (auto i=0U; i4000 || (i2000) ) ++ngood; + std::cout << " total number of good clusters " << ngood << std::endl; + + +} diff --git a/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.h b/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.h new file mode 100644 index 0000000000000..467263cc37caf --- /dev/null +++ b/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.h @@ -0,0 +1,26 @@ +#pragma once + +#include + +namespace pixelCPEforGPU { + struct ParamsOnGPU; +} + +struct context; + +struct HitsOnGPU{ + + uint32_t * hitsModuleStart_d; + int32_t * charge_d; + float *xg_d, *yg_d, *zg_d; +}; + +HitsOnGPU allocHitsOnGPU(); + +void pixelRecHits_wrapper( + context const & c, + pixelCPEforGPU::ParamsOnGPU const * cpeParams, + uint32_t ndigis, + uint32_t nModules, // active modules (with digis) + HitsOnGPU & hh +); diff --git a/RecoLocalTracker/SiPixelRecHits/plugins/SiPixelRecHitGPU.cc b/RecoLocalTracker/SiPixelRecHits/plugins/SiPixelRecHitGPU.cc new file mode 100644 index 0000000000000..4f29608714691 --- /dev/null +++ b/RecoLocalTracker/SiPixelRecHits/plugins/SiPixelRecHitGPU.cc @@ -0,0 +1,239 @@ +#include "PixelRecHits.h" + +//--- Base class for CPEs: + +#include "RecoLocalTracker/SiPixelRecHits/interface/PixelCPEBase.h" + +//--- Geometry + DataFormats +#include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h" +#include "DataFormats/SiPixelCluster/interface/SiPixelCluster.h" +#include "DataFormats/TrackerRecHit2D/interface/SiPixelRecHitCollection.h" +#include "DataFormats/Common/interface/DetSetVector.h" + +//--- Framework +#include "FWCore/Framework/interface/stream/EDProducer.h" +#include "FWCore/Framework/interface/Event.h" +#include "FWCore/Framework/interface/EventSetup.h" + +#include "DataFormats/Common/interface/Handle.h" +#include "FWCore/Framework/interface/ESHandle.h" +#include "FWCore/ParameterSet/interface/ParameterSet.h" +#include "FWCore/Utilities/interface/InputTag.h" + +class MagneticField; +namespace +{ + class SiPixelRecHitGPU : public edm::stream::EDProducer<> + { + public: + //--- Constructor, virtual destructor (just in case) + explicit SiPixelRecHitGPU(const edm::ParameterSet& conf); + ~SiPixelRecHitGPU() override; + + //--- The top-level event method. + void produce(edm::Event& e, const edm::EventSetup& c) override; + + //--- Execute the position estimator algorithm(s). + //--- New interface with DetSetVector + void run(const edmNew::DetSetVector& input, + SiPixelRecHitCollectionNew & output, + edm::ESHandle & geom); + + void run(edm::Handle > inputhandle, + SiPixelRecHitCollectionNew & output, + edm::ESHandle & geom); + + private: + edm::ParameterSet conf_; + std::string cpeName_="None"; // what the user said s/he wanted + PixelCPEBase const * cpe_=nullptr; // What we got (for now, one ptr to base class) + + edm::InputTag src_; + edm::EDGetTokenT> tPixelCluster; + + using GPUProd = std::vector; + edm::InputTag gpuProd_ = edm::InputTag("siPixelDigis"); + edm::EDGetTokenT tGpuProd; + HitsOnGPU hitsOnGPU_; + + + bool m_newCont; // save also in emdNew::DetSetVector + }; +} + +#include "FWCore/PluginManager/interface/ModuleDef.h" +#include "FWCore/Framework/interface/MakerMacros.h" + +DEFINE_FWK_MODULE(SiPixelRecHitGPU); + +// Geometry +#include "Geometry/Records/interface/TrackerDigiGeometryRecord.h" +#include "Geometry/TrackerGeometryBuilder/interface/PixelGeomDetUnit.h" + +// Data Formats +#include "DataFormats/DetId/interface/DetId.h" +#include "DataFormats/Common/interface/Ref.h" +#include "DataFormats/Common/interface/DetSet2RangeMap.h" + + +// STL +#include +#include +#include +#include + +// MessageLogger +#include "FWCore/MessageLogger/interface/MessageLogger.h" + +#include "RecoLocalTracker/Records/interface/TkPixelCPERecord.h" + +using namespace std; + +#include "RecoLocalTracker/SiPixelRecHits/interface/PixelCPEFast.h" + + + //--------------------------------------------------------------------------- + //! Constructor: set the ParameterSet and defer all thinking to setupCPE(). + //--------------------------------------------------------------------------- + SiPixelRecHitGPU::SiPixelRecHitGPU(edm::ParameterSet const& conf) + : + conf_(conf), + src_( conf.getParameter( "src" ) ), + tPixelCluster(consumes< edmNew::DetSetVector >( src_)), + tGpuProd(consumes(gpuProd_)), + hitsOnGPU_ (allocHitsOnGPU()) + { + //--- Declare to the EDM what kind of collections we will be making. + produces(); + + } + + // Destructor + SiPixelRecHitGPU::~SiPixelRecHitGPU() + { + // need to free hitsOnGPU + } + + //--------------------------------------------------------------------------- + //! The "Event" entrypoint: gets called by framework for every event + //--------------------------------------------------------------------------- + void SiPixelRecHitGPU::produce(edm::Event& e, const edm::EventSetup& es) + { + + // Step A.1: get input data + edm::Handle< edmNew::DetSetVector > input; + e.getByToken( tPixelCluster, input); + + // Step A.2: get event setup + edm::ESHandle geom; + es.get().get( geom ); + + // Step B: create empty output collection + auto output = std::make_unique(); + + // Step B*: create CPE + edm::ESHandle hCPE; + std::string cpeName_ = conf_.getParameter("CPE"); + es.get().get(cpeName_,hCPE); + cpe_ = dynamic_cast< const PixelCPEBase* >(&(*hCPE)); + + /// do it on GPU.... + + edm::Handle gh; + e.getByToken(tGpuProd, gh); + auto gprod = *gh; + // invoke gpu version ...... + PixelCPEFast const * fcpe = dynamic_cast(cpe_); + if (!fcpe) { + std::cout << " too bad, not a fast cpe gpu processing not possible...." << std::endl; + assert(0); + } + assert(fcpe->d_paramsOnGPU); + + pixelRecHits_wrapper(* (context const *)(gprod[0]),fcpe->d_paramsOnGPU,gprod[1],gprod[2], hitsOnGPU_); + + + + // Step C: Iterate over DetIds and invoke the strip CPE algorithm + // on each DetUnit + + std::cout << "Number of Clusers on CPU " << (*input).data().size() << std::endl; + + run( input, *output, geom ); + + output->shrink_to_fit(); + e.put(std::move(output)); + + } + + //--------------------------------------------------------------------------- + //! Iterate over DetUnits, then over Clusters and invoke the CPE on each, + //! and make a RecHit to store the result. + //! New interface reading DetSetVector by V.Chiochia (May 30th, 2006) + //--------------------------------------------------------------------------- + void SiPixelRecHitGPU::run(edm::Handle > inputhandle, + SiPixelRecHitCollectionNew &output, + edm::ESHandle & geom) { + if ( ! cpe_ ) + { + edm::LogError("SiPixelRecHitGPU") << " at least one CPE is not ready -- can't run!"; + // TO DO: throw an exception here? The user may want to know... + assert(0); + return; // clusterizer is invalid, bail out + } + + + int numberOfDetUnits = 0; + int numberOfClusters = 0; + + const edmNew::DetSetVector& input = *inputhandle; + + edmNew::DetSetVector::const_iterator DSViter=input.begin(); + + for ( ; DSViter != input.end() ; DSViter++) { + numberOfDetUnits++; + unsigned int detid = DSViter->detId(); + DetId detIdObject( detid ); + const GeomDetUnit * genericDet = geom->idToDetUnit( detIdObject ); + const PixelGeomDetUnit * pixDet = dynamic_cast(genericDet); + assert(pixDet); + SiPixelRecHitCollectionNew::FastFiller recHitsOnDetUnit(output,detid); + + edmNew::DetSet::const_iterator clustIt = DSViter->begin(), clustEnd = DSViter->end(); + + for ( ; clustIt != clustEnd; clustIt++) { + numberOfClusters++; + std::tuple tuple = cpe_->getParameters( *clustIt, *genericDet ); + LocalPoint lp( std::get<0>(tuple) ); + LocalError le( std::get<1>(tuple) ); + SiPixelRecHitQuality::QualWordType rqw( std::get<2>(tuple) ); + // Create a persistent edm::Ref to the cluster + edm::Ref< edmNew::DetSetVector, SiPixelCluster > cluster = edmNew::makeRefTo( inputhandle, clustIt); + // Make a RecHit and add it to the DetSet + // old : recHitsOnDetUnit.push_back( new SiPixelRecHit( lp, le, detIdObject, &*clustIt) ); + SiPixelRecHit hit( lp, le, rqw, *genericDet, cluster); + // + // Now save it ================= + recHitsOnDetUnit.push_back(hit); + // ============================= + + // std::cout << "SiPixelRecHitGPUVI " << numberOfClusters << ' '<< lp << " " << le << std::endl; + } // <-- End loop on Clusters + + + // LogDebug("SiPixelRecHitGPU") + //std::cout << "SiPixelRecHitGPUVI " + // << " Found " << recHitsOnDetUnit.size() << " RecHits on " << detid //; + // << std::endl; + + + } // <-- End loop on DetUnits + + // LogDebug ("SiPixelRecHitGPU") + // std::cout << "SiPixelRecHitGPUVI " + // << cpeName_ << " converted " << numberOfClusters + // << " SiPixelClusters into SiPixelRecHits, in " + // << numberOfDetUnits << " DetUnits." //; + // << std::endl; + + } diff --git a/RecoLocalTracker/SiPixelRecHits/plugins/gpuPixelRecHits.h b/RecoLocalTracker/SiPixelRecHits/plugins/gpuPixelRecHits.h new file mode 100644 index 0000000000000..40ad6ac15fec7 --- /dev/null +++ b/RecoLocalTracker/SiPixelRecHits/plugins/gpuPixelRecHits.h @@ -0,0 +1,130 @@ +#pragma once + +#include "RecoLocalTracker/SiPixelRecHits/interface/pixelCPEforGPU.h" + +#include +#include +#include +#include + + +namespace gpuPixelRecHits { + + // to be moved in common namespace... + constexpr uint16_t InvId=9999; // must be > MaxNumModules + + + constexpr uint32_t MaxClusInModule= pixelCPEforGPU::MaxClusInModule; + + using ClusParams = pixelCPEforGPU::ClusParams; + + + __global__ void getHits(pixelCPEforGPU::ParamsOnGPU const * cpeParams, + uint16_t const * id, + uint16_t const * x, + uint16_t const * y, + uint16_t const * adc, + uint32_t const * digiModuleStart, + uint32_t * const clusInModule, + uint32_t * const moduleId, + int32_t * const clus, + int numElements, + uint32_t const * hitsModuleStart, + int32_t * chargeh, + float * xh, float * yh, float * zh, + bool local // if true fill just x & y in local coord... + ){ + + // as usual one block per module + + __shared__ ClusParams clusParams; + + + auto first = digiModuleStart[1 + blockIdx.x]; + + auto me = id[first]; + assert (moduleId[blockIdx.x]==me); + + auto nclus = clusInModule[me]; + +#ifdef GPU_DEBUG + if (me%100==1) + if (threadIdx.x==0) printf("hitbuilder: %d clusters in module %d. will write at %d\n",nclus,me,hitsModuleStart[me]); +#endif + + assert(blockDim.x>=MaxClusInModule); + assert(nclus<=MaxClusInModule); + + auto ic = threadIdx.x; + + if (ic::max(); + clusParams.maxRow[ic] = 0; + clusParams.minCol[ic] = std::numeric_limits::max(); + clusParams.maxCol[ic] = 0; + + clusParams.charge[ic] = 0; + + clusParams.Q_f_X[ic] = 0; + clusParams.Q_l_X[ic] = 0; + clusParams.Q_f_Y[ic] = 0; + clusParams.Q_l_Y[ic] = 0; + } + + + first+=threadIdx.x; + + __syncthreads(); + + + // one thead per "digi" + + for (int i=first; i=nclus) return; + + first = hitsModuleStart[me]; + auto h = first+ic; // output index in global memory + + assert(h<2000*256); + + pixelCPEforGPU::position(cpeParams->commonParams(), cpeParams->detParams(me), clusParams,ic); + + chargeh[h] = clusParams.charge[ic]; + + if (local) { + xh[h]= clusParams.xpos[ic]; + yh[h]= clusParams.ypos[ic]; + } else { + cpeParams->detParams(me).frame.toGlobal(clusParams.xpos[ic],clusParams.ypos[ic], + xh[h],yh[h],zh[h] + ); + } + + } + +} + diff --git a/RecoLocalTracker/SiPixelRecHits/python/PixelCPEESProducers_cff.py b/RecoLocalTracker/SiPixelRecHits/python/PixelCPEESProducers_cff.py index 584a66f248178..affcb3638cb6f 100644 --- a/RecoLocalTracker/SiPixelRecHits/python/PixelCPEESProducers_cff.py +++ b/RecoLocalTracker/SiPixelRecHits/python/PixelCPEESProducers_cff.py @@ -19,6 +19,7 @@ # 4. Pixel Generic CPE # from RecoLocalTracker.SiPixelRecHits.PixelCPEGeneric_cfi import * +from RecoLocalTracker.SiPixelRecHits.PixelCPEFast_cfi import * # # 5. The new ESProducer for the Magnetic-field dependent template record # diff --git a/RecoLocalTracker/SiPixelRecHits/python/PixelCPEFast_cfi.py b/RecoLocalTracker/SiPixelRecHits/python/PixelCPEFast_cfi.py new file mode 100644 index 0000000000000..bda1fe45a3705 --- /dev/null +++ b/RecoLocalTracker/SiPixelRecHits/python/PixelCPEFast_cfi.py @@ -0,0 +1,31 @@ +import FWCore.ParameterSet.Config as cms + +PixelCPEFastESProducer = cms.ESProducer("PixelCPEFastESProducer", + + ComponentName = cms.string('PixelCPEFast'), + Alpha2Order = cms.bool(True), + + # Edge cluster errors in microns (determined by looking at residual RMS) + EdgeClusterErrorX = cms.double( 50.0 ), + EdgeClusterErrorY = cms.double( 85.0 ), + + # these for CPEBase + useLAWidthFromDB = cms.bool(True), + useLAAlignmentOffsets = cms.bool(False), + + + # Can use errors predicted by the template code + # If UseErrorsFromTemplates is False, must also set + # TruncatePixelCharge and LoadTemplatesFromDB to be False + UseErrorsFromTemplates = cms.bool(True), + LoadTemplatesFromDB = cms.bool(True), + + # When set True this gives a slight improvement in resolution at no cost + TruncatePixelCharge = cms.bool(True), + + # petar, for clusterProbability() from TTRHs + ClusterProbComputationFlag = cms.int32(0), + + #MagneticFieldRecord: e.g. "" or "ParabolicMF" + MagneticFieldRecord = cms.ESInputTag(""), +) diff --git a/RecoLocalTracker/SiPixelRecHits/python/SiPixelRecHitsGPU_cfi.py b/RecoLocalTracker/SiPixelRecHits/python/SiPixelRecHitsGPU_cfi.py new file mode 100644 index 0000000000000..240c47ff55e6d --- /dev/null +++ b/RecoLocalTracker/SiPixelRecHits/python/SiPixelRecHitsGPU_cfi.py @@ -0,0 +1,12 @@ +import FWCore.ParameterSet.Config as cms + +siPixelRecHits = cms.EDProducer("SiPixelRecHitGPU", + src = cms.InputTag("siPixelClusters"), + CPE = cms.string('PixelCPEFast'), # Generic'), + VerboseLevel = cms.untracked.int32(0), + +) + +siPixelRecHitsPreSplitting = siPixelRecHits.clone( + src = 'siPixelClustersPreSplitting' +) diff --git a/RecoLocalTracker/SiPixelRecHits/src/PixelCPEFast.cc b/RecoLocalTracker/SiPixelRecHits/src/PixelCPEFast.cc new file mode 100644 index 0000000000000..e2d238563ec43 --- /dev/null +++ b/RecoLocalTracker/SiPixelRecHits/src/PixelCPEFast.cc @@ -0,0 +1,559 @@ +#include "RecoLocalTracker/SiPixelRecHits/interface/PixelCPEFast.h" + +#include "Geometry/TrackerGeometryBuilder/interface/phase1PixelTopology.h" + +#include "Geometry/TrackerGeometryBuilder/interface/PixelGeomDetUnit.h" +#include "Geometry/TrackerGeometryBuilder/interface/RectangularPixelTopology.h" + +// this is needed to get errors from templates +#include "RecoLocalTracker/SiPixelRecHits/interface/SiPixelTemplate.h" +#include "DataFormats/DetId/interface/DetId.h" + + +// Services +#include "FWCore/MessageLogger/interface/MessageLogger.h" +#include "MagneticField/Engine/interface/MagneticField.h" + +#include +#include + +#include "EventFilter/SiPixelRawToDigi/plugins/cudaCheck.h" + +#include + + namespace { + + struct Stat { + Stat():c(0){} + ~Stat(){std::cout << "CPE stat " << c << ' ' << maxx << ' ' << maxd << std::endl;} + std::atomic c; + float maxx=0.f, maxd=0.0f; + }; + Stat statx, staty; + } + +namespace { + constexpr float micronsToCm = 1.0e-4; + const bool MYDEBUG = false; +} + +//----------------------------------------------------------------------------- +//! The constructor. +//----------------------------------------------------------------------------- +PixelCPEFast::PixelCPEFast(edm::ParameterSet const & conf, + const MagneticField * mag, + const TrackerGeometry& geom, + const TrackerTopology& ttopo, + const SiPixelLorentzAngle * lorentzAngle, + const SiPixelGenErrorDBObject * genErrorDBObject, + const SiPixelLorentzAngle * lorentzAngleWidth) + : PixelCPEBase(conf, mag, geom, ttopo, lorentzAngle, genErrorDBObject, nullptr,lorentzAngleWidth,0) { + + EdgeClusterErrorX_ = conf.getParameter("EdgeClusterErrorX"); + EdgeClusterErrorY_ = conf.getParameter("EdgeClusterErrorY"); + + + UseErrorsFromTemplates_ = conf.getParameter("UseErrorsFromTemplates"); + TruncatePixelCharge_ = conf.getParameter("TruncatePixelCharge"); + + + // Use errors from templates or from GenError + if ( UseErrorsFromTemplates_ ) { + if ( !SiPixelGenError::pushfile( *genErrorDBObject_, thePixelGenError_) ) + throw cms::Exception("InvalidCalibrationLoaded") + << "ERROR: GenErrors not filled correctly. Check the sqlite file. Using SiPixelTemplateDBObject version " + << ( *genErrorDBObject_ ).version(); + if(MYDEBUG) std::cout<<"Loaded genErrorDBObject v"<<( *genErrorDBObject_ ).version()<< std::endl; + } else { + if(MYDEBUG) std::cout<<" Use simple parametrised errors "<< std::endl; + } // if ( UseErrorsFromTemplates_ ) + + + // Rechit errors in case other, more correct, errors are not vailable + // This are constants. Maybe there is a more efficienct way to store them. + xerr_barrel_l1_= {0.00115, 0.00120, 0.00088}; + xerr_barrel_l1_def_=0.01030; + yerr_barrel_l1_= {0.00375,0.00230,0.00250,0.00250,0.00230,0.00230,0.00210,0.00210,0.00240}; + yerr_barrel_l1_def_=0.00210; + xerr_barrel_ln_= {0.00115, 0.00120, 0.00088}; + xerr_barrel_ln_def_=0.01030; + yerr_barrel_ln_= {0.00375,0.00230,0.00250,0.00250,0.00230,0.00230,0.00210,0.00210,0.00240}; + yerr_barrel_ln_def_=0.00210; + xerr_endcap_= {0.0020, 0.0020}; + xerr_endcap_def_=0.0020; + yerr_endcap_= {0.00210}; + yerr_endcap_def_=0.00075; + + + + fillParamsForGpu(); + +} + +void PixelCPEFast::fillParamsForGpu() { + + + m_commonParamsGPU.theThicknessB = m_DetParams.front().theThickness; + m_commonParamsGPU.theThicknessE = m_DetParams.back().theThickness; + m_commonParamsGPU.thePitchX = m_DetParams[0].thePitchX; + m_commonParamsGPU.thePitchY = m_DetParams[0].thePitchY; + + uint32_t oldLayer = 0; + m_detParamsGPU.resize(m_DetParams.size()); + for (auto i=0U; iindex()==int(i)); + + assert(m_commonParamsGPU.thePitchY==p.thePitchY); + assert(m_commonParamsGPU.thePitchX==p.thePitchX); + // assert(m_commonParamsGPU.theThickness==p.theThickness); + + g.isBarrel = GeomDetEnumerators::isBarrel(p.thePart); + g.isPosZ = p.theDet->surface().position().z()>0; + g.layer = ttopo_.layer(p.theDet->geographicalId()); + g.index=i; // better be! + g.rawId = p.theDet->geographicalId(); + + assert( (g.isBarrel ?m_commonParamsGPU.theThicknessB : m_commonParamsGPU.theThicknessE) ==p.theThickness ); + + // if (m_commonParamsGPU.theThickness!=p.theThickness) + // std::cout << i << (g.isBarrel ? "B " : "E ") << m_commonParamsGPU.theThickness<<"!="<surface().position(); + auto rr = pixelCPEforGPU::Rotation(p.theDet->surface().rotation()); + g.frame = pixelCPEforGPU::Frame(vv.x(),vv.y(),vv.z(),rr); + + } + + // and now copy to device... + cudaCheck(cudaMalloc((void**) & h_paramsOnGPU.m_commonParams, sizeof(pixelCPEforGPU::CommonParams))); + cudaCheck(cudaMalloc((void**) & h_paramsOnGPU.m_detParams, m_detParamsGPU.size()*sizeof(pixelCPEforGPU::DetParams))); + cudaCheck(cudaMalloc((void**) & d_paramsOnGPU, sizeof(pixelCPEforGPU::ParamsOnGPU))); + + cudaCheck(cudaMemcpy(d_paramsOnGPU, &h_paramsOnGPU, sizeof(pixelCPEforGPU::ParamsOnGPU), cudaMemcpyHostToDevice)); + cudaCheck(cudaMemcpy(h_paramsOnGPU.m_commonParams,&m_commonParamsGPU,sizeof(pixelCPEforGPU::CommonParams), cudaMemcpyHostToDevice)); + cudaCheck(cudaMemcpy(h_paramsOnGPU.m_detParams, m_detParamsGPU.data(), m_detParamsGPU.size()*sizeof(pixelCPEforGPU::DetParams), cudaMemcpyHostToDevice)); + cudaDeviceSynchronize(); +} + +PixelCPEFast::~PixelCPEFast() { + + cudaFree(h_paramsOnGPU.m_commonParams); + cudaFree(h_paramsOnGPU.m_detParams); + cudaFree(d_paramsOnGPU); + +} + + + +PixelCPEBase::ClusterParam* PixelCPEFast::createClusterParam(const SiPixelCluster & cl) const +{ + return new ClusterParamGeneric(cl); +} + + + +//----------------------------------------------------------------------------- +//! Hit position in the local frame (in cm). Unlike other CPE's, this +//! one converts everything from the measurement frame (in channel numbers) +//! into the local frame (in centimeters). +//----------------------------------------------------------------------------- +LocalPoint +PixelCPEFast::localPosition(DetParam const & theDetParam, ClusterParam & theClusterParamBase) const +{ + + ClusterParamGeneric & theClusterParam = static_cast(theClusterParamBase); + + assert(!theClusterParam.with_track_angle); + + float chargeWidthX = (theDetParam.lorentzShiftInCmX * theDetParam.widthLAFractionX); + float chargeWidthY = (theDetParam.lorentzShiftInCmY * theDetParam.widthLAFractionY); + float shiftX = 0.5f*theDetParam.lorentzShiftInCmX; + float shiftY = 0.5f*theDetParam.lorentzShiftInCmY; + + if ( UseErrorsFromTemplates_ ) { + + float qclus = theClusterParam.theCluster->charge(); + float locBz = theDetParam.bz; + float locBx = theDetParam.bx; + //cout << "PixelCPEFast::localPosition(...) : locBz = " << locBz << endl; + + theClusterParam.pixmx = std::numeric_limits::max(); // max pixel charge for truncation of 2-D cluster + + theClusterParam.sigmay = -999.9; // CPE Generic y-error for multi-pixel cluster + theClusterParam.sigmax = -999.9; // CPE Generic x-error for multi-pixel cluster + theClusterParam.sy1 = -999.9; // CPE Generic y-error for single single-pixel + theClusterParam.sy2 = -999.9; // CPE Generic y-error for single double-pixel cluster + theClusterParam.sx1 = -999.9; // CPE Generic x-error for single single-pixel cluster + theClusterParam.sx2 = -999.9; // CPE Generic x-error for single double-pixel cluster + + float dummy; + + SiPixelGenError gtempl(thePixelGenError_); + int gtemplID_ = theDetParam.detTemplateId; + + theClusterParam.qBin_ = gtempl.qbin( gtemplID_, theClusterParam.cotalpha, theClusterParam.cotbeta, locBz, locBx, qclus, + false, + theClusterParam.pixmx, theClusterParam.sigmay, dummy, + theClusterParam.sigmax, dummy, theClusterParam.sy1, + dummy, theClusterParam.sy2, dummy, theClusterParam.sx1, + dummy, theClusterParam.sx2, dummy ); + + + theClusterParam.sigmax = theClusterParam.sigmax * micronsToCm; + theClusterParam.sx1 = theClusterParam.sx1 * micronsToCm; + theClusterParam.sx2 = theClusterParam.sx2 * micronsToCm; + + theClusterParam.sigmay = theClusterParam.sigmay * micronsToCm; + theClusterParam.sy1 = theClusterParam.sy1 * micronsToCm; + theClusterParam.sy2 = theClusterParam.sy2 * micronsToCm; + + } // if ( UseErrorsFromTemplates_ ) + else { + theClusterParam.qBin_ = 0; + } + + int Q_f_X; //!< Q of the first pixel in X + int Q_l_X; //!< Q of the last pixel in X + int Q_f_Y; //!< Q of the first pixel in Y + int Q_l_Y; //!< Q of the last pixel in Y + collect_edge_charges( theClusterParam, + Q_f_X, Q_l_X, + Q_f_Y, Q_l_Y, + UseErrorsFromTemplates_ && TruncatePixelCharge_ + ); + + //--- Find the inner widths along X and Y in one shot. We + //--- compute the upper right corner of the inner pixels + //--- (== lower left corner of upper right pixel) and + //--- the lower left corner of the inner pixels + //--- (== upper right corner of lower left pixel), and then + //--- subtract these two points in the formula. + + //--- Upper Right corner of Lower Left pixel -- in measurement frame + uint16_t llx = theClusterParam.theCluster->minPixelRow()+1; + uint16_t lly = theClusterParam.theCluster->minPixelCol()+1; + + //--- Lower Left corner of Upper Right pixel -- in measurement frame + uint16_t urx = theClusterParam.theCluster->maxPixelRow(); + uint16_t ury = theClusterParam.theCluster->maxPixelCol(); + + auto llxl = phase1PixelTopology::localX(llx); + auto llyl = phase1PixelTopology::localY(lly); + auto urxl = phase1PixelTopology::localX(urx); + auto uryl = phase1PixelTopology::localY(ury); + + + float xPos = + generic_position_formula( theClusterParam.theCluster->sizeX(), + Q_f_X, Q_l_X, + llxl, urxl, + chargeWidthX, // lorentz shift in cm + theDetParam.theThickness, + theClusterParam.cotalpha, + theDetParam.thePitchX, + phase1PixelTopology::isBigPixX( theClusterParam.theCluster->minPixelRow() ), + phase1PixelTopology::isBigPixX( theClusterParam.theCluster->maxPixelRow() ) + ); + + // apply the lorentz offset correction + xPos = xPos + shiftX + theDetParam.thePitchX*float(phase1PixelTopology::xOffset); + + float yPos = + generic_position_formula( theClusterParam.theCluster->sizeY(), + Q_f_Y, Q_l_Y, + llyl, uryl, + chargeWidthY, // lorentz shift in cm + theDetParam.theThickness, + theClusterParam.cotbeta, + theDetParam.thePitchY, + phase1PixelTopology::isBigPixY( theClusterParam.theCluster->minPixelCol() ), + phase1PixelTopology::isBigPixY( theClusterParam.theCluster->maxPixelCol() ) + ); + // apply the lorentz offset correction + yPos = yPos + shiftY + theDetParam.thePitchY*float(phase1PixelTopology::yOffset); + + + { + // ok now do GPU like ... + + pixelCPEforGPU::ClusParams cp; + + + cp.minRow[0] = theClusterParam.theCluster->minPixelRow(); + cp.maxRow[0] = theClusterParam.theCluster->maxPixelRow(); + cp.minCol[0] = theClusterParam.theCluster->minPixelCol(); + cp.maxCol[0] = theClusterParam.theCluster->maxPixelCol(); + + cp.Q_f_X[0] = Q_f_X; + cp.Q_l_X[0] = Q_l_X; + cp.Q_f_Y[0] = Q_f_Y; + cp.Q_l_Y[0] = Q_l_Y; + + auto ind = theDetParam.theDet->index(); + pixelCPEforGPU::position(m_commonParamsGPU, m_detParamsGPU[ind],cp,0); + auto xg = cp.xpos[0]; + auto yg = cp.ypos[0]; + + if(std::abs(xPos-xg)>0.001) {++statx.c; statx.maxx=std::max(statx.maxx,xPos);} + statx.maxd=std::max(std::abs(xPos-xg), statx.maxd); + if(std::abs(yPos-yg)>0.001) {++staty.c; staty.maxx=std::max(staty.maxx,yPos);} + staty.maxd=std::max(std::abs(yPos-yg), staty.maxd); + if(std::abs(xPos-xg)>0.001 || std::abs(yPos-yg)>0.001) + std::cout << (m_detParamsGPU[ind].isBarrel ? "B " : "E ") << xPos <<'/'<=upper_edge_first_pix); + float W_inner = pitch * float(lower_edge_last_pix-upper_edge_first_pix); // in cm + + //--- Predicted charge width from geometry + float W_pred = theThickness * cot_angle // geometric correction (in cm) + - lorentz_shift; // (in cm) &&& check fpix! + + W_eff = std::abs( W_pred ) - W_inner; + + //--- If the observed charge width is inconsistent with the expectations + //--- based on the track, do *not* use W_pred-W_innner. Instead, replace + //--- it with an *average* effective charge width, which is the average + //--- length of the edge pixels. + // + simple = ( W_eff < 0.0f ) | ( W_eff > pitch ); // this produces "large" regressions for very small numeric differences... + + } + if (simple) { + //--- Total length of the two edge pixels (first+last) + float sum_of_edge = 2.0f; + if (first_is_big) sum_of_edge += 1.0f; + if (last_is_big) sum_of_edge += 1.0f; + W_eff = pitch * 0.5f * sum_of_edge; // ave. length of edge pixels (first+last) (cm) + } + + + //--- Finally, compute the position in this projection + float Qdiff = Q_l - Q_f; + float Qsum = Q_l + Q_f; + + //--- Temporary fix for clusters with both first and last pixel with charge = 0 + if(Qsum==0) Qsum=1.0f; + float hit_pos = geom_center + 0.5f*(Qdiff/Qsum) * W_eff; + + return hit_pos; +} + + +//----------------------------------------------------------------------------- +//! Collect the edge charges in x and y, in a single pass over the pixel vector. +//! Calculate charge in the first and last pixel projected in x and y +//! and the inner cluster charge, projected in x and y. +//----------------------------------------------------------------------------- +void +PixelCPEFast:: +collect_edge_charges(ClusterParam & theClusterParamBase, //!< input, the cluster + int & Q_f_X, //!< output, Q first in X + int & Q_l_X, //!< output, Q last in X + int & Q_f_Y, //!< output, Q first in Y + int & Q_l_Y, //!< output, Q last in Y + bool truncate +) +{ + ClusterParamGeneric & theClusterParam = static_cast(theClusterParamBase); + + // Initialize return variables. + Q_f_X = Q_l_X = 0; + Q_f_Y = Q_l_Y = 0; + + + // Obtain boundaries in index units + int xmin = theClusterParam.theCluster->minPixelRow(); + int xmax = theClusterParam.theCluster->maxPixelRow(); + int ymin = theClusterParam.theCluster->minPixelCol(); + int ymax = theClusterParam.theCluster->maxPixelCol(); + + + // Iterate over the pixels. + int isize = theClusterParam.theCluster->size(); + for (int i = 0; i != isize; ++i) + { + auto const & pixel = theClusterParam.theCluster->pixel(i); + // ggiurgiu@fnal.gov: add pixel charge truncation + int pix_adc = pixel.adc; + if ( truncate ) + pix_adc = std::min(pix_adc, theClusterParam.pixmx ); + + // + // X projection + if ( pixel.x == xmin ) Q_f_X += pix_adc; + if ( pixel.x == xmax ) Q_l_X += pix_adc; + // + // Y projection + if ( pixel.y == ymin ) Q_f_Y += pix_adc; + if ( pixel.y == ymax ) Q_l_Y += pix_adc; + } +} + + +//============== INFLATED ERROR AND ERRORS FROM DB BELOW ================ + +//------------------------------------------------------------------------- +// Hit error in the local frame +//------------------------------------------------------------------------- +LocalError +PixelCPEFast::localError(DetParam const & theDetParam, ClusterParam & theClusterParamBase) const +{ + + ClusterParamGeneric & theClusterParam = static_cast(theClusterParamBase); + + // Default errors are the maximum error used for edge clusters. + // These are determined by looking at residuals for edge clusters + float xerr = EdgeClusterErrorX_ * micronsToCm; + float yerr = EdgeClusterErrorY_ * micronsToCm; + + + // Find if cluster is at the module edge. + int maxPixelCol = theClusterParam.theCluster->maxPixelCol(); + int maxPixelRow = theClusterParam.theCluster->maxPixelRow(); + int minPixelCol = theClusterParam.theCluster->minPixelCol(); + int minPixelRow = theClusterParam.theCluster->minPixelRow(); + + bool edgex = phase1PixelTopology::isEdgeX(minPixelRow) | phase1PixelTopology::isEdgeX(maxPixelRow); + bool edgey = phase1PixelTopology::isEdgeY(minPixelCol) | phase1PixelTopology::isEdgeY(maxPixelCol); + + unsigned int sizex = theClusterParam.theCluster->sizeX(); + unsigned int sizey = theClusterParam.theCluster->sizeY(); + + // Find if cluster contains double (big) pixels. + bool bigInX = theDetParam.theRecTopol->containsBigPixelInX( minPixelRow, maxPixelRow ); + bool bigInY = theDetParam.theRecTopol->containsBigPixelInY( minPixelCol, maxPixelCol ); + + if (UseErrorsFromTemplates_ ) { + // + // Use template errors + + if ( !edgex ) { // Only use this for non-edge clusters + if ( sizex == 1 ) { + if ( !bigInX ) {xerr = theClusterParam.sx1;} + else {xerr = theClusterParam.sx2;} + } else {xerr = theClusterParam.sigmax;} + } + + if ( !edgey ) { // Only use for non-edge clusters + if ( sizey == 1 ) { + if ( !bigInY ) {yerr = theClusterParam.sy1;} + else {yerr = theClusterParam.sy2;} + } else {yerr = theClusterParam.sigmay;} + } + + } else { // simple errors + + // This are the simple errors, hardcoded in the code + //cout << "Track angles are not known " << endl; + //cout << "Default angle estimation which assumes track from PV (0,0,0) does not work." << endl; + + if ( GeomDetEnumerators::isTrackerPixel(theDetParam.thePart) ) { + if(GeomDetEnumerators::isBarrel(theDetParam.thePart)) { + + DetId id = (theDetParam.theDet->geographicalId()); + int layer=ttopo_.layer(id); + if ( layer==1 ) { + if ( !edgex ) { + if ( sizex<=xerr_barrel_l1_.size() ) xerr=xerr_barrel_l1_[sizex-1]; + else xerr=xerr_barrel_l1_def_; + } + + if ( !edgey ) { + if ( sizey<=yerr_barrel_l1_.size() ) yerr=yerr_barrel_l1_[sizey-1]; + else yerr=yerr_barrel_l1_def_; + } + } else{ // layer 2,3 + if ( !edgex ) { + if ( sizex<=xerr_barrel_ln_.size() ) xerr=xerr_barrel_ln_[sizex-1]; + else xerr=xerr_barrel_ln_def_; + } + + if ( !edgey ) { + if ( sizey<=yerr_barrel_ln_.size() ) yerr=yerr_barrel_ln_[sizey-1]; + else yerr=yerr_barrel_ln_def_; + } + } + + } else { // EndCap + + if ( !edgex ) { + if ( sizex<=xerr_endcap_.size() ) xerr=xerr_endcap_[sizex-1]; + else xerr=xerr_endcap_def_; + } + + if ( !edgey ) { + if ( sizey<=yerr_endcap_.size() ) yerr=yerr_endcap_[sizey-1]; + else yerr=yerr_endcap_def_; + } + } // end endcap + } + + } // end + + auto xerr_sq = xerr*xerr; + auto yerr_sq = yerr*yerr; + + return LocalError( xerr_sq, 0, yerr_sq ); + +} From ce917a7c37eb90d3155b114472043bf379f2395b Mon Sep 17 00:00:00 2001 From: Cesare Date: Wed, 7 Feb 2018 12:46:29 +0100 Subject: [PATCH 14/88] Restore the use of unsigned char --- .../plugins/SiPixelFedCablingMapGPU.cc | 16 +++++++--------- .../plugins/SiPixelFedCablingMapGPU.h | 6 +++--- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.cc b/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.cc index bf92d541a9488..81bffcbc4b988 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.cc +++ b/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.cc @@ -31,8 +31,8 @@ void processCablingMap(SiPixelFedCablingMap const& cablingMap, TrackerGeometry std::vector RawId(MAX_SIZE); std::vector rocInDet(MAX_SIZE); std::vector moduleId(MAX_SIZE); - std::vector badRocs(MAX_SIZE); - std::vector modToUnp(MAX_SIZE); + std::vector badRocs(MAX_SIZE); + std::vector modToUnp(MAX_SIZE); unsigned int startFed = *(fedIds.begin()); unsigned int endFed = *(fedIds.end() - 1); @@ -75,10 +75,8 @@ void processCablingMap(SiPixelFedCablingMap const& cablingMap, TrackerGeometry // Link varies between 1 to 48 // idinLnk varies between 1 to 8 - cudaDeviceSynchronize(); - for (int i = 1; i < index; i++) { if (RawId[i] == 9999) { moduleId[i] = 9999; @@ -92,9 +90,9 @@ void processCablingMap(SiPixelFedCablingMap const& cablingMap, TrackerGeometry moduleId[i] = gdet->index(); } LogDebug("SiPixelFedCablingMapGPU") << "----------------------------------------------------------------------------" << std::endl; - LogDebug("SiPixelFedCablingMapGPU") << i << std::setw(20) << fedMap[i] << std::setw(20) << linkMap[i] << std::setw(20) << rocMap[i] << std::endl; - LogDebug("SiPixelFedCablingMapGPU") << i << std::setw(20) << RawId[i] << std::setw(20) << rocInDet[i] << std::setw(20) << moduleId[i] << std::endl; - LogDebug("SiPixelFedCablingMapGPU") << i << std::setw(20) << badRocs[i] << std::setw(20) << modToUnp[i] << std::endl; + LogDebug("SiPixelFedCablingMapGPU") << i << std::setw(20) << fedMap[i] << std::setw(20) << linkMap[i] << std::setw(20) << rocMap[i] << std::endl; + LogDebug("SiPixelFedCablingMapGPU") << i << std::setw(20) << RawId[i] << std::setw(20) << rocInDet[i] << std::setw(20) << moduleId[i] << std::endl; + LogDebug("SiPixelFedCablingMapGPU") << i << std::setw(20) << (bool) badRocs[i] << std::setw(20) << (bool) modToUnp[i] << std::endl; LogDebug("SiPixelFedCablingMapGPU") << "----------------------------------------------------------------------------" << std::endl; } @@ -105,8 +103,8 @@ void processCablingMap(SiPixelFedCablingMap const& cablingMap, TrackerGeometry cudaCheck(cudaMemcpy(cablingMapGPU->RawId, RawId.data(), RawId.size() * sizeof(unsigned int), cudaMemcpyHostToDevice)); cudaCheck(cudaMemcpy(cablingMapGPU->rocInDet, rocInDet.data(), rocInDet.size() * sizeof(unsigned int), cudaMemcpyHostToDevice)); cudaCheck(cudaMemcpy(cablingMapGPU->moduleId, moduleId.data(), moduleId.size() * sizeof(unsigned int), cudaMemcpyHostToDevice)); - cudaCheck(cudaMemcpy(cablingMapGPU->badRocs, badRocs.data(), badRocs.size() * sizeof(short int), cudaMemcpyHostToDevice)); - cudaCheck(cudaMemcpy(cablingMapGPU->modToUnp, modToUnp.data(), modToUnp.size() * sizeof(short int), cudaMemcpyHostToDevice)); + cudaCheck(cudaMemcpy(cablingMapGPU->badRocs, badRocs.data(), badRocs.size() * sizeof(unsigned char), cudaMemcpyHostToDevice)); + cudaCheck(cudaMemcpy(cablingMapGPU->modToUnp, modToUnp.data(), modToUnp.size() * sizeof(unsigned char), cudaMemcpyHostToDevice)); cudaCheck(cudaMemcpy(cablingMapDevice, cablingMapGPU, sizeof(SiPixelFedCablingMapGPU), cudaMemcpyHostToDevice)); cudaDeviceSynchronize(); } diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.h b/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.h index dc0bc1bf9b0d5..7dee0da744e1e 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.h +++ b/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.h @@ -20,7 +20,7 @@ const unsigned int MAX_LINK = 48; // maximum links/channels for Phase 1 const unsigned int MAX_ROC = 8; const unsigned int MAX_SIZE = MAX_FED * MAX_LINK * MAX_ROC; const unsigned int MAX_SIZE_BYTE_INT = MAX_SIZE * sizeof(unsigned int); -const unsigned int MAX_SIZE_BYTE_BOOL = MAX_SIZE * sizeof(short int); +const unsigned int MAX_SIZE_BYTE_BOOL = MAX_SIZE * sizeof(unsigned char); struct SiPixelFedCablingMapGPU { unsigned int size; @@ -30,8 +30,8 @@ struct SiPixelFedCablingMapGPU { unsigned int * RawId; unsigned int * rocInDet; unsigned int * moduleId; - short int * modToUnp; - short int * badRocs; + unsigned char * modToUnp; + unsigned char * badRocs; }; inline From 6c63581eda9192a6a9bc0947803fee880bccd803 Mon Sep 17 00:00:00 2001 From: Cesare Date: Wed, 7 Feb 2018 12:46:29 +0100 Subject: [PATCH 15/88] Clean up --- .../plugins/SiPixelRawToDigiGPU.cc | 190 +++++++----------- 1 file changed, 75 insertions(+), 115 deletions(-) diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc index a09be4ea2ed42..fcfcec1b1791d 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc +++ b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc @@ -1,11 +1,3 @@ -// Skip FED40 pilot-blade -// Include parameter driven interface to SiPixelQuality for study purposes -// exclude ROC(raw) based on bad ROC list in SiPixelQuality -// enabled by: process.siPixelDigis.UseQualityInfo = True (BY DEFAULT NOT USED) -// 20-10-2010 Andrew York (Tennessee) -// Jan 2016 Tamas Almos Vami (Tav) (Wigner RCP) -- Cabling Map label option -// Jul 2017 Viktor Veszpremi -- added PixelFEDChannel - // This code is an entry point for GPU based pixel track reconstruction for HLT // Modified by Sushil and Shashi for this purpose July-2017 @@ -47,7 +39,6 @@ #include "FWCore/PluginManager/interface/ModuleDef.h" #include "FWCore/Framework/interface/MakerMacros.h" - #include "EventInfoGPU.h" #include "RawToDigiGPU.h" #include "SiPixelFedCablingMapGPU.h" @@ -64,7 +55,6 @@ SiPixelRawToDigiGPU::SiPixelRawToDigiGPU( const edm::ParameterSet& conf ) hCPU(nullptr), hDigi(nullptr), theSiPixelGainCalibration_(conf) { - includeErrors = config_.getParameter("IncludeErrors"); useQuality = config_.getParameter("UseQualityInfo"); if (config_.exists("ErrorList")) { @@ -75,8 +65,7 @@ SiPixelRawToDigiGPU::SiPixelRawToDigiGPU( const edm::ParameterSet& conf ) } tFEDRawDataCollection = consumes (config_.getParameter("InputLabel")); - - //start counters + // start counters ndigis = 0; nwords = 0; @@ -89,7 +78,7 @@ SiPixelRawToDigiGPU::SiPixelRawToDigiGPU( const edm::ParameterSet& conf ) produces >(); } - //GPU "product" + // GPU "product" produces>(); // regions @@ -130,9 +119,9 @@ SiPixelRawToDigiGPU::SiPixelRawToDigiGPU( const edm::ParameterSet& conf ) // device copy of GPU friendly cablng map allocateCablingMap(cablingMapGPUHost_, cablingMapGPUDevice_); - int WSIZE = MAX_FED*MAX_WORD*sizeof(unsigned int); + int WSIZE = MAX_FED * MAX_WORD * sizeof(unsigned int); cudaMallocHost(&word, sizeof(unsigned int)*WSIZE); - cudaMallocHost(&fedId_h, sizeof(unsigned char)*WSIZE); + cudaMallocHost(&fedId_h, sizeof(unsigned char)*WSIZE); // to store the output of RawToDigi cudaMallocHost(&pdigi_h, sizeof(uint32_t)*WSIZE); @@ -143,22 +132,13 @@ SiPixelRawToDigiGPU::SiPixelRawToDigiGPU( const edm::ParameterSet& conf ) cudaMallocHost(&errWord_h, sizeof(uint32_t)*WSIZE); cudaMallocHost(&errFedID_h, sizeof(uint32_t)*WSIZE); - // mIndexStart_h = new int[NMODULE+1]; - // mIndexEnd_h = new int[NMODULE+1]; cudaMallocHost(&mIndexStart_h, sizeof(int)*(NMODULE+1)); cudaMallocHost(&mIndexEnd_h, sizeof(int)*(NMODULE+1)); // allocate memory for RawToDigi on GPU context_ = initDeviceMemory(); - - // // allocate auxilary memory for clustering - // initDeviceMemCluster(); - - // // allocate memory for CPE on GPU - // initDeviceMemCPE(); } - // ----------------------------------------------------------------------------- SiPixelRawToDigiGPU::~SiPixelRawToDigiGPU() { edm::LogInfo("SiPixelRawToDigiGPU") << " HERE ** SiPixelRawToDigiGPU destructor!"; @@ -188,7 +168,6 @@ SiPixelRawToDigiGPU::~SiPixelRawToDigiGPU() { cudaCheck(cudaFree(gainForHLTonGPU_)); cudaCheck(cudaFree(gainDataOnGPU_)); - // free device memory used for RawToDigi on GPU freeMemory(context_); @@ -237,16 +216,13 @@ SiPixelRawToDigiGPU::fillDescriptions(edm::ConfigurationDescriptions& descriptio void SiPixelRawToDigiGPU::produce( edm::Event& ev, const edm::EventSetup& es) { - - //Setup gain calibration service - theSiPixelGainCalibration_.setESObjects( es ); - + // setup gain calibration service + theSiPixelGainCalibration_.setESObjects( es ); int theWordCounter = 0; int theDigiCounter = 0; const uint32_t dummydetid = 0xffffffff; - //debug = edm::MessageDrop::instance()->debugEnabled; - debug = false; + debug = edm::MessageDrop::instance()->debugEnabled; // initialize quality record or update if necessary if (qualityWatcher.check( es ) && useQuality) { @@ -283,9 +259,7 @@ SiPixelRawToDigiGPU::produce( edm::Event& ev, const edm::EventSetup& es) // convert the cabling map to a GPU-friendly version processCablingMap(*cablingMap, *geom.product(), cablingMapGPUHost_, cablingMapGPUDevice_, badPixelInfo_, modules); - processGainCalibration(theSiPixelGainCalibration_.payload(), *geom.product(), gainForHLTonGPU_, gainDataOnGPU_); - } edm::Handle buffers; @@ -301,7 +275,6 @@ SiPixelRawToDigiGPU::produce( edm::Event& ev, const edm::EventSetup& es) //PixelDataFormatter formatter(cabling_.get()); // phase 0 only PixelDataFormatter formatter(cabling_.get(), usePhase1); // for phase 1 & 0 - PixelDataFormatter::DetErrors nodeterrors; PixelDataFormatter::Errors errors; @@ -316,14 +289,10 @@ SiPixelRawToDigiGPU::produce( edm::Event& ev, const edm::EventSetup& es) ErrorChecker errorcheck; for (auto aFed = fedIds.begin(); aFed != fedIds.end(); ++aFed) { - int fedId = *aFed; if (!usePilotBlade && (fedId==40) ) continue; // skip pilot blade data if (regions_ && !regions_->mayUnpackFED(fedId)) continue; - #if 0 - if (debug) LogDebug("SiPixelRawToDigiGPU") << " PRODUCE DIGI FOR FED: " << fedId << endl; - #endif // for GPU // first 150 index stores the fedId and next 150 will store the @@ -331,10 +300,10 @@ SiPixelRawToDigiGPU::produce( edm::Event& ev, const edm::EventSetup& es) assert(fedId>=1200); fedCounter++; - //get event data for this fed + // get event data for this fed const FEDRawData& rawData = buffers->FEDData( fedId ); - //GPU specific + // GPU specific int nWords = rawData.size()/sizeof(cms_uint64_t); if (nWords == 0) { continue; @@ -342,7 +311,7 @@ SiPixelRawToDigiGPU::produce( edm::Event& ev, const edm::EventSetup& es) // check CRC bit const cms_uint64_t* trailer = reinterpret_cast(rawData.data())+(nWords-1); - if (!errorcheck.checkCRC(errorsInEvent, fedId, trailer, errors)) { + if (not errorcheck.checkCRC(errorsInEvent, fedId, trailer, errors)) { continue; } @@ -351,7 +320,6 @@ SiPixelRawToDigiGPU::produce( edm::Event& ev, const edm::EventSetup& es) bool moreHeaders = true; while (moreHeaders) { header++; - //LogTrace("") << "HEADER: " << print(*header); bool headerStatus = errorcheck.checkHeader(errorsInEvent, fedId, header, errors); moreHeaders = headerStatus; } @@ -361,7 +329,6 @@ SiPixelRawToDigiGPU::produce( edm::Event& ev, const edm::EventSetup& es) trailer++; while (moreTrailers) { trailer--; - //LogTrace("") << "TRAILER: " << print(*trailer); bool trailerStatus = errorcheck.checkTrailer(errorsInEvent, fedId, nWords, trailer, errors); moreTrailers = trailerStatus; } @@ -370,59 +337,52 @@ SiPixelRawToDigiGPU::produce( edm::Event& ev, const edm::EventSetup& es) const cms_uint32_t * bw = (const cms_uint32_t *)(header+1); const cms_uint32_t * ew = (const cms_uint32_t *)(trailer); - // if ( *(ew-1) == 0 ) { ew--; theWordCounter--;} + assert(0 == (ew-bw)%2); std::memcpy(word+wordCounterGPU,bw,sizeof(cms_uint32_t)*(ew-bw)); std::memset(fedId_h+wordCounterGPU/2,fedId - 1200,(ew-bw)/2); wordCounterGPU+=(ew-bw); - } // end of for loop + } // end of for loop // GPU specific: RawToDigi -> clustering + uint32_t nModulesActive=0; + RawToDigi_wrapper(context_, cablingMapGPUDevice_, gainForHLTonGPU_, wordCounterGPU, word, fedCounter, fedId_h, convertADCtoElectrons, pdigi_h, + rawIdArr_h, errType_h, errWord_h, errFedID_h, errRawID_h, useQuality, includeErrors, debug, nModulesActive); + + auto gpuProd = std::make_unique>(); + gpuProd->resize(3); + (*gpuProd)[0]=uint64_t(&context_); + (*gpuProd)[1]=wordCounterGPU; + (*gpuProd)[2]=nModulesActive; + ev.put(std::move(gpuProd)); + + for (uint32_t i = 0; i < wordCounterGPU; i++) { + if (pdigi_h[i]==0) continue; + detDigis = &(*collection).find_or_insert(rawIdArr_h[i]); + if ( (*detDigis).empty() ) (*detDigis).data.reserve(32); // avoid the first relocations + break; + } - - uint32_t nModulesActive=0; - RawToDigi_wrapper(context_, cablingMapGPUDevice_, gainForHLTonGPU_, wordCounterGPU, word, fedCounter, fedId_h, convertADCtoElectrons, pdigi_h, - rawIdArr_h, errType_h, errWord_h, errFedID_h, errRawID_h, useQuality, includeErrors, debug,nModulesActive); - - - auto gpuProd = std::make_unique>(); - gpuProd->resize(3); - (*gpuProd)[0]=uint64_t(&context_); - (*gpuProd)[1]=wordCounterGPU; - (*gpuProd)[2]=nModulesActive; - ev.put(std::move(gpuProd)); - - - for (uint32_t i = 0; i < wordCounterGPU; i++) { - if (pdigi_h[i]==0) continue; - detDigis = &(*collection).find_or_insert(rawIdArr_h[i]); - if ( (*detDigis).empty() ) (*detDigis).data.reserve(32); // avoid the first relocations - break; - } - - for (uint32_t i = 0; i < wordCounterGPU; i++) { - if (pdigi_h[i]==0) continue; - assert(rawIdArr_h[i] > 109999); - if ( (*detDigis).detId() != rawIdArr_h[i]) - { - detDigis = &(*collection).find_or_insert(rawIdArr_h[i]); - if ( (*detDigis).empty() ) - (*detDigis).data.reserve(32); // avoid the first relocations - } - (*detDigis).data.emplace_back(pdigi_h[i]); - theDigiCounter++; + for (uint32_t i = 0; i < wordCounterGPU; i++) { + if (pdigi_h[i]==0) continue; + assert(rawIdArr_h[i] > 109999); + if ( (*detDigis).detId() != rawIdArr_h[i]) + { + detDigis = &(*collection).find_or_insert(rawIdArr_h[i]); + if ( (*detDigis).empty() ) + (*detDigis).data.reserve(32); // avoid the first relocations } + (*detDigis).data.emplace_back(pdigi_h[i]); + theDigiCounter++; + } - for (uint32_t i = 0; i < wordCounterGPU; i++) { - if (errType_h[i] != 0) { - SiPixelRawDataError error(errWord_h[i], errType_h[i], errFedID_h[i]+1200); - errors[errRawID_h[i]].push_back(error); - } + for (uint32_t i = 0; i < wordCounterGPU; i++) { + if (errType_h[i] != 0) { + SiPixelRawDataError error(errWord_h[i], errType_h[i], errFedID_h[i]+1200); + errors[errRawID_h[i]].push_back(error); } - - - fedCounter =0; + } if (theTimer) { theTimer->stop(); @@ -430,12 +390,12 @@ SiPixelRawToDigiGPU::produce( edm::Event& ev, const edm::EventSetup& es) ndigis += theDigiCounter; nwords += theWordCounter; LogDebug("SiPixelRawToDigiGPU") << " (Words/Digis) this ev: " - << theWordCounter << "/" << theDigiCounter << "--- all :" << nwords << "/" << ndigis; + << theWordCounter << "/" << theDigiCounter << "--- all :" << nwords << "/" << ndigis; hCPU->Fill(theTimer->realTime()); hDigi->Fill(theDigiCounter); } - //pack errors into collection + // pack errors into collection if (includeErrors) { typedef PixelDataFormatter::Errors::iterator IE; @@ -465,41 +425,41 @@ SiPixelRawToDigiGPU::produce( edm::Event& ev, const edm::EventSetup& es) cms_uint32_t linkId = formatter.linkId(aPixelError.getWord32()); const sipixelobjects::PixelFEDLink* link = fed->link(linkId); if (link) { - // The "offline" 0..15 numbering is fixed by definition, also, the FrameConversion depends on it - // in contrast, the ROC-in-channel numbering is determined by hardware --> better to use the "offline" scheme - PixelFEDChannel ch = {fed->id(), linkId, 25, 0}; - for (unsigned int iRoc = 1; iRoc <= link->numberOfROCs(); iRoc++) { + // The "offline" 0..15 numbering is fixed by definition, also, the FrameConversion depends on it + // in contrast, the ROC-in-channel numbering is determined by hardware --> better to use the "offline" scheme + PixelFEDChannel ch = {fed->id(), linkId, 25, 0}; + for (unsigned int iRoc = 1; iRoc <= link->numberOfROCs(); iRoc++) { const sipixelobjects::PixelROC * roc = link->roc(iRoc); if (roc->idInDetUnit() < ch.roc_first) ch.roc_first = roc->idInDetUnit(); if (roc->idInDetUnit() > ch.roc_last) ch.roc_last = roc->idInDetUnit(); } - if (ch.roc_first::iterator it_find = find(tkerrorlist.begin(), tkerrorlist.end(), aPixelError.getType()); - if (it_find != tkerrorlist.end()) { + // fill list of detIds to be turned off by tracking + if (!tkerrorlist.empty()) { + std::vector::iterator it_find = find(tkerrorlist.begin(), tkerrorlist.end(), aPixelError.getType()); + if (it_find != tkerrorlist.end()) { tkerror_detidcollection->push_back(errordetid); - } - } - } + } + } + } - // fill list of detIds with errors to be studied - if (!usererrorlist.empty()) { - std::vector::iterator it_find = find(usererrorlist.begin(), usererrorlist.end(), aPixelError.getType()); - if (it_find != usererrorlist.end()) { - usererror_detidcollection->push_back(errordetid); - } - } + // fill list of detIds with errors to be studied + if (!usererrorlist.empty()) { + std::vector::iterator it_find = find(usererrorlist.begin(), usererrorlist.end(), aPixelError.getType()); + if (it_find != usererrorlist.end()) { + usererror_detidcollection->push_back(errordetid); + } + } - } // loop on DetSet of errors + } // loop on DetSet of errors - if (!disabledChannelsDetSet.empty()) { - disabled_channelcollection->insert(errordetid, disabledChannelsDetSet.data(), disabledChannelsDetSet.size()); - } + if (!disabledChannelsDetSet.empty()) { + disabled_channelcollection->insert(errordetid, disabledChannelsDetSet.data(), disabledChannelsDetSet.size()); + } } // if error assigned to a real DetId } // loop on errors in event for this FED @@ -510,7 +470,7 @@ SiPixelRawToDigiGPU::produce( edm::Event& ev, const edm::EventSetup& es) errorDetSet.data = nodeterrors; } - //send digis and errors back to framework + // send digis and errors back to framework ev.put(std::move(collection)); if (includeErrors) { ev.put(std::move(errorcollection)); @@ -519,7 +479,7 @@ SiPixelRawToDigiGPU::produce( edm::Event& ev, const edm::EventSetup& es) ev.put(std::move(disabled_channelcollection)); } -} //end of produce function +} // end of produce function -//define as runnable module +// define as framework plugin DEFINE_FWK_MODULE(SiPixelRawToDigiGPU); From 5cd293f326bdde472dc5303d90deab582e97fd3b Mon Sep 17 00:00:00 2001 From: Andrea Bocci Date: Thu, 15 Feb 2018 18:14:35 +0100 Subject: [PATCH 16/88] Move cudaCheck.h under HeterogeneousCore/CUDAUtilities --- EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.cu | 2 +- .../SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.h | 2 +- EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc | 2 +- .../CUDAUtilities/interface}/cudaCheck.h | 6 +++--- RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.cu | 2 +- RecoLocalTracker/SiPixelRecHits/src/PixelCPEFast.cc | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) rename {EventFilter/SiPixelRawToDigi/plugins => HeterogeneousCore/CUDAUtilities/interface}/cudaCheck.h (86%) diff --git a/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.cu b/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.cu index b5d5bb0be9548..29d167899c1eb 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.cu +++ b/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.cu @@ -32,7 +32,7 @@ #include #include -#include "cudaCheck.h" +#include "HeterogeneousCore/CUDAUtilities/interface/cudaCheck.h" #include "EventInfoGPU.h" #include "RawToDigiGPU.h" #include "SiPixelFedCablingMapGPU.h" diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.h b/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.h index 7dee0da744e1e..380a6ae406ec1 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.h +++ b/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.h @@ -3,7 +3,7 @@ #include -#include "cudaCheck.h" +#include "HeterogeneousCore/CUDAUtilities/interface/cudaCheck.h" class SiPixelFedCablingMap; class SiPixelQuality; diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc index fcfcec1b1791d..06e12f246ee49 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc +++ b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc @@ -43,7 +43,7 @@ #include "RawToDigiGPU.h" #include "SiPixelFedCablingMapGPU.h" #include "SiPixelRawToDigiGPU.h" -#include "cudaCheck.h" +#include "HeterogeneousCore/CUDAUtilities/interface/cudaCheck.h" using namespace std; diff --git a/EventFilter/SiPixelRawToDigi/plugins/cudaCheck.h b/HeterogeneousCore/CUDAUtilities/interface/cudaCheck.h similarity index 86% rename from EventFilter/SiPixelRawToDigi/plugins/cudaCheck.h rename to HeterogeneousCore/CUDAUtilities/interface/cudaCheck.h index c2689f7016d43..6d7684694c1d6 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/cudaCheck.h +++ b/HeterogeneousCore/CUDAUtilities/interface/cudaCheck.h @@ -1,5 +1,5 @@ -#ifndef EventFilter_SiPixelRawToDigi_cudaCheck_h -#define EventFilter_SiPixelRawToDigi_cudaCheck_h +#ifndef HeterogeneousCore_CUDAUtilities_cudaCheck_h +#define HeterogeneousCore_CUDAUtilities_cudaCheck_h #include #include @@ -36,4 +36,4 @@ bool cudaCheck_(const char* file, int line, const char* cmd, cudaError_t result) #define cudaCheck(ARG) (cudaCheck_(__FILE__, __LINE__, #ARG, (ARG))) -#endif // EventFilter_SiPixelRawToDigi_cudaCheck_h +#endif // HeterogeneousCore_CUDAUtilities_cudaCheck_h diff --git a/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.cu b/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.cu index fb38fd3cfb24a..1948e522a4468 100644 --- a/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.cu +++ b/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.cu @@ -4,7 +4,7 @@ #include "RecoLocalTracker/SiPixelClusterizer/plugins/gpuClustering.h" #include "EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.h" // for context.... -#include "EventFilter/SiPixelRawToDigi/plugins/cudaCheck.h" +#include "HeterogeneousCore/CUDAUtilities/interface/cudaCheck.h" // CUDA runtime #include diff --git a/RecoLocalTracker/SiPixelRecHits/src/PixelCPEFast.cc b/RecoLocalTracker/SiPixelRecHits/src/PixelCPEFast.cc index e2d238563ec43..dcca841e6d156 100644 --- a/RecoLocalTracker/SiPixelRecHits/src/PixelCPEFast.cc +++ b/RecoLocalTracker/SiPixelRecHits/src/PixelCPEFast.cc @@ -17,7 +17,7 @@ #include #include -#include "EventFilter/SiPixelRawToDigi/plugins/cudaCheck.h" +#include "HeterogeneousCore/CUDAUtilities/interface/cudaCheck.h" #include From 2f625fcc676bbc215f107835e9199df43cf1fb35 Mon Sep 17 00:00:00 2001 From: Cesare Calabria Date: Tue, 20 Feb 2018 15:51:36 +0100 Subject: [PATCH 17/88] R2D: use GPU::SimpleVector for the error unpacking (#14) --- .../SiPixelRawToDigi/plugins/RawToDigiGPU.cu | 72 +++++++------------ .../SiPixelRawToDigi/plugins/RawToDigiGPU.h | 32 ++++++--- .../plugins/SiPixelFedCablingMapGPU.cc | 6 +- .../plugins/SiPixelRawToDigiGPU.cc | 43 ++++++----- .../plugins/SiPixelRawToDigiGPU.h | 4 +- .../python/SiPixelRawToDigi_cfi.py | 1 + .../CUDAUtilities/interface/GPUSimpleVector.h | 8 ++- 7 files changed, 86 insertions(+), 80 deletions(-) diff --git a/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.cu b/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.cu index 29d167899c1eb..e9634b34dcc37 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.cu +++ b/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.cu @@ -46,6 +46,9 @@ context initDeviceMemory() { constexpr uint32_t MAX_WORD08_SIZE = MAX_FED * MAX_WORD * sizeof(uint8_t); constexpr uint32_t MAX_WORD32_SIZE = MAX_FED * MAX_WORD * sizeof(uint32_t); constexpr uint32_t MAX_WORD16_SIZE = MAX_FED * MAX_WORD * sizeof(uint16_t); + constexpr uint32_t vsize = sizeof(GPU::SimpleVector); + constexpr uint32_t esize = sizeof(error_obj); + constexpr uint32_t MAX_ERROR_SIZE = MAX_FED * MAX_WORD * esize; cudaCheck(cudaMalloc((void**) & c.word_d, MAX_WORD32_SIZE)); cudaCheck(cudaMalloc((void**) & c.fedId_d, MAX_WORD08_SIZE)); @@ -56,11 +59,8 @@ context initDeviceMemory() { cudaCheck(cudaMalloc((void**) & c.moduleInd_d, MAX_WORD16_SIZE)); cudaCheck(cudaMalloc((void**) & c.rawIdArr_d, MAX_WORD32_SIZE)); - cudaCheck(cudaMalloc((void**) & c.errType_d, MAX_WORD32_SIZE)); - cudaCheck(cudaMalloc((void**) & c.errWord_d, MAX_WORD32_SIZE)); - cudaCheck(cudaMalloc((void**) & c.errFedID_d, MAX_WORD32_SIZE)); - cudaCheck(cudaMalloc((void**) & c.errRawID_d, MAX_WORD32_SIZE)); - + cudaCheck(cudaMalloc((void**) & c.error_d, vsize)); + cudaCheck(cudaMalloc((void**) & c.data_d, MAX_ERROR_SIZE)); // for the clusterizer cudaCheck(cudaMalloc((void**) & c.clus_d, MAX_WORD32_SIZE)); // cluser index in module @@ -71,7 +71,6 @@ context initDeviceMemory() { cudaCheck(cudaMalloc((void**) & c.debug_d, MAX_WORD32_SIZE)); - // create a CUDA stream cudaCheck(cudaStreamCreate(&c.stream)); @@ -89,10 +88,8 @@ void freeMemory(context & c) { cudaCheck(cudaFree(c.adc_d)); cudaCheck(cudaFree(c.moduleInd_d)); cudaCheck(cudaFree(c.rawIdArr_d)); - cudaCheck(cudaFree(c.errType_d)); - cudaCheck(cudaFree(c.errWord_d)); - cudaCheck(cudaFree(c.errFedID_d)); - cudaCheck(cudaFree(c.errRawID_d)); + cudaCheck(cudaFree(c.error_d)); + cudaCheck(cudaFree(c.data_d)); // these are for the clusterizer (to be moved) cudaCheck(cudaFree(c.moduleStart_d)); @@ -453,11 +450,10 @@ __device__ uint32_t getErrRawID(uint32_t fedId, uint32_t errWord, uint32_t error __global__ void RawToDigi_kernel(const SiPixelFedCablingMapGPU *Map, const uint32_t wordCounter, const uint32_t *Word, const uint8_t *fedIds, uint16_t * XX, uint16_t * YY, uint16_t * ADC, uint32_t * pdigi, uint32_t *rawIdArr, uint16_t * moduleId, - uint32_t *errType, uint32_t *errWord, uint32_t *errFedID, uint32_t *errRawID, + GPU::SimpleVector *err, bool useQualityInfo, bool includeErrors, bool debug) { uint32_t blockId = blockIdx.x; - uint32_t threadId = threadIdx.x; bool skipROC = false; @@ -474,14 +470,7 @@ __global__ void RawToDigi_kernel(const SiPixelFedCablingMapGPU *Map, const uint3 rawIdArr[gIndex] = 0; moduleId[gIndex] = 9999; - uint32_t ww = Word[gIndex]; // Array containing 32 bit raw data - if (includeErrors) { - errType[gIndex] = 0; - errWord[gIndex] = ww; - errFedID[gIndex] = fedId; - errRawID[gIndex] = 0; - } if (ww == 0) { //noise and dead channels are ignored XX[gIndex] = 0; // 0 is an indicator of a noise/dead channel @@ -490,25 +479,19 @@ __global__ void RawToDigi_kernel(const SiPixelFedCablingMapGPU *Map, const uint3 continue ; // 0: bad word } - uint32_t link = getLink(ww); // Extract link uint32_t roc = getRoc(ww); // Extract Roc in link DetIdGPU detId = getRawId(Map, fedId, link, roc); - uint32_t errorType = checkROC(ww, fedId, link, Map, debug); skipROC = (roc < maxROCIndex) ? false : (errorType != 0); if (includeErrors and skipROC) { uint32_t rID = getErrRawID(fedId, ww, errorType, Map, debug); - errType[gIndex] = errorType; - errWord[gIndex] = ww; - errFedID[gIndex] = fedId; - errRawID[gIndex] = rID; + err->emplace_back(rID, ww, errorType, fedId); continue; } - uint32_t rawId = detId.RawId; uint32_t rocIdInDetUnit = detId.rocInDet; bool barrel = isBarrel(rawId); @@ -551,10 +534,7 @@ __global__ void RawToDigi_kernel(const SiPixelFedCablingMapGPU *Map, const uint3 if (includeErrors) { if (not rocRowColIsValid(row, col)) { uint32_t error = conversionError(fedId, 3, debug); //use the device function and fill the arrays - errType[gIndex] = error; - errWord[gIndex] = ww; - errFedID[gIndex] = fedId; - errRawID[gIndex] = rawId; + err->emplace_back(rawId, ww, error, fedId); if(debug) printf("BPIX1 Error status: %i\n", error); continue; } @@ -569,10 +549,7 @@ __global__ void RawToDigi_kernel(const SiPixelFedCablingMapGPU *Map, const uint3 localPix.col = col; if (includeErrors and not dcolIsValid(dcol, pxid)) { uint32_t error = conversionError(fedId, 3, debug); - errType[gIndex] = error; - errWord[gIndex] = ww; - errFedID[gIndex] = fedId; - errRawID[gIndex] = rawId; + err->emplace_back(rawId, ww, error, fedId); if(debug) printf("Error status: %i %d %d %d %d\n", error, dcol, pxid, fedId, roc); continue; } @@ -587,8 +564,6 @@ __global__ void RawToDigi_kernel(const SiPixelFedCablingMapGPU *Map, const uint3 rawIdArr[gIndex] = rawId; } // end of if (gIndex < end) } // end fake loop - - } // end of Raw to Digi kernel @@ -599,7 +574,7 @@ void RawToDigi_wrapper( const uint32_t wordCounter, uint32_t *word, const uint32_t fedCounter, uint8_t *fedId_h, bool convertADCtoElectrons, uint32_t * pdigi_h, uint32_t *rawIdArr_h, - uint32_t *errType_h, uint32_t *errWord_h, uint32_t *errFedID_h, uint32_t *errRawID_h, + GPU::SimpleVector *error_h, GPU::SimpleVector *error_h_tmp, error_obj *data_h, bool useQualityInfo, bool includeErrors, bool debug, uint32_t & nModulesActive) { const int threadsPerBlock = 512; @@ -610,7 +585,11 @@ void RawToDigi_wrapper( // wordCounter is the total no of words in each event to be trasfered on device cudaCheck(cudaMemcpyAsync(&c.word_d[0], &word[0], wordCounter*sizeof(uint32_t), cudaMemcpyHostToDevice, c.stream)); cudaCheck(cudaMemcpyAsync(&c.fedId_d[0], &fedId_h[0], wordCounter*sizeof(uint8_t)/2, cudaMemcpyHostToDevice, c.stream)); - + + constexpr uint32_t vsize = sizeof(GPU::SimpleVector); + constexpr uint32_t esize = sizeof(error_obj); + cudaCheck(cudaMemcpyAsync(c.error_d, error_h_tmp, vsize, cudaMemcpyHostToDevice, c.stream)); + // Launch rawToDigi kernel RawToDigi_kernel<<>>( cablingMapDevice, @@ -621,10 +600,7 @@ void RawToDigi_wrapper( c.pdigi_d, c.rawIdArr_d, c.moduleInd_d, - c.errType_d, - c.errWord_d, - c.errFedID_d, - c.errRawID_d, + c.error_d, useQualityInfo, includeErrors, debug); @@ -636,15 +612,15 @@ void RawToDigi_wrapper( cudaCheck(cudaMemcpyAsync(rawIdArr_h, c.rawIdArr_d, wordCounter*sizeof(uint32_t), cudaMemcpyDeviceToHost, c.stream)); if (includeErrors) { - cudaCheck(cudaMemcpyAsync(errType_h, c.errType_d, wordCounter*sizeof(uint32_t), cudaMemcpyDeviceToHost, c.stream)); - cudaCheck(cudaMemcpyAsync(errWord_h, c.errWord_d, wordCounter*sizeof(uint32_t), cudaMemcpyDeviceToHost, c.stream)); - cudaCheck(cudaMemcpyAsync(errFedID_h, c.errFedID_d, wordCounter*sizeof(uint32_t), cudaMemcpyDeviceToHost, c.stream)); - cudaCheck(cudaMemcpyAsync(errRawID_h, c.errRawID_d, wordCounter*sizeof(uint32_t), cudaMemcpyDeviceToHost, c.stream)); + cudaCheck(cudaMemcpyAsync(error_h, c.error_d, vsize, cudaMemcpyDeviceToHost, c.stream)); + cudaStreamSynchronize(c.stream); + error_h->set_data(data_h); + int size = error_h->size(); + cudaCheck(cudaMemcpyAsync(data_h, c.data_d, size*esize, cudaMemcpyDeviceToHost, c.stream)); } - cudaStreamSynchronize(c.stream); // End of Raw2Digi and passing data for cluserisation - { + { // clusterizer ... using namespace gpuClustering; int threadsPerBlock = 256; diff --git a/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.h b/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.h index 7eb62c051089a..e1ed06c989e00 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.h +++ b/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.h @@ -8,6 +8,7 @@ #include #include "SiPixelFedCablingMapGPU.h" +#include "HeterogeneousCore/CUDAUtilities/interface/GPUSimpleVector.h" #include const uint32_t layerStartBit_ = 20; @@ -145,6 +146,14 @@ inline uint32_t pack(uint32_t row, uint32_t col, uint32_t adc) { } +struct error_obj { + uint32_t rawId; + uint32_t word; + unsigned char errorType; + unsigned char fedId; + __host__ __device__ error_obj(uint32_t a_, uint32_t b_, unsigned char c_, unsigned char d_): + rawId(a_), word(b_), errorType(c_), fedId(d_) {} +}; // configuration and memory buffers alocated on the GPU struct context { @@ -159,12 +168,10 @@ struct context { uint16_t * moduleInd_d; uint32_t * rawIdArr_d; - uint32_t * errType_d; - uint32_t * errWord_d; - uint32_t * errFedID_d; - uint32_t * errRawID_d; - + GPU::SimpleVector * error_d; + error_obj * data_d; + // these are for the clusterizer (to be moved) uint32_t * moduleStart_d; int32_t * clus_d; @@ -176,12 +183,15 @@ struct context { // wrapper function to call RawToDigi on the GPU from host side -void RawToDigi_wrapper(context &, const SiPixelFedCablingMapGPU* cablingMapDevice, SiPixelGainForHLTonGPU * const ped, - const uint32_t wordCounter, uint32_t *word, - const uint32_t fedCounter, uint8_t *fedId_h, - bool convertADCtoElectrons, uint32_t * pdigi_h, - uint32_t *rawIdArr_h, uint32_t *errType_h, uint32_t *errWord_h, uint32_t *errFedID_h, uint32_t *errRawID_h, - bool useQualityInfo, bool includeErrors, bool debug, uint32_t & nModulesActive); +void RawToDigi_wrapper(context &, const SiPixelFedCablingMapGPU* cablingMapDevice, + SiPixelGainForHLTonGPU * const ped, + const uint32_t wordCounter, uint32_t *word, + const uint32_t fedCounter, uint8_t *fedId_h, + bool convertADCtoElectrons, uint32_t * pdigi_h, + uint32_t *rawIdArr_h, GPU::SimpleVector *error_h, + GPU::SimpleVector *error_h_tmp, error_obj *data_h, + bool useQualityInfo, bool includeErrors, bool debug, + uint32_t & nModulesActive); // void initCablingMap(); context initDeviceMemory(); diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.cc b/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.cc index 81bffcbc4b988..3a9bacb4426c5 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.cc +++ b/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.cc @@ -90,9 +90,9 @@ void processCablingMap(SiPixelFedCablingMap const& cablingMap, TrackerGeometry moduleId[i] = gdet->index(); } LogDebug("SiPixelFedCablingMapGPU") << "----------------------------------------------------------------------------" << std::endl; - LogDebug("SiPixelFedCablingMapGPU") << i << std::setw(20) << fedMap[i] << std::setw(20) << linkMap[i] << std::setw(20) << rocMap[i] << std::endl; - LogDebug("SiPixelFedCablingMapGPU") << i << std::setw(20) << RawId[i] << std::setw(20) << rocInDet[i] << std::setw(20) << moduleId[i] << std::endl; - LogDebug("SiPixelFedCablingMapGPU") << i << std::setw(20) << (bool) badRocs[i] << std::setw(20) << (bool) modToUnp[i] << std::endl; + LogDebug("SiPixelFedCablingMapGPU") << i << std::setw(20) << fedMap[i] << std::setw(20) << linkMap[i] << std::setw(20) << rocMap[i] << std::endl; + LogDebug("SiPixelFedCablingMapGPU") << i << std::setw(20) << RawId[i] << std::setw(20) << rocInDet[i] << std::setw(20) << moduleId[i] << std::endl; + LogDebug("SiPixelFedCablingMapGPU") << i << std::setw(20) << (bool)badRocs[i] << std::setw(20) << (bool)modToUnp[i] << std::endl; LogDebug("SiPixelFedCablingMapGPU") << "----------------------------------------------------------------------------" << std::endl; } diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc index 06e12f246ee49..6d195792aa57a 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc +++ b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc @@ -64,8 +64,9 @@ SiPixelRawToDigiGPU::SiPixelRawToDigiGPU( const edm::ParameterSet& conf ) usererrorlist = config_.getParameter > ("UserErrorList"); } tFEDRawDataCollection = consumes (config_.getParameter("InputLabel")); + debug = config_.getParameter("enableErrorDebug"); - // start counters + //start counters ndigis = 0; nwords = 0; @@ -127,16 +128,24 @@ SiPixelRawToDigiGPU::SiPixelRawToDigiGPU( const edm::ParameterSet& conf ) cudaMallocHost(&pdigi_h, sizeof(uint32_t)*WSIZE); cudaMallocHost(&rawIdArr_h, sizeof(uint32_t)*WSIZE); - cudaMallocHost(&errType_h, sizeof(uint32_t)*WSIZE); - cudaMallocHost(&errRawID_h, sizeof(uint32_t)*WSIZE); - cudaMallocHost(&errWord_h, sizeof(uint32_t)*WSIZE); - cudaMallocHost(&errFedID_h, sizeof(uint32_t)*WSIZE); + uint32_t vsize = sizeof(GPU::SimpleVector); + uint32_t esize = sizeof(error_obj); + cudaCheck(cudaMallocHost(&error_h, vsize)); + cudaCheck(cudaMallocHost(&error_h_tmp, vsize)); + cudaCheck(cudaMallocHost(&data_h, MAX_FED*MAX_WORD*esize)); cudaMallocHost(&mIndexStart_h, sizeof(int)*(NMODULE+1)); cudaMallocHost(&mIndexEnd_h, sizeof(int)*(NMODULE+1)); // allocate memory for RawToDigi on GPU context_ = initDeviceMemory(); + + new (error_h) GPU::SimpleVector(MAX_FED*MAX_WORD, data_h); + new (error_h_tmp) GPU::SimpleVector(MAX_FED*MAX_WORD, context_.data_d); + assert(error_h->size() == 0); + assert(error_h->capacity() == static_cast(MAX_FED*MAX_WORD)); + assert(error_h_tmp->size() == 0); + assert(error_h_tmp->capacity() == static_cast(MAX_FED*MAX_WORD)); } // ----------------------------------------------------------------------------- @@ -154,10 +163,9 @@ SiPixelRawToDigiGPU::~SiPixelRawToDigiGPU() { cudaFreeHost(fedId_h); cudaFreeHost(pdigi_h); cudaFreeHost(rawIdArr_h); - cudaFreeHost(errType_h); - cudaFreeHost(errRawID_h); - cudaFreeHost(errWord_h); - cudaFreeHost(errFedID_h); + cudaFreeHost(error_h); + cudaFreeHost(error_h_tmp); + cudaFreeHost(data_h); cudaFreeHost(mIndexStart_h); cudaFreeHost(mIndexEnd_h); @@ -209,6 +217,7 @@ SiPixelRawToDigiGPU::fillDescriptions(edm::ConfigurationDescriptions& descriptio desc.add("CablingMapLabel","")->setComment("CablingMap label"); //Tav desc.addOptional("CheckPixelOrder"); // never used, kept for back-compatibility desc.add("ConvertADCtoElectrons", false)->setComment("## do the calibration ADC-> Electron and apply the threshold, requried for clustering"); + desc.add("enableErrorDebug",false); descriptions.add("siPixelRawToDigiGPU",desc); } @@ -222,7 +231,6 @@ SiPixelRawToDigiGPU::produce( edm::Event& ev, const edm::EventSetup& es) int theWordCounter = 0; int theDigiCounter = 0; const uint32_t dummydetid = 0xffffffff; - debug = edm::MessageDrop::instance()->debugEnabled; // initialize quality record or update if necessary if (qualityWatcher.check( es ) && useQuality) { @@ -347,8 +355,9 @@ SiPixelRawToDigiGPU::produce( edm::Event& ev, const edm::EventSetup& es) // GPU specific: RawToDigi -> clustering uint32_t nModulesActive=0; - RawToDigi_wrapper(context_, cablingMapGPUDevice_, gainForHLTonGPU_, wordCounterGPU, word, fedCounter, fedId_h, convertADCtoElectrons, pdigi_h, - rawIdArr_h, errType_h, errWord_h, errFedID_h, errRawID_h, useQuality, includeErrors, debug, nModulesActive); + RawToDigi_wrapper(context_, cablingMapGPUDevice_, gainForHLTonGPU_, wordCounterGPU, word, fedCounter, + fedId_h, convertADCtoElectrons, pdigi_h, rawIdArr_h, error_h, error_h_tmp, data_h, + useQuality, includeErrors, debug,nModulesActive); auto gpuProd = std::make_unique>(); gpuProd->resize(3); @@ -377,10 +386,12 @@ SiPixelRawToDigiGPU::produce( edm::Event& ev, const edm::EventSetup& es) theDigiCounter++; } - for (uint32_t i = 0; i < wordCounterGPU; i++) { - if (errType_h[i] != 0) { - SiPixelRawDataError error(errWord_h[i], errType_h[i], errFedID_h[i]+1200); - errors[errRawID_h[i]].push_back(error); + auto size = error_h->size(); + for (auto i = 0; i < size; i++) { + error_obj err = (*error_h)[i]; + if (err.errorType != 0) { + SiPixelRawDataError error(err.word, err.errorType, err.fedId + 1200); + errors[err.rawId].push_back(error); } } diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.h b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.h index 5b56edaab9282..272c49c740ca9 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.h +++ b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.h @@ -74,7 +74,9 @@ class SiPixelRawToDigiGPU : public edm::stream::EDProducer<> { // to store the output uint32_t *pdigi_h, *rawIdArr_h; // host copy of output - uint32_t *errType_h, *errWord_h, *errFedID_h, *errRawID_h; // host copy of output + error_obj *data_h = nullptr; + GPU::SimpleVector *error_h = nullptr; + GPU::SimpleVector *error_h_tmp = nullptr; // store the start and end index for each module (total 1856 modules-phase 1) int *mIndexStart_h, *mIndexEnd_h; diff --git a/EventFilter/SiPixelRawToDigi/python/SiPixelRawToDigi_cfi.py b/EventFilter/SiPixelRawToDigi/python/SiPixelRawToDigi_cfi.py index aabe584943683..68ae0c1706807 100644 --- a/EventFilter/SiPixelRawToDigi/python/SiPixelRawToDigi_cfi.py +++ b/EventFilter/SiPixelRawToDigi/python/SiPixelRawToDigi_cfi.py @@ -35,6 +35,7 @@ ## Empty Regions PSet means complete unpacking siPixelDigisGPU.Regions = cms.PSet( ) siPixelDigisGPU.CablingMapLabel = cms.string("") +siPixelDigisGPU.enableErrorDebug = cms.bool(False) from Configuration.Eras.Modifier_phase1Pixel_cff import phase1Pixel phase1Pixel.toModify(siPixelDigis, UsePhase1=True) diff --git a/HeterogeneousCore/CUDAUtilities/interface/GPUSimpleVector.h b/HeterogeneousCore/CUDAUtilities/interface/GPUSimpleVector.h index 21353808bea01..94769ca7351d1 100644 --- a/HeterogeneousCore/CUDAUtilities/interface/GPUSimpleVector.h +++ b/HeterogeneousCore/CUDAUtilities/interface/GPUSimpleVector.h @@ -11,7 +11,7 @@ namespace GPU { template struct SimpleVector { // Constructors __host__ __device__ SimpleVector(int capacity, T *data) // ownership of m_data stays within the caller - : m_size(0), m_data(data), m_capacity(capacity) { + : m_size(0), m_capacity(capacity), m_data(data) { static_assert(std::is_trivially_destructible::value); } @@ -83,6 +83,11 @@ template struct SimpleVector { __inline__ __host__ __device__ int capacity() const { return m_capacity; } __inline__ __host__ __device__ T *data() const { return m_data; } + + __inline__ __host__ __device__ void resize(int size) { m_size = size; } + + __inline__ __host__ __device__ void set_data(T * data) { m_data = data; } + private: int m_size; @@ -93,3 +98,4 @@ template struct SimpleVector { } // namespace GPU #endif // HeterogeneousCore_CUDAUtilities_GPUSimpleVector_h + From 621624010d0fffd888a37e5c49a12b147fc641f6 Mon Sep 17 00:00:00 2001 From: Andrea Bocci Date: Wed, 28 Feb 2018 14:41:10 +0100 Subject: [PATCH 18/88] Remove debug messages (#21) --- .../SiPixelRecHits/src/PixelCPEFast.cc | 50 +------------------ 1 file changed, 1 insertion(+), 49 deletions(-) diff --git a/RecoLocalTracker/SiPixelRecHits/src/PixelCPEFast.cc b/RecoLocalTracker/SiPixelRecHits/src/PixelCPEFast.cc index dcca841e6d156..3a466be6d57c4 100644 --- a/RecoLocalTracker/SiPixelRecHits/src/PixelCPEFast.cc +++ b/RecoLocalTracker/SiPixelRecHits/src/PixelCPEFast.cc @@ -21,20 +21,8 @@ #include - namespace { - - struct Stat { - Stat():c(0){} - ~Stat(){std::cout << "CPE stat " << c << ' ' << maxx << ' ' << maxd << std::endl;} - std::atomic c; - float maxx=0.f, maxd=0.0f; - }; - Stat statx, staty; - } - namespace { constexpr float micronsToCm = 1.0e-4; - const bool MYDEBUG = false; } //----------------------------------------------------------------------------- @@ -63,11 +51,7 @@ PixelCPEFast::PixelCPEFast(edm::ParameterSet const & conf, throw cms::Exception("InvalidCalibrationLoaded") << "ERROR: GenErrors not filled correctly. Check the sqlite file. Using SiPixelTemplateDBObject version " << ( *genErrorDBObject_ ).version(); - if(MYDEBUG) std::cout<<"Loaded genErrorDBObject v"<<( *genErrorDBObject_ ).version()<< std::endl; - } else { - if(MYDEBUG) std::cout<<" Use simple parametrised errors "<< std::endl; - } // if ( UseErrorsFromTemplates_ ) - + } // Rechit errors in case other, more correct, errors are not vailable // This are constants. Maybe there is a more efficienct way to store them. @@ -289,38 +273,6 @@ PixelCPEFast::localPosition(DetParam const & theDetParam, ClusterParam & theClus // apply the lorentz offset correction yPos = yPos + shiftY + theDetParam.thePitchY*float(phase1PixelTopology::yOffset); - - { - // ok now do GPU like ... - - pixelCPEforGPU::ClusParams cp; - - - cp.minRow[0] = theClusterParam.theCluster->minPixelRow(); - cp.maxRow[0] = theClusterParam.theCluster->maxPixelRow(); - cp.minCol[0] = theClusterParam.theCluster->minPixelCol(); - cp.maxCol[0] = theClusterParam.theCluster->maxPixelCol(); - - cp.Q_f_X[0] = Q_f_X; - cp.Q_l_X[0] = Q_l_X; - cp.Q_f_Y[0] = Q_f_Y; - cp.Q_l_Y[0] = Q_l_Y; - - auto ind = theDetParam.theDet->index(); - pixelCPEforGPU::position(m_commonParamsGPU, m_detParamsGPU[ind],cp,0); - auto xg = cp.xpos[0]; - auto yg = cp.ypos[0]; - - if(std::abs(xPos-xg)>0.001) {++statx.c; statx.maxx=std::max(statx.maxx,xPos);} - statx.maxd=std::max(std::abs(xPos-xg), statx.maxd); - if(std::abs(yPos-yg)>0.001) {++staty.c; staty.maxx=std::max(staty.maxx,yPos);} - staty.maxd=std::max(std::abs(yPos-yg), staty.maxd); - if(std::abs(xPos-xg)>0.001 || std::abs(yPos-yg)>0.001) - std::cout << (m_detParamsGPU[ind].isBarrel ? "B " : "E ") << xPos <<'/'< Date: Wed, 28 Feb 2018 17:50:03 +0100 Subject: [PATCH 19/88] Add workflows for Riemann fit and GPU (#20) * add `riemannFit` and `gpu` modifiers and workflows for Riemann fit and GPU modules * switch GPU modules with `gpu` modifier --- .../ProcessModifiers/python/gpu_cff.py | 5 +++++ .../ProcessModifiers/python/riemannFit_cff.py | 5 +++++ .../PyReleaseValidation/python/relval_2017.py | 2 +- .../python/relval_steps.py | 16 ++++++++++++++ .../python/relval_upgrade.py | 7 ++++-- .../python/upgradeWorkflowComponents.py | 22 +++++++++++++++++++ .../python/SiPixelRawToDigi_cfi.py | 5 +++++ .../python/SiPixelClusterizer_cfi.py | 4 ++++ .../python/SiPixelRecHits_cfi.py | 4 ++++ 9 files changed, 67 insertions(+), 3 deletions(-) create mode 100644 Configuration/ProcessModifiers/python/gpu_cff.py create mode 100644 Configuration/ProcessModifiers/python/riemannFit_cff.py diff --git a/Configuration/ProcessModifiers/python/gpu_cff.py b/Configuration/ProcessModifiers/python/gpu_cff.py new file mode 100644 index 0000000000000..993f71804fbc1 --- /dev/null +++ b/Configuration/ProcessModifiers/python/gpu_cff.py @@ -0,0 +1,5 @@ +import FWCore.ParameterSet.Config as cms + +# This modifier is for replacing CPU modules with GPU counterparts + +gpu = cms.Modifier() diff --git a/Configuration/ProcessModifiers/python/riemannFit_cff.py b/Configuration/ProcessModifiers/python/riemannFit_cff.py new file mode 100644 index 0000000000000..f97f50df63fb6 --- /dev/null +++ b/Configuration/ProcessModifiers/python/riemannFit_cff.py @@ -0,0 +1,5 @@ +import FWCore.ParameterSet.Config as cms + +# This modifier is for replacing the default pixel track "fitting" with Riemann fit + +riemannFit = cms.Modifier() diff --git a/Configuration/PyReleaseValidation/python/relval_2017.py b/Configuration/PyReleaseValidation/python/relval_2017.py index 92a39b4fd5620..d2adb4235a00f 100644 --- a/Configuration/PyReleaseValidation/python/relval_2017.py +++ b/Configuration/PyReleaseValidation/python/relval_2017.py @@ -27,7 +27,7 @@ 10024.1,10024.2,10024.3,10024.4,10024.5, 10801.0,10802.0,10803.0,10804.0,10805.0,10806.0,10807.0,10808.0,10809.0,10859.0,10871.0, 10842.0,10824.0,10825.0,10826.0,10823.0,11024.0,11025.0,11224.0, - 10824.1,10824.5, + 10824.1,10824.5,10824.7,10824.8, 10824.6,11024.6,11224.6, 11642.0,11624.0,11625.0,11626.0,11623.0,11824.0,11825.0,12024.0] for numWF in numWFIB: diff --git a/Configuration/PyReleaseValidation/python/relval_steps.py b/Configuration/PyReleaseValidation/python/relval_steps.py index e280432ad5743..720384f73433e 100644 --- a/Configuration/PyReleaseValidation/python/relval_steps.py +++ b/Configuration/PyReleaseValidation/python/relval_steps.py @@ -1518,6 +1518,12 @@ def gen2018HiMix(fragment,howMuch): '--datatier': 'GEN-SIM-RECO,DQMIO', '--eventcontent': 'RECOSIM,DQM', } +step3_riemannFit = { + '--procModifiers': 'riemannFit', +} +step3_gpu = { + '--procModifiers': 'gpu', +} step3_trackingLowPU = { '--era': 'Run2_2016_trackingLowPU' } @@ -2387,6 +2393,16 @@ def gen2018HiMix(fragment,howMuch): if 'Reco' in step: upgradeStepDict[stepName][k] = merge([step3_pixelTrackingOnly, upgradeStepDict[step][k]]) elif 'HARVEST' in step: upgradeStepDict[stepName][k] = merge([{'-s': 'HARVESTING:@trackingOnlyValidation'}, upgradeStepDict[step][k]]) + for step in upgradeSteps['pixelTrackingOnlyRiemannFit']['steps']: + stepName = step + upgradeSteps['pixelTrackingOnlyRiemannFit']['suffix'] + if 'Reco' in step: upgradeStepDict[stepName][k] = merge([step3_riemannFit, step3_pixelTrackingOnly, upgradeStepDict[step][k]]) + elif 'HARVEST' in step: upgradeStepDict[stepName][k] = merge([{'-s': 'HARVESTING:@trackingOnlyValidation'}, upgradeStepDict[step][k]]) + + for step in upgradeSteps['pixelTrackingOnlyGPU']['steps']: + stepName = step + upgradeSteps['pixelTrackingOnlyGPU']['suffix'] + if 'Reco' in step: upgradeStepDict[stepName][k] = merge([step3_gpu, step3_pixelTrackingOnly, upgradeStepDict[step][k]]) + elif 'HARVEST' in step: upgradeStepDict[stepName][k] = merge([{'-s': 'HARVESTING:@trackingOnlyValidation'}, upgradeStepDict[step][k]]) + for step in upgradeSteps['trackingRun2']['steps']: stepName = step + upgradeSteps['trackingRun2']['suffix'] if 'Reco' in step and upgradeStepDict[step][k]['--era']=='Run2_2017': diff --git a/Configuration/PyReleaseValidation/python/relval_upgrade.py b/Configuration/PyReleaseValidation/python/relval_upgrade.py index a98c1d027dc7a..be9eaef447e01 100644 --- a/Configuration/PyReleaseValidation/python/relval_upgrade.py +++ b/Configuration/PyReleaseValidation/python/relval_upgrade.py @@ -57,7 +57,7 @@ def makeStepName(key,frag,step,suffix): # special workflows for tracker if (upgradeDatasetFromFragment[frag]=="TTbar_13" or upgradeDatasetFromFragment[frag]=="TTbar_14TeV") and not 'PU' in key and hasHarvest: # skip ALCA - trackingVariations = ['trackingOnly','trackingRun2','trackingOnlyRun2','trackingLowPU','pixelTrackingOnly'] + trackingVariations = ['trackingOnly','trackingRun2','trackingOnlyRun2','trackingLowPU','pixelTrackingOnly','pixelTrackingOnlyRiemannFit','pixelTrackingOnlyGPU'] for tv in trackingVariations: stepList[tv] = filter(lambda s : "ALCA" not in s, stepList[tv]) workflows[numWF+upgradeSteps['trackingOnly']['offset']] = [ upgradeDatasetFromFragment[frag], stepList['trackingOnly']] @@ -65,7 +65,10 @@ def makeStepName(key,frag,step,suffix): for tv in trackingVariations[1:]: workflows[numWF+upgradeSteps[tv]['offset']] = [ upgradeDatasetFromFragment[frag], stepList[tv]] elif '2018' in key: - workflows[numWF+upgradeSteps['pixelTrackingOnly']['offset']] = [ upgradeDatasetFromFragment[frag], stepList['pixelTrackingOnly']] + for tv in trackingVariations: + if not "pixelTrackingOnly" in tv: + continue + workflows[numWF+upgradeSteps[tv]['offset']] = [ upgradeDatasetFromFragment[frag], stepList[tv]] # special workflows for HE if upgradeDatasetFromFragment[frag]=="TTbar_13" and '2018' in key: diff --git a/Configuration/PyReleaseValidation/python/upgradeWorkflowComponents.py b/Configuration/PyReleaseValidation/python/upgradeWorkflowComponents.py index 32a5aa7e1825a..3c38d703faec3 100644 --- a/Configuration/PyReleaseValidation/python/upgradeWorkflowComponents.py +++ b/Configuration/PyReleaseValidation/python/upgradeWorkflowComponents.py @@ -130,6 +130,28 @@ 'suffix' : '_pixelTrackingOnly', 'offset' : 0.5, } +upgradeSteps['pixelTrackingOnlyRiemannFit'] = { + 'steps' : [ + 'RecoFull', + 'HARVESTFull', + 'RecoFullGlobal', + 'HARVESTFullGlobal', + ], + 'PU' : [], + 'suffix' : '_pixelTrackingOnlyRiemannFit', + 'offset' : 0.7, +} +upgradeSteps['pixelTrackingOnlyGPU'] = { + 'steps' : [ + 'RecoFull', + 'HARVESTFull', + 'RecoFullGlobal', + 'HARVESTFullGlobal', + ], + 'PU' : [], + 'suffix' : '_pixelTrackingOnlyGPU', + 'offset' : 0.8, +} upgradeSteps['Timing'] = { 'steps' : upgradeSteps['baseline']['steps'], 'PU' : upgradeSteps['baseline']['PU'], diff --git a/EventFilter/SiPixelRawToDigi/python/SiPixelRawToDigi_cfi.py b/EventFilter/SiPixelRawToDigi/python/SiPixelRawToDigi_cfi.py index 68ae0c1706807..538fd3dc97588 100644 --- a/EventFilter/SiPixelRawToDigi/python/SiPixelRawToDigi_cfi.py +++ b/EventFilter/SiPixelRawToDigi/python/SiPixelRawToDigi_cfi.py @@ -41,3 +41,8 @@ phase1Pixel.toModify(siPixelDigis, UsePhase1=True) phase1Pixel.toModify(siPixelDigisGPU, UsePhase1=True) +# In principle I would like to hide the name 'siPixelDigisGPU', but it +# is used in test/runRawToDigi_GPU_phase1.py which I also don't want +# to break +from Configuration.ProcessModifiers.gpu_cff import gpu +gpu.toReplaceWith(siPixelDigis, siPixelDigisGPU) diff --git a/RecoLocalTracker/SiPixelClusterizer/python/SiPixelClusterizer_cfi.py b/RecoLocalTracker/SiPixelClusterizer/python/SiPixelClusterizer_cfi.py index b0c4f59d6b5fa..56a91bd86716b 100644 --- a/RecoLocalTracker/SiPixelClusterizer/python/SiPixelClusterizer_cfi.py +++ b/RecoLocalTracker/SiPixelClusterizer/python/SiPixelClusterizer_cfi.py @@ -48,3 +48,7 @@ MissCalibrate = False, ElectronPerADCGain = cms.double(600.) # it can be changed to something else (e.g. 135e) if needed ) + +# to ensure reproducibility +from Configuration.ProcessModifiers.gpu_cff import gpu +gpu.toModify(siPixelClusters, payloadType = "HLT") diff --git a/RecoLocalTracker/SiPixelRecHits/python/SiPixelRecHits_cfi.py b/RecoLocalTracker/SiPixelRecHits/python/SiPixelRecHits_cfi.py index 4697f508948a6..495d6a5c84f55 100644 --- a/RecoLocalTracker/SiPixelRecHits/python/SiPixelRecHits_cfi.py +++ b/RecoLocalTracker/SiPixelRecHits/python/SiPixelRecHits_cfi.py @@ -1,5 +1,6 @@ import FWCore.ParameterSet.Config as cms +from RecoLocalTracker.SiPixelRecHits.SiPixelRecHitsGPU_cfi import siPixelRecHits as _siPixelRecHitsGPU siPixelRecHits = cms.EDProducer("SiPixelRecHitConverter", src = cms.InputTag("siPixelClusters"), CPE = cms.string('PixelCPEGeneric'), @@ -7,6 +8,9 @@ ) +from Configuration.ProcessModifiers.gpu_cff import gpu +gpu.toReplaceWith(siPixelRecHits, _siPixelRecHitsGPU) + siPixelRecHitsPreSplitting = siPixelRecHits.clone( src = 'siPixelClustersPreSplitting' ) From e5801c410e5bbd9a312f7d0609faf9de99291fd9 Mon Sep 17 00:00:00 2001 From: Andrea Bocci Date: Wed, 28 Feb 2018 19:41:17 +0100 Subject: [PATCH 20/88] Move the import next to the GPU modifier --- RecoLocalTracker/SiPixelRecHits/python/SiPixelRecHits_cfi.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RecoLocalTracker/SiPixelRecHits/python/SiPixelRecHits_cfi.py b/RecoLocalTracker/SiPixelRecHits/python/SiPixelRecHits_cfi.py index 495d6a5c84f55..c19315cbc66c9 100644 --- a/RecoLocalTracker/SiPixelRecHits/python/SiPixelRecHits_cfi.py +++ b/RecoLocalTracker/SiPixelRecHits/python/SiPixelRecHits_cfi.py @@ -1,6 +1,5 @@ import FWCore.ParameterSet.Config as cms -from RecoLocalTracker.SiPixelRecHits.SiPixelRecHitsGPU_cfi import siPixelRecHits as _siPixelRecHitsGPU siPixelRecHits = cms.EDProducer("SiPixelRecHitConverter", src = cms.InputTag("siPixelClusters"), CPE = cms.string('PixelCPEGeneric'), @@ -8,6 +7,7 @@ ) +from RecoLocalTracker.SiPixelRecHits.SiPixelRecHitsGPU_cfi import siPixelRecHits as _siPixelRecHitsGPU from Configuration.ProcessModifiers.gpu_cff import gpu gpu.toReplaceWith(siPixelRecHits, _siPixelRecHitsGPU) From 65560153f52f7afafee7ed203c6dad3e0c01ea36 Mon Sep 17 00:00:00 2001 From: Andrea Bocci Date: Thu, 1 Mar 2018 14:28:26 +0100 Subject: [PATCH 21/88] Remove -O2/-O3 from CUDA flags (#29) After cms-sw/cmsdist#3786 the default CUDA flags are set to `-O3 -std=c++14 --expt-relaxed-constexpr --expt-extended-lambda` . Since `nvcc` does not support multiple `-On` options on the command line, remove them from the `CUDA_FLAGS` set in the BuildFile.xml . --- .../GeometrySurface/test/BuildFile.xml | 32 ++++----- .../SiPixelRawToDigi/plugins/BuildFile.xml | 15 ++-- .../CUDAUtilities/test/BuildFile.xml | 3 +- .../SiPixelClusterizer/test/BuildFile.xml | 71 +++++++++---------- .../SiPixelRecHits/plugins/BuildFile.xml | 15 ++-- 5 files changed, 64 insertions(+), 72 deletions(-) diff --git a/DataFormats/GeometrySurface/test/BuildFile.xml b/DataFormats/GeometrySurface/test/BuildFile.xml index b8b3d4d048c46..172c8440fe806 100644 --- a/DataFormats/GeometrySurface/test/BuildFile.xml +++ b/DataFormats/GeometrySurface/test/BuildFile.xml @@ -1,31 +1,29 @@ - - - - + + + + + - + - - + - + - + - + - - - + + - - - + + + - diff --git a/EventFilter/SiPixelRawToDigi/plugins/BuildFile.xml b/EventFilter/SiPixelRawToDigi/plugins/BuildFile.xml index 1803bd76ef4ec..790b772fc6feb 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/BuildFile.xml +++ b/EventFilter/SiPixelRawToDigi/plugins/BuildFile.xml @@ -1,10 +1,9 @@ - - - + + + - - - - - + + + + diff --git a/HeterogeneousCore/CUDAUtilities/test/BuildFile.xml b/HeterogeneousCore/CUDAUtilities/test/BuildFile.xml index b202aa2f84304..a1a7efcce6abb 100644 --- a/HeterogeneousCore/CUDAUtilities/test/BuildFile.xml +++ b/HeterogeneousCore/CUDAUtilities/test/BuildFile.xml @@ -1,3 +1,2 @@ - - + diff --git a/RecoLocalTracker/SiPixelClusterizer/test/BuildFile.xml b/RecoLocalTracker/SiPixelClusterizer/test/BuildFile.xml index beefe8560e345..3fc830883ca58 100644 --- a/RecoLocalTracker/SiPixelClusterizer/test/BuildFile.xml +++ b/RecoLocalTracker/SiPixelClusterizer/test/BuildFile.xml @@ -1,42 +1,39 @@ - - - - - - + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - -# for tracks - - - - -# for lumi - - -# - - + + - - + + - - + + - - + + + + + + + + diff --git a/RecoLocalTracker/SiPixelRecHits/plugins/BuildFile.xml b/RecoLocalTracker/SiPixelRecHits/plugins/BuildFile.xml index 526d837e1ec01..4f8efa0a80be0 100644 --- a/RecoLocalTracker/SiPixelRecHits/plugins/BuildFile.xml +++ b/RecoLocalTracker/SiPixelRecHits/plugins/BuildFile.xml @@ -1,9 +1,8 @@ - - - - - - - - + + + + + + + From 8c3854cc3d7532ad59af371392a2ef99f4fa1021 Mon Sep 17 00:00:00 2001 From: Andrea Bocci Date: Thu, 1 Mar 2018 14:30:20 +0100 Subject: [PATCH 22/88] Add a DQM sequence for pixel-only tracking (#23) * add a DQM sequence for pixel-only tracking * add pixelTrackingOnlyDQM sequences to the pixelTrackingOnly workflows * add pixelTrackingOnlyDQM sequences to the riemannFit and gpu workflows --- .../python/relval_steps.py | 8 ++--- .../pixelTrackingEffFromHitPattern_cff.py | 33 +++++++++++++++++++ .../python/pixelTracksMonitoring_cff.py | 23 +++++++++++++ .../python/DQMOffline_SecondStep_cff.py | 3 ++ .../Configuration/python/DQMOffline_cff.py | 3 ++ DQMOffline/Configuration/python/autoDQM.py | 9 +++-- 6 files changed, 72 insertions(+), 7 deletions(-) create mode 100644 DQM/TrackingMonitorClient/python/pixelTrackingEffFromHitPattern_cff.py create mode 100644 DQM/TrackingMonitorSource/python/pixelTracksMonitoring_cff.py diff --git a/Configuration/PyReleaseValidation/python/relval_steps.py b/Configuration/PyReleaseValidation/python/relval_steps.py index 720384f73433e..9c1d68aeed952 100644 --- a/Configuration/PyReleaseValidation/python/relval_steps.py +++ b/Configuration/PyReleaseValidation/python/relval_steps.py @@ -1514,7 +1514,7 @@ def gen2018HiMix(fragment,howMuch): '--eventcontent':'RECOSIM,DQM', } step3_pixelTrackingOnly = { - '-s': 'RAW2DIGI:RawToDigi_pixelOnly,RECO:reconstruction_pixelTrackingOnly,VALIDATION:@pixelTrackingOnlyValidation', + '-s': 'RAW2DIGI:RawToDigi_pixelOnly,RECO:reconstruction_pixelTrackingOnly,VALIDATION:@pixelTrackingOnlyValidation,DQM:@pixelTrackingOnlyDQM', '--datatier': 'GEN-SIM-RECO,DQMIO', '--eventcontent': 'RECOSIM,DQM', } @@ -2391,17 +2391,17 @@ def gen2018HiMix(fragment,howMuch): for step in upgradeSteps['pixelTrackingOnly']['steps']: stepName = step + upgradeSteps['pixelTrackingOnly']['suffix'] if 'Reco' in step: upgradeStepDict[stepName][k] = merge([step3_pixelTrackingOnly, upgradeStepDict[step][k]]) - elif 'HARVEST' in step: upgradeStepDict[stepName][k] = merge([{'-s': 'HARVESTING:@trackingOnlyValidation'}, upgradeStepDict[step][k]]) + elif 'HARVEST' in step: upgradeStepDict[stepName][k] = merge([{'-s': 'HARVESTING:@trackingOnlyValidation+@pixelTrackingOnlyDQM'}, upgradeStepDict[step][k]]) for step in upgradeSteps['pixelTrackingOnlyRiemannFit']['steps']: stepName = step + upgradeSteps['pixelTrackingOnlyRiemannFit']['suffix'] if 'Reco' in step: upgradeStepDict[stepName][k] = merge([step3_riemannFit, step3_pixelTrackingOnly, upgradeStepDict[step][k]]) - elif 'HARVEST' in step: upgradeStepDict[stepName][k] = merge([{'-s': 'HARVESTING:@trackingOnlyValidation'}, upgradeStepDict[step][k]]) + elif 'HARVEST' in step: upgradeStepDict[stepName][k] = merge([{'-s': 'HARVESTING:@trackingOnlyValidation+@pixelTrackingOnlyDQM'}, upgradeStepDict[step][k]]) for step in upgradeSteps['pixelTrackingOnlyGPU']['steps']: stepName = step + upgradeSteps['pixelTrackingOnlyGPU']['suffix'] if 'Reco' in step: upgradeStepDict[stepName][k] = merge([step3_gpu, step3_pixelTrackingOnly, upgradeStepDict[step][k]]) - elif 'HARVEST' in step: upgradeStepDict[stepName][k] = merge([{'-s': 'HARVESTING:@trackingOnlyValidation'}, upgradeStepDict[step][k]]) + elif 'HARVEST' in step: upgradeStepDict[stepName][k] = merge([{'-s': 'HARVESTING:@trackingOnlyValidation+@pixelTrackingOnlyDQM'}, upgradeStepDict[step][k]]) for step in upgradeSteps['trackingRun2']['steps']: stepName = step + upgradeSteps['trackingRun2']['suffix'] diff --git a/DQM/TrackingMonitorClient/python/pixelTrackingEffFromHitPattern_cff.py b/DQM/TrackingMonitorClient/python/pixelTrackingEffFromHitPattern_cff.py new file mode 100644 index 0000000000000..15ceaf93ed20a --- /dev/null +++ b/DQM/TrackingMonitorClient/python/pixelTrackingEffFromHitPattern_cff.py @@ -0,0 +1,33 @@ +import FWCore.ParameterSet.Config as cms +from DQMServices.Core.DQMEDHarvester import DQMEDHarvester + +def _layers(suffix, quant, histoPostfix): + return [ + "effic_vs_{0}_PXB1 'PXB Layer1 Efficiency vs {1}' Hits{2}_valid_PXB_Subdet1 Hits{2}_total_PXB_Subdet1" .format(suffix, quant, histoPostfix), + "effic_vs_{0}_PXB2 'PXB Layer2 Efficiency vs {1}' Hits{2}_valid_PXB_Subdet2 Hits{2}_total_PXB_Subdet2" .format(suffix, quant, histoPostfix), + "effic_vs_{0}_PXB3 'PXB Layer3 Efficiency vs {1}' Hits{2}_valid_PXB_Subdet3 Hits{2}_total_PXB_Subdet3" .format(suffix, quant, histoPostfix), + "effic_vs_{0}_PXB4 'PXB Layer4 Efficiency vs {1}' Hits{2}_valid_PXB_Subdet4 Hits{2}_total_PXB_Subdet4" .format(suffix, quant, histoPostfix), + "effic_vs_{0}_PXF1 'PXF Layer1 Efficiency vs {1}' Hits{2}_valid_PXF_Subdet1 Hits{2}_total_PXF_Subdet1" .format(suffix, quant, histoPostfix), + "effic_vs_{0}_PXF2 'PXF Layer2 Efficiency vs {1}' Hits{2}_valid_PXF_Subdet2 Hits{2}_total_PXF_Subdet2" .format(suffix, quant, histoPostfix), + "effic_vs_{0}_PXF3 'PXF Layer3 Efficiency vs {1}' Hits{2}_valid_PXF_Subdet3 Hits{2}_total_PXF_Subdet3" .format(suffix, quant, histoPostfix), + "effic_vs_{0}_PXF4 'PXF Layer4 Efficiency vs {1}' Hits{2}_valid_PXF_Subdet4 Hits{2}_total_PXF_Subdet4" .format(suffix, quant, histoPostfix), + "effic_vs_{0}_PXF5 'PXF Layer5 Efficiency vs {1}' Hits{2}_valid_PXF_Subdet5 Hits{2}_total_PXF_Subdet5" .format(suffix, quant, histoPostfix), + "effic_vs_{0}_PXF6 'PXF Layer6 Efficiency vs {1}' Hits{2}_valid_PXF_Subdet6 Hits{2}_total_PXF_Subdet6" .format(suffix, quant, histoPostfix), + "effic_vs_{0}_PXF7 'PXF Layer7 Efficiency vs {1}' Hits{2}_valid_PXF_Subdet7 Hits{2}_total_PXF_Subdet7" .format(suffix, quant, histoPostfix), + "effic_vs_{0}_PXF8 'PXF Layer8 Efficiency vs {1}' Hits{2}_valid_PXF_Subdet8 Hits{2}_total_PXF_Subdet8" .format(suffix, quant, histoPostfix), + "effic_vs_{0}_PXF9 'PXF Layer9 Efficiency vs {1}' Hits{2}_valid_PXF_Subdet9 Hits{2}_total_PXF_Subdet9" .format(suffix, quant, histoPostfix), + "effic_vs_{0}_PXF10 'PXF Layer10 Efficiency vs {1}' Hits{2}_valid_PXF_Subdet10 Hits{2}_total_PXF_Subdet10".format(suffix, quant, histoPostfix), + "effic_vs_{0}_PXF11 'PXF Layer11 Efficiency vs {1}' Hits{2}_valid_PXF_Subdet11 Hits{2}_total_PXF_Subdet11".format(suffix, quant, histoPostfix), + ] + +pixelTrackingEffFromHitPattern = DQMEDHarvester("DQMGenericClient", + subDirs = cms.untracked.vstring("Tracking/PixelTrackParameters/HitEffFromHitPattern*"), + efficiency = cms.vstring( + _layers("PU", "GoodNumVertices", "") + + _layers("BX", "BX", "VsBX") + + _layers("LUMI", "LUMI", "VsLUMI") + ), + resolution = cms.vstring(), + verbose = cms.untracked.uint32(5), + outputFileName = cms.untracked.string(""), +) diff --git a/DQM/TrackingMonitorSource/python/pixelTracksMonitoring_cff.py b/DQM/TrackingMonitorSource/python/pixelTracksMonitoring_cff.py new file mode 100644 index 0000000000000..a075f671f05ce --- /dev/null +++ b/DQM/TrackingMonitorSource/python/pixelTracksMonitoring_cff.py @@ -0,0 +1,23 @@ +import FWCore.ParameterSet.Config as cms + +import DQM.TrackingMonitor.TrackerCollisionTrackingMonitor_cfi +pixelTracksMonitoring = DQM.TrackingMonitor.TrackerCollisionTrackingMonitor_cfi.TrackerCollisionTrackMon.clone() +pixelTracksMonitoring.FolderName = 'Tracking/PixelTrackParameters' +pixelTracksMonitoring.TrackProducer = 'pixelTracks' +pixelTracksMonitoring.allTrackProducer = 'pixelTracks' +pixelTracksMonitoring.beamSpot = 'offlineBeamSpot' +pixelTracksMonitoring.primaryVertex = 'pixelVertices' +pixelTracksMonitoring.pvNDOF = 1 +pixelTracksMonitoring.doAllPlots = True +pixelTracksMonitoring.doLumiAnalysis = True +pixelTracksMonitoring.doProfilesVsLS = True +pixelTracksMonitoring.doDCAPlots = True +pixelTracksMonitoring.doProfilesVsLS = True +pixelTracksMonitoring.doPlotsVsGoodPVtx = True +pixelTracksMonitoring.doEffFromHitPatternVsPU = False +pixelTracksMonitoring.doEffFromHitPatternVsBX = False +pixelTracksMonitoring.doEffFromHitPatternVsLUMI = False +pixelTracksMonitoring.doPlotsVsGoodPVtx = True +pixelTracksMonitoring.doPlotsVsLUMI = True +pixelTracksMonitoring.doPlotsVsBX = True + diff --git a/DQMOffline/Configuration/python/DQMOffline_SecondStep_cff.py b/DQMOffline/Configuration/python/DQMOffline_SecondStep_cff.py index 303aab28ea7cb..dbe50005c461f 100644 --- a/DQMOffline/Configuration/python/DQMOffline_SecondStep_cff.py +++ b/DQMOffline/Configuration/python/DQMOffline_SecondStep_cff.py @@ -45,6 +45,7 @@ from DQMOffline.JetMET.SusyPostProcessor_cff import * from DQMOffline.JetMET.dataCertificationJetMET_cff import * from DQM.TrackingMonitorClient.TrackingClientConfig_Tier0_cff import * +from DQM.TrackingMonitorClient.pixelTrackingEffFromHitPattern_cff import * from DQM.Phase2OuterTracker.OuterTrackerClientConfig_cff import * DQMOffline_SecondStep_PrePOG = cms.Sequence( TrackingOfflineDQMClient * @@ -116,6 +117,8 @@ DQMHarvestTracking = cms.Sequence( TrackingOfflineDQMClient * dqmFastTimerServiceClient ) +DQMHarvestPixelTracking = cms.Sequence( pixelTrackingEffFromHitPattern ) + DQMHarvestOuterTracker = cms.Sequence( dqmRefHistoRootFileGetter * dqmDcsInfoClient * OuterTrackerClient * diff --git a/DQMOffline/Configuration/python/DQMOffline_cff.py b/DQMOffline/Configuration/python/DQMOffline_cff.py index df2f499561a84..d74cbd8b66c1e 100644 --- a/DQMOffline/Configuration/python/DQMOffline_cff.py +++ b/DQMOffline/Configuration/python/DQMOffline_cff.py @@ -46,6 +46,7 @@ from DQM.Physics.DQMTopMiniAOD_cff import * from Validation.RecoTau.DQMSequences_cfi import * from DQM.TrackingMonitorSource.TrackingSourceConfig_Tier0_cff import * +from DQM.TrackingMonitorSource.pixelTracksMonitoring_cff import * from DQM.Phase2OuterTracker.OuterTrackerSourceConfig_cff import * # miniAOD DQM validation from Validation.RecoParticleFlow.miniAODDQM_cff import * @@ -111,6 +112,8 @@ materialDumperAnalyzer ) +DQMOfflinePixelTracking = cms.Sequence( pixelTracksMonitoring ) + DQMOuterTracker = cms.Sequence( dqmDcsInfo * OuterTrackerSource * DQMMessageLogger * diff --git a/DQMOffline/Configuration/python/autoDQM.py b/DQMOffline/Configuration/python/autoDQM.py index 967ed17b116ce..acfc821736020 100644 --- a/DQMOffline/Configuration/python/autoDQM.py +++ b/DQMOffline/Configuration/python/autoDQM.py @@ -4,9 +4,12 @@ 'commonSiStripZeroBias' : ['DQMOfflineCommonSiStripZeroBias', 'PostDQMOffline', 'DQMHarvestCommonSiStripZeroBias+DQMCertCommon'], - 'trackingOnlyDQM' : ["DQMOfflineTracking", - "PostDQMOffline", - "DQMHarvestTracking"], + 'trackingOnlyDQM' : ['DQMOfflineTracking', + 'PostDQMOffline', + 'DQMHarvestTracking'], + 'pixelTrackingOnlyDQM': ['DQMOfflinePixelTracking', + 'PostDQMOffline', + 'DQMHarvestPixelTracking'], 'outerTracker': ['DQMOuterTracker', 'PostDQMOffline', 'DQMHarvestOuterTracker'], From 2a691bf37a1751f459a8fe55efb3564dd83672bb Mon Sep 17 00:00:00 2001 From: Matti Kortelainen Date: Thu, 1 Mar 2018 15:15:02 +0100 Subject: [PATCH 23/88] Set siPixelClusters.payloadType=HLT (#30) Unconditionally set siPixelClusters.payloadType='HLT' This is used in the CPU workflow for comparison with the GPU workflow (which uses the 'HLT' version anyway). --- .../SiPixelClusterizer/python/SiPixelClusterizer_cfi.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/RecoLocalTracker/SiPixelClusterizer/python/SiPixelClusterizer_cfi.py b/RecoLocalTracker/SiPixelClusterizer/python/SiPixelClusterizer_cfi.py index 56a91bd86716b..e59483720fc24 100644 --- a/RecoLocalTracker/SiPixelClusterizer/python/SiPixelClusterizer_cfi.py +++ b/RecoLocalTracker/SiPixelClusterizer/python/SiPixelClusterizer_cfi.py @@ -27,6 +27,10 @@ maxNumberOfClusters = cms.int32(-1), # -1 means no limit. ) +# *only for the cms-patatrack repository* +# ensure reproducibility for CPU <--> GPU comparisons +siPixelClusters.payloadType = "HLT" + # phase1 pixel from Configuration.Eras.Modifier_phase1Pixel_cff import phase1Pixel phase1Pixel.toModify(siPixelClusters, @@ -49,6 +53,3 @@ ElectronPerADCGain = cms.double(600.) # it can be changed to something else (e.g. 135e) if needed ) -# to ensure reproducibility -from Configuration.ProcessModifiers.gpu_cff import gpu -gpu.toModify(siPixelClusters, payloadType = "HLT") From 7e91c29d43ae78f30451c78c3c9fda716acd510f Mon Sep 17 00:00:00 2001 From: Vincenzo Innocente Date: Thu, 1 Mar 2018 20:49:57 +0100 Subject: [PATCH 24/88] GPU2CPU for clusters and RecHIts (#18) --- .../SiPixelRawToDigi/plugins/RawToDigiGPU.cu | 27 ++-- .../SiPixelRawToDigi/plugins/RawToDigiGPU.h | 1 + .../plugins/SiPixelRawToDigiGPU.cc | 93 ++++++++++- .../plugins/SiPixelRawToDigiGPU.h | 3 + .../SiPixelRecHits/interface/PixelCPEFast.h | 17 --- .../SiPixelRecHits/interface/pixelCPEforGPU.h | 52 +++++++ .../SiPixelRecHits/plugins/PixelRecHits.cu | 31 +++- .../SiPixelRecHits/plugins/PixelRecHits.h | 17 ++- .../plugins/SiPixelRecHitGPU.cc | 95 ++++++++---- .../SiPixelRecHits/plugins/gpuPixelRecHits.h | 8 +- .../python/SiPixelRecHitsGPU_cfi.py | 3 +- .../SiPixelRecHits/src/PixelCPEFast.cc | 144 +++--------------- 12 files changed, 295 insertions(+), 196 deletions(-) diff --git a/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.cu b/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.cu index e9634b34dcc37..21dd92b3e8578 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.cu +++ b/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.cu @@ -573,8 +573,9 @@ void RawToDigi_wrapper( const SiPixelFedCablingMapGPU* cablingMapDevice, SiPixelGainForHLTonGPU * const ped, const uint32_t wordCounter, uint32_t *word, const uint32_t fedCounter, uint8_t *fedId_h, bool convertADCtoElectrons, - uint32_t * pdigi_h, uint32_t *rawIdArr_h, + uint32_t * pdigi_h, uint32_t *rawIdArr_h, GPU::SimpleVector *error_h, GPU::SimpleVector *error_h_tmp, error_obj *data_h, + uint16_t * adc_h, int32_t * clus_h, bool useQualityInfo, bool includeErrors, bool debug, uint32_t & nModulesActive) { const int threadsPerBlock = 512; @@ -637,10 +638,14 @@ void RawToDigi_wrapper( cudaCheck(cudaGetLastError()); + // calibrated adc + cudaCheck(cudaMemcpyAsync(adc_h, c.adc_d, wordCounter*sizeof(uint32_t), cudaMemcpyDeviceToHost, c.stream)); + + /* std::cout << "CUDA countModules kernel launch with " << blocks << " blocks of " << threadsPerBlock << " threads\n"; - + */ uint32_t nModules=0; cudaCheck(cudaMemcpyAsync(c.moduleStart_d, &nModules, sizeof(uint32_t), cudaMemcpyHostToDevice, c.stream)); @@ -650,28 +655,20 @@ void RawToDigi_wrapper( cudaCheck(cudaMemcpyAsync(&nModules, c.moduleStart_d, sizeof(uint32_t), cudaMemcpyDeviceToHost, c.stream)); - std::cout << "found " << nModules << " Modules active" << std::endl; + // std::cout << "found " << nModules << " Modules active" << std::endl; threadsPerBlock = 256; blocks = nModules; + /* std::cout << "CUDA findClus kernel launch with " << blocks << " blocks of " << threadsPerBlock << " threads\n"; + */ cudaCheck(cudaMemsetAsync(c.clusInModule_d, 0, (MaxNumModules)*sizeof(uint32_t),c.stream)); - /* - gpuCalibPixel::calibADCByModule<<>>( - c.moduleInd_d, - c.xx_d, c.yy_d, c.adc_d, - c.moduleStart_d, - ped, - wordCounter - ); - */ - findClus<<>>( c.moduleInd_d, c.xx_d, c.yy_d, c.adc_d, @@ -682,6 +679,10 @@ void RawToDigi_wrapper( wordCounter ); + // clusters + cudaCheck(cudaMemcpyAsync(clus_h, c.clus_d, wordCounter*sizeof(uint32_t), cudaMemcpyDeviceToHost, c.stream)); + + cudaDeviceSynchronize(); cudaCheck(cudaGetLastError()); diff --git a/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.h b/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.h index e1ed06c989e00..44a820db45aba 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.h +++ b/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.h @@ -190,6 +190,7 @@ void RawToDigi_wrapper(context &, const SiPixelFedCablingMapGPU* cablingMapDevic bool convertADCtoElectrons, uint32_t * pdigi_h, uint32_t *rawIdArr_h, GPU::SimpleVector *error_h, GPU::SimpleVector *error_h_tmp, error_obj *data_h, + uint16_t * adc_h, int32_t * clus_h, bool useQualityInfo, bool includeErrors, bool debug, uint32_t & nModulesActive); diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc index 6d195792aa57a..1c4a3824c8cbe 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc +++ b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc @@ -25,6 +25,10 @@ #include "DataFormats/SiPixelDigi/interface/PixelDigi.h" #include "DataFormats/SiPixelRawData/interface/SiPixelRawDataError.h" +#include "DataFormats/SiPixelCluster/interface/SiPixelCluster.h" + + + #include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h" #include "Geometry/Records/interface/TrackerDigiGeometryRecord.h" @@ -45,6 +49,33 @@ #include "SiPixelRawToDigiGPU.h" #include "HeterogeneousCore/CUDAUtilities/interface/cudaCheck.h" + +namespace { +struct AccretionCluster { + typedef unsigned short UShort; + static constexpr UShort MAXSIZE = 256; + UShort adc[MAXSIZE]; + UShort x[MAXSIZE]; + UShort y[MAXSIZE]; + UShort xmin=16000; + UShort ymin=16000; + unsigned int isize=0; + int charge=0; + + bool add(SiPixelCluster::PixelPos const & p, UShort const iadc) { + if (isize==MAXSIZE) return false; + xmin=std::min(xmin,(unsigned short)(p.row())); + ymin=std::min(ymin,(unsigned short)(p.col())); + adc[isize]=iadc; + x[isize]=p.row(); + y[isize++]=p.col(); + charge+=iadc; + return true; + } + }; +} + + using namespace std; // ----------------------------------------------------------------------------- @@ -72,6 +103,7 @@ SiPixelRawToDigiGPU::SiPixelRawToDigiGPU( const edm::ParameterSet& conf ) // Products produces< edm::DetSetVector >(); + produces(); if (includeErrors) { produces< edm::DetSetVector >(); produces(); @@ -128,6 +160,9 @@ SiPixelRawToDigiGPU::SiPixelRawToDigiGPU( const edm::ParameterSet& conf ) cudaMallocHost(&pdigi_h, sizeof(uint32_t)*WSIZE); cudaMallocHost(&rawIdArr_h, sizeof(uint32_t)*WSIZE); + cudaMallocHost(&adc_h, sizeof(uint16_t)*WSIZE); + cudaMallocHost(&clus_h, sizeof(int32_t)*WSIZE); + uint32_t vsize = sizeof(GPU::SimpleVector); uint32_t esize = sizeof(error_obj); cudaCheck(cudaMallocHost(&error_h, vsize)); @@ -163,6 +198,8 @@ SiPixelRawToDigiGPU::~SiPixelRawToDigiGPU() { cudaFreeHost(fedId_h); cudaFreeHost(pdigi_h); cudaFreeHost(rawIdArr_h); + cudaFreeHost(adc_h); + cudaFreeHost(clus_h); cudaFreeHost(error_h); cudaFreeHost(error_h_tmp); cudaFreeHost(data_h); @@ -228,6 +265,11 @@ SiPixelRawToDigiGPU::produce( edm::Event& ev, const edm::EventSetup& es) // setup gain calibration service theSiPixelGainCalibration_.setESObjects( es ); + edm::ESHandle trackerTopologyHandle; + es.get().get(trackerTopologyHandle); + tTopo_ = trackerTopologyHandle.product(); + + int theWordCounter = 0; int theDigiCounter = 0; const uint32_t dummydetid = 0xffffffff; @@ -281,6 +323,10 @@ SiPixelRawToDigiGPU::produce( edm::Event& ev, const edm::EventSetup& es) auto usererror_detidcollection = std::make_unique(); auto disabled_channelcollection = std::make_unique >(); + // create product (clusters); + auto outputClusters = std::make_unique< SiPixelClusterCollectionNew>(); + + //PixelDataFormatter formatter(cabling_.get()); // phase 0 only PixelDataFormatter formatter(cabling_.get(), usePhase1); // for phase 1 & 0 PixelDataFormatter::DetErrors nodeterrors; @@ -357,7 +403,8 @@ SiPixelRawToDigiGPU::produce( edm::Event& ev, const edm::EventSetup& es) uint32_t nModulesActive=0; RawToDigi_wrapper(context_, cablingMapGPUDevice_, gainForHLTonGPU_, wordCounterGPU, word, fedCounter, fedId_h, convertADCtoElectrons, pdigi_h, rawIdArr_h, error_h, error_h_tmp, data_h, - useQuality, includeErrors, debug,nModulesActive); + adc_h, clus_h, + useQuality, includeErrors, debug, nModulesActive); auto gpuProd = std::make_unique>(); gpuProd->resize(3); @@ -373,19 +420,59 @@ SiPixelRawToDigiGPU::produce( edm::Event& ev, const edm::EventSetup& es) break; } + int32_t nclus=-1; + std::vector aclusters(256); + auto totCluseFilled=0; + auto fillClusters = [&](uint32_t detId){ + if (nclus<0) return; // this in reality should never happen + edmNew::DetSetVector::FastFiller spc(*outputClusters, detId); + auto layer = (DetId(detId).subdetId()==1) ? tTopo_->pxbLayer(detId) : 0; + auto clusterThreshold = (layer==1) ? 2000 : 4000; + for (int32_t ic=0; ic 109999); if ( (*detDigis).detId() != rawIdArr_h[i]) { + fillClusters((*detDigis).detId()); + nclus=-1; aclusters.clear();aclusters.resize(256); + detDigis = &(*collection).find_or_insert(rawIdArr_h[i]); if ( (*detDigis).empty() ) (*detDigis).data.reserve(32); // avoid the first relocations + else { std::cout << "Problem det present twice in input! " << (*detDigis).detId() << std::endl; } } (*detDigis).data.emplace_back(pdigi_h[i]); + auto const & dig = (*detDigis).data.back(); + // fill clusters + assert(clus_h[i]>=0); + nclus = std::max(clus_h[i],nclus); + auto row = dig.row(); + auto col = dig.column(); + SiPixelCluster::PixelPos pix(row,col); + aclusters[clus_h[i]].add(pix,adc_h[i]); + theDigiCounter++; } + // fill final clusters + fillClusters((*detDigis).detId()); + //std::cout << "filled " << totCluseFilled << " clusters" << std::endl; + auto size = error_h->size(); for (auto i = 0; i < size; i++) { error_obj err = (*error_h)[i]; @@ -481,8 +568,10 @@ SiPixelRawToDigiGPU::produce( edm::Event& ev, const edm::EventSetup& es) errorDetSet.data = nodeterrors; } - // send digis and errors back to framework + // send digis clusters and errors back to framework + // std::cout << "Number of Clusters from GPU to CPU " << (*outputClusters).data().size() << std::endl; ev.put(std::move(collection)); + ev.put(std::move(outputClusters)); if (includeErrors) { ev.put(std::move(errorcollection)); ev.put(std::move(tkerror_detidcollection)); diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.h b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.h index 272c49c740ca9..b51f012f08968 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.h +++ b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.h @@ -16,6 +16,7 @@ #include "DataFormats/FEDRawData/interface/FEDRawDataCollection.h" #include "CalibTracker/SiPixelESProducers/interface/SiPixelGainCalibrationForHLTService.h" +#include "DataFormats/TrackerCommon/interface/TrackerTopology.h" #include "FWCore/Framework/interface/ConsumesCollector.h" @@ -50,6 +51,7 @@ class SiPixelRawToDigiGPU : public edm::stream::EDProducer<> { const SiPixelQuality* badPixelInfo_; PixelUnpackingRegions* regions_; edm::EDGetTokenT tFEDRawDataCollection; + const TrackerTopology* tTopo_; // needed to get correct layer number TH1D *hCPU, *hDigi; std::unique_ptr theTimer; @@ -74,6 +76,7 @@ class SiPixelRawToDigiGPU : public edm::stream::EDProducer<> { // to store the output uint32_t *pdigi_h, *rawIdArr_h; // host copy of output + uint16_t * adc_h; int32_t * clus_h; // host copy of calib&clus output error_obj *data_h = nullptr; GPU::SimpleVector *error_h = nullptr; GPU::SimpleVector *error_h_tmp = nullptr; diff --git a/RecoLocalTracker/SiPixelRecHits/interface/PixelCPEFast.h b/RecoLocalTracker/SiPixelRecHits/interface/PixelCPEFast.h index 74b1573423f85..ed1ae37eb1324 100644 --- a/RecoLocalTracker/SiPixelRecHits/interface/PixelCPEFast.h +++ b/RecoLocalTracker/SiPixelRecHits/interface/PixelCPEFast.h @@ -49,23 +49,6 @@ class PixelCPEFast final : public PixelCPEBase LocalPoint localPosition (DetParam const & theDetParam, ClusterParam & theClusterParam) const override; LocalError localError (DetParam const & theDetParam, ClusterParam & theClusterParam) const override; - //-------------------------------------------------------------------- - // Methods. - //------------------------------------------------------------------ - static float - generic_position_formula( int size, //!< Size of this projection. - int Q_f, //!< Charge in the first pixel. - int Q_l, //!< Charge in the last pixel. - uint16_t upper_edge_first_pix, //!< As the name says. - uint16_t lower_edge_last_pix, //!< As the name says. - float lorentz_shift, //!< L-width - float theThickness, //detector thickness - float cot_angle, //!< cot of alpha_ or beta_ - float pitch, //!< thePitchX or thePitchY - bool first_is_big, //!< true if the first is big - bool last_is_big //!< true if the last is big - ); - static void collect_edge_charges(ClusterParam & theClusterParam, //!< input, the cluster int & Q_f_X, //!< output, Q first in X diff --git a/RecoLocalTracker/SiPixelRecHits/interface/pixelCPEforGPU.h b/RecoLocalTracker/SiPixelRecHits/interface/pixelCPEforGPU.h index 900ae64969285..d25e5649bcc74 100644 --- a/RecoLocalTracker/SiPixelRecHits/interface/pixelCPEforGPU.h +++ b/RecoLocalTracker/SiPixelRecHits/interface/pixelCPEforGPU.h @@ -4,6 +4,7 @@ #include "DataFormats/GeometrySurface/interface/SOARotation.h" #include #include +#include #include @@ -68,6 +69,9 @@ namespace pixelCPEforGPU { float xpos[N]; float ypos[N]; + + float xerr[N]; + float yerr[N]; }; @@ -203,4 +207,52 @@ namespace pixelCPEforGPU { } + // FIXME these are errors form Run1 + constexpr inline + void error(CommonParams const & comParams, DetParams const & detParams, ClusParams & cp, uint32_t ic) { + // Edge cluster errors + cp.xerr[ic]= 0.0050; + cp.yerr[ic]= 0.0085; + + + constexpr float xerr_barrel_l1[] = {0.00115, 0.00120, 0.00088}; + constexpr float xerr_barrel_l1_def = 0.01030; + constexpr float yerr_barrel_l1[] = {0.00375,0.00230,0.00250,0.00250,0.00230,0.00230,0.00210,0.00210,0.00240}; + constexpr float yerr_barrel_l1_def=0.00210; + constexpr float xerr_barrel_ln[]= {0.00115, 0.00120, 0.00088}; + constexpr float xerr_barrel_ln_def=0.01030; + constexpr float yerr_barrel_ln[]= {0.00375,0.00230,0.00250,0.00250,0.00230,0.00230,0.00210,0.00210,0.00240}; + constexpr float yerr_barrel_ln_def=0.00210; + constexpr float xerr_endcap[]= {0.0020, 0.0020}; + constexpr float xerr_endcap_def=0.0020; + constexpr float yerr_endcap[]= {0.00210}; + constexpr float yerr_endcap_def=0.00210; + + // is edgy? + bool isEdgeX = cp.minRow[ic]==0 || cp.maxRow[ic]==phase1PixelTopology::lastRowInModule; + bool isEdgeY = cp.minCol[ic]==0 || cp.maxCol[ic]==phase1PixelTopology::lastColInModule; + + if (!isEdgeX) { + auto sx = cp.maxRow[ic]-cp.minRow[ic]; + if (!detParams.isBarrel ) { + cp.xerr[ic] = sx 4000 || (i2000) ) ++ngood; + for (auto i=0U; i4000 || (i2000) ) ++ngood; std::cout << " total number of good clusters " << ngood << std::endl; + */ + + cudaCheck(cudaMemcpyAsync(hoc.xl.data(), hh.xg_d, nhits*sizeof(uint32_t), cudaMemcpyDeviceToHost, c.stream)); + cudaCheck(cudaMemcpyAsync(hoc.yl.data(), hh.yg_d, nhits*sizeof(uint32_t), cudaMemcpyDeviceToHost, c.stream)); + cudaCheck(cudaMemcpyAsync(hoc.xe.data(), hh.xerr_d, nhits*sizeof(uint32_t), cudaMemcpyDeviceToHost, c.stream)); + cudaCheck(cudaMemcpyAsync(hoc.ye.data(), hh.yerr_d, nhits*sizeof(uint32_t), cudaMemcpyDeviceToHost, c.stream)); + cudaCheck(cudaMemcpyAsync(hoc.mr.data(), hh.mr_d, nhits*sizeof(uint16_t), cudaMemcpyDeviceToHost, c.stream)); - + return hoc; } diff --git a/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.h b/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.h index 467263cc37caf..632f5c64e2b9f 100644 --- a/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.h +++ b/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.h @@ -1,6 +1,7 @@ #pragma once #include +#include namespace pixelCPEforGPU { struct ParamsOnGPU; @@ -9,15 +10,27 @@ namespace pixelCPEforGPU { struct context; struct HitsOnGPU{ - uint32_t * hitsModuleStart_d; int32_t * charge_d; float *xg_d, *yg_d, *zg_d; + float *xerr_d, *yerr_d; + uint16_t * mr_d; +}; + +struct HitsOnCPU { + explicit HitsOnCPU(uint32_t nhits) : + charge(nhits),xl(nhits),yl(nhits),xe(nhits),ye(nhits), mr(nhits){} + uint32_t hitsModuleStart[2001]; + std::vector charge; + std::vector xl, yl; + std::vector xe, ye; + std::vector mr; }; + HitsOnGPU allocHitsOnGPU(); -void pixelRecHits_wrapper( +HitsOnCPU pixelRecHits_wrapper( context const & c, pixelCPEforGPU::ParamsOnGPU const * cpeParams, uint32_t ndigis, diff --git a/RecoLocalTracker/SiPixelRecHits/plugins/SiPixelRecHitGPU.cc b/RecoLocalTracker/SiPixelRecHits/plugins/SiPixelRecHitGPU.cc index 4f29608714691..aa9c2751c3848 100644 --- a/RecoLocalTracker/SiPixelRecHits/plugins/SiPixelRecHitGPU.cc +++ b/RecoLocalTracker/SiPixelRecHits/plugins/SiPixelRecHitGPU.cc @@ -41,7 +41,9 @@ namespace void run(edm::Handle > inputhandle, SiPixelRecHitCollectionNew & output, - edm::ESHandle & geom); + edm::ESHandle & geom, + HitsOnCPU const & hoc + ); private: edm::ParameterSet conf_; @@ -150,16 +152,15 @@ using namespace std; } assert(fcpe->d_paramsOnGPU); - pixelRecHits_wrapper(* (context const *)(gprod[0]),fcpe->d_paramsOnGPU,gprod[1],gprod[2], hitsOnGPU_); - - + auto hoc = pixelRecHits_wrapper(* (context const *)(gprod[0]),fcpe->d_paramsOnGPU,gprod[1],gprod[2], hitsOnGPU_); // Step C: Iterate over DetIds and invoke the strip CPE algorithm // on each DetUnit - std::cout << "Number of Clusers on CPU " << (*input).data().size() << std::endl; + // std::cout << "Number of Clusers on CPU " << (*input).data().size() << std::endl; - run( input, *output, geom ); + run( input, *output, geom,hoc ); + // std::cout << "Number of Hits on CPU " << (*output).data().size() << std::endl; output->shrink_to_fit(); e.put(std::move(output)); @@ -173,44 +174,83 @@ using namespace std; //--------------------------------------------------------------------------- void SiPixelRecHitGPU::run(edm::Handle > inputhandle, SiPixelRecHitCollectionNew &output, - edm::ESHandle & geom) { - if ( ! cpe_ ) - { - edm::LogError("SiPixelRecHitGPU") << " at least one CPE is not ready -- can't run!"; - // TO DO: throw an exception here? The user may want to know... - assert(0); - return; // clusterizer is invalid, bail out - } - + edm::ESHandle & geom, + HitsOnCPU const & hoc + ) { int numberOfDetUnits = 0; int numberOfClusters = 0; - const edmNew::DetSetVector& input = *inputhandle; + auto const & input = *inputhandle; - edmNew::DetSetVector::const_iterator DSViter=input.begin(); - for ( ; DSViter != input.end() ; DSViter++) { + for (auto DSViter=input.begin(); DSViter != input.end() ; DSViter++) { numberOfDetUnits++; unsigned int detid = DSViter->detId(); DetId detIdObject( detid ); const GeomDetUnit * genericDet = geom->idToDetUnit( detIdObject ); + auto gind = genericDet->index(); const PixelGeomDetUnit * pixDet = dynamic_cast(genericDet); assert(pixDet); SiPixelRecHitCollectionNew::FastFiller recHitsOnDetUnit(output,detid); - - edmNew::DetSet::const_iterator clustIt = DSViter->begin(), clustEnd = DSViter->end(); - - for ( ; clustIt != clustEnd; clustIt++) { + auto fc = hoc.hitsModuleStart[gind]; + auto lc = hoc.hitsModuleStart[gind+1]; + auto nhits = lc-fc; + int32_t ind[nhits]; + auto mrp = &hoc.mr[fc]; + uint32_t ngh=0; + for (uint32_t i=0; i=96 && hoc.charge[fc+i]<4000) ) continue; + ind[ngh]=i;std::push_heap(ind,ind+ngh+1,[&](auto a, auto b) { return mrp[a]size()); + for (auto const & clust : *DSViter) { + assert(iccommonParams(), cpeParams->detParams(me), clusParams,ic); - + pixelCPEforGPU::error(cpeParams->commonParams(), cpeParams->detParams(me), clusParams,ic); + chargeh[h] = clusParams.charge[ic]; if (local) { @@ -123,7 +125,9 @@ namespace gpuPixelRecHits { xh[h],yh[h],zh[h] ); } - + xe[h]= clusParams.xerr[ic]; + ye[h]= clusParams.yerr[ic]; + mr[h]= clusParams.minRow[ic]; } } diff --git a/RecoLocalTracker/SiPixelRecHits/python/SiPixelRecHitsGPU_cfi.py b/RecoLocalTracker/SiPixelRecHits/python/SiPixelRecHitsGPU_cfi.py index 240c47ff55e6d..b5b8f0585bb55 100644 --- a/RecoLocalTracker/SiPixelRecHits/python/SiPixelRecHitsGPU_cfi.py +++ b/RecoLocalTracker/SiPixelRecHits/python/SiPixelRecHitsGPU_cfi.py @@ -1,7 +1,8 @@ import FWCore.ParameterSet.Config as cms siPixelRecHits = cms.EDProducer("SiPixelRecHitGPU", - src = cms.InputTag("siPixelClusters"), + src = cms.InputTag("siPixelDigis"), +# src = cms.InputTag("siPixelClusters"), CPE = cms.string('PixelCPEFast'), # Generic'), VerboseLevel = cms.untracked.int32(0), diff --git a/RecoLocalTracker/SiPixelRecHits/src/PixelCPEFast.cc b/RecoLocalTracker/SiPixelRecHits/src/PixelCPEFast.cc index 3a466be6d57c4..abd6dd1bb6925 100644 --- a/RecoLocalTracker/SiPixelRecHits/src/PixelCPEFast.cc +++ b/RecoLocalTracker/SiPixelRecHits/src/PixelCPEFast.cc @@ -166,11 +166,6 @@ PixelCPEFast::localPosition(DetParam const & theDetParam, ClusterParam & theClus assert(!theClusterParam.with_track_angle); - float chargeWidthX = (theDetParam.lorentzShiftInCmX * theDetParam.widthLAFractionX); - float chargeWidthY = (theDetParam.lorentzShiftInCmY * theDetParam.widthLAFractionY); - float shiftX = 0.5f*theDetParam.lorentzShiftInCmX; - float shiftY = 0.5f*theDetParam.lorentzShiftInCmY; - if ( UseErrorsFromTemplates_ ) { float qclus = theClusterParam.theCluster->charge(); @@ -223,135 +218,34 @@ PixelCPEFast::localPosition(DetParam const & theDetParam, ClusterParam & theClus UseErrorsFromTemplates_ && TruncatePixelCharge_ ); - //--- Find the inner widths along X and Y in one shot. We - //--- compute the upper right corner of the inner pixels - //--- (== lower left corner of upper right pixel) and - //--- the lower left corner of the inner pixels - //--- (== upper right corner of lower left pixel), and then - //--- subtract these two points in the formula. - - //--- Upper Right corner of Lower Left pixel -- in measurement frame - uint16_t llx = theClusterParam.theCluster->minPixelRow()+1; - uint16_t lly = theClusterParam.theCluster->minPixelCol()+1; - - //--- Lower Left corner of Upper Right pixel -- in measurement frame - uint16_t urx = theClusterParam.theCluster->maxPixelRow(); - uint16_t ury = theClusterParam.theCluster->maxPixelCol(); - - auto llxl = phase1PixelTopology::localX(llx); - auto llyl = phase1PixelTopology::localY(lly); - auto urxl = phase1PixelTopology::localX(urx); - auto uryl = phase1PixelTopology::localY(ury); - - float xPos = - generic_position_formula( theClusterParam.theCluster->sizeX(), - Q_f_X, Q_l_X, - llxl, urxl, - chargeWidthX, // lorentz shift in cm - theDetParam.theThickness, - theClusterParam.cotalpha, - theDetParam.thePitchX, - phase1PixelTopology::isBigPixX( theClusterParam.theCluster->minPixelRow() ), - phase1PixelTopology::isBigPixX( theClusterParam.theCluster->maxPixelRow() ) - ); - - // apply the lorentz offset correction - xPos = xPos + shiftX + theDetParam.thePitchX*float(phase1PixelTopology::xOffset); - - float yPos = - generic_position_formula( theClusterParam.theCluster->sizeY(), - Q_f_Y, Q_l_Y, - llyl, uryl, - chargeWidthY, // lorentz shift in cm - theDetParam.theThickness, - theClusterParam.cotbeta, - theDetParam.thePitchY, - phase1PixelTopology::isBigPixY( theClusterParam.theCluster->minPixelCol() ), - phase1PixelTopology::isBigPixY( theClusterParam.theCluster->maxPixelCol() ) - ); - // apply the lorentz offset correction - yPos = yPos + shiftY + theDetParam.thePitchY*float(phase1PixelTopology::yOffset); - - //--- Now put the two together - LocalPoint pos_in_local( xPos, yPos ); - return pos_in_local; -} + // do GPU like ... + pixelCPEforGPU::ClusParams cp; + + cp.minRow[0] = theClusterParam.theCluster->minPixelRow(); + cp.maxRow[0] = theClusterParam.theCluster->maxPixelRow(); + cp.minCol[0] = theClusterParam.theCluster->minPixelCol(); + cp.maxCol[0] = theClusterParam.theCluster->maxPixelCol(); -//----------------------------------------------------------------------------- -//! A generic version of the position formula. Since it works for both -//! X and Y, in the interest of the simplicity of the code, all parameters -//! are passed by the caller. The only class variable used by this method -//! is the theThickness, since that's common for both X and Y. -//----------------------------------------------------------------------------- -float -PixelCPEFast:: -generic_position_formula( int size, //!< Size of this projection. - int Q_f, //!< Charge in the first pixel. - int Q_l, //!< Charge in the last pixel. - uint16_t upper_edge_first_pix, //!< As the name says. - uint16_t lower_edge_last_pix, //!< As the name says. - float lorentz_shift, //!< L-shift at half thickness - float theThickness, //detector thickness - float cot_angle, //!< cot of alpha_ or beta_ - float pitch, //!< thePitchX or thePitchY - bool first_is_big, //!< true if the first is big - bool last_is_big //!< true if the last is big - ) -{ - - float geom_center = 0.5f * pitch*float( upper_edge_first_pix + lower_edge_last_pix ); - - //--- The case of only one pixel in this projection is separate. Note that - //--- here first_pix == last_pix, so the average of the two is still the - //--- center of the pixel. - if ( size == 1 ) {return geom_center;} - - float W_eff; // the compiler detects the logic below (and warns if buggy!!!!0 - bool simple=true; - if (size==2) { - //--- Width of the clusters minus the edge (first and last) pixels. - //--- In the note, they are denoted x_F and x_L (and y_F and y_L) - assert(lower_edge_last_pix>=upper_edge_first_pix); - float W_inner = pitch * float(lower_edge_last_pix-upper_edge_first_pix); // in cm - - //--- Predicted charge width from geometry - float W_pred = theThickness * cot_angle // geometric correction (in cm) - - lorentz_shift; // (in cm) &&& check fpix! - - W_eff = std::abs( W_pred ) - W_inner; + cp.Q_f_X[0] = Q_f_X; + cp.Q_l_X[0] = Q_l_X; + cp.Q_f_Y[0] = Q_f_Y; + cp.Q_l_Y[0] = Q_l_Y; - //--- If the observed charge width is inconsistent with the expectations - //--- based on the track, do *not* use W_pred-W_innner. Instead, replace - //--- it with an *average* effective charge width, which is the average - //--- length of the edge pixels. - // - simple = ( W_eff < 0.0f ) | ( W_eff > pitch ); // this produces "large" regressions for very small numeric differences... + auto ind = theDetParam.theDet->index(); + pixelCPEforGPU::position(m_commonParamsGPU, m_detParamsGPU[ind],cp,0); + auto xPos = cp.xpos[0]; + auto yPos = cp.ypos[0]; - } - if (simple) { - //--- Total length of the two edge pixels (first+last) - float sum_of_edge = 2.0f; - if (first_is_big) sum_of_edge += 1.0f; - if (last_is_big) sum_of_edge += 1.0f; - W_eff = pitch * 0.5f * sum_of_edge; // ave. length of edge pixels (first+last) (cm) - } - - - //--- Finally, compute the position in this projection - float Qdiff = Q_l - Q_f; - float Qsum = Q_l + Q_f; - - //--- Temporary fix for clusters with both first and last pixel with charge = 0 - if(Qsum==0) Qsum=1.0f; - float hit_pos = geom_center + 0.5f*(Qdiff/Qsum) * W_eff; - - return hit_pos; + //--- Now put the two together + LocalPoint pos_in_local( xPos, yPos ); + return pos_in_local; } + //----------------------------------------------------------------------------- //! Collect the edge charges in x and y, in a single pass over the pixel vector. //! Calculate charge in the first and last pixel projected in x and y From bf8a301aa8c357f558563625d62dff7e301e4b02 Mon Sep 17 00:00:00 2001 From: Andrea Bocci Date: Thu, 1 Mar 2018 20:57:16 +0100 Subject: [PATCH 25/88] Use the `gpu` modifier to read the pixel clusters from the unpacker (#31) When running the GPU algorithms, the pixel unpacker is reponsible for providing both the digis and the cluster. These changes make use of the unpacker label to access the clusters, conditionally on the presence of the `gpu` process modifier. --- .../StandardSequences/python/Reconstruction_cff.py | 4 +++- .../python/pixelTracksMonitoring_cff.py | 2 ++ .../python/SiPixelClusterizerPreSplitting_cfi.py | 5 +++-- .../SiPixelRecHits/python/SiPixelRecHitsGPU_cfi.py | 8 +------- .../SiPixelRecHits/python/SiPixelRecHits_cfi.py | 4 ++-- Validation/RecoTrack/python/TrackValidation_cff.py | 3 +++ 6 files changed, 14 insertions(+), 12 deletions(-) diff --git a/Configuration/StandardSequences/python/Reconstruction_cff.py b/Configuration/StandardSequences/python/Reconstruction_cff.py index 7b3da3a0509dc..15abcb9598577 100644 --- a/Configuration/StandardSequences/python/Reconstruction_cff.py +++ b/Configuration/StandardSequences/python/Reconstruction_cff.py @@ -12,10 +12,12 @@ from RecoPixelVertexing.PixelLowPtUtilities.siPixelClusterShapeCache_cfi import * from Configuration.Eras.Modifier_fastSim_cff import fastSim +from Configuration.ProcessModifiers.gpu_cff import gpu siPixelClusterShapeCachePreSplitting = siPixelClusterShapeCache.clone( src = 'siPixelClustersPreSplitting' - ) +) +gpu.toModify(siPixelClusterShapeCachePreSplitting, src = "siPixelDigis") # Global reco from RecoEcal.Configuration.RecoEcal_cff import * diff --git a/DQM/TrackingMonitorSource/python/pixelTracksMonitoring_cff.py b/DQM/TrackingMonitorSource/python/pixelTracksMonitoring_cff.py index a075f671f05ce..711d757c94311 100644 --- a/DQM/TrackingMonitorSource/python/pixelTracksMonitoring_cff.py +++ b/DQM/TrackingMonitorSource/python/pixelTracksMonitoring_cff.py @@ -1,4 +1,5 @@ import FWCore.ParameterSet.Config as cms +from Configuration.ProcessModifiers.gpu_cff import gpu import DQM.TrackingMonitor.TrackerCollisionTrackingMonitor_cfi pixelTracksMonitoring = DQM.TrackingMonitor.TrackerCollisionTrackingMonitor_cfi.TrackerCollisionTrackMon.clone() @@ -21,3 +22,4 @@ pixelTracksMonitoring.doPlotsVsLUMI = True pixelTracksMonitoring.doPlotsVsBX = True +gpu.toModify(pixelTracksMonitoring, pixelCluster4lumi = "siPixelDigis") diff --git a/RecoLocalTracker/SiPixelClusterizer/python/SiPixelClusterizerPreSplitting_cfi.py b/RecoLocalTracker/SiPixelClusterizer/python/SiPixelClusterizerPreSplitting_cfi.py index ba8d492c5f610..4e6ff591fb78a 100644 --- a/RecoLocalTracker/SiPixelClusterizer/python/SiPixelClusterizerPreSplitting_cfi.py +++ b/RecoLocalTracker/SiPixelClusterizer/python/SiPixelClusterizerPreSplitting_cfi.py @@ -1,7 +1,8 @@ - import FWCore.ParameterSet.Config as cms -# from CondTools.SiPixel.SiPixelGainCalibrationService_cfi import * from RecoLocalTracker.SiPixelClusterizer.SiPixelClusterizer_cfi import siPixelClusters as _siPixelClusters siPixelClustersPreSplitting = _siPixelClusters.clone() + +# In principle we could remove `siPixelClustersPreSplitting` from the `pixeltrackerlocalreco` +# sequence when the `gpu` modufier is active; for the time being we keep it for simplicity. diff --git a/RecoLocalTracker/SiPixelRecHits/python/SiPixelRecHitsGPU_cfi.py b/RecoLocalTracker/SiPixelRecHits/python/SiPixelRecHitsGPU_cfi.py index b5b8f0585bb55..dc4806f91f86e 100644 --- a/RecoLocalTracker/SiPixelRecHits/python/SiPixelRecHitsGPU_cfi.py +++ b/RecoLocalTracker/SiPixelRecHits/python/SiPixelRecHitsGPU_cfi.py @@ -2,12 +2,6 @@ siPixelRecHits = cms.EDProducer("SiPixelRecHitGPU", src = cms.InputTag("siPixelDigis"), -# src = cms.InputTag("siPixelClusters"), - CPE = cms.string('PixelCPEFast'), # Generic'), + CPE = cms.string('PixelCPEFast'), # Generic VerboseLevel = cms.untracked.int32(0), - -) - -siPixelRecHitsPreSplitting = siPixelRecHits.clone( - src = 'siPixelClustersPreSplitting' ) diff --git a/RecoLocalTracker/SiPixelRecHits/python/SiPixelRecHits_cfi.py b/RecoLocalTracker/SiPixelRecHits/python/SiPixelRecHits_cfi.py index c19315cbc66c9..b13fd64d41565 100644 --- a/RecoLocalTracker/SiPixelRecHits/python/SiPixelRecHits_cfi.py +++ b/RecoLocalTracker/SiPixelRecHits/python/SiPixelRecHits_cfi.py @@ -1,16 +1,16 @@ import FWCore.ParameterSet.Config as cms +from Configuration.ProcessModifiers.gpu_cff import gpu siPixelRecHits = cms.EDProducer("SiPixelRecHitConverter", src = cms.InputTag("siPixelClusters"), CPE = cms.string('PixelCPEGeneric'), VerboseLevel = cms.untracked.int32(0), - ) from RecoLocalTracker.SiPixelRecHits.SiPixelRecHitsGPU_cfi import siPixelRecHits as _siPixelRecHitsGPU -from Configuration.ProcessModifiers.gpu_cff import gpu gpu.toReplaceWith(siPixelRecHits, _siPixelRecHitsGPU) siPixelRecHitsPreSplitting = siPixelRecHits.clone( src = 'siPixelClustersPreSplitting' ) +gpu.toModify(siPixelRecHitsPreSplitting, src = 'siPixelDigis') diff --git a/Validation/RecoTrack/python/TrackValidation_cff.py b/Validation/RecoTrack/python/TrackValidation_cff.py index 513697ad093df..87b1706b026aa 100644 --- a/Validation/RecoTrack/python/TrackValidation_cff.py +++ b/Validation/RecoTrack/python/TrackValidation_cff.py @@ -21,6 +21,7 @@ import RecoTracker.IterativeTracking.iterativeTkConfig as _cfg import RecoTracker.IterativeTracking.iterativeTkUtils as _utils from Configuration.Eras.Modifier_fastSim_cff import fastSim +from Configuration.ProcessModifiers.gpu_cff import gpu ### First define the stuff for the standard validation sequence ## Track selectors @@ -712,6 +713,8 @@ def _uniqueFirstLayers(layerList): tpClusterProducerPixelTrackingOnly = tpClusterProducer.clone( pixelClusterSrc = "siPixelClustersPreSplitting" ) +gpu.toModify(tpClusterProducerPixelTrackingOnly, pixelClusterSrc = "siPixelDigis") + quickTrackAssociatorByHitsPixelTrackingOnly = quickTrackAssociatorByHits.clone( cluster2TPSrc = "tpClusterProducerPixelTrackingOnly" ) From 873c25cf6ceeaceb0a011a5da1da1953e8195b43 Mon Sep 17 00:00:00 2001 From: Vincenzo Innocente Date: Tue, 13 Mar 2018 16:15:37 +0100 Subject: [PATCH 26/88] Speed up the GPU to CPU copy of the pixel clusters by factor 2 (#32) --- .../SiPixelRawToDigi/plugins/RawToDigiGPU.cu | 2 +- .../plugins/SiPixelRawToDigiGPU.cc | 15 ++++++++++++--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.cu b/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.cu index 21dd92b3e8578..eaa8527dd69ec 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.cu +++ b/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.cu @@ -683,7 +683,7 @@ void RawToDigi_wrapper( cudaCheck(cudaMemcpyAsync(clus_h, c.clus_d, wordCounter*sizeof(uint32_t), cudaMemcpyDeviceToHost, c.stream)); - cudaDeviceSynchronize(); + cudaStreamSynchronize(c.stream); cudaCheck(cudaGetLastError()); nModulesActive = nModules; diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc index 1c4a3824c8cbe..a6bd48bef00a1 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc +++ b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc @@ -62,6 +62,13 @@ struct AccretionCluster { unsigned int isize=0; int charge=0; + void clear() { + isize=0; + charge=0; + xmin=16000; + ymin=16000; + } + bool add(SiPixelCluster::PixelPos const & p, UShort const iadc) { if (isize==MAXSIZE) return false; xmin=std::min(xmin,(unsigned short)(p.row())); @@ -423,6 +430,7 @@ SiPixelRawToDigiGPU::produce( edm::Event& ev, const edm::EventSetup& es) int32_t nclus=-1; std::vector aclusters(256); auto totCluseFilled=0; + auto fillClusters = [&](uint32_t detId){ if (nclus<0) return; // this in reality should never happen edmNew::DetSetVector::FastFiller spc(*outputClusters, detId); @@ -438,6 +446,8 @@ SiPixelRawToDigiGPU::produce( edm::Event& ev, const edm::EventSetup& es) spc.push_back( std::move(cluster) ); std::push_heap(spc.begin(),spc.end(),[](SiPixelCluster const & cl1,SiPixelCluster const & cl2) { return cl1.minPixelRow() < cl2.minPixelRow();}); } + for (int32_t ic=0; ic=0); + assert(clus_h[i]<256); nclus = std::max(clus_h[i],nclus); auto row = dig.row(); auto col = dig.column(); SiPixelCluster::PixelPos pix(row,col); aclusters[clus_h[i]].add(pix,adc_h[i]); - theDigiCounter++; } From d7a470f2da0c8d5d8178400c8b7b5d1fabdd57f9 Mon Sep 17 00:00:00 2001 From: Andrea Bocci Date: Tue, 13 Mar 2018 17:22:15 +0100 Subject: [PATCH 27/88] Use CUDA Unified Addressing Update all calls to `cudaMemcpy` and `cudaMemcpyAsync` to pass `cudaMemcpyDefault` instead of explicitly specifying `cudaMemcpyHostToDevice`, `cudaMemcpyDeviceToHost`, etc. --- .../SiPixelRawToDigi/plugins/RawToDigiGPU.cu | 22 +++++++++---------- .../plugins/SiPixelFedCablingMapGPU.cc | 22 +++++++++---------- .../plugins/SiPixelFedCablingMapGPU.h | 2 +- .../test/test_GPUSimpleVector.cu | 14 +++++------- .../SiPixelRecHits/plugins/PixelRecHits.cu | 16 +++++++------- .../SiPixelRecHits/src/PixelCPEFast.cc | 6 ++--- 6 files changed, 39 insertions(+), 43 deletions(-) diff --git a/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.cu b/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.cu index eaa8527dd69ec..88f68f460441e 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.cu +++ b/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.cu @@ -584,12 +584,12 @@ void RawToDigi_wrapper( assert(0 == wordCounter%2); // wordCounter is the total no of words in each event to be trasfered on device - cudaCheck(cudaMemcpyAsync(&c.word_d[0], &word[0], wordCounter*sizeof(uint32_t), cudaMemcpyHostToDevice, c.stream)); - cudaCheck(cudaMemcpyAsync(&c.fedId_d[0], &fedId_h[0], wordCounter*sizeof(uint8_t)/2, cudaMemcpyHostToDevice, c.stream)); + cudaCheck(cudaMemcpyAsync(&c.word_d[0], &word[0], wordCounter*sizeof(uint32_t), cudaMemcpyDefault, c.stream)); + cudaCheck(cudaMemcpyAsync(&c.fedId_d[0], &fedId_h[0], wordCounter*sizeof(uint8_t)/2, cudaMemcpyDefault, c.stream)); constexpr uint32_t vsize = sizeof(GPU::SimpleVector); constexpr uint32_t esize = sizeof(error_obj); - cudaCheck(cudaMemcpyAsync(c.error_d, error_h_tmp, vsize, cudaMemcpyHostToDevice, c.stream)); + cudaCheck(cudaMemcpyAsync(c.error_d, error_h_tmp, vsize, cudaMemcpyDefault, c.stream)); // Launch rawToDigi kernel RawToDigi_kernel<<>>( @@ -609,15 +609,15 @@ void RawToDigi_wrapper( // copy data to host variable - cudaCheck(cudaMemcpyAsync(pdigi_h, c.pdigi_d, wordCounter*sizeof(uint32_t), cudaMemcpyDeviceToHost, c.stream)); - cudaCheck(cudaMemcpyAsync(rawIdArr_h, c.rawIdArr_d, wordCounter*sizeof(uint32_t), cudaMemcpyDeviceToHost, c.stream)); + cudaCheck(cudaMemcpyAsync(pdigi_h, c.pdigi_d, wordCounter*sizeof(uint32_t), cudaMemcpyDefault, c.stream)); + cudaCheck(cudaMemcpyAsync(rawIdArr_h, c.rawIdArr_d, wordCounter*sizeof(uint32_t), cudaMemcpyDefault, c.stream)); if (includeErrors) { - cudaCheck(cudaMemcpyAsync(error_h, c.error_d, vsize, cudaMemcpyDeviceToHost, c.stream)); + cudaCheck(cudaMemcpyAsync(error_h, c.error_d, vsize, cudaMemcpyDefault, c.stream)); cudaStreamSynchronize(c.stream); error_h->set_data(data_h); int size = error_h->size(); - cudaCheck(cudaMemcpyAsync(data_h, c.data_d, size*esize, cudaMemcpyDeviceToHost, c.stream)); + cudaCheck(cudaMemcpyAsync(data_h, c.data_d, size*esize, cudaMemcpyDefault, c.stream)); } // End of Raw2Digi and passing data for cluserisation @@ -639,7 +639,7 @@ void RawToDigi_wrapper( cudaCheck(cudaGetLastError()); // calibrated adc - cudaCheck(cudaMemcpyAsync(adc_h, c.adc_d, wordCounter*sizeof(uint32_t), cudaMemcpyDeviceToHost, c.stream)); + cudaCheck(cudaMemcpyAsync(adc_h, c.adc_d, wordCounter*sizeof(uint32_t), cudaMemcpyDefault, c.stream)); /* std::cout @@ -648,12 +648,12 @@ void RawToDigi_wrapper( */ uint32_t nModules=0; - cudaCheck(cudaMemcpyAsync(c.moduleStart_d, &nModules, sizeof(uint32_t), cudaMemcpyHostToDevice, c.stream)); + cudaCheck(cudaMemcpyAsync(c.moduleStart_d, &nModules, sizeof(uint32_t), cudaMemcpyDefault, c.stream)); countModules<<>>(c.moduleInd_d, c.moduleStart_d, c.clus_d, wordCounter); cudaCheck(cudaGetLastError()); - cudaCheck(cudaMemcpyAsync(&nModules, c.moduleStart_d, sizeof(uint32_t), cudaMemcpyDeviceToHost, c.stream)); + cudaCheck(cudaMemcpyAsync(&nModules, c.moduleStart_d, sizeof(uint32_t), cudaMemcpyDefault, c.stream)); // std::cout << "found " << nModules << " Modules active" << std::endl; @@ -680,7 +680,7 @@ void RawToDigi_wrapper( ); // clusters - cudaCheck(cudaMemcpyAsync(clus_h, c.clus_d, wordCounter*sizeof(uint32_t), cudaMemcpyDeviceToHost, c.stream)); + cudaCheck(cudaMemcpyAsync(clus_h, c.clus_d, wordCounter*sizeof(uint32_t), cudaMemcpyDefault, c.stream)); cudaStreamSynchronize(c.stream); diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.cc b/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.cc index 3a9bacb4426c5..7aff0e906b59d 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.cc +++ b/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.cc @@ -97,15 +97,15 @@ void processCablingMap(SiPixelFedCablingMap const& cablingMap, TrackerGeometry } cablingMapGPU->size = index-1; - cudaCheck(cudaMemcpy(cablingMapGPU->fed, fedMap.data(), fedMap.size() * sizeof(unsigned int), cudaMemcpyHostToDevice)); - cudaCheck(cudaMemcpy(cablingMapGPU->link, linkMap.data(), linkMap.size() * sizeof(unsigned int), cudaMemcpyHostToDevice)); - cudaCheck(cudaMemcpy(cablingMapGPU->roc, rocMap.data(), rocMap.size() * sizeof(unsigned int), cudaMemcpyHostToDevice)); - cudaCheck(cudaMemcpy(cablingMapGPU->RawId, RawId.data(), RawId.size() * sizeof(unsigned int), cudaMemcpyHostToDevice)); - cudaCheck(cudaMemcpy(cablingMapGPU->rocInDet, rocInDet.data(), rocInDet.size() * sizeof(unsigned int), cudaMemcpyHostToDevice)); - cudaCheck(cudaMemcpy(cablingMapGPU->moduleId, moduleId.data(), moduleId.size() * sizeof(unsigned int), cudaMemcpyHostToDevice)); - cudaCheck(cudaMemcpy(cablingMapGPU->badRocs, badRocs.data(), badRocs.size() * sizeof(unsigned char), cudaMemcpyHostToDevice)); - cudaCheck(cudaMemcpy(cablingMapGPU->modToUnp, modToUnp.data(), modToUnp.size() * sizeof(unsigned char), cudaMemcpyHostToDevice)); - cudaCheck(cudaMemcpy(cablingMapDevice, cablingMapGPU, sizeof(SiPixelFedCablingMapGPU), cudaMemcpyHostToDevice)); + cudaCheck(cudaMemcpy(cablingMapGPU->fed, fedMap.data(), fedMap.size() * sizeof(unsigned int), cudaMemcpyDefault)); + cudaCheck(cudaMemcpy(cablingMapGPU->link, linkMap.data(), linkMap.size() * sizeof(unsigned int), cudaMemcpyDefault)); + cudaCheck(cudaMemcpy(cablingMapGPU->roc, rocMap.data(), rocMap.size() * sizeof(unsigned int), cudaMemcpyDefault)); + cudaCheck(cudaMemcpy(cablingMapGPU->RawId, RawId.data(), RawId.size() * sizeof(unsigned int), cudaMemcpyDefault)); + cudaCheck(cudaMemcpy(cablingMapGPU->rocInDet, rocInDet.data(), rocInDet.size() * sizeof(unsigned int), cudaMemcpyDefault)); + cudaCheck(cudaMemcpy(cablingMapGPU->moduleId, moduleId.data(), moduleId.size() * sizeof(unsigned int), cudaMemcpyDefault)); + cudaCheck(cudaMemcpy(cablingMapGPU->badRocs, badRocs.data(), badRocs.size() * sizeof(unsigned char), cudaMemcpyDefault)); + cudaCheck(cudaMemcpy(cablingMapGPU->modToUnp, modToUnp.data(), modToUnp.size() * sizeof(unsigned char), cudaMemcpyDefault)); + cudaCheck(cudaMemcpy(cablingMapDevice, cablingMapGPU, sizeof(SiPixelFedCablingMapGPU), cudaMemcpyDefault)); cudaDeviceSynchronize(); } @@ -133,7 +133,7 @@ processGainCalibration(SiPixelGainCalibrationForHLT const & gains, TrackerGeomet cudaCheck(cudaMalloc((void**) & gainDataOnGPU, gains.data().size())); cudaCheck(cudaMalloc((void**) &gainsOnGPU,sizeof(SiPixelGainForHLTonGPU))); - cudaCheck(cudaMemcpy(gainDataOnGPU,gains.data().data(),gains.data().size(), cudaMemcpyHostToDevice)); + cudaCheck(cudaMemcpy(gainDataOnGPU,gains.data().data(),gains.data().size(), cudaMemcpyDefault)); gg.v_pedestals = gainDataOnGPU; @@ -174,7 +174,7 @@ processGainCalibration(SiPixelGainCalibrationForHLT const & gains, TrackerGeomet } - cudaCheck(cudaMemcpy(gainsOnGPU,&gg,sizeof(SiPixelGainForHLTonGPU), cudaMemcpyHostToDevice)); + cudaCheck(cudaMemcpy(gainsOnGPU,&gg,sizeof(SiPixelGainForHLTonGPU), cudaMemcpyDefault)); cudaDeviceSynchronize(); diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.h b/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.h index 380a6ae406ec1..b206d440cc2b8 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.h +++ b/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.h @@ -46,7 +46,7 @@ void allocateCablingMap(SiPixelFedCablingMapGPU* & cablingMapHost, SiPixelFedCab cudaCheck(cudaMalloc((void**) & cablingMapHost->moduleId, MAX_SIZE_BYTE_INT)); cudaCheck(cudaMalloc((void**) & cablingMapHost->badRocs, MAX_SIZE_BYTE_BOOL)); cudaCheck(cudaMalloc((void**) & cablingMapHost->modToUnp, MAX_SIZE_BYTE_BOOL)); - cudaCheck(cudaMemcpy(cablingMapDevice, cablingMapHost, sizeof(SiPixelFedCablingMapGPU), cudaMemcpyHostToDevice)); + cudaCheck(cudaMemcpy(cablingMapDevice, cablingMapHost, sizeof(SiPixelFedCablingMapGPU), cudaMemcpyDefault)); } inline diff --git a/HeterogeneousCore/CUDAUtilities/test/test_GPUSimpleVector.cu b/HeterogeneousCore/CUDAUtilities/test/test_GPUSimpleVector.cu index 68ba05757032f..08f08b044a054 100644 --- a/HeterogeneousCore/CUDAUtilities/test/test_GPUSimpleVector.cu +++ b/HeterogeneousCore/CUDAUtilities/test/test_GPUSimpleVector.cu @@ -46,38 +46,34 @@ int main() { cudaMalloc(&d_obj_ptr, sizeof(GPU::SimpleVector)) == cudaSuccess // ... and copy the object to the device. && cudaMemcpy(d_obj_ptr, tmp_obj_ptr, sizeof(GPU::SimpleVector), - cudaMemcpyHostToDevice) == cudaSuccess; + cudaMemcpyDefault) == cudaSuccess; int numBlocks = 5; int numThreadsPerBlock = 256; assert(success); vector_pushback<<>>(d_obj_ptr); - cudaMemcpy(obj_ptr, d_obj_ptr, sizeof(GPU::SimpleVector), - cudaMemcpyDeviceToHost); + cudaMemcpy(obj_ptr, d_obj_ptr, sizeof(GPU::SimpleVector), cudaMemcpyDefault); assert(obj_ptr->size() == (numBlocks * numThreadsPerBlock < maxN ? numBlocks * numThreadsPerBlock : maxN)); vector_reset<<>>(d_obj_ptr); - cudaMemcpy(obj_ptr, d_obj_ptr, sizeof(GPU::SimpleVector), - cudaMemcpyDeviceToHost); + cudaMemcpy(obj_ptr, d_obj_ptr, sizeof(GPU::SimpleVector), cudaMemcpyDefault); assert(obj_ptr->size() == 0); vector_emplace_back<<>>(d_obj_ptr); - cudaMemcpy(obj_ptr, d_obj_ptr, sizeof(GPU::SimpleVector), - cudaMemcpyDeviceToHost); + cudaMemcpy(obj_ptr, d_obj_ptr, sizeof(GPU::SimpleVector), cudaMemcpyDefault); assert(obj_ptr->size() == (numBlocks * numThreadsPerBlock < maxN ? numBlocks * numThreadsPerBlock : maxN)); success = success and - cudaMemcpy(data_ptr, d_data_ptr, obj_ptr->size() * sizeof(int), - cudaMemcpyDeviceToHost) == cudaSuccess and + cudaMemcpy(data_ptr, d_data_ptr, obj_ptr->size() * sizeof(int), cudaMemcpyDefault) == cudaSuccess and cudaFreeHost(obj_ptr) == cudaSuccess and cudaFreeHost(data_ptr) == cudaSuccess and cudaFreeHost(tmp_obj_ptr) == cudaSuccess and diff --git a/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.cu b/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.cu index 4f43e933833cb..e575d5dfce081 100644 --- a/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.cu +++ b/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.cu @@ -41,14 +41,14 @@ pixelRecHits_wrapper( uint32_t hitsModuleStart[gpuClustering::MaxNumModules+1]; hitsModuleStart[0] =0; - cudaCheck(cudaMemcpyAsync(&hitsModuleStart[1], c.clusInModule_d, gpuClustering::MaxNumModules*sizeof(uint32_t), cudaMemcpyDeviceToHost, c.stream)); + cudaCheck(cudaMemcpyAsync(&hitsModuleStart[1], c.clusInModule_d, gpuClustering::MaxNumModules*sizeof(uint32_t), cudaMemcpyDefault, c.stream)); std::partial_sum(std::begin(hitsModuleStart),std::end(hitsModuleStart),std::begin(hitsModuleStart)); auto nhits = hitsModuleStart[gpuClustering::MaxNumModules]; // std::cout << " total number of clusters " << nhits << std::endl; - cudaCheck(cudaMemcpyAsync(hh.hitsModuleStart_d, &hitsModuleStart, (gpuClustering::MaxNumModules+1)*sizeof(uint32_t), cudaMemcpyHostToDevice, c.stream)); + cudaCheck(cudaMemcpyAsync(hh.hitsModuleStart_d, &hitsModuleStart, (gpuClustering::MaxNumModules+1)*sizeof(uint32_t), cudaMemcpyDefault, c.stream)); int threadsPerBlock = 256; @@ -72,7 +72,7 @@ pixelRecHits_wrapper( // all this needed only if hits on CPU are required.... HitsOnCPU hoc(nhits); memcpy(hoc.hitsModuleStart,hitsModuleStart,2001*sizeof(uint32_t)); - cudaCheck(cudaMemcpyAsync(hoc.charge.data(), hh.charge_d, nhits*sizeof(uint32_t), cudaMemcpyDeviceToHost, c.stream)); + cudaCheck(cudaMemcpyAsync(hoc.charge.data(), hh.charge_d, nhits*sizeof(uint32_t), cudaMemcpyDefault, c.stream)); /* int ngood=0; @@ -81,11 +81,11 @@ pixelRecHits_wrapper( std::cout << " total number of good clusters " << ngood << std::endl; */ - cudaCheck(cudaMemcpyAsync(hoc.xl.data(), hh.xg_d, nhits*sizeof(uint32_t), cudaMemcpyDeviceToHost, c.stream)); - cudaCheck(cudaMemcpyAsync(hoc.yl.data(), hh.yg_d, nhits*sizeof(uint32_t), cudaMemcpyDeviceToHost, c.stream)); - cudaCheck(cudaMemcpyAsync(hoc.xe.data(), hh.xerr_d, nhits*sizeof(uint32_t), cudaMemcpyDeviceToHost, c.stream)); - cudaCheck(cudaMemcpyAsync(hoc.ye.data(), hh.yerr_d, nhits*sizeof(uint32_t), cudaMemcpyDeviceToHost, c.stream)); - cudaCheck(cudaMemcpyAsync(hoc.mr.data(), hh.mr_d, nhits*sizeof(uint16_t), cudaMemcpyDeviceToHost, c.stream)); + cudaCheck(cudaMemcpyAsync(hoc.xl.data(), hh.xg_d, nhits*sizeof(uint32_t), cudaMemcpyDefault, c.stream)); + cudaCheck(cudaMemcpyAsync(hoc.yl.data(), hh.yg_d, nhits*sizeof(uint32_t), cudaMemcpyDefault, c.stream)); + cudaCheck(cudaMemcpyAsync(hoc.xe.data(), hh.xerr_d, nhits*sizeof(uint32_t), cudaMemcpyDefault, c.stream)); + cudaCheck(cudaMemcpyAsync(hoc.ye.data(), hh.yerr_d, nhits*sizeof(uint32_t), cudaMemcpyDefault, c.stream)); + cudaCheck(cudaMemcpyAsync(hoc.mr.data(), hh.mr_d, nhits*sizeof(uint16_t), cudaMemcpyDefault, c.stream)); return hoc; } diff --git a/RecoLocalTracker/SiPixelRecHits/src/PixelCPEFast.cc b/RecoLocalTracker/SiPixelRecHits/src/PixelCPEFast.cc index abd6dd1bb6925..54948d6e43bf6 100644 --- a/RecoLocalTracker/SiPixelRecHits/src/PixelCPEFast.cc +++ b/RecoLocalTracker/SiPixelRecHits/src/PixelCPEFast.cc @@ -130,9 +130,9 @@ void PixelCPEFast::fillParamsForGpu() { cudaCheck(cudaMalloc((void**) & h_paramsOnGPU.m_detParams, m_detParamsGPU.size()*sizeof(pixelCPEforGPU::DetParams))); cudaCheck(cudaMalloc((void**) & d_paramsOnGPU, sizeof(pixelCPEforGPU::ParamsOnGPU))); - cudaCheck(cudaMemcpy(d_paramsOnGPU, &h_paramsOnGPU, sizeof(pixelCPEforGPU::ParamsOnGPU), cudaMemcpyHostToDevice)); - cudaCheck(cudaMemcpy(h_paramsOnGPU.m_commonParams,&m_commonParamsGPU,sizeof(pixelCPEforGPU::CommonParams), cudaMemcpyHostToDevice)); - cudaCheck(cudaMemcpy(h_paramsOnGPU.m_detParams, m_detParamsGPU.data(), m_detParamsGPU.size()*sizeof(pixelCPEforGPU::DetParams), cudaMemcpyHostToDevice)); + cudaCheck(cudaMemcpy(d_paramsOnGPU, &h_paramsOnGPU, sizeof(pixelCPEforGPU::ParamsOnGPU), cudaMemcpyDefault)); + cudaCheck(cudaMemcpy(h_paramsOnGPU.m_commonParams,&m_commonParamsGPU,sizeof(pixelCPEforGPU::CommonParams), cudaMemcpyDefault)); + cudaCheck(cudaMemcpy(h_paramsOnGPU.m_detParams, m_detParamsGPU.data(), m_detParamsGPU.size()*sizeof(pixelCPEforGPU::DetParams), cudaMemcpyDefault)); cudaDeviceSynchronize(); } From bfba4fbd7af9df38d29ffcc6151903ccf012a5b0 Mon Sep 17 00:00:00 2001 From: Andrea Bocci Date: Thu, 15 Mar 2018 10:54:19 +0100 Subject: [PATCH 28/88] Introduce an STL-compatible allocator for CUDA host memory --- .../plugins/SiPixelFedCablingMapGPU.cc | 116 +++++++++--------- .../plugins/SiPixelFedCablingMapGPU.h | 6 +- .../interface/CUDAHostAllocator.h | 57 +++++++++ .../SiPixelRecHits/interface/PixelCPEFast.h | 14 +-- .../SiPixelRecHits/src/PixelCPEFast.cc | 34 +---- 5 files changed, 127 insertions(+), 100 deletions(-) create mode 100644 HeterogeneousCore/CUDAUtilities/interface/CUDAHostAllocator.h diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.cc b/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.cc index 7aff0e906b59d..a1bed62897925 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.cc +++ b/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.cc @@ -19,20 +19,22 @@ #include "CondFormats/SiPixelObjects/interface/SiPixelGainCalibrationForHLT.h" #include "CondFormats/SiPixelObjects/interface/SiPixelGainForHLTonGPU.h" +#include "HeterogeneousCore/CUDAUtilities/interface/CUDAHostAllocator.h" + void processCablingMap(SiPixelFedCablingMap const& cablingMap, TrackerGeometry const& trackerGeom, - SiPixelFedCablingMapGPU* cablingMapGPU, SiPixelFedCablingMapGPU* cablingMapDevice, + SiPixelFedCablingMapGPU* cablingMapHost, SiPixelFedCablingMapGPU* cablingMapDevice, const SiPixelQuality* badPixelInfo, std::set const& modules) { std::vector const& fedIds = cablingMap.fedIds(); std::unique_ptr const& cabling = cablingMap.cablingTree(); - std::vector fedMap(MAX_SIZE); - std::vector linkMap(MAX_SIZE); - std::vector rocMap(MAX_SIZE); - std::vector RawId(MAX_SIZE); - std::vector rocInDet(MAX_SIZE); - std::vector moduleId(MAX_SIZE); - std::vector badRocs(MAX_SIZE); - std::vector modToUnp(MAX_SIZE); + std::vector> fedMap(MAX_SIZE); + std::vector> linkMap(MAX_SIZE); + std::vector> rocMap(MAX_SIZE); + std::vector> RawId(MAX_SIZE); + std::vector> rocInDet(MAX_SIZE); + std::vector> moduleId(MAX_SIZE); + std::vector> badRocs(MAX_SIZE); + std::vector> modToUnp(MAX_SIZE); unsigned int startFed = *(fedIds.begin()); unsigned int endFed = *(fedIds.end() - 1); @@ -96,64 +98,67 @@ void processCablingMap(SiPixelFedCablingMap const& cablingMap, TrackerGeometry LogDebug("SiPixelFedCablingMapGPU") << "----------------------------------------------------------------------------" << std::endl; } - cablingMapGPU->size = index-1; - cudaCheck(cudaMemcpy(cablingMapGPU->fed, fedMap.data(), fedMap.size() * sizeof(unsigned int), cudaMemcpyDefault)); - cudaCheck(cudaMemcpy(cablingMapGPU->link, linkMap.data(), linkMap.size() * sizeof(unsigned int), cudaMemcpyDefault)); - cudaCheck(cudaMemcpy(cablingMapGPU->roc, rocMap.data(), rocMap.size() * sizeof(unsigned int), cudaMemcpyDefault)); - cudaCheck(cudaMemcpy(cablingMapGPU->RawId, RawId.data(), RawId.size() * sizeof(unsigned int), cudaMemcpyDefault)); - cudaCheck(cudaMemcpy(cablingMapGPU->rocInDet, rocInDet.data(), rocInDet.size() * sizeof(unsigned int), cudaMemcpyDefault)); - cudaCheck(cudaMemcpy(cablingMapGPU->moduleId, moduleId.data(), moduleId.size() * sizeof(unsigned int), cudaMemcpyDefault)); - cudaCheck(cudaMemcpy(cablingMapGPU->badRocs, badRocs.data(), badRocs.size() * sizeof(unsigned char), cudaMemcpyDefault)); - cudaCheck(cudaMemcpy(cablingMapGPU->modToUnp, modToUnp.data(), modToUnp.size() * sizeof(unsigned char), cudaMemcpyDefault)); - cudaCheck(cudaMemcpy(cablingMapDevice, cablingMapGPU, sizeof(SiPixelFedCablingMapGPU), cudaMemcpyDefault)); + cablingMapHost->size = index-1; + cudaCheck(cudaMemcpy(cablingMapHost->fed, fedMap.data(), fedMap.size() * sizeof(unsigned int), cudaMemcpyDefault)); + cudaCheck(cudaMemcpy(cablingMapHost->link, linkMap.data(), linkMap.size() * sizeof(unsigned int), cudaMemcpyDefault)); + cudaCheck(cudaMemcpy(cablingMapHost->roc, rocMap.data(), rocMap.size() * sizeof(unsigned int), cudaMemcpyDefault)); + cudaCheck(cudaMemcpy(cablingMapHost->RawId, RawId.data(), RawId.size() * sizeof(unsigned int), cudaMemcpyDefault)); + cudaCheck(cudaMemcpy(cablingMapHost->rocInDet, rocInDet.data(), rocInDet.size() * sizeof(unsigned int), cudaMemcpyDefault)); + cudaCheck(cudaMemcpy(cablingMapHost->moduleId, moduleId.data(), moduleId.size() * sizeof(unsigned int), cudaMemcpyDefault)); + cudaCheck(cudaMemcpy(cablingMapHost->badRocs, badRocs.data(), badRocs.size() * sizeof(unsigned char), cudaMemcpyDefault)); + cudaCheck(cudaMemcpy(cablingMapHost->modToUnp, modToUnp.data(), modToUnp.size() * sizeof(unsigned char), cudaMemcpyDefault)); + cudaCheck(cudaMemcpy(cablingMapDevice, cablingMapHost, sizeof(SiPixelFedCablingMapGPU), cudaMemcpyDefault)); cudaDeviceSynchronize(); } void -processGainCalibration(SiPixelGainCalibrationForHLT const & gains, TrackerGeometry const& geom, SiPixelGainForHLTonGPU * & gainsOnGPU, SiPixelGainForHLTonGPU::DecodingStructure * & gainDataOnGPU) { - - +processGainCalibration(SiPixelGainCalibrationForHLT const & gains, TrackerGeometry const& geom, SiPixelGainForHLTonGPU * & gainsOnGPU, SiPixelGainForHLTonGPU::DecodingStructure * & gainDataOnGPU) { // bizzarre logic (looking for fist strip-det) don't ask - auto const & dus = geom.detUnits(); - unsigned m_detectors = dus.size(); - for(unsigned int i=1;i<7;++i) { - if(geom.offsetDU(GeomDetEnumerators::tkDetEnum[i]) != dus.size() && - dus[geom.offsetDU(GeomDetEnumerators::tkDetEnum[i])]->type().isTrackerStrip()) { - if(geom.offsetDU(GeomDetEnumerators::tkDetEnum[i]) < m_detectors) m_detectors = geom.offsetDU(GeomDetEnumerators::tkDetEnum[i]); - } - } - - std::cout<<"caching calibs for "<type().isTrackerStrip()) { + if(geom.offsetDU(GeomDetEnumerators::tkDetEnum[i]) < m_detectors) m_detectors = geom.offsetDU(GeomDetEnumerators::tkDetEnum[i]); + } + } + std::cout << "caching calibs for " << m_detectors << " pixel detectors of size " << gains.data().size() << std::endl; + std::cout << "sizes " << sizeof(char) << ' ' << sizeof(uint8_t) << ' ' << sizeof(SiPixelGainForHLTonGPU::DecodingStructure) << std::endl; - SiPixelGainForHLTonGPU gg; + SiPixelGainForHLTonGPU * gg; + cudaCheck(cudaMallocHost((void**) & gg, sizeof(SiPixelGainForHLTonGPU))); assert(nullptr==gainDataOnGPU); cudaCheck(cudaMalloc((void**) & gainDataOnGPU, gains.data().size())); - cudaCheck(cudaMalloc((void**) &gainsOnGPU,sizeof(SiPixelGainForHLTonGPU))); - - cudaCheck(cudaMemcpy(gainDataOnGPU,gains.data().data(),gains.data().size(), cudaMemcpyDefault)); + cudaCheck(cudaMalloc((void**) & gainsOnGPU, sizeof(SiPixelGainForHLTonGPU))); + // gains.data().data() is used also for non-GPU code, we cannot allocate it on aligned and write-combined memory + cudaCheck(cudaMemcpy(gainDataOnGPU, gains.data().data(), gains.data().size(), cudaMemcpyDefault)); - gg.v_pedestals = gainDataOnGPU; + gg->v_pedestals = gainDataOnGPU; - assert(gg.v_pedestals); + // do not read back from the (possibly write-combined) memory buffer + auto minPed = gains.getPedLow(); + auto maxPed = gains.getPedHigh(); + auto minGain = gains.getGainLow(); + auto maxGain = gains.getGainHigh(); + auto nBinsToUseForEncoding = 253; // we will simplify later (not everything is needed....) - gg.minPed_ = gains.getPedLow(); - gg.maxPed_ = gains.getPedHigh(); - gg.minGain_= gains.getGainLow(); - gg.maxGain_= gains.getGainHigh(); + gg->minPed_ = minPed; + gg->maxPed_ = maxPed; + gg->minGain_= minGain; + gg->maxGain_= maxGain; - gg.numberOfRowsAveragedOver_ = 80; - gg.nBinsToUseForEncoding_ = 253; - gg.deadFlag_ = 255; - gg.noisyFlag_ = 254; + gg->numberOfRowsAveragedOver_ = 80; + gg->nBinsToUseForEncoding_ = nBinsToUseForEncoding; + gg->deadFlag_ = 255; + gg->noisyFlag_ = 254; - gg.pedPrecision = (gg.maxPed_-gg.minPed_)/static_cast(gg.nBinsToUseForEncoding_); - gg.gainPrecision = (gg.maxGain_-gg.minGain_)/static_cast(gg.nBinsToUseForEncoding_); + gg->pedPrecision = static_cast(maxPed - minPed) / nBinsToUseForEncoding; + gg->gainPrecision = static_cast(maxGain - minGain) / nBinsToUseForEncoding; - std::cout << "precisions g " << gg.pedPrecision << ' ' << gg.gainPrecision << std::endl; + std::cout << "precisions g " << gg->pedPrecision << ' ' << gg->gainPrecision << std::endl; // fill the index map auto const & ind = gains.getIndexes(); @@ -168,15 +173,12 @@ processGainCalibration(SiPixelGainCalibrationForHLT const & gains, TrackerGeomet assert(0==p->iend%2); assert(p->ibegin!=p->iend); assert(p->ncols>0); - gg.rangeAndCols[i] = std::make_pair(SiPixelGainForHLTonGPU::Range(p->ibegin,p->iend), p->ncols); + gg->rangeAndCols[i] = std::make_pair(SiPixelGainForHLTonGPU::Range(p->ibegin,p->iend), p->ncols); // if (ind[i].detid!=dus[i]->geographicalId()) std::cout << ind[i].detid<<"!="<geographicalId() << std::endl; - // gg.rangeAndCols[i] = std::make_pair(SiPixelGainForHLTonGPU::Range(ind[i].ibegin,ind[i].iend), ind[i].ncols); + // gg->rangeAndCols[i] = std::make_pair(SiPixelGainForHLTonGPU::Range(ind[i].ibegin,ind[i].iend), ind[i].ncols); } - - cudaCheck(cudaMemcpy(gainsOnGPU,&gg,sizeof(SiPixelGainForHLTonGPU), cudaMemcpyDefault)); - - + cudaCheck(cudaMemcpy(gainsOnGPU, gg, sizeof(SiPixelGainForHLTonGPU), cudaMemcpyDefault)); + cudaFreeHost(gg); cudaDeviceSynchronize(); - } diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.h b/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.h index b206d440cc2b8..3cd35f54480d5 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.h +++ b/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.h @@ -36,7 +36,7 @@ struct SiPixelFedCablingMapGPU { inline void allocateCablingMap(SiPixelFedCablingMapGPU* & cablingMapHost, SiPixelFedCablingMapGPU* & cablingMapDevice) { - cablingMapHost = new SiPixelFedCablingMapGPU(); + cudaCheck(cudaMallocHost((void**) & cablingMapHost, sizeof(SiPixelFedCablingMapGPU))); cudaCheck(cudaMalloc((void**) & cablingMapDevice, sizeof(SiPixelFedCablingMapGPU))); cudaCheck(cudaMalloc((void**) & cablingMapHost->fed, MAX_SIZE_BYTE_INT)); cudaCheck(cudaMalloc((void**) & cablingMapHost->link, MAX_SIZE_BYTE_INT)); @@ -60,11 +60,11 @@ void deallocateCablingMap(SiPixelFedCablingMapGPU* cablingMapHost, SiPixelFedCab cudaCheck(cudaFree(cablingMapHost->modToUnp)); cudaCheck(cudaFree(cablingMapHost->badRocs)); cudaCheck(cudaFree(cablingMapDevice)); - delete cablingMapHost; + cudaCheck(cudaFreeHost(cablingMapHost)); } void processCablingMap(SiPixelFedCablingMap const& cablingMap, TrackerGeometry const& trackerGeom, - SiPixelFedCablingMapGPU* cablingMapGPU, SiPixelFedCablingMapGPU* cablingMapDevice, const SiPixelQuality* badPixelInfo, std::set const& modules); + SiPixelFedCablingMapGPU* cablingMapHost, SiPixelFedCablingMapGPU* cablingMapDevice, const SiPixelQuality* badPixelInfo, std::set const& modules); void processGainCalibration(SiPixelGainCalibrationForHLT const & gains, TrackerGeometry const& trackerGeom, SiPixelGainForHLTonGPU * & gainsOnGPU, SiPixelGainForHLTonGPU_DecodingStructure * & gainDataOnGPU); diff --git a/HeterogeneousCore/CUDAUtilities/interface/CUDAHostAllocator.h b/HeterogeneousCore/CUDAUtilities/interface/CUDAHostAllocator.h new file mode 100644 index 0000000000000..68cf807499143 --- /dev/null +++ b/HeterogeneousCore/CUDAUtilities/interface/CUDAHostAllocator.h @@ -0,0 +1,57 @@ +#ifndef HeterogeneousCore_CUDAUtilities_CUDAHostAllocator_h +#define HeterogeneousCore_CUDAUtilities_CUDAHostAllocator_h + +#include +#include +#include + + +class cuda_bad_alloc : public std::bad_alloc { +public: + cuda_bad_alloc(cudaError_t error) noexcept : + error_(error) + { } + + const char* what() const noexcept override + { + return cudaGetErrorString(error_); + } + +private: + cudaError_t error_; +}; + + +template class CUDAHostAllocator { +public: + using value_type = T; + + template + struct rebind { + using other = CUDAHostAllocator; + }; + + T* allocate(std::size_t n) const __attribute__((warn_unused_result)) __attribute__((malloc)) __attribute__((returns_nonnull)) + { + void* ptr = nullptr; + cudaError_t status = cudaMallocHost(&ptr, n * sizeof(T), FLAGS); + if (status != cudaSuccess) { + throw cuda_bad_alloc(status); + } + if (ptr == nullptr) { + throw std::bad_alloc(); + } + return static_cast(ptr); + } + + void deallocate(T* p, std::size_t n) const + { + cudaError_t status = cudaFreeHost(p); + if (status != cudaSuccess) { + throw cuda_bad_alloc(status); + } + } + +}; + +#endif // HeterogeneousCore_CUDAUtilities_CUDAHostAllocator_h diff --git a/RecoLocalTracker/SiPixelRecHits/interface/PixelCPEFast.h b/RecoLocalTracker/SiPixelRecHits/interface/PixelCPEFast.h index ed1ae37eb1324..d845cddd6702e 100644 --- a/RecoLocalTracker/SiPixelRecHits/interface/PixelCPEFast.h +++ b/RecoLocalTracker/SiPixelRecHits/interface/PixelCPEFast.h @@ -9,6 +9,7 @@ #include "RecoLocalTracker/SiPixelRecHits/interface/SiPixelTemplate.h" #include "RecoLocalTracker/SiPixelRecHits/interface/SiPixelGenError.h" +#include "HeterogeneousCore/CUDAUtilities/interface/CUDAHostAllocator.h" #include #include @@ -43,6 +44,7 @@ class PixelCPEFast final : public PixelCPEBase ~PixelCPEFast(); + private: ClusterParam * createClusterParam(const SiPixelCluster & cl) const override; @@ -75,21 +77,11 @@ class PixelCPEFast final : public PixelCPEBase public : - void fillParamsForGpu(); // not needed if not used on CPU... - std::vector m_detParamsGPU; + std::vector> m_detParamsGPU; pixelCPEforGPU::CommonParams m_commonParamsGPU; - pixelCPEforGPU::ParamsOnGPU h_paramsOnGPU; - pixelCPEforGPU::ParamsOnGPU * d_paramsOnGPU; // copy of the above on the Device - - }; - - - - - diff --git a/RecoLocalTracker/SiPixelRecHits/src/PixelCPEFast.cc b/RecoLocalTracker/SiPixelRecHits/src/PixelCPEFast.cc index 54948d6e43bf6..f40fb759b1557 100644 --- a/RecoLocalTracker/SiPixelRecHits/src/PixelCPEFast.cc +++ b/RecoLocalTracker/SiPixelRecHits/src/PixelCPEFast.cc @@ -34,17 +34,15 @@ PixelCPEFast::PixelCPEFast(edm::ParameterSet const & conf, const TrackerTopology& ttopo, const SiPixelLorentzAngle * lorentzAngle, const SiPixelGenErrorDBObject * genErrorDBObject, - const SiPixelLorentzAngle * lorentzAngleWidth) - : PixelCPEBase(conf, mag, geom, ttopo, lorentzAngle, genErrorDBObject, nullptr,lorentzAngleWidth,0) { - + const SiPixelLorentzAngle * lorentzAngleWidth) : + PixelCPEBase(conf, mag, geom, ttopo, lorentzAngle, genErrorDBObject, nullptr, lorentzAngleWidth, 0) +{ EdgeClusterErrorX_ = conf.getParameter("EdgeClusterErrorX"); EdgeClusterErrorY_ = conf.getParameter("EdgeClusterErrorY"); - UseErrorsFromTemplates_ = conf.getParameter("UseErrorsFromTemplates"); TruncatePixelCharge_ = conf.getParameter("TruncatePixelCharge"); - // Use errors from templates or from GenError if ( UseErrorsFromTemplates_ ) { if ( !SiPixelGenError::pushfile( *genErrorDBObject_, thePixelGenError_) ) @@ -68,15 +66,10 @@ PixelCPEFast::PixelCPEFast(edm::ParameterSet const & conf, yerr_endcap_= {0.00210}; yerr_endcap_def_=0.00075; - - fillParamsForGpu(); - } void PixelCPEFast::fillParamsForGpu() { - - m_commonParamsGPU.theThicknessB = m_DetParams.front().theThickness; m_commonParamsGPU.theThicknessE = m_DetParams.back().theThickness; m_commonParamsGPU.thePitchX = m_DetParams[0].thePitchX; @@ -89,7 +82,6 @@ void PixelCPEFast::fillParamsForGpu() { auto & g=m_detParamsGPU[i]; assert(p.theDet->index()==int(i)); - assert(m_commonParamsGPU.thePitchY==p.thePitchY); assert(m_commonParamsGPU.thePitchX==p.thePitchX); // assert(m_commonParamsGPU.theThickness==p.theThickness); @@ -121,8 +113,7 @@ void PixelCPEFast::fillParamsForGpu() { auto vv = p.theDet->surface().position(); auto rr = pixelCPEforGPU::Rotation(p.theDet->surface().rotation()); - g.frame = pixelCPEforGPU::Frame(vv.x(),vv.y(),vv.z(),rr); - + g.frame = pixelCPEforGPU::Frame(vv.x(),vv.y(),vv.z(),rr); } // and now copy to device... @@ -131,28 +122,22 @@ void PixelCPEFast::fillParamsForGpu() { cudaCheck(cudaMalloc((void**) & d_paramsOnGPU, sizeof(pixelCPEforGPU::ParamsOnGPU))); cudaCheck(cudaMemcpy(d_paramsOnGPU, &h_paramsOnGPU, sizeof(pixelCPEforGPU::ParamsOnGPU), cudaMemcpyDefault)); - cudaCheck(cudaMemcpy(h_paramsOnGPU.m_commonParams,&m_commonParamsGPU,sizeof(pixelCPEforGPU::CommonParams), cudaMemcpyDefault)); + cudaCheck(cudaMemcpy(h_paramsOnGPU.m_commonParams, &m_commonParamsGPU, sizeof(pixelCPEforGPU::CommonParams), cudaMemcpyDefault)); cudaCheck(cudaMemcpy(h_paramsOnGPU.m_detParams, m_detParamsGPU.data(), m_detParamsGPU.size()*sizeof(pixelCPEforGPU::DetParams), cudaMemcpyDefault)); cudaDeviceSynchronize(); } PixelCPEFast::~PixelCPEFast() { - cudaFree(h_paramsOnGPU.m_commonParams); cudaFree(h_paramsOnGPU.m_detParams); cudaFree(d_paramsOnGPU); - } - - PixelCPEBase::ClusterParam* PixelCPEFast::createClusterParam(const SiPixelCluster & cl) const { return new ClusterParamGeneric(cl); } - - //----------------------------------------------------------------------------- //! Hit position in the local frame (in cm). Unlike other CPE's, this //! one converts everything from the measurement frame (in channel numbers) @@ -161,7 +146,6 @@ PixelCPEBase::ClusterParam* PixelCPEFast::createClusterParam(const SiPixelCluste LocalPoint PixelCPEFast::localPosition(DetParam const & theDetParam, ClusterParam & theClusterParamBase) const { - ClusterParamGeneric & theClusterParam = static_cast(theClusterParamBase); assert(!theClusterParam.with_track_angle); @@ -194,7 +178,6 @@ PixelCPEFast::localPosition(DetParam const & theDetParam, ClusterParam & theClus dummy, theClusterParam.sy2, dummy, theClusterParam.sx1, dummy, theClusterParam.sx2, dummy ); - theClusterParam.sigmax = theClusterParam.sigmax * micronsToCm; theClusterParam.sx1 = theClusterParam.sx1 * micronsToCm; theClusterParam.sx2 = theClusterParam.sx2 * micronsToCm; @@ -218,11 +201,8 @@ PixelCPEFast::localPosition(DetParam const & theDetParam, ClusterParam & theClus UseErrorsFromTemplates_ && TruncatePixelCharge_ ); - // do GPU like ... - pixelCPEforGPU::ClusParams cp; - cp.minRow[0] = theClusterParam.theCluster->minPixelRow(); cp.maxRow[0] = theClusterParam.theCluster->maxPixelRow(); @@ -244,8 +224,6 @@ PixelCPEFast::localPosition(DetParam const & theDetParam, ClusterParam & theClus return pos_in_local; } - - //----------------------------------------------------------------------------- //! Collect the edge charges in x and y, in a single pass over the pixel vector. //! Calculate charge in the first and last pixel projected in x and y @@ -267,14 +245,12 @@ collect_edge_charges(ClusterParam & theClusterParamBase, //!< input, the cluste Q_f_X = Q_l_X = 0; Q_f_Y = Q_l_Y = 0; - // Obtain boundaries in index units int xmin = theClusterParam.theCluster->minPixelRow(); int xmax = theClusterParam.theCluster->maxPixelRow(); int ymin = theClusterParam.theCluster->minPixelCol(); int ymax = theClusterParam.theCluster->maxPixelCol(); - // Iterate over the pixels. int isize = theClusterParam.theCluster->size(); for (int i = 0; i != isize; ++i) From 5e77c4ea346e9d0d9e61fdccfd5fcfa94a1806a0 Mon Sep 17 00:00:00 2001 From: Andrea Bocci Date: Thu, 15 Mar 2018 23:12:06 +0100 Subject: [PATCH 29/88] Remove unused buffers --- EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc | 5 ----- EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.h | 2 -- 2 files changed, 7 deletions(-) diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc index a6bd48bef00a1..e9f4d3654f4c9 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc +++ b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc @@ -176,9 +176,6 @@ SiPixelRawToDigiGPU::SiPixelRawToDigiGPU( const edm::ParameterSet& conf ) cudaCheck(cudaMallocHost(&error_h_tmp, vsize)); cudaCheck(cudaMallocHost(&data_h, MAX_FED*MAX_WORD*esize)); - cudaMallocHost(&mIndexStart_h, sizeof(int)*(NMODULE+1)); - cudaMallocHost(&mIndexEnd_h, sizeof(int)*(NMODULE+1)); - // allocate memory for RawToDigi on GPU context_ = initDeviceMemory(); @@ -210,8 +207,6 @@ SiPixelRawToDigiGPU::~SiPixelRawToDigiGPU() { cudaFreeHost(error_h); cudaFreeHost(error_h_tmp); cudaFreeHost(data_h); - cudaFreeHost(mIndexStart_h); - cudaFreeHost(mIndexEnd_h); // release device memory for cabling map deallocateCablingMap(cablingMapGPUHost_, cablingMapGPUDevice_); diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.h b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.h index b51f012f08968..2a4e0d1df3ccd 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.h +++ b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.h @@ -80,8 +80,6 @@ class SiPixelRawToDigiGPU : public edm::stream::EDProducer<> { error_obj *data_h = nullptr; GPU::SimpleVector *error_h = nullptr; GPU::SimpleVector *error_h_tmp = nullptr; - // store the start and end index for each module (total 1856 modules-phase 1) - int *mIndexStart_h, *mIndexEnd_h; // configuration and memory buffers alocated on the GPU context context_; From d73bd14e9ca3fc6d9ce82a33ce597a8103769b30 Mon Sep 17 00:00:00 2001 From: Andrea Bocci Date: Thu, 15 Mar 2018 23:26:51 +0100 Subject: [PATCH 30/88] Silence couts --- .../plugins/SiPixelFedCablingMapGPU.cc | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.cc b/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.cc index a1bed62897925..e96af4789b1ce 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.cc +++ b/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.cc @@ -83,7 +83,9 @@ void processCablingMap(SiPixelFedCablingMap const& cablingMap, TrackerGeometry if (RawId[i] == 9999) { moduleId[i] = 9999; } else { -// std::cout << RawId[i] << std::endl; + /* + std::cout << RawId[i] << std::endl; + */ auto gdet = trackerGeom.idToDetUnit(RawId[i]); if (!gdet) { LogDebug("SiPixelFedCablingMapGPU") << " Not found: " << RawId[i] << std::endl; @@ -123,8 +125,10 @@ processGainCalibration(SiPixelGainCalibrationForHLT const & gains, TrackerGeomet } } + /* std::cout << "caching calibs for " << m_detectors << " pixel detectors of size " << gains.data().size() << std::endl; std::cout << "sizes " << sizeof(char) << ' ' << sizeof(uint8_t) << ' ' << sizeof(SiPixelGainForHLTonGPU::DecodingStructure) << std::endl; + */ SiPixelGainForHLTonGPU * gg; cudaCheck(cudaMallocHost((void**) & gg, sizeof(SiPixelGainForHLTonGPU))); @@ -158,11 +162,15 @@ processGainCalibration(SiPixelGainCalibrationForHLT const & gains, TrackerGeomet gg->pedPrecision = static_cast(maxPed - minPed) / nBinsToUseForEncoding; gg->gainPrecision = static_cast(maxGain - minGain) / nBinsToUseForEncoding; + /* std::cout << "precisions g " << gg->pedPrecision << ' ' << gg->gainPrecision << std::endl; + */ // fill the index map auto const & ind = gains.getIndexes(); + /* std::cout << ind.size() << " " << m_detectors << std::endl; + */ for (auto i=0U; igeographicalId().rawId(),SiPixelGainCalibrationForHLT::StrictWeakOrdering()); From ac9a8c63af73cfcbb030d9012913026d8f951af4 Mon Sep 17 00:00:00 2001 From: Marco Rovere Date: Tue, 27 Mar 2018 07:53:22 +0200 Subject: [PATCH 31/88] Implement Riemann fit for pixel tracks (#34) Matrix operations are based on Eigen. A first GPU version, running Eigen together with CUDA, is available in the test directory but currently disabled. --- .../PixelTrackFitting/BuildFile.xml | 1 + .../PixelFitterByRiemannParaboloid.h | 29 + .../PixelTrackFitting/interface/RiemannFit.h | 972 ++++++++++++++++++ .../PixelFitterByRiemannParaboloidProducer.cc | 53 + .../python/PixelTracks_cff.py | 8 + .../pixelFitterByRiemannParaboloid_cfi.py | 6 + .../src/PixelFitterByRiemannParaboloid.cc | 120 +++ .../src/PixelTrackBuilder.cc | 55 +- .../PixelTrackFitting/test/BuildFile.xml | 15 + .../test/PixelTrackRiemannFit.cc | 324 ++++++ .../PixelTrackFitting/test/testEigenGPU.cu | 209 ++++ .../test/testEigenGPUNoFit.cu | 169 +++ .../PixelTrackFitting/test/test_common.h | 53 + 13 files changed, 1986 insertions(+), 28 deletions(-) create mode 100644 RecoPixelVertexing/PixelTrackFitting/interface/PixelFitterByRiemannParaboloid.h create mode 100644 RecoPixelVertexing/PixelTrackFitting/interface/RiemannFit.h create mode 100644 RecoPixelVertexing/PixelTrackFitting/plugins/PixelFitterByRiemannParaboloidProducer.cc create mode 100644 RecoPixelVertexing/PixelTrackFitting/python/pixelFitterByRiemannParaboloid_cfi.py create mode 100644 RecoPixelVertexing/PixelTrackFitting/src/PixelFitterByRiemannParaboloid.cc create mode 100644 RecoPixelVertexing/PixelTrackFitting/test/PixelTrackRiemannFit.cc create mode 100644 RecoPixelVertexing/PixelTrackFitting/test/testEigenGPU.cu create mode 100644 RecoPixelVertexing/PixelTrackFitting/test/testEigenGPUNoFit.cu create mode 100644 RecoPixelVertexing/PixelTrackFitting/test/test_common.h diff --git a/RecoPixelVertexing/PixelTrackFitting/BuildFile.xml b/RecoPixelVertexing/PixelTrackFitting/BuildFile.xml index b0b2657c46e38..3300d67809f33 100644 --- a/RecoPixelVertexing/PixelTrackFitting/BuildFile.xml +++ b/RecoPixelVertexing/PixelTrackFitting/BuildFile.xml @@ -1,4 +1,5 @@ + diff --git a/RecoPixelVertexing/PixelTrackFitting/interface/PixelFitterByRiemannParaboloid.h b/RecoPixelVertexing/PixelTrackFitting/interface/PixelFitterByRiemannParaboloid.h new file mode 100644 index 0000000000000..90bcb71786c76 --- /dev/null +++ b/RecoPixelVertexing/PixelTrackFitting/interface/PixelFitterByRiemannParaboloid.h @@ -0,0 +1,29 @@ +#ifndef RecoPixelVertexing_PixelTrackFitting_PixelFitterByRiemannParaboloid_H +#define RecoPixelVertexing_PixelTrackFitting_PixelFitterByRiemannParaboloid_H + +#include "RecoPixelVertexing/PixelTrackFitting/interface/PixelFitterBase.h" +#include "DataFormats/TrackingRecHit/interface/TrackingRecHit.h" +#include "RecoTracker/TkTrackingRegions/interface/TrackingRegion.h" +#include "FWCore/Framework/interface/EventSetup.h" +#include "DataFormats/TrackReco/interface/Track.h" +#include "FWCore/ParameterSet/interface/ParameterSet.h" + +#include + + + +class PixelFitterByRiemannParaboloid final : public PixelFitterBase { +public: + explicit PixelFitterByRiemannParaboloid(const edm::EventSetup *es, const MagneticField *field, + bool useErrors, bool useMultipleScattering); + virtual ~PixelFitterByRiemannParaboloid() = default; + virtual std::unique_ptr run(const std::vector& hits, + const TrackingRegion& region) const override; + +private: + const edm::EventSetup *es_; + const MagneticField *field_; + bool useErrors_; + bool useMultipleScattering_; +}; +#endif diff --git a/RecoPixelVertexing/PixelTrackFitting/interface/RiemannFit.h b/RecoPixelVertexing/PixelTrackFitting/interface/RiemannFit.h new file mode 100644 index 0000000000000..d545f78274819 --- /dev/null +++ b/RecoPixelVertexing/PixelTrackFitting/interface/RiemannFit.h @@ -0,0 +1,972 @@ +#ifndef RECOPIXELVERTEXING_PIXELTRACKFITTING_RIEMANNFIT_H +#define RECOPIXELVERTEXING_PIXELTRACKFITTING_RIEMANNFIT_H + +#include +#include +#include + +#ifdef __CUDACC__ +#define CUDA_HOSTDEV __host__ __device__ +#else +#define CUDA_HOSTDEV +#endif + +namespace Rfit { + +using namespace Eigen; + +constexpr double d = 1.e-4; //!< used in numerical derivative (J2 in Circle_fit()) +constexpr unsigned int max_nop = 8; //!< In order to avoid use of dynamic memory + +using MatrixNd = Eigen::Matrix; +using ArrayNd = Eigen::Array; +using Matrix2Nd = Eigen::Matrix; +using Matrix3Nd = Eigen::Matrix; +using Matrix2xNd = Eigen::Matrix; +using Array2xNd = Eigen::Array; +using Matrix3xNd = Eigen::Matrix; +using MatrixNx3d = Eigen::Matrix; +using MatrixNx5d = Eigen::Matrix; +using VectorNd = Eigen::Matrix; +using Vector2Nd = Eigen::Matrix; +using Vector3Nd = Eigen::Matrix; +using RowVectorNd = Eigen::Matrix; +using RowVector2Nd = Eigen::Matrix; +using Matrix5d = Eigen::Matrix; +using Matrix6d = Eigen::Matrix; +using Vector5d = Eigen::Matrix; +using u_int = unsigned int; + +struct circle_fit { + Vector3d par; //!< parameter: (X0,Y0,R) + Matrix3d cov; + /*!< covariance matrix: \n + |cov(X0,X0)|cov(Y0,X0)|cov( R,X0)| \n + |cov(X0,Y0)|cov(Y0,Y0)|cov( R,Y0)| \n + |cov(X0, R)|cov(Y0, R)|cov( R, R)| + */ + int q; //!< particle charge + double chi2; +}; + +struct line_fit { + Vector2d par; //!<(cotan(theta),Zip) + Matrix2d cov; + /*!< + |cov(c_t,c_t)|cov(Zip,c_t)| \n + |cov(c_t,Zip)|cov(Zip,Zip)| + */ + double chi2; +}; + +struct helix_fit { + Vector5d par; //!<(phi,Tip,pt,cotan(theta)),Zip) + Matrix5d cov; + /*!< ()->cov() \n + |(phi,phi)|(Tip,phi)|(p_t,phi)|(c_t,phi)|(Zip,phi)| \n + |(phi,Tip)|(Tip,Tip)|(p_t,Tip)|(c_t,Tip)|(Zip,Tip)| \n + |(phi,p_t)|(Tip,p_t)|(p_t,p_t)|(c_t,p_t)|(Zip,p_t)| \n + |(phi,c_t)|(Tip,c_t)|(p_t,c_t)|(c_t,c_t)|(Zip,c_t)| \n + |(phi,Zip)|(Tip,Zip)|(p_t,Zip)|(c_t,Zip)|(Zip,Zip)| + */ + int q; //!< particle charge + double chi2_circle; + double chi2_line; + Vector4d fast_fit; + VectorXd time; // TO FIX just for profiling +}; + + +template +CUDA_HOSTDEV void printIt(C * m) { + for (u_int r = 0; r < m->rows(); ++r) { + for (u_int c = 0; c < m->cols(); ++c) { + printf("Matrix(%d,%d) = %f\n", r, c, (*m)(r,c)); + } + } +} + + +/*! + \brief raise to square. +*/ +CUDA_HOSTDEV inline double sqr(const double a) { return a * a; } + +/*! + \brief Compute cross product of two 2D vector (assuming z component 0), + returning z component of the result. + + \param a first 2D vector in the product. + \param b second 2D vector in the product. + + \return z component of the cross product. +*/ + +CUDA_HOSTDEV inline double cross2D(const Vector2d& a, const Vector2d& b) { + return a.x() * b.y() - a.y() * b.x(); +} + +/*! + \brief Compute the covariance matrix (in radial coordinates) of points in + the transverse plane due to multiple Coulomb scattering. + + \param p2D 2D points in the transverse plane. + \param fast_fit fast_fit Vector4d result of the previous pre-fit + structured in this form:(X0, Y0, R, Tan(Theta))). + \param B magnetic field use to compute p + + \return scatter_cov_rad errors due to multiple scattering. + + \warning input points must be ordered radially from the detector center + (from inner layer to outer ones; points on the same layer must ordered too). + \bug currently works only for points in the barrel. + + \details Only the tangential component is computed (the radial one is + negligible). + + */ +// X in input TO FIX +CUDA_HOSTDEV MatrixNd Scatter_cov_rad(const Matrix2xNd& p2D, const Vector4d& fast_fit, VectorNd const & rad, double B) { + u_int n = p2D.cols(); + double X = 0.04; + double theta = atan(fast_fit(3)); + double radlen_eff = X * sqrt(fast_fit(3) * fast_fit(3) + 1); + double p_t = fast_fit(2) * B; + double p_2 = p_t * p_t * (1. + 1./(fast_fit(3)*fast_fit(3))); + + MatrixNd scatter_cov_rad = MatrixXd::Zero(n, n); + const double sig2 = .000225 / p_2 * sqr(1 + 0.038 * log(radlen_eff)) * radlen_eff ; + for (u_int k = 0; k < n; ++k) { + for (u_int l = k; l < n; ++l) { + for (u_int i = 0; i < std::min(k, l); ++i) { + scatter_cov_rad(k, l) += (rad(k) - rad(i)) * (rad(l) - rad(i)) * sig2 / sqr(sin(theta)); + scatter_cov_rad(l, k) = scatter_cov_rad(k, l); + } + } + } + return scatter_cov_rad; +} + +/*! + \brief Transform covariance matrix from radial (only tangential component) + to Cartesian coordinates (only transverse plane component). + + \param p2D 2D points in the transverse plane. + \param cov_rad covariance matrix in radial coordinate. + + \return cov_cart covariance matrix in Cartesian coordinates. +*/ + +CUDA_HOSTDEV inline Matrix2Nd cov_radtocart(const Matrix2xNd& p2D, + const MatrixNd& cov_rad, + const VectorNd &rad) { + u_int n = p2D.cols(); + Matrix2Nd cov_cart = MatrixXd::Zero(2 * n, 2 * n); + VectorNd rad_inv = rad.cwiseInverse(); + for (u_int i = 0; i < n; ++i) { + for (u_int j = i; j < n; ++j) { + cov_cart(i, j) = cov_rad(i, j) * p2D(1, i) * rad_inv(i) * p2D(1, j) * rad_inv(j); + cov_cart(i + n, j + n) = cov_rad(i, j) * p2D(0, i) * rad_inv(i) * p2D(0, j) * rad_inv(j); + cov_cart(i, j + n) = -cov_rad(i, j) * p2D(1, i) * rad_inv(i) * p2D(0, j) * rad_inv(j); + cov_cart(i + n, j) = -cov_rad(i, j) * p2D(0, i) * rad_inv(i) * p2D(1, j) * rad_inv(j); + + cov_cart(j, i) = cov_cart(i, j); + cov_cart(j + n, i + n) = cov_cart(i + n, j + n); + cov_cart(j + n, i) = cov_cart(i, j + n); + cov_cart(j, i + n) = cov_cart(i + n, j); + } + } + return cov_cart; +} + +/*! + \brief Transform covariance matrix from Cartesian coordinates (only + transverse plane component) to radial coordinates (both radial and + tangential component but only diagonal terms, correlation between different + point are not managed). + + \param p2D 2D points in transverse plane. + \param cov_cart covariance matrix in Cartesian coordinates. + + \return cov_rad covariance matrix in raidal coordinate. + + \warning correlation between different point are not computed. +*/ +CUDA_HOSTDEV MatrixNd cov_carttorad(const Matrix2xNd& p2D, + const Matrix2Nd& cov_cart, + const VectorNd& rad) { + u_int n = p2D.cols(); + MatrixNd cov_rad = MatrixXd::Zero(n, n); + const VectorNd rad_inv2 = rad.cwiseInverse().array().square(); + for (u_int i = 0; i < n; ++i) { + //!< in case you have (0,0) to avoid dividing by 0 radius + if (rad(i) < 1.e-4) + cov_rad(i, i) = cov_cart(i, i); + else { + cov_rad(i, i) = + rad_inv2(i) * (cov_cart(i, i) * sqr(p2D(1, i)) + cov_cart(i + n, i + n) * sqr(p2D(0, i)) - + 2. * cov_cart(i, i + n) * p2D(0, i) * p2D(1, i)); + } + } + return cov_rad; +} + +/*! + \brief Transform covariance matrix from Cartesian coordinates (only + transverse plane component) to coordinates system orthogonal to the + pre-fitted circle in each point. + Further information in attached documentation. + + \param p2D 2D points in transverse plane. + \param cov_cart covariance matrix in Cartesian coordinates. + \param fast_fit fast_fit Vector4d result of the previous pre-fit + structured in this form:(X0, Y0, R, tan(theta))). + + \return cov_rad covariance matrix in the pre-fitted circle's + orthogonal system. + +*/ + +CUDA_HOSTDEV MatrixNd cov_carttorad_prefit(const Matrix2xNd& p2D, const Matrix2Nd& cov_cart, + const Vector4d& fast_fit, + const VectorNd& rad) { + u_int n = p2D.cols(); + MatrixNd cov_rad = MatrixXd::Zero(n, n); + for (u_int i = 0; i < n; ++i) { + //!< in case you have (0,0) to avoid dividing by 0 radius + if (rad(i) < 1.e-4) + cov_rad(i, i) = cov_cart(i, i); // TO FIX + else { + Vector2d a = p2D.col(i); + Vector2d b = p2D.col(i) - fast_fit.head(2); + const double x2 = a.dot(b); + const double y2 = cross2D(a, b); + const double tan_c = - y2/x2; + const double tan_c2 = sqr(tan_c); + cov_rad(i, i) = + 1. / (1. + tan_c2) * + (cov_cart(i, i) + cov_cart(i + n, i + n) * tan_c2 + 2 * cov_cart(i, i + n) * tan_c); + } + } + return cov_rad; +} + +/*! + \brief Compute the points' weights' vector for the circle fit when multiple + scattering is managed. + Further information in attached documentation. + + \param cov_rad_inv covariance matrix inverse in radial coordinated + (or, beter, pre-fitted circle's orthogonal system). + + \return weight VectorNd points' weights' vector. + + \bug I'm not sure this is the right way to compute the weights for non + diagonal cov matrix. Further investigation needed. +*/ + +CUDA_HOSTDEV inline VectorNd Weight_circle(const MatrixNd& cov_rad_inv) { + return cov_rad_inv.colwise().sum().transpose(); +} + +/*! + \brief Compute the points' weights' vector for the line fit (ODR). + Results from a pre-fit is needed in order to take the orthogonal (to the + line) component of the errors. + + \param x_err2 squared errors in the x axis. + \param y_err2 squared errors in the y axis. + \param tan_theta tangent of theta (angle between y axis and line). + + \return weight points' weights' vector for the line fit (ODR). +*/ + +CUDA_HOSTDEV inline VectorNd Weight_line(const ArrayNd& x_err2, const ArrayNd& y_err2, const double& tan_theta) { + return (1. + sqr(tan_theta)) * 1. / (x_err2 + y_err2 * sqr(tan_theta)); +} + +/*! + \brief Find particle q considering the sign of cross product between + particles velocity (estimated by the first 2 hits) and the vector radius + between the first hit and the center of the fitted circle. + + \param p2D 2D points in transverse plane. + \param par_uvr result of the circle fit in this form: (X0,Y0,R). + + \return q int 1 or -1. +*/ + +CUDA_HOSTDEV inline int Charge(const Matrix2xNd& p2D, const Vector3d& par_uvr) { + return ((p2D(0, 1) - p2D(0, 0)) * (par_uvr.y() - p2D(1, 0)) - + (p2D(1, 1) - p2D(1, 0)) * (par_uvr.x() - p2D(0, 0)) > + 0) + ? -1 + : 1; +} + +/*! + \brief Transform circle parameter from (X0,Y0,R) to (phi,Tip,p_t) and + consequently covariance matrix. + + \param circle_uvr parameter (X0,Y0,R), covariance matrix to + be transformed and particle charge. + \param B magnetic field in Gev/cm/c unit. + \param error flag for errors computation. +*/ + +CUDA_HOSTDEV void par_uvrtopak(circle_fit& circle, const double B, const bool& error) { + Vector3d par_pak; + const double temp0 = circle.par.head(2).squaredNorm(); + const double temp1 = sqrt(temp0); + par_pak << atan2(circle.q * circle.par(0), -circle.q * circle.par(1)), + circle.q * (temp1 - circle.par(2)), circle.par(2) * B; + if (error) { + const double temp2 = sqr(circle.par(0)) * 1. / temp0; + const double temp3 = 1. / temp1 * circle.q; + Matrix3d J4; + J4 << -circle.par(1) * temp2 * 1. / sqr(circle.par(0)), temp2 * 1. / circle.par(0), 0., + circle.par(0) * temp3, circle.par(1) * temp3, -circle.q, 0., 0., B; + circle.cov = J4 * circle.cov * J4.transpose(); + } + circle.par = par_pak; +} + +/*! + \brief Compute the error propagation to obtain the square errors in the + x axis for the line fit. If errors have not been computed in the circle fit + than an'approximation is made. + Further information in attached documentation. + + \param V hits' covariance matrix. + \param circle result of the previous circle fit (only the covariance matrix + is needed) TO FIX + \param J Jacobian of the transformation producing x values. + \param error flag for error computation. + + \return x_err2 squared errors in the x axis. +*/ + +CUDA_HOSTDEV VectorNd X_err2(const Matrix3Nd& V, const circle_fit& circle, const MatrixNx5d& J, + const bool& error, u_int n) { + VectorNd x_err2(n); + for (u_int i = 0; i < n; ++i) { + Matrix5d Cov = MatrixXd::Zero(5, 5); + if (error) Cov.block(0, 0, 3, 3) = circle.cov; + Cov(3, 3) = V(i, i); + Cov(4, 4) = V(i + n, i + n); + Cov(3, 4) = Cov(4, 3) = V(i, i + n); + Eigen::Matrix tmp; + tmp = J.row(i) * Cov * J.row(i).transpose().eval(); + x_err2(i) = tmp(0,0); + } + return x_err2; +} + +/*! + \brief Compute the eigenvector associated to the minimum eigenvalue. + + \param A the Matrix you want to know eigenvector and eigenvalue. + \param chi2 the double were the chi2-related quantity will be stored. + + \return the eigenvector associated to the minimum eigenvalue. + + \warning double precision is needed for a correct assessment of chi2. + + \details The minimus eigenvalue is related to chi2. + We exploit the fact that the matrix is symmetrical and small (2x2 for line + fit and 3x3 for circle fit), so the SelfAdjointEigenSolver from Eigen + library is used, with the computedDirect method (available only for 2x2 + and 3x3 Matrix) wich computes eigendecomposition of given matrix using a + fast closed-form algorithm. + For this optimization the matrix type must be known at compiling time. + +*/ + +CUDA_HOSTDEV Vector3d min_eigen3D(const Matrix3d& A, double& chi2) { + SelfAdjointEigenSolver solver(3); + solver.computeDirect(A); + int min_index; + chi2 = solver.eigenvalues().minCoeff(&min_index); + return solver.eigenvectors().col(min_index); +} + +/*! + \brief A faster version of min_eigen3D() where double precision is not + needed. + + \param A the Matrix you want to know eigenvector and eigenvalue. + \param chi2 the double were the chi2-related quantity will be stored + + \return the eigenvector associated to the minimum eigenvalue. + + \detail The computedDirect() method of SelfAdjointEigenSolver for 3x3 Matrix + indeed, use trigonometry function (it solves a third degree equation) which + speed up in single precision. +*/ + +CUDA_HOSTDEV Vector3d min_eigen3D_fast(const Matrix3d& A) { + SelfAdjointEigenSolver solver(3); + solver.computeDirect(A.cast()); + int min_index; + solver.eigenvalues().minCoeff(&min_index); + return solver.eigenvectors().col(min_index).cast(); +} + +/*! + \brief 2D version of min_eigen3D(). + + \param A the Matrix you want to know eigenvector and eigenvalue. + \param chi2 the double were the chi2-related quantity will be stored + + \return the eigenvector associated to the minimum eigenvalue. + + \detail The computedDirect() method of SelfAdjointEigenSolver for 2x2 Matrix + do not use special math function (just sqrt) therefore it doesn't speed up + significantly in single precision. +*/ + +CUDA_HOSTDEV Vector2d min_eigen2D(const Matrix2d& A, double& chi2) { + SelfAdjointEigenSolver solver(2); + solver.computeDirect(A); + int min_index; + chi2 = solver.eigenvalues().minCoeff(&min_index); + return solver.eigenvectors().col(min_index); +} + +/*! + \brief A very fast helix fit: it fits a circle by three points (first, middle + and last point) and a line by two points (first and last). + + \param hits points to be fitted + + \return result in this form: (X0,Y0,R,tan(theta)). + + \warning points must be passed ordered (from internal layer to external) in + order to maximize accuracy and do not mistake tan(theta) sign. + + \details This fast fit is used as pre-fit which is needed for: + - weights estimation and chi2 computation in line fit (fundamental); + - weights estimation and chi2 computation in circle fit (useful); + - computation of error due to multiple scattering. +*/ + +CUDA_HOSTDEV Vector4d Fast_fit(const Matrix3xNd& hits) { + Vector4d result; + u_int n = hits.cols(); // get the number of hits + + // CIRCLE FIT + // Make segments between middle-to-first(b) and last-to-first(c) hits + const Vector2d b = hits.block(0, n / 2, 2, 1) - hits.block(0, 0, 2, 1); + const Vector2d c = hits.block(0, n - 1, 2, 1) - hits.block(0, 0, 2, 1); + // Compute their lengths + const double b2 = b.squaredNorm(); + const double c2 = c.squaredNorm(); + double X0; + double Y0; + // The algebra has been verified (MR). The usual approach has been followed: + // * use an orthogonal reference frame passing from the first point. + // * build the segments (chords) + // * build orthogonal lines through mid points + // * make a system and solve for X0 and Y0. + // * add the initial point + if (abs(b.x()) > abs(b.y())) { //!< in case b.x is 0 (2 hits with same x) + const double k = c.x() / b.x(); + const double div = 2. * (k * b.y() - c.y()); + // if aligned TO FIX + Y0 = (k * b2 - c2) / div; + X0 = b2 / (2 * b.x()) - b.y() / b.x() * Y0; + } else { + const double k = c.y() / b.y(); + const double div = 2. * (k * b.x() - c.x()); + // if aligned TO FIX + X0 = (k * b2 - c2) / div; + Y0 = b2 / (2 * b.y()) - b.x() / b.y() * X0; + } + + result(0) = X0 + hits(0, 0); + result(1) = Y0 + hits(1, 0); + result(2) = sqrt(sqr(X0) + sqr(Y0)); + + // LINE FIT + const Vector2d d = hits.block(0, 0, 2, 1) - result.head(2); + const Vector2d e = hits.block(0, n - 1, 2, 1) - result.head(2); + // Compute the arc-length between first and last point: L = R * theta = R * atan (tan (Theta) ) + const double dr = result(2) * atan2(cross2D(d, e), d.dot(e)); + // Simple difference in Z between last and first hit + const double dz = hits(2, n - 1) - hits(2, 0); + + result(3) = (dr / dz); + + return result; +} + +/*! + \brief Fit a generic number of 2D points with a circle using Riemann-Chernov + algorithm. Covariance matrix of fitted parameter is optionally computed. + Multiple scattering (currently only in barrel layer) is optionally handled. + + \param hits2D 2D points to be fitted. + \param hits_cov2D covariance matrix of 2D points. + \param fast_fit pre-fit result in this form: (X0,Y0,R,tan(theta)). + (tan(theta) is not used). + \param B magnetic field + \param error flag for error computation. + \param scattering flag for multiple scattering + + \return circle circle_fit: + -par parameter of the fitted circle in this form (X0,Y0,R); \n + -cov covariance matrix of the fitted parameter (not initialized if + error = false); \n + -q charge of the particle; \n + -chi2. + + \warning hits must be passed ordered from inner to outer layer (double hits + on the same layer must be ordered too) so that multiple scattering is + treated properly. + \warning Multiple scattering for barrel is still not tested. + \warning Multiple scattering for endcap hits is not handled (yet). Do not + fit endcap hits with scattering = true ! + + \bug for small pt (<0.3 Gev/c) chi2 could be slightly underestimated. + \bug further investigation needed for error propagation with multiple + scattering. +*/ + +CUDA_HOSTDEV circle_fit Circle_fit(const Matrix2xNd& hits2D, const Matrix2Nd& hits_cov2D, + const Vector4d& fast_fit, VectorNd const & rad, + const double B, + const bool& error = true, + const bool& scattering = false) { + // INITIALIZATION + Matrix2Nd V = hits_cov2D; + u_int n = hits2D.cols(); + + // WEIGHT COMPUTATION + VectorNd weight; + MatrixNd G; + double renorm; + { + MatrixNd cov_rad; + cov_rad = cov_carttorad_prefit(hits2D, V, fast_fit, rad); + // cov_rad = cov_carttorad(hits2D, V); + + if (scattering) { + MatrixNd scatter_cov_rad = Scatter_cov_rad(hits2D, fast_fit, rad, B); + V += cov_radtocart(hits2D, scatter_cov_rad, rad); + cov_rad += scatter_cov_rad; + G = cov_rad.inverse(); + renorm = G.sum(); + G *= 1. / renorm; + weight = Weight_circle(G); + } else { + weight = cov_rad.diagonal().cwiseInverse(); + renorm = weight.sum(); + weight *= 1. / renorm; + } + } + + // SPACE TRANSFORMATION + + // center + const Vector2d h_ = hits2D.rowwise().mean(); // centroid + Matrix3xNd p3D(3, n); + p3D.block(0, 0, 2, n) = hits2D.colwise() - h_; + Vector2Nd mc(2 * n); // centered hits, used in error computation + mc << p3D.row(0).transpose(), p3D.row(1).transpose(); + + // scale + const double q = mc.squaredNorm(); + const double s = sqrt(n * 1. / q); // scaling factor + p3D *= s; + + // project on paraboloid + p3D.row(2) = p3D.block(0, 0, 2, n).colwise().squaredNorm(); + + // COST FUNCTION + + // compute + Matrix3d A = Matrix3d::Zero(); + const Vector3d r0 = p3D * weight; // center of gravity + const Matrix3xNd X = p3D.colwise() - r0; + if (scattering) + A = X * G * X.transpose(); + else { + for (u_int i = 0; i < n; ++i) A += weight(i) * (X.col(i) * X.col(i).transpose()); + } + + // minimize + double chi2; + Vector3d v = min_eigen3D(A, chi2); + v *= (v(2) > 0) ? 1 : -1; // TO FIX dovrebbe essere N(3)>0 + // This hack to be able to run on GPU where the automatic assignment to a + // double from the vector multiplication is not working. + Matrix cm; + cm.noalias() = -v.transpose() * r0; + const double c = cm(0,0); + + // COMPUTE CIRCLE PARAMETER + + // auxiliary quantities + const double h = sqrt(1. - sqr(v(2)) - 4. * c * v(2)); + const double v2x2_inv = 1. / (2. * v(2)); + const double s_inv = 1. / s; + Vector3d par_uvr_; // used in error propagation + par_uvr_ << -v(0) * v2x2_inv, -v(1) * v2x2_inv, h * v2x2_inv; + + circle_fit circle; + circle.par << par_uvr_(0) * s_inv + h_(0), par_uvr_(1) * s_inv + h_(1), par_uvr_(2) * s_inv; + circle.q = Charge(hits2D, circle.par); + circle.chi2 = abs(chi2) * renorm * 1. / sqr(2 * v(2) * par_uvr_(2) * s); + + // ERROR PROPAGATION + if (error) { + ArrayNd Vcs_[2][2]; // cov matrix of center & scaled points + { + const Matrix2Nd Vcs = sqr(s) * V + sqr(sqr(s)) * 1. / (4. * q * n) * + (2. * V.squaredNorm() + 4. * mc.transpose() * V * mc) * + mc * mc.transpose(); + Vcs_[0][0] = Vcs.block(0, 0, n, n); + Vcs_[0][1] = Vcs.block(0, n, n, n); + Vcs_[1][1] = Vcs.block(n, n, n, n); + Vcs_[1][0] = Vcs_[0][1].transpose(); + } + + MatrixNd C[3][3]; // cov matrix of 3D transformed points + { + const ArrayNd t0 = (VectorXd::Constant(n, 1.) * p3D.row(0)); + const ArrayNd t1 = (VectorXd::Constant(n, 1.) * p3D.row(1)); + const ArrayNd t00 = p3D.row(0).transpose() * p3D.row(0); + const ArrayNd t01 = p3D.row(0).transpose() * p3D.row(1); + const ArrayNd t11 = p3D.row(1).transpose() * p3D.row(1); + const ArrayNd t10 = t01.transpose(); + C[0][0] = Vcs_[0][0]; + C[0][1] = Vcs_[0][1]; + C[0][2] = 2. * (Vcs_[0][0] * t0 + Vcs_[0][1] * t1); + C[1][1] = Vcs_[1][1]; + C[1][2] = 2. * (Vcs_[1][0] * t0 + Vcs_[1][1] * t1); + C[2][2] = 2. * (Vcs_[0][0] * Vcs_[0][0] + Vcs_[0][0] * Vcs_[0][1] + Vcs_[1][1] * Vcs_[1][0] + + Vcs_[1][1] * Vcs_[1][1]) + + 4. * (Vcs_[0][0] * t00 + Vcs_[0][1] * t01 + Vcs_[1][0] * t10 + Vcs_[1][1] * t11); + } + + Matrix3d C0; // cov matrix of center of gravity (r0.x,r0.y,r0.z) + for (u_int i = 0; i < 3; ++i) { + for (u_int j = i; j < 3; ++j) { + C0(i, j) = weight.transpose() * C[i][j] * weight; + C0(j, i) = C0(i, j); + } + } + + const MatrixNd W = weight * weight.transpose(); + const MatrixNd H = MatrixXd::Identity(n, n).rowwise() - weight.transpose(); + const MatrixNx3d s_v = H * p3D.transpose(); + + MatrixNd D_[3][3]; // cov(s_v) + { + D_[0][0] = (H * C[0][0] * H.transpose()).cwiseProduct(W); + D_[0][1] = (H * C[0][1] * H.transpose()).cwiseProduct(W); + D_[0][2] = (H * C[0][2] * H.transpose()).cwiseProduct(W); + D_[1][1] = (H * C[1][1] * H.transpose()).cwiseProduct(W); + D_[1][2] = (H * C[1][2] * H.transpose()).cwiseProduct(W); + D_[2][2] = (H * C[2][2] * H.transpose()).cwiseProduct(W); + D_[1][0] = D_[0][1].transpose(); + D_[2][0] = D_[0][2].transpose(); + D_[2][1] = D_[1][2].transpose(); + } + + constexpr u_int nu[6][2] = {{0, 0}, {0, 1}, {0, 2}, {1, 1}, {1, 2}, {2, 2}}; + + Matrix6d E; // cov matrix of the 6 independent elements of A + for (u_int a = 0; a < 6; ++a) { + const u_int i = nu[a][0], j = nu[a][1]; + for (u_int b = a; b < 6; ++b) { + const u_int k = nu[b][0], l = nu[b][1]; + VectorNd t0(n); + VectorNd t1(n); + if (l == k) { + t0 = 2. * D_[j][l] * s_v.col(l); + if (i == j) + t1 = t0; + else + t1 = 2. * D_[i][l] * s_v.col(l); + } else { + t0 = D_[j][l] * s_v.col(k) + D_[j][k] * s_v.col(l); + if (i == j) + t1 = t0; + else + t1 = D_[i][l] * s_v.col(k) + D_[i][k] * s_v.col(l); + } + + if (i == j) + E(a, b) = 0. + s_v.col(i).transpose() * (t0 + t1); + else + E(a, b) = 0. + (s_v.col(i).transpose() * t0) + (s_v.col(j).transpose() * t1); + if (b != a) E(b, a) = E(a, b); + } + } + + Matrix J2; // Jacobian of min_eigen() (numerically computed) + for (u_int a = 0; a < 6; ++a) { + const u_int i = nu[a][0], j = nu[a][1]; + Matrix3d Delta = Matrix3d::Zero(); + Delta(i, j) = Delta(j, i) = abs(A(i, j) * d); + J2.col(a) = min_eigen3D_fast(A + Delta); + const int sign = (J2.col(a)(2) > 0) ? 1 : -1; + J2.col(a) = (J2.col(a) * sign - v) / Delta(i, j); + } + + Matrix4d Cvc; // joint cov matrix of (v0,v1,v2,c) + { + Matrix3d t0 = J2 * E * J2.transpose(); + Vector3d t1 = -t0 * r0; + Cvc.block(0, 0, 3, 3) = t0; + Cvc.block(0, 3, 3, 1) = t1; + Cvc.block(3, 0, 1, 3) = t1.transpose(); + Cvc(3, 3) = + (v.transpose() * C0 * v) + (C0.cwiseProduct(t0)).sum() + (r0.transpose() * t0 * r0); + } + + Matrix J3; // Jacobian (v0,v1,v2,c)->(X0,Y0,R) + { + const double t = 1. / h; + J3 << -v2x2_inv, 0, v(0) * sqr(v2x2_inv) * 2., 0, 0, -v2x2_inv, v(1) * sqr(v2x2_inv) * 2., 0, + 0, 0, -h * sqr(v2x2_inv) * 2. - (2. * c + v(2)) * v2x2_inv * t, -t; + } + + const RowVector2Nd Jq = mc.transpose() * s * 1. / n; // var(q) + + Matrix3d cov_uvr = J3 * Cvc * J3.transpose() * sqr(s_inv) // cov(X0,Y0,R) + + (par_uvr_ * par_uvr_.transpose()) * (Jq * V * Jq.transpose()); + + circle.cov = cov_uvr; + } + + + return circle; +} + +/*! + \brief Fit of helix parameter cotan(theta)) and Zip by projection on the + pre-fitted cylinder and line fit on its surface. + + \param hits hits coordinates. + \param hits_cov covariance matrix of the hits. + \param circle cylinder parameter, their covariance (if computed, otherwise + uninitialized) and particle charge. + \param fast_fit result of the previous fast fit in this form: + (X0,Y0,R,cotan(theta))). + \param error flag for error computation. + + \return line line_fit: + -par parameter of the line in this form: (cotan(theta)), Zip); \n + -cov covariance matrix of the fitted parameter; \n + -chi2. + + \warning correlation between R and z are neglected, this could be relevant + if geometry detector provides sloped modules in the R/z plane. + + \bug chi2 and errors could be slightly underestimated for small eta (<0.2) + when pt is small (<0.3 Gev/c). + + \todo multiple scattering treatment. + + \details Line fit is made by orthogonal distance regression where + correlation between coordinates in the transverse plane (x,y) and z are + neglected (for a barrel + endcap geometry this is a very good + approximation). + Covariance matrix of the fitted parameter is optionally computed. + Multiple scattering is not handled (yet). + A fast pre-fit is performed in order to evaluate weights and to compute + errors. +*/ + +CUDA_HOSTDEV line_fit Line_fit(const Matrix3xNd& hits, const Matrix3Nd& hits_cov, const circle_fit& circle, + const Vector4d& fast_fit, const bool& error = true) { + u_int n = hits.cols(); + // PROJECTION ON THE CILINDER + Matrix2xNd p2D(2, n); + MatrixNx5d Jx(n, 5); + + // x & associated Jacobian + // cfr https://indico.cern.ch/event/663159/contributions/2707659/attachments/1517175/2368189/Riemann_fit.pdf + // Slide 11 + // a ==> -o i.e. the origin of the circle in XY plane, negative + // b ==> p i.e. distances of the points wrt the origin of the circle. + const Vector2d o(circle.par(0), circle.par(1)); + for (u_int i = 0; i < n; ++i) { // x + Vector2d p = hits.block(0, i, 2, 1) - o; + const double cross = cross2D(-o, p); + const double dot = (-o).dot(p); + // atan2(cross, dot) give back the angle in the transverse plane so tha the final equation reads: + // x_i = -q*R*theta (theta = angle returned by atan2) + const double atan2_ = -circle.q * atan2(cross, dot); + p2D(0, i) = atan2_ * circle.par(2); + + // associated Jacobian, used in weights and errors computation + const double temp0 = -circle.q * circle.par(2) * 1. / (sqr(dot) + sqr(cross)); + double d_X0 = 0, d_Y0 = 0, d_R = 0.; // good approximation for big pt and eta + if (error) { + d_X0 = - temp0 * ((p(1) + o(1)) * dot - (p(0) - o(0)) * cross); + d_Y0 = temp0 * ((p(0) + o(0)) * dot - (o(1) - p(1)) * cross); + d_R = atan2_; + } + const double d_x = temp0 * (o(1) * dot + o(0) * cross); + const double d_y = temp0 * (-o(0) * dot + o(1) * cross); + Jx.row(i) << d_X0, d_Y0, d_R, d_x, d_y; + } + // Math of d_{X0,Y0,R,x,y} all verified by hand + + // y + p2D.row(1) = hits.row(2); + + + // WEIGHT COMPUTATION + VectorNd x_err2 = X_err2(hits_cov, circle, Jx, error, n); + VectorNd y_err2 = hits_cov.block(2 * n, 2 * n, n, n).diagonal(); + + const VectorNd err2_inv = Weight_line(x_err2, y_err2, fast_fit(3)); + const VectorNd weight = err2_inv * 1. / err2_inv.sum(); + // COST FUNCTION + + // compute + // r0 represents the weighted mean of "x" and "y". + const Vector2d r0 = p2D * weight; + // This is the X vector that will be used to build the + // scatter matrix S = X^T * X + const Matrix2xNd X = p2D.colwise() - r0; + Matrix2d A = Matrix2d::Zero(); + for (u_int i = 0; i < n; ++i) { + A += err2_inv(i) * (X.col(i) * X.col(i).transpose()); + } + // minimize + double chi2; + Vector2d v = min_eigen2D(A, chi2); + // n *= (chi2>0) ? 1 : -1; //TO FIX + // This hack to be able to run on GPU where the automatic assignment to a + // double from the vector multiplication is not working. + Matrix cm; + cm.noalias() = -v.transpose() * r0; + const double c = cm(0,0); + + // COMPUTE LINE PARAMETER + line_fit line; + line.par << -v(0) / v(1), // cotan(theta)) + -c * sqrt(sqr(v(0)) + sqr(v(1))) * 1. / v(1); // Zip + line.chi2 = abs(chi2); + + // ERROR PROPAGATION + if (error) { + const double v0_2 = sqr(v(0)); + const double v1_2 = sqr(v(1)); + + Matrix3d C; // cov(v,c) + { + double norm_chernov = 0.; + for (u_int i = 0; i < n; ++i) + norm_chernov += err2_inv(i) * (v(0) * p2D(0, i) + v(1) * p2D(1, i) + c) + * (v(0) * p2D(0, i) + v(1) * p2D(1, i) + c); + norm_chernov /= float(n); + // Indeed it should read: + // * compute the average error in the orthogonal direction: err2_inv.cwiseInverse().sum()/sqr(n) + // * normalize the A(0,0)+A(1,1) dividing by err2_inv.sum(), since those have been weighted + const double norm = (err2_inv.cwiseInverse().sum())*err2_inv.sum()*1./sqr(n); + const double sig2 = 1./(A(0,0) + A(1,1))*norm; +// const double sig2 = 1. / (A(0, 0) + A(1, 1)); + C(0, 0) = sig2 * v1_2; + C(1, 1) = sig2 * v0_2; + C(0, 1) = C(1, 0) = -sig2 * v(0) * v(1); + const VectorNd weight_2 = (weight).array().square(); + const Vector2d C0(weight_2.dot(x_err2), weight_2.dot(y_err2)); + C.block(0, 2, 2, 1) = C.block(2, 0, 1, 2).transpose() = -C.block(0, 0, 2, 2) * r0; + Matrix tmp = (r0.transpose() * C.block(0, 0, 2, 2) * r0); + C(2, 2) = v0_2 * C0(0) + v1_2 * C0(1) + C0(0) * C(0, 0) + C0(1) * C(1, 1) + tmp(0,0); + } + + Matrix J; // Jacobian of (v,c) -> (cotan(theta)),Zip) + { + const double t0 = 1. / v(1); + const double t1 = sqr(t0); + const double sqrt_ = sqrt(v1_2 + v0_2); + const double t2 = 1. / sqrt_; + J << -t0, v(0) * t1, 0, -c * v(0) * t0 * t2, v0_2 * c * t1 * t2, -sqrt_ * t0; + } + Matrix JT = J.transpose().eval(); + line.cov.noalias() = J * C * JT; + } + + return line; +} + +/*! + \brief Helix fit by three step: + -fast pre-fit (see Fast_fit() for further info); \n + -circle fit of hits projected in the transverse plane by Riemann-Chernov + algorithm (see Circle_fit() for further info); \n + -line fit of hits projected on cylinder surface by orthogonal distance + regression (see Line_fit for further info). \n + Points must be passed ordered (from inner to outer layer). + + \param hits Matrix3xNd hits coordinates in this form: \n + |x0|x1|x2|...|xn| \n + |y0|y1|y2|...|yn| \n + |z0|z1|z2|...|zn| + + \param hits_cov Matrix3Nd covariance matrix in this form (()->cov()): \n + + |(x0,x0)|(x1,x0)|(x2,x0)|.|(y0,x0)|(y1,x0)|(y2,x0)|.|(z0,x0)|(z1,x0)|(z2,x0)| \n + |(x0,x1)|(x1,x1)|(x2,x1)|.|(y0,x1)|(y1,x1)|(y2,x1)|.|(z0,x1)|(z1,x1)|(z2,x1)| \n + |(x0,x2)|(x1,x2)|(x2,x2)|.|(y0,x2)|(y1,x2)|(y2,x2)|.|(z0,x2)|(z1,x2)|(z2,x2)| \n + . . . . . . . . . . . \n + |(x0,y0)|(x1,y0)|(x2,y0)|.|(y0,y0)|(y1,y0)|(y2,x0)|.|(z0,y0)|(z1,y0)|(z2,y0)| \n + |(x0,y1)|(x1,y1)|(x2,y1)|.|(y0,y1)|(y1,y1)|(y2,x1)|.|(z0,y1)|(z1,y1)|(z2,y1)| \n + |(x0,y2)|(x1,y2)|(x2,y2)|.|(y0,y2)|(y1,y2)|(y2,x2)|.|(z0,y2)|(z1,y2)|(z2,y2)| \n + . . . . . . . . . . . \n + |(x0,z0)|(x1,z0)|(x2,z0)|.|(y0,z0)|(y1,z0)|(y2,z0)|.|(z0,z0)|(z1,z0)|(z2,z0)| \n + |(x0,z1)|(x1,z1)|(x2,z1)|.|(y0,z1)|(y1,z1)|(y2,z1)|.|(z0,z1)|(z1,z1)|(z2,z1)| \n + |(x0,z2)|(x1,z2)|(x2,z2)|.|(y0,z2)|(y1,z2)|(y2,z2)|.|(z0,z2)|(z1,z2)|(z2,z2)| + + \param B magnetic field in the center of the detector in Gev/cm/c + unit, in order to perform pt calculation. + \param error flag for error computation. + \param scattering flag for multiple scattering treatment. + (see Circle_fit() documentation for further info). + + \warning see Circle_fit(), Line_fit() and Fast_fit() warnings. + + \bug see Circle_fit(), Line_fit() and Fast_fit() bugs. +*/ + +helix_fit Helix_fit(const Matrix3xNd& hits, const Matrix3Nd& hits_cov, const double B, + const bool& error = true, const bool& scattering = false) { + u_int n = hits.cols(); + VectorNd rad = (hits.block(0, 0, 2, n).colwise().norm()); + + // Fast_fit gives back (X0, Y0, R, theta) w/o errors, using only 3 points. + const Vector4d fast_fit = Fast_fit(hits); + + circle_fit circle = Circle_fit(hits.block(0, 0, 2, n), hits_cov.block(0, 0, 2 * n, 2 * n), + fast_fit, rad, B, error, scattering); + + const line_fit line = Line_fit(hits, hits_cov, circle, fast_fit, error); + + par_uvrtopak(circle, B, error); + + helix_fit helix; + helix.par << circle.par, line.par; + if (error) { + helix.cov = MatrixXd::Zero(5, 5); + helix.cov.block(0, 0, 3, 3) = circle.cov; + helix.cov.block(3, 3, 2, 2) = line.cov; + } + helix.q = circle.q; + helix.chi2_circle = circle.chi2; + helix.chi2_line = line.chi2; + + return helix; +} + +} // namespace Rfit + + +#endif + diff --git a/RecoPixelVertexing/PixelTrackFitting/plugins/PixelFitterByRiemannParaboloidProducer.cc b/RecoPixelVertexing/PixelTrackFitting/plugins/PixelFitterByRiemannParaboloidProducer.cc new file mode 100644 index 0000000000000..bbd8c0fe46f95 --- /dev/null +++ b/RecoPixelVertexing/PixelTrackFitting/plugins/PixelFitterByRiemannParaboloidProducer.cc @@ -0,0 +1,53 @@ +#include "FWCore/Framework/interface/Frameworkfwd.h" +#include "FWCore/Framework/interface/global/EDProducer.h" + +#include "FWCore/Framework/interface/Event.h" +#include "FWCore/Framework/interface/MakerMacros.h" +#include "FWCore/Framework/interface/EventSetup.h" +#include "FWCore/Framework/interface/ESHandle.h" + +#include "FWCore/ParameterSet/interface/ParameterSet.h" +#include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h" +#include "FWCore/ParameterSet/interface/ParameterSetDescription.h" + +#include "RecoPixelVertexing/PixelTrackFitting/interface/PixelFitter.h" +#include "RecoPixelVertexing/PixelTrackFitting/interface/PixelFitterByRiemannParaboloid.h" + +#include "MagneticField/Engine/interface/MagneticField.h" +#include "MagneticField/Records/interface/IdealMagneticFieldRecord.h" + +class PixelFitterByRiemannParaboloidProducer: public edm::global::EDProducer<> { +public: + explicit PixelFitterByRiemannParaboloidProducer(const edm::ParameterSet& iConfig) + : useErrors_(iConfig.getParameter("useErrors")), + useMultipleScattering_(iConfig.getParameter("useMultipleScattering")) + { + produces(); + } + ~PixelFitterByRiemannParaboloidProducer() {} + + static void fillDescriptions(edm::ConfigurationDescriptions& descriptions) { + edm::ParameterSetDescription desc; + desc.add("useErrors", true); + desc.add("useMultipleScattering", true); + descriptions.add("pixelFitterByRiemannParaboloidDefault", desc); + } + +private: + bool useErrors_; + bool useMultipleScattering_; + virtual void produce(edm::StreamID, edm::Event& iEvent, const edm::EventSetup& iSetup) const override; +}; + + +void PixelFitterByRiemannParaboloidProducer::produce(edm::StreamID, edm::Event& iEvent, const edm::EventSetup& iSetup) const { + edm::ESHandle fieldESH; + iSetup.get().get(fieldESH); + + auto impl = std::make_unique(&iSetup, + fieldESH.product(), useErrors_, useMultipleScattering_); + auto prod = std::make_unique(std::move(impl)); + iEvent.put(std::move(prod)); +} + +DEFINE_FWK_MODULE(PixelFitterByRiemannParaboloidProducer); diff --git a/RecoPixelVertexing/PixelTrackFitting/python/PixelTracks_cff.py b/RecoPixelVertexing/PixelTrackFitting/python/PixelTracks_cff.py index 906daf3a92391..44bfb888df98c 100644 --- a/RecoPixelVertexing/PixelTrackFitting/python/PixelTracks_cff.py +++ b/RecoPixelVertexing/PixelTrackFitting/python/PixelTracks_cff.py @@ -12,6 +12,7 @@ from RecoTracker.TkSeedingLayers.PixelLayerTriplets_cfi import * from RecoTracker.TkSeedingLayers.TTRHBuilderWithoutAngle4PixelTriplets_cfi import * from RecoPixelVertexing.PixelTrackFitting.pixelFitterByHelixProjections_cfi import pixelFitterByHelixProjections +from RecoPixelVertexing.PixelTrackFitting.pixelFitterByRiemannParaboloid_cfi import pixelFitterByRiemannParaboloid from RecoPixelVertexing.PixelTrackFitting.pixelTrackFilterByKinematics_cfi import pixelTrackFilterByKinematics from RecoPixelVertexing.PixelTrackFitting.pixelTrackCleanerBySharedHits_cfi import pixelTrackCleanerBySharedHits from RecoPixelVertexing.PixelTrackFitting.pixelTracks_cfi import pixelTracks as _pixelTracks @@ -76,3 +77,10 @@ _pixelTracksSequence_lowPU = pixelTracksSequence.copy() _pixelTracksSequence_lowPU.replace(pixelTracksHitQuadruplets, pixelTracksHitTriplets) trackingLowPU.toReplaceWith(pixelTracksSequence, _pixelTracksSequence_lowPU) + +# Use Riemann fit and substitute previous Fitter producer with the Riemann one +from Configuration.ProcessModifiers.riemannFit_cff import riemannFit +riemannFit.toModify(pixelTracks, Fitter = "pixelFitterByRiemannParaboloid") +_pixelTracksSequence_riemannFit = pixelTracksSequence.copy() +_pixelTracksSequence_riemannFit.replace(pixelFitterByHelixProjections, pixelFitterByRiemannParaboloid) +riemannFit.toReplaceWith(pixelTracksSequence, _pixelTracksSequence_riemannFit) diff --git a/RecoPixelVertexing/PixelTrackFitting/python/pixelFitterByRiemannParaboloid_cfi.py b/RecoPixelVertexing/PixelTrackFitting/python/pixelFitterByRiemannParaboloid_cfi.py new file mode 100644 index 0000000000000..0e0ab13b01bd6 --- /dev/null +++ b/RecoPixelVertexing/PixelTrackFitting/python/pixelFitterByRiemannParaboloid_cfi.py @@ -0,0 +1,6 @@ +import FWCore.ParameterSet.Config as cms + +from RecoPixelVertexing.PixelTrackFitting.pixelFitterByRiemannParaboloidDefault_cfi import pixelFitterByRiemannParaboloidDefault + +pixelFitterByRiemannParaboloid = pixelFitterByRiemannParaboloidDefault.clone() + diff --git a/RecoPixelVertexing/PixelTrackFitting/src/PixelFitterByRiemannParaboloid.cc b/RecoPixelVertexing/PixelTrackFitting/src/PixelFitterByRiemannParaboloid.cc new file mode 100644 index 0000000000000..a87da4e3bfc8e --- /dev/null +++ b/RecoPixelVertexing/PixelTrackFitting/src/PixelFitterByRiemannParaboloid.cc @@ -0,0 +1,120 @@ +#include "RecoPixelVertexing/PixelTrackFitting/interface/PixelFitterByRiemannParaboloid.h" +#include "RecoPixelVertexing/PixelTrackFitting/interface/RiemannFit.h" + +#include "FWCore/ParameterSet/interface/ParameterSet.h" + +#include "FWCore/Framework/interface/EventSetup.h" + +#include "DataFormats/GeometryCommonDetAlgo/interface/GlobalError.h" +#include "DataFormats/GeometryVector/interface/GlobalPoint.h" +#include "DataFormats/GeometryVector/interface/LocalPoint.h" + +#include "DataFormats/TrackingRecHit/interface/TrackingRecHit.h" +#include "Geometry/CommonDetUnit/interface/GeomDet.h" +#include "RecoTracker/TkMSParametrization/interface/PixelRecoUtilities.h" + +#include "DataFormats/GeometryCommonDetAlgo/interface/Measurement1D.h" + +#include "Geometry/CommonDetUnit/interface/GeomDetType.h" + +#include "MagneticField/Engine/interface/MagneticField.h" + +#include "FWCore/MessageLogger/interface/MessageLogger.h" + +#include "DataFormats/GeometryVector/interface/Pi.h" +#include "RecoPixelVertexing/PixelTrackFitting/interface/PixelTrackBuilder.h" +#include "RecoPixelVertexing/PixelTrackFitting/interface/PixelTrackErrorParam.h" + +#include "CommonTools/Utils/interface/DynArray.h" + +using namespace std; + + +PixelFitterByRiemannParaboloid::PixelFitterByRiemannParaboloid(const edm::EventSetup* es, + const MagneticField* field, + bool useErrors, + bool useMultipleScattering) + : es_(es), field_(field), + useErrors_(useErrors), useMultipleScattering_(useMultipleScattering) {} + +std::unique_ptr PixelFitterByRiemannParaboloid::run( + const std::vector& hits, const TrackingRegion& region) const { + + using namespace Rfit; + + std::unique_ptr ret; + + unsigned int nhits = hits.size(); + + if (nhits < 2) return ret; + + declareDynArray(GlobalPoint, nhits, points); + declareDynArray(GlobalError, nhits, errors); + declareDynArray(bool, nhits, isBarrel); + + for (unsigned int i = 0; i != nhits; ++i) { + auto const& recHit = hits[i]; + points[i] = GlobalPoint(recHit->globalPosition().basicVector() - region.origin().basicVector()); + errors[i] = recHit->globalPositionError(); + isBarrel[i] = recHit->detUnit()->type().isBarrel(); + } + + Matrix riemannHits(3, nhits); + + Matrix riemannHits_cov = + MatrixXd::Zero(3 * nhits, 3 * nhits); + + for (unsigned int i = 0; i < nhits; ++i) { + riemannHits.col(i) << points[i].x(), points[i].y(), points[i].z(); + + const auto& errorMatrix = errors[i].matrix4D(); + + for (auto j = 0; j < 3; ++j) { + for (auto l = 0; l < 3; ++l) { + riemannHits_cov(i + j * nhits, i + l * nhits) = errorMatrix(j, l); + } + } + } + + float bField = 1 / PixelRecoUtilities::fieldInInvGev(*es_); + helix_fit fittedTrack = Rfit::Helix_fit(riemannHits, riemannHits_cov, bField, useErrors_, useMultipleScattering_); + int iCharge = fittedTrack.q; + + // parameters are: + // 0: phi + // 1: tip + // 2: curvature + // 3: cottheta + // 4: zip + float valPhi = fittedTrack.par(0); + + float valTip = fittedTrack.par(1); + + float valCotTheta = fittedTrack.par(3); + + float valZip = fittedTrack.par(4); + float valPt = fittedTrack.par(2); + // + // PixelTrackErrorParam param(valEta, valPt); + float errValPhi = std::sqrt(fittedTrack.cov(0, 0)); + float errValTip = std::sqrt(fittedTrack.cov(1, 1)); + + float errValPt = std::sqrt(fittedTrack.cov(2, 2)); + + float errValCotTheta = std::sqrt(fittedTrack.cov(3, 3)); + float errValZip = std::sqrt(fittedTrack.cov(4, 4)); + + float chi2 = fittedTrack.chi2_line; + + PixelTrackBuilder builder; + Measurement1D phi(valPhi, errValPhi); + Measurement1D tip(valTip, errValTip); + + Measurement1D pt(valPt, errValPt); + Measurement1D cotTheta(valCotTheta, errValCotTheta); + Measurement1D zip(valZip, errValZip); + + ret.reset( + builder.build(pt, phi, cotTheta, tip, zip, chi2, iCharge, hits, field_, region.origin())); + return ret; +} diff --git a/RecoPixelVertexing/PixelTrackFitting/src/PixelTrackBuilder.cc b/RecoPixelVertexing/PixelTrackFitting/src/PixelTrackBuilder.cc index 860f60247ec2b..2f36de1e0f6ec 100644 --- a/RecoPixelVertexing/PixelTrackFitting/src/PixelTrackBuilder.cc +++ b/RecoPixelVertexing/PixelTrackFitting/src/PixelTrackBuilder.cc @@ -33,28 +33,29 @@ namespace { int charge) { ostringstream str; - str <<"\t pt: " << pt.value() <<"+/-"< 0) ? -1 : 1; float tip_e = sqrt( state.localError().matrix()(3,3) ); Measurement1D tip( tip_sign*tip_v, tip_e); - + return print(pt, phi, cotTheta, tip, zip, 0., state.charge()); } @@ -109,16 +110,16 @@ namespace { inline void checkState(const BasicTrajectoryStateOnSurface & bstate, const MagneticField* mf, const GlobalPoint & origin) { TrajectoryStateOnSurface state(bstate.clone()); - + LogTrace("")<<" *** PixelTrackBuilder::checkState: "; LogTrace("")<<"INPUT, ROTATION" << endl<& hits, const MagneticField * mf, - const GlobalPoint & origin) const + const GlobalPoint & origin) const { LogDebug("PixelTrackBuilder::build"); - LogTrace("")<<"reconstructed TRIPLET kinematics:\n"< + + + + diff --git a/RecoPixelVertexing/PixelTrackFitting/test/PixelTrackRiemannFit.cc b/RecoPixelVertexing/PixelTrackFitting/test/PixelTrackRiemannFit.cc new file mode 100644 index 0000000000000..9f60b2f431e96 --- /dev/null +++ b/RecoPixelVertexing/PixelTrackFitting/test/PixelTrackRiemannFit.cc @@ -0,0 +1,324 @@ +#define _USE_MATH_DEFINES + +#include +#include +#include +#include +#include // unique_ptr + +#include "RecoPixelVertexing/PixelTrackFitting/interface/RiemannFit.h" + +using namespace std; +using namespace Eigen; +using namespace Rfit; +using std::unique_ptr; + +namespace Rfit { +using Vector3i = Eigen::Matrix; +using Vector4i = Eigen::Matrix; +using Vector6d = Eigen::Matrix; +using Vector8d = Eigen::Matrix; +}; // namespace Rfit + +struct hits_gen { + Matrix3xNd hits; + Matrix3Nd hits_cov; + Vector5d true_par; +}; + +struct geometry { + Vector8d barrel; + Vector4i barrel_2; + Vector8d R_err; + Vector8d Rp_err; + Vector8d z_err; + Vector6d hand; + Vector3i hand_2; + Vector6d xy_err; + Vector6d zh_err; + double z_max; + double r_max; +}; + +void test_helix_fit(); + +constexpr int c_speed = 299792458; +constexpr double pi = M_PI; +default_random_engine generator(1); + +void smearing(const Vector5d& err, const bool& isbarrel, double& x, double& y, double& z) { + normal_distribution dist_R(0., err[0]); + normal_distribution dist_Rp(0., err[1]); + normal_distribution dist_z(0., err[2]); + normal_distribution dist_xyh(0., err[3]); + normal_distribution dist_zh(0., err[4]); + if (isbarrel) { + double dev_Rp = dist_Rp(generator); + double dev_R = dist_R(generator); + double R = sqrt(Rfit::sqr(x) + Rfit::sqr(y)); + x += dev_Rp * +y / R + dev_R * -x / R; + y += dev_Rp * -x / R + dev_R * -y / R; + z += dist_z(generator); + } else { + x += dist_xyh(generator); + y += dist_xyh(generator); + z += dist_zh(generator); + } +} + +void Hits_cov(Matrix3Nd& V, const unsigned int& i, const unsigned int& n, const Matrix3xNd& hits, + const Vector5d& err, bool isbarrel) { + if (isbarrel) { + double R2 = Rfit::sqr(hits(0, i)) + Rfit::sqr(hits(1, i)); + V(i, i) = + (Rfit::sqr(err[1]) * Rfit::sqr(hits(1, i)) + Rfit::sqr(err[0]) * Rfit::sqr(hits(0, i))) / + R2; + V(i + n, i + n) = + (Rfit::sqr(err[1]) * Rfit::sqr(hits(0, i)) + Rfit::sqr(err[0]) * Rfit::sqr(hits(1, i))) / + R2; + V(i, i + n) = V(i + n, i) = + (Rfit::sqr(err[0]) - Rfit::sqr(err[1])) * hits(1, i) * hits(0, i) / R2; + V(i + 2 * n, i + 2 * n) = Rfit::sqr(err[2]); + } else { + V(i, i) = Rfit::sqr(err[3]); + V(i + n, i + n) = Rfit::sqr(err[3]); + V(i + 2 * n, i + 2 * n) = Rfit::sqr(err[4]); + } +} + +hits_gen Hits_gen(const unsigned int& n, const Matrix& gen_par) { + hits_gen gen; + gen.hits = MatrixXd::Zero(3, n); + gen.hits_cov = MatrixXd::Zero(3 * n, 3 * n); + // err /= 10000.; + constexpr double rad[8] = {2.95, 6.8, 10.9, 16., 3.1, 7., 11., 16.2}; + // constexpr double R_err[8] = {5./10000, 5./10000, 5./10000, 5./10000, 5./10000, + // 5./10000, 5./10000, 5./10000}; constexpr double Rp_err[8] = {35./10000, 18./10000, + // 15./10000, 34./10000, 35./10000, 18./10000, 15./10000, 34./10000}; constexpr double z_err[8] = + // {72./10000, 38./10000, 25./10000, 56./10000, 72./10000, 38./10000, 25./10000, 56./10000}; + constexpr double R_err[8] = {10. / 10000, 10. / 10000, 10. / 10000, 10. / 10000, + 10. / 10000, 10. / 10000, 10. / 10000, 10. / 10000}; + constexpr double Rp_err[8] = {35. / 10000, 18. / 10000, 15. / 10000, 34. / 10000, + 35. / 10000, 18. / 10000, 15. / 10000, 34. / 10000}; + constexpr double z_err[8] = {72. / 10000, 38. / 10000, 25. / 10000, 56. / 10000, + 72. / 10000, 38. / 10000, 25. / 10000, 56. / 10000}; + const double x2 = gen_par(0) + gen_par(4) * cos(gen_par(3) * pi / 180); + const double y2 = gen_par(1) + gen_par(4) * sin(gen_par(3) * pi / 180); + const double alpha = atan2(y2, x2); + + for (unsigned int i = 0; i < n; ++i) { + const double a = gen_par(4); + const double b = rad[i]; + const double c = sqrt(Rfit::sqr(x2) + Rfit::sqr(y2)); + const double beta = acos((Rfit::sqr(a) - Rfit::sqr(b) - Rfit::sqr(c)) / (-2. * b * c)); + const double gamma = alpha + beta; + gen.hits(0, i) = rad[i] * cos(gamma); + gen.hits(1, i) = rad[i] * sin(gamma); + gen.hits(2, i) = gen_par(2) + 1 / tan(gen_par(5) * pi / 180) * 2. * + asin(sqrt(Rfit::sqr((gen_par(0) - gen.hits(0, i))) + + Rfit::sqr((gen_par(1) - gen.hits(1, i)))) / + (2. * gen_par(4))) * + gen_par(4); + // isbarrel(i) = ?? + Vector5d err; + err << R_err[i], Rp_err[i], z_err[i], 0, 0; + smearing(err, true, gen.hits(0, i), gen.hits(1, i), gen.hits(2, i)); + Hits_cov(gen.hits_cov, i, n, gen.hits, err, true); + } + + return gen; +} + +Vector5d True_par(const Matrix& gen_par, const int& charge, const double& B_field) { + Vector5d true_par; + const double x0 = gen_par(0) + gen_par(4) * cos(gen_par(3) * pi / 180); + const double y0 = gen_par(1) + gen_par(4) * sin(gen_par(3) * pi / 180); + circle_fit circle; + circle.par << x0, y0, gen_par(4); + circle.q = 1; + Rfit::par_uvrtopak(circle, B_field, false); + true_par.block(0, 0, 3, 1) = circle.par; + true_par(3) = 1 / tan(gen_par(5) * pi / 180); + const int dir = ((gen_par(0) - cos(true_par(0) - pi / 2) * true_par(1)) * (gen_par(1) - y0) - + (gen_par(1) - sin(true_par(0) - pi / 2) * true_par(1)) * (gen_par(0) - x0) > + 0) + ? -1 + : 1; + true_par(4) = gen_par(2) + + 1 / tan(gen_par(5) * pi / 180) * dir * 2.f * + asin(sqrt(Rfit::sqr((gen_par(0) - cos(true_par(0) - pi / 2) * true_par(1))) + + Rfit::sqr((gen_par(1) - sin(true_par(0) - pi / 2) * true_par(1)))) / + (2.f * gen_par(4))) * + gen_par(4); + return true_par; +} + +Matrix New_par(const Matrix& gen_par, const int& charge, + const double& B_field) { + Matrix new_par; + new_par.block(0, 0, 3, 1) = gen_par.block(0, 0, 3, 1); + new_par(3) = gen_par(3) - charge * 90; + new_par(4) = gen_par(4) / B_field; +// new_par(5) = atan(sinh(gen_par(5))) * 180 / pi; + new_par(5) = 2.*atan(exp(-gen_par(5))) * 180 / pi; + return new_par; +} + +void test_helix_fit() { + int n_; + int iteration; + int debug2 = 0; + bool return_err; + const double B_field = 3.8 * c_speed / pow(10, 9) / 100; + Matrix gen_par; + Vector5d true_par; + Vector5d err; +// while (1) { + generator.seed(1); + int debug = 0; + debug2 = 0; + std::cout << std::setprecision(6); + cout << "_________________________________________________________________________\n"; + cout << "n x(cm) y(cm) z(cm) phi(grad) R(Gev/c) eta iteration return_err debug" << endl; +// cin >> n_ >> gen_par(0) >> gen_par(1) >> gen_par(2) >> gen_par(3) >> gen_par(4) >> gen_par(5) >> +// iteration >> return_err >> debug2; + n_ = 4; + gen_par(0) = -0.1; // x + gen_par(1) = 0.1; // y + gen_par(2) = -1.; // z + gen_par(3) = 45.; // phi + gen_par(4) = 10.; // R (p_t) + gen_par(5) = 1.; // eta + iteration = 1; + return_err = 1; + debug2 = 1; + + iteration *= 10; + gen_par = New_par(gen_par, 1, B_field); + true_par = True_par(gen_par, 1, B_field); + Matrix3xNd hits; + Matrix3Nd hits_cov; + unique_ptr helix(new helix_fit[iteration]); +// helix_fit* helix = new helix_fit[iteration]; + Matrix score(41, iteration); + + for (int i = 0; i < iteration; i++) { + if (debug2 == 1 && i == (iteration - 1)) { + debug = 1; + } + hits_gen gen; + gen = Hits_gen(n_, gen_par); +// gen.hits = MatrixXd::Zero(3, 4); +// gen.hits_cov = MatrixXd::Zero(3 * 4, 3 * 4); +// gen.hits.col(0) << 1.82917642593, 2.0411875248, 7.18495464325; +// gen.hits.col(1) << 4.47041416168, 4.82704305649, 18.6394691467; +// gen.hits.col(2) << 7.25991010666, 7.74653434753, 30.6931324005; +// gen.hits.col(3) << 8.99161434174, 9.54262828827, 38.1338043213; + helix[i] = Rfit::Helix_fit(gen.hits, gen.hits_cov, B_field, return_err, false); + + if (debug) + cout << std::setprecision(10) + << "phi: " << helix[i].par(0) << " +/- " << sqrt(helix[i].cov(0, 0)) << " vs " + << true_par(0) << endl + << "Tip: " << helix[i].par(1) << " +/- " << sqrt(helix[i].cov(1, 1)) << " vs " + << true_par(1) << endl + << "p_t: " << helix[i].par(2) << " +/- " << sqrt(helix[i].cov(2, 2)) << " vs " + << true_par(2) << endl + << "theta:" << helix[i].par(3) << " +/- " << sqrt(helix[i].cov(3, 3)) << " vs " + << true_par(3) << endl + << "Zip: " << helix[i].par(4) << " +/- " << sqrt(helix[i].cov(4, 4)) << " vs " + << true_par(4) << endl + << "charge:" << helix[i].q << " vs 1" << endl + << "covariance matrix:" << endl + << helix[i].cov << endl + << "Initial hits:\n" << gen.hits << endl + << "Initial Covariance:\n" << gen.hits_cov << endl; + } + + for (int x = 0; x < iteration; x++) { + // Compute PULLS information + score(0, x) = (helix[x].par(0) - true_par(0)) / sqrt(helix[x].cov(0, 0)); + score(1, x) = (helix[x].par(1) - true_par(1)) / sqrt(helix[x].cov(1, 1)); + score(2, x) = (helix[x].par(2) - true_par(2)) / sqrt(helix[x].cov(2, 2)); + score(3, x) = (helix[x].par(3) - true_par(3)) / sqrt(helix[x].cov(3, 3)); + score(4, x) = (helix[x].par(4) - true_par(4)) / sqrt(helix[x].cov(4, 4)); + score(5, x) = + (helix[x].par(0) - true_par(0)) * (helix[x].par(1) - true_par(1)) / (helix[x].cov(0, 1)); + score(6, x) = + (helix[x].par(0) - true_par(0)) * (helix[x].par(2) - true_par(2)) / (helix[x].cov(0, 2)); + score(7, x) = + (helix[x].par(1) - true_par(1)) * (helix[x].par(2) - true_par(2)) / (helix[x].cov(1, 2)); + score(8, x) = + (helix[x].par(3) - true_par(3)) * (helix[x].par(4) - true_par(4)) / (helix[x].cov(3, 4)); + score(9, x) = helix[x].chi2_circle; + score(25, x) = helix[x].chi2_line; + score(10, x) = sqrt(helix[x].cov(0, 0)) / helix[x].par(0) * 100; + score(13, x) = sqrt(helix[x].cov(3, 3)) / helix[x].par(3) * 100; + score(14, x) = sqrt(helix[x].cov(4, 4)) / helix[x].par(4) * 100; + score(15, x) = (helix[x].par(0) - true_par(0)) * (helix[x].par(3) - true_par(3)) / + sqrt(helix[x].cov(0, 0)) / sqrt(helix[x].cov(3, 3)); + score(16, x) = (helix[x].par(1) - true_par(1)) * (helix[x].par(3) - true_par(3)) / + sqrt(helix[x].cov(1, 1)) / sqrt(helix[x].cov(3, 3)); + score(17, x) = (helix[x].par(2) - true_par(2)) * (helix[x].par(3) - true_par(3)) / + sqrt(helix[x].cov(2, 2)) / sqrt(helix[x].cov(3, 3)); + score(18, x) = (helix[x].par(0) - true_par(0)) * (helix[x].par(4) - true_par(4)) / + sqrt(helix[x].cov(0, 0)) / sqrt(helix[x].cov(4, 4)); + score(19, x) = (helix[x].par(1) - true_par(1)) * (helix[x].par(4) - true_par(4)) / + sqrt(helix[x].cov(1, 1)) / sqrt(helix[x].cov(4, 4)); + score(20, x) = (helix[x].par(2) - true_par(2)) * (helix[x].par(4) - true_par(4)) / + sqrt(helix[x].cov(2, 2)) / sqrt(helix[x].cov(4, 4)); + score(21, x) = (helix[x].par(0) - true_par(0)) * (helix[x].par(1) - true_par(1)) / + sqrt(helix[x].cov(0, 0)) / sqrt(helix[x].cov(1, 1)); + score(22, x) = (helix[x].par(0) - true_par(0)) * (helix[x].par(2) - true_par(2)) / + sqrt(helix[x].cov(0, 0)) / sqrt(helix[x].cov(2, 2)); + score(23, x) = (helix[x].par(1) - true_par(1)) * (helix[x].par(2) - true_par(2)) / + sqrt(helix[x].cov(1, 1)) / sqrt(helix[x].cov(2, 2)); + score(24, x) = (helix[x].par(3) - true_par(3)) * (helix[x].par(4) - true_par(4)) / + sqrt(helix[x].cov(3, 3)) / sqrt(helix[x].cov(4, 4)); + } + + double phi_ = score.row(0).mean(); + double a_ = score.row(1).mean(); + double pt_ = score.row(2).mean(); + double coT_ = score.row(3).mean(); + double Zip_ = score.row(4).mean(); + Matrix5d correlation; + correlation << 1., score.row(21).mean(), score.row(22).mean(), score.row(15).mean(), + score.row(20).mean(), score.row(21).mean(), 1., score.row(23).mean(), score.row(16).mean(), + score.row(19).mean(), score.row(22).mean(), score.row(23).mean(), 1., score.row(17).mean(), + score.row(20).mean(), score.row(15).mean(), score.row(16).mean(), score.row(17).mean(), 1., + score.row(24).mean(), score.row(18).mean(), score.row(19).mean(), score.row(20).mean(), + score.row(24).mean(), 1.; + + cout << "\nPULLS:\n" + << "phi: " << phi_ << " " + << sqrt((score.row(0).array() - phi_).square().sum() / (iteration - 1)) << " " + << abs(score.row(10).mean()) << "%\n" + << "a0 : " << a_ << " " + << sqrt((score.row(1).array() - a_).square().sum() / (iteration - 1)) << " " + << abs(score.row(11).mean()) << "%\n" + << "pt : " << pt_ << " " + << sqrt((score.row(2).array() - pt_).square().sum() / (iteration - 1)) << " " + << abs(score.row(12).mean()) << "%\n" + << "coT: " << coT_ << " " + << sqrt((score.row(3).array() - coT_).square().sum() / (iteration - 1)) << " " + << abs(score.row(13).mean()) << "%\n" + << "Zip: " << Zip_ << " " + << sqrt((score.row(4).array() - Zip_).square().sum() / (iteration - 1)) << " " + << abs(score.row(14).mean()) << "%\n\n" + << "cov(phi,a0)_: " << score.row(5).mean() << "\n" + << "cov(phi,pt)_: " << score.row(6).mean() << "\n" + << "cov(a0,pt)_: " << score.row(7).mean() << "\n" + << "cov(coT,Zip)_: " << score.row(8).mean() << "\n\n" + << "chi2_circle: " << score.row(9).mean() << " vs " << n_ - 3 << "\n" + << "chi2_line: " << score.row(25).mean() << " vs " << n_ - 2 << "\n\n" + << "correlation matrix:\n" + << correlation << "\n\n" + << endl; +// } +} + +int main() { + test_helix_fit(); + return 0; +} diff --git a/RecoPixelVertexing/PixelTrackFitting/test/testEigenGPU.cu b/RecoPixelVertexing/PixelTrackFitting/test/testEigenGPU.cu new file mode 100644 index 0000000000000..814e278690957 --- /dev/null +++ b/RecoPixelVertexing/PixelTrackFitting/test/testEigenGPU.cu @@ -0,0 +1,209 @@ +#include "test_common.h" +#include + +#include "RecoPixelVertexing/PixelTrackFitting/interface/RiemannFit.h" +#include +#include + +using namespace Eigen; + +__global__ void kernelFullFit(Rfit::Matrix3xNd * hits, Rfit::Matrix3Nd * hits_cov, + double B, Rfit::circle_fit * circle_fit_resultsGPU, Rfit::line_fit * line_fit_resultsGPU) { + Vector4d fast_fit = Rfit::Fast_fit(*hits); + + u_int n = hits->cols(); + Rfit::VectorNd rad = (hits->block(0, 0, 2, n).colwise().norm()); + + (*circle_fit_resultsGPU) = + Rfit::Circle_fit(hits->block(0,0,2,n), hits_cov->block(0, 0, 2 * n, 2 * n), + fast_fit, rad, B, false, false); + + (*line_fit_resultsGPU) = Rfit::Line_fit(*hits, *hits_cov, *circle_fit_resultsGPU, fast_fit, true); + + return; +} + +__global__ void kernelFastFit(Rfit::Matrix3xNd * hits, Vector4d * results) { + (*results) = Rfit::Fast_fit(*hits); +} + +__global__ void kernelCircleFit(Rfit::Matrix3xNd * hits, + Rfit::Matrix3Nd * hits_cov, Vector4d * fast_fit_input, double B, + Rfit::circle_fit * circle_fit_resultsGPU) { + u_int n = hits->cols(); + Rfit::VectorNd rad = (hits->block(0, 0, 2, n).colwise().norm()); + + if (!NODEBUG) { + printf("fast_fit_input(0): %f\n", (*fast_fit_input)(0)); + printf("fast_fit_input(1): %f\n", (*fast_fit_input)(1)); + printf("fast_fit_input(2): %f\n", (*fast_fit_input)(2)); + printf("fast_fit_input(3): %f\n", (*fast_fit_input)(3)); + printf("rad(0,0): %f\n", rad(0,0)); + printf("rad(1,1): %f\n", rad(1,1)); + printf("rad(2,2): %f\n", rad(2,2)); + printf("hits_cov(0,0): %f\n", (*hits_cov)(0,0)); + printf("hits_cov(1,1): %f\n", (*hits_cov)(1,1)); + printf("hits_cov(2,2): %f\n", (*hits_cov)(2,2)); + printf("hits_cov(11,11): %f\n", (*hits_cov)(11,11)); + printf("B: %f\n", B); + } + (*circle_fit_resultsGPU) = + Rfit::Circle_fit(hits->block(0,0,2,n), hits_cov->block(0, 0, 2 * n, 2 * n), + *fast_fit_input, rad, B, false, false); +} + +__global__ void kernelLineFit(Rfit::Matrix3xNd * hits, + Rfit::Matrix3Nd * hits_cov, + Rfit::circle_fit * circle_fit, + Vector4d * fast_fit, + Rfit::line_fit * line_fit) { + (*line_fit) = Rfit::Line_fit(*hits, *hits_cov, *circle_fit, *fast_fit, true); +} + +void fillHitsAndHitsCov(Rfit::Matrix3xNd & hits, Rfit::Matrix3Nd & hits_cov) { + hits << 1.98645, 4.72598, 7.65632, 11.3151, + 2.18002, 4.88864, 7.75845, 11.3134, + 2.46338, 6.99838, 11.808, 17.793; + hits_cov(0,0) = 7.14652e-06; + hits_cov(1,1) = 2.15789e-06; + hits_cov(2,2) = 1.63328e-06; + hits_cov(3,3) = 6.27919e-06; + hits_cov(4,4) = 6.10348e-06; + hits_cov(5,5) = 2.08211e-06; + hits_cov(6,6) = 1.61672e-06; + hits_cov(7,7) = 6.28081e-06; + hits_cov(8,8) = 5.184e-05; + hits_cov(9,9) = 1.444e-05; + hits_cov(10,10) = 6.25e-06; + hits_cov(11,11) = 3.136e-05; + hits_cov(0,4) = hits_cov(4,0) = -5.60077e-06; + hits_cov(1,5) = hits_cov(5,1) = -1.11936e-06; + hits_cov(2,6) = hits_cov(6,2) = -6.24945e-07; + hits_cov(3,7) = hits_cov(7,3) = -5.28e-06; +} + +void testFit() { + constexpr double B = 0.0113921; + Rfit::Matrix3xNd hits(3,4); + Rfit::Matrix3Nd hits_cov = MatrixXd::Zero(12,12); + Rfit::Matrix3xNd * hitsGPU = new Rfit::Matrix3xNd(3,4); + Rfit::Matrix3Nd * hits_covGPU = nullptr; + Vector4d * fast_fit_resultsGPU = new Vector4d(); + Vector4d * fast_fit_resultsGPUret = new Vector4d(); + Rfit::circle_fit * circle_fit_resultsGPU = new Rfit::circle_fit(); + Rfit::circle_fit * circle_fit_resultsGPUret = new Rfit::circle_fit(); + + fillHitsAndHitsCov(hits, hits_cov); + + // FAST_FIT_CPU + Vector4d fast_fit_results = Rfit::Fast_fit(hits); + if (!NODEBUG) { + std::cout << "Generated hits:\n" << hits << std::endl; + } + std::cout << "Fitted values (FastFit, [X0, Y0, R, tan(theta)]):\n" << fast_fit_results << std::endl; + + // FAST_FIT GPU + cudaMalloc((void**)&hitsGPU, sizeof(Rfit::Matrix3xNd(3,4))); + cudaMalloc((void**)&fast_fit_resultsGPU, sizeof(Vector4d)); + cudaMemcpy(hitsGPU, &hits, sizeof(Rfit::Matrix3xNd(3,4)), cudaMemcpyHostToDevice); + + kernelFastFit<<<1, 1>>>(hitsGPU, fast_fit_resultsGPU); + cudaDeviceSynchronize(); + + cudaMemcpy(fast_fit_resultsGPUret, fast_fit_resultsGPU, sizeof(Vector4d), cudaMemcpyDeviceToHost); + std::cout << "Fitted values (FastFit, [X0, Y0, R, tan(theta)]): GPU\n" << *fast_fit_resultsGPUret << std::endl; + assert(isEqualFuzzy(fast_fit_results, (*fast_fit_resultsGPUret))); + + // CIRCLE_FIT CPU + u_int n = hits.cols(); + Rfit::VectorNd rad = (hits.block(0, 0, 2, n).colwise().norm()); + + Rfit::circle_fit circle_fit_results = Rfit::Circle_fit(hits.block(0, 0, 2, n), + hits_cov.block(0, 0, 2 * n, 2 * n), + fast_fit_results, rad, B, false, false); + std::cout << "Fitted values (CircleFit):\n" << circle_fit_results.par << std::endl; + + // CIRCLE_FIT GPU + cudaMalloc((void **)&hits_covGPU, sizeof(Rfit::Matrix3Nd(12,12))); + cudaMalloc((void **)&circle_fit_resultsGPU, sizeof(Rfit::circle_fit)); + cudaMemcpy(hits_covGPU, &hits_cov, sizeof(Rfit::Matrix3Nd(12,12)), cudaMemcpyHostToDevice); + + kernelCircleFit<<<1,1>>>(hitsGPU, hits_covGPU, + fast_fit_resultsGPU, B, circle_fit_resultsGPU); + cudaDeviceSynchronize(); + + cudaMemcpy(circle_fit_resultsGPUret, circle_fit_resultsGPU, + sizeof(Rfit::circle_fit), cudaMemcpyDeviceToHost); + std::cout << "Fitted values (CircleFit) GPU:\n" << circle_fit_resultsGPUret->par << std::endl; + assert(isEqualFuzzy(circle_fit_results.par, circle_fit_resultsGPUret->par)); + + // LINE_FIT CPU + Rfit::line_fit line_fit_results = Rfit::Line_fit(hits, hits_cov, circle_fit_results, fast_fit_results, true); + std::cout << "Fitted values (LineFit):\n" << line_fit_results.par << std::endl; + + // LINE_FIT GPU + Rfit::line_fit * line_fit_resultsGPU = nullptr; + Rfit::line_fit * line_fit_resultsGPUret = new Rfit::line_fit(); + + cudaMalloc((void **)&line_fit_resultsGPU, sizeof(Rfit::line_fit)); + + kernelLineFit<<<1,1>>>(hitsGPU, hits_covGPU, circle_fit_resultsGPU, fast_fit_resultsGPU, line_fit_resultsGPU); + cudaDeviceSynchronize(); + + cudaMemcpy(line_fit_resultsGPUret, line_fit_resultsGPU, sizeof(Rfit::line_fit), cudaMemcpyDeviceToHost); + std::cout << "Fitted values (LineFit) GPU:\n" << line_fit_resultsGPUret->par << std::endl; + assert(isEqualFuzzy(line_fit_results.par, line_fit_resultsGPUret->par)); +} + +void testFitOneGo() { + constexpr double B = 0.0113921; + Rfit::Matrix3xNd hits(3,4); + Rfit::Matrix3Nd hits_cov = MatrixXd::Zero(12,12); + + fillHitsAndHitsCov(hits, hits_cov); + + // FAST_FIT_CPU + Vector4d fast_fit_results = Rfit::Fast_fit(hits); + // CIRCLE_FIT CPU + u_int n = hits.cols(); + Rfit::VectorNd rad = (hits.block(0, 0, 2, n).colwise().norm()); + + Rfit::circle_fit circle_fit_results = Rfit::Circle_fit(hits.block(0, 0, 2, n), + hits_cov.block(0, 0, 2 * n, 2 * n), + fast_fit_results, rad, B, false, false); + // LINE_FIT CPU + Rfit::line_fit line_fit_results = Rfit::Line_fit(hits, hits_cov, circle_fit_results, fast_fit_results, true); + + // FIT GPU + Rfit::Matrix3xNd * hitsGPU = new Rfit::Matrix3xNd(3,4); + Rfit::Matrix3Nd * hits_covGPU = nullptr; + Rfit::line_fit * line_fit_resultsGPU = nullptr; + Rfit::line_fit * line_fit_resultsGPUret = new Rfit::line_fit(); + Rfit::circle_fit * circle_fit_resultsGPU = new Rfit::circle_fit(); + Rfit::circle_fit * circle_fit_resultsGPUret = new Rfit::circle_fit(); + + cudaMalloc((void**)&hitsGPU, sizeof(Rfit::Matrix3xNd(3,4))); + cudaMalloc((void **)&hits_covGPU, sizeof(Rfit::Matrix3Nd(12,12))); + cudaMalloc((void **)&line_fit_resultsGPU, sizeof(Rfit::line_fit)); + cudaMalloc((void **)&circle_fit_resultsGPU, sizeof(Rfit::circle_fit)); + cudaMemcpy(hitsGPU, &hits, sizeof(Rfit::Matrix3xNd(3,4)), cudaMemcpyHostToDevice); + cudaMemcpy(hits_covGPU, &hits_cov, sizeof(Rfit::Matrix3Nd(12,12)), cudaMemcpyHostToDevice); + + kernelFullFit<<<1, 1>>>(hitsGPU, hits_covGPU, B, circle_fit_resultsGPU, line_fit_resultsGPU); + cudaDeviceSynchronize(); + + cudaMemcpy(circle_fit_resultsGPUret, circle_fit_resultsGPU, + sizeof(Rfit::circle_fit), cudaMemcpyDeviceToHost); + cudaMemcpy(line_fit_resultsGPUret, line_fit_resultsGPU, sizeof(Rfit::line_fit), cudaMemcpyDeviceToHost); + + std::cout << "Fitted values (CircleFit) GPU:\n" << circle_fit_resultsGPUret->par << std::endl; + std::cout << "Fitted values (LineFit): GPU\n" << line_fit_resultsGPUret->par << std::endl; + assert(isEqualFuzzy(circle_fit_results.par, circle_fit_resultsGPUret->par)); + assert(isEqualFuzzy(line_fit_results.par, line_fit_resultsGPUret->par)); +} + +int main (int argc, char * argv[]) { + testFit(); + testFitOneGo(); + return 0; +} diff --git a/RecoPixelVertexing/PixelTrackFitting/test/testEigenGPUNoFit.cu b/RecoPixelVertexing/PixelTrackFitting/test/testEigenGPUNoFit.cu new file mode 100644 index 0000000000000..210b10cd14ed1 --- /dev/null +++ b/RecoPixelVertexing/PixelTrackFitting/test/testEigenGPUNoFit.cu @@ -0,0 +1,169 @@ +#include "test_common.h" +#include + +#include +#include + + +using namespace Eigen; + +__host__ __device__ void eigenValues(Matrix3d * m, Eigen::SelfAdjointEigenSolver::RealVectorType * ret) { + if (!NODEBUG) { + printf("Matrix(0,0): %f\n", (*m)(0,0)); + printf("Matrix(1,1): %f\n", (*m)(1,1)); + printf("Matrix(2,2): %f\n", (*m)(2,2)); + } + SelfAdjointEigenSolver es; + es.computeDirect(*m); + (*ret) = es.eigenvalues(); + return; +} + +__global__ void kernel(Matrix3d * m, Eigen::SelfAdjointEigenSolver::RealVectorType * ret) { + eigenValues(m, ret); +} + +__global__ void kernelInverse(Matrix3d * in, Matrix3d * out) { +// (*out) = in->inverse(); +} + +template +__global__ void kernelMultiply(M1 * J, + M2 * C, + M3 * result) { +// Map res(result->data()); + if (!NODEBUG) + printf("*** GPU IN ***\n"); + printIt(J); + printIt(C); +// res.noalias() = (*J) * (*C); +// printIt(&res); + (*result) = (*J) * (*C); + if (!NODEBUG) + printf("*** GPU OUT ***\n"); + return; +} + +template +void testMultiply() { + std::cout << "TEST MULTIPLY" << std::endl; + std::cout << "Product of type " << row1 << "x" << col1 + << " * " << row2 << "x" << col2 << std::endl; + Eigen::Matrix J; + fillMatrix(J); + Eigen::Matrix C; + fillMatrix(C); + Eigen::Matrix multiply_result = J * C; + if (!NODEBUG) { + std::cout << "Input J:" << std::endl; printIt(&J); + std::cout << "Input C:" << std::endl; printIt(&C); + std::cout << "Output:" << std::endl; + printIt(&multiply_result); + } + // GPU + Eigen::Matrix *JGPU = nullptr; + Eigen::Matrix *CGPU = nullptr; + Eigen::Matrix *multiply_resultGPU = nullptr; + Eigen::Matrix *multiply_resultGPUret = new Eigen::Matrix(); + + cudaMalloc((void **)&JGPU, sizeof(Eigen::Matrix)); + cudaMalloc((void **)&CGPU, sizeof(Eigen::Matrix)); + cudaMalloc((void **)&multiply_resultGPU, sizeof(Eigen::Matrix)); + cudaMemcpy(JGPU, &J, sizeof(Eigen::Matrix), cudaMemcpyHostToDevice); + cudaMemcpy(CGPU, &C, sizeof(Eigen::Matrix), cudaMemcpyHostToDevice); + cudaMemcpy(multiply_resultGPU, &multiply_result, sizeof(Eigen::Matrix), cudaMemcpyHostToDevice); + + kernelMultiply<<<1,1>>>(JGPU, CGPU, multiply_resultGPU); + cudaDeviceSynchronize(); + + cudaMemcpy(multiply_resultGPUret, multiply_resultGPU, + sizeof(Eigen::Matrix), cudaMemcpyDeviceToHost); + printIt(multiply_resultGPUret); + assert(isEqualFuzzy(multiply_result, (*multiply_resultGPUret))); +} + +void testInverse() { + std::cout << "TEST INVERSE" << std::endl; + Matrix3d m = Matrix3d::Random(); + Matrix3d *mGPU = nullptr; + Matrix3d *mGPUret = nullptr; + Matrix3d *mCPUret = new Matrix3d(); + + if (!NODEBUG) { + std::cout << "Here is the matrix m:" << std::endl << m << std::endl; + std::cout << "Its inverse is:" << std::endl << m.inverse() << std::endl; + } + cudaMalloc((void **)&mGPU, sizeof(Matrix3d)); + cudaMalloc((void **)&mGPUret, sizeof(Matrix3d)); + cudaMemcpy(mGPU, &m, sizeof(Matrix3d), cudaMemcpyHostToDevice); + + kernelInverse<<<1,1>>>(mGPU, mGPUret); + cudaDeviceSynchronize(); + + cudaMemcpy(mCPUret, mGPUret, sizeof(Matrix3d), cudaMemcpyDeviceToHost); + if (!NODEBUG) + std::cout << "Its GPU inverse is:" << std::endl << (*mCPUret) << std::endl; +} + +void testEigenvalues() { + std::cout << "TEST EIGENVALUES" << std::endl; + Matrix3d m = Matrix3d::Random(); + Matrix3d mt = m.transpose(); + m += mt; + Matrix3d * m_gpu = nullptr; + Matrix3d * mgpudebug = new Matrix3d(); + Eigen::SelfAdjointEigenSolver::RealVectorType *ret = new Eigen::SelfAdjointEigenSolver::RealVectorType; + Eigen::SelfAdjointEigenSolver::RealVectorType *ret1 = new Eigen::SelfAdjointEigenSolver::RealVectorType; + Eigen::SelfAdjointEigenSolver::RealVectorType *ret_gpu = nullptr; + eigenValues(&m, ret); + if (!NODEBUG) { + std::cout << "Generated Matrix M 3x3:\n" << m << std::endl; + std::cout << "The eigenvalues of M are:" << std::endl << (*ret) << std::endl; + std::cout << "*************************\n\n" << std::endl; + } + cudaMalloc((void **)&m_gpu, sizeof(Matrix3d)); + cudaMalloc((void **)&ret_gpu, sizeof(Eigen::SelfAdjointEigenSolver::RealVectorType)); + cudaMemcpy(m_gpu, &m, sizeof(Matrix3d), cudaMemcpyHostToDevice); + + kernel<<<1,1>>>(m_gpu, ret_gpu); + cudaDeviceSynchronize(); + + cudaMemcpy(mgpudebug, m_gpu, sizeof(Matrix3d), cudaMemcpyDeviceToHost); + cudaMemcpy(ret1, ret_gpu, sizeof(Eigen::SelfAdjointEigenSolver::RealVectorType), cudaMemcpyDeviceToHost); + if (!NODEBUG) { + std::cout << "GPU Generated Matrix M 3x3:\n" << (*mgpudebug) << std::endl; + std::cout << "GPU The eigenvalues of M are:" << std::endl << (*ret1) << std::endl; + std::cout << "*************************\n\n" << std::endl; + } + assert(isEqualFuzzy(*ret, *ret1)); +} + + +int main (int argc, char * argv[]) { + + testEigenvalues(); + testInverse(); + testMultiply<1, 2, 2, 1>(); + testMultiply<1, 2, 2, 2>(); + testMultiply<1, 2, 2, 3>(); + testMultiply<1, 2, 2, 4>(); + testMultiply<1, 2, 2, 5>(); + testMultiply<2, 1, 1, 2>(); + testMultiply<2, 1, 1, 3>(); + testMultiply<2, 1, 1, 4>(); + testMultiply<2, 1, 1, 5>(); + testMultiply<2, 2, 2, 2>(); + testMultiply<2, 3, 3, 1>(); + testMultiply<2, 3, 3, 2>(); + testMultiply<2, 3, 3, 4>(); + testMultiply<2, 3, 3, 5>(); + testMultiply<3, 2, 2, 3>(); + testMultiply<2, 3, 3, 3>(); // DOES NOT COMPILE W/O PATCHING EIGEN + testMultiply<3, 3, 3, 3>(); + testMultiply<8, 8, 8, 8>(); + testMultiply<3, 4, 4, 3>(); + testMultiply<2, 4, 4, 2>(); + testMultiply<3, 4, 4, 2>(); // DOES NOT COMPILE W/O PATCHING EIGEN + + return 0; +} diff --git a/RecoPixelVertexing/PixelTrackFitting/test/test_common.h b/RecoPixelVertexing/PixelTrackFitting/test/test_common.h new file mode 100644 index 0000000000000..0290ee2db641b --- /dev/null +++ b/RecoPixelVertexing/PixelTrackFitting/test/test_common.h @@ -0,0 +1,53 @@ +#ifndef RecoPixelVertexing__PixelTrackFitting__test_common_h +#define RecoPixelVertexing__PixelTrackFitting__test_common_h + +#include +#include +#include + +#define NODEBUG 1 + +template +__host__ __device__ void printIt(C * m) { + if (!NODEBUG) { + printf("\nMatrix %dx%d\n", (int)m->rows(), (int)m->cols()); + for (u_int r = 0; r < m->rows(); ++r) { + for (u_int c = 0; c < m->cols(); ++c) { + printf("Matrix(%d,%d) = %f\n", r, c, (*m)(r,c)); + } + } + } +} + +template +bool isEqualFuzzy(C a, C b) { + constexpr double epsilon = 1e-6; + for (unsigned int i = 0; i < a.rows(); ++i) { + for (unsigned int j = 0; j < a.cols(); ++j) { + assert(std::abs(a(i,j)-b(i,j)) + < std::min(std::abs(a(i,j)), std::abs(b(i,j)))*epsilon); + } + } + return true; +} + +bool isEqualFuzzy(double a, double b) { + constexpr double epsilon = 1e-6; + return std::abs(a-b) < std::min(std::abs(a), std::abs(b))*epsilon; +} + +template +void fillMatrix(T & t) { + std::random_device rd; + std::mt19937 gen(rd()); + std::uniform_real_distribution<> dis(0.0, 2.0); + for (int row = 0; row < t.rows(); ++row) { + for (int col = 0; col < t.cols(); ++col) { + t(row, col) = dis(gen); + } + } + return; +} + + +#endif From 3c99f6d5a102a01c5f62a08e5d951e7499a7ae4d Mon Sep 17 00:00:00 2001 From: Andrea Bocci Date: Tue, 27 Mar 2018 08:12:27 +0200 Subject: [PATCH 32/88] Replace std::cout with LogTrace (#36) Replace `std::cout` with `LogTrace`. Mark debugging functions as possibly unused. --- .../src/PixelTrackBuilder.cc | 33 ++++++++++--------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/RecoPixelVertexing/PixelTrackFitting/src/PixelTrackBuilder.cc b/RecoPixelVertexing/PixelTrackFitting/src/PixelTrackBuilder.cc index 2f36de1e0f6ec..5febfd34be227 100644 --- a/RecoPixelVertexing/PixelTrackFitting/src/PixelTrackBuilder.cc +++ b/RecoPixelVertexing/PixelTrackFitting/src/PixelTrackBuilder.cc @@ -23,6 +23,7 @@ using namespace reco; template T inline sqr( T t) {return t*t;} namespace { + __attribute__((unused)) std::string print( const Measurement1D & pt, const Measurement1D & phi, @@ -33,16 +34,17 @@ namespace { int charge) { ostringstream str; - str <<"\t pt: " << pt.value() <<"+/-"< Date: Sun, 1 Apr 2018 17:49:32 +0200 Subject: [PATCH 33/88] First version of CUDAService and AcceleratorService (#33) - add `CUDAService` for CUDA resource management - first version of `AcceleratorService` - rework the `AcceleratorService` interface - use `CUDAService` in `AcceleratorService` - migrate to [cuda-api-wrappers](https://github.com/eyalroz/cuda-api-wrappers) - at the end of the chain fetch result to CPU - add asynchronous test - use callback for the GPU test - slow down the test in order to actually see the effect of async - pass a GPU pointer between `EDModules` - keep the host pointers around as well until the execution has finished - extend the test with a specific analyzer and add concurrent work - pass one of the input device pointers across the modules to make a sanity check - improve releasing temporary memory - centralise bookkeeping of algorithm execution location - algorithm objects are now per device, leading to less coupling between them - they can still be the same object as well, this is allowed by the use of type erasure instead of inheritance - add `HeterogeneousProduct` with its own package - generalise `HeterogeneousProduct`, leading to somewhat excessive amount of helper templates, need to see again if things could be simplified. - simplify ROOT dictionary generation by additional layer of indirection - add TODO lists in comments, clean up printouts, add some documentation --- .../AcceleratorService/BuildFile.xml | 10 + .../interface/AcceleratorService.h | 245 ++++++++++++ .../AcceleratorService/plugins/BuildFile.xml | 4 + .../AcceleratorService/plugins/plugins.cc | 4 + .../src/AcceleratorService.cc | 125 ++++++ .../AcceleratorService/test/BuildFile.xml | 18 + .../test/TestAcceleratorServiceAnalyzer.cc | 56 +++ .../test/TestAcceleratorServiceProducerGPU.cc | 177 +++++++++ ...estAcceleratorServiceProducerGPUHelpers.cu | 209 ++++++++++ ...TestAcceleratorServiceProducerGPUHelpers.h | 41 ++ .../TestAcceleratorServiceProducerGPUMock.cc | 172 ++++++++ .../test/testGPUMock_cfg.py | 31 ++ .../AcceleratorService/test/testGPU_cfg.py | 32 ++ HeterogeneousCore/CUDAServices/BuildFile.xml | 9 + .../CUDAServices/interface/CUDAService.h | 40 ++ .../CUDAServices/plugins/BuildFile.xml | 1 + .../CUDAServices/plugins/plugins.cc | 4 + .../CUDAServices/src/CUDAService.cc | 88 +++++ HeterogeneousCore/Product/BuildFile.xml | 7 + .../Product/interface/HeterogeneousProduct.h | 366 ++++++++++++++++++ .../Product/src/HeterogeneousProduct.cc | 4 + HeterogeneousCore/Product/src/classes.h | 9 + HeterogeneousCore/Product/src/classes_def.xml | 4 + HeterogeneousCore/Product/test/BuildFile.xml | 4 + .../Product/test/testHeterogeneousProduct.cpp | 281 ++++++++++++++ 25 files changed, 1941 insertions(+) create mode 100644 HeterogeneousCore/AcceleratorService/BuildFile.xml create mode 100644 HeterogeneousCore/AcceleratorService/interface/AcceleratorService.h create mode 100644 HeterogeneousCore/AcceleratorService/plugins/BuildFile.xml create mode 100644 HeterogeneousCore/AcceleratorService/plugins/plugins.cc create mode 100644 HeterogeneousCore/AcceleratorService/src/AcceleratorService.cc create mode 100644 HeterogeneousCore/AcceleratorService/test/BuildFile.xml create mode 100644 HeterogeneousCore/AcceleratorService/test/TestAcceleratorServiceAnalyzer.cc create mode 100644 HeterogeneousCore/AcceleratorService/test/TestAcceleratorServiceProducerGPU.cc create mode 100644 HeterogeneousCore/AcceleratorService/test/TestAcceleratorServiceProducerGPUHelpers.cu create mode 100644 HeterogeneousCore/AcceleratorService/test/TestAcceleratorServiceProducerGPUHelpers.h create mode 100644 HeterogeneousCore/AcceleratorService/test/TestAcceleratorServiceProducerGPUMock.cc create mode 100644 HeterogeneousCore/AcceleratorService/test/testGPUMock_cfg.py create mode 100644 HeterogeneousCore/AcceleratorService/test/testGPU_cfg.py create mode 100644 HeterogeneousCore/CUDAServices/BuildFile.xml create mode 100644 HeterogeneousCore/CUDAServices/interface/CUDAService.h create mode 100644 HeterogeneousCore/CUDAServices/plugins/plugins.cc create mode 100644 HeterogeneousCore/CUDAServices/src/CUDAService.cc create mode 100644 HeterogeneousCore/Product/BuildFile.xml create mode 100644 HeterogeneousCore/Product/interface/HeterogeneousProduct.h create mode 100644 HeterogeneousCore/Product/src/HeterogeneousProduct.cc create mode 100644 HeterogeneousCore/Product/src/classes.h create mode 100644 HeterogeneousCore/Product/src/classes_def.xml create mode 100644 HeterogeneousCore/Product/test/BuildFile.xml create mode 100644 HeterogeneousCore/Product/test/testHeterogeneousProduct.cpp diff --git a/HeterogeneousCore/AcceleratorService/BuildFile.xml b/HeterogeneousCore/AcceleratorService/BuildFile.xml new file mode 100644 index 0000000000000..dc32f154d1571 --- /dev/null +++ b/HeterogeneousCore/AcceleratorService/BuildFile.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/HeterogeneousCore/AcceleratorService/interface/AcceleratorService.h b/HeterogeneousCore/AcceleratorService/interface/AcceleratorService.h new file mode 100644 index 0000000000000..93f269054bb45 --- /dev/null +++ b/HeterogeneousCore/AcceleratorService/interface/AcceleratorService.h @@ -0,0 +1,245 @@ +#ifndef HeterogeneousCore_AcceleratorService_AcceleratorService_h +#define HeterogeneousCore_AcceleratorService_AcceleratorService_h + +#include "FWCore/Concurrency/interface/WaitingTaskWithArenaHolder.h" +#include "FWCore/Utilities/interface/StreamID.h" +#include "FWCore/Utilities/interface/propagate_const.h" + +#include "HeterogeneousCore/Product/interface/HeterogeneousProduct.h" + +#include +#include +#include + +namespace edm { + class Event; + class ParameterSet; + class ActivityRegistry; + class ModuleDescription; + namespace service { + class SystemBounds; + } +} + +namespace accelerator { + // Inheritance vs. type erasure? I'm now going with the latter even + // if it is more complex to setup and maintain in order to support a + // case where a single class implements multiple CPU/GPU/etc + // interfaces, in which case via inheritance we can't separate the + // cases in the scheduling interface. + // + // Want a base class in order to have the per-device calls to be + // made non-inlined (how necessary is this?) + // + // Note that virtual destructors are not needed in the base classes + // as the pattern is to construct the concrete class in stack and + // keep that object around as long as the function call accessing + // the object via base class pointer/reference is finished. + + /** + * CPU algorithm + * + * The T can be any class implementing "runCPU(void)" method (return + * value is ignored) + * + * A CPU algorithm is run synchronously in the same TBB task, i.e. + * when everything is finished when runCPU() call returns. + */ + class AlgoCPUBase { + public: + AlgoCPUBase() {} + virtual void runCPU() = 0; + }; + template class AlgoCPU: public AlgoCPUBase { + public: + AlgoCPU(T *algo): algo_(algo) {} + void runCPU() override { algo_->runCPU(); } + private: + T *algo_; + }; + template AlgoCPU algoCPU(T *algo) { return AlgoCPU(algo); } + + /** + * GPU mock algorithm + * + * The T can be any class implementing + * "runGPUMock(std::function)" method (return value is + * ignored). + * + * The implemented method must call the callback function when all + * work is finished. If any of the work is asynchronous, it is up to + * the algorithm to launch the work asynchronously and ensure that + * the callback is called after all asynchronous work is finished. + */ + class AlgoGPUMockBase { + public: + AlgoGPUMockBase() {} + virtual void runGPUMock(std::function callback) = 0; + }; + template class AlgoGPUMock: public AlgoGPUMockBase { + public: + AlgoGPUMock(T *algo): algo_(algo) {} + void runGPUMock(std::function callback) override { algo_->runGPUMock(std::move(callback)); } + private: + T *algo_; + }; + template AlgoGPUMock algoGPUMock(T *algo) { return AlgoGPUMock(algo); } + + /** + * GPU CUDA algorithm + * + * The T can be any class implementing + * "runGPUCuda(std::function)" method (return value is + * ignored). + * + * The implemented method must call the callback function when all + * work is finished. If any of the work is asynchronous, it is up to + * the algorithm to launch the work asynchronously and ensure that + * the callback is called after all asynchronous work is finished. + * + * For CUDA the above conditions mean using + * - CUDA stream + * - asynchronous memory transfers + * - asynchronous kernel launches + * - registering the callback to the stream after all other work has been launched + * + * Note that the CUDA stream object must live at least as long as + * the callback() is called (in practice a tiny bit later). + */ + class AlgoGPUCudaBase { + public: + AlgoGPUCudaBase() {} + virtual void runGPUCuda(std::function callback) = 0; + }; + template class AlgoGPUCuda: public AlgoGPUCudaBase { + public: + AlgoGPUCuda(T *algo): algo_(algo) {} + void runGPUCuda(std::function callback) override { algo_->runGPUCuda(std::move(callback)); } + private: + T *algo_; + }; + template AlgoGPUCuda algoGPUCuda(T *algo) { return AlgoGPUCuda(algo); } +} + +/** + * Prototype for a service for scheduling heterogeneous algorithms + * + * It can be that in the end we don't need a Service, but for now the + * protyping proceeds with one. + * + * At the moment the client EDModules must use the ExternalWork extension. + * + * Client EDModules must first register themselves by calling the + * book() method in their constructor and storing the Token object as + * member variables. + * + * In the aqcuire(), the clients must call the schedule() method to + * schedule (and possibly run) the algorithms (for more details see + * the documentation of the method). + * + * In the produce(), the clients must check with + * algoExecutionLocation() which algorithm was run, fetch the output + * of that algorithm, and put it in the Event. + */ +class AcceleratorService { +public: + class Token { + public: + explicit Token(unsigned int id): id_(id) {} + + unsigned int id() const { return id_; } + private: + unsigned int id_; + }; + + AcceleratorService(edm::ParameterSet const& iConfig, edm::ActivityRegistry& iRegistry); + + Token book(); // TODO: better name, unfortunately 'register' is a reserved keyword... + + /** + * Schedule the various versions of the algorithm to the available + * heterogeneous devices. + * + * The parameter pack is an ordered list of accelerator::Algo* + * objects (note the helper functions to create them). The order of + * the algorithms is taken as the preferred order to be tried. I.e. + * the code tries to schedule the first algorithm, if that fails (no + * device, to be extended) try the next one etc. The CPU version has + * to be the last one. + * + * + * TODO: passing the "input" parameter here is a bit boring, but + * somehow we have to schedule according to the input. Try to think + * something better. + */ + template + void schedule(Token token, edm::StreamID streamID, edm::WaitingTaskWithArenaHolder waitingTaskHolder, const I *input, Args&&... args) { + scheduleImpl(token, streamID, std::move(waitingTaskHolder), input, std::forward(args)...); + } + HeterogeneousDeviceId algoExecutionLocation(Token token, edm::StreamID streamID) const { + return algoExecutionLocation_[tokenStreamIdsToDataIndex(token.id(), streamID)]; + } + +private: + // signals + void preallocate(edm::service::SystemBounds const& bounds); + void preModuleConstruction(edm::ModuleDescription const& desc); + void postModuleConstruction(edm::ModuleDescription const& desc); + + + // other helpers + unsigned int tokenStreamIdsToDataIndex(unsigned int tokenId, edm::StreamID streamId) const; + + // experimenting new interface + template + void scheduleImpl(Token token, edm::StreamID streamID, edm::WaitingTaskWithArenaHolder waitingTaskHolder, const I *input, + accelerator::AlgoGPUMock gpuMockAlgo, Args&&... args) { + bool succeeded = true; + if(input) { + succeeded = input->isProductOn(HeterogeneousDevice::kGPUMock); + } + if(succeeded) { + succeeded = scheduleGPUMock(token, streamID, waitingTaskHolder, gpuMockAlgo); + } + if(!succeeded) { + scheduleImpl(token, streamID, std::move(waitingTaskHolder), input, std::forward(args)...); + } + } + template + void scheduleImpl(Token token, edm::StreamID streamID, edm::WaitingTaskWithArenaHolder waitingTaskHolder, const I *input, + accelerator::AlgoGPUCuda gpuCudaAlgo, Args&&... args) { + bool succeeded = true; + if(input) { + succeeded = input->isProductOn(HeterogeneousDevice::kGPUCuda); + } + if(succeeded) { + succeeded = scheduleGPUCuda(token, streamID, waitingTaskHolder, gpuCudaAlgo); + } + if(!succeeded) + scheduleImpl(token, streamID, std::move(waitingTaskHolder), input, std::forward(args)...); + } + // Break recursion, require CPU to be the last + template + void scheduleImpl(Token token, edm::StreamID streamID, edm::WaitingTaskWithArenaHolder waitingTaskHolder, const I *input, + accelerator::AlgoCPU cpuAlgo) { + scheduleCPU(token, streamID, std::move(waitingTaskHolder), cpuAlgo); + } + bool scheduleGPUMock(Token token, edm::StreamID streamID, edm::WaitingTaskWithArenaHolder waitingTaskHolder, accelerator::AlgoGPUMockBase& gpuMockAlgo); + bool scheduleGPUCuda(Token token, edm::StreamID streamID, edm::WaitingTaskWithArenaHolder waitingTaskHolder, accelerator::AlgoGPUCudaBase& gpuCudaAlgo); + void scheduleCPU(Token token, edm::StreamID streamID, edm::WaitingTaskWithArenaHolder waitingTaskHolder, accelerator::AlgoCPUBase& cpuAlgo); + + + unsigned int numberOfStreams_ = 0; + + // nearly (if not all) happens multi-threaded, so we need some + // thread-locals to keep track in which module we are + static thread_local unsigned int currentModuleId_; + static thread_local std::string currentModuleLabel_; // only for printouts + + // TODO: how to treat subprocesses? + std::mutex moduleMutex_; + std::vector moduleIds_; // list of module ids that have registered something on the service + std::vector algoExecutionLocation_; +}; + +#endif diff --git a/HeterogeneousCore/AcceleratorService/plugins/BuildFile.xml b/HeterogeneousCore/AcceleratorService/plugins/BuildFile.xml new file mode 100644 index 0000000000000..3369da6bea0ed --- /dev/null +++ b/HeterogeneousCore/AcceleratorService/plugins/BuildFile.xml @@ -0,0 +1,4 @@ + + + + diff --git a/HeterogeneousCore/AcceleratorService/plugins/plugins.cc b/HeterogeneousCore/AcceleratorService/plugins/plugins.cc new file mode 100644 index 0000000000000..6a5440cf0b161 --- /dev/null +++ b/HeterogeneousCore/AcceleratorService/plugins/plugins.cc @@ -0,0 +1,4 @@ +#include "FWCore/ServiceRegistry/interface/ServiceMaker.h" +#include "HeterogeneousCore/AcceleratorService/interface/AcceleratorService.h" + +DEFINE_FWK_SERVICE(AcceleratorService); diff --git a/HeterogeneousCore/AcceleratorService/src/AcceleratorService.cc b/HeterogeneousCore/AcceleratorService/src/AcceleratorService.cc new file mode 100644 index 0000000000000..cb3bb51291992 --- /dev/null +++ b/HeterogeneousCore/AcceleratorService/src/AcceleratorService.cc @@ -0,0 +1,125 @@ +#include "HeterogeneousCore/AcceleratorService/interface/AcceleratorService.h" + +#include "FWCore/ServiceRegistry/interface/ActivityRegistry.h" +#include "FWCore/ServiceRegistry/interface/SystemBounds.h" +#include "DataFormats/Provenance/interface/ModuleDescription.h" + +#include "FWCore/MessageLogger/interface/MessageLogger.h" + +#include "FWCore/ServiceRegistry/interface/Service.h" +#include "HeterogeneousCore/CUDAServices/interface/CUDAService.h" + +#include +#include +#include +#include +#include +#include + +thread_local unsigned int AcceleratorService::currentModuleId_ = std::numeric_limits::max(); +thread_local std::string AcceleratorService::currentModuleLabel_ = ""; + +AcceleratorService::AcceleratorService(edm::ParameterSet const& iConfig, edm::ActivityRegistry& iRegistry) { + iRegistry.watchPreallocate( this, &AcceleratorService::preallocate ); + iRegistry.watchPreModuleConstruction (this, &AcceleratorService::preModuleConstruction ); + iRegistry.watchPostModuleConstruction(this, &AcceleratorService::postModuleConstruction ); +} + +// signals +void AcceleratorService::preallocate(edm::service::SystemBounds const& bounds) { + numberOfStreams_ = bounds.maxNumberOfStreams(); + LogTrace("AcceleratorService") << "AcceleratorService: number of streams " << numberOfStreams_; + // called after module construction, so initialize algoExecutionLocation_ here + algoExecutionLocation_.resize(moduleIds_.size()*numberOfStreams_); +} + +void AcceleratorService::preModuleConstruction(edm::ModuleDescription const& desc) { + currentModuleId_ = desc.id(); + currentModuleLabel_ = desc.moduleLabel(); +} +void AcceleratorService::postModuleConstruction(edm::ModuleDescription const& desc) { + currentModuleId_ = std::numeric_limits::max(); + currentModuleLabel_ = ""; +} + + +// actual functionality +AcceleratorService::Token AcceleratorService::book() { + if(currentModuleId_ == std::numeric_limits::max()) + throw cms::Exception("AcceleratorService") << "Calling AcceleratorService::register() outside of EDModule constructor is forbidden."; + + unsigned int index=0; + + std::lock_guard guard(moduleMutex_); + + auto found = std::find(moduleIds_.begin(), moduleIds_.end(), currentModuleId_); + if(found == moduleIds_.end()) { + index = moduleIds_.size(); + moduleIds_.push_back(currentModuleId_); + } + else { + index = std::distance(moduleIds_.begin(), found); + } + + LogTrace("AcceleratorService") << "AcceleratorService::book for module " << currentModuleId_ << " " << currentModuleLabel_ << " token id " << index << " moduleIds_.size() " << moduleIds_.size(); + + return Token(index); +} + +bool AcceleratorService::scheduleGPUMock(Token token, edm::StreamID streamID, edm::WaitingTaskWithArenaHolder waitingTaskHolder, accelerator::AlgoGPUMockBase& gpuMockAlgo) { + // Decide randomly whether to run on GPU or CPU to simulate scheduler decisions + std::random_device r; + std::mt19937 gen(r()); + auto dist1 = std::uniform_int_distribution<>(0, 10); // simulate the scheduler decision + if(dist1(gen) == 0) { + LogTrace("AcceleratorService") << " AcceleratorService token " << token.id() << " stream " << streamID << " GPUMock is disabled (by chance)"; + return false; + } + + LogTrace("AcceleratorService") << " AcceleratorService token " << token.id() << " stream " << streamID << " launching task on GPUMock"; + gpuMockAlgo.runGPUMock([waitingTaskHolder = std::move(waitingTaskHolder), + token = token, + streamID = streamID, + &location = algoExecutionLocation_[tokenStreamIdsToDataIndex(token.id(), streamID)] + ]() mutable { + LogTrace("AcceleratorService") << " AcceleratorService token " << token.id() << " stream " << streamID << " task finished on GPUMock"; + location = HeterogeneousDeviceId(HeterogeneousDevice::kGPUMock, 0); + waitingTaskHolder.doneWaiting(nullptr); + }); + LogTrace("AcceleratorService") << " AcceleratorService token " << token.id() << " stream " << streamID << " launched task on GPUMock asynchronously(?)"; + return true; +} + +bool AcceleratorService::scheduleGPUCuda(Token token, edm::StreamID streamID, edm::WaitingTaskWithArenaHolder waitingTaskHolder, accelerator::AlgoGPUCudaBase& gpuCudaAlgo) { + edm::Service cudaService; + if(!cudaService->enabled()) { + LogTrace("AcceleratorService") << " AcceleratorService token " << token.id() << " stream " << streamID << " CudaService is disabled"; + return false; + } + + LogTrace("AcceleratorService") << " AcceleratorService token " << token.id() << " stream " << streamID << " launching task on GPU"; + gpuCudaAlgo.runGPUCuda([waitingTaskHolder = std::move(waitingTaskHolder), + token = token, + streamID = streamID, + &location = algoExecutionLocation_[tokenStreamIdsToDataIndex(token.id(), streamID)] + ]() mutable { + LogTrace("AcceleratorService") << " AcceleratorService token " << token.id() << " stream " << streamID << " task finished on GPU"; + location = HeterogeneousDeviceId(HeterogeneousDevice::kGPUCuda, 0); + waitingTaskHolder.doneWaiting(nullptr); + }); + LogTrace("AcceleratorService") << " AcceleratorService token " << token.id() << " stream " << streamID << " launched task on GPU asynchronously(?)"; + return true; +} + +void AcceleratorService::scheduleCPU(Token token, edm::StreamID streamID, edm::WaitingTaskWithArenaHolder waitingTaskHolder, accelerator::AlgoCPUBase& cpuAlgo) { + LogTrace("AcceleratorService") << " AcceleratorService token " << token.id() << " stream " << streamID << " launching task on CPU"; + cpuAlgo.runCPU(); + algoExecutionLocation_[tokenStreamIdsToDataIndex(token.id(), streamID)] = HeterogeneousDeviceId(HeterogeneousDevice::kCPU, 0); + LogTrace("AcceleratorService") << " AcceleratorService token " << token.id() << " stream " << streamID << " task finished on CPU"; +} + + +unsigned int AcceleratorService::tokenStreamIdsToDataIndex(unsigned int tokenId, edm::StreamID streamId) const { + assert(streamId < numberOfStreams_); + return tokenId*numberOfStreams_ + streamId; +} diff --git a/HeterogeneousCore/AcceleratorService/test/BuildFile.xml b/HeterogeneousCore/AcceleratorService/test/BuildFile.xml new file mode 100644 index 0000000000000..7c4b325911ade --- /dev/null +++ b/HeterogeneousCore/AcceleratorService/test/BuildFile.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/HeterogeneousCore/AcceleratorService/test/TestAcceleratorServiceAnalyzer.cc b/HeterogeneousCore/AcceleratorService/test/TestAcceleratorServiceAnalyzer.cc new file mode 100644 index 0000000000000..16f21f267d3fb --- /dev/null +++ b/HeterogeneousCore/AcceleratorService/test/TestAcceleratorServiceAnalyzer.cc @@ -0,0 +1,56 @@ +#include "FWCore/Framework/interface/global/EDAnalyzer.h" +#include "FWCore/Framework/interface/Event.h" +#include "FWCore/Framework/interface/MakerMacros.h" + +#include "FWCore/ParameterSet/interface/ParameterSet.h" +#include "FWCore/Utilities/interface/transform.h" + +#include "HeterogeneousCore/Product/interface/HeterogeneousProduct.h" + +#include + +class TestAcceleratorServiceAnalyzer: public edm::global::EDAnalyzer<> { +public: + explicit TestAcceleratorServiceAnalyzer(edm::ParameterSet const& iConfig); + ~TestAcceleratorServiceAnalyzer() = default; + + static void fillDescriptions(edm::ConfigurationDescriptions& descriptions); + +private: + void analyze(edm::StreamID streamID, const edm::Event& iEvent, const edm::EventSetup& iSetup) const override; + + using InputType = HeterogeneousProductImpl, + heterogeneous::GPUCudaProduct>>; + std::string label_; + std::vector> srcTokens_; +}; + +TestAcceleratorServiceAnalyzer::TestAcceleratorServiceAnalyzer(const edm::ParameterSet& iConfig): + label_(iConfig.getParameter("@module_label")), + srcTokens_(edm::vector_transform(iConfig.getParameter >("src"), + [this](const edm::InputTag& tag) { + return consumes(tag); + })) +{} + +void TestAcceleratorServiceAnalyzer::fillDescriptions(edm::ConfigurationDescriptions& descriptions) { + edm::ParameterSetDescription desc; + desc.add>("src", std::vector{}); + descriptions.add("testAcceleratorServiceAnalyzer", desc); +} + +void TestAcceleratorServiceAnalyzer::analyze(edm::StreamID streamID, const edm::Event& iEvent, const edm::EventSetup& iSetup) const { + edm::Handle hinput; + int inp=0; + for(const auto& token: srcTokens_) { + iEvent.getByToken(token, hinput); + edm::LogPrint("TestAcceleratorServiceAnalyzer") << "Analyzer event " << iEvent.id().event() + << " stream " << streamID + << " label " << label_ + << " coll " << inp + << " result " << hinput->get().getProduct(); + ++inp; + } +} + +DEFINE_FWK_MODULE(TestAcceleratorServiceAnalyzer); diff --git a/HeterogeneousCore/AcceleratorService/test/TestAcceleratorServiceProducerGPU.cc b/HeterogeneousCore/AcceleratorService/test/TestAcceleratorServiceProducerGPU.cc new file mode 100644 index 0000000000000..1b6f1c00adb41 --- /dev/null +++ b/HeterogeneousCore/AcceleratorService/test/TestAcceleratorServiceProducerGPU.cc @@ -0,0 +1,177 @@ +#include "FWCore/Framework/interface/stream/EDProducer.h" + +#include "FWCore/Framework/interface/Event.h" +#include "FWCore/Framework/interface/MakerMacros.h" + +#include "FWCore/ParameterSet/interface/ParameterSet.h" + +#include "FWCore/ServiceRegistry/interface/Service.h" +#include "HeterogeneousCore/AcceleratorService/interface/AcceleratorService.h" +#include "HeterogeneousCore/CUDAServices/interface/CUDAService.h" + +#include "HeterogeneousCore/Product/interface/HeterogeneousProduct.h" + +#include "TestAcceleratorServiceProducerGPUHelpers.h" + +#include +#include +#include +#include + +#include +#include + +namespace { + using OutputType = HeterogeneousProductImpl, + heterogeneous::GPUCudaProduct>; + + class TestAlgo { + public: + TestAlgo() { + edm::Service cudaService; + if(cudaService->enabled()) { + gpuAlgo_ = std::make_unique(); + } + } + ~TestAlgo() = default; + + void setInput(const OutputType *input, unsigned int eventId, unsigned int streamId) { + input_ = input; + eventId_ = eventId; + streamId_ = streamId; + } + + void runCPU() { + std::random_device r; + std::mt19937 gen(r()); + auto dist = std::uniform_real_distribution<>(1.0, 3.0); + auto dur = dist(gen); + edm::LogPrint("TestAcceleratorServiceProducerGPU") << " Task (CPU) for event " << eventId_ << " in stream " << streamId_ << " will take " << dur << " seconds"; + std::this_thread::sleep_for(std::chrono::seconds(1)*dur); + + auto input = input_ ? input_->getProduct() : 0U; + + output_ = input + streamId_*100 + eventId_; + } + + void runGPUCuda(std::function callback) { + edm::LogPrint("TestAcceleratorServiceProducerGPU") << " Task (GPU) for event " << eventId_ << " in stream " << streamId_ << " running on GPU asynchronously"; + gpuOutput_ = gpuAlgo_->runAlgo(0, input_ ? input_->getProduct() : std::make_pair(nullptr, nullptr), + [callback,this](){ + edm::LogPrint("TestAcceleratorServiceProducerGPU") << " GPU kernel finished (in callback)"; + callback(); + }); + edm::LogPrint("TestAcceleratorServiceProducerGPU") << " Task (GPU) for event " << eventId_ << " in stream " << streamId_ << " launched"; + } + + auto makeTransfer() const { + return [this](const TestAcceleratorServiceProducerGPUTask::ResultTypeRaw& src, unsigned int& dst) { + edm::LogPrint("TestAcceleratorServiceProducerGPU") << " Task (GPU) for event " << eventId_ << " in stream " << streamId_ << " copying to CPU"; + dst = gpuAlgo_->getResult(src); + edm::LogPrint("TestAcceleratorServiceProducerGPU") << " GPU result " << dst; + }; + } + + unsigned int getOutput() const { return output_; } + TestAcceleratorServiceProducerGPUTask::ResultTypeRaw getGPUOutput() { + gpuAlgo_->release(); + return std::make_pair(gpuOutput_.first.get(), gpuOutput_.second.get()); + } + + private: + // input + const OutputType *input_ = nullptr; + unsigned int eventId_ = 0; + unsigned int streamId_ = 0; + + // GPU stuff + std::unique_ptr gpuAlgo_; + TestAcceleratorServiceProducerGPUTask::ResultType gpuOutput_; + + // output + unsigned int output_; + }; +} + +class TestAcceleratorServiceProducerGPU: public edm::stream::EDProducer { +public: + explicit TestAcceleratorServiceProducerGPU(edm::ParameterSet const& iConfig); + ~TestAcceleratorServiceProducerGPU() = default; + + static void fillDescriptions(edm::ConfigurationDescriptions& descriptions); + +private: + void acquire(const edm::Event& iEvent, const edm::EventSetup& iSetup, edm::WaitingTaskWithArenaHolder waitingTask) override; + void produce(edm::Event& iEvent, const edm::EventSetup& iSetup) override; + + std::string label_; + AcceleratorService::Token accToken_; + + edm::EDGetTokenT srcToken_; + bool showResult_; + + TestAlgo algo_; +}; + + +TestAcceleratorServiceProducerGPU::TestAcceleratorServiceProducerGPU(const edm::ParameterSet& iConfig): + label_(iConfig.getParameter("@module_label")), + accToken_(edm::Service()->book()), + showResult_(iConfig.getUntrackedParameter("showResult")) +{ + auto srcTag = iConfig.getParameter("src"); + if(!srcTag.label().empty()) { + srcToken_ = consumes(srcTag); + } + + produces(); +} + +void TestAcceleratorServiceProducerGPU::acquire(const edm::Event& iEvent, const edm::EventSetup& iSetup, edm::WaitingTaskWithArenaHolder waitingTaskHolder) { + const OutputType *input = nullptr; + if(!srcToken_.isUninitialized()) { + edm::Handle hin; + iEvent.getByToken(srcToken_, hin); + input = &(hin->get()); + } + + algo_.setInput(input, iEvent.id().event(), iEvent.streamID()); + + edm::LogPrint("TestAcceleratorServiceProducerGPU") << "TestAcceleratorServiceProducerGPU::acquire begin event " << iEvent.id().event() << " stream " << iEvent.streamID() << " label " << label_ << " input " << input; + edm::Service acc; + acc->schedule(accToken_, iEvent.streamID(), std::move(waitingTaskHolder), input, + accelerator::algoGPUCuda(&algo_), + accelerator::algoCPU(&algo_) + ); + + edm::LogPrint("TestAcceleratorServiceProducerGPU") << "TestAcceleratorServiceProducerGPU::acquire end event " << iEvent.id().event() << " stream " << iEvent.streamID() << " label " << label_; +} + +void TestAcceleratorServiceProducerGPU::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) { + edm::LogPrint("TestAcceleratorServiceProducerGPU") << "TestAcceleratorServiceProducerGPU::produce begin event " << iEvent.id().event() << " stream " << iEvent.streamID() << " label " << label_; + // TODO: the following if-else structure will be repeated in all + // heterogeneous modules. Ideas to move it to system + // * algorithms implement "putInEvent()" which takes care of inserting exactly that product to event + // * better ideas? + std::unique_ptr ret; + edm::Service acc; + if(acc->algoExecutionLocation(accToken_, iEvent.streamID()).deviceType() == HeterogeneousDevice::kGPUCuda) { + ret = std::make_unique(OutputType(heterogeneous::gpuCudaProduct(algo_.getGPUOutput()), algo_.makeTransfer())); + } + else { + ret = std::make_unique(OutputType(heterogeneous::cpuProduct(algo_.getOutput()))); + } + + unsigned int value = showResult_ ? ret->get().getProduct() : 0; + edm::LogPrint("TestAcceleratorServiceProducerGPU") << "TestAcceleratorServiceProducerGPU::produce end event " << iEvent.id().event() << " stream " << iEvent.streamID() << " label " << label_ << " result " << value; + iEvent.put(std::move(ret)); +} + +void TestAcceleratorServiceProducerGPU::fillDescriptions(edm::ConfigurationDescriptions& descriptions) { + edm::ParameterSetDescription desc; + desc.add("src", edm::InputTag()); + desc.addUntracked("showResult", false); + descriptions.add("testAcceleratorServiceProducerGPU", desc); +} + +DEFINE_FWK_MODULE(TestAcceleratorServiceProducerGPU); diff --git a/HeterogeneousCore/AcceleratorService/test/TestAcceleratorServiceProducerGPUHelpers.cu b/HeterogeneousCore/AcceleratorService/test/TestAcceleratorServiceProducerGPUHelpers.cu new file mode 100644 index 0000000000000..2409d321ef5a4 --- /dev/null +++ b/HeterogeneousCore/AcceleratorService/test/TestAcceleratorServiceProducerGPUHelpers.cu @@ -0,0 +1,209 @@ +#include "TestAcceleratorServiceProducerGPUHelpers.h" + +#include "FWCore/MessageLogger/interface/MessageLogger.h" + +#include "cuda/api_wrappers.h" +#include +#include + +// +// Vector Addition Kernel +// +namespace { + template + __global__ + void vectorAdd(const T *a, const T *b, T *c, int numElements) { + int i = blockIdx.x * blockDim.x + threadIdx.x; + if(i < numElements) { c[i] = a[i] + b[i]; } + } + + template + __global__ + void vectorProd(const T *a, const T *b, T *c, int numElements) { + int row = blockIdx.y*blockDim.y + threadIdx.y; + int col = blockIdx.x*blockDim.x + threadIdx.x; + + if(row < numElements && col < numElements) { + c[row*numElements + col] = a[row]*b[col]; + } + } + + template + __global__ + void matrixMul(const T *a, const T *b, T *c, int numElements) { + int row = blockIdx.y*blockDim.y + threadIdx.y; + int col = blockIdx.x*blockDim.x + threadIdx.x; + + if(row < numElements && col < numElements) { + T tmp = 0; + for(int i=0; i + __global__ + void matrixMulVector(const T *a, const T *b, T *c, int numElements) { + int row = blockIdx.y*blockDim.y + threadIdx.y; + + if(row < numElements) { + T tmp = 0; + for(int i=0; i(NUM_VALUES); + auto h_b = cuda::memory::host::make_unique(NUM_VALUES); + auto h_c = cuda::memory::host::make_unique(NUM_VALUES); + + for (auto i=0; i(current_device, NUM_VALUES); + auto d_b = cuda::memory::device::make_unique(current_device, NUM_VALUES); + auto d_c = cuda::memory::device::make_unique(current_device, NUM_VALUES); + + cuda::memory::async::copy(d_a.get(), h_a.get(), NUM_VALUES*sizeof(int), stream.id()); + cuda::memory::async::copy(d_b.get(), h_b.get(), NUM_VALUES*sizeof(int), stream.id()); + + int threadsPerBlock {256}; + int blocksPerGrid = (NUM_VALUES + threadsPerBlock - 1) / threadsPerBlock; + + vectorAdd<<>>(d_a.get(), d_b.get(), d_c.get(), NUM_VALUES); + /* + // doesn't work with header-only? + cuda::launch(vectorAdd, {blocksPerGrid, threadsPerBlock}, + d_a.get(), d_b.get(), d_c.get(), NUM_VALUES); + */ + + cuda::memory::async::copy(h_c.get(), d_c.get(), NUM_VALUES*sizeof(int), stream.id()); + + stream.synchronize(); + + int ret = 0; + for (auto i=0; i<10; i++) { + ret += h_c[i]; + } + + return ret; +} + +namespace { + constexpr int NUM_VALUES = 10000; +} + +TestAcceleratorServiceProducerGPUTask::TestAcceleratorServiceProducerGPUTask() { + auto current_device = cuda::device::current::get(); + streamPtr = std::make_unique>(current_device.create_stream(cuda::stream::implicitly_synchronizes_with_default_stream)); +} + +TestAcceleratorServiceProducerGPUTask::ResultType +TestAcceleratorServiceProducerGPUTask::runAlgo(int input, const ResultTypeRaw inputArrays, std::function callback) { + // First make the sanity check + if(inputArrays.first != nullptr) { + auto h_check = std::make_unique(NUM_VALUES); + cuda::memory::copy(h_check.get(), inputArrays.first, NUM_VALUES*sizeof(float)); + for(int i=0; i(NUM_VALUES); + h_b = cuda::memory::host::make_unique(NUM_VALUES); + + for (auto i=0; i(current_device, NUM_VALUES); + d_b = cuda::memory::device::make_unique(current_device, NUM_VALUES); + auto d_c = cuda::memory::device::make_unique(current_device, NUM_VALUES); + if(inputArrays.second != nullptr) { + d_d = cuda::memory::device::make_unique(current_device, NUM_VALUES); + } + + d_ma = cuda::memory::device::make_unique(current_device, NUM_VALUES*NUM_VALUES); + d_mb = cuda::memory::device::make_unique(current_device, NUM_VALUES*NUM_VALUES); + d_mc = cuda::memory::device::make_unique(current_device, NUM_VALUES*NUM_VALUES); + + auto& stream = *streamPtr; + cuda::memory::async::copy(d_a.get(), h_a.get(), NUM_VALUES*sizeof(float), stream.id()); + cuda::memory::async::copy(d_b.get(), h_b.get(), NUM_VALUES*sizeof(float), stream.id()); + + int threadsPerBlock {32}; + int blocksPerGrid = (NUM_VALUES + threadsPerBlock - 1) / threadsPerBlock; + + edm::LogPrint("TestAcceleratorServiceProducerGPU") << "--- launching kernels"; + vectorAdd<<>>(d_a.get(), d_b.get(), d_c.get(), NUM_VALUES); + if(inputArrays.second != nullptr) { + vectorAdd<<>>(inputArrays.second, d_c.get(), d_d.get(), NUM_VALUES); + std::swap(d_c, d_d); + } + + dim3 threadsPerBlock3{NUM_VALUES, NUM_VALUES}; + dim3 blocksPerGrid3{1,1}; + if(NUM_VALUES*NUM_VALUES > 32) { + threadsPerBlock3.x = 32; + threadsPerBlock3.y = 32; + blocksPerGrid3.x = ceil(double(NUM_VALUES)/double(threadsPerBlock3.x)); + blocksPerGrid3.y = ceil(double(NUM_VALUES)/double(threadsPerBlock3.y)); + } + vectorProd<<>>(d_a.get(), d_b.get(), d_ma.get(), NUM_VALUES); + vectorProd<<>>(d_a.get(), d_c.get(), d_mb.get(), NUM_VALUES); + matrixMul<<>>(d_ma.get(), d_mb.get(), d_mc.get(), NUM_VALUES); + + matrixMulVector<<>>(d_mc.get(), d_b.get(), d_c.get(), NUM_VALUES); + + edm::LogPrint("TestAcceleratorServiceProducerGPU") << "--- kernels launched, enqueueing the callback"; + stream.enqueue.callback([callback](cuda::stream::id_t stream_id, cuda::status_t status){ + callback(); + }); + + edm::LogPrint("TestAcceleratorServiceProducerGPU") << "--- finished, returning return pointer"; + return std::make_pair(std::move(d_a), std::move(d_c)); +} + +void TestAcceleratorServiceProducerGPUTask::release() { + // any way to automate the release? + edm::LogPrint("TestAcceleratorServiceProducerGPU") << "--- releasing temporary memory"; + h_a.reset(); + h_b.reset(); + d_b.reset(); + d_d.reset(); + d_ma.reset(); + d_mb.reset(); + d_mc.reset(); +} + +int TestAcceleratorServiceProducerGPUTask::getResult(const ResultTypeRaw& d_ac) { + auto h_c = cuda::memory::host::make_unique(NUM_VALUES); + cuda::memory::copy(h_c.get(), d_ac.second, NUM_VALUES*sizeof(int)); + + float ret = 0; + for (auto i=0; i(ret); +} + diff --git a/HeterogeneousCore/AcceleratorService/test/TestAcceleratorServiceProducerGPUHelpers.h b/HeterogeneousCore/AcceleratorService/test/TestAcceleratorServiceProducerGPUHelpers.h new file mode 100644 index 0000000000000..33b13cc1ee9e5 --- /dev/null +++ b/HeterogeneousCore/AcceleratorService/test/TestAcceleratorServiceProducerGPUHelpers.h @@ -0,0 +1,41 @@ +#ifndef HeterogeneousCore_AcceleratorService_TestAcceleratorServiceProducerGPUHelpers +#define HeterogeneousCore_AcceleratorService_TestAcceleratorServiceProducerGPUHelpers + +#include "cuda/api_wrappers.h" + +#include +#include +#include + +int TestAcceleratorServiceProducerGPUHelpers_simple_kernel(int input); + +class TestAcceleratorServiceProducerGPUTask { +public: + TestAcceleratorServiceProducerGPUTask(); + ~TestAcceleratorServiceProducerGPUTask() = default; + + using Ptr = cuda::memory::device::unique_ptr; + using PtrRaw = Ptr::pointer; + + using ResultType = std::pair; + using ResultTypeRaw = std::pair; + using ConstResultTypeRaw = std::pair; + + ResultType runAlgo(int input, const ResultTypeRaw inputArrays, std::function callback); + void release(); + int getResult(const ResultTypeRaw& d_ac); + +private: + std::unique_ptr> streamPtr; + + // temporary storage, need to be somewhere to allow async execution + cuda::memory::host::unique_ptr h_a; + cuda::memory::host::unique_ptr h_b; + cuda::memory::device::unique_ptr d_b; + cuda::memory::device::unique_ptr d_d; + cuda::memory::device::unique_ptr d_ma; + cuda::memory::device::unique_ptr d_mb; + cuda::memory::device::unique_ptr d_mc; +}; + +#endif diff --git a/HeterogeneousCore/AcceleratorService/test/TestAcceleratorServiceProducerGPUMock.cc b/HeterogeneousCore/AcceleratorService/test/TestAcceleratorServiceProducerGPUMock.cc new file mode 100644 index 0000000000000..0744cc898f20e --- /dev/null +++ b/HeterogeneousCore/AcceleratorService/test/TestAcceleratorServiceProducerGPUMock.cc @@ -0,0 +1,172 @@ +#include "FWCore/Framework/interface/stream/EDProducer.h" + +#include "FWCore/Framework/interface/Event.h" +#include "FWCore/Framework/interface/MakerMacros.h" + +#include "FWCore/ParameterSet/interface/ParameterSet.h" + +#include "HeterogeneousCore/AcceleratorService/interface/AcceleratorService.h" +#include "FWCore/ServiceRegistry/interface/Service.h" + +#include "HeterogeneousCore/Product/interface/HeterogeneousProduct.h" + +#include "tbb/concurrent_vector.h" + +#include +#include +#include +#include + +namespace { + // hack for GPU mock + tbb::concurrent_vector > pendingFutures; + + using OutputType = HeterogeneousProductImpl, + heterogeneous::GPUMockProduct >; + + class TestAlgo { + public: + TestAlgo() {} + ~TestAlgo() = default; + + void setInput(const OutputType *input, unsigned int eventId, unsigned int streamId) { + input_ = input; + eventId_ = eventId; + streamId_ = streamId; + } + + void runCPU() { + std::random_device r; + std::mt19937 gen(r()); + auto dist = std::uniform_real_distribution<>(1.0, 3.0); + auto dur = dist(gen); + edm::LogPrint("TestAcceleratorServiceProducerGPUMock") << " Task (CPU) for event " << eventId_ << " in stream " << streamId_ << " will take " << dur << " seconds"; + std::this_thread::sleep_for(std::chrono::seconds(1)*dur); + + auto input = input_ ? input_->getProduct() : 0U; + + output_ = input + streamId_*100 + eventId_; + } + + void runGPUMock(std::function callback) { + std::random_device r; + std::mt19937 gen(r()); + auto dist = std::uniform_real_distribution<>(0.1, 1.0); + auto dur = dist(gen); + edm::LogPrint("TestAcceleratorServiceProducerGPUMock") << " Task (GPU) for event " << eventId_ << " in stream " << streamId_ << " will take " << dur << " seconds"; + ranOnGPU_ = true; + auto input = input_ ? input_->getProduct() : 0U; + + auto ret = std::async(std::launch::async, + [this, dur, input, + callback = std::move(callback) + ](){ + std::this_thread::sleep_for(std::chrono::seconds(1)*dur); + gpuOutput_ = input + streamId_*100 + eventId_; + callback(); + }); + pendingFutures.push_back(std::move(ret)); + } + + auto makeTransfer() const { + return [this](const unsigned int& src, unsigned int& dst) { + edm::LogPrint("TestAcceleratorServiceProducerGPUMock") << " Task (GPU) for event " << eventId_ << " in stream " << streamId_ << " copying to CPU"; + dst = src; + }; + } + + bool ranOnGPU() const { return ranOnGPU_; } + unsigned int getOutput() const { return output_; } + unsigned int getGPUOutput() const { return gpuOutput_; } + + private: + // input + const OutputType *input_ = nullptr; + unsigned int eventId_ = 0; + unsigned int streamId_ = 0; + + bool ranOnGPU_ = false; + + // simulating GPU memory + unsigned int gpuOutput_; + + // output + unsigned int output_; + }; +} + +class TestAcceleratorServiceProducerGPUMock: public edm::stream::EDProducer { +public: + explicit TestAcceleratorServiceProducerGPUMock(edm::ParameterSet const& iConfig); + ~TestAcceleratorServiceProducerGPUMock() = default; + + static void fillDescriptions(edm::ConfigurationDescriptions& descriptions); + +private: + void acquire(const edm::Event& iEvent, const edm::EventSetup& iSetup, edm::WaitingTaskWithArenaHolder waitingTask) override; + void produce(edm::Event& iEvent, const edm::EventSetup& iSetup) override; + + std::string label_; + AcceleratorService::Token accToken_; + + edm::EDGetTokenT srcToken_; + + TestAlgo algo_; +}; + + +TestAcceleratorServiceProducerGPUMock::TestAcceleratorServiceProducerGPUMock(const edm::ParameterSet& iConfig): + label_(iConfig.getParameter("@module_label")), + accToken_(edm::Service()->book()) +{ + auto srcTag = iConfig.getParameter("src"); + if(!srcTag.label().empty()) { + srcToken_ = consumes(srcTag); + } + + produces(); +} + +void TestAcceleratorServiceProducerGPUMock::acquire(const edm::Event& iEvent, const edm::EventSetup& iSetup, edm::WaitingTaskWithArenaHolder waitingTaskHolder) { + const OutputType *input = nullptr; + if(!srcToken_.isUninitialized()) { + edm::Handle hin; + iEvent.getByToken(srcToken_, hin); + input = &(hin->get()); + } + + algo_.setInput(input, iEvent.id().event(), iEvent.streamID()); + + edm::LogPrint("TestAcceleratorServiceProducerGPUMock") << "TestAcceleratorServiceProducerGPUMock::acquire begin event " << iEvent.id().event() << " stream " << iEvent.streamID() << " label " << label_ << " input " << input; + edm::Service acc; + acc->schedule(accToken_, iEvent.streamID(), std::move(waitingTaskHolder), input, + accelerator::algoGPUMock(&algo_), + accelerator::algoCPU(&algo_) + ); + edm::LogPrint("TestAcceleratorServiceProducerGPUMock") << "TestAcceleratorServiceProducerGPUMock::acquire end event " << iEvent.id().event() << " stream " << iEvent.streamID() << " label " << label_; +} + +void TestAcceleratorServiceProducerGPUMock::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) { + edm::LogPrint("TestAcceleratorServiceProducerGPUMock") << "TestAcceleratorServiceProducerGPUMock::produce begin event " << iEvent.id().event() << " stream " << iEvent.streamID() << " label " << label_; + std::unique_ptr ret; + unsigned int value = 0; + if(algo_.ranOnGPU()) { + ret = std::make_unique(OutputType(heterogeneous::gpuMockProduct(algo_.getGPUOutput()), algo_.makeTransfer())); + value = ret->get().getProduct(); + } + else { + ret = std::make_unique(OutputType(heterogeneous::cpuProduct(algo_.getOutput()))); + value = ret->get().getProduct(); + } + + edm::LogPrint("TestAcceleratorServiceProducerGPUMock") << "TestAcceleratorServiceProducerGPUMock::produce end event " << iEvent.id().event() << " stream " << iEvent.streamID() << " label " << label_ << " result " << value; + iEvent.put(std::move(ret)); +} + +void TestAcceleratorServiceProducerGPUMock::fillDescriptions(edm::ConfigurationDescriptions& descriptions) { + edm::ParameterSetDescription desc; + desc.add("src", edm::InputTag()); + descriptions.add("testAcceleratorServiceProducerGPUMock", desc); +} + +DEFINE_FWK_MODULE(TestAcceleratorServiceProducerGPUMock); diff --git a/HeterogeneousCore/AcceleratorService/test/testGPUMock_cfg.py b/HeterogeneousCore/AcceleratorService/test/testGPUMock_cfg.py new file mode 100644 index 0000000000000..6d3ba056cf3bc --- /dev/null +++ b/HeterogeneousCore/AcceleratorService/test/testGPUMock_cfg.py @@ -0,0 +1,31 @@ +import FWCore.ParameterSet.Config as cms + +process = cms.Process("Test") +process.load("FWCore.MessageService.MessageLogger_cfi") + +process.source = cms.Source("EmptySource") + +process.maxEvents = cms.untracked.PSet( input = cms.untracked.int32(10) ) + +process.options = cms.untracked.PSet( +# numberOfThreads = cms.untracked.uint32(4), + numberOfStreams = cms.untracked.uint32(0) +) + + +#process.Tracer = cms.Service("Tracer") +process.AcceleratorService = cms.Service("AcceleratorService") +process.prod1 = cms.EDProducer('TestAcceleratorServiceProducerGPUMock') +process.prod2= cms.EDProducer('TestAcceleratorServiceProducerGPUMock', + src = cms.InputTag("prod1") +) + +#process.t = cms.Task(process.prod1, process.prod2) + +process.eca = cms.EDAnalyzer("EventContentAnalyzer", + getData = cms.untracked.bool(True), + getDataForModuleLabels = cms.untracked.vstring("producer"), + listContent = cms.untracked.bool(True), +) +process.p = cms.Path(process.prod1+process.prod2)#+process.eca) +#process.p.associate(process.t) diff --git a/HeterogeneousCore/AcceleratorService/test/testGPU_cfg.py b/HeterogeneousCore/AcceleratorService/test/testGPU_cfg.py new file mode 100644 index 0000000000000..d6ebf1eae0308 --- /dev/null +++ b/HeterogeneousCore/AcceleratorService/test/testGPU_cfg.py @@ -0,0 +1,32 @@ +import FWCore.ParameterSet.Config as cms + +process = cms.Process("Test") +process.load("FWCore.MessageService.MessageLogger_cfi") + +process.source = cms.Source("EmptySource") + +process.maxEvents = cms.untracked.PSet( input = cms.untracked.int32(10) ) + +process.options = cms.untracked.PSet( +# numberOfThreads = cms.untracked.uint32(4), + numberOfStreams = cms.untracked.uint32(0) +) + + +#process.Tracer = cms.Service("Tracer") +process.AcceleratorService = cms.Service("AcceleratorService") +process.CUDAService = cms.Service("CUDAService") +process.prod1 = cms.EDProducer('TestAcceleratorServiceProducerGPU') +process.prod2 = cms.EDProducer('TestAcceleratorServiceProducerGPU', + src = cms.InputTag("prod1"), +) +process.prod3 = cms.EDProducer('TestAcceleratorServiceProducerGPU', + src = cms.InputTag("prod1"), +) +process.ana = cms.EDAnalyzer("TestAcceleratorServiceAnalyzer", + src = cms.VInputTag("prod2", "prod3") +) + +process.t = cms.Task(process.prod1, process.prod2, process.prod3) +process.p = cms.Path(process.ana) +process.p.associate(process.t) diff --git a/HeterogeneousCore/CUDAServices/BuildFile.xml b/HeterogeneousCore/CUDAServices/BuildFile.xml new file mode 100644 index 0000000000000..e970a89fea444 --- /dev/null +++ b/HeterogeneousCore/CUDAServices/BuildFile.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/HeterogeneousCore/CUDAServices/interface/CUDAService.h b/HeterogeneousCore/CUDAServices/interface/CUDAService.h new file mode 100644 index 0000000000000..11c8333254007 --- /dev/null +++ b/HeterogeneousCore/CUDAServices/interface/CUDAService.h @@ -0,0 +1,40 @@ +#ifndef HeterogeneousCore_CUDAServices_CUDAService_h +#define HeterogeneousCore_CUDAServices_CUDAService_h + +#include +#include + +namespace edm { + class ParameterSet; + class ActivityRegistry; + class ConfigurationDescriptions; +} + +/** + * TODO: + * - CUDA stream management? + * * Not really needed until we want to pass CUDA stream objects from one module to another + * * Which is not really needed until we want to go for "streaming mode" + * * Until that framework's inter-module synchronization is safe (but not necessarily optimal) + * - Management of (preallocated) memory? + */ +class CUDAService { +public: + CUDAService(edm::ParameterSet const& iConfig, edm::ActivityRegistry& iRegistry); + + static void fillDescriptions(edm::ConfigurationDescriptions & descriptions); + + bool enabled() const { return enabled_; } + + int numberOfDevices() const { return numberOfDevices_; } + + // major, minor + std::pair computeCapability(int device) { return computeCapabilities_.at(device); } + +private: + int numberOfDevices_ = 0; + std::vector > computeCapabilities_; + bool enabled_ = false; +}; + +#endif diff --git a/HeterogeneousCore/CUDAServices/plugins/BuildFile.xml b/HeterogeneousCore/CUDAServices/plugins/BuildFile.xml index afcf86afdef75..7f213ec8fd987 100644 --- a/HeterogeneousCore/CUDAServices/plugins/BuildFile.xml +++ b/HeterogeneousCore/CUDAServices/plugins/BuildFile.xml @@ -12,6 +12,7 @@ + diff --git a/HeterogeneousCore/CUDAServices/plugins/plugins.cc b/HeterogeneousCore/CUDAServices/plugins/plugins.cc new file mode 100644 index 0000000000000..d8aefa42e9c99 --- /dev/null +++ b/HeterogeneousCore/CUDAServices/plugins/plugins.cc @@ -0,0 +1,4 @@ +#include "FWCore/ServiceRegistry/interface/ServiceMaker.h" +#include "HeterogeneousCore/CUDAServices/interface/CUDAService.h" + +DEFINE_FWK_SERVICE(CUDAService); diff --git a/HeterogeneousCore/CUDAServices/src/CUDAService.cc b/HeterogeneousCore/CUDAServices/src/CUDAService.cc new file mode 100644 index 0000000000000..4505b8ea6c3c4 --- /dev/null +++ b/HeterogeneousCore/CUDAServices/src/CUDAService.cc @@ -0,0 +1,88 @@ +#include "HeterogeneousCore/CUDAServices/interface/CUDAService.h" + +#include "FWCore/MessageLogger/interface/MessageLogger.h" +#include "FWCore/ParameterSet/interface/ParameterSet.h" +#include "FWCore/ParameterSet/interface/ParameterSetDescription.h" +#include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h" + +#include + +#include + +CUDAService::CUDAService(edm::ParameterSet const& iConfig, edm::ActivityRegistry& iRegistry) { + bool configEnabled = iConfig.getUntrackedParameter("enabled"); + if(!configEnabled) { + edm::LogInfo("CUDAService") << "CUDAService disabled by configuration"; + } + + // First check if we can load the cuda runtime library + void *cudaLib = dlopen("libcuda.so", RTLD_NOW); + if(cudaLib == nullptr) { + edm::LogWarning("CUDAService") << "Failed to dlopen libcuda.so, disabling CUDAService"; + return; + } + edm::LogInfo("CUDAService") << "Found libcuda.so"; + + // Find functions + auto cuInit = reinterpret_cast(dlsym(cudaLib, "cuInit")); + if(cuInit == nullptr) { + edm::LogWarning("CUDAService") << "Failed to find cuInit from libcuda.so, disabling CUDAService"; + return; + } + edm::LogInfo("CUDAService") << "Found cuInit from libcuda"; + + auto cuDeviceGetCount = reinterpret_cast(dlsym(cudaLib, "cuDeviceGetCount")); + if(cuDeviceGetCount == nullptr) { + edm::LogWarning("CUDAService") << "Failed to find cuDeviceGetCount from libcuda.so, disabling CUDAService"; + return; + } + edm::LogInfo("CUDAService") << "Found cuDeviceGetCount from libcuda"; + + auto cuDeviceComputeCapability = reinterpret_cast(dlsym(cudaLib, "cuDeviceComputeCapability")); + if(cuDeviceComputeCapability == nullptr) { + edm::LogWarning("CUDAService") << "Failed to find cuDeviceComputeCapability from libcuda.so, disabling CUDAService"; + return; + } + edm::LogInfo("CUDAService") << "Found cuDeviceComputeCapability"; + + // Then call functions + auto ret = cuInit(0); + if(CUDA_SUCCESS != ret) { + edm::LogWarning("CUDAService") << "cuInit failed, return value " << ret << ", disabling CUDAService"; + return; + } + edm::LogInfo("CUDAService") << "cuInit succeeded"; + + ret = cuDeviceGetCount(&numberOfDevices_); + if(CUDA_SUCCESS != ret) { + edm::LogWarning("CUDAService") << "cuDeviceGetCount failed, return value " << ret << ", disabling CUDAService"; + return; + } + edm::LogInfo("CUDAService") << "cuDeviceGetCount succeeded, found " << numberOfDevices_ << " devices"; + if(numberOfDevices_ < 1) { + edm::LogWarning("CUDAService") << "Number of devices < 1, disabling CUDAService"; + return; + } + + computeCapabilities_.reserve(numberOfDevices_); + for(int i=0; i("enabled", true); + + descriptions.add("CUDAService", desc); +} diff --git a/HeterogeneousCore/Product/BuildFile.xml b/HeterogeneousCore/Product/BuildFile.xml new file mode 100644 index 0000000000000..0e6323ac9009b --- /dev/null +++ b/HeterogeneousCore/Product/BuildFile.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/HeterogeneousCore/Product/interface/HeterogeneousProduct.h b/HeterogeneousCore/Product/interface/HeterogeneousProduct.h new file mode 100644 index 0000000000000..b7dc32ed545e9 --- /dev/null +++ b/HeterogeneousCore/Product/interface/HeterogeneousProduct.h @@ -0,0 +1,366 @@ +#ifndef HeterogeneousCore_Product_interface_HeterogeneousData_h +#define HeterogeneousCore_Product_interface_HeterogeneousData_h + +#include "FWCore/Utilities/interface/Exception.h" + +#include +#include +#include +#include + +/** + * Enumerator for heterogeneous device types + */ +enum class HeterogeneousDevice { + kCPU = 0, + kGPUMock, + kGPUCuda, + kSize +}; + +/** + * Class to represent an identifier for a heterogeneous device. + * Contains device type and an integer identifier. + * + * TODO: actually make use of this class elsewhere. + */ +class HeterogeneousDeviceId { +public: + HeterogeneousDeviceId(): + deviceType_(HeterogeneousDevice::kCPU), + deviceId_(0) + {} + explicit HeterogeneousDeviceId(HeterogeneousDevice device, unsigned int id=0): + deviceType_(device), deviceId_(id) + {} + + HeterogeneousDevice deviceType() const { return deviceType_; } + + unsigned int deviceId() const { return deviceId_; } +private: + HeterogeneousDevice deviceType_; + unsigned int deviceId_; +}; + +namespace heterogeneous { + /** + * The *Product templates are to specify in a generic way which + * data locations and device-specific types the + * HeterogeneousProduct<> supports. + * + * Helper functions are provided to infer the type from input + * arguments to ease the construction of HeterogeneousProduct<> + * + * TODO: try to simplify... + */ + + // Mapping from *Product to HeterogeneousDevice enumerator + template struct ProductToEnum {}; + + // CPU + template + class CPUProduct { + public: + using DataType = T; + static constexpr const HeterogeneousDevice tag = HeterogeneousDevice::kCPU; + + CPUProduct() = default; + CPUProduct(T&& data): data_(std::move(data)) {} + + const T& product() const { return data_; } + T& product() { return data_; } + private: + T data_; + }; + template struct ProductToEnum> { static constexpr const HeterogeneousDevice value = HeterogeneousDevice::kCPU; }; + template auto cpuProduct(T&& data) { return CPUProduct(std::move(data)); } + + // GPU Mock + template + class GPUMockProduct { + public: + using DataType = T; + static constexpr const HeterogeneousDevice tag = HeterogeneousDevice::kGPUMock; + + GPUMockProduct() = default; + GPUMockProduct(T&& data): data_(std::move(data)) {} + + const T& product() const { return data_; } + T& product() { return data_; } +private: + T data_; + }; + template struct ProductToEnum> { static constexpr const HeterogeneousDevice value = HeterogeneousDevice::kGPUMock; }; + template auto gpuMockProduct(T&& data) { return GPUMockProduct(std::move(data)); } + + // GPU Cuda + template + class GPUCudaProduct { + public: + using DataType = T; + static constexpr const HeterogeneousDevice tag = HeterogeneousDevice::kGPUCuda; + + GPUCudaProduct() = default; + GPUCudaProduct(T&& data): data_(std::move(data)) {} + + const T& product() const { return data_; } + T& product() { return data_; } +private: + T data_; + }; + template struct ProductToEnum> { static constexpr const HeterogeneousDevice value = HeterogeneousDevice::kGPUCuda; }; + template auto gpuCudaProduct(T&& data) { return GPUCudaProduct(std::move(data)); } + + /** + * Below are various helpers + * + * TODO: move to an inner namespace (e.g. detail, impl)?, possibly to a separate file + */ + + // Empty struct for tuple defitionons + struct Empty {}; + + // Metaprogram to return the *Product type for a given enumerator if it exists in Types... pack + template + struct IfInPack; + + template + struct IfInPack { + using type = std::conditional_t::type >; + }; + template + struct IfInPack { + using type = Empty; + }; + + template + using IfInPack_t = typename IfInPack::type; + + // Metaprogram to construct the callback function type for device->CPU transfers + template + struct CallBackType { + using type = std::function; + }; + template + struct CallBackType { + using type = Empty; + }; + template + using CallBackType_t = typename CallBackType::type; + + // Metaprogram to get an element from a tuple, or Empty if out of bounds + template + struct TupleElement { + using type = Empty; + }; + template + struct TupleElement::value)>::type> { + using type = std::tuple_element_t; + }; + template + using TupleElement_t = typename TupleElement::type; + + + // Metaprogram to loop over two tuples and a bitset (of equal + // length), and if bitset is set to true call a function from one of + // the tuples with arguments from the second tuple + template + struct CallFunctionIf { + static bool call(const FunctionTuple& functionTuple, ProductTuple& productTuple, const BitSet& bitSet) { + constexpr const auto index = bitSet.size()-sizeMinusIndex; + if(bitSet[index]) { + const auto func = std::get(functionTuple); + if(!func) { + throw cms::Exception("Assert") << "Attempted to call transfer-to-CPU function for device " << index << " but the std::function object is not valid!"; + } + func(std::get(productTuple).product(), std::get<0>(productTuple).product()); + return true; + } + return CallFunctionIf, sizeMinusIndex-1>::call(functionTuple, productTuple, bitSet); + } + }; + template + struct CallFunctionIf { + static bool call(const FunctionTuple& functionTuple, ProductTuple& productTuple, const BitSet& bitSet) { + constexpr const auto index = bitSet.size()-sizeMinusIndex; + return CallFunctionIf, sizeMinusIndex-1>::call(functionTuple, productTuple, bitSet); + } + }; + template + struct CallFunctionIf { + static bool call(const FunctionTuple& functionTuple, ProductTuple& productTuple, const BitSet& bitSet) { + return false; + } + }; + + // Metaprogram to specialize getProduct() for CPU + template + struct GetOrTransferProduct { + template + static const auto& getProduct(const FunctionTuple& functionTuple, ProductTuple& productTuple, const BitSet& bitSet) { + constexpr const auto index = static_cast(device); + if(!bitSet[index]) { + throw cms::Exception("LogicError") << "Called getProduct() for device " << index << " but the data is not there! Location bitfield is " << bitSet.to_string(); + } + return std::get(productTuple).product(); + } + }; + + template <> + struct GetOrTransferProduct { + template + static const auto& getProduct(const FunctionTuple& functionTuple, ProductTuple& productTuple, BitSet& bitSet) { + constexpr const auto index = static_cast(HeterogeneousDevice::kCPU); + if(!bitSet[index]) { + auto found = CallFunctionIf, bitSet.size()-1>::call(functionTuple, productTuple, bitSet); + if(!found) { + throw cms::Exception("LogicError") << "Attempted to transfer data to CPU, but the data is not available anywhere! Location bitfield is " << bitSet.to_string(); + } + } + bitSet.set(index); + return std::get(productTuple).product(); + } + }; +} + +// For type erasure to ease dictionary generation +class HeterogeneousProductBase { +public: + virtual ~HeterogeneousProductBase() = 0; +}; + +/** + * Generic data product for holding data on CPU or a heterogeneous + * device which keeps track where the data is. Data can be + * automatically transferred from the device to CPU when data is + * requested on CPU but does not exist there (yet). + * + * TODO: + * * extend transfers to device->device (within a single device type) + */ +template +class HeterogeneousProductImpl: public HeterogeneousProductBase { + using ProductTuple = std::tuple, + heterogeneous::IfInPack_t + >; + using TransferToCPUTuple = std::tuple(HeterogeneousDevice::kGPUMock), ProductTuple>>, + heterogeneous::CallBackType_t(HeterogeneousDevice::kGPUCuda), ProductTuple>> + >; + using BitSet = std::bitset(HeterogeneousDevice::kSize)>; + + // Some sanity checks + static_assert(std::tuple_size::value == std::tuple_size::value, "Size mismatch"); + static_assert(std::tuple_size::value == static_cast(HeterogeneousDevice::kSize), "Size mismatch"); +public: + HeterogeneousProductImpl() = default; + ~HeterogeneousProductImpl() override = default; + HeterogeneousProductImpl(HeterogeneousProductImpl&& other) { + std::lock(mutex_, other.mutex_); + std::lock_guard lk1(mutex_, std::adopt_lock); + std::lock_guard lk2(other.mutex_, std::adopt_lock); + + products_ = std::move(other.products_); + transfersToCPU_ = std::move(other.transfersToCPU_); + location_ = std::move(other.location_); + } + HeterogeneousProductImpl& operator=(HeterogeneousProductImpl&& other) { + std::lock(mutex_, other.mutex_); + std::lock_guard lk1(mutex_, std::adopt_lock); + std::lock_guard lk2(other.mutex_, std::adopt_lock); + + products_ = std::move(other.products_); + transfersToCPU_ = std::move(other.transfersToCPU_); + location_ = std::move(other.location_); + return *this; + } + + // Constructor for CPU data + HeterogeneousProductImpl(CPUProduct&& data) { + constexpr const auto index = static_cast(HeterogeneousDevice::kCPU); + std::get(products_) = std::move(data); + location_.set(index); + } + + /** + * Generic constructor for device data. A function to transfer the + * data to CPU has to be provided as well. + */ + template + HeterogeneousProductImpl(H&& data, F transferToCPU) { + constexpr const auto index = static_cast(heterogeneous::ProductToEnum >::value); + static_assert(!std::is_same, + heterogeneous::Empty>::value, + "This HeterogeneousProduct does not support this type"); + std::get(products_) = std::move(data); + std::get(transfersToCPU_) = std::move(transferToCPU); + location_.set(index); + } + + bool isProductOn(HeterogeneousDevice loc) const { + // should this be protected with the mutex? + return location_[static_cast(loc)]; + } + + template + const auto& getProduct() const { + constexpr const auto index = static_cast(device); + static_assert(!std::is_same, + heterogeneous::Empty>::value, + "This HeterogeneousProduct does not support this type"); + + // Locking the mutex here is quite "conservative" + // Writes happen only if the "device" is CPU and the data is elsewhere + std::lock_guard lk(mutex_); + return heterogeneous::GetOrTransferProduct::getProduct(transfersToCPU_, products_, location_); + } + +private: + mutable std::mutex mutex_; + mutable ProductTuple products_; + TransferToCPUTuple transfersToCPU_; + mutable BitSet location_; +}; + +class HeterogeneousProduct { +public: + HeterogeneousProduct() = default; + + template + HeterogeneousProduct(HeterogeneousProductImpl&& impl) { + //impl_.reset(new HeterogeneousProductImpl(std::move(impl))); + //std::make_unique>(std::move(impl))) + //impl_ = std::make_unique>(std::move(impl)); + impl_.reset(static_cast(new HeterogeneousProductImpl(std::move(impl)))); + } + + HeterogeneousProduct(HeterogeneousProduct&&) = default; + HeterogeneousProduct& operator=(HeterogeneousProduct&&) = default; + + ~HeterogeneousProduct() = default; + + bool isNonnull() const { return static_cast(impl_); } + bool isNull() const { return !isNonnull(); } + + template + const T& get() const { + if(isNull()) + throw cms::Exception("LogicError") << "HerogeneousProduct is null"; + + const auto& ref = *impl_; + if(typeid(T) != typeid(ref)) { + throw cms::Exception("LogicError") << "Trying to get HeterogeneousProductImpl " << typeid(T).name() << " but the product contains " << typeid(ref).name(); + } + return static_cast(*impl_); + } +private: + std::unique_ptr impl_; +}; + +#endif diff --git a/HeterogeneousCore/Product/src/HeterogeneousProduct.cc b/HeterogeneousCore/Product/src/HeterogeneousProduct.cc new file mode 100644 index 0000000000000..98e18d8596dc0 --- /dev/null +++ b/HeterogeneousCore/Product/src/HeterogeneousProduct.cc @@ -0,0 +1,4 @@ +#include "HeterogeneousCore/Product/interface/HeterogeneousProduct.h" + +HeterogeneousProductBase::~HeterogeneousProductBase() {} + diff --git a/HeterogeneousCore/Product/src/classes.h b/HeterogeneousCore/Product/src/classes.h new file mode 100644 index 0000000000000..011e2c8f2d241 --- /dev/null +++ b/HeterogeneousCore/Product/src/classes.h @@ -0,0 +1,9 @@ +#include "DataFormats/Common/interface/Wrapper.h" +#include "HeterogeneousCore/Product/interface/HeterogeneousProduct.h" +#include + +namespace { + struct dictionary { + HeterogeneousProduct hp; + }; +} diff --git a/HeterogeneousCore/Product/src/classes_def.xml b/HeterogeneousCore/Product/src/classes_def.xml new file mode 100644 index 0000000000000..3e4263b7905f6 --- /dev/null +++ b/HeterogeneousCore/Product/src/classes_def.xml @@ -0,0 +1,4 @@ + + + + diff --git a/HeterogeneousCore/Product/test/BuildFile.xml b/HeterogeneousCore/Product/test/BuildFile.xml new file mode 100644 index 0000000000000..dbcab64bc0023 --- /dev/null +++ b/HeterogeneousCore/Product/test/BuildFile.xml @@ -0,0 +1,4 @@ + + + + diff --git a/HeterogeneousCore/Product/test/testHeterogeneousProduct.cpp b/HeterogeneousCore/Product/test/testHeterogeneousProduct.cpp new file mode 100644 index 0000000000000..2d89a88f5c7f4 --- /dev/null +++ b/HeterogeneousCore/Product/test/testHeterogeneousProduct.cpp @@ -0,0 +1,281 @@ +#include + +#include "HeterogeneousCore/Product/interface/HeterogeneousProduct.h" + +class testHeterogeneousProduct: public CppUnit::TestFixture { + CPPUNIT_TEST_SUITE(testHeterogeneousProduct); + CPPUNIT_TEST(testDefault); + CPPUNIT_TEST(testCPU); + CPPUNIT_TEST(testGPUMock); + CPPUNIT_TEST(testGPUCuda); + CPPUNIT_TEST(testGPUAll); + CPPUNIT_TEST(testMoveGPUMock); + CPPUNIT_TEST(testMoveGPUCuda); + CPPUNIT_TEST(testProduct); + CPPUNIT_TEST_SUITE_END(); +public: + void setUp() {} + void tearDown() {} + + void testDefault(); + void testCPU(); + void testGPUMock(); + void testGPUCuda(); + void testGPUAll(); + void testMoveGPUMock(); + void testMoveGPUCuda(); + void testProduct(); +}; + +///registration of the test so that the runner can find it +CPPUNIT_TEST_SUITE_REGISTRATION(testHeterogeneousProduct); + +void testHeterogeneousProduct::testDefault() { + HeterogeneousProductImpl, + heterogeneous::GPUMockProduct + > prod; + + CPPUNIT_ASSERT(prod.isProductOn(HeterogeneousDevice::kCPU) == false); + CPPUNIT_ASSERT(prod.isProductOn(HeterogeneousDevice::kGPUMock) == false); + CPPUNIT_ASSERT(prod.isProductOn(HeterogeneousDevice::kGPUCuda) == false); + + CPPUNIT_ASSERT_THROW(prod.getProduct(), cms::Exception); + CPPUNIT_ASSERT_THROW(prod.getProduct(), cms::Exception); +} + +void testHeterogeneousProduct::testCPU() { + HeterogeneousProductImpl, + heterogeneous::GPUMockProduct + > prod{heterogeneous::cpuProduct(5)}; + + CPPUNIT_ASSERT(prod.isProductOn(HeterogeneousDevice::kCPU) == true); + CPPUNIT_ASSERT(prod.isProductOn(HeterogeneousDevice::kGPUMock) == false); + CPPUNIT_ASSERT(prod.isProductOn(HeterogeneousDevice::kGPUCuda) == false); + + CPPUNIT_ASSERT(prod.getProduct() == 5); + CPPUNIT_ASSERT_THROW(prod.getProduct(), cms::Exception); +} + +void testHeterogeneousProduct::testGPUMock() { + HeterogeneousProductImpl, + heterogeneous::GPUMockProduct + > prod{heterogeneous::gpuMockProduct(5), + [](const int& src, int& dst) { dst = src; }}; + + CPPUNIT_ASSERT(prod.isProductOn(HeterogeneousDevice::kCPU) == false); + CPPUNIT_ASSERT(prod.isProductOn(HeterogeneousDevice::kGPUMock) == true); + CPPUNIT_ASSERT(prod.isProductOn(HeterogeneousDevice::kGPUCuda) == false); + + CPPUNIT_ASSERT(prod.getProduct() == 5); + + // Automatic transfer + CPPUNIT_ASSERT(prod.getProduct() == 5); + CPPUNIT_ASSERT(prod.isProductOn(HeterogeneousDevice::kCPU) == true); + CPPUNIT_ASSERT(prod.isProductOn(HeterogeneousDevice::kGPUMock) == true); + CPPUNIT_ASSERT(prod.isProductOn(HeterogeneousDevice::kGPUCuda) == false); + CPPUNIT_ASSERT(prod.getProduct() == 5); +} + +void testHeterogeneousProduct::testGPUCuda() { + HeterogeneousProductImpl, + heterogeneous::GPUCudaProduct + > prod{heterogeneous::gpuCudaProduct(5), + [](const int& src, int& dst) { dst = src; }}; + + CPPUNIT_ASSERT(prod.isProductOn(HeterogeneousDevice::kCPU) == false); + CPPUNIT_ASSERT(prod.isProductOn(HeterogeneousDevice::kGPUMock) == false); + CPPUNIT_ASSERT(prod.isProductOn(HeterogeneousDevice::kGPUCuda) == true); + + CPPUNIT_ASSERT(prod.getProduct() == 5); + + // Automatic transfer + CPPUNIT_ASSERT(prod.getProduct() == 5); + CPPUNIT_ASSERT(prod.isProductOn(HeterogeneousDevice::kCPU) == true); + CPPUNIT_ASSERT(prod.isProductOn(HeterogeneousDevice::kGPUMock) == false); + CPPUNIT_ASSERT(prod.isProductOn(HeterogeneousDevice::kGPUCuda) == true); + CPPUNIT_ASSERT(prod.getProduct() == 5); +} + +void testHeterogeneousProduct::testGPUAll() { + // Data initially on CPU + HeterogeneousProductImpl, + heterogeneous::GPUMockProduct, + heterogeneous::GPUCudaProduct + > prod1{heterogeneous::cpuProduct(5)}; + + CPPUNIT_ASSERT(prod1.isProductOn(HeterogeneousDevice::kCPU) == true); + CPPUNIT_ASSERT(prod1.isProductOn(HeterogeneousDevice::kGPUMock) == false); + CPPUNIT_ASSERT(prod1.isProductOn(HeterogeneousDevice::kGPUCuda) == false); + + CPPUNIT_ASSERT(prod1.getProduct() == 5); + CPPUNIT_ASSERT_THROW(prod1.getProduct(), cms::Exception); + CPPUNIT_ASSERT_THROW(prod1.getProduct(), cms::Exception); + + // Data initially on GPUMock + HeterogeneousProductImpl, + heterogeneous::GPUMockProduct, + heterogeneous::GPUCudaProduct + > prod2{heterogeneous::gpuMockProduct(5), + [](const int& src, int& dst) { dst = src; }}; + + CPPUNIT_ASSERT(prod2.isProductOn(HeterogeneousDevice::kCPU) == false); + CPPUNIT_ASSERT(prod2.isProductOn(HeterogeneousDevice::kGPUMock) == true); + CPPUNIT_ASSERT(prod2.isProductOn(HeterogeneousDevice::kGPUCuda) == false); + + CPPUNIT_ASSERT(prod2.getProduct() == 5); + CPPUNIT_ASSERT_THROW(prod2.getProduct(), cms::Exception); + + // Automatic transfer + CPPUNIT_ASSERT(prod2.getProduct() == 5); + CPPUNIT_ASSERT(prod2.isProductOn(HeterogeneousDevice::kCPU) == true); + CPPUNIT_ASSERT(prod2.isProductOn(HeterogeneousDevice::kGPUMock) == true); + CPPUNIT_ASSERT(prod2.isProductOn(HeterogeneousDevice::kGPUCuda) == false); + CPPUNIT_ASSERT(prod2.getProduct() == 5); + CPPUNIT_ASSERT_THROW(prod2.getProduct(), cms::Exception); + + // Data initially on GPUCuda + HeterogeneousProductImpl, + heterogeneous::GPUMockProduct, + heterogeneous::GPUCudaProduct + > prod3{heterogeneous::gpuCudaProduct(5), + [](const int& src, int& dst) { dst = src; }}; + + CPPUNIT_ASSERT(prod3.isProductOn(HeterogeneousDevice::kCPU) == false); + CPPUNIT_ASSERT(prod3.isProductOn(HeterogeneousDevice::kGPUMock) == false); + CPPUNIT_ASSERT(prod3.isProductOn(HeterogeneousDevice::kGPUCuda) == true); + + CPPUNIT_ASSERT_THROW(prod3.getProduct(), cms::Exception); + CPPUNIT_ASSERT(prod3.getProduct() == 5); + + // Automatic transfer + CPPUNIT_ASSERT(prod3.getProduct() == 5); + CPPUNIT_ASSERT(prod3.isProductOn(HeterogeneousDevice::kCPU) == true); + CPPUNIT_ASSERT(prod3.isProductOn(HeterogeneousDevice::kGPUMock) == false); + CPPUNIT_ASSERT(prod3.isProductOn(HeterogeneousDevice::kGPUCuda) == true); + CPPUNIT_ASSERT_THROW(prod3.getProduct(), cms::Exception); + CPPUNIT_ASSERT(prod3.getProduct() == 5); +} + + +void testHeterogeneousProduct::testMoveGPUMock() { + // Data initially on GPUMock + using Type = HeterogeneousProductImpl, + heterogeneous::GPUMockProduct, + heterogeneous::GPUCudaProduct + >; + Type prod1{heterogeneous::gpuMockProduct(5), + [](const int& src, int& dst) { dst = src; }}; + Type prod2; + + CPPUNIT_ASSERT(prod1.isProductOn(HeterogeneousDevice::kCPU) == false); + CPPUNIT_ASSERT(prod1.isProductOn(HeterogeneousDevice::kGPUMock) == true); + CPPUNIT_ASSERT(prod1.isProductOn(HeterogeneousDevice::kGPUCuda) == false); + CPPUNIT_ASSERT(prod2.isProductOn(HeterogeneousDevice::kCPU) == false); + CPPUNIT_ASSERT(prod2.isProductOn(HeterogeneousDevice::kGPUMock) == false); + CPPUNIT_ASSERT(prod2.isProductOn(HeterogeneousDevice::kGPUCuda) == false); + + CPPUNIT_ASSERT(prod1.getProduct() == 5); + CPPUNIT_ASSERT_THROW(prod1.getProduct(), cms::Exception); + CPPUNIT_ASSERT_THROW(prod2.getProduct(), cms::Exception); + CPPUNIT_ASSERT_THROW(prod2.getProduct(), cms::Exception); + + // move + prod2 = std::move(prod1); + + CPPUNIT_ASSERT(prod2.isProductOn(HeterogeneousDevice::kCPU) == false); + CPPUNIT_ASSERT(prod2.isProductOn(HeterogeneousDevice::kGPUMock) == true); + CPPUNIT_ASSERT(prod2.isProductOn(HeterogeneousDevice::kGPUCuda) == false); + + CPPUNIT_ASSERT(prod2.getProduct() == 5); + CPPUNIT_ASSERT_THROW(prod2.getProduct(), cms::Exception); + + // automatic transfer + CPPUNIT_ASSERT(prod2.getProduct() == 5); + CPPUNIT_ASSERT(prod2.isProductOn(HeterogeneousDevice::kCPU) == true); + CPPUNIT_ASSERT(prod2.isProductOn(HeterogeneousDevice::kGPUMock) == true); + CPPUNIT_ASSERT(prod2.isProductOn(HeterogeneousDevice::kGPUCuda) == false); + CPPUNIT_ASSERT(prod2.getProduct() == 5); + CPPUNIT_ASSERT_THROW(prod2.getProduct(), cms::Exception); +} + +void testHeterogeneousProduct::testMoveGPUCuda() { + // Data initially on GPUCuda + using Type = HeterogeneousProductImpl, + heterogeneous::GPUMockProduct, + heterogeneous::GPUCudaProduct + >; + Type prod1{heterogeneous::gpuCudaProduct(5), + [](const int& src, int& dst) { dst = src; }}; + Type prod2; + + CPPUNIT_ASSERT(prod1.isProductOn(HeterogeneousDevice::kCPU) == false); + CPPUNIT_ASSERT(prod1.isProductOn(HeterogeneousDevice::kGPUMock) == false); + CPPUNIT_ASSERT(prod1.isProductOn(HeterogeneousDevice::kGPUCuda) == true); + CPPUNIT_ASSERT(prod2.isProductOn(HeterogeneousDevice::kCPU) == false); + CPPUNIT_ASSERT(prod2.isProductOn(HeterogeneousDevice::kGPUMock) == false); + CPPUNIT_ASSERT(prod2.isProductOn(HeterogeneousDevice::kGPUCuda) == false); + + CPPUNIT_ASSERT_THROW(prod1.getProduct(), cms::Exception); + CPPUNIT_ASSERT(prod1.getProduct() == 5); + CPPUNIT_ASSERT_THROW(prod2.getProduct(), cms::Exception); + CPPUNIT_ASSERT_THROW(prod2.getProduct(), cms::Exception); + + // move + prod2 = std::move(prod1); + + CPPUNIT_ASSERT(prod2.isProductOn(HeterogeneousDevice::kCPU) == false); + CPPUNIT_ASSERT(prod2.isProductOn(HeterogeneousDevice::kGPUMock) == false); + CPPUNIT_ASSERT(prod2.isProductOn(HeterogeneousDevice::kGPUCuda) == true); + + CPPUNIT_ASSERT_THROW(prod2.getProduct(), cms::Exception); + CPPUNIT_ASSERT(prod2.getProduct() == 5); + + // automatic transfer + CPPUNIT_ASSERT(prod2.getProduct() == 5); + CPPUNIT_ASSERT(prod2.isProductOn(HeterogeneousDevice::kCPU) == true); + CPPUNIT_ASSERT(prod2.isProductOn(HeterogeneousDevice::kGPUMock) == false); + CPPUNIT_ASSERT(prod2.isProductOn(HeterogeneousDevice::kGPUCuda) == true); + CPPUNIT_ASSERT_THROW(prod2.getProduct(), cms::Exception); + CPPUNIT_ASSERT(prod2.getProduct() == 5); +} + +void testHeterogeneousProduct::testProduct() { + using Type1 = HeterogeneousProductImpl, + heterogeneous::GPUMockProduct + >; + using Type2 = HeterogeneousProductImpl, + heterogeneous::GPUCudaProduct + >; + + Type1 data1{heterogeneous::cpuProduct(5)}; + Type2 data2{heterogeneous::cpuProduct(10)}; + + HeterogeneousProduct prod{}; + CPPUNIT_ASSERT(prod.isNull() == true); + CPPUNIT_ASSERT(prod.isNonnull() == false); + CPPUNIT_ASSERT_THROW(prod.get(), cms::Exception); + + HeterogeneousProduct prod1{std::move(data1)}; + CPPUNIT_ASSERT(prod1.isNull() == false); + CPPUNIT_ASSERT(prod1.isNonnull() == true); + CPPUNIT_ASSERT(prod1.get().getProduct() == 5); + CPPUNIT_ASSERT_THROW(prod1.get(), cms::Exception); + + HeterogeneousProduct prod2{std::move(data2)}; + CPPUNIT_ASSERT(prod2.isNull() == false); + CPPUNIT_ASSERT(prod2.isNonnull() == true); + CPPUNIT_ASSERT_THROW(prod2.get(), cms::Exception); + CPPUNIT_ASSERT(prod2.get().getProduct() == 10); + + prod1 = std::move(prod2); + CPPUNIT_ASSERT_THROW(prod1.get(), cms::Exception); + CPPUNIT_ASSERT(prod1.get().getProduct() == 10); + + prod = std::move(prod1); + CPPUNIT_ASSERT(prod.isNull() == false); + CPPUNIT_ASSERT(prod.isNonnull() == true); + CPPUNIT_ASSERT_THROW(prod.get(), cms::Exception); + CPPUNIT_ASSERT(prod.get().getProduct() == 10); +} + +#include From ddda19d71a2db2576071e7ed041c56ff3cfee609 Mon Sep 17 00:00:00 2001 From: Andrea Bocci Date: Wed, 4 Apr 2018 17:00:48 +0200 Subject: [PATCH 34/88] Remove #pragma once --- DataFormats/GeometrySurface/interface/SOARotation.h | 1 - Geometry/TrackerGeometryBuilder/interface/phase1PixelTopology.h | 1 - 2 files changed, 2 deletions(-) diff --git a/DataFormats/GeometrySurface/interface/SOARotation.h b/DataFormats/GeometrySurface/interface/SOARotation.h index 9978973aa5d3d..1373a4091c5e5 100644 --- a/DataFormats/GeometrySurface/interface/SOARotation.h +++ b/DataFormats/GeometrySurface/interface/SOARotation.h @@ -1,4 +1,3 @@ -#pragma once #ifndef DataFormats_GeometrySurface_SOARotation_h #define DataFormats_GeometrySurface_SOARotation_h diff --git a/Geometry/TrackerGeometryBuilder/interface/phase1PixelTopology.h b/Geometry/TrackerGeometryBuilder/interface/phase1PixelTopology.h index 872e0b732ae14..455de58ce3408 100644 --- a/Geometry/TrackerGeometryBuilder/interface/phase1PixelTopology.h +++ b/Geometry/TrackerGeometryBuilder/interface/phase1PixelTopology.h @@ -1,4 +1,3 @@ -#pragma once #ifndef Geometry_TrackerGeometryBuilder_phase1PixelTopology_h #define Geometry_TrackerGeometryBuilder_phase1PixelTopology_h From 3a0169e031b9bd96ee10183711be17489efe75ba Mon Sep 17 00:00:00 2001 From: Salvatore Di Guida Date: Thu, 1 Mar 2018 17:37:42 +0100 Subject: [PATCH 35/88] Add an unit test for CUDAService. --- .../CUDAServices/test/BuildFile.xml | 4 + .../CUDAServices/test/testCUDAService.cpp | 138 ++++++++++++++++++ 2 files changed, 142 insertions(+) create mode 100644 HeterogeneousCore/CUDAServices/test/BuildFile.xml create mode 100644 HeterogeneousCore/CUDAServices/test/testCUDAService.cpp diff --git a/HeterogeneousCore/CUDAServices/test/BuildFile.xml b/HeterogeneousCore/CUDAServices/test/BuildFile.xml new file mode 100644 index 0000000000000..911a928fa4da1 --- /dev/null +++ b/HeterogeneousCore/CUDAServices/test/BuildFile.xml @@ -0,0 +1,4 @@ + + + + diff --git a/HeterogeneousCore/CUDAServices/test/testCUDAService.cpp b/HeterogeneousCore/CUDAServices/test/testCUDAService.cpp new file mode 100644 index 0000000000000..5ee60e3d68cde --- /dev/null +++ b/HeterogeneousCore/CUDAServices/test/testCUDAService.cpp @@ -0,0 +1,138 @@ +#include +#include +#include +#include + +#include + +#include "FWCore/ParameterSet/interface/ParameterSet.h" +#include "FWCore/ServiceRegistry/interface/ActivityRegistry.h" +#include "FWCore/Utilities/interface/Exception.h" +#include "HeterogeneousCore/CUDAServices/interface/CUDAService.h" + +int main() +{ + int rc = -1; + try + { + edm::ActivityRegistry ar; + + // Test setup: check if a simple CUDA runtime API call fails: + // if so, skip the test with the CUDAService enabled + int deviceCount = 0; + bool configEnabled( true ); + auto ret = cudaGetDeviceCount( &deviceCount ); + + // Enable the service only if there are CUDA capable GPUs installed + if( ret != cudaSuccess ) + { + std::cout << "=== Test #1: SKIPPED. Unable to query the CUDA capable devices from the CUDA runtime API: (" + << ret << ") " << cudaGetErrorString( ret ) + << ". Is the host equipped with CUDA capable GPUs? ===" << std::endl; + } else + { + std::cout << "=== Test #1: CUDAService enabled only if there are CUDA capable GPUs installed. ===" << std::endl; + // Now all runtime API calls should work: + // a CUDA error marks the test as failed. + deviceCount = 0; + ret = cudaGetDeviceCount( &deviceCount ); + if( ret != cudaSuccess ) + { + std::ostringstream errstr; + errstr << "Unable to query the CUDA capable devices from the CUDA runtime API: (" + << ret << ") " << cudaGetErrorString( ret ); + throw cms::Exception( "CUDAService", errstr.str() ); + } + + // No need to skip the test if no CUDA capable devices are seen by the runtime API: + // in that case, cudaGetDeviceCount returns error code cudaErrorNoDevice. + configEnabled = bool( deviceCount ); + edm::ParameterSet ps; + ps.addUntrackedParameter( "enabled", configEnabled ); + CUDAService cs( ps, ar ); + + // Test that the service is enabled + assert( cs.enabled() == configEnabled ); + std::cout << "The CUDAService is enabled." << std::endl; + + // At this point, we can get, as info, the driver and runtime versions. + int driverVersion = 0, runtimeVersion = 0; + ret = cudaDriverGetVersion( &driverVersion ); + if( ret != cudaSuccess ) + { + std::ostringstream errstr; + errstr << "Unable to query the CUDA driver version from the CUDA runtime API: (" + << ret << ") " << cudaGetErrorString( ret ); + throw cms::Exception( "CUDAService", errstr.str() ); + } + ret = cudaRuntimeGetVersion( &runtimeVersion ); + if( ret != cudaSuccess ) + { + std::ostringstream errstr; + errstr << "Unable to query the CUDA runtime API version: (" + << ret << ") " << cudaGetErrorString( ret ); + throw cms::Exception( "CUDAService", errstr.str() ); + } + + std::cout << "CUDA Driver Version / Runtime Version: " << driverVersion/1000 << "." << (driverVersion%100)/10 + << " / " << runtimeVersion/1000 << "." << (runtimeVersion%100)/10 << std::endl; + + // Test that the number of devices found by the service + // is the same as detected by the CUDA runtime API + assert( cs.numberOfDevices() == deviceCount ); + std::cout << "Detected " << cs.numberOfDevices() << " CUDA Capable device(s)" << std::endl; + + // Test that the compute capabilities of each device + // are the same as detected by the CUDA runtime API + for( int i=0; i Date: Thu, 1 Mar 2018 17:44:59 +0100 Subject: [PATCH 36/88] Do not dlopen libcuda.so, relying linker to find it is sufficient. Dlopening libcuda.so is installation and/or ld.conf dependent. Relying on -lcuda in the linker is correct and sufficient (now that nvidia-drivers external has to be set up in non-GPU machines). --- .../CUDAServices/src/CUDAService.cc | 31 ------------------- 1 file changed, 31 deletions(-) diff --git a/HeterogeneousCore/CUDAServices/src/CUDAService.cc b/HeterogeneousCore/CUDAServices/src/CUDAService.cc index 4505b8ea6c3c4..890201d5d1a1a 100644 --- a/HeterogeneousCore/CUDAServices/src/CUDAService.cc +++ b/HeterogeneousCore/CUDAServices/src/CUDAService.cc @@ -15,37 +15,6 @@ CUDAService::CUDAService(edm::ParameterSet const& iConfig, edm::ActivityRegistry edm::LogInfo("CUDAService") << "CUDAService disabled by configuration"; } - // First check if we can load the cuda runtime library - void *cudaLib = dlopen("libcuda.so", RTLD_NOW); - if(cudaLib == nullptr) { - edm::LogWarning("CUDAService") << "Failed to dlopen libcuda.so, disabling CUDAService"; - return; - } - edm::LogInfo("CUDAService") << "Found libcuda.so"; - - // Find functions - auto cuInit = reinterpret_cast(dlsym(cudaLib, "cuInit")); - if(cuInit == nullptr) { - edm::LogWarning("CUDAService") << "Failed to find cuInit from libcuda.so, disabling CUDAService"; - return; - } - edm::LogInfo("CUDAService") << "Found cuInit from libcuda"; - - auto cuDeviceGetCount = reinterpret_cast(dlsym(cudaLib, "cuDeviceGetCount")); - if(cuDeviceGetCount == nullptr) { - edm::LogWarning("CUDAService") << "Failed to find cuDeviceGetCount from libcuda.so, disabling CUDAService"; - return; - } - edm::LogInfo("CUDAService") << "Found cuDeviceGetCount from libcuda"; - - auto cuDeviceComputeCapability = reinterpret_cast(dlsym(cudaLib, "cuDeviceComputeCapability")); - if(cuDeviceComputeCapability == nullptr) { - edm::LogWarning("CUDAService") << "Failed to find cuDeviceComputeCapability from libcuda.so, disabling CUDAService"; - return; - } - edm::LogInfo("CUDAService") << "Found cuDeviceComputeCapability"; - - // Then call functions auto ret = cuInit(0); if(CUDA_SUCCESS != ret) { edm::LogWarning("CUDAService") << "cuInit failed, return value " << ret << ", disabling CUDAService"; From 4bb618035dd4a2f3ca7830cf7691ac7bd88b675c Mon Sep 17 00:00:00 2001 From: Salvatore Di Guida Date: Thu, 1 Mar 2018 17:46:58 +0100 Subject: [PATCH 37/88] Fix CUDAService to really be disabled when told so in configuration Bug fix: if the CUDAService is disabled by configuration, the ctor just returns, so it does not set any data member. This has been found in the unit test by explicitly forcing the configuration in the CUDAService PSet to be disabled: the last assert fails. --- HeterogeneousCore/CUDAServices/src/CUDAService.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/HeterogeneousCore/CUDAServices/src/CUDAService.cc b/HeterogeneousCore/CUDAServices/src/CUDAService.cc index 890201d5d1a1a..d752df38626ca 100644 --- a/HeterogeneousCore/CUDAServices/src/CUDAService.cc +++ b/HeterogeneousCore/CUDAServices/src/CUDAService.cc @@ -13,6 +13,7 @@ CUDAService::CUDAService(edm::ParameterSet const& iConfig, edm::ActivityRegistry bool configEnabled = iConfig.getUntrackedParameter("enabled"); if(!configEnabled) { edm::LogInfo("CUDAService") << "CUDAService disabled by configuration"; + return; } auto ret = cuInit(0); From d7e8ddc9c48fb18e419eaa7a260c514b7c39ba83 Mon Sep 17 00:00:00 2001 From: Salvatore Di Guida Date: Thu, 1 Mar 2018 17:36:44 +0100 Subject: [PATCH 38/88] Improve Error handling in CUDAService. --- .../CUDAServices/src/CUDAService.cc | 9 ++++----- .../interface/getCudaDrvErrorString.h | 17 +++++++++++++++++ 2 files changed, 21 insertions(+), 5 deletions(-) create mode 100644 HeterogeneousCore/CUDAUtilities/interface/getCudaDrvErrorString.h diff --git a/HeterogeneousCore/CUDAServices/src/CUDAService.cc b/HeterogeneousCore/CUDAServices/src/CUDAService.cc index d752df38626ca..792d12dbd0022 100644 --- a/HeterogeneousCore/CUDAServices/src/CUDAService.cc +++ b/HeterogeneousCore/CUDAServices/src/CUDAService.cc @@ -6,8 +6,7 @@ #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h" #include - -#include +#include "HeterogeneousCore/CUDAUtilities/interface/getCudaDrvErrorString.h" CUDAService::CUDAService(edm::ParameterSet const& iConfig, edm::ActivityRegistry& iRegistry) { bool configEnabled = iConfig.getUntrackedParameter("enabled"); @@ -18,14 +17,14 @@ CUDAService::CUDAService(edm::ParameterSet const& iConfig, edm::ActivityRegistry auto ret = cuInit(0); if(CUDA_SUCCESS != ret) { - edm::LogWarning("CUDAService") << "cuInit failed, return value " << ret << ", disabling CUDAService"; + edm::LogWarning("CUDAService") << "Failed to initialize the CUDA driver API by calling cuInit, return value " << ret << " ("<< getCudaDrvErrorString(ret) << "), disabling CUDAService"; return; } edm::LogInfo("CUDAService") << "cuInit succeeded"; ret = cuDeviceGetCount(&numberOfDevices_); if(CUDA_SUCCESS != ret) { - edm::LogWarning("CUDAService") << "cuDeviceGetCount failed, return value " << ret << ", disabling CUDAService"; + edm::LogWarning("CUDAService") << "Failed to call cuDeviceGetCount from CUDA driver API, return value " << ret << " ("<< getCudaDrvErrorString(ret) << "), disabling CUDAService"; return; } edm::LogInfo("CUDAService") << "cuDeviceGetCount succeeded, found " << numberOfDevices_ << " devices"; @@ -39,7 +38,7 @@ CUDAService::CUDAService(edm::ParameterSet const& iConfig, edm::ActivityRegistry int major, minor; ret = cuDeviceComputeCapability(&major, &minor, i); if(CUDA_SUCCESS != ret) { - edm::LogWarning("CUDAService") << "cuDeviceComputeCapability failed for device " << i << ", return value " << ret << " disabling CUDAService"; + edm::LogWarning("CUDAService") << "Failed to call cuDeviceComputeCapability for device " << i << " from CUDA driver API, return value " << ret << " ("<< getCudaDrvErrorString(ret) << "), disabling CUDAService"; return; } edm::LogInfo("CUDAService") << "Device " << i << " compute capability major " << major << " minor " << minor; diff --git a/HeterogeneousCore/CUDAUtilities/interface/getCudaDrvErrorString.h b/HeterogeneousCore/CUDAUtilities/interface/getCudaDrvErrorString.h new file mode 100644 index 0000000000000..dea870db50878 --- /dev/null +++ b/HeterogeneousCore/CUDAUtilities/interface/getCudaDrvErrorString.h @@ -0,0 +1,17 @@ +#ifndef HeterogeneousCore_CUDAUtilities_getCudaDrvErrorString_h +#define HeterogeneousCore_CUDAUtilities_getCudaDrvErrorString_h + +#include + +inline const char *getCudaDrvErrorString(CUresult error_id) { + const char *message; + auto ret = cuGetErrorName(error_id, &message); + if(ret == CUDA_ERROR_INVALID_VALUE) { + return static_cast("CUDA_ERROR not found!"); + } + else { + return message; + } +} + +#endif From 943140ae4bc784347e72efe68d31614cd96b779d Mon Sep 17 00:00:00 2001 From: Salvatore Di Guida Date: Tue, 13 Mar 2018 20:03:32 +0100 Subject: [PATCH 39/88] Added new CUDAService unit test getting information from the driver API. --- .../CUDAServices/test/BuildFile.xml | 7 +- .../CUDAServices/test/testCUDAServiceDrv.cpp | 143 ++++++++++++++++++ 2 files changed, 148 insertions(+), 2 deletions(-) create mode 100644 HeterogeneousCore/CUDAServices/test/testCUDAServiceDrv.cpp diff --git a/HeterogeneousCore/CUDAServices/test/BuildFile.xml b/HeterogeneousCore/CUDAServices/test/BuildFile.xml index 911a928fa4da1..6d9b0c11cbc29 100644 --- a/HeterogeneousCore/CUDAServices/test/BuildFile.xml +++ b/HeterogeneousCore/CUDAServices/test/BuildFile.xml @@ -1,4 +1,7 @@ + + - - + + + diff --git a/HeterogeneousCore/CUDAServices/test/testCUDAServiceDrv.cpp b/HeterogeneousCore/CUDAServices/test/testCUDAServiceDrv.cpp new file mode 100644 index 0000000000000..e71d010cabf6e --- /dev/null +++ b/HeterogeneousCore/CUDAServices/test/testCUDAServiceDrv.cpp @@ -0,0 +1,143 @@ +#include +#include +#include +#include + +#include + +#include "FWCore/ParameterSet/interface/ParameterSet.h" +#include "FWCore/ServiceRegistry/interface/ActivityRegistry.h" +#include "FWCore/Utilities/interface/Exception.h" +#include "HeterogeneousCore/CUDAServices/interface/CUDAService.h" +#include "HeterogeneousCore/CUDAUtilities/interface/getCudaDrvErrorString.h" + +int main() +{ + int rc = -1; + try + { + edm::ActivityRegistry ar; + + // Test setup: check if you can initialize the CUDA driver API: + // if failing, skip the test with the CUDAService enabled + bool configEnabled( true ); + auto ret = cuInit( 0 ); + + // Enable the service only if there are CUDA capable GPUs installed + if( ret != CUDA_SUCCESS ) + { + std::cout << "=== Test #1: SKIPPED. Unable to initialize the CUDA driver API: (" + << ret << ") " << getCudaDrvErrorString( ret ) + << ". Is the host equipped with CUDA capable GPUs? ===" << std::endl; + } else + { + std::cout << "=== Test #1: CUDAService enabled only if there are CUDA capable GPUs installed. ===" << std::endl; + // Now all driver API calls should work: + // a CUDA error marks the test as failed. + int deviceCount = 0; + ret = cuDeviceGetCount( &deviceCount ); + if( ret != CUDA_SUCCESS ) + { + std::ostringstream errstr; + errstr << "Unable to query the CUDA capable devices from the CUDA driver API: (" + << ret << ") " << getCudaDrvErrorString( ret ); + throw cms::Exception("CUDAService", errstr.str() ); + } + + // If no CUDA capable devices are seen by the driver API, cuDeviceGetCount returns 0, + // with error code CUDA_SUCCESS. We construct the CUDAService instance as enabled, + // and then test if it is disabled when no CUDA capable devices are visible. + edm::ParameterSet ps; + ps.addUntrackedParameter( "enabled", configEnabled ); + CUDAService cs( ps, ar ); + + // Test that the service is enabled only if there are visible CUDA capable devices. + assert( cs.enabled() == bool( deviceCount ) ); + std::cout << "The CUDAService is " + << (deviceCount ? "enabled." : "disabled.") << std::endl; + + // At this point, we can get, as info, the driver and runtime versions. + int driverVersion = 0; + ret = cuDriverGetVersion( &driverVersion ); + if( ret != CUDA_SUCCESS ) + { + std::ostringstream errstr; + errstr << "Unable to query the CUDA driver version: (" + << ret << ") " << getCudaDrvErrorString( ret ); + throw cms::Exception( "CUDAService", errstr.str() ); + } + std::cout << "CUDA Driver Version: " << driverVersion/1000 << "." << (driverVersion%100)/10 << std::endl; + + // Test that the number of devices found by the service + // is the same as detected by the CUDA runtime API + assert( cs.numberOfDevices() == deviceCount ); + if( deviceCount > 0 ) + { + std::cout << "Detected " << cs.numberOfDevices() << " CUDA Capable device(s)" << std::endl; + } else + { + std::cout << "There are no available device(s) that support CUDA" << std::endl; + } + + // Test that the compute capabilities of each device + // are the same as detected by the CUDA driver API + int major = 0, minor = 0; + char deviceName[256]; + for( CUdevice i=0; i Date: Thu, 26 Apr 2018 19:18:26 +0200 Subject: [PATCH 40/88] CUDA does not support C++17 yet, so we define here some of the missing library functions --- .../CUDAUtilities/interface/cuda_cxx17.h | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 HeterogeneousCore/CUDAUtilities/interface/cuda_cxx17.h diff --git a/HeterogeneousCore/CUDAUtilities/interface/cuda_cxx17.h b/HeterogeneousCore/CUDAUtilities/interface/cuda_cxx17.h new file mode 100644 index 0000000000000..db5932f106a31 --- /dev/null +++ b/HeterogeneousCore/CUDAUtilities/interface/cuda_cxx17.h @@ -0,0 +1,72 @@ +#ifndef HeterogeneousCore_CUDAUtilities_cuda_cxx17_h +#define HeterogeneousCore_CUDAUtilities_cuda_cxx17_h + +#include + +// CUDA does not support C++17 yet, so we define here some of the missing library functions +#if __cplusplus < 201703L + +namespace std { + + // from https://en.cppreference.com/w/cpp/iterator/size + template + constexpr auto size(const C& c) -> decltype(c.size()) + { + return c.size(); + } + + template + constexpr std::size_t size(const T (&array)[N]) noexcept + { + return N; + } + + // from https://en.cppreference.com/w/cpp/iterator/empty + template + constexpr auto empty(const C& c) -> decltype(c.empty()) + { + return c.empty(); + } + + template + constexpr bool empty(const T (&array)[N]) noexcept + { + return false; + } + + template + constexpr bool empty(std::initializer_list il) noexcept + { + return il.size() == 0; + } + + // from https://en.cppreference.com/w/cpp/iterator/data + template + constexpr auto data(C& c) -> decltype(c.data()) + { + return c.data(); + } + + template + constexpr auto data(const C& c) -> decltype(c.data()) + { + return c.data(); + } + + template + constexpr T* data(T (&array)[N]) noexcept + { + return array; + } + + template + constexpr const E* data(std::initializer_list il) noexcept + { + return il.begin(); + } + +} + +#endif + +#endif // HeterogeneousCore_CUDAUtilities_cuda_cxx17_h From e96b2e6ebe37137c07bb8082a562987b5d4210c0 Mon Sep 17 00:00:00 2001 From: Andrea Bocci Date: Thu, 26 Apr 2018 19:18:52 +0200 Subject: [PATCH 41/88] add missing header --- HeterogeneousCore/Product/interface/HeterogeneousProduct.h | 1 + 1 file changed, 1 insertion(+) diff --git a/HeterogeneousCore/Product/interface/HeterogeneousProduct.h b/HeterogeneousCore/Product/interface/HeterogeneousProduct.h index b7dc32ed545e9..f6e7dc1c7d290 100644 --- a/HeterogeneousCore/Product/interface/HeterogeneousProduct.h +++ b/HeterogeneousCore/Product/interface/HeterogeneousProduct.h @@ -4,6 +4,7 @@ #include "FWCore/Utilities/interface/Exception.h" #include +#include #include #include #include From 42bb31a06604f534edd916cf1803d41550cc957a Mon Sep 17 00:00:00 2001 From: Andrea Bocci Date: Thu, 26 Apr 2018 19:19:28 +0200 Subject: [PATCH 42/88] #include ".../cuda_cxx17.h" for std::size() --- .../SiPixelRecHits/interface/pixelCPEforGPU.h | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/RecoLocalTracker/SiPixelRecHits/interface/pixelCPEforGPU.h b/RecoLocalTracker/SiPixelRecHits/interface/pixelCPEforGPU.h index d25e5649bcc74..a76ca821e70da 100644 --- a/RecoLocalTracker/SiPixelRecHits/interface/pixelCPEforGPU.h +++ b/RecoLocalTracker/SiPixelRecHits/interface/pixelCPEforGPU.h @@ -1,12 +1,14 @@ -#pragma once +#ifndef RecoLocalTracker_SiPixelRecHits_pixelCPEforGPU_h +#define RecoLocalTracker_SiPixelRecHits_pixelCPEforGPU_h -#include "Geometry/TrackerGeometryBuilder/interface/phase1PixelTopology.h" -#include "DataFormats/GeometrySurface/interface/SOARotation.h" -#include +#include #include +#include #include -#include +#include "DataFormats/GeometrySurface/interface/SOARotation.h" +#include "Geometry/TrackerGeometryBuilder/interface/phase1PixelTopology.h" +#include "HeterogeneousCore/CUDAUtilities/interface/cuda_cxx17.h" namespace pixelCPEforGPU { @@ -256,3 +258,5 @@ namespace pixelCPEforGPU { } } + +#endif // RecoLocalTracker_SiPixelRecHits_pixelCPEforGPU_h From 67bafd05a0d0d0eeb7fafa9eb8a25777882ff46f Mon Sep 17 00:00:00 2001 From: Andrea Bocci Date: Sun, 29 Apr 2018 22:53:01 +0200 Subject: [PATCH 43/88] Update cuda_cxx17.h for compatibility with GCC 6 --- HeterogeneousCore/CUDAUtilities/interface/cuda_cxx17.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/HeterogeneousCore/CUDAUtilities/interface/cuda_cxx17.h b/HeterogeneousCore/CUDAUtilities/interface/cuda_cxx17.h index db5932f106a31..172bb31806dbb 100644 --- a/HeterogeneousCore/CUDAUtilities/interface/cuda_cxx17.h +++ b/HeterogeneousCore/CUDAUtilities/interface/cuda_cxx17.h @@ -4,7 +4,7 @@ #include // CUDA does not support C++17 yet, so we define here some of the missing library functions -#if __cplusplus < 201703L +#if __cplusplus <= 201402L namespace std { From 4f4ea608682c8fd8778137827311a659ea5c7245 Mon Sep 17 00:00:00 2001 From: Matti Kortelainen Date: Fri, 4 May 2018 13:56:37 +0200 Subject: [PATCH 44/88] Replace AcceleratorService with HeterogeneousEDProducer (#43) * Make getResult() static * Add function to query the device with most free memory * Add functions to get and set the current device * First prototype of HeterogeneousEDProducer * Improve printouts * Apparently need to release the GPU memory explicitly Leaving the release implicitly to the move assignment from new pointers creates a CUDA stream synchronization point for some reason. * Move CUDA stream creation to be done for each event * Extend data location for multiple devices of the same type * First step towards HeterogeneousEvent with a working implementation for put() * Move HeterogeneousEDProducer to its own package * Remove AcceleratorService as obsolete * Move HeterogeneousEvent to its own header * Deploy HeterogeneousEvent for all heterogeneous put()'s * Delegate also standard put in HeterogeneousEvent * Use HeterogeneousEvent in acquire() as well, rename all launch*() to acquire*() * Add hook for beginStream * Fix include guard * Move HeterogeneousDevice(Id) definitions to their own header * Reduce copy-paste with macro * Move HeterogeneousProductBase to its own header * Remove commented code * Remove obsolete interface * Rename macro * Move GPUCuda to its own header (in its own package) * Assign edm::Streams to CUDA devices in beginStream * Pass CUDA stream from the base class This way the system takes care of enqueuing the callback to the CUDA stream. * Use scoped_override_t<> to set the current device * Use beginStreamGPUCuda in the test * Use an explicit CUDA stream to transfer data from GPU to CPU * Add some documentation * Add virtual destructors to silence GCC7 warnings --- .../interface/AcceleratorService.h | 245 ----------------- .../AcceleratorService/plugins/BuildFile.xml | 4 - .../AcceleratorService/plugins/plugins.cc | 4 - .../src/AcceleratorService.cc | 125 --------- .../test/TestAcceleratorServiceProducerGPU.cc | 177 ------------- .../TestAcceleratorServiceProducerGPUMock.cc | 172 ------------ HeterogeneousCore/CUDACore/BuildFile.xml | 11 + .../CUDACore/interface/GPUCuda.h | 36 +++ HeterogeneousCore/CUDACore/src/GPUCuda.cc | 82 ++++++ HeterogeneousCore/CUDAServices/BuildFile.xml | 1 + .../CUDAServices/interface/CUDAService.h | 9 + .../CUDAServices/src/CUDAService.cc | 33 +++ .../CUDAServices/test/testCUDAService.cpp | 38 ++- .../BuildFile.xml | 1 - .../Producer/interface/DeviceWrapper.h | 20 ++ .../interface/HeterogeneousEDProducer.h | 207 +++++++++++++++ .../Producer/interface/HeterogeneousEvent.h | 121 +++++++++ .../Producer/src/HeterogeneousEDProducer.cc | 53 ++++ .../test/BuildFile.xml | 9 +- .../TestHeterogeneousEDProducerAnalyzer.cc} | 18 +- .../test/TestHeterogeneousEDProducerGPU.cc | 161 +++++++++++ .../TestHeterogeneousEDProducerGPUHelpers.cu} | 52 ++-- .../TestHeterogeneousEDProducerGPUHelpers.h} | 27 +- .../TestHeterogeneousEDProducerGPUMock.cc | 153 +++++++++++ .../test/testGPUMock_cfg.py | 5 +- .../test/testGPU_cfg.py | 14 +- .../Product/interface/HeterogeneousDeviceId.h | 45 ++++ .../Product/interface/HeterogeneousProduct.h | 250 ++++++++---------- .../interface/HeterogeneousProductBase.h | 41 +++ .../Product/test/testHeterogeneousProduct.cpp | 47 +++- HeterogeneousCore/README.md | 116 ++++++++ 31 files changed, 1321 insertions(+), 956 deletions(-) delete mode 100644 HeterogeneousCore/AcceleratorService/interface/AcceleratorService.h delete mode 100644 HeterogeneousCore/AcceleratorService/plugins/BuildFile.xml delete mode 100644 HeterogeneousCore/AcceleratorService/plugins/plugins.cc delete mode 100644 HeterogeneousCore/AcceleratorService/src/AcceleratorService.cc delete mode 100644 HeterogeneousCore/AcceleratorService/test/TestAcceleratorServiceProducerGPU.cc delete mode 100644 HeterogeneousCore/AcceleratorService/test/TestAcceleratorServiceProducerGPUMock.cc create mode 100644 HeterogeneousCore/CUDACore/BuildFile.xml create mode 100644 HeterogeneousCore/CUDACore/interface/GPUCuda.h create mode 100644 HeterogeneousCore/CUDACore/src/GPUCuda.cc rename HeterogeneousCore/{AcceleratorService => Producer}/BuildFile.xml (82%) create mode 100644 HeterogeneousCore/Producer/interface/DeviceWrapper.h create mode 100644 HeterogeneousCore/Producer/interface/HeterogeneousEDProducer.h create mode 100644 HeterogeneousCore/Producer/interface/HeterogeneousEvent.h create mode 100644 HeterogeneousCore/Producer/src/HeterogeneousEDProducer.cc rename HeterogeneousCore/{AcceleratorService => Producer}/test/BuildFile.xml (50%) rename HeterogeneousCore/{AcceleratorService/test/TestAcceleratorServiceAnalyzer.cc => Producer/test/TestHeterogeneousEDProducerAnalyzer.cc} (69%) create mode 100644 HeterogeneousCore/Producer/test/TestHeterogeneousEDProducerGPU.cc rename HeterogeneousCore/{AcceleratorService/test/TestAcceleratorServiceProducerGPUHelpers.cu => Producer/test/TestHeterogeneousEDProducerGPUHelpers.cu} (82%) rename HeterogeneousCore/{AcceleratorService/test/TestAcceleratorServiceProducerGPUHelpers.h => Producer/test/TestHeterogeneousEDProducerGPUHelpers.h} (53%) create mode 100644 HeterogeneousCore/Producer/test/TestHeterogeneousEDProducerGPUMock.cc rename HeterogeneousCore/{AcceleratorService => Producer}/test/testGPUMock_cfg.py (79%) rename HeterogeneousCore/{AcceleratorService => Producer}/test/testGPU_cfg.py (63%) create mode 100644 HeterogeneousCore/Product/interface/HeterogeneousDeviceId.h create mode 100644 HeterogeneousCore/Product/interface/HeterogeneousProductBase.h create mode 100644 HeterogeneousCore/README.md diff --git a/HeterogeneousCore/AcceleratorService/interface/AcceleratorService.h b/HeterogeneousCore/AcceleratorService/interface/AcceleratorService.h deleted file mode 100644 index 93f269054bb45..0000000000000 --- a/HeterogeneousCore/AcceleratorService/interface/AcceleratorService.h +++ /dev/null @@ -1,245 +0,0 @@ -#ifndef HeterogeneousCore_AcceleratorService_AcceleratorService_h -#define HeterogeneousCore_AcceleratorService_AcceleratorService_h - -#include "FWCore/Concurrency/interface/WaitingTaskWithArenaHolder.h" -#include "FWCore/Utilities/interface/StreamID.h" -#include "FWCore/Utilities/interface/propagate_const.h" - -#include "HeterogeneousCore/Product/interface/HeterogeneousProduct.h" - -#include -#include -#include - -namespace edm { - class Event; - class ParameterSet; - class ActivityRegistry; - class ModuleDescription; - namespace service { - class SystemBounds; - } -} - -namespace accelerator { - // Inheritance vs. type erasure? I'm now going with the latter even - // if it is more complex to setup and maintain in order to support a - // case where a single class implements multiple CPU/GPU/etc - // interfaces, in which case via inheritance we can't separate the - // cases in the scheduling interface. - // - // Want a base class in order to have the per-device calls to be - // made non-inlined (how necessary is this?) - // - // Note that virtual destructors are not needed in the base classes - // as the pattern is to construct the concrete class in stack and - // keep that object around as long as the function call accessing - // the object via base class pointer/reference is finished. - - /** - * CPU algorithm - * - * The T can be any class implementing "runCPU(void)" method (return - * value is ignored) - * - * A CPU algorithm is run synchronously in the same TBB task, i.e. - * when everything is finished when runCPU() call returns. - */ - class AlgoCPUBase { - public: - AlgoCPUBase() {} - virtual void runCPU() = 0; - }; - template class AlgoCPU: public AlgoCPUBase { - public: - AlgoCPU(T *algo): algo_(algo) {} - void runCPU() override { algo_->runCPU(); } - private: - T *algo_; - }; - template AlgoCPU algoCPU(T *algo) { return AlgoCPU(algo); } - - /** - * GPU mock algorithm - * - * The T can be any class implementing - * "runGPUMock(std::function)" method (return value is - * ignored). - * - * The implemented method must call the callback function when all - * work is finished. If any of the work is asynchronous, it is up to - * the algorithm to launch the work asynchronously and ensure that - * the callback is called after all asynchronous work is finished. - */ - class AlgoGPUMockBase { - public: - AlgoGPUMockBase() {} - virtual void runGPUMock(std::function callback) = 0; - }; - template class AlgoGPUMock: public AlgoGPUMockBase { - public: - AlgoGPUMock(T *algo): algo_(algo) {} - void runGPUMock(std::function callback) override { algo_->runGPUMock(std::move(callback)); } - private: - T *algo_; - }; - template AlgoGPUMock algoGPUMock(T *algo) { return AlgoGPUMock(algo); } - - /** - * GPU CUDA algorithm - * - * The T can be any class implementing - * "runGPUCuda(std::function)" method (return value is - * ignored). - * - * The implemented method must call the callback function when all - * work is finished. If any of the work is asynchronous, it is up to - * the algorithm to launch the work asynchronously and ensure that - * the callback is called after all asynchronous work is finished. - * - * For CUDA the above conditions mean using - * - CUDA stream - * - asynchronous memory transfers - * - asynchronous kernel launches - * - registering the callback to the stream after all other work has been launched - * - * Note that the CUDA stream object must live at least as long as - * the callback() is called (in practice a tiny bit later). - */ - class AlgoGPUCudaBase { - public: - AlgoGPUCudaBase() {} - virtual void runGPUCuda(std::function callback) = 0; - }; - template class AlgoGPUCuda: public AlgoGPUCudaBase { - public: - AlgoGPUCuda(T *algo): algo_(algo) {} - void runGPUCuda(std::function callback) override { algo_->runGPUCuda(std::move(callback)); } - private: - T *algo_; - }; - template AlgoGPUCuda algoGPUCuda(T *algo) { return AlgoGPUCuda(algo); } -} - -/** - * Prototype for a service for scheduling heterogeneous algorithms - * - * It can be that in the end we don't need a Service, but for now the - * protyping proceeds with one. - * - * At the moment the client EDModules must use the ExternalWork extension. - * - * Client EDModules must first register themselves by calling the - * book() method in their constructor and storing the Token object as - * member variables. - * - * In the aqcuire(), the clients must call the schedule() method to - * schedule (and possibly run) the algorithms (for more details see - * the documentation of the method). - * - * In the produce(), the clients must check with - * algoExecutionLocation() which algorithm was run, fetch the output - * of that algorithm, and put it in the Event. - */ -class AcceleratorService { -public: - class Token { - public: - explicit Token(unsigned int id): id_(id) {} - - unsigned int id() const { return id_; } - private: - unsigned int id_; - }; - - AcceleratorService(edm::ParameterSet const& iConfig, edm::ActivityRegistry& iRegistry); - - Token book(); // TODO: better name, unfortunately 'register' is a reserved keyword... - - /** - * Schedule the various versions of the algorithm to the available - * heterogeneous devices. - * - * The parameter pack is an ordered list of accelerator::Algo* - * objects (note the helper functions to create them). The order of - * the algorithms is taken as the preferred order to be tried. I.e. - * the code tries to schedule the first algorithm, if that fails (no - * device, to be extended) try the next one etc. The CPU version has - * to be the last one. - * - * - * TODO: passing the "input" parameter here is a bit boring, but - * somehow we have to schedule according to the input. Try to think - * something better. - */ - template - void schedule(Token token, edm::StreamID streamID, edm::WaitingTaskWithArenaHolder waitingTaskHolder, const I *input, Args&&... args) { - scheduleImpl(token, streamID, std::move(waitingTaskHolder), input, std::forward(args)...); - } - HeterogeneousDeviceId algoExecutionLocation(Token token, edm::StreamID streamID) const { - return algoExecutionLocation_[tokenStreamIdsToDataIndex(token.id(), streamID)]; - } - -private: - // signals - void preallocate(edm::service::SystemBounds const& bounds); - void preModuleConstruction(edm::ModuleDescription const& desc); - void postModuleConstruction(edm::ModuleDescription const& desc); - - - // other helpers - unsigned int tokenStreamIdsToDataIndex(unsigned int tokenId, edm::StreamID streamId) const; - - // experimenting new interface - template - void scheduleImpl(Token token, edm::StreamID streamID, edm::WaitingTaskWithArenaHolder waitingTaskHolder, const I *input, - accelerator::AlgoGPUMock gpuMockAlgo, Args&&... args) { - bool succeeded = true; - if(input) { - succeeded = input->isProductOn(HeterogeneousDevice::kGPUMock); - } - if(succeeded) { - succeeded = scheduleGPUMock(token, streamID, waitingTaskHolder, gpuMockAlgo); - } - if(!succeeded) { - scheduleImpl(token, streamID, std::move(waitingTaskHolder), input, std::forward(args)...); - } - } - template - void scheduleImpl(Token token, edm::StreamID streamID, edm::WaitingTaskWithArenaHolder waitingTaskHolder, const I *input, - accelerator::AlgoGPUCuda gpuCudaAlgo, Args&&... args) { - bool succeeded = true; - if(input) { - succeeded = input->isProductOn(HeterogeneousDevice::kGPUCuda); - } - if(succeeded) { - succeeded = scheduleGPUCuda(token, streamID, waitingTaskHolder, gpuCudaAlgo); - } - if(!succeeded) - scheduleImpl(token, streamID, std::move(waitingTaskHolder), input, std::forward(args)...); - } - // Break recursion, require CPU to be the last - template - void scheduleImpl(Token token, edm::StreamID streamID, edm::WaitingTaskWithArenaHolder waitingTaskHolder, const I *input, - accelerator::AlgoCPU cpuAlgo) { - scheduleCPU(token, streamID, std::move(waitingTaskHolder), cpuAlgo); - } - bool scheduleGPUMock(Token token, edm::StreamID streamID, edm::WaitingTaskWithArenaHolder waitingTaskHolder, accelerator::AlgoGPUMockBase& gpuMockAlgo); - bool scheduleGPUCuda(Token token, edm::StreamID streamID, edm::WaitingTaskWithArenaHolder waitingTaskHolder, accelerator::AlgoGPUCudaBase& gpuCudaAlgo); - void scheduleCPU(Token token, edm::StreamID streamID, edm::WaitingTaskWithArenaHolder waitingTaskHolder, accelerator::AlgoCPUBase& cpuAlgo); - - - unsigned int numberOfStreams_ = 0; - - // nearly (if not all) happens multi-threaded, so we need some - // thread-locals to keep track in which module we are - static thread_local unsigned int currentModuleId_; - static thread_local std::string currentModuleLabel_; // only for printouts - - // TODO: how to treat subprocesses? - std::mutex moduleMutex_; - std::vector moduleIds_; // list of module ids that have registered something on the service - std::vector algoExecutionLocation_; -}; - -#endif diff --git a/HeterogeneousCore/AcceleratorService/plugins/BuildFile.xml b/HeterogeneousCore/AcceleratorService/plugins/BuildFile.xml deleted file mode 100644 index 3369da6bea0ed..0000000000000 --- a/HeterogeneousCore/AcceleratorService/plugins/BuildFile.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/HeterogeneousCore/AcceleratorService/plugins/plugins.cc b/HeterogeneousCore/AcceleratorService/plugins/plugins.cc deleted file mode 100644 index 6a5440cf0b161..0000000000000 --- a/HeterogeneousCore/AcceleratorService/plugins/plugins.cc +++ /dev/null @@ -1,4 +0,0 @@ -#include "FWCore/ServiceRegistry/interface/ServiceMaker.h" -#include "HeterogeneousCore/AcceleratorService/interface/AcceleratorService.h" - -DEFINE_FWK_SERVICE(AcceleratorService); diff --git a/HeterogeneousCore/AcceleratorService/src/AcceleratorService.cc b/HeterogeneousCore/AcceleratorService/src/AcceleratorService.cc deleted file mode 100644 index cb3bb51291992..0000000000000 --- a/HeterogeneousCore/AcceleratorService/src/AcceleratorService.cc +++ /dev/null @@ -1,125 +0,0 @@ -#include "HeterogeneousCore/AcceleratorService/interface/AcceleratorService.h" - -#include "FWCore/ServiceRegistry/interface/ActivityRegistry.h" -#include "FWCore/ServiceRegistry/interface/SystemBounds.h" -#include "DataFormats/Provenance/interface/ModuleDescription.h" - -#include "FWCore/MessageLogger/interface/MessageLogger.h" - -#include "FWCore/ServiceRegistry/interface/Service.h" -#include "HeterogeneousCore/CUDAServices/interface/CUDAService.h" - -#include -#include -#include -#include -#include -#include - -thread_local unsigned int AcceleratorService::currentModuleId_ = std::numeric_limits::max(); -thread_local std::string AcceleratorService::currentModuleLabel_ = ""; - -AcceleratorService::AcceleratorService(edm::ParameterSet const& iConfig, edm::ActivityRegistry& iRegistry) { - iRegistry.watchPreallocate( this, &AcceleratorService::preallocate ); - iRegistry.watchPreModuleConstruction (this, &AcceleratorService::preModuleConstruction ); - iRegistry.watchPostModuleConstruction(this, &AcceleratorService::postModuleConstruction ); -} - -// signals -void AcceleratorService::preallocate(edm::service::SystemBounds const& bounds) { - numberOfStreams_ = bounds.maxNumberOfStreams(); - LogTrace("AcceleratorService") << "AcceleratorService: number of streams " << numberOfStreams_; - // called after module construction, so initialize algoExecutionLocation_ here - algoExecutionLocation_.resize(moduleIds_.size()*numberOfStreams_); -} - -void AcceleratorService::preModuleConstruction(edm::ModuleDescription const& desc) { - currentModuleId_ = desc.id(); - currentModuleLabel_ = desc.moduleLabel(); -} -void AcceleratorService::postModuleConstruction(edm::ModuleDescription const& desc) { - currentModuleId_ = std::numeric_limits::max(); - currentModuleLabel_ = ""; -} - - -// actual functionality -AcceleratorService::Token AcceleratorService::book() { - if(currentModuleId_ == std::numeric_limits::max()) - throw cms::Exception("AcceleratorService") << "Calling AcceleratorService::register() outside of EDModule constructor is forbidden."; - - unsigned int index=0; - - std::lock_guard guard(moduleMutex_); - - auto found = std::find(moduleIds_.begin(), moduleIds_.end(), currentModuleId_); - if(found == moduleIds_.end()) { - index = moduleIds_.size(); - moduleIds_.push_back(currentModuleId_); - } - else { - index = std::distance(moduleIds_.begin(), found); - } - - LogTrace("AcceleratorService") << "AcceleratorService::book for module " << currentModuleId_ << " " << currentModuleLabel_ << " token id " << index << " moduleIds_.size() " << moduleIds_.size(); - - return Token(index); -} - -bool AcceleratorService::scheduleGPUMock(Token token, edm::StreamID streamID, edm::WaitingTaskWithArenaHolder waitingTaskHolder, accelerator::AlgoGPUMockBase& gpuMockAlgo) { - // Decide randomly whether to run on GPU or CPU to simulate scheduler decisions - std::random_device r; - std::mt19937 gen(r()); - auto dist1 = std::uniform_int_distribution<>(0, 10); // simulate the scheduler decision - if(dist1(gen) == 0) { - LogTrace("AcceleratorService") << " AcceleratorService token " << token.id() << " stream " << streamID << " GPUMock is disabled (by chance)"; - return false; - } - - LogTrace("AcceleratorService") << " AcceleratorService token " << token.id() << " stream " << streamID << " launching task on GPUMock"; - gpuMockAlgo.runGPUMock([waitingTaskHolder = std::move(waitingTaskHolder), - token = token, - streamID = streamID, - &location = algoExecutionLocation_[tokenStreamIdsToDataIndex(token.id(), streamID)] - ]() mutable { - LogTrace("AcceleratorService") << " AcceleratorService token " << token.id() << " stream " << streamID << " task finished on GPUMock"; - location = HeterogeneousDeviceId(HeterogeneousDevice::kGPUMock, 0); - waitingTaskHolder.doneWaiting(nullptr); - }); - LogTrace("AcceleratorService") << " AcceleratorService token " << token.id() << " stream " << streamID << " launched task on GPUMock asynchronously(?)"; - return true; -} - -bool AcceleratorService::scheduleGPUCuda(Token token, edm::StreamID streamID, edm::WaitingTaskWithArenaHolder waitingTaskHolder, accelerator::AlgoGPUCudaBase& gpuCudaAlgo) { - edm::Service cudaService; - if(!cudaService->enabled()) { - LogTrace("AcceleratorService") << " AcceleratorService token " << token.id() << " stream " << streamID << " CudaService is disabled"; - return false; - } - - LogTrace("AcceleratorService") << " AcceleratorService token " << token.id() << " stream " << streamID << " launching task on GPU"; - gpuCudaAlgo.runGPUCuda([waitingTaskHolder = std::move(waitingTaskHolder), - token = token, - streamID = streamID, - &location = algoExecutionLocation_[tokenStreamIdsToDataIndex(token.id(), streamID)] - ]() mutable { - LogTrace("AcceleratorService") << " AcceleratorService token " << token.id() << " stream " << streamID << " task finished on GPU"; - location = HeterogeneousDeviceId(HeterogeneousDevice::kGPUCuda, 0); - waitingTaskHolder.doneWaiting(nullptr); - }); - LogTrace("AcceleratorService") << " AcceleratorService token " << token.id() << " stream " << streamID << " launched task on GPU asynchronously(?)"; - return true; -} - -void AcceleratorService::scheduleCPU(Token token, edm::StreamID streamID, edm::WaitingTaskWithArenaHolder waitingTaskHolder, accelerator::AlgoCPUBase& cpuAlgo) { - LogTrace("AcceleratorService") << " AcceleratorService token " << token.id() << " stream " << streamID << " launching task on CPU"; - cpuAlgo.runCPU(); - algoExecutionLocation_[tokenStreamIdsToDataIndex(token.id(), streamID)] = HeterogeneousDeviceId(HeterogeneousDevice::kCPU, 0); - LogTrace("AcceleratorService") << " AcceleratorService token " << token.id() << " stream " << streamID << " task finished on CPU"; -} - - -unsigned int AcceleratorService::tokenStreamIdsToDataIndex(unsigned int tokenId, edm::StreamID streamId) const { - assert(streamId < numberOfStreams_); - return tokenId*numberOfStreams_ + streamId; -} diff --git a/HeterogeneousCore/AcceleratorService/test/TestAcceleratorServiceProducerGPU.cc b/HeterogeneousCore/AcceleratorService/test/TestAcceleratorServiceProducerGPU.cc deleted file mode 100644 index 1b6f1c00adb41..0000000000000 --- a/HeterogeneousCore/AcceleratorService/test/TestAcceleratorServiceProducerGPU.cc +++ /dev/null @@ -1,177 +0,0 @@ -#include "FWCore/Framework/interface/stream/EDProducer.h" - -#include "FWCore/Framework/interface/Event.h" -#include "FWCore/Framework/interface/MakerMacros.h" - -#include "FWCore/ParameterSet/interface/ParameterSet.h" - -#include "FWCore/ServiceRegistry/interface/Service.h" -#include "HeterogeneousCore/AcceleratorService/interface/AcceleratorService.h" -#include "HeterogeneousCore/CUDAServices/interface/CUDAService.h" - -#include "HeterogeneousCore/Product/interface/HeterogeneousProduct.h" - -#include "TestAcceleratorServiceProducerGPUHelpers.h" - -#include -#include -#include -#include - -#include -#include - -namespace { - using OutputType = HeterogeneousProductImpl, - heterogeneous::GPUCudaProduct>; - - class TestAlgo { - public: - TestAlgo() { - edm::Service cudaService; - if(cudaService->enabled()) { - gpuAlgo_ = std::make_unique(); - } - } - ~TestAlgo() = default; - - void setInput(const OutputType *input, unsigned int eventId, unsigned int streamId) { - input_ = input; - eventId_ = eventId; - streamId_ = streamId; - } - - void runCPU() { - std::random_device r; - std::mt19937 gen(r()); - auto dist = std::uniform_real_distribution<>(1.0, 3.0); - auto dur = dist(gen); - edm::LogPrint("TestAcceleratorServiceProducerGPU") << " Task (CPU) for event " << eventId_ << " in stream " << streamId_ << " will take " << dur << " seconds"; - std::this_thread::sleep_for(std::chrono::seconds(1)*dur); - - auto input = input_ ? input_->getProduct() : 0U; - - output_ = input + streamId_*100 + eventId_; - } - - void runGPUCuda(std::function callback) { - edm::LogPrint("TestAcceleratorServiceProducerGPU") << " Task (GPU) for event " << eventId_ << " in stream " << streamId_ << " running on GPU asynchronously"; - gpuOutput_ = gpuAlgo_->runAlgo(0, input_ ? input_->getProduct() : std::make_pair(nullptr, nullptr), - [callback,this](){ - edm::LogPrint("TestAcceleratorServiceProducerGPU") << " GPU kernel finished (in callback)"; - callback(); - }); - edm::LogPrint("TestAcceleratorServiceProducerGPU") << " Task (GPU) for event " << eventId_ << " in stream " << streamId_ << " launched"; - } - - auto makeTransfer() const { - return [this](const TestAcceleratorServiceProducerGPUTask::ResultTypeRaw& src, unsigned int& dst) { - edm::LogPrint("TestAcceleratorServiceProducerGPU") << " Task (GPU) for event " << eventId_ << " in stream " << streamId_ << " copying to CPU"; - dst = gpuAlgo_->getResult(src); - edm::LogPrint("TestAcceleratorServiceProducerGPU") << " GPU result " << dst; - }; - } - - unsigned int getOutput() const { return output_; } - TestAcceleratorServiceProducerGPUTask::ResultTypeRaw getGPUOutput() { - gpuAlgo_->release(); - return std::make_pair(gpuOutput_.first.get(), gpuOutput_.second.get()); - } - - private: - // input - const OutputType *input_ = nullptr; - unsigned int eventId_ = 0; - unsigned int streamId_ = 0; - - // GPU stuff - std::unique_ptr gpuAlgo_; - TestAcceleratorServiceProducerGPUTask::ResultType gpuOutput_; - - // output - unsigned int output_; - }; -} - -class TestAcceleratorServiceProducerGPU: public edm::stream::EDProducer { -public: - explicit TestAcceleratorServiceProducerGPU(edm::ParameterSet const& iConfig); - ~TestAcceleratorServiceProducerGPU() = default; - - static void fillDescriptions(edm::ConfigurationDescriptions& descriptions); - -private: - void acquire(const edm::Event& iEvent, const edm::EventSetup& iSetup, edm::WaitingTaskWithArenaHolder waitingTask) override; - void produce(edm::Event& iEvent, const edm::EventSetup& iSetup) override; - - std::string label_; - AcceleratorService::Token accToken_; - - edm::EDGetTokenT srcToken_; - bool showResult_; - - TestAlgo algo_; -}; - - -TestAcceleratorServiceProducerGPU::TestAcceleratorServiceProducerGPU(const edm::ParameterSet& iConfig): - label_(iConfig.getParameter("@module_label")), - accToken_(edm::Service()->book()), - showResult_(iConfig.getUntrackedParameter("showResult")) -{ - auto srcTag = iConfig.getParameter("src"); - if(!srcTag.label().empty()) { - srcToken_ = consumes(srcTag); - } - - produces(); -} - -void TestAcceleratorServiceProducerGPU::acquire(const edm::Event& iEvent, const edm::EventSetup& iSetup, edm::WaitingTaskWithArenaHolder waitingTaskHolder) { - const OutputType *input = nullptr; - if(!srcToken_.isUninitialized()) { - edm::Handle hin; - iEvent.getByToken(srcToken_, hin); - input = &(hin->get()); - } - - algo_.setInput(input, iEvent.id().event(), iEvent.streamID()); - - edm::LogPrint("TestAcceleratorServiceProducerGPU") << "TestAcceleratorServiceProducerGPU::acquire begin event " << iEvent.id().event() << " stream " << iEvent.streamID() << " label " << label_ << " input " << input; - edm::Service acc; - acc->schedule(accToken_, iEvent.streamID(), std::move(waitingTaskHolder), input, - accelerator::algoGPUCuda(&algo_), - accelerator::algoCPU(&algo_) - ); - - edm::LogPrint("TestAcceleratorServiceProducerGPU") << "TestAcceleratorServiceProducerGPU::acquire end event " << iEvent.id().event() << " stream " << iEvent.streamID() << " label " << label_; -} - -void TestAcceleratorServiceProducerGPU::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) { - edm::LogPrint("TestAcceleratorServiceProducerGPU") << "TestAcceleratorServiceProducerGPU::produce begin event " << iEvent.id().event() << " stream " << iEvent.streamID() << " label " << label_; - // TODO: the following if-else structure will be repeated in all - // heterogeneous modules. Ideas to move it to system - // * algorithms implement "putInEvent()" which takes care of inserting exactly that product to event - // * better ideas? - std::unique_ptr ret; - edm::Service acc; - if(acc->algoExecutionLocation(accToken_, iEvent.streamID()).deviceType() == HeterogeneousDevice::kGPUCuda) { - ret = std::make_unique(OutputType(heterogeneous::gpuCudaProduct(algo_.getGPUOutput()), algo_.makeTransfer())); - } - else { - ret = std::make_unique(OutputType(heterogeneous::cpuProduct(algo_.getOutput()))); - } - - unsigned int value = showResult_ ? ret->get().getProduct() : 0; - edm::LogPrint("TestAcceleratorServiceProducerGPU") << "TestAcceleratorServiceProducerGPU::produce end event " << iEvent.id().event() << " stream " << iEvent.streamID() << " label " << label_ << " result " << value; - iEvent.put(std::move(ret)); -} - -void TestAcceleratorServiceProducerGPU::fillDescriptions(edm::ConfigurationDescriptions& descriptions) { - edm::ParameterSetDescription desc; - desc.add("src", edm::InputTag()); - desc.addUntracked("showResult", false); - descriptions.add("testAcceleratorServiceProducerGPU", desc); -} - -DEFINE_FWK_MODULE(TestAcceleratorServiceProducerGPU); diff --git a/HeterogeneousCore/AcceleratorService/test/TestAcceleratorServiceProducerGPUMock.cc b/HeterogeneousCore/AcceleratorService/test/TestAcceleratorServiceProducerGPUMock.cc deleted file mode 100644 index 0744cc898f20e..0000000000000 --- a/HeterogeneousCore/AcceleratorService/test/TestAcceleratorServiceProducerGPUMock.cc +++ /dev/null @@ -1,172 +0,0 @@ -#include "FWCore/Framework/interface/stream/EDProducer.h" - -#include "FWCore/Framework/interface/Event.h" -#include "FWCore/Framework/interface/MakerMacros.h" - -#include "FWCore/ParameterSet/interface/ParameterSet.h" - -#include "HeterogeneousCore/AcceleratorService/interface/AcceleratorService.h" -#include "FWCore/ServiceRegistry/interface/Service.h" - -#include "HeterogeneousCore/Product/interface/HeterogeneousProduct.h" - -#include "tbb/concurrent_vector.h" - -#include -#include -#include -#include - -namespace { - // hack for GPU mock - tbb::concurrent_vector > pendingFutures; - - using OutputType = HeterogeneousProductImpl, - heterogeneous::GPUMockProduct >; - - class TestAlgo { - public: - TestAlgo() {} - ~TestAlgo() = default; - - void setInput(const OutputType *input, unsigned int eventId, unsigned int streamId) { - input_ = input; - eventId_ = eventId; - streamId_ = streamId; - } - - void runCPU() { - std::random_device r; - std::mt19937 gen(r()); - auto dist = std::uniform_real_distribution<>(1.0, 3.0); - auto dur = dist(gen); - edm::LogPrint("TestAcceleratorServiceProducerGPUMock") << " Task (CPU) for event " << eventId_ << " in stream " << streamId_ << " will take " << dur << " seconds"; - std::this_thread::sleep_for(std::chrono::seconds(1)*dur); - - auto input = input_ ? input_->getProduct() : 0U; - - output_ = input + streamId_*100 + eventId_; - } - - void runGPUMock(std::function callback) { - std::random_device r; - std::mt19937 gen(r()); - auto dist = std::uniform_real_distribution<>(0.1, 1.0); - auto dur = dist(gen); - edm::LogPrint("TestAcceleratorServiceProducerGPUMock") << " Task (GPU) for event " << eventId_ << " in stream " << streamId_ << " will take " << dur << " seconds"; - ranOnGPU_ = true; - auto input = input_ ? input_->getProduct() : 0U; - - auto ret = std::async(std::launch::async, - [this, dur, input, - callback = std::move(callback) - ](){ - std::this_thread::sleep_for(std::chrono::seconds(1)*dur); - gpuOutput_ = input + streamId_*100 + eventId_; - callback(); - }); - pendingFutures.push_back(std::move(ret)); - } - - auto makeTransfer() const { - return [this](const unsigned int& src, unsigned int& dst) { - edm::LogPrint("TestAcceleratorServiceProducerGPUMock") << " Task (GPU) for event " << eventId_ << " in stream " << streamId_ << " copying to CPU"; - dst = src; - }; - } - - bool ranOnGPU() const { return ranOnGPU_; } - unsigned int getOutput() const { return output_; } - unsigned int getGPUOutput() const { return gpuOutput_; } - - private: - // input - const OutputType *input_ = nullptr; - unsigned int eventId_ = 0; - unsigned int streamId_ = 0; - - bool ranOnGPU_ = false; - - // simulating GPU memory - unsigned int gpuOutput_; - - // output - unsigned int output_; - }; -} - -class TestAcceleratorServiceProducerGPUMock: public edm::stream::EDProducer { -public: - explicit TestAcceleratorServiceProducerGPUMock(edm::ParameterSet const& iConfig); - ~TestAcceleratorServiceProducerGPUMock() = default; - - static void fillDescriptions(edm::ConfigurationDescriptions& descriptions); - -private: - void acquire(const edm::Event& iEvent, const edm::EventSetup& iSetup, edm::WaitingTaskWithArenaHolder waitingTask) override; - void produce(edm::Event& iEvent, const edm::EventSetup& iSetup) override; - - std::string label_; - AcceleratorService::Token accToken_; - - edm::EDGetTokenT srcToken_; - - TestAlgo algo_; -}; - - -TestAcceleratorServiceProducerGPUMock::TestAcceleratorServiceProducerGPUMock(const edm::ParameterSet& iConfig): - label_(iConfig.getParameter("@module_label")), - accToken_(edm::Service()->book()) -{ - auto srcTag = iConfig.getParameter("src"); - if(!srcTag.label().empty()) { - srcToken_ = consumes(srcTag); - } - - produces(); -} - -void TestAcceleratorServiceProducerGPUMock::acquire(const edm::Event& iEvent, const edm::EventSetup& iSetup, edm::WaitingTaskWithArenaHolder waitingTaskHolder) { - const OutputType *input = nullptr; - if(!srcToken_.isUninitialized()) { - edm::Handle hin; - iEvent.getByToken(srcToken_, hin); - input = &(hin->get()); - } - - algo_.setInput(input, iEvent.id().event(), iEvent.streamID()); - - edm::LogPrint("TestAcceleratorServiceProducerGPUMock") << "TestAcceleratorServiceProducerGPUMock::acquire begin event " << iEvent.id().event() << " stream " << iEvent.streamID() << " label " << label_ << " input " << input; - edm::Service acc; - acc->schedule(accToken_, iEvent.streamID(), std::move(waitingTaskHolder), input, - accelerator::algoGPUMock(&algo_), - accelerator::algoCPU(&algo_) - ); - edm::LogPrint("TestAcceleratorServiceProducerGPUMock") << "TestAcceleratorServiceProducerGPUMock::acquire end event " << iEvent.id().event() << " stream " << iEvent.streamID() << " label " << label_; -} - -void TestAcceleratorServiceProducerGPUMock::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) { - edm::LogPrint("TestAcceleratorServiceProducerGPUMock") << "TestAcceleratorServiceProducerGPUMock::produce begin event " << iEvent.id().event() << " stream " << iEvent.streamID() << " label " << label_; - std::unique_ptr ret; - unsigned int value = 0; - if(algo_.ranOnGPU()) { - ret = std::make_unique(OutputType(heterogeneous::gpuMockProduct(algo_.getGPUOutput()), algo_.makeTransfer())); - value = ret->get().getProduct(); - } - else { - ret = std::make_unique(OutputType(heterogeneous::cpuProduct(algo_.getOutput()))); - value = ret->get().getProduct(); - } - - edm::LogPrint("TestAcceleratorServiceProducerGPUMock") << "TestAcceleratorServiceProducerGPUMock::produce end event " << iEvent.id().event() << " stream " << iEvent.streamID() << " label " << label_ << " result " << value; - iEvent.put(std::move(ret)); -} - -void TestAcceleratorServiceProducerGPUMock::fillDescriptions(edm::ConfigurationDescriptions& descriptions) { - edm::ParameterSetDescription desc; - desc.add("src", edm::InputTag()); - descriptions.add("testAcceleratorServiceProducerGPUMock", desc); -} - -DEFINE_FWK_MODULE(TestAcceleratorServiceProducerGPUMock); diff --git a/HeterogeneousCore/CUDACore/BuildFile.xml b/HeterogeneousCore/CUDACore/BuildFile.xml new file mode 100644 index 0000000000000..ba6b35c6d0ce7 --- /dev/null +++ b/HeterogeneousCore/CUDACore/BuildFile.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/HeterogeneousCore/CUDACore/interface/GPUCuda.h b/HeterogeneousCore/CUDACore/interface/GPUCuda.h new file mode 100644 index 0000000000000..1413348b3b446 --- /dev/null +++ b/HeterogeneousCore/CUDACore/interface/GPUCuda.h @@ -0,0 +1,36 @@ +#ifndef HeterogeneousCore_CUDAServices_GPUCuda_h +#define HeterogeneousCore_CUDAServices_GPUCuda_h + +#include "FWCore/Concurrency/interface/WaitingTaskWithArenaHolder.h" +#include "FWCore/Framework/interface/Frameworkfwd.h" + +#include "HeterogeneousCore/Producer/interface/DeviceWrapper.h" +#include "HeterogeneousCore/Producer/interface/HeterogeneousEvent.h" + +#include + +#include + +namespace heterogeneous { + class GPUCuda { + public: + using CallbackType = std::function; + + virtual ~GPUCuda() noexcept(false); + + void call_beginStreamGPUCuda(edm::StreamID id); + bool call_acquireGPUCuda(DeviceBitSet inputLocation, edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup, edm::WaitingTaskWithArenaHolder waitingTaskHolder); + void call_produceGPUCuda(edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup); + + private: + virtual void beginStreamGPUCuda(edm::StreamID id, cuda::stream_t<>& cudaStream) {}; + virtual void acquireGPUCuda(const edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup, cuda::stream_t<>& cudaStream) = 0; + virtual void produceGPUCuda(edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup, cuda::stream_t<>& cudaStream) = 0; + + std::unique_ptr> cudaStream_; + int deviceId_ = -1; // device assigned to this edm::Stream + }; + DEFINE_DEVICE_WRAPPER(GPUCuda, HeterogeneousDevice::kGPUCuda); +} + +#endif diff --git a/HeterogeneousCore/CUDACore/src/GPUCuda.cc b/HeterogeneousCore/CUDACore/src/GPUCuda.cc new file mode 100644 index 0000000000000..983ae4039c28a --- /dev/null +++ b/HeterogeneousCore/CUDACore/src/GPUCuda.cc @@ -0,0 +1,82 @@ +#include "HeterogeneousCore/CUDACore/interface/GPUCuda.h" + +#include "FWCore/MessageLogger/interface/MessageLogger.h" +#include "FWCore/ServiceRegistry/interface/Service.h" +#include "HeterogeneousCore/CUDAServices/interface/CUDAService.h" + +#include + +#include + +namespace heterogeneous { + GPUCuda::~GPUCuda() noexcept(false) {} + + void GPUCuda::call_beginStreamGPUCuda(edm::StreamID id) { + edm::Service cudaService; + if(!cudaService->enabled()) { + return; + } + + // For startes we "statically" assign the device based on + // edm::Stream number. This is suboptimal if the number of + // edm::Streams is not a multiple of the number of CUDA devices + // (and even then there is no load balancing). + // + // TODO: improve. Possible ideas include + // - allocate M (< N(edm::Streams)) buffers per device per module, choose dynamically which (buffer, device) to use + // * the first module of a chain dictates the device for the rest of the chain + // - our own CUDA memory allocator + // * being able to cheaply allocate+deallocate scratch memory allows to make the execution fully dynamic e.g. based on current load + // * would probably still need some buffer space/device to hold e.g. conditions data + // - for conditions, how to handle multiple lumis per job? + deviceId_ = id % cudaService->numberOfDevices(); + + cuda::device::current::scoped_override_t<> setDeviceForThisScope(deviceId_); + + // Create the CUDA stream for this module-edm::Stream pair + auto current_device = cuda::device::current::get(); + cudaStream_ = std::make_unique>(current_device.create_stream(cuda::stream::implicitly_synchronizes_with_default_stream)); + + beginStreamGPUCuda(id, *cudaStream_); + } + + bool GPUCuda::call_acquireGPUCuda(DeviceBitSet inputLocation, edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup, edm::WaitingTaskWithArenaHolder waitingTaskHolder) { + edm::Service cudaService; + if(!cudaService->enabled()) { + return false; + } + + cuda::device::current::scoped_override_t<> setDeviceForThisScope(deviceId_); + + try { + iEvent.setInputLocation(HeterogeneousDeviceId(HeterogeneousDevice::kGPUCuda, 0)); + acquireGPUCuda(iEvent, iSetup, *cudaStream_); + cudaStream_->enqueue.callback([deviceId=deviceId_, + waitingTaskHolder, // copy needed for the catch block + locationSetter = iEvent.locationSetter() + ](cuda::stream::id_t streamId, cuda::status_t status) mutable { + if(status == cudaSuccess) { + locationSetter(HeterogeneousDeviceId(HeterogeneousDevice::kGPUCuda, deviceId)); + edm::LogPrint("GPUCuda") << " GPU kernel finished (in callback) device " << deviceId << " CUDA stream " << streamId; + waitingTaskHolder.doneWaiting(nullptr); + } + else { + auto error = cudaGetErrorName(status); + auto message = cudaGetErrorString(status); + waitingTaskHolder.doneWaiting(std::make_exception_ptr(cms::Exception("CUDAError") << "Callback of CUDA stream " << streamId << " in device " << deviceId << " error " << error << ": " << message)); + } + }); + } catch(...) { + waitingTaskHolder.doneWaiting(std::current_exception()); + } + return true; + } + + void GPUCuda::call_produceGPUCuda(edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup) { + // I guess we have to assume that produce() may be called from a different thread than acquire() was run + // The current CUDA device is a thread-local property, so have to set it here + cuda::device::current::scoped_override_t<> setDeviceForThisScope(deviceId_); + + produceGPUCuda(iEvent, iSetup, *cudaStream_); + } +} diff --git a/HeterogeneousCore/CUDAServices/BuildFile.xml b/HeterogeneousCore/CUDAServices/BuildFile.xml index e970a89fea444..c7232e16d910b 100644 --- a/HeterogeneousCore/CUDAServices/BuildFile.xml +++ b/HeterogeneousCore/CUDAServices/BuildFile.xml @@ -3,6 +3,7 @@ + diff --git a/HeterogeneousCore/CUDAServices/interface/CUDAService.h b/HeterogeneousCore/CUDAServices/interface/CUDAService.h index 11c8333254007..979bdba828f64 100644 --- a/HeterogeneousCore/CUDAServices/interface/CUDAService.h +++ b/HeterogeneousCore/CUDAServices/interface/CUDAService.h @@ -31,6 +31,15 @@ class CUDAService { // major, minor std::pair computeCapability(int device) { return computeCapabilities_.at(device); } + // Returns the id of device with most free memory. If none is found, returns -1. + int deviceWithMostFreeMemory() const; + + // Set the current device + void setCurrentDevice(int device) const; + + // Get the current device + int getCurrentDevice() const; + private: int numberOfDevices_ = 0; std::vector > computeCapabilities_; diff --git a/HeterogeneousCore/CUDAServices/src/CUDAService.cc b/HeterogeneousCore/CUDAServices/src/CUDAService.cc index 792d12dbd0022..4c3e884cf886a 100644 --- a/HeterogeneousCore/CUDAServices/src/CUDAService.cc +++ b/HeterogeneousCore/CUDAServices/src/CUDAService.cc @@ -6,8 +6,11 @@ #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h" #include +#include #include "HeterogeneousCore/CUDAUtilities/interface/getCudaDrvErrorString.h" +#include + CUDAService::CUDAService(edm::ParameterSet const& iConfig, edm::ActivityRegistry& iRegistry) { bool configEnabled = iConfig.getUntrackedParameter("enabled"); if(!configEnabled) { @@ -55,3 +58,33 @@ void CUDAService::fillDescriptions(edm::ConfigurationDescriptions & descriptions descriptions.add("CUDAService", desc); } + +int CUDAService::deviceWithMostFreeMemory() const { + size_t freeMem = 0; + int devId = -1; + for(int i=0; i freeMem) { + freeMem = mem; + devId = i; + } + } + return devId; +} + +void CUDAService::setCurrentDevice(int device) const { + cuda::device::current::set(device); +} + +int CUDAService::getCurrentDevice() const { + return cuda::device::current::get().id(); +} diff --git a/HeterogeneousCore/CUDAServices/test/testCUDAService.cpp b/HeterogeneousCore/CUDAServices/test/testCUDAService.cpp index 5ee60e3d68cde..0deb91bdb3f3d 100644 --- a/HeterogeneousCore/CUDAServices/test/testCUDAService.cpp +++ b/HeterogeneousCore/CUDAServices/test/testCUDAService.cpp @@ -26,7 +26,7 @@ int main() // Enable the service only if there are CUDA capable GPUs installed if( ret != cudaSuccess ) { - std::cout << "=== Test #1: SKIPPED. Unable to query the CUDA capable devices from the CUDA runtime API: (" + std::cout << "=== Tests #1-2: SKIPPED. Unable to query the CUDA capable devices from the CUDA runtime API: (" << ret << ") " << cudaGetErrorString( ret ) << ". Is the host equipped with CUDA capable GPUs? ===" << std::endl; } else @@ -103,11 +103,41 @@ int main() << std::endl; std::cout << std::endl; } + std::cout << "=== END Test #1. ===\n" << std::endl; + + // Test the device memory query + std::cout << "=== Test #2: CUDAService device free memory ===" << std::endl; + size_t mem=0; + int dev=-1; + for(int i=0; i mem) { + mem = free; + dev = i; + } + } + std::cout << "Device with most free memory " << dev << std::endl; + std::cout << " as given by CUDAService " << cs.deviceWithMostFreeMemory() << std::endl; + std::cout << "=== END Test #2. ===\n" << std::endl; + + // Test setting the current device + std::cout << "=== Test #3: CUDAService set/get device ===" << std::endl; + for(int i=0; i - diff --git a/HeterogeneousCore/Producer/interface/DeviceWrapper.h b/HeterogeneousCore/Producer/interface/DeviceWrapper.h new file mode 100644 index 0000000000000..ed711b8cf35a4 --- /dev/null +++ b/HeterogeneousCore/Producer/interface/DeviceWrapper.h @@ -0,0 +1,20 @@ +#ifndef HeterogeneousCore_Producer_DeviceWrapper_h +#define HeterogeneousCore_Producer_DeviceWrapper_h + +namespace heterogeneous { + template struct Mapping; +} + +#define DEFINE_DEVICE_WRAPPER(DEVICE, ENUM) \ + template <> \ + struct Mapping { \ + template \ + static void beginStream(DEVICE& algo, Args&&... args) { algo.call_beginStream##DEVICE(std::forward(args)...); } \ + template \ + static bool acquire(DEVICE& algo, Args&&... args) { return algo.call_acquire##DEVICE(std::forward(args)...); } \ + template \ + static void produce(DEVICE& algo, Args&&... args) { algo.call_produce##DEVICE(std::forward(args)...); } \ + static constexpr HeterogeneousDevice deviceEnum = ENUM; \ + } + +#endif diff --git a/HeterogeneousCore/Producer/interface/HeterogeneousEDProducer.h b/HeterogeneousCore/Producer/interface/HeterogeneousEDProducer.h new file mode 100644 index 0000000000000..a60b47b0f26cd --- /dev/null +++ b/HeterogeneousCore/Producer/interface/HeterogeneousEDProducer.h @@ -0,0 +1,207 @@ +#ifndef HeterogeneousCore_Producer_HeterogeneousEDProducer_h +#define HeterogeneousCore_Producer_HeterogeneousEDProducer_h + +#include "FWCore/Concurrency/interface/WaitingTaskWithArenaHolder.h" +#include "FWCore/Framework/interface/stream/EDProducer.h" +#include "FWCore/Framework/interface/Frameworkfwd.h" +#include "FWCore/Utilities/interface/Exception.h" + +#include "DataFormats/Common/interface/Handle.h" + +#include "HeterogeneousCore/Product/interface/HeterogeneousProduct.h" +#include "HeterogeneousCore/Producer/interface/HeterogeneousEvent.h" +#include "HeterogeneousCore/Producer/interface/DeviceWrapper.h" + +namespace heterogeneous { + class CPU { + public: + virtual ~CPU() noexcept(false); + + void call_beginStreamCPU(edm::StreamID id) { + beginStreamCPU(id); + } + bool call_acquireCPU(edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup, edm::WaitingTaskWithArenaHolder waitingTaskHolder); + void call_produceCPU(edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup) { + produceCPU(iEvent, iSetup); + } + + private: + virtual void beginStreamCPU(edm::StreamID id) {}; + virtual void acquireCPU(const edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup) = 0; + virtual void produceCPU(edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup) = 0; + }; + DEFINE_DEVICE_WRAPPER(CPU, HeterogeneousDevice::kCPU); + + class GPUMock { + public: + virtual ~GPUMock() noexcept(false); + + void call_beginStreamGPUMock(edm::StreamID id) { + beginStreamGPUMock(id); + } + bool call_acquireGPUMock(DeviceBitSet inputLocation, edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup, edm::WaitingTaskWithArenaHolder waitingTaskHolder); + void call_produceGPUMock(edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup) { + produceGPUMock(iEvent, iSetup); + } + + private: + virtual void beginStreamGPUMock(edm::StreamID id) {}; + virtual void acquireGPUMock(const edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup, std::function callback) = 0; + virtual void produceGPUMock(edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup) = 0; + }; + DEFINE_DEVICE_WRAPPER(GPUMock, HeterogeneousDevice::kGPUMock); +} + +namespace heterogeneous { + //////////////////// + template + struct CallBeginStream; + template + struct CallBeginStream { + template + static void call(T& ref, Args&&... args) { + // may not perfect-forward here in order to be able to forward arguments to next CallBeginStream. + Mapping::beginStream(ref, args...); + CallBeginStream::call(ref, std::forward(args)...); + } + }; + // break recursion and require CPU to be the last + template + struct CallBeginStream { + template + static void call(T& ref, Args&&... args) { + Mapping::beginStream(ref, std::forward(args)...); + } + }; + + //////////////////// + template + struct CallAcquire; + template + struct CallAcquire { + template + static void call(T& ref, const HeterogeneousProductBase *input, Args&&... args) { + bool succeeded = true; + DeviceBitSet inputLocation; + if(input) { + succeeded = input->isProductOn(Mapping::deviceEnum); + if(succeeded) { + inputLocation = input->onDevices(Mapping::deviceEnum); + } + } + if(succeeded) { + // may not perfect-forward here in order to be able to forward arguments to next CallAcquire. + succeeded = Mapping::acquire(ref, inputLocation, args...); + } + if(!succeeded) { + CallAcquire::call(ref, input, std::forward(args)...); + } + } + }; + // break recursion and require CPU to be the last + template + struct CallAcquire { + template + static void call(T& ref, const HeterogeneousProductBase *input, Args&&... args) { + Mapping::acquire(ref, std::forward(args)...); + } + }; + + //////////////////// + template + struct CallProduce; + template + struct CallProduce { + template + static void call(T& ref, edm::HeterogeneousEvent& iEvent, Args&&... args) { + if(iEvent.location().deviceType() == Mapping::deviceEnum) { + Mapping::produce(ref, iEvent, std::forward(args)...); + } + else { + CallProduce::call(ref, iEvent, std::forward(args)...); + } + } + }; + template + struct CallProduce { + template + static void call(T& ref, Args&&... args) {} + }; + + + template + class HeterogeneousDevices: public Devices... { + public: + void call_beginStream(edm::StreamID id) { + CallBeginStream::call(*this, id); + } + + void call_acquire(const HeterogeneousProductBase *input, + edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup, + edm::WaitingTaskWithArenaHolder waitingTaskHolder) { + CallAcquire::call(*this, input, iEvent, iSetup, std::move(waitingTaskHolder)); + } + + void call_produce(edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup) { + CallProduce::call(*this, iEvent, iSetup); + } + }; +} // end namespace heterogeneous + + +template +class HeterogeneousEDProducer: public Devices, public edm::stream::EDProducer { +public: + HeterogeneousEDProducer() {} + ~HeterogeneousEDProducer() = default; + +protected: + edm::EDGetTokenT consumesHeterogeneous(const edm::InputTag& tag) { + tokens_.push_back(this->template consumes(tag)); + return tokens_.back(); + } + +private: + void beginStream(edm::StreamID id) { + Devices::call_beginStream(id); + } + + void acquire(const edm::Event& iEvent, const edm::EventSetup& iSetup, edm::WaitingTaskWithArenaHolder waitingTaskHolder) override final { + const HeterogeneousProductBase *input = nullptr; + + std::vector products; + for(const auto& token: tokens_) { + edm::Handle handle; + iEvent.getByToken(token, handle); + if(handle.isValid()) { + // let the user acquire() code to deal with missing products + // (and hope they don't mess up the scheduling!) + products.push_back(handle.product()); + } + } + if(!products.empty()) { + // TODO: check all inputs, not just the first one + input = products[0]->getBase(); + } + + auto eventWrapper = edm::HeterogeneousEvent(&iEvent, &algoExecutionLocation_); + Devices::call_acquire(input, eventWrapper, iSetup, std::move(waitingTaskHolder)); + } + + void produce(edm::Event& iEvent, const edm::EventSetup& iSetup) override final { + if(algoExecutionLocation_.deviceType() == HeterogeneousDeviceId::kInvalidDevice) { + // TODO: eventually fall back to CPU + throw cms::Exception("LogicError") << "Trying to produce(), but algorithm was not executed successfully anywhere?"; + } + auto eventWrapper = edm::HeterogeneousEvent(&iEvent, &algoExecutionLocation_); + Devices::call_produce(eventWrapper, iSetup); + } + + std::vector > tokens_; + HeterogeneousDeviceId algoExecutionLocation_; +}; + +#endif + + + diff --git a/HeterogeneousCore/Producer/interface/HeterogeneousEvent.h b/HeterogeneousCore/Producer/interface/HeterogeneousEvent.h new file mode 100644 index 0000000000000..98595dbd6baa6 --- /dev/null +++ b/HeterogeneousCore/Producer/interface/HeterogeneousEvent.h @@ -0,0 +1,121 @@ +#ifndef HeterogeneousCore_Producer_HeterogeneousEvent_h +#define HeterogeneousCore_Producer_HeterogeneousEvent_h + +#include "FWCore/Framework/interface/Event.h" +#include "DataFormats/Common/interface/Handle.h" + +#include "HeterogeneousCore/Product/interface/HeterogeneousDeviceId.h" +#include "HeterogeneousCore/Product/interface/HeterogeneousProduct.h" + +namespace edm { + class HeterogeneousEvent { + public: + HeterogeneousEvent(const edm::Event *event, HeterogeneousDeviceId *location): constEvent_(event), location_(location) {} + HeterogeneousEvent(edm::Event *event, HeterogeneousDeviceId *location): event_(event), constEvent_(event), location_(location) {} + + // Accessors to members + edm::Event& event() { return *event_; } + const edm::Event& event() const { return *constEvent_; } + + // For the "acquire" phase, the "input location" is used for + // scheduling, while "location" is used to set the location where + // the algorithm was run + void setInputLocation(HeterogeneousDeviceId location) { inputLocation_ = location; } + + std::function locationSetter() { + return [loc=location_](HeterogeneousDeviceId location) { *loc = location; }; + } + const HeterogeneousDeviceId& location() const { return *location_; } + + // Delegate to edm::Event + auto id() const { return constEvent_->id(); } + auto streamID() const { return constEvent_->streamID(); } + + + template + void getByToken(const Token& token, edm::Handle& handle) const { + edm::Handle tmp; + constEvent_->getByToken(token, tmp); + if(tmp.failedToGet()) { + auto copy = tmp.whyFailedFactory(); + handle = edm::Handle(std::move(copy)); + return; + } + if(tmp.isValid()) { +#define CASE(ENUM) case ENUM: this->template get(handle, tmp, 0); break + switch(inputLocation_.deviceType()) { + CASE(HeterogeneousDevice::kCPU); + CASE(HeterogeneousDevice::kGPUMock); + CASE(HeterogeneousDevice::kGPUCuda); + default: + throw cms::Exception("LogicError") << "edm::HeterogeneousEvent::getByToken(): no case statement for device " << static_cast(location().deviceType()); + } +#undef CASE + } + } + + template + auto put(std::unique_ptr product) { + return event_->put(std::move(product)); + } + + template + void put(std::unique_ptr product) { + assert(location().deviceType() == HeterogeneousDevice::kCPU); + event_->put(std::make_unique(Product(heterogeneous::HeterogeneousDeviceTag(), std::move(*product)))); + } + + template + void put(std::unique_ptr product, F transferToCPU) { + std::unique_ptr prod; +#define CASE(ENUM) case ENUM: this->template make(prod, std::move(product), std::move(transferToCPU), 0); break + switch(location().deviceType()) { + CASE(HeterogeneousDevice::kGPUMock); + CASE(HeterogeneousDevice::kGPUCuda); + default: + throw cms::Exception("LogicError") << "edm::HeterogeneousEvent::put(): no case statement for device " << static_cast(location().deviceType()); + } +#undef CASE + event_->put(std::move(prod)); + } + + private: + template + typename std::enable_if_t::value, void> + get(edm::Handle& dst, const edm::Handle& src, int) const { + const auto& concrete = src->get(); + const auto& provenance = src.provenance(); + dst = edm::Handle(&(concrete.template getProduct()), provenance); + } + template + void get(edm::Handle& dst, const edm::Handle& src, long) const { + throw cms::Exception("Assert") << "Invalid call to get, Device " << static_cast(Device) + << " Product " << typeid(Product).name() + << " Type " << typeid(Type).name() + << " CanGet::FromType " << typeid(typename Product::template CanGet::FromType).name() + << " CanGet::value " << Product::template CanGet::value; + } + + template + typename std::enable_if_t::value, void> + make(std::unique_ptr& ret, std::unique_ptr product, F transferToCPU, int) { + ret = std::make_unique(Product(heterogeneous::HeterogeneousDeviceTag(), + std::move(*product), location(), std::move(transferToCPU))); + } + template + void make(std::unique_ptr& ret, std::unique_ptr product, F transferToCPU, long) { + throw cms::Exception("Assert") << "Invalid call to make, Device " << static_cast(Device) + << " Product " << typeid(Product).name() + << " Type " << typeid(Type).name() + << " CanPut::ToType " << typeid(typename Product::template CanPut::ToType).name() + << " CanPut::value " << Product::template CanPut::value; + } + + edm::Event *event_ = nullptr; + const edm::Event *constEvent_ = nullptr; + HeterogeneousDeviceId inputLocation_; + HeterogeneousDeviceId *location_ = nullptr; + }; +} // end namespace edm + +#endif diff --git a/HeterogeneousCore/Producer/src/HeterogeneousEDProducer.cc b/HeterogeneousCore/Producer/src/HeterogeneousEDProducer.cc new file mode 100644 index 0000000000000..c7f7f152bd75d --- /dev/null +++ b/HeterogeneousCore/Producer/src/HeterogeneousEDProducer.cc @@ -0,0 +1,53 @@ +#include "HeterogeneousCore/Producer/interface/HeterogeneousEDProducer.h" + +#include "FWCore/MessageLogger/interface/MessageLogger.h" + +#include +#include +#include +#include + +namespace heterogeneous { + CPU::~CPU() noexcept(false) {} + + bool CPU::call_acquireCPU(edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup, edm::WaitingTaskWithArenaHolder waitingTaskHolder) { + std::exception_ptr exc; + try { + iEvent.setInputLocation(HeterogeneousDeviceId(HeterogeneousDevice::kCPU)); + acquireCPU(iEvent, iSetup); + iEvent.locationSetter()(HeterogeneousDeviceId(HeterogeneousDevice::kCPU)); + } catch(...) { + exc = std::current_exception(); + } + waitingTaskHolder.doneWaiting(exc); + return true; + } + + GPUMock::~GPUMock() noexcept(false) {} + + bool GPUMock::call_acquireGPUMock(DeviceBitSet inputLocation, edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup, edm::WaitingTaskWithArenaHolder waitingTaskHolder) { + // Decide randomly whether to run on GPU or CPU to simulate scheduler decisions + std::random_device r; + std::mt19937 gen(r()); + auto dist1 = std::uniform_int_distribution<>(0, 3); // simulate GPU (in)availability + if(dist1(gen) == 0) { + edm::LogPrint("HeterogeneousEDProducer") << "Mock GPU is not available (by chance)"; + return false; + } + + try { + iEvent.setInputLocation(HeterogeneousDeviceId(HeterogeneousDevice::kGPUMock, 0)); + acquireGPUMock(iEvent, iSetup, + [waitingTaskHolder, // copy needed for the catch block + locationSetter=iEvent.locationSetter(), + location=&(iEvent.location()) + ]() mutable { + locationSetter(HeterogeneousDeviceId(HeterogeneousDevice::kGPUMock, 0)); + waitingTaskHolder.doneWaiting(nullptr); + }); + } catch(...) { + waitingTaskHolder.doneWaiting(std::current_exception()); + } + return true; + } +} diff --git a/HeterogeneousCore/AcceleratorService/test/BuildFile.xml b/HeterogeneousCore/Producer/test/BuildFile.xml similarity index 50% rename from HeterogeneousCore/AcceleratorService/test/BuildFile.xml rename to HeterogeneousCore/Producer/test/BuildFile.xml index 7c4b325911ade..419ee954e0936 100644 --- a/HeterogeneousCore/AcceleratorService/test/BuildFile.xml +++ b/HeterogeneousCore/Producer/test/BuildFile.xml @@ -1,18 +1,19 @@ - + - + - + - + + diff --git a/HeterogeneousCore/AcceleratorService/test/TestAcceleratorServiceAnalyzer.cc b/HeterogeneousCore/Producer/test/TestHeterogeneousEDProducerAnalyzer.cc similarity index 69% rename from HeterogeneousCore/AcceleratorService/test/TestAcceleratorServiceAnalyzer.cc rename to HeterogeneousCore/Producer/test/TestHeterogeneousEDProducerAnalyzer.cc index 16f21f267d3fb..f07ceaba66d6e 100644 --- a/HeterogeneousCore/AcceleratorService/test/TestAcceleratorServiceAnalyzer.cc +++ b/HeterogeneousCore/Producer/test/TestHeterogeneousEDProducerAnalyzer.cc @@ -9,10 +9,10 @@ #include -class TestAcceleratorServiceAnalyzer: public edm::global::EDAnalyzer<> { +class TestHeterogeneousEDProducerAnalyzer: public edm::global::EDAnalyzer<> { public: - explicit TestAcceleratorServiceAnalyzer(edm::ParameterSet const& iConfig); - ~TestAcceleratorServiceAnalyzer() = default; + explicit TestHeterogeneousEDProducerAnalyzer(edm::ParameterSet const& iConfig); + ~TestHeterogeneousEDProducerAnalyzer() = default; static void fillDescriptions(edm::ConfigurationDescriptions& descriptions); @@ -25,7 +25,7 @@ class TestAcceleratorServiceAnalyzer: public edm::global::EDAnalyzer<> { std::vector> srcTokens_; }; -TestAcceleratorServiceAnalyzer::TestAcceleratorServiceAnalyzer(const edm::ParameterSet& iConfig): +TestHeterogeneousEDProducerAnalyzer::TestHeterogeneousEDProducerAnalyzer(const edm::ParameterSet& iConfig): label_(iConfig.getParameter("@module_label")), srcTokens_(edm::vector_transform(iConfig.getParameter >("src"), [this](const edm::InputTag& tag) { @@ -33,18 +33,18 @@ TestAcceleratorServiceAnalyzer::TestAcceleratorServiceAnalyzer(const edm::Parame })) {} -void TestAcceleratorServiceAnalyzer::fillDescriptions(edm::ConfigurationDescriptions& descriptions) { +void TestHeterogeneousEDProducerAnalyzer::fillDescriptions(edm::ConfigurationDescriptions& descriptions) { edm::ParameterSetDescription desc; desc.add>("src", std::vector{}); - descriptions.add("testAcceleratorServiceAnalyzer", desc); + descriptions.add("testHeterogeneousEDProducerAnalyzer", desc); } -void TestAcceleratorServiceAnalyzer::analyze(edm::StreamID streamID, const edm::Event& iEvent, const edm::EventSetup& iSetup) const { +void TestHeterogeneousEDProducerAnalyzer::analyze(edm::StreamID streamID, const edm::Event& iEvent, const edm::EventSetup& iSetup) const { edm::Handle hinput; int inp=0; for(const auto& token: srcTokens_) { iEvent.getByToken(token, hinput); - edm::LogPrint("TestAcceleratorServiceAnalyzer") << "Analyzer event " << iEvent.id().event() + edm::LogPrint("TestHeterogeneousEDProducerAnalyzer") << "Analyzer event " << iEvent.id().event() << " stream " << streamID << " label " << label_ << " coll " << inp @@ -53,4 +53,4 @@ void TestAcceleratorServiceAnalyzer::analyze(edm::StreamID streamID, const edm:: } } -DEFINE_FWK_MODULE(TestAcceleratorServiceAnalyzer); +DEFINE_FWK_MODULE(TestHeterogeneousEDProducerAnalyzer); diff --git a/HeterogeneousCore/Producer/test/TestHeterogeneousEDProducerGPU.cc b/HeterogeneousCore/Producer/test/TestHeterogeneousEDProducerGPU.cc new file mode 100644 index 0000000000000..83afa1e8ca373 --- /dev/null +++ b/HeterogeneousCore/Producer/test/TestHeterogeneousEDProducerGPU.cc @@ -0,0 +1,161 @@ +#include "HeterogeneousCore/Producer/interface/HeterogeneousEDProducer.h" + +#include "FWCore/Framework/interface/Event.h" +#include "FWCore/Framework/interface/MakerMacros.h" + +#include "FWCore/ParameterSet/interface/ParameterSet.h" + +#include "FWCore/ServiceRegistry/interface/Service.h" +#include "HeterogeneousCore/CUDAServices/interface/CUDAService.h" +#include "HeterogeneousCore/CUDACore/interface/GPUCuda.h" +#include "HeterogeneousCore/Product/interface/HeterogeneousProduct.h" + +#include "TestHeterogeneousEDProducerGPUHelpers.h" + +#include +#include +#include + +#include +#include + +/** + * The purpose of this test is to demonstrate the following + * - EDProducer implementing an algorithm for CPU and a CUDA GPU + * - How to initialize the GPU algorithm and make once-per-job-per-stream allocations on the device + * - How to read heterogeneous product from event + * - How to write heterogeneous product to event + * * Especially pointers to device memory + */ +class TestHeterogeneousEDProducerGPU: public HeterogeneousEDProducer > { +public: + explicit TestHeterogeneousEDProducerGPU(edm::ParameterSet const& iConfig); + ~TestHeterogeneousEDProducerGPU() = default; + + static void fillDescriptions(edm::ConfigurationDescriptions& descriptions); + +private: + using OutputType = HeterogeneousProductImpl, + heterogeneous::GPUCudaProduct>; + + void beginStreamGPUCuda(edm::StreamID streamId, cuda::stream_t<>& cudaStream) override; + + void acquireCPU(const edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup) override; + void acquireGPUCuda(const edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup, cuda::stream_t<>& cudaStream) override; + + void produceCPU(edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup) override; + void produceGPUCuda(edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup, cuda::stream_t<>& cudaStream) override; + + std::string label_; + edm::EDGetTokenT srcToken_; + + // GPU stuff + std::unique_ptr gpuAlgo_; + TestHeterogeneousEDProducerGPUTask::ResultType gpuOutput_; + + // output + unsigned int output_; +}; + +TestHeterogeneousEDProducerGPU::TestHeterogeneousEDProducerGPU(edm::ParameterSet const& iConfig): + label_(iConfig.getParameter("@module_label")) +{ + auto srcTag = iConfig.getParameter("src"); + if(!srcTag.label().empty()) { + srcToken_ = consumesHeterogeneous(srcTag); + } + + produces(); +} + +void TestHeterogeneousEDProducerGPU::fillDescriptions(edm::ConfigurationDescriptions& descriptions) { + edm::ParameterSetDescription desc; + desc.add("src", edm::InputTag()); + descriptions.add("testHeterogeneousEDProducerGPU2", desc); +} + +void TestHeterogeneousEDProducerGPU::beginStreamGPUCuda(edm::StreamID streamId, cuda::stream_t<>& cudaStream) { + edm::Service cs; + + edm::LogPrint("TestHeterogeneousEDProducerGPU") << " " << label_ << " TestHeterogeneousEDProducerGPU::beginStreamGPUCuda begin stream " << streamId << " device " << cs->getCurrentDevice(); + + gpuAlgo_ = std::make_unique(); + + edm::LogPrint("TestHeterogeneousEDProducerGPU") << " " << label_ << " TestHeterogeneousEDProducerGPU::beginStreamGPUCuda end stream " << streamId << " device " << cs->getCurrentDevice(); +} + +void TestHeterogeneousEDProducerGPU::acquireCPU(const edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup) { + edm::LogPrint("TestHeterogeneousEDProducerGPU") << " " << label_ << " TestHeterogeneousEDProducerGPU::acquireCPU begin event " << iEvent.id().event() << " stream " << iEvent.streamID(); + + unsigned int input = 0; + if(!srcToken_.isUninitialized()) { + edm::Handle hin; + iEvent.getByToken(srcToken_, hin); + input = *hin; + } + + std::random_device r; + std::mt19937 gen(r()); + auto dist = std::uniform_real_distribution<>(1.0, 3.0); + auto dur = dist(gen); + edm::LogPrint("TestHeterogeneousEDProducerGPU") << " Task (CPU) for event " << iEvent.id().event() << " in stream " << iEvent.streamID() << " will take " << dur << " seconds"; + std::this_thread::sleep_for(std::chrono::seconds(1)*dur); + + output_ = input + iEvent.streamID()*100 + iEvent.id().event(); + + edm::LogPrint("TestHeterogeneousEDProducerGPU") << " " << label_ << " TestHeterogeneousEDProducerGPU::acquireCPU end event " << iEvent.id().event() << " stream " << iEvent.streamID(); +} + +void TestHeterogeneousEDProducerGPU::acquireGPUCuda(const edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup, cuda::stream_t<>& cudaStream) { + edm::Service cs; + edm::LogPrint("TestHeterogeneousEDProducerGPU") << " " << label_ << " TestHeterogeneousEDProducerGPU::acquireGPUCuda begin event " << iEvent.id().event() << " stream " << iEvent.streamID() << " device " << cs->getCurrentDevice(); + + gpuOutput_.first.reset(); + gpuOutput_.second.reset(); + + TestHeterogeneousEDProducerGPUTask::ResultTypeRaw input = std::make_pair(nullptr, nullptr); + if(!srcToken_.isUninitialized()) { + edm::Handle hin; + iEvent.getByToken(srcToken_, hin); + input = *hin; + } + + gpuOutput_ = gpuAlgo_->runAlgo(label_, 0, input, cudaStream); + + edm::LogPrint("TestHeterogeneousEDProducerGPU") << " " << label_ << " TestHeterogeneousEDProducerGPU::acquireGPUCuda end event " << iEvent.id().event() << " stream " << iEvent.streamID() << " device " << cs->getCurrentDevice(); +} + +void TestHeterogeneousEDProducerGPU::produceCPU(edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup) { + edm::LogPrint("TestHeterogeneousEDProducerGPU") << label_ << " TestHeterogeneousEDProducerGPU::produceCPU begin event " << iEvent.id().event() << " stream " << iEvent.streamID(); + + iEvent.put(std::make_unique(output_)); + + edm::LogPrint("TestHeterogeneousEDProducerGPU") << label_ << " TestHeterogeneousEDProducerGPU::produceCPU end event " << iEvent.id().event() << " stream " << iEvent.streamID() << " result " << output_; +} + +void TestHeterogeneousEDProducerGPU::produceGPUCuda(edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup, cuda::stream_t<>& cudaStream) { + edm::Service cs; + edm::LogPrint("TestHeterogeneousEDProducerGPU") << label_ << " TestHeterogeneousEDProducerGPU::produceGPUCuda begin event " << iEvent.id().event() << " stream " << iEvent.streamID() << " device " << cs->getCurrentDevice(); + + gpuAlgo_->release(label_, cudaStream); + iEvent.put(std::make_unique(gpuOutput_.first.get(), gpuOutput_.second.get()), + [this, eventId=iEvent.event().id().event(), streamId=iEvent.event().streamID(), + dev=cs->getCurrentDevice(), &cudaStream + ](const TestHeterogeneousEDProducerGPUTask::ResultTypeRaw& src, unsigned int& dst) { + // TODO: try to abstract both the current device setting and the delivery of cuda::stream to this function + // It needs some further thought so I leave it now as it is + // Maybe "per-thread default stream" would help as they are regular CUDA streams (wrt. to the default stream)? + // Or not, because the current device has to be set correctly. + // Maybe we should initiate the transfer in all cases? + cuda::device::current::scoped_override_t<> setDeviceForThisScope(dev); + edm::LogPrint("TestHeterogeneousEDProducerGPU") << " " << label_ << " Copying from GPU to CPU for event " << eventId << " in stream " << streamId; + dst = TestHeterogeneousEDProducerGPUTask::getResult(src, cudaStream); + }); + + edm::LogPrint("TestHeterogeneousEDProducerGPU") << label_ << " TestHeterogeneousEDProducerGPU::produceGPUCuda end event " << iEvent.id().event() << " stream " << iEvent.streamID() << " device " << cs->getCurrentDevice(); +} + +DEFINE_FWK_MODULE(TestHeterogeneousEDProducerGPU); diff --git a/HeterogeneousCore/AcceleratorService/test/TestAcceleratorServiceProducerGPUHelpers.cu b/HeterogeneousCore/Producer/test/TestHeterogeneousEDProducerGPUHelpers.cu similarity index 82% rename from HeterogeneousCore/AcceleratorService/test/TestAcceleratorServiceProducerGPUHelpers.cu rename to HeterogeneousCore/Producer/test/TestHeterogeneousEDProducerGPUHelpers.cu index 2409d321ef5a4..79f05f7907576 100644 --- a/HeterogeneousCore/AcceleratorService/test/TestAcceleratorServiceProducerGPUHelpers.cu +++ b/HeterogeneousCore/Producer/test/TestHeterogeneousEDProducerGPUHelpers.cu @@ -1,4 +1,4 @@ -#include "TestAcceleratorServiceProducerGPUHelpers.h" +#include "TestHeterogeneousEDProducerGPUHelpers.h" #include "FWCore/MessageLogger/interface/MessageLogger.h" @@ -107,13 +107,20 @@ namespace { constexpr int NUM_VALUES = 10000; } -TestAcceleratorServiceProducerGPUTask::TestAcceleratorServiceProducerGPUTask() { +TestHeterogeneousEDProducerGPUTask::TestHeterogeneousEDProducerGPUTask() { + h_a = cuda::memory::host::make_unique(NUM_VALUES); + h_b = cuda::memory::host::make_unique(NUM_VALUES); + auto current_device = cuda::device::current::get(); - streamPtr = std::make_unique>(current_device.create_stream(cuda::stream::implicitly_synchronizes_with_default_stream)); + d_b = cuda::memory::device::make_unique(current_device, NUM_VALUES); + + d_ma = cuda::memory::device::make_unique(current_device, NUM_VALUES*NUM_VALUES); + d_mb = cuda::memory::device::make_unique(current_device, NUM_VALUES*NUM_VALUES); + d_mc = cuda::memory::device::make_unique(current_device, NUM_VALUES*NUM_VALUES); } -TestAcceleratorServiceProducerGPUTask::ResultType -TestAcceleratorServiceProducerGPUTask::runAlgo(int input, const ResultTypeRaw inputArrays, std::function callback) { +TestHeterogeneousEDProducerGPUTask::ResultType +TestHeterogeneousEDProducerGPUTask::runAlgo(const std::string& label, int input, const ResultTypeRaw inputArrays, cuda::stream_t<>& stream) { // First make the sanity check if(inputArrays.first != nullptr) { auto h_check = std::make_unique(NUM_VALUES); @@ -125,10 +132,6 @@ TestAcceleratorServiceProducerGPUTask::runAlgo(int input, const ResultTypeRaw in } } - - h_a = cuda::memory::host::make_unique(NUM_VALUES); - h_b = cuda::memory::host::make_unique(NUM_VALUES); - for (auto i=0; i(current_device, NUM_VALUES); - d_b = cuda::memory::device::make_unique(current_device, NUM_VALUES); auto d_c = cuda::memory::device::make_unique(current_device, NUM_VALUES); if(inputArrays.second != nullptr) { d_d = cuda::memory::device::make_unique(current_device, NUM_VALUES); } - d_ma = cuda::memory::device::make_unique(current_device, NUM_VALUES*NUM_VALUES); - d_mb = cuda::memory::device::make_unique(current_device, NUM_VALUES*NUM_VALUES); - d_mc = cuda::memory::device::make_unique(current_device, NUM_VALUES*NUM_VALUES); - - auto& stream = *streamPtr; + // Create stream cuda::memory::async::copy(d_a.get(), h_a.get(), NUM_VALUES*sizeof(float), stream.id()); cuda::memory::async::copy(d_b.get(), h_b.get(), NUM_VALUES*sizeof(float), stream.id()); int threadsPerBlock {32}; int blocksPerGrid = (NUM_VALUES + threadsPerBlock - 1) / threadsPerBlock; - edm::LogPrint("TestAcceleratorServiceProducerGPU") << "--- launching kernels"; + edm::LogPrint("TestHeterogeneousEDProducerGPU") << " " << label << " GPU launching kernels device " << current_device.id() << " CUDA stream " << stream.id(); vectorAdd<<>>(d_a.get(), d_b.get(), d_c.get(), NUM_VALUES); if(inputArrays.second != nullptr) { vectorAdd<<>>(inputArrays.second, d_c.get(), d_d.get(), NUM_VALUES); @@ -174,30 +172,20 @@ TestAcceleratorServiceProducerGPUTask::runAlgo(int input, const ResultTypeRaw in matrixMulVector<<>>(d_mc.get(), d_b.get(), d_c.get(), NUM_VALUES); - edm::LogPrint("TestAcceleratorServiceProducerGPU") << "--- kernels launched, enqueueing the callback"; - stream.enqueue.callback([callback](cuda::stream::id_t stream_id, cuda::status_t status){ - callback(); - }); - - edm::LogPrint("TestAcceleratorServiceProducerGPU") << "--- finished, returning return pointer"; + edm::LogPrint("TestHeterogeneousEDProducerGPU") << " " << label << " GPU kernels launched, returning return pointer device " << current_device.id() << " CUDA stream " << stream.id(); return std::make_pair(std::move(d_a), std::move(d_c)); } -void TestAcceleratorServiceProducerGPUTask::release() { +void TestHeterogeneousEDProducerGPUTask::release(const std::string& label, cuda::stream_t<>& stream) { // any way to automate the release? - edm::LogPrint("TestAcceleratorServiceProducerGPU") << "--- releasing temporary memory"; - h_a.reset(); - h_b.reset(); - d_b.reset(); + edm::LogPrint("TestHeterogeneousEDProducerGPU") << " " << label << " GPU releasing temporary memory device " << cuda::stream::associated_device(stream.id()) << " CUDA stream " << stream.id(); d_d.reset(); - d_ma.reset(); - d_mb.reset(); - d_mc.reset(); } -int TestAcceleratorServiceProducerGPUTask::getResult(const ResultTypeRaw& d_ac) { +int TestHeterogeneousEDProducerGPUTask::getResult(const ResultTypeRaw& d_ac, cuda::stream_t<>& stream) { auto h_c = cuda::memory::host::make_unique(NUM_VALUES); - cuda::memory::copy(h_c.get(), d_ac.second, NUM_VALUES*sizeof(int)); + cuda::memory::async::copy(h_c.get(), d_ac.second, NUM_VALUES*sizeof(int), stream.id()); + stream.synchronize(); float ret = 0; for (auto i=0; i #include #include +#include #include -int TestAcceleratorServiceProducerGPUHelpers_simple_kernel(int input); +int TestHeterogeneousEDProducerGPUHelpers_simple_kernel(int input); -class TestAcceleratorServiceProducerGPUTask { +class TestHeterogeneousEDProducerGPUTask { public: - TestAcceleratorServiceProducerGPUTask(); - ~TestAcceleratorServiceProducerGPUTask() = default; + TestHeterogeneousEDProducerGPUTask(); + ~TestHeterogeneousEDProducerGPUTask() = default; using Ptr = cuda::memory::device::unique_ptr; using PtrRaw = Ptr::pointer; @@ -21,21 +22,23 @@ class TestAcceleratorServiceProducerGPUTask { using ResultTypeRaw = std::pair; using ConstResultTypeRaw = std::pair; - ResultType runAlgo(int input, const ResultTypeRaw inputArrays, std::function callback); - void release(); - int getResult(const ResultTypeRaw& d_ac); + ResultType runAlgo(const std::string& label, int input, const ResultTypeRaw inputArrays, cuda::stream_t<>& stream); + void release(const std::string& label, cuda::stream_t<>& stream); + static int getResult(const ResultTypeRaw& d_ac, cuda::stream_t<>& stream); private: std::unique_ptr> streamPtr; - // temporary storage, need to be somewhere to allow async execution + // stored for the job duration cuda::memory::host::unique_ptr h_a; cuda::memory::host::unique_ptr h_b; cuda::memory::device::unique_ptr d_b; - cuda::memory::device::unique_ptr d_d; cuda::memory::device::unique_ptr d_ma; cuda::memory::device::unique_ptr d_mb; cuda::memory::device::unique_ptr d_mc; + + // temporary storage, need to be somewhere to allow async execution + cuda::memory::device::unique_ptr d_d; }; #endif diff --git a/HeterogeneousCore/Producer/test/TestHeterogeneousEDProducerGPUMock.cc b/HeterogeneousCore/Producer/test/TestHeterogeneousEDProducerGPUMock.cc new file mode 100644 index 0000000000000..697810ed36dab --- /dev/null +++ b/HeterogeneousCore/Producer/test/TestHeterogeneousEDProducerGPUMock.cc @@ -0,0 +1,153 @@ +#include "HeterogeneousCore/Producer/interface/HeterogeneousEDProducer.h" + +#include "FWCore/Framework/interface/Event.h" +#include "FWCore/Framework/interface/MakerMacros.h" + +#include "FWCore/ParameterSet/interface/ParameterSet.h" + +#include "tbb/concurrent_vector.h" + +#include +#include +#include +#include + +/** + * The purpose of this test is to demonstrate the following + * - EDProducer implementing an algorithm for CPU and a (mock GPU) device + * * The mock device exercises all the structures without a need for actual device + * - How to read heterogeneous product from event + * - How to read normal product from event + * - How to write heterogeneous product to event + */ +class TestHeterogeneousEDProducerGPUMock: public HeterogeneousEDProducer > { +public: + explicit TestHeterogeneousEDProducerGPUMock(edm::ParameterSet const& iConfig); + ~TestHeterogeneousEDProducerGPUMock() = default; + + static void fillDescriptions(edm::ConfigurationDescriptions& descriptions); + +private: + using OutputType = HeterogeneousProductImpl, + heterogeneous::GPUMockProduct >; + + std::string label_; + edm::EDGetTokenT srcToken_; + + // hack for GPU mock + tbb::concurrent_vector > pendingFutures; + + // simulating GPU memory + unsigned int gpuOutput_; + + // output + unsigned int output_; + + void acquireCPU(const edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup) override; + void acquireGPUMock(const edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup, std::function callback); + + void produceCPU(edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup) override; + void produceGPUMock(edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup) override; +}; + +TestHeterogeneousEDProducerGPUMock::TestHeterogeneousEDProducerGPUMock(edm::ParameterSet const& iConfig): + label_(iConfig.getParameter("@module_label")) +{ + auto srcTag = iConfig.getParameter("src"); + if(!srcTag.label().empty()) { + srcToken_ = consumesHeterogeneous(srcTag); + } + + produces(); + produces(); +} + +void TestHeterogeneousEDProducerGPUMock::fillDescriptions(edm::ConfigurationDescriptions& descriptions) { + edm::ParameterSetDescription desc; + desc.add("src", edm::InputTag()); + descriptions.add("testHeterogeneousEDProducerGPUMock", desc); +} + +void TestHeterogeneousEDProducerGPUMock::acquireCPU(const edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup) { + edm::LogPrint("TestHeterogeneousEDProducerGPUMock") << label_ << " TestHeterogeneousEDProducerGPUMock::acquireCPU event " << iEvent.id().event() << " stream " << iEvent.streamID(); + + unsigned int input = 0; + if(!srcToken_.isUninitialized()) { + edm::Handle hin; + iEvent.getByToken(srcToken_, hin); + input = *hin; + } + + std::random_device r; + std::mt19937 gen(r()); + auto dist = std::uniform_real_distribution<>(1.0, 3.0); + auto dur = dist(gen); + edm::LogPrint("TestHeterogeneousEDProducerGPUMock") << " Task (CPU) for event " << iEvent.id().event() << " in stream " << iEvent.streamID() << " will take " << dur << " seconds"; + std::this_thread::sleep_for(std::chrono::seconds(1)*dur); + + output_ = input+ iEvent.streamID()*100 + iEvent.id().event(); + + edm::LogPrint("TestHeterogeneousEDProducerGPUMock") << " " << label_ << " TestHeterogeneousEDProducerGPUMock::acquireCPU end event " << iEvent.id().event() << " stream " << iEvent.streamID(); +} + +void TestHeterogeneousEDProducerGPUMock::acquireGPUMock(const edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup, std::function callback) { + edm::LogPrint("TestHeterogeneousEDProducerGPUMock") << " " << label_ << " TestHeterogeneousEDProducerGPUMock::acquireGPUMock begin event " << iEvent.id().event() << " stream " << iEvent.streamID(); + + unsigned int input = 0; + if(!srcToken_.isUninitialized()) { + edm::Handle hin; + iEvent.getByToken(srcToken_, hin); + input = *hin; + } + + /// GPU work + std::random_device r; + std::mt19937 gen(r()); + auto dist = std::uniform_real_distribution<>(0.1, 1.0); + auto dur = dist(gen); + edm::LogPrint("TestHeterogeneousEDProducerGPUMock") << " " << label_ << " Task (GPU) for event " << iEvent.id().event() << " in stream " << iEvent.streamID() << " will take " << dur << " seconds"; + + auto ret = std::async(std::launch::async, + [this, dur, input, + callback = std::move(callback), + eventId = iEvent.id().event(), + streamId = iEvent.streamID() + ](){ + std::this_thread::sleep_for(std::chrono::seconds(1)*dur); + gpuOutput_ = input + streamId*100 + eventId; + edm::LogPrint("TestHeterogeneousEDProducerGPUMock") << " " << label_ << " TestHeterogeneousEDProducerGPUMock::acquireGPUMock finished async for event " << eventId << " stream " << streamId; + callback(); + }); + pendingFutures.push_back(std::move(ret)); + + edm::LogPrint("TestHeterogeneousEDProducerGPUMock") << " " << label_ << " TestHeterogeneousEDProducerGPUMock::acquireGPUMock end event " << iEvent.id().event() << " stream " << iEvent.streamID(); +} + +void TestHeterogeneousEDProducerGPUMock::produceCPU(edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup) { + edm::LogPrint("TestHeterogeneousEDProducerGPUMock") << label_ << " TestHeterogeneousEDProducerGPUMock::produceCPU begin event " << iEvent.id().event() << " stream " << iEvent.streamID(); + + iEvent.put(std::make_unique(output_)); + iEvent.put(std::make_unique(1)); + + edm::LogPrint("TestHeterogeneousEDProducerGPUMock") << label_ << " TestHeterogeneousEDProducerGPUMock::produceCPU end event " << iEvent.id().event() << " stream " << iEvent.streamID() << " result " << output_; +} + +void TestHeterogeneousEDProducerGPUMock::produceGPUMock(edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup) { + edm::LogPrint("TestHeterogeneousEDProducerGPUMock") << label_ << " TestHeterogeneousEDProducerGPUMock::produceGPUMock begin event " << iEvent.id().event() << " stream " << iEvent.streamID(); + + iEvent.put(std::make_unique(gpuOutput_), + [this, + eventId = iEvent.id().event(), + streamId = iEvent.streamID() + ](const unsigned int& src, unsigned int& dst) { + edm::LogPrint("TestHeterogeneousEDProducerGPUMock") << " " << label_ << " Task (GPU) for event " << eventId << " in stream " << streamId << " copying to CPU"; + dst = src; + }); + + edm::LogPrint("TestHeterogeneousEDProducerGPUMock") << label_ << " TestHeterogeneousEDProducerGPUMock::produceGPUMock end event " << iEvent.id().event() << " stream " << iEvent.streamID() << " result " << gpuOutput_; +} + +DEFINE_FWK_MODULE(TestHeterogeneousEDProducerGPUMock); diff --git a/HeterogeneousCore/AcceleratorService/test/testGPUMock_cfg.py b/HeterogeneousCore/Producer/test/testGPUMock_cfg.py similarity index 79% rename from HeterogeneousCore/AcceleratorService/test/testGPUMock_cfg.py rename to HeterogeneousCore/Producer/test/testGPUMock_cfg.py index 6d3ba056cf3bc..c1fe7f60db33a 100644 --- a/HeterogeneousCore/AcceleratorService/test/testGPUMock_cfg.py +++ b/HeterogeneousCore/Producer/test/testGPUMock_cfg.py @@ -14,9 +14,8 @@ #process.Tracer = cms.Service("Tracer") -process.AcceleratorService = cms.Service("AcceleratorService") -process.prod1 = cms.EDProducer('TestAcceleratorServiceProducerGPUMock') -process.prod2= cms.EDProducer('TestAcceleratorServiceProducerGPUMock', +process.prod1 = cms.EDProducer('TestHeterogeneousEDProducerGPUMock') +process.prod2= cms.EDProducer('TestHeterogeneousEDProducerGPUMock', src = cms.InputTag("prod1") ) diff --git a/HeterogeneousCore/AcceleratorService/test/testGPU_cfg.py b/HeterogeneousCore/Producer/test/testGPU_cfg.py similarity index 63% rename from HeterogeneousCore/AcceleratorService/test/testGPU_cfg.py rename to HeterogeneousCore/Producer/test/testGPU_cfg.py index d6ebf1eae0308..9b916a685b88c 100644 --- a/HeterogeneousCore/AcceleratorService/test/testGPU_cfg.py +++ b/HeterogeneousCore/Producer/test/testGPU_cfg.py @@ -14,19 +14,19 @@ #process.Tracer = cms.Service("Tracer") -process.AcceleratorService = cms.Service("AcceleratorService") process.CUDAService = cms.Service("CUDAService") -process.prod1 = cms.EDProducer('TestAcceleratorServiceProducerGPU') -process.prod2 = cms.EDProducer('TestAcceleratorServiceProducerGPU', +process.prod1 = cms.EDProducer('TestHeterogeneousEDProducerGPU') +process.prod2 = cms.EDProducer('TestHeterogeneousEDProducerGPU', src = cms.InputTag("prod1"), ) -process.prod3 = cms.EDProducer('TestAcceleratorServiceProducerGPU', +process.prod3 = cms.EDProducer('TestHeterogeneousEDProducerGPU', src = cms.InputTag("prod1"), ) -process.ana = cms.EDAnalyzer("TestAcceleratorServiceAnalyzer", - src = cms.VInputTag("prod2", "prod3") +process.prod4 = cms.EDProducer('TestHeterogeneousEDProducerGPU') +process.ana = cms.EDAnalyzer("TestHeterogeneousEDProducerAnalyzer", + src = cms.VInputTag("prod2", "prod3", "prod4") ) -process.t = cms.Task(process.prod1, process.prod2, process.prod3) +process.t = cms.Task(process.prod1, process.prod2, process.prod3, process.prod4) process.p = cms.Path(process.ana) process.p.associate(process.t) diff --git a/HeterogeneousCore/Product/interface/HeterogeneousDeviceId.h b/HeterogeneousCore/Product/interface/HeterogeneousDeviceId.h new file mode 100644 index 0000000000000..969280516a094 --- /dev/null +++ b/HeterogeneousCore/Product/interface/HeterogeneousDeviceId.h @@ -0,0 +1,45 @@ +#ifndef HeterogeneousCore_Product_HeterogeneousDeviceId_h +#define HeterogeneousCore_Product_HeterogeneousDeviceId_h + +/** + * Enumerator for heterogeneous device types + */ +enum class HeterogeneousDevice { + kCPU = 0, + kGPUMock, + kGPUCuda, + kSize +}; + +namespace heterogeneous { + template + struct HeterogeneousDeviceTag { + constexpr static HeterogeneousDevice value = Device; + }; +} + +/** + * Class to represent an identifier for a heterogeneous device. + * Contains device type and an integer identifier. + */ +class HeterogeneousDeviceId { +public: + constexpr static auto kInvalidDevice = HeterogeneousDevice::kSize; + + HeterogeneousDeviceId(): + deviceType_(kInvalidDevice), + deviceId_(0) + {} + explicit HeterogeneousDeviceId(HeterogeneousDevice device, unsigned int id=0): + deviceType_(device), deviceId_(id) + {} + + HeterogeneousDevice deviceType() const { return deviceType_; } + + unsigned int deviceId() const { return deviceId_; } +private: + HeterogeneousDevice deviceType_; + unsigned int deviceId_; +}; + +#endif diff --git a/HeterogeneousCore/Product/interface/HeterogeneousProduct.h b/HeterogeneousCore/Product/interface/HeterogeneousProduct.h index f6e7dc1c7d290..c5317ba2acbc3 100644 --- a/HeterogeneousCore/Product/interface/HeterogeneousProduct.h +++ b/HeterogeneousCore/Product/interface/HeterogeneousProduct.h @@ -1,49 +1,26 @@ -#ifndef HeterogeneousCore_Product_interface_HeterogeneousData_h -#define HeterogeneousCore_Product_interface_HeterogeneousData_h +#ifndef HeterogeneousCore_Product_HeterogeneousProduct_h +#define HeterogeneousCore_Product_HeterogeneousProduct_h #include "FWCore/Utilities/interface/Exception.h" -#include +#include "HeterogeneousCore/Product/interface/HeterogeneousDeviceId.h" +#include "HeterogeneousCore/Product/interface/HeterogeneousProductBase.h" + +#include #include #include -#include #include -/** - * Enumerator for heterogeneous device types - */ -enum class HeterogeneousDevice { - kCPU = 0, - kGPUMock, - kGPUCuda, - kSize -}; - -/** - * Class to represent an identifier for a heterogeneous device. - * Contains device type and an integer identifier. - * - * TODO: actually make use of this class elsewhere. - */ -class HeterogeneousDeviceId { -public: - HeterogeneousDeviceId(): - deviceType_(HeterogeneousDevice::kCPU), - deviceId_(0) - {} - explicit HeterogeneousDeviceId(HeterogeneousDevice device, unsigned int id=0): - deviceType_(device), deviceId_(id) - {} - - HeterogeneousDevice deviceType() const { return deviceType_; } - - unsigned int deviceId() const { return deviceId_; } -private: - HeterogeneousDevice deviceType_; - unsigned int deviceId_; -}; - namespace heterogeneous { + template + std::string bitsetArrayToString(const T& bitsetArray) { + std::string ret; + for(const auto& bitset: bitsetArray) { + ret += bitset.to_string() + " "; + } + return ret; + } + /** * The *Product templates are to specify in a generic way which * data locations and device-specific types the @@ -58,59 +35,25 @@ namespace heterogeneous { // Mapping from *Product to HeterogeneousDevice enumerator template struct ProductToEnum {}; - // CPU - template - class CPUProduct { - public: - using DataType = T; - static constexpr const HeterogeneousDevice tag = HeterogeneousDevice::kCPU; - - CPUProduct() = default; - CPUProduct(T&& data): data_(std::move(data)) {} - - const T& product() const { return data_; } - T& product() { return data_; } - private: - T data_; - }; - template struct ProductToEnum> { static constexpr const HeterogeneousDevice value = HeterogeneousDevice::kCPU; }; - template auto cpuProduct(T&& data) { return CPUProduct(std::move(data)); } - - // GPU Mock - template - class GPUMockProduct { - public: - using DataType = T; - static constexpr const HeterogeneousDevice tag = HeterogeneousDevice::kGPUMock; - - GPUMockProduct() = default; - GPUMockProduct(T&& data): data_(std::move(data)) {} - - const T& product() const { return data_; } - T& product() { return data_; } -private: - T data_; - }; - template struct ProductToEnum> { static constexpr const HeterogeneousDevice value = HeterogeneousDevice::kGPUMock; }; - template auto gpuMockProduct(T&& data) { return GPUMockProduct(std::move(data)); } - - // GPU Cuda - template - class GPUCudaProduct { - public: - using DataType = T; - static constexpr const HeterogeneousDevice tag = HeterogeneousDevice::kGPUCuda; - - GPUCudaProduct() = default; - GPUCudaProduct(T&& data): data_(std::move(data)) {} - - const T& product() const { return data_; } - T& product() { return data_; } -private: - T data_; - }; - template struct ProductToEnum> { static constexpr const HeterogeneousDevice value = HeterogeneousDevice::kGPUCuda; }; - template auto gpuCudaProduct(T&& data) { return GPUCudaProduct(std::move(data)); } +#define DEFINE_DEVICE_PRODUCT(ENUM) \ + template \ + class ENUM##Product { \ + public: \ + using DataType = T; \ + static constexpr const HeterogeneousDevice tag = HeterogeneousDevice::k##ENUM; \ + ENUM##Product() = default; \ + ENUM##Product(T&& data): data_(std::move(data)) {} \ + const T& product() const { return data_; } \ + T& product() { return data_; } \ + private: \ + T data_; \ + }; \ + template struct ProductToEnum> { static constexpr const HeterogeneousDevice value = HeterogeneousDevice::k##ENUM; } + + DEFINE_DEVICE_PRODUCT(CPU); + DEFINE_DEVICE_PRODUCT(GPUMock); + DEFINE_DEVICE_PRODUCT(GPUCuda); +#undef DEFINE_DEVICE_PRODUCT /** * Below are various helpers @@ -164,14 +107,15 @@ namespace heterogeneous { using TupleElement_t = typename TupleElement::type; - // Metaprogram to loop over two tuples and a bitset (of equal - // length), and if bitset is set to true call a function from one of - // the tuples with arguments from the second tuple - template + // Metaprogram to loop over two tuples and an array of bitsets (of + // equal length), and if any element of bitset is set to true call a + // function from one of the tuples with arguments from the second + // tuple + template struct CallFunctionIf { - static bool call(const FunctionTuple& functionTuple, ProductTuple& productTuple, const BitSet& bitSet) { - constexpr const auto index = bitSet.size()-sizeMinusIndex; - if(bitSet[index]) { + static bool call(const FunctionTuple& functionTuple, ProductTuple& productTuple, const BitSetArray& bitsetArray) { + constexpr const auto index = bitsetArray.size()-sizeMinusIndex; + if(bitsetArray[index].any()) { const auto func = std::get(functionTuple); if(!func) { throw cms::Exception("Assert") << "Attempted to call transfer-to-CPU function for device " << index << " but the std::function object is not valid!"; @@ -179,21 +123,21 @@ namespace heterogeneous { func(std::get(productTuple).product(), std::get<0>(productTuple).product()); return true; } - return CallFunctionIf, sizeMinusIndex-1>::call(functionTuple, productTuple, bitSet); + return CallFunctionIf, sizeMinusIndex-1>::call(functionTuple, productTuple, bitsetArray); } }; - template - struct CallFunctionIf { - static bool call(const FunctionTuple& functionTuple, ProductTuple& productTuple, const BitSet& bitSet) { - constexpr const auto index = bitSet.size()-sizeMinusIndex; - return CallFunctionIf, sizeMinusIndex-1>::call(functionTuple, productTuple, bitSet); + template + struct CallFunctionIf { + static bool call(const FunctionTuple& functionTuple, ProductTuple& productTuple, const BitSetArray& bitsetArray) { + constexpr const auto index = bitsetArray.size()-sizeMinusIndex; + return CallFunctionIf, sizeMinusIndex-1>::call(functionTuple, productTuple, bitsetArray); } }; - template - struct CallFunctionIf { - static bool call(const FunctionTuple& functionTuple, ProductTuple& productTuple, const BitSet& bitSet) { + template + struct CallFunctionIf { + static bool call(const FunctionTuple& functionTuple, ProductTuple& productTuple, const BitSetArray& bitsetArray) { return false; } }; @@ -201,11 +145,11 @@ namespace heterogeneous { // Metaprogram to specialize getProduct() for CPU template struct GetOrTransferProduct { - template - static const auto& getProduct(const FunctionTuple& functionTuple, ProductTuple& productTuple, const BitSet& bitSet) { + template + static const auto& getProduct(const FunctionTuple& functionTuple, ProductTuple& productTuple, const BitSetArray& location) { constexpr const auto index = static_cast(device); - if(!bitSet[index]) { - throw cms::Exception("LogicError") << "Called getProduct() for device " << index << " but the data is not there! Location bitfield is " << bitSet.to_string(); + if(!location[index].any()) { + throw cms::Exception("LogicError") << "Called getProduct() for device " << index << " but the data is not there! Location bitfield is " << bitsetArrayToString(location); } return std::get(productTuple).product(); } @@ -213,27 +157,31 @@ namespace heterogeneous { template <> struct GetOrTransferProduct { - template - static const auto& getProduct(const FunctionTuple& functionTuple, ProductTuple& productTuple, BitSet& bitSet) { + template + static const auto& getProduct(const FunctionTuple& functionTuple, ProductTuple& productTuple, BitSetArray& location) { constexpr const auto index = static_cast(HeterogeneousDevice::kCPU); - if(!bitSet[index]) { - auto found = CallFunctionIf, bitSet.size()-1>::call(functionTuple, productTuple, bitSet); + if(!location[index].any()) { + auto found = CallFunctionIf, location.size()-1>::call(functionTuple, productTuple, location); if(!found) { - throw cms::Exception("LogicError") << "Attempted to transfer data to CPU, but the data is not available anywhere! Location bitfield is " << bitSet.to_string(); + throw cms::Exception("LogicError") << "Attempted to transfer data to CPU, but the data is not available anywhere! Location bitfield is " << bitsetArrayToString(location); } } - bitSet.set(index); + location[index].set(0); return std::get(productTuple).product(); } }; -} -// For type erasure to ease dictionary generation -class HeterogeneousProductBase { -public: - virtual ~HeterogeneousProductBase() = 0; -}; + // Metaprogram to return DataType or Empty + template + struct DataTypeOrEmpty { + using type = typename T::DataType; + }; + template<> + struct DataTypeOrEmpty { + using type = Empty; + }; +} /** * Generic data product for holding data on CPU or a heterogeneous @@ -254,12 +202,22 @@ class HeterogeneousProductImpl: public HeterogeneousProductBase { heterogeneous::CallBackType_t(HeterogeneousDevice::kGPUMock), ProductTuple>>, heterogeneous::CallBackType_t(HeterogeneousDevice::kGPUCuda), ProductTuple>> >; - using BitSet = std::bitset(HeterogeneousDevice::kSize)>; - // Some sanity checks static_assert(std::tuple_size::value == std::tuple_size::value, "Size mismatch"); static_assert(std::tuple_size::value == static_cast(HeterogeneousDevice::kSize), "Size mismatch"); public: + template + struct CanGet { + using FromType = typename heterogeneous::DataTypeOrEmpty(Device), ProductTuple> >::type; + static const bool value = std::is_same::value; + }; + + template + struct CanPut { + using ToType = typename heterogeneous::DataTypeOrEmpty(Device), ProductTuple> >::type; + static const bool value = std::is_same::value; + }; + HeterogeneousProductImpl() = default; ~HeterogeneousProductImpl() override = default; HeterogeneousProductImpl(HeterogeneousProductImpl&& other) { @@ -283,30 +241,25 @@ class HeterogeneousProductImpl: public HeterogeneousProductBase { } // Constructor for CPU data - HeterogeneousProductImpl(CPUProduct&& data) { + template + HeterogeneousProductImpl(heterogeneous::HeterogeneousDeviceTag, D&& data) { + static_assert(Device == HeterogeneousDevice::kCPU, "This overload allows only CPU device"); constexpr const auto index = static_cast(HeterogeneousDevice::kCPU); std::get(products_) = std::move(data); - location_.set(index); + location_[index].set(0); } /** * Generic constructor for device data. A function to transfer the * data to CPU has to be provided as well. */ - template - HeterogeneousProductImpl(H&& data, F transferToCPU) { - constexpr const auto index = static_cast(heterogeneous::ProductToEnum >::value); - static_assert(!std::is_same, - heterogeneous::Empty>::value, - "This HeterogeneousProduct does not support this type"); + template + HeterogeneousProductImpl(heterogeneous::HeterogeneousDeviceTag, D&& data, HeterogeneousDeviceId location, F transferToCPU) { + constexpr const auto index = static_cast(Device); + assert(location.deviceType() == Device); std::get(products_) = std::move(data); std::get(transfersToCPU_) = std::move(transferToCPU); - location_.set(index); - } - - bool isProductOn(HeterogeneousDevice loc) const { - // should this be protected with the mutex? - return location_[static_cast(loc)]; + location_[index].set(location.deviceId()); } template @@ -323,21 +276,22 @@ class HeterogeneousProductImpl: public HeterogeneousProductBase { } private: - mutable std::mutex mutex_; mutable ProductTuple products_; TransferToCPUTuple transfersToCPU_; - mutable BitSet location_; }; +/** + * The main purpose of the HeterogeneousProduct, + * HeterogeneousProductBase, HeterogeneousProductImpl<...> class + * hierarchy is to avoid the dictionary generation for the concrete + * HeterogeneousProductImpl<...>'s. + */ class HeterogeneousProduct { public: HeterogeneousProduct() = default; template HeterogeneousProduct(HeterogeneousProductImpl&& impl) { - //impl_.reset(new HeterogeneousProductImpl(std::move(impl))); - //std::make_unique>(std::move(impl))) - //impl_ = std::make_unique>(std::move(impl)); impl_.reset(static_cast(new HeterogeneousProductImpl(std::move(impl)))); } @@ -349,6 +303,8 @@ class HeterogeneousProduct { bool isNonnull() const { return static_cast(impl_); } bool isNull() const { return !isNonnull(); } + const HeterogeneousProductBase *getBase() const { return impl_.get(); } + template const T& get() const { if(isNull()) diff --git a/HeterogeneousCore/Product/interface/HeterogeneousProductBase.h b/HeterogeneousCore/Product/interface/HeterogeneousProductBase.h new file mode 100644 index 0000000000000..fcba60150c824 --- /dev/null +++ b/HeterogeneousCore/Product/interface/HeterogeneousProductBase.h @@ -0,0 +1,41 @@ +#ifndef HeterogeneousCore_Product_HeterogeneousProductBase_h +#define HeterogeneousCore_Product_HeterogeneousProductBase_h + +#include "HeterogeneousCore/Product/interface/HeterogeneousDeviceId.h" + +#include +#include +#include + +namespace heterogeneous { + constexpr const unsigned int kMaxDevices = 16; + using DeviceBitSet = std::bitset; +} + +// For type erasure to ease dictionary generation +class HeterogeneousProductBase { +public: + // TODO: Given we'll likely have the data on one or at most a couple + // of devices, storing the information in a "dense" bit pattern may + // be overkill. Maybe a "sparse" presentation would be sufficient + // and easier to deal with? + using BitSet = heterogeneous::DeviceBitSet; + using BitSetArray = std::array(HeterogeneousDevice::kSize)>; + + virtual ~HeterogeneousProductBase() = 0; + + bool isProductOn(HeterogeneousDevice loc) const { + // should this be protected with the mutex? + return location_[static_cast(loc)].any(); + } + BitSet onDevices(HeterogeneousDevice loc) const { + // should this be protected with the mutex? + return location_[static_cast(loc)]; + } + +protected: + mutable std::mutex mutex_; + mutable BitSetArray location_; +}; + +#endif diff --git a/HeterogeneousCore/Product/test/testHeterogeneousProduct.cpp b/HeterogeneousCore/Product/test/testHeterogeneousProduct.cpp index 2d89a88f5c7f4..eb946195079ae 100644 --- a/HeterogeneousCore/Product/test/testHeterogeneousProduct.cpp +++ b/HeterogeneousCore/Product/test/testHeterogeneousProduct.cpp @@ -46,7 +46,7 @@ void testHeterogeneousProduct::testDefault() { void testHeterogeneousProduct::testCPU() { HeterogeneousProductImpl, heterogeneous::GPUMockProduct - > prod{heterogeneous::cpuProduct(5)}; + > prod{heterogeneous::HeterogeneousDeviceTag(), 5}; CPPUNIT_ASSERT(prod.isProductOn(HeterogeneousDevice::kCPU) == true); CPPUNIT_ASSERT(prod.isProductOn(HeterogeneousDevice::kGPUMock) == false); @@ -59,13 +59,17 @@ void testHeterogeneousProduct::testCPU() { void testHeterogeneousProduct::testGPUMock() { HeterogeneousProductImpl, heterogeneous::GPUMockProduct - > prod{heterogeneous::gpuMockProduct(5), + > prod{heterogeneous::HeterogeneousDeviceTag(), 5, + HeterogeneousDeviceId(HeterogeneousDevice::kGPUMock, 0), [](const int& src, int& dst) { dst = src; }}; CPPUNIT_ASSERT(prod.isProductOn(HeterogeneousDevice::kCPU) == false); CPPUNIT_ASSERT(prod.isProductOn(HeterogeneousDevice::kGPUMock) == true); CPPUNIT_ASSERT(prod.isProductOn(HeterogeneousDevice::kGPUCuda) == false); + CPPUNIT_ASSERT(prod.onDevices(HeterogeneousDevice::kGPUMock)[0] == true); + CPPUNIT_ASSERT(prod.onDevices(HeterogeneousDevice::kGPUMock)[1] == false); + CPPUNIT_ASSERT(prod.getProduct() == 5); // Automatic transfer @@ -79,13 +83,18 @@ void testHeterogeneousProduct::testGPUMock() { void testHeterogeneousProduct::testGPUCuda() { HeterogeneousProductImpl, heterogeneous::GPUCudaProduct - > prod{heterogeneous::gpuCudaProduct(5), + > prod{heterogeneous::HeterogeneousDeviceTag(), 5, + HeterogeneousDeviceId(HeterogeneousDevice::kGPUCuda, 1), [](const int& src, int& dst) { dst = src; }}; CPPUNIT_ASSERT(prod.isProductOn(HeterogeneousDevice::kCPU) == false); CPPUNIT_ASSERT(prod.isProductOn(HeterogeneousDevice::kGPUMock) == false); CPPUNIT_ASSERT(prod.isProductOn(HeterogeneousDevice::kGPUCuda) == true); + CPPUNIT_ASSERT(prod.onDevices(HeterogeneousDevice::kGPUCuda)[0] == false); + CPPUNIT_ASSERT(prod.onDevices(HeterogeneousDevice::kGPUCuda)[1] == true); + CPPUNIT_ASSERT(prod.onDevices(HeterogeneousDevice::kGPUCuda)[2] == false); + CPPUNIT_ASSERT(prod.getProduct() == 5); // Automatic transfer @@ -101,7 +110,7 @@ void testHeterogeneousProduct::testGPUAll() { HeterogeneousProductImpl, heterogeneous::GPUMockProduct, heterogeneous::GPUCudaProduct - > prod1{heterogeneous::cpuProduct(5)}; + > prod1{heterogeneous::HeterogeneousDeviceTag(), 5}; CPPUNIT_ASSERT(prod1.isProductOn(HeterogeneousDevice::kCPU) == true); CPPUNIT_ASSERT(prod1.isProductOn(HeterogeneousDevice::kGPUMock) == false); @@ -115,13 +124,17 @@ void testHeterogeneousProduct::testGPUAll() { HeterogeneousProductImpl, heterogeneous::GPUMockProduct, heterogeneous::GPUCudaProduct - > prod2{heterogeneous::gpuMockProduct(5), + > prod2{heterogeneous::HeterogeneousDeviceTag(), 5, + HeterogeneousDeviceId(HeterogeneousDevice::kGPUMock, 0), [](const int& src, int& dst) { dst = src; }}; CPPUNIT_ASSERT(prod2.isProductOn(HeterogeneousDevice::kCPU) == false); CPPUNIT_ASSERT(prod2.isProductOn(HeterogeneousDevice::kGPUMock) == true); CPPUNIT_ASSERT(prod2.isProductOn(HeterogeneousDevice::kGPUCuda) == false); + CPPUNIT_ASSERT(prod2.onDevices(HeterogeneousDevice::kGPUMock)[0] == true); + CPPUNIT_ASSERT(prod2.onDevices(HeterogeneousDevice::kGPUMock)[1] == false); + CPPUNIT_ASSERT(prod2.getProduct() == 5); CPPUNIT_ASSERT_THROW(prod2.getProduct(), cms::Exception); @@ -137,13 +150,19 @@ void testHeterogeneousProduct::testGPUAll() { HeterogeneousProductImpl, heterogeneous::GPUMockProduct, heterogeneous::GPUCudaProduct - > prod3{heterogeneous::gpuCudaProduct(5), + > prod3{heterogeneous::HeterogeneousDeviceTag(), 5, + HeterogeneousDeviceId(HeterogeneousDevice::kGPUCuda, 2), [](const int& src, int& dst) { dst = src; }}; CPPUNIT_ASSERT(prod3.isProductOn(HeterogeneousDevice::kCPU) == false); CPPUNIT_ASSERT(prod3.isProductOn(HeterogeneousDevice::kGPUMock) == false); CPPUNIT_ASSERT(prod3.isProductOn(HeterogeneousDevice::kGPUCuda) == true); + CPPUNIT_ASSERT(prod3.onDevices(HeterogeneousDevice::kGPUCuda)[0] == false); + CPPUNIT_ASSERT(prod3.onDevices(HeterogeneousDevice::kGPUCuda)[1] == false); + CPPUNIT_ASSERT(prod3.onDevices(HeterogeneousDevice::kGPUCuda)[2] == true); + CPPUNIT_ASSERT(prod3.onDevices(HeterogeneousDevice::kGPUCuda)[3] == false); + CPPUNIT_ASSERT_THROW(prod3.getProduct(), cms::Exception); CPPUNIT_ASSERT(prod3.getProduct() == 5); @@ -163,16 +182,19 @@ void testHeterogeneousProduct::testMoveGPUMock() { heterogeneous::GPUMockProduct, heterogeneous::GPUCudaProduct >; - Type prod1{heterogeneous::gpuMockProduct(5), + Type prod1{heterogeneous::HeterogeneousDeviceTag(), 5, + HeterogeneousDeviceId(HeterogeneousDevice::kGPUMock, 0), [](const int& src, int& dst) { dst = src; }}; Type prod2; CPPUNIT_ASSERT(prod1.isProductOn(HeterogeneousDevice::kCPU) == false); CPPUNIT_ASSERT(prod1.isProductOn(HeterogeneousDevice::kGPUMock) == true); CPPUNIT_ASSERT(prod1.isProductOn(HeterogeneousDevice::kGPUCuda) == false); + CPPUNIT_ASSERT(prod1.onDevices(HeterogeneousDevice::kGPUMock)[0] == true); CPPUNIT_ASSERT(prod2.isProductOn(HeterogeneousDevice::kCPU) == false); CPPUNIT_ASSERT(prod2.isProductOn(HeterogeneousDevice::kGPUMock) == false); CPPUNIT_ASSERT(prod2.isProductOn(HeterogeneousDevice::kGPUCuda) == false); + CPPUNIT_ASSERT(prod2.onDevices(HeterogeneousDevice::kGPUMock).none() == true); CPPUNIT_ASSERT(prod1.getProduct() == 5); CPPUNIT_ASSERT_THROW(prod1.getProduct(), cms::Exception); @@ -185,6 +207,7 @@ void testHeterogeneousProduct::testMoveGPUMock() { CPPUNIT_ASSERT(prod2.isProductOn(HeterogeneousDevice::kCPU) == false); CPPUNIT_ASSERT(prod2.isProductOn(HeterogeneousDevice::kGPUMock) == true); CPPUNIT_ASSERT(prod2.isProductOn(HeterogeneousDevice::kGPUCuda) == false); + CPPUNIT_ASSERT(prod2.onDevices(HeterogeneousDevice::kGPUMock)[0] == true); CPPUNIT_ASSERT(prod2.getProduct() == 5); CPPUNIT_ASSERT_THROW(prod2.getProduct(), cms::Exception); @@ -204,16 +227,19 @@ void testHeterogeneousProduct::testMoveGPUCuda() { heterogeneous::GPUMockProduct, heterogeneous::GPUCudaProduct >; - Type prod1{heterogeneous::gpuCudaProduct(5), + Type prod1{heterogeneous::HeterogeneousDeviceTag(), 5, + HeterogeneousDeviceId(HeterogeneousDevice::kGPUCuda, 3), [](const int& src, int& dst) { dst = src; }}; Type prod2; CPPUNIT_ASSERT(prod1.isProductOn(HeterogeneousDevice::kCPU) == false); CPPUNIT_ASSERT(prod1.isProductOn(HeterogeneousDevice::kGPUMock) == false); CPPUNIT_ASSERT(prod1.isProductOn(HeterogeneousDevice::kGPUCuda) == true); + CPPUNIT_ASSERT(prod1.onDevices(HeterogeneousDevice::kGPUCuda)[3] == true); CPPUNIT_ASSERT(prod2.isProductOn(HeterogeneousDevice::kCPU) == false); CPPUNIT_ASSERT(prod2.isProductOn(HeterogeneousDevice::kGPUMock) == false); CPPUNIT_ASSERT(prod2.isProductOn(HeterogeneousDevice::kGPUCuda) == false); + CPPUNIT_ASSERT(prod2.onDevices(HeterogeneousDevice::kGPUCuda).none() == true); CPPUNIT_ASSERT_THROW(prod1.getProduct(), cms::Exception); CPPUNIT_ASSERT(prod1.getProduct() == 5); @@ -226,6 +252,7 @@ void testHeterogeneousProduct::testMoveGPUCuda() { CPPUNIT_ASSERT(prod2.isProductOn(HeterogeneousDevice::kCPU) == false); CPPUNIT_ASSERT(prod2.isProductOn(HeterogeneousDevice::kGPUMock) == false); CPPUNIT_ASSERT(prod2.isProductOn(HeterogeneousDevice::kGPUCuda) == true); + CPPUNIT_ASSERT(prod2.onDevices(HeterogeneousDevice::kGPUCuda)[3] == true); CPPUNIT_ASSERT_THROW(prod2.getProduct(), cms::Exception); CPPUNIT_ASSERT(prod2.getProduct() == 5); @@ -247,8 +274,8 @@ void testHeterogeneousProduct::testProduct() { heterogeneous::GPUCudaProduct >; - Type1 data1{heterogeneous::cpuProduct(5)}; - Type2 data2{heterogeneous::cpuProduct(10)}; + Type1 data1{heterogeneous::HeterogeneousDeviceTag(), 5}; + Type2 data2{heterogeneous::HeterogeneousDeviceTag(), 10}; HeterogeneousProduct prod{}; CPPUNIT_ASSERT(prod.isNull() == true); diff --git a/HeterogeneousCore/README.md b/HeterogeneousCore/README.md new file mode 100644 index 0000000000000..d3bdd413789d3 --- /dev/null +++ b/HeterogeneousCore/README.md @@ -0,0 +1,116 @@ +# Prototype for CMSSW interface to heterogenous algorithms + +## Introduction + +This package contains a prtotype for the CMSSW interface to +heterogeneous algorithms. The current implementation is, in a sense, a +mini-framework between the CMSSW core framework and the heterogeneous +algorithms. + +More details can be found from the sub-package specific README files (when they get added). + +## Sub-packages + +* [`CUDACore`](CUDACore) CUDA-specific core components + - *TODO:* Do we actually need this separate from `CUDAServices`? Which one to keep? +* [`CUDAServices`](CUDAServices) Various edm::Services related to CUDA +* [`CUDAUtilities`](CUDAUtilities) Various utilities for CUDA kernel code +* [`Producer`](Producer) Core of the mini-framework for code organization: a base EDProducer class with algorithm scheduling to devices +* [`Product`](Product) Core of the mini-framework for data products + +## Design goals + +1. Same module configuration should work on all machines (whether they have heterogeneous devices or not) +2. Keep track of where data is located +3. Run algorithms on the device where their input is located if possible +4. Transfer temporary/transient data to CPU only if needed +5. Abstract away repeated boilerplate code + +## Design considerations + +All below is assuming we do not touch the core CMSSW framework (that +is left for a later exercise when we know better what exactly we want +to do). + +1. The device-specific algorithms must be implemented and scheduled to the device(s) within a single EDProducer +2. Need a special product keeping track of the data location +3. Information of all the input heterogeneous devices must be propagated to the point deciding the device to run the algorithm +4. The special product e.g. holds functions to do the transfer that are called if/when needed + +## General TODO items + +There are also many, more specific TODO items mentioned in comments +within the code. The items below are more general topics (in no +particular order). + +* Improve algorithm-to-device scheduling + - Currently if an algoritm has a GPU implementation and system has a + GPU, the algorithm is always scheduled to the GPU + * This may lead to under-utilization of the CPU if most of the + computations are offloaded to the GPU + - An essential question for making this scheduling more dynamic is + what exactly (we want) it (to) means that a "GPU is too busy" so + it is better to run the algorithm on a CPU + - Possible ideas to explore + * Check the CUDA device utilization (see also monitoring point below) + - Past/current state does not guarantee much about the near future + * Use "tokens" as a resource allocation mechanism + - How many tokens per device? + - What if there no free tokens now but one becomes available after 1 ms? + * In acquire, if GPU is "busy", put the EDProducer to a queue of + heterogeneous tasks. When GPU "becomes available", pick an + EDProducer from the queue and run it in GPU. If CPU runs out of + job, pick an EDProducer from the queue and run it in CPU. + - How to define "busy" and "becomes available"? + - How to become aware that CPU runs out of job? + * Can we create a TBB task that is executed only if there is nothing else to do? + - How does this interact with possible other devices? E.g. if an algorithm has implementations for CPU, GPU, and FPGA? +* Improve edm::Stream-to-CUDA-device scheduling + - Currently each edm::Stream is assigned "statically" to each CUDA device in a round-robin fastion + * There is no load balancing so throughput and utilization will not be optimal + - The reasons for bothering with this is that the `cudaMalloc` is a + heavy operation (see next point) not to be called for each event. + Instead we preallocate the buffers the algorithms need at the + initialization time. In the presence of multiple devices this + pre-allocation leads to a need to somehow match the edm::Streams + and devices. + - Possible ideas to explore + * Naively we could allocate a buffer per edm::Stream in each CUDA device + - Amount of allocated memory is rather excessive + * For N edm::Streams and M GPUs, allocate int((N+1)/M) buffers on each device, eventually pick the least utilized GPU + - No unnecessary buffers + - Need a global list/queue of these buffers per module + * Can the list be abstracted? If not, this solution scales poorly with modules + * Our own CUDA memory allocator that provides a fast way to allocate scratch buffers + - Allows allocating the buffers on-demand on the "best-suited" device +* Our own CUDA memory allocator + - A `cudaMalloc` is a global synchronization point and takes time, + so we want to minimize their calls. This is the main reason to + assign edm::Streams to CUDA devices (see previous point). + - Well-performing allocators are typically highly non-trivial to construct +* Conditions data on GPU + - Currently each module takes care of formatting, transferring, and updating the conditions data to GPU +* Add possibility to initiate the GPU->CPU transfer before the CPU product is needed + - This would enable overlapping the GPU->CPU transfer while CPU is busy + with other work, so the CPU product requestor would not have to wait +* Add configurability + - E.g. for preferred device order, force specific algorithms to specific device +* Add fault tolerance + - E.g. in a case of a GPU running out of memory continue with CPU + - Should be configurable +* Improve resource monitoring + - E.g. for CUDA device utilization + * https://docs.nvidia.com/deploy/nvml-api/group__nvmlDeviceQueries.html#group__nvmlDeviceQueries_1g540824faa6cef45500e0d1dc2f50b321 + * https://docs.nvidia.com/deploy/nvml-api/structnvmlUtilization__t.html#structnvmlUtilization__t + - Include in `CUDAService` or add a separete monitoring service? +* Add support for a mode similar to `tbb::streaming_node` + - Current way of `HeterogeneousEDProducer` with the `ExternalWork` resembles `tbb::async_node` + - In principle the `streaming_node`-way would, for a chain of + GPU-enabled modules, allow the GPU to immediately continue to the + next module without waiting the code path to go through the CMSSW + framework +* Add support for more devices + - E.g. OpenCL, FPGA, remote offload +* Explore the implementation of these features into the core CMSSW framework + - E.g. HeterogeneousProduct would likely go to edm::Wrapper +* Explore how to make core framework/TBB scheduling aware of heterogenous devices From 9f2cdbeec6c056d583e0e636b0c950d5b1d74833 Mon Sep 17 00:00:00 2001 From: Andrea Bocci Date: Wed, 9 May 2018 11:04:19 +0200 Subject: [PATCH 45/88] Move the partial_sum over the modules to the GPU (#46) Replace the `std::partial_sum` on the host with a `thrust::exclusive_scan` on the GPU. Avoid one `cudaMemcpy` from the host back to the device. The `cudaMemcpy` from the device to the host is still necessary to provide the hits on the CPU. --- .../SiPixelRecHits/plugins/PixelRecHits.cu | 94 +++++++++---------- 1 file changed, 44 insertions(+), 50 deletions(-) diff --git a/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.cu b/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.cu index e575d5dfce081..43c9f1a8a9236 100644 --- a/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.cu +++ b/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.cu @@ -1,16 +1,21 @@ -#include "PixelRecHits.h" -#include "gpuPixelRecHits.h" +// C++ headers +#include +#include -#include "RecoLocalTracker/SiPixelClusterizer/plugins/gpuClustering.h" +// CUDA runtime +#include + +// thrust heders +#include +#include -#include "EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.h" // for context.... +// CMSSW headers +#include "EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.h" #include "HeterogeneousCore/CUDAUtilities/interface/cudaCheck.h" +#include "RecoLocalTracker/SiPixelClusterizer/plugins/gpuClustering.h" +#include "PixelRecHits.h" +#include "gpuPixelRecHits.h" -// CUDA runtime -#include -#include -#include -#include HitsOnGPU allocHitsOnGPU() { HitsOnGPU hh; @@ -22,7 +27,7 @@ HitsOnGPU allocHitsOnGPU() { cudaCheck(cudaMalloc((void**) & hh.xerr_d,(gpuClustering::MaxNumModules*256)*sizeof(float))); cudaCheck(cudaMalloc((void**) & hh.yerr_d,(gpuClustering::MaxNumModules*256)*sizeof(float))); cudaCheck(cudaMalloc((void**) & hh.mr_d,(gpuClustering::MaxNumModules*256)*sizeof(uint16_t))); - cudaDeviceSynchronize(); + cudaCheck(cudaDeviceSynchronize()); return hh; } @@ -37,55 +42,44 @@ pixelRecHits_wrapper( HitsOnGPU & hh ) { - - - uint32_t hitsModuleStart[gpuClustering::MaxNumModules+1]; - hitsModuleStart[0] =0; - cudaCheck(cudaMemcpyAsync(&hitsModuleStart[1], c.clusInModule_d, gpuClustering::MaxNumModules*sizeof(uint32_t), cudaMemcpyDefault, c.stream)); - - std::partial_sum(std::begin(hitsModuleStart),std::end(hitsModuleStart),std::begin(hitsModuleStart)); - - auto nhits = hitsModuleStart[gpuClustering::MaxNumModules]; - // std::cout << " total number of clusters " << nhits << std::endl; - - cudaCheck(cudaMemcpyAsync(hh.hitsModuleStart_d, &hitsModuleStart, (gpuClustering::MaxNumModules+1)*sizeof(uint32_t), cudaMemcpyDefault, c.stream)); - + thrust::exclusive_scan(thrust::cuda::par, + c.clusInModule_d, + c.clusInModule_d + gpuClustering::MaxNumModules + 1, + hh.hitsModuleStart_d); - int threadsPerBlock = 256; - int blocks = nModules; - gpuPixelRecHits::getHits<<>>( - cpeParams, - c.moduleInd_d, - c.xx_d, c.yy_d, c.adc_d, - c.moduleStart_d, - c.clusInModule_d, c.moduleId_d, - c.clus_d, - ndigis, - hh.hitsModuleStart_d, - hh.charge_d, - hh.xg_d,hh.yg_d,hh.zg_d, - hh.xerr_d,hh.yerr_d, hh.mr_d, - true // for the time being stay local... - ); - + int threadsPerBlock = 256; + int blocks = nModules; + gpuPixelRecHits::getHits<<>>( + cpeParams, + c.moduleInd_d, + c.xx_d, c.yy_d, c.adc_d, + c.moduleStart_d, + c.clusInModule_d, c.moduleId_d, + c.clus_d, + ndigis, + hh.hitsModuleStart_d, + hh.charge_d, + hh.xg_d, hh.yg_d, hh.zg_d, + hh.xerr_d, hh.yerr_d, hh.mr_d, + true // for the time being stay local... + ); + + + // all this needed only if hits on CPU are required... + uint32_t hitsModuleStart[gpuClustering::MaxNumModules+1]; + cudaCheck(cudaMemcpyAsync(hitsModuleStart, hh.hitsModuleStart_d, (gpuClustering::MaxNumModules+1) * sizeof(uint32_t), cudaMemcpyDefault, c.stream)); + cudaCheck(cudaDeviceSynchronize()); + auto nhits = hitsModuleStart[gpuClustering::MaxNumModules]; - // all this needed only if hits on CPU are required.... HitsOnCPU hoc(nhits); - memcpy(hoc.hitsModuleStart,hitsModuleStart,2001*sizeof(uint32_t)); + memcpy(hoc.hitsModuleStart, hitsModuleStart, (gpuClustering::MaxNumModules+1) * sizeof(uint32_t)); cudaCheck(cudaMemcpyAsync(hoc.charge.data(), hh.charge_d, nhits*sizeof(uint32_t), cudaMemcpyDefault, c.stream)); - - /* - int ngood=0; - auto l1 = hitsModuleStart[96]; - for (auto i=0U; i4000 || (i2000) ) ++ngood; - std::cout << " total number of good clusters " << ngood << std::endl; - */ - cudaCheck(cudaMemcpyAsync(hoc.xl.data(), hh.xg_d, nhits*sizeof(uint32_t), cudaMemcpyDefault, c.stream)); cudaCheck(cudaMemcpyAsync(hoc.yl.data(), hh.yg_d, nhits*sizeof(uint32_t), cudaMemcpyDefault, c.stream)); cudaCheck(cudaMemcpyAsync(hoc.xe.data(), hh.xerr_d, nhits*sizeof(uint32_t), cudaMemcpyDefault, c.stream)); cudaCheck(cudaMemcpyAsync(hoc.ye.data(), hh.yerr_d, nhits*sizeof(uint32_t), cudaMemcpyDefault, c.stream)); cudaCheck(cudaMemcpyAsync(hoc.mr.data(), hh.mr_d, nhits*sizeof(uint16_t), cudaMemcpyDefault, c.stream)); + cudaCheck(cudaDeviceSynchronize()); return hoc; } From 6c80eafa74b3d3426ea289526c15c0df6b3aabf0 Mon Sep 17 00:00:00 2001 From: Andrea Bocci Date: Tue, 15 May 2018 16:46:03 +0200 Subject: [PATCH 46/88] Remove the use of #pragma once (#47) Replace `#pragma once` with classical include guards. --- .../interface/SiPixelGainForHLTonGPU.h | 12 +++++----- .../plugins/gpuCalibPixel.h | 11 ++++++---- .../plugins/gpuClustering.h | 6 +++-- .../SiPixelRecHits/interface/PixelCPEFast.h | 22 +++++++++---------- .../SiPixelRecHits/plugins/PixelRecHits.h | 9 +++++--- .../SiPixelRecHits/plugins/gpuPixelRecHits.h | 9 ++++---- 6 files changed, 39 insertions(+), 30 deletions(-) diff --git a/CondFormats/SiPixelObjects/interface/SiPixelGainForHLTonGPU.h b/CondFormats/SiPixelObjects/interface/SiPixelGainForHLTonGPU.h index 12faeaaa9a845..8cf5451f91b93 100644 --- a/CondFormats/SiPixelObjects/interface/SiPixelGainForHLTonGPU.h +++ b/CondFormats/SiPixelObjects/interface/SiPixelGainForHLTonGPU.h @@ -1,9 +1,10 @@ -#pragma once +#ifndef CondFormats_SiPixelObjects_SiPixelGainForHLTonGPU_h +#define CondFormats_SiPixelObjects_SiPixelGainForHLTonGPU_h -#include -#include -#include -#include +#include +#include +#include +#include struct SiPixelGainForHLTonGPU_DecodingStructure{ uint8_t gain; @@ -67,3 +68,4 @@ class SiPixelGainForHLTonGPU { unsigned int noisyFlag_; }; +#endif // CondFormats_SiPixelObjects_SiPixelGainForHLTonGPU_h diff --git a/RecoLocalTracker/SiPixelClusterizer/plugins/gpuCalibPixel.h b/RecoLocalTracker/SiPixelClusterizer/plugins/gpuCalibPixel.h index fd2b28a4719e8..5e1c2a7486b56 100644 --- a/RecoLocalTracker/SiPixelClusterizer/plugins/gpuCalibPixel.h +++ b/RecoLocalTracker/SiPixelClusterizer/plugins/gpuCalibPixel.h @@ -1,10 +1,11 @@ -#pragma once - -#include "CondFormats/SiPixelObjects/interface/SiPixelGainForHLTonGPU.h" +#ifndef RecoLocalTracker_SiPixelClusterizer_plugins_gpuCalibPixel_h +#define RecoLocalTracker_SiPixelClusterizer_plugins_gpuCalibPixel_h +#include #include #include -#include + +#include "CondFormats/SiPixelObjects/interface/SiPixelGainForHLTonGPU.h" namespace gpuCalibPixel { @@ -123,3 +124,5 @@ namespace gpuCalibPixel { } + +#endif // RecoLocalTracker_SiPixelClusterizer_plugins_gpuCalibPixel_h diff --git a/RecoLocalTracker/SiPixelClusterizer/plugins/gpuClustering.h b/RecoLocalTracker/SiPixelClusterizer/plugins/gpuClustering.h index 5ac7375e008cc..672a4dbe97450 100644 --- a/RecoLocalTracker/SiPixelClusterizer/plugins/gpuClustering.h +++ b/RecoLocalTracker/SiPixelClusterizer/plugins/gpuClustering.h @@ -1,8 +1,9 @@ -#pragma once +#ifndef RecoLocalTracker_SiPixelClusterizer_plugins_gpuClustering_h +#define RecoLocalTracker_SiPixelClusterizer_plugins_gpuClustering_h +#include #include #include -#include namespace gpuClustering { @@ -166,3 +167,4 @@ namespace gpuClustering { } //namespace gpuClustering +#endif // RecoLocalTracker_SiPixelClusterizer_plugins_gpuClustering_h diff --git a/RecoLocalTracker/SiPixelRecHits/interface/PixelCPEFast.h b/RecoLocalTracker/SiPixelRecHits/interface/PixelCPEFast.h index d845cddd6702e..a283cb1fa74ce 100644 --- a/RecoLocalTracker/SiPixelRecHits/interface/PixelCPEFast.h +++ b/RecoLocalTracker/SiPixelRecHits/interface/PixelCPEFast.h @@ -1,19 +1,15 @@ -#pragma once - -#include "RecoLocalTracker/SiPixelRecHits/interface/pixelCPEforGPU.h" -#include "RecoLocalTracker/SiPixelRecHits/interface/PixelCPEBase.h" -#include "CalibTracker/SiPixelESProducers/interface/SiPixelCPEGenericDBErrorParametrization.h" - - -// The template header files -#include "RecoLocalTracker/SiPixelRecHits/interface/SiPixelTemplate.h" -#include "RecoLocalTracker/SiPixelRecHits/interface/SiPixelGenError.h" - -#include "HeterogeneousCore/CUDAUtilities/interface/CUDAHostAllocator.h" +#ifndef RecoLocalTracker_SiPixelRecHits_PixelCPEFast_h +#define RecoLocalTracker_SiPixelRecHits_PixelCPEFast_h #include #include +#include "CalibTracker/SiPixelESProducers/interface/SiPixelCPEGenericDBErrorParametrization.h" +#include "HeterogeneousCore/CUDAUtilities/interface/CUDAHostAllocator.h" +#include "RecoLocalTracker/SiPixelRecHits/interface/PixelCPEBase.h" +#include "RecoLocalTracker/SiPixelRecHits/interface/SiPixelGenError.h" +#include "RecoLocalTracker/SiPixelRecHits/interface/SiPixelTemplate.h" +#include "RecoLocalTracker/SiPixelRecHits/interface/pixelCPEforGPU.h" class MagneticField; class PixelCPEFast final : public PixelCPEBase @@ -85,3 +81,5 @@ public : pixelCPEforGPU::ParamsOnGPU h_paramsOnGPU; pixelCPEforGPU::ParamsOnGPU * d_paramsOnGPU; // copy of the above on the Device }; + +#endif // RecoLocalTracker_SiPixelRecHits_PixelCPEFast_h diff --git a/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.h b/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.h index 632f5c64e2b9f..75976ad697a1a 100644 --- a/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.h +++ b/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.h @@ -1,7 +1,8 @@ -#pragma once +#ifndef RecoLocalTracker_SiPixelRecHits_plugins_PixelRecHits_h +#define RecoLocalTracker_SiPixelRecHits_plugins_PixelRecHits_h -#include -#include +#include +#include namespace pixelCPEforGPU { struct ParamsOnGPU; @@ -37,3 +38,5 @@ HitsOnCPU pixelRecHits_wrapper( uint32_t nModules, // active modules (with digis) HitsOnGPU & hh ); + +#endif // RecoLocalTracker_SiPixelRecHits_plugins_PixelRecHits_h diff --git a/RecoLocalTracker/SiPixelRecHits/plugins/gpuPixelRecHits.h b/RecoLocalTracker/SiPixelRecHits/plugins/gpuPixelRecHits.h index 2a6f2d0c3d926..14e4f5f26aaa1 100644 --- a/RecoLocalTracker/SiPixelRecHits/plugins/gpuPixelRecHits.h +++ b/RecoLocalTracker/SiPixelRecHits/plugins/gpuPixelRecHits.h @@ -1,12 +1,12 @@ -#pragma once - -#include "RecoLocalTracker/SiPixelRecHits/interface/pixelCPEforGPU.h" +#ifndef RecoLocalTracker_SiPixelRecHits_plugins_gpuPixelRecHits_h +#define RecoLocalTracker_SiPixelRecHits_plugins_gpuPixelRecHits_h +#include #include #include #include -#include +#include "RecoLocalTracker/SiPixelRecHits/interface/pixelCPEforGPU.h" namespace gpuPixelRecHits { @@ -132,3 +132,4 @@ namespace gpuPixelRecHits { } +#endif // RecoLocalTracker_SiPixelRecHits_plugins_gpuPixelRecHits_h From ee0dead92c27e3591e303176fd451032ea1fea1c Mon Sep 17 00:00:00 2001 From: Matti Kortelainen Date: Wed, 23 May 2018 14:18:55 +0200 Subject: [PATCH 47/88] Updates to HeterogeneousEDProducer (#50) - remove acquireCPU() as unnecessary - allow omitting device->CPU transfer function - add per-device-type configurability to heterogeneous modules - fix module label in fillDescriptions - move README.md inside HeterogeneousCore/Producer package --- .../CUDACore/interface/GPUCuda.h | 6 +++ HeterogeneousCore/CUDACore/src/GPUCuda.cc | 18 +++++-- HeterogeneousCore/{ => Producer}/README.md | 21 +++++--- .../interface/HeterogeneousEDProducer.h | 35 ++++++++++-- .../Producer/interface/HeterogeneousEvent.h | 2 +- .../Producer/src/HeterogeneousEDProducer.cc | 47 ++++++++++------ .../test/TestHeterogeneousEDProducerGPU.cc | 53 +++++++++---------- .../TestHeterogeneousEDProducerGPUMock.cc | 48 +++++++---------- .../Producer/test/testGPUMock_cfg.py | 3 ++ .../Producer/test/testGPU_cfg.py | 16 +++--- .../Product/interface/HeterogeneousProduct.h | 15 ++++++ 11 files changed, 168 insertions(+), 96 deletions(-) rename HeterogeneousCore/{ => Producer}/README.md (87%) diff --git a/HeterogeneousCore/CUDACore/interface/GPUCuda.h b/HeterogeneousCore/CUDACore/interface/GPUCuda.h index 1413348b3b446..6e02ef83b312c 100644 --- a/HeterogeneousCore/CUDACore/interface/GPUCuda.h +++ b/HeterogeneousCore/CUDACore/interface/GPUCuda.h @@ -3,6 +3,7 @@ #include "FWCore/Concurrency/interface/WaitingTaskWithArenaHolder.h" #include "FWCore/Framework/interface/Frameworkfwd.h" +#include "FWCore/ParameterSet/interface/ParameterSetDescription.h" #include "HeterogeneousCore/Producer/interface/DeviceWrapper.h" #include "HeterogeneousCore/Producer/interface/HeterogeneousEvent.h" @@ -16,12 +17,15 @@ namespace heterogeneous { public: using CallbackType = std::function; + explicit GPUCuda(const edm::ParameterSet& iConfig); virtual ~GPUCuda() noexcept(false); void call_beginStreamGPUCuda(edm::StreamID id); bool call_acquireGPUCuda(DeviceBitSet inputLocation, edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup, edm::WaitingTaskWithArenaHolder waitingTaskHolder); void call_produceGPUCuda(edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup); + static void fillPSetDescription(edm::ParameterSetDescription& desc); + private: virtual void beginStreamGPUCuda(edm::StreamID id, cuda::stream_t<>& cudaStream) {}; virtual void acquireGPUCuda(const edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup, cuda::stream_t<>& cudaStream) = 0; @@ -29,6 +33,8 @@ namespace heterogeneous { std::unique_ptr> cudaStream_; int deviceId_ = -1; // device assigned to this edm::Stream + bool enabled_; + const bool forced_; }; DEFINE_DEVICE_WRAPPER(GPUCuda, HeterogeneousDevice::kGPUCuda); } diff --git a/HeterogeneousCore/CUDACore/src/GPUCuda.cc b/HeterogeneousCore/CUDACore/src/GPUCuda.cc index 983ae4039c28a..8686c8640a8b8 100644 --- a/HeterogeneousCore/CUDACore/src/GPUCuda.cc +++ b/HeterogeneousCore/CUDACore/src/GPUCuda.cc @@ -9,11 +9,21 @@ #include namespace heterogeneous { + GPUCuda::GPUCuda(const edm::ParameterSet& iConfig): + enabled_(iConfig.getUntrackedParameter("GPUCuda")), + forced_(iConfig.getUntrackedParameter("force") == "GPUCuda") + {} + GPUCuda::~GPUCuda() noexcept(false) {} + void GPUCuda::fillPSetDescription(edm::ParameterSetDescription& desc) { + desc.addUntracked("GPUCuda", true); + } + void GPUCuda::call_beginStreamGPUCuda(edm::StreamID id) { edm::Service cudaService; - if(!cudaService->enabled()) { + enabled_ = (enabled_ && cudaService->enabled()); + if(!enabled_) { return; } @@ -41,11 +51,13 @@ namespace heterogeneous { } bool GPUCuda::call_acquireGPUCuda(DeviceBitSet inputLocation, edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup, edm::WaitingTaskWithArenaHolder waitingTaskHolder) { - edm::Service cudaService; - if(!cudaService->enabled()) { + if(!enabled_) { return false; } + // TODO: currently 'forced_ == true' is already assumed. When the + // scheduling logic evolves, add explicit treatment of forced_. + cuda::device::current::scoped_override_t<> setDeviceForThisScope(deviceId_); try { diff --git a/HeterogeneousCore/README.md b/HeterogeneousCore/Producer/README.md similarity index 87% rename from HeterogeneousCore/README.md rename to HeterogeneousCore/Producer/README.md index d3bdd413789d3..b66be0f445705 100644 --- a/HeterogeneousCore/README.md +++ b/HeterogeneousCore/Producer/README.md @@ -11,12 +11,12 @@ More details can be found from the sub-package specific README files (when they ## Sub-packages -* [`CUDACore`](CUDACore) CUDA-specific core components +* [`CUDACore`](../CUDACore) CUDA-specific core components - *TODO:* Do we actually need this separate from `CUDAServices`? Which one to keep? -* [`CUDAServices`](CUDAServices) Various edm::Services related to CUDA -* [`CUDAUtilities`](CUDAUtilities) Various utilities for CUDA kernel code -* [`Producer`](Producer) Core of the mini-framework for code organization: a base EDProducer class with algorithm scheduling to devices -* [`Product`](Product) Core of the mini-framework for data products +* [`CUDAServices`](../CUDAServices) Various edm::Services related to CUDA +* [`CUDAUtilities`](../CUDAUtilities) Various utilities for CUDA kernel code +* [`Producer`](#heterogeneousedproducer) Core of the mini-framework for code organization: a base EDProducer class with algorithm scheduling to devices +* [`Product`](../Product) Core of the mini-framework for data products ## Design goals @@ -90,11 +90,14 @@ particular order). - Well-performing allocators are typically highly non-trivial to construct * Conditions data on GPU - Currently each module takes care of formatting, transferring, and updating the conditions data to GPU + - This is probably good-enough for the current prototyping phase, but what about longer term? + * How to deal with multiple devices, multiple edm::Streams, and multiple lumi sections in flight? + * Do we need to make EventSetup aware of the devices? How much do the details depend on device type? * Add possibility to initiate the GPU->CPU transfer before the CPU product is needed - This would enable overlapping the GPU->CPU transfer while CPU is busy with other work, so the CPU product requestor would not have to wait -* Add configurability - - E.g. for preferred device order, force specific algorithms to specific device +* Improve configurability + - E.g. for preferred device order? * Add fault tolerance - E.g. in a case of a GPU running out of memory continue with CPU - Should be configurable @@ -114,3 +117,7 @@ particular order). * Explore the implementation of these features into the core CMSSW framework - E.g. HeterogeneousProduct would likely go to edm::Wrapper * Explore how to make core framework/TBB scheduling aware of heterogenous devices + +# HeterogeneousEDProducer + +To be written. \ No newline at end of file diff --git a/HeterogeneousCore/Producer/interface/HeterogeneousEDProducer.h b/HeterogeneousCore/Producer/interface/HeterogeneousEDProducer.h index a60b47b0f26cd..4f06571e8a70d 100644 --- a/HeterogeneousCore/Producer/interface/HeterogeneousEDProducer.h +++ b/HeterogeneousCore/Producer/interface/HeterogeneousEDProducer.h @@ -4,6 +4,8 @@ #include "FWCore/Concurrency/interface/WaitingTaskWithArenaHolder.h" #include "FWCore/Framework/interface/stream/EDProducer.h" #include "FWCore/Framework/interface/Frameworkfwd.h" +#include "FWCore/ParameterSet/interface/ParameterSet.h" +#include "FWCore/ParameterSet/interface/ParameterSetDescription.h" #include "FWCore/Utilities/interface/Exception.h" #include "DataFormats/Common/interface/Handle.h" @@ -15,27 +17,30 @@ namespace heterogeneous { class CPU { public: + explicit CPU(const edm::ParameterSet& iConfig) {} virtual ~CPU() noexcept(false); + static void fillPSetDescription(edm::ParameterSetDescription desc) {} + void call_beginStreamCPU(edm::StreamID id) { beginStreamCPU(id); } bool call_acquireCPU(edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup, edm::WaitingTaskWithArenaHolder waitingTaskHolder); - void call_produceCPU(edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup) { - produceCPU(iEvent, iSetup); - } + void call_produceCPU(edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup); private: virtual void beginStreamCPU(edm::StreamID id) {}; - virtual void acquireCPU(const edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup) = 0; virtual void produceCPU(edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup) = 0; }; DEFINE_DEVICE_WRAPPER(CPU, HeterogeneousDevice::kCPU); class GPUMock { public: + explicit GPUMock(const edm::ParameterSet& iConfig); virtual ~GPUMock() noexcept(false); + static void fillPSetDescription(edm::ParameterSetDescription& desc); + void call_beginStreamGPUMock(edm::StreamID id) { beginStreamGPUMock(id); } @@ -48,6 +53,9 @@ namespace heterogeneous { virtual void beginStreamGPUMock(edm::StreamID id) {}; virtual void acquireGPUMock(const edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup, std::function callback) = 0; virtual void produceGPUMock(edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup) = 0; + + const bool enabled_; + const bool forced_; }; DEFINE_DEVICE_WRAPPER(GPUMock, HeterogeneousDevice::kGPUMock); } @@ -132,6 +140,15 @@ namespace heterogeneous { template class HeterogeneousDevices: public Devices... { public: + explicit HeterogeneousDevices(const edm::ParameterSet& iConfig): Devices(iConfig)... {} + + static void fillPSetDescription(edm::ParameterSetDescription& desc) { + // The usual trick to expand the parameter pack for function call + using expander = int[]; + (void)expander {0, ((void)Devices::fillPSetDescription(desc), 1)... }; + desc.addUntracked("force", ""); + } + void call_beginStream(edm::StreamID id) { CallBeginStream::call(*this, id); } @@ -152,7 +169,9 @@ namespace heterogeneous { template class HeterogeneousEDProducer: public Devices, public edm::stream::EDProducer { public: - HeterogeneousEDProducer() {} + explicit HeterogeneousEDProducer(const edm::ParameterSet& iConfig): + Devices(iConfig.getUntrackedParameter("heterogeneousEnabled_")) + {} ~HeterogeneousEDProducer() = default; protected: @@ -161,6 +180,12 @@ class HeterogeneousEDProducer: public Devices, public edm::stream::EDProducer("heterogeneousEnabled_", nested); + } + private: void beginStream(edm::StreamID id) { Devices::call_beginStream(id); diff --git a/HeterogeneousCore/Producer/interface/HeterogeneousEvent.h b/HeterogeneousCore/Producer/interface/HeterogeneousEvent.h index 98595dbd6baa6..e06e0a8ffa86c 100644 --- a/HeterogeneousCore/Producer/interface/HeterogeneousEvent.h +++ b/HeterogeneousCore/Producer/interface/HeterogeneousEvent.h @@ -48,7 +48,7 @@ namespace edm { CASE(HeterogeneousDevice::kGPUMock); CASE(HeterogeneousDevice::kGPUCuda); default: - throw cms::Exception("LogicError") << "edm::HeterogeneousEvent::getByToken(): no case statement for device " << static_cast(location().deviceType()); + throw cms::Exception("LogicError") << "edm::HeterogeneousEvent::getByToken(): no case statement for device " << static_cast(location().deviceType()) << ". If you are calling getByToken() from produceX() where X != CPU, please move the call to acquireX()."; } #undef CASE } diff --git a/HeterogeneousCore/Producer/src/HeterogeneousEDProducer.cc b/HeterogeneousCore/Producer/src/HeterogeneousEDProducer.cc index c7f7f152bd75d..74bce0c8e89a9 100644 --- a/HeterogeneousCore/Producer/src/HeterogeneousEDProducer.cc +++ b/HeterogeneousCore/Producer/src/HeterogeneousEDProducer.cc @@ -11,30 +11,47 @@ namespace heterogeneous { CPU::~CPU() noexcept(false) {} bool CPU::call_acquireCPU(edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup, edm::WaitingTaskWithArenaHolder waitingTaskHolder) { - std::exception_ptr exc; - try { - iEvent.setInputLocation(HeterogeneousDeviceId(HeterogeneousDevice::kCPU)); - acquireCPU(iEvent, iSetup); - iEvent.locationSetter()(HeterogeneousDeviceId(HeterogeneousDevice::kCPU)); - } catch(...) { - exc = std::current_exception(); - } - waitingTaskHolder.doneWaiting(exc); + // There is no need for acquire in CPU, everything can be done in produceCPU(). + iEvent.locationSetter()(HeterogeneousDeviceId(HeterogeneousDevice::kCPU)); + waitingTaskHolder.doneWaiting(nullptr); return true; } + void CPU::call_produceCPU(edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup) { + // For CPU we set the heterogeneous input location for produce, because there is no acquire + // For other devices this probably doesn't make sense, because the device code is supposed to be launched from acquire. + iEvent.setInputLocation(HeterogeneousDeviceId(HeterogeneousDevice::kCPU, 0)); + produceCPU(iEvent, iSetup); + } + + GPUMock::GPUMock(const edm::ParameterSet& iConfig): + enabled_(iConfig.getUntrackedParameter("GPUMock")), + forced_(iConfig.getUntrackedParameter("force") == "GPUMock") + {} + GPUMock::~GPUMock() noexcept(false) {} + void GPUMock::fillPSetDescription(edm::ParameterSetDescription& desc) { + desc.addUntracked("GPUMock", true); + } + bool GPUMock::call_acquireGPUMock(DeviceBitSet inputLocation, edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup, edm::WaitingTaskWithArenaHolder waitingTaskHolder) { - // Decide randomly whether to run on GPU or CPU to simulate scheduler decisions - std::random_device r; - std::mt19937 gen(r()); - auto dist1 = std::uniform_int_distribution<>(0, 3); // simulate GPU (in)availability - if(dist1(gen) == 0) { - edm::LogPrint("HeterogeneousEDProducer") << "Mock GPU is not available (by chance)"; + if(!enabled_) { + edm::LogPrint("HeterogeneousEDProducer") << "Mock GPU is not available for this module (disabled in configuration)"; return false; } + if(!forced_) { + // Decide randomly whether to run on GPU or CPU to simulate scheduler decisions + std::random_device r; + std::mt19937 gen(r()); + auto dist1 = std::uniform_int_distribution<>(0, 3); // simulate GPU (in)availability + if(dist1(gen) == 0) { + edm::LogPrint("HeterogeneousEDProducer") << "Mock GPU is not available (by chance)"; + return false; + } + } + try { iEvent.setInputLocation(HeterogeneousDeviceId(HeterogeneousDevice::kGPUMock, 0)); acquireGPUMock(iEvent, iSetup, diff --git a/HeterogeneousCore/Producer/test/TestHeterogeneousEDProducerGPU.cc b/HeterogeneousCore/Producer/test/TestHeterogeneousEDProducerGPU.cc index 83afa1e8ca373..b92fa76614e85 100644 --- a/HeterogeneousCore/Producer/test/TestHeterogeneousEDProducerGPU.cc +++ b/HeterogeneousCore/Producer/test/TestHeterogeneousEDProducerGPU.cc @@ -43,7 +43,6 @@ class TestHeterogeneousEDProducerGPU: public HeterogeneousEDProducer& cudaStream) override; - void acquireCPU(const edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup) override; void acquireGPUCuda(const edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup, cuda::stream_t<>& cudaStream) override; void produceCPU(edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup) override; @@ -55,12 +54,10 @@ class TestHeterogeneousEDProducerGPU: public HeterogeneousEDProducer gpuAlgo_; TestHeterogeneousEDProducerGPUTask::ResultType gpuOutput_; - - // output - unsigned int output_; }; TestHeterogeneousEDProducerGPU::TestHeterogeneousEDProducerGPU(edm::ParameterSet const& iConfig): + HeterogeneousEDProducer(iConfig), label_(iConfig.getParameter("@module_label")) { auto srcTag = iConfig.getParameter("src"); @@ -74,7 +71,8 @@ TestHeterogeneousEDProducerGPU::TestHeterogeneousEDProducerGPU(edm::ParameterSet void TestHeterogeneousEDProducerGPU::fillDescriptions(edm::ConfigurationDescriptions& descriptions) { edm::ParameterSetDescription desc; desc.add("src", edm::InputTag()); - descriptions.add("testHeterogeneousEDProducerGPU2", desc); + HeterogeneousEDProducer::fillPSetDescription(desc); + descriptions.add("testHeterogeneousEDProducerGPU", desc); } void TestHeterogeneousEDProducerGPU::beginStreamGPUCuda(edm::StreamID streamId, cuda::stream_t<>& cudaStream) { @@ -87,28 +85,6 @@ void TestHeterogeneousEDProducerGPU::beginStreamGPUCuda(edm::StreamID streamId, edm::LogPrint("TestHeterogeneousEDProducerGPU") << " " << label_ << " TestHeterogeneousEDProducerGPU::beginStreamGPUCuda end stream " << streamId << " device " << cs->getCurrentDevice(); } -void TestHeterogeneousEDProducerGPU::acquireCPU(const edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup) { - edm::LogPrint("TestHeterogeneousEDProducerGPU") << " " << label_ << " TestHeterogeneousEDProducerGPU::acquireCPU begin event " << iEvent.id().event() << " stream " << iEvent.streamID(); - - unsigned int input = 0; - if(!srcToken_.isUninitialized()) { - edm::Handle hin; - iEvent.getByToken(srcToken_, hin); - input = *hin; - } - - std::random_device r; - std::mt19937 gen(r()); - auto dist = std::uniform_real_distribution<>(1.0, 3.0); - auto dur = dist(gen); - edm::LogPrint("TestHeterogeneousEDProducerGPU") << " Task (CPU) for event " << iEvent.id().event() << " in stream " << iEvent.streamID() << " will take " << dur << " seconds"; - std::this_thread::sleep_for(std::chrono::seconds(1)*dur); - - output_ = input + iEvent.streamID()*100 + iEvent.id().event(); - - edm::LogPrint("TestHeterogeneousEDProducerGPU") << " " << label_ << " TestHeterogeneousEDProducerGPU::acquireCPU end event " << iEvent.id().event() << " stream " << iEvent.streamID(); -} - void TestHeterogeneousEDProducerGPU::acquireGPUCuda(const edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup, cuda::stream_t<>& cudaStream) { edm::Service cs; edm::LogPrint("TestHeterogeneousEDProducerGPU") << " " << label_ << " TestHeterogeneousEDProducerGPU::acquireGPUCuda begin event " << iEvent.id().event() << " stream " << iEvent.streamID() << " device " << cs->getCurrentDevice(); @@ -131,9 +107,25 @@ void TestHeterogeneousEDProducerGPU::acquireGPUCuda(const edm::HeterogeneousEven void TestHeterogeneousEDProducerGPU::produceCPU(edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup) { edm::LogPrint("TestHeterogeneousEDProducerGPU") << label_ << " TestHeterogeneousEDProducerGPU::produceCPU begin event " << iEvent.id().event() << " stream " << iEvent.streamID(); - iEvent.put(std::make_unique(output_)); + unsigned int input = 0; + if(!srcToken_.isUninitialized()) { + edm::Handle hin; + iEvent.getByToken(srcToken_, hin); + input = *hin; + } - edm::LogPrint("TestHeterogeneousEDProducerGPU") << label_ << " TestHeterogeneousEDProducerGPU::produceCPU end event " << iEvent.id().event() << " stream " << iEvent.streamID() << " result " << output_; + std::random_device r; + std::mt19937 gen(r()); + auto dist = std::uniform_real_distribution<>(1.0, 3.0); + auto dur = dist(gen); + edm::LogPrint("TestHeterogeneousEDProducerGPU") << " Task (CPU) for event " << iEvent.id().event() << " in stream " << iEvent.streamID() << " will take " << dur << " seconds"; + std::this_thread::sleep_for(std::chrono::seconds(1)*dur); + + const unsigned int output = input + iEvent.streamID()*100 + iEvent.id().event(); + + iEvent.put(std::make_unique(output)); + + edm::LogPrint("TestHeterogeneousEDProducerGPU") << label_ << " TestHeterogeneousEDProducerGPU::produceCPU end event " << iEvent.id().event() << " stream " << iEvent.streamID() << " result " << output; } void TestHeterogeneousEDProducerGPU::produceGPUCuda(edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup, cuda::stream_t<>& cudaStream) { @@ -155,6 +147,9 @@ void TestHeterogeneousEDProducerGPU::produceGPUCuda(edm::HeterogeneousEvent& iEv dst = TestHeterogeneousEDProducerGPUTask::getResult(src, cudaStream); }); + // If, for any reason, you want to disable the automatic GPU->CPU transfer, pass heterogeneous::DisableTransfer{} insteads of the function, i.e. + //iEvent.put(std::make_unique(gpuOutput_.first.get(), gpuOutput_.second.get()), heterogeneous::DisableTransfer{}); + edm::LogPrint("TestHeterogeneousEDProducerGPU") << label_ << " TestHeterogeneousEDProducerGPU::produceGPUCuda end event " << iEvent.id().event() << " stream " << iEvent.streamID() << " device " << cs->getCurrentDevice(); } diff --git a/HeterogeneousCore/Producer/test/TestHeterogeneousEDProducerGPUMock.cc b/HeterogeneousCore/Producer/test/TestHeterogeneousEDProducerGPUMock.cc index 697810ed36dab..716b05ecc165c 100644 --- a/HeterogeneousCore/Producer/test/TestHeterogeneousEDProducerGPUMock.cc +++ b/HeterogeneousCore/Producer/test/TestHeterogeneousEDProducerGPUMock.cc @@ -43,10 +43,6 @@ class TestHeterogeneousEDProducerGPUMock: public HeterogeneousEDProducer callback); void produceCPU(edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup) override; @@ -54,6 +50,7 @@ class TestHeterogeneousEDProducerGPUMock: public HeterogeneousEDProducer("@module_label")) { auto srcTag = iConfig.getParameter("src"); @@ -68,31 +65,10 @@ TestHeterogeneousEDProducerGPUMock::TestHeterogeneousEDProducerGPUMock(edm::Para void TestHeterogeneousEDProducerGPUMock::fillDescriptions(edm::ConfigurationDescriptions& descriptions) { edm::ParameterSetDescription desc; desc.add("src", edm::InputTag()); + HeterogeneousEDProducer::fillPSetDescription(desc); descriptions.add("testHeterogeneousEDProducerGPUMock", desc); } -void TestHeterogeneousEDProducerGPUMock::acquireCPU(const edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup) { - edm::LogPrint("TestHeterogeneousEDProducerGPUMock") << label_ << " TestHeterogeneousEDProducerGPUMock::acquireCPU event " << iEvent.id().event() << " stream " << iEvent.streamID(); - - unsigned int input = 0; - if(!srcToken_.isUninitialized()) { - edm::Handle hin; - iEvent.getByToken(srcToken_, hin); - input = *hin; - } - - std::random_device r; - std::mt19937 gen(r()); - auto dist = std::uniform_real_distribution<>(1.0, 3.0); - auto dur = dist(gen); - edm::LogPrint("TestHeterogeneousEDProducerGPUMock") << " Task (CPU) for event " << iEvent.id().event() << " in stream " << iEvent.streamID() << " will take " << dur << " seconds"; - std::this_thread::sleep_for(std::chrono::seconds(1)*dur); - - output_ = input+ iEvent.streamID()*100 + iEvent.id().event(); - - edm::LogPrint("TestHeterogeneousEDProducerGPUMock") << " " << label_ << " TestHeterogeneousEDProducerGPUMock::acquireCPU end event " << iEvent.id().event() << " stream " << iEvent.streamID(); -} - void TestHeterogeneousEDProducerGPUMock::acquireGPUMock(const edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup, std::function callback) { edm::LogPrint("TestHeterogeneousEDProducerGPUMock") << " " << label_ << " TestHeterogeneousEDProducerGPUMock::acquireGPUMock begin event " << iEvent.id().event() << " stream " << iEvent.streamID(); @@ -129,10 +105,26 @@ void TestHeterogeneousEDProducerGPUMock::acquireGPUMock(const edm::Heterogeneous void TestHeterogeneousEDProducerGPUMock::produceCPU(edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup) { edm::LogPrint("TestHeterogeneousEDProducerGPUMock") << label_ << " TestHeterogeneousEDProducerGPUMock::produceCPU begin event " << iEvent.id().event() << " stream " << iEvent.streamID(); - iEvent.put(std::make_unique(output_)); + unsigned int input = 0; + if(!srcToken_.isUninitialized()) { + edm::Handle hin; + iEvent.getByToken(srcToken_, hin); + input = *hin; + } + + std::random_device r; + std::mt19937 gen(r()); + auto dist = std::uniform_real_distribution<>(1.0, 3.0); + auto dur = dist(gen); + edm::LogPrint("TestHeterogeneousEDProducerGPUMock") << " Task (CPU) for event " << iEvent.id().event() << " in stream " << iEvent.streamID() << " will take " << dur << " seconds"; + std::this_thread::sleep_for(std::chrono::seconds(1)*dur); + + const unsigned int output = input+ iEvent.streamID()*100 + iEvent.id().event(); + + iEvent.put(std::make_unique(output)); iEvent.put(std::make_unique(1)); - edm::LogPrint("TestHeterogeneousEDProducerGPUMock") << label_ << " TestHeterogeneousEDProducerGPUMock::produceCPU end event " << iEvent.id().event() << " stream " << iEvent.streamID() << " result " << output_; + edm::LogPrint("TestHeterogeneousEDProducerGPUMock") << label_ << " TestHeterogeneousEDProducerGPUMock::produceCPU end event " << iEvent.id().event() << " stream " << iEvent.streamID() << " result " << output; } void TestHeterogeneousEDProducerGPUMock::produceGPUMock(edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup) { diff --git a/HeterogeneousCore/Producer/test/testGPUMock_cfg.py b/HeterogeneousCore/Producer/test/testGPUMock_cfg.py index c1fe7f60db33a..f6d4125f792df 100644 --- a/HeterogeneousCore/Producer/test/testGPUMock_cfg.py +++ b/HeterogeneousCore/Producer/test/testGPUMock_cfg.py @@ -28,3 +28,6 @@ ) process.p = cms.Path(process.prod1+process.prod2)#+process.eca) #process.p.associate(process.t) + +# Example of forcing module to run a specific device for one module via configuration +#process.prod1.heterogeneousEnabled_ = cms.untracked.PSet(force = cms.untracked.string("GPUMock")) diff --git a/HeterogeneousCore/Producer/test/testGPU_cfg.py b/HeterogeneousCore/Producer/test/testGPU_cfg.py index 9b916a685b88c..73042fc799d05 100644 --- a/HeterogeneousCore/Producer/test/testGPU_cfg.py +++ b/HeterogeneousCore/Producer/test/testGPU_cfg.py @@ -12,17 +12,14 @@ numberOfStreams = cms.untracked.uint32(0) ) +from HeterogeneousCore.Producer.testHeterogeneousEDProducerGPU_cfi import testHeterogeneousEDProducerGPU as prod #process.Tracer = cms.Service("Tracer") process.CUDAService = cms.Service("CUDAService") -process.prod1 = cms.EDProducer('TestHeterogeneousEDProducerGPU') -process.prod2 = cms.EDProducer('TestHeterogeneousEDProducerGPU', - src = cms.InputTag("prod1"), -) -process.prod3 = cms.EDProducer('TestHeterogeneousEDProducerGPU', - src = cms.InputTag("prod1"), -) -process.prod4 = cms.EDProducer('TestHeterogeneousEDProducerGPU') +process.prod1 = prod.clone() +process.prod2 = prod.clone(src = "prod1") +process.prod3 = prod.clone(src = "prod1") +process.prod4 = prod.clone() process.ana = cms.EDAnalyzer("TestHeterogeneousEDProducerAnalyzer", src = cms.VInputTag("prod2", "prod3", "prod4") ) @@ -30,3 +27,6 @@ process.t = cms.Task(process.prod1, process.prod2, process.prod3, process.prod4) process.p = cms.Path(process.ana) process.p.associate(process.t) + +# Example of disabling CUDA device type for one module via configuration +#process.prod4.heterogeneousEnabled_.GPUCuda = False diff --git a/HeterogeneousCore/Product/interface/HeterogeneousProduct.h b/HeterogeneousCore/Product/interface/HeterogeneousProduct.h index c5317ba2acbc3..9e0b5a2b0588c 100644 --- a/HeterogeneousCore/Product/interface/HeterogeneousProduct.h +++ b/HeterogeneousCore/Product/interface/HeterogeneousProduct.h @@ -55,6 +55,9 @@ namespace heterogeneous { DEFINE_DEVICE_PRODUCT(GPUCuda); #undef DEFINE_DEVICE_PRODUCT + // Tag class to allow disabling automatic device->CPU transfers + struct DisableTransfer {}; + /** * Below are various helpers * @@ -262,6 +265,18 @@ class HeterogeneousProductImpl: public HeterogeneousProductBase { location_[index].set(location.deviceId()); } + /** + * Generic constructor for device data, but without the transfer function(!). + */ + template + HeterogeneousProductImpl(heterogeneous::HeterogeneousDeviceTag, D&& data, HeterogeneousDeviceId location, heterogeneous::DisableTransfer) { + // TODO: try to avoid code duplication between the other device data + constexpr const auto index = static_cast(Device); + assert(location.deviceType() == Device); + std::get(products_) = std::move(data); + location_[index].set(location.deviceId()); + } + template const auto& getProduct() const { constexpr const auto index = static_cast(device); From 4a9d474fbeb2801fc47d07b1e4f627dd740563d3 Mon Sep 17 00:00:00 2001 From: Andrea Bocci Date: Wed, 23 May 2018 16:21:20 +0200 Subject: [PATCH 48/88] Clean up some GPU- and non-GPU-related pixel tracking code (#49) - clean up GPU- and non-GPU-related pixel tracking code and build files - drop obsolete or unused classes - rename RawToDigiGPU to SiPixelRawToDigiGPUKernel - move the definitions in SiPixelRawToDigiGPUKernel to the `pixelgpudetails` namespace --- .../SiPixelRawToDigi/plugins/BuildFile.xml | 4 +- .../SiPixelRawToDigi/plugins/DetParamBits.h | 39 - .../SiPixelRawToDigi/plugins/EventInfoGPU.h | 11 - .../SiPixelRawToDigi/plugins/RawToDigiGPU.cu | 693 ----------------- .../SiPixelRawToDigi/plugins/RawToDigiGPU.h | 216 ------ .../SiPixelRawToDigi/plugins/SealModule.cc | 8 - .../plugins/SiPixelDigiToRaw.cc | 5 +- .../plugins/SiPixelFedCablingMapGPU.cc | 45 +- .../plugins/SiPixelFedCablingMapGPU.h | 54 +- .../plugins/SiPixelRawToDigi.cc | 4 + .../plugins/SiPixelRawToDigiGPU.cc | 44 +- .../plugins/SiPixelRawToDigiGPU.h | 32 +- .../plugins/SiPixelRawToDigiGPUKernel.cu | 696 ++++++++++++++++++ .../plugins/SiPixelRawToDigiGPUKernel.h | 212 ++++++ .../SiPixelRecHits/interface/pixelCPEforGPU.h | 317 ++++---- .../SiPixelRecHits/plugins/PixelRecHits.cu | 4 +- .../SiPixelRecHits/plugins/PixelRecHits.h | 6 +- .../plugins/SiPixelRecHitGPU.cc | 18 +- .../SiPixelRecHits/plugins/gpuPixelRecHits.h | 96 ++- 19 files changed, 1221 insertions(+), 1283 deletions(-) delete mode 100644 EventFilter/SiPixelRawToDigi/plugins/DetParamBits.h delete mode 100644 EventFilter/SiPixelRawToDigi/plugins/EventInfoGPU.h delete mode 100644 EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.cu delete mode 100644 EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.h delete mode 100644 EventFilter/SiPixelRawToDigi/plugins/SealModule.cc create mode 100644 EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPUKernel.cu create mode 100644 EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPUKernel.h diff --git a/EventFilter/SiPixelRawToDigi/plugins/BuildFile.xml b/EventFilter/SiPixelRawToDigi/plugins/BuildFile.xml index 790b772fc6feb..3e047e2f90b57 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/BuildFile.xml +++ b/EventFilter/SiPixelRawToDigi/plugins/BuildFile.xml @@ -1,8 +1,8 @@ - + - + diff --git a/EventFilter/SiPixelRawToDigi/plugins/DetParamBits.h b/EventFilter/SiPixelRawToDigi/plugins/DetParamBits.h deleted file mode 100644 index 8cc944c3c7f25..0000000000000 --- a/EventFilter/SiPixelRawToDigi/plugins/DetParamBits.h +++ /dev/null @@ -1,39 +0,0 @@ -// Sushil Dubey, Shashi Dugad, TIFR -#ifndef DETPARAMBITS_H -#define DETPARAMBITS_H -typedef unsigned int uint; -//reference -//http://cmsdoxygen.web.cern.ch/cmsdoxygen/CMSSW_9_2_0/doc/html/d3/db2/PixelROC_8cc_source.html#l00197 -const uint layerStartBit_ = 20; -const uint ladderStartBit_ = 12; -const uint moduleStartBit_ = 2; - -const uint panelStartBit_ = 10; -const uint diskStartBit_ = 18; -const uint bladeStartBit_ = 12; - -const uint layerMask_ = 0xF; -const uint ladderMask_ = 0xFF; -const uint moduleMask_ = 0x3FF; -const uint panelMask_ = 0x3; -const uint diskMask_ = 0xF; -const uint bladeMask_ = 0x3F; - -// __host__ __device__ bool isBarrel(uint rawId) { -// return (1==((rawId>>25)&0x7)); -// } - -__host__ __device__ int getLayer(uint rawId) { - int layer = (rawId >> layerStartBit_) & layerMask_; - return layer; -} - -__host__ __device__ int getDisk(uint rawId) { - // int side =1; - // unsigned int panel = ((rawId>>panelStartBit_) & panelMask_); - // if(panel==1) side = -1; - unsigned int disk = int((rawId>>diskStartBit_) & diskMask_); - // return disk*side; - return disk; -} -#endif diff --git a/EventFilter/SiPixelRawToDigi/plugins/EventInfoGPU.h b/EventFilter/SiPixelRawToDigi/plugins/EventInfoGPU.h deleted file mode 100644 index 1170717e4adf8..0000000000000 --- a/EventFilter/SiPixelRawToDigi/plugins/EventInfoGPU.h +++ /dev/null @@ -1,11 +0,0 @@ -/*Sushil Dubey, Shashi Dugad, TIFR -*/ - -#ifndef EVENTINFO_GPU -#define EVENTINFO_GPU - -const int NEVENT = 1 ; //optimal number of events to run simultaneously, -// using 4 cuda stream, hence it should be multiple of 4 -const int NMODULE = 1856; // for phase 1, we have 1856 modules - -#endif diff --git a/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.cu b/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.cu deleted file mode 100644 index 88f68f460441e..0000000000000 --- a/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.cu +++ /dev/null @@ -1,693 +0,0 @@ -/* Sushil Dubey, Shashi Dugad, TIFR, July 2017 - * - * File Name: RawToDigiGPU.cu - * Description: It converts Raw data into Digi Format on GPU - * then it converts adc -> electron and - * applies the adc threshold to needed for clustering - * Finaly the Output of RawToDigi data is given to pixelClusterizer - * -**/ - -#include "RecoLocalTracker/SiPixelClusterizer/plugins/gpuCalibPixel.h" -#include "RecoLocalTracker/SiPixelClusterizer/plugins/gpuClustering.h" - - - -// System includes -#include -#include -#include -#include -#include -#include -#include -#include - -// CUDA runtime -#include -#include -#include -#include -#include -#include -#include - -#include "HeterogeneousCore/CUDAUtilities/interface/cudaCheck.h" -#include "EventInfoGPU.h" -#include "RawToDigiGPU.h" -#include "SiPixelFedCablingMapGPU.h" - -context initDeviceMemory() { - - using namespace gpuClustering; - context c; - - // Number of words for all the feds - constexpr uint32_t MAX_WORD08_SIZE = MAX_FED * MAX_WORD * sizeof(uint8_t); - constexpr uint32_t MAX_WORD32_SIZE = MAX_FED * MAX_WORD * sizeof(uint32_t); - constexpr uint32_t MAX_WORD16_SIZE = MAX_FED * MAX_WORD * sizeof(uint16_t); - constexpr uint32_t vsize = sizeof(GPU::SimpleVector); - constexpr uint32_t esize = sizeof(error_obj); - constexpr uint32_t MAX_ERROR_SIZE = MAX_FED * MAX_WORD * esize; - - cudaCheck(cudaMalloc((void**) & c.word_d, MAX_WORD32_SIZE)); - cudaCheck(cudaMalloc((void**) & c.fedId_d, MAX_WORD08_SIZE)); - cudaCheck(cudaMalloc((void**) & c.pdigi_d, MAX_WORD32_SIZE)); // to store thepacked digi - cudaCheck(cudaMalloc((void**) & c.xx_d, MAX_WORD16_SIZE)); // to store the x and y coordinate - cudaCheck(cudaMalloc((void**) & c.yy_d, MAX_WORD16_SIZE)); - cudaCheck(cudaMalloc((void**) & c.adc_d, MAX_WORD16_SIZE)); - - cudaCheck(cudaMalloc((void**) & c.moduleInd_d, MAX_WORD16_SIZE)); - cudaCheck(cudaMalloc((void**) & c.rawIdArr_d, MAX_WORD32_SIZE)); - cudaCheck(cudaMalloc((void**) & c.error_d, vsize)); - cudaCheck(cudaMalloc((void**) & c.data_d, MAX_ERROR_SIZE)); - - // for the clusterizer - cudaCheck(cudaMalloc((void**) & c.clus_d, MAX_WORD32_SIZE)); // cluser index in module - - cudaCheck(cudaMalloc((void**) & c.moduleStart_d, (MaxNumModules+1)*sizeof(uint32_t) )); - cudaCheck(cudaMalloc((void**) & c.clusInModule_d, (MaxNumModules)*sizeof(uint32_t) )); - cudaCheck(cudaMalloc((void**) & c.moduleId_d, (MaxNumModules)*sizeof(uint32_t) )); - - cudaCheck(cudaMalloc((void**) & c.debug_d, MAX_WORD32_SIZE)); - - // create a CUDA stream - cudaCheck(cudaStreamCreate(&c.stream)); - - return c; -} - - -void freeMemory(context & c) { - // free the GPU memory - cudaCheck(cudaFree(c.word_d)); - cudaCheck(cudaFree(c.fedId_d)); - cudaCheck(cudaFree(c.pdigi_d)); - cudaCheck(cudaFree(c.xx_d)); - cudaCheck(cudaFree(c.yy_d)); - cudaCheck(cudaFree(c.adc_d)); - cudaCheck(cudaFree(c.moduleInd_d)); - cudaCheck(cudaFree(c.rawIdArr_d)); - cudaCheck(cudaFree(c.error_d)); - cudaCheck(cudaFree(c.data_d)); - - // these are for the clusterizer (to be moved) - cudaCheck(cudaFree(c.moduleStart_d)); - cudaCheck(cudaFree(c.clus_d)); - cudaCheck(cudaFree(c.clusInModule_d)); - cudaCheck(cudaFree(c.moduleId_d)); - cudaCheck(cudaFree(c.debug_d)); - - - // destroy the CUDA stream - cudaCheck(cudaStreamDestroy(c.stream)); -} - - -__device__ uint32_t getLink(uint32_t ww) { - return ((ww >> LINK_shift) & LINK_mask); -} - - -__device__ uint32_t getRoc(uint32_t ww) { - return ((ww >> ROC_shift ) & ROC_mask); -} - - -__device__ uint32_t getADC(uint32_t ww) { - return ((ww >> ADC_shift) & ADC_mask); -} - - -__device__ bool isBarrel(uint32_t rawId) { - return (1==((rawId>>25)&0x7)); -} - - - -__device__ DetIdGPU getRawId(const SiPixelFedCablingMapGPU * Map, uint32_t fed, uint32_t link, uint32_t roc) { - uint32_t index = fed * MAX_LINK * MAX_ROC + (link-1) * MAX_ROC + roc; - DetIdGPU detId = { Map->RawId[index], Map->rocInDet[index], Map->moduleId[index] }; - return detId; -} - - -//reference http://cmsdoxygen.web.cern.ch/cmsdoxygen/CMSSW_9_2_0/doc/html/dd/d31/FrameConversion_8cc_source.html -//http://cmslxr.fnal.gov/source/CondFormats/SiPixelObjects/src/PixelROC.cc?v=CMSSW_9_2_0#0071 -// Convert local pixel to global pixel -__device__ Pixel frameConversion(bool bpix, int side, uint32_t layer, uint32_t rocIdInDetUnit, Pixel local) { - - int slopeRow = 0, slopeCol = 0; - int rowOffset = 0, colOffset = 0; - - if (bpix) { - - if (side == -1 && layer != 1) { // -Z side: 4 non-flipped modules oriented like 'dddd', except Layer 1 - if (rocIdInDetUnit < 8) { - slopeRow = 1; - slopeCol = -1; - rowOffset = 0; - colOffset = (8-rocIdInDetUnit)*numColsInRoc-1; - } - else { - slopeRow = -1; - slopeCol = 1; - rowOffset = 2*numRowsInRoc-1; - colOffset = (rocIdInDetUnit-8)*numColsInRoc; - } // if roc - } - else { // +Z side: 4 non-flipped modules oriented like 'pppp', but all 8 in layer1 - if (rocIdInDetUnit < 8) { - slopeRow = -1; - slopeCol = 1; - rowOffset = 2*numRowsInRoc-1; - colOffset = rocIdInDetUnit * numColsInRoc; - } - else { - slopeRow = 1; - slopeCol = -1; - rowOffset = 0; - colOffset = (16-rocIdInDetUnit)*numColsInRoc-1; - } - } - - } - else { // fpix - if (side==-1) { // pannel 1 - if (rocIdInDetUnit < 8) { - slopeRow = 1; - slopeCol = -1; - rowOffset = 0; - colOffset = (8-rocIdInDetUnit)*numColsInRoc-1; - } - else { - slopeRow = -1; - slopeCol = 1; - rowOffset = 2*numRowsInRoc-1; - colOffset = (rocIdInDetUnit-8)*numColsInRoc; - } - } - else { // pannel 2 - if (rocIdInDetUnit < 8) { - slopeRow = 1; - slopeCol = -1; - rowOffset = 0; - colOffset = (8-rocIdInDetUnit)*numColsInRoc-1; - } - else { - slopeRow = -1; - slopeCol = 1; - rowOffset = 2*numRowsInRoc-1; - colOffset = (rocIdInDetUnit-8)*numColsInRoc; - } - - } // side - - } - - uint32_t gRow = rowOffset+slopeRow*local.row; - uint32_t gCol = colOffset+slopeCol*local.col; - //printf("Inside frameConversion row: %u, column: %u\n",gRow, gCol); - Pixel global = {gRow, gCol}; - return global; -} - - -__device__ uint32_t conversionError(uint32_t fedId, uint32_t status, bool debug = false) -{ - - uint32_t errorType = 0; - - // debug = true; - - switch (status) { - case(1) : { - if (debug) printf("Error in Fed: %i, invalid channel Id (errorType = 35\n)", fedId ); - errorType = 35; - break; - } - case(2) : { - if (debug) printf("Error in Fed: %i, invalid ROC Id (errorType = 36)\n", fedId); - errorType = 36; - break; - } - case(3) : { - if (debug) printf("Error in Fed: %i, invalid dcol/pixel value (errorType = 37)\n", fedId); - errorType = 37; - break; - } - case(4) : { - if (debug) printf("Error in Fed: %i, dcol/pixel read out of order (errorType = 38)\n", fedId); - errorType = 38; - break; - } - default: if (debug) printf("Cabling check returned unexpected result, status = %i\n", status); - }; - - return errorType; - -} - - -__device__ bool rocRowColIsValid(uint32_t rocRow, uint32_t rocCol) -{ - uint32_t numRowsInRoc = 80; - uint32_t numColsInRoc = 52; - - /// row and collumn in ROC representation - return ( (rocRow < numRowsInRoc) & (rocCol < numColsInRoc) ); -} - - -__device__ bool dcolIsValid(uint32_t dcol, uint32_t pxid) -{ - return ( (dcol < 26) & (2 <= pxid) & (pxid < 162) ); -} - - -__device__ uint32_t checkROC(uint32_t errorWord, uint32_t fedId, uint32_t link, const SiPixelFedCablingMapGPU *Map, bool debug = false) -{ - - int errorType = (errorWord >> ROC_shift) & ERROR_mask; - if (errorType < 25) return false; - bool errorFound = false; - - switch (errorType) { - case(25) : { - errorFound = true; - uint32_t index = fedId * MAX_LINK * MAX_ROC + (link-1) * MAX_ROC + 1; - if (index > 1 && index <= Map->size){ - if (!(link == Map->link[index] && 1 == Map->roc[index])) errorFound = false; - } - if (debug&errorFound) printf("Invalid ROC = 25 found (errorType = 25)\n"); - break; - } - case(26) : { - if (debug) printf("Gap word found (errorType = 26)\n"); - errorFound = true; - break; - } - case(27) : { - if (debug) printf("Dummy word found (errorType = 27)\n"); - errorFound = true; - break; - } - case(28) : { - if (debug) printf("Error fifo nearly full (errorType = 28)\n"); - errorFound = true; - break; - } - case(29) : { - if (debug) printf("Timeout on a channel (errorType = 29)\n"); - if ((errorWord >> OMIT_ERR_shift) & OMIT_ERR_mask) { - if (debug) printf("...first errorType=29 error, this gets masked out\n"); - } - errorFound = true; - break; - } - case(30) : { - if (debug) printf("TBM error trailer (errorType = 30)\n"); - int StateMatch_bits = 4; - int StateMatch_shift = 8; - uint32_t StateMatch_mask = ~(~uint32_t(0) << StateMatch_bits); - int StateMatch = (errorWord >> StateMatch_shift) & StateMatch_mask; - if ( StateMatch != 1 && StateMatch != 8 ) { - if (debug) printf("FED error 30 with unexpected State Bits (errorType = 30)\n"); - } - if ( StateMatch == 1 ) errorType = 40; // 1=Overflow -> 40, 8=number of ROCs -> 30 - errorFound = true; - break; - } - case(31) : { - if (debug) printf("Event number error (errorType = 31)\n"); - errorFound = true; - break; - } - default: errorFound = false; - - }; - - return errorFound? errorType : 0; - -} - - -__device__ uint32_t getErrRawID(uint32_t fedId, uint32_t errWord, uint32_t errorType, const SiPixelFedCablingMapGPU *Map, bool debug = false) -{ - - uint32_t rID = 0xffffffff; - - switch (errorType) { - case 25 : case 30 : case 31 : case 36 : case 40 : { - //set dummy values for cabling just to get detId from link - //cabling.dcol = 0; - //cabling.pxid = 2; - uint32_t roc = 1; - uint32_t link = (errWord >> LINK_shift) & LINK_mask; - - uint32_t rID_temp = getRawId(Map, fedId, link, roc).RawId; - if(rID_temp != 9999) rID = rID_temp; - break; - } - case 29 : { - int chanNmbr = 0; - const int DB0_shift = 0; - const int DB1_shift = DB0_shift + 1; - const int DB2_shift = DB1_shift + 1; - const int DB3_shift = DB2_shift + 1; - const int DB4_shift = DB3_shift + 1; - const uint32_t DataBit_mask = ~(~uint32_t(0) << 1); - - int CH1 = (errWord >> DB0_shift) & DataBit_mask; - int CH2 = (errWord >> DB1_shift) & DataBit_mask; - int CH3 = (errWord >> DB2_shift) & DataBit_mask; - int CH4 = (errWord >> DB3_shift) & DataBit_mask; - int CH5 = (errWord >> DB4_shift) & DataBit_mask; - int BLOCK_bits = 3; - int BLOCK_shift = 8; - uint32_t BLOCK_mask = ~(~uint32_t(0) << BLOCK_bits); - int BLOCK = (errWord >> BLOCK_shift) & BLOCK_mask; - int localCH = 1*CH1+2*CH2+3*CH3+4*CH4+5*CH5; - if (BLOCK%2==0) chanNmbr=(BLOCK/2)*9+localCH; - else chanNmbr = ((BLOCK-1)/2)*9+4+localCH; - if ((chanNmbr < 1)||(chanNmbr > 36)) break; // signifies unexpected result - - // set dummy values for cabling just to get detId from link if in Barrel - //cabling.dcol = 0; - //cabling.pxid = 2; - uint32_t roc = 1; - uint32_t link = chanNmbr; - uint32_t rID_temp = getRawId(Map, fedId, link, roc).RawId; - if(rID_temp != 9999) rID = rID_temp; - break; - } - case 37 : case 38: { - //cabling.dcol = 0; - //cabling.pxid = 2; - uint32_t roc = (errWord >> ROC_shift) & ROC_mask; - uint32_t link = (errWord >> LINK_shift) & LINK_mask; - uint32_t rID_temp = getRawId(Map, fedId, link, roc).RawId; - if(rID_temp != 9999) rID = rID_temp; - break; - } - - default : break; - - }; - - return rID; - -} - - -/*---------- -* Name: applyADCthreshold_kernel() -* Desc: converts adc count to electrons and then applies the -* threshold on each channel. -* make pixel to 0 if it is below the threshold -* Input: xx_d[], yy_d[], layer_d[], wordCounter, adc[], ADCThreshold -*----------- -* Output: xx_adc[], yy_adc[] with pixel threshold applied -*/ -// kernel to apply adc threshold on the channels - - -// Felice: gains and pedestals are not the same for each pixel. This code should be rewritten to take -// in account local gains/pedestals -// __global__ void applyADCthreshold_kernel(const uint32_t *xx_d, const uint32_t *yy_d, const uint32_t *layer_d, uint32_t *adc, const uint32_t wordCounter, -// const ADCThreshold adcThreshold, uint32_t *xx_adc, uint32_t *yy_adc ) { -// int tid = threadIdx.x; -// int gIndex = blockDim.x*blockIdx.x+tid; -// if (gIndex=adcThreshold.theFirstStack_) { -// if (adcThreshold.theStackADC_==1 && adcOld==1) { -// adcNew = int(255*135); // Arbitrarily use overflow value. -// } -// if (adcThreshold.theStackADC_ >1 && adcThreshold.theStackADC_!=255 && adcOld>=1){ -// adcNew = int((adcOld-1) * gain * 255/float(adcThreshold.theStackADC_-1)); -// } -// } -// -// if (adcNew >adcThreshold.thePixelThreshold ) { -// xx_adc[gIndex]=xx_d[gIndex]; -// yy_adc[gIndex]=yy_d[gIndex]; -// } -// else { -// xx_adc[gIndex]=0; // 0: dead pixel -// yy_adc[gIndex]=0; -// } -// adc[gIndex] = adcNew; -// } -// } - - -// Kernel to perform Raw to Digi conversion -__global__ void RawToDigi_kernel(const SiPixelFedCablingMapGPU *Map, const uint32_t wordCounter, const uint32_t *Word, const uint8_t *fedIds, - uint16_t * XX, uint16_t * YY, uint16_t * ADC, - uint32_t * pdigi, uint32_t *rawIdArr, uint16_t * moduleId, - GPU::SimpleVector *err, - bool useQualityInfo, bool includeErrors, bool debug) -{ - uint32_t blockId = blockIdx.x; - uint32_t threadId = threadIdx.x; - - bool skipROC = false; - //if (threadId==0) printf("Event: %u blockId: %u start: %u end: %u\n", eventno, blockId, begin, end); - - for (int aaa=0; aaa<1; ++aaa) { // too many coninue below.... (to be fixed) - auto gIndex = threadId + blockId*blockDim.x; - if (gIndex < wordCounter) { - - uint32_t fedId = fedIds[gIndex/2]; // +1200; - - // initialize (too many coninue below) - pdigi[gIndex] = 0; - rawIdArr[gIndex] = 0; - moduleId[gIndex] = 9999; - - uint32_t ww = Word[gIndex]; // Array containing 32 bit raw data - if (ww == 0) { - //noise and dead channels are ignored - XX[gIndex] = 0; // 0 is an indicator of a noise/dead channel - YY[gIndex] = 0; // skip these pixels during clusterization - ADC[gIndex] = 0; - continue ; // 0: bad word - } - - uint32_t link = getLink(ww); // Extract link - uint32_t roc = getRoc(ww); // Extract Roc in link - DetIdGPU detId = getRawId(Map, fedId, link, roc); - - uint32_t errorType = checkROC(ww, fedId, link, Map, debug); - skipROC = (roc < maxROCIndex) ? false : (errorType != 0); - if (includeErrors and skipROC) - { - uint32_t rID = getErrRawID(fedId, ww, errorType, Map, debug); - err->emplace_back(rID, ww, errorType, fedId); - continue; - } - - uint32_t rawId = detId.RawId; - uint32_t rocIdInDetUnit = detId.rocInDet; - bool barrel = isBarrel(rawId); - - uint32_t index = fedId * MAX_LINK * MAX_ROC + (link-1) * MAX_ROC + roc; - if (useQualityInfo) { - - skipROC = Map->badRocs[index]; - if (skipROC) continue; - - } - skipROC = Map->modToUnp[index]; - if (skipROC) continue; - - uint32_t layer = 0;//, ladder =0; - int side = 0, panel = 0, module = 0;//disk = 0,blade = 0 - - if (barrel) - { - layer = (rawId >> layerStartBit_) & layerMask_; - module = (rawId >> moduleStartBit_) & moduleMask_; - side = (module < 5)? -1 : 1; - } - else { - // endcap ids - layer = 0; - panel = (rawId >> panelStartBit_) & panelMask_; - //disk = (rawId >> diskStartBit_) & diskMask_ ; - side = (panel == 1)? -1 : 1; - //blade = (rawId>>bladeStartBit_) & bladeMask_; - } - - // ***special case of layer to 1 be handled here - Pixel localPix; - if (layer == 1) { - uint32_t col = (ww >> COL_shift) & COL_mask; - uint32_t row = (ww >> ROW_shift) & ROW_mask; - localPix.row = row; - localPix.col = col; - if (includeErrors) { - if (not rocRowColIsValid(row, col)) { - uint32_t error = conversionError(fedId, 3, debug); //use the device function and fill the arrays - err->emplace_back(rawId, ww, error, fedId); - if(debug) printf("BPIX1 Error status: %i\n", error); - continue; - } - } - } else { - // ***conversion rules for dcol and pxid - uint32_t dcol = (ww >> DCOL_shift) & DCOL_mask; - uint32_t pxid = (ww >> PXID_shift) & PXID_mask; - uint32_t row = numRowsInRoc - pxid/2; - uint32_t col = dcol*2 + pxid%2; - localPix.row = row; - localPix.col = col; - if (includeErrors and not dcolIsValid(dcol, pxid)) { - uint32_t error = conversionError(fedId, 3, debug); - err->emplace_back(rawId, ww, error, fedId); - if(debug) printf("Error status: %i %d %d %d %d\n", error, dcol, pxid, fedId, roc); - continue; - } - } - - Pixel globalPix = frameConversion(barrel, side, layer, rocIdInDetUnit, localPix); - XX[gIndex] = globalPix.row ; // origin shifting by 1 0-159 - YY[gIndex] = globalPix.col ; // origin shifting by 1 0-415 - ADC[gIndex] = getADC(ww); - pdigi[gIndex] = pack(globalPix.row,globalPix.col,ADC[gIndex]); - moduleId[gIndex] = detId.moduleId; - rawIdArr[gIndex] = rawId; - } // end of if (gIndex < end) - } // end fake loop -} // end of Raw to Digi kernel - - -// kernel wrapper called from runRawToDigi_kernel -void RawToDigi_wrapper( - context & c, - const SiPixelFedCablingMapGPU* cablingMapDevice, SiPixelGainForHLTonGPU * const ped, - const uint32_t wordCounter, uint32_t *word, const uint32_t fedCounter, uint8_t *fedId_h, - bool convertADCtoElectrons, - uint32_t * pdigi_h, uint32_t *rawIdArr_h, - GPU::SimpleVector *error_h, GPU::SimpleVector *error_h_tmp, error_obj *data_h, - uint16_t * adc_h, int32_t * clus_h, - bool useQualityInfo, bool includeErrors, bool debug, uint32_t & nModulesActive) -{ - const int threadsPerBlock = 512; - const int blocks = (wordCounter + threadsPerBlock-1) /threadsPerBlock; // fill it all - - - assert(0 == wordCounter%2); - // wordCounter is the total no of words in each event to be trasfered on device - cudaCheck(cudaMemcpyAsync(&c.word_d[0], &word[0], wordCounter*sizeof(uint32_t), cudaMemcpyDefault, c.stream)); - cudaCheck(cudaMemcpyAsync(&c.fedId_d[0], &fedId_h[0], wordCounter*sizeof(uint8_t)/2, cudaMemcpyDefault, c.stream)); - - constexpr uint32_t vsize = sizeof(GPU::SimpleVector); - constexpr uint32_t esize = sizeof(error_obj); - cudaCheck(cudaMemcpyAsync(c.error_d, error_h_tmp, vsize, cudaMemcpyDefault, c.stream)); - - // Launch rawToDigi kernel - RawToDigi_kernel<<>>( - cablingMapDevice, - wordCounter, - c.word_d, - c.fedId_d, - c.xx_d, c.yy_d, c.adc_d, - c.pdigi_d, - c.rawIdArr_d, - c.moduleInd_d, - c.error_d, - useQualityInfo, - includeErrors, - debug); - cudaCheck(cudaGetLastError()); - - // copy data to host variable - - cudaCheck(cudaMemcpyAsync(pdigi_h, c.pdigi_d, wordCounter*sizeof(uint32_t), cudaMemcpyDefault, c.stream)); - cudaCheck(cudaMemcpyAsync(rawIdArr_h, c.rawIdArr_d, wordCounter*sizeof(uint32_t), cudaMemcpyDefault, c.stream)); - - if (includeErrors) { - cudaCheck(cudaMemcpyAsync(error_h, c.error_d, vsize, cudaMemcpyDefault, c.stream)); - cudaStreamSynchronize(c.stream); - error_h->set_data(data_h); - int size = error_h->size(); - cudaCheck(cudaMemcpyAsync(data_h, c.data_d, size*esize, cudaMemcpyDefault, c.stream)); - } - // End of Raw2Digi and passing data for cluserisation - - { - // clusterizer ... - using namespace gpuClustering; - int threadsPerBlock = 256; - int blocks = (wordCounter + threadsPerBlock - 1) / threadsPerBlock; - - - assert(ped); - gpuCalibPixel::calibDigis<<>>( - c.moduleInd_d, - c.xx_d, c.yy_d, c.adc_d, - ped, - wordCounter - ); - - cudaCheck(cudaGetLastError()); - - // calibrated adc - cudaCheck(cudaMemcpyAsync(adc_h, c.adc_d, wordCounter*sizeof(uint32_t), cudaMemcpyDefault, c.stream)); - - /* - std::cout - << "CUDA countModules kernel launch with " << blocks - << " blocks of " << threadsPerBlock << " threads\n"; - */ - - uint32_t nModules=0; - cudaCheck(cudaMemcpyAsync(c.moduleStart_d, &nModules, sizeof(uint32_t), cudaMemcpyDefault, c.stream)); - - countModules<<>>(c.moduleInd_d, c.moduleStart_d, c.clus_d, wordCounter); - cudaCheck(cudaGetLastError()); - - cudaCheck(cudaMemcpyAsync(&nModules, c.moduleStart_d, sizeof(uint32_t), cudaMemcpyDefault, c.stream)); - - // std::cout << "found " << nModules << " Modules active" << std::endl; - - - threadsPerBlock = 256; - blocks = nModules; - - /* - std::cout - << "CUDA findClus kernel launch with " << blocks - << " blocks of " << threadsPerBlock << " threads\n"; - */ - - cudaCheck(cudaMemsetAsync(c.clusInModule_d, 0, (MaxNumModules)*sizeof(uint32_t),c.stream)); - - findClus<<>>( - c.moduleInd_d, - c.xx_d, c.yy_d, c.adc_d, - c.moduleStart_d, - c.clusInModule_d, c.moduleId_d, - c.clus_d, - c.debug_d, - wordCounter - ); - - // clusters - cudaCheck(cudaMemcpyAsync(clus_h, c.clus_d, wordCounter*sizeof(uint32_t), cudaMemcpyDefault, c.stream)); - - - cudaStreamSynchronize(c.stream); - cudaCheck(cudaGetLastError()); - - nModulesActive = nModules; - - } // end clusterizer scope - -} diff --git a/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.h b/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.h deleted file mode 100644 index 44a820db45aba..0000000000000 --- a/EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.h +++ /dev/null @@ -1,216 +0,0 @@ -/*Sushil Dubey, Shashi Dugad, TIFR - * - */ - -#ifndef RAWTODIGIGPU_H -#define RAWTODIGIGPU_H - -#include - -#include "SiPixelFedCablingMapGPU.h" -#include "HeterogeneousCore/CUDAUtilities/interface/GPUSimpleVector.h" -#include - -const uint32_t layerStartBit_ = 20; -const uint32_t ladderStartBit_ = 12; -const uint32_t moduleStartBit_ = 2; - -const uint32_t panelStartBit_ = 10; -const uint32_t diskStartBit_ = 18; -const uint32_t bladeStartBit_ = 12; - -const uint32_t layerMask_ = 0xF; -const uint32_t ladderMask_ = 0xFF; -const uint32_t moduleMask_ = 0x3FF; -const uint32_t panelMask_ = 0x3; -const uint32_t diskMask_ = 0xF; -const uint32_t bladeMask_ = 0x3F; - -const uint32_t LINK_bits = 6; -const uint32_t ROC_bits = 5; -const uint32_t DCOL_bits = 5; -const uint32_t PXID_bits = 8; -const uint32_t ADC_bits = 8; -// special for layer 1 -const uint32_t LINK_bits1 = 6; -const uint32_t ROC_bits1 = 5; -const uint32_t COL_bits1_l1 = 6; -const uint32_t ROW_bits1_l1 = 7; -const uint32_t OMIT_ERR_bits = 1; - -const uint32_t maxROCIndex = 8; -const uint32_t numRowsInRoc = 80; -const uint32_t numColsInRoc = 52; - -const uint32_t MAX_WORD = 2000; - -const uint32_t ADC_shift = 0; -const uint32_t PXID_shift = ADC_shift + ADC_bits; -const uint32_t DCOL_shift = PXID_shift + PXID_bits; -const uint32_t ROC_shift = DCOL_shift + DCOL_bits; -const uint32_t LINK_shift = ROC_shift + ROC_bits1; -// special for layer 1 ROC -const uint32_t ROW_shift = ADC_shift + ADC_bits; -const uint32_t COL_shift = ROW_shift + ROW_bits1_l1; -const uint32_t OMIT_ERR_shift = 20; - -const uint32_t LINK_mask = ~(~uint32_t(0) << LINK_bits1); -const uint32_t ROC_mask = ~(~uint32_t(0) << ROC_bits1); -const uint32_t COL_mask = ~(~uint32_t(0) << COL_bits1_l1); -const uint32_t ROW_mask = ~(~uint32_t(0) << ROW_bits1_l1); -const uint32_t DCOL_mask = ~(~uint32_t(0) << DCOL_bits); -const uint32_t PXID_mask = ~(~uint32_t(0) << PXID_bits); -const uint32_t ADC_mask = ~(~uint32_t(0) << ADC_bits); -const uint32_t ERROR_mask = ~(~uint32_t(0) << ROC_bits1); -const uint32_t OMIT_ERR_mask = ~(~uint32_t(0) << OMIT_ERR_bits); - -struct DetIdGPU { - uint32_t RawId; - uint32_t rocInDet; - uint32_t moduleId; -}; - -struct Pixel { - uint32_t row; - uint32_t col; -}; - - -namespace gpudetails{ - -class Packing { - public: - using PackedDigiType = uint32_t; - - // Constructor: pre-computes masks and shifts from field widths -__host__ __device__ -inline - constexpr Packing(unsigned int row_w, unsigned int column_w, - unsigned int time_w, unsigned int adc_w) : - row_width(row_w), column_width(column_w), adc_width(adc_w) - ,row_shift(0) - ,column_shift(row_shift + row_w) - ,time_shift(column_shift + column_w) - ,adc_shift(time_shift + time_w) - ,row_mask(~(~0U << row_w)) - ,column_mask( ~(~0U << column_w)) - ,time_mask(~(~0U << time_w)) - ,adc_mask(~(~0U << adc_w)) - ,rowcol_mask(~(~0U << (column_w+row_w))) - ,max_row(row_mask) - ,max_column(column_mask) - ,max_adc(adc_mask){} - - - uint32_t row_width; - uint32_t column_width; - uint32_t adc_width; - - uint32_t row_shift; - uint32_t column_shift; - uint32_t time_shift; - uint32_t adc_shift; - - PackedDigiType row_mask; - PackedDigiType column_mask; - PackedDigiType time_mask; - PackedDigiType adc_mask; - PackedDigiType rowcol_mask; - - - uint32_t max_row; - uint32_t max_column; - uint32_t max_adc; - }; - - -// const PixelChannelIdentifier::Packing PixelChannelIdentifier::thePacking( 11, 11, 0, 10); // row, col, time, adc - - -__host__ __device__ -inline -constexpr gpudetails::Packing packing() { return gpudetails::Packing(11, 11, 0, 10);} - -} - -// constexpr Packing thePacking = packing(); - -__host__ __device__ -inline uint32_t pack(uint32_t row, uint32_t col, uint32_t adc) { - constexpr gpudetails::Packing thePacking = gpudetails::packing(); - adc = std::min(adc, thePacking.max_adc); - - return (row << thePacking.row_shift) | - (col << thePacking.column_shift) | - (adc << thePacking.adc_shift); - -} - -struct error_obj { - uint32_t rawId; - uint32_t word; - unsigned char errorType; - unsigned char fedId; - __host__ __device__ error_obj(uint32_t a_, uint32_t b_, unsigned char c_, unsigned char d_): - rawId(a_), word(b_), errorType(c_), fedId(d_) {} -}; - -// configuration and memory buffers alocated on the GPU -struct context { - cudaStream_t stream; - - uint32_t * word_d; - uint8_t * fedId_d; - uint32_t * pdigi_d; - uint16_t * xx_d; - uint16_t * yy_d; - uint16_t * adc_d; - - uint16_t * moduleInd_d; - uint32_t * rawIdArr_d; - - GPU::SimpleVector * error_d; - error_obj * data_d; - - // these are for the clusterizer (to be moved) - uint32_t * moduleStart_d; - int32_t * clus_d; - uint32_t * clusInModule_d; - uint32_t * moduleId_d; - - uint32_t * debug_d; -}; - - -// wrapper function to call RawToDigi on the GPU from host side -void RawToDigi_wrapper(context &, const SiPixelFedCablingMapGPU* cablingMapDevice, - SiPixelGainForHLTonGPU * const ped, - const uint32_t wordCounter, uint32_t *word, - const uint32_t fedCounter, uint8_t *fedId_h, - bool convertADCtoElectrons, uint32_t * pdigi_h, - uint32_t *rawIdArr_h, GPU::SimpleVector *error_h, - GPU::SimpleVector *error_h_tmp, error_obj *data_h, - uint16_t * adc_h, int32_t * clus_h, - bool useQualityInfo, bool includeErrors, bool debug, - uint32_t & nModulesActive); - -// void initCablingMap(); -context initDeviceMemory(); -void freeMemory(context &); - -// reference cmssw/RecoLocalTracker/SiPixelClusterizer -// all are runtime const, should be specified in python _cfg.py -struct ADCThreshold { - const int thePixelThreshold = 1000; // default Pixel threshold in electrons - const int theSeedThreshold = 1000; //seed thershold in electrons not used in our algo - const float theClusterThreshold = 4000; // Cluster threshold in electron - const int ConversionFactor = 65; // adc to electron conversion factor - - // following are the default value - // it should be i python script - const int theStackADC_ = 255; // the maximum adc count for stack layer - const int theFirstStack_ = 5; // the index of the fits stack layer - const double theElectronPerADCGain_ = 600; //ADC to electron conversion -}; - -#endif diff --git a/EventFilter/SiPixelRawToDigi/plugins/SealModule.cc b/EventFilter/SiPixelRawToDigi/plugins/SealModule.cc deleted file mode 100644 index 30ed2eb6e8850..0000000000000 --- a/EventFilter/SiPixelRawToDigi/plugins/SealModule.cc +++ /dev/null @@ -1,8 +0,0 @@ -#include "FWCore/PluginManager/interface/ModuleDef.h" -#include "FWCore/Framework/interface/MakerMacros.h" - -#include "SiPixelRawToDigi.h" -#include "SiPixelDigiToRaw.h" - -DEFINE_FWK_MODULE(SiPixelDigiToRaw); -DEFINE_FWK_MODULE(SiPixelRawToDigi); diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelDigiToRaw.cc b/EventFilter/SiPixelRawToDigi/plugins/SiPixelDigiToRaw.cc index cb0999d51c4db..cd6199e05ae9c 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/SiPixelDigiToRaw.cc +++ b/EventFilter/SiPixelRawToDigi/plugins/SiPixelDigiToRaw.cc @@ -147,5 +147,6 @@ void SiPixelDigiToRaw::produce( edm::Event& ev, } -// ----------------------------------------------------------------------------- - +// declare this as a framework plugin +#include "FWCore/Framework/interface/MakerMacros.h" +DEFINE_FWK_MODULE(SiPixelDigiToRaw); diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.cc b/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.cc index e96af4789b1ce..16fa6281e5c7b 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.cc +++ b/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.cc @@ -1,3 +1,4 @@ +// C++ includes #include #include #include @@ -5,21 +6,51 @@ #include #include +// CUDA includes #include -#include "SiPixelFedCablingMapGPU.h" - -#include "FWCore/MessageLogger/interface/MessageLogger.h" +// CMSSW includes #include "CondFormats/SiPixelObjects/interface/SiPixelFedCablingMap.h" #include "CondFormats/SiPixelObjects/interface/SiPixelFedCablingTree.h" +#include "CondFormats/SiPixelObjects/interface/SiPixelGainCalibrationForHLT.h" +#include "CondFormats/SiPixelObjects/interface/SiPixelGainForHLTonGPU.h" #include "CondFormats/SiPixelObjects/interface/SiPixelQuality.h" -#include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h" +#include "FWCore/MessageLogger/interface/MessageLogger.h" #include "Geometry/CommonDetUnit/interface/GeomDetType.h" +#include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h" +#include "HeterogeneousCore/CUDAUtilities/interface/CUDAHostAllocator.h" +#include "HeterogeneousCore/CUDAUtilities/interface/cudaCheck.h" -#include "CondFormats/SiPixelObjects/interface/SiPixelGainCalibrationForHLT.h" -#include "CondFormats/SiPixelObjects/interface/SiPixelGainForHLTonGPU.h" +// local includes +#include "SiPixelFedCablingMapGPU.h" + +void allocateCablingMap(SiPixelFedCablingMapGPU* & cablingMapHost, SiPixelFedCablingMapGPU* & cablingMapDevice) { + cudaCheck(cudaMallocHost((void**) & cablingMapHost, sizeof(SiPixelFedCablingMapGPU))); + cudaCheck(cudaMalloc((void**) & cablingMapDevice, sizeof(SiPixelFedCablingMapGPU))); + cudaCheck(cudaMalloc((void**) & cablingMapHost->fed, MAX_SIZE_BYTE_INT)); + cudaCheck(cudaMalloc((void**) & cablingMapHost->link, MAX_SIZE_BYTE_INT)); + cudaCheck(cudaMalloc((void**) & cablingMapHost->roc, MAX_SIZE_BYTE_INT)); + cudaCheck(cudaMalloc((void**) & cablingMapHost->RawId, MAX_SIZE_BYTE_INT)); + cudaCheck(cudaMalloc((void**) & cablingMapHost->rocInDet, MAX_SIZE_BYTE_INT)); + cudaCheck(cudaMalloc((void**) & cablingMapHost->moduleId, MAX_SIZE_BYTE_INT)); + cudaCheck(cudaMalloc((void**) & cablingMapHost->badRocs, MAX_SIZE_BYTE_BOOL)); + cudaCheck(cudaMalloc((void**) & cablingMapHost->modToUnp, MAX_SIZE_BYTE_BOOL)); + cudaCheck(cudaMemcpy(cablingMapDevice, cablingMapHost, sizeof(SiPixelFedCablingMapGPU), cudaMemcpyDefault)); +} + +void deallocateCablingMap(SiPixelFedCablingMapGPU* cablingMapHost, SiPixelFedCablingMapGPU* cablingMapDevice) { + cudaCheck(cudaFree(cablingMapHost->fed)); + cudaCheck(cudaFree(cablingMapHost->link)); + cudaCheck(cudaFree(cablingMapHost->roc)); + cudaCheck(cudaFree(cablingMapHost->RawId)); + cudaCheck(cudaFree(cablingMapHost->rocInDet)); + cudaCheck(cudaFree(cablingMapHost->moduleId)); + cudaCheck(cudaFree(cablingMapHost->modToUnp)); + cudaCheck(cudaFree(cablingMapHost->badRocs)); + cudaCheck(cudaFree(cablingMapDevice)); + cudaCheck(cudaFreeHost(cablingMapHost)); +} -#include "HeterogeneousCore/CUDAUtilities/interface/CUDAHostAllocator.h" void processCablingMap(SiPixelFedCablingMap const& cablingMap, TrackerGeometry const& trackerGeom, SiPixelFedCablingMapGPU* cablingMapHost, SiPixelFedCablingMapGPU* cablingMapDevice, diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.h b/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.h index 3cd35f54480d5..27355cb9d96c7 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.h +++ b/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.h @@ -1,10 +1,9 @@ -#ifndef SiPixelFedCablingMapGPU_h -#define SiPixelFedCablingMapGPU_h +#ifndef EventFilter_SiPixelRawToDigi_plugins_SiPixelFedCablingMapGPU_h +#define EventFilter_SiPixelRawToDigi_plugins_SiPixelFedCablingMapGPU_h +// C++ includes #include -#include "HeterogeneousCore/CUDAUtilities/interface/cudaCheck.h" - class SiPixelFedCablingMap; class SiPixelQuality; class TrackerGeometry; @@ -34,39 +33,22 @@ struct SiPixelFedCablingMapGPU { unsigned char * badRocs; }; -inline -void allocateCablingMap(SiPixelFedCablingMapGPU* & cablingMapHost, SiPixelFedCablingMapGPU* & cablingMapDevice) { - cudaCheck(cudaMallocHost((void**) & cablingMapHost, sizeof(SiPixelFedCablingMapGPU))); - cudaCheck(cudaMalloc((void**) & cablingMapDevice, sizeof(SiPixelFedCablingMapGPU))); - cudaCheck(cudaMalloc((void**) & cablingMapHost->fed, MAX_SIZE_BYTE_INT)); - cudaCheck(cudaMalloc((void**) & cablingMapHost->link, MAX_SIZE_BYTE_INT)); - cudaCheck(cudaMalloc((void**) & cablingMapHost->roc, MAX_SIZE_BYTE_INT)); - cudaCheck(cudaMalloc((void**) & cablingMapHost->RawId, MAX_SIZE_BYTE_INT)); - cudaCheck(cudaMalloc((void**) & cablingMapHost->rocInDet, MAX_SIZE_BYTE_INT)); - cudaCheck(cudaMalloc((void**) & cablingMapHost->moduleId, MAX_SIZE_BYTE_INT)); - cudaCheck(cudaMalloc((void**) & cablingMapHost->badRocs, MAX_SIZE_BYTE_BOOL)); - cudaCheck(cudaMalloc((void**) & cablingMapHost->modToUnp, MAX_SIZE_BYTE_BOOL)); - cudaCheck(cudaMemcpy(cablingMapDevice, cablingMapHost, sizeof(SiPixelFedCablingMapGPU), cudaMemcpyDefault)); -} - -inline -void deallocateCablingMap(SiPixelFedCablingMapGPU* cablingMapHost, SiPixelFedCablingMapGPU* cablingMapDevice) { - cudaCheck(cudaFree(cablingMapHost->fed)); - cudaCheck(cudaFree(cablingMapHost->link)); - cudaCheck(cudaFree(cablingMapHost->roc)); - cudaCheck(cudaFree(cablingMapHost->RawId)); - cudaCheck(cudaFree(cablingMapHost->rocInDet)); - cudaCheck(cudaFree(cablingMapHost->moduleId)); - cudaCheck(cudaFree(cablingMapHost->modToUnp)); - cudaCheck(cudaFree(cablingMapHost->badRocs)); - cudaCheck(cudaFree(cablingMapDevice)); - cudaCheck(cudaFreeHost(cablingMapHost)); -} +void allocateCablingMap(SiPixelFedCablingMapGPU* & cablingMapHost, + SiPixelFedCablingMapGPU* & cablingMapDevice); -void processCablingMap(SiPixelFedCablingMap const& cablingMap, TrackerGeometry const& trackerGeom, - SiPixelFedCablingMapGPU* cablingMapHost, SiPixelFedCablingMapGPU* cablingMapDevice, const SiPixelQuality* badPixelInfo, std::set const& modules); +void deallocateCablingMap(SiPixelFedCablingMapGPU* cablingMapHost, + SiPixelFedCablingMapGPU* cablingMapDevice); -void processGainCalibration(SiPixelGainCalibrationForHLT const & gains, TrackerGeometry const& trackerGeom, SiPixelGainForHLTonGPU * & gainsOnGPU, SiPixelGainForHLTonGPU_DecodingStructure * & gainDataOnGPU); +void processCablingMap(SiPixelFedCablingMap const& cablingMap, + TrackerGeometry const& trackerGeom, + SiPixelFedCablingMapGPU* cablingMapHost, + SiPixelFedCablingMapGPU* cablingMapDevice, + SiPixelQuality const* badPixelInfo, + std::set const& modules); -#endif // SiPixelFedCablingMapGPU_h +void processGainCalibration(SiPixelGainCalibrationForHLT const& gains, + TrackerGeometry const& trackerGeom, + SiPixelGainForHLTonGPU * & gainsOnGPU, + SiPixelGainForHLTonGPU_DecodingStructure * & gainDataOnGPU); +#endif // EventFilter_SiPixelRawToDigi_plugins_SiPixelFedCablingMapGPU_h diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigi.cc b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigi.cc index 9b93f63741df4..dc3c9e4c68f68 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigi.cc +++ b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigi.cc @@ -324,3 +324,7 @@ void SiPixelRawToDigi::produce( edm::Event& ev, ev.put(std::move(disabled_channelcollection)); } } + +// declare this as a framework plugin +#include "FWCore/Framework/interface/MakerMacros.h" +DEFINE_FWK_MODULE(SiPixelRawToDigi); diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc index e9f4d3654f4c9..92089d50cb58e 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc +++ b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc @@ -1,17 +1,21 @@ // This code is an entry point for GPU based pixel track reconstruction for HLT // Modified by Sushil and Shashi for this purpose July-2017 +// C++ includes #include #include #include #include +// CUDA kincludes #include #include +// ROOT includes #include #include +// CMSSW includes #include "CondFormats/SiPixelObjects/interface/SiPixelFedCablingMap.h" #include "CondFormats/SiPixelObjects/interface/SiPixelFedCablingTree.h" #include "CondFormats/SiPixelObjects/interface/SiPixelQuality.h" @@ -21,34 +25,28 @@ #include "DataFormats/FEDRawData/interface/FEDNumbering.h" #include "DataFormats/FEDRawData/interface/FEDRawData.h" #include "DataFormats/FEDRawData/interface/FEDRawDataCollection.h" +#include "DataFormats/SiPixelCluster/interface/SiPixelCluster.h" #include "DataFormats/SiPixelDetId/interface/PixelFEDChannel.h" #include "DataFormats/SiPixelDigi/interface/PixelDigi.h" #include "DataFormats/SiPixelRawData/interface/SiPixelRawDataError.h" - -#include "DataFormats/SiPixelCluster/interface/SiPixelCluster.h" - - - -#include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h" -#include "Geometry/Records/interface/TrackerDigiGeometryRecord.h" - #include "EventFilter/SiPixelRawToDigi/interface/PixelDataFormatter.h" #include "EventFilter/SiPixelRawToDigi/interface/PixelUnpackingRegions.h" #include "FWCore/Framework/interface/ConsumesCollector.h" #include "FWCore/Framework/interface/ESHandle.h" #include "FWCore/Framework/interface/ESTransientHandle.h" +#include "FWCore/Framework/interface/MakerMacros.h" #include "FWCore/MessageLogger/interface/MessageLogger.h" #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h" #include "FWCore/ParameterSet/interface/ParameterSetDescription.h" #include "FWCore/PluginManager/interface/ModuleDef.h" -#include "FWCore/Framework/interface/MakerMacros.h" +#include "Geometry/Records/interface/TrackerDigiGeometryRecord.h" +#include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h" +#include "HeterogeneousCore/CUDAUtilities/interface/cudaCheck.h" -#include "EventInfoGPU.h" -#include "RawToDigiGPU.h" +// local includes #include "SiPixelFedCablingMapGPU.h" #include "SiPixelRawToDigiGPU.h" -#include "HeterogeneousCore/CUDAUtilities/interface/cudaCheck.h" - +#include "SiPixelRawToDigiGPUKernel.h" namespace { struct AccretionCluster { @@ -159,7 +157,7 @@ SiPixelRawToDigiGPU::SiPixelRawToDigiGPU( const edm::ParameterSet& conf ) // device copy of GPU friendly cablng map allocateCablingMap(cablingMapGPUHost_, cablingMapGPUDevice_); - int WSIZE = MAX_FED * MAX_WORD * sizeof(unsigned int); + int WSIZE = MAX_FED * pixelgpudetails::MAX_WORD * sizeof(unsigned int); cudaMallocHost(&word, sizeof(unsigned int)*WSIZE); cudaMallocHost(&fedId_h, sizeof(unsigned char)*WSIZE); @@ -170,21 +168,21 @@ SiPixelRawToDigiGPU::SiPixelRawToDigiGPU( const edm::ParameterSet& conf ) cudaMallocHost(&adc_h, sizeof(uint16_t)*WSIZE); cudaMallocHost(&clus_h, sizeof(int32_t)*WSIZE); - uint32_t vsize = sizeof(GPU::SimpleVector); - uint32_t esize = sizeof(error_obj); + uint32_t vsize = sizeof(GPU::SimpleVector); + uint32_t esize = sizeof(pixelgpudetails::error_obj); cudaCheck(cudaMallocHost(&error_h, vsize)); cudaCheck(cudaMallocHost(&error_h_tmp, vsize)); - cudaCheck(cudaMallocHost(&data_h, MAX_FED*MAX_WORD*esize)); + cudaCheck(cudaMallocHost(&data_h, MAX_FED*pixelgpudetails::MAX_WORD*esize)); // allocate memory for RawToDigi on GPU - context_ = initDeviceMemory(); + context_ = pixelgpudetails::initDeviceMemory(); - new (error_h) GPU::SimpleVector(MAX_FED*MAX_WORD, data_h); - new (error_h_tmp) GPU::SimpleVector(MAX_FED*MAX_WORD, context_.data_d); + new (error_h) GPU::SimpleVector(MAX_FED*pixelgpudetails::MAX_WORD, data_h); + new (error_h_tmp) GPU::SimpleVector(MAX_FED*pixelgpudetails::MAX_WORD, context_.data_d); assert(error_h->size() == 0); - assert(error_h->capacity() == static_cast(MAX_FED*MAX_WORD)); + assert(error_h->capacity() == static_cast(MAX_FED*pixelgpudetails::MAX_WORD)); assert(error_h_tmp->size() == 0); - assert(error_h_tmp->capacity() == static_cast(MAX_FED*MAX_WORD)); + assert(error_h_tmp->capacity() == static_cast(MAX_FED*pixelgpudetails::MAX_WORD)); } // ----------------------------------------------------------------------------- @@ -479,7 +477,7 @@ SiPixelRawToDigiGPU::produce( edm::Event& ev, const edm::EventSetup& es) auto size = error_h->size(); for (auto i = 0; i < size; i++) { - error_obj err = (*error_h)[i]; + pixelgpudetails::error_obj err = (*error_h)[i]; if (err.errorType != 0) { SiPixelRawDataError error(err.word, err.errorType, err.fedId + 1200); errors[err.rawId].push_back(error); diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.h b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.h index 2a4e0d1df3ccd..76f7f7f256e70 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.h +++ b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.h @@ -6,32 +6,30 @@ * for pixel subdetector */ -#include "FWCore/Framework/interface/ESWatcher.h" -#include "FWCore/Framework/interface/stream/EDProducer.h" -#include "FWCore/Framework/interface/EventSetup.h" -#include "FWCore/Framework/interface/Event.h" -#include "FWCore/ParameterSet/interface/ParameterSet.h" +#include "CalibTracker/SiPixelESProducers/interface/SiPixelGainCalibrationForHLTService.h" #include "CondFormats/DataRecord/interface/SiPixelFedCablingMapRcd.h" #include "CondFormats/DataRecord/interface/SiPixelQualityRcd.h" #include "DataFormats/FEDRawData/interface/FEDRawDataCollection.h" - -#include "CalibTracker/SiPixelESProducers/interface/SiPixelGainCalibrationForHLTService.h" #include "DataFormats/TrackerCommon/interface/TrackerTopology.h" - - #include "FWCore/Framework/interface/ConsumesCollector.h" +#include "FWCore/Framework/interface/ESWatcher.h" +#include "FWCore/Framework/interface/Event.h" +#include "FWCore/Framework/interface/EventSetup.h" +#include "FWCore/Framework/interface/stream/EDProducer.h" +#include "FWCore/ParameterSet/interface/ParameterSet.h" #include "FWCore/Utilities/interface/CPUTimer.h" -#include "RawToDigiGPU.h" +#include "SiPixelRawToDigiGPUKernel.h" +class PixelUnpackingRegions; class SiPixelFedCablingTree; class SiPixelFedCabling; class SiPixelQuality; class TH1D; -class PixelUnpackingRegions; - class SiPixelGainForHLTonGPU; struct SiPixelGainForHLTonGPU_DecodingStructure; -class SiPixelRawToDigiGPU : public edm::stream::EDProducer<> { + +class SiPixelRawToDigiGPU : public edm::stream::EDProducer<> +{ public: /// ctor @@ -77,12 +75,12 @@ class SiPixelRawToDigiGPU : public edm::stream::EDProducer<> { // to store the output uint32_t *pdigi_h, *rawIdArr_h; // host copy of output uint16_t * adc_h; int32_t * clus_h; // host copy of calib&clus output - error_obj *data_h = nullptr; - GPU::SimpleVector *error_h = nullptr; - GPU::SimpleVector *error_h_tmp = nullptr; + pixelgpudetails::error_obj *data_h = nullptr; + GPU::SimpleVector *error_h = nullptr; + GPU::SimpleVector *error_h_tmp = nullptr; // configuration and memory buffers alocated on the GPU - context context_; + pixelgpudetails::context context_; SiPixelFedCablingMapGPU * cablingMapGPUHost_; SiPixelFedCablingMapGPU * cablingMapGPUDevice_; diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPUKernel.cu b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPUKernel.cu new file mode 100644 index 0000000000000..d8cfc643f4461 --- /dev/null +++ b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPUKernel.cu @@ -0,0 +1,696 @@ +/* Sushil Dubey, Shashi Dugad, TIFR, July 2017 + * + * File Name: RawToDigiGPU.cu + * Description: It converts Raw data into Digi Format on GPU + * then it converts adc -> electron and + * applies the adc threshold to needed for clustering + * Finaly the Output of RawToDigi data is given to pixelClusterizer + * +**/ + +// C++ includes +#include +#include +#include +#include +#include +#include +#include +#include + +// CUDA includes +#include +#include +#include +#include +#include +#include +#include + +// CMSSW includes +#include "HeterogeneousCore/CUDAUtilities/interface/cudaCheck.h" +#include "RecoLocalTracker/SiPixelClusterizer/plugins/gpuCalibPixel.h" +#include "RecoLocalTracker/SiPixelClusterizer/plugins/gpuClustering.h" + +// local includes +#include "SiPixelFedCablingMapGPU.h" +#include "SiPixelRawToDigiGPUKernel.h" + +namespace pixelgpudetails { + + pixelgpudetails::context initDeviceMemory() { + + using namespace gpuClustering; + pixelgpudetails::context c; + + // Number of words for all the feds + constexpr uint32_t MAX_WORD08_SIZE = MAX_FED * pixelgpudetails::MAX_WORD * sizeof(uint8_t); + constexpr uint32_t MAX_WORD32_SIZE = MAX_FED * pixelgpudetails::MAX_WORD * sizeof(uint32_t); + constexpr uint32_t MAX_WORD16_SIZE = MAX_FED * pixelgpudetails::MAX_WORD * sizeof(uint16_t); + constexpr uint32_t vsize = sizeof(GPU::SimpleVector); + constexpr uint32_t esize = sizeof(pixelgpudetails::error_obj); + constexpr uint32_t MAX_ERROR_SIZE = MAX_FED * pixelgpudetails::MAX_WORD * esize; + + cudaCheck(cudaMalloc((void**) & c.word_d, MAX_WORD32_SIZE)); + cudaCheck(cudaMalloc((void**) & c.fedId_d, MAX_WORD08_SIZE)); + cudaCheck(cudaMalloc((void**) & c.pdigi_d, MAX_WORD32_SIZE)); // to store thepacked digi + cudaCheck(cudaMalloc((void**) & c.xx_d, MAX_WORD16_SIZE)); // to store the x and y coordinate + cudaCheck(cudaMalloc((void**) & c.yy_d, MAX_WORD16_SIZE)); + cudaCheck(cudaMalloc((void**) & c.adc_d, MAX_WORD16_SIZE)); + + cudaCheck(cudaMalloc((void**) & c.moduleInd_d, MAX_WORD16_SIZE)); + cudaCheck(cudaMalloc((void**) & c.rawIdArr_d, MAX_WORD32_SIZE)); + cudaCheck(cudaMalloc((void**) & c.error_d, vsize)); + cudaCheck(cudaMalloc((void**) & c.data_d, MAX_ERROR_SIZE)); + + // for the clusterizer + cudaCheck(cudaMalloc((void**) & c.clus_d, MAX_WORD32_SIZE)); // cluser index in module + + cudaCheck(cudaMalloc((void**) & c.moduleStart_d, (MaxNumModules+1)*sizeof(uint32_t) )); + cudaCheck(cudaMalloc((void**) & c.clusInModule_d, (MaxNumModules)*sizeof(uint32_t) )); + cudaCheck(cudaMalloc((void**) & c.moduleId_d, (MaxNumModules)*sizeof(uint32_t) )); + + cudaCheck(cudaMalloc((void**) & c.debug_d, MAX_WORD32_SIZE)); + + // create a CUDA stream + cudaCheck(cudaStreamCreate(&c.stream)); + + return c; + } + + + void freeMemory(pixelgpudetails::context & c) { + // free the GPU memory + cudaCheck(cudaFree(c.word_d)); + cudaCheck(cudaFree(c.fedId_d)); + cudaCheck(cudaFree(c.pdigi_d)); + cudaCheck(cudaFree(c.xx_d)); + cudaCheck(cudaFree(c.yy_d)); + cudaCheck(cudaFree(c.adc_d)); + cudaCheck(cudaFree(c.moduleInd_d)); + cudaCheck(cudaFree(c.rawIdArr_d)); + cudaCheck(cudaFree(c.error_d)); + cudaCheck(cudaFree(c.data_d)); + + // these are for the clusterizer (to be moved) + cudaCheck(cudaFree(c.moduleStart_d)); + cudaCheck(cudaFree(c.clus_d)); + cudaCheck(cudaFree(c.clusInModule_d)); + cudaCheck(cudaFree(c.moduleId_d)); + cudaCheck(cudaFree(c.debug_d)); + + + // destroy the CUDA stream + cudaCheck(cudaStreamDestroy(c.stream)); + } + + + __device__ uint32_t getLink(uint32_t ww) { + return ((ww >> pixelgpudetails::LINK_shift) & pixelgpudetails::LINK_mask); + } + + + __device__ uint32_t getRoc(uint32_t ww) { + return ((ww >> pixelgpudetails::ROC_shift ) & pixelgpudetails::ROC_mask); + } + + + __device__ uint32_t getADC(uint32_t ww) { + return ((ww >> pixelgpudetails::ADC_shift) & pixelgpudetails::ADC_mask); + } + + + __device__ bool isBarrel(uint32_t rawId) { + return (1==((rawId>>25)&0x7)); + } + + + + __device__ pixelgpudetails::DetIdGPU getRawId(const SiPixelFedCablingMapGPU * Map, uint32_t fed, uint32_t link, uint32_t roc) { + uint32_t index = fed * MAX_LINK * MAX_ROC + (link-1) * MAX_ROC + roc; + pixelgpudetails::DetIdGPU detId = { Map->RawId[index], Map->rocInDet[index], Map->moduleId[index] }; + return detId; + } + + + //reference http://cmsdoxygen.web.cern.ch/cmsdoxygen/CMSSW_9_2_0/doc/html/dd/d31/FrameConversion_8cc_source.html + //http://cmslxr.fnal.gov/source/CondFormats/SiPixelObjects/src/PixelROC.cc?v=CMSSW_9_2_0#0071 + // Convert local pixel to pixelgpudetails::global pixel + __device__ pixelgpudetails::Pixel frameConversion(bool bpix, int side, uint32_t layer, uint32_t rocIdInDetUnit, pixelgpudetails::Pixel local) { + + int slopeRow = 0, slopeCol = 0; + int rowOffset = 0, colOffset = 0; + + if (bpix) { + + if (side == -1 && layer != 1) { // -Z side: 4 non-flipped modules oriented like 'dddd', except Layer 1 + if (rocIdInDetUnit < 8) { + slopeRow = 1; + slopeCol = -1; + rowOffset = 0; + colOffset = (8-rocIdInDetUnit)*pixelgpudetails::numColsInRoc-1; + } + else { + slopeRow = -1; + slopeCol = 1; + rowOffset = 2*pixelgpudetails::numRowsInRoc-1; + colOffset = (rocIdInDetUnit-8)*pixelgpudetails::numColsInRoc; + } // if roc + } + else { // +Z side: 4 non-flipped modules oriented like 'pppp', but all 8 in layer1 + if (rocIdInDetUnit < 8) { + slopeRow = -1; + slopeCol = 1; + rowOffset = 2*pixelgpudetails::numRowsInRoc-1; + colOffset = rocIdInDetUnit * pixelgpudetails::numColsInRoc; + } + else { + slopeRow = 1; + slopeCol = -1; + rowOffset = 0; + colOffset = (16-rocIdInDetUnit)*pixelgpudetails::numColsInRoc-1; + } + } + + } + else { // fpix + if (side==-1) { // pannel 1 + if (rocIdInDetUnit < 8) { + slopeRow = 1; + slopeCol = -1; + rowOffset = 0; + colOffset = (8-rocIdInDetUnit)*pixelgpudetails::numColsInRoc-1; + } + else { + slopeRow = -1; + slopeCol = 1; + rowOffset = 2*pixelgpudetails::numRowsInRoc-1; + colOffset = (rocIdInDetUnit-8)*pixelgpudetails::numColsInRoc; + } + } + else { // pannel 2 + if (rocIdInDetUnit < 8) { + slopeRow = 1; + slopeCol = -1; + rowOffset = 0; + colOffset = (8-rocIdInDetUnit)*pixelgpudetails::numColsInRoc-1; + } + else { + slopeRow = -1; + slopeCol = 1; + rowOffset = 2*pixelgpudetails::numRowsInRoc-1; + colOffset = (rocIdInDetUnit-8)*pixelgpudetails::numColsInRoc; + } + + } // side + + } + + uint32_t gRow = rowOffset+slopeRow*local.row; + uint32_t gCol = colOffset+slopeCol*local.col; + //printf("Inside frameConversion row: %u, column: %u\n",gRow, gCol); + pixelgpudetails::Pixel global = {gRow, gCol}; + return global; + } + + + __device__ uint32_t conversionError(uint32_t fedId, uint32_t status, bool debug = false) + { + + uint32_t errorType = 0; + + // debug = true; + + switch (status) { + case(1) : { + if (debug) printf("Error in Fed: %i, invalid channel Id (errorType = 35\n)", fedId ); + errorType = 35; + break; + } + case(2) : { + if (debug) printf("Error in Fed: %i, invalid ROC Id (errorType = 36)\n", fedId); + errorType = 36; + break; + } + case(3) : { + if (debug) printf("Error in Fed: %i, invalid dcol/pixel value (errorType = 37)\n", fedId); + errorType = 37; + break; + } + case(4) : { + if (debug) printf("Error in Fed: %i, dcol/pixel read out of order (errorType = 38)\n", fedId); + errorType = 38; + break; + } + default: if (debug) printf("Cabling check returned unexpected result, status = %i\n", status); + }; + + return errorType; + + } + + + __device__ bool rocRowColIsValid(uint32_t rocRow, uint32_t rocCol) + { + uint32_t numRowsInRoc = 80; + uint32_t numColsInRoc = 52; + + /// row and collumn in ROC representation + return ((rocRow < numRowsInRoc) & (rocCol < numColsInRoc)); + } + + + __device__ bool dcolIsValid(uint32_t dcol, uint32_t pxid) + { + return ((dcol < 26) & (2 <= pxid) & (pxid < 162)); + } + + + __device__ uint32_t checkROC(uint32_t errorWord, uint32_t fedId, uint32_t link, const SiPixelFedCablingMapGPU *Map, bool debug = false) + { + + int errorType = (errorWord >> pixelgpudetails::ROC_shift) & pixelgpudetails::ERROR_mask; + if (errorType < 25) return false; + bool errorFound = false; + + switch (errorType) { + case(25) : { + errorFound = true; + uint32_t index = fedId * MAX_LINK * MAX_ROC + (link-1) * MAX_ROC + 1; + if (index > 1 && index <= Map->size){ + if (!(link == Map->link[index] && 1 == Map->roc[index])) errorFound = false; + } + if (debug&errorFound) printf("Invalid ROC = 25 found (errorType = 25)\n"); + break; + } + case(26) : { + if (debug) printf("Gap word found (errorType = 26)\n"); + errorFound = true; + break; + } + case(27) : { + if (debug) printf("Dummy word found (errorType = 27)\n"); + errorFound = true; + break; + } + case(28) : { + if (debug) printf("Error fifo nearly full (errorType = 28)\n"); + errorFound = true; + break; + } + case(29) : { + if (debug) printf("Timeout on a channel (errorType = 29)\n"); + if ((errorWord >> pixelgpudetails::OMIT_ERR_shift) & pixelgpudetails::OMIT_ERR_mask) { + if (debug) printf("...first errorType=29 error, this gets masked out\n"); + } + errorFound = true; + break; + } + case(30) : { + if (debug) printf("TBM error trailer (errorType = 30)\n"); + int StateMatch_bits = 4; + int StateMatch_shift = 8; + uint32_t StateMatch_mask = ~(~uint32_t(0) << StateMatch_bits); + int StateMatch = (errorWord >> StateMatch_shift) & StateMatch_mask; + if ( StateMatch != 1 && StateMatch != 8 ) { + if (debug) printf("FED error 30 with unexpected State Bits (errorType = 30)\n"); + } + if ( StateMatch == 1 ) errorType = 40; // 1=Overflow -> 40, 8=number of ROCs -> 30 + errorFound = true; + break; + } + case(31) : { + if (debug) printf("Event number error (errorType = 31)\n"); + errorFound = true; + break; + } + default: errorFound = false; + + }; + + return errorFound? errorType : 0; + + } + + + __device__ uint32_t getErrRawID(uint32_t fedId, uint32_t errWord, uint32_t errorType, const SiPixelFedCablingMapGPU *Map, bool debug = false) + { + + uint32_t rID = 0xffffffff; + + switch (errorType) { + case 25 : case 30 : case 31 : case 36 : case 40 : { + //set dummy values for cabling just to get detId from link + //cabling.dcol = 0; + //cabling.pxid = 2; + uint32_t roc = 1; + uint32_t link = (errWord >> pixelgpudetails::LINK_shift) & pixelgpudetails::LINK_mask; + + uint32_t rID_temp = getRawId(Map, fedId, link, roc).RawId; + if(rID_temp != 9999) rID = rID_temp; + break; + } + case 29 : { + int chanNmbr = 0; + const int DB0_shift = 0; + const int DB1_shift = DB0_shift + 1; + const int DB2_shift = DB1_shift + 1; + const int DB3_shift = DB2_shift + 1; + const int DB4_shift = DB3_shift + 1; + const uint32_t DataBit_mask = ~(~uint32_t(0) << 1); + + int CH1 = (errWord >> DB0_shift) & DataBit_mask; + int CH2 = (errWord >> DB1_shift) & DataBit_mask; + int CH3 = (errWord >> DB2_shift) & DataBit_mask; + int CH4 = (errWord >> DB3_shift) & DataBit_mask; + int CH5 = (errWord >> DB4_shift) & DataBit_mask; + int BLOCK_bits = 3; + int BLOCK_shift = 8; + uint32_t BLOCK_mask = ~(~uint32_t(0) << BLOCK_bits); + int BLOCK = (errWord >> BLOCK_shift) & BLOCK_mask; + int localCH = 1*CH1+2*CH2+3*CH3+4*CH4+5*CH5; + if (BLOCK%2==0) chanNmbr=(BLOCK/2)*9+localCH; + else chanNmbr = ((BLOCK-1)/2)*9+4+localCH; + if ((chanNmbr < 1)||(chanNmbr > 36)) break; // signifies unexpected result + + // set dummy values for cabling just to get detId from link if in Barrel + //cabling.dcol = 0; + //cabling.pxid = 2; + uint32_t roc = 1; + uint32_t link = chanNmbr; + uint32_t rID_temp = getRawId(Map, fedId, link, roc).RawId; + if(rID_temp != 9999) rID = rID_temp; + break; + } + case 37 : case 38: { + //cabling.dcol = 0; + //cabling.pxid = 2; + uint32_t roc = (errWord >> pixelgpudetails::ROC_shift) & pixelgpudetails::ROC_mask; + uint32_t link = (errWord >> pixelgpudetails::LINK_shift) & pixelgpudetails::LINK_mask; + uint32_t rID_temp = getRawId(Map, fedId, link, roc).RawId; + if(rID_temp != 9999) rID = rID_temp; + break; + } + + default : break; + + }; + + return rID; + + } + + + /*---------- + * Name: applyADCthreshold_kernel() + * Desc: converts adc count to electrons and then applies the + * threshold on each channel. + * make pixel to 0 if it is below the threshold + * Input: xx_d[], yy_d[], layer_d[], wordCounter, adc[], ADCThreshold + *----------- + * Output: xx_adc[], yy_adc[] with pixel threshold applied + */ + // kernel to apply adc threshold on the channels + + + // Felice: gains and pedestals are not the same for each pixel. This code should be rewritten to take + // in account local gains/pedestals + // __global__ void applyADCthreshold_kernel(const uint32_t *xx_d, const uint32_t *yy_d, const uint32_t *layer_d, uint32_t *adc, const uint32_t wordCounter, + // const ADCThreshold adcThreshold, uint32_t *xx_adc, uint32_t *yy_adc ) { + // int tid = threadIdx.x; + // int gIndex = blockDim.x*blockIdx.x+tid; + // if (gIndex=adcThreshold.theFirstStack_) { + // if (adcThreshold.theStackADC_==1 && adcOld==1) { + // adcNew = int(255*135); // Arbitrarily use overflow value. + // } + // if (adcThreshold.theStackADC_ >1 && adcThreshold.theStackADC_!=255 && adcOld>=1){ + // adcNew = int((adcOld-1) * gain * 255/float(adcThreshold.theStackADC_-1)); + // } + // } + // + // if (adcNew >adcThreshold.thePixelThreshold ) { + // xx_adc[gIndex]=xx_d[gIndex]; + // yy_adc[gIndex]=yy_d[gIndex]; + // } + // else { + // xx_adc[gIndex]=0; // 0: dead pixel + // yy_adc[gIndex]=0; + // } + // adc[gIndex] = adcNew; + // } + // } + + + // Kernel to perform Raw to Digi conversion + __global__ void RawToDigi_kernel(const SiPixelFedCablingMapGPU *Map, const uint32_t wordCounter, const uint32_t *Word, const uint8_t *fedIds, + uint16_t * XX, uint16_t * YY, uint16_t * ADC, + uint32_t * pdigi, uint32_t *rawIdArr, uint16_t * moduleId, + GPU::SimpleVector *err, + bool useQualityInfo, bool includeErrors, bool debug) + { + uint32_t blockId = blockIdx.x; + uint32_t threadId = threadIdx.x; + + bool skipROC = false; + //if (threadId==0) printf("Event: %u blockId: %u start: %u end: %u\n", eventno, blockId, begin, end); + + for (int aaa=0; aaa<1; ++aaa) { // too many coninue below.... (to be fixed) + auto gIndex = threadId + blockId*blockDim.x; + if (gIndex < wordCounter) { + + uint32_t fedId = fedIds[gIndex/2]; // +1200; + + // initialize (too many coninue below) + pdigi[gIndex] = 0; + rawIdArr[gIndex] = 0; + moduleId[gIndex] = 9999; + + uint32_t ww = Word[gIndex]; // Array containing 32 bit raw data + if (ww == 0) { + //noise and dead channels are ignored + XX[gIndex] = 0; // 0 is an indicator of a noise/dead channel + YY[gIndex] = 0; // skip these pixels during clusterization + ADC[gIndex] = 0; + continue ; // 0: bad word + } + + uint32_t link = getLink(ww); // Extract link + uint32_t roc = getRoc(ww); // Extract Roc in link + pixelgpudetails::DetIdGPU detId = getRawId(Map, fedId, link, roc); + + uint32_t errorType = checkROC(ww, fedId, link, Map, debug); + skipROC = (roc < pixelgpudetails::maxROCIndex) ? false : (errorType != 0); + if (includeErrors and skipROC) + { + uint32_t rID = getErrRawID(fedId, ww, errorType, Map, debug); + err->emplace_back(rID, ww, errorType, fedId); + continue; + } + + uint32_t rawId = detId.RawId; + uint32_t rocIdInDetUnit = detId.rocInDet; + bool barrel = isBarrel(rawId); + + uint32_t index = fedId * MAX_LINK * MAX_ROC + (link-1) * MAX_ROC + roc; + if (useQualityInfo) { + + skipROC = Map->badRocs[index]; + if (skipROC) continue; + + } + skipROC = Map->modToUnp[index]; + if (skipROC) continue; + + uint32_t layer = 0;//, ladder =0; + int side = 0, panel = 0, module = 0;//disk = 0,blade = 0 + + if (barrel) + { + layer = (rawId >> pixelgpudetails::layerStartBit) & pixelgpudetails::layerMask; + module = (rawId >> pixelgpudetails::moduleStartBit) & pixelgpudetails::moduleMask; + side = (module < 5)? -1 : 1; + } + else { + // endcap ids + layer = 0; + panel = (rawId >> pixelgpudetails::panelStartBit) & pixelgpudetails::panelMask; + //disk = (rawId >> diskStartBit_) & diskMask_ ; + side = (panel == 1)? -1 : 1; + //blade = (rawId>>bladeStartBit_) & bladeMask_; + } + + // ***special case of layer to 1 be handled here + pixelgpudetails::Pixel localPix; + if (layer == 1) { + uint32_t col = (ww >> pixelgpudetails::COL_shift) & pixelgpudetails::COL_mask; + uint32_t row = (ww >> pixelgpudetails::ROW_shift) & pixelgpudetails::ROW_mask; + localPix.row = row; + localPix.col = col; + if (includeErrors) { + if (not rocRowColIsValid(row, col)) { + uint32_t error = conversionError(fedId, 3, debug); //use the device function and fill the arrays + err->emplace_back(rawId, ww, error, fedId); + if(debug) printf("BPIX1 Error status: %i\n", error); + continue; + } + } + } else { + // ***conversion rules for dcol and pxid + uint32_t dcol = (ww >> pixelgpudetails::DCOL_shift) & pixelgpudetails::DCOL_mask; + uint32_t pxid = (ww >> pixelgpudetails::PXID_shift) & pixelgpudetails::PXID_mask; + uint32_t row = pixelgpudetails::numRowsInRoc - pxid/2; + uint32_t col = dcol*2 + pxid%2; + localPix.row = row; + localPix.col = col; + if (includeErrors and not dcolIsValid(dcol, pxid)) { + uint32_t error = conversionError(fedId, 3, debug); + err->emplace_back(rawId, ww, error, fedId); + if(debug) printf("Error status: %i %d %d %d %d\n", error, dcol, pxid, fedId, roc); + continue; + } + } + + pixelgpudetails::Pixel globalPix = frameConversion(barrel, side, layer, rocIdInDetUnit, localPix); + XX[gIndex] = globalPix.row ; // origin shifting by 1 0-159 + YY[gIndex] = globalPix.col ; // origin shifting by 1 0-415 + ADC[gIndex] = getADC(ww); + pdigi[gIndex] = pixelgpudetails::pack(globalPix.row,globalPix.col,ADC[gIndex]); + moduleId[gIndex] = detId.moduleId; + rawIdArr[gIndex] = rawId; + } // end of if (gIndex < end) + } // end fake loop + } // end of Raw to Digi kernel + + + // kernel wrapper called from runRawToDigi_kernel + void RawToDigi_wrapper( + pixelgpudetails::context & c, + const SiPixelFedCablingMapGPU* cablingMapDevice, SiPixelGainForHLTonGPU * const ped, + const uint32_t wordCounter, uint32_t *word, const uint32_t fedCounter, uint8_t *fedId_h, + bool convertADCtoElectrons, + uint32_t * pdigi_h, uint32_t *rawIdArr_h, + GPU::SimpleVector *error_h, GPU::SimpleVector *error_h_tmp, pixelgpudetails::error_obj *data_h, + uint16_t * adc_h, int32_t * clus_h, + bool useQualityInfo, bool includeErrors, bool debug, uint32_t & nModulesActive) + { + const int threadsPerBlock = 512; + const int blocks = (wordCounter + threadsPerBlock-1) /threadsPerBlock; // fill it all + + + assert(0 == wordCounter%2); + // wordCounter is the total no of words in each event to be trasfered on device + cudaCheck(cudaMemcpyAsync(&c.word_d[0], &word[0], wordCounter*sizeof(uint32_t), cudaMemcpyDefault, c.stream)); + cudaCheck(cudaMemcpyAsync(&c.fedId_d[0], &fedId_h[0], wordCounter*sizeof(uint8_t)/2, cudaMemcpyDefault, c.stream)); + + constexpr uint32_t vsize = sizeof(GPU::SimpleVector); + constexpr uint32_t esize = sizeof(pixelgpudetails::error_obj); + cudaCheck(cudaMemcpyAsync(c.error_d, error_h_tmp, vsize, cudaMemcpyDefault, c.stream)); + + // Launch rawToDigi kernel + RawToDigi_kernel<<>>( + cablingMapDevice, + wordCounter, + c.word_d, + c.fedId_d, + c.xx_d, c.yy_d, c.adc_d, + c.pdigi_d, + c.rawIdArr_d, + c.moduleInd_d, + c.error_d, + useQualityInfo, + includeErrors, + debug); + cudaCheck(cudaGetLastError()); + + // copy data to host variable + + cudaCheck(cudaMemcpyAsync(pdigi_h, c.pdigi_d, wordCounter*sizeof(uint32_t), cudaMemcpyDefault, c.stream)); + cudaCheck(cudaMemcpyAsync(rawIdArr_h, c.rawIdArr_d, wordCounter*sizeof(uint32_t), cudaMemcpyDefault, c.stream)); + + if (includeErrors) { + cudaCheck(cudaMemcpyAsync(error_h, c.error_d, vsize, cudaMemcpyDefault, c.stream)); + cudaStreamSynchronize(c.stream); + error_h->set_data(data_h); + int size = error_h->size(); + cudaCheck(cudaMemcpyAsync(data_h, c.data_d, size*esize, cudaMemcpyDefault, c.stream)); + } + // End of Raw2Digi and passing data for cluserisation + + { + // clusterizer ... + using namespace gpuClustering; + int threadsPerBlock = 256; + int blocks = (wordCounter + threadsPerBlock - 1) / threadsPerBlock; + + + assert(ped); + gpuCalibPixel::calibDigis<<>>( + c.moduleInd_d, + c.xx_d, c.yy_d, c.adc_d, + ped, + wordCounter + ); + + cudaCheck(cudaGetLastError()); + + // calibrated adc + cudaCheck(cudaMemcpyAsync(adc_h, c.adc_d, wordCounter*sizeof(uint32_t), cudaMemcpyDefault, c.stream)); + + /* + std::cout + << "CUDA countModules kernel launch with " << blocks + << " blocks of " << threadsPerBlock << " threads\n"; + */ + + uint32_t nModules=0; + cudaCheck(cudaMemcpyAsync(c.moduleStart_d, &nModules, sizeof(uint32_t), cudaMemcpyDefault, c.stream)); + + countModules<<>>(c.moduleInd_d, c.moduleStart_d, c.clus_d, wordCounter); + cudaCheck(cudaGetLastError()); + + cudaCheck(cudaMemcpyAsync(&nModules, c.moduleStart_d, sizeof(uint32_t), cudaMemcpyDefault, c.stream)); + + // std::cout << "found " << nModules << " Modules active" << std::endl; + + + threadsPerBlock = 256; + blocks = nModules; + + /* + std::cout + << "CUDA findClus kernel launch with " << blocks + << " blocks of " << threadsPerBlock << " threads\n"; + */ + + cudaCheck(cudaMemsetAsync(c.clusInModule_d, 0, (MaxNumModules)*sizeof(uint32_t),c.stream)); + + findClus<<>>( + c.moduleInd_d, + c.xx_d, c.yy_d, c.adc_d, + c.moduleStart_d, + c.clusInModule_d, c.moduleId_d, + c.clus_d, + c.debug_d, + wordCounter + ); + + // clusters + cudaCheck(cudaMemcpyAsync(clus_h, c.clus_d, wordCounter*sizeof(uint32_t), cudaMemcpyDefault, c.stream)); + + + cudaStreamSynchronize(c.stream); + cudaCheck(cudaGetLastError()); + + nModulesActive = nModules; + + } // end clusterizer scope + + } + +} diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPUKernel.h b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPUKernel.h new file mode 100644 index 0000000000000..0bebde676bc28 --- /dev/null +++ b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPUKernel.h @@ -0,0 +1,212 @@ +#ifndef EventFilter_SiPixelRawToDigi_plugins_SiPixelRawToDigiGPUKernel_h +#define EventFilter_SiPixelRawToDigi_plugins_SiPixelRawToDigiGPUKernel_h + +#include +#include + +#include "HeterogeneousCore/CUDAUtilities/interface/GPUSimpleVector.h" +#include "SiPixelFedCablingMapGPU.h" + +namespace pixelgpudetails { + + // Phase 1 geometry constants + const uint32_t layerStartBit = 20; + const uint32_t ladderStartBit = 12; + const uint32_t moduleStartBit = 2; + + const uint32_t panelStartBit = 10; + const uint32_t diskStartBit = 18; + const uint32_t bladeStartBit = 12; + + const uint32_t layerMask = 0xF; + const uint32_t ladderMask = 0xFF; + const uint32_t moduleMask = 0x3FF; + const uint32_t panelMask = 0x3; + const uint32_t diskMask = 0xF; + const uint32_t bladeMask = 0x3F; + + const uint32_t LINK_bits = 6; + const uint32_t ROC_bits = 5; + const uint32_t DCOL_bits = 5; + const uint32_t PXID_bits = 8; + const uint32_t ADC_bits = 8; + + // special for layer 1 + const uint32_t LINK_bits_l1 = 6; + const uint32_t ROC_bits_l1 = 5; + const uint32_t COL_bits_l1 = 6; + const uint32_t ROW_bits_l1 = 7; + const uint32_t OMIT_ERR_bits = 1; + + const uint32_t maxROCIndex = 8; + const uint32_t numRowsInRoc = 80; + const uint32_t numColsInRoc = 52; + + const uint32_t MAX_WORD = 2000; + + const uint32_t ADC_shift = 0; + const uint32_t PXID_shift = ADC_shift + ADC_bits; + const uint32_t DCOL_shift = PXID_shift + PXID_bits; + const uint32_t ROC_shift = DCOL_shift + DCOL_bits; + const uint32_t LINK_shift = ROC_shift + ROC_bits_l1; + // special for layer 1 ROC + const uint32_t ROW_shift = ADC_shift + ADC_bits; + const uint32_t COL_shift = ROW_shift + ROW_bits_l1; + const uint32_t OMIT_ERR_shift = 20; + + const uint32_t LINK_mask = ~(~uint32_t(0) << LINK_bits_l1); + const uint32_t ROC_mask = ~(~uint32_t(0) << ROC_bits_l1); + const uint32_t COL_mask = ~(~uint32_t(0) << COL_bits_l1); + const uint32_t ROW_mask = ~(~uint32_t(0) << ROW_bits_l1); + const uint32_t DCOL_mask = ~(~uint32_t(0) << DCOL_bits); + const uint32_t PXID_mask = ~(~uint32_t(0) << PXID_bits); + const uint32_t ADC_mask = ~(~uint32_t(0) << ADC_bits); + const uint32_t ERROR_mask = ~(~uint32_t(0) << ROC_bits_l1); + const uint32_t OMIT_ERR_mask = ~(~uint32_t(0) << OMIT_ERR_bits); + + struct DetIdGPU { + uint32_t RawId; + uint32_t rocInDet; + uint32_t moduleId; + }; + + struct Pixel { + uint32_t row; + uint32_t col; + }; + + class Packing { + public: + using PackedDigiType = uint32_t; + + // Constructor: pre-computes masks and shifts from field widths + __host__ __device__ + inline + constexpr Packing(unsigned int row_w, unsigned int column_w, + unsigned int time_w, unsigned int adc_w) : + row_width(row_w), + column_width(column_w), + adc_width(adc_w), + row_shift(0), + column_shift(row_shift + row_w), + time_shift(column_shift + column_w), + adc_shift(time_shift + time_w), + row_mask(~(~0U << row_w)), + column_mask( ~(~0U << column_w)), + time_mask(~(~0U << time_w)), + adc_mask(~(~0U << adc_w)), + rowcol_mask(~(~0U << (column_w+row_w))), + max_row(row_mask), + max_column(column_mask), + max_adc(adc_mask) + { } + + uint32_t row_width; + uint32_t column_width; + uint32_t adc_width; + + uint32_t row_shift; + uint32_t column_shift; + uint32_t time_shift; + uint32_t adc_shift; + + PackedDigiType row_mask; + PackedDigiType column_mask; + PackedDigiType time_mask; + PackedDigiType adc_mask; + PackedDigiType rowcol_mask; + + uint32_t max_row; + uint32_t max_column; + uint32_t max_adc; + }; + + __host__ __device__ + inline + constexpr Packing packing() { + return Packing(11, 11, 0, 10); + } + + + __host__ __device__ + inline + uint32_t pack(uint32_t row, uint32_t col, uint32_t adc) { + constexpr Packing thePacking = packing(); + adc = std::min(adc, thePacking.max_adc); + + return (row << thePacking.row_shift) | + (col << thePacking.column_shift) | + (adc << thePacking.adc_shift); + } + + struct error_obj { + uint32_t rawId; + uint32_t word; + unsigned char errorType; + unsigned char fedId; + + __host__ __device__ + error_obj(uint32_t a, uint32_t b, unsigned char c, unsigned char d): + rawId(a), + word(b), + errorType(c), + fedId(d) + { } + }; + + // configuration and memory buffers alocated on the GPU + struct context { + cudaStream_t stream; + + uint32_t * word_d; + uint8_t * fedId_d; + uint32_t * pdigi_d; + uint16_t * xx_d; + uint16_t * yy_d; + uint16_t * adc_d; + uint16_t * moduleInd_d; + uint32_t * rawIdArr_d; + + GPU::SimpleVector * error_d; + error_obj * data_d; + + // these are for the clusterizer (to be moved) + uint32_t * moduleStart_d; + int32_t * clus_d; + uint32_t * clusInModule_d; + uint32_t * moduleId_d; + uint32_t * debug_d; + }; + + // wrapper function to call RawToDigi on the GPU from host side + void RawToDigi_wrapper(context &, const SiPixelFedCablingMapGPU* cablingMapDevice, + SiPixelGainForHLTonGPU * const ped, + const uint32_t wordCounter, uint32_t *word, + const uint32_t fedCounter, uint8_t *fedId_h, + bool convertADCtoElectrons, uint32_t * pdigi_h, + uint32_t *rawIdArr_h, GPU::SimpleVector *error_h, + GPU::SimpleVector *error_h_tmp, error_obj *data_h, + uint16_t * adc_h, int32_t * clus_h, + bool useQualityInfo, bool includeErrors, bool debug, + uint32_t & nModulesActive); + + // void initCablingMap(); + context initDeviceMemory(); + void freeMemory(context &); + + // see RecoLocalTracker/SiPixelClusterizer + // all are runtime const, should be specified in python _cfg.py + struct ADCThreshold { + const int thePixelThreshold = 1000; // default Pixel threshold in electrons + const int theSeedThreshold = 1000; // seed thershold in electrons not used in our algo + const float theClusterThreshold = 4000; // cluster threshold in electron + const int ConversionFactor = 65; // adc to electron conversion factor + + const int theStackADC_ = 255; // the maximum adc count for stack layer + const int theFirstStack_ = 5; // the index of the fits stack layer + const double theElectronPerADCGain_ = 600; // ADC to electron conversion + }; + +} + +#endif // EventFilter_SiPixelRawToDigi_plugins_SiPixelRawToDigiGPUKernel_h diff --git a/RecoLocalTracker/SiPixelRecHits/interface/pixelCPEforGPU.h b/RecoLocalTracker/SiPixelRecHits/interface/pixelCPEforGPU.h index a76ca821e70da..6add3a78b96e6 100644 --- a/RecoLocalTracker/SiPixelRecHits/interface/pixelCPEforGPU.h +++ b/RecoLocalTracker/SiPixelRecHits/interface/pixelCPEforGPU.h @@ -19,12 +19,11 @@ namespace pixelCPEforGPU { struct CommonParams { float theThicknessB; float theThicknessE; - float thePitchX; + float thePitchX; float thePitchY; }; struct DetParams { - bool isBarrel; bool isPosZ; uint16_t layer; @@ -39,7 +38,6 @@ namespace pixelCPEforGPU { float x0,y0,z0; // the vertex in the local coord of the detector Frame frame; - }; @@ -51,10 +49,9 @@ namespace pixelCPEforGPU { CommonParams const & commonParams() const {return *m_commonParams;} constexpr DetParams const & detParams(int i) const {return m_detParams[i];} - }; - // SOA! (on device) + // SOA (on device) template struct ClusParamsT { uint32_t minRow[N]; @@ -66,12 +63,12 @@ namespace pixelCPEforGPU { int32_t Q_l_X[N]; int32_t Q_f_Y[N]; int32_t Q_l_Y[N]; - + int32_t charge[N]; float xpos[N]; float ypos[N]; - + float xerr[N]; float yerr[N]; }; @@ -85,177 +82,171 @@ namespace pixelCPEforGPU { // x,y local position on det auto gvx = x - detParams.x0; auto gvy = y - detParams.y0; - auto gvz = -1.f/detParams.z0; - // normalization not required as only ratio used... + auto gvz = -1.f / detParams.z0; + // normalization not required as only ratio used... // calculate angles - cotalpha = gvx*gvz; - cotbeta = gvy*gvz; + cotalpha = gvx * gvz; + cotbeta = gvy * gvz; } constexpr inline - float correction( - int sizeM1, - int Q_f, //!< Charge in the first pixel. - int Q_l, //!< Charge in the last pixel. - uint16_t upper_edge_first_pix, //!< As the name says. - uint16_t lower_edge_last_pix, //!< As the name says. - float lorentz_shift, //!< L-shift at half thickness - float theThickness, //detector thickness - float cot_angle, //!< cot of alpha_ or beta_ - float pitch, //!< thePitchX or thePitchY - bool first_is_big, //!< true if the first is big - bool last_is_big //!< true if the last is big - ) -{ - if (0==sizeM1) return 0; // size1 - float W_eff=0; - bool simple=true; - if (1==sizeM1) { // size 2 - //--- Width of the clusters minus the edge (first and last) pixels. - //--- In the note, they are denoted x_F and x_L (and y_F and y_L) - // assert(lower_edge_last_pix>=upper_edge_first_pix); - auto W_inner = pitch * float(lower_edge_last_pix-upper_edge_first_pix); // in cm - - //--- Predicted charge width from geometry - auto W_pred = theThickness * cot_angle // geometric correction (in cm) - - lorentz_shift; // (in cm) &&& check fpix! - - W_eff = std::abs( W_pred ) - W_inner; - - //--- If the observed charge width is inconsistent with the expectations - //--- based on the track, do *not* use W_pred-W_innner. Instead, replace - //--- it with an *average* effective charge width, which is the average - //--- length of the edge pixels. - // - simple = ( W_eff < 0.0f ) | ( W_eff > pitch ); // this produces "large" regressions for very small numeric differences... - - } - if (simple) { - //--- Total length of the two edge pixels (first+last) - float sum_of_edge = 2.0f; - if (first_is_big) sum_of_edge += 1.0f; - if (last_is_big) sum_of_edge += 1.0f; - W_eff = pitch * 0.5f * sum_of_edge; // ave. length of edge pixels (first+last) (cm) - } - - - //--- Finally, compute the position in this projection - float Qdiff = Q_l - Q_f; - float Qsum = Q_l + Q_f; - - //--- Temporary fix for clusters with both first and last pixel with charge = 0 - if(Qsum==0) Qsum=1.0f; - return 0.5f*(Qdiff/Qsum) * W_eff; - + float correction( + int sizeM1, + int Q_f, //!< Charge in the first pixel. + int Q_l, //!< Charge in the last pixel. + uint16_t upper_edge_first_pix, //!< As the name says. + uint16_t lower_edge_last_pix, //!< As the name says. + float lorentz_shift, //!< L-shift at half thickness + float theThickness, //detector thickness + float cot_angle, //!< cot of alpha_ or beta_ + float pitch, //!< thePitchX or thePitchY + bool first_is_big, //!< true if the first is big + bool last_is_big ) //!< true if the last is big + { + if (0 == sizeM1) // size 1 + return 0; + + float W_eff = 0; + bool simple = true; + if (1 == sizeM1) { // size 2 + //--- Width of the clusters minus the edge (first and last) pixels. + //--- In the note, they are denoted x_F and x_L (and y_F and y_L) + // assert(lower_edge_last_pix >= upper_edge_first_pix); + auto W_inner = pitch * float(lower_edge_last_pix - upper_edge_first_pix); // in cm + + //--- Predicted charge width from geometry + auto W_pred = theThickness * cot_angle // geometric correction (in cm) + - lorentz_shift; // (in cm) &&& check fpix! + + W_eff = std::abs(W_pred) - W_inner; + + //--- If the observed charge width is inconsistent with the expectations + //--- based on the track, do *not* use W_pred-W_inner. Instead, replace + //--- it with an *average* effective charge width, which is the average + //--- length of the edge pixels. + simple = (W_eff < 0.0f) | (W_eff > pitch); // this produces "large" regressions for very small numeric differences... + } + + if (simple) { + //--- Total length of the two edge pixels (first+last) + float sum_of_edge = 2.0f; + if (first_is_big) sum_of_edge += 1.0f; + if (last_is_big) sum_of_edge += 1.0f; + W_eff = pitch * 0.5f * sum_of_edge; // ave. length of edge pixels (first+last) (cm) + } + + //--- Finally, compute the position in this projection + float Qdiff = Q_l - Q_f; + float Qsum = Q_l + Q_f; + + //--- Temporary fix for clusters with both first and last pixel with charge = 0 + if (Qsum == 0) + Qsum = 1.0f; + + return 0.5f * (Qdiff/Qsum) * W_eff; } constexpr inline void position(CommonParams const & comParams, DetParams const & detParams, ClusParams & cp, uint32_t ic) { - //--- Upper Right corner of Lower Left pixel -- in measurement frame - uint16_t llx = cp.minRow[ic]+1; - uint16_t lly = cp.minCol[ic]+1; - - //--- Lower Left corner of Upper Right pixel -- in measurement frame - uint16_t urx = cp.maxRow[ic]; - uint16_t ury = cp.maxCol[ic]; - - auto llxl = phase1PixelTopology::localX(llx); - auto llyl = phase1PixelTopology::localY(lly); - auto urxl = phase1PixelTopology::localX(urx); - auto uryl = phase1PixelTopology::localY(ury); - - auto mx = llxl+urxl; - auto my = llyl+uryl; - - // apply the lorentz offset correction - auto xPos = detParams.shiftX + comParams.thePitchX*(0.5f*float(mx)+float(phase1PixelTopology::xOffset)); - auto yPos = detParams.shiftY + comParams.thePitchY*(0.5f*float(my)+float(phase1PixelTopology::yOffset)); - - float cotalpha=0, cotbeta=0; - - - computeAnglesFromDet(detParams, xPos, yPos, cotalpha, cotbeta); - - auto thickness = detParams.isBarrel ? comParams.theThicknessB : comParams.theThicknessE; - - auto xcorr = correction( - cp.maxRow[ic]-cp.minRow[ic], - cp.Q_f_X[ic], cp.Q_l_X[ic], - llxl, urxl, - detParams.chargeWidthX, // lorentz shift in cm - thickness, - cotalpha, - comParams.thePitchX, - phase1PixelTopology::isBigPixX( cp.minRow[ic] ), - phase1PixelTopology::isBigPixX( cp.maxRow[ic] ) - ); - - - auto ycorr = correction( - cp.maxCol[ic]-cp.minCol[ic], - cp.Q_f_Y[ic], cp.Q_l_Y[ic], - llyl, uryl, - detParams.chargeWidthY, // lorentz shift in cm - thickness, - cotbeta, - comParams.thePitchY, - phase1PixelTopology::isBigPixY( cp.minCol[ic] ), - phase1PixelTopology::isBigPixY( cp.maxCol[ic] ) - ); - - cp.xpos[ic]=xPos+xcorr; - cp.ypos[ic]=yPos+ycorr; - + //--- Upper Right corner of Lower Left pixel -- in measurement frame + uint16_t llx = cp.minRow[ic]+1; + uint16_t lly = cp.minCol[ic]+1; + + //--- Lower Left corner of Upper Right pixel -- in measurement frame + uint16_t urx = cp.maxRow[ic]; + uint16_t ury = cp.maxCol[ic]; + + auto llxl = phase1PixelTopology::localX(llx); + auto llyl = phase1PixelTopology::localY(lly); + auto urxl = phase1PixelTopology::localX(urx); + auto uryl = phase1PixelTopology::localY(ury); + + auto mx = llxl+urxl; + auto my = llyl+uryl; + + // apply the lorentz offset correction + auto xPos = detParams.shiftX + comParams.thePitchX*(0.5f*float(mx)+float(phase1PixelTopology::xOffset)); + auto yPos = detParams.shiftY + comParams.thePitchY*(0.5f*float(my)+float(phase1PixelTopology::yOffset)); + + float cotalpha=0, cotbeta=0; + + computeAnglesFromDet(detParams, xPos, yPos, cotalpha, cotbeta); + + auto thickness = detParams.isBarrel ? comParams.theThicknessB : comParams.theThicknessE; + + auto xcorr = correction( + cp.maxRow[ic]-cp.minRow[ic], + cp.Q_f_X[ic], cp.Q_l_X[ic], + llxl, urxl, + detParams.chargeWidthX, // lorentz shift in cm + thickness, + cotalpha, + comParams.thePitchX, + phase1PixelTopology::isBigPixX(cp.minRow[ic]), + phase1PixelTopology::isBigPixX(cp.maxRow[ic]) ); + + auto ycorr = correction( + cp.maxCol[ic]-cp.minCol[ic], + cp.Q_f_Y[ic], cp.Q_l_Y[ic], + llyl, uryl, + detParams.chargeWidthY, // lorentz shift in cm + thickness, + cotbeta, + comParams.thePitchY, + phase1PixelTopology::isBigPixY(cp.minCol[ic]), + phase1PixelTopology::isBigPixY(cp.maxCol[ic]) ); + + cp.xpos[ic]=xPos+xcorr; + cp.ypos[ic]=yPos+ycorr; } - // FIXME these are errors form Run1 constexpr inline void error(CommonParams const & comParams, DetParams const & detParams, ClusParams & cp, uint32_t ic) { - // Edge cluster errors - cp.xerr[ic]= 0.0050; - cp.yerr[ic]= 0.0085; - - - constexpr float xerr_barrel_l1[] = {0.00115, 0.00120, 0.00088}; - constexpr float xerr_barrel_l1_def = 0.01030; - constexpr float yerr_barrel_l1[] = {0.00375,0.00230,0.00250,0.00250,0.00230,0.00230,0.00210,0.00210,0.00240}; - constexpr float yerr_barrel_l1_def=0.00210; - constexpr float xerr_barrel_ln[]= {0.00115, 0.00120, 0.00088}; - constexpr float xerr_barrel_ln_def=0.01030; - constexpr float yerr_barrel_ln[]= {0.00375,0.00230,0.00250,0.00250,0.00230,0.00230,0.00210,0.00210,0.00240}; - constexpr float yerr_barrel_ln_def=0.00210; - constexpr float xerr_endcap[]= {0.0020, 0.0020}; - constexpr float xerr_endcap_def=0.0020; - constexpr float yerr_endcap[]= {0.00210}; - constexpr float yerr_endcap_def=0.00210; - - // is edgy? - bool isEdgeX = cp.minRow[ic]==0 || cp.maxRow[ic]==phase1PixelTopology::lastRowInModule; - bool isEdgeY = cp.minCol[ic]==0 || cp.maxCol[ic]==phase1PixelTopology::lastColInModule; - - if (!isEdgeX) { - auto sx = cp.maxRow[ic]-cp.minRow[ic]; - if (!detParams.isBarrel ) { - cp.xerr[ic] = sx // CMSSW headers -#include "EventFilter/SiPixelRawToDigi/plugins/RawToDigiGPU.h" +#include "EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPUKernel.h" #include "HeterogeneousCore/CUDAUtilities/interface/cudaCheck.h" #include "RecoLocalTracker/SiPixelClusterizer/plugins/gpuClustering.h" #include "PixelRecHits.h" @@ -35,7 +35,7 @@ HitsOnGPU allocHitsOnGPU() { HitsOnCPU pixelRecHits_wrapper( - context const & c, + pixelgpudetails::context const & c, pixelCPEforGPU::ParamsOnGPU const * cpeParams, uint32_t ndigis, uint32_t nModules, // active modules (with digis) diff --git a/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.h b/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.h index 75976ad697a1a..9126ab1c8abd1 100644 --- a/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.h +++ b/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.h @@ -8,7 +8,9 @@ namespace pixelCPEforGPU { struct ParamsOnGPU; } -struct context; +namespace pixelgpudetails { + struct context; +} struct HitsOnGPU{ uint32_t * hitsModuleStart_d; @@ -32,7 +34,7 @@ struct HitsOnCPU { HitsOnGPU allocHitsOnGPU(); HitsOnCPU pixelRecHits_wrapper( - context const & c, + pixelgpudetails::context const & c, pixelCPEforGPU::ParamsOnGPU const * cpeParams, uint32_t ndigis, uint32_t nModules, // active modules (with digis) diff --git a/RecoLocalTracker/SiPixelRecHits/plugins/SiPixelRecHitGPU.cc b/RecoLocalTracker/SiPixelRecHits/plugins/SiPixelRecHitGPU.cc index aa9c2751c3848..d2ad7d5cc2806 100644 --- a/RecoLocalTracker/SiPixelRecHits/plugins/SiPixelRecHitGPU.cc +++ b/RecoLocalTracker/SiPixelRecHits/plugins/SiPixelRecHitGPU.cc @@ -136,7 +136,7 @@ using namespace std; // Step B*: create CPE edm::ESHandle hCPE; std::string cpeName_ = conf_.getParameter("CPE"); - es.get().get(cpeName_,hCPE); + es.get().get(cpeName_, hCPE); cpe_ = dynamic_cast< const PixelCPEBase* >(&(*hCPE)); /// do it on GPU.... @@ -152,14 +152,14 @@ using namespace std; } assert(fcpe->d_paramsOnGPU); - auto hoc = pixelRecHits_wrapper(* (context const *)(gprod[0]),fcpe->d_paramsOnGPU,gprod[1],gprod[2], hitsOnGPU_); + auto hoc = pixelRecHits_wrapper(* (pixelgpudetails::context const *)(gprod[0]), fcpe->d_paramsOnGPU, gprod[1], gprod[2], hitsOnGPU_); // Step C: Iterate over DetIds and invoke the strip CPE algorithm // on each DetUnit // std::cout << "Number of Clusers on CPU " << (*input).data().size() << std::endl; - run( input, *output, geom,hoc ); + run( input, *output, geom, hoc ); // std::cout << "Number of Hits on CPU " << (*output).data().size() << std::endl; output->shrink_to_fit(); @@ -192,7 +192,7 @@ using namespace std; auto gind = genericDet->index(); const PixelGeomDetUnit * pixDet = dynamic_cast(genericDet); assert(pixDet); - SiPixelRecHitCollectionNew::FastFiller recHitsOnDetUnit(output,detid); + SiPixelRecHitCollectionNew::FastFiller recHitsOnDetUnit(output, detid); auto fc = hoc.hitsModuleStart[gind]; auto lc = hoc.hitsModuleStart[gind+1]; auto nhits = lc-fc; @@ -201,10 +201,10 @@ using namespace std; uint32_t ngh=0; for (uint32_t i=0; i=96 && hoc.charge[fc+i]<4000) ) continue; - ind[ngh]=i;std::push_heap(ind,ind+ngh+1,[&](auto a, auto b) { return mrp[a]size()); for (auto const & clust : *DSViter) { @@ -233,8 +233,8 @@ using namespace std; << gind <<'/'<=MaxClusInModule); - assert(nclus<=MaxClusInModule); + assert(blockDim.x >= MaxClusInModule); + assert(nclus <= MaxClusInModule); auto ic = threadIdx.x; - - if (ic::max(); clusParams.maxRow[ic] = 0; clusParams.minCol[ic] = std::numeric_limits::max(); clusParams.maxCol[ic] = 0; - clusParams.charge[ic] = 0; - clusParams.Q_f_X[ic] = 0; clusParams.Q_l_X[ic] = 0; clusParams.Q_f_Y[ic] = 0; clusParams.Q_l_Y[ic] = 0; } - - first+=threadIdx.x; - - __syncthreads(); + first += threadIdx.x; + __syncthreads(); // one thead per "digi" - - for (int i=first; i=nclus) return; + if (ic >= nclus) return; first = hitsModuleStart[me]; auto h = first+ic; // output index in global memory - assert(h<2000*256); + assert(h < 2000*256); + + pixelCPEforGPU::position(cpeParams->commonParams(), cpeParams->detParams(me), clusParams, ic); + pixelCPEforGPU::error(cpeParams->commonParams(), cpeParams->detParams(me), clusParams, ic); - pixelCPEforGPU::position(cpeParams->commonParams(), cpeParams->detParams(me), clusParams,ic); - pixelCPEforGPU::error(cpeParams->commonParams(), cpeParams->detParams(me), clusParams,ic); - chargeh[h] = clusParams.charge[ic]; - if (local) { - xh[h]= clusParams.xpos[ic]; - yh[h]= clusParams.ypos[ic]; + if (local) { + xh[h] = clusParams.xpos[ic]; + yh[h] = clusParams.ypos[ic]; } else { - cpeParams->detParams(me).frame.toGlobal(clusParams.xpos[ic],clusParams.ypos[ic], - xh[h],yh[h],zh[h] - ); + cpeParams->detParams(me).frame.toGlobal(clusParams.xpos[ic], clusParams.ypos[ic], + xh[h], yh[h], zh[h] ); } - xe[h]= clusParams.xerr[ic]; - ye[h]= clusParams.yerr[ic]; - mr[h]= clusParams.minRow[ic]; + xe[h] = clusParams.xerr[ic]; + ye[h] = clusParams.yerr[ic]; + mr[h] = clusParams.minRow[ic]; } } From ddadc0aad1ba5fa9e13bd59a4707d1f3518dbc0a Mon Sep 17 00:00:00 2001 From: Matti Kortelainen Date: Wed, 23 May 2018 16:41:02 +0200 Subject: [PATCH 49/88] Generalize HeterogeneousEvent::getByToken() to support standard products (#52) - generalize `HeterogeneousEvent::getByToken()` to support standard products - add tests for generalized `HeterogeneousEvent::getByToken()` --- .../Producer/interface/HeterogeneousEvent.h | 6 ++++++ .../test/TestHeterogeneousEDProducerGPUMock.cc | 17 +++++++++++++++++ .../Producer/test/testGPUMock_cfg.py | 7 +++++-- 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/HeterogeneousCore/Producer/interface/HeterogeneousEvent.h b/HeterogeneousCore/Producer/interface/HeterogeneousEvent.h index e06e0a8ffa86c..05de3d871bc02 100644 --- a/HeterogeneousCore/Producer/interface/HeterogeneousEvent.h +++ b/HeterogeneousCore/Producer/interface/HeterogeneousEvent.h @@ -54,6 +54,12 @@ namespace edm { } } + // Delegate standard getByToken to edm::Event + template + void getByToken(const Token& token, edm::Handle& handle) const { + constEvent_->getByToken(token, handle); + } + template auto put(std::unique_ptr product) { return event_->put(std::move(product)); diff --git a/HeterogeneousCore/Producer/test/TestHeterogeneousEDProducerGPUMock.cc b/HeterogeneousCore/Producer/test/TestHeterogeneousEDProducerGPUMock.cc index 716b05ecc165c..ddb56530b702b 100644 --- a/HeterogeneousCore/Producer/test/TestHeterogeneousEDProducerGPUMock.cc +++ b/HeterogeneousCore/Producer/test/TestHeterogeneousEDProducerGPUMock.cc @@ -36,6 +36,7 @@ class TestHeterogeneousEDProducerGPUMock: public HeterogeneousEDProducer srcToken_; + edm::EDGetTokenT srcIntToken_; // hack for GPU mock tbb::concurrent_vector > pendingFutures; @@ -57,6 +58,10 @@ TestHeterogeneousEDProducerGPUMock::TestHeterogeneousEDProducerGPUMock(edm::Para if(!srcTag.label().empty()) { srcToken_ = consumesHeterogeneous(srcTag); } + auto srcIntTag = iConfig.getParameter("srcInt"); + if(!srcIntTag.label().empty()) { + srcIntToken_ = consumes(srcIntTag); + } produces(); produces(); @@ -65,6 +70,7 @@ TestHeterogeneousEDProducerGPUMock::TestHeterogeneousEDProducerGPUMock(edm::Para void TestHeterogeneousEDProducerGPUMock::fillDescriptions(edm::ConfigurationDescriptions& descriptions) { edm::ParameterSetDescription desc; desc.add("src", edm::InputTag()); + desc.add("srcInt", edm::InputTag()); HeterogeneousEDProducer::fillPSetDescription(desc); descriptions.add("testHeterogeneousEDProducerGPUMock", desc); } @@ -78,6 +84,11 @@ void TestHeterogeneousEDProducerGPUMock::acquireGPUMock(const edm::Heterogeneous iEvent.getByToken(srcToken_, hin); input = *hin; } + if(!srcIntToken_.isUninitialized()) { + edm::Handle hin; + iEvent.getByToken(srcIntToken_, hin); + input += *hin; + } /// GPU work std::random_device r; @@ -111,6 +122,11 @@ void TestHeterogeneousEDProducerGPUMock::produceCPU(edm::HeterogeneousEvent& iEv iEvent.getByToken(srcToken_, hin); input = *hin; } + if(!srcIntToken_.isUninitialized()) { + edm::Handle hin; + iEvent.getByToken(srcIntToken_, hin); + input += *hin; + } std::random_device r; std::mt19937 gen(r()); @@ -138,6 +154,7 @@ void TestHeterogeneousEDProducerGPUMock::produceGPUMock(edm::HeterogeneousEvent& edm::LogPrint("TestHeterogeneousEDProducerGPUMock") << " " << label_ << " Task (GPU) for event " << eventId << " in stream " << streamId << " copying to CPU"; dst = src; }); + iEvent.put(std::make_unique(2)); edm::LogPrint("TestHeterogeneousEDProducerGPUMock") << label_ << " TestHeterogeneousEDProducerGPUMock::produceGPUMock end event " << iEvent.id().event() << " stream " << iEvent.streamID() << " result " << gpuOutput_; } diff --git a/HeterogeneousCore/Producer/test/testGPUMock_cfg.py b/HeterogeneousCore/Producer/test/testGPUMock_cfg.py index f6d4125f792df..8bfcf031a53c4 100644 --- a/HeterogeneousCore/Producer/test/testGPUMock_cfg.py +++ b/HeterogeneousCore/Producer/test/testGPUMock_cfg.py @@ -15,9 +15,12 @@ #process.Tracer = cms.Service("Tracer") process.prod1 = cms.EDProducer('TestHeterogeneousEDProducerGPUMock') -process.prod2= cms.EDProducer('TestHeterogeneousEDProducerGPUMock', +process.prod2 = cms.EDProducer('TestHeterogeneousEDProducerGPUMock', src = cms.InputTag("prod1") ) +process.prod3 = cms.EDProducer('TestHeterogeneousEDProducerGPUMock', + srcInt = cms.InputTag("prod1") +) #process.t = cms.Task(process.prod1, process.prod2) @@ -26,7 +29,7 @@ getDataForModuleLabels = cms.untracked.vstring("producer"), listContent = cms.untracked.bool(True), ) -process.p = cms.Path(process.prod1+process.prod2)#+process.eca) +process.p = cms.Path(process.prod1+process.prod2+process.prod3)#+process.eca) #process.p.associate(process.t) # Example of forcing module to run a specific device for one module via configuration From 0a4b5501feff7c30a60ad37b1bbd75789503ae2b Mon Sep 17 00:00:00 2001 From: Matti Kortelainen Date: Fri, 25 May 2018 11:33:49 +0200 Subject: [PATCH 50/88] Various updates to the heterogeneous framework (#54) - load CUDAService to ConfigBuilder - add support for product label - silence callback printout Eventually we need more general config file containing all device services. --- Configuration/Applications/python/ConfigBuilder.py | 2 ++ HeterogeneousCore/CUDACore/src/GPUCuda.cc | 2 +- HeterogeneousCore/Producer/interface/HeterogeneousEvent.h | 5 +++++ .../Producer/test/TestHeterogeneousEDProducerGPUMock.cc | 2 ++ 4 files changed, 10 insertions(+), 1 deletion(-) diff --git a/Configuration/Applications/python/ConfigBuilder.py b/Configuration/Applications/python/ConfigBuilder.py index 610f986a62d76..d48596f42bffa 100644 --- a/Configuration/Applications/python/ConfigBuilder.py +++ b/Configuration/Applications/python/ConfigBuilder.py @@ -916,6 +916,8 @@ def define_Configs(self): self.loadAndRemember('SimGeneral.HepPDTESSource.'+self._options.particleTable+'_cfi') self.loadAndRemember('FWCore/MessageService/MessageLogger_cfi') + # Eventually replace with some more generic file to load + self.loadAndRemember('HeterogeneousCore/CUDAServices/CUDAService_cfi') self.ALCADefaultCFF="Configuration/StandardSequences/AlCaRecoStreams_cff" self.GENDefaultCFF="Configuration/StandardSequences/Generator_cff" diff --git a/HeterogeneousCore/CUDACore/src/GPUCuda.cc b/HeterogeneousCore/CUDACore/src/GPUCuda.cc index 8686c8640a8b8..eb6b6ef6f8e78 100644 --- a/HeterogeneousCore/CUDACore/src/GPUCuda.cc +++ b/HeterogeneousCore/CUDACore/src/GPUCuda.cc @@ -69,7 +69,7 @@ namespace heterogeneous { ](cuda::stream::id_t streamId, cuda::status_t status) mutable { if(status == cudaSuccess) { locationSetter(HeterogeneousDeviceId(HeterogeneousDevice::kGPUCuda, deviceId)); - edm::LogPrint("GPUCuda") << " GPU kernel finished (in callback) device " << deviceId << " CUDA stream " << streamId; + LogTrace("GPUCuda") << " GPU kernel finished (in callback) device " << deviceId << " CUDA stream " << streamId; waitingTaskHolder.doneWaiting(nullptr); } else { diff --git a/HeterogeneousCore/Producer/interface/HeterogeneousEvent.h b/HeterogeneousCore/Producer/interface/HeterogeneousEvent.h index 05de3d871bc02..02366a2a92a36 100644 --- a/HeterogeneousCore/Producer/interface/HeterogeneousEvent.h +++ b/HeterogeneousCore/Producer/interface/HeterogeneousEvent.h @@ -65,6 +65,11 @@ namespace edm { return event_->put(std::move(product)); } + template + auto put(std::unique_ptr product, std::string const& productInstanceName) { + return event_->put(std::move(product), productInstanceName); + } + template void put(std::unique_ptr product) { assert(location().deviceType() == HeterogeneousDevice::kCPU); diff --git a/HeterogeneousCore/Producer/test/TestHeterogeneousEDProducerGPUMock.cc b/HeterogeneousCore/Producer/test/TestHeterogeneousEDProducerGPUMock.cc index ddb56530b702b..c19e66bd1fbc1 100644 --- a/HeterogeneousCore/Producer/test/TestHeterogeneousEDProducerGPUMock.cc +++ b/HeterogeneousCore/Producer/test/TestHeterogeneousEDProducerGPUMock.cc @@ -65,6 +65,7 @@ TestHeterogeneousEDProducerGPUMock::TestHeterogeneousEDProducerGPUMock(edm::Para produces(); produces(); + produces("foo"); } void TestHeterogeneousEDProducerGPUMock::fillDescriptions(edm::ConfigurationDescriptions& descriptions) { @@ -139,6 +140,7 @@ void TestHeterogeneousEDProducerGPUMock::produceCPU(edm::HeterogeneousEvent& iEv iEvent.put(std::make_unique(output)); iEvent.put(std::make_unique(1)); + iEvent.put(std::make_unique(2), "foo"); edm::LogPrint("TestHeterogeneousEDProducerGPUMock") << label_ << " TestHeterogeneousEDProducerGPUMock::produceCPU end event " << iEvent.id().event() << " stream " << iEvent.streamID() << " result " << output; } From 98846e38f4cfc157bcf0740dce31668ace912267 Mon Sep 17 00:00:00 2001 From: Andrea Bocci Date: Tue, 29 May 2018 11:21:19 +0200 Subject: [PATCH 51/88] Do not include x86 vector intrinsics when compiling with nvcc (#59) --- DataFormats/Math/interface/SIMDVec.h | 2 +- DataFormats/Math/interface/SSEVec.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/DataFormats/Math/interface/SIMDVec.h b/DataFormats/Math/interface/SIMDVec.h index 8049f08b4078c..67ef0e0d8c7b2 100644 --- a/DataFormats/Math/interface/SIMDVec.h +++ b/DataFormats/Math/interface/SIMDVec.h @@ -1,7 +1,7 @@ #ifndef DataFormat_Math_SIMDVec_H #define DataFormat_Math_SIMDVec_H -#if ( defined(__CLING__) || defined(__MIC__)) || (__BIGGEST_ALIGNMENT__<16) +#if ( defined(__CLING__) || defined(__MIC__) || defined(__NVCC__)) || (__BIGGEST_ALIGNMENT__<16) #elif defined(__GNUC__) || defined(__clang__) || defined(__INTEL_COMPILER) # if defined(__x86_64__) && defined(__SSE__) # define USE_SSEVECT diff --git a/DataFormats/Math/interface/SSEVec.h b/DataFormats/Math/interface/SSEVec.h index 3c1ea3be46cae..4221d130845cf 100644 --- a/DataFormats/Math/interface/SSEVec.h +++ b/DataFormats/Math/interface/SSEVec.h @@ -1,7 +1,7 @@ #ifndef DataFormat_Math_SSEVec_H #define DataFormat_Math_SSEVec_H -#if !defined(__arm__) && !defined(__aarch64__) && !defined(__MIC__) && !defined(__powerpc64__) && !defined(__PPC64__) && !defined(__powerpc__) +#if !defined(__arm__) && !defined(__aarch64__) && !defined(__MIC__) && !defined(__powerpc64__) && !defined(__PPC64__) && !defined(__powerpc__) && !defined(__NVCC__) #if defined(__GNUC__) #include #define CMS_USE_SSE From 402490c077588c8fcb25841ada0a1d2ebcce645c Mon Sep 17 00:00:00 2001 From: Viktor Khristenko Date: Tue, 29 May 2018 11:37:08 +0200 Subject: [PATCH 52/88] constexpr for DetId member functions (#55) Included upstream via cms-sw/cmssw#23332 --- DataFormats/DetId/interface/DetId.h | 40 ++++++++++++++-------------- DataFormats/DetId/test/BuildFile.xml | 4 +++ DataFormats/DetId/test/test_detid.cu | 37 +++++++++++++++++++++++++ 3 files changed, 61 insertions(+), 20 deletions(-) create mode 100644 DataFormats/DetId/test/BuildFile.xml create mode 100644 DataFormats/DetId/test/test_detid.cu diff --git a/DataFormats/DetId/interface/DetId.h b/DataFormats/DetId/interface/DetId.h index 9607bc88280bc..09d3d22577ffe 100644 --- a/DataFormats/DetId/interface/DetId.h +++ b/DataFormats/DetId/interface/DetId.h @@ -27,47 +27,47 @@ class DetId { VeryForward=7, HGCalEE=8, HGCalHSi=9, HGCalHSc=10, HGCalTrigger=11}; /// Create an empty or null id (also for persistence) - DetId() : id_(0) { } + constexpr DetId() : id_(0) { } /// Create an id from a raw number - DetId(uint32_t id) : id_(id) { } + constexpr DetId(uint32_t id) : id_(id) { } /// Create an id, filling the detector and subdetector fields as specified - DetId(Detector det, int subdet) { - id_=((det&kDetMask)<>kDetOffset)&kDetMask); } + constexpr Detector det() const { return Detector((id_>>kDetOffset)&kDetMask); } /// get the contents of the subdetector field (not cast into any detector's numbering enum) - int subdetId() const { return ((id_>>kSubdetOffset)&kSubdetMask); } + constexpr int subdetId() const { return ((id_>>kSubdetOffset)&kSubdetMask); } - uint32_t operator()() const { return id_; } - operator uint32_t() const { return id_; } + constexpr uint32_t operator()() const { return id_; } + constexpr operator uint32_t() const { return id_; } /// get the raw id - uint32_t rawId() const { return id_; } + constexpr uint32_t rawId() const { return id_; } /// is this a null id ? - bool null() const { return id_==0; } + constexpr bool null() const { return id_==0; } /// equality - bool operator==(DetId id) const { return id_==id.id_; } + constexpr bool operator==(DetId id) const { return id_==id.id_; } /// inequality - bool operator!=(DetId id) const { return id_!=id.id_; } + constexpr bool operator!=(DetId id) const { return id_!=id.id_; } /// comparison - bool operator<(DetId id) const { return id_ + + + diff --git a/DataFormats/DetId/test/test_detid.cu b/DataFormats/DetId/test/test_detid.cu new file mode 100644 index 0000000000000..ec993a9a1ce39 --- /dev/null +++ b/DataFormats/DetId/test/test_detid.cu @@ -0,0 +1,37 @@ +#include +#include + +#include +#include +#include "DataFormats/DetId/interface/DetId.h" +#include "DataFormats/HcalDetId/interface/HcalDetId.h" + +__global__ void test_gen_detid(DetId* id, int const rawid) { + DetId did{rawid}; + *id = did; +} + +void test_detid() { + // test det ids + DetId h_id, h_id_test{100}; + DetId h_test0{1}; + DetId *d_id; + + cudaMalloc((void**)&d_id, sizeof(DetId)); + cudaMemcpy(d_id, &h_id, sizeof(DetId), cudaMemcpyHostToDevice); + test_gen_detid<<<1,1>>>(d_id, 100); + cudaMemcpy(&h_id, d_id, sizeof(DetId), cudaMemcpyDeviceToHost); + + assert(h_id_test == h_id); + assert(h_id != h_test0); +} + +int main(int argc, char** argv) { + int nDevices; + cudaGetDeviceCount(&nDevices); + std::cout << "nDevices = " << nDevices << std::endl; + + // test det id functionality + if (nDevices > 0) + test_detid(); +} From 4b47b5993fe2860e849a55f51e6c18c75cde0e62 Mon Sep 17 00:00:00 2001 From: Matti Kortelainen Date: Tue, 29 May 2018 12:21:36 +0200 Subject: [PATCH 53/88] Add a copy constructor to edmNew::DetSetVector (#56) - implement copy constructor of `edmNew::DetSetVector` - fix the move constructor - use '=default' for `DetSetVector` --- .../Common/interface/DetSetVectorNew.h | 25 +++++++++-- DataFormats/Common/test/DetSetNew_t.cpp | 41 +++++++++++++++++++ 2 files changed, 62 insertions(+), 4 deletions(-) diff --git a/DataFormats/Common/interface/DetSetVectorNew.h b/DataFormats/Common/interface/DetSetVectorNew.h index 8eac96a356e9a..1f6a4154a6fb0 100644 --- a/DataFormats/Common/interface/DetSetVectorNew.h +++ b/DataFormats/Common/interface/DetSetVectorNew.h @@ -57,10 +57,23 @@ namespace edmNew { DetSetVectorTrans(): m_filling(false), m_dataSize(0){} DetSetVectorTrans& operator=(const DetSetVectorTrans&) = delete; - DetSetVectorTrans(const DetSetVectorTrans&) = delete; - DetSetVectorTrans(DetSetVectorTrans&& rh) { // can't be default because of atomics + + DetSetVectorTrans(const DetSetVectorTrans& rh): // can't be default because of atomics + m_filling(false) { // better no one is filling... - assert(m_filling==false); assert(rh.m_filling==false); + assert(rh.m_filling==false); + m_getter = rh.m_getter; +#ifdef DSVN_USE_ATOMIC + m_dataSize.store(rh.m_dataSize.load()); +#else + m_dataSize = rh.m_dataSize; +#endif + } + + DetSetVectorTrans(DetSetVectorTrans&& rh): // can't be default because of atomics + m_filling(false) { + // better no one is filling... + assert(rh.m_filling==false); m_getter = std::move(rh.m_getter); #ifdef DSVN_USE_ATOMIC m_dataSize.store(rh.m_dataSize.exchange(m_dataSize.load())); @@ -429,7 +442,11 @@ namespace edmNew { // default or delete is the same... DetSetVector& operator=(const DetSetVector&) = delete; - DetSetVector(const DetSetVector&) = delete; + // Implement copy constructor because of a (possibly temporary) + // need in heterogeneous framework prototyping. In general this + // class is still supposed to be non-copyable, so to prevent + // accidental copying the assignment operator is left deleted. + DetSetVector(const DetSetVector&) = default; DetSetVector(DetSetVector&&) = default; DetSetVector& operator=(DetSetVector&&) = default; diff --git a/DataFormats/Common/test/DetSetNew_t.cpp b/DataFormats/Common/test/DetSetNew_t.cpp index 39fe7a87b3228..3c6e966f623b3 100644 --- a/DataFormats/Common/test/DetSetNew_t.cpp +++ b/DataFormats/Common/test/DetSetNew_t.cpp @@ -125,6 +125,16 @@ void TestDetSet::default_ctor() { CPPUNIT_ASSERT(detsets.subdetId()==4); CPPUNIT_ASSERT(detsets.size()==0); CPPUNIT_ASSERT(detsets.dataSize()==0); + DSTV detsets5(std::move(detsets)); + CPPUNIT_ASSERT(detsets5.subdetId()==4); + CPPUNIT_ASSERT(detsets5.size()==0); + CPPUNIT_ASSERT(detsets5.dataSize()==0); + + // test copy + DSTV detsets4(detsets5); + CPPUNIT_ASSERT(detsets4.subdetId()==4); + CPPUNIT_ASSERT(detsets4.size()==0); + CPPUNIT_ASSERT(detsets4.dataSize()==0); } void TestDetSet::inserting() { @@ -143,11 +153,19 @@ void TestDetSet::inserting() { std::copy(sv.begin(),sv.begin()+n,df.begin()); + DSTV detsets2(detsets); + CPPUNIT_ASSERT(detsets2.size()==n); + CPPUNIT_ASSERT(detsets2.dataSize()==ntot); + CPPUNIT_ASSERT(detsets2.detsetSize(n-1)==n); + std::vector v1(n); std::vector v2(n); + std::vector v3(n); std::copy(detsets.m_data.begin()+ntot-n,detsets.m_data.begin()+ntot,v2.begin()); + std::copy(detsets2.m_data.begin()+ntot-n,detsets2.m_data.begin()+ntot,v3.begin()); std::copy(sv.begin(),sv.begin()+n,v1.begin()); CPPUNIT_ASSERT(v1==v2); + CPPUNIT_ASSERT(v1==v3); } // test error conditions @@ -215,6 +233,12 @@ void TestDetSet::filling() { CPPUNIT_ASSERT(detsets.size()==5); CPPUNIT_ASSERT(detsets.exists(30)); + { + DSTV detsets2(detsets); + CPPUNIT_ASSERT(detsets2.size()==5); + CPPUNIT_ASSERT(detsets2.exists(30)); + } + { unsigned int cs = detsets.dataSize(); FF ff1(detsets, 31); @@ -232,11 +256,23 @@ void TestDetSet::filling() { CPPUNIT_ASSERT(!detsets.exists(31)); { FF ff1(detsets, 32,true); } CPPUNIT_ASSERT(detsets.size()==6); + + DSTV detsets2(detsets); + CPPUNIT_ASSERT(detsets2.size()==6); + detsets.clean(); CPPUNIT_ASSERT(detsets.size()==4); CPPUNIT_ASSERT(!detsets.exists(30)); CPPUNIT_ASSERT(!detsets.exists(32)); + CPPUNIT_ASSERT(detsets2.size()==6); + CPPUNIT_ASSERT(detsets2.exists(30)); + CPPUNIT_ASSERT(detsets2.exists(32)); + detsets2.clean(); + CPPUNIT_ASSERT(detsets2.size()==4); + CPPUNIT_ASSERT(!detsets2.exists(30)); + CPPUNIT_ASSERT(!detsets2.exists(32)); + // test error conditions try { FF ff1(detsets, 22); @@ -601,6 +637,11 @@ void TestDetSet::onDemand() { DSTV detsets3; detsets3 = std::move(detsets2); CPPUNIT_ASSERT(detsets3.onDemand()); + DSTV detsets5(std::move(detsets3)); + CPPUNIT_ASSERT(detsets5.onDemand()); + + DSTV detsets4(detsets5); + CPPUNIT_ASSERT(detsets4.onDemand()); } void TestDetSet::toRangeMap() { From b2055cd9628a5f0d64687bc11faea8fe46b0af99 Mon Sep 17 00:00:00 2001 From: Matti Kortelainen Date: Wed, 30 May 2018 11:58:37 +0200 Subject: [PATCH 54/88] Add heterogeneous framework documentation and some sanity checks in GPUCuda (#61) - add some sanity checks - add a minimal documentation of the heterogeneous framework --- HeterogeneousCore/CUDACore/src/GPUCuda.cc | 9 +- HeterogeneousCore/Producer/README.md | 347 +++++++++++++++++++++- 2 files changed, 354 insertions(+), 2 deletions(-) diff --git a/HeterogeneousCore/CUDACore/src/GPUCuda.cc b/HeterogeneousCore/CUDACore/src/GPUCuda.cc index eb6b6ef6f8e78..81e0a66f375e2 100644 --- a/HeterogeneousCore/CUDACore/src/GPUCuda.cc +++ b/HeterogeneousCore/CUDACore/src/GPUCuda.cc @@ -12,7 +12,11 @@ namespace heterogeneous { GPUCuda::GPUCuda(const edm::ParameterSet& iConfig): enabled_(iConfig.getUntrackedParameter("GPUCuda")), forced_(iConfig.getUntrackedParameter("force") == "GPUCuda") - {} + { + if(forced_ && !enabled_) { + throw cms::Exception("Configuration") << "It makes no sense to force the module on GPUCuda, and then disable GPUCuda."; + } + } GPUCuda::~GPUCuda() noexcept(false) {} @@ -24,6 +28,9 @@ namespace heterogeneous { edm::Service cudaService; enabled_ = (enabled_ && cudaService->enabled()); if(!enabled_) { + if(forced_) { + throw cms::Exception("LogicError") << "This module was forced to run on GPUCuda, but the device is not available."; + } return; } diff --git a/HeterogeneousCore/Producer/README.md b/HeterogeneousCore/Producer/README.md index b66be0f445705..595dec70e1006 100644 --- a/HeterogeneousCore/Producer/README.md +++ b/HeterogeneousCore/Producer/README.md @@ -101,6 +101,10 @@ particular order). * Add fault tolerance - E.g. in a case of a GPU running out of memory continue with CPU - Should be configurable +* Add support for multiple heterogeneous inputs for a module + - Currently the device scheduling is based only on the "first input" + - Clearly this is inadequate in general and needs to be improved + - Any better suggestions than taking `and` of all locations? * Improve resource monitoring - E.g. for CUDA device utilization * https://docs.nvidia.com/deploy/nvml-api/group__nvmlDeviceQueries.html#group__nvmlDeviceQueries_1g540824faa6cef45500e0d1dc2f50b321 @@ -120,4 +124,345 @@ particular order). # HeterogeneousEDProducer -To be written. \ No newline at end of file +`HeterogeneousEDProducer` is implemented as a `stream::EDProducer` using the +[`ExternalWork` extension](https://twiki.cern.ch/twiki/bin/view/CMSPublic/FWMultithreadedFrameworkStreamModuleInterface#edm_ExternalWork). + +## Configuration + +`HeterogeneousEDProducer` requires `heterogeneousEnabled_` `cms.PSet` +to be available in the module configuration. The `PSet` can be used to +override module-by-module which devices can be used by that module. +The structure of the `PSet` are shown in the following example + +```python +process.foo = cms.EDModule("FooProducer", + a = cms.int32(1), + b = cms.VPSet(...), + ... + heterogeneousEnabled_ = cms.untracked.PSet( + GPUCuda = cms.untracked.bool(True), + FPGA = cms.untracked.bool(False), # forbid the module from running on a device type (note that we don't support FPGA devices at the moment though) + force = cms.untracked.string("GPUCuda") # force the module to run on a specific device type + ) +) +``` + +The difference between the boolean flags and the `force` parameter is the following +* The boolean flags control whether the algorithm can be scheduled on the individual device type or not +* The `force` parameter implies that the algorithm is always scheduled on that device type no matter what. If the device type is not available on the machine, an exception is thrown. + +Currently, with only CUDA GPU and CPU support, this level of configurability is a bit overkill though. + +## Class declaration + +In order to use the `HeterogeneousEDProducer` the `EDProducer` class +must inherit from `HeterogeneousEDProducer<...>`. The devices, which +the `EDProducer` is supposed to support, are given as a template +argument via `heterogeneous::HeterogeneousDevices<...>`. The usual +[stream producer extensions](https://twiki.cern.ch/twiki/bin/view/CMSPublic/FWMultithreadedFrameworkStreamModuleInterface#Template_Arguments) +can be also passed via additional template arguments. + +```cpp +#include "HeterogeneousCore/Producer/interface/HeterogeneousEDProducer.h" +#include "HeterogeneousCore/CUDACore/interface/GPUCuda.h" // needed for heterogeneous::GPUCuda + +class FooProducer: public HeterogeneousEDProducer< + heterogeneous::HeterogeneousDevices< + heterogeneous::GPUCuda, + heterogeneous::CPU + > + // here you can pass any stream producer extensions +> { + ... + +``` + +In this example the `FooProducer` declares that prodives +implementations for CUDA GPU and CPU. Note that currently CPU is +mandatory, and it has to be the last argument. The order of the +devices dictates the order that the algorithm is scheduled to the +devices. E.g. in this example, the system runs the algorithm in GPU if +it can, and only if it can not, in CPU. For the list of supported +device types, see the [list below](#devices). + +## Constructor + +`HeterogeneousEDProducer` needs access to the configuration, so it has +to be passed to its constructor as in the following example + +```cpp +FooProducer::FooProducer(edm::ParameterSet const& iConfig): + HeterogeneousEDProducer(iConfig), + ... +``` +### Consumes + +If the `EDProducer` reads any `HeterogeneousProduct`'s +([see more details](#heterogeneousproduct)), the `consumes()` call +should be made along the following + +```cpp +class FooProducer ... { + ... + EDGetTokenT token_; +}; +... +FooProducer::FooProducer(edm::ParameterSet const& iConfig): + ... + token_(consumesHeterogeneous(iConfig.getParameter("..."))), + ... +``` + +so that `HeterogeneousEDProducer` can inspect the location of input +heterogeneous products to decide on which device to run the algorithm +([see more details](#device-scheduling)). + +### Produces + +If the `EDProducer` produces any `HeterogeneousProduct`'s +([see more details](#heterogeneousproduct)), the `produces()` call +should be made along the following (i.e. as usual) + +```cpp +FooProducer::FooProducer(edm::ParameterSet const& iConfig) ... { + ... + produces(); +} +``` + +## fillDescriptions() + +`HeterogeneousEDProducer` provides a `fillPSetDescription()` function +that can be called from the concrete `EDProducer`'s +`fillDescriptions()` as in the following example + +```cpp +void FooProducer::fillDescriptions(edm::ConfigurationDescriptions& descriptions) { + edm::ParameterSetDescription desc; + + // fill desc for other parameters + + HeterogeneousEDProducer::fillPSetDescription(desc); + + descriptions.add("fooProducer", desc); +} +``` + +## Device scheduling + +The per-event scheduling of algorithms is currently as follows +1. If there are no `HeterogeneousProduct` inputs ([see more details](#heterogeneousproduct)) + * Loop over the device types in the order specified in `heterogeneous::HeterogeneousDevices<...>` template arguments + * Run the algorithm on the first device that is enabled for that module (instance) +2. If there are `HeterogeneousProduct` inputs + * Run the algorithm on **the device where the data of the first input resides** + +## HeterogeneousProduct + +The `HeterogeneousProduct` is a transient edm product with the following properties +* placeholder for products (of arbitrary types) in all device types +* tracks the location of the data +* automatic, on-demand transfers from device to CPU + - developer has to provide a function to do the transfer and possible data reorganiazation + +Some of the complexity exists to avoid ROOT dictionary generation of the concrete product types. + +## HeterogeneousEvent + +The `HeterogeneousEvent` is a wrapper on top of `edm::Event` to hide +most of the complexity of `HeterogeneousProduct` to make its use look +almost like standard products with `edm::Event`. Some part of the +`edm::Event` interface is implemented (and delegated back to +`edm::Event`) in order to get/put standard products as well. + +Here is a short example how to deal use `HeterogeneousProduct` with +`HeterogeneousEvent` (using the same `FooProducer` example as before) + +```cpp +class FooProducer ... { + ... + // in principle these definitions should be treated like DataFormats + struct CPUProduct { + std::vector foo; + }; + struct GPUProduct { + float *foo_d; // pointer to GPU memory + } + + using InputType = HeterogeneousProductImpl, + heterogeneous::GPUProduct>; + using OutputType = InputType; // using same input and output only because of laziness + + void transferGPUtoCPU(GPUProduct const& gpu, CPUProduct& cpu) const; +}; + +void FooProducer::produceCPU(edm::HeterogeneousEvent const& iEvent, ...) { + edm::Handle hinput; + iEvent.getByToken(token_, hinput); // note the InputType template argument + + // do whatever you want with hinput->foo; + + auto output = std::make_unique(...); + iEvent.put(std::move(output)); // note the OutputType template argument +} + +void FooProducer::acquireGPUCuda(edm::HeterogeneousEvent const& iEvent, ...) { + edm::Handle hinput; + iEvent.getByToken(token_, hinput); // note the InputType template argument + + // do whatever you want with hinput->foo_d; + + auto output = std::make_unique(...); + // For non-CPU products, a GPU->CPU transfer function must be provided + // In this example it is prodided as a lambda calling a member function, but this is not required + // The function can be anything assignable to std::function + iEvent.put(std::move(output), [this](GPUProduct const& gpu, CPUProduct& cpu) { // note the OutputType template argument + this->transferGPUtoCPU(gpu, cpu); + }); + // It is also possible to disable the GPU->CPU transfer + // If the data resides on a GPU, and the corresponding CPU product is requested, an exception is thrown + //iEvent.put(std::move(output), heterogeneous::DisableTransfer); // note the OutputType template argument +} + +``` + + +## Devices + +This section documents which functions the `EDProducer` can/has to +implement for various devices. + +### CPU + +A CPU implementation is declared by giving `heterogeneous::CPU` as a +template argument to `heterogeneous::HeterogeneousDevices`. Currently +it is a mandatory argument, and has to be the last one (i.e. there +must always be a CPU implementation, which is used as the last resort +if there are no other devices). + +#### Optional functions + +There is one optional function + +```cpp +void beginStreamCPU(edm::StreamID id); +``` + +which is called at the beginning of an `edm::Stream`. Usually there is +no need to implement it, but the possibility is provided in case it is +needed for something (as the `stream::EDProducer::beginStream()` is +overridden by `HeterogeneousEDProducer`). + +#### Mandatory functions + +There is one mandatory function + +```cpp +void produceCPU(edm::HeterogeneousEvent& iEvent, edm::EventSetup const& iSetup); +``` + +which is almost equal to the usual `stream::EDProducer::produce()` +function. It is called from `HeterogeneousEDProducer::produce()` if +the device scheduler decides that the algorithm should be run on CPU +([see more details](#device-scheduling)). The first argument is +`edm::HeterogeneousEvent` instead of the usual `edm::Event` +([see more details](#heterogeneousevent)). + +The function should read its input, run the algorithm, and put the +output to the event. + +### CUDA GPU + +A CUDA GPU implementation is declared by giving +`heterogeneous::GPUCuda` as a template argument to +`heterogeneous::HeterogeneousDevices`. The following `#include` is +also needed +```cpp +#include "HeterogeneousCore/CUDACore/interface/GPUCuda.h" +``` +#### Optional functions + +There is one optional function + +```cpp +void beginStreamGPUCuda(edm::StreamID id, cuda::stream_t<>& cudaStream); +``` + +which is called at the beginning of an `edm::Stream`. **If the +algorithm has to allocate memory buffers for the duration of the whole +job, the recommended place is here.** The current CUDA device is set +by the framework before the call, and all asynchronous tasks should be +enqueued to the CUDA stream given as an argument. + +Currently the very same CUDA stream object will be given to the +`acquireGPUCuda()` and `produceGPUCuda()` for this `edm::Stream`. This +may change in the future though, in which case it will still be +guaranteed that the CUDA stream here will be synchronized before the +first call to `acquireGPUCuda()`. + +#### Mandatory functions + +There are two mandatory functions: + +```cpp +void acquireGPUCuda(edm::HeterogeneousEvent const& iEvent, edm::EventSetup const& iSetup, cuda::stream_t<>& cudaStream); +``` + +The `acquireGPUCuda()` is called from +`HeterogeneousEDProducer::acquire()` if the device scheduler devices +that the algorithm should be run on a CUDA GPU +([see more details](#device-scheduling)). The function should read +the necessary input (which may possibly be already on a GPU, +([see more details](#heterogeneousproduct)), and enqueue the +*asynchronous* work on the CUDA stream given as an argument. The +current CUDA deviceis set by the framework before the call. After the +`acquireGPUCuda()` returns, framework will itself enqueue a callback +function to the CUDA stream that will call +`edm::WaitingTaskWithArenaHolder::doneWaiting()` to signal to the +framework that this `EDProducer` is ready to transition to +`produce()`. + +Currently the very same CUDA stream will be given to the +`produceGPUCuda()`. + + +```cpp +void produceGPUCuda(edm::HeterogeneousEvent& iEvent, edm::EventSetup const& iSetup, cuda::stream_t<>& cudaStream); +``` + +The `produceGPUCuda()` is called from +`HeterogeneousEDProducer::produce()` if the algorithm was run on a +CUDA GPU. The function should do any necessary GPU->CPU transfers, +post-processing, and put the products to the event (for passing "GPU +products" [see here](#heterogeneousproduct)). + +#### Memory allocations + +The `cudaMalloc()` is somewhat heavy function (synchronizing the whole +device, among others). The current strategy (although not enforced by +the framework) is to allocate memory buffers at the beginning of a +job. It is recommended to do these allocations in the +`beginStreamGPUCuda()`, as it is called exactly once per job per +`stream::EDProducer` instance, and it is the earliest point in the +framework where we have the concept of `edm::Stream` so that the +framework can assign the `edm::Stream`s to CUDA devices +([see more details](#multipledevices)). + +Freeing the GPU memory can be done in the destructor as it does not +require any special support from the framework. + +#### Multiple devices + +Currently `edm::Stream`'s are statically assigned to CUDA devices in a +round-robin fashion. The assignment is done at the `beginStream()` +time before calling the `EDProducer` `beginStreamDevice()` functions. + +Technically "assigning `edm::Stream`" means that each relevant +`EDProducer` instance of that `edm::Stream` will hold a device id of +`streamId % numberOfDevices`. + +### Mock GPU + +The `GPUMock` is intended only for testing of the framework as a +something requiring a GPU-like interface but still ran on the CPU. The +documentation is left to be the code itself. From f6a812428104962e7af15e123a6e06bf8779564e Mon Sep 17 00:00:00 2001 From: Matti Kortelainen Date: Mon, 4 Jun 2018 11:26:15 +0200 Subject: [PATCH 55/88] Implement a Heterogeneous version of Raw2Cluster and RecHit (#62) - reorganize `SiPixelRawToDigi` as `SiPixelRawToDigiHeterogeneous` using `HeterogeneousEDProducer` - output a `HeterogeneousEvent` - use `PixelThresholdClusterizer` - add `SiPixelDigiHeterogeneousConverter` - make cabling and gain transfers asynchronous - reorganize `SiPixelRecHits` as `SiPixelRecHitHeterogeneous` - move `PixelThresholdClusterizer` (back?) to interface+src in order to use it outside of RecoLocalTracker/SiPixelClusterizer - replace __host__ __device__ with constexpr to avoid weird compilation failures - split clusters to their own converter --- .../StandardSequences/python/RawToDigi_cff.py | 10 +- .../python/Reconstruction_cff.py | 2 - .../python/pixelTracksMonitoring_cff.py | 3 - .../SiPixelRawToDigi/plugins/BuildFile.xml | 7 +- .../SiPixelClusterHeterogeneousConverter.cc | 55 ++ .../SiPixelDigiHeterogeneousConverter.cc | 69 ++ .../plugins/SiPixelFedCablingMapGPU.cc | 39 +- .../plugins/SiPixelFedCablingMapGPU.h | 9 +- ...nel.cu => SiPixelRawToClusterGPUKernel.cu} | 226 +++--- ...ernel.h => SiPixelRawToClusterGPUKernel.h} | 108 ++- .../SiPixelRawToClusterHeterogeneous.cc | 674 ++++++++++++++++++ .../plugins/SiPixelRawToDigiGPU.cc | 587 --------------- .../plugins/SiPixelRawToDigiGPU.h | 94 --- .../siPixelRawToClusterHeterogeneousProduct.h | 64 ++ .../python/SiPixelRawToDigi_cfi.py | 30 +- .../python/siPixelDigisHeterogeneous_cfi.py | 37 + .../CUDAUtilities/interface/GPUSimpleVector.h | 24 +- .../SiPixelClusterizer/BuildFile.xml | 9 + .../PixelClusterizerBase.h | 0 .../PixelThresholdClusterizer.h | 6 +- .../SiPixelArrayBuffer.h | 0 .../SiPixelClusterizer/plugins/BuildFile.xml | 6 +- .../plugins/SiPixelClusterProducer.cc | 2 +- .../plugins/SiPixelClusterProducer.h | 2 +- .../plugins/gpuClustering.h | 9 +- .../plugins/gpuClusteringConstants.h | 14 + .../python/SiPixelClusterizer_cfi.py | 4 + .../PixelThresholdClusterizer.cc | 4 +- .../SiPixelRecHits/plugins/BuildFile.xml | 4 + .../SiPixelRecHits/plugins/PixelRecHits.cu | 119 ++-- .../SiPixelRecHits/plugins/PixelRecHits.h | 73 +- .../plugins/SiPixelRecHitGPU.cc | 280 -------- .../plugins/SiPixelRecHitHeterogeneous.cc | 267 +++++++ .../SiPixelRecHits/plugins/gpuPixelRecHits.h | 6 +- .../python/SiPixelRecHitsGPU_cfi.py | 7 - .../python/SiPixelRecHits_cfi.py | 5 +- .../RecoTrack/python/TrackValidation_cff.py | 2 - 37 files changed, 1591 insertions(+), 1266 deletions(-) create mode 100644 EventFilter/SiPixelRawToDigi/plugins/SiPixelClusterHeterogeneousConverter.cc create mode 100644 EventFilter/SiPixelRawToDigi/plugins/SiPixelDigiHeterogeneousConverter.cc rename EventFilter/SiPixelRawToDigi/plugins/{SiPixelRawToDigiGPUKernel.cu => SiPixelRawToClusterGPUKernel.cu} (74%) rename EventFilter/SiPixelRawToDigi/plugins/{SiPixelRawToDigiGPUKernel.h => SiPixelRawToClusterGPUKernel.h} (62%) create mode 100644 EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToClusterHeterogeneous.cc delete mode 100644 EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc delete mode 100644 EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.h create mode 100644 EventFilter/SiPixelRawToDigi/plugins/siPixelRawToClusterHeterogeneousProduct.h create mode 100644 EventFilter/SiPixelRawToDigi/python/siPixelDigisHeterogeneous_cfi.py create mode 100644 RecoLocalTracker/SiPixelClusterizer/BuildFile.xml rename RecoLocalTracker/SiPixelClusterizer/{plugins => interface}/PixelClusterizerBase.h (100%) rename RecoLocalTracker/SiPixelClusterizer/{plugins => interface}/PixelThresholdClusterizer.h (96%) rename RecoLocalTracker/SiPixelClusterizer/{plugins => interface}/SiPixelArrayBuffer.h (100%) create mode 100644 RecoLocalTracker/SiPixelClusterizer/plugins/gpuClusteringConstants.h rename RecoLocalTracker/SiPixelClusterizer/{plugins => src}/PixelThresholdClusterizer.cc (99%) delete mode 100644 RecoLocalTracker/SiPixelRecHits/plugins/SiPixelRecHitGPU.cc create mode 100644 RecoLocalTracker/SiPixelRecHits/plugins/SiPixelRecHitHeterogeneous.cc delete mode 100644 RecoLocalTracker/SiPixelRecHits/python/SiPixelRecHitsGPU_cfi.py diff --git a/Configuration/StandardSequences/python/RawToDigi_cff.py b/Configuration/StandardSequences/python/RawToDigi_cff.py index 91be75a8fff53..7c85f098785a4 100644 --- a/Configuration/StandardSequences/python/RawToDigi_cff.py +++ b/Configuration/StandardSequences/python/RawToDigi_cff.py @@ -4,6 +4,7 @@ # scenarios. In this case it makes changes for Run 2. from EventFilter.SiPixelRawToDigi.SiPixelRawToDigi_cfi import * +from EventFilter.SiPixelRawToDigi.siPixelDigisHeterogeneous_cfi import * from EventFilter.SiStripRawToDigi.SiStripDigis_cfi import * @@ -59,6 +60,10 @@ +tcdsDigis +onlineMetaDataDigis ) +from Configuration.ProcessModifiers.gpu_cff import gpu +_RawToDigi_gpu = RawToDigi.copy() +_RawToDigi_gpu.replace(siPixelDigis, siPixelDigisHeterogeneous+siPixelDigis) +gpu.toReplaceWith(RawToDigi, _RawToDigi_gpu) RawToDigi_noTk = cms.Sequence(L1TRawToDigi +ecalDigis @@ -73,10 +78,11 @@ +onlineMetaDataDigis ) -RawToDigi_pixelOnly = cms.Sequence(siPixelDigis) +RawToDigi_pixelOnly = cms.Sequence(siPixelDigisHeterogeneous+siPixelDigis) scalersRawToDigi.scalersInputTag = 'rawDataCollector' -siPixelDigis.InputLabel = 'rawDataCollector' +siPixelDigisHeterogeneous.InputLabel = 'rawDataCollector' +(~gpu).toModify(siPixelDigis, InputLabel = 'rawDataCollector') #false by default anyways ecalDigis.DoRegional = False ecalDigis.InputLabel = 'rawDataCollector' ecalPreshowerDigis.sourceTag = 'rawDataCollector' diff --git a/Configuration/StandardSequences/python/Reconstruction_cff.py b/Configuration/StandardSequences/python/Reconstruction_cff.py index 9b4d5dc8ceb8c..10a602c68f1bc 100644 --- a/Configuration/StandardSequences/python/Reconstruction_cff.py +++ b/Configuration/StandardSequences/python/Reconstruction_cff.py @@ -12,12 +12,10 @@ from RecoPixelVertexing.PixelLowPtUtilities.siPixelClusterShapeCache_cfi import * from Configuration.Eras.Modifier_fastSim_cff import fastSim -from Configuration.ProcessModifiers.gpu_cff import gpu siPixelClusterShapeCachePreSplitting = siPixelClusterShapeCache.clone( src = 'siPixelClustersPreSplitting' ) -gpu.toModify(siPixelClusterShapeCachePreSplitting, src = "siPixelDigis") # Global reco from RecoEcal.Configuration.RecoEcal_cff import * diff --git a/DQM/TrackingMonitorSource/python/pixelTracksMonitoring_cff.py b/DQM/TrackingMonitorSource/python/pixelTracksMonitoring_cff.py index 711d757c94311..c91dc2b2730de 100644 --- a/DQM/TrackingMonitorSource/python/pixelTracksMonitoring_cff.py +++ b/DQM/TrackingMonitorSource/python/pixelTracksMonitoring_cff.py @@ -1,5 +1,4 @@ import FWCore.ParameterSet.Config as cms -from Configuration.ProcessModifiers.gpu_cff import gpu import DQM.TrackingMonitor.TrackerCollisionTrackingMonitor_cfi pixelTracksMonitoring = DQM.TrackingMonitor.TrackerCollisionTrackingMonitor_cfi.TrackerCollisionTrackMon.clone() @@ -21,5 +20,3 @@ pixelTracksMonitoring.doPlotsVsGoodPVtx = True pixelTracksMonitoring.doPlotsVsLUMI = True pixelTracksMonitoring.doPlotsVsBX = True - -gpu.toModify(pixelTracksMonitoring, pixelCluster4lumi = "siPixelDigis") diff --git a/EventFilter/SiPixelRawToDigi/plugins/BuildFile.xml b/EventFilter/SiPixelRawToDigi/plugins/BuildFile.xml index 3e047e2f90b57..0f46385a6e608 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/BuildFile.xml +++ b/EventFilter/SiPixelRawToDigi/plugins/BuildFile.xml @@ -2,8 +2,13 @@ - + + + + + + diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelClusterHeterogeneousConverter.cc b/EventFilter/SiPixelRawToDigi/plugins/SiPixelClusterHeterogeneousConverter.cc new file mode 100644 index 0000000000000..c947888e5c264 --- /dev/null +++ b/EventFilter/SiPixelRawToDigi/plugins/SiPixelClusterHeterogeneousConverter.cc @@ -0,0 +1,55 @@ +#include "FWCore/Framework/interface/Event.h" +#include "FWCore/Framework/interface/MakerMacros.h" +#include "FWCore/Framework/interface/global/EDProducer.h" +#include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h" +#include "FWCore/ParameterSet/interface/ParameterSetDescription.h" +#include "FWCore/ParameterSet/interface/ParameterSet.h" +#include "HeterogeneousCore/Product/interface/HeterogeneousProduct.h" + +#include "siPixelRawToClusterHeterogeneousProduct.h" + +class SiPixelClusterHeterogeneousConverter: public edm::global::EDProducer<> { +public: + explicit SiPixelClusterHeterogeneousConverter(edm::ParameterSet const& iConfig); + ~SiPixelClusterHeterogeneousConverter() = default; + + static void fillDescriptions(edm::ConfigurationDescriptions& descriptions); + +private: + void produce(edm::StreamID, edm::Event& iEvent, const edm::EventSetup& iSetup) const override; + + edm::EDGetTokenT token_; +}; + +SiPixelClusterHeterogeneousConverter::SiPixelClusterHeterogeneousConverter(edm::ParameterSet const& iConfig): + token_(consumes(iConfig.getParameter("src"))) +{ + produces >(); + produces(); +} + +void SiPixelClusterHeterogeneousConverter::fillDescriptions(edm::ConfigurationDescriptions& descriptions) { + edm::ParameterSetDescription desc; + desc.add("src", edm::InputTag("siPixelDigisHeterogeneous")); + + descriptions.addWithDefaultLabel(desc); +} + +namespace { + template + auto copy_unique(const T& t) { + return std::make_unique(t); + } +} + +void SiPixelClusterHeterogeneousConverter::produce(edm::StreamID, edm::Event& iEvent, const edm::EventSetup& iSetup) const { + edm::Handle hinput; + iEvent.getByToken(token_, hinput); + + const auto& input = hinput->get().getProduct(); + + iEvent.put(copy_unique(input.outputClusters)); +} + + +DEFINE_FWK_MODULE(SiPixelClusterHeterogeneousConverter); diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelDigiHeterogeneousConverter.cc b/EventFilter/SiPixelRawToDigi/plugins/SiPixelDigiHeterogeneousConverter.cc new file mode 100644 index 0000000000000..c2b886b16c784 --- /dev/null +++ b/EventFilter/SiPixelRawToDigi/plugins/SiPixelDigiHeterogeneousConverter.cc @@ -0,0 +1,69 @@ +#include "FWCore/Framework/interface/Event.h" +#include "FWCore/Framework/interface/MakerMacros.h" +#include "FWCore/Framework/interface/global/EDProducer.h" +#include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h" +#include "FWCore/ParameterSet/interface/ParameterSetDescription.h" +#include "FWCore/ParameterSet/interface/ParameterSet.h" +#include "HeterogeneousCore/Product/interface/HeterogeneousProduct.h" + +#include "siPixelRawToClusterHeterogeneousProduct.h" + +class SiPixelDigiHeterogeneousConverter: public edm::global::EDProducer<> { +public: + explicit SiPixelDigiHeterogeneousConverter(edm::ParameterSet const& iConfig); + ~SiPixelDigiHeterogeneousConverter() = default; + + static void fillDescriptions(edm::ConfigurationDescriptions& descriptions); + +private: + void produce(edm::StreamID, edm::Event& iEvent, const edm::EventSetup& iSetup) const override; + + edm::EDGetTokenT token_; + bool includeErrors_; +}; + +SiPixelDigiHeterogeneousConverter::SiPixelDigiHeterogeneousConverter(edm::ParameterSet const& iConfig): + token_(consumes(iConfig.getParameter("src"))), + includeErrors_(iConfig.getParameter("includeErrors")) +{ + produces >(); + if(includeErrors_) { + produces< edm::DetSetVector >(); + produces(); + produces("UserErrorModules"); + produces >(); + } +} + +void SiPixelDigiHeterogeneousConverter::fillDescriptions(edm::ConfigurationDescriptions& descriptions) { + edm::ParameterSetDescription desc; + desc.add("src", edm::InputTag("siPixelDigisHeterogeneous")); + desc.add("includeErrors",true); + + descriptions.addWithDefaultLabel(desc); +} + +namespace { + template + auto copy_unique(const T& t) { + return std::make_unique(t); + } +} + +void SiPixelDigiHeterogeneousConverter::produce(edm::StreamID, edm::Event& iEvent, const edm::EventSetup& iSetup) const { + edm::Handle hinput; + iEvent.getByToken(token_, hinput); + + const auto& input = hinput->get().getProduct(); + + iEvent.put(copy_unique(input.collection)); + if(includeErrors_) { + iEvent.put(copy_unique(input.errorcollection)); + iEvent.put(copy_unique(input.tkerror_detidcollection)); + iEvent.put(copy_unique(input.usererror_detidcollection), "UserErrorModules"); + iEvent.put(copy_unique(input.disabled_channelcollection)); + } +} + + +DEFINE_FWK_MODULE(SiPixelDigiHeterogeneousConverter); diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.cc b/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.cc index 16fa6281e5c7b..95053a08a55b0 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.cc +++ b/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.cc @@ -54,7 +54,7 @@ void deallocateCablingMap(SiPixelFedCablingMapGPU* cablingMapHost, SiPixelFedCab void processCablingMap(SiPixelFedCablingMap const& cablingMap, TrackerGeometry const& trackerGeom, SiPixelFedCablingMapGPU* cablingMapHost, SiPixelFedCablingMapGPU* cablingMapDevice, - const SiPixelQuality* badPixelInfo, std::set const& modules) { + const SiPixelQuality* badPixelInfo, std::set const& modules, cuda::stream_t<>& stream) { std::vector const& fedIds = cablingMap.fedIds(); std::unique_ptr const& cabling = cablingMap.cablingTree(); @@ -108,8 +108,6 @@ void processCablingMap(SiPixelFedCablingMap const& cablingMap, TrackerGeometry // Link varies between 1 to 48 // idinLnk varies between 1 to 8 - cudaDeviceSynchronize(); - for (int i = 1; i < index; i++) { if (RawId[i] == 9999) { moduleId[i] = 9999; @@ -132,20 +130,21 @@ void processCablingMap(SiPixelFedCablingMap const& cablingMap, TrackerGeometry } cablingMapHost->size = index-1; - cudaCheck(cudaMemcpy(cablingMapHost->fed, fedMap.data(), fedMap.size() * sizeof(unsigned int), cudaMemcpyDefault)); - cudaCheck(cudaMemcpy(cablingMapHost->link, linkMap.data(), linkMap.size() * sizeof(unsigned int), cudaMemcpyDefault)); - cudaCheck(cudaMemcpy(cablingMapHost->roc, rocMap.data(), rocMap.size() * sizeof(unsigned int), cudaMemcpyDefault)); - cudaCheck(cudaMemcpy(cablingMapHost->RawId, RawId.data(), RawId.size() * sizeof(unsigned int), cudaMemcpyDefault)); - cudaCheck(cudaMemcpy(cablingMapHost->rocInDet, rocInDet.data(), rocInDet.size() * sizeof(unsigned int), cudaMemcpyDefault)); - cudaCheck(cudaMemcpy(cablingMapHost->moduleId, moduleId.data(), moduleId.size() * sizeof(unsigned int), cudaMemcpyDefault)); - cudaCheck(cudaMemcpy(cablingMapHost->badRocs, badRocs.data(), badRocs.size() * sizeof(unsigned char), cudaMemcpyDefault)); - cudaCheck(cudaMemcpy(cablingMapHost->modToUnp, modToUnp.data(), modToUnp.size() * sizeof(unsigned char), cudaMemcpyDefault)); - cudaCheck(cudaMemcpy(cablingMapDevice, cablingMapHost, sizeof(SiPixelFedCablingMapGPU), cudaMemcpyDefault)); - cudaDeviceSynchronize(); + cudaCheck(cudaMemcpyAsync(cablingMapHost->fed, fedMap.data(), fedMap.size() * sizeof(unsigned int), cudaMemcpyDefault, stream.id())); + cudaCheck(cudaMemcpyAsync(cablingMapHost->link, linkMap.data(), linkMap.size() * sizeof(unsigned int), cudaMemcpyDefault, stream.id())); + cudaCheck(cudaMemcpyAsync(cablingMapHost->roc, rocMap.data(), rocMap.size() * sizeof(unsigned int), cudaMemcpyDefault, stream.id())); + cudaCheck(cudaMemcpyAsync(cablingMapHost->RawId, RawId.data(), RawId.size() * sizeof(unsigned int), cudaMemcpyDefault, stream.id())); + cudaCheck(cudaMemcpyAsync(cablingMapHost->rocInDet, rocInDet.data(), rocInDet.size() * sizeof(unsigned int), cudaMemcpyDefault, stream.id())); + cudaCheck(cudaMemcpyAsync(cablingMapHost->moduleId, moduleId.data(), moduleId.size() * sizeof(unsigned int), cudaMemcpyDefault, stream.id())); + cudaCheck(cudaMemcpyAsync(cablingMapHost->badRocs, badRocs.data(), badRocs.size() * sizeof(unsigned char), cudaMemcpyDefault, stream.id())); + cudaCheck(cudaMemcpyAsync(cablingMapHost->modToUnp, modToUnp.data(), modToUnp.size() * sizeof(unsigned char), cudaMemcpyDefault, stream.id())); + cudaCheck(cudaMemcpyAsync(cablingMapDevice, cablingMapHost, sizeof(SiPixelFedCablingMapGPU), cudaMemcpyDefault)); } void -processGainCalibration(SiPixelGainCalibrationForHLT const & gains, TrackerGeometry const& geom, SiPixelGainForHLTonGPU * & gainsOnGPU, SiPixelGainForHLTonGPU::DecodingStructure * & gainDataOnGPU) { +processGainCalibration(SiPixelGainCalibrationForHLT const & gains, TrackerGeometry const& geom, + SiPixelGainForHLTonGPU *gainsOnHost, SiPixelGainForHLTonGPU * & gainsOnGPU, + SiPixelGainForHLTonGPU::DecodingStructure * & gainDataOnGPU, cuda::stream_t<>& stream) { // bizzarre logic (looking for fist strip-det) don't ask auto const & dus = geom.detUnits(); unsigned m_detectors = dus.size(); @@ -161,14 +160,12 @@ processGainCalibration(SiPixelGainCalibrationForHLT const & gains, TrackerGeomet std::cout << "sizes " << sizeof(char) << ' ' << sizeof(uint8_t) << ' ' << sizeof(SiPixelGainForHLTonGPU::DecodingStructure) << std::endl; */ - SiPixelGainForHLTonGPU * gg; - cudaCheck(cudaMallocHost((void**) & gg, sizeof(SiPixelGainForHLTonGPU))); + SiPixelGainForHLTonGPU * gg = gainsOnHost; assert(nullptr==gainDataOnGPU); - cudaCheck(cudaMalloc((void**) & gainDataOnGPU, gains.data().size())); - cudaCheck(cudaMalloc((void**) & gainsOnGPU, sizeof(SiPixelGainForHLTonGPU))); + cudaCheck(cudaMalloc((void**) & gainDataOnGPU, gains.data().size())); // TODO: this could be changed to cuda::memory::device::unique_ptr<> // gains.data().data() is used also for non-GPU code, we cannot allocate it on aligned and write-combined memory - cudaCheck(cudaMemcpy(gainDataOnGPU, gains.data().data(), gains.data().size(), cudaMemcpyDefault)); + cudaCheck(cudaMemcpyAsync(gainDataOnGPU, gains.data().data(), gains.data().size(), cudaMemcpyDefault, stream.id())); gg->v_pedestals = gainDataOnGPU; @@ -217,7 +214,5 @@ processGainCalibration(SiPixelGainCalibrationForHLT const & gains, TrackerGeomet // gg->rangeAndCols[i] = std::make_pair(SiPixelGainForHLTonGPU::Range(ind[i].ibegin,ind[i].iend), ind[i].ncols); } - cudaCheck(cudaMemcpy(gainsOnGPU, gg, sizeof(SiPixelGainForHLTonGPU), cudaMemcpyDefault)); - cudaFreeHost(gg); - cudaDeviceSynchronize(); + cudaCheck(cudaMemcpyAsync(gainsOnGPU, gg, sizeof(SiPixelGainForHLTonGPU), cudaMemcpyDefault, stream.id())); } diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.h b/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.h index 27355cb9d96c7..a90a5272e74e6 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.h +++ b/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.h @@ -4,6 +4,8 @@ // C++ includes #include +#include "cuda/api_wrappers.h" + class SiPixelFedCablingMap; class SiPixelQuality; class TrackerGeometry; @@ -44,11 +46,14 @@ void processCablingMap(SiPixelFedCablingMap const& cablingMap, SiPixelFedCablingMapGPU* cablingMapHost, SiPixelFedCablingMapGPU* cablingMapDevice, SiPixelQuality const* badPixelInfo, - std::set const& modules); + std::set const& modules, + cuda::stream_t<>& stream); void processGainCalibration(SiPixelGainCalibrationForHLT const& gains, TrackerGeometry const& trackerGeom, + SiPixelGainForHLTonGPU *gainsOnHost, SiPixelGainForHLTonGPU * & gainsOnGPU, - SiPixelGainForHLTonGPU_DecodingStructure * & gainDataOnGPU); + SiPixelGainForHLTonGPU_DecodingStructure * & gainDataOnGPU, + cuda::stream_t<>& stream); #endif // EventFilter_SiPixelRawToDigi_plugins_SiPixelFedCablingMapGPU_h diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPUKernel.cu b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToClusterGPUKernel.cu similarity index 74% rename from EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPUKernel.cu rename to EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToClusterGPUKernel.cu index d8cfc643f4461..2d28a73bd98c1 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPUKernel.cu +++ b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToClusterGPUKernel.cu @@ -1,6 +1,6 @@ /* Sushil Dubey, Shashi Dugad, TIFR, July 2017 * - * File Name: RawToDigiGPU.cu + * File Name: RawToClusterGPU.cu * Description: It converts Raw data into Digi Format on GPU * then it converts adc -> electron and * applies the adc threshold to needed for clustering @@ -34,76 +34,110 @@ // local includes #include "SiPixelFedCablingMapGPU.h" -#include "SiPixelRawToDigiGPUKernel.h" +#include "SiPixelRawToClusterGPUKernel.h" namespace pixelgpudetails { - pixelgpudetails::context initDeviceMemory() { + SiPixelRawToClusterGPUKernel::SiPixelRawToClusterGPUKernel() { + // device copy of GPU friendly cabling map + allocateCablingMap(cablingMapGPUHost_, cablingMapGPUDevice_); + int WSIZE = MAX_FED * pixelgpudetails::MAX_WORD * sizeof(unsigned int); + cudaMallocHost(&word, sizeof(unsigned int)*WSIZE); + cudaMallocHost(&fedId_h, sizeof(unsigned char)*WSIZE); + + // to store the output of RawToDigi + cudaMallocHost(&pdigi_h, sizeof(uint32_t)*WSIZE); + cudaMallocHost(&rawIdArr_h, sizeof(uint32_t)*WSIZE); + + cudaMallocHost(&adc_h, sizeof(uint16_t)*WSIZE); + cudaMallocHost(&clus_h, sizeof(int32_t)*WSIZE); + + constexpr uint32_t vsize = sizeof(GPU::SimpleVector); + constexpr uint32_t esize = sizeof(pixelgpudetails::error_obj); + cudaCheck(cudaMallocHost(&error_h, vsize)); + cudaCheck(cudaMallocHost(&error_h_tmp, vsize)); + cudaCheck(cudaMallocHost(&data_h, MAX_FED*pixelgpudetails::MAX_WORD*esize)); + + new (error_h) GPU::SimpleVector(MAX_FED*pixelgpudetails::MAX_WORD, data_h); + new (error_h_tmp) GPU::SimpleVector(MAX_FED*pixelgpudetails::MAX_WORD, data_d); + assert(error_h->size() == 0); + assert(error_h->capacity() == static_cast(MAX_FED*pixelgpudetails::MAX_WORD)); + assert(error_h_tmp->size() == 0); + assert(error_h_tmp->capacity() == static_cast(MAX_FED*pixelgpudetails::MAX_WORD)); + + // allocate memory for RawToDigi on GPU using namespace gpuClustering; - pixelgpudetails::context c; // Number of words for all the feds constexpr uint32_t MAX_WORD08_SIZE = MAX_FED * pixelgpudetails::MAX_WORD * sizeof(uint8_t); constexpr uint32_t MAX_WORD32_SIZE = MAX_FED * pixelgpudetails::MAX_WORD * sizeof(uint32_t); constexpr uint32_t MAX_WORD16_SIZE = MAX_FED * pixelgpudetails::MAX_WORD * sizeof(uint16_t); - constexpr uint32_t vsize = sizeof(GPU::SimpleVector); - constexpr uint32_t esize = sizeof(pixelgpudetails::error_obj); constexpr uint32_t MAX_ERROR_SIZE = MAX_FED * pixelgpudetails::MAX_WORD * esize; - cudaCheck(cudaMalloc((void**) & c.word_d, MAX_WORD32_SIZE)); - cudaCheck(cudaMalloc((void**) & c.fedId_d, MAX_WORD08_SIZE)); - cudaCheck(cudaMalloc((void**) & c.pdigi_d, MAX_WORD32_SIZE)); // to store thepacked digi - cudaCheck(cudaMalloc((void**) & c.xx_d, MAX_WORD16_SIZE)); // to store the x and y coordinate - cudaCheck(cudaMalloc((void**) & c.yy_d, MAX_WORD16_SIZE)); - cudaCheck(cudaMalloc((void**) & c.adc_d, MAX_WORD16_SIZE)); + cudaCheck(cudaMalloc((void**) & word_d, MAX_WORD32_SIZE)); + cudaCheck(cudaMalloc((void**) & fedId_d, MAX_WORD08_SIZE)); + cudaCheck(cudaMalloc((void**) & pdigi_d, MAX_WORD32_SIZE)); // to store thepacked digi + cudaCheck(cudaMalloc((void**) & xx_d, MAX_WORD16_SIZE)); // to store the x and y coordinate + cudaCheck(cudaMalloc((void**) & yy_d, MAX_WORD16_SIZE)); + cudaCheck(cudaMalloc((void**) & adc_d, MAX_WORD16_SIZE)); - cudaCheck(cudaMalloc((void**) & c.moduleInd_d, MAX_WORD16_SIZE)); - cudaCheck(cudaMalloc((void**) & c.rawIdArr_d, MAX_WORD32_SIZE)); - cudaCheck(cudaMalloc((void**) & c.error_d, vsize)); - cudaCheck(cudaMalloc((void**) & c.data_d, MAX_ERROR_SIZE)); + cudaCheck(cudaMalloc((void**) & moduleInd_d, MAX_WORD16_SIZE)); + cudaCheck(cudaMalloc((void**) & rawIdArr_d, MAX_WORD32_SIZE)); + cudaCheck(cudaMalloc((void**) & error_d, vsize)); + cudaCheck(cudaMalloc((void**) & data_d, MAX_ERROR_SIZE)); // for the clusterizer - cudaCheck(cudaMalloc((void**) & c.clus_d, MAX_WORD32_SIZE)); // cluser index in module + cudaCheck(cudaMallocHost((void**) & gainForHLTonHost_, sizeof(SiPixelGainForHLTonGPU))); + cudaCheck(cudaMalloc((void**) & gainForHLTonGPU_, sizeof(SiPixelGainForHLTonGPU))); - cudaCheck(cudaMalloc((void**) & c.moduleStart_d, (MaxNumModules+1)*sizeof(uint32_t) )); - cudaCheck(cudaMalloc((void**) & c.clusInModule_d, (MaxNumModules)*sizeof(uint32_t) )); - cudaCheck(cudaMalloc((void**) & c.moduleId_d, (MaxNumModules)*sizeof(uint32_t) )); + cudaCheck(cudaMalloc((void**) & clus_d, MAX_WORD32_SIZE)); // cluser index in module - cudaCheck(cudaMalloc((void**) & c.debug_d, MAX_WORD32_SIZE)); + cudaCheck(cudaMalloc((void**) & moduleStart_d, (MaxNumModules+1)*sizeof(uint32_t) )); + cudaCheck(cudaMalloc((void**) & clusInModule_d,(MaxNumModules)*sizeof(uint32_t) )); + cudaCheck(cudaMalloc((void**) & moduleId_d, (MaxNumModules)*sizeof(uint32_t) )); - // create a CUDA stream - cudaCheck(cudaStreamCreate(&c.stream)); - - return c; + cudaCheck(cudaMalloc((void**) & debug_d, MAX_WORD32_SIZE)); } + + SiPixelRawToClusterGPUKernel::~SiPixelRawToClusterGPUKernel() { + // release device memory for cabling map + deallocateCablingMap(cablingMapGPUHost_, cablingMapGPUDevice_); + + // free gains device memory + cudaCheck(cudaFreeHost(gainForHLTonHost_)); + cudaCheck(cudaFree(gainForHLTonGPU_)); + cudaCheck(cudaFree(gainDataOnGPU_)); - void freeMemory(pixelgpudetails::context & c) { + // free device memory used for RawToDigi on GPU // free the GPU memory - cudaCheck(cudaFree(c.word_d)); - cudaCheck(cudaFree(c.fedId_d)); - cudaCheck(cudaFree(c.pdigi_d)); - cudaCheck(cudaFree(c.xx_d)); - cudaCheck(cudaFree(c.yy_d)); - cudaCheck(cudaFree(c.adc_d)); - cudaCheck(cudaFree(c.moduleInd_d)); - cudaCheck(cudaFree(c.rawIdArr_d)); - cudaCheck(cudaFree(c.error_d)); - cudaCheck(cudaFree(c.data_d)); - - // these are for the clusterizer (to be moved) - cudaCheck(cudaFree(c.moduleStart_d)); - cudaCheck(cudaFree(c.clus_d)); - cudaCheck(cudaFree(c.clusInModule_d)); - cudaCheck(cudaFree(c.moduleId_d)); - cudaCheck(cudaFree(c.debug_d)); - - - // destroy the CUDA stream - cudaCheck(cudaStreamDestroy(c.stream)); + cudaCheck(cudaFree(word_d)); + cudaCheck(cudaFree(fedId_d)); + cudaCheck(cudaFree(pdigi_d)); + cudaCheck(cudaFree(xx_d)); + cudaCheck(cudaFree(yy_d)); + cudaCheck(cudaFree(adc_d)); + cudaCheck(cudaFree(moduleInd_d)); + cudaCheck(cudaFree(rawIdArr_d)); + cudaCheck(cudaFree(error_d)); + cudaCheck(cudaFree(data_d)); + + // these are for the clusterizer + cudaCheck(cudaFree(moduleStart_d)); + cudaCheck(cudaFree(clus_d)); + cudaCheck(cudaFree(clusInModule_d)); + cudaCheck(cudaFree(moduleId_d)); + cudaCheck(cudaFree(debug_d)); + } + + void SiPixelRawToClusterGPUKernel::initializeWordFed(int fedId, unsigned int wordCounterGPU, const cms_uint32_t *src, unsigned int length) { + std::memcpy(word+wordCounterGPU, src, sizeof(cms_uint32_t)*length); + std::memset(fedId_h+wordCounterGPU/2, fedId - 1200, length/2); } + + //////////////////// __device__ uint32_t getLink(uint32_t ww) { return ((ww >> pixelgpudetails::LINK_shift) & pixelgpudetails::LINK_mask); @@ -568,41 +602,39 @@ namespace pixelgpudetails { } // end of Raw to Digi kernel - // kernel wrapper called from runRawToDigi_kernel - void RawToDigi_wrapper( - pixelgpudetails::context & c, - const SiPixelFedCablingMapGPU* cablingMapDevice, SiPixelGainForHLTonGPU * const ped, - const uint32_t wordCounter, uint32_t *word, const uint32_t fedCounter, uint8_t *fedId_h, + // Interface to outside + void SiPixelRawToClusterGPUKernel::makeClustersAsync( + const uint32_t wordCounter, const uint32_t fedCounter, bool convertADCtoElectrons, - uint32_t * pdigi_h, uint32_t *rawIdArr_h, - GPU::SimpleVector *error_h, GPU::SimpleVector *error_h_tmp, pixelgpudetails::error_obj *data_h, - uint16_t * adc_h, int32_t * clus_h, - bool useQualityInfo, bool includeErrors, bool debug, uint32_t & nModulesActive) + bool useQualityInfo, bool includeErrors, bool debug, + cuda::stream_t<>& stream) { + nDigis = wordCounter; + const int threadsPerBlock = 512; const int blocks = (wordCounter + threadsPerBlock-1) /threadsPerBlock; // fill it all assert(0 == wordCounter%2); // wordCounter is the total no of words in each event to be trasfered on device - cudaCheck(cudaMemcpyAsync(&c.word_d[0], &word[0], wordCounter*sizeof(uint32_t), cudaMemcpyDefault, c.stream)); - cudaCheck(cudaMemcpyAsync(&c.fedId_d[0], &fedId_h[0], wordCounter*sizeof(uint8_t)/2, cudaMemcpyDefault, c.stream)); + cudaCheck(cudaMemcpyAsync(&word_d[0], &word[0], wordCounter*sizeof(uint32_t), cudaMemcpyDefault, stream.id())); + cudaCheck(cudaMemcpyAsync(&fedId_d[0], &fedId_h[0], wordCounter*sizeof(uint8_t)/2, cudaMemcpyDefault, stream.id())); constexpr uint32_t vsize = sizeof(GPU::SimpleVector); constexpr uint32_t esize = sizeof(pixelgpudetails::error_obj); - cudaCheck(cudaMemcpyAsync(c.error_d, error_h_tmp, vsize, cudaMemcpyDefault, c.stream)); + cudaCheck(cudaMemcpyAsync(error_d, error_h_tmp, vsize, cudaMemcpyDefault, stream.id())); // Launch rawToDigi kernel - RawToDigi_kernel<<>>( - cablingMapDevice, + RawToDigi_kernel<<>>( + cablingMapGPUDevice_, wordCounter, - c.word_d, - c.fedId_d, - c.xx_d, c.yy_d, c.adc_d, - c.pdigi_d, - c.rawIdArr_d, - c.moduleInd_d, - c.error_d, + word_d, + fedId_d, + xx_d, yy_d, adc_d, + pdigi_d, + rawIdArr_d, + moduleInd_d, + error_d, useQualityInfo, includeErrors, debug); @@ -610,15 +642,15 @@ namespace pixelgpudetails { // copy data to host variable - cudaCheck(cudaMemcpyAsync(pdigi_h, c.pdigi_d, wordCounter*sizeof(uint32_t), cudaMemcpyDefault, c.stream)); - cudaCheck(cudaMemcpyAsync(rawIdArr_h, c.rawIdArr_d, wordCounter*sizeof(uint32_t), cudaMemcpyDefault, c.stream)); + cudaCheck(cudaMemcpyAsync(pdigi_h, pdigi_d, wordCounter*sizeof(uint32_t), cudaMemcpyDefault, stream.id())); + cudaCheck(cudaMemcpyAsync(rawIdArr_h, rawIdArr_d, wordCounter*sizeof(uint32_t), cudaMemcpyDefault, stream.id())); if (includeErrors) { - cudaCheck(cudaMemcpyAsync(error_h, c.error_d, vsize, cudaMemcpyDefault, c.stream)); - cudaStreamSynchronize(c.stream); + cudaCheck(cudaMemcpyAsync(error_h, error_d, vsize, cudaMemcpyDefault, stream.id())); + cudaStreamSynchronize(stream.id()); error_h->set_data(data_h); int size = error_h->size(); - cudaCheck(cudaMemcpyAsync(data_h, c.data_d, size*esize, cudaMemcpyDefault, c.stream)); + cudaCheck(cudaMemcpyAsync(data_h, data_d, size*esize, cudaMemcpyDefault, stream.id())); } // End of Raw2Digi and passing data for cluserisation @@ -629,18 +661,18 @@ namespace pixelgpudetails { int blocks = (wordCounter + threadsPerBlock - 1) / threadsPerBlock; - assert(ped); - gpuCalibPixel::calibDigis<<>>( - c.moduleInd_d, - c.xx_d, c.yy_d, c.adc_d, - ped, + assert(gainForHLTonGPU_); + gpuCalibPixel::calibDigis<<>>( + moduleInd_d, + xx_d, yy_d, adc_d, + gainForHLTonGPU_, wordCounter ); cudaCheck(cudaGetLastError()); // calibrated adc - cudaCheck(cudaMemcpyAsync(adc_h, c.adc_d, wordCounter*sizeof(uint32_t), cudaMemcpyDefault, c.stream)); + cudaCheck(cudaMemcpyAsync(adc_h, adc_d, wordCounter*sizeof(uint32_t), cudaMemcpyDefault, stream.id())); /* std::cout @@ -648,19 +680,21 @@ namespace pixelgpudetails { << " blocks of " << threadsPerBlock << " threads\n"; */ - uint32_t nModules=0; - cudaCheck(cudaMemcpyAsync(c.moduleStart_d, &nModules, sizeof(uint32_t), cudaMemcpyDefault, c.stream)); + nModulesActive = 0; + cudaCheck(cudaMemcpyAsync(moduleStart_d, &nModulesActive, sizeof(uint32_t), cudaMemcpyDefault, stream.id())); - countModules<<>>(c.moduleInd_d, c.moduleStart_d, c.clus_d, wordCounter); + countModules<<>>(moduleInd_d, moduleStart_d, clus_d, wordCounter); cudaCheck(cudaGetLastError()); - cudaCheck(cudaMemcpyAsync(&nModules, c.moduleStart_d, sizeof(uint32_t), cudaMemcpyDefault, c.stream)); + cudaCheck(cudaMemcpyAsync(&nModulesActive, moduleStart_d, sizeof(uint32_t), cudaMemcpyDefault, stream.id())); - // std::cout << "found " << nModules << " Modules active" << std::endl; + // std::cout << "found " << nModulesActive << " Modules active" << std::endl; + // TODO: I suspect we need a cudaStreamSynchronize before using nModules below + // In order to avoid the cudaStreamSynchronize, create a new kernel which launches countModules and findClus. threadsPerBlock = 256; - blocks = nModules; + blocks = nModulesActive; /* std::cout @@ -668,27 +702,25 @@ namespace pixelgpudetails { << " blocks of " << threadsPerBlock << " threads\n"; */ - cudaCheck(cudaMemsetAsync(c.clusInModule_d, 0, (MaxNumModules)*sizeof(uint32_t),c.stream)); + cudaCheck(cudaMemsetAsync(clusInModule_d, 0, (MaxNumModules)*sizeof(uint32_t), stream.id())); - findClus<<>>( - c.moduleInd_d, - c.xx_d, c.yy_d, c.adc_d, - c.moduleStart_d, - c.clusInModule_d, c.moduleId_d, - c.clus_d, - c.debug_d, + findClus<<>>( + moduleInd_d, + xx_d, yy_d, adc_d, + moduleStart_d, + clusInModule_d, moduleId_d, + clus_d, + debug_d, wordCounter ); // clusters - cudaCheck(cudaMemcpyAsync(clus_h, c.clus_d, wordCounter*sizeof(uint32_t), cudaMemcpyDefault, c.stream)); + cudaCheck(cudaMemcpyAsync(clus_h, clus_d, wordCounter*sizeof(uint32_t), cudaMemcpyDefault, stream.id())); - cudaStreamSynchronize(c.stream); + cudaStreamSynchronize(stream.id()); cudaCheck(cudaGetLastError()); - nModulesActive = nModules; - } // end clusterizer scope } diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPUKernel.h b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToClusterGPUKernel.h similarity index 62% rename from EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPUKernel.h rename to EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToClusterGPUKernel.h index 0bebde676bc28..ba437b2402a3f 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPUKernel.h +++ b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToClusterGPUKernel.h @@ -1,11 +1,14 @@ -#ifndef EventFilter_SiPixelRawToDigi_plugins_SiPixelRawToDigiGPUKernel_h -#define EventFilter_SiPixelRawToDigi_plugins_SiPixelRawToDigiGPUKernel_h +#ifndef EventFilter_SiPixelRawToDigi_plugins_SiPixelRawToClusterGPUKernel_h +#define EventFilter_SiPixelRawToDigi_plugins_SiPixelRawToClusterGPUKernel_h #include #include +#include "cuda/api_wrappers.h" +#include "FWCore/Utilities/interface/typedefs.h" #include "HeterogeneousCore/CUDAUtilities/interface/GPUSimpleVector.h" #include "SiPixelFedCablingMapGPU.h" +#include "siPixelRawToClusterHeterogeneousProduct.h" namespace pixelgpudetails { @@ -139,25 +142,96 @@ namespace pixelgpudetails { (adc << thePacking.adc_shift); } - struct error_obj { - uint32_t rawId; - uint32_t word; - unsigned char errorType; - unsigned char fedId; + using error_obj = siPixelRawToClusterHeterogeneousProduct::error_obj; - __host__ __device__ - error_obj(uint32_t a, uint32_t b, unsigned char c, unsigned char d): - rawId(a), - word(b), - errorType(c), - fedId(d) - { } + + class SiPixelRawToClusterGPUKernel { + public: + SiPixelRawToClusterGPUKernel(); + ~SiPixelRawToClusterGPUKernel(); + + + SiPixelRawToClusterGPUKernel(const SiPixelRawToClusterGPUKernel&) = delete; + SiPixelRawToClusterGPUKernel(SiPixelRawToClusterGPUKernel&&) = delete; + SiPixelRawToClusterGPUKernel& operator=(const SiPixelRawToClusterGPUKernel&) = delete; + SiPixelRawToClusterGPUKernel& operator=(SiPixelRawToClusterGPUKernel&&) = delete; + + void updateCablingMap(SiPixelFedCablingMap const& cablingMap, + TrackerGeometry const& trackerGeom, + SiPixelQuality const* badPixelInfo, + std::set const& modules, + cuda::stream_t<>& stream) { + processCablingMap(cablingMap, trackerGeom, cablingMapGPUHost_, cablingMapGPUDevice_, badPixelInfo, modules, stream); + } + + void updateGainCalibration(SiPixelGainCalibrationForHLT const& gains, + TrackerGeometry const& trackerGeom, + cuda::stream_t<>& stream) { + processGainCalibration(gains, trackerGeom, gainForHLTonHost_, gainForHLTonGPU_, gainDataOnGPU_, stream); + } + + void initializeWordFed(int fedId, unsigned int wordCounterGPU, const cms_uint32_t *src, unsigned int length); + + // Not really very async yet... + void makeClustersAsync(const uint32_t wordCounter, const uint32_t fedCounter, bool convertADCtoElectrons, + bool useQualityInfo, bool includeErrors, bool debug, + cuda::stream_t<>& stream); + + auto getProduct() const { + return siPixelRawToClusterHeterogeneousProduct::GPUProduct{ + pdigi_h, rawIdArr_h, clus_h, adc_h, error_h, + nDigis, nModulesActive, + xx_d, yy_d, adc_d, moduleInd_d, moduleStart_d,clus_d, clusInModule_d, moduleId_d + }; + } + + private: + // Conditions + SiPixelFedCablingMapGPU *cablingMapGPUHost_ = nullptr; + SiPixelFedCablingMapGPU *cablingMapGPUDevice_ = nullptr; + // gain calib + SiPixelGainForHLTonGPU * gainForHLTonHost_ = nullptr; + SiPixelGainForHLTonGPU * gainForHLTonGPU_ = nullptr; + SiPixelGainForHLTonGPU_DecodingStructure * gainDataOnGPU_ = nullptr; + + // input + unsigned int *word = nullptr; // to hold input for rawtodigi + unsigned char *fedId_h = nullptr; // to hold fed index for each word + + // output + uint32_t *pdigi_h = nullptr, *rawIdArr_h = nullptr; // host copy of output + uint16_t *adc_h = nullptr; int32_t *clus_h = nullptr; // host copy of calib&clus output + pixelgpudetails::error_obj *data_h = nullptr; + GPU::SimpleVector *error_h = nullptr; + GPU::SimpleVector *error_h_tmp = nullptr; + + uint32_t nDigis = 0; + uint32_t nModulesActive = 0; + + // scratch memory buffers + uint32_t * word_d; + uint8_t * fedId_d; + uint32_t * pdigi_d; + uint16_t * xx_d; + uint16_t * yy_d; + uint16_t * adc_d; + uint16_t * moduleInd_d; + uint32_t * rawIdArr_d; + + GPU::SimpleVector * error_d; + error_obj * data_d; + + // these are for the clusterizer (to be moved) + uint32_t * moduleStart_d; + int32_t * clus_d; + uint32_t * clusInModule_d; + uint32_t * moduleId_d; + uint32_t * debug_d; }; + // configuration and memory buffers alocated on the GPU struct context { - cudaStream_t stream; - uint32_t * word_d; uint8_t * fedId_d; uint32_t * pdigi_d; @@ -209,4 +283,4 @@ namespace pixelgpudetails { } -#endif // EventFilter_SiPixelRawToDigi_plugins_SiPixelRawToDigiGPUKernel_h +#endif // EventFilter_SiPixelRawToDigi_plugins_SiPixelRawToClusterGPUKernel_h diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToClusterHeterogeneous.cc b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToClusterHeterogeneous.cc new file mode 100644 index 0000000000000..0a1ccd5598f28 --- /dev/null +++ b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToClusterHeterogeneous.cc @@ -0,0 +1,674 @@ +// C++ includes +#include +#include +#include +#include + +// CUDA kincludes +#include +#include + +// CMSSW includes +#include "CalibTracker/SiPixelESProducers/interface/SiPixelGainCalibrationForHLTService.h" +#include "CondFormats/DataRecord/interface/SiPixelFedCablingMapRcd.h" +#include "CondFormats/DataRecord/interface/SiPixelQualityRcd.h" +#include "CondFormats/SiPixelObjects/interface/SiPixelFedCablingMap.h" +#include "CondFormats/SiPixelObjects/interface/SiPixelFedCablingTree.h" +#include "CondFormats/SiPixelObjects/interface/SiPixelQuality.h" +#include "DataFormats/Common/interface/DetSetVector.h" +#include "DataFormats/Common/interface/Handle.h" +#include "DataFormats/DetId/interface/DetIdCollection.h" +#include "DataFormats/FEDRawData/interface/FEDNumbering.h" +#include "DataFormats/FEDRawData/interface/FEDRawData.h" +#include "DataFormats/FEDRawData/interface/FEDRawDataCollection.h" +#include "DataFormats/SiPixelCluster/interface/SiPixelCluster.h" +#include "DataFormats/SiPixelDetId/interface/PixelFEDChannel.h" +#include "DataFormats/SiPixelDigi/interface/PixelDigi.h" +#include "DataFormats/SiPixelRawData/interface/SiPixelRawDataError.h" +#include "DataFormats/TrackerCommon/interface/TrackerTopology.h" +#include "EventFilter/SiPixelRawToDigi/interface/PixelDataFormatter.h" +#include "EventFilter/SiPixelRawToDigi/interface/PixelUnpackingRegions.h" +#include "FWCore/Framework/interface/ConsumesCollector.h" +#include "FWCore/Framework/interface/ESHandle.h" +#include "FWCore/Framework/interface/ESTransientHandle.h" +#include "FWCore/Framework/interface/ESWatcher.h" +#include "FWCore/Framework/interface/EventSetup.h" +#include "FWCore/Framework/interface/Event.h" +#include "FWCore/Framework/interface/MakerMacros.h" +#include "FWCore/MessageLogger/interface/MessageLogger.h" +#include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h" +#include "FWCore/ParameterSet/interface/ParameterSetDescription.h" +#include "FWCore/ParameterSet/interface/ParameterSet.h" +#include "FWCore/PluginManager/interface/ModuleDef.h" +#include "Geometry/Records/interface/TrackerDigiGeometryRecord.h" +#include "Geometry/TrackerGeometryBuilder/interface/PixelGeomDetUnit.h" +#include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h" +#include "HeterogeneousCore/CUDACore/interface/GPUCuda.h" +#include "HeterogeneousCore/CUDAUtilities/interface/cudaCheck.h" +#include "HeterogeneousCore/Producer/interface/HeterogeneousEDProducer.h" +#include "HeterogeneousCore/Product/interface/HeterogeneousProduct.h" +#include "RecoLocalTracker/SiPixelClusterizer/interface/PixelThresholdClusterizer.h" + +#include "SiPixelRawToClusterGPUKernel.h" +#include "siPixelRawToClusterHeterogeneousProduct.h" + +namespace { + struct AccretionCluster { + typedef unsigned short UShort; + static constexpr UShort MAXSIZE = 256; + UShort adc[MAXSIZE]; + UShort x[MAXSIZE]; + UShort y[MAXSIZE]; + UShort xmin=16000; + UShort ymin=16000; + unsigned int isize=0; + int charge=0; + + void clear() { + isize=0; + charge=0; + xmin=16000; + ymin=16000; + } + + bool add(SiPixelCluster::PixelPos const & p, UShort const iadc) { + if (isize==MAXSIZE) return false; + xmin=std::min(xmin,(unsigned short)(p.row())); + ymin=std::min(ymin,(unsigned short)(p.col())); + adc[isize]=iadc; + x[isize]=p.row(); + y[isize++]=p.col(); + charge+=iadc; + return true; + } + }; + + constexpr uint32_t dummydetid = 0xffffffff; +} + +class SiPixelRawToClusterHeterogeneous: public HeterogeneousEDProducer > { +public: + using CPUProduct = siPixelRawToClusterHeterogeneousProduct::CPUProduct; + using GPUProduct = siPixelRawToClusterHeterogeneousProduct::GPUProduct; + using Output = siPixelRawToClusterHeterogeneousProduct::HeterogeneousDigiCluster; + + explicit SiPixelRawToClusterHeterogeneous(const edm::ParameterSet& iConfig); + ~SiPixelRawToClusterHeterogeneous() override = default; + + static void fillDescriptions(edm::ConfigurationDescriptions& descriptions); + +private: + // CPU implementation + void produceCPU(edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup) override; + + // GPU implementation + void beginStreamGPUCuda(edm::StreamID streamId, cuda::stream_t<>& cudaStream) override; + void acquireGPUCuda(const edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup, cuda::stream_t<>& cudaStream) override; + void produceGPUCuda(edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup, cuda::stream_t<>& cudaStream) override; + void convertGPUtoCPU(const GPUProduct& gpu, CPUProduct& cpu) const; + + // Commonalities + const FEDRawDataCollection *initialize(const edm::Event& ev, const edm::EventSetup& es); + + std::unique_ptr cabling_; + const SiPixelQuality *badPixelInfo_ = nullptr; + const SiPixelFedCablingMap *cablingMap_ = nullptr; +std::unique_ptr regions_; + edm::EDGetTokenT tFEDRawDataCollection; + + bool includeErrors; + bool useQuality; + bool debug; + std::vector tkerrorlist; + std::vector usererrorlist; + std::vector fedIds; + + edm::ESWatcher recordWatcher; + edm::ESWatcher qualityWatcher; + bool recordWatcherUpdatedSinceLastTransfer_ = false; + bool qualityWatcherUpdatedSinceLastTransfer_ = false; + + bool usePilotBlade; + bool usePhase1; + bool convertADCtoElectrons; + std::string cablingMapLabel; + + // clusterizer + PixelThresholdClusterizer clusterizer_; + const TrackerGeometry *geom_ = nullptr; + const TrackerTopology *ttopo_ = nullptr; + + // gain calib + SiPixelGainCalibrationForHLTService theSiPixelGainCalibration_; + + // GPU algo + std::unique_ptr gpuAlgo_; + PixelDataFormatter::Errors errors_; +}; + +SiPixelRawToClusterHeterogeneous::SiPixelRawToClusterHeterogeneous(const edm::ParameterSet& iConfig): + HeterogeneousEDProducer(iConfig), + clusterizer_(iConfig), + theSiPixelGainCalibration_(iConfig) { + includeErrors = iConfig.getParameter("IncludeErrors"); + useQuality = iConfig.getParameter("UseQualityInfo"); + tkerrorlist = iConfig.getParameter > ("ErrorList"); + usererrorlist = iConfig.getParameter > ("UserErrorList"); + tFEDRawDataCollection = consumes (iConfig.getParameter("InputLabel")); + + clusterizer_.setSiPixelGainCalibrationService(&theSiPixelGainCalibration_); + + // Products + produces(); + + // regions + if(!iConfig.getParameter("Regions").getParameterNames().empty()) { + regions_ = std::make_unique(iConfig, consumesCollector()); + } + + // Control the usage of pilot-blade data, FED=40 + usePilotBlade = iConfig.getParameter ("UsePilotBlade"); + if(usePilotBlade) edm::LogInfo("SiPixelRawToCluster") << " Use pilot blade data (FED 40)"; + + // Control the usage of phase1 + usePhase1 = iConfig.getParameter ("UsePhase1"); + if(usePhase1) edm::LogInfo("SiPixelRawToCluster") << " Using phase1"; + + //CablingMap could have a label //Tav + cablingMapLabel = iConfig.getParameter ("CablingMapLabel"); + + convertADCtoElectrons = iConfig.getParameter("ConvertADCtoElectrons"); +} + +void SiPixelRawToClusterHeterogeneous::fillDescriptions(edm::ConfigurationDescriptions& descriptions) { + edm::ParameterSetDescription desc; + desc.add("IncludeErrors",true); + desc.add("UseQualityInfo",false); + { + std::vector temp1; + temp1.reserve(1); + temp1.push_back(29); + desc.add >("ErrorList",temp1)->setComment("## ErrorList: list of error codes used by tracking to invalidate modules"); + } + { + std::vector temp1; + temp1.reserve(1); + temp1.push_back(40); + desc.add >("UserErrorList",temp1)->setComment("## UserErrorList: list of error codes used by Pixel experts for investigation"); + } + desc.add("InputLabel",edm::InputTag("siPixelRawData")); + { + edm::ParameterSetDescription psd0; + psd0.addOptional>("inputs"); + psd0.addOptional>("deltaPhi"); + psd0.addOptional>("maxZ"); + psd0.addOptional("beamSpot"); + desc.add("Regions",psd0)->setComment("## Empty Regions PSet means complete unpacking"); + } + desc.add("UsePilotBlade",false)->setComment("## Use pilot blades"); + desc.add("UsePhase1",false)->setComment("## Use phase1"); + desc.add("CablingMapLabel","")->setComment("CablingMap label"); //Tav + desc.addOptional("CheckPixelOrder"); // never used, kept for back-compatibility + + desc.add("ConvertADCtoElectrons", false)->setComment("## do the calibration ADC-> Electron and apply the threshold, requried for clustering"); + + // clusterizer + desc.add("ChannelThreshold", 1000); + desc.add("SeedThreshold", 1000); + desc.add("ClusterThreshold", 4000); + desc.add("ClusterThreshold_L1", 4000); + desc.add("VCaltoElectronGain", 65); + desc.add("VCaltoElectronGain_L1", 65); + desc.add("VCaltoElectronOffset", -414); + desc.add("VCaltoElectronOffset_L1", -414); + desc.addUntracked("MissCalibrate", true); + desc.add("SplitClusters", false); + + HeterogeneousEDProducer::fillPSetDescription(desc); + + descriptions.add("siPixelDigisHeterogeneousDefault",desc); +} + +const FEDRawDataCollection *SiPixelRawToClusterHeterogeneous::initialize(const edm::Event& ev, const edm::EventSetup& es) { + debug = edm::MessageDrop::instance()->debugEnabled; + + // setup gain calibration service + theSiPixelGainCalibration_.setESObjects( es ); + + // initialize cabling map or update if necessary + if (recordWatcher.check( es )) { + // cabling map, which maps online address (fed->link->ROC->local pixel) to offline (DetId->global pixel) + edm::ESTransientHandle cablingMap; + es.get().get( cablingMapLabel, cablingMap ); //Tav + cablingMap_ = cablingMap.product(); + fedIds = cablingMap->fedIds(); + cabling_ = cablingMap->cablingTree(); + LogDebug("map version:")<< cabling_->version(); + recordWatcherUpdatedSinceLastTransfer_ = true; + } + // initialize quality record or update if necessary + if (qualityWatcher.check( es )&&useQuality) { + // quality info for dead pixel modules or ROCs + edm::ESHandle qualityInfo; + es.get().get( qualityInfo ); + badPixelInfo_ = qualityInfo.product(); + if (!badPixelInfo_) { + edm::LogError("SiPixelQualityNotPresent")<<" Configured to use SiPixelQuality, but SiPixelQuality not present"; + } + qualityWatcherUpdatedSinceLastTransfer_ = true; + } + + // tracker geometry: to make sure numbering of DetId is consistent... + edm::ESHandle geom; + es.get().get(geom); + geom_ = geom.product(); + + edm::ESHandle trackerTopologyHandle; + es.get().get(trackerTopologyHandle); + ttopo_ = trackerTopologyHandle.product(); + + if (regions_) { + regions_->run(ev, es); + LogDebug("SiPixelRawToCluster") << "region2unpack #feds: "<nFEDs(); + LogDebug("SiPixelRawToCluster") << "region2unpack #modules (BPIX,EPIX,total): "<nBarrelModules()<<" "<nForwardModules()<<" "<nModules(); + } + + edm::Handle buffers; + ev.getByToken(tFEDRawDataCollection, buffers); + return buffers.product(); +} + + +// ----------------------------------------------------------------------------- +void SiPixelRawToClusterHeterogeneous::produceCPU(edm::HeterogeneousEvent& ev, const edm::EventSetup& es) +{ + const auto buffers = initialize(ev.event(), es); + + // create product (digis & errors) + auto output = std::make_unique(); + // output->collection.reserve(8*1024); + + + PixelDataFormatter formatter(cabling_.get(), usePhase1); // for phase 1 & 0 + formatter.setErrorStatus(includeErrors); + if (useQuality) formatter.setQualityStatus(useQuality, badPixelInfo_); + + bool errorsInEvent = false; + PixelDataFormatter::DetErrors nodeterrors; + + if (regions_) { + formatter.setModulesToUnpack(regions_->modulesToUnpack()); + } + + for (auto aFed = fedIds.begin(); aFed != fedIds.end(); ++aFed) { + int fedId = *aFed; + + if(!usePilotBlade && (fedId==40) ) continue; // skip pilot blade data + + if (regions_ && !regions_->mayUnpackFED(fedId)) continue; + + if(debug) LogDebug("SiPixelRawToCluster")<< " PRODUCE DIGI FOR FED: " << fedId; + + PixelDataFormatter::Errors errors; + + //get event data for this fed + const FEDRawData& fedRawData = buffers->FEDData( fedId ); + + //convert data to digi and strip off errors + formatter.interpretRawData( errorsInEvent, fedId, fedRawData, output->collection, errors); + + //pack errors into collection + if(includeErrors) { + typedef PixelDataFormatter::Errors::iterator IE; + for (IE is = errors.begin(); is != errors.end(); is++) { + uint32_t errordetid = is->first; + if (errordetid==dummydetid) { // errors given dummy detId must be sorted by Fed + nodeterrors.insert( nodeterrors.end(), errors[errordetid].begin(), errors[errordetid].end() ); + } else { + edm::DetSet& errorDetSet = output->errorcollection.find_or_insert(errordetid); + errorDetSet.data.insert(errorDetSet.data.end(), is->second.begin(), is->second.end()); + // Fill detid of the detectors where there is error AND the error number is listed + // in the configurable error list in the job option cfi. + // Code needs to be here, because there can be a set of errors for each + // entry in the for loop over PixelDataFormatter::Errors + + std::vector disabledChannelsDetSet; + + for (auto const& aPixelError : errorDetSet) { + // For the time being, we extend the error handling functionality with ErrorType 25 + // In the future, we should sort out how the usage of tkerrorlist can be generalized + if (aPixelError.getType()==25) { + assert(aPixelError.getFedId()==fedId); + const sipixelobjects::PixelFEDCabling* fed = cabling_->fed(fedId); + if (fed) { + cms_uint32_t linkId = formatter.linkId(aPixelError.getWord32()); + const sipixelobjects::PixelFEDLink* link = fed->link(linkId); + if (link) { + // The "offline" 0..15 numbering is fixed by definition, also, the FrameConversion depends on it + // in contrast, the ROC-in-channel numbering is determined by hardware --> better to use the "offline" scheme + PixelFEDChannel ch = {fed->id(), linkId, 25, 0}; + for (unsigned int iRoc=1; iRoc<=link->numberOfROCs(); iRoc++) { + const sipixelobjects::PixelROC * roc = link->roc(iRoc); + if (roc->idInDetUnit()idInDetUnit(); + if (roc->idInDetUnit()>ch.roc_last) ch.roc_last=roc->idInDetUnit(); + } + disabledChannelsDetSet.push_back(ch); + } + } + } else { + // fill list of detIds to be turned off by tracking + if(!tkerrorlist.empty()) { + auto it_find = std::find(tkerrorlist.begin(), tkerrorlist.end(), aPixelError.getType()); + if(it_find != tkerrorlist.end()){ + output->tkerror_detidcollection.push_back(errordetid); + } + } + } + + // fill list of detIds with errors to be studied + if(!usererrorlist.empty()) { + auto it_find = std::find(usererrorlist.begin(), usererrorlist.end(), aPixelError.getType()); + if(it_find != usererrorlist.end()){ + output->usererror_detidcollection.push_back(errordetid); + } + } + + } // loop on DetSet of errors + + if (!disabledChannelsDetSet.empty()) { + output->disabled_channelcollection.insert(errordetid, disabledChannelsDetSet.data(), disabledChannelsDetSet.size()); + } + + } // if error assigned to a real DetId + } // loop on errors in event for this FED + } // if errors to be included in the event + } // loop on FED data to be unpacked + + if(includeErrors) { + edm::DetSet& errorDetSet = output->errorcollection.find_or_insert(dummydetid); + errorDetSet.data = nodeterrors; + } + if (errorsInEvent) LogDebug("SiPixelRawToCluster") << "Error words were stored in this event"; + + // clusterize, originally from SiPixelClusterProducer + for(const auto detset: output->collection) { + const auto detId = DetId(detset.detId()); + + std::vector badChannels; // why do we need this? + + // Comment: At the moment the clusterizer depends on geometry + // to access information as the pixel topology (number of columns + // and rows in a detector module). + // In the future the geometry service will be replaced with + // a ES service. + const GeomDetUnit * geoUnit = geom_->idToDetUnit( detId ); + const PixelGeomDetUnit * pixDet = dynamic_cast(geoUnit); + edmNew::DetSetVector::FastFiller spc(output->outputClusters, detset.detId()); + clusterizer_.clusterizeDetUnit(detset, pixDet, ttopo_, badChannels, spc); + if ( spc.empty() ) { + spc.abort(); + } + } + output->outputClusters.shrink_to_fit(); + + //send digis and errors back to framework + ev.put(std::move(output)); +} + +// ----------------------------------------------------------------------------- +void SiPixelRawToClusterHeterogeneous::beginStreamGPUCuda(edm::StreamID streamId, cuda::stream_t<>& cudaStream) { + // Allocate GPU resources here + gpuAlgo_ = std::make_unique(); +} + +void SiPixelRawToClusterHeterogeneous::acquireGPUCuda(const edm::HeterogeneousEvent& ev, const edm::EventSetup& es, cuda::stream_t<>& cudaStream) { + const auto buffers = initialize(ev.event(), es); + + std::set modules; + if (regions_) { + modules = *(regions_->modulesToUnpack()); + } + + if(recordWatcherUpdatedSinceLastTransfer_) { + // convert the cabling map to a GPU-friendly version + gpuAlgo_->updateCablingMap(*cablingMap_, *geom_, badPixelInfo_, modules, cudaStream); + gpuAlgo_->updateGainCalibration(theSiPixelGainCalibration_.payload(), *geom_, cudaStream); + + recordWatcherUpdatedSinceLastTransfer_ = false; + } + + errors_.clear(); + + // GPU specific: Data extraction for RawToDigi GPU + unsigned int wordCounterGPU = 0; + unsigned int fedCounter = 0; + bool errorsInEvent = false; + + // In CPU algorithm this loop is part of PixelDataFormatter::interpretRawData() + ErrorChecker errorcheck; + for (auto aFed = fedIds.begin(); aFed != fedIds.end(); ++aFed) { + int fedId = *aFed; + + if (!usePilotBlade && (fedId==40) ) continue; // skip pilot blade data + if (regions_ && !regions_->mayUnpackFED(fedId)) continue; + + // for GPU + // first 150 index stores the fedId and next 150 will store the + // start index of word in that fed + assert(fedId>=1200); + fedCounter++; + + // get event data for this fed + const FEDRawData& rawData = buffers->FEDData( fedId ); + + // GPU specific + int nWords = rawData.size()/sizeof(cms_uint64_t); + if (nWords == 0) { + continue; + } + + // check CRC bit + const cms_uint64_t* trailer = reinterpret_cast(rawData.data())+(nWords-1); + if (not errorcheck.checkCRC(errorsInEvent, fedId, trailer, errors_)) { + continue; + } + + // check headers + const cms_uint64_t* header = reinterpret_cast(rawData.data()); header--; + bool moreHeaders = true; + while (moreHeaders) { + header++; + bool headerStatus = errorcheck.checkHeader(errorsInEvent, fedId, header, errors_); + moreHeaders = headerStatus; + } + + // check trailers + bool moreTrailers = true; + trailer++; + while (moreTrailers) { + trailer--; + bool trailerStatus = errorcheck.checkTrailer(errorsInEvent, fedId, nWords, trailer, errors_); + moreTrailers = trailerStatus; + } + + const cms_uint32_t * bw = (const cms_uint32_t *)(header+1); + const cms_uint32_t * ew = (const cms_uint32_t *)(trailer); + + assert(0 == (ew-bw)%2); + gpuAlgo_->initializeWordFed(fedId, wordCounterGPU, bw, (ew-bw)); + wordCounterGPU+=(ew-bw); + + } // end of for loop + + gpuAlgo_->makeClustersAsync(wordCounterGPU, fedCounter, convertADCtoElectrons, + useQuality, includeErrors, debug, cudaStream); +} + +void SiPixelRawToClusterHeterogeneous::produceGPUCuda(edm::HeterogeneousEvent& ev, const edm::EventSetup& es, cuda::stream_t<>& cudaStream) { + auto output = std::make_unique(gpuAlgo_->getProduct()); + ev.put(std::move(output), [this](const GPUProduct& gpu, CPUProduct& cpu) { + this->convertGPUtoCPU(gpu, cpu); + }); +} + +void SiPixelRawToClusterHeterogeneous::convertGPUtoCPU(const SiPixelRawToClusterHeterogeneous::GPUProduct& gpu, + SiPixelRawToClusterHeterogeneous::CPUProduct& cpu) const { + // TODO: add the transfers here as well? + + edm::DetSet * detDigis=nullptr; + for (uint32_t i = 0; i < gpu.nDigis; i++) { + if (gpu.pdigi_h[i]==0) continue; + detDigis = &(cpu.collection).find_or_insert(gpu.rawIdArr_h[i]); + if ( (*detDigis).empty() ) (*detDigis).data.reserve(32); // avoid the first relocations + break; + } + + int32_t nclus=-1; + std::vector aclusters(256); + auto totCluseFilled=0; + + auto fillClusters = [&](uint32_t detId){ + if (nclus<0) return; // this in reality should never happen + edmNew::DetSetVector::FastFiller spc(cpu.outputClusters, detId); + auto layer = (DetId(detId).subdetId()==1) ? ttopo_->pxbLayer(detId) : 0; + auto clusterThreshold = (layer==1) ? 2000 : 4000; + for (int32_t ic=0; ic 109999); + if ( (*detDigis).detId() != gpu.rawIdArr_h[i]) + { + fillClusters((*detDigis).detId()); + assert(nclus==-1); + detDigis = &(cpu.collection).find_or_insert(gpu.rawIdArr_h[i]); + if ( (*detDigis).empty() ) + (*detDigis).data.reserve(32); // avoid the first relocations + else { std::cout << "Problem det present twice in input! " << (*detDigis).detId() << std::endl; } + } + (*detDigis).data.emplace_back(gpu.pdigi_h[i]); + auto const & dig = (*detDigis).data.back(); + // fill clusters + assert(gpu.clus_h[i]>=0); + assert(gpu.clus_h[i]<256); + nclus = std::max(gpu.clus_h[i],nclus); + auto row = dig.row(); + auto col = dig.column(); + SiPixelCluster::PixelPos pix(row,col); + aclusters[gpu.clus_h[i]].add(pix,gpu.adc_h[i]); + } + + // fill final clusters + fillClusters((*detDigis).detId()); + //std::cout << "filled " << totCluseFilled << " clusters" << std::endl; + + PixelDataFormatter formatter(cabling_.get(), usePhase1); // for phase 1 & 0 + auto errors = errors_; // make a copy + PixelDataFormatter::DetErrors nodeterrors; + + auto size = gpu.error_h->size(); + for (auto i = 0; i < size; i++) { + pixelgpudetails::error_obj err = (*gpu.error_h)[i]; + if (err.errorType != 0) { + SiPixelRawDataError error(err.word, err.errorType, err.fedId + 1200); + errors[err.rawId].push_back(error); + } + } + + // pack errors into collection + if (includeErrors) { + + typedef PixelDataFormatter::Errors::iterator IE; + for (IE is = errors.begin(); is != errors.end(); is++) { + + uint32_t errordetid = is->first; + if (errordetid == dummydetid) {// errors given dummy detId must be sorted by Fed + nodeterrors.insert( nodeterrors.end(), errors[errordetid].begin(), errors[errordetid].end() ); + } + else { + edm::DetSet& errorDetSet = cpu.errorcollection.find_or_insert(errordetid); + errorDetSet.data.insert(errorDetSet.data.end(), is->second.begin(), is->second.end()); + // Fill detid of the detectors where there is error AND the error number is listed + // in the configurable error list in the job option cfi. + // Code needs to be here, because there can be a set of errors for each + // entry in the for loop over PixelDataFormatter::Errors + + std::vector disabledChannelsDetSet; + + for (auto const& aPixelError : errorDetSet) { + // For the time being, we extend the error handling functionality with ErrorType 25 + // In the future, we should sort out how the usage of tkerrorlist can be generalized + if (aPixelError.getType() == 25) { + int fedId = aPixelError.getFedId(); + const sipixelobjects::PixelFEDCabling* fed = cabling_->fed(fedId); + if (fed) { + cms_uint32_t linkId = formatter.linkId(aPixelError.getWord32()); + const sipixelobjects::PixelFEDLink* link = fed->link(linkId); + if (link) { + // The "offline" 0..15 numbering is fixed by definition, also, the FrameConversion depends on it + // in contrast, the ROC-in-channel numbering is determined by hardware --> better to use the "offline" scheme + PixelFEDChannel ch = {fed->id(), linkId, 25, 0}; + for (unsigned int iRoc = 1; iRoc <= link->numberOfROCs(); iRoc++) { + const sipixelobjects::PixelROC * roc = link->roc(iRoc); + if (roc->idInDetUnit() < ch.roc_first) ch.roc_first = roc->idInDetUnit(); + if (roc->idInDetUnit() > ch.roc_last) ch.roc_last = roc->idInDetUnit(); + } + if (ch.roc_first& errorDetSet = cpu.errorcollection.find_or_insert(dummydetid); + errorDetSet.data = nodeterrors; + } +} + + +// define as framework plugin +DEFINE_FWK_MODULE(SiPixelRawToClusterHeterogeneous); diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc deleted file mode 100644 index 92089d50cb58e..0000000000000 --- a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.cc +++ /dev/null @@ -1,587 +0,0 @@ -// This code is an entry point for GPU based pixel track reconstruction for HLT -// Modified by Sushil and Shashi for this purpose July-2017 - -// C++ includes -#include -#include -#include -#include - -// CUDA kincludes -#include -#include - -// ROOT includes -#include -#include - -// CMSSW includes -#include "CondFormats/SiPixelObjects/interface/SiPixelFedCablingMap.h" -#include "CondFormats/SiPixelObjects/interface/SiPixelFedCablingTree.h" -#include "CondFormats/SiPixelObjects/interface/SiPixelQuality.h" -#include "DataFormats/Common/interface/DetSetVector.h" -#include "DataFormats/Common/interface/Handle.h" -#include "DataFormats/DetId/interface/DetIdCollection.h" -#include "DataFormats/FEDRawData/interface/FEDNumbering.h" -#include "DataFormats/FEDRawData/interface/FEDRawData.h" -#include "DataFormats/FEDRawData/interface/FEDRawDataCollection.h" -#include "DataFormats/SiPixelCluster/interface/SiPixelCluster.h" -#include "DataFormats/SiPixelDetId/interface/PixelFEDChannel.h" -#include "DataFormats/SiPixelDigi/interface/PixelDigi.h" -#include "DataFormats/SiPixelRawData/interface/SiPixelRawDataError.h" -#include "EventFilter/SiPixelRawToDigi/interface/PixelDataFormatter.h" -#include "EventFilter/SiPixelRawToDigi/interface/PixelUnpackingRegions.h" -#include "FWCore/Framework/interface/ConsumesCollector.h" -#include "FWCore/Framework/interface/ESHandle.h" -#include "FWCore/Framework/interface/ESTransientHandle.h" -#include "FWCore/Framework/interface/MakerMacros.h" -#include "FWCore/MessageLogger/interface/MessageLogger.h" -#include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h" -#include "FWCore/ParameterSet/interface/ParameterSetDescription.h" -#include "FWCore/PluginManager/interface/ModuleDef.h" -#include "Geometry/Records/interface/TrackerDigiGeometryRecord.h" -#include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h" -#include "HeterogeneousCore/CUDAUtilities/interface/cudaCheck.h" - -// local includes -#include "SiPixelFedCablingMapGPU.h" -#include "SiPixelRawToDigiGPU.h" -#include "SiPixelRawToDigiGPUKernel.h" - -namespace { -struct AccretionCluster { - typedef unsigned short UShort; - static constexpr UShort MAXSIZE = 256; - UShort adc[MAXSIZE]; - UShort x[MAXSIZE]; - UShort y[MAXSIZE]; - UShort xmin=16000; - UShort ymin=16000; - unsigned int isize=0; - int charge=0; - - void clear() { - isize=0; - charge=0; - xmin=16000; - ymin=16000; - } - - bool add(SiPixelCluster::PixelPos const & p, UShort const iadc) { - if (isize==MAXSIZE) return false; - xmin=std::min(xmin,(unsigned short)(p.row())); - ymin=std::min(ymin,(unsigned short)(p.col())); - adc[isize]=iadc; - x[isize]=p.row(); - y[isize++]=p.col(); - charge+=iadc; - return true; - } - }; -} - - -using namespace std; - -// ----------------------------------------------------------------------------- -SiPixelRawToDigiGPU::SiPixelRawToDigiGPU( const edm::ParameterSet& conf ) - : config_(conf), - badPixelInfo_(nullptr), - regions_(nullptr), - hCPU(nullptr), hDigi(nullptr), - theSiPixelGainCalibration_(conf) -{ - includeErrors = config_.getParameter("IncludeErrors"); - useQuality = config_.getParameter("UseQualityInfo"); - if (config_.exists("ErrorList")) { - tkerrorlist = config_.getParameter > ("ErrorList"); - } - if (config_.exists("UserErrorList")) { - usererrorlist = config_.getParameter > ("UserErrorList"); - } - tFEDRawDataCollection = consumes (config_.getParameter("InputLabel")); - debug = config_.getParameter("enableErrorDebug"); - - //start counters - ndigis = 0; - nwords = 0; - - // Products - produces< edm::DetSetVector >(); - produces(); - if (includeErrors) { - produces< edm::DetSetVector >(); - produces(); - produces("UserErrorModules"); - produces >(); - } - - // GPU "product" - produces>(); - - // regions - if (config_.exists("Regions")) { - if (!config_.getParameter("Regions").getParameterNames().empty()) - { - regions_ = new PixelUnpackingRegions(config_, consumesCollector()); - } - } - - // Timing - bool timing = config_.getUntrackedParameter("Timing",false); - if (timing) { - theTimer.reset( new edm::CPUTimer ); - hCPU = new TH1D ("hCPU","hCPU",100,0.,0.050); - hDigi = new TH1D("hDigi","hDigi",50,0.,15000.); - } - - // Control the usage of pilot-blade data, FED=40 - usePilotBlade = false; - if (config_.exists("UsePilotBlade")) { - usePilotBlade = config_.getParameter ("UsePilotBlade"); - if (usePilotBlade) edm::LogInfo("SiPixelRawToDigiGPU") << " Use pilot blade data (FED 40)"; - } - - // Control the usage of phase1 - usePhase1 = false; - if (config_.exists("UsePhase1")) { - usePhase1 = config_.getParameter ("UsePhase1"); - if (usePhase1) edm::LogInfo("SiPixelRawToDigiGPU") << " Using phase1"; - } - // CablingMap could have a label //Tav - cablingMapLabel = config_.getParameter ("CablingMapLabel"); - - // GPU specific - convertADCtoElectrons = config_.getParameter("ConvertADCtoElectrons"); - - // device copy of GPU friendly cablng map - allocateCablingMap(cablingMapGPUHost_, cablingMapGPUDevice_); - - int WSIZE = MAX_FED * pixelgpudetails::MAX_WORD * sizeof(unsigned int); - cudaMallocHost(&word, sizeof(unsigned int)*WSIZE); - cudaMallocHost(&fedId_h, sizeof(unsigned char)*WSIZE); - - // to store the output of RawToDigi - cudaMallocHost(&pdigi_h, sizeof(uint32_t)*WSIZE); - cudaMallocHost(&rawIdArr_h, sizeof(uint32_t)*WSIZE); - - cudaMallocHost(&adc_h, sizeof(uint16_t)*WSIZE); - cudaMallocHost(&clus_h, sizeof(int32_t)*WSIZE); - - uint32_t vsize = sizeof(GPU::SimpleVector); - uint32_t esize = sizeof(pixelgpudetails::error_obj); - cudaCheck(cudaMallocHost(&error_h, vsize)); - cudaCheck(cudaMallocHost(&error_h_tmp, vsize)); - cudaCheck(cudaMallocHost(&data_h, MAX_FED*pixelgpudetails::MAX_WORD*esize)); - - // allocate memory for RawToDigi on GPU - context_ = pixelgpudetails::initDeviceMemory(); - - new (error_h) GPU::SimpleVector(MAX_FED*pixelgpudetails::MAX_WORD, data_h); - new (error_h_tmp) GPU::SimpleVector(MAX_FED*pixelgpudetails::MAX_WORD, context_.data_d); - assert(error_h->size() == 0); - assert(error_h->capacity() == static_cast(MAX_FED*pixelgpudetails::MAX_WORD)); - assert(error_h_tmp->size() == 0); - assert(error_h_tmp->capacity() == static_cast(MAX_FED*pixelgpudetails::MAX_WORD)); -} - -// ----------------------------------------------------------------------------- -SiPixelRawToDigiGPU::~SiPixelRawToDigiGPU() { - edm::LogInfo("SiPixelRawToDigiGPU") << " HERE ** SiPixelRawToDigiGPU destructor!"; - - if (regions_) delete regions_; - - if (theTimer) { - TFile rootFile("analysis.root", "RECREATE", "my histograms"); - hCPU->Write(); - hDigi->Write(); - } - cudaFreeHost(word); - cudaFreeHost(fedId_h); - cudaFreeHost(pdigi_h); - cudaFreeHost(rawIdArr_h); - cudaFreeHost(adc_h); - cudaFreeHost(clus_h); - cudaFreeHost(error_h); - cudaFreeHost(error_h_tmp); - cudaFreeHost(data_h); - - // release device memory for cabling map - deallocateCablingMap(cablingMapGPUHost_, cablingMapGPUDevice_); - - // free gains device memory - cudaCheck(cudaFree(gainForHLTonGPU_)); - cudaCheck(cudaFree(gainDataOnGPU_)); - - // free device memory used for RawToDigi on GPU - freeMemory(context_); - - // free auxilary memory used for clustering - // freeDeviceMemCluster(); - // free device memory used for CPE on GPU - // freeDeviceMemCPE(); -} - -void -SiPixelRawToDigiGPU::fillDescriptions(edm::ConfigurationDescriptions& descriptions) { - edm::ParameterSetDescription desc; - desc.add("IncludeErrors",true); - desc.add("UseQualityInfo",false); - { - std::vector temp1; - temp1.reserve(1); - temp1.push_back(29); - desc.add >("ErrorList",temp1)->setComment("## ErrorList: list of error codes used by tracking to invalidate modules"); - } - { - std::vector temp1; - temp1.reserve(1); - temp1.push_back(40); - desc.add >("UserErrorList",temp1)->setComment("## UserErrorList: list of error codes used by Pixel experts for investigation"); - } - desc.add("InputLabel",edm::InputTag("siPixelRawData")); - { - edm::ParameterSetDescription psd0; - psd0.addOptional>("inputs"); - psd0.addOptional>("deltaPhi"); - psd0.addOptional>("maxZ"); - psd0.addOptional("beamSpot"); - desc.add("Regions",psd0)->setComment("## Empty Regions PSet means complete unpacking"); - } - desc.addUntracked("Timing",false); - desc.add("UsePilotBlade",false)->setComment("## Use pilot blades"); - desc.add("UsePhase1",false)->setComment("## Use phase1"); - desc.add("CablingMapLabel","")->setComment("CablingMap label"); //Tav - desc.addOptional("CheckPixelOrder"); // never used, kept for back-compatibility - desc.add("ConvertADCtoElectrons", false)->setComment("## do the calibration ADC-> Electron and apply the threshold, requried for clustering"); - desc.add("enableErrorDebug",false); - descriptions.add("siPixelRawToDigiGPU",desc); -} - -// ----------------------------------------------------------------------------- -void -SiPixelRawToDigiGPU::produce( edm::Event& ev, const edm::EventSetup& es) -{ - // setup gain calibration service - theSiPixelGainCalibration_.setESObjects( es ); - - edm::ESHandle trackerTopologyHandle; - es.get().get(trackerTopologyHandle); - tTopo_ = trackerTopologyHandle.product(); - - - int theWordCounter = 0; - int theDigiCounter = 0; - const uint32_t dummydetid = 0xffffffff; - - // initialize quality record or update if necessary - if (qualityWatcher.check( es ) && useQuality) { - // quality info for dead pixel modules or ROCs - edm::ESHandle qualityInfo; - es.get().get( qualityInfo ); - badPixelInfo_ = qualityInfo.product(); - if (!badPixelInfo_) { - edm::LogError("SiPixelQualityNotPresent") << " Configured to use SiPixelQuality, but SiPixelQuality not present" << endl; - } - } - - std::set modules; - if (regions_) { - regions_->run(ev, es); - LogDebug("SiPixelRawToDigiGPU") << "region2unpack #feds: " << regions_->nFEDs(); - LogDebug("SiPixelRawToDigiGPU") << "region2unpack #modules (BPIX,EPIX,total): " << regions_->nBarrelModules() << " " << regions_->nForwardModules() << " " << regions_->nModules(); - modules = *(regions_->modulesToUnpack()); - } - - // initialize cabling map or update if necessary - if (recordWatcher.check( es )) { - // tracker geometry: to make sure numbering of DetId is consistent... - edm::ESHandle geom; - // get the TrackerGeom - es.get().get( geom ); - - // cabling map, which maps online address (fed->link->ROC->local pixel) to offline (DetId->global pixel) - edm::ESTransientHandle cablingMap; - es.get().get( cablingMapLabel, cablingMap ); //Tav - fedIds = cablingMap->fedIds(); - cabling_ = cablingMap->cablingTree(); - LogDebug("map version:") << cabling_->version(); - - // convert the cabling map to a GPU-friendly version - processCablingMap(*cablingMap, *geom.product(), cablingMapGPUHost_, cablingMapGPUDevice_, badPixelInfo_, modules); - processGainCalibration(theSiPixelGainCalibration_.payload(), *geom.product(), gainForHLTonGPU_, gainDataOnGPU_); - } - - edm::Handle buffers; - ev.getByToken(tFEDRawDataCollection, buffers); - - // create product (digis & errors) - auto collection = std::make_unique>(); - // collection->reserve(8*1024); - auto errorcollection = std::make_unique>(); - auto tkerror_detidcollection = std::make_unique(); - auto usererror_detidcollection = std::make_unique(); - auto disabled_channelcollection = std::make_unique >(); - - // create product (clusters); - auto outputClusters = std::make_unique< SiPixelClusterCollectionNew>(); - - - //PixelDataFormatter formatter(cabling_.get()); // phase 0 only - PixelDataFormatter formatter(cabling_.get(), usePhase1); // for phase 1 & 0 - PixelDataFormatter::DetErrors nodeterrors; - PixelDataFormatter::Errors errors; - - if (theTimer) theTimer->start(); - - // GPU specific: Data extraction for RawToDigi GPU - unsigned int wordCounterGPU = 0; - unsigned int fedCounter = 0; - bool errorsInEvent = false; - - edm::DetSet * detDigis=nullptr; - - ErrorChecker errorcheck; - for (auto aFed = fedIds.begin(); aFed != fedIds.end(); ++aFed) { - int fedId = *aFed; - - if (!usePilotBlade && (fedId==40) ) continue; // skip pilot blade data - if (regions_ && !regions_->mayUnpackFED(fedId)) continue; - - // for GPU - // first 150 index stores the fedId and next 150 will store the - // start index of word in that fed - assert(fedId>=1200); - fedCounter++; - - // get event data for this fed - const FEDRawData& rawData = buffers->FEDData( fedId ); - - // GPU specific - int nWords = rawData.size()/sizeof(cms_uint64_t); - if (nWords == 0) { - continue; - } - - // check CRC bit - const cms_uint64_t* trailer = reinterpret_cast(rawData.data())+(nWords-1); - if (not errorcheck.checkCRC(errorsInEvent, fedId, trailer, errors)) { - continue; - } - - // check headers - const cms_uint64_t* header = reinterpret_cast(rawData.data()); header--; - bool moreHeaders = true; - while (moreHeaders) { - header++; - bool headerStatus = errorcheck.checkHeader(errorsInEvent, fedId, header, errors); - moreHeaders = headerStatus; - } - - // check trailers - bool moreTrailers = true; - trailer++; - while (moreTrailers) { - trailer--; - bool trailerStatus = errorcheck.checkTrailer(errorsInEvent, fedId, nWords, trailer, errors); - moreTrailers = trailerStatus; - } - - theWordCounter += 2*(nWords-2); - - const cms_uint32_t * bw = (const cms_uint32_t *)(header+1); - const cms_uint32_t * ew = (const cms_uint32_t *)(trailer); - - assert(0 == (ew-bw)%2); - std::memcpy(word+wordCounterGPU,bw,sizeof(cms_uint32_t)*(ew-bw)); - std::memset(fedId_h+wordCounterGPU/2,fedId - 1200,(ew-bw)/2); - wordCounterGPU+=(ew-bw); - - } // end of for loop - - // GPU specific: RawToDigi -> clustering - uint32_t nModulesActive=0; - RawToDigi_wrapper(context_, cablingMapGPUDevice_, gainForHLTonGPU_, wordCounterGPU, word, fedCounter, - fedId_h, convertADCtoElectrons, pdigi_h, rawIdArr_h, error_h, error_h_tmp, data_h, - adc_h, clus_h, - useQuality, includeErrors, debug, nModulesActive); - - auto gpuProd = std::make_unique>(); - gpuProd->resize(3); - (*gpuProd)[0]=uint64_t(&context_); - (*gpuProd)[1]=wordCounterGPU; - (*gpuProd)[2]=nModulesActive; - ev.put(std::move(gpuProd)); - - for (uint32_t i = 0; i < wordCounterGPU; i++) { - if (pdigi_h[i]==0) continue; - detDigis = &(*collection).find_or_insert(rawIdArr_h[i]); - if ( (*detDigis).empty() ) (*detDigis).data.reserve(32); // avoid the first relocations - break; - } - - int32_t nclus=-1; - std::vector aclusters(256); - auto totCluseFilled=0; - - auto fillClusters = [&](uint32_t detId){ - if (nclus<0) return; // this in reality should never happen - edmNew::DetSetVector::FastFiller spc(*outputClusters, detId); - auto layer = (DetId(detId).subdetId()==1) ? tTopo_->pxbLayer(detId) : 0; - auto clusterThreshold = (layer==1) ? 2000 : 4000; - for (int32_t ic=0; ic 109999); - if ( (*detDigis).detId() != rawIdArr_h[i]) - { - fillClusters((*detDigis).detId()); - assert(nclus==-1); - detDigis = &(*collection).find_or_insert(rawIdArr_h[i]); - if ( (*detDigis).empty() ) - (*detDigis).data.reserve(32); // avoid the first relocations - else { std::cout << "Problem det present twice in input! " << (*detDigis).detId() << std::endl; } - } - (*detDigis).data.emplace_back(pdigi_h[i]); - auto const & dig = (*detDigis).data.back(); - // fill clusters - assert(clus_h[i]>=0); - assert(clus_h[i]<256); - nclus = std::max(clus_h[i],nclus); - auto row = dig.row(); - auto col = dig.column(); - SiPixelCluster::PixelPos pix(row,col); - aclusters[clus_h[i]].add(pix,adc_h[i]); - theDigiCounter++; - } - - // fill final clusters - fillClusters((*detDigis).detId()); - //std::cout << "filled " << totCluseFilled << " clusters" << std::endl; - - auto size = error_h->size(); - for (auto i = 0; i < size; i++) { - pixelgpudetails::error_obj err = (*error_h)[i]; - if (err.errorType != 0) { - SiPixelRawDataError error(err.word, err.errorType, err.fedId + 1200); - errors[err.rawId].push_back(error); - } - } - - if (theTimer) { - theTimer->stop(); - LogDebug("SiPixelRawToDigiGPU") << "TIMING IS: (real)" << theTimer->realTime() ; - ndigis += theDigiCounter; - nwords += theWordCounter; - LogDebug("SiPixelRawToDigiGPU") << " (Words/Digis) this ev: " - << theWordCounter << "/" << theDigiCounter << "--- all :" << nwords << "/" << ndigis; - hCPU->Fill(theTimer->realTime()); - hDigi->Fill(theDigiCounter); - } - - // pack errors into collection - if (includeErrors) { - - typedef PixelDataFormatter::Errors::iterator IE; - for (IE is = errors.begin(); is != errors.end(); is++) { - - uint32_t errordetid = is->first; - if (errordetid == dummydetid) {// errors given dummy detId must be sorted by Fed - nodeterrors.insert( nodeterrors.end(), errors[errordetid].begin(), errors[errordetid].end() ); - } - else { - edm::DetSet& errorDetSet = errorcollection->find_or_insert(errordetid); - errorDetSet.data.insert(errorDetSet.data.end(), is->second.begin(), is->second.end()); - // Fill detid of the detectors where there is error AND the error number is listed - // in the configurable error list in the job option cfi. - // Code needs to be here, because there can be a set of errors for each - // entry in the for loop over PixelDataFormatter::Errors - - std::vector disabledChannelsDetSet; - - for (auto const& aPixelError : errorDetSet) { - // For the time being, we extend the error handling functionality with ErrorType 25 - // In the future, we should sort out how the usage of tkerrorlist can be generalized - if (aPixelError.getType() == 25) { - int fedId = aPixelError.getFedId(); - const sipixelobjects::PixelFEDCabling* fed = cabling_->fed(fedId); - if (fed) { - cms_uint32_t linkId = formatter.linkId(aPixelError.getWord32()); - const sipixelobjects::PixelFEDLink* link = fed->link(linkId); - if (link) { - // The "offline" 0..15 numbering is fixed by definition, also, the FrameConversion depends on it - // in contrast, the ROC-in-channel numbering is determined by hardware --> better to use the "offline" scheme - PixelFEDChannel ch = {fed->id(), linkId, 25, 0}; - for (unsigned int iRoc = 1; iRoc <= link->numberOfROCs(); iRoc++) { - const sipixelobjects::PixelROC * roc = link->roc(iRoc); - if (roc->idInDetUnit() < ch.roc_first) ch.roc_first = roc->idInDetUnit(); - if (roc->idInDetUnit() > ch.roc_last) ch.roc_last = roc->idInDetUnit(); - } - if (ch.roc_first::iterator it_find = find(tkerrorlist.begin(), tkerrorlist.end(), aPixelError.getType()); - if (it_find != tkerrorlist.end()) { - tkerror_detidcollection->push_back(errordetid); - } - } - } - - // fill list of detIds with errors to be studied - if (!usererrorlist.empty()) { - std::vector::iterator it_find = find(usererrorlist.begin(), usererrorlist.end(), aPixelError.getType()); - if (it_find != usererrorlist.end()) { - usererror_detidcollection->push_back(errordetid); - } - } - - } // loop on DetSet of errors - - if (!disabledChannelsDetSet.empty()) { - disabled_channelcollection->insert(errordetid, disabledChannelsDetSet.data(), disabledChannelsDetSet.size()); - } - - } // if error assigned to a real DetId - } // loop on errors in event for this FED - } // if errors to be included in the event - - if (includeErrors) { - edm::DetSet& errorDetSet = errorcollection->find_or_insert(dummydetid); - errorDetSet.data = nodeterrors; - } - - // send digis clusters and errors back to framework - // std::cout << "Number of Clusters from GPU to CPU " << (*outputClusters).data().size() << std::endl; - ev.put(std::move(collection)); - ev.put(std::move(outputClusters)); - if (includeErrors) { - ev.put(std::move(errorcollection)); - ev.put(std::move(tkerror_detidcollection)); - ev.put(std::move(usererror_detidcollection), "UserErrorModules"); - ev.put(std::move(disabled_channelcollection)); - } - -} // end of produce function - -// define as framework plugin -DEFINE_FWK_MODULE(SiPixelRawToDigiGPU); diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.h b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.h deleted file mode 100644 index 76f7f7f256e70..0000000000000 --- a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPU.h +++ /dev/null @@ -1,94 +0,0 @@ -#ifndef SiPixelRawToDigiGPU_H -#define SiPixelRawToDigiGPU_H - -/** \class SiPixelRawToDigiGPU_H - * Plug-in module that performs Raw data to digi conversion - * for pixel subdetector - */ - -#include "CalibTracker/SiPixelESProducers/interface/SiPixelGainCalibrationForHLTService.h" -#include "CondFormats/DataRecord/interface/SiPixelFedCablingMapRcd.h" -#include "CondFormats/DataRecord/interface/SiPixelQualityRcd.h" -#include "DataFormats/FEDRawData/interface/FEDRawDataCollection.h" -#include "DataFormats/TrackerCommon/interface/TrackerTopology.h" -#include "FWCore/Framework/interface/ConsumesCollector.h" -#include "FWCore/Framework/interface/ESWatcher.h" -#include "FWCore/Framework/interface/Event.h" -#include "FWCore/Framework/interface/EventSetup.h" -#include "FWCore/Framework/interface/stream/EDProducer.h" -#include "FWCore/ParameterSet/interface/ParameterSet.h" -#include "FWCore/Utilities/interface/CPUTimer.h" -#include "SiPixelRawToDigiGPUKernel.h" - -class PixelUnpackingRegions; -class SiPixelFedCablingTree; -class SiPixelFedCabling; -class SiPixelQuality; -class TH1D; -class SiPixelGainForHLTonGPU; -struct SiPixelGainForHLTonGPU_DecodingStructure; - -class SiPixelRawToDigiGPU : public edm::stream::EDProducer<> -{ -public: - - /// ctor - explicit SiPixelRawToDigiGPU( const edm::ParameterSet& ); - - /// dtor - ~SiPixelRawToDigiGPU() override; - - static void fillDescriptions(edm::ConfigurationDescriptions& descriptions); - - /// get data, convert to digis attach againe to Event - void produce( edm::Event&, const edm::EventSetup& ) override; - -private: - edm::ParameterSet config_; - std::unique_ptr cabling_; - const SiPixelQuality* badPixelInfo_; - PixelUnpackingRegions* regions_; - edm::EDGetTokenT tFEDRawDataCollection; - const TrackerTopology* tTopo_; // needed to get correct layer number - - TH1D *hCPU, *hDigi; - std::unique_ptr theTimer; - bool includeErrors; - bool useQuality; - bool debug; - std::vector tkerrorlist; - std::vector usererrorlist; - std::vector fedIds; - edm::ESWatcher recordWatcher; - edm::ESWatcher qualityWatcher; - edm::InputTag label; - int ndigis; - int nwords; - bool usePilotBlade; - bool usePhase1; - std::string cablingMapLabel; - - bool convertADCtoElectrons; - unsigned int *word; // to hold input for rawtodigi - unsigned char *fedId_h; // to hold fed index for each word - - // to store the output - uint32_t *pdigi_h, *rawIdArr_h; // host copy of output - uint16_t * adc_h; int32_t * clus_h; // host copy of calib&clus output - pixelgpudetails::error_obj *data_h = nullptr; - GPU::SimpleVector *error_h = nullptr; - GPU::SimpleVector *error_h_tmp = nullptr; - - // configuration and memory buffers alocated on the GPU - pixelgpudetails::context context_; - SiPixelFedCablingMapGPU * cablingMapGPUHost_; - SiPixelFedCablingMapGPU * cablingMapGPUDevice_; - - // gain calib - SiPixelGainCalibrationForHLTService theSiPixelGainCalibration_; - SiPixelGainForHLTonGPU * gainForHLTonGPU_ = nullptr; - SiPixelGainForHLTonGPU_DecodingStructure * gainDataOnGPU_ = nullptr; - -}; - -#endif diff --git a/EventFilter/SiPixelRawToDigi/plugins/siPixelRawToClusterHeterogeneousProduct.h b/EventFilter/SiPixelRawToDigi/plugins/siPixelRawToClusterHeterogeneousProduct.h new file mode 100644 index 0000000000000..6d6da10934532 --- /dev/null +++ b/EventFilter/SiPixelRawToDigi/plugins/siPixelRawToClusterHeterogeneousProduct.h @@ -0,0 +1,64 @@ +#ifndef EventFilter_SiPixelRawToDigi_siPixelRawToClusterHeterogeneousProduct_h +#define EventFilter_SiPixelRawToDigi_siPixelRawToClusterHeterogeneousProduct_h + +#include "DataFormats/Common/interface/DetSetVector.h" +#include "DataFormats/SiPixelCluster/interface/SiPixelCluster.h" +#include "DataFormats/DetId/interface/DetIdCollection.h" +#include "DataFormats/SiPixelDetId/interface/PixelFEDChannel.h" +#include "DataFormats/SiPixelDigi/interface/PixelDigi.h" +#include "DataFormats/SiPixelRawData/interface/SiPixelRawDataError.h" +#include "FWCore/Utilities/interface/typedefs.h" +#include "HeterogeneousCore/CUDAUtilities/interface/GPUSimpleVector.h" +#include "HeterogeneousCore/Product/interface/HeterogeneousProduct.h" + +namespace siPixelRawToClusterHeterogeneousProduct { + struct CPUProduct { + edm::DetSetVector collection; + edm::DetSetVector errorcollection; + DetIdCollection tkerror_detidcollection; + DetIdCollection usererror_detidcollection; + edmNew::DetSetVector disabled_channelcollection; + SiPixelClusterCollectionNew outputClusters; + }; + + struct error_obj { + uint32_t rawId; + uint32_t word; + unsigned char errorType; + unsigned char fedId; + + constexpr + error_obj(uint32_t a, uint32_t b, unsigned char c, unsigned char d): + rawId(a), + word(b), + errorType(c), + fedId(d) + { } + }; + + struct GPUProduct { + // Needed for digi and cluster CPU output + uint32_t const * pdigi_h = nullptr; + uint32_t const * rawIdArr_h = nullptr; + int32_t const * clus_h = nullptr; + uint16_t const * adc_h = nullptr; + GPU::SimpleVector const * error_h = nullptr; + + // Needed for GPU rechits + uint32_t nDigis; + uint32_t nModules; + uint16_t const * xx_d; + uint16_t const * yy_d; + uint16_t const * adc_d; + uint16_t const * moduleInd_d; + uint32_t const * moduleStart_d; + int32_t const * clus_d; + uint32_t const * clusInModule_d; + uint32_t const * moduleId_d; + }; + + using HeterogeneousDigiCluster = HeterogeneousProductImpl, + heterogeneous::GPUCudaProduct >; +} + +#endif diff --git a/EventFilter/SiPixelRawToDigi/python/SiPixelRawToDigi_cfi.py b/EventFilter/SiPixelRawToDigi/python/SiPixelRawToDigi_cfi.py index 538fd3dc97588..6567e35a24704 100644 --- a/EventFilter/SiPixelRawToDigi/python/SiPixelRawToDigi_cfi.py +++ b/EventFilter/SiPixelRawToDigi/python/SiPixelRawToDigi_cfi.py @@ -1,6 +1,6 @@ import FWCore.ParameterSet.Config as cms import EventFilter.SiPixelRawToDigi.siPixelRawToDigi_cfi -import EventFilter.SiPixelRawToDigi.siPixelRawToDigiGPU_cfi +import EventFilter.SiPixelRawToDigi.siPixelDigiHeterogeneousConverter_cfi siPixelDigis = EventFilter.SiPixelRawToDigi.siPixelRawToDigi_cfi.siPixelRawToDigi.clone() siPixelDigis.Timing = cms.untracked.bool(False) @@ -19,30 +19,12 @@ siPixelDigis.Regions = cms.PSet( ) siPixelDigis.CablingMapLabel = cms.string("") -siPixelDigisGPU = EventFilter.SiPixelRawToDigi.siPixelRawToDigiGPU_cfi.siPixelRawToDigiGPU.clone() -siPixelDigisGPU.Timing = cms.untracked.bool(False) -siPixelDigisGPU.IncludeErrors = cms.bool(True) -siPixelDigisGPU.InputLabel = cms.InputTag("rawDataCollector") -siPixelDigisGPU.UseQualityInfo = cms.bool(False) -## ErrorList: list of error codes used by tracking to invalidate modules -siPixelDigisGPU.ErrorList = cms.vint32(29) -## UserErrorList: list of error codes used by Pixel experts for investigation -siPixelDigisGPU.UserErrorList = cms.vint32(40) -## Use pilot blades -siPixelDigisGPU.UsePilotBlade = cms.bool(False) -## Use phase1 -siPixelDigisGPU.UsePhase1 = cms.bool(False) -## Empty Regions PSet means complete unpacking -siPixelDigisGPU.Regions = cms.PSet( ) -siPixelDigisGPU.CablingMapLabel = cms.string("") -siPixelDigisGPU.enableErrorDebug = cms.bool(False) - from Configuration.Eras.Modifier_phase1Pixel_cff import phase1Pixel phase1Pixel.toModify(siPixelDigis, UsePhase1=True) -phase1Pixel.toModify(siPixelDigisGPU, UsePhase1=True) -# In principle I would like to hide the name 'siPixelDigisGPU', but it -# is used in test/runRawToDigi_GPU_phase1.py which I also don't want -# to break +_siPixelDigis_gpu = EventFilter.SiPixelRawToDigi.siPixelDigiHeterogeneousConverter_cfi.siPixelDigiHeterogeneousConverter.clone() +_siPixelDigis_gpu.includeErrors = cms.bool(True) + from Configuration.ProcessModifiers.gpu_cff import gpu -gpu.toReplaceWith(siPixelDigis, siPixelDigisGPU) +gpu.toReplaceWith(siPixelDigis, _siPixelDigis_gpu) + diff --git a/EventFilter/SiPixelRawToDigi/python/siPixelDigisHeterogeneous_cfi.py b/EventFilter/SiPixelRawToDigi/python/siPixelDigisHeterogeneous_cfi.py new file mode 100644 index 0000000000000..52d27084dc817 --- /dev/null +++ b/EventFilter/SiPixelRawToDigi/python/siPixelDigisHeterogeneous_cfi.py @@ -0,0 +1,37 @@ +import FWCore.ParameterSet.Config as cms + +from EventFilter.SiPixelRawToDigi.siPixelDigisHeterogeneousDefault_cfi import siPixelDigisHeterogeneousDefault as _siPixelDigisHeterogeneousDefault +siPixelDigisHeterogeneous = _siPixelDigisHeterogeneousDefault.clone() + +# following copied from SiPixelRawToDigi_cfi +siPixelDigisHeterogeneous.IncludeErrors = cms.bool(True) +siPixelDigisHeterogeneous.InputLabel = cms.InputTag("rawDataCollector") +siPixelDigisHeterogeneous.UseQualityInfo = cms.bool(False) +## ErrorList: list of error codes used by tracking to invalidate modules +siPixelDigisHeterogeneous.ErrorList = cms.vint32(29) +## UserErrorList: list of error codes used by Pixel experts for investigation +siPixelDigisHeterogeneous.UserErrorList = cms.vint32(40) +## Use pilot blades +siPixelDigisHeterogeneous.UsePilotBlade = cms.bool(False) +## Use phase1 +siPixelDigisHeterogeneous.UsePhase1 = cms.bool(False) +## Empty Regions PSet means complete unpacking +siPixelDigisHeterogeneous.Regions = cms.PSet( ) +siPixelDigisHeterogeneous.CablingMapLabel = cms.string("") + +# The following is copied from siPixelClusters_cfi, clearly not +# maintainable in the long run +from Configuration.Eras.Modifier_phase1Pixel_cff import phase1Pixel +phase1Pixel.toModify(siPixelDigisHeterogeneous, + VCaltoElectronGain = cms.int32(47), # L2-4: 47 +- 4.7 + VCaltoElectronGain_L1 = cms.int32(50), # L1: 49.6 +- 2.6 + VCaltoElectronOffset = cms.int32(-60), # L2-4: -60 +- 130 + VCaltoElectronOffset_L1 = cms.int32(-670), # L1: -670 +- 220 + ChannelThreshold = cms.int32(10), + SeedThreshold = cms.int32(1000), + ClusterThreshold = cms.int32(4000), + ClusterThreshold_L1 = cms.int32(2000) +) + +# The following is copied from SiPixelRawToDigi_cfi +phase1Pixel.toModify(siPixelDigisHeterogeneous, UsePhase1=True) diff --git a/HeterogeneousCore/CUDAUtilities/interface/GPUSimpleVector.h b/HeterogeneousCore/CUDAUtilities/interface/GPUSimpleVector.h index 94769ca7351d1..ad1aa12332ae2 100644 --- a/HeterogeneousCore/CUDAUtilities/interface/GPUSimpleVector.h +++ b/HeterogeneousCore/CUDAUtilities/interface/GPUSimpleVector.h @@ -10,14 +10,14 @@ namespace GPU { template struct SimpleVector { // Constructors - __host__ __device__ SimpleVector(int capacity, T *data) // ownership of m_data stays within the caller + constexpr SimpleVector(int capacity, T *data) // ownership of m_data stays within the caller : m_size(0), m_capacity(capacity), m_data(data) { static_assert(std::is_trivially_destructible::value); } - __host__ __device__ SimpleVector() : SimpleVector(0) {} + constexpr SimpleVector() : SimpleVector(0) {} - __inline__ __host__ __device__ int push_back_unsafe(const T &element) { + __inline__ constexpr int push_back_unsafe(const T &element) { auto previousSize = m_size; m_size++; if (previousSize < m_capacity) { @@ -29,7 +29,7 @@ template struct SimpleVector { } } - template __host__ __device__ int emplace_back_unsafe(Ts &&... args) { + template constexpr int emplace_back_unsafe(Ts &&... args) { auto previousSize = m_size; m_size++; if (previousSize < m_capacity) { @@ -41,7 +41,7 @@ template struct SimpleVector { } } - __inline__ __host__ __device__ T & back() const { + __inline__ constexpr T & back() const { if (m_size > 0) { return m_data[m_size - 1]; @@ -74,19 +74,19 @@ template struct SimpleVector { } #endif - __inline__ __host__ __device__ T& operator[](int i) const { return m_data[i]; } + __inline__ constexpr T& operator[](int i) const { return m_data[i]; } - __inline__ __host__ __device__ void reset() { m_size = 0; } + __inline__ constexpr void reset() { m_size = 0; } - __inline__ __host__ __device__ int size() const { return m_size; } + __inline__ constexpr int size() const { return m_size; } - __inline__ __host__ __device__ int capacity() const { return m_capacity; } + __inline__ constexpr int capacity() const { return m_capacity; } - __inline__ __host__ __device__ T *data() const { return m_data; } + __inline__ constexpr T *data() const { return m_data; } - __inline__ __host__ __device__ void resize(int size) { m_size = size; } + __inline__ constexpr void resize(int size) { m_size = size; } - __inline__ __host__ __device__ void set_data(T * data) { m_data = data; } + __inline__ constexpr void set_data(T * data) { m_data = data; } private: diff --git a/RecoLocalTracker/SiPixelClusterizer/BuildFile.xml b/RecoLocalTracker/SiPixelClusterizer/BuildFile.xml new file mode 100644 index 0000000000000..b79cf8d4329c4 --- /dev/null +++ b/RecoLocalTracker/SiPixelClusterizer/BuildFile.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/RecoLocalTracker/SiPixelClusterizer/plugins/PixelClusterizerBase.h b/RecoLocalTracker/SiPixelClusterizer/interface/PixelClusterizerBase.h similarity index 100% rename from RecoLocalTracker/SiPixelClusterizer/plugins/PixelClusterizerBase.h rename to RecoLocalTracker/SiPixelClusterizer/interface/PixelClusterizerBase.h diff --git a/RecoLocalTracker/SiPixelClusterizer/plugins/PixelThresholdClusterizer.h b/RecoLocalTracker/SiPixelClusterizer/interface/PixelThresholdClusterizer.h similarity index 96% rename from RecoLocalTracker/SiPixelClusterizer/plugins/PixelThresholdClusterizer.h rename to RecoLocalTracker/SiPixelClusterizer/interface/PixelThresholdClusterizer.h index ea9acfc8f9cc9..ab36bd8642773 100644 --- a/RecoLocalTracker/SiPixelClusterizer/plugins/PixelThresholdClusterizer.h +++ b/RecoLocalTracker/SiPixelClusterizer/interface/PixelThresholdClusterizer.h @@ -42,10 +42,10 @@ // Pixel, PixelPos and Shift as inner classes. // #include "DataFormats/Common/interface/DetSetVector.h" -#include "PixelClusterizerBase.h" +#include "RecoLocalTracker/SiPixelClusterizer/interface/PixelClusterizerBase.h" // The private pixel buffer -#include "SiPixelArrayBuffer.h" +#include "RecoLocalTracker/SiPixelClusterizer/interface/SiPixelArrayBuffer.h" // Parameter Set: #include "FWCore/ParameterSet/interface/ParameterSet.h" @@ -56,7 +56,7 @@ #include -class dso_hidden PixelThresholdClusterizer final : public PixelClusterizerBase { +class PixelThresholdClusterizer final : public PixelClusterizerBase { public: PixelThresholdClusterizer(edm::ParameterSet const& conf); diff --git a/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelArrayBuffer.h b/RecoLocalTracker/SiPixelClusterizer/interface/SiPixelArrayBuffer.h similarity index 100% rename from RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelArrayBuffer.h rename to RecoLocalTracker/SiPixelClusterizer/interface/SiPixelArrayBuffer.h diff --git a/RecoLocalTracker/SiPixelClusterizer/plugins/BuildFile.xml b/RecoLocalTracker/SiPixelClusterizer/plugins/BuildFile.xml index f6958151bdb91..ec51e90aa3065 100644 --- a/RecoLocalTracker/SiPixelClusterizer/plugins/BuildFile.xml +++ b/RecoLocalTracker/SiPixelClusterizer/plugins/BuildFile.xml @@ -1,9 +1,5 @@ - - - - - + diff --git a/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelClusterProducer.cc b/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelClusterProducer.cc index 45ca9be5fd6c3..d9da8d77031ee 100644 --- a/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelClusterProducer.cc +++ b/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelClusterProducer.cc @@ -13,7 +13,7 @@ // Our own stuff #include "SiPixelClusterProducer.h" -#include "PixelThresholdClusterizer.h" +#include "RecoLocalTracker/SiPixelClusterizer/interface/PixelThresholdClusterizer.h" // Geometry #include "Geometry/Records/interface/TrackerDigiGeometryRecord.h" diff --git a/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelClusterProducer.h b/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelClusterProducer.h index e22eea15d2672..30169a62c0f49 100644 --- a/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelClusterProducer.h +++ b/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelClusterProducer.h @@ -28,7 +28,7 @@ //! //--------------------------------------------------------------------------- -#include "PixelClusterizerBase.h" +#include "RecoLocalTracker/SiPixelClusterizer/interface/PixelClusterizerBase.h" //#include "Geometry/CommonDetUnit/interface/TrackingGeometry.h" diff --git a/RecoLocalTracker/SiPixelClusterizer/plugins/gpuClustering.h b/RecoLocalTracker/SiPixelClusterizer/plugins/gpuClustering.h index 672a4dbe97450..df3caeb690090 100644 --- a/RecoLocalTracker/SiPixelClusterizer/plugins/gpuClustering.h +++ b/RecoLocalTracker/SiPixelClusterizer/plugins/gpuClustering.h @@ -1,18 +1,13 @@ #ifndef RecoLocalTracker_SiPixelClusterizer_plugins_gpuClustering_h #define RecoLocalTracker_SiPixelClusterizer_plugins_gpuClustering_h +#include "gpuClusteringConstants.h" + #include #include #include namespace gpuClustering { - - constexpr uint32_t MaxNumModules = 2000; - - constexpr uint32_t MaxNumPixels = 256*2000; // this does not mean maxPixelPerModule==256! - - constexpr uint16_t InvId=9999; // must be > MaxNumModules - __global__ void countModules(uint16_t const * id, uint32_t * moduleStart, int32_t * clus, diff --git a/RecoLocalTracker/SiPixelClusterizer/plugins/gpuClusteringConstants.h b/RecoLocalTracker/SiPixelClusterizer/plugins/gpuClusteringConstants.h new file mode 100644 index 0000000000000..2b87e6642743c --- /dev/null +++ b/RecoLocalTracker/SiPixelClusterizer/plugins/gpuClusteringConstants.h @@ -0,0 +1,14 @@ +#ifndef RecoLocalTracker_SiPixelClusterizer_plugins_gpuClusteringConstants_h +#define RecoLocalTracker_SiPixelClusterizer_plugins_gpuClusteringConstants_h + +#include + +namespace gpuClustering { + constexpr uint32_t MaxNumModules = 2000; + + constexpr uint32_t MaxNumPixels = 256*2000; // this does not mean maxPixelPerModule==256! + + constexpr uint16_t InvId=9999; // must be > MaxNumModules +} + +#endif diff --git a/RecoLocalTracker/SiPixelClusterizer/python/SiPixelClusterizer_cfi.py b/RecoLocalTracker/SiPixelClusterizer/python/SiPixelClusterizer_cfi.py index e92a2c08f849d..8d5a2f6f9dd1e 100644 --- a/RecoLocalTracker/SiPixelClusterizer/python/SiPixelClusterizer_cfi.py +++ b/RecoLocalTracker/SiPixelClusterizer/python/SiPixelClusterizer_cfi.py @@ -56,3 +56,7 @@ (premix_stage2 & phase2_tracker).toModify(siPixelClusters, src = "mixData:Pixel" ) + +from Configuration.ProcessModifiers.gpu_cff import gpu +from EventFilter.SiPixelRawToDigi.siPixelClusterHeterogeneousConverter_cfi import siPixelClusterHeterogeneousConverter as _siPixelClusterHeterogeneousConverter +gpu.toReplaceWith(siPixelClusters, _siPixelClusterHeterogeneousConverter.clone()) diff --git a/RecoLocalTracker/SiPixelClusterizer/plugins/PixelThresholdClusterizer.cc b/RecoLocalTracker/SiPixelClusterizer/src/PixelThresholdClusterizer.cc similarity index 99% rename from RecoLocalTracker/SiPixelClusterizer/plugins/PixelThresholdClusterizer.cc rename to RecoLocalTracker/SiPixelClusterizer/src/PixelThresholdClusterizer.cc index 51ab53b10759d..ae6999a05efed 100644 --- a/RecoLocalTracker/SiPixelClusterizer/plugins/PixelThresholdClusterizer.cc +++ b/RecoLocalTracker/SiPixelClusterizer/src/PixelThresholdClusterizer.cc @@ -20,8 +20,8 @@ //---------------------------------------------------------------------------- // Our own includes -#include "PixelThresholdClusterizer.h" -#include "SiPixelArrayBuffer.h" +#include "RecoLocalTracker/SiPixelClusterizer/interface/PixelThresholdClusterizer.h" +#include "RecoLocalTracker/SiPixelClusterizer/interface/SiPixelArrayBuffer.h" #include "CondFormats/SiPixelObjects/interface/SiPixelGainCalibrationOffline.h" // Geometry #include "Geometry/TrackerGeometryBuilder/interface/PixelGeomDetUnit.h" diff --git a/RecoLocalTracker/SiPixelRecHits/plugins/BuildFile.xml b/RecoLocalTracker/SiPixelRecHits/plugins/BuildFile.xml index 4f8efa0a80be0..a8af0c8a7c4f9 100644 --- a/RecoLocalTracker/SiPixelRecHits/plugins/BuildFile.xml +++ b/RecoLocalTracker/SiPixelRecHits/plugins/BuildFile.xml @@ -1,8 +1,12 @@ + + + + diff --git a/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.cu b/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.cu index b931815dc2623..f41f42137c29a 100644 --- a/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.cu +++ b/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.cu @@ -10,76 +10,77 @@ #include // CMSSW headers -#include "EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigiGPUKernel.h" +#include "EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToClusterGPUKernel.h" #include "HeterogeneousCore/CUDAUtilities/interface/cudaCheck.h" #include "RecoLocalTracker/SiPixelClusterizer/plugins/gpuClustering.h" #include "PixelRecHits.h" #include "gpuPixelRecHits.h" +namespace pixelgpudetails { + PixelRecHitGPUKernel::PixelRecHitGPUKernel() { + cudaCheck(cudaMalloc((void**) & gpu_.hitsModuleStart_d,(gpuClustering::MaxNumModules+1)*sizeof(uint32_t))); + cudaCheck(cudaMalloc((void**) & gpu_.charge_d,(gpuClustering::MaxNumModules*256)*sizeof(float))); + cudaCheck(cudaMalloc((void**) & gpu_.xg_d,(gpuClustering::MaxNumModules*256)*sizeof(float))); + cudaCheck(cudaMalloc((void**) & gpu_.yg_d,(gpuClustering::MaxNumModules*256)*sizeof(float))); + cudaCheck(cudaMalloc((void**) & gpu_.zg_d,(gpuClustering::MaxNumModules*256)*sizeof(float))); + cudaCheck(cudaMalloc((void**) & gpu_.xerr_d,(gpuClustering::MaxNumModules*256)*sizeof(float))); + cudaCheck(cudaMalloc((void**) & gpu_.yerr_d,(gpuClustering::MaxNumModules*256)*sizeof(float))); + cudaCheck(cudaMalloc((void**) & gpu_.mr_d,(gpuClustering::MaxNumModules*256)*sizeof(uint16_t))); + } -HitsOnGPU allocHitsOnGPU() { - HitsOnGPU hh; - cudaCheck(cudaMalloc((void**) & hh.hitsModuleStart_d,(gpuClustering::MaxNumModules+1)*sizeof(uint32_t))); - cudaCheck(cudaMalloc((void**) & hh.charge_d,(gpuClustering::MaxNumModules*256)*sizeof(float))); - cudaCheck(cudaMalloc((void**) & hh.xg_d,(gpuClustering::MaxNumModules*256)*sizeof(float))); - cudaCheck(cudaMalloc((void**) & hh.yg_d,(gpuClustering::MaxNumModules*256)*sizeof(float))); - cudaCheck(cudaMalloc((void**) & hh.zg_d,(gpuClustering::MaxNumModules*256)*sizeof(float))); - cudaCheck(cudaMalloc((void**) & hh.xerr_d,(gpuClustering::MaxNumModules*256)*sizeof(float))); - cudaCheck(cudaMalloc((void**) & hh.yerr_d,(gpuClustering::MaxNumModules*256)*sizeof(float))); - cudaCheck(cudaMalloc((void**) & hh.mr_d,(gpuClustering::MaxNumModules*256)*sizeof(uint16_t))); - cudaCheck(cudaDeviceSynchronize()); + PixelRecHitGPUKernel::~PixelRecHitGPUKernel() { + cudaCheck(cudaFree(gpu_.hitsModuleStart_d)); + cudaCheck(cudaFree(gpu_.charge_d)); + cudaCheck(cudaFree(gpu_.xg_d)); + cudaCheck(cudaFree(gpu_.yg_d)); + cudaCheck(cudaFree(gpu_.zg_d)); + cudaCheck(cudaFree(gpu_.xerr_d)); + cudaCheck(cudaFree(gpu_.yerr_d)); + cudaCheck(cudaFree(gpu_.mr_d)); + } - return hh; -} - - -HitsOnCPU -pixelRecHits_wrapper( - pixelgpudetails::context const & c, - pixelCPEforGPU::ParamsOnGPU const * cpeParams, - uint32_t ndigis, - uint32_t nModules, // active modules (with digis) - HitsOnGPU & hh -) -{ - thrust::exclusive_scan(thrust::cuda::par, - c.clusInModule_d, - c.clusInModule_d + gpuClustering::MaxNumModules + 1, - hh.hitsModuleStart_d); + void PixelRecHitGPUKernel::makeHitsAsync(const siPixelRawToClusterHeterogeneousProduct::GPUProduct& input, + pixelCPEforGPU::ParamsOnGPU const * cpeParams, + cuda::stream_t<>& stream) { + thrust::exclusive_scan(thrust::cuda::par, + input.clusInModule_d, + input.clusInModule_d + gpuClustering::MaxNumModules + 1, + gpu_.hitsModuleStart_d); - int threadsPerBlock = 256; - int blocks = nModules; - gpuPixelRecHits::getHits<<>>( + int threadsPerBlock = 256; + int blocks = input.nModules; // active modules (with digis) + gpuPixelRecHits::getHits<<>>( cpeParams, - c.moduleInd_d, - c.xx_d, c.yy_d, c.adc_d, - c.moduleStart_d, - c.clusInModule_d, c.moduleId_d, - c.clus_d, - ndigis, - hh.hitsModuleStart_d, - hh.charge_d, - hh.xg_d, hh.yg_d, hh.zg_d, - hh.xerr_d, hh.yerr_d, hh.mr_d, + input.moduleInd_d, + input.xx_d, input.yy_d, input.adc_d, + input.moduleStart_d, + input.clusInModule_d, input.moduleId_d, + input.clus_d, + input.nDigis, + gpu_.hitsModuleStart_d, + gpu_.charge_d, + gpu_.xg_d, gpu_.yg_d, gpu_.zg_d, + gpu_.xerr_d, gpu_.yerr_d, gpu_.mr_d, true // for the time being stay local... - ); - + ); - // all this needed only if hits on CPU are required... - uint32_t hitsModuleStart[gpuClustering::MaxNumModules+1]; - cudaCheck(cudaMemcpyAsync(hitsModuleStart, hh.hitsModuleStart_d, (gpuClustering::MaxNumModules+1) * sizeof(uint32_t), cudaMemcpyDefault, c.stream)); - cudaCheck(cudaDeviceSynchronize()); - auto nhits = hitsModuleStart[gpuClustering::MaxNumModules]; + // needed only if hits on CPU are required... + cudaCheck(cudaMemcpyAsync(hitsModuleStart_, gpu_.hitsModuleStart_d, (gpuClustering::MaxNumModules+1) * sizeof(uint32_t), cudaMemcpyDefault, stream.id())); + } - HitsOnCPU hoc(nhits); - memcpy(hoc.hitsModuleStart, hitsModuleStart, (gpuClustering::MaxNumModules+1) * sizeof(uint32_t)); - cudaCheck(cudaMemcpyAsync(hoc.charge.data(), hh.charge_d, nhits*sizeof(uint32_t), cudaMemcpyDefault, c.stream)); - cudaCheck(cudaMemcpyAsync(hoc.xl.data(), hh.xg_d, nhits*sizeof(uint32_t), cudaMemcpyDefault, c.stream)); - cudaCheck(cudaMemcpyAsync(hoc.yl.data(), hh.yg_d, nhits*sizeof(uint32_t), cudaMemcpyDefault, c.stream)); - cudaCheck(cudaMemcpyAsync(hoc.xe.data(), hh.xerr_d, nhits*sizeof(uint32_t), cudaMemcpyDefault, c.stream)); - cudaCheck(cudaMemcpyAsync(hoc.ye.data(), hh.yerr_d, nhits*sizeof(uint32_t), cudaMemcpyDefault, c.stream)); - cudaCheck(cudaMemcpyAsync(hoc.mr.data(), hh.mr_d, nhits*sizeof(uint16_t), cudaMemcpyDefault, c.stream)); - cudaCheck(cudaDeviceSynchronize()); + HitsOnCPU PixelRecHitGPUKernel::getOutput(cuda::stream_t<>& stream) const { + // needed only if hits on CPU are required... + auto nhits = hitsModuleStart_[gpuClustering::MaxNumModules]; - return hoc; + HitsOnCPU hoc(nhits); + memcpy(hoc.hitsModuleStart, hitsModuleStart_, (gpuClustering::MaxNumModules+1) * sizeof(uint32_t)); + cudaCheck(cudaMemcpyAsync(hoc.charge.data(), gpu_.charge_d, nhits*sizeof(uint32_t), cudaMemcpyDefault, stream.id())); + cudaCheck(cudaMemcpyAsync(hoc.xl.data(), gpu_.xg_d, nhits*sizeof(uint32_t), cudaMemcpyDefault, stream.id())); + cudaCheck(cudaMemcpyAsync(hoc.yl.data(), gpu_.yg_d, nhits*sizeof(uint32_t), cudaMemcpyDefault, stream.id())); + cudaCheck(cudaMemcpyAsync(hoc.xe.data(), gpu_.xerr_d, nhits*sizeof(uint32_t), cudaMemcpyDefault, stream.id())); + cudaCheck(cudaMemcpyAsync(hoc.ye.data(), gpu_.yerr_d, nhits*sizeof(uint32_t), cudaMemcpyDefault, stream.id())); + cudaCheck(cudaMemcpyAsync(hoc.mr.data(), gpu_.mr_d, nhits*sizeof(uint16_t), cudaMemcpyDefault, stream.id())); + cudaCheck(cudaStreamSynchronize(stream.id())); + return hoc; + } } diff --git a/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.h b/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.h index 9126ab1c8abd1..80a489929d0ea 100644 --- a/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.h +++ b/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.h @@ -1,6 +1,11 @@ #ifndef RecoLocalTracker_SiPixelRecHits_plugins_PixelRecHits_h #define RecoLocalTracker_SiPixelRecHits_plugins_PixelRecHits_h +#include "EventFilter/SiPixelRawToDigi/plugins/siPixelRawToClusterHeterogeneousProduct.h" +#include "RecoLocalTracker/SiPixelClusterizer/plugins/gpuClusteringConstants.h" + +#include + #include #include @@ -9,36 +14,44 @@ namespace pixelCPEforGPU { } namespace pixelgpudetails { - struct context; + struct HitsOnGPU{ + uint32_t * hitsModuleStart_d; + int32_t * charge_d; + float *xg_d, *yg_d, *zg_d; + float *xerr_d, *yerr_d; + uint16_t * mr_d; + }; + + struct HitsOnCPU { + explicit HitsOnCPU(uint32_t nhits) : + charge(nhits),xl(nhits),yl(nhits),xe(nhits),ye(nhits), mr(nhits){} + uint32_t hitsModuleStart[2001]; + std::vector charge; + std::vector xl, yl; + std::vector xe, ye; + std::vector mr; + }; + + class PixelRecHitGPUKernel { + public: + PixelRecHitGPUKernel(); + ~PixelRecHitGPUKernel(); + + PixelRecHitGPUKernel(const PixelRecHitGPUKernel&) = delete; + PixelRecHitGPUKernel(PixelRecHitGPUKernel&&) = delete; + PixelRecHitGPUKernel& operator=(const PixelRecHitGPUKernel&) = delete; + PixelRecHitGPUKernel& operator=(PixelRecHitGPUKernel&&) = delete; + + void makeHitsAsync(const siPixelRawToClusterHeterogeneousProduct::GPUProduct& input, + pixelCPEforGPU::ParamsOnGPU const * cpeParams, + cuda::stream_t<>& stream); + + HitsOnCPU getOutput(cuda::stream_t<>& stream) const; + + private: + HitsOnGPU gpu_; + uint32_t hitsModuleStart_[gpuClustering::MaxNumModules+1]; + }; } -struct HitsOnGPU{ - uint32_t * hitsModuleStart_d; - int32_t * charge_d; - float *xg_d, *yg_d, *zg_d; - float *xerr_d, *yerr_d; - uint16_t * mr_d; -}; - -struct HitsOnCPU { - explicit HitsOnCPU(uint32_t nhits) : - charge(nhits),xl(nhits),yl(nhits),xe(nhits),ye(nhits), mr(nhits){} - uint32_t hitsModuleStart[2001]; - std::vector charge; - std::vector xl, yl; - std::vector xe, ye; - std::vector mr; -}; - - -HitsOnGPU allocHitsOnGPU(); - -HitsOnCPU pixelRecHits_wrapper( - pixelgpudetails::context const & c, - pixelCPEforGPU::ParamsOnGPU const * cpeParams, - uint32_t ndigis, - uint32_t nModules, // active modules (with digis) - HitsOnGPU & hh -); - #endif // RecoLocalTracker_SiPixelRecHits_plugins_PixelRecHits_h diff --git a/RecoLocalTracker/SiPixelRecHits/plugins/SiPixelRecHitGPU.cc b/RecoLocalTracker/SiPixelRecHits/plugins/SiPixelRecHitGPU.cc deleted file mode 100644 index d2ad7d5cc2806..0000000000000 --- a/RecoLocalTracker/SiPixelRecHits/plugins/SiPixelRecHitGPU.cc +++ /dev/null @@ -1,280 +0,0 @@ -#include "PixelRecHits.h" - -//--- Base class for CPEs: - -#include "RecoLocalTracker/SiPixelRecHits/interface/PixelCPEBase.h" - -//--- Geometry + DataFormats -#include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h" -#include "DataFormats/SiPixelCluster/interface/SiPixelCluster.h" -#include "DataFormats/TrackerRecHit2D/interface/SiPixelRecHitCollection.h" -#include "DataFormats/Common/interface/DetSetVector.h" - -//--- Framework -#include "FWCore/Framework/interface/stream/EDProducer.h" -#include "FWCore/Framework/interface/Event.h" -#include "FWCore/Framework/interface/EventSetup.h" - -#include "DataFormats/Common/interface/Handle.h" -#include "FWCore/Framework/interface/ESHandle.h" -#include "FWCore/ParameterSet/interface/ParameterSet.h" -#include "FWCore/Utilities/interface/InputTag.h" - -class MagneticField; -namespace -{ - class SiPixelRecHitGPU : public edm::stream::EDProducer<> - { - public: - //--- Constructor, virtual destructor (just in case) - explicit SiPixelRecHitGPU(const edm::ParameterSet& conf); - ~SiPixelRecHitGPU() override; - - //--- The top-level event method. - void produce(edm::Event& e, const edm::EventSetup& c) override; - - //--- Execute the position estimator algorithm(s). - //--- New interface with DetSetVector - void run(const edmNew::DetSetVector& input, - SiPixelRecHitCollectionNew & output, - edm::ESHandle & geom); - - void run(edm::Handle > inputhandle, - SiPixelRecHitCollectionNew & output, - edm::ESHandle & geom, - HitsOnCPU const & hoc - ); - - private: - edm::ParameterSet conf_; - std::string cpeName_="None"; // what the user said s/he wanted - PixelCPEBase const * cpe_=nullptr; // What we got (for now, one ptr to base class) - - edm::InputTag src_; - edm::EDGetTokenT> tPixelCluster; - - using GPUProd = std::vector; - edm::InputTag gpuProd_ = edm::InputTag("siPixelDigis"); - edm::EDGetTokenT tGpuProd; - HitsOnGPU hitsOnGPU_; - - - bool m_newCont; // save also in emdNew::DetSetVector - }; -} - -#include "FWCore/PluginManager/interface/ModuleDef.h" -#include "FWCore/Framework/interface/MakerMacros.h" - -DEFINE_FWK_MODULE(SiPixelRecHitGPU); - -// Geometry -#include "Geometry/Records/interface/TrackerDigiGeometryRecord.h" -#include "Geometry/TrackerGeometryBuilder/interface/PixelGeomDetUnit.h" - -// Data Formats -#include "DataFormats/DetId/interface/DetId.h" -#include "DataFormats/Common/interface/Ref.h" -#include "DataFormats/Common/interface/DetSet2RangeMap.h" - - -// STL -#include -#include -#include -#include - -// MessageLogger -#include "FWCore/MessageLogger/interface/MessageLogger.h" - -#include "RecoLocalTracker/Records/interface/TkPixelCPERecord.h" - -using namespace std; - -#include "RecoLocalTracker/SiPixelRecHits/interface/PixelCPEFast.h" - - - //--------------------------------------------------------------------------- - //! Constructor: set the ParameterSet and defer all thinking to setupCPE(). - //--------------------------------------------------------------------------- - SiPixelRecHitGPU::SiPixelRecHitGPU(edm::ParameterSet const& conf) - : - conf_(conf), - src_( conf.getParameter( "src" ) ), - tPixelCluster(consumes< edmNew::DetSetVector >( src_)), - tGpuProd(consumes(gpuProd_)), - hitsOnGPU_ (allocHitsOnGPU()) - { - //--- Declare to the EDM what kind of collections we will be making. - produces(); - - } - - // Destructor - SiPixelRecHitGPU::~SiPixelRecHitGPU() - { - // need to free hitsOnGPU - } - - //--------------------------------------------------------------------------- - //! The "Event" entrypoint: gets called by framework for every event - //--------------------------------------------------------------------------- - void SiPixelRecHitGPU::produce(edm::Event& e, const edm::EventSetup& es) - { - - // Step A.1: get input data - edm::Handle< edmNew::DetSetVector > input; - e.getByToken( tPixelCluster, input); - - // Step A.2: get event setup - edm::ESHandle geom; - es.get().get( geom ); - - // Step B: create empty output collection - auto output = std::make_unique(); - - // Step B*: create CPE - edm::ESHandle hCPE; - std::string cpeName_ = conf_.getParameter("CPE"); - es.get().get(cpeName_, hCPE); - cpe_ = dynamic_cast< const PixelCPEBase* >(&(*hCPE)); - - /// do it on GPU.... - - edm::Handle gh; - e.getByToken(tGpuProd, gh); - auto gprod = *gh; - // invoke gpu version ...... - PixelCPEFast const * fcpe = dynamic_cast(cpe_); - if (!fcpe) { - std::cout << " too bad, not a fast cpe gpu processing not possible...." << std::endl; - assert(0); - } - assert(fcpe->d_paramsOnGPU); - - auto hoc = pixelRecHits_wrapper(* (pixelgpudetails::context const *)(gprod[0]), fcpe->d_paramsOnGPU, gprod[1], gprod[2], hitsOnGPU_); - - // Step C: Iterate over DetIds and invoke the strip CPE algorithm - // on each DetUnit - - // std::cout << "Number of Clusers on CPU " << (*input).data().size() << std::endl; - - run( input, *output, geom, hoc ); - // std::cout << "Number of Hits on CPU " << (*output).data().size() << std::endl; - - output->shrink_to_fit(); - e.put(std::move(output)); - - } - - //--------------------------------------------------------------------------- - //! Iterate over DetUnits, then over Clusters and invoke the CPE on each, - //! and make a RecHit to store the result. - //! New interface reading DetSetVector by V.Chiochia (May 30th, 2006) - //--------------------------------------------------------------------------- - void SiPixelRecHitGPU::run(edm::Handle > inputhandle, - SiPixelRecHitCollectionNew &output, - edm::ESHandle & geom, - HitsOnCPU const & hoc - ) { - - int numberOfDetUnits = 0; - int numberOfClusters = 0; - - auto const & input = *inputhandle; - - - for (auto DSViter=input.begin(); DSViter != input.end() ; DSViter++) { - numberOfDetUnits++; - unsigned int detid = DSViter->detId(); - DetId detIdObject( detid ); - const GeomDetUnit * genericDet = geom->idToDetUnit( detIdObject ); - auto gind = genericDet->index(); - const PixelGeomDetUnit * pixDet = dynamic_cast(genericDet); - assert(pixDet); - SiPixelRecHitCollectionNew::FastFiller recHitsOnDetUnit(output, detid); - auto fc = hoc.hitsModuleStart[gind]; - auto lc = hoc.hitsModuleStart[gind+1]; - auto nhits = lc-fc; - int32_t ind[nhits]; - auto mrp = &hoc.mr[fc]; - uint32_t ngh=0; - for (uint32_t i=0; i=96 && hoc.charge[fc+i]<4000) ) continue; - ind[ngh]=i;std::push_heap(ind, ind+ngh+1,[&](auto a, auto b) { return mrp[a]size()); - for (auto const & clust : *DSViter) { - assert(ic > { + +public: + using Input = siPixelRawToClusterHeterogeneousProduct::HeterogeneousDigiCluster; + + explicit SiPixelRecHitHeterogeneous(const edm::ParameterSet& iConfig); + ~SiPixelRecHitHeterogeneous() override = default; + + static void fillDescriptions(edm::ConfigurationDescriptions& descriptions); + +private: + // CPU implementation + void produceCPU(edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup) override; + + // GPU implementation + void beginStreamGPUCuda(edm::StreamID streamId, cuda::stream_t<>& cudaStream) override; + void acquireGPUCuda(const edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup, cuda::stream_t<>& cudaStream) override; + void produceGPUCuda(edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup, cuda::stream_t<>& cudaStream) override; + + // Commonalities + void initialize(const edm::EventSetup& es); + + // CPU + void run(const edm::Handle& inputhandle, SiPixelRecHitCollectionNew &output) const; + // GPU + void run(const edm::Handle& inputhandle, SiPixelRecHitCollectionNew &output, const pixelgpudetails::HitsOnCPU& hoc) const; + + edm::EDGetTokenT token_; + edm::EDGetTokenT clusterToken_; + std::string cpeName_; + + const TrackerGeometry *geom_ = nullptr; + const PixelClusterParameterEstimator *cpe_ = nullptr; + + std::unique_ptr gpuAlgo_; +}; + +SiPixelRecHitHeterogeneous::SiPixelRecHitHeterogeneous(const edm::ParameterSet& iConfig): + HeterogeneousEDProducer(iConfig), + token_(consumesHeterogeneous(iConfig.getParameter("heterogeneousSrc"))), + clusterToken_(consumes(iConfig.getParameter("src"))), + cpeName_(iConfig.getParameter("CPE")) +{ + produces(); +} + +void SiPixelRecHitHeterogeneous::fillDescriptions(edm::ConfigurationDescriptions& descriptions) { + edm::ParameterSetDescription desc; + + desc.add("heterogeneousSrc", edm::InputTag("siPixelDigisHeterogeneous")); + desc.add("src", edm::InputTag("siPixelClusters")); + desc.add("CPE", "PixelCPEFast"); + + HeterogeneousEDProducer::fillPSetDescription(desc); + + descriptions.add("siPixelRecHitHeterogeneous",desc); +} + +void SiPixelRecHitHeterogeneous::initialize(const edm::EventSetup& es) { + edm::ESHandle geom; + es.get().get( geom ); + geom_ = geom.product(); + + edm::ESHandle hCPE; + es.get().get(cpeName_, hCPE); + cpe_ = dynamic_cast< const PixelCPEBase* >(hCPE.product()); +} + +void SiPixelRecHitHeterogeneous::produceCPU(edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup) { + initialize(iSetup); + + edm::Handle hclusters; + iEvent.getByToken(clusterToken_, hclusters); + + auto output = std::make_unique(); + run(hclusters, *output); + + output->shrink_to_fit(); + iEvent.put(std::move(output)); +} + +void SiPixelRecHitHeterogeneous::run(const edm::Handle& inputhandle, SiPixelRecHitCollectionNew &output) const { + const auto& input = *inputhandle; + + edmNew::DetSetVector::const_iterator DSViter=input.begin(); + for ( ; DSViter != input.end() ; DSViter++) { + unsigned int detid = DSViter->detId(); + DetId detIdObject( detid ); + const GeomDetUnit * genericDet = geom_->idToDetUnit( detIdObject ); + const PixelGeomDetUnit * pixDet = dynamic_cast(genericDet); + assert(pixDet); + SiPixelRecHitCollectionNew::FastFiller recHitsOnDetUnit(output,detid); + + edmNew::DetSet::const_iterator clustIt = DSViter->begin(), clustEnd = DSViter->end(); + + for ( ; clustIt != clustEnd; clustIt++) { + std::tuple tuple = cpe_->getParameters( *clustIt, *genericDet ); + LocalPoint lp( std::get<0>(tuple) ); + LocalError le( std::get<1>(tuple) ); + SiPixelRecHitQuality::QualWordType rqw( std::get<2>(tuple) ); + // Create a persistent edm::Ref to the cluster + edm::Ref< edmNew::DetSetVector, SiPixelCluster > cluster = edmNew::makeRefTo( inputhandle, clustIt); + // Make a RecHit and add it to the DetSet + // old : recHitsOnDetUnit.push_back( new SiPixelRecHit( lp, le, detIdObject, &*clustIt) ); + SiPixelRecHit hit( lp, le, rqw, *genericDet, cluster); + // + // Now save it ================= + recHitsOnDetUnit.push_back(hit); + } // <-- End loop on Clusters + } // <-- End loop on DetUnits +} + + +void SiPixelRecHitHeterogeneous::beginStreamGPUCuda(edm::StreamID streamId, cuda::stream_t<>& cudaStream) { + gpuAlgo_ = std::make_unique(); +} + +void SiPixelRecHitHeterogeneous::acquireGPUCuda(const edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup, cuda::stream_t<>& cudaStream) { + initialize(iSetup); + + PixelCPEFast const * fcpe = dynamic_cast(cpe_); + if (!fcpe) { + throw cms::Exception("Configuration") << "too bad, not a fast cpe gpu processing not possible...."; + } + assert(fcpe->d_paramsOnGPU); + + edm::Handle hinput; + iEvent.getByToken(token_, hinput); + + gpuAlgo_->makeHitsAsync(*hinput, fcpe->d_paramsOnGPU, cudaStream); +} + +void SiPixelRecHitHeterogeneous::produceGPUCuda(edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup, cuda::stream_t<>& cudaStream) { + const auto& hits = gpuAlgo_->getOutput(cudaStream); + + // Need the CPU clusters to + // - properly fill the output DetSetVector of hits + // - to set up edm::Refs to the clusters + edm::Handle hclusters; + iEvent.getByToken(clusterToken_, hclusters); + + auto output = std::make_unique(); + run(hclusters, *output, hits); + + iEvent.put(std::move(output)); +} + +void SiPixelRecHitHeterogeneous::run(const edm::Handle& inputhandle, SiPixelRecHitCollectionNew &output, const pixelgpudetails::HitsOnCPU& hoc) const { + auto const & input = *inputhandle; + + int numberOfDetUnits = 0; + int numberOfClusters = 0; + for (auto DSViter=input.begin(); DSViter != input.end() ; DSViter++) { + numberOfDetUnits++; + unsigned int detid = DSViter->detId(); + DetId detIdObject( detid ); + const GeomDetUnit * genericDet = geom_->idToDetUnit( detIdObject ); + auto gind = genericDet->index(); + const PixelGeomDetUnit * pixDet = dynamic_cast(genericDet); + assert(pixDet); + SiPixelRecHitCollectionNew::FastFiller recHitsOnDetUnit(output, detid); + auto fc = hoc.hitsModuleStart[gind]; + auto lc = hoc.hitsModuleStart[gind+1]; + auto nhits = lc-fc; + int32_t ind[nhits]; + auto mrp = &hoc.mr[fc]; + uint32_t ngh=0; + for (uint32_t i=0; i=96 && hoc.charge[fc+i]<4000) ) continue; + ind[ngh]=i;std::push_heap(ind, ind+ngh+1,[&](auto a, auto b) { return mrp[a]size()); + for (auto const & clust : *DSViter) { + assert(ic Date: Mon, 4 Jun 2018 14:50:37 +0200 Subject: [PATCH 56/88] Faster clustering, now does not requires to know number of modules (#68) --- .../plugins/gpuClustering.h | 230 +++++++++--------- .../plugins/gpuClusteringConstants.h | 10 +- .../SiPixelClusterizer/test/gpuClustering.cu | 174 ++++++------- 3 files changed, 192 insertions(+), 222 deletions(-) diff --git a/RecoLocalTracker/SiPixelClusterizer/plugins/gpuClustering.h b/RecoLocalTracker/SiPixelClusterizer/plugins/gpuClustering.h index df3caeb690090..12f205742433e 100644 --- a/RecoLocalTracker/SiPixelClusterizer/plugins/gpuClustering.h +++ b/RecoLocalTracker/SiPixelClusterizer/plugins/gpuClustering.h @@ -1,165 +1,169 @@ #ifndef RecoLocalTracker_SiPixelClusterizer_plugins_gpuClustering_h #define RecoLocalTracker_SiPixelClusterizer_plugins_gpuClustering_h -#include "gpuClusteringConstants.h" - #include #include #include +#include "gpuClusteringConstants.h" + namespace gpuClustering { + __global__ void countModules(uint16_t const * id, - uint32_t * moduleStart, - int32_t * clus, - int numElements){ - + uint32_t * moduleStart, + int32_t * clus, + int numElements) + { int i = blockDim.x * blockIdx.x + threadIdx.x; - if (i >= numElements) return; - clus[i]=i; - if (InvId==id[i]) return; - auto j=i-1; - while(j>=0 && id[j]==InvId) --j; - if(j<0 || id[j]!=id[i]) { + if (i >= numElements) + return; + clus[i] = i; + if (InvId == id[i]) + return; + auto j = i - 1; + while (j >= 0 and id[j] == InvId) + --j; + if (j < 0 or id[j] != id[i]) { // boundary... - auto loc = atomicInc(moduleStart,MaxNumModules); - moduleStart[loc+1]=i; + auto loc = atomicInc(moduleStart, MaxNumModules); + moduleStart[loc + 1] = i; } } - - + __global__ void findClus(uint16_t const * id, - uint16_t const * x, - uint16_t const * y, - uint16_t const * adc, - uint32_t const * moduleStart, - uint32_t * clusInModule, uint32_t * moduleId, - int32_t * clus, uint32_t * debug, - int numElements){ - + uint16_t const * x, + uint16_t const * y, + uint16_t const * adc, + uint32_t const * moduleStart, + uint32_t * clusInModule, uint32_t * moduleId, + int32_t * clus, uint32_t * debug, + int numElements) + { __shared__ bool go; __shared__ int nclus; + __shared__ int msize; - __shared__ int msize; + if (blockIdx.x >= moduleStart[0]) + return; - auto first = moduleStart[1 + blockIdx.x]; - + auto first = moduleStart[1 + blockIdx.x]; auto me = id[first]; - assert(me=numElements) return; - - go=true; - nclus=0; + first += threadIdx.x; + if (first>= numElements) + return; + + go = true; + nclus = 0; - msize=numElements; + msize = numElements; __syncthreads(); - for (int i=first; i=msize) return; + assert(msize<= numElements); + if (first>= msize) + return; int jmax[10]; - auto niter = (msize-first)/blockDim.x; - assert(niter<10); - for (int i=0; i1) continue; - if (std::abs(int(y[j])-int(y[i]))>1) continue; - auto old = atomicMin(&clus[j],clus[i]); - if (old!=clus[i]) go=true; - atomicMin(&clus[i],old); - jmax[k]=j+1; - } + jmax[k] = i + 1; + for (int j = js; j < jm; ++j) { + if (id[j] == InvId) // not valid + continue; + if (std::abs(int(x[j]) - int(x[i])) > 1 | + std::abs(int(y[j]) - int(y[i])) > 1) + continue; + auto old = atomicMin(&clus[j], clus[i]); + if (old != clus[i]) go = true; + atomicMin(&clus[i], old); + jmax[k] = j + 1; + } } - assert (k<=niter); - __syncthreads(); - } - - /* - // fast count (nice but not much useful) - auto laneId = threadIdx.x & 0x1f; - - for (int i=first; i=0) clus[i]=clus[clus[i]]; + for (int i = first; i < numElements; i += blockDim.x) { + if (id[i] == InvId) // not valid + continue; + if (id[i] != me) // end of module + break; + if (clus[i]>= 0) clus[i] = clus[clus[i]]; } - + __syncthreads(); - for (int i=first; i namespace gpuClustering { - constexpr uint32_t MaxNumModules = 2000; - - constexpr uint32_t MaxNumPixels = 256*2000; // this does not mean maxPixelPerModule==256! - - constexpr uint16_t InvId=9999; // must be > MaxNumModules + constexpr uint32_t MaxNumModules = 2000; + constexpr uint32_t MaxNumPixels = 256 * 2000; // this does not mean maxPixelPerModule == 256! + constexpr uint16_t InvId = 9999; // must be > MaxNumModules } -#endif +#endif // RecoLocalTracker_SiPixelClusterizer_plugins_gpuClusteringConstants_h diff --git a/RecoLocalTracker/SiPixelClusterizer/test/gpuClustering.cu b/RecoLocalTracker/SiPixelClusterizer/test/gpuClustering.cu index ae0359cd683e0..8c6b6cdf7a821 100644 --- a/RecoLocalTracker/SiPixelClusterizer/test/gpuClustering.cu +++ b/RecoLocalTracker/SiPixelClusterizer/test/gpuClustering.cu @@ -1,37 +1,27 @@ -#include "RecoLocalTracker/SiPixelClusterizer/plugins/gpuClustering.h" - - -#include "cuda/api_wrappers.h" - -#include -#include - +#include +#include +#include #include +#include +#include #include -#include -#include -#include -#include - -#include -#include +#include +#include +#include +#include +#include "RecoLocalTracker/SiPixelClusterizer/plugins/gpuClustering.h" - int main(void) { if (cuda::device::count() == 0) { std::cerr << "No CUDA devices on this system" << "\n"; exit(EXIT_FAILURE); } - - using namespace gpuClustering; - - int numElements = MaxNumPixels; - + int numElements = MaxNumPixels; // these in reality are already on GPU auto h_id = std::make_unique(numElements); auto h_x = std::make_unique(numElements); @@ -39,27 +29,23 @@ int main(void) auto h_adc = std::make_unique(numElements); auto h_clus = std::make_unique(numElements); - + auto h_debug = std::make_unique(numElements); - - auto current_device = cuda::device::current::get(); auto d_id = cuda::memory::device::make_unique(current_device, numElements); auto d_x = cuda::memory::device::make_unique(current_device, numElements); auto d_y = cuda::memory::device::make_unique(current_device, numElements); auto d_adc = cuda::memory::device::make_unique(current_device, numElements); - + auto d_clus = cuda::memory::device::make_unique(current_device, numElements); auto d_moduleStart = cuda::memory::device::make_unique(current_device, MaxNumModules+1); auto d_clusInModule = cuda::memory::device::make_unique(current_device, MaxNumModules); auto d_moduleId = cuda::memory::device::make_unique(current_device, MaxNumModules); - - auto d_debug = cuda::memory::device::make_unique(current_device, numElements); - - // later random number + auto d_debug = cuda::memory::device::make_unique(current_device, numElements); + // later random number int n=0; int ncl=0; int y[10]={5,7,9,1,3,0,4,8,2,6}; @@ -112,10 +98,10 @@ int main(void) h_adc[n]=100; ++n; if (xx[k]%2==0) { - h_id[n]=id; - h_x[n]=xx[k]; - h_y[n]=101; - h_adc[n]=100; + h_id[n]=id; + h_x[n]=xx[k]; + h_y[n]=101; + h_adc[n]=100; ++n; } } @@ -129,43 +115,41 @@ int main(void) h_x[n]=x; h_y[n]=x; h_adc[n]=100; - ++n; + ++n; } - - // all odd id for(int id=11; id<=1800; id+=2) { if ( (id/20)%2) h_id[n++]=InvId; // error - for (int x=0; x<40; x+=4) { + for (int x=0; x<40; x+=4) { ++ncl; if ((id/10)%2) { - for (int k=0; k<10; ++k) { - h_id[n]=id; - h_x[n]=x; - h_y[n]=x+y[k]; - h_adc[n]=100; - ++n; - h_id[n]=id; - h_x[n]=x+1; - h_y[n]=x+y[k]+2; - h_adc[n]=100; - ++n; - } + for (int k=0; k<10; ++k) { + h_id[n]=id; + h_x[n]=x; + h_y[n]=x+y[k]; + h_adc[n]=100; + ++n; + h_id[n]=id; + h_x[n]=x+1; + h_y[n]=x+y[k]+2; + h_adc[n]=100; + ++n; + } } else { - for (int k=0; k<10; ++k) { - h_id[n]=id; - h_x[n]=x; - h_y[n]=x+y[9-k]; - h_adc[n]=100; - ++n; - if (y[k]==3) continue; // hole - if (id==51) {h_id[n++]=InvId; h_id[n++]=InvId; }// error - h_id[n]=id; - h_x[n]=x+1; - h_y[n]=x+y[k]+2; - h_adc[n]=100; - ++n; - } + for (int k=0; k<10; ++k) { + h_id[n]=id; + h_x[n]=x; + h_y[n]=x+y[9-k]; + h_adc[n]=100; + ++n; + if (y[k]==3) continue; // hole + if (id==51) {h_id[n++]=InvId; h_id[n++]=InvId; }// error + h_id[n]=id; + h_x[n]=x+1; + h_y[n]=x+y[k]+2; + h_adc[n]=100; + ++n; + } } } } @@ -174,39 +158,30 @@ int main(void) size_t size32 = n * sizeof(unsigned int); size_t size16 = n * sizeof(unsigned short); size_t size8 = n * sizeof(uint8_t); - + uint32_t nModules=0; cuda::memory::copy(d_moduleStart.get(),&nModules,sizeof(uint32_t)); - + cuda::memory::copy(d_id.get(), h_id.get(), size16); cuda::memory::copy(d_x.get(), h_x.get(), size16); cuda::memory::copy(d_y.get(), h_y.get(), size16); cuda::memory::copy(d_adc.get(), h_adc.get(), size8); - cuda::memory::device::zero(d_debug.get(),size32); + cuda::memory::device::zero(d_debug.get(),size32); // Launch CUDA Kernels - - int threadsPerBlock = 256; int blocksPerGrid = (numElements + threadsPerBlock - 1) / threadsPerBlock; std::cout << "CUDA countModules kernel launch with " << blocksPerGrid << " blocks of " << threadsPerBlock << " threads\n"; - + cuda::launch( - countModules, - { blocksPerGrid, threadsPerBlock }, - d_id.get(), d_moduleStart.get() ,d_clus.get(),n - ); - - cuda::memory::copy(&nModules,d_moduleStart.get(),sizeof(uint32_t)); - - std::cout << "found " << nModules << " Modules active" << std::endl; + countModules, + { blocksPerGrid, threadsPerBlock }, + d_id.get(), d_moduleStart.get() ,d_clus.get(),n + ); - threadsPerBlock = 256; - blocksPerGrid = nModules; - - + blocksPerGrid = MaxNumModules; //nModules; std::cout << "CUDA findModules kernel launch with " << blocksPerGrid @@ -215,31 +190,28 @@ int main(void) cuda::memory::device::zero(d_clusInModule.get(),MaxNumModules*sizeof(uint32_t)); cuda::launch( - findClus, - { blocksPerGrid, threadsPerBlock }, - d_id.get(), d_x.get(), d_y.get(), d_adc.get(), - d_moduleStart.get(), - d_clusInModule.get(), d_moduleId.get(), - d_clus.get(), - d_debug.get(), - n - ); + findClus, + { blocksPerGrid, threadsPerBlock }, + d_id.get(), d_x.get(), d_y.get(), d_adc.get(), + d_moduleStart.get(), + d_clusInModule.get(), d_moduleId.get(), + d_clus.get(), + d_debug.get(), + n + ); + cuda::memory::copy(&nModules,d_moduleStart.get(),sizeof(uint32_t)); + std::cout << "found " << nModules << " Modules active" << std::endl; - uint32_t nclus[MaxNumModules], moduleId[nModules]; + uint32_t nclus[MaxNumModules], moduleId[nModules]; cuda::memory::copy(h_clus.get(), d_clus.get(), size32); cuda::memory::copy(&nclus,d_clusInModule.get(),MaxNumModules*sizeof(uint32_t)); cuda::memory::copy(&moduleId,d_moduleId.get(),nModules*sizeof(uint32_t)); - - cuda::memory::copy(h_debug.get(), d_debug.get(), size32); auto p = std::minmax_element(h_debug.get(),h_debug.get()+n); - std::cout << "debug " << *p.first << ' ' << *p.second << std::endl; - + std::cout << "debug " << *p.first << ' ' << *p.second << std::endl; - - std::set clids; std::vector seeds; for (int i=0; i=0); assert(h_clus[i] Date: Mon, 4 Jun 2018 15:41:24 +0200 Subject: [PATCH 57/88] Make HcalDetId and HcalDigi dataformats constexpr (#63) Update HcalDetids and HcalDigis to support CUDA similar to DataFormats/DetId: - move the implementation to the header files - mark methods as `constexpr` Add CUDA tests for HcalDetId and HcalDigi dataformats: - create an `HBHEDigiCollection`/`HFDigiCollection`/`HODigiCollection` on the host side and fill it - allocate space on the gpu - transfer to the gpu - run the kernel to compute some func per channel - transfer the results back to host - assert for each channel --- DataFormats/Common/interface/DataFrame.h | 22 +- DataFormats/HcalDetId/interface/HcalDetId.h | 259 ++++++++++++++++-- .../HcalDetId/interface/HcalElectronicsId.h | 78 ++++-- DataFormats/HcalDetId/src/HcalDetId.cc | 246 ----------------- .../HcalDetId/src/HcalElectronicsId.cc | 35 --- DataFormats/HcalDetId/test/BuildFile.xml | 4 + DataFormats/HcalDetId/test/test_hcal_detid.cu | 79 ++++++ .../HcalDigi/interface/HBHEDataFrame.h | 78 ++++-- DataFormats/HcalDigi/interface/HFDataFrame.h | 79 ++++-- DataFormats/HcalDigi/interface/HODataFrame.h | 76 +++-- .../HcalDigi/interface/HcalQIESample.h | 65 ++++- .../HcalDigi/interface/QIE10DataFrame.h | 99 ++++--- .../HcalDigi/interface/QIE11DataFrame.h | 76 +++-- DataFormats/HcalDigi/src/HBHEDataFrame.cc | 62 ----- DataFormats/HcalDigi/src/HFDataFrame.cc | 58 ---- DataFormats/HcalDigi/src/HODataFrame.cc | 60 ---- DataFormats/HcalDigi/src/HcalQIESample.cc | 31 --- DataFormats/HcalDigi/src/QIE10DataFrame.cc | 50 ---- DataFormats/HcalDigi/src/QIE11DataFrame.cc | 32 --- DataFormats/HcalDigi/test/BuildFile.xml | 14 +- DataFormats/HcalDigi/test/test_hcal_digi.cu | 185 +++++++++++++ 21 files changed, 908 insertions(+), 780 deletions(-) create mode 100644 DataFormats/HcalDetId/test/BuildFile.xml create mode 100644 DataFormats/HcalDetId/test/test_hcal_detid.cu create mode 100644 DataFormats/HcalDigi/test/test_hcal_digi.cu diff --git a/DataFormats/Common/interface/DataFrame.h b/DataFormats/Common/interface/DataFrame.h index 63c0fa1153f35..25383636cd4c6 100644 --- a/DataFormats/Common/interface/DataFrame.h +++ b/DataFormats/Common/interface/DataFrame.h @@ -22,9 +22,9 @@ namespace edm { typedef data_type const * const_iterator; - inline + constexpr inline DataFrame() : m_id(0), m_data(nullptr), m_size(0){} - inline + constexpr inline DataFrame(id_type i, data_type const * idata, size_type isize) : m_id(i), m_data(idata), m_size(isize) {} @@ -34,40 +34,40 @@ namespace edm { inline void set(DataFrameContainer const & icont, size_type i); - inline + constexpr inline data_type & operator[](size_type i) { return data()[i]; } - inline + constexpr inline data_type operator[](size_type i) const { return m_data[i]; } - inline + constexpr inline iterator begin() { return data();} - inline + constexpr inline iterator end() { return data()+m_size;} - inline + constexpr inline const_iterator begin() const { return m_data;} - inline + constexpr inline const_iterator end() const { return m_data+m_size;} - inline + constexpr inline id_type id() const { return m_id;} - inline + constexpr inline size_type size() const { return m_size; } private: //for testing friend class ::TestDataFrame; - data_type * data() { + constexpr data_type * data() { return const_cast(m_data); } diff --git a/DataFormats/HcalDetId/interface/HcalDetId.h b/DataFormats/HcalDetId/interface/HcalDetId.h index f8fc122fdabb9..d43ca602990fe 100644 --- a/DataFormats/HcalDetId/interface/HcalDetId.h +++ b/DataFormats/HcalDetId/interface/HcalDetId.h @@ -4,6 +4,7 @@ #include #include "DataFormats/DetId/interface/DetId.h" #include "DataFormats/HcalDetId/interface/HcalSubdetector.h" +#include "FWCore/Utilities/interface/Exception.h" /** \class HcalDetId @@ -31,63 +32,261 @@ class HcalDetId : public DetId { public: /** Create a null cellid*/ - HcalDetId(); + constexpr HcalDetId() : DetId() { + } /** Create cellid from raw id (0=invalid tower id) */ - HcalDetId(uint32_t rawid); + constexpr HcalDetId(uint32_t rawid) { + if ((DetId::Detector(rawid>>DetId::kDetOffset)&DetId::kDetMask) != Hcal) { + id_ = rawid; + } else { + HcalSubdetector subdet = (HcalSubdetector)((rawid>>DetId::kSubdetOffset)&DetId::kSubdetMask); + if ((subdet==HcalBarrel) || (subdet==HcalEndcap) || + (subdet==HcalOuter) || (subdet==HcalForward)) { + id_ = newForm(rawid); + } else { + id_ = rawid; + } + } + } + /** Constructor from subdetector, signed tower ieta,iphi,and depth */ - HcalDetId(HcalSubdetector subdet, int tower_ieta, int tower_iphi, int depth); + constexpr HcalDetId(HcalSubdetector subdet, int tower_ieta, int tower_iphi, int depth) : DetId(Hcal,subdet) { + // (no checking at this point!) + id_ |= (kHcalIdFormat2) | ((depth&kHcalDepthMask2)<0)?(kHcalZsideMask2|(tower_ieta<0)?(kHcalZsideMask1|(eta<0)?(kHcalZsideMask2|(eta<>kHcalEtaOffset1)&kHcalEtaMask1; + else return (id_>>kHcalEtaOffset2)&kHcalEtaMask2; + } /// get the cell ieta - int ieta() const { return zside()*ietaAbs(); } + constexpr int ieta() const { return zside()*ietaAbs(); } /// get the cell iphi - int iphi() const; + constexpr int iphi() const { + if (oldFormat()) return id_&kHcalPhiMask1; + else return id_&kHcalPhiMask2; + } /// get the tower depth - int depth() const; + constexpr int depth() const { + if (oldFormat()) return (id_>>kHcalDepthOffset1)&kHcalDepthMask1; + else return (id_>>kHcalDepthOffset2)&kHcalDepthMask2; + } /// get full depth information for HF - int hfdepth() const; + constexpr int hfdepth() const { + int dep = depth(); + if (subdet() == HcalForward) { + if (dep > 2) dep -= 2; + } + return dep; + } /// get the tower depth - uint32_t maskDepth() const; + constexpr uint32_t maskDepth() const { + if (oldFormat()) return (id_|kHcalDepthSet1); + else return (id_|kHcalDepthSet2); + } /// change format - uint32_t otherForm() const; - void changeForm(); - uint32_t newForm() const; - static uint32_t newForm(const uint32_t&); + constexpr uint32_t otherForm() const { + uint32_t rawid = (id_&kHcalIdMask); + if (oldFormat()) { + rawid = newForm(id_); + } else { + rawid |= ((depth()&kHcalDepthMask1)<0)?(kHcalZsideMask1|(ieta()<0)?(kHcalZsideMask2|(eta< 2) dep -= 2; + bool result = ((zsid==zside()) && (eta==ietaAbs()) && (phi==iphi()) && + (dep==hfdepth())); + return result; + } + constexpr HcalDetId baseDetId() const { + if (subdet() != HcalForward || depth() <= 2) { + return HcalDetId(id_); + } else { + int zsid{0}, eta{0}, phi{0}, dep{0}; + unpackId(id_, zsid, eta, phi, dep); + dep -= 2; + uint32_t rawid = id_&kHcalIdMask; + rawid |= (kHcalIdFormat2) | ((dep&kHcalDepthMask2)<0)?(kHcalZsideMask2|(eta< 2) { + return HcalDetId(id_); + } else { + int zsid{0}, eta{0}, phi{0}, dep{0}; + unpackId(id_, zsid, eta, phi, dep); + dep += 2; + uint32_t rawid = id_&kHcalIdMask; + rawid |= (kHcalIdFormat2) | ((dep&kHcalDepthMask2)<0)?(kHcalZsideMask2|(eta<360)?(simple_iphi-360):(simple_iphi)); + } /// get the largest crystal_iphi of the crystal in front of this tower (HB and HE tower 17 only) - int crystal_iphi_high() const; + constexpr int crystal_iphi_high() const { + int simple_iphi=((iphi()-1)*5)+5; + simple_iphi+=10; + return ((simple_iphi>360)?(simple_iphi-360):(simple_iphi)); + } static const HcalDetId Undefined; private: - void newFromOld(const uint32_t&); - static void unpackId(const uint32_t&, int&, int&, int&, int&); + constexpr void newFromOld(const uint32_t& rawid) { + id_ = newForm(rawid); + } + + constexpr static void unpackId(const uint32_t& rawid, int& zsid, int& eta, int& phi, + int& dep) { + if ((rawid&kHcalIdFormat2)==0) { + zsid = (rawid&kHcalZsideMask1)?(1):(-1); + eta = (rawid>>kHcalEtaOffset1)&kHcalEtaMask1; + phi = rawid&kHcalPhiMask1; + dep = (rawid>>kHcalDepthOffset1)&kHcalDepthMask1; + } else { + zsid = (rawid&kHcalZsideMask2)?(1):(-1); + eta = (rawid>>kHcalEtaOffset2)&kHcalEtaMask2; + phi = rawid&kHcalPhiMask2; + dep = (rawid>>kHcalDepthOffset2)&kHcalDepthMask2; + } + } }; std::ostream& operator<<(std::ostream&,const HcalDetId& id); diff --git a/DataFormats/HcalDetId/interface/HcalElectronicsId.h b/DataFormats/HcalDetId/interface/HcalElectronicsId.h index 6fa7c2401cb55..727062df2f4b0 100644 --- a/DataFormats/HcalDetId/interface/HcalElectronicsId.h +++ b/DataFormats/HcalDetId/interface/HcalElectronicsId.h @@ -32,70 +32,92 @@ class HcalElectronicsId { public: /** Default constructor -- invalid value */ - HcalElectronicsId(); + constexpr HcalElectronicsId() + : hcalElectronicsId_{0xffffffffu} + {} /** from raw */ - HcalElectronicsId(uint32_t); + constexpr HcalElectronicsId(uint32_t id) + : hcalElectronicsId_{id} + {} /** VME Constructor from fiberchan,fiber index,spigot,dccid */ - HcalElectronicsId(int fiberChan, int fiberIndex, int spigot, int dccid); + constexpr HcalElectronicsId(int fiberChan, int fiberIndex, int spigot, int dccid) + : hcalElectronicsId_((uint32_t)((fiberChan&0x3) | (((fiberIndex-1)&0x7)<<2) | + ((spigot&0xF)<<5) | ((dccid&0x1F)<<9))) + {} /** VME Constructor from slb channel,slb site,spigot,dccid */ - HcalElectronicsId(int slbChan, int slbSite, int spigot, int dccid, int crate, int slot, int tb); + constexpr HcalElectronicsId(int slbChan, int slbSite, int spigot, + int dccid, int crate, int slot, int tb) + : hcalElectronicsId_((uint32_t)((slbChan&0x3) | (((slbSite)&0x7)<<2) | + ((spigot&0xF)<<5) | ((dccid&0x1F)<<9))) { + hcalElectronicsId_|=((tb&0x1)<<19) | ((slot&0x1f)<<14) | ((crate&0x3f)<<20); + hcalElectronicsId_|=0x02000000; + } /** uTCA constructor */ - HcalElectronicsId(int crate, int slot, int fiber, int fiberchan, bool isTrigger); + constexpr HcalElectronicsId(int crate, int slot, int fiber, int fc, bool isTrigger) + : hcalElectronicsId_((int)((fc&0xF) | (((fiber)&0x1F)<<4) | + ((slot&0xF)<<9) | ((crate&0x3F)<<13))) { + if (isTrigger) hcalElectronicsId_|=0x02000000; + hcalElectronicsId_|=0x04000000; + } - uint32_t operator()() { return hcalElectronicsId_; } + constexpr uint32_t operator()() { return hcalElectronicsId_; } - uint32_t rawId() const { return hcalElectronicsId_; } + constexpr uint32_t rawId() const { return hcalElectronicsId_; } - bool isVMEid() const { return (hcalElectronicsId_&0x04000000)==0; } - bool isUTCAid() const { return (hcalElectronicsId_&0x04000000)!=0; } - bool isTriggerChainId() const { return (hcalElectronicsId_&0x02000000)!=0; } + constexpr bool isVMEid() const { return (hcalElectronicsId_&0x04000000)==0; } + constexpr bool isUTCAid() const { return (hcalElectronicsId_&0x04000000)!=0; } + constexpr bool isTriggerChainId() const { return (hcalElectronicsId_&0x02000000)!=0; } /** Set the VME htr-related information 1=top, 0=bottom*/ - void setHTR(int crate, int slot, int tb); + constexpr void setHTR(int crate, int slot, int tb) { + if (isUTCAid()) return; // cannot do this for uTCA + hcalElectronicsId_&=0x3FFF; // keep the readout chain info + hcalElectronicsId_|=((tb&0x1)<<19) | ((slot&0x1f)<<14) | ((crate&0x3f)<<20); + } /// get subtype for this channel (valid for uTCA only) - int subtype() const { return (isUTCAid())?((hcalElectronicsId_>>21)&0x1F):(-1); } + constexpr int subtype() const { return (isUTCAid())?((hcalElectronicsId_>>21)&0x1F):(-1); } /// get the fiber channel id (which of channels on a fiber) - int fiberChanId() const { return (isVMEid())?(hcalElectronicsId_&0x3):(hcalElectronicsId_&0xF); } + constexpr int fiberChanId() const { return (isVMEid())?(hcalElectronicsId_&0x3):(hcalElectronicsId_&0xF); } /// get the fiber index. For VME 1-8 (which of eight fibers carried by a spigot), for uTCA fibers are zero-based - int fiberIndex() const { return (isVMEid())?(((hcalElectronicsId_>>2)&0x7)+1):((hcalElectronicsId_>>4)&0x1F); } + constexpr int fiberIndex() const { return (isVMEid())?(((hcalElectronicsId_>>2)&0x7)+1):((hcalElectronicsId_>>4)&0x1F); } /// get the SLB channel index (valid only for VME trigger-chain ids) - int slbChannelIndex() const { return hcalElectronicsId_&0x3; } + constexpr int slbChannelIndex() const { return hcalElectronicsId_&0x3; } /// get the SLB site number (valid only for VME trigger-chain ids) - int slbSiteNumber() const { return ((hcalElectronicsId_>>2)&0x7); } + constexpr int slbSiteNumber() const { return ((hcalElectronicsId_>>2)&0x7); } /// get the HTR channel id (1-24) - int htrChanId() const { return isVMEid()?((fiberChanId()+1)+((fiberIndex()-1)*3)):(0); } + constexpr int htrChanId() const { return isVMEid()?((fiberChanId()+1)+((fiberIndex()-1)*3)):(0); } /// get the HTR-wide slb channel code (letter plus number) std::string slbChannelCode() const; /// get the spigot (input number on DCC, AMC card number for uTCA) - int spigot() const { return (isVMEid())?((hcalElectronicsId_>>5)&0xF):slot(); } + constexpr int spigot() const { return (isVMEid())?((hcalElectronicsId_>>5)&0xF):slot(); } /// get the (Hcal local) DCC id for VME, crate number for uTCA - int dccid() const { return (isVMEid())?((hcalElectronicsId_>>9)&0x1F):crateId(); } + constexpr int dccid() const { return (isVMEid())?((hcalElectronicsId_>>9)&0x1F):crateId(); } /// get the htr slot - int htrSlot() const { return slot(); } + constexpr int htrSlot() const { return slot(); } /// get the htr or uHTR slot - int slot() const { return (isVMEid())?((hcalElectronicsId_>>14)&0x1F):((hcalElectronicsId_>>9)&0xF); } + constexpr int slot() const { return (isVMEid())?((hcalElectronicsId_>>14)&0x1F):((hcalElectronicsId_>>9)&0xF); } /// get the htr top/bottom (1=top/0=bottom), valid for VME - int htrTopBottom() const { return (isVMEid())?((hcalElectronicsId_>>19)&0x1):(-1); } + constexpr int htrTopBottom() const { return (isVMEid())?((hcalElectronicsId_>>19)&0x1):(-1); } /// get the readout VME crate number - int readoutVMECrateId() const { return crateId(); } + constexpr int readoutVMECrateId() const { return crateId(); } /// get the readout VME crate number - int crateId() const { return (isVMEid())?((hcalElectronicsId_>>20)&0x1F):((hcalElectronicsId_>>13)&0x3F); } + constexpr int crateId() const { return (isVMEid())?((hcalElectronicsId_>>20)&0x1F):((hcalElectronicsId_>>13)&0x3F); } /// get a fast, compact, unique index for linear lookups - int linearIndex() const { return (isVMEid())?((hcalElectronicsId_)&0x3FFF):((hcalElectronicsId_)&0x7FFFF); } + constexpr int linearIndex() const { return (isVMEid())?((hcalElectronicsId_)&0x3FFF):((hcalElectronicsId_)&0x7FFFF); } static const int maxLinearIndex = 0x7FFFF; // static const int maxDCCId = 31; /** Equality operator */ - int operator==(const HcalElectronicsId& id) const { return id.hcalElectronicsId_==hcalElectronicsId_; } + constexpr int operator==(const HcalElectronicsId& id) const { return id.hcalElectronicsId_==hcalElectronicsId_; } /** Non-Equality operator */ - int operator!=(const HcalElectronicsId& id) const { return id.hcalElectronicsId_!=hcalElectronicsId_; } + constexpr int operator!=(const HcalElectronicsId& id) const { return id.hcalElectronicsId_!=hcalElectronicsId_; } /// Compare the id to another id for use in a map - int operator<(const HcalElectronicsId& id) const { return hcalElectronicsId_ #include const HcalDetId HcalDetId::Undefined(HcalEmpty,0,0,0); -HcalDetId::HcalDetId() : DetId() { -} - -HcalDetId::HcalDetId(uint32_t rawid) { - if ((DetId::Detector(rawid>>DetId::kDetOffset)&DetId::kDetMask) != Hcal) { - id_ = rawid; - } else { - HcalSubdetector subdet = (HcalSubdetector)((rawid>>DetId::kSubdetOffset)&DetId::kSubdetMask); - if ((subdet==HcalBarrel) || (subdet==HcalEndcap) || - (subdet==HcalOuter) || (subdet==HcalForward)) { - id_ = newForm(rawid); - } else { - id_ = rawid; - } - } -} - -HcalDetId::HcalDetId(HcalSubdetector subdet, int tower_ieta, int tower_iphi, int depth) : DetId(Hcal,subdet) { - // (no checking at this point!) - id_ |= (kHcalIdFormat2) | ((depth&kHcalDepthMask2)<0)?(kHcalZsideMask2|(tower_ieta<0)?(kHcalZsideMask1|(eta<0)?(kHcalZsideMask2|(eta<>kHcalEtaOffset1)&kHcalEtaMask1; - else return (id_>>kHcalEtaOffset2)&kHcalEtaMask2; -} - -int HcalDetId::iphi() const { - if (oldFormat()) return id_&kHcalPhiMask1; - else return id_&kHcalPhiMask2; -} - -int HcalDetId::depth() const { - if (oldFormat()) return (id_>>kHcalDepthOffset1)&kHcalDepthMask1; - else return (id_>>kHcalDepthOffset2)&kHcalDepthMask2; -} - -int HcalDetId::hfdepth() const { - int dep = depth(); - if (subdet() == HcalForward) { - if (dep > 2) dep -= 2; - } - return dep; -} - -uint32_t HcalDetId::maskDepth() const { - if (oldFormat()) return (id_|kHcalDepthSet1); - else return (id_|kHcalDepthSet2); -} - -uint32_t HcalDetId::otherForm() const { - uint32_t rawid = (id_&kHcalIdMask); - if (oldFormat()) { - rawid = newForm(id_); - } else { - rawid |= ((depth()&kHcalDepthMask1)<0)?(kHcalZsideMask1|(ieta()<0)?(kHcalZsideMask2|(eta< 2) dep -= 2; - bool result = ((zsid==zside()) && (eta==ietaAbs()) && (phi==iphi()) && - (dep==hfdepth())); - return result; -} - -HcalDetId HcalDetId::baseDetId() const { - if (subdet() != HcalForward || depth() <= 2) { - return HcalDetId(id_); - } else { - int zsid, eta, phi, dep; - unpackId(id_, zsid, eta, phi, dep); - dep -= 2; - uint32_t rawid = id_&kHcalIdMask; - rawid |= (kHcalIdFormat2) | ((dep&kHcalDepthMask2)<0)?(kHcalZsideMask2|(eta< 2) { - return HcalDetId(id_); - } else { - int zsid, eta, phi, dep; - unpackId(id_, zsid, eta, phi, dep); - dep += 2; - uint32_t rawid = id_&kHcalIdMask; - rawid |= (kHcalIdFormat2) | ((dep&kHcalDepthMask2)<0)?(kHcalZsideMask2|(eta<360)?(simple_iphi-360):(simple_iphi)); -} - -int HcalDetId::crystal_iphi_high() const { - int simple_iphi=((iphi()-1)*5)+5; - simple_iphi+=10; - return ((simple_iphi>360)?(simple_iphi-360):(simple_iphi)); -} - -void HcalDetId::newFromOld(const uint32_t& rawid) { - id_ = newForm(rawid); -} - -void HcalDetId::unpackId(const uint32_t& rawid, int& zsid, int& eta, int& phi, - int& dep) { - if ((rawid&kHcalIdFormat2)==0) { - zsid = (rawid&kHcalZsideMask1)?(1):(-1); - eta = (rawid>>kHcalEtaOffset1)&kHcalEtaMask1; - phi = rawid&kHcalPhiMask1; - dep = (rawid>>kHcalDepthOffset1)&kHcalDepthMask1; - } else { - zsid = (rawid&kHcalZsideMask2)?(1):(-1); - eta = (rawid>>kHcalEtaOffset2)&kHcalEtaMask2; - phi = rawid&kHcalPhiMask2; - dep = (rawid>>kHcalDepthOffset2)&kHcalDepthMask2; - } -} - std::ostream& operator<<(std::ostream& s,const HcalDetId& id) { switch (id.subdet()) { case(HcalBarrel) : return s << "(HB " << id.ieta() << ',' << id.iphi() << ',' << id.depth() << ')'; diff --git a/DataFormats/HcalDetId/src/HcalElectronicsId.cc b/DataFormats/HcalDetId/src/HcalElectronicsId.cc index 4c267643e5885..0e7f912b9cf3d 100644 --- a/DataFormats/HcalDetId/src/HcalElectronicsId.cc +++ b/DataFormats/HcalDetId/src/HcalElectronicsId.cc @@ -1,32 +1,5 @@ #include "DataFormats/HcalDetId/interface/HcalElectronicsId.h" -HcalElectronicsId::HcalElectronicsId() { - hcalElectronicsId_=0xffffffffu; -} - -HcalElectronicsId::HcalElectronicsId(uint32_t id) { - hcalElectronicsId_=id; -} - -HcalElectronicsId::HcalElectronicsId(int fiberChan, int fiberIndex, int spigot, int dccid) { - hcalElectronicsId_=(fiberChan&0x3) | (((fiberIndex-1)&0x7)<<2) | - ((spigot&0xF)<<5) | ((dccid&0x1F)<<9); -} - -HcalElectronicsId::HcalElectronicsId(int slbChan, int slbSite, int spigot, int dccid, int crate, int slot, int tb) { - hcalElectronicsId_=(slbChan&0x3) | (((slbSite)&0x7)<<2) | - ((spigot&0xF)<<5) | ((dccid&0x1F)<<9); - hcalElectronicsId_|=((tb&0x1)<<19) | ((slot&0x1f)<<14) | ((crate&0x3f)<<20); - hcalElectronicsId_|=0x02000000; -} - -HcalElectronicsId::HcalElectronicsId(int crate, int slot, int fiber, int fc, bool isTrigger) { - hcalElectronicsId_=(fc&0xF) | (((fiber)&0x1F)<<4) | - ((slot&0xF)<<9) | ((crate&0x3F)<<13); - if (isTrigger) hcalElectronicsId_|=0x02000000; - hcalElectronicsId_|=0x04000000; -} - std::string HcalElectronicsId::slbChannelCode() const { std::string retval; if (isTriggerChainId() && isVMEid()) { @@ -49,12 +22,6 @@ std::string HcalElectronicsId::slbChannelCode() const { return retval; } -void HcalElectronicsId::setHTR(int crate, int slot, int tb) { - if (isUTCAid()) return; // cannot do this for uTCA - hcalElectronicsId_&=0x3FFF; // keep the readout chain info - hcalElectronicsId_|=((tb&0x1)<<19) | ((slot&0x1f)<<14) | ((crate&0x3f)<<20); -} - std::ostream& operator<<(std::ostream& os,const HcalElectronicsId& id) { if (id.isUTCAid()) { if (id.isTriggerChainId()) os << "UTCA(trigger): "; @@ -71,5 +38,3 @@ std::ostream& operator<<(std::ostream& os,const HcalElectronicsId& id) { } } } - - diff --git a/DataFormats/HcalDetId/test/BuildFile.xml b/DataFormats/HcalDetId/test/BuildFile.xml new file mode 100644 index 0000000000000..a876d1c99fc57 --- /dev/null +++ b/DataFormats/HcalDetId/test/BuildFile.xml @@ -0,0 +1,4 @@ + + + + diff --git a/DataFormats/HcalDetId/test/test_hcal_detid.cu b/DataFormats/HcalDetId/test/test_hcal_detid.cu new file mode 100644 index 0000000000000..ea2099ef2971f --- /dev/null +++ b/DataFormats/HcalDetId/test/test_hcal_detid.cu @@ -0,0 +1,79 @@ +#include +#include + +#include +#include +#include "DataFormats/DetId/interface/DetId.h" +#include "DataFormats/HcalDetId/interface/HcalDetId.h" + +__global__ void test_gen_detid(DetId* id) { + DetId did; + *id = did; +} + +__global__ void test_gen_hcal_detid(HcalDetId *id) { + HcalDetId did(HcalBarrel, 5, 5, 0); + *id = did; + + // trigger functions on the device + did.iphi(); + did.ieta(); + did.zside(); + did.subdet(); + did.ietaAbs(); + did.depth(); + did.hfdepth(); + did.maskDepth(); + did.baseDetId(); + did.secondAnodeId(); + did.crystal_ieta_low(); + did.crystal_ieta_high(); + did.crystal_iphi_low(); + did.crystal_iphi_high(); +} + +void test_detid() { + // test det ids + DetId h_id, h_id_test; + DetId h_test0{1}; + DetId *d_id; + + cudaMalloc((void**)&d_id, sizeof(DetId)); + cudaMemcpy(d_id, &h_id, sizeof(DetId), cudaMemcpyHostToDevice); + test_gen_detid<<<1,1>>>(d_id); + cudaMemcpy(&h_id_test, d_id, sizeof(DetId), cudaMemcpyDeviceToHost); + + assert(h_id_test == h_id); + assert(h_id != h_test0); +} + +void test_hcal_detid() { + HcalDetId h_id; + HcalDetId h_id_test0{HcalBarrel, 5, 5, 0}; + HcalDetId *d_id; + + cudaMalloc((void**)&d_id, sizeof(HcalDetId)); + cudaMemcpy(d_id, &h_id, sizeof(HcalDetId), cudaMemcpyHostToDevice); + test_gen_hcal_detid<<<1,1>>>(d_id); + cudaMemcpy(&h_id, d_id, sizeof(HcalDetId), cudaMemcpyDeviceToHost); + + std::cout << h_id_test0 << std::endl; + std::cout << h_id << std::endl; + assert(h_id_test0 == h_id); +} + +int main(int argc, char** argv) { + int nDevices; + cudaGetDeviceCount(&nDevices); + std::cout << "nDevices = " << nDevices << std::endl; + + // test det id functionality + if (nDevices>0) + test_detid(); + + // test hcal det ids + if (nDevices>0) + test_hcal_detid(); + + return 0; +} diff --git a/DataFormats/HcalDigi/interface/HBHEDataFrame.h b/DataFormats/HcalDigi/interface/HBHEDataFrame.h index 9afc182d87731..5ff9ef96ea233 100644 --- a/DataFormats/HcalDigi/interface/HBHEDataFrame.h +++ b/DataFormats/HcalDigi/interface/HBHEDataFrame.h @@ -4,7 +4,6 @@ #include "DataFormats/HcalDetId/interface/HcalDetId.h" #include "DataFormats/HcalDetId/interface/HcalElectronicsId.h" #include "DataFormats/HcalDigi/interface/HcalQIESample.h" -#include #include /** \class HBHEDataFrame @@ -16,40 +15,79 @@ class HBHEDataFrame { public: typedef HcalDetId key_type; ///< For the sorted collection - HBHEDataFrame(); // for persistence - explicit HBHEDataFrame(const HcalDetId& id); + constexpr HBHEDataFrame() + : id_(0), size_(0), hcalPresamples_(0) + {} + constexpr explicit HBHEDataFrame(const HcalDetId& id) : + id_(id), size_(0), hcalPresamples_(0) + { + // TODO : test id for HcalBarrel or HcalEndcap + } - const HcalDetId& id() const { return id_; } - const HcalElectronicsId& elecId() const { return electronicsId_; } + constexpr const HcalDetId& id() const { return id_; } + constexpr const HcalElectronicsId& elecId() const { return electronicsId_; } /// total number of samples in the digi - int size() const { return size_&0xF; } + constexpr int size() const { return size_&0xF; } /// number of samples before the sample from the triggered beam crossing (according to the hardware) - int presamples() const { return hcalPresamples_&0xF; } + constexpr int presamples() const { return hcalPresamples_&0xF; } /// was ZS MarkAndPass? - bool zsMarkAndPass() const { return (hcalPresamples_&0x10); } + constexpr bool zsMarkAndPass() const { return (hcalPresamples_&0x10); } /// was ZS unsuppressed? - bool zsUnsuppressed() const { return (hcalPresamples_&0x20); } + constexpr bool zsUnsuppressed() const { return (hcalPresamples_&0x20); } /// zs crossing mask (which sums considered) - uint32_t zsCrossingMask() const { return (hcalPresamples_&0x3FF000)>>12; } + constexpr uint32_t zsCrossingMask() const { return (hcalPresamples_&0x3FF000)>>12; } /// access a sample - const HcalQIESample& operator[](int i) const { return data_[i]; } + constexpr HcalQIESample const& operator[](int i) const { return data_[i]; } /// access a sample - const HcalQIESample& sample(int i) const { return data_[i]; } + constexpr HcalQIESample const& sample(int i) const { return data_[i]; } /// offset of bunch number for this channel relative to nominal set in the unpacker (range is +7->-7. -1000 indicates the data is invalid/unavailable) - int fiberIdleOffset() const; + constexpr int fiberIdleOffset() const { + int val=(hcalPresamples_&0xF00)>>8; + return (val==0)?(-1000):(((val&0x8)==0)?(-(val&0x7)):(val&0x7)); + } /// validate appropriate DV and ER bits as well as capid rotation for the specified samples (default is all) - bool validate(int firstSample=0, int nSamples=100) const; + constexpr bool validate(int firstSample=0, int nSamples=100) const { + int capid=-1; + bool ok=true; + for (int i=0; ok && iMAXSAMPLES) size_=MAXSAMPLES; + else if (size<=0) size_=0; + else size_=size; + } + constexpr void setPresamples(int ps) { + hcalPresamples_|=ps&0xF; + } + constexpr void setZSInfo(bool unsuppressed, bool markAndPass, + uint32_t crossingMask=0) { + hcalPresamples_&=0x7FC00F0F; // preserve actual presamples and fiber idle offset + if (markAndPass) hcalPresamples_|=0x10; + if (unsuppressed) hcalPresamples_|=0x20; + hcalPresamples_|=(crossingMask&0x3FF)<<12; + } + constexpr void setSample(int i, const HcalQIESample& sam) { data_[i]=sam; } + constexpr void setReadoutIds(const HcalElectronicsId& eid) { + electronicsId_=eid; + } + constexpr void setFiberIdleOffset(int offset) { + hcalPresamples_&=0x7FFFF0FF; + if (offset>=7) hcalPresamples_|=0xF00; + else if (offset>=0) hcalPresamples_|=(0x800)|(offset<<8); + else if (offset>=-7) hcalPresamples_|=((-offset)<<8); + else hcalPresamples_|=0x700; + } static const int MAXSAMPLES = 10; private: diff --git a/DataFormats/HcalDigi/interface/HFDataFrame.h b/DataFormats/HcalDigi/interface/HFDataFrame.h index 40bf0b749a844..c011b028b19bf 100644 --- a/DataFormats/HcalDigi/interface/HFDataFrame.h +++ b/DataFormats/HcalDigi/interface/HFDataFrame.h @@ -4,7 +4,6 @@ #include "DataFormats/HcalDetId/interface/HcalDetId.h" #include "DataFormats/HcalDetId/interface/HcalElectronicsId.h" #include "DataFormats/HcalDigi/interface/HcalQIESample.h" -#include #include /** \class HFDataFrame @@ -16,40 +15,78 @@ class HFDataFrame { public: typedef HcalDetId key_type; ///< For the sorted collection - HFDataFrame(); // for persistence - explicit HFDataFrame(const HcalDetId& id); - - const HcalDetId& id() const { return id_; } - const HcalElectronicsId& elecId() const { return electronicsId_; } + constexpr HFDataFrame() + : id_(0), size_(0), hcalPresamples_(0) + {} + constexpr explicit HFDataFrame(const HcalDetId& id) : + id_(id), size_(0), hcalPresamples_(0) + {// TODO : test id for HcalForward + } + + constexpr HcalDetId const& id() const { return id_; } + constexpr HcalElectronicsId const& elecId() const { return electronicsId_; } /// total number of samples in the digi - int size() const { return size_&0xF; } + constexpr int size() const { return size_&0xF; } /// number of samples before the sample from the triggered beam crossing (according to the hardware) - int presamples() const { return hcalPresamples_&0xF; } + constexpr int presamples() const { return hcalPresamples_&0xF; } /// was ZS MarkAndPass? - bool zsMarkAndPass() const { return (hcalPresamples_&0x10); } + constexpr bool zsMarkAndPass() const { return (hcalPresamples_&0x10); } /// was ZS unsuppressed? - bool zsUnsuppressed() const { return (hcalPresamples_&0x20); } + constexpr bool zsUnsuppressed() const { return (hcalPresamples_&0x20); } /// zs crossing mask (which sums considered) - uint32_t zsCrossingMask() const { return (hcalPresamples_&0x3FF000)>>12; } + constexpr uint32_t zsCrossingMask() const { return (hcalPresamples_&0x3FF000)>>12; } /// access a sample - const HcalQIESample& operator[](int i) const { return data_[i]; } + constexpr HcalQIESample const& operator[](int i) const { return data_[i]; } /// access a sample - const HcalQIESample& sample(int i) const { return data_[i]; } + constexpr HcalQIESample const& sample(int i) const { return data_[i]; } /// offset of bunch number for this channel relative to nominal set in the unpacker (range is +7->-7. -1000 indicates the data is invalid/unavailable) - int fiberIdleOffset() const; + constexpr int fiberIdleOffset() const { + int val=(hcalPresamples_&0xF00)>>8; + return (val==0)?(-1000):(((val&0x8)==0)?(-(val&0x7)):(val&0x7)); + } /// validate appropriate DV and ER bits as well as capid rotation for the specified samples (default is all) - bool validate(int firstSample=0, int nSamples=100) const; + constexpr bool validate(int firstSample=0, int nSamples=100) const { + int capid=-1; + bool ok=true; + for (int i=0; ok && iMAXSAMPLES) size_=MAXSAMPLES; + else if (size<=0) size_=0; + else size_=size; + } + constexpr void setPresamples(int ps) { + hcalPresamples_|=ps&0xF; + } + constexpr void setZSInfo(bool unsuppressed, bool markAndPass, + uint32_t crossingMask=0) { + hcalPresamples_&=0x7FC00F0F; // preserve actual presamples and fiber idle offset + if (markAndPass) hcalPresamples_|=0x10; + if (unsuppressed) hcalPresamples_|=0x20; + hcalPresamples_|=(crossingMask&0x3FF)<<12; + } + constexpr void setSample(int i, const HcalQIESample& sam) { data_[i]=sam; } + constexpr void setReadoutIds(const HcalElectronicsId& eid) { + electronicsId_=eid; + } + constexpr void setFiberIdleOffset(int offset) { + hcalPresamples_&=0x7FFFF0FF; + if (offset>=7) hcalPresamples_|=0xF00; + else if (offset>=0) hcalPresamples_|=(0x800)|(offset<<8); + else if (offset>=-7) hcalPresamples_|=((-offset)<<8); + else hcalPresamples_|=0x700; + } static const int MAXSAMPLES = 10; private: diff --git a/DataFormats/HcalDigi/interface/HODataFrame.h b/DataFormats/HcalDigi/interface/HODataFrame.h index 0c131c1588a4a..d8adea0fcca05 100644 --- a/DataFormats/HcalDigi/interface/HODataFrame.h +++ b/DataFormats/HcalDigi/interface/HODataFrame.h @@ -4,7 +4,6 @@ #include "DataFormats/HcalDetId/interface/HcalDetId.h" #include "DataFormats/HcalDetId/interface/HcalElectronicsId.h" #include "DataFormats/HcalDigi/interface/HcalQIESample.h" -#include #include @@ -17,40 +16,77 @@ class HODataFrame { public: typedef HcalDetId key_type; ///< For the sorted collection - HODataFrame(); // for persistence - explicit HODataFrame(const HcalDetId& id); + HODataFrame() + : id_(0), size_(0), hcalPresamples_(0) + {} + explicit constexpr HODataFrame(const HcalDetId& id) + : id_(id), size_(0), hcalPresamples_(0) + {// TODO : test id for HcalOuter + } - const HcalDetId& id() const { return id_; } - const HcalElectronicsId& elecId() const { return electronicsId_; } + constexpr HcalDetId const& id() const { return id_; } + constexpr HcalElectronicsId const& elecId() const { return electronicsId_; } /// total number of samples in the digi - int size() const { return size_&0xF; } + constexpr int size() const { return size_&0xF; } /// number of samples before the sample from the triggered beam crossing (according to the hardware) - int presamples() const { return hcalPresamples_&0xF; } + constexpr int presamples() const { return hcalPresamples_&0xF; } /// was ZS MarkAndPass? - bool zsMarkAndPass() const { return (hcalPresamples_&0x10); } + constexpr bool zsMarkAndPass() const { return (hcalPresamples_&0x10); } /// was ZS unsuppressed? - bool zsUnsuppressed() const { return (hcalPresamples_&0x20); } + constexpr bool zsUnsuppressed() const { return (hcalPresamples_&0x20); } /// zs crossing mask (which sums considered) - uint32_t zsCrossingMask() const { return (hcalPresamples_&0x3FF000)>>12; } + constexpr uint32_t zsCrossingMask() const { return (hcalPresamples_&0x3FF000)>>12; } /// access a sample - const HcalQIESample& operator[](int i) const { return data_[i]; } + constexpr const HcalQIESample& operator[](int i) const { return data_[i]; } /// access a sample - const HcalQIESample& sample(int i) const { return data_[i]; } + constexpr const HcalQIESample& sample(int i) const { return data_[i]; } /// offset of bunch number for this channel relative to nominal set in the unpacker (range is +7->-7. -1000 indicates the data is invalid/unavailable) - int fiberIdleOffset() const; + constexpr int fiberIdleOffset() const { + int val=(hcalPresamples_&0xF00)>>8; + return (val==0)?(-1000):(((val&0x8)==0)?(-(val&0x7)):(val&0x7)); + } /// validate appropriate DV and ER bits as well as capid rotation for the specified samples (default is all) - bool validate(int firstSample=0, int nSamples=100) const; + constexpr bool validate(int firstSample=0, int nSamples=100) const { + int capid=-1; + bool ok=true; + for (int i=0; ok && iMAXSAMPLES) size_=MAXSAMPLES; + else if (size<=0) size_=0; + else size_=size; + } + constexpr void setPresamples(int ps) { + hcalPresamples_|=ps&0xF; + } + constexpr void setZSInfo(bool unsuppressed, bool markAndPass, uint32_t crossingMask=0) { + hcalPresamples_&=0x7FC00F0F; // preserve actual presamples and fiber idle offset + if (markAndPass) hcalPresamples_|=0x10; + if (unsuppressed) hcalPresamples_|=0x20; + hcalPresamples_|=(crossingMask&0x3FF)<<12; + } + constexpr void setSample(int i, const HcalQIESample& sam) { data_[i]=sam; } + constexpr void setReadoutIds(const HcalElectronicsId& eid) { + electronicsId_=eid; + } + constexpr void setFiberIdleOffset(int offset) { + hcalPresamples_&=0xFFFF0FF; + if (offset>=7) hcalPresamples_|=0xF00; + else if (offset>=0) hcalPresamples_|=(0x800)|(offset<<8); + else if (offset>=-7) hcalPresamples_|=((-offset)<<8); + else hcalPresamples_|=0x700; + } static const int MAXSAMPLES = 10; private: diff --git a/DataFormats/HcalDigi/interface/HcalQIESample.h b/DataFormats/HcalDigi/interface/HcalQIESample.h index c26c1b0c4ce9c..c05ab44e9a31c 100644 --- a/DataFormats/HcalDigi/interface/HcalQIESample.h +++ b/DataFormats/HcalDigi/interface/HcalQIESample.h @@ -4,6 +4,34 @@ #include #include +static +#ifdef __CUDA_ARCH__ + __constant__ +#else + constexpr +#endif +float +nominal_adc2fc[128] = {-0.5f,0.5f,1.5f,2.5f,3.5f,4.5f,5.5f,6.5f,7.5f,8.5f,9.5f,10.5f,11.5f,12.5f,13.5f, + 15.0f,17.0f,19.0f,21.0f,23.0f,25.0f,27.0f, + 29.5f,32.5f,35.5f,38.5f, + 42.0f,46.0f,50.0f, + 54.5f,59.5f,64.5f, + 59.5f,64.5f,69.5f,74.5f,79.5f,84.5f,89.5f,94.5f,99.5f,104.5f,109.5f,114.5f,119.5f,124.5f,129.5f, + 137.0f,147.0f,157.0f,167.0f,177.0f,187.0f,197.0f, + 209.5f,224.5f,239.5f,254.5f, + 272.0f,292.0f,312.0f, + 334.5f,359.5f,384.5f, + 359.5f,384.5f,409.5f,434.5f,459.5f,484.5f,509.5f,534.5f,559.5f,584.5f,609.5f,634.5f,659.5f,684.5f,709.5f, + 747.0f,797.0f,847.0f,897.0f,947.0f,997.0f,1047.0f, + 1109.5f,1184.5f,1259.5f,1334.5f, + 1422.0f,1522.0f,1622.0f, + 1734.5f,1859.5f,1984.5f, + 1859.5f,1984.5f,2109.5f,2234.5f,2359.5f,2484.5f,2609.5f,2734.5f,2859.5f,2984.5f,3109.5f,3234.5f,3359.5f,3484.5f,3609.5f, + 3797.0f,4047.0f,4297.0f,4547.0f,4797.0f,5047.0f,5297.0f, + 5609.5f,5984.5f,6359.5f,6734.5f, + 7172.0f,7672.0f,8172.0f, + 8734.5f,9359.5f,9984.5f}; + /** \class HcalQIESample * Simple container packer/unpacker for a single QIE data word * @@ -12,31 +40,42 @@ */ class HcalQIESample { public: - HcalQIESample() { theSample=0; } - HcalQIESample(uint16_t data) { theSample=data; } - HcalQIESample(int adc, int capid, int fiber, int fiberchan, bool dv=true, bool er=false); + constexpr HcalQIESample() + : theSample{0} + {} + constexpr HcalQIESample(uint16_t data) + : theSample{data} + {} + constexpr HcalQIESample(int adc, int capid, int fiber, + int fiberchan, bool dv=true, bool er=false) + : theSample((uint16_t)((adc&0x7f) | ((capid&0x3)<<7) | + (((fiber-1)&0x7)<<13) | ((fiberchan&0x3)<<11) | + ((dv)?(0x0200):(0)) | ((er)?(0x0400):(0)))) + {} /// get the raw word - uint16_t raw() const { return theSample; } + constexpr uint16_t raw() const { return theSample; } /// get the ADC sample - int adc() const { return theSample&0x7F; } + constexpr int adc() const { return theSample&0x7F; } /// get the nominal FC (no calibrations applied) - double nominal_fC() const; + constexpr double nominal_fC() const { + return nominal_adc2fc[adc()]; + } /// get the Capacitor id - int capid() const { return (theSample>>7)&0x3; } + constexpr int capid() const { return (theSample>>7)&0x3; } /// is the Data Valid bit set? - bool dv() const { return (theSample&0x0200)!=0; } + constexpr bool dv() const { return (theSample&0x0200)!=0; } /// is the error bit set? - bool er() const { return (theSample&0x0400)!=0; } + constexpr bool er() const { return (theSample&0x0400)!=0; } /// get the fiber number - int fiber() const { return ((theSample>>13)&0x7)+1; } + constexpr int fiber() const { return ((theSample>>13)&0x7)+1; } /// get the fiber channel number - int fiberChan() const { return (theSample>>11)&0x3; } + constexpr int fiberChan() const { return (theSample>>11)&0x3; } /// get the id channel - int fiberAndChan() const { return (theSample>>11)&0x1F; } + constexpr int fiberAndChan() const { return (theSample>>11)&0x1F; } /// for streaming - uint16_t operator()() { return theSample; } + constexpr uint16_t operator()() { return theSample; } private: uint16_t theSample; diff --git a/DataFormats/HcalDigi/interface/QIE10DataFrame.h b/DataFormats/HcalDigi/interface/QIE10DataFrame.h index ffbfdf27b14f6..0109fe452fefe 100644 --- a/DataFormats/HcalDigi/interface/QIE10DataFrame.h +++ b/DataFormats/HcalDigi/interface/QIE10DataFrame.h @@ -15,16 +15,24 @@ class QIE10DataFrame { static const int HEADER_WORDS = 1; static const int FLAG_WORDS = 1; - QIE10DataFrame() { } - QIE10DataFrame(edm::DataFrame const & df) : m_data(df) { } + constexpr QIE10DataFrame() { } + constexpr QIE10DataFrame(edm::DataFrame const & df) : m_data(df) { } class Sample { public: typedef uint32_t wide_type; - Sample(const edm::DataFrame& frame, edm::DataFrame::size_type i) : word1_(frame[i]), word2_(frame[i+1]) { } - Sample(const edm::DataFrame::data_type& word1, const edm::DataFrame::data_type& word2) : word1_(word1), word2_(word2) {} - explicit Sample(wide_type wide); + constexpr Sample(const edm::DataFrame& frame, edm::DataFrame::size_type i) : word1_(frame[i]), word2_(frame[i+1]) { } + constexpr Sample(const edm::DataFrame::data_type& word1, const edm::DataFrame::data_type& word2) : word1_(word1), word2_(word2) {} + explicit Sample(const wide_type wide) + : word1_{0}, word2_{0} { + static_assert(sizeof(wide) == 2*sizeof(word1_), + "The wide input type must be able to contain two words"); + const edm::DataFrame::data_type* ptr = + reinterpret_cast(&wide); + word1_ = ptr[0]; + word2_ = ptr[1]; + } static const int MASK_ADC = 0xFF; static const int MASK_LE_TDC = 0x3F; @@ -35,57 +43,86 @@ class QIE10DataFrame { static const int MASK_CAPID = 0x3; static const int OFFSET_CAPID = 12; - inline int adc() const { return word1_&MASK_ADC; } - inline int le_tdc() const { return word2_&MASK_LE_TDC; } - inline int te_tdc() const { return (word2_>>OFFSET_TE_TDC)&MASK_TE_TDC; } - inline bool ok() const { return word1_&MASK_OK; } - inline bool soi() const { return word1_&MASK_SOI; } - inline int capid() const { return (word2_>>OFFSET_CAPID)&MASK_CAPID; } - inline edm::DataFrame::data_type raw(edm::DataFrame::size_type i) const + constexpr inline int adc() const { return word1_&MASK_ADC; } + constexpr inline int le_tdc() const { return word2_&MASK_LE_TDC; } + constexpr inline int te_tdc() const { return (word2_>>OFFSET_TE_TDC)&MASK_TE_TDC; } + constexpr inline bool ok() const { return word1_&MASK_OK; } + constexpr inline bool soi() const { return word1_&MASK_SOI; } + constexpr inline int capid() const { return (word2_>>OFFSET_CAPID)&MASK_CAPID; } + constexpr inline edm::DataFrame::data_type raw(edm::DataFrame::size_type i) const { return (i > WORDS_PER_SAMPLE) ? 0 : ( (i==1) ? word2_ : word1_ ); } - wide_type wideRaw() const; + QIE10DataFrame::Sample::wide_type wideRaw() const { + static_assert(sizeof(QIE10DataFrame::Sample::wide_type) == 2*sizeof(word1_), + "The wide result type must be able to contain two words"); + wide_type result = 0; + edm::DataFrame::data_type* ptr = + reinterpret_cast(&result); + ptr[0] = word1_; + ptr[1] = word2_; + return result; + } private: edm::DataFrame::data_type word1_; edm::DataFrame::data_type word2_; }; - void copyContent(const QIE10DataFrame& src); + constexpr void copyContent(const QIE10DataFrame& digi) { + for (edm::DataFrame::size_type i=0; i>OFFSET_FLAVOR)&MASK_FLAVOR); } + constexpr int flavor() const { return ((m_data[0]>>OFFSET_FLAVOR)&MASK_FLAVOR); } /// was there a link error? static const int MASK_LINKERROR = 0x800; - bool linkError() const { return m_data[0]&MASK_LINKERROR; } + constexpr bool linkError() const { return m_data[0]&MASK_LINKERROR; } /// was this a mark-and-pass ZS event? static const int MASK_MARKPASS = 0x100; - bool zsMarkAndPass() const {return m_data[0]&MASK_MARKPASS; } + constexpr bool zsMarkAndPass() const {return m_data[0]&MASK_MARKPASS; } /// set ZS params - void setZSInfo(bool markAndPass); + constexpr void setZSInfo(bool markAndPass) { + if(markAndPass) m_data[0] |= MASK_MARKPASS; + } /// get the sample - inline Sample operator[](edm::DataFrame::size_type i) const { return Sample(m_data,i*WORDS_PER_SAMPLE+HEADER_WORDS); } + constexpr inline Sample operator[](edm::DataFrame::size_type i) const { return Sample(m_data,i*WORDS_PER_SAMPLE+HEADER_WORDS); } /// set the sample contents - void setSample(edm::DataFrame::size_type isample, int adc, int le_tdc, int te_tdc, int capid, bool soi=false, bool ok=true); + constexpr void setSample(edm::DataFrame::size_type isample, int adc, + int le_tdc, int te_tdc, int capid, bool soi=false, + bool ok=true) { + if (isample>=size()) return; + m_data[isample*WORDS_PER_SAMPLE+HEADER_WORDS]=(adc&Sample::MASK_ADC)|(soi?(Sample::MASK_SOI):(0))|(ok?(Sample::MASK_OK):(0)); + m_data[isample*WORDS_PER_SAMPLE+HEADER_WORDS+1]=(le_tdc&Sample::MASK_LE_TDC)|((te_tdc&Sample::MASK_TE_TDC)<>OFFSET_TDC)&MASK_TDC; } - bool soi() const { return frame_[i_]&MASK_SOI; } - int capid() const { return ((((frame_[0]>>OFFSET_CAPID)&MASK_CAPID)+i_-HEADER_WORDS)&MASK_CAPID); } + constexpr int adc() const { return frame_[i_]&MASK_ADC; } + constexpr int tdc() const { return (frame_[i_]>>OFFSET_TDC)&MASK_TDC; } + constexpr bool soi() const { return frame_[i_]&MASK_SOI; } + constexpr int capid() const { return ((((frame_[0]>>OFFSET_CAPID)&MASK_CAPID)+i_-HEADER_WORDS)&MASK_CAPID); } private: const edm::DataFrame& frame_; edm::DataFrame::size_type i_; }; - void copyContent(const QIE11DataFrame&); + constexpr void copyContent(const QIE11DataFrame& digi) { + for (edm::DataFrame::size_type i=0; i>OFFSET_FLAVOR)&MASK_FLAVOR); } + constexpr int flavor() const { return ((m_data[0]>>OFFSET_FLAVOR)&MASK_FLAVOR); } /// was there a link error? static const int MASK_LINKERROR = 0x800; - bool linkError() const { return m_data[0]&MASK_LINKERROR; } + constexpr bool linkError() const { return m_data[0]&MASK_LINKERROR; } /// was there a capid rotation error? static const int MASK_CAPIDERROR = 0x400; - bool capidError() const { return m_data[0]&MASK_CAPIDERROR; } + constexpr bool capidError() const { return m_data[0]&MASK_CAPIDERROR; } /// was this a mark-and-pass ZS event? - bool zsMarkAndPass() const {return (flavor()==1); } + constexpr bool zsMarkAndPass() const {return (flavor()==1); } /// set ZS params - void setZSInfo(bool markAndPass); + constexpr void setZSInfo(bool markAndPass) { + if(markAndPass) m_data[0] |= (markAndPass&MASK_FLAVOR)<=size()) return; + m_data[isample+1]=(adc&Sample::MASK_ADC)|(soi?(Sample::MASK_SOI):(0))|((tdc&Sample::MASK_TDC)<MAXSAMPLES) size_=MAXSAMPLES; - else if (size<=0) size_=0; - else size_=size; -} -void HBHEDataFrame::setPresamples(int ps) { - hcalPresamples_|=ps&0xF; -} -void HBHEDataFrame::setReadoutIds(const HcalElectronicsId& eid) { - electronicsId_=eid; -} - -bool HBHEDataFrame::validate(int firstSample, int nSamples) const { - int capid=-1; - bool ok=true; - for (int i=0; ok && i>8; - return (val==0)?(-1000):(((val&0x8)==0)?(-(val&0x7)):(val&0x7)); -} - -void HBHEDataFrame::setFiberIdleOffset(int offset) { - hcalPresamples_&=0x7FFFF0FF; - if (offset>=7) hcalPresamples_|=0xF00; - else if (offset>=0) hcalPresamples_|=(0x800)|(offset<<8); - else if (offset>=-7) hcalPresamples_|=((-offset)<<8); - else hcalPresamples_|=0x700; -} - - std::ostream& operator<<(std::ostream& s, const HBHEDataFrame& digi) { s << digi.id() << " " << digi.size() << " samples " << digi.presamples() << " presamples "; if (digi.zsUnsuppressed()) s << " zsUS"; @@ -73,5 +13,3 @@ std::ostream& operator<<(std::ostream& s, const HBHEDataFrame& digi) { s << " " << digi.sample(i) << std::endl; return s; } - - diff --git a/DataFormats/HcalDigi/src/HFDataFrame.cc b/DataFormats/HcalDigi/src/HFDataFrame.cc index 631ae1c85fdec..c2cd07316a561 100644 --- a/DataFormats/HcalDigi/src/HFDataFrame.cc +++ b/DataFormats/HcalDigi/src/HFDataFrame.cc @@ -1,63 +1,5 @@ #include "DataFormats/HcalDigi/interface/HFDataFrame.h" -HFDataFrame::HFDataFrame() : id_(0), - size_(0), - hcalPresamples_(0) -{ -} - -HFDataFrame::HFDataFrame(const HcalDetId& id) : - id_(id), - size_(0), - hcalPresamples_(0) -{ - // TODO : test id for HcalForward -} - -void HFDataFrame::setSize(int size) { - if (size>MAXSAMPLES) size_=MAXSAMPLES; - else if (size<=0) size_=0; - else size_=size; -} -void HFDataFrame::setPresamples(int ps) { - hcalPresamples_|=ps&0xF; -} -void HFDataFrame::setReadoutIds(const HcalElectronicsId& eid) { - electronicsId_=eid; -} - -bool HFDataFrame::validate(int firstSample, int nSamples) const { - int capid=-1; - bool ok=true; - for (int i=0; ok && i>8; - return (val==0)?(-1000):(((val&0x8)==0)?(-(val&0x7)):(val&0x7)); -} - -void HFDataFrame::setFiberIdleOffset(int offset) { - hcalPresamples_&=0x7FFFF0FF; - if (offset>=7) hcalPresamples_|=0xF00; - else if (offset>=0) hcalPresamples_|=(0x800)|(offset<<8); - else if (offset>=-7) hcalPresamples_|=((-offset)<<8); - else hcalPresamples_|=0x700; -} - std::ostream& operator<<(std::ostream& s, const HFDataFrame& digi) { s << digi.id() << " " << digi.size() << " samples " << digi.presamples() << " presamples "; if (digi.zsUnsuppressed()) s << " zsUS "; diff --git a/DataFormats/HcalDigi/src/HODataFrame.cc b/DataFormats/HcalDigi/src/HODataFrame.cc index 9fa8b9f348db9..1604a5a919fe9 100644 --- a/DataFormats/HcalDigi/src/HODataFrame.cc +++ b/DataFormats/HcalDigi/src/HODataFrame.cc @@ -1,65 +1,5 @@ #include "DataFormats/HcalDigi/interface/HODataFrame.h" - -HODataFrame::HODataFrame() : id_(0), - size_(0), - hcalPresamples_(0) -{ -} - -HODataFrame::HODataFrame(const HcalDetId& id) : - id_(id), - size_(0), - hcalPresamples_(0) -{ - // TODO : test id for HcalOuter -} - -void HODataFrame::setSize(int size) { - if (size>MAXSAMPLES) size_=MAXSAMPLES; - else if (size<=0) size_=0; - else size_=size; -} -void HODataFrame::setPresamples(int ps) { - hcalPresamples_|=ps&0xF; -} -void HODataFrame::setReadoutIds(const HcalElectronicsId& eid) { - electronicsId_=eid; -} - -bool HODataFrame::validate(int firstSample, int nSamples) const { - int capid=-1; - bool ok=true; - for (int i=0; ok && i>8; - return (val==0)?(-1000):(((val&0x8)==0)?(-(val&0x7)):(val&0x7)); -} - -void HODataFrame::setFiberIdleOffset(int offset) { - hcalPresamples_&=0xFFFF0FF; - if (offset>=7) hcalPresamples_|=0xF00; - else if (offset>=0) hcalPresamples_|=(0x800)|(offset<<8); - else if (offset>=-7) hcalPresamples_|=((-offset)<<8); - else hcalPresamples_|=0x700; -} - std::ostream& operator<<(std::ostream& s, const HODataFrame& digi) { s << digi.id() << " " << digi.size() << " samples " << digi.presamples() << " presamples "; if (digi.zsUnsuppressed()) s << " zsUS "; diff --git a/DataFormats/HcalDigi/src/HcalQIESample.cc b/DataFormats/HcalDigi/src/HcalQIESample.cc index 93ba46825433a..6408b6d69c329 100644 --- a/DataFormats/HcalDigi/src/HcalQIESample.cc +++ b/DataFormats/HcalDigi/src/HcalQIESample.cc @@ -1,36 +1,5 @@ #include "DataFormats/HcalDigi/interface/HcalQIESample.h" -static const float nominal_adc2fc[128] = {-0.5f,0.5f,1.5f,2.5f,3.5f,4.5f,5.5f,6.5f,7.5f,8.5f,9.5f,10.5f,11.5f,12.5f,13.5f, - 15.0f,17.0f,19.0f,21.0f,23.0f,25.0f,27.0f, - 29.5f,32.5f,35.5f,38.5f, - 42.0f,46.0f,50.0f, - 54.5f,59.5f,64.5f, - 59.5f,64.5f,69.5f,74.5f,79.5f,84.5f,89.5f,94.5f,99.5f,104.5f,109.5f,114.5f,119.5f,124.5f,129.5f, - 137.0f,147.0f,157.0f,167.0f,177.0f,187.0f,197.0f, - 209.5f,224.5f,239.5f,254.5f, - 272.0f,292.0f,312.0f, - 334.5f,359.5f,384.5f, - 359.5f,384.5f,409.5f,434.5f,459.5f,484.5f,509.5f,534.5f,559.5f,584.5f,609.5f,634.5f,659.5f,684.5f,709.5f, - 747.0f,797.0f,847.0f,897.0f,947.0f,997.0f,1047.0f, - 1109.5f,1184.5f,1259.5f,1334.5f, - 1422.0f,1522.0f,1622.0f, - 1734.5f,1859.5f,1984.5f, - 1859.5f,1984.5f,2109.5f,2234.5f,2359.5f,2484.5f,2609.5f,2734.5f,2859.5f,2984.5f,3109.5f,3234.5f,3359.5f,3484.5f,3609.5f, - 3797.0f,4047.0f,4297.0f,4547.0f,4797.0f,5047.0f,5297.0f, - 5609.5f,5984.5f,6359.5f,6734.5f, - 7172.0f,7672.0f,8172.0f, - 8734.5f,9359.5f,9984.5f}; - -HcalQIESample::HcalQIESample(int adc, int capid, int fiber, int fiberchan, bool dv, bool er) { - theSample=(adc&0x7f) | ((capid&0x3)<<7) | - (((fiber-1)&0x7)<<13) | ((fiberchan&0x3)<<11) | - ((dv)?(0x0200):(0)) | ((er)?(0x0400):(0)); -} - -double HcalQIESample::nominal_fC() const { - return nominal_adc2fc[adc()]; -} - std::ostream& operator<<(std::ostream& s, const HcalQIESample& samp) { s << "ADC=" << samp.adc() << ", capid=" << samp.capid(); if (samp.er()) s << ", ER"; diff --git a/DataFormats/HcalDigi/src/QIE10DataFrame.cc b/DataFormats/HcalDigi/src/QIE10DataFrame.cc index 74a6fb46a2e29..85bc9643c384b 100644 --- a/DataFormats/HcalDigi/src/QIE10DataFrame.cc +++ b/DataFormats/HcalDigi/src/QIE10DataFrame.cc @@ -1,56 +1,6 @@ -#include - #include "DataFormats/HcalDigi/interface/QIE10DataFrame.h" #include "DataFormats/HcalDetId/interface/HcalGenericDetId.h" -void QIE10DataFrame::setSample(edm::DataFrame::size_type isample, int adc, int le_tdc, int te_tdc, int capid, bool soi, bool ok) { - if (isample>=size()) return; - m_data[isample*WORDS_PER_SAMPLE+HEADER_WORDS]=(adc&Sample::MASK_ADC)|(soi?(Sample::MASK_SOI):(0))|(ok?(Sample::MASK_OK):(0)); - m_data[isample*WORDS_PER_SAMPLE+HEADER_WORDS+1]=(le_tdc&Sample::MASK_LE_TDC)|((te_tdc&Sample::MASK_TE_TDC)<(&wide); - word1_ = ptr[0]; - word2_ = ptr[1]; -} - -QIE10DataFrame::Sample::wide_type QIE10DataFrame::Sample::wideRaw() const { - static_assert(sizeof(QIE10DataFrame::Sample::wide_type) == 2*sizeof(word1_), - "The wide result type must be able to contain two words"); - wide_type result = 0; - edm::DataFrame::data_type* ptr = - reinterpret_cast(&result); - ptr[0] = word1_; - ptr[1] = word2_; - return result; -} - std::ostream& operator<<(std::ostream& s, const QIE10DataFrame& digi) { if (digi.detid().det()==DetId::Hcal) { s << HcalGenericDetId(digi.detid()); diff --git a/DataFormats/HcalDigi/src/QIE11DataFrame.cc b/DataFormats/HcalDigi/src/QIE11DataFrame.cc index 8d9d4882a2995..95ab0575e1efb 100644 --- a/DataFormats/HcalDigi/src/QIE11DataFrame.cc +++ b/DataFormats/HcalDigi/src/QIE11DataFrame.cc @@ -1,38 +1,6 @@ #include "DataFormats/HcalDigi/interface/QIE11DataFrame.h" #include "DataFormats/HcalDetId/interface/HcalGenericDetId.h" -void QIE11DataFrame::setCapid0(int cap0) { - m_data[0]&=0xFCFF; // inversion of the capid0 mask - m_data[0]|=((cap0&Sample::MASK_CAPID)<=size()) return; - m_data[isample+1]=(adc&Sample::MASK_ADC)|(soi?(Sample::MASK_SOI):(0))|((tdc&Sample::MASK_TDC)< - - - + + + + + + + + + + diff --git a/DataFormats/HcalDigi/test/test_hcal_digi.cu b/DataFormats/HcalDigi/test/test_hcal_digi.cu new file mode 100644 index 0000000000000..fafa52cbc6ee4 --- /dev/null +++ b/DataFormats/HcalDigi/test/test_hcal_digi.cu @@ -0,0 +1,185 @@ +#include +#include + +#include +#include +#include "DataFormats/DetId/interface/DetId.h" +#include "DataFormats/HcalDetId/interface/HcalDetId.h" +#include "DataFormats/HcalDigi/interface/HBHEDataFrame.h" +#include "DataFormats/HcalDigi/interface/QIE10DataFrame.h" +#include "DataFormats/HcalDigi/interface/QIE11DataFrame.h" +#include "DataFormats/HcalDigi/interface/HcalDigiCollections.h" +#include "DataFormats/Common/interface/DataFrame.h" + +__global__ void kernel_test_hcal_qiesample(HcalQIESample* sample, uint16_t value) { + printf("kernel: testing hcal qie sampel\n"); + printf("%f %f %f\n", nominal_adc2fc[0], nominal_adc2fc[1], nominal_adc2fc[2]); + + HcalQIESample tmp{value}; + *sample = tmp; +} + +__global__ void kernel_test_hcal_qie8_hbhedf(HBHEDataFrame *df) { + printf("kernel: testing hcal hbhe dataframe\n"); + df->setSize(10); + for (auto i=0; i<10; i++) + df->setSample(i, HcalQIESample(100)); + df->setReadoutIds(HcalElectronicsId(100)); +} + +void test_hcal_qiesample() { + HcalQIESample h_sample, h_test_sample0{100}, h_test_sample1; + HcalQIESample *d_sample; + + cudaMalloc((void**)&d_sample, sizeof(HcalQIESample)); + cudaMemcpy(d_sample, &h_sample, sizeof(HcalQIESample), cudaMemcpyHostToDevice); + kernel_test_hcal_qiesample<<<1,1>>>(d_sample, 100); + cudaMemcpy(&h_sample, d_sample, sizeof(HcalQIESample), cudaMemcpyDeviceToHost); + + assert(h_sample() == h_test_sample0()); + assert(h_sample() != h_test_sample1()); +} + +template +__global__ void kernel_test_hcal_qie8_digis(TDF *pdfs, uint32_t* out) { + int id = threadIdx.x; + uint32_t sum = 0; + for (auto i=0; i<10; i++) + sum += pdfs[id].sample(i).raw(); + out[id] = sum; +} + +template +__global__ void kernel_test_hcal_qie1011_digis(uint16_t* pdfs, uint32_t* out, int samples) { + printf("kernel: testing hcal qie1011 df\n"); + int id = threadIdx.x; + uint32_t sum=0; + int nwords = TDF::WORDS_PER_SAMPLE*samples + TDF::HEADER_WORDS + TDF::FLAG_WORDS; + TDF df(edm::DataFrame(0, pdfs + id*nwords, nwords)); + for (auto i=0; i< df.samples(); i++) { + sum += df[i].adc(); + } + + out[id] = sum; +} + +template +void test_hcal_qie1011_digis() { + constexpr int size = 10; + constexpr int samples = 10; + constexpr int detid = 2; + HcalDataFrameContainer coll{samples, detid}; + TDF *d_dfs; + uint16_t *d_data; + uint32_t *d_out; + uint32_t h_out[size], h_test_out[size]; + for (auto i=0; i<<<1, size>>>(d_data, d_out, samples); + cudaDeviceSynchronize(); + auto code = cudaGetLastError(); + if (code != cudaSuccess) + std::cout << cudaGetErrorString(code); + cudaMemcpy(&h_out, d_out, size * sizeof(uint32_t), cudaMemcpyDeviceToHost); + + // comparison + for (auto i=0; i +void test_hcal_qie8_digis() { + constexpr int n = 10; + edm::SortedCollection coll{n}; + TDF *d_dfs; + uint32_t *d_out; + uint32_t h_out[n], h_test_out[n]; + for (auto i=0; i>>(d_dfs, d_out); + cudaMemcpy(&h_out, d_out, n * sizeof(uint32_t), cudaMemcpyDeviceToHost); + + std::cout << "collection size = " << coll.size() << std::endl; + + // comparison + for (auto i=0; i>>(d_df); + cudaMemcpy(&h_df, d_df, sizeof(HBHEDataFrame), cudaMemcpyDeviceToHost); + + assert(h_df.size() == h_test_df.size()); + assert(h_df.elecId() == h_test_df.elecId()); + for (auto i=0; i<10; i++) + assert(h_df[i].raw() == h_test_df[i].raw()); +} + +int main(int argc, char** argv) { + int nDevices; + cudaGetDeviceCount(&nDevices); + std::cout << "nDevices = " << nDevices << std::endl; + + if (nDevices > 0) { + // qie8 + test_hcal_qiesample(); + test_hcal_qie8_hbhedf(); + test_hcal_qie8_digis(); + test_hcal_qie8_digis(); + test_hcal_qie8_digis(); + + // qie1011 + test_hcal_qie1011_digis(); + test_hcal_qie1011_digis(); + } + + return 0; +} From b1e6d1c318cd2880fb3c8c517563db836b73c222 Mon Sep 17 00:00:00 2001 From: Andrea Bocci Date: Mon, 4 Jun 2018 22:58:56 +0200 Subject: [PATCH 58/88] Fix the length of the string buffer to accommodate the "new format" of the HCAL DetId (#73) --- DQM/HcalCommon/src/HashFunctions.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/DQM/HcalCommon/src/HashFunctions.cc b/DQM/HcalCommon/src/HashFunctions.cc index 7135d422589b8..5f76289a95504 100644 --- a/DQM/HcalCommon/src/HashFunctions.cc +++ b/DQM/HcalCommon/src/HashFunctions.cc @@ -250,8 +250,8 @@ namespace hcaldqm std::string name_HFPMiphi(HcalDetId const& did) { - char name[10]; - sprintf(name, "HF%siphi%d", did.ieta()>0 ? "P" : "M", did.iphi()); + char name[12]; + snprintf(name, sizeof(name), "HF%ciphi%d", did.ieta()>0 ? 'P' : 'M', did.iphi()); return std::string(name); } From fccd7cacef8b718cf59dca5a8d72097653d7bbfe Mon Sep 17 00:00:00 2001 From: Matti Kortelainen Date: Tue, 5 Jun 2018 18:21:37 +0200 Subject: [PATCH 59/88] Fix deprecation warning in CUDAService (#75) --- HeterogeneousCore/CUDAServices/src/CUDAService.cc | 10 ++++++++-- .../CUDAServices/test/testCUDAServiceDrv.cpp | 13 +++++++++++-- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/HeterogeneousCore/CUDAServices/src/CUDAService.cc b/HeterogeneousCore/CUDAServices/src/CUDAService.cc index 4c3e884cf886a..3d1da6702392a 100644 --- a/HeterogeneousCore/CUDAServices/src/CUDAService.cc +++ b/HeterogeneousCore/CUDAServices/src/CUDAService.cc @@ -39,11 +39,17 @@ CUDAService::CUDAService(edm::ParameterSet const& iConfig, edm::ActivityRegistry computeCapabilities_.reserve(numberOfDevices_); for(int i=0; i Date: Wed, 6 Jun 2018 10:38:44 +0200 Subject: [PATCH 60/88] Make the thrust::exclusive_scan stream-synchronous (#74) Run the `thrust::exclusive_scan` within the given CUDA stream. This improves the overall synchronisation, replacing calls to `cudaDeviceSynchronize` with calls to `cudaStreamSynchronize`. --- RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.cu | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.cu b/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.cu index f41f42137c29a..3a46ece955ca3 100644 --- a/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.cu +++ b/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.cu @@ -42,7 +42,7 @@ namespace pixelgpudetails { void PixelRecHitGPUKernel::makeHitsAsync(const siPixelRawToClusterHeterogeneousProduct::GPUProduct& input, pixelCPEforGPU::ParamsOnGPU const * cpeParams, cuda::stream_t<>& stream) { - thrust::exclusive_scan(thrust::cuda::par, + thrust::exclusive_scan(thrust::cuda::par.on(stream.id()), input.clusInModule_d, input.clusInModule_d + gpuClustering::MaxNumModules + 1, gpu_.hitsModuleStart_d); From 955d9df6e2a06f14ba828a4554b2b442eda74936 Mon Sep 17 00:00:00 2001 From: Matti Kortelainen Date: Thu, 14 Jun 2018 16:02:16 +0200 Subject: [PATCH 61/88] Prototype for EventSetup data on GPUs (#77) Adds a prototype for dealing with EventSetup data on GPUs. The prototype is applied to the ES data used by Raw2Cluster (cabling map etc, gains) and RecHits (CPE). Now it is the `ESProduct` who owns the GPU memory. Currently each of the affected `ESProducts` have a method `getGPUProductAsync(cuda::stream_t<>&)` that will allocate the memory on the current GPU device and transfer the data there asynchronously, if the data is not there yet. The functionality of bookkeeping which devices have the data already, and necessary synchronization between multiple threads (only one thread may do the transfer per device) are abstracted to a helper template in `HeterogeneousCore/CUDACore/interface/CUDAESProduct.h`. Technical changes: - `EventSetup`-based implementation for GPU cabling map, gains, etc - add support for multiple devices to `PixelCPEFast` - abstract the `EeventSetup` GPU transfer - move `malloc` and transfer to the lambda - move `cudaFree` outside of the `nullptr` check - move files (back) to the plusing directory - rename `siPixelDigisHeterogeneous` to `siPixelClustersHeterogeneous` --- .../SiPixelGainCalibrationForHLTGPURcd.h | 14 ++ .../src/SiPixelGainCalibrationForHLTGPURcd.cc | 5 + CalibTracker/SiPixelESProducers/BuildFile.xml | 2 + .../SiPixelGainCalibrationForHLTGPU.h | 32 +++ .../SiPixelESProducers/plugins/BuildFile.xml | 2 + ...PixelGainCalibrationForHLTGPUESProducer.cc | 47 ++++ .../src/ES_SiPixelGainCalibrationForHLTGPU.cc | 4 + .../src/SiPixelGainCalibrationForHLTGPU.cc | 98 ++++++++ .../StandardSequences/python/RawToDigi_cff.py | 9 +- .../SiPixelRawToDigi/plugins/BuildFile.xml | 12 +- .../plugins/SiPixelFedCablingMapGPU.cc | 218 ------------------ .../plugins/SiPixelFedCablingMapGPU.h | 59 ----- .../python/SiPixelRawToDigi_cfi.py | 4 +- .../CUDACore/interface/CUDAESProduct.h | 93 ++++++++ .../interface/numberOfCUDADevices.h | 9 + .../CUDAServices/src/numberOfCUDADevices.cc | 8 + .../python/RecoLocalTracker_cff.py | 10 + .../SiPixelClusterizer/BuildFile.xml | 8 +- .../interface/SiPixelFedCablingMapGPU.h | 27 +++ .../SiPixelFedCablingMapGPUWrapper.h | 68 ++++++ .../SiPixelClusterizer/plugins/BuildFile.xml | 14 +- .../PixelClusterizerBase.h | 0 .../PixelThresholdClusterizer.cc | 4 +- .../PixelThresholdClusterizer.h | 6 +- .../SiPixelArrayBuffer.h | 0 .../SiPixelClusterHeterogeneousConverter.cc | 2 +- .../plugins/SiPixelClusterProducer.cc | 2 +- .../plugins/SiPixelClusterProducer.h | 2 +- .../SiPixelDigiHeterogeneousConverter.cc | 2 +- ...iPixelFedCablingMapGPUWrapperESProducer.cc | 68 ++++++ .../plugins/SiPixelRawToClusterGPUKernel.cu | 32 +-- .../plugins/SiPixelRawToClusterGPUKernel.h | 36 +-- .../SiPixelRawToClusterHeterogeneous.cc | 41 ++-- .../siPixelRawToClusterHeterogeneousProduct.h | 0 .../python/SiPixelClusterizer_cfi.py | 2 +- .../siPixelClustersHeterogeneous_cfi.py | 26 +-- .../src/ES_SiPixelFedCablingMapGPUWrapper.cc | 4 + .../src/SiPixelFedCablingMapGPUWrapper.cc | 173 ++++++++++++++ RecoLocalTracker/SiPixelRecHits/BuildFile.xml | 2 + .../SiPixelRecHits/interface/PixelCPEFast.h | 25 +- .../SiPixelRecHits/plugins/PixelRecHits.cu | 2 +- .../SiPixelRecHits/plugins/PixelRecHits.h | 2 +- .../plugins/SiPixelRecHitHeterogeneous.cc | 7 +- .../SiPixelRecHits/src/PixelCPEFast.cc | 37 +-- 44 files changed, 803 insertions(+), 415 deletions(-) create mode 100644 CalibTracker/Records/interface/SiPixelGainCalibrationForHLTGPURcd.h create mode 100644 CalibTracker/Records/src/SiPixelGainCalibrationForHLTGPURcd.cc create mode 100644 CalibTracker/SiPixelESProducers/interface/SiPixelGainCalibrationForHLTGPU.h create mode 100644 CalibTracker/SiPixelESProducers/plugins/SiPixelGainCalibrationForHLTGPUESProducer.cc create mode 100644 CalibTracker/SiPixelESProducers/src/ES_SiPixelGainCalibrationForHLTGPU.cc create mode 100644 CalibTracker/SiPixelESProducers/src/SiPixelGainCalibrationForHLTGPU.cc delete mode 100644 EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.cc delete mode 100644 EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.h create mode 100644 HeterogeneousCore/CUDACore/interface/CUDAESProduct.h create mode 100644 HeterogeneousCore/CUDAServices/interface/numberOfCUDADevices.h create mode 100644 HeterogeneousCore/CUDAServices/src/numberOfCUDADevices.cc create mode 100644 RecoLocalTracker/SiPixelClusterizer/interface/SiPixelFedCablingMapGPU.h create mode 100644 RecoLocalTracker/SiPixelClusterizer/interface/SiPixelFedCablingMapGPUWrapper.h rename RecoLocalTracker/SiPixelClusterizer/{interface => plugins}/PixelClusterizerBase.h (100%) rename RecoLocalTracker/SiPixelClusterizer/{src => plugins}/PixelThresholdClusterizer.cc (99%) rename RecoLocalTracker/SiPixelClusterizer/{interface => plugins}/PixelThresholdClusterizer.h (96%) rename RecoLocalTracker/SiPixelClusterizer/{interface => plugins}/SiPixelArrayBuffer.h (100%) rename {EventFilter/SiPixelRawToDigi => RecoLocalTracker/SiPixelClusterizer}/plugins/SiPixelClusterHeterogeneousConverter.cc (96%) rename {EventFilter/SiPixelRawToDigi => RecoLocalTracker/SiPixelClusterizer}/plugins/SiPixelDigiHeterogeneousConverter.cc (96%) create mode 100644 RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelFedCablingMapGPUWrapperESProducer.cc rename {EventFilter/SiPixelRawToDigi => RecoLocalTracker/SiPixelClusterizer}/plugins/SiPixelRawToClusterGPUKernel.cu (96%) rename {EventFilter/SiPixelRawToDigi => RecoLocalTracker/SiPixelClusterizer}/plugins/SiPixelRawToClusterGPUKernel.h (85%) rename {EventFilter/SiPixelRawToDigi => RecoLocalTracker/SiPixelClusterizer}/plugins/SiPixelRawToClusterHeterogeneous.cc (93%) rename {EventFilter/SiPixelRawToDigi => RecoLocalTracker/SiPixelClusterizer}/plugins/siPixelRawToClusterHeterogeneousProduct.h (100%) rename EventFilter/SiPixelRawToDigi/python/siPixelDigisHeterogeneous_cfi.py => RecoLocalTracker/SiPixelClusterizer/python/siPixelClustersHeterogeneous_cfi.py (51%) create mode 100644 RecoLocalTracker/SiPixelClusterizer/src/ES_SiPixelFedCablingMapGPUWrapper.cc create mode 100644 RecoLocalTracker/SiPixelClusterizer/src/SiPixelFedCablingMapGPUWrapper.cc diff --git a/CalibTracker/Records/interface/SiPixelGainCalibrationForHLTGPURcd.h b/CalibTracker/Records/interface/SiPixelGainCalibrationForHLTGPURcd.h new file mode 100644 index 0000000000000..afb682e5d451f --- /dev/null +++ b/CalibTracker/Records/interface/SiPixelGainCalibrationForHLTGPURcd.h @@ -0,0 +1,14 @@ +#ifndef CalibTracker_Records_SiPixelGainCalibrationForHLTGPURcd_h +#define CalibTracker_Records_SiPixelGainCalibrationForHLTGPURcd_h + +#include "FWCore/Framework/interface/EventSetupRecordImplementation.h" +#include "FWCore/Framework/interface/DependentRecordImplementation.h" + +#include "CondFormats/DataRecord/interface/SiPixelGainCalibrationForHLTRcd.h" +#include "Geometry/Records/interface/TrackerDigiGeometryRecord.h" + +#include "boost/mpl/vector.hpp" + +class SiPixelGainCalibrationForHLTGPURcd : public edm::eventsetup::DependentRecordImplementation > {}; + +#endif diff --git a/CalibTracker/Records/src/SiPixelGainCalibrationForHLTGPURcd.cc b/CalibTracker/Records/src/SiPixelGainCalibrationForHLTGPURcd.cc new file mode 100644 index 0000000000000..e6020eca80b1f --- /dev/null +++ b/CalibTracker/Records/src/SiPixelGainCalibrationForHLTGPURcd.cc @@ -0,0 +1,5 @@ +#include "CalibTracker/Records/interface/SiPixelGainCalibrationForHLTGPURcd.h" +#include "FWCore/Framework/interface/eventsetuprecord_registration_macro.h" +#include "FWCore/Utilities/interface/typelookup.h" + +EVENTSETUP_RECORD_REG(SiPixelGainCalibrationForHLTGPURcd); diff --git a/CalibTracker/SiPixelESProducers/BuildFile.xml b/CalibTracker/SiPixelESProducers/BuildFile.xml index e9d22b32f0afb..69d258da21ed1 100644 --- a/CalibTracker/SiPixelESProducers/BuildFile.xml +++ b/CalibTracker/SiPixelESProducers/BuildFile.xml @@ -7,7 +7,9 @@ + + diff --git a/CalibTracker/SiPixelESProducers/interface/SiPixelGainCalibrationForHLTGPU.h b/CalibTracker/SiPixelESProducers/interface/SiPixelGainCalibrationForHLTGPU.h new file mode 100644 index 0000000000000..96989c8a2c3b2 --- /dev/null +++ b/CalibTracker/SiPixelESProducers/interface/SiPixelGainCalibrationForHLTGPU.h @@ -0,0 +1,32 @@ +#ifndef CalibTracker_SiPixelESProducers_SiPixelGainCalibrationForHLTGPU_H +#define CalibTracker_SiPixelESProducers_SiPixelGainCalibrationForHLTGPU_H + +#include "HeterogeneousCore/CUDACore/interface/CUDAESProduct.h" +#include "CondFormats/SiPixelObjects/interface/SiPixelGainCalibrationForHLT.h" + +#include + +class SiPixelGainCalibrationForHLT; +class SiPixelGainForHLTonGPU; +struct SiPixelGainForHLTonGPU_DecodingStructure; +class TrackerGeometry; + +class SiPixelGainCalibrationForHLTGPU { +public: + explicit SiPixelGainCalibrationForHLTGPU(const SiPixelGainCalibrationForHLT& gains, const TrackerGeometry& geom); + ~SiPixelGainCalibrationForHLTGPU(); + + const SiPixelGainForHLTonGPU *getGPUProductAsync(cuda::stream_t<>& cudaStream) const; + +private: + const SiPixelGainCalibrationForHLT *gains_ = nullptr; + SiPixelGainForHLTonGPU *gainForHLTonHost_ = nullptr; + struct GPUData { + ~GPUData(); + SiPixelGainForHLTonGPU *gainForHLTonGPU = nullptr; + SiPixelGainForHLTonGPU_DecodingStructure *gainDataOnGPU = nullptr; + }; + CUDAESProduct gpuData_; +}; + +#endif diff --git a/CalibTracker/SiPixelESProducers/plugins/BuildFile.xml b/CalibTracker/SiPixelESProducers/plugins/BuildFile.xml index 44db9d9ba0582..b33657e273036 100644 --- a/CalibTracker/SiPixelESProducers/plugins/BuildFile.xml +++ b/CalibTracker/SiPixelESProducers/plugins/BuildFile.xml @@ -6,6 +6,8 @@ + + diff --git a/CalibTracker/SiPixelESProducers/plugins/SiPixelGainCalibrationForHLTGPUESProducer.cc b/CalibTracker/SiPixelESProducers/plugins/SiPixelGainCalibrationForHLTGPUESProducer.cc new file mode 100644 index 0000000000000..186bb2d72c3f3 --- /dev/null +++ b/CalibTracker/SiPixelESProducers/plugins/SiPixelGainCalibrationForHLTGPUESProducer.cc @@ -0,0 +1,47 @@ +#include "CalibTracker/SiPixelESProducers/interface/SiPixelGainCalibrationForHLTGPU.h" +#include "CalibTracker/Records/interface/SiPixelGainCalibrationForHLTGPURcd.h" +#include "CondFormats/SiPixelObjects/interface/SiPixelGainCalibrationForHLT.h" +#include "CondFormats/DataRecord/interface/SiPixelGainCalibrationForHLTRcd.h" +#include "FWCore/Framework/interface/ESProducer.h" +#include "FWCore/Framework/interface/EventSetup.h" +#include "FWCore/Framework/interface/ESHandle.h" +#include "FWCore/Framework/interface/ModuleFactory.h" +#include "FWCore/ParameterSet/interface/ParameterSet.h" +#include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h" +#include "Geometry/Records/interface/TrackerDigiGeometryRecord.h" + +#include + +class SiPixelGainCalibrationForHLTGPUESProducer: public edm::ESProducer { +public: + explicit SiPixelGainCalibrationForHLTGPUESProducer(const edm::ParameterSet& iConfig); + std::unique_ptr produce(const SiPixelGainCalibrationForHLTGPURcd& iRecord); + + static void fillDescriptions(edm::ConfigurationDescriptions& descriptions); +private: +}; + +SiPixelGainCalibrationForHLTGPUESProducer::SiPixelGainCalibrationForHLTGPUESProducer(const edm::ParameterSet& iConfig) { + setWhatProduced(this); +} + +void SiPixelGainCalibrationForHLTGPUESProducer::fillDescriptions(edm::ConfigurationDescriptions& descriptions) { + edm::ParameterSetDescription desc; + descriptions.add("siPixelGainCalibrationForHLTGPU", desc); +} + +std::unique_ptr SiPixelGainCalibrationForHLTGPUESProducer::produce(const SiPixelGainCalibrationForHLTGPURcd& iRecord) { + edm::ESHandle gains; + iRecord.getRecord().get(gains); + + edm::ESHandle geom; + iRecord.getRecord().get(geom); + + return std::make_unique(*gains, *geom); +} + +#include "FWCore/Framework/interface/MakerMacros.h" +#include "FWCore/Utilities/interface/typelookup.h" +#include "FWCore/Framework/interface/eventsetuprecord_registration_macro.h" + +DEFINE_FWK_EVENTSETUP_MODULE(SiPixelGainCalibrationForHLTGPUESProducer); diff --git a/CalibTracker/SiPixelESProducers/src/ES_SiPixelGainCalibrationForHLTGPU.cc b/CalibTracker/SiPixelESProducers/src/ES_SiPixelGainCalibrationForHLTGPU.cc new file mode 100644 index 0000000000000..80932fb468f71 --- /dev/null +++ b/CalibTracker/SiPixelESProducers/src/ES_SiPixelGainCalibrationForHLTGPU.cc @@ -0,0 +1,4 @@ +#include "CalibTracker/SiPixelESProducers/interface/SiPixelGainCalibrationForHLTGPU.h" +#include "FWCore/Utilities/interface/typelookup.h" + +TYPELOOKUP_DATA_REG(SiPixelGainCalibrationForHLTGPU); diff --git a/CalibTracker/SiPixelESProducers/src/SiPixelGainCalibrationForHLTGPU.cc b/CalibTracker/SiPixelESProducers/src/SiPixelGainCalibrationForHLTGPU.cc new file mode 100644 index 0000000000000..3aef3f44c8f67 --- /dev/null +++ b/CalibTracker/SiPixelESProducers/src/SiPixelGainCalibrationForHLTGPU.cc @@ -0,0 +1,98 @@ +#include "CalibTracker/SiPixelESProducers/interface/SiPixelGainCalibrationForHLTGPU.h" +#include "CondFormats/SiPixelObjects/interface/SiPixelGainCalibrationForHLT.h" +#include "CondFormats/SiPixelObjects/interface/SiPixelGainForHLTonGPU.h" +#include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h" +#include "Geometry/CommonDetUnit/interface/GeomDetType.h" +#include "HeterogeneousCore/CUDAUtilities/interface/cudaCheck.h" + +#include + +SiPixelGainCalibrationForHLTGPU::SiPixelGainCalibrationForHLTGPU(const SiPixelGainCalibrationForHLT& gains, const TrackerGeometry& geom): + gains_(&gains) +{ + // bizzarre logic (looking for fist strip-det) don't ask + auto const & dus = geom.detUnits(); + unsigned m_detectors = dus.size(); + for(unsigned int i=1;i<7;++i) { + if(geom.offsetDU(GeomDetEnumerators::tkDetEnum[i]) != dus.size() && + dus[geom.offsetDU(GeomDetEnumerators::tkDetEnum[i])]->type().isTrackerStrip()) { + if(geom.offsetDU(GeomDetEnumerators::tkDetEnum[i]) < m_detectors) m_detectors = geom.offsetDU(GeomDetEnumerators::tkDetEnum[i]); + } + } + + /* + std::cout << "caching calibs for " << m_detectors << " pixel detectors of size " << gains.data().size() << std::endl; + std::cout << "sizes " << sizeof(char) << ' ' << sizeof(uint8_t) << ' ' << sizeof(SiPixelGainForHLTonGPU::DecodingStructure) << std::endl; + */ + + cudaCheck(cudaMallocHost((void**) & gainForHLTonHost_, sizeof(SiPixelGainForHLTonGPU))); + //gainForHLTonHost_->v_pedestals = gainDataOnGPU_; // how to do this? + + // do not read back from the (possibly write-combined) memory buffer + auto minPed = gains.getPedLow(); + auto maxPed = gains.getPedHigh(); + auto minGain = gains.getGainLow(); + auto maxGain = gains.getGainHigh(); + auto nBinsToUseForEncoding = 253; + + // we will simplify later (not everything is needed....) + gainForHLTonHost_->minPed_ = minPed; + gainForHLTonHost_->maxPed_ = maxPed; + gainForHLTonHost_->minGain_= minGain; + gainForHLTonHost_->maxGain_= maxGain; + + gainForHLTonHost_->numberOfRowsAveragedOver_ = 80; + gainForHLTonHost_->nBinsToUseForEncoding_ = nBinsToUseForEncoding; + gainForHLTonHost_->deadFlag_ = 255; + gainForHLTonHost_->noisyFlag_ = 254; + + gainForHLTonHost_->pedPrecision = static_cast(maxPed - minPed) / nBinsToUseForEncoding; + gainForHLTonHost_->gainPrecision = static_cast(maxGain - minGain) / nBinsToUseForEncoding; + + /* + std::cout << "precisions g " << gainForHLTonHost_->pedPrecision << ' ' << gainForHLTonHost_->gainPrecision << std::endl; + */ + + // fill the index map + auto const & ind = gains.getIndexes(); + /* + std::cout << ind.size() << " " << m_detectors << std::endl; + */ + + for (auto i=0U; igeographicalId().rawId(),SiPixelGainCalibrationForHLT::StrictWeakOrdering()); + assert (p!=ind.end() && p->detid==dus[i]->geographicalId()); + assert(p->iend<=gains.data().size()); + assert(p->iend>=p->ibegin); + assert(0==p->ibegin%2); + assert(0==p->iend%2); + assert(p->ibegin!=p->iend); + assert(p->ncols>0); + gainForHLTonHost_->rangeAndCols[i] = std::make_pair(SiPixelGainForHLTonGPU::Range(p->ibegin,p->iend), p->ncols); + // if (ind[i].detid!=dus[i]->geographicalId()) std::cout << ind[i].detid<<"!="<geographicalId() << std::endl; + // gainForHLTonHost_->rangeAndCols[i] = std::make_pair(SiPixelGainForHLTonGPU::Range(ind[i].ibegin,ind[i].iend), ind[i].ncols); + } + +} + +SiPixelGainCalibrationForHLTGPU::~SiPixelGainCalibrationForHLTGPU() { + cudaCheck(cudaFreeHost(gainForHLTonHost_)); +} + +SiPixelGainCalibrationForHLTGPU::GPUData::~GPUData() { + cudaCheck(cudaFree(gainForHLTonGPU)); + cudaCheck(cudaFree(gainDataOnGPU)); +} + +const SiPixelGainForHLTonGPU *SiPixelGainCalibrationForHLTGPU::getGPUProductAsync(cuda::stream_t<>& cudaStream) const { + const auto& data = gpuData_.dataForCurrentDeviceAsync(cudaStream, [this](GPUData& data, cuda::stream_t<>& stream) { + cudaCheck(cudaMalloc((void**) & data.gainForHLTonGPU, sizeof(SiPixelGainForHLTonGPU))); + cudaCheck(cudaMalloc((void**) & data.gainDataOnGPU, this->gains_->data().size())); // TODO: this could be changed to cuda::memory::device::unique_ptr<> + // gains.data().data() is used also for non-GPU code, we cannot allocate it on aligned and write-combined memory + cudaCheck(cudaMemcpyAsync(data.gainDataOnGPU, this->gains_->data().data(), this->gains_->data().size(), cudaMemcpyDefault, stream.id())); + + cudaCheck(cudaMemcpyAsync(data.gainForHLTonGPU, this->gainForHLTonHost_, sizeof(SiPixelGainForHLTonGPU), cudaMemcpyDefault, stream.id())); + cudaCheck(cudaMemcpyAsync(&(data.gainForHLTonGPU->v_pedestals), &(data.gainDataOnGPU), sizeof(SiPixelGainForHLTonGPU_DecodingStructure*), cudaMemcpyDefault, stream.id())); + }); + return data.gainForHLTonGPU; +} diff --git a/Configuration/StandardSequences/python/RawToDigi_cff.py b/Configuration/StandardSequences/python/RawToDigi_cff.py index 7c85f098785a4..5fbcca6459adc 100644 --- a/Configuration/StandardSequences/python/RawToDigi_cff.py +++ b/Configuration/StandardSequences/python/RawToDigi_cff.py @@ -4,7 +4,6 @@ # scenarios. In this case it makes changes for Run 2. from EventFilter.SiPixelRawToDigi.SiPixelRawToDigi_cfi import * -from EventFilter.SiPixelRawToDigi.siPixelDigisHeterogeneous_cfi import * from EventFilter.SiStripRawToDigi.SiStripDigis_cfi import * @@ -60,10 +59,6 @@ +tcdsDigis +onlineMetaDataDigis ) -from Configuration.ProcessModifiers.gpu_cff import gpu -_RawToDigi_gpu = RawToDigi.copy() -_RawToDigi_gpu.replace(siPixelDigis, siPixelDigisHeterogeneous+siPixelDigis) -gpu.toReplaceWith(RawToDigi, _RawToDigi_gpu) RawToDigi_noTk = cms.Sequence(L1TRawToDigi +ecalDigis @@ -78,10 +73,10 @@ +onlineMetaDataDigis ) -RawToDigi_pixelOnly = cms.Sequence(siPixelDigisHeterogeneous+siPixelDigis) +RawToDigi_pixelOnly = cms.Sequence(siPixelDigis) scalersRawToDigi.scalersInputTag = 'rawDataCollector' -siPixelDigisHeterogeneous.InputLabel = 'rawDataCollector' +from Configuration.ProcessModifiers.gpu_cff import gpu (~gpu).toModify(siPixelDigis, InputLabel = 'rawDataCollector') #false by default anyways ecalDigis.DoRegional = False ecalDigis.InputLabel = 'rawDataCollector' diff --git a/EventFilter/SiPixelRawToDigi/plugins/BuildFile.xml b/EventFilter/SiPixelRawToDigi/plugins/BuildFile.xml index 0f46385a6e608..f92aa68373927 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/BuildFile.xml +++ b/EventFilter/SiPixelRawToDigi/plugins/BuildFile.xml @@ -1,14 +1,4 @@ - - - - - - - - - - - + diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.cc b/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.cc deleted file mode 100644 index 95053a08a55b0..0000000000000 --- a/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.cc +++ /dev/null @@ -1,218 +0,0 @@ -// C++ includes -#include -#include -#include -#include -#include -#include - -// CUDA includes -#include - -// CMSSW includes -#include "CondFormats/SiPixelObjects/interface/SiPixelFedCablingMap.h" -#include "CondFormats/SiPixelObjects/interface/SiPixelFedCablingTree.h" -#include "CondFormats/SiPixelObjects/interface/SiPixelGainCalibrationForHLT.h" -#include "CondFormats/SiPixelObjects/interface/SiPixelGainForHLTonGPU.h" -#include "CondFormats/SiPixelObjects/interface/SiPixelQuality.h" -#include "FWCore/MessageLogger/interface/MessageLogger.h" -#include "Geometry/CommonDetUnit/interface/GeomDetType.h" -#include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h" -#include "HeterogeneousCore/CUDAUtilities/interface/CUDAHostAllocator.h" -#include "HeterogeneousCore/CUDAUtilities/interface/cudaCheck.h" - -// local includes -#include "SiPixelFedCablingMapGPU.h" - -void allocateCablingMap(SiPixelFedCablingMapGPU* & cablingMapHost, SiPixelFedCablingMapGPU* & cablingMapDevice) { - cudaCheck(cudaMallocHost((void**) & cablingMapHost, sizeof(SiPixelFedCablingMapGPU))); - cudaCheck(cudaMalloc((void**) & cablingMapDevice, sizeof(SiPixelFedCablingMapGPU))); - cudaCheck(cudaMalloc((void**) & cablingMapHost->fed, MAX_SIZE_BYTE_INT)); - cudaCheck(cudaMalloc((void**) & cablingMapHost->link, MAX_SIZE_BYTE_INT)); - cudaCheck(cudaMalloc((void**) & cablingMapHost->roc, MAX_SIZE_BYTE_INT)); - cudaCheck(cudaMalloc((void**) & cablingMapHost->RawId, MAX_SIZE_BYTE_INT)); - cudaCheck(cudaMalloc((void**) & cablingMapHost->rocInDet, MAX_SIZE_BYTE_INT)); - cudaCheck(cudaMalloc((void**) & cablingMapHost->moduleId, MAX_SIZE_BYTE_INT)); - cudaCheck(cudaMalloc((void**) & cablingMapHost->badRocs, MAX_SIZE_BYTE_BOOL)); - cudaCheck(cudaMalloc((void**) & cablingMapHost->modToUnp, MAX_SIZE_BYTE_BOOL)); - cudaCheck(cudaMemcpy(cablingMapDevice, cablingMapHost, sizeof(SiPixelFedCablingMapGPU), cudaMemcpyDefault)); -} - -void deallocateCablingMap(SiPixelFedCablingMapGPU* cablingMapHost, SiPixelFedCablingMapGPU* cablingMapDevice) { - cudaCheck(cudaFree(cablingMapHost->fed)); - cudaCheck(cudaFree(cablingMapHost->link)); - cudaCheck(cudaFree(cablingMapHost->roc)); - cudaCheck(cudaFree(cablingMapHost->RawId)); - cudaCheck(cudaFree(cablingMapHost->rocInDet)); - cudaCheck(cudaFree(cablingMapHost->moduleId)); - cudaCheck(cudaFree(cablingMapHost->modToUnp)); - cudaCheck(cudaFree(cablingMapHost->badRocs)); - cudaCheck(cudaFree(cablingMapDevice)); - cudaCheck(cudaFreeHost(cablingMapHost)); -} - - -void processCablingMap(SiPixelFedCablingMap const& cablingMap, TrackerGeometry const& trackerGeom, - SiPixelFedCablingMapGPU* cablingMapHost, SiPixelFedCablingMapGPU* cablingMapDevice, - const SiPixelQuality* badPixelInfo, std::set const& modules, cuda::stream_t<>& stream) { - std::vector const& fedIds = cablingMap.fedIds(); - std::unique_ptr const& cabling = cablingMap.cablingTree(); - - std::vector> fedMap(MAX_SIZE); - std::vector> linkMap(MAX_SIZE); - std::vector> rocMap(MAX_SIZE); - std::vector> RawId(MAX_SIZE); - std::vector> rocInDet(MAX_SIZE); - std::vector> moduleId(MAX_SIZE); - std::vector> badRocs(MAX_SIZE); - std::vector> modToUnp(MAX_SIZE); - - unsigned int startFed = *(fedIds.begin()); - unsigned int endFed = *(fedIds.end() - 1); - - sipixelobjects::CablingPathToDetUnit path; - int index = 1; - - for (unsigned int fed = startFed; fed <= endFed; fed++) { - for (unsigned int link = 1; link <= MAX_LINK; link++) { - for (unsigned int roc = 1; roc <= MAX_ROC; roc++) { - path = {fed, link, roc}; - const sipixelobjects::PixelROC* pixelRoc = cabling->findItem(path); - fedMap[index] = fed; - linkMap[index] = link; - rocMap[index] = roc; - if (pixelRoc != nullptr) { - RawId[index] = pixelRoc->rawId(); - rocInDet[index] = pixelRoc->idInDetUnit(); - modToUnp[index] = (modules.size() != 0) && (modules.find(pixelRoc->rawId()) == modules.end()); - if (badPixelInfo != nullptr) - badRocs[index] = badPixelInfo->IsRocBad(pixelRoc->rawId(), pixelRoc->idInDetUnit()); - else - badRocs[index] = false; - } else { // store some dummy number - RawId[index] = 9999; - rocInDet[index] = 9999; - modToUnp[index] = true; - badRocs[index] = true; - } - index++; - } - } - } // end of FED loop - - // Given FedId, Link and idinLnk; use the following formula - // to get the RawId and idinDU - // index = (FedID-1200) * MAX_LINK* MAX_ROC + (Link-1)* MAX_ROC + idinLnk; - // where, MAX_LINK = 48, MAX_ROC = 8 for Phase1 as mentioned Danek's email - // FedID varies between 1200 to 1338 (In total 108 FED's) - // Link varies between 1 to 48 - // idinLnk varies between 1 to 8 - - for (int i = 1; i < index; i++) { - if (RawId[i] == 9999) { - moduleId[i] = 9999; - } else { - /* - std::cout << RawId[i] << std::endl; - */ - auto gdet = trackerGeom.idToDetUnit(RawId[i]); - if (!gdet) { - LogDebug("SiPixelFedCablingMapGPU") << " Not found: " << RawId[i] << std::endl; - continue; - } - moduleId[i] = gdet->index(); - } - LogDebug("SiPixelFedCablingMapGPU") << "----------------------------------------------------------------------------" << std::endl; - LogDebug("SiPixelFedCablingMapGPU") << i << std::setw(20) << fedMap[i] << std::setw(20) << linkMap[i] << std::setw(20) << rocMap[i] << std::endl; - LogDebug("SiPixelFedCablingMapGPU") << i << std::setw(20) << RawId[i] << std::setw(20) << rocInDet[i] << std::setw(20) << moduleId[i] << std::endl; - LogDebug("SiPixelFedCablingMapGPU") << i << std::setw(20) << (bool)badRocs[i] << std::setw(20) << (bool)modToUnp[i] << std::endl; - LogDebug("SiPixelFedCablingMapGPU") << "----------------------------------------------------------------------------" << std::endl; - } - - cablingMapHost->size = index-1; - cudaCheck(cudaMemcpyAsync(cablingMapHost->fed, fedMap.data(), fedMap.size() * sizeof(unsigned int), cudaMemcpyDefault, stream.id())); - cudaCheck(cudaMemcpyAsync(cablingMapHost->link, linkMap.data(), linkMap.size() * sizeof(unsigned int), cudaMemcpyDefault, stream.id())); - cudaCheck(cudaMemcpyAsync(cablingMapHost->roc, rocMap.data(), rocMap.size() * sizeof(unsigned int), cudaMemcpyDefault, stream.id())); - cudaCheck(cudaMemcpyAsync(cablingMapHost->RawId, RawId.data(), RawId.size() * sizeof(unsigned int), cudaMemcpyDefault, stream.id())); - cudaCheck(cudaMemcpyAsync(cablingMapHost->rocInDet, rocInDet.data(), rocInDet.size() * sizeof(unsigned int), cudaMemcpyDefault, stream.id())); - cudaCheck(cudaMemcpyAsync(cablingMapHost->moduleId, moduleId.data(), moduleId.size() * sizeof(unsigned int), cudaMemcpyDefault, stream.id())); - cudaCheck(cudaMemcpyAsync(cablingMapHost->badRocs, badRocs.data(), badRocs.size() * sizeof(unsigned char), cudaMemcpyDefault, stream.id())); - cudaCheck(cudaMemcpyAsync(cablingMapHost->modToUnp, modToUnp.data(), modToUnp.size() * sizeof(unsigned char), cudaMemcpyDefault, stream.id())); - cudaCheck(cudaMemcpyAsync(cablingMapDevice, cablingMapHost, sizeof(SiPixelFedCablingMapGPU), cudaMemcpyDefault)); -} - -void -processGainCalibration(SiPixelGainCalibrationForHLT const & gains, TrackerGeometry const& geom, - SiPixelGainForHLTonGPU *gainsOnHost, SiPixelGainForHLTonGPU * & gainsOnGPU, - SiPixelGainForHLTonGPU::DecodingStructure * & gainDataOnGPU, cuda::stream_t<>& stream) { - // bizzarre logic (looking for fist strip-det) don't ask - auto const & dus = geom.detUnits(); - unsigned m_detectors = dus.size(); - for(unsigned int i=1;i<7;++i) { - if(geom.offsetDU(GeomDetEnumerators::tkDetEnum[i]) != dus.size() && - dus[geom.offsetDU(GeomDetEnumerators::tkDetEnum[i])]->type().isTrackerStrip()) { - if(geom.offsetDU(GeomDetEnumerators::tkDetEnum[i]) < m_detectors) m_detectors = geom.offsetDU(GeomDetEnumerators::tkDetEnum[i]); - } - } - - /* - std::cout << "caching calibs for " << m_detectors << " pixel detectors of size " << gains.data().size() << std::endl; - std::cout << "sizes " << sizeof(char) << ' ' << sizeof(uint8_t) << ' ' << sizeof(SiPixelGainForHLTonGPU::DecodingStructure) << std::endl; - */ - - SiPixelGainForHLTonGPU * gg = gainsOnHost; - - assert(nullptr==gainDataOnGPU); - cudaCheck(cudaMalloc((void**) & gainDataOnGPU, gains.data().size())); // TODO: this could be changed to cuda::memory::device::unique_ptr<> - // gains.data().data() is used also for non-GPU code, we cannot allocate it on aligned and write-combined memory - cudaCheck(cudaMemcpyAsync(gainDataOnGPU, gains.data().data(), gains.data().size(), cudaMemcpyDefault, stream.id())); - - gg->v_pedestals = gainDataOnGPU; - - // do not read back from the (possibly write-combined) memory buffer - auto minPed = gains.getPedLow(); - auto maxPed = gains.getPedHigh(); - auto minGain = gains.getGainLow(); - auto maxGain = gains.getGainHigh(); - auto nBinsToUseForEncoding = 253; - - // we will simplify later (not everything is needed....) - gg->minPed_ = minPed; - gg->maxPed_ = maxPed; - gg->minGain_= minGain; - gg->maxGain_= maxGain; - - gg->numberOfRowsAveragedOver_ = 80; - gg->nBinsToUseForEncoding_ = nBinsToUseForEncoding; - gg->deadFlag_ = 255; - gg->noisyFlag_ = 254; - - gg->pedPrecision = static_cast(maxPed - minPed) / nBinsToUseForEncoding; - gg->gainPrecision = static_cast(maxGain - minGain) / nBinsToUseForEncoding; - - /* - std::cout << "precisions g " << gg->pedPrecision << ' ' << gg->gainPrecision << std::endl; - */ - - // fill the index map - auto const & ind = gains.getIndexes(); - /* - std::cout << ind.size() << " " << m_detectors << std::endl; - */ - - for (auto i=0U; igeographicalId().rawId(),SiPixelGainCalibrationForHLT::StrictWeakOrdering()); - assert (p!=ind.end() && p->detid==dus[i]->geographicalId()); - assert(p->iend<=gains.data().size()); - assert(p->iend>=p->ibegin); - assert(0==p->ibegin%2); - assert(0==p->iend%2); - assert(p->ibegin!=p->iend); - assert(p->ncols>0); - gg->rangeAndCols[i] = std::make_pair(SiPixelGainForHLTonGPU::Range(p->ibegin,p->iend), p->ncols); - // if (ind[i].detid!=dus[i]->geographicalId()) std::cout << ind[i].detid<<"!="<geographicalId() << std::endl; - // gg->rangeAndCols[i] = std::make_pair(SiPixelGainForHLTonGPU::Range(ind[i].ibegin,ind[i].iend), ind[i].ncols); - } - - cudaCheck(cudaMemcpyAsync(gainsOnGPU, gg, sizeof(SiPixelGainForHLTonGPU), cudaMemcpyDefault, stream.id())); -} diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.h b/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.h deleted file mode 100644 index a90a5272e74e6..0000000000000 --- a/EventFilter/SiPixelRawToDigi/plugins/SiPixelFedCablingMapGPU.h +++ /dev/null @@ -1,59 +0,0 @@ -#ifndef EventFilter_SiPixelRawToDigi_plugins_SiPixelFedCablingMapGPU_h -#define EventFilter_SiPixelRawToDigi_plugins_SiPixelFedCablingMapGPU_h - -// C++ includes -#include - -#include "cuda/api_wrappers.h" - -class SiPixelFedCablingMap; -class SiPixelQuality; -class TrackerGeometry; - -class SiPixelGainCalibrationForHLT; -class SiPixelGainForHLTonGPU; -struct SiPixelGainForHLTonGPU_DecodingStructure; - -// Maximum fed for phase1 is 150 but not all of them are filled -// Update the number FED based on maximum fed found in the cabling map -const unsigned int MAX_FED = 150; -const unsigned int MAX_LINK = 48; // maximum links/channels for Phase 1 -const unsigned int MAX_ROC = 8; -const unsigned int MAX_SIZE = MAX_FED * MAX_LINK * MAX_ROC; -const unsigned int MAX_SIZE_BYTE_INT = MAX_SIZE * sizeof(unsigned int); -const unsigned int MAX_SIZE_BYTE_BOOL = MAX_SIZE * sizeof(unsigned char); - -struct SiPixelFedCablingMapGPU { - unsigned int size; - unsigned int * fed; - unsigned int * link; - unsigned int * roc; - unsigned int * RawId; - unsigned int * rocInDet; - unsigned int * moduleId; - unsigned char * modToUnp; - unsigned char * badRocs; -}; - -void allocateCablingMap(SiPixelFedCablingMapGPU* & cablingMapHost, - SiPixelFedCablingMapGPU* & cablingMapDevice); - -void deallocateCablingMap(SiPixelFedCablingMapGPU* cablingMapHost, - SiPixelFedCablingMapGPU* cablingMapDevice); - -void processCablingMap(SiPixelFedCablingMap const& cablingMap, - TrackerGeometry const& trackerGeom, - SiPixelFedCablingMapGPU* cablingMapHost, - SiPixelFedCablingMapGPU* cablingMapDevice, - SiPixelQuality const* badPixelInfo, - std::set const& modules, - cuda::stream_t<>& stream); - -void processGainCalibration(SiPixelGainCalibrationForHLT const& gains, - TrackerGeometry const& trackerGeom, - SiPixelGainForHLTonGPU *gainsOnHost, - SiPixelGainForHLTonGPU * & gainsOnGPU, - SiPixelGainForHLTonGPU_DecodingStructure * & gainDataOnGPU, - cuda::stream_t<>& stream); - -#endif // EventFilter_SiPixelRawToDigi_plugins_SiPixelFedCablingMapGPU_h diff --git a/EventFilter/SiPixelRawToDigi/python/SiPixelRawToDigi_cfi.py b/EventFilter/SiPixelRawToDigi/python/SiPixelRawToDigi_cfi.py index 6567e35a24704..528ffa2683fa8 100644 --- a/EventFilter/SiPixelRawToDigi/python/SiPixelRawToDigi_cfi.py +++ b/EventFilter/SiPixelRawToDigi/python/SiPixelRawToDigi_cfi.py @@ -1,6 +1,6 @@ import FWCore.ParameterSet.Config as cms import EventFilter.SiPixelRawToDigi.siPixelRawToDigi_cfi -import EventFilter.SiPixelRawToDigi.siPixelDigiHeterogeneousConverter_cfi +import RecoLocalTracker.SiPixelClusterizer.siPixelDigiHeterogeneousConverter_cfi siPixelDigis = EventFilter.SiPixelRawToDigi.siPixelRawToDigi_cfi.siPixelRawToDigi.clone() siPixelDigis.Timing = cms.untracked.bool(False) @@ -22,7 +22,7 @@ from Configuration.Eras.Modifier_phase1Pixel_cff import phase1Pixel phase1Pixel.toModify(siPixelDigis, UsePhase1=True) -_siPixelDigis_gpu = EventFilter.SiPixelRawToDigi.siPixelDigiHeterogeneousConverter_cfi.siPixelDigiHeterogeneousConverter.clone() +_siPixelDigis_gpu = RecoLocalTracker.SiPixelClusterizer.siPixelDigiHeterogeneousConverter_cfi.siPixelDigiHeterogeneousConverter.clone() _siPixelDigis_gpu.includeErrors = cms.bool(True) from Configuration.ProcessModifiers.gpu_cff import gpu diff --git a/HeterogeneousCore/CUDACore/interface/CUDAESProduct.h b/HeterogeneousCore/CUDACore/interface/CUDAESProduct.h new file mode 100644 index 0000000000000..36c17721249aa --- /dev/null +++ b/HeterogeneousCore/CUDACore/interface/CUDAESProduct.h @@ -0,0 +1,93 @@ +#ifndef HeterogeneousCore_CUDACore_CUDAESProduct_h +#define HeterogeneousCore_CUDACore_CUDAESProduct_h + +#include +#include + +#include + +#include "FWCore/Concurrency/interface/hardware_pause.h" +#include "FWCore/ServiceRegistry/interface/Service.h" +#include "FWCore/Utilities/interface/thread_safety_macros.h" +#include "HeterogeneousCore/CUDAServices/interface/CUDAService.h" +#include "HeterogeneousCore/CUDAServices/interface/numberOfCUDADevices.h" + +template +class CUDAESProduct { +public: + CUDAESProduct(): gpuDataPerDevice_(numberOfCUDADevices()) {} + ~CUDAESProduct() = default; + + // transferAsync should be a function of (T&, cuda::stream_t<>&) + // which enqueues asynchronous transfers (possibly kernels as well) + // to the CUDA stream + template + const T& dataForCurrentDeviceAsync(cuda::stream_t<>& cudaStream, F transferAsync) const { + edm::Service cs; + auto device = cs->getCurrentDevice(); + + auto& data = gpuDataPerDevice_[device]; + if(data.m_filled.load()) { + // GPU data has already been filled, so can return it immediately + return data.m_data; + } + + + bool expected = false; + if(data.m_filling.compare_exchange_strong(expected, true)) { + // so nobody else was filling + // then check if it got filled in the mean time + if(data.m_filled.load()) { + // someone else finished the filling in the meantime + data.m_filling.store(false); + return data.m_data; + } + + // now we can be sure that the data is not yet on the GPU, and + // this thread is the first one to try that + try { + transferAsync(data.m_data, cudaStream); + + cudaStream.enqueue.callback([&filling = data.m_filling, + &filled = data.m_filled] + (cuda::stream::id_t streamId, cuda::status_t status) mutable { + // TODO: check status and throw if fails + auto should_be_false = filled.exchange(true); + assert(!should_be_false); + auto should_be_true = filling.exchange(false); + assert(should_be_true); + }); + } catch(...) { + // release the filling state and propagate exception + auto should_be_true = data.m_filling.exchange(false); + assert(should_be_true); + throw std::current_exception(); + } + + // Now the filling has been enqueued to the cudaStream, so we + // can return the GPU data immediately, since all subsequent + // work must be either enqueued to the cudaStream, or the cudaStream + // must be synchronized by the caller + return data.m_data; + } + + // can we do better than just spin on the atomic while waiting another thread to finish the filling? + while(data.m_filling.load()) { + hardware_pause(); + } + assert(data.m_filled.load()); + + return data.m_data; + } + +private: + struct Item { + mutable std::atomic m_filling = false; // true if some thread is already filling + mutable std::atomic m_filled = false; // easy check if data has been filled already or not + CMS_THREAD_GUARD(m_filling) mutable T m_data; + }; + + std::vector gpuDataPerDevice_; +}; + +#endif diff --git a/HeterogeneousCore/CUDAServices/interface/numberOfCUDADevices.h b/HeterogeneousCore/CUDAServices/interface/numberOfCUDADevices.h new file mode 100644 index 0000000000000..b563b98b516cf --- /dev/null +++ b/HeterogeneousCore/CUDAServices/interface/numberOfCUDADevices.h @@ -0,0 +1,9 @@ +#ifndef HeterogeneousCore_CUDAServices_numberOfCUDADevices_h +#define HeterogeneousCore_CUDAServices_numberOfCUDADevices_h + +// Returns the number of CUDA devices +// The difference wrt. the standard CUDA function is that if +// CUDAService is disabled, this function returns 0. +int numberOfCUDADevices(); + +#endif diff --git a/HeterogeneousCore/CUDAServices/src/numberOfCUDADevices.cc b/HeterogeneousCore/CUDAServices/src/numberOfCUDADevices.cc new file mode 100644 index 0000000000000..a0bbc503c3451 --- /dev/null +++ b/HeterogeneousCore/CUDAServices/src/numberOfCUDADevices.cc @@ -0,0 +1,8 @@ +#include "HeterogeneousCore/CUDAServices/interface/numberOfCUDADevices.h" +#include "HeterogeneousCore/CUDAServices/interface/CUDAService.h" +#include "FWCore/ServiceRegistry/interface/Service.h" + +int numberOfCUDADevices() { + edm::Service cs; + return cs->enabled() ? cs->numberOfDevices() : 0; +} diff --git a/RecoLocalTracker/Configuration/python/RecoLocalTracker_cff.py b/RecoLocalTracker/Configuration/python/RecoLocalTracker_cff.py index 0692d49f0068f..b601e310db645 100644 --- a/RecoLocalTracker/Configuration/python/RecoLocalTracker_cff.py +++ b/RecoLocalTracker/Configuration/python/RecoLocalTracker_cff.py @@ -17,6 +17,16 @@ striptrackerlocalreco = cms.Sequence(siStripZeroSuppression*siStripClusters*siStripMatchedRecHits) trackerlocalreco = cms.Sequence(pixeltrackerlocalreco*striptrackerlocalreco*clusterSummaryProducer) +from RecoLocalTracker.SiPixelClusterizer.siPixelClustersHeterogeneous_cfi import * +from RecoLocalTracker.SiPixelClusterizer.siPixelFedCablingMapGPUWrapper_cfi import * +from CalibTracker.SiPixelESProducers.siPixelGainCalibrationForHLTGPU_cfi import * + +from Configuration.ProcessModifiers.gpu_cff import gpu +_pixeltrackerlocalreco_gpu = pixeltrackerlocalreco.copy() +_pixeltrackerlocalreco_gpu.replace(siPixelClustersPreSplitting, siPixelClustersHeterogeneous+siPixelClustersPreSplitting) +gpu.toReplaceWith(pixeltrackerlocalreco, _pixeltrackerlocalreco_gpu) + + from RecoLocalTracker.SiPhase2Clusterizer.phase2TrackerClusterizer_cfi import * from RecoLocalTracker.Phase2TrackerRecHits.Phase2StripCPEGeometricESProducer_cfi import * diff --git a/RecoLocalTracker/SiPixelClusterizer/BuildFile.xml b/RecoLocalTracker/SiPixelClusterizer/BuildFile.xml index b79cf8d4329c4..74e76ab6ff3e2 100644 --- a/RecoLocalTracker/SiPixelClusterizer/BuildFile.xml +++ b/RecoLocalTracker/SiPixelClusterizer/BuildFile.xml @@ -1,8 +1,8 @@ - - - - + + + + diff --git a/RecoLocalTracker/SiPixelClusterizer/interface/SiPixelFedCablingMapGPU.h b/RecoLocalTracker/SiPixelClusterizer/interface/SiPixelFedCablingMapGPU.h new file mode 100644 index 0000000000000..de465268f4154 --- /dev/null +++ b/RecoLocalTracker/SiPixelClusterizer/interface/SiPixelFedCablingMapGPU.h @@ -0,0 +1,27 @@ +#ifndef RecoLocalTracker_SiPixelClusterizer_SiPixelFedCablingMapGPU_h +#define RecoLocalTracker_SiPixelClusterizer_SiPixelFedCablingMapGPU_h + +namespace pixelgpudetails { + // Maximum fed for phase1 is 150 but not all of them are filled + // Update the number FED based on maximum fed found in the cabling map + constexpr unsigned int MAX_FED = 150; + constexpr unsigned int MAX_LINK = 48; // maximum links/channels for Phase 1 + constexpr unsigned int MAX_ROC = 8; + constexpr unsigned int MAX_SIZE = MAX_FED * MAX_LINK * MAX_ROC; + constexpr unsigned int MAX_SIZE_BYTE_INT = MAX_SIZE * sizeof(unsigned int); + constexpr unsigned int MAX_SIZE_BYTE_BOOL = MAX_SIZE * sizeof(unsigned char); +} + +// TODO: since this has more information than just cabling map, maybe we should invent a better name? +struct SiPixelFedCablingMapGPU { + unsigned int size = 0; + unsigned int * fed = nullptr; + unsigned int * link = nullptr; + unsigned int * roc = nullptr; + unsigned int * RawId = nullptr; + unsigned int * rocInDet = nullptr; + unsigned int * moduleId = nullptr; + unsigned char * badRocs = nullptr; +}; + +#endif diff --git a/RecoLocalTracker/SiPixelClusterizer/interface/SiPixelFedCablingMapGPUWrapper.h b/RecoLocalTracker/SiPixelClusterizer/interface/SiPixelFedCablingMapGPUWrapper.h new file mode 100644 index 0000000000000..e4a07e55bd3c9 --- /dev/null +++ b/RecoLocalTracker/SiPixelClusterizer/interface/SiPixelFedCablingMapGPUWrapper.h @@ -0,0 +1,68 @@ +#ifndef RecoLocalTracker_SiPixelClusterizer_SiPixelFedCablingMapGPUWrapper_h +#define RecoLocalTracker_SiPixelClusterizer_SiPixelFedCablingMapGPUWrapper_h + +#include "HeterogeneousCore/CUDACore/interface/CUDAESProduct.h" +#include "HeterogeneousCore/CUDAUtilities/interface/CUDAHostAllocator.h" +#include "RecoLocalTracker/SiPixelClusterizer/interface/SiPixelFedCablingMapGPU.h" + +#include + +#include + +class SiPixelFedCablingMap; +class TrackerGeometry; +class SiPixelQuality; + +// TODO: since this has more information than just cabling map, maybe we should invent a better name? +class SiPixelFedCablingMapGPUWrapper { +public: + SiPixelFedCablingMapGPUWrapper(SiPixelFedCablingMap const& cablingMap, + TrackerGeometry const& trackerGeom, + SiPixelQuality const *badPixelInfo); + ~SiPixelFedCablingMapGPUWrapper(); + + bool hasQuality() const { return hasQuality_; } + + // returns pointer to GPU memory + const SiPixelFedCablingMapGPU *getGPUProductAsync(cuda::stream_t<>& cudaStream) const; + + + // Allocates host and device memory, converts data to host memory, + // copies host memory to device memory asynchronously. It is the + // caller's responsibility to have this object to live until all + // operations on the device memory have completed. + class ModulesToUnpack { + public: + ModulesToUnpack(); + ~ModulesToUnpack() = default; + + void fillAsync(SiPixelFedCablingMap const& cablingMap, std::set const& modules, cuda::stream_t<>& cudaStream); + + const unsigned char *get() const { return modToUnpDevice.get(); } + + private: + cuda::memory::device::unique_ptr modToUnpDevice; + std::vector> modToUnpHost; + }; + +private: + std::vector> fedMap; + std::vector> linkMap; + std::vector> rocMap; + std::vector> RawId; + std::vector> rocInDet; + std::vector> moduleId; + std::vector> badRocs; + unsigned int size; + bool hasQuality_; + + struct GPUData { + ~GPUData(); + SiPixelFedCablingMapGPU *cablingMapHost = nullptr; // internal pointers are to GPU, struct itself is on CPU + SiPixelFedCablingMapGPU *cablingMapDevice = nullptr; // same internal pointers as above, struct itself is on GPU + }; + CUDAESProduct gpuData_; +}; + + +#endif diff --git a/RecoLocalTracker/SiPixelClusterizer/plugins/BuildFile.xml b/RecoLocalTracker/SiPixelClusterizer/plugins/BuildFile.xml index ec51e90aa3065..1dc69b4dd7b73 100644 --- a/RecoLocalTracker/SiPixelClusterizer/plugins/BuildFile.xml +++ b/RecoLocalTracker/SiPixelClusterizer/plugins/BuildFile.xml @@ -1,5 +1,17 @@ + + + + - + + + + + + + + + diff --git a/RecoLocalTracker/SiPixelClusterizer/interface/PixelClusterizerBase.h b/RecoLocalTracker/SiPixelClusterizer/plugins/PixelClusterizerBase.h similarity index 100% rename from RecoLocalTracker/SiPixelClusterizer/interface/PixelClusterizerBase.h rename to RecoLocalTracker/SiPixelClusterizer/plugins/PixelClusterizerBase.h diff --git a/RecoLocalTracker/SiPixelClusterizer/src/PixelThresholdClusterizer.cc b/RecoLocalTracker/SiPixelClusterizer/plugins/PixelThresholdClusterizer.cc similarity index 99% rename from RecoLocalTracker/SiPixelClusterizer/src/PixelThresholdClusterizer.cc rename to RecoLocalTracker/SiPixelClusterizer/plugins/PixelThresholdClusterizer.cc index ae6999a05efed..51ab53b10759d 100644 --- a/RecoLocalTracker/SiPixelClusterizer/src/PixelThresholdClusterizer.cc +++ b/RecoLocalTracker/SiPixelClusterizer/plugins/PixelThresholdClusterizer.cc @@ -20,8 +20,8 @@ //---------------------------------------------------------------------------- // Our own includes -#include "RecoLocalTracker/SiPixelClusterizer/interface/PixelThresholdClusterizer.h" -#include "RecoLocalTracker/SiPixelClusterizer/interface/SiPixelArrayBuffer.h" +#include "PixelThresholdClusterizer.h" +#include "SiPixelArrayBuffer.h" #include "CondFormats/SiPixelObjects/interface/SiPixelGainCalibrationOffline.h" // Geometry #include "Geometry/TrackerGeometryBuilder/interface/PixelGeomDetUnit.h" diff --git a/RecoLocalTracker/SiPixelClusterizer/interface/PixelThresholdClusterizer.h b/RecoLocalTracker/SiPixelClusterizer/plugins/PixelThresholdClusterizer.h similarity index 96% rename from RecoLocalTracker/SiPixelClusterizer/interface/PixelThresholdClusterizer.h rename to RecoLocalTracker/SiPixelClusterizer/plugins/PixelThresholdClusterizer.h index ab36bd8642773..ea9acfc8f9cc9 100644 --- a/RecoLocalTracker/SiPixelClusterizer/interface/PixelThresholdClusterizer.h +++ b/RecoLocalTracker/SiPixelClusterizer/plugins/PixelThresholdClusterizer.h @@ -42,10 +42,10 @@ // Pixel, PixelPos and Shift as inner classes. // #include "DataFormats/Common/interface/DetSetVector.h" -#include "RecoLocalTracker/SiPixelClusterizer/interface/PixelClusterizerBase.h" +#include "PixelClusterizerBase.h" // The private pixel buffer -#include "RecoLocalTracker/SiPixelClusterizer/interface/SiPixelArrayBuffer.h" +#include "SiPixelArrayBuffer.h" // Parameter Set: #include "FWCore/ParameterSet/interface/ParameterSet.h" @@ -56,7 +56,7 @@ #include -class PixelThresholdClusterizer final : public PixelClusterizerBase { +class dso_hidden PixelThresholdClusterizer final : public PixelClusterizerBase { public: PixelThresholdClusterizer(edm::ParameterSet const& conf); diff --git a/RecoLocalTracker/SiPixelClusterizer/interface/SiPixelArrayBuffer.h b/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelArrayBuffer.h similarity index 100% rename from RecoLocalTracker/SiPixelClusterizer/interface/SiPixelArrayBuffer.h rename to RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelArrayBuffer.h diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelClusterHeterogeneousConverter.cc b/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelClusterHeterogeneousConverter.cc similarity index 96% rename from EventFilter/SiPixelRawToDigi/plugins/SiPixelClusterHeterogeneousConverter.cc rename to RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelClusterHeterogeneousConverter.cc index c947888e5c264..9000dd38194b2 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/SiPixelClusterHeterogeneousConverter.cc +++ b/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelClusterHeterogeneousConverter.cc @@ -30,7 +30,7 @@ SiPixelClusterHeterogeneousConverter::SiPixelClusterHeterogeneousConverter(edm:: void SiPixelClusterHeterogeneousConverter::fillDescriptions(edm::ConfigurationDescriptions& descriptions) { edm::ParameterSetDescription desc; - desc.add("src", edm::InputTag("siPixelDigisHeterogeneous")); + desc.add("src", edm::InputTag("siPixelClustersHeterogeneous")); descriptions.addWithDefaultLabel(desc); } diff --git a/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelClusterProducer.cc b/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelClusterProducer.cc index d9da8d77031ee..45ca9be5fd6c3 100644 --- a/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelClusterProducer.cc +++ b/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelClusterProducer.cc @@ -13,7 +13,7 @@ // Our own stuff #include "SiPixelClusterProducer.h" -#include "RecoLocalTracker/SiPixelClusterizer/interface/PixelThresholdClusterizer.h" +#include "PixelThresholdClusterizer.h" // Geometry #include "Geometry/Records/interface/TrackerDigiGeometryRecord.h" diff --git a/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelClusterProducer.h b/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelClusterProducer.h index 30169a62c0f49..e22eea15d2672 100644 --- a/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelClusterProducer.h +++ b/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelClusterProducer.h @@ -28,7 +28,7 @@ //! //--------------------------------------------------------------------------- -#include "RecoLocalTracker/SiPixelClusterizer/interface/PixelClusterizerBase.h" +#include "PixelClusterizerBase.h" //#include "Geometry/CommonDetUnit/interface/TrackingGeometry.h" diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelDigiHeterogeneousConverter.cc b/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelDigiHeterogeneousConverter.cc similarity index 96% rename from EventFilter/SiPixelRawToDigi/plugins/SiPixelDigiHeterogeneousConverter.cc rename to RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelDigiHeterogeneousConverter.cc index c2b886b16c784..7f334a475a4bd 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/SiPixelDigiHeterogeneousConverter.cc +++ b/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelDigiHeterogeneousConverter.cc @@ -37,7 +37,7 @@ SiPixelDigiHeterogeneousConverter::SiPixelDigiHeterogeneousConverter(edm::Parame void SiPixelDigiHeterogeneousConverter::fillDescriptions(edm::ConfigurationDescriptions& descriptions) { edm::ParameterSetDescription desc; - desc.add("src", edm::InputTag("siPixelDigisHeterogeneous")); + desc.add("src", edm::InputTag("siPixelClustersHeterogeneous")); desc.add("includeErrors",true); descriptions.addWithDefaultLabel(desc); diff --git a/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelFedCablingMapGPUWrapperESProducer.cc b/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelFedCablingMapGPUWrapperESProducer.cc new file mode 100644 index 0000000000000..5ef6018280bef --- /dev/null +++ b/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelFedCablingMapGPUWrapperESProducer.cc @@ -0,0 +1,68 @@ +#include "RecoLocalTracker/SiPixelClusterizer/interface/SiPixelFedCablingMapGPUWrapper.h" +#include "CondFormats/DataRecord/interface/SiPixelFedCablingMapRcd.h" +#include "CondFormats/DataRecord/interface/SiPixelQualityRcd.h" +#include "FWCore/Framework/interface/ESProducer.h" +#include "FWCore/Framework/interface/EventSetup.h" +#include "FWCore/Framework/interface/ESTransientHandle.h" +#include "FWCore/Framework/interface/ModuleFactory.h" +#include "FWCore/ParameterSet/interface/ParameterSet.h" +#include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h" +#include "Geometry/Records/interface/TrackerDigiGeometryRecord.h" + +#include "RecoTracker/Record/interface/CkfComponentsRecord.h" // TODO: eventually use something more limited + +#include + +class SiPixelFedCablingMapGPUWrapperESProducer: public edm::ESProducer { +public: + explicit SiPixelFedCablingMapGPUWrapperESProducer(const edm::ParameterSet& iConfig); + std::unique_ptr produce(const CkfComponentsRecord& iRecord); + + static void fillDescriptions(edm::ConfigurationDescriptions& descriptions); + +private: + std::string cablingMapLabel_; + bool useQuality_; +}; + +SiPixelFedCablingMapGPUWrapperESProducer::SiPixelFedCablingMapGPUWrapperESProducer(const edm::ParameterSet& iConfig): + cablingMapLabel_(iConfig.getParameter("CablingMapLabel")), + useQuality_(iConfig.getParameter("UseQualityInfo")) +{ + std::string myname = iConfig.getParameter("ComponentName"); + setWhatProduced(this, myname); +} + +void SiPixelFedCablingMapGPUWrapperESProducer::fillDescriptions(edm::ConfigurationDescriptions& descriptions) { + edm::ParameterSetDescription desc; + + std::string label = "siPixelFedCablingMapGPUWrapper"; + desc.add("ComponentName", ""); + desc.add("CablingMapLabel","")->setComment("CablingMap label"); + desc.add("UseQualityInfo",false); + + descriptions.add(label, desc); +} + +std::unique_ptr SiPixelFedCablingMapGPUWrapperESProducer::produce(const CkfComponentsRecord& iRecord) { + edm::ESTransientHandle cablingMap; + iRecord.getRecord().get( cablingMapLabel_, cablingMap ); + + const SiPixelQuality *quality = nullptr; + if(useQuality_) { + edm::ESTransientHandle qualityInfo; + iRecord.getRecord().get(qualityInfo); + quality = qualityInfo.product(); + } + + edm::ESTransientHandle geom; + iRecord.getRecord().get(geom); + + return std::make_unique(*cablingMap, *geom, quality); +} + +#include "FWCore/Framework/interface/MakerMacros.h" +#include "FWCore/Utilities/interface/typelookup.h" +#include "FWCore/Framework/interface/eventsetuprecord_registration_macro.h" + +DEFINE_FWK_EVENTSETUP_MODULE(SiPixelFedCablingMapGPUWrapperESProducer); diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToClusterGPUKernel.cu b/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelRawToClusterGPUKernel.cu similarity index 96% rename from EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToClusterGPUKernel.cu rename to RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelRawToClusterGPUKernel.cu index 2d28a73bd98c1..fdf7455475197 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToClusterGPUKernel.cu +++ b/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelRawToClusterGPUKernel.cu @@ -31,18 +31,15 @@ #include "HeterogeneousCore/CUDAUtilities/interface/cudaCheck.h" #include "RecoLocalTracker/SiPixelClusterizer/plugins/gpuCalibPixel.h" #include "RecoLocalTracker/SiPixelClusterizer/plugins/gpuClustering.h" +#include "RecoLocalTracker/SiPixelClusterizer/interface/SiPixelFedCablingMapGPU.h" // local includes -#include "SiPixelFedCablingMapGPU.h" #include "SiPixelRawToClusterGPUKernel.h" namespace pixelgpudetails { SiPixelRawToClusterGPUKernel::SiPixelRawToClusterGPUKernel() { - // device copy of GPU friendly cabling map - allocateCablingMap(cablingMapGPUHost_, cablingMapGPUDevice_); - - int WSIZE = MAX_FED * pixelgpudetails::MAX_WORD * sizeof(unsigned int); + int WSIZE = pixelgpudetails::MAX_FED * pixelgpudetails::MAX_WORD * sizeof(unsigned int); cudaMallocHost(&word, sizeof(unsigned int)*WSIZE); cudaMallocHost(&fedId_h, sizeof(unsigned char)*WSIZE); @@ -88,9 +85,6 @@ namespace pixelgpudetails { cudaCheck(cudaMalloc((void**) & data_d, MAX_ERROR_SIZE)); // for the clusterizer - cudaCheck(cudaMallocHost((void**) & gainForHLTonHost_, sizeof(SiPixelGainForHLTonGPU))); - cudaCheck(cudaMalloc((void**) & gainForHLTonGPU_, sizeof(SiPixelGainForHLTonGPU))); - cudaCheck(cudaMalloc((void**) & clus_d, MAX_WORD32_SIZE)); // cluser index in module cudaCheck(cudaMalloc((void**) & moduleStart_d, (MaxNumModules+1)*sizeof(uint32_t) )); @@ -102,14 +96,6 @@ namespace pixelgpudetails { SiPixelRawToClusterGPUKernel::~SiPixelRawToClusterGPUKernel() { - // release device memory for cabling map - deallocateCablingMap(cablingMapGPUHost_, cablingMapGPUDevice_); - - // free gains device memory - cudaCheck(cudaFreeHost(gainForHLTonHost_)); - cudaCheck(cudaFree(gainForHLTonGPU_)); - cudaCheck(cudaFree(gainDataOnGPU_)); - // free device memory used for RawToDigi on GPU // free the GPU memory cudaCheck(cudaFree(word_d)); @@ -482,7 +468,8 @@ namespace pixelgpudetails { // Kernel to perform Raw to Digi conversion - __global__ void RawToDigi_kernel(const SiPixelFedCablingMapGPU *Map, const uint32_t wordCounter, const uint32_t *Word, const uint8_t *fedIds, + __global__ void RawToDigi_kernel(const SiPixelFedCablingMapGPU *Map, const unsigned char *modToUnp, + const uint32_t wordCounter, const uint32_t *Word, const uint8_t *fedIds, uint16_t * XX, uint16_t * YY, uint16_t * ADC, uint32_t * pdigi, uint32_t *rawIdArr, uint16_t * moduleId, GPU::SimpleVector *err, @@ -538,7 +525,7 @@ namespace pixelgpudetails { if (skipROC) continue; } - skipROC = Map->modToUnp[index]; + skipROC = modToUnp[index]; if (skipROC) continue; uint32_t layer = 0;//, ladder =0; @@ -604,6 +591,9 @@ namespace pixelgpudetails { // Interface to outside void SiPixelRawToClusterGPUKernel::makeClustersAsync( + const SiPixelFedCablingMapGPU *cablingMap, + const unsigned char *modToUnp, + const SiPixelGainForHLTonGPU *gains, const uint32_t wordCounter, const uint32_t fedCounter, bool convertADCtoElectrons, bool useQualityInfo, bool includeErrors, bool debug, @@ -626,7 +616,8 @@ namespace pixelgpudetails { // Launch rawToDigi kernel RawToDigi_kernel<<>>( - cablingMapGPUDevice_, + cablingMap, + modToUnp, wordCounter, word_d, fedId_d, @@ -661,11 +652,10 @@ namespace pixelgpudetails { int blocks = (wordCounter + threadsPerBlock - 1) / threadsPerBlock; - assert(gainForHLTonGPU_); gpuCalibPixel::calibDigis<<>>( moduleInd_d, xx_d, yy_d, adc_d, - gainForHLTonGPU_, + gains, wordCounter ); diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToClusterGPUKernel.h b/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelRawToClusterGPUKernel.h similarity index 85% rename from EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToClusterGPUKernel.h rename to RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelRawToClusterGPUKernel.h index ba437b2402a3f..ccc9e85ff3d24 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToClusterGPUKernel.h +++ b/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelRawToClusterGPUKernel.h @@ -1,5 +1,5 @@ -#ifndef EventFilter_SiPixelRawToDigi_plugins_SiPixelRawToClusterGPUKernel_h -#define EventFilter_SiPixelRawToDigi_plugins_SiPixelRawToClusterGPUKernel_h +#ifndef RecoLocalTracker_SiPixelClusterizer_plugins_SiPixelRawToClusterGPUKernel_h +#define RecoLocalTracker_SiPixelClusterizer_plugins_SiPixelRawToClusterGPUKernel_h #include #include @@ -7,9 +7,11 @@ #include "FWCore/Utilities/interface/typedefs.h" #include "HeterogeneousCore/CUDAUtilities/interface/GPUSimpleVector.h" -#include "SiPixelFedCablingMapGPU.h" #include "siPixelRawToClusterHeterogeneousProduct.h" +class SiPixelFedCablingMapGPU; +class SiPixelGainForHLTonGPU; + namespace pixelgpudetails { // Phase 1 geometry constants @@ -156,24 +158,12 @@ namespace pixelgpudetails { SiPixelRawToClusterGPUKernel& operator=(const SiPixelRawToClusterGPUKernel&) = delete; SiPixelRawToClusterGPUKernel& operator=(SiPixelRawToClusterGPUKernel&&) = delete; - void updateCablingMap(SiPixelFedCablingMap const& cablingMap, - TrackerGeometry const& trackerGeom, - SiPixelQuality const* badPixelInfo, - std::set const& modules, - cuda::stream_t<>& stream) { - processCablingMap(cablingMap, trackerGeom, cablingMapGPUHost_, cablingMapGPUDevice_, badPixelInfo, modules, stream); - } - - void updateGainCalibration(SiPixelGainCalibrationForHLT const& gains, - TrackerGeometry const& trackerGeom, - cuda::stream_t<>& stream) { - processGainCalibration(gains, trackerGeom, gainForHLTonHost_, gainForHLTonGPU_, gainDataOnGPU_, stream); - } - void initializeWordFed(int fedId, unsigned int wordCounterGPU, const cms_uint32_t *src, unsigned int length); // Not really very async yet... - void makeClustersAsync(const uint32_t wordCounter, const uint32_t fedCounter, bool convertADCtoElectrons, + void makeClustersAsync(const SiPixelFedCablingMapGPU *cablingMap, const unsigned char *modToUnp, + const SiPixelGainForHLTonGPU *gains, + const uint32_t wordCounter, const uint32_t fedCounter, bool convertADCtoElectrons, bool useQualityInfo, bool includeErrors, bool debug, cuda::stream_t<>& stream); @@ -186,14 +176,6 @@ namespace pixelgpudetails { } private: - // Conditions - SiPixelFedCablingMapGPU *cablingMapGPUHost_ = nullptr; - SiPixelFedCablingMapGPU *cablingMapGPUDevice_ = nullptr; - // gain calib - SiPixelGainForHLTonGPU * gainForHLTonHost_ = nullptr; - SiPixelGainForHLTonGPU * gainForHLTonGPU_ = nullptr; - SiPixelGainForHLTonGPU_DecodingStructure * gainDataOnGPU_ = nullptr; - // input unsigned int *word = nullptr; // to hold input for rawtodigi unsigned char *fedId_h = nullptr; // to hold fed index for each word @@ -283,4 +265,4 @@ namespace pixelgpudetails { } -#endif // EventFilter_SiPixelRawToDigi_plugins_SiPixelRawToClusterGPUKernel_h +#endif // RecoLocalTracker_SiPixelClusterizer_plugins_SiPixelRawToClusterGPUKernel_h diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToClusterHeterogeneous.cc b/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelRawToClusterHeterogeneous.cc similarity index 93% rename from EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToClusterHeterogeneous.cc rename to RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelRawToClusterHeterogeneous.cc index 0a1ccd5598f28..dcf41155eebc9 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToClusterHeterogeneous.cc +++ b/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelRawToClusterHeterogeneous.cc @@ -9,6 +9,8 @@ #include // CMSSW includes +#include "CalibTracker/Records/interface/SiPixelGainCalibrationForHLTGPURcd.h" +#include "CalibTracker/SiPixelESProducers/interface/SiPixelGainCalibrationForHLTGPU.h" #include "CalibTracker/SiPixelESProducers/interface/SiPixelGainCalibrationForHLTService.h" #include "CondFormats/DataRecord/interface/SiPixelFedCablingMapRcd.h" #include "CondFormats/DataRecord/interface/SiPixelQualityRcd.h" @@ -47,10 +49,13 @@ #include "HeterogeneousCore/CUDAUtilities/interface/cudaCheck.h" #include "HeterogeneousCore/Producer/interface/HeterogeneousEDProducer.h" #include "HeterogeneousCore/Product/interface/HeterogeneousProduct.h" -#include "RecoLocalTracker/SiPixelClusterizer/interface/PixelThresholdClusterizer.h" + +#include "RecoLocalTracker/SiPixelClusterizer/interface/SiPixelFedCablingMapGPUWrapper.h" +#include "RecoTracker/Record/interface/CkfComponentsRecord.h" #include "SiPixelRawToClusterGPUKernel.h" #include "siPixelRawToClusterHeterogeneousProduct.h" +#include "PixelThresholdClusterizer.h" namespace { struct AccretionCluster { @@ -129,7 +134,6 @@ std::unique_ptr regions_; edm::ESWatcher recordWatcher; edm::ESWatcher qualityWatcher; bool recordWatcherUpdatedSinceLastTransfer_ = false; - bool qualityWatcherUpdatedSinceLastTransfer_ = false; bool usePilotBlade; bool usePhase1; @@ -146,6 +150,7 @@ std::unique_ptr regions_; // GPU algo std::unique_ptr gpuAlgo_; + std::unique_ptr gpuModulesToUnpack_; PixelDataFormatter::Errors errors_; }; @@ -199,7 +204,7 @@ void SiPixelRawToClusterHeterogeneous::fillDescriptions(edm::ConfigurationDescri temp1.push_back(40); desc.add >("UserErrorList",temp1)->setComment("## UserErrorList: list of error codes used by Pixel experts for investigation"); } - desc.add("InputLabel",edm::InputTag("siPixelRawData")); + desc.add("InputLabel",edm::InputTag("rawDataCollector")); { edm::ParameterSetDescription psd0; psd0.addOptional>("inputs"); @@ -229,7 +234,7 @@ void SiPixelRawToClusterHeterogeneous::fillDescriptions(edm::ConfigurationDescri HeterogeneousEDProducer::fillPSetDescription(desc); - descriptions.add("siPixelDigisHeterogeneousDefault",desc); + descriptions.add("siPixelClustersHeterogeneousDefault",desc); } const FEDRawDataCollection *SiPixelRawToClusterHeterogeneous::initialize(const edm::Event& ev, const edm::EventSetup& es) { @@ -258,7 +263,6 @@ const FEDRawDataCollection *SiPixelRawToClusterHeterogeneous::initialize(const e if (!badPixelInfo_) { edm::LogError("SiPixelQualityNotPresent")<<" Configured to use SiPixelQuality, but SiPixelQuality not present"; } - qualityWatcherUpdatedSinceLastTransfer_ = true; } // tracker geometry: to make sure numbering of DetId is consistent... @@ -422,23 +426,31 @@ void SiPixelRawToClusterHeterogeneous::produceCPU(edm::HeterogeneousEvent& ev, c void SiPixelRawToClusterHeterogeneous::beginStreamGPUCuda(edm::StreamID streamId, cuda::stream_t<>& cudaStream) { // Allocate GPU resources here gpuAlgo_ = std::make_unique(); + gpuModulesToUnpack_ = std::make_unique(); } void SiPixelRawToClusterHeterogeneous::acquireGPUCuda(const edm::HeterogeneousEvent& ev, const edm::EventSetup& es, cuda::stream_t<>& cudaStream) { const auto buffers = initialize(ev.event(), es); - std::set modules; if (regions_) { - modules = *(regions_->modulesToUnpack()); + std::set modules = *(regions_->modulesToUnpack()); + gpuModulesToUnpack_->fillAsync(*cablingMap_, modules, cudaStream); + } + else if(recordWatcherUpdatedSinceLastTransfer_) { + // If regions_ are disabled, it is enough to fill and transfer only if cablingMap has changed + gpuModulesToUnpack_->fillAsync(*cablingMap_, std::set(), cudaStream); } - if(recordWatcherUpdatedSinceLastTransfer_) { - // convert the cabling map to a GPU-friendly version - gpuAlgo_->updateCablingMap(*cablingMap_, *geom_, badPixelInfo_, modules, cudaStream); - gpuAlgo_->updateGainCalibration(theSiPixelGainCalibration_.payload(), *geom_, cudaStream); - - recordWatcherUpdatedSinceLastTransfer_ = false; + edm::ESHandle hgpuMap; + es.get().get(hgpuMap); + if(hgpuMap->hasQuality() != useQuality) { + throw cms::Exception("LogicError") << "UseQuality of the module (" << useQuality<< ") differs the one from SiPixelFedCablingMapGPUWrapper. Please fix your configuration."; } + // get the GPU product already here so that the async transfer can begin + const auto *gpuMap = hgpuMap->getGPUProductAsync(cudaStream); + + edm::ESHandle hgains; + es.get().get(hgains); errors_.clear(); @@ -503,7 +515,8 @@ void SiPixelRawToClusterHeterogeneous::acquireGPUCuda(const edm::HeterogeneousEv } // end of for loop - gpuAlgo_->makeClustersAsync(wordCounterGPU, fedCounter, convertADCtoElectrons, + gpuAlgo_->makeClustersAsync(gpuMap, gpuModulesToUnpack_->get(), hgains->getGPUProductAsync(cudaStream), + wordCounterGPU, fedCounter, convertADCtoElectrons, useQuality, includeErrors, debug, cudaStream); } diff --git a/EventFilter/SiPixelRawToDigi/plugins/siPixelRawToClusterHeterogeneousProduct.h b/RecoLocalTracker/SiPixelClusterizer/plugins/siPixelRawToClusterHeterogeneousProduct.h similarity index 100% rename from EventFilter/SiPixelRawToDigi/plugins/siPixelRawToClusterHeterogeneousProduct.h rename to RecoLocalTracker/SiPixelClusterizer/plugins/siPixelRawToClusterHeterogeneousProduct.h diff --git a/RecoLocalTracker/SiPixelClusterizer/python/SiPixelClusterizer_cfi.py b/RecoLocalTracker/SiPixelClusterizer/python/SiPixelClusterizer_cfi.py index 8d5a2f6f9dd1e..c1d35b887416b 100644 --- a/RecoLocalTracker/SiPixelClusterizer/python/SiPixelClusterizer_cfi.py +++ b/RecoLocalTracker/SiPixelClusterizer/python/SiPixelClusterizer_cfi.py @@ -58,5 +58,5 @@ ) from Configuration.ProcessModifiers.gpu_cff import gpu -from EventFilter.SiPixelRawToDigi.siPixelClusterHeterogeneousConverter_cfi import siPixelClusterHeterogeneousConverter as _siPixelClusterHeterogeneousConverter +from RecoLocalTracker.SiPixelClusterizer.siPixelClusterHeterogeneousConverter_cfi import siPixelClusterHeterogeneousConverter as _siPixelClusterHeterogeneousConverter gpu.toReplaceWith(siPixelClusters, _siPixelClusterHeterogeneousConverter.clone()) diff --git a/EventFilter/SiPixelRawToDigi/python/siPixelDigisHeterogeneous_cfi.py b/RecoLocalTracker/SiPixelClusterizer/python/siPixelClustersHeterogeneous_cfi.py similarity index 51% rename from EventFilter/SiPixelRawToDigi/python/siPixelDigisHeterogeneous_cfi.py rename to RecoLocalTracker/SiPixelClusterizer/python/siPixelClustersHeterogeneous_cfi.py index 52d27084dc817..b86520bb28287 100644 --- a/EventFilter/SiPixelRawToDigi/python/siPixelDigisHeterogeneous_cfi.py +++ b/RecoLocalTracker/SiPixelClusterizer/python/siPixelClustersHeterogeneous_cfi.py @@ -1,28 +1,28 @@ import FWCore.ParameterSet.Config as cms -from EventFilter.SiPixelRawToDigi.siPixelDigisHeterogeneousDefault_cfi import siPixelDigisHeterogeneousDefault as _siPixelDigisHeterogeneousDefault -siPixelDigisHeterogeneous = _siPixelDigisHeterogeneousDefault.clone() +from RecoLocalTracker.SiPixelClusterizer.siPixelClustersHeterogeneousDefault_cfi import siPixelClustersHeterogeneousDefault as _siPixelClustersHeterogeneousDefault +siPixelClustersHeterogeneous = _siPixelClustersHeterogeneousDefault.clone() # following copied from SiPixelRawToDigi_cfi -siPixelDigisHeterogeneous.IncludeErrors = cms.bool(True) -siPixelDigisHeterogeneous.InputLabel = cms.InputTag("rawDataCollector") -siPixelDigisHeterogeneous.UseQualityInfo = cms.bool(False) +siPixelClustersHeterogeneous.IncludeErrors = cms.bool(True) +siPixelClustersHeterogeneous.InputLabel = cms.InputTag("rawDataCollector") +siPixelClustersHeterogeneous.UseQualityInfo = cms.bool(False) ## ErrorList: list of error codes used by tracking to invalidate modules -siPixelDigisHeterogeneous.ErrorList = cms.vint32(29) +siPixelClustersHeterogeneous.ErrorList = cms.vint32(29) ## UserErrorList: list of error codes used by Pixel experts for investigation -siPixelDigisHeterogeneous.UserErrorList = cms.vint32(40) +siPixelClustersHeterogeneous.UserErrorList = cms.vint32(40) ## Use pilot blades -siPixelDigisHeterogeneous.UsePilotBlade = cms.bool(False) +siPixelClustersHeterogeneous.UsePilotBlade = cms.bool(False) ## Use phase1 -siPixelDigisHeterogeneous.UsePhase1 = cms.bool(False) +siPixelClustersHeterogeneous.UsePhase1 = cms.bool(False) ## Empty Regions PSet means complete unpacking -siPixelDigisHeterogeneous.Regions = cms.PSet( ) -siPixelDigisHeterogeneous.CablingMapLabel = cms.string("") +siPixelClustersHeterogeneous.Regions = cms.PSet( ) +siPixelClustersHeterogeneous.CablingMapLabel = cms.string("") # The following is copied from siPixelClusters_cfi, clearly not # maintainable in the long run from Configuration.Eras.Modifier_phase1Pixel_cff import phase1Pixel -phase1Pixel.toModify(siPixelDigisHeterogeneous, +phase1Pixel.toModify(siPixelClustersHeterogeneous, VCaltoElectronGain = cms.int32(47), # L2-4: 47 +- 4.7 VCaltoElectronGain_L1 = cms.int32(50), # L1: 49.6 +- 2.6 VCaltoElectronOffset = cms.int32(-60), # L2-4: -60 +- 130 @@ -34,4 +34,4 @@ ) # The following is copied from SiPixelRawToDigi_cfi -phase1Pixel.toModify(siPixelDigisHeterogeneous, UsePhase1=True) +phase1Pixel.toModify(siPixelClustersHeterogeneous, UsePhase1=True) diff --git a/RecoLocalTracker/SiPixelClusterizer/src/ES_SiPixelFedCablingMapGPUWrapper.cc b/RecoLocalTracker/SiPixelClusterizer/src/ES_SiPixelFedCablingMapGPUWrapper.cc new file mode 100644 index 0000000000000..1f68e4bf9a534 --- /dev/null +++ b/RecoLocalTracker/SiPixelClusterizer/src/ES_SiPixelFedCablingMapGPUWrapper.cc @@ -0,0 +1,4 @@ +#include "RecoLocalTracker/SiPixelClusterizer/interface/SiPixelFedCablingMapGPUWrapper.h" +#include "FWCore/Utilities/interface/typelookup.h" + +TYPELOOKUP_DATA_REG(SiPixelFedCablingMapGPUWrapper); diff --git a/RecoLocalTracker/SiPixelClusterizer/src/SiPixelFedCablingMapGPUWrapper.cc b/RecoLocalTracker/SiPixelClusterizer/src/SiPixelFedCablingMapGPUWrapper.cc new file mode 100644 index 0000000000000..e0b9a29eaf077 --- /dev/null +++ b/RecoLocalTracker/SiPixelClusterizer/src/SiPixelFedCablingMapGPUWrapper.cc @@ -0,0 +1,173 @@ +// C++ includes +#include +#include +#include +#include + +// CUDA includes +#include + +// CMSSW includes +#include "CondFormats/SiPixelObjects/interface/SiPixelFedCablingMap.h" +#include "CondFormats/SiPixelObjects/interface/SiPixelFedCablingTree.h" +#include "CondFormats/SiPixelObjects/interface/SiPixelQuality.h" +#include "FWCore/MessageLogger/interface/MessageLogger.h" +#include "Geometry/CommonDetUnit/interface/GeomDetType.h" +#include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h" +#include "HeterogeneousCore/CUDAUtilities/interface/cudaCheck.h" +#include "RecoLocalTracker/SiPixelClusterizer/interface/SiPixelFedCablingMapGPUWrapper.h" + +SiPixelFedCablingMapGPUWrapper::SiPixelFedCablingMapGPUWrapper(SiPixelFedCablingMap const& cablingMap, + TrackerGeometry const& trackerGeom, + SiPixelQuality const *badPixelInfo): + fedMap(pixelgpudetails::MAX_SIZE), linkMap(pixelgpudetails::MAX_SIZE), rocMap(pixelgpudetails::MAX_SIZE), + RawId(pixelgpudetails::MAX_SIZE), rocInDet(pixelgpudetails::MAX_SIZE), moduleId(pixelgpudetails::MAX_SIZE), + badRocs(pixelgpudetails::MAX_SIZE), + hasQuality_(badPixelInfo != nullptr) +{ + std::vector const& fedIds = cablingMap.fedIds(); + std::unique_ptr const& cabling = cablingMap.cablingTree(); + + unsigned int startFed = *(fedIds.begin()); + unsigned int endFed = *(fedIds.end() - 1); + + sipixelobjects::CablingPathToDetUnit path; + int index = 1; + + for (unsigned int fed = startFed; fed <= endFed; fed++) { + for (unsigned int link = 1; link <= pixelgpudetails::MAX_LINK; link++) { + for (unsigned int roc = 1; roc <= pixelgpudetails::MAX_ROC; roc++) { + path = {fed, link, roc}; + const sipixelobjects::PixelROC* pixelRoc = cabling->findItem(path); + fedMap[index] = fed; + linkMap[index] = link; + rocMap[index] = roc; + if (pixelRoc != nullptr) { + RawId[index] = pixelRoc->rawId(); + rocInDet[index] = pixelRoc->idInDetUnit(); + if (badPixelInfo != nullptr) + badRocs[index] = badPixelInfo->IsRocBad(pixelRoc->rawId(), pixelRoc->idInDetUnit()); + else + badRocs[index] = false; + } else { // store some dummy number + RawId[index] = 9999; + rocInDet[index] = 9999; + badRocs[index] = true; + } + index++; + } + } + } // end of FED loop + + // Given FedId, Link and idinLnk; use the following formula + // to get the RawId and idinDU + // index = (FedID-1200) * MAX_LINK* MAX_ROC + (Link-1)* MAX_ROC + idinLnk; + // where, MAX_LINK = 48, MAX_ROC = 8 for Phase1 as mentioned Danek's email + // FedID varies between 1200 to 1338 (In total 108 FED's) + // Link varies between 1 to 48 + // idinLnk varies between 1 to 8 + + for (int i = 1; i < index; i++) { + if (RawId[i] == 9999) { + moduleId[i] = 9999; + } else { + /* + std::cout << RawId[i] << std::endl; + */ + auto gdet = trackerGeom.idToDetUnit(RawId[i]); + if (!gdet) { + LogDebug("SiPixelFedCablingMapGPU") << " Not found: " << RawId[i] << std::endl; + continue; + } + moduleId[i] = gdet->index(); + } + LogDebug("SiPixelFedCablingMapGPU") << "----------------------------------------------------------------------------" << std::endl; + LogDebug("SiPixelFedCablingMapGPU") << i << std::setw(20) << fedMap[i] << std::setw(20) << linkMap[i] << std::setw(20) << rocMap[i] << std::endl; + LogDebug("SiPixelFedCablingMapGPU") << i << std::setw(20) << RawId[i] << std::setw(20) << rocInDet[i] << std::setw(20) << moduleId[i] << std::endl; + LogDebug("SiPixelFedCablingMapGPU") << i << std::setw(20) << (bool)badRocs[i] << std::setw(20) << std::endl; + LogDebug("SiPixelFedCablingMapGPU") << "----------------------------------------------------------------------------" << std::endl; + + } + + size = index-1; +} + + +SiPixelFedCablingMapGPUWrapper::~SiPixelFedCablingMapGPUWrapper() {} + + +const SiPixelFedCablingMapGPU *SiPixelFedCablingMapGPUWrapper::getGPUProductAsync(cuda::stream_t<>& cudaStream) const { + const auto& data = gpuData_.dataForCurrentDeviceAsync(cudaStream, [this](GPUData& data, cuda::stream_t<>& stream) { + // allocate + cudaCheck(cudaMallocHost((void**) & data.cablingMapHost, sizeof(SiPixelFedCablingMapGPU))); + cudaCheck(cudaMalloc((void**) & data.cablingMapDevice, sizeof(SiPixelFedCablingMapGPU))); + cudaCheck(cudaMalloc((void**) & data.cablingMapHost->fed, pixelgpudetails::MAX_SIZE_BYTE_INT)); + cudaCheck(cudaMalloc((void**) & data.cablingMapHost->link, pixelgpudetails::MAX_SIZE_BYTE_INT)); + cudaCheck(cudaMalloc((void**) & data.cablingMapHost->roc, pixelgpudetails::MAX_SIZE_BYTE_INT)); + cudaCheck(cudaMalloc((void**) & data.cablingMapHost->RawId, pixelgpudetails::MAX_SIZE_BYTE_INT)); + cudaCheck(cudaMalloc((void**) & data.cablingMapHost->rocInDet, pixelgpudetails::MAX_SIZE_BYTE_INT)); + cudaCheck(cudaMalloc((void**) & data.cablingMapHost->moduleId, pixelgpudetails::MAX_SIZE_BYTE_INT)); + cudaCheck(cudaMalloc((void**) & data.cablingMapHost->badRocs, pixelgpudetails::MAX_SIZE_BYTE_BOOL)); + + // transfer + data.cablingMapHost->size = this->size; + cudaCheck(cudaMemcpyAsync(data.cablingMapHost->fed, this->fedMap.data(), this->fedMap.size() * sizeof(unsigned int), cudaMemcpyDefault, stream.id())); + cudaCheck(cudaMemcpyAsync(data.cablingMapHost->link, this->linkMap.data(), this->linkMap.size() * sizeof(unsigned int), cudaMemcpyDefault, stream.id())); + cudaCheck(cudaMemcpyAsync(data.cablingMapHost->roc, this->rocMap.data(), this->rocMap.size() * sizeof(unsigned int), cudaMemcpyDefault, stream.id())); + cudaCheck(cudaMemcpyAsync(data.cablingMapHost->RawId, this->RawId.data(), this->RawId.size() * sizeof(unsigned int), cudaMemcpyDefault, stream.id())); + cudaCheck(cudaMemcpyAsync(data.cablingMapHost->rocInDet, this->rocInDet.data(), this->rocInDet.size() * sizeof(unsigned int), cudaMemcpyDefault, stream.id())); + cudaCheck(cudaMemcpyAsync(data.cablingMapHost->moduleId, this->moduleId.data(), this->moduleId.size() * sizeof(unsigned int), cudaMemcpyDefault, stream.id())); + cudaCheck(cudaMemcpyAsync(data.cablingMapHost->badRocs, this->badRocs.data(), this->badRocs.size() * sizeof(unsigned char), cudaMemcpyDefault, stream.id())); + cudaCheck(cudaMemcpyAsync(data.cablingMapDevice, data.cablingMapHost, sizeof(SiPixelFedCablingMapGPU), cudaMemcpyDefault, stream.id())); + }); + return data.cablingMapDevice; +} + +SiPixelFedCablingMapGPUWrapper::ModulesToUnpack::ModulesToUnpack(): + modToUnpDevice(cuda::memory::device::make_unique(cuda::device::current::get().id(), pixelgpudetails::MAX_SIZE)), + modToUnpHost(pixelgpudetails::MAX_SIZE) +{ +} + +void SiPixelFedCablingMapGPUWrapper::ModulesToUnpack::fillAsync(SiPixelFedCablingMap const& cablingMap, std::set const& modules, cuda::stream_t<>& cudaStream) { + std::vector const& fedIds = cablingMap.fedIds(); + std::unique_ptr const& cabling = cablingMap.cablingTree(); + + unsigned int startFed = *(fedIds.begin()); + unsigned int endFed = *(fedIds.end() - 1); + + sipixelobjects::CablingPathToDetUnit path; + int index = 1; + + for (unsigned int fed = startFed; fed <= endFed; fed++) { + for (unsigned int link = 1; link <= pixelgpudetails::MAX_LINK; link++) { + for (unsigned int roc = 1; roc <= pixelgpudetails::MAX_ROC; roc++) { + path = {fed, link, roc}; + const sipixelobjects::PixelROC* pixelRoc = cabling->findItem(path); + if (pixelRoc != nullptr) { + modToUnpHost[index] = (modules.size() != 0) && (modules.find(pixelRoc->rawId()) == modules.end()); + } else { // store some dummy number + modToUnpHost[index] = true; + } + index++; + } + } + } + + cuda::memory::async::copy(modToUnpHost.data(), modToUnpDevice.get(), modToUnpHost.size() * sizeof(unsigned char), cudaStream.id()); +} + + +SiPixelFedCablingMapGPUWrapper::GPUData::~GPUData() { + if(cablingMapHost != nullptr) { + cudaCheck(cudaFree(cablingMapHost->fed)); + cudaCheck(cudaFree(cablingMapHost->link)); + cudaCheck(cudaFree(cablingMapHost->roc)); + cudaCheck(cudaFree(cablingMapHost->RawId)); + cudaCheck(cudaFree(cablingMapHost->rocInDet)); + cudaCheck(cudaFree(cablingMapHost->moduleId)); + cudaCheck(cudaFree(cablingMapHost->badRocs)); + cudaCheck(cudaFreeHost(cablingMapHost)); + } + cudaCheck(cudaFree(cablingMapDevice)); +} diff --git a/RecoLocalTracker/SiPixelRecHits/BuildFile.xml b/RecoLocalTracker/SiPixelRecHits/BuildFile.xml index b9d484b351407..ede4584176e59 100644 --- a/RecoLocalTracker/SiPixelRecHits/BuildFile.xml +++ b/RecoLocalTracker/SiPixelRecHits/BuildFile.xml @@ -12,6 +12,8 @@ + + diff --git a/RecoLocalTracker/SiPixelRecHits/interface/PixelCPEFast.h b/RecoLocalTracker/SiPixelRecHits/interface/PixelCPEFast.h index a283cb1fa74ce..0066361483318 100644 --- a/RecoLocalTracker/SiPixelRecHits/interface/PixelCPEFast.h +++ b/RecoLocalTracker/SiPixelRecHits/interface/PixelCPEFast.h @@ -2,15 +2,17 @@ #define RecoLocalTracker_SiPixelRecHits_PixelCPEFast_h #include -#include #include "CalibTracker/SiPixelESProducers/interface/SiPixelCPEGenericDBErrorParametrization.h" +#include "HeterogeneousCore/CUDACore/interface/CUDAESProduct.h" #include "HeterogeneousCore/CUDAUtilities/interface/CUDAHostAllocator.h" #include "RecoLocalTracker/SiPixelRecHits/interface/PixelCPEBase.h" #include "RecoLocalTracker/SiPixelRecHits/interface/SiPixelGenError.h" #include "RecoLocalTracker/SiPixelRecHits/interface/SiPixelTemplate.h" #include "RecoLocalTracker/SiPixelRecHits/interface/pixelCPEforGPU.h" +#include + class MagneticField; class PixelCPEFast final : public PixelCPEBase { @@ -41,6 +43,10 @@ class PixelCPEFast final : public PixelCPEBase ~PixelCPEFast(); + // The return value can only be used safely in kernels launched on + // the same cudaStream, or after cudaStreamSynchronize. + const pixelCPEforGPU::ParamsOnGPU *getGPUProductAsync(cuda::stream_t<>& cudaStream) const; + private: ClusterParam * createClusterParam(const SiPixelCluster & cl) const override; @@ -71,15 +77,18 @@ class PixelCPEFast final : public PixelCPEBase //--- DB Error Parametrization object, new light templates std::vector< SiPixelGenErrorStore > thePixelGenError_; - -public : - void fillParamsForGpu(); - - // not needed if not used on CPU... std::vector> m_detParamsGPU; pixelCPEforGPU::CommonParams m_commonParamsGPU; - pixelCPEforGPU::ParamsOnGPU h_paramsOnGPU; - pixelCPEforGPU::ParamsOnGPU * d_paramsOnGPU; // copy of the above on the Device + + struct GPUData { + ~GPUData(); + // not needed if not used on CPU... + pixelCPEforGPU::ParamsOnGPU h_paramsOnGPU; + pixelCPEforGPU::ParamsOnGPU * d_paramsOnGPU = nullptr; // copy of the above on the Device + }; + CUDAESProduct gpuData_; + + void fillParamsForGpu(); }; #endif // RecoLocalTracker_SiPixelRecHits_PixelCPEFast_h diff --git a/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.cu b/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.cu index 3a46ece955ca3..6b8f713abc0e2 100644 --- a/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.cu +++ b/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.cu @@ -10,7 +10,7 @@ #include // CMSSW headers -#include "EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToClusterGPUKernel.h" +#include "RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelRawToClusterGPUKernel.h" #include "HeterogeneousCore/CUDAUtilities/interface/cudaCheck.h" #include "RecoLocalTracker/SiPixelClusterizer/plugins/gpuClustering.h" #include "PixelRecHits.h" diff --git a/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.h b/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.h index 80a489929d0ea..8d0e7ae4cc055 100644 --- a/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.h +++ b/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.h @@ -1,7 +1,7 @@ #ifndef RecoLocalTracker_SiPixelRecHits_plugins_PixelRecHits_h #define RecoLocalTracker_SiPixelRecHits_plugins_PixelRecHits_h -#include "EventFilter/SiPixelRawToDigi/plugins/siPixelRawToClusterHeterogeneousProduct.h" +#include "RecoLocalTracker/SiPixelClusterizer/plugins/siPixelRawToClusterHeterogeneousProduct.h" #include "RecoLocalTracker/SiPixelClusterizer/plugins/gpuClusteringConstants.h" #include diff --git a/RecoLocalTracker/SiPixelRecHits/plugins/SiPixelRecHitHeterogeneous.cc b/RecoLocalTracker/SiPixelRecHits/plugins/SiPixelRecHitHeterogeneous.cc index 8bb8db024cb85..4e6b43044b920 100644 --- a/RecoLocalTracker/SiPixelRecHits/plugins/SiPixelRecHitHeterogeneous.cc +++ b/RecoLocalTracker/SiPixelRecHits/plugins/SiPixelRecHitHeterogeneous.cc @@ -19,7 +19,7 @@ #include "RecoLocalTracker/SiPixelRecHits/interface/PixelCPEFast.h" #include "RecoLocalTracker/Records/interface/TkPixelCPERecord.h" -#include "EventFilter/SiPixelRawToDigi/plugins/siPixelRawToClusterHeterogeneousProduct.h" // TODO: we need a proper place for this header... +#include "RecoLocalTracker/SiPixelClusterizer/plugins/siPixelRawToClusterHeterogeneousProduct.h" // TODO: we need a proper place for this header... #include "PixelRecHits.h" @@ -75,7 +75,7 @@ SiPixelRecHitHeterogeneous::SiPixelRecHitHeterogeneous(const edm::ParameterSet& void SiPixelRecHitHeterogeneous::fillDescriptions(edm::ConfigurationDescriptions& descriptions) { edm::ParameterSetDescription desc; - desc.add("heterogeneousSrc", edm::InputTag("siPixelDigisHeterogeneous")); + desc.add("heterogeneousSrc", edm::InputTag("siPixelClustersHeterogeneous")); desc.add("src", edm::InputTag("siPixelClusters")); desc.add("CPE", "PixelCPEFast"); @@ -150,12 +150,11 @@ void SiPixelRecHitHeterogeneous::acquireGPUCuda(const edm::HeterogeneousEvent& i if (!fcpe) { throw cms::Exception("Configuration") << "too bad, not a fast cpe gpu processing not possible...."; } - assert(fcpe->d_paramsOnGPU); edm::Handle hinput; iEvent.getByToken(token_, hinput); - gpuAlgo_->makeHitsAsync(*hinput, fcpe->d_paramsOnGPU, cudaStream); + gpuAlgo_->makeHitsAsync(*hinput, fcpe->getGPUProductAsync(cudaStream), cudaStream); } void SiPixelRecHitHeterogeneous::produceGPUCuda(edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup, cuda::stream_t<>& cudaStream) { diff --git a/RecoLocalTracker/SiPixelRecHits/src/PixelCPEFast.cc b/RecoLocalTracker/SiPixelRecHits/src/PixelCPEFast.cc index f40fb759b1557..e4f588aab14f9 100644 --- a/RecoLocalTracker/SiPixelRecHits/src/PixelCPEFast.cc +++ b/RecoLocalTracker/SiPixelRecHits/src/PixelCPEFast.cc @@ -18,6 +18,7 @@ #include #include "HeterogeneousCore/CUDAUtilities/interface/cudaCheck.h" +#include "HeterogeneousCore/CUDAServices/interface/numberOfCUDADevices.h" #include @@ -69,6 +70,20 @@ PixelCPEFast::PixelCPEFast(edm::ParameterSet const & conf, fillParamsForGpu(); } +const pixelCPEforGPU::ParamsOnGPU *PixelCPEFast::getGPUProductAsync(cuda::stream_t<>& cudaStream) const { + const auto& data = gpuData_.dataForCurrentDeviceAsync(cudaStream, [this](GPUData& data, cuda::stream_t<>& stream) { + // and now copy to device... + cudaCheck(cudaMalloc((void**) & data.h_paramsOnGPU.m_commonParams, sizeof(pixelCPEforGPU::CommonParams))); + cudaCheck(cudaMalloc((void**) & data.h_paramsOnGPU.m_detParams, this->m_detParamsGPU.size()*sizeof(pixelCPEforGPU::DetParams))); + cudaCheck(cudaMalloc((void**) & data.d_paramsOnGPU, sizeof(pixelCPEforGPU::ParamsOnGPU))); + + cudaCheck(cudaMemcpyAsync(data.d_paramsOnGPU, &data.h_paramsOnGPU, sizeof(pixelCPEforGPU::ParamsOnGPU), cudaMemcpyDefault, stream.id())); + cudaCheck(cudaMemcpyAsync(data.h_paramsOnGPU.m_commonParams, &this->m_commonParamsGPU, sizeof(pixelCPEforGPU::CommonParams), cudaMemcpyDefault, stream.id())); + cudaCheck(cudaMemcpyAsync(data.h_paramsOnGPU.m_detParams, this->m_detParamsGPU.data(), this->m_detParamsGPU.size()*sizeof(pixelCPEforGPU::DetParams), cudaMemcpyDefault, stream.id())); + }); + return data.d_paramsOnGPU; +} + void PixelCPEFast::fillParamsForGpu() { m_commonParamsGPU.theThicknessB = m_DetParams.front().theThickness; m_commonParamsGPU.theThicknessE = m_DetParams.back().theThickness; @@ -115,22 +130,16 @@ void PixelCPEFast::fillParamsForGpu() { auto rr = pixelCPEforGPU::Rotation(p.theDet->surface().rotation()); g.frame = pixelCPEforGPU::Frame(vv.x(),vv.y(),vv.z(),rr); } - - // and now copy to device... - cudaCheck(cudaMalloc((void**) & h_paramsOnGPU.m_commonParams, sizeof(pixelCPEforGPU::CommonParams))); - cudaCheck(cudaMalloc((void**) & h_paramsOnGPU.m_detParams, m_detParamsGPU.size()*sizeof(pixelCPEforGPU::DetParams))); - cudaCheck(cudaMalloc((void**) & d_paramsOnGPU, sizeof(pixelCPEforGPU::ParamsOnGPU))); - - cudaCheck(cudaMemcpy(d_paramsOnGPU, &h_paramsOnGPU, sizeof(pixelCPEforGPU::ParamsOnGPU), cudaMemcpyDefault)); - cudaCheck(cudaMemcpy(h_paramsOnGPU.m_commonParams, &m_commonParamsGPU, sizeof(pixelCPEforGPU::CommonParams), cudaMemcpyDefault)); - cudaCheck(cudaMemcpy(h_paramsOnGPU.m_detParams, m_detParamsGPU.data(), m_detParamsGPU.size()*sizeof(pixelCPEforGPU::DetParams), cudaMemcpyDefault)); - cudaDeviceSynchronize(); } -PixelCPEFast::~PixelCPEFast() { - cudaFree(h_paramsOnGPU.m_commonParams); - cudaFree(h_paramsOnGPU.m_detParams); - cudaFree(d_paramsOnGPU); +PixelCPEFast::~PixelCPEFast() {} + +PixelCPEFast::GPUData::~GPUData() { + if(d_paramsOnGPU != nullptr) { + cudaFree(h_paramsOnGPU.m_commonParams); + cudaFree(h_paramsOnGPU.m_detParams); + cudaFree(d_paramsOnGPU); + } } PixelCPEBase::ClusterParam* PixelCPEFast::createClusterParam(const SiPixelCluster & cl) const From a88131ce93b95ac319b7fb75a87a2307b7832ea1 Mon Sep 17 00:00:00 2001 From: Matti Kortelainen Date: Thu, 14 Jun 2018 16:35:26 +0200 Subject: [PATCH 62/88] Add numberOfStreamsPerDevice configuration parameter to CUDAService (#78) And, migrate the `CUDAService` test to use `catch2`. --- HeterogeneousCore/CUDACore/src/GPUCuda.cc | 2 +- .../CUDAServices/interface/CUDAService.h | 7 + .../CUDAServices/src/CUDAService.cc | 7 + .../CUDAServices/test/BuildFile.xml | 3 +- .../CUDAServices/test/testCUDAService.cpp | 224 +++++++++--------- .../CUDAServices/test/test_main.cc | 2 + .../CUDAServices/test/test_main.cpp | 2 + .../Producer/test/testGPU_cfg.py | 5 +- 8 files changed, 135 insertions(+), 117 deletions(-) create mode 100644 HeterogeneousCore/CUDAServices/test/test_main.cc create mode 100644 HeterogeneousCore/CUDAServices/test/test_main.cpp diff --git a/HeterogeneousCore/CUDACore/src/GPUCuda.cc b/HeterogeneousCore/CUDACore/src/GPUCuda.cc index 81e0a66f375e2..958abf619b2ce 100644 --- a/HeterogeneousCore/CUDACore/src/GPUCuda.cc +++ b/HeterogeneousCore/CUDACore/src/GPUCuda.cc @@ -26,7 +26,7 @@ namespace heterogeneous { void GPUCuda::call_beginStreamGPUCuda(edm::StreamID id) { edm::Service cudaService; - enabled_ = (enabled_ && cudaService->enabled()); + enabled_ = (enabled_ && cudaService->enabled(id)); if(!enabled_) { if(forced_) { throw cms::Exception("LogicError") << "This module was forced to run on GPUCuda, but the device is not available."; diff --git a/HeterogeneousCore/CUDAServices/interface/CUDAService.h b/HeterogeneousCore/CUDAServices/interface/CUDAService.h index 979bdba828f64..19cbc6447eb55 100644 --- a/HeterogeneousCore/CUDAServices/interface/CUDAService.h +++ b/HeterogeneousCore/CUDAServices/interface/CUDAService.h @@ -1,6 +1,8 @@ #ifndef HeterogeneousCore_CUDAServices_CUDAService_h #define HeterogeneousCore_CUDAServices_CUDAService_h +#include "FWCore/Utilities/interface/StreamID.h" + #include #include @@ -24,7 +26,11 @@ class CUDAService { static void fillDescriptions(edm::ConfigurationDescriptions & descriptions); + // To be used in global context when an edm::Stream is not available bool enabled() const { return enabled_; } + // To be used in stream context when an edm::Stream is available + bool enabled(edm::StreamID streamId) const { return enabled(static_cast(streamId)); } + bool enabled(unsigned int streamId) const { return enabled_ && (numberOfStreamsTotal_ == 0 || streamId < numberOfStreamsTotal_); } // to make testing easier int numberOfDevices() const { return numberOfDevices_; } @@ -42,6 +48,7 @@ class CUDAService { private: int numberOfDevices_ = 0; + unsigned int numberOfStreamsTotal_ = 0; std::vector > computeCapabilities_; bool enabled_ = false; }; diff --git a/HeterogeneousCore/CUDAServices/src/CUDAService.cc b/HeterogeneousCore/CUDAServices/src/CUDAService.cc index 3d1da6702392a..d520567cc4770 100644 --- a/HeterogeneousCore/CUDAServices/src/CUDAService.cc +++ b/HeterogeneousCore/CUDAServices/src/CUDAService.cc @@ -36,6 +36,12 @@ CUDAService::CUDAService(edm::ParameterSet const& iConfig, edm::ActivityRegistry return; } + auto numberOfStreamsPerDevice = iConfig.getUntrackedParameter("numberOfStreamsPerDevice"); + if(numberOfStreamsPerDevice > 0) { + numberOfStreamsTotal_ = numberOfStreamsPerDevice * numberOfDevices_; + edm::LogSystem("CUDAService") << "Number of edm::Streams per CUDA device has been set to " << numberOfStreamsPerDevice << ". With " << numberOfDevices_ << " CUDA devices, this means total of " << numberOfStreamsTotal_ << " edm::Streams for all CUDA devices."; // TODO: eventually silence to LogDebug + } + computeCapabilities_.reserve(numberOfDevices_); for(int i=0; i("enabled", true); + desc.addUntracked("numberOfStreamsPerDevice", 0)->setComment("Upper limit of the number of edm::Streams that will run on a single CUDA GPU device. The remaining edm::Streams will be run only on other devices (for time being this means CPU in practice). The value '0' means 'unlimited', a value >= 1 imposes the limit."); descriptions.add("CUDAService", desc); } diff --git a/HeterogeneousCore/CUDAServices/test/BuildFile.xml b/HeterogeneousCore/CUDAServices/test/BuildFile.xml index 6d9b0c11cbc29..b788d5c5c4028 100644 --- a/HeterogeneousCore/CUDAServices/test/BuildFile.xml +++ b/HeterogeneousCore/CUDAServices/test/BuildFile.xml @@ -1,6 +1,7 @@ - + + diff --git a/HeterogeneousCore/CUDAServices/test/testCUDAService.cpp b/HeterogeneousCore/CUDAServices/test/testCUDAService.cpp index 0deb91bdb3f3d..f80f2410afa7f 100644 --- a/HeterogeneousCore/CUDAServices/test/testCUDAService.cpp +++ b/HeterogeneousCore/CUDAServices/test/testCUDAService.cpp @@ -1,168 +1,164 @@ #include #include +#include #include #include #include +#include "catch.hpp" + #include "FWCore/ParameterSet/interface/ParameterSet.h" #include "FWCore/ServiceRegistry/interface/ActivityRegistry.h" #include "FWCore/Utilities/interface/Exception.h" #include "HeterogeneousCore/CUDAServices/interface/CUDAService.h" -int main() -{ - int rc = -1; - try - { - edm::ActivityRegistry ar; - - // Test setup: check if a simple CUDA runtime API call fails: - // if so, skip the test with the CUDAService enabled - int deviceCount = 0; - bool configEnabled( true ); - auto ret = cudaGetDeviceCount( &deviceCount ); - - // Enable the service only if there are CUDA capable GPUs installed - if( ret != cudaSuccess ) - { - std::cout << "=== Tests #1-2: SKIPPED. Unable to query the CUDA capable devices from the CUDA runtime API: (" - << ret << ") " << cudaGetErrorString( ret ) - << ". Is the host equipped with CUDA capable GPUs? ===" << std::endl; - } else - { - std::cout << "=== Test #1: CUDAService enabled only if there are CUDA capable GPUs installed. ===" << std::endl; - // Now all runtime API calls should work: - // a CUDA error marks the test as failed. - deviceCount = 0; - ret = cudaGetDeviceCount( &deviceCount ); - if( ret != cudaSuccess ) - { - std::ostringstream errstr; - errstr << "Unable to query the CUDA capable devices from the CUDA runtime API: (" - << ret << ") " << cudaGetErrorString( ret ); - throw cms::Exception( "CUDAService", errstr.str() ); +TEST_CASE("Tests of CUDAService", "[CUDAService]") { + edm::ActivityRegistry ar; + + // Test setup: check if a simple CUDA runtime API call fails: + // if so, skip the test with the CUDAService enabled + int deviceCount = 0; + auto ret = cudaGetDeviceCount( &deviceCount ); + + if( ret != cudaSuccess ) { + WARN("Unable to query the CUDA capable devices from the CUDA runtime API: (" + << ret << ") " << cudaGetErrorString( ret ) + << ". Running only tests not requiring devices."); + } + + SECTION("CUDAService enabled") { + edm::ParameterSet ps; + ps.addUntrackedParameter("enabled", true); + ps.addUntrackedParameter("numberOfStreamsPerDevice", 0U); + SECTION("Enabled only if there are CUDA capable GPUs") { + CUDAService cs(ps, ar); + if(deviceCount <= 0) { + REQUIRE(cs.enabled() == false); + WARN("CUDAService is disabled as there are no CUDA GPU devices"); + } + else { + REQUIRE(cs.enabled() == true); + INFO("CUDAService is enabled"); } + } - // No need to skip the test if no CUDA capable devices are seen by the runtime API: - // in that case, cudaGetDeviceCount returns error code cudaErrorNoDevice. - configEnabled = bool( deviceCount ); - edm::ParameterSet ps; - ps.addUntrackedParameter( "enabled", configEnabled ); - CUDAService cs( ps, ar ); + if(deviceCount <= 0) { + return; + } - // Test that the service is enabled - assert( cs.enabled() == configEnabled ); - std::cout << "The CUDAService is enabled." << std::endl; + CUDAService cs(ps, ar); - // At this point, we can get, as info, the driver and runtime versions. + SECTION("CUDA Queries") { int driverVersion = 0, runtimeVersion = 0; ret = cudaDriverGetVersion( &driverVersion ); - if( ret != cudaSuccess ) - { - std::ostringstream errstr; - errstr << "Unable to query the CUDA driver version from the CUDA runtime API: (" - << ret << ") " << cudaGetErrorString( ret ); - throw cms::Exception( "CUDAService", errstr.str() ); + if( ret != cudaSuccess ) { + FAIL("Unable to query the CUDA driver version from the CUDA runtime API: (" + << ret << ") " << cudaGetErrorString( ret )); } ret = cudaRuntimeGetVersion( &runtimeVersion ); - if( ret != cudaSuccess ) - { - std::ostringstream errstr; - errstr << "Unable to query the CUDA runtime API version: (" - << ret << ") " << cudaGetErrorString( ret ); - throw cms::Exception( "CUDAService", errstr.str() ); + if( ret != cudaSuccess ) { + FAIL("Unable to query the CUDA runtime API version: (" + << ret << ") " << cudaGetErrorString( ret )); } - std::cout << "CUDA Driver Version / Runtime Version: " << driverVersion/1000 << "." << (driverVersion%100)/10 - << " / " << runtimeVersion/1000 << "." << (runtimeVersion%100)/10 << std::endl; + WARN("CUDA Driver Version / Runtime Version: " << driverVersion/1000 << "." << (driverVersion%100)/10 + << " / " << runtimeVersion/1000 << "." << (runtimeVersion%100)/10); // Test that the number of devices found by the service // is the same as detected by the CUDA runtime API - assert( cs.numberOfDevices() == deviceCount ); - std::cout << "Detected " << cs.numberOfDevices() << " CUDA Capable device(s)" << std::endl; + REQUIRE( cs.numberOfDevices() == deviceCount ); + WARN("Detected " << cs.numberOfDevices() << " CUDA Capable device(s)"); // Test that the compute capabilities of each device // are the same as detected by the CUDA runtime API - for( int i=0; i mem) { mem = free; dev = i; } } - std::cout << "Device with most free memory " << dev << std::endl; - std::cout << " as given by CUDAService " << cs.deviceWithMostFreeMemory() << std::endl; - std::cout << "=== END Test #2. ===\n" << std::endl; + WARN("Device with most free memory " << dev << "\n" + << " as given by CUDAService " << cs.deviceWithMostFreeMemory()); + } - // Test setting the current device - std::cout << "=== Test #3: CUDAService set/get device ===" << std::endl; + SECTION("CUDAService set/get the current device") { for(int i=0; i::max()) == true); + } - // Now forcing the service to be disabled... - std::cout << "=== Test #4: CUDAService forced to be disabled. ===" << std::endl; - edm::ParameterSet psf; - configEnabled = false; - psf.addUntrackedParameter( "enabled", configEnabled ); - CUDAService csf( psf, ar ); - std::cout << "CUDAService disabled by configuration." << std::endl; + SECTION("Limit to 1") { + ps.addUntrackedParameter("numberOfStreamsPerDevice", 1U); + CUDAService cs(ps, ar); + REQUIRE(cs.enabled() == true); + REQUIRE(cs.enabled(0) == true); + REQUIRE(cs.enabled(1*deviceCount-1) == true); + REQUIRE(cs.enabled(1*deviceCount) == false); + REQUIRE(cs.enabled(1*deviceCount+1) == false); + } - // Test that the service is actually disabled - assert( csf.enabled() == configEnabled ); - assert( csf.numberOfDevices() == 0 ); - std::cout << "=== END Test #4. ===\n" << std::endl; + SECTION("Limit to 2") { + ps.addUntrackedParameter("numberOfStreamsPerDevice", 2U); + CUDAService cs(ps, ar); + REQUIRE(cs.enabled() == true); + REQUIRE(cs.enabled(0) == true); + REQUIRE(cs.enabled(1*deviceCount) == true); + REQUIRE(cs.enabled(2*deviceCount-1) == true); + REQUIRE(cs.enabled(2*deviceCount) == false); + } - //Fake the end-of-job signal. - ar.postEndJobSignal_(); - rc = 0; - } - catch( cms::Exception & exc ) - { - std::cerr << "*** CMS Exception caught. ***" << std::endl; - std::cerr << exc << std::endl; - rc = 1; } - catch( ... ) - { - std::cerr << "Unknown exception caught." << std::endl; - rc = 2; - } - return rc; + + //Fake the end-of-job signal. + ar.postEndJobSignal_(); } diff --git a/HeterogeneousCore/CUDAServices/test/test_main.cc b/HeterogeneousCore/CUDAServices/test/test_main.cc new file mode 100644 index 0000000000000..0c7c351f437f5 --- /dev/null +++ b/HeterogeneousCore/CUDAServices/test/test_main.cc @@ -0,0 +1,2 @@ +#define CATCH_CONFIG_MAIN +#include "catch.hpp" diff --git a/HeterogeneousCore/CUDAServices/test/test_main.cpp b/HeterogeneousCore/CUDAServices/test/test_main.cpp new file mode 100644 index 0000000000000..0c7c351f437f5 --- /dev/null +++ b/HeterogeneousCore/CUDAServices/test/test_main.cpp @@ -0,0 +1,2 @@ +#define CATCH_CONFIG_MAIN +#include "catch.hpp" diff --git a/HeterogeneousCore/Producer/test/testGPU_cfg.py b/HeterogeneousCore/Producer/test/testGPU_cfg.py index 73042fc799d05..b8ce382339fbe 100644 --- a/HeterogeneousCore/Producer/test/testGPU_cfg.py +++ b/HeterogeneousCore/Producer/test/testGPU_cfg.py @@ -15,7 +15,7 @@ from HeterogeneousCore.Producer.testHeterogeneousEDProducerGPU_cfi import testHeterogeneousEDProducerGPU as prod #process.Tracer = cms.Service("Tracer") -process.CUDAService = cms.Service("CUDAService") +process.load("HeterogeneousCore.CUDAServices.CUDAService_cfi") process.prod1 = prod.clone() process.prod2 = prod.clone(src = "prod1") process.prod3 = prod.clone(src = "prod1") @@ -30,3 +30,6 @@ # Example of disabling CUDA device type for one module via configuration #process.prod4.heterogeneousEnabled_.GPUCuda = False + +# Example of limiting the number of EDM streams per device +#process.CUDAService.numberOfStreamsPerDevice = 1 From 4f8add081349f62090540b49bc1f9e6feeb6e96b Mon Sep 17 00:00:00 2001 From: Felice Date: Thu, 14 Jun 2018 16:06:08 +0200 Subject: [PATCH 63/88] Update the interface of GPU::SimpleVector and add GPU::VecArray --- .../CUDAUtilities/interface/GPUSimpleVector.h | 9 +- .../CUDAUtilities/interface/GPUVecArray.h | 104 ++++++++++++++++++ 2 files changed, 108 insertions(+), 5 deletions(-) create mode 100644 HeterogeneousCore/CUDAUtilities/interface/GPUVecArray.h diff --git a/HeterogeneousCore/CUDAUtilities/interface/GPUSimpleVector.h b/HeterogeneousCore/CUDAUtilities/interface/GPUSimpleVector.h index ad1aa12332ae2..fe38b20784e67 100644 --- a/HeterogeneousCore/CUDAUtilities/interface/GPUSimpleVector.h +++ b/HeterogeneousCore/CUDAUtilities/interface/GPUSimpleVector.h @@ -74,8 +74,8 @@ template struct SimpleVector { } #endif - __inline__ constexpr T& operator[](int i) const { return m_data[i]; } - + __inline__ constexpr T& operator[](int i) { return m_data[i]; } + __inline__ constexpr const T& operator[](int i) const { return m_data[i]; } __inline__ constexpr void reset() { m_size = 0; } __inline__ constexpr int size() const { return m_size; } @@ -83,9 +83,9 @@ template struct SimpleVector { __inline__ constexpr int capacity() const { return m_capacity; } __inline__ constexpr T *data() const { return m_data; } - + __inline__ constexpr void resize(int size) { m_size = size; } - + __inline__ constexpr void set_data(T * data) { m_data = data; } @@ -98,4 +98,3 @@ template struct SimpleVector { } // namespace GPU #endif // HeterogeneousCore_CUDAUtilities_GPUSimpleVector_h - diff --git a/HeterogeneousCore/CUDAUtilities/interface/GPUVecArray.h b/HeterogeneousCore/CUDAUtilities/interface/GPUVecArray.h new file mode 100644 index 0000000000000..601eb6db0305a --- /dev/null +++ b/HeterogeneousCore/CUDAUtilities/interface/GPUVecArray.h @@ -0,0 +1,104 @@ +// +// Author: Felice Pantaleo, CERN +// + +#ifndef GPU_VECARRAY_H_ +#define GPU_VECARRAY_H_ + + +#include +#include + +namespace GPU { + +template struct VecArray { + __inline__ constexpr int push_back_unsafe(const T &element) { + auto previousSize = m_size; + m_size++; + if (previousSize < maxSize) { + m_data[previousSize] = element; + return previousSize; + } else { + --m_size; + return -1; + } + } + + + + template constexpr int emplace_back_unsafe(Ts &&... args) { + auto previousSize = m_size; + m_size++; + if (previousSize < maxSize) { + (new (&m_data[previousSize]) T(std::forward(args)...)); + return previousSize; + } else { + --m_size; + return -1; + } + } + + + __inline__ constexpr T & back() const { + + if (m_size > 0) { + return m_data[m_size - 1]; + } else + return T(); //undefined behaviour + } + + + #if defined(__NVCC__) || defined(__CUDACC__) + // thread-safe version of the vector, when used in a CUDA kernel + __device__ int push_back(const T &element) { + auto previousSize = atomicAdd(&m_size, 1); + if (previousSize < maxSize) { + m_data[previousSize] = element; + return previousSize; + } else { + atomicSub(&m_size, 1); + return -1; + } + } + + template __device__ int emplace_back(Ts &&... args) { + auto previousSize = atomicAdd(&m_size, 1); + if (previousSize < maxSize) { + (new (&m_data[previousSize]) T(std::forward(args)...)); + return previousSize; + } else { + atomicSub(&m_size, 1); + return -1; + } + } + #endif + + __inline__ __host__ __device__ T pop_back() { + if (m_size > 0) { + auto previousSize = m_size--; + return m_data[previousSize - 1]; + } else + return T(); + } + + __inline__ constexpr int size() const { return m_size; } + + __inline__ constexpr T& operator[](int i) { return m_data[i]; } + + __inline__ constexpr const T& operator[](int i) const { return m_data[i]; } + + __inline__ constexpr void reset() { m_size = 0; } + + __inline__ constexpr int capacity() const { return maxSize; } + + __inline__ constexpr T *data() const { return m_data; } + + __inline__ constexpr void resize(int size) { m_size = size; } + + + int m_size; + + T m_data[maxSize]; +}; +} +#endif From 96559f3f9ce8d05cae0996949fe379d758108ea6 Mon Sep 17 00:00:00 2001 From: Felice Date: Thu, 14 Jun 2018 19:08:28 +0200 Subject: [PATCH 64/88] Heterogeneous Cellular Automaton for pixel tracks Port the Cellular Automaton (back) to GPUs and CUDA, using the `HeterogeneousEDProducer` approach: - do memory allocations in the framework begin stream - run the memory copies and kernels asynchronously, in a dedicated CUDA stream per framework stream Use the new GPU::VecArray for holding repeated data structures. By default, run on the GPU in all gpu-enable workflows (e.g. 10824.8). --- .../PixelTriplets/plugins/BuildFile.xml | 12 +- .../PixelTriplets/plugins/CAGraph.h | 77 ++- .../plugins/CAHitNtupletEDProducerT.cc | 4 +- .../CAHitNtupletHeterogeneousEDProducer.cc | 205 +++++++ .../plugins/CAHitQuadrupletGenerator.h | 2 +- .../plugins/CAHitQuadrupletGeneratorGPU.cc | 449 +++++++++++++++ .../plugins/CAHitQuadrupletGeneratorGPU.cu | 513 ++++++++++++++++++ .../plugins/CAHitQuadrupletGeneratorGPU.h | 194 +++++++ .../plugins/CellularAutomaton.cc | 460 ++++++++-------- .../PixelTriplets/plugins/GPUCACell.h | 273 ++++++++++ .../plugins/GPUHitsAndDoublets.h | 44 ++ .../python/caHitQuadrupletEDProducer_cfi.py | 8 + 12 files changed, 1945 insertions(+), 296 deletions(-) create mode 100644 RecoPixelVertexing/PixelTriplets/plugins/CAHitNtupletHeterogeneousEDProducer.cc create mode 100644 RecoPixelVertexing/PixelTriplets/plugins/CAHitQuadrupletGeneratorGPU.cc create mode 100644 RecoPixelVertexing/PixelTriplets/plugins/CAHitQuadrupletGeneratorGPU.cu create mode 100644 RecoPixelVertexing/PixelTriplets/plugins/CAHitQuadrupletGeneratorGPU.h create mode 100644 RecoPixelVertexing/PixelTriplets/plugins/GPUCACell.h create mode 100644 RecoPixelVertexing/PixelTriplets/plugins/GPUHitsAndDoublets.h create mode 100644 RecoPixelVertexing/PixelTriplets/python/caHitQuadrupletEDProducer_cfi.py diff --git a/RecoPixelVertexing/PixelTriplets/plugins/BuildFile.xml b/RecoPixelVertexing/PixelTriplets/plugins/BuildFile.xml index 9004ef16202ad..b0bca04309c4c 100644 --- a/RecoPixelVertexing/PixelTriplets/plugins/BuildFile.xml +++ b/RecoPixelVertexing/PixelTriplets/plugins/BuildFile.xml @@ -2,8 +2,16 @@ - + + + + + + + + + + - diff --git a/RecoPixelVertexing/PixelTriplets/plugins/CAGraph.h b/RecoPixelVertexing/PixelTriplets/plugins/CAGraph.h index 09658241d0f60..4624c31b5b052 100644 --- a/RecoPixelVertexing/PixelTriplets/plugins/CAGraph.h +++ b/RecoPixelVertexing/PixelTriplets/plugins/CAGraph.h @@ -1,68 +1,55 @@ #ifndef RECOPIXELVERTEXING_PIXELTRIPLETS_CAGRAPH_H_ #define RECOPIXELVERTEXING_PIXELTRIPLETS_CAGRAPH_H_ -#include #include #include +#include -struct CALayer -{ - CALayer(const std::string& layerName, std::size_t numberOfHits ) - : theName(layerName) - { - isOuterHitOfCell.resize(numberOfHits); - } - - bool operator==(const std::string& otherString) - { - return otherString == theName; - } +struct CALayer { + CALayer(const std::string &layerName, std::size_t numberOfHits) + : theName(layerName) { + isOuterHitOfCell.resize(numberOfHits); + } - std::string name() const - { - return theName; - } + bool operator==(const std::string &otherString) { + return otherString == theName; + } - std::vector theOuterLayerPairs; - std::vector theInnerLayerPairs; + const std::string& name() const { return theName; } - std::vector theOuterLayers; - std::vector theInnerLayers; - std::vector< std::vector > isOuterHitOfCell; + std::vector theOuterLayerPairs; + std::vector theInnerLayerPairs; + std::vector theOuterLayers; + std::vector theInnerLayers; + std::vector> isOuterHitOfCell; private: - - std::string theName; + std::string theName; }; -struct CALayerPair -{ - - CALayerPair(int a, int b) - - { - theLayers[0] = a; - theLayers[1] = b; - } +struct CALayerPair { + CALayerPair(int a, int b) + { + theLayers[0] = a; + theLayers[1] = b; + } - bool operator==(const CALayerPair& otherLayerPair) - { - return (theLayers[0] == otherLayerPair.theLayers[0]) - && (theLayers[1] == otherLayerPair.theLayers[1]); - } + bool operator==(const CALayerPair &otherLayerPair) { + return (theLayers[0] == otherLayerPair.theLayers[0]) && + (theLayers[1] == otherLayerPair.theLayers[1]); + } - std::array theLayers; - std::array theFoundCells= {{0,0}}; + std::array theLayers; + std::array theFoundCells = {{0, 0}}; }; -struct CAGraph -{ - std::vector theLayers; - std::vector theLayerPairs; - std::vector theRootLayers; +struct CAGraph { + std::vector theLayers; + std::vector theLayerPairs; + std::vector theRootLayers; }; #endif /* CAGRAPH_H_ */ diff --git a/RecoPixelVertexing/PixelTriplets/plugins/CAHitNtupletEDProducerT.cc b/RecoPixelVertexing/PixelTriplets/plugins/CAHitNtupletEDProducerT.cc index eed696bb56c15..9b26e30ebb125 100644 --- a/RecoPixelVertexing/PixelTriplets/plugins/CAHitNtupletEDProducerT.cc +++ b/RecoPixelVertexing/PixelTriplets/plugins/CAHitNtupletEDProducerT.cc @@ -80,8 +80,8 @@ void CAHitNtupletEDProducerT::produce(edm::Event& iEvent, const edm LogDebug("CAHitNtupletEDProducer") << "Creating ntuplets for " << regionDoublets.regionSize() << " regions, and " << regionDoublets.layerPairsSize() << " layer pairs"; std::vector ntuplets; ntuplets.resize(regionDoublets.regionSize()); - for(auto& ntuplet : ntuplets) ntuplet.reserve(localRA_.upper()); - + for(auto& ntuplet : ntuplets) ntuplet.reserve(localRA_.upper()); + generator_.hitNtuplets(regionDoublets, ntuplets, iSetup, seedingLayerHits); int index = 0; for(const auto& regionLayerPairs: regionDoublets) { diff --git a/RecoPixelVertexing/PixelTriplets/plugins/CAHitNtupletHeterogeneousEDProducer.cc b/RecoPixelVertexing/PixelTriplets/plugins/CAHitNtupletHeterogeneousEDProducer.cc new file mode 100644 index 0000000000000..3c199f8d011b0 --- /dev/null +++ b/RecoPixelVertexing/PixelTriplets/plugins/CAHitNtupletHeterogeneousEDProducer.cc @@ -0,0 +1,205 @@ +#include "DataFormats/Common/interface/Handle.h" +#include "FWCore/Framework/interface/ConsumesCollector.h" +#include "FWCore/Framework/interface/Event.h" +#include "FWCore/Framework/interface/MakerMacros.h" +#include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h" +#include "FWCore/ParameterSet/interface/ParameterSet.h" +#include "FWCore/ParameterSet/interface/ParameterSetDescription.h" +#include "FWCore/PluginManager/interface/ModuleDef.h" +#include "FWCore/Utilities/interface/EDGetToken.h" +#include "FWCore/Utilities/interface/RunningAverage.h" +#include "HeterogeneousCore/CUDACore/interface/GPUCuda.h" +#include "HeterogeneousCore/CUDAServices/interface/CUDAService.h" +#include "HeterogeneousCore/Producer/interface/HeterogeneousEDProducer.h" + +#include "CAHitQuadrupletGenerator.h" +#include "CAHitQuadrupletGeneratorGPU.h" +#include "RecoPixelVertexing/PixelTriplets/interface/OrderedHitSeeds.h" +#include "RecoTracker/TkHitPairs/interface/IntermediateHitDoublets.h" +#include "RecoTracker/TkHitPairs/interface/RegionsSeedingHitSets.h" + +namespace { +void fillNtuplets(RegionsSeedingHitSets::RegionFiller &seedingHitSetsFiller, + const OrderedHitSeeds &quadruplets) { + for (const auto &quad : quadruplets) { + seedingHitSetsFiller.emplace_back(quad[0], quad[1], quad[2], quad[3]); + } +} +} // namespace + +class CAHitNtupletHeterogeneousEDProducer + : public HeterogeneousEDProducer> { +public: + CAHitNtupletHeterogeneousEDProducer(const edm::ParameterSet &iConfig); + ~CAHitNtupletHeterogeneousEDProducer() = default; + + static void fillDescriptions(edm::ConfigurationDescriptions &descriptions); + void beginStreamGPUCuda(edm::StreamID streamId, + cuda::stream_t<> &cudaStream) override; + + void acquireGPUCuda(const edm::HeterogeneousEvent &iEvent, + const edm::EventSetup &iSetup, + cuda::stream_t<> &cudaStream) override; + void produceGPUCuda(edm::HeterogeneousEvent &iEvent, + const edm::EventSetup &iSetup, + cuda::stream_t<> &cudaStream) override; + void produceCPU(edm::HeterogeneousEvent &iEvent, + const edm::EventSetup &iSetup) override; + +private: + edm::EDGetTokenT doubletToken_; + + edm::RunningAverage localRA_; + CAHitQuadrupletGeneratorGPU GPUGenerator_; + CAHitQuadrupletGenerator CPUGenerator_; + + bool emptyRegionDoublets = false; + std::unique_ptr seedingHitSets_; + std::vector ntuplets_; +}; + +CAHitNtupletHeterogeneousEDProducer::CAHitNtupletHeterogeneousEDProducer( + const edm::ParameterSet &iConfig) + : HeterogeneousEDProducer(iConfig), + doubletToken_(consumes( + iConfig.getParameter("doublets"))), + GPUGenerator_(iConfig, consumesCollector()), + CPUGenerator_(iConfig, consumesCollector()) { + produces(); +} + +void CAHitNtupletHeterogeneousEDProducer::fillDescriptions( + edm::ConfigurationDescriptions &descriptions) { + edm::ParameterSetDescription desc; + + desc.add("doublets", edm::InputTag("hitPairEDProducer")); + CAHitQuadrupletGeneratorGPU::fillDescriptions(desc); + HeterogeneousEDProducer::fillPSetDescription(desc); + auto label = "caHitQuadrupletHeterogeneousEDProducer"; + descriptions.add(label, desc); +} + +void CAHitNtupletHeterogeneousEDProducer::beginStreamGPUCuda( + edm::StreamID streamId, cuda::stream_t<> &cudaStream) { + GPUGenerator_.allocateOnGPU(); +} + +void CAHitNtupletHeterogeneousEDProducer::acquireGPUCuda( + const edm::HeterogeneousEvent &iEvent, const edm::EventSetup &iSetup, + cuda::stream_t<> &cudaStream) { + edm::Handle hdoublets; + iEvent.event().getByToken(doubletToken_, hdoublets); + const auto ®ionDoublets = *hdoublets; + + const SeedingLayerSetsHits &seedingLayerHits = + regionDoublets.seedingLayerHits(); + if (seedingLayerHits.numberOfLayersInSet() < + CAHitQuadrupletGeneratorGPU::minLayers) { + throw cms::Exception("LogicError") + << "CAHitNtupletHeterogeneousEDProducer expects " + "SeedingLayerSetsHits::numberOfLayersInSet() to be >= " + << CAHitQuadrupletGeneratorGPU::minLayers << ", got " + << seedingLayerHits.numberOfLayersInSet() + << ". This is likely caused by a configuration error of this module, " + "HitPairEDProducer, or SeedingLayersEDProducer."; + } + + seedingHitSets_ = std::make_unique(); + + if (regionDoublets.empty()) { + emptyRegionDoublets = true; + } else { + seedingHitSets_->reserve(regionDoublets.regionSize(), localRA_.upper()); + GPUGenerator_.initEvent(iEvent.event(), iSetup); + + LogDebug("CAHitNtupletHeterogeneousEDProducer") + << "Creating ntuplets_ for " << regionDoublets.regionSize() + << " regions, and " << regionDoublets.layerPairsSize() + << " layer pairs"; + ntuplets_.clear(); + ntuplets_.resize(regionDoublets.regionSize()); + for (auto &ntuplet : ntuplets_) + ntuplet.reserve(localRA_.upper()); + + GPUGenerator_.hitNtuplets(regionDoublets, ntuplets_, iSetup, + seedingLayerHits, cudaStream.id()); + } +} + +void CAHitNtupletHeterogeneousEDProducer::produceGPUCuda( + edm::HeterogeneousEvent &iEvent, const edm::EventSetup &iSetup, + cuda::stream_t<> &cudaStream) { + + if (!emptyRegionDoublets) { + edm::Handle hdoublets; + iEvent.getByToken(doubletToken_, hdoublets); + const auto ®ionDoublets = *hdoublets; + const SeedingLayerSetsHits &seedingLayerHits = + regionDoublets.seedingLayerHits(); + int index = 0; + for (const auto ®ionLayerPairs : regionDoublets) { + const TrackingRegion ®ion = regionLayerPairs.region(); + auto seedingHitSetsFiller = seedingHitSets_->beginRegion(®ion); + GPUGenerator_.fillResults(regionDoublets, ntuplets_, iSetup, + seedingLayerHits, cudaStream.id()); + fillNtuplets(seedingHitSetsFiller, ntuplets_[index]); + ntuplets_[index].clear(); + index++; + } + localRA_.update(seedingHitSets_->size()); + } + iEvent.put(std::move(seedingHitSets_)); +} + +void CAHitNtupletHeterogeneousEDProducer::produceCPU( + edm::HeterogeneousEvent &iEvent, const edm::EventSetup &iSetup) { + edm::Handle hdoublets; + iEvent.getByToken(doubletToken_, hdoublets); + const auto ®ionDoublets = *hdoublets; + + const SeedingLayerSetsHits &seedingLayerHits = + regionDoublets.seedingLayerHits(); + if (seedingLayerHits.numberOfLayersInSet() < + CAHitQuadrupletGenerator::minLayers) { + throw cms::Exception("LogicError") + << "CAHitNtupletEDProducer expects " + "SeedingLayerSetsHits::numberOfLayersInSet() to be >= " + << CAHitQuadrupletGenerator::minLayers << ", got " + << seedingLayerHits.numberOfLayersInSet() + << ". This is likely caused by a configuration error of this module, " + "HitPairEDProducer, or SeedingLayersEDProducer."; + } + + auto seedingHitSets = std::make_unique(); + if (regionDoublets.empty()) { + iEvent.put(std::move(seedingHitSets)); + return; + } + seedingHitSets->reserve(regionDoublets.regionSize(), localRA_.upper()); + CPUGenerator_.initEvent(iEvent.event(), iSetup); + + LogDebug("CAHitNtupletEDProducer") + << "Creating ntuplets_ for " << regionDoublets.regionSize() + << " regions, and " << regionDoublets.layerPairsSize() << " layer pairs"; + std::vector ntuplets_; + ntuplets_.resize(regionDoublets.regionSize()); + for (auto &ntuplet : ntuplets_) + ntuplet.reserve(localRA_.upper()); + + CPUGenerator_.hitNtuplets(regionDoublets, ntuplets_, iSetup, seedingLayerHits); + int index = 0; + for (const auto ®ionLayerPairs : regionDoublets) { + const TrackingRegion ®ion = regionLayerPairs.region(); + auto seedingHitSetsFiller = seedingHitSets->beginRegion(®ion); + + fillNtuplets(seedingHitSetsFiller, ntuplets_[index]); + ntuplets_[index].clear(); + index++; + } + localRA_.update(seedingHitSets->size()); + + iEvent.put(std::move(seedingHitSets)); +} + +DEFINE_FWK_MODULE(CAHitNtupletHeterogeneousEDProducer); diff --git a/RecoPixelVertexing/PixelTriplets/plugins/CAHitQuadrupletGenerator.h b/RecoPixelVertexing/PixelTriplets/plugins/CAHitQuadrupletGenerator.h index b27d83d61188d..a0629332c575d 100644 --- a/RecoPixelVertexing/PixelTriplets/plugins/CAHitQuadrupletGenerator.h +++ b/RecoPixelVertexing/PixelTriplets/plugins/CAHitQuadrupletGenerator.h @@ -43,7 +43,7 @@ class CAHitQuadrupletGenerator { ~CAHitQuadrupletGenerator() = default; static void fillDescriptions(edm::ParameterSetDescription& desc); - static const char *fillDescriptionsLabel() { return "caHitQuadruplet"; } + static const char *fillDescriptionsLabel() { return "caHitQuadrupletDefault"; } void initEvent(const edm::Event& ev, const edm::EventSetup& es); diff --git a/RecoPixelVertexing/PixelTriplets/plugins/CAHitQuadrupletGeneratorGPU.cc b/RecoPixelVertexing/PixelTriplets/plugins/CAHitQuadrupletGeneratorGPU.cc new file mode 100644 index 0000000000000..b91e494ccd087 --- /dev/null +++ b/RecoPixelVertexing/PixelTriplets/plugins/CAHitQuadrupletGeneratorGPU.cc @@ -0,0 +1,449 @@ +// +// Author: Felice Pantaleo, CERN +// + +#include "FWCore/MessageLogger/interface/MessageLogger.h" +#include "CAHitQuadrupletGeneratorGPU.h" +#include "RecoPixelVertexing/PixelTriplets/interface/ThirdHitPredictionFromCircle.h" + +#include "DataFormats/Common/interface/Handle.h" +#include "FWCore/Framework/interface/ConsumesCollector.h" +#include "FWCore/Framework/interface/Event.h" +#include "FWCore/ParameterSet/interface/ParameterSetDescription.h" + +#include "TrackingTools/DetLayers/interface/BarrelDetLayer.h" + +#include "CellularAutomaton.h" + +#include "CommonTools/Utils/interface/DynArray.h" + +#include "FWCore/Utilities/interface/isFinite.h" + +#include + +namespace { + +template T sqr(T x) { return x * x; } +} // namespace + +using namespace std; + +constexpr unsigned int CAHitQuadrupletGeneratorGPU::minLayers; + +CAHitQuadrupletGeneratorGPU::CAHitQuadrupletGeneratorGPU( + const edm::ParameterSet &cfg, + edm::ConsumesCollector &iC) + : extraHitRPhitolerance(cfg.getParameter( + "extraHitRPhitolerance")), // extra window in + // ThirdHitPredictionFromCircle range + // (divide by R to get phi) + maxChi2(cfg.getParameter("maxChi2")), + fitFastCircle(cfg.getParameter("fitFastCircle")), + fitFastCircleChi2Cut(cfg.getParameter("fitFastCircleChi2Cut")), + useBendingCorrection(cfg.getParameter("useBendingCorrection")), + caThetaCut(cfg.getParameter("CAThetaCut")), + caPhiCut(cfg.getParameter("CAPhiCut")), + caHardPtCut(cfg.getParameter("CAHardPtCut")) { + edm::ParameterSet comparitorPSet = + cfg.getParameter("SeedComparitorPSet"); + std::string comparitorName = + comparitorPSet.getParameter("ComponentName"); + if (comparitorName != "none") { + theComparitor.reset(SeedComparitorFactory::get()->create( + comparitorName, comparitorPSet, iC)); + } + +} + +void CAHitQuadrupletGeneratorGPU::fillDescriptions( + edm::ParameterSetDescription &desc) { + desc.add("extraHitRPhitolerance", 0.1); + desc.add("fitFastCircle", false); + desc.add("fitFastCircleChi2Cut", false); + desc.add("useBendingCorrection", false); + desc.add("CAThetaCut", 0.00125); + desc.add("CAPhiCut", 10); + desc.add("CAHardPtCut", 0); + desc.addOptional("CAOnlyOneLastHitPerLayerFilter") + ->setComment( + "Deprecated and has no effect. To be fully removed later when the " + "parameter is no longer used in HLT configurations."); + edm::ParameterSetDescription descMaxChi2; + descMaxChi2.add("pt1", 0.2); + descMaxChi2.add("pt2", 1.5); + descMaxChi2.add("value1", 500); + descMaxChi2.add("value2", 50); + descMaxChi2.add("enabled", true); + desc.add("maxChi2", descMaxChi2); + + edm::ParameterSetDescription descComparitor; + descComparitor.add("ComponentName", "none"); + descComparitor.setAllowAnything(); // until we have moved SeedComparitor too + // to EDProducers + desc.add("SeedComparitorPSet", descComparitor); +} + +void CAHitQuadrupletGeneratorGPU::initEvent(const edm::Event &ev, + const edm::EventSetup &es) { + if (theComparitor) + theComparitor->init(ev, es); +} + +CAHitQuadrupletGeneratorGPU::~CAHitQuadrupletGeneratorGPU() { + deallocateOnGPU(); +} + +namespace { +void createGraphStructure(const SeedingLayerSetsHits &layers, CAGraph &g, + GPULayerHits *h_layers_, unsigned int maxNumberOfHits_, + float *h_x_, float *h_y_, float *h_z_) { + for (unsigned int i = 0; i < layers.size(); i++) { + for (unsigned int j = 0; j < 4; ++j) { + auto vertexIndex = 0; + auto foundVertex = std::find(g.theLayers.begin(), g.theLayers.end(), + layers[i][j].name()); + if (foundVertex == g.theLayers.end()) { + g.theLayers.emplace_back(layers[i][j].name(), + layers[i][j].hits().size()); + vertexIndex = g.theLayers.size() - 1; + + } else { + vertexIndex = foundVertex - g.theLayers.begin(); + } + if (j == 0) { + + if (std::find(g.theRootLayers.begin(), g.theRootLayers.end(), + vertexIndex) == g.theRootLayers.end()) { + g.theRootLayers.emplace_back(vertexIndex); + } + } + } + } +} +void clearGraphStructure(const SeedingLayerSetsHits &layers, CAGraph &g) { + g.theLayerPairs.clear(); + for (unsigned int i = 0; i < g.theLayers.size(); i++) { + g.theLayers[i].theInnerLayers.clear(); + g.theLayers[i].theInnerLayerPairs.clear(); + g.theLayers[i].theOuterLayers.clear(); + g.theLayers[i].theOuterLayerPairs.clear(); + for (auto &v : g.theLayers[i].isOuterHitOfCell) + v.clear(); + } +} +void fillGraph(const SeedingLayerSetsHits &layers, + const IntermediateHitDoublets::RegionLayerSets ®ionLayerPairs, + CAGraph &g, std::vector &hitDoublets) { + + for (unsigned int i = 0; i < layers.size(); i++) { + for (unsigned int j = 0; j < 4; ++j) { + auto vertexIndex = 0; + auto foundVertex = std::find(g.theLayers.begin(), g.theLayers.end(), + layers[i][j].name()); + if (foundVertex == g.theLayers.end()) { + vertexIndex = g.theLayers.size() - 1; + } else { + vertexIndex = foundVertex - g.theLayers.begin(); + } + + if (j > 0) { + auto innerVertex = std::find(g.theLayers.begin(), g.theLayers.end(), + layers[i][j - 1].name()); + + CALayerPair tmpInnerLayerPair(innerVertex - g.theLayers.begin(), + vertexIndex); + + if (std::find(g.theLayerPairs.begin(), g.theLayerPairs.end(), + tmpInnerLayerPair) == g.theLayerPairs.end()) { + auto found = std::find_if( + regionLayerPairs.begin(), regionLayerPairs.end(), + [&](const IntermediateHitDoublets::LayerPairHitDoublets &pair) { + return pair.innerLayerIndex() == layers[i][j - 1].index() && + pair.outerLayerIndex() == layers[i][j].index(); + }); + if (found != regionLayerPairs.end()) { + hitDoublets.emplace_back(&(found->doublets())); + g.theLayerPairs.push_back(tmpInnerLayerPair); + g.theLayers[vertexIndex].theInnerLayers.push_back( + innerVertex - g.theLayers.begin()); + innerVertex->theOuterLayers.push_back(vertexIndex); + g.theLayers[vertexIndex].theInnerLayerPairs.push_back( + g.theLayerPairs.size() - 1); + innerVertex->theOuterLayerPairs.push_back(g.theLayerPairs.size() - + 1); + } + } + } + } + } + +} +} // namespace + +void CAHitQuadrupletGeneratorGPU::hitNtuplets( + const IntermediateHitDoublets ®ionDoublets, + std::vector &result, const edm::EventSetup &es, + const SeedingLayerSetsHits &layers, const cudaStream_t &cudaStream) { + cudaStream_ = cudaStream; + CAGraph g; + + hitDoublets.resize(regionDoublets.regionSize()); + + for (unsigned int lpIdx = 0; lpIdx < maxNumberOfLayerPairs_; ++lpIdx) { + h_doublets_[lpIdx].size = 0; + } + numberOfRootLayerPairs_ = 0; + numberOfLayerPairs_ = 0; + numberOfLayers_ = 0; + + for (unsigned int layerIdx = 0; layerIdx < maxNumberOfLayers_; ++layerIdx) { + h_layers_[layerIdx].size = 0; + } + + int index = 0; + for (const auto ®ionLayerPairs : regionDoublets) { + const TrackingRegion ®ion = regionLayerPairs.region(); + hitDoublets[index].clear(); + if (index == 0) { + createGraphStructure(layers, g, h_layers_, maxNumberOfHits_, h_x_, h_y_, h_z_); + } else { + clearGraphStructure(layers, g); + } + + fillGraph(layers, regionLayerPairs, g, hitDoublets[index]); + numberOfLayers_ = g.theLayers.size(); + numberOfLayerPairs_ = hitDoublets[index].size(); + std::vector layerAlreadyParsed(g.theLayers.size(), false); + + for (unsigned int i = 0; i < numberOfLayerPairs_; ++i) { + h_doublets_[i].size = hitDoublets[index][i]->size(); + h_doublets_[i].innerLayerId = g.theLayerPairs[i].theLayers[0]; + h_doublets_[i].outerLayerId = g.theLayerPairs[i].theLayers[1]; + + if (layerAlreadyParsed[h_doublets_[i].innerLayerId] == false) { + layerAlreadyParsed[h_doublets_[i].innerLayerId] = true; + h_layers_[h_doublets_[i].innerLayerId].size = + hitDoublets[index][i]->innerLayer().hits().size(); + h_layers_[h_doublets_[i].innerLayerId].layerId = + h_doublets_[i].innerLayerId; + + for (unsigned int l = 0; l < h_layers_[h_doublets_[i].innerLayerId].size; + ++l) { + auto hitId = + h_layers_[h_doublets_[i].innerLayerId].layerId * maxNumberOfHits_ + + l; + h_x_[hitId] = + hitDoublets[index][i]->innerLayer().hits()[l]->globalPosition().x(); + h_y_[hitId] = + hitDoublets[index][i]->innerLayer().hits()[l]->globalPosition().y(); + h_z_[hitId] = + hitDoublets[index][i]->innerLayer().hits()[l]->globalPosition().z(); + } + } + if (layerAlreadyParsed[h_doublets_[i].outerLayerId] == false) { + layerAlreadyParsed[h_doublets_[i].outerLayerId] = true; + h_layers_[h_doublets_[i].outerLayerId].size = + hitDoublets[index][i]->outerLayer().hits().size(); + h_layers_[h_doublets_[i].outerLayerId].layerId = + h_doublets_[i].outerLayerId; + for (unsigned int l = 0; l < h_layers_[h_doublets_[i].outerLayerId].size; + ++l) { + auto hitId = + h_layers_[h_doublets_[i].outerLayerId].layerId * maxNumberOfHits_ + + l; + h_x_[hitId] = + hitDoublets[index][i]->outerLayer().hits()[l]->globalPosition().x(); + h_y_[hitId] = + hitDoublets[index][i]->outerLayer().hits()[l]->globalPosition().y(); + h_z_[hitId] = + hitDoublets[index][i]->outerLayer().hits()[l]->globalPosition().z(); + } + } + + for (unsigned int rl : g.theRootLayers) { + if (rl == h_doublets_[i].innerLayerId) { + auto rootlayerPairId = numberOfRootLayerPairs_; + h_rootLayerPairs_[rootlayerPairId] = i; + numberOfRootLayerPairs_++; + } + } + auto numberOfDoublets = hitDoublets[index][i]->size(); + if(numberOfDoublets > maxNumberOfDoublets_) + { + edm::LogError("CAHitQuadrupletGeneratorGPU")<<" too many doublets: " << numberOfDoublets << " max is " << maxNumberOfDoublets_; + return; + } + for (unsigned int l = 0; l < numberOfDoublets; ++l) { + auto hitId = i * maxNumberOfDoublets_ * 2 + 2 * l; + h_indices_[hitId] = hitDoublets[index][i]->innerHitId(l); + h_indices_[hitId + 1] = hitDoublets[index][i]->outerHitId(l); + } + } + + + + for (unsigned int j = 0; j < numberOfLayerPairs_; ++j) { + tmp_layerDoublets_[j] = h_doublets_[j]; + tmp_layerDoublets_[j].indices = &d_indices_[j * maxNumberOfDoublets_ * 2]; + cudaMemcpyAsync(&d_indices_[j * maxNumberOfDoublets_ * 2], + &h_indices_[j * maxNumberOfDoublets_ * 2], + tmp_layerDoublets_[j].size * 2 * sizeof(int), + cudaMemcpyHostToDevice, cudaStream_); + } + + for (unsigned int j = 0; j < numberOfLayers_; ++j) { + if(h_layers_[j].size > maxNumberOfHits_) + { + edm::LogError("CAHitQuadrupletGeneratorGPU")<<" too many hits: " << h_layers_[j].size << " max is " << maxNumberOfHits_; + return; + } + tmp_layers_[j] = h_layers_[j]; + tmp_layers_[j].x = &d_x_[maxNumberOfHits_ * j]; + + cudaMemcpyAsync(&d_x_[maxNumberOfHits_ * j], &h_x_[j * maxNumberOfHits_], + tmp_layers_[j].size * sizeof(float), + cudaMemcpyHostToDevice, cudaStream_); + + tmp_layers_[j].y = &d_y_[maxNumberOfHits_ * j]; + cudaMemcpyAsync(&d_y_[maxNumberOfHits_ * j], &h_y_[j * maxNumberOfHits_], + tmp_layers_[j].size * sizeof(float), + cudaMemcpyHostToDevice, cudaStream_); + + tmp_layers_[j].z = &d_z_[maxNumberOfHits_ * j]; + + cudaMemcpyAsync(&d_z_[maxNumberOfHits_ * j], &h_z_[j * maxNumberOfHits_], + tmp_layers_[j].size * sizeof(float), + cudaMemcpyHostToDevice, cudaStream_); + } + + cudaMemcpyAsync(d_rootLayerPairs_, h_rootLayerPairs_, + numberOfRootLayerPairs_ * sizeof(unsigned int), + cudaMemcpyHostToDevice, cudaStream_); + cudaMemcpyAsync(d_doublets_, tmp_layerDoublets_, + numberOfLayerPairs_ * sizeof(GPULayerDoublets), + cudaMemcpyHostToDevice, cudaStream_); + cudaMemcpyAsync(d_layers_, tmp_layers_, numberOfLayers_ * sizeof(GPULayerHits), + cudaMemcpyHostToDevice, cudaStream_); + + launchKernels(region, index); +} +} + +void CAHitQuadrupletGeneratorGPU::fillResults( + const IntermediateHitDoublets ®ionDoublets, + std::vector &result, const edm::EventSetup &es, + const SeedingLayerSetsHits &layers, const cudaStream_t &cudaStream) +{ + int index = 0; + + for (const auto ®ionLayerPairs : regionDoublets) { + const TrackingRegion ®ion = regionLayerPairs.region(); + auto foundQuads = fetchKernelResult(index); + unsigned int numberOfFoundQuadruplets = foundQuads.size(); + const QuantityDependsPtEval maxChi2Eval = maxChi2.evaluator(es); + + // re-used thoughout + std::array bc_r; + std::array bc_z; + std::array bc_errZ2; + std::array gps; + std::array ges; + std::array barrels; + // Loop over quadruplets + for (unsigned int quadId = 0; quadId < numberOfFoundQuadruplets; ++quadId) { + auto isBarrel = [](const unsigned id) -> bool { + return id == PixelSubdetector::PixelBarrel; + }; + for (unsigned int i = 0; i < 3; ++i) { + auto layerPair = foundQuads[quadId][i].first; + auto doubletId = foundQuads[quadId][i].second; + + auto const &ahit = + hitDoublets[index][layerPair]->hit(doubletId, HitDoublets::inner); + gps[i] = ahit->globalPosition(); + ges[i] = ahit->globalPositionError(); + barrels[i] = isBarrel(ahit->geographicalId().subdetId()); + + } + auto layerPair = foundQuads[quadId][2].first; + auto doubletId = foundQuads[quadId][2].second; + + auto const &ahit = + hitDoublets[index][layerPair]->hit(doubletId, HitDoublets::outer); + gps[3] = ahit->globalPosition(); + ges[3] = ahit->globalPositionError(); + barrels[3] = isBarrel(ahit->geographicalId().subdetId()); + + // TODO: + // - if we decide to always do the circle fit for 4 hits, we don't + // need ThirdHitPredictionFromCircle for the curvature; then we + // could remove extraHitRPhitolerance configuration parameter + ThirdHitPredictionFromCircle predictionRPhi(gps[0], gps[2], + extraHitRPhitolerance); + const float curvature = predictionRPhi.curvature( + ThirdHitPredictionFromCircle::Vector2D(gps[1].x(), gps[1].y())); + const float abscurv = std::abs(curvature); + const float thisMaxChi2 = maxChi2Eval.value(abscurv); + if (theComparitor) { + SeedingHitSet tmpTriplet( + hitDoublets[index][foundQuads[quadId][0].first]->hit( + foundQuads[quadId][0].second, HitDoublets::inner), + hitDoublets[index][foundQuads[quadId][2].first]->hit( + foundQuads[quadId][2].second, HitDoublets::inner), + hitDoublets[index][foundQuads[quadId][2].first]->hit( + foundQuads[quadId][2].second, HitDoublets::outer)); + if (!theComparitor->compatible(tmpTriplet)) { + continue; + } + } + + float chi2 = std::numeric_limits::quiet_NaN(); + // TODO: Do we have any use case to not use bending correction? + if (useBendingCorrection) { + // Following PixelFitterByConformalMappingAndLine + const float simpleCot = (gps.back().z() - gps.front().z()) / + (gps.back().perp() - gps.front().perp()); + const float pt = 1.f / PixelRecoUtilities::inversePt(abscurv, es); + for (int i = 0; i < 4; ++i) { + const GlobalPoint &point = gps[i]; + const GlobalError &error = ges[i]; + bc_r[i] = sqrt(sqr(point.x() - region.origin().x()) + + sqr(point.y() - region.origin().y())); + bc_r[i] += pixelrecoutilities::LongitudinalBendingCorrection(pt, es)( + bc_r[i]); + bc_z[i] = point.z() - region.origin().z(); + bc_errZ2[i] = + (barrels[i]) ? error.czz() : error.rerr(point) * sqr(simpleCot); + } + RZLine rzLine(bc_r, bc_z, bc_errZ2, RZLine::ErrZ2_tag()); + chi2 = rzLine.chi2(); + } else { + RZLine rzLine(gps, ges, barrels); + chi2 = rzLine.chi2(); + } + if (edm::isNotFinite(chi2) || chi2 > thisMaxChi2) { + continue; + } + // TODO: Do we have any use case to not use circle fit? Maybe + // HLT where low-pT inefficiency is not a problem? + if (fitFastCircle) { + FastCircleFit c(gps, ges); + chi2 += c.chi2(); + if (edm::isNotFinite(chi2)) + continue; + if (fitFastCircleChi2Cut && chi2 > thisMaxChi2) + continue; + } + result[index].emplace_back( + hitDoublets[index][foundQuads[quadId][0].first]->hit( + foundQuads[quadId][0].second, HitDoublets::inner), + hitDoublets[index][foundQuads[quadId][1].first]->hit( + foundQuads[quadId][1].second, HitDoublets::inner), + hitDoublets[index][foundQuads[quadId][2].first]->hit( + foundQuads[quadId][2].second, HitDoublets::inner), + hitDoublets[index][foundQuads[quadId][2].first]->hit( + foundQuads[quadId][2].second, HitDoublets::outer)); + } + index++; + } +} diff --git a/RecoPixelVertexing/PixelTriplets/plugins/CAHitQuadrupletGeneratorGPU.cu b/RecoPixelVertexing/PixelTriplets/plugins/CAHitQuadrupletGeneratorGPU.cu new file mode 100644 index 0000000000000..99364e59fabb9 --- /dev/null +++ b/RecoPixelVertexing/PixelTriplets/plugins/CAHitQuadrupletGeneratorGPU.cu @@ -0,0 +1,513 @@ +// +// Author: Felice Pantaleo, CERN +// + +#include "HeterogeneousCore/CUDAUtilities/interface/cudaCheck.h" +#include "GPUCACell.h" +#include "CAHitQuadrupletGeneratorGPU.h" + +__global__ void +kernel_debug(unsigned int numberOfLayerPairs_, unsigned int numberOfLayers_, + const GPULayerDoublets *gpuDoublets, + const GPULayerHits *gpuHitsOnLayers, GPUCACell *cells, + GPU::VecArray *isOuterHitOfCell, + GPU::SimpleVector *foundNtuplets, + float ptmin, float region_origin_x, float region_origin_y, + float region_origin_radius, const float thetaCut, + const float phiCut, const float hardPtCut, + unsigned int maxNumberOfDoublets_, unsigned int maxNumberOfHits_) { + if (threadIdx.x == 0 and blockIdx.x == 0) + foundNtuplets->reset(); + + printf("kernel_debug_create: theEvent contains numberOfLayerPairs_: %d\n", + numberOfLayerPairs_); + for (unsigned int layerPairIndex = 0; layerPairIndex < numberOfLayerPairs_; + ++layerPairIndex) { + + int outerLayerId = gpuDoublets[layerPairIndex].outerLayerId; + int innerLayerId = gpuDoublets[layerPairIndex].innerLayerId; + int numberOfDoublets = gpuDoublets[layerPairIndex].size; + printf( + "kernel_debug_create: layerPairIndex: %d inner %d outer %d size %u\n", + layerPairIndex, innerLayerId, outerLayerId, numberOfDoublets); + + auto globalFirstDoubletIdx = layerPairIndex * maxNumberOfDoublets_; + auto globalFirstHitIdx = outerLayerId * maxNumberOfHits_; + printf("kernel_debug_create: theIdOfThefirstCellInLayerPair: %d " + "globalFirstHitIdx %d\n", + globalFirstDoubletIdx, globalFirstHitIdx); + + for (unsigned int i = 0; i < gpuDoublets[layerPairIndex].size; i++) { + + auto globalCellIdx = i + globalFirstDoubletIdx; + auto &thisCell = cells[globalCellIdx]; + auto outerHitId = gpuDoublets[layerPairIndex].indices[2 * i + 1]; + thisCell.init(&gpuDoublets[layerPairIndex], gpuHitsOnLayers, + layerPairIndex, globalCellIdx, + gpuDoublets[layerPairIndex].indices[2 * i], outerHitId, + region_origin_x, region_origin_y); + + isOuterHitOfCell[globalFirstHitIdx + outerHitId].push_back( + globalCellIdx); + } + } + + // for(unsigned int layerIndex = 0; layerIndex < numberOfLayers_;++layerIndex ) + // { + // auto numberOfHitsOnLayer = gpuHitsOnLayers[layerIndex].size; + // for(unsigned hitId = 0; hitId < numberOfHitsOnLayer; hitId++) + // { + // + // if(isOuterHitOfCell[layerIndex*maxNumberOfHits_+hitId].size()>0) + // { + // printf("\nlayer %d hit %d is outer hit of %d + // cells\n",layerIndex, hitId, + // isOuterHitOfCell[layerIndex*maxNumberOfHits_+hitId].size()); + // printf("\n\t%f %f %f + // \n",gpuHitsOnLayers[layerIndex].x[hitId],gpuHitsOnLayers[layerIndex].y[hitId],gpuHitsOnLayers[layerIndex].z[hitId]); + // + // for(unsigned cell = 0; cell< + // isOuterHitOfCell[layerIndex*maxNumberOfHits_+hitId].size(); + // cell++) + // { + // printf("cell %d\n", + // isOuterHitOfCell[layerIndex*maxNumberOfHits_+hitId].m_data[cell]); + // auto& thisCell = + // cells[isOuterHitOfCell[layerIndex*maxNumberOfHits_+hitId].m_data[cell]]; + // float x1, y1, z1, x2, y2, z2; + // + // x1 = thisCell.get_inner_x(); + // y1 = thisCell.get_inner_y(); + // z1 = thisCell.get_inner_z(); + // x2 = thisCell.get_outer_x(); + // y2 = thisCell.get_outer_y(); + // z2 = thisCell.get_outer_z(); + // printf("\n\tDEBUG cellid %d innerhit outerhit (xyz) (%f %f + // %f), (%f %f + // %f)\n",isOuterHitOfCell[layerIndex*maxNumberOfHits_+hitId].m_data[cell], + // x1,y1,z1,x2,y2,z2); + // } + // } + // } + // } + + // starting connect + + for (unsigned int layerPairIndex = 0; layerPairIndex < numberOfLayerPairs_; + ++layerPairIndex) { + + int outerLayerId = gpuDoublets[layerPairIndex].outerLayerId; + int innerLayerId = gpuDoublets[layerPairIndex].innerLayerId; + int numberOfDoublets = gpuDoublets[layerPairIndex].size; + printf("kernel_debug_connect: connecting layerPairIndex: %d inner %d outer " + "%d size %u\n", + layerPairIndex, innerLayerId, outerLayerId, numberOfDoublets); + + auto globalFirstDoubletIdx = layerPairIndex * maxNumberOfDoublets_; + auto globalFirstHitIdx = innerLayerId * maxNumberOfHits_; + // printf("kernel_debug_connect: theIdOfThefirstCellInLayerPair: %d + // globalFirstHitIdx %d\n", globalFirstDoubletIdx, + // globalFirstHitIdx); + + for (unsigned int i = 0; i < numberOfDoublets; i++) { + + auto globalCellIdx = i + globalFirstDoubletIdx; + + auto &thisCell = cells[globalCellIdx]; + auto innerHitId = thisCell.get_inner_hit_id(); + auto numberOfPossibleNeighbors = + isOuterHitOfCell[globalFirstHitIdx + innerHitId].size(); + // if(numberOfPossibleNeighbors>0) + // printf("kernel_debug_connect: cell: %d has %d possible + // neighbors\n", globalCellIdx, numberOfPossibleNeighbors); + float x1, y1, z1, x2, y2, z2; + + x1 = thisCell.get_inner_x(); + y1 = thisCell.get_inner_y(); + z1 = thisCell.get_inner_z(); + x2 = thisCell.get_outer_x(); + y2 = thisCell.get_outer_y(); + z2 = thisCell.get_outer_z(); + printf("\n\n\nDEBUG cellid %d innerhit outerhit (xyz) (%f %f %f), (%f %f " + "%f)\n", + globalCellIdx, x1, y1, z1, x2, y2, z2); + + for (auto j = 0; j < numberOfPossibleNeighbors; ++j) { + unsigned int otherCell = + isOuterHitOfCell[globalFirstHitIdx + innerHitId][j]; + + float x3, y3, z3, x4, y4, z4; + x3 = cells[otherCell].get_inner_x(); + y3 = cells[otherCell].get_inner_y(); + z3 = cells[otherCell].get_inner_z(); + x4 = cells[otherCell].get_outer_x(); + y4 = cells[otherCell].get_outer_y(); + z4 = cells[otherCell].get_outer_z(); + + printf("kernel_debug_connect: checking compatibility with %d \n", + otherCell); + printf("DEBUG \tinnerhit outerhit (xyz) (%f %f %f), (%f %f %f)\n", x3, + y3, z3, x4, y4, z4); + + if (thisCell.check_alignment_and_tag( + cells, otherCell, ptmin, region_origin_x, region_origin_y, + region_origin_radius, thetaCut, phiCut, hardPtCut)) { + + printf("kernel_debug_connect: \t\tcell %d is outer neighbor of %d \n", + globalCellIdx, otherCell); + + cells[otherCell].theOuterNeighbors.push_back(globalCellIdx); + } + } + } + } +} + +__global__ void debug_input_data(unsigned int numberOfLayerPairs_, + const GPULayerDoublets *gpuDoublets, + const GPULayerHits *gpuHitsOnLayers, + float ptmin, float region_origin_x, + float region_origin_y, + float region_origin_radius, + unsigned int maxNumberOfHits_) { + printf("GPU: Region ptmin %f , region_origin_x %f , region_origin_y %f , " + "region_origin_radius %f \n", + ptmin, region_origin_x, region_origin_y, region_origin_radius); + printf("GPU: numberOfLayerPairs_: %d\n", numberOfLayerPairs_); + + for (unsigned int layerPairIndex = 0; layerPairIndex < numberOfLayerPairs_; + ++layerPairIndex) { + printf("\t numberOfDoublets: %d \n", gpuDoublets[layerPairIndex].size); + printf("\t innerLayer: %d outerLayer: %d \n", + gpuDoublets[layerPairIndex].innerLayerId, + gpuDoublets[layerPairIndex].outerLayerId); + + for (unsigned int cellIndexInLayerPair = 0; + cellIndexInLayerPair < gpuDoublets[layerPairIndex].size; + ++cellIndexInLayerPair) { + + if (cellIndexInLayerPair < 5) { + auto innerhit = + gpuDoublets[layerPairIndex].indices[2 * cellIndexInLayerPair]; + auto innerX = gpuHitsOnLayers[gpuDoublets[layerPairIndex].innerLayerId] + .x[innerhit]; + auto innerY = gpuHitsOnLayers[gpuDoublets[layerPairIndex].innerLayerId] + .y[innerhit]; + auto innerZ = gpuHitsOnLayers[gpuDoublets[layerPairIndex].innerLayerId] + .z[innerhit]; + + auto outerhit = + gpuDoublets[layerPairIndex].indices[2 * cellIndexInLayerPair + 1]; + auto outerX = gpuHitsOnLayers[gpuDoublets[layerPairIndex].outerLayerId] + .x[outerhit]; + auto outerY = gpuHitsOnLayers[gpuDoublets[layerPairIndex].outerLayerId] + .y[outerhit]; + auto outerZ = gpuHitsOnLayers[gpuDoublets[layerPairIndex].outerLayerId] + .z[outerhit]; + printf("\t \t %d innerHit: %d %f %f %f outerHit: %d %f %f %f\n", + cellIndexInLayerPair, innerhit, innerX, innerY, innerZ, outerhit, + outerX, outerY, outerZ); + } + } + } +} + +template +__global__ void kernel_debug_find_ntuplets( + unsigned int numberOfRootLayerPairs_, const GPULayerDoublets *gpuDoublets, + GPUCACell *cells, + GPU::VecArray *foundNtuplets, + unsigned int *rootLayerPairs, unsigned int minHitsPerNtuplet, + unsigned int maxNumberOfDoublets_) { + printf("numberOfRootLayerPairs_ = %d", numberOfRootLayerPairs_); + for (int rootLayerPair = 0; rootLayerPair < numberOfRootLayerPairs_; + ++rootLayerPair) { + unsigned int rootLayerPairIndex = rootLayerPairs[rootLayerPair]; + auto globalFirstDoubletIdx = rootLayerPairIndex * maxNumberOfDoublets_; + + GPU::VecArray stack; + for (int i = 0; i < gpuDoublets[rootLayerPairIndex].size; i++) { + auto globalCellIdx = i + globalFirstDoubletIdx; + stack.reset(); + stack.push_back(globalCellIdx); + cells[globalCellIdx].find_ntuplets(cells, foundNtuplets, stack, + minHitsPerNtuplet); + } + printf("found quadruplets: %d", foundNtuplets->size()); + } +} + +__global__ void kernel_create( + const unsigned int numberOfLayerPairs_, const GPULayerDoublets *gpuDoublets, + const GPULayerHits *gpuHitsOnLayers, GPUCACell *cells, + GPU::VecArray *isOuterHitOfCell, + GPU::SimpleVector *foundNtuplets, + const float region_origin_x, const float region_origin_y, + unsigned int maxNumberOfDoublets_, unsigned int maxNumberOfHits_) { + + unsigned int layerPairIndex = blockIdx.y; + unsigned int cellIndexInLayerPair = threadIdx.x + blockIdx.x * blockDim.x; + if (cellIndexInLayerPair == 0 && layerPairIndex == 0) { + foundNtuplets->reset(); + } + + if (layerPairIndex < numberOfLayerPairs_) { + int outerLayerId = gpuDoublets[layerPairIndex].outerLayerId; + auto globalFirstDoubletIdx = layerPairIndex * maxNumberOfDoublets_; + auto globalFirstHitIdx = outerLayerId * maxNumberOfHits_; + + for (unsigned int i = cellIndexInLayerPair; + i < gpuDoublets[layerPairIndex].size; i += gridDim.x * blockDim.x) { + auto globalCellIdx = i + globalFirstDoubletIdx; + auto &thisCell = cells[globalCellIdx]; + auto outerHitId = gpuDoublets[layerPairIndex].indices[2 * i + 1]; + thisCell.init(&gpuDoublets[layerPairIndex], gpuHitsOnLayers, + layerPairIndex, globalCellIdx, + gpuDoublets[layerPairIndex].indices[2 * i], outerHitId, + region_origin_x, region_origin_y); + + isOuterHitOfCell[globalFirstHitIdx + outerHitId].push_back( + globalCellIdx); + } + } +} + +__global__ void +kernel_connect(unsigned int numberOfLayerPairs_, + const GPULayerDoublets *gpuDoublets, GPUCACell *cells, + GPU::VecArray< unsigned int, 512> *isOuterHitOfCell, + float ptmin, float region_origin_x, float region_origin_y, + float region_origin_radius, const float thetaCut, + const float phiCut, const float hardPtCut, + unsigned int maxNumberOfDoublets_, unsigned int maxNumberOfHits_) { + unsigned int layerPairIndex = blockIdx.y; + unsigned int cellIndexInLayerPair = threadIdx.x + blockIdx.x * blockDim.x; + if (layerPairIndex < numberOfLayerPairs_) { + int innerLayerId = gpuDoublets[layerPairIndex].innerLayerId; + auto globalFirstDoubletIdx = layerPairIndex * maxNumberOfDoublets_; + auto globalFirstHitIdx = innerLayerId * maxNumberOfHits_; + + for (int i = cellIndexInLayerPair; i < gpuDoublets[layerPairIndex].size; + i += gridDim.x * blockDim.x) { + auto globalCellIdx = i + globalFirstDoubletIdx; + + auto &thisCell = cells[globalCellIdx]; + auto innerHitId = thisCell.get_inner_hit_id(); + auto numberOfPossibleNeighbors = + isOuterHitOfCell[globalFirstHitIdx + innerHitId].size(); + for (auto j = 0; j < numberOfPossibleNeighbors; ++j) { + unsigned int otherCell = + isOuterHitOfCell[globalFirstHitIdx + innerHitId][j]; + + if (thisCell.check_alignment_and_tag( + cells, otherCell, ptmin, region_origin_x, region_origin_y, + region_origin_radius, thetaCut, phiCut, hardPtCut)) { + cells[otherCell].theOuterNeighbors.push_back(globalCellIdx); + } + } + } + } +} + +__global__ void kernel_find_ntuplets( + unsigned int numberOfRootLayerPairs_, const GPULayerDoublets *gpuDoublets, + GPUCACell *cells, + GPU::SimpleVector *foundNtuplets, + unsigned int *rootLayerPairs, unsigned int minHitsPerNtuplet, + unsigned int maxNumberOfDoublets_) { + + if (blockIdx.y < numberOfRootLayerPairs_) { + unsigned int cellIndexInRootLayerPair = + threadIdx.x + blockIdx.x * blockDim.x; + unsigned int rootLayerPairIndex = rootLayerPairs[blockIdx.y]; + auto globalFirstDoubletIdx = rootLayerPairIndex * maxNumberOfDoublets_; + GPU::VecArray< unsigned int, 3> stack; + for (int i = cellIndexInRootLayerPair; + i < gpuDoublets[rootLayerPairIndex].size; + i += gridDim.x * blockDim.x) { + auto globalCellIdx = i + globalFirstDoubletIdx; + stack.reset(); + stack.push_back_unsafe(globalCellIdx); + cells[globalCellIdx].find_ntuplets(cells, foundNtuplets, stack, + minHitsPerNtuplet); + } + } +} + +template +__global__ void +kernel_print_found_ntuplets(GPU::SimpleVector *foundNtuplets) { + for (int i = 0; i < foundNtuplets->size(); ++i) { + printf("\nquadruplet %d: %d %d, %d %d, %d %d\n", i, + (*foundNtuplets)[i].layerPairsAndCellId[0].x, + (*foundNtuplets)[i].layerPairsAndCellId[0].y - + maxNumberOfDoublets_ * + ((*foundNtuplets)[i].layerPairsAndCellId[0].x), + (*foundNtuplets)[i].layerPairsAndCellId[1].x, + (*foundNtuplets)[i].layerPairsAndCellId[1].y - + maxNumberOfDoublets_ * + (*foundNtuplets)[i].layerPairsAndCellId[1].x, + (*foundNtuplets)[i].layerPairsAndCellId[2].x, + (*foundNtuplets)[i].layerPairsAndCellId[2].y - + maxNumberOfDoublets_ * + ((*foundNtuplets)[i].layerPairsAndCellId[2].x)); + } +} + +void CAHitQuadrupletGeneratorGPU::deallocateOnGPU() { + + cudaFreeHost(h_indices_); + cudaFreeHost(h_doublets_); + cudaFreeHost(h_x_); + cudaFreeHost(h_y_); + cudaFreeHost(h_z_); + cudaFreeHost(h_rootLayerPairs_); + for (int i = 0; i < maxNumberOfRegions_; ++i) + { + cudaFreeHost(h_foundNtupletsVec_[i]); + cudaFreeHost(h_foundNtupletsData_[i]); + cudaFreeHost(tmp_foundNtupletsVec_[i]); + cudaFree(d_foundNtupletsVec_[i]); + cudaFree(d_foundNtupletsData_[i]); + } + cudaFreeHost(tmp_layers_); + cudaFreeHost(tmp_layerDoublets_); + cudaFreeHost(h_layers_); + + cudaFree(d_indices_); + cudaFree(d_doublets_); + cudaFree(d_x_); + cudaFree(d_y_); + cudaFree(d_z_); + cudaFree(d_rootLayerPairs_); + cudaFree(device_theCells_); + cudaFree(device_isOuterHitOfCell_); +} + +void CAHitQuadrupletGeneratorGPU::allocateOnGPU() { + cudaCheck(cudaMallocHost(&h_doublets_, maxNumberOfLayerPairs_ * sizeof(GPULayerDoublets))); + + cudaMallocHost(&h_indices_, + maxNumberOfLayerPairs_ * maxNumberOfDoublets_ * 2 * sizeof(int)); + cudaMallocHost(&h_x_, maxNumberOfLayers_ * maxNumberOfHits_ * sizeof(float)); + cudaMallocHost(&h_y_, maxNumberOfLayers_ * maxNumberOfHits_ * sizeof(float)); + cudaMallocHost(&h_z_, maxNumberOfLayers_ * maxNumberOfHits_ * sizeof(float)); + cudaMallocHost(&h_rootLayerPairs_, maxNumberOfRootLayerPairs_ * sizeof(int)); + + cudaMalloc(&d_indices_, + maxNumberOfLayerPairs_ * maxNumberOfDoublets_ * 2 * sizeof(int)); + cudaMalloc(&d_doublets_, maxNumberOfLayerPairs_ * sizeof(GPULayerDoublets)); + cudaMalloc(&d_layers_, maxNumberOfLayers_ * sizeof(GPULayerHits)); + cudaMalloc(&d_x_, maxNumberOfLayers_ * maxNumberOfHits_ * sizeof(float)); + cudaMalloc(&d_y_, maxNumberOfLayers_ * maxNumberOfHits_ * sizeof(float)); + cudaMalloc(&d_z_, maxNumberOfLayers_ * maxNumberOfHits_ * sizeof(float)); + cudaMalloc(&d_rootLayerPairs_, + maxNumberOfRootLayerPairs_ * sizeof(unsigned int)); + ////////////////////////////////////////////////////////// + // ALLOCATIONS FOR THE INTERMEDIATE RESULTS (STAYS ON WORKER) + ////////////////////////////////////////////////////////// + + cudaCheck(cudaMalloc(&device_theCells_, + maxNumberOfLayerPairs_ * maxNumberOfDoublets_ * sizeof(GPUCACell))); + + cudaCheck(cudaMalloc(&device_isOuterHitOfCell_, + maxNumberOfLayers_ * maxNumberOfHits_ * + sizeof(GPU::VecArray< unsigned int , maxCellsPerHit_>))); + cudaCheck(cudaMemset(device_isOuterHitOfCell_, 0, + maxNumberOfLayers_ * maxNumberOfHits_ * + sizeof(GPU::VecArray))); + + h_foundNtupletsVec_.resize(maxNumberOfRegions_); + h_foundNtupletsData_.resize(maxNumberOfRegions_); + d_foundNtupletsVec_.resize(maxNumberOfRegions_); + d_foundNtupletsData_.resize(maxNumberOfRegions_); + tmp_foundNtupletsVec_.resize(maxNumberOfRegions_); + + for (int i = 0; i < maxNumberOfRegions_; ++i) { + cudaCheck(cudaMalloc(&d_foundNtupletsVec_[i], + sizeof(GPU::SimpleVector))); + cudaCheck(cudaMalloc(&d_foundNtupletsData_[i], sizeof(Quadruplet)*maxNumberOfQuadruplets_)); + cudaCheck(cudaMallocHost(&h_foundNtupletsVec_[i], + sizeof(GPU::SimpleVector))); + cudaCheck(cudaMallocHost(&h_foundNtupletsData_[i], sizeof(Quadruplet)*maxNumberOfQuadruplets_)); + cudaCheck(cudaMallocHost(&tmp_foundNtupletsVec_[i], + sizeof(GPU::SimpleVector))); + new (h_foundNtupletsVec_[i]) GPU::SimpleVector(maxNumberOfQuadruplets_, h_foundNtupletsData_[i]); + new (tmp_foundNtupletsVec_[i]) GPU::SimpleVector(maxNumberOfQuadruplets_, d_foundNtupletsData_[i]); + + cudaMemcpy(d_foundNtupletsVec_[i], tmp_foundNtupletsVec_[i], sizeof(GPU::SimpleVector), cudaMemcpyDefault); + + } + + cudaMallocHost(&tmp_layers_, maxNumberOfLayers_ * sizeof(GPULayerHits)); + cudaMallocHost(&tmp_layerDoublets_, + maxNumberOfLayerPairs_ * sizeof(GPULayerDoublets)); + cudaMallocHost(&h_layers_, maxNumberOfLayers_ * sizeof(GPULayerHits)); +} + +void CAHitQuadrupletGeneratorGPU::launchKernels(const TrackingRegion ®ion, + int regionIndex) { + + assert(regionIndex < maxNumberOfRegions_); + dim3 numberOfBlocks_create(64, numberOfLayerPairs_); + dim3 numberOfBlocks_connect(32, numberOfLayerPairs_); + dim3 numberOfBlocks_find(16, numberOfRootLayerPairs_); + h_foundNtupletsVec_[regionIndex]->reset(); + kernel_create<<>>( + numberOfLayerPairs_, d_doublets_, d_layers_, device_theCells_, + device_isOuterHitOfCell_, d_foundNtupletsVec_[regionIndex], + region.origin().x(), region.origin().y(), maxNumberOfDoublets_, + maxNumberOfHits_); + + kernel_connect<<>>( + numberOfLayerPairs_, d_doublets_, device_theCells_, + device_isOuterHitOfCell_, + region.ptMin(), region.origin().x(), region.origin().y(), + region.originRBound(), caThetaCut, caPhiCut, caHardPtCut, + maxNumberOfDoublets_, maxNumberOfHits_); + + kernel_find_ntuplets<<>>( + numberOfRootLayerPairs_, d_doublets_, device_theCells_, + d_foundNtupletsVec_[regionIndex], + d_rootLayerPairs_, 4, maxNumberOfDoublets_); + + cudaMemcpyAsync(h_foundNtupletsVec_[regionIndex], d_foundNtupletsVec_[regionIndex], + sizeof(GPU::SimpleVector), + cudaMemcpyDeviceToHost, cudaStream_); + + cudaMemcpyAsync(h_foundNtupletsData_[regionIndex], d_foundNtupletsData_[regionIndex], + maxNumberOfQuadruplets_*sizeof(Quadruplet), + cudaMemcpyDeviceToHost, cudaStream_); + +} + +std::vector, 3>> +CAHitQuadrupletGeneratorGPU::fetchKernelResult(int regionIndex) { + + h_foundNtupletsVec_[regionIndex]->set_data(h_foundNtupletsData_[regionIndex]); + //this lazily resets temporary memory for the next event, and is not needed for reading the output + cudaMemsetAsync(device_isOuterHitOfCell_, 0, + maxNumberOfLayers_ * maxNumberOfHits_ * + sizeof(GPU::VecArray), + cudaStream_); + std::vector, 3>> quadsInterface; + for (int i = 0; i < h_foundNtupletsVec_[regionIndex]->size(); ++i) { + std::array, 3> tmpQuad = { + {std::make_pair((*h_foundNtupletsVec_[regionIndex])[i].layerPairsAndCellId[0].x, + (*h_foundNtupletsVec_[regionIndex])[i].layerPairsAndCellId[0].y - + maxNumberOfDoublets_ * + (*h_foundNtupletsVec_[regionIndex])[i].layerPairsAndCellId[0].x), + std::make_pair((*h_foundNtupletsVec_[regionIndex])[i].layerPairsAndCellId[1].x, + (*h_foundNtupletsVec_[regionIndex])[i].layerPairsAndCellId[1].y - + maxNumberOfDoublets_ * + (*h_foundNtupletsVec_[regionIndex])[i].layerPairsAndCellId[1].x), + std::make_pair((*h_foundNtupletsVec_[regionIndex])[i].layerPairsAndCellId[2].x, + (*h_foundNtupletsVec_[regionIndex])[i].layerPairsAndCellId[2].y - + maxNumberOfDoublets_ * + (*h_foundNtupletsVec_[regionIndex])[i].layerPairsAndCellId[2].x)}}; + + + quadsInterface.push_back(tmpQuad); + } + return quadsInterface; +} diff --git a/RecoPixelVertexing/PixelTriplets/plugins/CAHitQuadrupletGeneratorGPU.h b/RecoPixelVertexing/PixelTriplets/plugins/CAHitQuadrupletGeneratorGPU.h new file mode 100644 index 0000000000000..449fd7fa84f13 --- /dev/null +++ b/RecoPixelVertexing/PixelTriplets/plugins/CAHitQuadrupletGeneratorGPU.h @@ -0,0 +1,194 @@ +#ifndef RECOPIXELVERTEXING_PIXELTRIPLETS_CAHITQUADRUPLETGENERATORGPU_H +#define RECOPIXELVERTEXING_PIXELTRIPLETS_CAHITQUADRUPLETGENERATORGPU_H + +#include +#include "GPUHitsAndDoublets.h" + +#include "RecoTracker/TkSeedingLayers/interface/SeedComparitorFactory.h" +#include "RecoTracker/TkSeedingLayers/interface/SeedComparitor.h" +#include "RecoPixelVertexing/PixelTrackFitting/interface/RZLine.h" +#include "RecoTracker/TkSeedGenerator/interface/FastCircleFit.h" +#include "RecoTracker/TkMSParametrization/interface/PixelRecoUtilities.h" +#include "RecoTracker/TkMSParametrization/interface/LongitudinalBendingCorrection.h" +#include "DataFormats/SiPixelDetId/interface/PixelSubdetector.h" +#include "CAGraph.h" + +#include "RecoTracker/TkHitPairs/interface/HitPairGeneratorFromLayerPair.h" +#include "RecoTracker/TkHitPairs/interface/LayerHitMapCache.h" +#include "FWCore/ParameterSet/interface/ParameterSet.h" +#include "FWCore/Utilities/interface/EDGetToken.h" + +#include "RecoTracker/TkHitPairs/interface/IntermediateHitDoublets.h" +#include "RecoPixelVertexing/PixelTriplets/interface/OrderedHitSeeds.h" +#include "HeterogeneousCore/CUDAUtilities/interface/GPUSimpleVector.h" +#include "GPUCACell.h" + +class TrackingRegion; +class SeedingLayerSetsHits; + +namespace edm { + class Event; + class EventSetup; + class ParameterSetDescription; +} + +class CAHitQuadrupletGeneratorGPU { +public: + typedef LayerHitMapCache LayerCacheType; + + static constexpr unsigned int minLayers = 4; + typedef OrderedHitSeeds ResultType; + +public: + + CAHitQuadrupletGeneratorGPU(const edm::ParameterSet& cfg, edm::ConsumesCollector&& iC): CAHitQuadrupletGeneratorGPU(cfg, iC) {} + CAHitQuadrupletGeneratorGPU(const edm::ParameterSet& cfg, edm::ConsumesCollector& iC); + + ~CAHitQuadrupletGeneratorGPU(); + + static void fillDescriptions(edm::ParameterSetDescription& desc); + static const char *fillDescriptionsLabel() { return "caHitQuadrupletGPU"; } + + void initEvent(const edm::Event& ev, const edm::EventSetup& es); + + void hitNtuplets(const IntermediateHitDoublets& regionDoublets, + std::vector& result, + const edm::EventSetup& es, + const SeedingLayerSetsHits& layers, const cudaStream_t& stream); + void fillResults(const IntermediateHitDoublets& regionDoublets, + std::vector& result, + const edm::EventSetup& es, + const SeedingLayerSetsHits& layers, const cudaStream_t& stream); + + void allocateOnGPU(); + void deallocateOnGPU(); + +private: + LayerCacheType theLayerCache; + + std::unique_ptr theComparitor; + + class QuantityDependsPtEval { + public: + + QuantityDependsPtEval(float v1, float v2, float c1, float c2) : + value1_(v1), value2_(v2), curvature1_(c1), curvature2_(c2) { + } + + float value(float curvature) const { + if (value1_ == value2_) // not enabled + return value1_; + + if (curvature1_ < curvature) + return value1_; + if (curvature2_ < curvature && curvature <= curvature1_) + return value2_ + (curvature - curvature2_) / (curvature1_ - curvature2_) * (value1_ - value2_); + return value2_; + } + + private: + const float value1_; + const float value2_; + const float curvature1_; + const float curvature2_; + }; + + // Linear interpolation (in curvature) between value1 at pt1 and + // value2 at pt2. If disabled, value2 is given (the point is to + // allow larger/smaller values of the quantity at low pt, so it + // makes more sense to have the high-pt value as the default). + + class QuantityDependsPt { + public: + + explicit QuantityDependsPt(const edm::ParameterSet& pset) : + value1_(pset.getParameter("value1")), + value2_(pset.getParameter("value2")), + pt1_(pset.getParameter("pt1")), + pt2_(pset.getParameter("pt2")), + enabled_(pset.getParameter("enabled")) { + if (enabled_ && pt1_ >= pt2_) + throw cms::Exception("Configuration") << "PixelQuadrupletGenerator::QuantityDependsPt: pt1 (" << pt1_ << ") needs to be smaller than pt2 (" << pt2_ << ")"; + if (pt1_ <= 0) + throw cms::Exception("Configuration") << "PixelQuadrupletGenerator::QuantityDependsPt: pt1 needs to be > 0; is " << pt1_; + if (pt2_ <= 0) + throw cms::Exception("Configuration") << "PixelQuadrupletGenerator::QuantityDependsPt: pt2 needs to be > 0; is " << pt2_; + } + + QuantityDependsPtEval evaluator(const edm::EventSetup& es) const { + if (enabled_) { + return QuantityDependsPtEval(value1_, value2_, + PixelRecoUtilities::curvature(1.f / pt1_, es), + PixelRecoUtilities::curvature(1.f / pt2_, es)); + } + return QuantityDependsPtEval(value2_, value2_, 0.f, 0.f); + } + + private: + const float value1_; + const float value2_; + const float pt1_; + const float pt2_; + const bool enabled_; + }; + + + + void launchKernels(const TrackingRegion &, int); + std::vector ,3 > > fetchKernelResult(int ); + const float extraHitRPhitolerance; + std::vector > hitDoublets; + + const QuantityDependsPt maxChi2; + const bool fitFastCircle; + const bool fitFastCircleChi2Cut; + const bool useBendingCorrection; + + const float caThetaCut = 0.00125f; + const float caPhiCut = 0.1f; + const float caHardPtCut = 0.f; + + cudaStream_t cudaStream_; + + static constexpr int maxNumberOfQuadruplets_ = 10000; + static constexpr int maxCellsPerHit_ = 512; + static constexpr int maxNumberOfLayerPairs_ = 13; + static constexpr unsigned int maxNumberOfRootLayerPairs_ = 13; + static constexpr int maxNumberOfLayers_ = 10; + static constexpr int maxNumberOfDoublets_ = 262144; + static constexpr int maxNumberOfHits_ = 10000; + static constexpr int maxNumberOfRegions_ = 30; + + unsigned int numberOfRootLayerPairs_ = 0; + unsigned int numberOfLayerPairs_ = 0; + unsigned int numberOfLayers_ = 0; + + + GPULayerDoublets* h_doublets_; + GPULayerHits* h_layers_; + + unsigned int* h_indices_; + float *h_x_, *h_y_, *h_z_; + float *d_x_, *d_y_, *d_z_; + unsigned int* d_rootLayerPairs_; + GPULayerHits* d_layers_; + GPULayerDoublets* d_doublets_; + unsigned int* d_indices_; + unsigned int* h_rootLayerPairs_; + std::vector< GPU::SimpleVector* > h_foundNtupletsVec_; + std::vector< Quadruplet* > h_foundNtupletsData_; + + + std::vector*> d_foundNtupletsVec_; + std::vector*> tmp_foundNtupletsVec_; + + std::vector d_foundNtupletsData_; + + GPUCACell* device_theCells_; + GPU::VecArray< unsigned int, maxCellsPerHit_>* device_isOuterHitOfCell_; + + GPULayerHits* tmp_layers_; + GPULayerDoublets* tmp_layerDoublets_; + +}; +#endif diff --git a/RecoPixelVertexing/PixelTriplets/plugins/CellularAutomaton.cc b/RecoPixelVertexing/PixelTriplets/plugins/CellularAutomaton.cc index d76a6793b36ae..fad80d3dec133 100644 --- a/RecoPixelVertexing/PixelTriplets/plugins/CellularAutomaton.cc +++ b/RecoPixelVertexing/PixelTriplets/plugins/CellularAutomaton.cc @@ -1,265 +1,233 @@ #include "CellularAutomaton.h" -#include - - -void CellularAutomaton::createAndConnectCells(const std::vector& hitDoublets, const TrackingRegion& region, - const float thetaCut, const float phiCut, const float hardPtCut) -{ - int tsize=0; - for ( auto hd : hitDoublets) tsize+=hd->size(); - allCells.reserve(tsize); - unsigned int cellId = 0; - float ptmin = region.ptMin(); - float region_origin_x = region.origin().x(); - float region_origin_y = region.origin().y(); - float region_origin_radius = region.originRBound(); - - std::vector alreadyVisitedLayerPairs; - alreadyVisitedLayerPairs.resize(theLayerGraph.theLayerPairs.size()); - for (auto visited : alreadyVisitedLayerPairs) - { - visited = false; - } - for (int rootVertex : theLayerGraph.theRootLayers) - { - - std::queue LayerPairsToVisit; - - for (int LayerPair : theLayerGraph.theLayers[rootVertex].theOuterLayerPairs) - { - LayerPairsToVisit.push(LayerPair); - - } - - unsigned int numberOfLayerPairsToVisitAtThisDepth = - LayerPairsToVisit.size(); - - while (!LayerPairsToVisit.empty()) - { - auto currentLayerPair = LayerPairsToVisit.front(); - auto & currentLayerPairRef = theLayerGraph.theLayerPairs[currentLayerPair]; - auto & currentInnerLayerRef = theLayerGraph.theLayers[currentLayerPairRef.theLayers[0]]; - auto & currentOuterLayerRef = theLayerGraph.theLayers[currentLayerPairRef.theLayers[1]]; - bool allInnerLayerPairsAlreadyVisited { true }; - - for (auto innerLayerPair : currentInnerLayerRef.theInnerLayerPairs) - { - allInnerLayerPairsAlreadyVisited &= - alreadyVisitedLayerPairs[innerLayerPair]; - } - - if (alreadyVisitedLayerPairs[currentLayerPair] == false - && allInnerLayerPairsAlreadyVisited) - { - - const HitDoublets* doubletLayerPairId = - hitDoublets[currentLayerPair]; - auto numberOfDoublets = doubletLayerPairId->size(); - currentLayerPairRef.theFoundCells[0] = cellId; - currentLayerPairRef.theFoundCells[1] = cellId+numberOfDoublets; - for (unsigned int i = 0; i < numberOfDoublets; ++i) - { - allCells.emplace_back(doubletLayerPairId, i, - doubletLayerPairId->innerHitId(i), - doubletLayerPairId->outerHitId(i)); - - - currentOuterLayerRef.isOuterHitOfCell[doubletLayerPairId->outerHitId(i)].push_back(cellId); - - cellId++; - - auto & neigCells = currentInnerLayerRef.isOuterHitOfCell[doubletLayerPairId->innerHitId(i)]; - allCells.back().checkAlignmentAndTag(allCells, - neigCells, ptmin, region_origin_x, - region_origin_y, region_origin_radius, thetaCut, - phiCut, hardPtCut - ); - - - } - assert(cellId==currentLayerPairRef.theFoundCells[1]); - for (auto outerLayerPair : currentOuterLayerRef.theOuterLayerPairs) - { - LayerPairsToVisit.push(outerLayerPair); - } - - alreadyVisitedLayerPairs[currentLayerPair] = true; - } - LayerPairsToVisit.pop(); - numberOfLayerPairsToVisitAtThisDepth--; - if (numberOfLayerPairsToVisitAtThisDepth == 0) - { - numberOfLayerPairsToVisitAtThisDepth = LayerPairsToVisit.size(); - } - - } - - } +#include + +void CellularAutomaton::createAndConnectCells( + const std::vector &hitDoublets, + const TrackingRegion ®ion, const float thetaCut, const float phiCut, + const float hardPtCut) { + int tsize = 0; + for (auto hd : hitDoublets) + tsize += hd->size(); + allCells.reserve(tsize); + unsigned int cellId = 0; + float ptmin = region.ptMin(); + float region_origin_x = region.origin().x(); + float region_origin_y = region.origin().y(); + float region_origin_radius = region.originRBound(); + + std::vector alreadyVisitedLayerPairs; + alreadyVisitedLayerPairs.resize(theLayerGraph.theLayerPairs.size()); + for (auto visited : alreadyVisitedLayerPairs) { + visited = false; + } + for (int rootVertex : theLayerGraph.theRootLayers) { + + std::queue LayerPairsToVisit; + + for (int LayerPair : + theLayerGraph.theLayers[rootVertex].theOuterLayerPairs) { + LayerPairsToVisit.push(LayerPair); + } + unsigned int numberOfLayerPairsToVisitAtThisDepth = + LayerPairsToVisit.size(); + + while (!LayerPairsToVisit.empty()) { + auto currentLayerPair = LayerPairsToVisit.front(); + auto ¤tLayerPairRef = theLayerGraph.theLayerPairs[currentLayerPair]; + auto ¤tInnerLayerRef = + theLayerGraph.theLayers[currentLayerPairRef.theLayers[0]]; + auto ¤tOuterLayerRef = + theLayerGraph.theLayers[currentLayerPairRef.theLayers[1]]; + bool allInnerLayerPairsAlreadyVisited{true}; + + for (auto innerLayerPair : currentInnerLayerRef.theInnerLayerPairs) { + allInnerLayerPairsAlreadyVisited &= + alreadyVisitedLayerPairs[innerLayerPair]; + } + + if (alreadyVisitedLayerPairs[currentLayerPair] == false && + allInnerLayerPairsAlreadyVisited) { + + const HitDoublets *doubletLayerPairId = hitDoublets[currentLayerPair]; + auto numberOfDoublets = doubletLayerPairId->size(); + currentLayerPairRef.theFoundCells[0] = cellId; + currentLayerPairRef.theFoundCells[1] = cellId + numberOfDoublets; + for (unsigned int i = 0; i < numberOfDoublets; ++i) { + allCells.emplace_back(doubletLayerPairId, i, + doubletLayerPairId->innerHitId(i), + doubletLayerPairId->outerHitId(i)); + + currentOuterLayerRef + .isOuterHitOfCell[doubletLayerPairId->outerHitId(i)] + .push_back(cellId); + + cellId++; + + auto &neigCells = + currentInnerLayerRef + .isOuterHitOfCell[doubletLayerPairId->innerHitId(i)]; + allCells.back().checkAlignmentAndTag( + allCells, neigCells, ptmin, region_origin_x, region_origin_y, + region_origin_radius, thetaCut, phiCut, hardPtCut); + } + assert(cellId == currentLayerPairRef.theFoundCells[1]); + for (auto outerLayerPair : currentOuterLayerRef.theOuterLayerPairs) { + LayerPairsToVisit.push(outerLayerPair); + } + + alreadyVisitedLayerPairs[currentLayerPair] = true; + } + LayerPairsToVisit.pop(); + numberOfLayerPairsToVisitAtThisDepth--; + if (numberOfLayerPairsToVisitAtThisDepth == 0) { + numberOfLayerPairsToVisitAtThisDepth = LayerPairsToVisit.size(); + } + } + } } -void CellularAutomaton::evolve(const unsigned int minHitsPerNtuplet) -{ +void CellularAutomaton::evolve(const unsigned int minHitsPerNtuplet) { allStatus.resize(allCells.size()); - - + unsigned int numberOfIterations = minHitsPerNtuplet - 2; // keeping the last iteration for later for (unsigned int iteration = 0; iteration < numberOfIterations - 1; - ++iteration) - { - for (auto& layerPair : theLayerGraph.theLayerPairs) - { - for (auto i =layerPair.theFoundCells[0]; i& foundNtuplets, - const unsigned int minHitsPerNtuplet) -{ - CACell::CAntuple tmpNtuplet; - tmpNtuplet.reserve(minHitsPerNtuplet); - - for (auto root_cell : theRootCells) - { - tmpNtuplet.clear(); - tmpNtuplet.push_back(root_cell); - allCells[root_cell].findNtuplets(allCells,foundNtuplets, tmpNtuplet, minHitsPerNtuplet); - } - + std::vector &foundNtuplets, + const unsigned int minHitsPerNtuplet) { + CACell::CAntuple tmpNtuplet; + tmpNtuplet.reserve(minHitsPerNtuplet); + + for (auto root_cell : theRootCells) { + tmpNtuplet.clear(); + tmpNtuplet.push_back(root_cell); + allCells[root_cell].findNtuplets(allCells, foundNtuplets, tmpNtuplet, + minHitsPerNtuplet); + } } +void CellularAutomaton::findTriplets( + const std::vector &hitDoublets, + std::vector &foundTriplets, const TrackingRegion ®ion, + const float thetaCut, const float phiCut, const float hardPtCut) { + int tsize = 0; + for (auto hd : hitDoublets) + tsize += hd->size(); + allCells.reserve(tsize); + + unsigned int cellId = 0; + float ptmin = region.ptMin(); + float region_origin_x = region.origin().x(); + float region_origin_y = region.origin().y(); + float region_origin_radius = region.originRBound(); + + std::vector alreadyVisitedLayerPairs; + alreadyVisitedLayerPairs.resize(theLayerGraph.theLayerPairs.size()); + for (auto visited : alreadyVisitedLayerPairs) { + visited = false; + } + for (int rootVertex : theLayerGraph.theRootLayers) { + + std::queue LayerPairsToVisit; + + for (int LayerPair : + theLayerGraph.theLayers[rootVertex].theOuterLayerPairs) { + LayerPairsToVisit.push(LayerPair); + } -void CellularAutomaton::findTriplets(const std::vector& hitDoublets,std::vector& foundTriplets, const TrackingRegion& region, - const float thetaCut, const float phiCut, const float hardPtCut) -{ - int tsize=0; - for ( auto hd : hitDoublets) tsize+=hd->size(); - allCells.reserve(tsize); - - unsigned int cellId = 0; - float ptmin = region.ptMin(); - float region_origin_x = region.origin().x(); - float region_origin_y = region.origin().y(); - float region_origin_radius = region.originRBound(); - - std::vector alreadyVisitedLayerPairs; - alreadyVisitedLayerPairs.resize(theLayerGraph.theLayerPairs.size()); - for (auto visited : alreadyVisitedLayerPairs) - { - visited = false; - } - for (int rootVertex : theLayerGraph.theRootLayers) - { - - std::queue LayerPairsToVisit; - - for (int LayerPair : theLayerGraph.theLayers[rootVertex].theOuterLayerPairs) - { - LayerPairsToVisit.push(LayerPair); - - } - - unsigned int numberOfLayerPairsToVisitAtThisDepth = - LayerPairsToVisit.size(); - - while (!LayerPairsToVisit.empty()) - { - auto currentLayerPair = LayerPairsToVisit.front(); - auto & currentLayerPairRef = theLayerGraph.theLayerPairs[currentLayerPair]; - auto & currentInnerLayerRef = theLayerGraph.theLayers[currentLayerPairRef.theLayers[0]]; - auto & currentOuterLayerRef = theLayerGraph.theLayers[currentLayerPairRef.theLayers[1]]; - bool allInnerLayerPairsAlreadyVisited { true }; - - for (auto innerLayerPair : currentInnerLayerRef.theInnerLayerPairs) - { - allInnerLayerPairsAlreadyVisited &= - alreadyVisitedLayerPairs[innerLayerPair]; - } - - if (alreadyVisitedLayerPairs[currentLayerPair] == false - && allInnerLayerPairsAlreadyVisited) - { - - const HitDoublets* doubletLayerPairId = - hitDoublets[currentLayerPair]; - auto numberOfDoublets = doubletLayerPairId->size(); - currentLayerPairRef.theFoundCells[0] = cellId; - currentLayerPairRef.theFoundCells[1] = cellId+numberOfDoublets; - for (unsigned int i = 0; i < numberOfDoublets; ++i) - { - allCells.emplace_back(doubletLayerPairId, i, - doubletLayerPairId->innerHitId(i), - doubletLayerPairId->outerHitId(i)); - - - currentOuterLayerRef.isOuterHitOfCell[doubletLayerPairId->outerHitId(i)].push_back(cellId); - - cellId++; - - auto & neigCells = currentInnerLayerRef.isOuterHitOfCell[doubletLayerPairId->innerHitId(i)]; - allCells.back().checkAlignmentAndPushTriplet(allCells, - neigCells, foundTriplets, ptmin, region_origin_x, - region_origin_y, region_origin_radius, thetaCut, - phiCut, hardPtCut - ); - } - assert(cellId==currentLayerPairRef.theFoundCells[1]); - - - for (auto outerLayerPair : currentOuterLayerRef.theOuterLayerPairs) - { - LayerPairsToVisit.push(outerLayerPair); - } - - alreadyVisitedLayerPairs[currentLayerPair] = true; - } - LayerPairsToVisit.pop(); - numberOfLayerPairsToVisitAtThisDepth--; - if (numberOfLayerPairsToVisitAtThisDepth == 0) - { - numberOfLayerPairsToVisitAtThisDepth = LayerPairsToVisit.size(); - } - - } - - } - + unsigned int numberOfLayerPairsToVisitAtThisDepth = + LayerPairsToVisit.size(); + + while (!LayerPairsToVisit.empty()) { + auto currentLayerPair = LayerPairsToVisit.front(); + auto ¤tLayerPairRef = theLayerGraph.theLayerPairs[currentLayerPair]; + auto ¤tInnerLayerRef = + theLayerGraph.theLayers[currentLayerPairRef.theLayers[0]]; + auto ¤tOuterLayerRef = + theLayerGraph.theLayers[currentLayerPairRef.theLayers[1]]; + bool allInnerLayerPairsAlreadyVisited{true}; + + for (auto innerLayerPair : currentInnerLayerRef.theInnerLayerPairs) { + allInnerLayerPairsAlreadyVisited &= + alreadyVisitedLayerPairs[innerLayerPair]; + } + + if (alreadyVisitedLayerPairs[currentLayerPair] == false && + allInnerLayerPairsAlreadyVisited) { + + const HitDoublets *doubletLayerPairId = hitDoublets[currentLayerPair]; + auto numberOfDoublets = doubletLayerPairId->size(); + currentLayerPairRef.theFoundCells[0] = cellId; + currentLayerPairRef.theFoundCells[1] = cellId + numberOfDoublets; + for (unsigned int i = 0; i < numberOfDoublets; ++i) { + allCells.emplace_back(doubletLayerPairId, i, + doubletLayerPairId->innerHitId(i), + doubletLayerPairId->outerHitId(i)); + + currentOuterLayerRef + .isOuterHitOfCell[doubletLayerPairId->outerHitId(i)] + .push_back(cellId); + + cellId++; + + auto &neigCells = + currentInnerLayerRef + .isOuterHitOfCell[doubletLayerPairId->innerHitId(i)]; + allCells.back().checkAlignmentAndPushTriplet( + allCells, neigCells, foundTriplets, ptmin, region_origin_x, + region_origin_y, region_origin_radius, thetaCut, phiCut, + hardPtCut); + } + assert(cellId == currentLayerPairRef.theFoundCells[1]); + + for (auto outerLayerPair : currentOuterLayerRef.theOuterLayerPairs) { + LayerPairsToVisit.push(outerLayerPair); + } + + alreadyVisitedLayerPairs[currentLayerPair] = true; + } + LayerPairsToVisit.pop(); + numberOfLayerPairsToVisitAtThisDepth--; + if (numberOfLayerPairsToVisitAtThisDepth == 0) { + numberOfLayerPairsToVisitAtThisDepth = LayerPairsToVisit.size(); + } + } + } } diff --git a/RecoPixelVertexing/PixelTriplets/plugins/GPUCACell.h b/RecoPixelVertexing/PixelTriplets/plugins/GPUCACell.h new file mode 100644 index 0000000000000..14d8ee833ce71 --- /dev/null +++ b/RecoPixelVertexing/PixelTriplets/plugins/GPUCACell.h @@ -0,0 +1,273 @@ +// +// Author: Felice Pantaleo, CERN +// +#ifndef GPU_CACELL_H_ +#define GPU_CACELL_H_ + +#include "GPUHitsAndDoublets.h" +#include "HeterogeneousCore/CUDAUtilities/interface/GPUVecArray.h" +#include "HeterogeneousCore/CUDAUtilities/interface/GPUSimpleVector.h" +#include +struct Quadruplet { + int2 layerPairsAndCellId[3]; +}; + +class GPUCACell { +public: + __host__ __device__ GPUCACell() {} + + __host__ __device__ void init(const GPULayerDoublets *doublets, + const GPULayerHits *hitsOnLayer, + int layerPairId, int doubletId, int innerHitId, + int outerHitId, float regionX, float regionY) { + + theInnerHitId = innerHitId; + theOuterHitId = outerHitId; + theDoubletId = doubletId; + theLayerPairId = layerPairId; + + auto innerLayerId = doublets->innerLayerId; + auto outerLayerId = doublets->outerLayerId; + + theInnerX = hitsOnLayer[innerLayerId].x[innerHitId]; + theOuterX = hitsOnLayer[outerLayerId].x[outerHitId]; + + theInnerY = hitsOnLayer[innerLayerId].y[innerHitId]; + theOuterY = hitsOnLayer[outerLayerId].y[outerHitId]; + + theInnerZ = hitsOnLayer[innerLayerId].z[innerHitId]; + theOuterZ = hitsOnLayer[outerLayerId].z[outerHitId]; + theInnerR = hypot(theInnerX - regionX, theInnerY - regionY); + theOuterR = hypot(theOuterX - regionX, theOuterY - regionY); + theOuterNeighbors.reset(); + } + + constexpr float get_inner_x() const { return theInnerX; } + constexpr float get_outer_x() const { return theOuterX; } + constexpr float get_inner_y() const { return theInnerY; } + constexpr float get_outer_y() const { return theOuterY; } + constexpr float get_inner_z() const { return theInnerZ; } + constexpr float get_outer_z() const { return theOuterZ; } + constexpr float get_inner_r() const { return theInnerR; } + constexpr float get_outer_r() const { return theOuterR; } + constexpr unsigned int get_inner_hit_id() const { + return theInnerHitId; + } + constexpr unsigned int get_outer_hit_id() const { + return theOuterHitId; + } + + constexpr void print_cell() const { + + printf("printing cell: %d, on layerPair: %d, innerHitId: %d, outerHitId: " + "%d, innerradius %f, outerRadius %f \n", + theDoubletId, theLayerPairId, theInnerHitId, theOuterHitId, + theInnerR, theOuterR); + } + + + + __host__ __device__ bool check_alignment_and_tag( + const GPUCACell *cells, unsigned int innerCellId, const float ptmin, + const float region_origin_x, const float region_origin_y, + const float region_origin_radius, const float thetaCut, + const float phiCut, const float hardPtCut) { + auto ro = get_outer_r(); + auto zo = get_outer_z(); + const auto &otherCell = cells[innerCellId]; + + auto r1 = otherCell.get_inner_r(); + auto z1 = otherCell.get_inner_z(); + bool aligned = areAlignedRZ(r1, z1, ro, zo, ptmin, thetaCut); + return (aligned && + haveSimilarCurvature(cells, innerCellId, ptmin, region_origin_x, + region_origin_y, region_origin_radius, phiCut, + hardPtCut)); + } + + + constexpr bool areAlignedRZ(float r1, float z1, float ro, float zo, + const float ptmin, + const float thetaCut) const { + float radius_diff = std::abs(r1 - ro); + float distance_13_squared = + radius_diff * radius_diff + (z1 - zo) * (z1 - zo); + + float pMin = + ptmin * std::sqrt(distance_13_squared); // this needs to be divided by + // radius_diff later + + float tan_12_13_half_mul_distance_13_squared = + fabs(z1 * (get_inner_r() - ro) + get_inner_z() * (ro - r1) + zo * (r1 - get_inner_r())); + return tan_12_13_half_mul_distance_13_squared * pMin <= thetaCut * distance_13_squared * radius_diff; + } + + constexpr bool + haveSimilarCurvature(const GPUCACell *cells, unsigned int innerCellId, + const float ptmin, const float region_origin_x, + const float region_origin_y, + const float region_origin_radius, const float phiCut, + const float hardPtCut) const { + + const auto &otherCell = cells[innerCellId]; + + auto x1 = otherCell.get_inner_x(); + auto y1 = otherCell.get_inner_y(); + + auto x2 = get_inner_x(); + auto y2 = get_inner_y(); + + auto x3 = get_outer_x(); + auto y3 = get_outer_y(); + + float distance_13_squared = (x1 - x3) * (x1 - x3) + (y1 - y3) * (y1 - y3); + float tan_12_13_half_mul_distance_13_squared = + fabs(y1 * (x2 - x3) + y2 * (x3 - x1) + y3 * (x1 - x2)); + // high pt : just straight + if (tan_12_13_half_mul_distance_13_squared * ptmin <= + 1.0e-4f * distance_13_squared) { + + float distance_3_beamspot_squared = + (x3 - region_origin_x) * (x3 - region_origin_x) + + (y3 - region_origin_y) * (y3 - region_origin_y); + + float dot_bs3_13 = ((x1 - x3) * (region_origin_x - x3) + + (y1 - y3) * (region_origin_y - y3)); + float proj_bs3_on_13_squared = + dot_bs3_13 * dot_bs3_13 / distance_13_squared; + + float distance_13_beamspot_squared = + distance_3_beamspot_squared - proj_bs3_on_13_squared; + + return distance_13_beamspot_squared < + (region_origin_radius + phiCut) * (region_origin_radius + phiCut); + } + + // 87 cm/GeV = 1/(3.8T * 0.3) + + // take less than radius given by the hardPtCut and reject everything below + float minRadius = hardPtCut * 87.f; // FIXME move out and use real MagField + + auto det = (x1 - x2) * (y2 - y3) - (x2 - x3) * (y1 - y2); + + auto offset = x2 * x2 + y2 * y2; + + auto bc = (x1 * x1 + y1 * y1 - offset) * 0.5f; + + auto cd = (offset - x3 * x3 - y3 * y3) * 0.5f; + + auto idet = 1.f / det; + + auto x_center = (bc * (y2 - y3) - cd * (y1 - y2)) * idet; + auto y_center = (cd * (x1 - x2) - bc * (x2 - x3)) * idet; + + auto radius = std::sqrt((x2 - x_center) * (x2 - x_center) + + (y2 - y_center) * (y2 - y_center)); + + if (radius < minRadius) + return false; // hard cut on pt + + auto centers_distance_squared = + (x_center - region_origin_x) * (x_center - region_origin_x) + + (y_center - region_origin_y) * (y_center - region_origin_y); + auto region_origin_radius_plus_tolerance = region_origin_radius + phiCut; + auto minimumOfIntersectionRange = + (radius - region_origin_radius_plus_tolerance) * + (radius - region_origin_radius_plus_tolerance); + + if (centers_distance_squared >= minimumOfIntersectionRange) { + auto maximumOfIntersectionRange = + (radius + region_origin_radius_plus_tolerance) * + (radius + region_origin_radius_plus_tolerance); + return centers_distance_squared <= maximumOfIntersectionRange; + } + + return false; + } + + // trying to free the track building process from hardcoded layers, leaving + // the visit of the graph based on the neighborhood connections between cells. + #if defined(__NVCC__) || defined(__CUDACC__) + + __device__ inline void find_ntuplets( + const GPUCACell *cells, + GPU::SimpleVector *foundNtuplets, + GPU::VecArray &tmpNtuplet, + const unsigned int minHitsPerNtuplet) const { + + // the building process for a track ends if: + // it has no right neighbor + // it has no compatible neighbor + // the ntuplets is then saved if the number of hits it contains is greater + // than a threshold + + + if ((unsigned int)(tmpNtuplet.size()) >= minHitsPerNtuplet - 1) { + Quadruplet tmpQuadruplet; + for (unsigned int i = 0; i < minHitsPerNtuplet - 1; ++i) { + tmpQuadruplet.layerPairsAndCellId[i].x = cells[tmpNtuplet[i]].theLayerPairId; + tmpQuadruplet.layerPairsAndCellId[i].y = tmpNtuplet[i]; + } + foundNtuplets->push_back(tmpQuadruplet); + } + else { + for (int j = 0; j < theOuterNeighbors.size(); ++j) { + auto otherCell = theOuterNeighbors[j]; + tmpNtuplet.push_back_unsafe(otherCell); + cells[otherCell].find_ntuplets(cells, foundNtuplets, tmpNtuplet, + minHitsPerNtuplet); + tmpNtuplet.pop_back(); + } + } + } + +#endif + template + __host__ inline void find_ntuplets_host( + const GPUCACell *cells, + GPU::VecArray *foundNtuplets, + GPU::VecArray &tmpNtuplet, + const unsigned int minHitsPerNtuplet) const { + + Quadruplet tmpQuadruplet; + if (tmpNtuplet.size() >= minHitsPerNtuplet - 1) { + for (int i = 0; i < minHitsPerNtuplet - 1; ++i) { + tmpQuadruplet.layerPairsAndCellId[i].x = + cells[tmpNtuplet[i]].theLayerPairId; + + tmpQuadruplet.layerPairsAndCellId[i].y = tmpNtuplet[i]; + } + foundNtuplets->push_back(tmpQuadruplet); + + } + + else { + for (int j = 0; j < theOuterNeighbors.size(); ++j) { + auto otherCell = theOuterNeighbors[j]; + tmpNtuplet.push_back_unsafe(otherCell); + cells[otherCell].find_ntuplets_host(cells, foundNtuplets, tmpNtuplet, + minHitsPerNtuplet); + + tmpNtuplet.pop_back(); + } + } + } + GPU::VecArray< unsigned int, 40> theOuterNeighbors; + + int theDoubletId; + int theLayerPairId; + +private: + unsigned int theInnerHitId; + unsigned int theOuterHitId; + float theInnerX; + float theOuterX; + float theInnerY; + float theOuterY; + float theInnerZ; + float theOuterZ; + float theInnerR; + float theOuterR; +}; + +#endif /*CACELL_H_ */ diff --git a/RecoPixelVertexing/PixelTriplets/plugins/GPUHitsAndDoublets.h b/RecoPixelVertexing/PixelTriplets/plugins/GPUHitsAndDoublets.h new file mode 100644 index 0000000000000..4f24c3331f460 --- /dev/null +++ b/RecoPixelVertexing/PixelTriplets/plugins/GPUHitsAndDoublets.h @@ -0,0 +1,44 @@ +// +// Author: Felice Pantaleo, CERN +// + +#ifndef RecoPixelVertexing_PixelTriplets_GPUHitsAndDoublets_h +#define RecoPixelVertexing_PixelTriplets_GPUHitsAndDoublets_h + +#include + +struct GPULayerHits +{ + unsigned int layerId; + size_t size; + float * x; + float * y; + float * z; +}; + +struct HostLayerHits +{ + unsigned int layerId; + size_t size; + std::vector x; + std::vector y; + std::vector z; +}; + +struct GPULayerDoublets +{ + size_t size; + unsigned int innerLayerId; + unsigned int outerLayerId; + unsigned int * indices; +}; + +struct HostLayerDoublets +{ + size_t size; + unsigned int innerLayerId; + unsigned int outerLayerId; + std::vector indices; +}; + +#endif diff --git a/RecoPixelVertexing/PixelTriplets/python/caHitQuadrupletEDProducer_cfi.py b/RecoPixelVertexing/PixelTriplets/python/caHitQuadrupletEDProducer_cfi.py new file mode 100644 index 0000000000000..8497eba9f759f --- /dev/null +++ b/RecoPixelVertexing/PixelTriplets/python/caHitQuadrupletEDProducer_cfi.py @@ -0,0 +1,8 @@ +import FWCore.ParameterSet.Config as cms +from RecoPixelVertexing.PixelTriplets.caHitQuadrupletDefaultEDProducer_cfi import caHitQuadrupletDefaultEDProducer as _caHitQuadrupletDefaultEDProducer + +caHitQuadrupletEDProducer = _caHitQuadrupletDefaultEDProducer.clone() + +from Configuration.ProcessModifiers.gpu_cff import gpu +from RecoPixelVertexing.PixelTriplets.caHitQuadrupletHeterogeneousEDProducer_cfi import caHitQuadrupletHeterogeneousEDProducer as _caHitQuadrupletHeterogeneousEDProducer +gpu.toReplaceWith(caHitQuadrupletEDProducer, _caHitQuadrupletHeterogeneousEDProducer) From bcee91999c79a1ad3972784e18d368d77c208733 Mon Sep 17 00:00:00 2001 From: Andrea Bocci Date: Mon, 18 Jun 2018 14:38:25 +0200 Subject: [PATCH 65/88] Clean up `CAHitNtupletHeterogeneousEDProducer` (#83) Apply some clean up to the code and formatting of `CAHitNtupletHeterogeneousEDProducer` and `CAHitQuadrupletGeneratorGPU`, as suggested by @makortel during the review of #48: - clean up the `BuildFile.xml` - remove unused data members and arguments from function calls; - percolate the CUDA stream instead of storing it as a data member. Also: - add `cudaCheck` calls around memory allocations and copies; - reduce the number of memory allocations used to set up the GPU state. --- .../PixelTriplets/plugins/BuildFile.xml | 31 ++-- .../CAHitNtupletHeterogeneousEDProducer.cc | 44 +++--- .../plugins/CAHitQuadrupletGeneratorGPU.cc | 30 ++-- .../plugins/CAHitQuadrupletGeneratorGPU.cu | 139 ++++++++---------- .../plugins/CAHitQuadrupletGeneratorGPU.h | 25 +--- 5 files changed, 115 insertions(+), 154 deletions(-) diff --git a/RecoPixelVertexing/PixelTriplets/plugins/BuildFile.xml b/RecoPixelVertexing/PixelTriplets/plugins/BuildFile.xml index b0bca04309c4c..8956caca42899 100644 --- a/RecoPixelVertexing/PixelTriplets/plugins/BuildFile.xml +++ b/RecoPixelVertexing/PixelTriplets/plugins/BuildFile.xml @@ -1,17 +1,16 @@ - - - - - - - - - - - - - - - + + + + + + + + + + + + + + - + diff --git a/RecoPixelVertexing/PixelTriplets/plugins/CAHitNtupletHeterogeneousEDProducer.cc b/RecoPixelVertexing/PixelTriplets/plugins/CAHitNtupletHeterogeneousEDProducer.cc index 3c199f8d011b0..1e4f2fcd56ad6 100644 --- a/RecoPixelVertexing/PixelTriplets/plugins/CAHitNtupletHeterogeneousEDProducer.cc +++ b/RecoPixelVertexing/PixelTriplets/plugins/CAHitNtupletHeterogeneousEDProducer.cc @@ -56,7 +56,6 @@ class CAHitNtupletHeterogeneousEDProducer bool emptyRegionDoublets = false; std::unique_ptr seedingHitSets_; - std::vector ntuplets_; }; CAHitNtupletHeterogeneousEDProducer::CAHitNtupletHeterogeneousEDProducer( @@ -89,7 +88,7 @@ void CAHitNtupletHeterogeneousEDProducer::acquireGPUCuda( const edm::HeterogeneousEvent &iEvent, const edm::EventSetup &iSetup, cuda::stream_t<> &cudaStream) { edm::Handle hdoublets; - iEvent.event().getByToken(doubletToken_, hdoublets); + iEvent.getByToken(doubletToken_, hdoublets); const auto ®ionDoublets = *hdoublets; const SeedingLayerSetsHits &seedingLayerHits = @@ -114,16 +113,11 @@ void CAHitNtupletHeterogeneousEDProducer::acquireGPUCuda( GPUGenerator_.initEvent(iEvent.event(), iSetup); LogDebug("CAHitNtupletHeterogeneousEDProducer") - << "Creating ntuplets_ for " << regionDoublets.regionSize() + << "Creating ntuplets for " << regionDoublets.regionSize() << " regions, and " << regionDoublets.layerPairsSize() << " layer pairs"; - ntuplets_.clear(); - ntuplets_.resize(regionDoublets.regionSize()); - for (auto &ntuplet : ntuplets_) - ntuplet.reserve(localRA_.upper()); - GPUGenerator_.hitNtuplets(regionDoublets, ntuplets_, iSetup, - seedingLayerHits, cudaStream.id()); + GPUGenerator_.hitNtuplets(regionDoublets, iSetup, seedingLayerHits, cudaStream.id()); } } @@ -131,20 +125,22 @@ void CAHitNtupletHeterogeneousEDProducer::produceGPUCuda( edm::HeterogeneousEvent &iEvent, const edm::EventSetup &iSetup, cuda::stream_t<> &cudaStream) { - if (!emptyRegionDoublets) { + if (not emptyRegionDoublets) { edm::Handle hdoublets; iEvent.getByToken(doubletToken_, hdoublets); const auto ®ionDoublets = *hdoublets; const SeedingLayerSetsHits &seedingLayerHits = regionDoublets.seedingLayerHits(); int index = 0; + std::vector ntuplets(regionDoublets.regionSize()); + for (auto &ntuplet : ntuplets) + ntuplet.reserve(localRA_.upper()); for (const auto ®ionLayerPairs : regionDoublets) { const TrackingRegion ®ion = regionLayerPairs.region(); auto seedingHitSetsFiller = seedingHitSets_->beginRegion(®ion); - GPUGenerator_.fillResults(regionDoublets, ntuplets_, iSetup, - seedingLayerHits, cudaStream.id()); - fillNtuplets(seedingHitSetsFiller, ntuplets_[index]); - ntuplets_[index].clear(); + GPUGenerator_.fillResults(regionDoublets, ntuplets, iSetup, seedingLayerHits, cudaStream.id()); + fillNtuplets(seedingHitSetsFiller, ntuplets[index]); + ntuplets[index].clear(); index++; } localRA_.update(seedingHitSets_->size()); @@ -158,10 +154,8 @@ void CAHitNtupletHeterogeneousEDProducer::produceCPU( iEvent.getByToken(doubletToken_, hdoublets); const auto ®ionDoublets = *hdoublets; - const SeedingLayerSetsHits &seedingLayerHits = - regionDoublets.seedingLayerHits(); - if (seedingLayerHits.numberOfLayersInSet() < - CAHitQuadrupletGenerator::minLayers) { + const SeedingLayerSetsHits &seedingLayerHits = regionDoublets.seedingLayerHits(); + if (seedingLayerHits.numberOfLayersInSet() < CAHitQuadrupletGenerator::minLayers) { throw cms::Exception("LogicError") << "CAHitNtupletEDProducer expects " "SeedingLayerSetsHits::numberOfLayersInSet() to be >= " @@ -180,21 +174,21 @@ void CAHitNtupletHeterogeneousEDProducer::produceCPU( CPUGenerator_.initEvent(iEvent.event(), iSetup); LogDebug("CAHitNtupletEDProducer") - << "Creating ntuplets_ for " << regionDoublets.regionSize() + << "Creating ntuplets for " << regionDoublets.regionSize() << " regions, and " << regionDoublets.layerPairsSize() << " layer pairs"; - std::vector ntuplets_; - ntuplets_.resize(regionDoublets.regionSize()); - for (auto &ntuplet : ntuplets_) + std::vector ntuplets; + ntuplets.resize(regionDoublets.regionSize()); + for (auto &ntuplet : ntuplets) ntuplet.reserve(localRA_.upper()); - CPUGenerator_.hitNtuplets(regionDoublets, ntuplets_, iSetup, seedingLayerHits); + CPUGenerator_.hitNtuplets(regionDoublets, ntuplets, iSetup, seedingLayerHits); int index = 0; for (const auto ®ionLayerPairs : regionDoublets) { const TrackingRegion ®ion = regionLayerPairs.region(); auto seedingHitSetsFiller = seedingHitSets->beginRegion(®ion); - fillNtuplets(seedingHitSetsFiller, ntuplets_[index]); - ntuplets_[index].clear(); + fillNtuplets(seedingHitSetsFiller, ntuplets[index]); + ntuplets[index].clear(); index++; } localRA_.update(seedingHitSets->size()); diff --git a/RecoPixelVertexing/PixelTriplets/plugins/CAHitQuadrupletGeneratorGPU.cc b/RecoPixelVertexing/PixelTriplets/plugins/CAHitQuadrupletGeneratorGPU.cc index b91e494ccd087..d7abc6dc65e5b 100644 --- a/RecoPixelVertexing/PixelTriplets/plugins/CAHitQuadrupletGeneratorGPU.cc +++ b/RecoPixelVertexing/PixelTriplets/plugins/CAHitQuadrupletGeneratorGPU.cc @@ -23,7 +23,8 @@ namespace { -template T sqr(T x) { return x * x; } + template T sqr(T x) { return x * x; } + } // namespace using namespace std; @@ -182,9 +183,8 @@ void fillGraph(const SeedingLayerSetsHits &layers, void CAHitQuadrupletGeneratorGPU::hitNtuplets( const IntermediateHitDoublets ®ionDoublets, - std::vector &result, const edm::EventSetup &es, - const SeedingLayerSetsHits &layers, const cudaStream_t &cudaStream) { - cudaStream_ = cudaStream; + const edm::EventSetup &es, + const SeedingLayerSetsHits &layers, cudaStream_t cudaStream) { CAGraph g; hitDoublets.resize(regionDoublets.regionSize()); @@ -288,7 +288,7 @@ void CAHitQuadrupletGeneratorGPU::hitNtuplets( cudaMemcpyAsync(&d_indices_[j * maxNumberOfDoublets_ * 2], &h_indices_[j * maxNumberOfDoublets_ * 2], tmp_layerDoublets_[j].size * 2 * sizeof(int), - cudaMemcpyHostToDevice, cudaStream_); + cudaMemcpyHostToDevice, cudaStream); } for (unsigned int j = 0; j < numberOfLayers_; ++j) { @@ -302,43 +302,43 @@ void CAHitQuadrupletGeneratorGPU::hitNtuplets( cudaMemcpyAsync(&d_x_[maxNumberOfHits_ * j], &h_x_[j * maxNumberOfHits_], tmp_layers_[j].size * sizeof(float), - cudaMemcpyHostToDevice, cudaStream_); + cudaMemcpyHostToDevice, cudaStream); tmp_layers_[j].y = &d_y_[maxNumberOfHits_ * j]; cudaMemcpyAsync(&d_y_[maxNumberOfHits_ * j], &h_y_[j * maxNumberOfHits_], tmp_layers_[j].size * sizeof(float), - cudaMemcpyHostToDevice, cudaStream_); + cudaMemcpyHostToDevice, cudaStream); tmp_layers_[j].z = &d_z_[maxNumberOfHits_ * j]; cudaMemcpyAsync(&d_z_[maxNumberOfHits_ * j], &h_z_[j * maxNumberOfHits_], tmp_layers_[j].size * sizeof(float), - cudaMemcpyHostToDevice, cudaStream_); + cudaMemcpyHostToDevice, cudaStream); } cudaMemcpyAsync(d_rootLayerPairs_, h_rootLayerPairs_, numberOfRootLayerPairs_ * sizeof(unsigned int), - cudaMemcpyHostToDevice, cudaStream_); + cudaMemcpyHostToDevice, cudaStream); cudaMemcpyAsync(d_doublets_, tmp_layerDoublets_, numberOfLayerPairs_ * sizeof(GPULayerDoublets), - cudaMemcpyHostToDevice, cudaStream_); + cudaMemcpyHostToDevice, cudaStream); cudaMemcpyAsync(d_layers_, tmp_layers_, numberOfLayers_ * sizeof(GPULayerHits), - cudaMemcpyHostToDevice, cudaStream_); + cudaMemcpyHostToDevice, cudaStream); - launchKernels(region, index); -} + launchKernels(region, index, cudaStream); + } } void CAHitQuadrupletGeneratorGPU::fillResults( const IntermediateHitDoublets ®ionDoublets, std::vector &result, const edm::EventSetup &es, - const SeedingLayerSetsHits &layers, const cudaStream_t &cudaStream) + const SeedingLayerSetsHits &layers, cudaStream_t cudaStream) { int index = 0; for (const auto ®ionLayerPairs : regionDoublets) { const TrackingRegion ®ion = regionLayerPairs.region(); - auto foundQuads = fetchKernelResult(index); + auto foundQuads = fetchKernelResult(index, cudaStream); unsigned int numberOfFoundQuadruplets = foundQuads.size(); const QuantityDependsPtEval maxChi2Eval = maxChi2.evaluator(es); diff --git a/RecoPixelVertexing/PixelTriplets/plugins/CAHitQuadrupletGeneratorGPU.cu b/RecoPixelVertexing/PixelTriplets/plugins/CAHitQuadrupletGeneratorGPU.cu index 99364e59fabb9..615ea1c31f826 100644 --- a/RecoPixelVertexing/PixelTriplets/plugins/CAHitQuadrupletGeneratorGPU.cu +++ b/RecoPixelVertexing/PixelTriplets/plugins/CAHitQuadrupletGeneratorGPU.cu @@ -314,22 +314,20 @@ __global__ void kernel_find_ntuplets( GPUCACell *cells, GPU::SimpleVector *foundNtuplets, unsigned int *rootLayerPairs, unsigned int minHitsPerNtuplet, - unsigned int maxNumberOfDoublets_) { - + unsigned int maxNumberOfDoublets_) +{ if (blockIdx.y < numberOfRootLayerPairs_) { - unsigned int cellIndexInRootLayerPair = - threadIdx.x + blockIdx.x * blockDim.x; + unsigned int cellIndexInRootLayerPair = threadIdx.x + blockIdx.x * blockDim.x; unsigned int rootLayerPairIndex = rootLayerPairs[blockIdx.y]; auto globalFirstDoubletIdx = rootLayerPairIndex * maxNumberOfDoublets_; - GPU::VecArray< unsigned int, 3> stack; + GPU::VecArray stack; for (int i = cellIndexInRootLayerPair; i < gpuDoublets[rootLayerPairIndex].size; i += gridDim.x * blockDim.x) { auto globalCellIdx = i + globalFirstDoubletIdx; stack.reset(); stack.push_back_unsafe(globalCellIdx); - cells[globalCellIdx].find_ntuplets(cells, foundNtuplets, stack, - minHitsPerNtuplet); + cells[globalCellIdx].find_ntuplets(cells, foundNtuplets, stack, minHitsPerNtuplet); } } } @@ -354,8 +352,8 @@ kernel_print_found_ntuplets(GPU::SimpleVector *foundNtuplets) { } } -void CAHitQuadrupletGeneratorGPU::deallocateOnGPU() { - +void CAHitQuadrupletGeneratorGPU::deallocateOnGPU() +{ cudaFreeHost(h_indices_); cudaFreeHost(h_doublets_); cudaFreeHost(h_x_); @@ -366,7 +364,6 @@ void CAHitQuadrupletGeneratorGPU::deallocateOnGPU() { { cudaFreeHost(h_foundNtupletsVec_[i]); cudaFreeHost(h_foundNtupletsData_[i]); - cudaFreeHost(tmp_foundNtupletsVec_[i]); cudaFree(d_foundNtupletsVec_[i]); cudaFree(d_foundNtupletsData_[i]); } @@ -384,25 +381,24 @@ void CAHitQuadrupletGeneratorGPU::deallocateOnGPU() { cudaFree(device_isOuterHitOfCell_); } -void CAHitQuadrupletGeneratorGPU::allocateOnGPU() { +void CAHitQuadrupletGeneratorGPU::allocateOnGPU() +{ cudaCheck(cudaMallocHost(&h_doublets_, maxNumberOfLayerPairs_ * sizeof(GPULayerDoublets))); - cudaMallocHost(&h_indices_, - maxNumberOfLayerPairs_ * maxNumberOfDoublets_ * 2 * sizeof(int)); - cudaMallocHost(&h_x_, maxNumberOfLayers_ * maxNumberOfHits_ * sizeof(float)); - cudaMallocHost(&h_y_, maxNumberOfLayers_ * maxNumberOfHits_ * sizeof(float)); - cudaMallocHost(&h_z_, maxNumberOfLayers_ * maxNumberOfHits_ * sizeof(float)); - cudaMallocHost(&h_rootLayerPairs_, maxNumberOfRootLayerPairs_ * sizeof(int)); - - cudaMalloc(&d_indices_, - maxNumberOfLayerPairs_ * maxNumberOfDoublets_ * 2 * sizeof(int)); - cudaMalloc(&d_doublets_, maxNumberOfLayerPairs_ * sizeof(GPULayerDoublets)); - cudaMalloc(&d_layers_, maxNumberOfLayers_ * sizeof(GPULayerHits)); - cudaMalloc(&d_x_, maxNumberOfLayers_ * maxNumberOfHits_ * sizeof(float)); - cudaMalloc(&d_y_, maxNumberOfLayers_ * maxNumberOfHits_ * sizeof(float)); - cudaMalloc(&d_z_, maxNumberOfLayers_ * maxNumberOfHits_ * sizeof(float)); - cudaMalloc(&d_rootLayerPairs_, - maxNumberOfRootLayerPairs_ * sizeof(unsigned int)); + cudaCheck(cudaMallocHost(&h_indices_, maxNumberOfLayerPairs_ * maxNumberOfDoublets_ * 2 * sizeof(int))); + cudaCheck(cudaMallocHost(&h_x_, maxNumberOfLayers_ * maxNumberOfHits_ * sizeof(float))); + cudaCheck(cudaMallocHost(&h_y_, maxNumberOfLayers_ * maxNumberOfHits_ * sizeof(float))); + cudaCheck(cudaMallocHost(&h_z_, maxNumberOfLayers_ * maxNumberOfHits_ * sizeof(float))); + cudaCheck(cudaMallocHost(&h_rootLayerPairs_, maxNumberOfRootLayerPairs_ * sizeof(int))); + + cudaCheck(cudaMalloc(&d_indices_, maxNumberOfLayerPairs_ * maxNumberOfDoublets_ * 2 * sizeof(int))); + cudaCheck(cudaMalloc(&d_doublets_, maxNumberOfLayerPairs_ * sizeof(GPULayerDoublets))); + cudaCheck(cudaMalloc(&d_layers_, maxNumberOfLayers_ * sizeof(GPULayerHits))); + cudaCheck(cudaMalloc(&d_x_, maxNumberOfLayers_ * maxNumberOfHits_ * sizeof(float))); + cudaCheck(cudaMalloc(&d_y_, maxNumberOfLayers_ * maxNumberOfHits_ * sizeof(float))); + cudaCheck(cudaMalloc(&d_z_, maxNumberOfLayers_ * maxNumberOfHits_ * sizeof(float))); + cudaCheck(cudaMalloc(&d_rootLayerPairs_, maxNumberOfRootLayerPairs_ * sizeof(unsigned int))); + ////////////////////////////////////////////////////////// // ALLOCATIONS FOR THE INTERMEDIATE RESULTS (STAYS ON WORKER) ////////////////////////////////////////////////////////// @@ -411,101 +407,82 @@ void CAHitQuadrupletGeneratorGPU::allocateOnGPU() { maxNumberOfLayerPairs_ * maxNumberOfDoublets_ * sizeof(GPUCACell))); cudaCheck(cudaMalloc(&device_isOuterHitOfCell_, - maxNumberOfLayers_ * maxNumberOfHits_ * - sizeof(GPU::VecArray< unsigned int , maxCellsPerHit_>))); + maxNumberOfLayers_ * maxNumberOfHits_ * sizeof(GPU::VecArray))); cudaCheck(cudaMemset(device_isOuterHitOfCell_, 0, - maxNumberOfLayers_ * maxNumberOfHits_ * - sizeof(GPU::VecArray))); + maxNumberOfLayers_ * maxNumberOfHits_ * sizeof(GPU::VecArray))); h_foundNtupletsVec_.resize(maxNumberOfRegions_); h_foundNtupletsData_.resize(maxNumberOfRegions_); d_foundNtupletsVec_.resize(maxNumberOfRegions_); d_foundNtupletsData_.resize(maxNumberOfRegions_); - tmp_foundNtupletsVec_.resize(maxNumberOfRegions_); + // FIXME this could be rewritten with a single pair of cudaMallocHost / cudaMalloc for (int i = 0; i < maxNumberOfRegions_; ++i) { - cudaCheck(cudaMalloc(&d_foundNtupletsVec_[i], - sizeof(GPU::SimpleVector))); - cudaCheck(cudaMalloc(&d_foundNtupletsData_[i], sizeof(Quadruplet)*maxNumberOfQuadruplets_)); - cudaCheck(cudaMallocHost(&h_foundNtupletsVec_[i], - sizeof(GPU::SimpleVector))); - cudaCheck(cudaMallocHost(&h_foundNtupletsData_[i], sizeof(Quadruplet)*maxNumberOfQuadruplets_)); - cudaCheck(cudaMallocHost(&tmp_foundNtupletsVec_[i], - sizeof(GPU::SimpleVector))); - new (h_foundNtupletsVec_[i]) GPU::SimpleVector(maxNumberOfQuadruplets_, h_foundNtupletsData_[i]); - new (tmp_foundNtupletsVec_[i]) GPU::SimpleVector(maxNumberOfQuadruplets_, d_foundNtupletsData_[i]); - - cudaMemcpy(d_foundNtupletsVec_[i], tmp_foundNtupletsVec_[i], sizeof(GPU::SimpleVector), cudaMemcpyDefault); - + cudaCheck(cudaMallocHost(&h_foundNtupletsData_[i], sizeof(Quadruplet) * maxNumberOfQuadruplets_)); + cudaCheck(cudaMallocHost(&h_foundNtupletsVec_[i], sizeof(GPU::SimpleVector))); + new(h_foundNtupletsVec_[i]) GPU::SimpleVector(maxNumberOfQuadruplets_, h_foundNtupletsData_[i]); + cudaCheck(cudaMalloc(&d_foundNtupletsData_[i], sizeof(Quadruplet) * maxNumberOfQuadruplets_)); + cudaCheck(cudaMalloc(&d_foundNtupletsVec_[i], sizeof(GPU::SimpleVector))); + GPU::SimpleVector tmp_foundNtuplets(maxNumberOfQuadruplets_, d_foundNtupletsData_[i]); + cudaCheck(cudaMemcpy(d_foundNtupletsVec_[i], & tmp_foundNtuplets, sizeof(GPU::SimpleVector), cudaMemcpyDefault)); } - cudaMallocHost(&tmp_layers_, maxNumberOfLayers_ * sizeof(GPULayerHits)); - cudaMallocHost(&tmp_layerDoublets_, - maxNumberOfLayerPairs_ * sizeof(GPULayerDoublets)); - cudaMallocHost(&h_layers_, maxNumberOfLayers_ * sizeof(GPULayerHits)); + cudaCheck(cudaMallocHost(&tmp_layers_, maxNumberOfLayers_ * sizeof(GPULayerHits))); + cudaCheck(cudaMallocHost(&tmp_layerDoublets_,maxNumberOfLayerPairs_ * sizeof(GPULayerDoublets))); + cudaCheck(cudaMallocHost(&h_layers_, maxNumberOfLayers_ * sizeof(GPULayerHits))); } void CAHitQuadrupletGeneratorGPU::launchKernels(const TrackingRegion ®ion, - int regionIndex) { - + int regionIndex, cudaStream_t cudaStream) +{ assert(regionIndex < maxNumberOfRegions_); dim3 numberOfBlocks_create(64, numberOfLayerPairs_); dim3 numberOfBlocks_connect(32, numberOfLayerPairs_); dim3 numberOfBlocks_find(16, numberOfRootLayerPairs_); h_foundNtupletsVec_[regionIndex]->reset(); - kernel_create<<>>( + kernel_create<<>>( numberOfLayerPairs_, d_doublets_, d_layers_, device_theCells_, device_isOuterHitOfCell_, d_foundNtupletsVec_[regionIndex], region.origin().x(), region.origin().y(), maxNumberOfDoublets_, maxNumberOfHits_); - kernel_connect<<>>( + kernel_connect<<>>( numberOfLayerPairs_, d_doublets_, device_theCells_, device_isOuterHitOfCell_, region.ptMin(), region.origin().x(), region.origin().y(), region.originRBound(), caThetaCut, caPhiCut, caHardPtCut, maxNumberOfDoublets_, maxNumberOfHits_); - kernel_find_ntuplets<<>>( + kernel_find_ntuplets<<>>( numberOfRootLayerPairs_, d_doublets_, device_theCells_, d_foundNtupletsVec_[regionIndex], d_rootLayerPairs_, 4, maxNumberOfDoublets_); - cudaMemcpyAsync(h_foundNtupletsVec_[regionIndex], d_foundNtupletsVec_[regionIndex], - sizeof(GPU::SimpleVector), - cudaMemcpyDeviceToHost, cudaStream_); + cudaCheck(cudaMemcpyAsync(h_foundNtupletsVec_[regionIndex], d_foundNtupletsVec_[regionIndex], + sizeof(GPU::SimpleVector), + cudaMemcpyDeviceToHost, cudaStream)); - cudaMemcpyAsync(h_foundNtupletsData_[regionIndex], d_foundNtupletsData_[regionIndex], - maxNumberOfQuadruplets_*sizeof(Quadruplet), - cudaMemcpyDeviceToHost, cudaStream_); + cudaCheck(cudaMemcpyAsync(h_foundNtupletsData_[regionIndex], d_foundNtupletsData_[regionIndex], + maxNumberOfQuadruplets_*sizeof(Quadruplet), + cudaMemcpyDeviceToHost, cudaStream)); } std::vector, 3>> -CAHitQuadrupletGeneratorGPU::fetchKernelResult(int regionIndex) { - +CAHitQuadrupletGeneratorGPU::fetchKernelResult(int regionIndex, cudaStream_t cudaStream) +{ h_foundNtupletsVec_[regionIndex]->set_data(h_foundNtupletsData_[regionIndex]); - //this lazily resets temporary memory for the next event, and is not needed for reading the output - cudaMemsetAsync(device_isOuterHitOfCell_, 0, - maxNumberOfLayers_ * maxNumberOfHits_ * - sizeof(GPU::VecArray), - cudaStream_); - std::vector, 3>> quadsInterface; + // this lazily resets temporary memory for the next event, and is not needed for reading the output + cudaCheck(cudaMemsetAsync(device_isOuterHitOfCell_, 0, + maxNumberOfLayers_ * maxNumberOfHits_ * sizeof(GPU::VecArray), + cudaStream)); + std::vector, 3>> quadsInterface; for (int i = 0; i < h_foundNtupletsVec_[regionIndex]->size(); ++i) { + auto const& layerPairsAndCellId = (*h_foundNtupletsVec_[regionIndex])[i].layerPairsAndCellId; std::array, 3> tmpQuad = { - {std::make_pair((*h_foundNtupletsVec_[regionIndex])[i].layerPairsAndCellId[0].x, - (*h_foundNtupletsVec_[regionIndex])[i].layerPairsAndCellId[0].y - - maxNumberOfDoublets_ * - (*h_foundNtupletsVec_[regionIndex])[i].layerPairsAndCellId[0].x), - std::make_pair((*h_foundNtupletsVec_[regionIndex])[i].layerPairsAndCellId[1].x, - (*h_foundNtupletsVec_[regionIndex])[i].layerPairsAndCellId[1].y - - maxNumberOfDoublets_ * - (*h_foundNtupletsVec_[regionIndex])[i].layerPairsAndCellId[1].x), - std::make_pair((*h_foundNtupletsVec_[regionIndex])[i].layerPairsAndCellId[2].x, - (*h_foundNtupletsVec_[regionIndex])[i].layerPairsAndCellId[2].y - - maxNumberOfDoublets_ * - (*h_foundNtupletsVec_[regionIndex])[i].layerPairsAndCellId[2].x)}}; - + {std::make_pair(layerPairsAndCellId[0].x, layerPairsAndCellId[0].y - maxNumberOfDoublets_ * layerPairsAndCellId[0].x), + std::make_pair(layerPairsAndCellId[1].x, layerPairsAndCellId[1].y - maxNumberOfDoublets_ * layerPairsAndCellId[1].x), + std::make_pair(layerPairsAndCellId[2].x, layerPairsAndCellId[2].y - maxNumberOfDoublets_ * layerPairsAndCellId[2].x)}}; quadsInterface.push_back(tmpQuad); } diff --git a/RecoPixelVertexing/PixelTriplets/plugins/CAHitQuadrupletGeneratorGPU.h b/RecoPixelVertexing/PixelTriplets/plugins/CAHitQuadrupletGeneratorGPU.h index 449fd7fa84f13..181644bdc3964 100644 --- a/RecoPixelVertexing/PixelTriplets/plugins/CAHitQuadrupletGeneratorGPU.h +++ b/RecoPixelVertexing/PixelTriplets/plugins/CAHitQuadrupletGeneratorGPU.h @@ -52,13 +52,12 @@ class CAHitQuadrupletGeneratorGPU { void initEvent(const edm::Event& ev, const edm::EventSetup& es); void hitNtuplets(const IntermediateHitDoublets& regionDoublets, - std::vector& result, const edm::EventSetup& es, - const SeedingLayerSetsHits& layers, const cudaStream_t& stream); + const SeedingLayerSetsHits& layers, cudaStream_t stream); void fillResults(const IntermediateHitDoublets& regionDoublets, std::vector& result, const edm::EventSetup& es, - const SeedingLayerSetsHits& layers, const cudaStream_t& stream); + const SeedingLayerSetsHits& layers, cudaStream_t stream); void allocateOnGPU(); void deallocateOnGPU(); @@ -132,12 +131,10 @@ class CAHitQuadrupletGeneratorGPU { const bool enabled_; }; - - - void launchKernels(const TrackingRegion &, int); - std::vector ,3 > > fetchKernelResult(int ); + void launchKernels(const TrackingRegion &, int, cudaStream_t); + std::vector ,3>> fetchKernelResult(int, cudaStream_t); const float extraHitRPhitolerance; - std::vector > hitDoublets; + std::vector> hitDoublets; const QuantityDependsPt maxChi2; const bool fitFastCircle; @@ -148,8 +145,6 @@ class CAHitQuadrupletGeneratorGPU { const float caPhiCut = 0.1f; const float caHardPtCut = 0.f; - cudaStream_t cudaStream_; - static constexpr int maxNumberOfQuadruplets_ = 10000; static constexpr int maxCellsPerHit_ = 512; static constexpr int maxNumberOfLayerPairs_ = 13; @@ -163,7 +158,6 @@ class CAHitQuadrupletGeneratorGPU { unsigned int numberOfLayerPairs_ = 0; unsigned int numberOfLayers_ = 0; - GPULayerDoublets* h_doublets_; GPULayerHits* h_layers_; @@ -175,13 +169,10 @@ class CAHitQuadrupletGeneratorGPU { GPULayerDoublets* d_doublets_; unsigned int* d_indices_; unsigned int* h_rootLayerPairs_; - std::vector< GPU::SimpleVector* > h_foundNtupletsVec_; - std::vector< Quadruplet* > h_foundNtupletsData_; - + std::vector*> h_foundNtupletsVec_; + std::vector h_foundNtupletsData_; std::vector*> d_foundNtupletsVec_; - std::vector*> tmp_foundNtupletsVec_; - std::vector d_foundNtupletsData_; GPUCACell* device_theCells_; @@ -189,6 +180,6 @@ class CAHitQuadrupletGeneratorGPU { GPULayerHits* tmp_layers_; GPULayerDoublets* tmp_layerDoublets_; - }; + #endif From 10d59f25ddf40f1131b5f6fa8679a65e23764014 Mon Sep 17 00:00:00 2001 From: Marco Rovere Date: Mon, 18 Jun 2018 15:35:18 +0200 Subject: [PATCH 66/88] Port the Riemann fit to CUDA (#60) - the CPU Riemann fit works using all combinations between the 2 booleans: `useErrors` and `useMultipleScattering`; - the standalone version of the GPU Riemann fit has been updated in order to explore all possibilities among the 2 booleans above: all of them work and produce identical results up to 1e-5 precision (the default one, 1e-6 fails when enabling multiScattering, most likely due to matrix inversions); - the GPU version of the Riemann fit within CMSSW works, with 1 fit assigned to each thread, with 32 threads/warps, all dynamically computed. Things that needs a "hack": - limit the "dynamic" size of Eigen matrices to at most, 4x4, which is just fine for quadruplets. Using anything wider will cause errors which I *believe* is related to the stack size of threads on the GPU; - cast matrices to be inverted to 4x4 (was done before the previous point: will revert it back and see if that's still needed or not, but I believe it is); this was done in order to "specialize" the `invert()` call to something that is "natively" supported by Eigen on GPU (that brought in also few `__host__` `__device__` here and there in Eigen); - fix the alignment of the `struct` holding the results of the fit, since its size was different on GPU and CPU, causing an annoying off-by-one effect. --- .../python/riemannFitGPU_cff.py | 5 + .../PyReleaseValidation/python/relval_2017.py | 2 +- .../python/relval_steps.py | 8 + .../python/relval_upgrade.py | 8 +- .../python/upgradeWorkflowComponents.py | 13 +- .../CUDAUtilities/interface/cudaCheck.h | 3 +- .../interface/PixelTrackReconstructionGPU.h | 40 +++ .../PixelTrackFitting/interface/RiemannFit.h | 243 +++++++++++++++--- .../plugins/PixelTrackProducer.cc | 12 +- .../plugins/PixelTrackProducer.h | 3 + .../python/PixelTracks_cff.py | 2 + .../src/PixelTrackReconstruction.cc | 13 +- .../src/PixelTrackReconstructionGPU.cc | 197 ++++++++++++++ .../src/PixelTrackReconstructionGPU_impl.cu | 118 +++++++++ .../PixelTrackFitting/test/BuildFile.xml | 2 - .../PixelTrackFitting/test/testEigenGPU.cu | 103 ++++++-- .../test/testEigenGPUNoFit.cu | 45 +++- .../PixelTrackFitting/test/test_common.h | 6 +- 18 files changed, 729 insertions(+), 94 deletions(-) create mode 100644 Configuration/ProcessModifiers/python/riemannFitGPU_cff.py create mode 100644 RecoPixelVertexing/PixelTrackFitting/interface/PixelTrackReconstructionGPU.h create mode 100644 RecoPixelVertexing/PixelTrackFitting/src/PixelTrackReconstructionGPU.cc create mode 100644 RecoPixelVertexing/PixelTrackFitting/src/PixelTrackReconstructionGPU_impl.cu diff --git a/Configuration/ProcessModifiers/python/riemannFitGPU_cff.py b/Configuration/ProcessModifiers/python/riemannFitGPU_cff.py new file mode 100644 index 0000000000000..ef622f26b2da0 --- /dev/null +++ b/Configuration/ProcessModifiers/python/riemannFitGPU_cff.py @@ -0,0 +1,5 @@ +import FWCore.ParameterSet.Config as cms + +# This modifier is for replacing the default pixel track "fitting" with Riemann fit on GPU + +riemannFitGPU = cms.Modifier() diff --git a/Configuration/PyReleaseValidation/python/relval_2017.py b/Configuration/PyReleaseValidation/python/relval_2017.py index d2adb4235a00f..749b7c19d85dd 100644 --- a/Configuration/PyReleaseValidation/python/relval_2017.py +++ b/Configuration/PyReleaseValidation/python/relval_2017.py @@ -27,7 +27,7 @@ 10024.1,10024.2,10024.3,10024.4,10024.5, 10801.0,10802.0,10803.0,10804.0,10805.0,10806.0,10807.0,10808.0,10809.0,10859.0,10871.0, 10842.0,10824.0,10825.0,10826.0,10823.0,11024.0,11025.0,11224.0, - 10824.1,10824.5,10824.7,10824.8, + 10824.1,10824.5,10824.7,10824.8,10824.9, 10824.6,11024.6,11224.6, 11642.0,11624.0,11625.0,11626.0,11623.0,11824.0,11825.0,12024.0] for numWF in numWFIB: diff --git a/Configuration/PyReleaseValidation/python/relval_steps.py b/Configuration/PyReleaseValidation/python/relval_steps.py index c89608a9eecf5..a302609fdda2c 100644 --- a/Configuration/PyReleaseValidation/python/relval_steps.py +++ b/Configuration/PyReleaseValidation/python/relval_steps.py @@ -1678,6 +1678,9 @@ def gen2018HiMix(fragment,howMuch): step3_riemannFit = { '--procModifiers': 'riemannFit', } +step3_riemannFitGPU = { + '--procModifiers': 'riemannFitGPU', +} step3_gpu = { '--procModifiers': 'gpu', } @@ -2663,6 +2666,11 @@ def gen2018HiMix(fragment,howMuch): if 'Reco' in step: upgradeStepDict[stepName][k] = merge([step3_riemannFit, step3_pixelTrackingOnly, upgradeStepDict[step][k]]) elif 'HARVEST' in step: upgradeStepDict[stepName][k] = merge([{'-s': 'HARVESTING:@trackingOnlyValidation+@pixelTrackingOnlyDQM'}, upgradeStepDict[step][k]]) + for step in upgradeSteps['pixelTrackingOnlyRiemannFitGPU']['steps']: + stepName = step + upgradeSteps['pixelTrackingOnlyRiemannFitGPU']['suffix'] + if 'Reco' in step: upgradeStepDict[stepName][k] = merge([step3_riemannFitGPU, step3_pixelTrackingOnly, upgradeStepDict[step][k]]) + elif 'HARVEST' in step: upgradeStepDict[stepName][k] = merge([{'-s': 'HARVESTING:@trackingOnlyValidation+@pixelTrackingOnlyDQM'}, upgradeStepDict[step][k]]) + for step in upgradeSteps['pixelTrackingOnlyGPU']['steps']: stepName = step + upgradeSteps['pixelTrackingOnlyGPU']['suffix'] if 'Reco' in step: upgradeStepDict[stepName][k] = merge([step3_gpu, step3_pixelTrackingOnly, upgradeStepDict[step][k]]) diff --git a/Configuration/PyReleaseValidation/python/relval_upgrade.py b/Configuration/PyReleaseValidation/python/relval_upgrade.py index d432ff81255ac..834456c955c91 100644 --- a/Configuration/PyReleaseValidation/python/relval_upgrade.py +++ b/Configuration/PyReleaseValidation/python/relval_upgrade.py @@ -5,7 +5,7 @@ # here only define the workflows as a combination of the steps defined above: workflows = Matrix() -# each workflow defines a name and a list of steps to be done. +# each workflow defines a name and a list of steps to be done. # if no explicit name/label given for the workflow (first arg), # the name of step1 will be used @@ -28,13 +28,13 @@ def makeStepName(key,frag,step,suffix): for stepType in upgradeSteps.keys(): stepList[stepType] = [] hasHarvest = False - for step in upgradeProperties[year][key]['ScenToRun']: + for step in upgradeProperties[year][key]['ScenToRun']: stepMaker = makeStepName if 'Sim' in step: if 'HLBeamSpotFull' in step and '14TeV' in frag: step = 'GenSimHLBeamSpotFull14' stepMaker = makeStepNameSim - + if 'HARVEST' in step: hasHarvest = True for stepType in upgradeSteps.keys(): @@ -74,7 +74,7 @@ def makeStepName(key,frag,step,suffix): # special workflows for tracker if (upgradeDatasetFromFragment[frag]=="TTbar_13" or upgradeDatasetFromFragment[frag]=="TTbar_14TeV") and not 'PU' in key and hasHarvest: # skip ALCA - trackingVariations = ['trackingOnly','trackingRun2','trackingOnlyRun2','trackingLowPU','pixelTrackingOnly','pixelTrackingOnlyRiemannFit','pixelTrackingOnlyGPU'] + trackingVariations = ['trackingOnly','trackingRun2','trackingOnlyRun2','trackingLowPU','pixelTrackingOnly','pixelTrackingOnlyRiemannFit','pixelTrackingOnlyRiemannFitGPU','pixelTrackingOnlyGPU'] for tv in trackingVariations: stepList[tv] = filter(lambda s : "ALCA" not in s, stepList[tv]) workflows[numWF+upgradeSteps['trackingOnly']['offset']] = [ upgradeDatasetFromFragment[frag], stepList['trackingOnly']] diff --git a/Configuration/PyReleaseValidation/python/upgradeWorkflowComponents.py b/Configuration/PyReleaseValidation/python/upgradeWorkflowComponents.py index 2615b0223d6d5..a18b3065395bb 100644 --- a/Configuration/PyReleaseValidation/python/upgradeWorkflowComponents.py +++ b/Configuration/PyReleaseValidation/python/upgradeWorkflowComponents.py @@ -162,6 +162,17 @@ 'suffix' : '_pixelTrackingOnlyGPU', 'offset' : 0.8, } +upgradeSteps['pixelTrackingOnlyRiemannFitGPU'] = { + 'steps' : [ + 'RecoFull', + 'HARVESTFull', + 'RecoFullGlobal', + 'HARVESTFullGlobal', + ], + 'PU' : [], + 'suffix' : '_pixelTrackingOnlyRiemannFitGPU', + 'offset' : 0.9, +} upgradeSteps['Timing'] = { 'steps' : upgradeSteps['baseline']['steps'], 'PU' : upgradeSteps['baseline']['PU'], @@ -387,7 +398,7 @@ 'DoubleMuPt1000Extended_pythia8_cfi', 'TenMuE_0_200_pythia8_cfi', 'SinglePiE50HCAL_pythia8_cfi', - 'MinBias_13TeV_pythia8_TuneCUETP8M1_cfi', + 'MinBias_13TeV_pythia8_TuneCUETP8M1_cfi', 'TTbar_13TeV_TuneCUETP8M1_cfi', 'ZEE_13TeV_TuneCUETP8M1_cfi', 'QCD_Pt_600_800_13TeV_TuneCUETP8M1_cfi', diff --git a/HeterogeneousCore/CUDAUtilities/interface/cudaCheck.h b/HeterogeneousCore/CUDAUtilities/interface/cudaCheck.h index 6d7684694c1d6..4930307a89567 100644 --- a/HeterogeneousCore/CUDAUtilities/interface/cudaCheck.h +++ b/HeterogeneousCore/CUDAUtilities/interface/cudaCheck.h @@ -1,8 +1,9 @@ #ifndef HeterogeneousCore_CUDAUtilities_cudaCheck_h #define HeterogeneousCore_CUDAUtilities_cudaCheck_h -#include #include +#include +#include inline bool cudaCheck_(const char* file, int line, const char* cmd, CUresult result) diff --git a/RecoPixelVertexing/PixelTrackFitting/interface/PixelTrackReconstructionGPU.h b/RecoPixelVertexing/PixelTrackFitting/interface/PixelTrackReconstructionGPU.h new file mode 100644 index 0000000000000..b5085d3ee970d --- /dev/null +++ b/RecoPixelVertexing/PixelTrackFitting/interface/PixelTrackReconstructionGPU.h @@ -0,0 +1,40 @@ +#ifndef RecoPixelVertexing_PixelTrackFitting_PixelTrackReconstructionGPU_H +#define RecoPixelVertexing_PixelTrackFitting_PixelTrackReconstructionGPU_H + +#include "FWCore/ParameterSet/interface/ParameterSet.h" +#include "RecoPixelVertexing/PixelTrackFitting/interface/TracksWithHits.h" +#include "RecoPixelVertexing/PixelTrackFitting/interface/RiemannFit.h" +#include "FWCore/Framework/interface/ConsumesCollector.h" + +#include "FWCore/Utilities/interface/EDGetToken.h" + +#include + +class PixelFitter; +class PixelTrackCleaner; +class PixelTrackFilter; +class RegionsSeedingHitSets; + +namespace edm { class Event; class EventSetup; class Run; class ParameterSetDescription;} + +class PixelTrackReconstructionGPU { +public: + + PixelTrackReconstructionGPU( const edm::ParameterSet& conf, + edm::ConsumesCollector && iC); + ~PixelTrackReconstructionGPU(); + + static void fillDescriptions(edm::ParameterSetDescription& desc); + + void run(pixeltrackfitting::TracksWithTTRHs& tah, edm::Event& ev, const edm::EventSetup& es); + void launchKernelFit(float * hits_and_covariances, int cumulative_size, int hits_in_fit, float B, + Rfit::helix_fit * results); + +private: + edm::EDGetTokenT theHitSetsToken; + edm::EDGetTokenT theFitterToken; + edm::EDGetTokenT theFilterToken; + std::string theCleanerName; +}; +#endif + diff --git a/RecoPixelVertexing/PixelTrackFitting/interface/RiemannFit.h b/RecoPixelVertexing/PixelTrackFitting/interface/RiemannFit.h index d545f78274819..ed1efc8a3240b 100644 --- a/RecoPixelVertexing/PixelTrackFitting/interface/RiemannFit.h +++ b/RecoPixelVertexing/PixelTrackFitting/interface/RiemannFit.h @@ -11,12 +11,14 @@ #define CUDA_HOSTDEV #endif +#define DEBUG 0 + namespace Rfit { using namespace Eigen; constexpr double d = 1.e-4; //!< used in numerical derivative (J2 in Circle_fit()) -constexpr unsigned int max_nop = 8; //!< In order to avoid use of dynamic memory +constexpr unsigned int max_nop = 4; //!< In order to avoid use of dynamic memory using MatrixNd = Eigen::Matrix; using ArrayNd = Eigen::Array; @@ -45,7 +47,7 @@ struct circle_fit { |cov(X0,Y0)|cov(Y0,Y0)|cov( R,Y0)| \n |cov(X0, R)|cov(Y0, R)|cov( R, R)| */ - int q; //!< particle charge + int64_t q; //!< particle charge double chi2; }; @@ -69,19 +71,21 @@ struct helix_fit { |(phi,c_t)|(Tip,c_t)|(p_t,c_t)|(c_t,c_t)|(Zip,c_t)| \n |(phi,Zip)|(Tip,Zip)|(p_t,Zip)|(c_t,Zip)|(Zip,Zip)| */ - int q; //!< particle charge double chi2_circle; double chi2_line; Vector4d fast_fit; - VectorXd time; // TO FIX just for profiling -}; + int64_t q; //!< particle charge + // VectorXd time; // TO FIX just for profiling +} __attribute__ ((aligned(16)) ); template -CUDA_HOSTDEV void printIt(C * m) { +CUDA_HOSTDEV void printIt(C * m, const char * prefix = "", bool debug=false) { for (u_int r = 0; r < m->rows(); ++r) { for (u_int c = 0; c < m->cols(); ++c) { - printf("Matrix(%d,%d) = %f\n", r, c, (*m)(r,c)); + if (debug) { + printf("%s Matrix(%d,%d) = %g\n", prefix, r, c, (*m)(r,c)); + } } } } @@ -126,7 +130,10 @@ CUDA_HOSTDEV inline double cross2D(const Vector2d& a, const Vector2d& b) { */ // X in input TO FIX -CUDA_HOSTDEV MatrixNd Scatter_cov_rad(const Matrix2xNd& p2D, const Vector4d& fast_fit, VectorNd const & rad, double B) { +CUDA_HOSTDEV inline MatrixNd Scatter_cov_rad(const Matrix2xNd& p2D, + const Vector4d& fast_fit, + VectorNd const & rad, + double B) { u_int n = p2D.cols(); double X = 0.04; double theta = atan(fast_fit(3)); @@ -144,6 +151,7 @@ CUDA_HOSTDEV MatrixNd Scatter_cov_rad(const Matrix2xNd& p2D, const Vector4d& fas } } } + Rfit::printIt(&scatter_cov_rad, "Scatter_cov_rad - scatter_cov_rad: ", DEBUG); return scatter_cov_rad; } @@ -160,9 +168,14 @@ CUDA_HOSTDEV MatrixNd Scatter_cov_rad(const Matrix2xNd& p2D, const Vector4d& fas CUDA_HOSTDEV inline Matrix2Nd cov_radtocart(const Matrix2xNd& p2D, const MatrixNd& cov_rad, const VectorNd &rad) { + if (DEBUG) { + printf("Address of p2D: %p\n", &p2D); + } + printIt(&p2D, "cov_radtocart - p2D:"); u_int n = p2D.cols(); Matrix2Nd cov_cart = MatrixXd::Zero(2 * n, 2 * n); VectorNd rad_inv = rad.cwiseInverse(); + printIt(&rad_inv, "cov_radtocart - rad_inv:"); for (u_int i = 0; i < n; ++i) { for (u_int j = i; j < n; ++j) { cov_cart(i, j) = cov_rad(i, j) * p2D(1, i) * rad_inv(i) * p2D(1, j) * rad_inv(j); @@ -192,7 +205,7 @@ CUDA_HOSTDEV inline Matrix2Nd cov_radtocart(const Matrix2xNd& p2D, \warning correlation between different point are not computed. */ -CUDA_HOSTDEV MatrixNd cov_carttorad(const Matrix2xNd& p2D, +CUDA_HOSTDEV inline MatrixNd cov_carttorad(const Matrix2xNd& p2D, const Matrix2Nd& cov_cart, const VectorNd& rad) { u_int n = p2D.cols(); @@ -227,9 +240,9 @@ CUDA_HOSTDEV MatrixNd cov_carttorad(const Matrix2xNd& p2D, */ -CUDA_HOSTDEV MatrixNd cov_carttorad_prefit(const Matrix2xNd& p2D, const Matrix2Nd& cov_cart, - const Vector4d& fast_fit, - const VectorNd& rad) { +CUDA_HOSTDEV inline MatrixNd cov_carttorad_prefit(const Matrix2xNd& p2D, const Matrix2Nd& cov_cart, + const Vector4d& fast_fit, + const VectorNd& rad) { u_int n = p2D.cols(); MatrixNd cov_rad = MatrixXd::Zero(n, n); for (u_int i = 0; i < n; ++i) { @@ -296,7 +309,7 @@ CUDA_HOSTDEV inline VectorNd Weight_line(const ArrayNd& x_err2, const ArrayNd& y \return q int 1 or -1. */ -CUDA_HOSTDEV inline int Charge(const Matrix2xNd& p2D, const Vector3d& par_uvr) { +CUDA_HOSTDEV inline int64_t Charge(const Matrix2xNd& p2D, const Vector3d& par_uvr) { return ((p2D(0, 1) - p2D(0, 0)) * (par_uvr.y() - p2D(1, 0)) - (p2D(1, 1) - p2D(1, 0)) * (par_uvr.x() - p2D(0, 0)) > 0) @@ -314,7 +327,7 @@ CUDA_HOSTDEV inline int Charge(const Matrix2xNd& p2D, const Vector3d& par_uvr) { \param error flag for errors computation. */ -CUDA_HOSTDEV void par_uvrtopak(circle_fit& circle, const double B, const bool& error) { +CUDA_HOSTDEV inline void par_uvrtopak(circle_fit& circle, const double B, const bool& error) { Vector3d par_pak; const double temp0 = circle.par.head(2).squaredNorm(); const double temp1 = sqrt(temp0); @@ -346,7 +359,7 @@ CUDA_HOSTDEV void par_uvrtopak(circle_fit& circle, const double B, const bool& e \return x_err2 squared errors in the x axis. */ -CUDA_HOSTDEV VectorNd X_err2(const Matrix3Nd& V, const circle_fit& circle, const MatrixNx5d& J, +CUDA_HOSTDEV inline VectorNd X_err2(const Matrix3Nd& V, const circle_fit& circle, const MatrixNx5d& J, const bool& error, u_int n) { VectorNd x_err2(n); for (u_int i = 0; i < n; ++i) { @@ -382,11 +395,17 @@ CUDA_HOSTDEV VectorNd X_err2(const Matrix3Nd& V, const circle_fit& circle, const */ -CUDA_HOSTDEV Vector3d min_eigen3D(const Matrix3d& A, double& chi2) { +CUDA_HOSTDEV inline Vector3d min_eigen3D(const Matrix3d& A, double& chi2) { + if (DEBUG) { + printf("min_eigen3D - enter\n"); + } SelfAdjointEigenSolver solver(3); solver.computeDirect(A); int min_index; chi2 = solver.eigenvalues().minCoeff(&min_index); + if (DEBUG) { + printf("min_eigen3D - exit\n"); + } return solver.eigenvectors().col(min_index); } @@ -404,7 +423,7 @@ CUDA_HOSTDEV Vector3d min_eigen3D(const Matrix3d& A, double& chi2) { speed up in single precision. */ -CUDA_HOSTDEV Vector3d min_eigen3D_fast(const Matrix3d& A) { +CUDA_HOSTDEV inline Vector3d min_eigen3D_fast(const Matrix3d& A) { SelfAdjointEigenSolver solver(3); solver.computeDirect(A.cast()); int min_index; @@ -425,7 +444,7 @@ CUDA_HOSTDEV Vector3d min_eigen3D_fast(const Matrix3d& A) { significantly in single precision. */ -CUDA_HOSTDEV Vector2d min_eigen2D(const Matrix2d& A, double& chi2) { +CUDA_HOSTDEV inline Vector2d min_eigen2D(const Matrix2d& A, double& chi2) { SelfAdjointEigenSolver solver(2); solver.computeDirect(A); int min_index; @@ -450,14 +469,17 @@ CUDA_HOSTDEV Vector2d min_eigen2D(const Matrix2d& A, double& chi2) { - computation of error due to multiple scattering. */ -CUDA_HOSTDEV Vector4d Fast_fit(const Matrix3xNd& hits) { +CUDA_HOSTDEV inline Vector4d Fast_fit(const Matrix3xNd& hits) { Vector4d result; u_int n = hits.cols(); // get the number of hits + printIt(&hits, "Fast_fit - hits: ", DEBUG); // CIRCLE FIT // Make segments between middle-to-first(b) and last-to-first(c) hits const Vector2d b = hits.block(0, n / 2, 2, 1) - hits.block(0, 0, 2, 1); const Vector2d c = hits.block(0, n - 1, 2, 1) - hits.block(0, 0, 2, 1); + printIt(&b, "Fast_fit - b: ", DEBUG); + printIt(&c, "Fast_fit - c: ", DEBUG); // Compute their lengths const double b2 = b.squaredNorm(); const double c2 = c.squaredNorm(); @@ -486,10 +508,13 @@ CUDA_HOSTDEV Vector4d Fast_fit(const Matrix3xNd& hits) { result(0) = X0 + hits(0, 0); result(1) = Y0 + hits(1, 0); result(2) = sqrt(sqr(X0) + sqr(Y0)); + printIt(&result, "Fast_fit - result: ", DEBUG); // LINE FIT const Vector2d d = hits.block(0, 0, 2, 1) - result.head(2); const Vector2d e = hits.block(0, n - 1, 2, 1) - result.head(2); + printIt(&e, "Fast_fit - e: ", DEBUG); + printIt(&d, "Fast_fit - d: ", DEBUG); // Compute the arc-length between first and last point: L = R * theta = R * atan (tan (Theta) ) const double dr = result(2) * atan2(cross2D(d, e), d.dot(e)); // Simple difference in Z between last and first hit @@ -497,6 +522,10 @@ CUDA_HOSTDEV Vector4d Fast_fit(const Matrix3xNd& hits) { result(3) = (dr / dz); + if (DEBUG) { + printf("Fast_fit: [%f, %f, %f, %f]\n", result(0), + result(1), result(2), result(3)); + } return result; } @@ -532,15 +561,25 @@ CUDA_HOSTDEV Vector4d Fast_fit(const Matrix3xNd& hits) { scattering. */ -CUDA_HOSTDEV circle_fit Circle_fit(const Matrix2xNd& hits2D, const Matrix2Nd& hits_cov2D, - const Vector4d& fast_fit, VectorNd const & rad, +CUDA_HOSTDEV inline circle_fit Circle_fit(const Matrix2xNd& hits2D, + const Matrix2Nd & hits_cov2D, + const Vector4d & fast_fit, + const VectorNd & rad, const double B, - const bool& error = true, - const bool& scattering = false) { + const bool error = true, + const bool scattering = false) { + if (true) { + printf("circle_fit - enter\n"); + } // INITIALIZATION Matrix2Nd V = hits_cov2D; u_int n = hits2D.cols(); + printIt(&hits2D, "circle_fit - hits2D:", DEBUG); + printIt(&hits_cov2D, "circle_fit - hits_cov2D:", DEBUG); + if (DEBUG) { + printf("circle_fit - WEIGHT COMPUTATION\n"); + } // WEIGHT COMPUTATION VectorNd weight; MatrixNd G; @@ -548,15 +587,28 @@ CUDA_HOSTDEV circle_fit Circle_fit(const Matrix2xNd& hits2D, const Matrix2Nd& hi { MatrixNd cov_rad; cov_rad = cov_carttorad_prefit(hits2D, V, fast_fit, rad); + printIt(&cov_rad, "circle_fit - cov_rad:", DEBUG); // cov_rad = cov_carttorad(hits2D, V); if (scattering) { MatrixNd scatter_cov_rad = Scatter_cov_rad(hits2D, fast_fit, rad, B); + printIt(&scatter_cov_rad, "circle_fit - scatter_cov_rad:", DEBUG); + printIt(&hits2D, "circle_fit - hits2D bis:", DEBUG); + if (DEBUG) { + printf("Address of hits2D: a) %p\n", &hits2D); + } V += cov_radtocart(hits2D, scatter_cov_rad, rad); + printIt(&V, "circle_fit - V:", DEBUG); cov_rad += scatter_cov_rad; - G = cov_rad.inverse(); - renorm = G.sum(); - G *= 1. / renorm; + printIt(&cov_rad, "circle_fit - cov_rad:", DEBUG); + Matrix4d cov_rad4 = cov_rad; + Matrix4d G4; + G4 = cov_rad4.inverse(); + printIt(&G4, "circle_fit - G4:", DEBUG); + renorm = G4.sum(); + G4 *= 1. / renorm; + printIt(&G4, "circle_fit - G4:", DEBUG); + G = G4; weight = Weight_circle(G); } else { weight = cov_rad.diagonal().cwiseInverse(); @@ -564,15 +616,25 @@ CUDA_HOSTDEV circle_fit Circle_fit(const Matrix2xNd& hits2D, const Matrix2Nd& hi weight *= 1. / renorm; } } + printIt(&weight, "circle_fit - weight:", DEBUG); + if (DEBUG) { + printf("circle_fit - SPACE TRANSFORMATION\n"); + } // SPACE TRANSFORMATION // center + if (DEBUG) { + printf("Address of hits2D: b) %p\n", &hits2D); + } const Vector2d h_ = hits2D.rowwise().mean(); // centroid + printIt(&h_, "circle_fit - h_:", DEBUG); Matrix3xNd p3D(3, n); p3D.block(0, 0, 2, n) = hits2D.colwise() - h_; + printIt(&p3D, "circle_fit - p3D: a)", DEBUG); Vector2Nd mc(2 * n); // centered hits, used in error computation mc << p3D.row(0).transpose(), p3D.row(1).transpose(); + printIt(&mc, "circle_fit - mc(centered hits):", DEBUG); // scale const double q = mc.squaredNorm(); @@ -581,7 +643,11 @@ CUDA_HOSTDEV circle_fit Circle_fit(const Matrix2xNd& hits2D, const Matrix2Nd& hi // project on paraboloid p3D.row(2) = p3D.block(0, 0, 2, n).colwise().squaredNorm(); + printIt(&p3D, "circle_fit - p3D: b)", DEBUG); + if (DEBUG) { + printf("circle_fit - COST FUNCTION\n"); + } // COST FUNCTION // compute @@ -593,17 +659,39 @@ CUDA_HOSTDEV circle_fit Circle_fit(const Matrix2xNd& hits2D, const Matrix2Nd& hi else { for (u_int i = 0; i < n; ++i) A += weight(i) * (X.col(i) * X.col(i).transpose()); } + printIt(&A, "circle_fit - A:", DEBUG); + if (DEBUG) { + printf("circle_fit - MINIMIZE\n"); + } // minimize double chi2; Vector3d v = min_eigen3D(A, chi2); + if (DEBUG) { + printf("circle_fit - AFTER MIN_EIGEN\n"); + } + printIt(&v, "v BEFORE INVERSION", DEBUG); v *= (v(2) > 0) ? 1 : -1; // TO FIX dovrebbe essere N(3)>0 + printIt(&v, "v AFTER INVERSION", DEBUG); // This hack to be able to run on GPU where the automatic assignment to a // double from the vector multiplication is not working. + if (DEBUG) { + printf("circle_fit - AFTER MIN_EIGEN 1\n"); + } Matrix cm; - cm.noalias() = -v.transpose() * r0; + if (DEBUG) { + printf("circle_fit - AFTER MIN_EIGEN 2\n"); + } + cm = -v.transpose() * r0; + if (DEBUG) { + printf("circle_fit - AFTER MIN_EIGEN 3\n"); + } const double c = cm(0,0); +// const double c = -v.transpose() * r0; + if (DEBUG) { + printf("circle_fit - COMPUTE CIRCLE PARAMETER\n"); + } // COMPUTE CIRCLE PARAMETER // auxiliary quantities @@ -617,18 +705,40 @@ CUDA_HOSTDEV circle_fit Circle_fit(const Matrix2xNd& hits2D, const Matrix2Nd& hi circle.par << par_uvr_(0) * s_inv + h_(0), par_uvr_(1) * s_inv + h_(1), par_uvr_(2) * s_inv; circle.q = Charge(hits2D, circle.par); circle.chi2 = abs(chi2) * renorm * 1. / sqr(2 * v(2) * par_uvr_(2) * s); + printIt(&circle.par, "circle_fit - CIRCLE PARAMETERS:", DEBUG); + printIt(&circle.cov, "circle_fit - CIRCLE COVARIANCE:", DEBUG); + if (DEBUG) { + printf("circle_fit - CIRCLE CHARGE: %ld\n", circle.q); + } + if (DEBUG) { + printf("circle_fit - ERROR PROPAGATION\n"); + } // ERROR PROPAGATION if (error) { + if (DEBUG) { + printf("circle_fit - ERROR PRPAGATION ACTIVATED\n"); + } ArrayNd Vcs_[2][2]; // cov matrix of center & scaled points + if (DEBUG) { + printf("circle_fit - ERROR PRPAGATION ACTIVATED 2\n"); + } { + Matrix cm; + Matrix cm2; + cm = mc.transpose() * V * mc; +// cm2 = mc * mc.transpose(); + const double c = cm(0,0); +// const double c2 = cm2(0,0); const Matrix2Nd Vcs = sqr(s) * V + sqr(sqr(s)) * 1. / (4. * q * n) * - (2. * V.squaredNorm() + 4. * mc.transpose() * V * mc) * + (2. * V.squaredNorm() + 4. * c) * // mc.transpose() * V * mc) * mc * mc.transpose(); + printIt(&Vcs, "circle_fit - Vcs:", DEBUG); Vcs_[0][0] = Vcs.block(0, 0, n, n); Vcs_[0][1] = Vcs.block(0, n, n, n); Vcs_[1][1] = Vcs.block(n, n, n, n); Vcs_[1][0] = Vcs_[0][1].transpose(); + printIt(&Vcs, "circle_fit - Vcs:", DEBUG); } MatrixNd C[3][3]; // cov matrix of 3D transformed points @@ -648,18 +758,26 @@ CUDA_HOSTDEV circle_fit Circle_fit(const Matrix2xNd& hits2D, const Matrix2Nd& hi Vcs_[1][1] * Vcs_[1][1]) + 4. * (Vcs_[0][0] * t00 + Vcs_[0][1] * t01 + Vcs_[1][0] * t10 + Vcs_[1][1] * t11); } + printIt(&C[0][0], "circle_fit - C[0][0]:", DEBUG); Matrix3d C0; // cov matrix of center of gravity (r0.x,r0.y,r0.z) for (u_int i = 0; i < 3; ++i) { for (u_int j = i; j < 3; ++j) { - C0(i, j) = weight.transpose() * C[i][j] * weight; + Matrix tmp; + tmp = weight.transpose() * C[i][j] * weight; + const double c = tmp(0,0); + C0(i, j) = c; //weight.transpose() * C[i][j] * weight; C0(j, i) = C0(i, j); } } + printIt(&C0, "circle_fit - C0:", DEBUG); const MatrixNd W = weight * weight.transpose(); const MatrixNd H = MatrixXd::Identity(n, n).rowwise() - weight.transpose(); const MatrixNx3d s_v = H * p3D.transpose(); + printIt(&W, "circle_fit - W:", DEBUG); + printIt(&H, "circle_fit - H:", DEBUG); + printIt(&s_v, "circle_fit - s_v:", DEBUG); MatrixNd D_[3][3]; // cov(s_v) { @@ -673,6 +791,7 @@ CUDA_HOSTDEV circle_fit Circle_fit(const Matrix2xNd& hits2D, const Matrix2Nd& hi D_[2][0] = D_[0][2].transpose(); D_[2][1] = D_[1][2].transpose(); } + printIt(&D_[0][0], "circle_fit - D_[0][0]:", DEBUG); constexpr u_int nu[6][2] = {{0, 0}, {0, 1}, {0, 2}, {1, 1}, {1, 2}, {2, 2}}; @@ -697,13 +816,21 @@ CUDA_HOSTDEV circle_fit Circle_fit(const Matrix2xNd& hits2D, const Matrix2Nd& hi t1 = D_[i][l] * s_v.col(k) + D_[i][k] * s_v.col(l); } - if (i == j) - E(a, b) = 0. + s_v.col(i).transpose() * (t0 + t1); - else - E(a, b) = 0. + (s_v.col(i).transpose() * t0) + (s_v.col(j).transpose() * t1); + if (i == j) { + Matrix cm; + cm = s_v.col(i).transpose() * (t0 + t1); + const double c = cm(0,0); + E(a, b) = 0. + c; + } else { + Matrix cm; + cm = (s_v.col(i).transpose() * t0) + (s_v.col(j).transpose() * t1); + const double c = cm(0,0); + E(a, b) = 0. + c;//(s_v.col(i).transpose() * t0) + (s_v.col(j).transpose() * t1); + } if (b != a) E(b, a) = E(a, b); } } + printIt(&E, "circle_fit - E:", DEBUG); Matrix J2; // Jacobian of min_eigen() (numerically computed) for (u_int a = 0; a < 6; ++a) { @@ -714,6 +841,7 @@ CUDA_HOSTDEV circle_fit Circle_fit(const Matrix2xNd& hits2D, const Matrix2Nd& hi const int sign = (J2.col(a)(2) > 0) ? 1 : -1; J2.col(a) = (J2.col(a) * sign - v) / Delta(i, j); } + printIt(&J2, "circle_fit - J2:", DEBUG); Matrix4d Cvc; // joint cov matrix of (v0,v1,v2,c) { @@ -722,9 +850,17 @@ CUDA_HOSTDEV circle_fit Circle_fit(const Matrix2xNd& hits2D, const Matrix2Nd& hi Cvc.block(0, 0, 3, 3) = t0; Cvc.block(0, 3, 3, 1) = t1; Cvc.block(3, 0, 1, 3) = t1.transpose(); - Cvc(3, 3) = - (v.transpose() * C0 * v) + (C0.cwiseProduct(t0)).sum() + (r0.transpose() * t0 * r0); + Matrix cm1; +// Matrix cm2; + Matrix cm3; + cm1 = (v.transpose() * C0 * v); +// cm2 = (C0.cwiseProduct(t0)).sum(); + cm3 = (r0.transpose() * t0 * r0); + const double c = cm1(0,0) + (C0.cwiseProduct(t0)).sum() + cm3(0,0); + Cvc(3, 3) = c; + // (v.transpose() * C0 * v) + (C0.cwiseProduct(t0)).sum() + (r0.transpose() * t0 * r0); } + printIt(&Cvc, "circle_fit - Cvc:", DEBUG); Matrix J3; // Jacobian (v0,v1,v2,c)->(X0,Y0,R) { @@ -732,8 +868,10 @@ CUDA_HOSTDEV circle_fit Circle_fit(const Matrix2xNd& hits2D, const Matrix2Nd& hi J3 << -v2x2_inv, 0, v(0) * sqr(v2x2_inv) * 2., 0, 0, -v2x2_inv, v(1) * sqr(v2x2_inv) * 2., 0, 0, 0, -h * sqr(v2x2_inv) * 2. - (2. * c + v(2)) * v2x2_inv * t, -t; } + printIt(&J3, "circle_fit - J3:", DEBUG); const RowVector2Nd Jq = mc.transpose() * s * 1. / n; // var(q) + printIt(&Jq, "circle_fit - Jq:", DEBUG); Matrix3d cov_uvr = J3 * Cvc * J3.transpose() * sqr(s_inv) // cov(X0,Y0,R) + (par_uvr_ * par_uvr_.transpose()) * (Jq * V * Jq.transpose()); @@ -741,7 +879,10 @@ CUDA_HOSTDEV circle_fit Circle_fit(const Matrix2xNd& hits2D, const Matrix2Nd& hi circle.cov = cov_uvr; } - + printIt(&circle.cov, "Circle cov:", DEBUG); + if (DEBUG) { + printf("circle_fit - exit\n"); + } return circle; } @@ -780,13 +921,19 @@ CUDA_HOSTDEV circle_fit Circle_fit(const Matrix2xNd& hits2D, const Matrix2Nd& hi errors. */ -CUDA_HOSTDEV line_fit Line_fit(const Matrix3xNd& hits, const Matrix3Nd& hits_cov, const circle_fit& circle, - const Vector4d& fast_fit, const bool& error = true) { +CUDA_HOSTDEV inline line_fit Line_fit(const Matrix3xNd& hits, + const Matrix3Nd& hits_cov, + const circle_fit& circle, + const Vector4d& fast_fit, + const bool error = true) { u_int n = hits.cols(); // PROJECTION ON THE CILINDER Matrix2xNd p2D(2, n); MatrixNx5d Jx(n, 5); + printIt(&hits, "Line_fit points: ", DEBUG); + printIt(&hits_cov, "Line_fit covs: ", DEBUG); + // x & associated Jacobian // cfr https://indico.cern.ch/event/663159/contributions/2707659/attachments/1517175/2368189/Riemann_fit.pdf // Slide 11 @@ -826,6 +973,13 @@ CUDA_HOSTDEV line_fit Line_fit(const Matrix3xNd& hits, const Matrix3Nd& hits_cov const VectorNd err2_inv = Weight_line(x_err2, y_err2, fast_fit(3)); const VectorNd weight = err2_inv * 1. / err2_inv.sum(); + + printIt(&x_err2, "Line_fit - x_err2: ", DEBUG); + printIt(&y_err2, "Line_fit - y_err2: ", DEBUG); + printIt(&err2_inv, "Line_fit - err2_inv: ", DEBUG); + printIt(&weight, "Line_fit - weight: ", DEBUG); + + // COST FUNCTION // compute @@ -838,14 +992,19 @@ CUDA_HOSTDEV line_fit Line_fit(const Matrix3xNd& hits, const Matrix3Nd& hits_cov for (u_int i = 0; i < n; ++i) { A += err2_inv(i) * (X.col(i) * X.col(i).transpose()); } + + printIt(&A, "Line_fit - A: ", DEBUG); + // minimize double chi2; Vector2d v = min_eigen2D(A, chi2); + printIt(&v, "Line_fit - v: ", DEBUG); + // n *= (chi2>0) ? 1 : -1; //TO FIX // This hack to be able to run on GPU where the automatic assignment to a // double from the vector multiplication is not working. Matrix cm; - cm.noalias() = -v.transpose() * r0; + cm = -v.transpose() * r0; const double c = cm(0,0); // COMPUTE LINE PARAMETER @@ -853,6 +1012,7 @@ CUDA_HOSTDEV line_fit Line_fit(const Matrix3xNd& hits, const Matrix3Nd& hits_cov line.par << -v(0) / v(1), // cotan(theta)) -c * sqrt(sqr(v(0)) + sqr(v(1))) * 1. / v(1); // Zip line.chi2 = abs(chi2); + printIt(&(line.par), "Line_fit - line.par: ", DEBUG); // ERROR PROPAGATION if (error) { @@ -891,9 +1051,10 @@ CUDA_HOSTDEV line_fit Line_fit(const Matrix3xNd& hits, const Matrix3Nd& hits_cov J << -t0, v(0) * t1, 0, -c * v(0) * t0 * t2, v0_2 * c * t1 * t2, -sqrt_ * t0; } Matrix JT = J.transpose().eval(); - line.cov.noalias() = J * C * JT; + line.cov = J * C * JT; } + printIt(&line.cov, "Line cov:", DEBUG); return line; } @@ -936,7 +1097,7 @@ CUDA_HOSTDEV line_fit Line_fit(const Matrix3xNd& hits, const Matrix3Nd& hits_cov \bug see Circle_fit(), Line_fit() and Fast_fit() bugs. */ -helix_fit Helix_fit(const Matrix3xNd& hits, const Matrix3Nd& hits_cov, const double B, +inline helix_fit Helix_fit(const Matrix3xNd& hits, const Matrix3Nd& hits_cov, const double B, const bool& error = true, const bool& scattering = false) { u_int n = hits.cols(); VectorNd rad = (hits.block(0, 0, 2, n).colwise().norm()); diff --git a/RecoPixelVertexing/PixelTrackFitting/plugins/PixelTrackProducer.cc b/RecoPixelVertexing/PixelTrackFitting/plugins/PixelTrackProducer.cc index ee11853729970..eadfda8cb6a26 100644 --- a/RecoPixelVertexing/PixelTrackFitting/plugins/PixelTrackProducer.cc +++ b/RecoPixelVertexing/PixelTrackFitting/plugins/PixelTrackProducer.cc @@ -23,7 +23,9 @@ using namespace pixeltrackfitting; using edm::ParameterSet; PixelTrackProducer::PixelTrackProducer(const ParameterSet& cfg) - : theReconstruction(cfg, consumesCollector()) + : runOnGPU_(cfg.getParameter("runOnGPU")), + theReconstruction(cfg, consumesCollector()), + theGPUReconstruction(cfg, consumesCollector()) { edm::LogInfo("PixelTrackProducer")<<" construction..."; produces(); @@ -37,6 +39,7 @@ void PixelTrackProducer::fillDescriptions(edm::ConfigurationDescriptions& descri edm::ParameterSetDescription desc; desc.add("passLabel", "pixelTracks"); // What is this? It is not used anywhere in this code. + desc.add("runOnGPU", false); PixelTrackReconstruction::fillDescriptions(desc); descriptions.add("pixelTracks", desc); @@ -47,8 +50,11 @@ void PixelTrackProducer::produce(edm::Event& ev, const edm::EventSetup& es) LogDebug("PixelTrackProducer, produce")<<"event# :"< httopo; es.get().get(httopo); diff --git a/RecoPixelVertexing/PixelTrackFitting/plugins/PixelTrackProducer.h b/RecoPixelVertexing/PixelTrackFitting/plugins/PixelTrackProducer.h index c4bcec747d552..0803131715af6 100644 --- a/RecoPixelVertexing/PixelTrackFitting/plugins/PixelTrackProducer.h +++ b/RecoPixelVertexing/PixelTrackFitting/plugins/PixelTrackProducer.h @@ -4,6 +4,7 @@ #include "FWCore/Framework/interface/stream/EDProducer.h" #include "RecoPixelVertexing/PixelTrackFitting/interface/TracksWithHits.h" #include "RecoPixelVertexing/PixelTrackFitting/interface/PixelTrackReconstruction.h" +#include "RecoPixelVertexing/PixelTrackFitting/interface/PixelTrackReconstructionGPU.h" namespace edm { class Event; class EventSetup; class ParameterSet; class ConfigurationDescriptions; } class TrackerTopology; @@ -21,6 +22,8 @@ class PixelTrackProducer : public edm::stream::EDProducer<> { private: void store(edm::Event& ev, const pixeltrackfitting::TracksWithTTRHs& selectedTracks, const TrackerTopology& ttopo); + bool runOnGPU_; PixelTrackReconstruction theReconstruction; + PixelTrackReconstructionGPU theGPUReconstruction; }; #endif diff --git a/RecoPixelVertexing/PixelTrackFitting/python/PixelTracks_cff.py b/RecoPixelVertexing/PixelTrackFitting/python/PixelTracks_cff.py index 44bfb888df98c..e1ccc16bf6430 100644 --- a/RecoPixelVertexing/PixelTrackFitting/python/PixelTracks_cff.py +++ b/RecoPixelVertexing/PixelTrackFitting/python/PixelTracks_cff.py @@ -80,7 +80,9 @@ # Use Riemann fit and substitute previous Fitter producer with the Riemann one from Configuration.ProcessModifiers.riemannFit_cff import riemannFit +from Configuration.ProcessModifiers.riemannFitGPU_cff import riemannFitGPU riemannFit.toModify(pixelTracks, Fitter = "pixelFitterByRiemannParaboloid") +riemannFitGPU.toModify(pixelTracks, runOnGPU = True) _pixelTracksSequence_riemannFit = pixelTracksSequence.copy() _pixelTracksSequence_riemannFit.replace(pixelFitterByHelixProjections, pixelFitterByRiemannParaboloid) riemannFit.toReplaceWith(pixelTracksSequence, _pixelTracksSequence_riemannFit) diff --git a/RecoPixelVertexing/PixelTrackFitting/src/PixelTrackReconstruction.cc b/RecoPixelVertexing/PixelTrackFitting/src/PixelTrackReconstruction.cc index 81d5a522afe2c..a1b1f828505f8 100644 --- a/RecoPixelVertexing/PixelTrackFitting/src/PixelTrackReconstruction.cc +++ b/RecoPixelVertexing/PixelTrackFitting/src/PixelTrackReconstruction.cc @@ -38,8 +38,8 @@ PixelTrackReconstruction::PixelTrackReconstruction(const ParameterSet& cfg, theFilterToken = iC.consumes(filterTag); } } - -PixelTrackReconstruction::~PixelTrackReconstruction() + +PixelTrackReconstruction::~PixelTrackReconstruction() { } @@ -66,16 +66,17 @@ void PixelTrackReconstruction::run(TracksWithTTRHs& tracks, edm::Event& ev, cons ev.getByToken(theFilterToken, hfilter); filter = hfilter.product(); } - - std::vector hits;hits.reserve(4); + + std::vector hits;hits.reserve(4); + int counter = -1; for(const auto& regionHitSets: hitSets) { const TrackingRegion& region = regionHitSets.region(); - + counter++; for(const SeedingHitSet& tuplet: regionHitSets) { /// FIXME at some point we need to migrate the fitter... auto nHits = tuplet.size(); hits.resize(nHits); for (unsigned int iHit = 0; iHit < nHits; ++iHit) hits[iHit] = tuplet[iHit]; - + // fitting std::unique_ptr track = fitter.run(hits, region); if (!track) continue; diff --git a/RecoPixelVertexing/PixelTrackFitting/src/PixelTrackReconstructionGPU.cc b/RecoPixelVertexing/PixelTrackFitting/src/PixelTrackReconstructionGPU.cc new file mode 100644 index 0000000000000..fb4a86457566f --- /dev/null +++ b/RecoPixelVertexing/PixelTrackFitting/src/PixelTrackReconstructionGPU.cc @@ -0,0 +1,197 @@ +#include "RecoPixelVertexing/PixelTrackFitting/interface/PixelTrackReconstructionGPU.h" + +#include "FWCore/Framework/interface/Event.h" +#include "FWCore/Framework/interface/EventSetup.h" +#include "FWCore/Framework/interface/ESHandle.h" +#include "FWCore/MessageLogger/interface/MessageLogger.h" +#include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h" +#include "FWCore/ParameterSet/interface/ParameterSetDescription.h" + +#include "RecoTracker/TkTrackingRegions/interface/TrackingRegion.h" + +#include "RecoPixelVertexing/PixelTrackFitting/interface/PixelFitter.h" + +#include "RecoPixelVertexing/PixelTrackFitting/interface/PixelTrackFilter.h" +#include "RecoPixelVertexing/PixelTrackFitting/interface/PixelTrackBuilder.h" +#include "RecoTracker/TkMSParametrization/interface/PixelRecoUtilities.h" + +#include "RecoPixelVertexing/PixelTrackFitting/interface/PixelTrackCleaner.h" +#include "RecoPixelVertexing/PixelTrackFitting/interface/PixelTrackCleanerWrapper.h" +#include "RecoPixelVertexing/PixelTrackFitting/interface/RiemannFit.h" // for helix_fit + +#include "DataFormats/TrackReco/interface/Track.h" +#include "DataFormats/TrackReco/interface/TrackFwd.h" +#include "DataFormats/TrackReco/interface/TrackExtra.h" + +#include "RecoTracker/TkHitPairs/interface/RegionsSeedingHitSets.h" + +#include "HeterogeneousCore/CUDAUtilities/interface/cudaCheck.h" + +#include +#include + +using namespace pixeltrackfitting; +using edm::ParameterSet; + +PixelTrackReconstructionGPU::PixelTrackReconstructionGPU(const ParameterSet& cfg, + edm::ConsumesCollector && iC) + : theHitSetsToken(iC.consumes(cfg.getParameter("SeedingHitSets"))), + theFitterToken(iC.consumes(cfg.getParameter("Fitter"))), + theCleanerName(cfg.getParameter("Cleaner")) +{ + edm::InputTag filterTag = cfg.getParameter("Filter"); + if(filterTag.label() != "") { + theFilterToken = iC.consumes(filterTag); + } +} + +PixelTrackReconstructionGPU::~PixelTrackReconstructionGPU() +{ +} + +void PixelTrackReconstructionGPU::fillDescriptions(edm::ParameterSetDescription& desc) { + desc.add("SeedingHitSets", edm::InputTag("pixelTracksHitTriplets")); + desc.add("Fitter", edm::InputTag("pixelFitterByHelixProjections")); + desc.add("Filter", edm::InputTag("pixelTrackFilterByKinematics")); + desc.add("Cleaner", "pixelTrackCleanerBySharedHits"); +} + +void PixelTrackReconstructionGPU::run(TracksWithTTRHs& tracks, + edm::Event& ev, const edm::EventSetup& es) +{ + edm::ESHandle fieldESH; + es.get().get(fieldESH); + + edm::Handle hhitSets; + ev.getByToken(theHitSetsToken, hhitSets); + const auto& hitSets = *hhitSets; + + const PixelTrackFilter *filter = nullptr; + if(!theFilterToken.isUninitialized()) { + edm::Handle hfilter; + ev.getByToken(theFilterToken, hfilter); + filter = hfilter.product(); + } + + float bField = 1 / PixelRecoUtilities::fieldInInvGev(es); + + std::vector hits_and_covariances; + float * hits_and_covariancesGPU = nullptr; + std::vector helix_fit_results; + Rfit::helix_fit * helix_fit_resultsGPU = nullptr; + + const int points_in_seed = 4; + // We use 3 floats for GlobalPosition and 9 floats for GlobalError (that's what is used by the Riemann fit). + // TODO: optimise dimensions eploiting matrix symmetries + // Assume a safe maximum of 3K seeds: it will dynamically grow, if needed. + int total_seeds = 0; + hits_and_covariances.reserve(sizeof(float)*3000*(points_in_seed*12)); + for (auto const & regionHitSets : hitSets) { + const TrackingRegion& region = regionHitSets.region(); + for (auto const & tuplet : regionHitSets) { + for (unsigned int iHit = 0; iHit < tuplet.size(); ++iHit) { + auto const& recHit = tuplet[iHit]; + auto point = GlobalPoint(recHit->globalPosition().basicVector() - region.origin().basicVector()); + auto errors = recHit->globalPositionError().matrix4D(); + hits_and_covariances.push_back(point.x()); + hits_and_covariances.push_back(point.y()); + hits_and_covariances.push_back(point.z()); + for (auto j = 0; j < 3; ++j) { + for (auto l = 0; l < 3; ++l) { + hits_and_covariances.push_back(errors(j, l)); + } + } + } + total_seeds++; + } + } + + // We pretend to have one fit for every seed + helix_fit_results.resize(total_seeds); + + cudaCheck(cudaMalloc((void**)&hits_and_covariancesGPU, sizeof(float)*hits_and_covariances.size())); + cudaCheck(cudaMalloc((void**)&helix_fit_resultsGPU, sizeof(Rfit::helix_fit)*helix_fit_results.size())); + // CUDA MALLOC OF HITS AND COV AND HELIX_FIT RESULTS + + // CUDA MEMCOPY HOST2DEVICE OF HITS AND COVS AND HELIX_FIT RESULTS + cudaCheck(cudaMemcpy(hits_and_covariancesGPU, hits_and_covariances.data(), + sizeof(float)*hits_and_covariances.size(), cudaMemcpyHostToDevice)); + + // LAUNCH THE KERNEL FIT + launchKernelFit(hits_and_covariancesGPU, 12*4*total_seeds, 4, + bField, helix_fit_resultsGPU); + // CUDA MEMCOPY DEVICE2HOST OF HELIX_FIT + cudaCheck(cudaDeviceSynchronize()); +// cudaCheck(cudaMemcpy(helix_fit_results.data(), helix_fit_resultsGPU, +// sizeof(Rfit::helix_fit)*helix_fit_results.size(), cudaMemcpyDeviceToHost)); + cudaCheck(cudaGetLastError()); + cudaCheck(cudaMemcpy(helix_fit_results.data(), helix_fit_resultsGPU, + sizeof(Rfit::helix_fit)*helix_fit_results.size(), cudaMemcpyDeviceToHost)); + + cudaCheck(cudaFree(hits_and_covariancesGPU)); + cudaCheck(cudaFree(helix_fit_resultsGPU)); + // Loop on results, create tracks, filter them and pass them down the chain. + // In order to avoid huge mess with indexing and remembering who did what, + // simply iterate again over the main containers in the same order, since we + // are guaranteed that the results have been packed following the very same + // order. If not, we are doomed. + PixelTrackBuilder builder; + int counter = 0; + std::vector hits; + hits.reserve(4); + for (auto const & regionHitSets : hitSets) { + const TrackingRegion& region = regionHitSets.region(); + for(const SeedingHitSet& tuplet: regionHitSets) { + auto nHits = tuplet.size(); hits.resize(nHits); + for (unsigned int iHit = 0; iHit < nHits; ++iHit) hits[iHit] = tuplet[iHit]; + auto const &fittedTrack = helix_fit_results[counter]; + counter++; + int iCharge = fittedTrack.q; + float valPhi = fittedTrack.par(0); + float valTip = fittedTrack.par(1); + float valPt = fittedTrack.par(2); + float valCotTheta = fittedTrack.par(3); + float valZip = fittedTrack.par(4); + // + // PixelTrackErrorParam param(valEta, valPt); + float errValPhi = std::sqrt(fittedTrack.cov(0, 0)); + float errValTip = std::sqrt(fittedTrack.cov(1, 1)); + float errValPt = std::sqrt(fittedTrack.cov(2, 2)); + float errValCotTheta = std::sqrt(fittedTrack.cov(3, 3)); + float errValZip = std::sqrt(fittedTrack.cov(4, 4)); + + float chi2 = fittedTrack.chi2_line; + + Measurement1D phi(valPhi, errValPhi); + Measurement1D tip(valTip, errValTip); + + Measurement1D pt(valPt, errValPt); + Measurement1D cotTheta(valCotTheta, errValCotTheta); + Measurement1D zip(valZip, errValZip); + + std::unique_ptr track( + builder.build(pt, phi, cotTheta, tip, zip, chi2, iCharge, hits, + fieldESH.product(), region.origin())); + if (!track) continue; + + if (filter) { + if (!(*filter)(track.get(), hits)) { + continue; + } + } + // add tracks + tracks.emplace_back(track.release(), tuplet); + } + } + + // skip ovelrapped tracks + if(!theCleanerName.empty()) { + edm::ESHandle hcleaner; + es.get().get(theCleanerName, hcleaner); + const auto& cleaner = *hcleaner; + if(cleaner.fast()) + cleaner.cleanTracks(tracks); + else + tracks = PixelTrackCleanerWrapper(&cleaner).clean(tracks); + } +} diff --git a/RecoPixelVertexing/PixelTrackFitting/src/PixelTrackReconstructionGPU_impl.cu b/RecoPixelVertexing/PixelTrackFitting/src/PixelTrackReconstructionGPU_impl.cu new file mode 100644 index 0000000000000..4b7a10a91fc70 --- /dev/null +++ b/RecoPixelVertexing/PixelTrackFitting/src/PixelTrackReconstructionGPU_impl.cu @@ -0,0 +1,118 @@ +#include "RecoPixelVertexing/PixelTrackFitting/interface/PixelTrackReconstructionGPU.h" +#include +#include + +#define DEBUG 0 + +using namespace Eigen; + +__global__ void KernelFullFitAllHits(float * hits_and_covariances, + int hits_in_fit, + int cumulative_size, + double B, + Rfit::helix_fit * results) { + // Reshape Eigen components from hits_and_covariances, using proper thread and block indices + // Perform the fit + // Store the results in the proper vector, using again correct indices + + // Loop for hits_in_fit times: + // first 3 are the points + // the rest is the covariance matrix, 3x3 + int start = (blockIdx.x * blockDim.x + threadIdx.x) * hits_in_fit * 12; + int helix_start = (blockIdx.x * blockDim.x + threadIdx.x); + if (start >= cumulative_size) { + return; + } + + if (DEBUG) { + printf("BlockDim.x: %d, BlockIdx.x: %d, threadIdx.x: %d, start: %d, cumulative_size: %d\n", + blockDim.x, blockIdx.x, threadIdx.x, start, cumulative_size); + } + + Rfit::Matrix3xNd hits(3,hits_in_fit); + Rfit::Matrix3Nd hits_cov(3 * hits_in_fit, 3 * hits_in_fit); + + // Prepare data structure (stack) + for (unsigned int i = 0; i < hits_in_fit; ++i) { + hits.col(i) << hits_and_covariances[start], + hits_and_covariances[start+1],hits_and_covariances[start+2]; + start += 3; + + for (auto j = 0; j < 3; ++j) { + for (auto l = 0; l < 3; ++l) { + hits_cov(i + j * hits_in_fit, i + l * hits_in_fit) = hits_and_covariances[start]; + start++; + } + } + } + + if (DEBUG) { + printf("KernelFullFitAllHits hits(0,0): %d\t%f\n", helix_start, hits(0,0)); + printf("KernelFullFitAllHits hits(0,1): %d\t%f\n", helix_start, hits(0,1)); + printf("KernelFullFitAllHits hits(0,2): %d\t%f\n", helix_start, hits(0,2)); + printf("KernelFullFitAllHits hits(0,3): %d\t%f\n", helix_start, hits(0,3)); + printf("KernelFullFitAllHits hits(1,0): %d\t%f\n", helix_start, hits(1,0)); + printf("KernelFullFitAllHits hits(1,1): %d\t%f\n", helix_start, hits(1,1)); + printf("KernelFullFitAllHits hits(1,2): %d\t%f\n", helix_start, hits(1,2)); + printf("KernelFullFitAllHits hits(1,3): %d\t%f\n", helix_start, hits(1,3)); + printf("KernelFullFitAllHits hits(2,0): %d\t%f\n", helix_start, hits(2,0)); + printf("KernelFullFitAllHits hits(2,1): %d\t%f\n", helix_start, hits(2,1)); + printf("KernelFullFitAllHits hits(2,2): %d\t%f\n", helix_start, hits(2,2)); + printf("KernelFullFitAllHits hits(2,3): %d\t%f\n", helix_start, hits(2,3)); + Rfit::printIt(&hits); + Rfit::printIt(&hits_cov); + } + + // Perform actual fit + Vector4d fast_fit = Rfit::Fast_fit(hits); + + if (DEBUG) { + printf("KernelFullFitAllHits fast_fit(0): %d %f\n", helix_start, fast_fit(0)); + printf("KernelFullFitAllHits fast_fit(1): %d %f\n", helix_start, fast_fit(1)); + printf("KernelFullFitAllHits fast_fit(2): %d %f\n", helix_start, fast_fit(2)); + printf("KernelFullFitAllHits fast_fit(3): %d %f\n", helix_start, fast_fit(3)); + } + + u_int n = hits.cols(); + if (true) + printf("KernelFullFitAllHits using %d hits: %d\n", n, helix_start); + + Rfit::VectorNd rad = (hits.block(0, 0, 2, n).colwise().norm()); + + Rfit::circle_fit circle = + Rfit::Circle_fit(hits.block(0,0,2,n), hits_cov.block(0, 0, 2 * n, 2 * n), + fast_fit, rad, B, true, true); + + if (DEBUG) { + printf("KernelFullFitAllHits circle.par(0): %d %f\n", helix_start, circle.par(0)); + printf("KernelFullFitAllHits circle.par(1): %d %f\n", helix_start, circle.par(1)); + printf("KernelFullFitAllHits circle.par(2): %d %f\n", helix_start, circle.par(2)); + } + + Rfit::line_fit line = Rfit::Line_fit(hits, hits_cov, circle, fast_fit, true); + + par_uvrtopak(circle, B, true); + + // Grab helix_fit from the proper location in the output vector + Rfit::helix_fit &helix = results[helix_start]; + helix.par << circle.par, line.par; + // TODO: pass properly error booleans + if (1) { + helix.cov = MatrixXd::Zero(5, 5); + helix.cov.block(0, 0, 3, 3) = circle.cov; + helix.cov.block(3, 3, 2, 2) = line.cov; + } + helix.q = circle.q; + helix.chi2_circle = circle.chi2; + helix.chi2_line = line.chi2; +} + +void PixelTrackReconstructionGPU::launchKernelFit(float * hits_and_covariancesGPU, + int cumulative_size, int hits_in_fit, float B, Rfit::helix_fit * results) { + const dim3 threads_per_block(32,1); + // We need to partition data in blocks of: + // 12(3+9) * hits_in_fit + int num_blocks = cumulative_size/(hits_in_fit*12)/threads_per_block.x + 1; + KernelFullFitAllHits<<>>(hits_and_covariancesGPU, hits_in_fit, cumulative_size, B, results); +} + diff --git a/RecoPixelVertexing/PixelTrackFitting/test/BuildFile.xml b/RecoPixelVertexing/PixelTrackFitting/test/BuildFile.xml index 8c61394fec6ec..d6beb57b862b8 100644 --- a/RecoPixelVertexing/PixelTrackFitting/test/BuildFile.xml +++ b/RecoPixelVertexing/PixelTrackFitting/test/BuildFile.xml @@ -11,7 +11,6 @@ - diff --git a/RecoPixelVertexing/PixelTrackFitting/test/testEigenGPU.cu b/RecoPixelVertexing/PixelTrackFitting/test/testEigenGPU.cu index 814e278690957..6cf8a3664f903 100644 --- a/RecoPixelVertexing/PixelTrackFitting/test/testEigenGPU.cu +++ b/RecoPixelVertexing/PixelTrackFitting/test/testEigenGPU.cu @@ -2,23 +2,51 @@ #include #include "RecoPixelVertexing/PixelTrackFitting/interface/RiemannFit.h" +#include "HeterogeneousCore/CUDAUtilities/interface/cudaCheck.h" #include #include using namespace Eigen; -__global__ void kernelFullFit(Rfit::Matrix3xNd * hits, Rfit::Matrix3Nd * hits_cov, - double B, Rfit::circle_fit * circle_fit_resultsGPU, Rfit::line_fit * line_fit_resultsGPU) { +__global__ void kernelFullFit(Rfit::Matrix3xNd * hits, + Rfit::Matrix3Nd * hits_cov, + double B, + bool errors, + bool scattering, + Rfit::circle_fit * circle_fit_resultsGPU, + Rfit::line_fit * line_fit_resultsGPU) { Vector4d fast_fit = Rfit::Fast_fit(*hits); u_int n = hits->cols(); Rfit::VectorNd rad = (hits->block(0, 0, 2, n).colwise().norm()); + Rfit::Matrix2xNd hits2D_local = (hits->block(0,0,2,n)).eval(); + Rfit::Matrix2Nd hits_cov2D_local = (hits_cov->block(0, 0, 2 * n, 2 * n)).eval(); + Rfit::printIt(&hits2D_local, "kernelFullFit - hits2D_local: ", false); + Rfit::printIt(&hits_cov2D_local, "kernelFullFit - hits_cov2D_local: ", false); + /* + printf("kernelFullFit - hits address: %p\n", hits); + printf("kernelFullFit - hits_cov address: %p\n", hits_cov); + printf("kernelFullFit - hits_cov2D address: %p\n", &hits2D_local); + printf("kernelFullFit - hits_cov2D_local address: %p\n", &hits_cov2D_local); + */ + /* At some point I gave up and locally construct block on the stack, so that + the next invocation to Rfit::Circle_fit works properly. Failing to do so + implied basically an empty collection of hits and covariances. That could + have been partially fixed if values of the passed in matrices would have + been printed on screen since that, maybe, triggered internally the real + creations of the blocks. To be understood and compared against the myriad + of compilation warnings we have. + */ (*circle_fit_resultsGPU) = Rfit::Circle_fit(hits->block(0,0,2,n), hits_cov->block(0, 0, 2 * n, 2 * n), - fast_fit, rad, B, false, false); - - (*line_fit_resultsGPU) = Rfit::Line_fit(*hits, *hits_cov, *circle_fit_resultsGPU, fast_fit, true); + fast_fit, rad, B, errors, scattering); + /* + (*circle_fit_resultsGPU) = + Rfit::Circle_fit(hits2D_local, hits_cov2D_local, + fast_fit, rad, B, errors, scattering); + */ + (*line_fit_resultsGPU) = Rfit::Line_fit(*hits, *hits_cov, *circle_fit_resultsGPU, fast_fit, errors); return; } @@ -155,7 +183,7 @@ void testFit() { assert(isEqualFuzzy(line_fit_results.par, line_fit_resultsGPUret->par)); } -void testFitOneGo() { +void testFitOneGo(bool errors, bool scattering, double epsilon=1e-6) { constexpr double B = 0.0113921; Rfit::Matrix3xNd hits(3,4); Rfit::Matrix3Nd hits_cov = MatrixXd::Zero(12,12); @@ -170,40 +198,65 @@ void testFitOneGo() { Rfit::circle_fit circle_fit_results = Rfit::Circle_fit(hits.block(0, 0, 2, n), hits_cov.block(0, 0, 2 * n, 2 * n), - fast_fit_results, rad, B, false, false); + fast_fit_results, rad, B, errors, scattering); // LINE_FIT CPU - Rfit::line_fit line_fit_results = Rfit::Line_fit(hits, hits_cov, circle_fit_results, fast_fit_results, true); + Rfit::line_fit line_fit_results = Rfit::Line_fit(hits, hits_cov, circle_fit_results, + fast_fit_results, errors); // FIT GPU - Rfit::Matrix3xNd * hitsGPU = new Rfit::Matrix3xNd(3,4); + std::cout << "GPU FIT" << std::endl; + Rfit::Matrix3xNd * hitsGPU = nullptr; // new Rfit::Matrix3xNd(3,4); Rfit::Matrix3Nd * hits_covGPU = nullptr; Rfit::line_fit * line_fit_resultsGPU = nullptr; Rfit::line_fit * line_fit_resultsGPUret = new Rfit::line_fit(); - Rfit::circle_fit * circle_fit_resultsGPU = new Rfit::circle_fit(); + Rfit::circle_fit * circle_fit_resultsGPU = nullptr; // new Rfit::circle_fit(); Rfit::circle_fit * circle_fit_resultsGPUret = new Rfit::circle_fit(); - cudaMalloc((void**)&hitsGPU, sizeof(Rfit::Matrix3xNd(3,4))); - cudaMalloc((void **)&hits_covGPU, sizeof(Rfit::Matrix3Nd(12,12))); - cudaMalloc((void **)&line_fit_resultsGPU, sizeof(Rfit::line_fit)); - cudaMalloc((void **)&circle_fit_resultsGPU, sizeof(Rfit::circle_fit)); - cudaMemcpy(hitsGPU, &hits, sizeof(Rfit::Matrix3xNd(3,4)), cudaMemcpyHostToDevice); - cudaMemcpy(hits_covGPU, &hits_cov, sizeof(Rfit::Matrix3Nd(12,12)), cudaMemcpyHostToDevice); + cudaCheck(cudaMalloc((void **)&hitsGPU, sizeof(Rfit::Matrix3xNd(3,4)))); + cudaCheck(cudaMalloc((void **)&hits_covGPU, sizeof(Rfit::Matrix3Nd(12,12)))); + cudaCheck(cudaMalloc((void **)&line_fit_resultsGPU, sizeof(Rfit::line_fit))); + cudaCheck(cudaMalloc((void **)&circle_fit_resultsGPU, sizeof(Rfit::circle_fit))); + cudaCheck(cudaMemcpy(hitsGPU, &hits, sizeof(Rfit::Matrix3xNd(3,4)), cudaMemcpyHostToDevice)); + cudaCheck(cudaMemcpy(hits_covGPU, &hits_cov, sizeof(Rfit::Matrix3Nd(12,12)), cudaMemcpyHostToDevice)); - kernelFullFit<<<1, 1>>>(hitsGPU, hits_covGPU, B, circle_fit_resultsGPU, line_fit_resultsGPU); - cudaDeviceSynchronize(); + kernelFullFit<<<1, 1>>>(hitsGPU, hits_covGPU, B, errors, scattering, + circle_fit_resultsGPU, line_fit_resultsGPU); + cudaCheck(cudaDeviceSynchronize()); - cudaMemcpy(circle_fit_resultsGPUret, circle_fit_resultsGPU, - sizeof(Rfit::circle_fit), cudaMemcpyDeviceToHost); - cudaMemcpy(line_fit_resultsGPUret, line_fit_resultsGPU, sizeof(Rfit::line_fit), cudaMemcpyDeviceToHost); + cudaCheck(cudaMemcpy(circle_fit_resultsGPUret, circle_fit_resultsGPU, sizeof(Rfit::circle_fit), cudaMemcpyDeviceToHost)); + cudaCheck(cudaMemcpy(line_fit_resultsGPUret, line_fit_resultsGPU, sizeof(Rfit::line_fit), cudaMemcpyDeviceToHost)); + std::cout << "Fitted values (CircleFit) CPU:\n" << circle_fit_results.par << std::endl; + std::cout << "Fitted values (LineFit): CPU\n" << line_fit_results.par << std::endl; std::cout << "Fitted values (CircleFit) GPU:\n" << circle_fit_resultsGPUret->par << std::endl; std::cout << "Fitted values (LineFit): GPU\n" << line_fit_resultsGPUret->par << std::endl; - assert(isEqualFuzzy(circle_fit_results.par, circle_fit_resultsGPUret->par)); - assert(isEqualFuzzy(line_fit_results.par, line_fit_resultsGPUret->par)); + assert(isEqualFuzzy(circle_fit_results.par, circle_fit_resultsGPUret->par, epsilon)); + assert(isEqualFuzzy(line_fit_results.par, line_fit_resultsGPUret->par, epsilon)); + + cudaCheck(cudaFree(hitsGPU)); + cudaCheck(cudaFree(hits_covGPU)); + cudaCheck(cudaFree(line_fit_resultsGPU)); + cudaCheck(cudaFree(circle_fit_resultsGPU)); + delete line_fit_resultsGPUret; + delete circle_fit_resultsGPUret; + + cudaDeviceReset(); } int main (int argc, char * argv[]) { - testFit(); - testFitOneGo(); +// testFit(); + std::cout << "TEST FIT, NO ERRORS, NO SCATTERING" << std::endl; + testFitOneGo(false, false); + + // The default 1e-6 is failing.... + std::cout << "TEST FIT, ERRORS, NO SCATTER" << std::endl; + testFitOneGo(true, false, 1e-5); + + std::cout << "TEST FIT, NO ERRORS, SCATTER" << std::endl; + testFitOneGo(false, true); + + std::cout << "TEST FIT, ERRORS AND SCATTER" << std::endl; + testFitOneGo(true, true, 1e-5); + return 0; } diff --git a/RecoPixelVertexing/PixelTrackFitting/test/testEigenGPUNoFit.cu b/RecoPixelVertexing/PixelTrackFitting/test/testEigenGPUNoFit.cu index 210b10cd14ed1..475762f546807 100644 --- a/RecoPixelVertexing/PixelTrackFitting/test/testEigenGPUNoFit.cu +++ b/RecoPixelVertexing/PixelTrackFitting/test/testEigenGPUNoFit.cu @@ -23,10 +23,15 @@ __global__ void kernel(Matrix3d * m, Eigen::SelfAdjointEigenSolver::Re eigenValues(m, ret); } -__global__ void kernelInverse(Matrix3d * in, Matrix3d * out) { -// (*out) = in->inverse(); +__global__ void kernelInverse3x3(Matrix3d * in, Matrix3d * out) { + (*out) = in->inverse(); } +__global__ void kernelInverse4x4(Matrix4d * in, Matrix4d * out) { + (*out) = in->inverse(); +} + + template __global__ void kernelMultiply(M1 * J, M2 * C, @@ -82,9 +87,10 @@ void testMultiply() { assert(isEqualFuzzy(multiply_result, (*multiply_resultGPUret))); } -void testInverse() { - std::cout << "TEST INVERSE" << std::endl; +void testInverse3x3() { + std::cout << "TEST INVERSE 3x3" << std::endl; Matrix3d m = Matrix3d::Random(); + Matrix3d m_inv = m.inverse(); Matrix3d *mGPU = nullptr; Matrix3d *mGPUret = nullptr; Matrix3d *mCPUret = new Matrix3d(); @@ -97,12 +103,38 @@ void testInverse() { cudaMalloc((void **)&mGPUret, sizeof(Matrix3d)); cudaMemcpy(mGPU, &m, sizeof(Matrix3d), cudaMemcpyHostToDevice); - kernelInverse<<<1,1>>>(mGPU, mGPUret); + kernelInverse3x3<<<1,1>>>(mGPU, mGPUret); cudaDeviceSynchronize(); cudaMemcpy(mCPUret, mGPUret, sizeof(Matrix3d), cudaMemcpyDeviceToHost); if (!NODEBUG) std::cout << "Its GPU inverse is:" << std::endl << (*mCPUret) << std::endl; + assert(isEqualFuzzy(m_inv, *mCPUret)); +} + +void testInverse4x4() { + std::cout << "TEST INVERSE 4x4" << std::endl; + Matrix4d m = Matrix4d::Random(); + Matrix4d m_inv = m.inverse(); + Matrix4d *mGPU = nullptr; + Matrix4d *mGPUret = nullptr; + Matrix4d *mCPUret = new Matrix4d(); + + if (!NODEBUG) { + std::cout << "Here is the matrix m:" << std::endl << m << std::endl; + std::cout << "Its inverse is:" << std::endl << m.inverse() << std::endl; + } + cudaMalloc((void **)&mGPU, sizeof(Matrix4d)); + cudaMalloc((void **)&mGPUret, sizeof(Matrix4d)); + cudaMemcpy(mGPU, &m, sizeof(Matrix4d), cudaMemcpyHostToDevice); + + kernelInverse4x4<<<1,1>>>(mGPU, mGPUret); + cudaDeviceSynchronize(); + + cudaMemcpy(mCPUret, mGPUret, sizeof(Matrix4d), cudaMemcpyDeviceToHost); + if (!NODEBUG) + std::cout << "Its GPU inverse is:" << std::endl << (*mCPUret) << std::endl; + assert(isEqualFuzzy(m_inv, *mCPUret)); } void testEigenvalues() { @@ -142,7 +174,8 @@ void testEigenvalues() { int main (int argc, char * argv[]) { testEigenvalues(); - testInverse(); + testInverse3x3(); + testInverse4x4(); testMultiply<1, 2, 2, 1>(); testMultiply<1, 2, 2, 2>(); testMultiply<1, 2, 2, 3>(); diff --git a/RecoPixelVertexing/PixelTrackFitting/test/test_common.h b/RecoPixelVertexing/PixelTrackFitting/test/test_common.h index 0290ee2db641b..78ae4053b8429 100644 --- a/RecoPixelVertexing/PixelTrackFitting/test/test_common.h +++ b/RecoPixelVertexing/PixelTrackFitting/test/test_common.h @@ -20,8 +20,7 @@ __host__ __device__ void printIt(C * m) { } template -bool isEqualFuzzy(C a, C b) { - constexpr double epsilon = 1e-6; +bool isEqualFuzzy(C a, C b, double epsilon = 1e-6) { for (unsigned int i = 0; i < a.rows(); ++i) { for (unsigned int j = 0; j < a.cols(); ++j) { assert(std::abs(a(i,j)-b(i,j)) @@ -31,8 +30,7 @@ bool isEqualFuzzy(C a, C b) { return true; } -bool isEqualFuzzy(double a, double b) { - constexpr double epsilon = 1e-6; +bool isEqualFuzzy(double a, double b, double epsilon=1e-6) { return std::abs(a-b) < std::min(std::abs(a), std::abs(b))*epsilon; } From af7cd9e16ecf442722358ed9a22bf3b2443facb3 Mon Sep 17 00:00:00 2001 From: Vincenzo Innocente Date: Fri, 29 Jun 2018 10:21:35 +0200 Subject: [PATCH 67/88] Migrated PixelRecHit to Heterogeneous producer (#81) Migrate PixelRecHit EDProducer to HeterogeneousEDProducer, including the cpu product. Data structures on gpu now include everything needed for Doublets, CA and fit. Layer splitting done: phi sorting (or partial sorting) requires #69. Includes some cleanup and bug fixes. --- .../interface/phase1PixelTopology.h | 9 ++ .../python/RecoLocalTracker_cff.py | 9 +- .../SiPixelRecHits/plugins/PixelRecHits.cu | 65 ++++++++++++-- .../SiPixelRecHits/plugins/PixelRecHits.h | 26 ++---- .../plugins/SiPixelRecHitHeterogeneous.cc | 84 +++++++++++++------ .../SiPixelRecHitHeterogeneousConverter.cc | 54 ++++++++++++ .../SiPixelRecHits/plugins/gpuPixelRecHits.h | 45 ++++++---- .../siPixelRecHitsHeterogeneousProduct.h | 65 ++++++++++++++ .../python/SiPixelRecHits_cfi.py | 3 - 9 files changed, 293 insertions(+), 67 deletions(-) create mode 100644 RecoLocalTracker/SiPixelRecHits/plugins/SiPixelRecHitHeterogeneousConverter.cc create mode 100644 RecoLocalTracker/SiPixelRecHits/plugins/siPixelRecHitsHeterogeneousProduct.h diff --git a/Geometry/TrackerGeometryBuilder/interface/phase1PixelTopology.h b/Geometry/TrackerGeometryBuilder/interface/phase1PixelTopology.h index 455de58ce3408..37c97a92a3eaa 100644 --- a/Geometry/TrackerGeometryBuilder/interface/phase1PixelTopology.h +++ b/Geometry/TrackerGeometryBuilder/interface/phase1PixelTopology.h @@ -20,6 +20,15 @@ namespace phase1PixelTopology { constexpr uint32_t numPixsInModule = uint32_t(numRowsInModule)* uint32_t(numColsInModule); + constexpr uint32_t numberOfModules = 1856; + + constexpr uint32_t layerStart[11] = {0,96,320,672,1184,1296,1408,1520,1632,1744,1856}; + constexpr char const * layerName[10] = {"BL1","BL2","BL3","BL4", + "E+1", "E+2", "E+3", + "E-1", "E-2", "E-3" + }; + + // this is for the ROC n<512 (upgrade 1024) constexpr inline uint16_t divu52(uint16_t n) { diff --git a/RecoLocalTracker/Configuration/python/RecoLocalTracker_cff.py b/RecoLocalTracker/Configuration/python/RecoLocalTracker_cff.py index b601e310db645..6d803d40bc870 100644 --- a/RecoLocalTracker/Configuration/python/RecoLocalTracker_cff.py +++ b/RecoLocalTracker/Configuration/python/RecoLocalTracker_cff.py @@ -17,16 +17,23 @@ striptrackerlocalreco = cms.Sequence(siStripZeroSuppression*siStripClusters*siStripMatchedRecHits) trackerlocalreco = cms.Sequence(pixeltrackerlocalreco*striptrackerlocalreco*clusterSummaryProducer) + from RecoLocalTracker.SiPixelClusterizer.siPixelClustersHeterogeneous_cfi import * from RecoLocalTracker.SiPixelClusterizer.siPixelFedCablingMapGPUWrapper_cfi import * from CalibTracker.SiPixelESProducers.siPixelGainCalibrationForHLTGPU_cfi import * +from RecoLocalTracker.SiPixelRecHits.siPixelRecHitHeterogeneous_cfi import * +from RecoLocalTracker.SiPixelRecHits.siPixelRecHitHeterogeneousConverter_cfi import siPixelRecHitHeterogeneousConverter as _siPixelRecHitHeterogeneousConverter +gpu.toReplaceWith(siPixelRecHitsPreSplitting, _siPixelRecHitHeterogeneousConverter.clone()) + + + from Configuration.ProcessModifiers.gpu_cff import gpu _pixeltrackerlocalreco_gpu = pixeltrackerlocalreco.copy() _pixeltrackerlocalreco_gpu.replace(siPixelClustersPreSplitting, siPixelClustersHeterogeneous+siPixelClustersPreSplitting) +_pixeltrackerlocalreco_gpu.replace(siPixelRecHitsPreSplitting, siPixelRecHitHeterogeneous+siPixelRecHitsPreSplitting) gpu.toReplaceWith(pixeltrackerlocalreco, _pixeltrackerlocalreco_gpu) - from RecoLocalTracker.SiPhase2Clusterizer.phase2TrackerClusterizer_cfi import * from RecoLocalTracker.Phase2TrackerRecHits.Phase2StripCPEGeometricESProducer_cfi import * diff --git a/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.cu b/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.cu index 6b8f713abc0e2..cc03ade4099e0 100644 --- a/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.cu +++ b/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.cu @@ -17,31 +17,60 @@ #include "gpuPixelRecHits.h" namespace pixelgpudetails { - PixelRecHitGPUKernel::PixelRecHitGPUKernel() { + PixelRecHitGPUKernel::PixelRecHitGPUKernel(cuda::stream_t<>& cudaStream) { + + cudaCheck(cudaMalloc((void**) & gpu_.bs_d,3*sizeof(float))); cudaCheck(cudaMalloc((void**) & gpu_.hitsModuleStart_d,(gpuClustering::MaxNumModules+1)*sizeof(uint32_t))); + cudaCheck(cudaMalloc((void**) & gpu_.hitsLayerStart_d,(11)*sizeof(uint32_t))); cudaCheck(cudaMalloc((void**) & gpu_.charge_d,(gpuClustering::MaxNumModules*256)*sizeof(float))); + cudaCheck(cudaMalloc((void**) & gpu_.detInd_d,(gpuClustering::MaxNumModules*256)*sizeof(uint16_t))); cudaCheck(cudaMalloc((void**) & gpu_.xg_d,(gpuClustering::MaxNumModules*256)*sizeof(float))); cudaCheck(cudaMalloc((void**) & gpu_.yg_d,(gpuClustering::MaxNumModules*256)*sizeof(float))); cudaCheck(cudaMalloc((void**) & gpu_.zg_d,(gpuClustering::MaxNumModules*256)*sizeof(float))); + cudaCheck(cudaMalloc((void**) & gpu_.rg_d,(gpuClustering::MaxNumModules*256)*sizeof(float))); + cudaCheck(cudaMalloc((void**) & gpu_.xl_d,(gpuClustering::MaxNumModules*256)*sizeof(float))); + cudaCheck(cudaMalloc((void**) & gpu_.yl_d,(gpuClustering::MaxNumModules*256)*sizeof(float))); cudaCheck(cudaMalloc((void**) & gpu_.xerr_d,(gpuClustering::MaxNumModules*256)*sizeof(float))); cudaCheck(cudaMalloc((void**) & gpu_.yerr_d,(gpuClustering::MaxNumModules*256)*sizeof(float))); + cudaCheck(cudaMalloc((void**) & gpu_.iphi_d,(gpuClustering::MaxNumModules*256)*sizeof(int16_t))); + cudaCheck(cudaMalloc((void**) & gpu_.sortIndex_d,(gpuClustering::MaxNumModules*256)*sizeof(uint16_t))); cudaCheck(cudaMalloc((void**) & gpu_.mr_d,(gpuClustering::MaxNumModules*256)*sizeof(uint16_t))); + cudaCheck(cudaMalloc((void**) & gpu_.mc_d,(gpuClustering::MaxNumModules*256)*sizeof(uint16_t))); +// cudaCheck(cudaMalloc((void**) & gpu_.hist_d, 10*sizeof(HitsOnGPU::Hist))); + + cudaCheck(cudaMalloc((void**) & gpu_d, sizeof(HitsOnGPU))); + cudaCheck(cudaMemcpyAsync(gpu_d, &gpu_, sizeof(HitsOnGPU), cudaMemcpyDefault,cudaStream.id())); + } PixelRecHitGPUKernel::~PixelRecHitGPUKernel() { cudaCheck(cudaFree(gpu_.hitsModuleStart_d)); cudaCheck(cudaFree(gpu_.charge_d)); + cudaCheck(cudaFree(gpu_.detInd_d)); cudaCheck(cudaFree(gpu_.xg_d)); cudaCheck(cudaFree(gpu_.yg_d)); cudaCheck(cudaFree(gpu_.zg_d)); + cudaCheck(cudaFree(gpu_.rg_d)); + cudaCheck(cudaFree(gpu_.xl_d)); + cudaCheck(cudaFree(gpu_.yl_d)); cudaCheck(cudaFree(gpu_.xerr_d)); cudaCheck(cudaFree(gpu_.yerr_d)); + cudaCheck(cudaFree(gpu_.iphi_d)); + cudaCheck(cudaFree(gpu_.sortIndex_d)); cudaCheck(cudaFree(gpu_.mr_d)); + cudaCheck(cudaFree(gpu_.mc_d)); + // cudaCheck(cudaFree(gpu_.hist_d)); + + cudaCheck(cudaFree(gpu_d)); } void PixelRecHitGPUKernel::makeHitsAsync(const siPixelRawToClusterHeterogeneousProduct::GPUProduct& input, + float const * bs, pixelCPEforGPU::ParamsOnGPU const * cpeParams, cuda::stream_t<>& stream) { + + cudaCheck(cudaMemcpyAsync(gpu_.bs_d, bs, 3*sizeof(float), cudaMemcpyDefault, stream.id())); + thrust::exclusive_scan(thrust::cuda::par.on(stream.id()), input.clusInModule_d, input.clusInModule_d + gpuClustering::MaxNumModules + 1, @@ -51,6 +80,7 @@ namespace pixelgpudetails { int blocks = input.nModules; // active modules (with digis) gpuPixelRecHits::getHits<<>>( cpeParams, + gpu_.bs_d, input.moduleInd_d, input.xx_d, input.yy_d, input.adc_d, input.moduleStart_d, @@ -59,13 +89,34 @@ namespace pixelgpudetails { input.nDigis, gpu_.hitsModuleStart_d, gpu_.charge_d, - gpu_.xg_d, gpu_.yg_d, gpu_.zg_d, - gpu_.xerr_d, gpu_.yerr_d, gpu_.mr_d, - true // for the time being stay local... + gpu_.detInd_d, + gpu_.xg_d, gpu_.yg_d, gpu_.zg_d, gpu_.rg_d, + gpu_.iphi_d, + gpu_.xl_d, gpu_.yl_d, + gpu_.xerr_d, gpu_.yerr_d, + gpu_.mr_d, gpu_.mc_d ); // needed only if hits on CPU are required... cudaCheck(cudaMemcpyAsync(hitsModuleStart_, gpu_.hitsModuleStart_d, (gpuClustering::MaxNumModules+1) * sizeof(uint32_t), cudaMemcpyDefault, stream.id())); + + // to be moved to gpu? + auto nhits = hitsModuleStart_[gpuClustering::MaxNumModules]; + for (int i=0;i<10;++i) hitsLayerStart_[i]=hitsModuleStart_[phase1PixelTopology::layerStart[i]]; + hitsLayerStart_[10]=nhits; + + std::cout << "hit layerStart "; + for (int i=0;i<10;++i) std::cout << phase1PixelTopology::layerName[i] << ':' << hitsLayerStart_[i] << ' '; + std::cout << "end:" << hitsLayerStart_[10] << std::endl; + + cudaCheck(cudaMemcpyAsync(gpu_.hitsLayerStart_d, hitsLayerStart_, (11) * sizeof(uint32_t), cudaMemcpyDefault, stream.id())); + + // for timing test + // radixSortMultiWrapper<<<10, 256, 0, c.stream>>>(gpu_.iphi_d,gpu_.sortIndex_d,gpu_.hitsLayerStart_d); + + // fillManyFromVector(gpu_.hist_d,10,gpu_.iphi_d, gpu_.hitsLayerStart_d, nhits,256,c.stream); + + } HitsOnCPU PixelRecHitGPUKernel::getOutput(cuda::stream_t<>& stream) const { @@ -73,13 +124,15 @@ namespace pixelgpudetails { auto nhits = hitsModuleStart_[gpuClustering::MaxNumModules]; HitsOnCPU hoc(nhits); + hoc.gpu_d = gpu_d; memcpy(hoc.hitsModuleStart, hitsModuleStart_, (gpuClustering::MaxNumModules+1) * sizeof(uint32_t)); cudaCheck(cudaMemcpyAsync(hoc.charge.data(), gpu_.charge_d, nhits*sizeof(uint32_t), cudaMemcpyDefault, stream.id())); - cudaCheck(cudaMemcpyAsync(hoc.xl.data(), gpu_.xg_d, nhits*sizeof(uint32_t), cudaMemcpyDefault, stream.id())); - cudaCheck(cudaMemcpyAsync(hoc.yl.data(), gpu_.yg_d, nhits*sizeof(uint32_t), cudaMemcpyDefault, stream.id())); + cudaCheck(cudaMemcpyAsync(hoc.xl.data(), gpu_.xl_d, nhits*sizeof(uint32_t), cudaMemcpyDefault, stream.id())); + cudaCheck(cudaMemcpyAsync(hoc.yl.data(), gpu_.yl_d, nhits*sizeof(uint32_t), cudaMemcpyDefault, stream.id())); cudaCheck(cudaMemcpyAsync(hoc.xe.data(), gpu_.xerr_d, nhits*sizeof(uint32_t), cudaMemcpyDefault, stream.id())); cudaCheck(cudaMemcpyAsync(hoc.ye.data(), gpu_.yerr_d, nhits*sizeof(uint32_t), cudaMemcpyDefault, stream.id())); cudaCheck(cudaMemcpyAsync(hoc.mr.data(), gpu_.mr_d, nhits*sizeof(uint16_t), cudaMemcpyDefault, stream.id())); + cudaCheck(cudaMemcpyAsync(hoc.mc.data(), gpu_.mc_d, nhits*sizeof(uint16_t), cudaMemcpyDefault, stream.id())); cudaCheck(cudaStreamSynchronize(stream.id())); return hoc; } diff --git a/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.h b/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.h index 8d0e7ae4cc055..1493180e58b75 100644 --- a/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.h +++ b/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.h @@ -9,32 +9,21 @@ #include #include +#include "RecoLocalTracker/SiPixelRecHits/plugins/siPixelRecHitsHeterogeneousProduct.h" + + namespace pixelCPEforGPU { struct ParamsOnGPU; } namespace pixelgpudetails { - struct HitsOnGPU{ - uint32_t * hitsModuleStart_d; - int32_t * charge_d; - float *xg_d, *yg_d, *zg_d; - float *xerr_d, *yerr_d; - uint16_t * mr_d; - }; + using HitsOnGPU = siPixelRecHitsHeterogeneousProduct::HitsOnGPU; - struct HitsOnCPU { - explicit HitsOnCPU(uint32_t nhits) : - charge(nhits),xl(nhits),yl(nhits),xe(nhits),ye(nhits), mr(nhits){} - uint32_t hitsModuleStart[2001]; - std::vector charge; - std::vector xl, yl; - std::vector xe, ye; - std::vector mr; - }; + using HitsOnCPU = siPixelRecHitsHeterogeneousProduct::HitsOnCPU; class PixelRecHitGPUKernel { public: - PixelRecHitGPUKernel(); + PixelRecHitGPUKernel(cuda::stream_t<>& cudaStream); ~PixelRecHitGPUKernel(); PixelRecHitGPUKernel(const PixelRecHitGPUKernel&) = delete; @@ -43,14 +32,17 @@ namespace pixelgpudetails { PixelRecHitGPUKernel& operator=(PixelRecHitGPUKernel&&) = delete; void makeHitsAsync(const siPixelRawToClusterHeterogeneousProduct::GPUProduct& input, + float const * bs, pixelCPEforGPU::ParamsOnGPU const * cpeParams, cuda::stream_t<>& stream); HitsOnCPU getOutput(cuda::stream_t<>& stream) const; private: + HitsOnGPU * gpu_d; // copy of the structure on the gpu itself: this is the "Product" HitsOnGPU gpu_; uint32_t hitsModuleStart_[gpuClustering::MaxNumModules+1]; + uint32_t hitsLayerStart_[11]; }; } diff --git a/RecoLocalTracker/SiPixelRecHits/plugins/SiPixelRecHitHeterogeneous.cc b/RecoLocalTracker/SiPixelRecHits/plugins/SiPixelRecHitHeterogeneous.cc index 4e6b43044b920..bfd839295bc8f 100644 --- a/RecoLocalTracker/SiPixelRecHits/plugins/SiPixelRecHitHeterogeneous.cc +++ b/RecoLocalTracker/SiPixelRecHits/plugins/SiPixelRecHitHeterogeneous.cc @@ -1,5 +1,6 @@ #include "DataFormats/Common/interface/DetSetVectorNew.h" #include "DataFormats/Common/interface/Handle.h" +#include "DataFormats/BeamSpot/interface/BeamSpot.h" #include "DataFormats/SiPixelCluster/interface/SiPixelCluster.h" #include "DataFormats/TrackerRecHit2D/interface/SiPixelRecHitCollection.h" #include "FWCore/Framework/interface/ESHandle.h" @@ -21,7 +22,7 @@ #include "RecoLocalTracker/SiPixelClusterizer/plugins/siPixelRawToClusterHeterogeneousProduct.h" // TODO: we need a proper place for this header... -#include "PixelRecHits.h" +#include "PixelRecHits.h" // TODO : spit product from kernel class SiPixelRecHitHeterogeneous: public HeterogeneousEDProducer& cudaStream) override; void acquireGPUCuda(const edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup, cuda::stream_t<>& cudaStream) override; void produceGPUCuda(edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup, cuda::stream_t<>& cudaStream) override; + void convertGPUtoCPU(const edm::Handle& inputhandle, const siPixelRecHitsHeterogeneousProduct::GPUProduct & gpu, CPUProduct& cpu) const; // Commonalities void initialize(const edm::EventSetup& es); @@ -53,6 +60,8 @@ class SiPixelRecHitHeterogeneous: public HeterogeneousEDProducer& inputhandle, SiPixelRecHitCollectionNew &output, const pixelgpudetails::HitsOnCPU& hoc) const; + + edm::EDGetTokenT tBeamSpot; edm::EDGetTokenT token_; edm::EDGetTokenT clusterToken_; std::string cpeName_; @@ -65,18 +74,20 @@ class SiPixelRecHitHeterogeneous: public HeterogeneousEDProducer(iConfig.getParameter("beamSpot"))), token_(consumesHeterogeneous(iConfig.getParameter("heterogeneousSrc"))), clusterToken_(consumes(iConfig.getParameter("src"))), cpeName_(iConfig.getParameter("CPE")) { - produces(); + produces(); } void SiPixelRecHitHeterogeneous::fillDescriptions(edm::ConfigurationDescriptions& descriptions) { edm::ParameterSetDescription desc; + desc.add("beamSpot", edm::InputTag("offlineBeamSpot")); desc.add("heterogeneousSrc", edm::InputTag("siPixelClustersHeterogeneous")); - desc.add("src", edm::InputTag("siPixelClusters")); + desc.add("src", edm::InputTag("siPixelClustersPreSplitting")); desc.add("CPE", "PixelCPEFast"); HeterogeneousEDProducer::fillPSetDescription(desc); @@ -100,11 +111,11 @@ void SiPixelRecHitHeterogeneous::produceCPU(edm::HeterogeneousEvent& iEvent, con edm::Handle hclusters; iEvent.getByToken(clusterToken_, hclusters); - auto output = std::make_unique(); - run(hclusters, *output); + auto output = std::make_unique(); + run(hclusters, output->collection); - output->shrink_to_fit(); - iEvent.put(std::move(output)); + output->collection.shrink_to_fit(); + iEvent.put(std::move(output)); } void SiPixelRecHitHeterogeneous::run(const edm::Handle& inputhandle, SiPixelRecHitCollectionNew &output) const { @@ -140,7 +151,7 @@ void SiPixelRecHitHeterogeneous::run(const edm::Handle& cudaStream) { - gpuAlgo_ = std::make_unique(); + gpuAlgo_ = std::make_unique(cudaStream); } void SiPixelRecHitHeterogeneous::acquireGPUCuda(const edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup, cuda::stream_t<>& cudaStream) { @@ -154,22 +165,38 @@ void SiPixelRecHitHeterogeneous::acquireGPUCuda(const edm::HeterogeneousEvent& i edm::Handle hinput; iEvent.getByToken(token_, hinput); - gpuAlgo_->makeHitsAsync(*hinput, fcpe->getGPUProductAsync(cudaStream), cudaStream); + edm::Handle bsHandle; + iEvent.getByToken( tBeamSpot, bsHandle); + float bs[3] = {0.f}; + if(bsHandle.isValid()) { + const auto & bsh = *bsHandle; + bs[0]=bsh.x0(); bs[1]=bsh.y0(); bs[2]=bsh.z0(); + } + + + gpuAlgo_->makeHitsAsync(*hinput, bs, fcpe->getGPUProductAsync(cudaStream), cudaStream); + } void SiPixelRecHitHeterogeneous::produceGPUCuda(edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup, cuda::stream_t<>& cudaStream) { - const auto& hits = gpuAlgo_->getOutput(cudaStream); + auto output = std::make_unique(gpuAlgo_->getOutput(cudaStream)); - // Need the CPU clusters to + // Need the CPU clusters to // - properly fill the output DetSetVector of hits // - to set up edm::Refs to the clusters edm::Handle hclusters; iEvent.getByToken(clusterToken_, hclusters); - auto output = std::make_unique(); - run(hclusters, *output, hits); - iEvent.put(std::move(output)); + iEvent.put(std::move(output), [this, hclusters](const GPUProduct& hits, CPUProduct& cpu) { + this->convertGPUtoCPU(hclusters, hits, cpu); + }); +} + +void SiPixelRecHitHeterogeneous::convertGPUtoCPU(const edm::Handle& inputhandle, const pixelgpudetails::HitsOnCPU & hoc, SiPixelRecHitHeterogeneous::CPUProduct& cpu) const{ + assert(hoc.gpu_d); + run(inputhandle, cpu.collection, hoc); + } void SiPixelRecHitHeterogeneous::run(const edm::Handle& inputhandle, SiPixelRecHitCollectionNew &output, const pixelgpudetails::HitsOnCPU& hoc) const { @@ -199,31 +226,36 @@ void SiPixelRecHitHeterogeneous::run(const edm::Handlesize()); for (auto const & clust : *DSViter) { assert(ic0 && clust.minPixelRow()==hoc.mr[jnd(--k)]) if(clust.minPixelCol()==hoc.mc[jnd(k)]) {fd=true; break;} } // assert(fd && k!=ij); - if(fd) ij=k; + if(fd) ij=jnd(k); } if(clust.charge()!=hoc.charge[ij]) edm::LogWarning("GPUHits2CPU") << "perfect Match not found " - << gind <<'/'< { +public: + explicit SiPixelRecHitHeterogeneousConverter(edm::ParameterSet const& iConfig); + ~SiPixelRecHitHeterogeneousConverter() = default; + + static void fillDescriptions(edm::ConfigurationDescriptions& descriptions); + +private: + void produce(edm::StreamID, edm::Event& iEvent, const edm::EventSetup& iSetup) const override; + + edm::EDGetTokenT token_; +}; + +SiPixelRecHitHeterogeneousConverter::SiPixelRecHitHeterogeneousConverter(edm::ParameterSet const& iConfig): + token_(consumes(iConfig.getParameter("src"))) +{ + produces(); +} + +void SiPixelRecHitHeterogeneousConverter::fillDescriptions(edm::ConfigurationDescriptions& descriptions) { + edm::ParameterSetDescription desc; + desc.add("src", edm::InputTag("siPixelRecHitHeterogeneous")); + + descriptions.addWithDefaultLabel(desc); +} + +namespace { + template + auto copy_unique(const T& t) { + return std::make_unique(t); + } +} + +void SiPixelRecHitHeterogeneousConverter::produce(edm::StreamID, edm::Event& iEvent, const edm::EventSetup& iSetup) const { + edm::Handle hinput; + iEvent.getByToken(token_, hinput); + + const auto& input = hinput->get().getProduct(); + + iEvent.put(copy_unique(input.collection)); +} + + +DEFINE_FWK_MODULE(SiPixelRecHitHeterogeneousConverter); diff --git a/RecoLocalTracker/SiPixelRecHits/plugins/gpuPixelRecHits.h b/RecoLocalTracker/SiPixelRecHits/plugins/gpuPixelRecHits.h index 98a5198232591..c0e7841658e93 100644 --- a/RecoLocalTracker/SiPixelRecHits/plugins/gpuPixelRecHits.h +++ b/RecoLocalTracker/SiPixelRecHits/plugins/gpuPixelRecHits.h @@ -6,10 +6,14 @@ #include #include +#include "DataFormats/Math/interface/approx_atan2.h" #include "RecoLocalTracker/SiPixelRecHits/interface/pixelCPEforGPU.h" namespace gpuPixelRecHits { + + + // to be moved in common namespace... constexpr uint16_t InvId=9999; // must be > MaxNumModules @@ -20,6 +24,7 @@ namespace gpuPixelRecHits { __global__ void getHits(pixelCPEforGPU::ParamsOnGPU const * cpeParams, + float const * bs, uint16_t const * id, uint16_t const * x, uint16_t const * y, @@ -27,13 +32,15 @@ namespace gpuPixelRecHits { uint32_t const * digiModuleStart, uint32_t const * clusInModule, uint32_t const * moduleId, - int32_t const * clus, + int32_t const * clus, int numElements, uint32_t const * hitsModuleStart, int32_t * chargeh, - float * xh, float * yh, float * zh, - float * xe, float * ye, uint16_t * mr, - bool local) // if true fill just x & y in local coord + uint16_t * detInd, + float * xg, float * yg, float * zg, float * rg, int16_t * iph, + float * xl, float * yl, + float * xe, float * ye, + uint16_t * mr, uint16_t * mc) { // as usual one block per module __shared__ ClusParams clusParams; @@ -108,16 +115,26 @@ namespace gpuPixelRecHits { chargeh[h] = clusParams.charge[ic]; - if (local) { - xh[h] = clusParams.xpos[ic]; - yh[h] = clusParams.ypos[ic]; - } else { - cpeParams->detParams(me).frame.toGlobal(clusParams.xpos[ic], clusParams.ypos[ic], - xh[h], yh[h], zh[h] ); - } - xe[h] = clusParams.xerr[ic]; - ye[h] = clusParams.yerr[ic]; - mr[h] = clusParams.minRow[ic]; + detInd[h] = me; + + xl[h]= clusParams.xpos[ic]; + yl[h]= clusParams.ypos[ic]; + + xe[h]= clusParams.xerr[ic]; + ye[h]= clusParams.yerr[ic]; + mr[h]= clusParams.minRow[ic]; + mc[h]= clusParams.minCol[ic]; + + // to global and compute phi... + cpeParams->detParams(me).frame.toGlobal(xl[h],yl[h], xg[h],yg[h],zg[h]); + // here correct for the beamspot... + xg[h]-=bs[0]; + yg[h]-=bs[1]; + zg[h]-=bs[2]; + + rg[h] = std::sqrt(xg[h]*xg[h]+yg[h]*yg[h]); + iph[h] = unsafe_atan2s<7>(yg[h],xg[h]); + } } diff --git a/RecoLocalTracker/SiPixelRecHits/plugins/siPixelRecHitsHeterogeneousProduct.h b/RecoLocalTracker/SiPixelRecHits/plugins/siPixelRecHitsHeterogeneousProduct.h new file mode 100644 index 0000000000000..6ccd435faa7ba --- /dev/null +++ b/RecoLocalTracker/SiPixelRecHits/plugins/siPixelRecHitsHeterogeneousProduct.h @@ -0,0 +1,65 @@ +#ifndef RecoLocalTracker_SiPixelRecHits_plugins_siPixelRecHitsHeterogeneousProduct_h +#define RecoLocalTracker_SiPixelRecHits_plugins_siPixelRecHitsHeterogeneousProduct_h + +#include "DataFormats/TrackerRecHit2D/interface/SiPixelRecHitCollection.h" +#include "HeterogeneousCore/Product/interface/HeterogeneousProduct.h" + + +#include +#include + +// #include "HeterogeneousCore/CUDAUtilities/interface/HistoContainer.h" + + +namespace siPixelRecHitsHeterogeneousProduct { + + struct CPUProduct { + SiPixelRecHitCollectionNew collection; + }; + + struct HitsOnGPU{ + float * bs_d; + uint32_t * hitsModuleStart_d; + uint32_t * hitsLayerStart_d; + int32_t * charge_d; + uint16_t * detInd_d; + float *xg_d, *yg_d, *zg_d, *rg_d; + float *xl_d, *yl_d; + float *xerr_d, *yerr_d; + int16_t * iphi_d; + uint16_t * sortIndex_d; + uint16_t * mr_d; + uint16_t * mc_d; + + // using Hist = HistoContainer; + // Hist * hist_d; + }; + + + struct HitsOnCPU { + HitsOnCPU() = default; + explicit HitsOnCPU(uint32_t nhits) : + charge(nhits),xl(nhits),yl(nhits),xe(nhits),ye(nhits), mr(nhits), mc(nhits){} + uint32_t hitsModuleStart[2001]; + std::vector charge; + std::vector xl, yl; + std::vector xe, ye; + std::vector mr; + std::vector mc; + + HitsOnGPU const * gpu_d=nullptr; + }; + + + using GPUProduct = HitsOnCPU; // FIXME fill cpu vectors on demand + + + using HeterogeneousPixelRecHit = HeterogeneousProductImpl, + heterogeneous::GPUCudaProduct >; + + +} + + + +#endif diff --git a/RecoLocalTracker/SiPixelRecHits/python/SiPixelRecHits_cfi.py b/RecoLocalTracker/SiPixelRecHits/python/SiPixelRecHits_cfi.py index 87a0d3118554b..5844235e29596 100644 --- a/RecoLocalTracker/SiPixelRecHits/python/SiPixelRecHits_cfi.py +++ b/RecoLocalTracker/SiPixelRecHits/python/SiPixelRecHits_cfi.py @@ -7,9 +7,6 @@ VerboseLevel = cms.untracked.int32(0), ) -from RecoLocalTracker.SiPixelRecHits.siPixelRecHitHeterogeneous_cfi import siPixelRecHitHeterogeneous as _siPixelRecHitHeterogeneous -gpu.toReplaceWith(siPixelRecHits, _siPixelRecHitHeterogeneous) - siPixelRecHitsPreSplitting = siPixelRecHits.clone( src = 'siPixelClustersPreSplitting' ) From eae58e3c8ac66cceba23fa854e3725f9815139bd Mon Sep 17 00:00:00 2001 From: Matti Kortelainen Date: Fri, 29 Jun 2018 10:35:34 +0200 Subject: [PATCH 68/88] Fix CA GPU destructor also when allocateOnGPU() is not called. (#86) Fix CA GPU destructor also when allocateOnGPU() is not called. - initialize pointers to nullptr to avoid freeing non-allocated memory - loop over the actual vector size - more fixes to CA memory management --- .../plugins/CAHitQuadrupletGeneratorGPU.cu | 3 +- .../plugins/CAHitQuadrupletGeneratorGPU.h | 30 +++++++++---------- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/RecoPixelVertexing/PixelTriplets/plugins/CAHitQuadrupletGeneratorGPU.cu b/RecoPixelVertexing/PixelTriplets/plugins/CAHitQuadrupletGeneratorGPU.cu index 615ea1c31f826..aece273083048 100644 --- a/RecoPixelVertexing/PixelTriplets/plugins/CAHitQuadrupletGeneratorGPU.cu +++ b/RecoPixelVertexing/PixelTriplets/plugins/CAHitQuadrupletGeneratorGPU.cu @@ -360,7 +360,7 @@ void CAHitQuadrupletGeneratorGPU::deallocateOnGPU() cudaFreeHost(h_y_); cudaFreeHost(h_z_); cudaFreeHost(h_rootLayerPairs_); - for (int i = 0; i < maxNumberOfRegions_; ++i) + for (size_t i = 0; i < h_foundNtupletsVec_.size(); ++i) { cudaFreeHost(h_foundNtupletsVec_[i]); cudaFreeHost(h_foundNtupletsData_[i]); @@ -373,6 +373,7 @@ void CAHitQuadrupletGeneratorGPU::deallocateOnGPU() cudaFree(d_indices_); cudaFree(d_doublets_); + cudaFree(d_layers_); cudaFree(d_x_); cudaFree(d_y_); cudaFree(d_z_); diff --git a/RecoPixelVertexing/PixelTriplets/plugins/CAHitQuadrupletGeneratorGPU.h b/RecoPixelVertexing/PixelTriplets/plugins/CAHitQuadrupletGeneratorGPU.h index 181644bdc3964..5df14e1857a2e 100644 --- a/RecoPixelVertexing/PixelTriplets/plugins/CAHitQuadrupletGeneratorGPU.h +++ b/RecoPixelVertexing/PixelTriplets/plugins/CAHitQuadrupletGeneratorGPU.h @@ -158,28 +158,28 @@ class CAHitQuadrupletGeneratorGPU { unsigned int numberOfLayerPairs_ = 0; unsigned int numberOfLayers_ = 0; - GPULayerDoublets* h_doublets_; - GPULayerHits* h_layers_; - - unsigned int* h_indices_; - float *h_x_, *h_y_, *h_z_; - float *d_x_, *d_y_, *d_z_; - unsigned int* d_rootLayerPairs_; - GPULayerHits* d_layers_; - GPULayerDoublets* d_doublets_; - unsigned int* d_indices_; - unsigned int* h_rootLayerPairs_; + GPULayerDoublets* h_doublets_ = nullptr; + GPULayerHits* h_layers_ = nullptr; + + unsigned int* h_indices_ = nullptr; + float *h_x_=nullptr, *h_y_=nullptr, *h_z_=nullptr; + float *d_x_=nullptr, *d_y_=nullptr, *d_z_=nullptr; + unsigned int* d_rootLayerPairs_ = nullptr; + GPULayerHits* d_layers_ = nullptr; + GPULayerDoublets* d_doublets_ = nullptr; + unsigned int* d_indices_ = nullptr; + unsigned int* h_rootLayerPairs_ = nullptr; std::vector*> h_foundNtupletsVec_; std::vector h_foundNtupletsData_; std::vector*> d_foundNtupletsVec_; std::vector d_foundNtupletsData_; - GPUCACell* device_theCells_; - GPU::VecArray< unsigned int, maxCellsPerHit_>* device_isOuterHitOfCell_; + GPUCACell* device_theCells_ = nullptr; + GPU::VecArray< unsigned int, maxCellsPerHit_>* device_isOuterHitOfCell_ = nullptr; - GPULayerHits* tmp_layers_; - GPULayerDoublets* tmp_layerDoublets_; + GPULayerHits* tmp_layers_ = nullptr; + GPULayerDoublets* tmp_layerDoublets_ = nullptr; }; #endif From bc0bc299505d8f32d997f2c561037309c8e47c6c Mon Sep 17 00:00:00 2001 From: Matti Kortelainen Date: Fri, 29 Jun 2018 20:34:48 +0200 Subject: [PATCH 69/88] Various fixes and cleanup (#87) - replace `exclusive_scan` with `memset` + `inclusive_scan` to avoid an invalid read - fix memory sizes in allocations and copies - add a missing stream synchronize - set `recordWatcherUpdatedSinceLastTransfer_` to avoid spurious copies --- .../plugins/SiPixelRawToClusterGPUKernel.cu | 4 ++-- .../SiPixelRawToClusterHeterogeneous.cc | 1 + .../SiPixelRecHits/plugins/PixelRecHits.cu | 19 +++++++++++-------- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelRawToClusterGPUKernel.cu b/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelRawToClusterGPUKernel.cu index fdf7455475197..991e82ccd2491 100644 --- a/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelRawToClusterGPUKernel.cu +++ b/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelRawToClusterGPUKernel.cu @@ -39,7 +39,7 @@ namespace pixelgpudetails { SiPixelRawToClusterGPUKernel::SiPixelRawToClusterGPUKernel() { - int WSIZE = pixelgpudetails::MAX_FED * pixelgpudetails::MAX_WORD * sizeof(unsigned int); + int WSIZE = pixelgpudetails::MAX_FED * pixelgpudetails::MAX_WORD; cudaMallocHost(&word, sizeof(unsigned int)*WSIZE); cudaMallocHost(&fedId_h, sizeof(unsigned char)*WSIZE); @@ -680,8 +680,8 @@ namespace pixelgpudetails { // std::cout << "found " << nModulesActive << " Modules active" << std::endl; - // TODO: I suspect we need a cudaStreamSynchronize before using nModules below // In order to avoid the cudaStreamSynchronize, create a new kernel which launches countModules and findClus. + cudaStreamSynchronize(stream.id()); threadsPerBlock = 256; blocks = nModulesActive; diff --git a/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelRawToClusterHeterogeneous.cc b/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelRawToClusterHeterogeneous.cc index dcf41155eebc9..196a08b85d861 100644 --- a/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelRawToClusterHeterogeneous.cc +++ b/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelRawToClusterHeterogeneous.cc @@ -439,6 +439,7 @@ void SiPixelRawToClusterHeterogeneous::acquireGPUCuda(const edm::HeterogeneousEv else if(recordWatcherUpdatedSinceLastTransfer_) { // If regions_ are disabled, it is enough to fill and transfer only if cablingMap has changed gpuModulesToUnpack_->fillAsync(*cablingMap_, std::set(), cudaStream); + recordWatcherUpdatedSinceLastTransfer_ = false; } edm::ESHandle hgpuMap; diff --git a/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.cu b/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.cu index cc03ade4099e0..813c4f0a05290 100644 --- a/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.cu +++ b/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.cu @@ -71,10 +71,13 @@ namespace pixelgpudetails { cudaCheck(cudaMemcpyAsync(gpu_.bs_d, bs, 3*sizeof(float), cudaMemcpyDefault, stream.id())); - thrust::exclusive_scan(thrust::cuda::par.on(stream.id()), + // Set first the first element to 0 + cudaCheck(cudaMemsetAsync(gpu_.hitsModuleStart_d, 0, sizeof(uint32_t), stream.id())); + // Then use inclusive_scan to get the partial sum to the rest + thrust::inclusive_scan(thrust::cuda::par.on(stream.id()), input.clusInModule_d, - input.clusInModule_d + gpuClustering::MaxNumModules + 1, - gpu_.hitsModuleStart_d); + input.clusInModule_d + gpuClustering::MaxNumModules, + &gpu_.hitsModuleStart_d[1]); int threadsPerBlock = 256; int blocks = input.nModules; // active modules (with digis) @@ -126,11 +129,11 @@ namespace pixelgpudetails { HitsOnCPU hoc(nhits); hoc.gpu_d = gpu_d; memcpy(hoc.hitsModuleStart, hitsModuleStart_, (gpuClustering::MaxNumModules+1) * sizeof(uint32_t)); - cudaCheck(cudaMemcpyAsync(hoc.charge.data(), gpu_.charge_d, nhits*sizeof(uint32_t), cudaMemcpyDefault, stream.id())); - cudaCheck(cudaMemcpyAsync(hoc.xl.data(), gpu_.xl_d, nhits*sizeof(uint32_t), cudaMemcpyDefault, stream.id())); - cudaCheck(cudaMemcpyAsync(hoc.yl.data(), gpu_.yl_d, nhits*sizeof(uint32_t), cudaMemcpyDefault, stream.id())); - cudaCheck(cudaMemcpyAsync(hoc.xe.data(), gpu_.xerr_d, nhits*sizeof(uint32_t), cudaMemcpyDefault, stream.id())); - cudaCheck(cudaMemcpyAsync(hoc.ye.data(), gpu_.yerr_d, nhits*sizeof(uint32_t), cudaMemcpyDefault, stream.id())); + cudaCheck(cudaMemcpyAsync(hoc.charge.data(), gpu_.charge_d, nhits*sizeof(int32_t), cudaMemcpyDefault, stream.id())); + cudaCheck(cudaMemcpyAsync(hoc.xl.data(), gpu_.xl_d, nhits*sizeof(float), cudaMemcpyDefault, stream.id())); + cudaCheck(cudaMemcpyAsync(hoc.yl.data(), gpu_.yl_d, nhits*sizeof(float), cudaMemcpyDefault, stream.id())); + cudaCheck(cudaMemcpyAsync(hoc.xe.data(), gpu_.xerr_d, nhits*sizeof(float), cudaMemcpyDefault, stream.id())); + cudaCheck(cudaMemcpyAsync(hoc.ye.data(), gpu_.yerr_d, nhits*sizeof(float), cudaMemcpyDefault, stream.id())); cudaCheck(cudaMemcpyAsync(hoc.mr.data(), gpu_.mr_d, nhits*sizeof(uint16_t), cudaMemcpyDefault, stream.id())); cudaCheck(cudaMemcpyAsync(hoc.mc.data(), gpu_.mc_d, nhits*sizeof(uint16_t), cudaMemcpyDefault, stream.id())); cudaCheck(cudaStreamSynchronize(stream.id())); From a260811b7fa219817bac0a28cb76cc262209f388 Mon Sep 17 00:00:00 2001 From: Andrea Bocci Date: Sun, 1 Jul 2018 20:33:43 +0200 Subject: [PATCH 70/88] Show acquire() calls in the nvidia profiler (#88) --- .../CUDAServices/plugins/NVProfilerService.cc | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/HeterogeneousCore/CUDAServices/plugins/NVProfilerService.cc b/HeterogeneousCore/CUDAServices/plugins/NVProfilerService.cc index 5e946681c878c..2d0b68e352ec7 100644 --- a/HeterogeneousCore/CUDAServices/plugins/NVProfilerService.cc +++ b/HeterogeneousCore/CUDAServices/plugins/NVProfilerService.cc @@ -256,6 +256,10 @@ class NVProfilerService { void preModuleStreamEndLumi(edm::StreamContext const&, edm::ModuleCallingContext const&); void postModuleStreamEndLumi(edm::StreamContext const&, edm::ModuleCallingContext const&); + // these signal pair are guaranteed to be called by the same thread + void preModuleEventAcquire(edm::StreamContext const&, edm::ModuleCallingContext const&); + void postModuleEventAcquire(edm::StreamContext const&, edm::ModuleCallingContext const&); + // these signal pair are guaranteed to be called by the same thread void preModuleEvent(edm::StreamContext const&, edm::ModuleCallingContext const&); void postModuleEvent(edm::StreamContext const&, edm::ModuleCallingContext const&); @@ -460,6 +464,10 @@ NVProfilerService::NVProfilerService(edm::ParameterSet const & config, edm::Acti registry.watchPreModuleStreamEndLumi(this, &NVProfilerService::preModuleStreamEndLumi); registry.watchPostModuleStreamEndLumi(this, &NVProfilerService::postModuleStreamEndLumi); + // these signal pair are guaranteed to be called by the same thread + registry.watchPreModuleEventAcquire(this, &NVProfilerService::preModuleEventAcquire); + registry.watchPostModuleEventAcquire(this, &NVProfilerService::postModuleEventAcquire); + // these signal pair are guaranteed to be called by the same thread registry.watchPreModuleEvent(this, &NVProfilerService::preModuleEvent); registry.watchPostModuleEvent(this, &NVProfilerService::postModuleEvent); @@ -809,6 +817,25 @@ NVProfilerService::postModuleEndJob(edm::ModuleDescription const& desc) { nvtxDomainRangeEnd(global_domain(), global_modules_[mid]); } +void +NVProfilerService::preModuleEventAcquire(edm::StreamContext const& sc, edm::ModuleCallingContext const& mcc) { + auto sid = sc.streamID(); + auto mid = mcc.moduleDescription()->id(); + auto const & label = mcc.moduleDescription()->moduleLabel(); + auto const & msg = label + " acquire"; + if (highlight(label)) + stream_modules_[sid][mid] = nvtxDomainRangeStartColor(stream_domain(sid), msg.c_str(), nvtxAmber); + else + stream_modules_[sid][mid] = nvtxDomainRangeStartColor(stream_domain(sid), msg.c_str(), nvtxGreen);; +} + +void +NVProfilerService::postModuleEventAcquire(edm::StreamContext const& sc, edm::ModuleCallingContext const& mcc) { + auto sid = sc.streamID(); + auto mid = mcc.moduleDescription()->id(); + nvtxDomainRangeEnd(stream_domain(sid), stream_modules_[sid][mid]); +} + void NVProfilerService::preModuleEvent(edm::StreamContext const& sc, edm::ModuleCallingContext const& mcc) { auto sid = sc.streamID(); From 5fe82d32eaac548d84889d27f880ca584b85661c Mon Sep 17 00:00:00 2001 From: Vincenzo Innocente Date: Wed, 4 Jul 2018 15:33:04 +0200 Subject: [PATCH 71/88] Add GPU utilities (#69) Add an implementation of - radix-sort - histogram that work on indices in a contiguous array Add a file containing simplified versions of std algorithms that compile with cuda (mostly constexpr and no fancy templating). --- HeterogeneousCore/CUDAUtilities/BuildFile.xml | 3 +- .../CUDAUtilities/interface/HistoContainer.h | 154 ++++++++++++++++ .../interface/cudastdAlgorithm.h | 76 ++++++++ .../CUDAUtilities/interface/radixSort.h | 168 ++++++++++++++++++ .../CUDAUtilities/test/BuildFile.xml | 31 +++- .../CUDAUtilities/test/HistoContainer_t.cpp | 53 ++++++ .../CUDAUtilities/test/HistoContainer_t.cu | 128 +++++++++++++ .../CUDAUtilities/test/cudastdAlgorithm_t.cpp | 41 +++++ .../CUDAUtilities/test/cudastdAlgorithm_t.cu | 49 +++++ .../CUDAUtilities/test/radixSort_t.cu | 121 +++++++++++++ 10 files changed, 821 insertions(+), 3 deletions(-) create mode 100644 HeterogeneousCore/CUDAUtilities/interface/HistoContainer.h create mode 100644 HeterogeneousCore/CUDAUtilities/interface/cudastdAlgorithm.h create mode 100644 HeterogeneousCore/CUDAUtilities/interface/radixSort.h create mode 100644 HeterogeneousCore/CUDAUtilities/test/HistoContainer_t.cpp create mode 100644 HeterogeneousCore/CUDAUtilities/test/HistoContainer_t.cu create mode 100644 HeterogeneousCore/CUDAUtilities/test/cudastdAlgorithm_t.cpp create mode 100644 HeterogeneousCore/CUDAUtilities/test/cudastdAlgorithm_t.cu create mode 100644 HeterogeneousCore/CUDAUtilities/test/radixSort_t.cu diff --git a/HeterogeneousCore/CUDAUtilities/BuildFile.xml b/HeterogeneousCore/CUDAUtilities/BuildFile.xml index adfe5e217c073..38ee88b068999 100644 --- a/HeterogeneousCore/CUDAUtilities/BuildFile.xml +++ b/HeterogeneousCore/CUDAUtilities/BuildFile.xml @@ -1,2 +1 @@ - - + diff --git a/HeterogeneousCore/CUDAUtilities/interface/HistoContainer.h b/HeterogeneousCore/CUDAUtilities/interface/HistoContainer.h new file mode 100644 index 0000000000000..baa2e7f64c613 --- /dev/null +++ b/HeterogeneousCore/CUDAUtilities/interface/HistoContainer.h @@ -0,0 +1,154 @@ +#ifndef HeterogeneousCore_CUDAUtilities_HistoContainer_h +#define HeterogeneousCore_CUDAUtilities_HistoContainer_h + +#include +#include +#include +#ifndef __CUDA_ARCH__ +#include +#endif // __CUDA_ARCH__ + +#ifdef __CUDACC__ +#include +#else +#define __device__ +#define __global__ +#define __host__ +#endif // __CUDACC__ + +#include "HeterogeneousCore/CUDAUtilities/interface/cudastdAlgorithm.h" + +#ifdef __CUDACC__ +namespace cudautils { + + template + __global__ + void zeroMany(Histo * h, uint32_t nh) { + auto i = blockIdx.x * blockDim.x + threadIdx.x; + auto ih = i / Histo::nbins(); + auto k = i - ih * Histo::nbins(); + if (ih < nh) { + h[ih].nspills = 0; + if (k < Histo::nbins()) + h[ih].n[k] = 0; + } + } + + template + __global__ + void fillFromVector(Histo * h, uint32_t nh, T const * v, uint32_t * offsets) { + auto i = blockIdx.x * blockDim.x + threadIdx.x; + if(i >= offsets[nh]) return; + auto off = cuda_std::upper_bound(offsets, offsets + nh + 1, i); + assert((*off) > 0); + int32_t ih = off - offsets - 1; + assert(ih >= 0); + assert(ih < nh); + h[ih].fill(v, i); + } + + template + __global__ + void fillFromVector(Histo * h, T const * v, uint32_t size) { + auto i = blockIdx.x * blockDim.x + threadIdx.x; + if(i < size) h->fill(v, i); + } + + template + void zero(Histo * h, uint32_t nh, int nthreads, cudaStream_t stream) { + auto nblocks = (nh * Histo::nbins() + nthreads - 1) / nthreads; + zeroMany<<>>(h, nh); + } + + template + void fillOneFromVector(Histo * h, T const * v, uint32_t size, int nthreads, cudaStream_t stream) { + zero(h, 1, nthreads, stream); + auto nblocks = (size + nthreads - 1) / nthreads; + fillFromVector<<>>(h, v, size); + } + + template + void fillManyFromVector(Histo * h, uint32_t nh, T const * v, uint32_t * offsets, uint32_t totSize, int nthreads, cudaStream_t stream) { + zero(h, nh, nthreads, stream); + auto nblocks = (totSize + nthreads - 1) / nthreads; + fillFromVector<<>>(h, nh, v, offsets); + } + +} // namespace cudautils +#endif + +template +class HistoContainer { +public: +#ifdef __CUDACC__ + using Counter = uint32_t; +#else + using Counter = std::atomic; +#endif + + static constexpr uint32_t sizeT() { return sizeof(T) * 8; } + static constexpr uint32_t nbins() { return 1 << N; } + static constexpr uint32_t shift() { return sizeT() - N; } + static constexpr uint32_t mask() { return nbins() - 1; } + static constexpr uint32_t binSize() { return 1 << M; } + static constexpr uint32_t spillSize() { return 4 * binSize(); } + + static constexpr uint32_t bin(T t) { + return (t >> shift()) & mask(); + } + + void zero() { + nspills = 0; + for (auto & i : n) + i = 0; + } + + static constexpr + uint32_t atomicIncrement(Counter & x) { + #ifdef __CUDA_ARCH__ + return atomicAdd(&x, 1); + #else + return x++; + #endif + } + + __host__ __device__ + void fill(T const * t, uint32_t j) { + auto b = bin(t[j]); + auto w = atomicIncrement(n[b]); + if (w < binSize()) { + bins[b * binSize() + w] = j; + } else { + auto w = atomicIncrement(nspills); + if (w < spillSize()) + spillBin[w] = j; + } + } + + constexpr bool fullSpill() const { + return nspills >= spillSize(); + } + + constexpr bool full(uint32_t b) const { + return n[b] >= binSize(); + } + + constexpr auto const * begin(uint32_t b) const { + return bins + b * binSize(); + } + + constexpr auto const * end(uint32_t b) const { + return begin(b) + std::min(binSize(), uint32_t(n[b])); + } + + constexpr auto size(uint32_t b) const { + return n[b]; + } + + uint32_t bins[nbins()*binSize()]; + Counter n[nbins()]; + uint32_t spillBin[spillSize()]; + Counter nspills; +}; + +#endif // HeterogeneousCore_CUDAUtilities_HistoContainer_h diff --git a/HeterogeneousCore/CUDAUtilities/interface/cudastdAlgorithm.h b/HeterogeneousCore/CUDAUtilities/interface/cudastdAlgorithm.h new file mode 100644 index 0000000000000..4bfa4e694d9dc --- /dev/null +++ b/HeterogeneousCore/CUDAUtilities/interface/cudastdAlgorithm.h @@ -0,0 +1,76 @@ +#ifndef HeterogeneousCore_CUDAUtilities_cudastdAlgorithm_h +#define HeterogeneousCore_CUDAUtilities_cudastdAlgorithm_h + +#include + +// reimplementation of std algorithms able to compile with CUDA and run on GPUs, +// mostly by declaringthem constexpr + +namespace cuda_std { + + template + struct less { + constexpr bool operator()(const T &lhs, const T &rhs) const { + return lhs < rhs; + } + }; + + template<> + struct less { + template + constexpr bool operator()(const T &lhs, const U &rhs ) const { return lhs < rhs;} + }; + + template> + constexpr + RandomIt lower_bound(RandomIt first, RandomIt last, const T& value, Compare comp={}) + { + auto count = last - first; + + while (count > 0) { + auto it = first; + auto step = count / 2; + it += step; + if (comp(*it, value)) { + first = ++it; + count -= step + 1; + } + else { + count = step; + } + } + return first; + } + + template> + constexpr + RandomIt upper_bound(RandomIt first, RandomIt last, const T& value, Compare comp={}) + { + auto count = last - first; + + while (count > 0) { + auto it = first; + auto step = count / 2; + it+=step; + if (!comp(value,*it)) { + first = ++it; + count -= step + 1; + } + else { + count = step; + } + } + return first; + } + + template> + constexpr + RandomIt binary_find(RandomIt first, RandomIt last, const T& value, Compare comp={}) + { + first = cuda_std::lower_bound(first, last, value, comp); + return first != last && !comp(value, *first) ? first : last; + } + +} + +#endif // HeterogeneousCore_CUDAUtilities_cudastdAlgorithm_h diff --git a/HeterogeneousCore/CUDAUtilities/interface/radixSort.h b/HeterogeneousCore/CUDAUtilities/interface/radixSort.h new file mode 100644 index 0000000000000..6dc67337ddd7e --- /dev/null +++ b/HeterogeneousCore/CUDAUtilities/interface/radixSort.h @@ -0,0 +1,168 @@ +#ifndef HeterogeneousCoreCUDAUtilities_radixSort_H +#define HeterogeneousCoreCUDAUtilities_radixSort_H + +#include +#include + +template +__device__ +void radixSort(T * a, uint16_t * ind, uint32_t size) { + + constexpr int d = 8, w = 8*sizeof(T); + constexpr int sb = 1<0); + assert(size<=MaxSize); + assert(blockDim.x==sb); + + // bool debug = false; // threadIdx.x==0 && blockIdx.x==5; + + firstNeg=0; + + p = 0; + + auto j = ind; + auto k = ind2; + + int32_t first = threadIdx.x; + for (auto i=first; i> d*p)&(sb-1); + atomicAdd(&c[bin],1); + } + __syncthreads(); + + // prefix scan "optimized"???... + auto x = c[threadIdx.x]; + auto laneId = threadIdx.x & 0x1f; + #pragma unroll + for( int offset = 1 ; offset < 32 ; offset <<= 1 ) { + auto y = __shfl_up_sync(0xffffffff,x, offset); + if(laneId >= offset) x += y; + } + ct[threadIdx.x] = x; + __syncthreads(); + auto ss = (threadIdx.x/32)*32 -1; + c[threadIdx.x] = ct[threadIdx.x]; + for(int i=ss; i>0; i-=32) c[threadIdx.x] +=ct[i]; + + /* + //prefix scan for the nulls (for documentation) + if (threadIdx.x==0) + for (int i = 1; i < sb; ++i) c[i] += c[i-1]; + */ + + + // broadcast + ibs =size-1; + __syncthreads(); + while (ibs>0) { + int i = ibs - threadIdx.x; + cu[threadIdx.x]=-1; + ct[threadIdx.x]=-1; + __syncthreads(); + int32_t bin = -1; + if (i>=0) { + bin = (a[j[i]] >> d*p)&(sb-1); + ct[threadIdx.x]=bin; + atomicMax(&cu[bin],int(i)); + } + __syncthreads(); + if (i>=0 && i==cu[bin]) // ensure to keep them in order + for (int ii=threadIdx.x; ii=oi);if(i>=oi) + k[--c[bin]] = j[i-oi]; + } + __syncthreads(); + if (bin>=0) assert(c[bin]>=0); + if (threadIdx.x==0) ibs-=blockDim.x; + __syncthreads(); + } + + /* + // broadcast for the nulls (for documentation) + if (threadIdx.x==0) + for (int i=size-first-1; i>=0; i--) { // =blockDim.x) { + auto bin = (a[j[i]] >> d*p)&(sb-1); + auto ik = atomicSub(&c[bin],1); + k[ik-1] = j[i]; + } + */ + + __syncthreads(); + assert(c[0]==0); + + + // swap (local, ok) + auto t=j;j=k;k=t; + + if (threadIdx.x==0) ++p; + __syncthreads(); + + } + + // w/d is even so ind is correct + assert(j==ind); + __syncthreads(); + + + + // now move negative first... + // find first negative (for float ^ will not work...) + for (auto i=first; i0); not necessary true if all positive ! + + auto ii=first; + for (auto i=firstNeg+threadIdx.x; i=0); + for (auto i=first;i +__device__ +void radixSortMulti(T * v, uint16_t * index, uint32_t * offsets) { + + auto a = v+offsets[blockIdx.x]; + auto ind = index+offsets[blockIdx.x];; + auto size = offsets[blockIdx.x+1]-offsets[blockIdx.x]; + assert(offsets[blockIdx.x+1]>=offsets[blockIdx.x]); + if (size>0) radixSort(a,ind,size); + +} + +template +__global__ +void radixSortMultiWrapper(T * v, uint16_t * index, uint32_t * offsets) { + radixSortMulti(v,index,offsets); +} + +#endif // HeterogeneousCoreCUDAUtilities_radixSort_H diff --git a/HeterogeneousCore/CUDAUtilities/test/BuildFile.xml b/HeterogeneousCore/CUDAUtilities/test/BuildFile.xml index a1a7efcce6abb..1c1d28dbf3761 100644 --- a/HeterogeneousCore/CUDAUtilities/test/BuildFile.xml +++ b/HeterogeneousCore/CUDAUtilities/test/BuildFile.xml @@ -1,2 +1,31 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/HeterogeneousCore/CUDAUtilities/test/HistoContainer_t.cpp b/HeterogeneousCore/CUDAUtilities/test/HistoContainer_t.cpp new file mode 100644 index 0000000000000..373c7ed4b78ea --- /dev/null +++ b/HeterogeneousCore/CUDAUtilities/test/HistoContainer_t.cpp @@ -0,0 +1,53 @@ +#include "HeterogeneousCore/CUDAUtilities/interface/HistoContainer.h" + +#include +#include +#include +#include +#include + +template +void go() { + std::mt19937 eng; + std::uniform_int_distribution rgen(std::numeric_limits::min(),std::numeric_limits::max()); + + + constexpr int N=12000; + T v[N]; + + using Hist = HistoContainer; + std::cout << "HistoContainer " << Hist::nbins() << ' ' << Hist::binSize() << std::endl; + + Hist h; + for (int it=0; it<5; ++it) { + for (long long j = 0; j < N; j++) v[j]=rgen(eng); + h.zero(); + for (long long j = 0; j < N; j++) h.fill(v,j); + + std::cout << "nspills " << h.nspills << std::endl; + + auto verify = [&](uint32_t i, uint32_t k, uint32_t t1, uint32_t t2) { + assert(t1(); + + return 0; +} diff --git a/HeterogeneousCore/CUDAUtilities/test/HistoContainer_t.cu b/HeterogeneousCore/CUDAUtilities/test/HistoContainer_t.cu new file mode 100644 index 0000000000000..2b7025cc2965e --- /dev/null +++ b/HeterogeneousCore/CUDAUtilities/test/HistoContainer_t.cu @@ -0,0 +1,128 @@ +#include "HeterogeneousCore/CUDAUtilities/interface/HistoContainer.h" + +#include +#include +#include +#include +#include + +#include + +template +void go() { + + if (cuda::device::count() == 0) { + std::cerr << "No CUDA devices on this system" << "\n"; + exit(EXIT_FAILURE); + } + + auto current_device = cuda::device::current::get(); + + + + std::mt19937 eng; + std::uniform_int_distribution rgen(std::numeric_limits::min(),std::numeric_limits::max()); + + + constexpr int N=12000; + T v[N]; + auto v_d = cuda::memory::device::make_unique(current_device, N); + + cuda::memory::copy(v_d.get(), v, N*sizeof(T)); + + constexpr uint32_t nParts = 10; + constexpr uint32_t partSize = N/nParts; + uint32_t offsets[nParts+1]; + + using Hist = HistoContainer; + std::cout << "HistoContainer " << Hist::nbins() << ' ' << Hist::binSize() << ' ' << (std::numeric_limits::max()-std::numeric_limits::min())/Hist::nbins() << std::endl; + + Hist h[nParts]; + + auto h_d = cuda::memory::device::make_unique(current_device, nParts); + auto off_d = cuda::memory::device::make_unique(current_device, nParts+1); + + + for (int it=0; it<5; ++it) { + + offsets[0]=0; + for (uint32_t j=1; j window ) {} else {++tot;} + } + if (kk==i) { l=false; continue; } + if (l) for (auto p=h[j].begin(kk); p=nm)) { + std::cout << "too bad " << j << ' ' << i <<' ' << me << '/'<< T(me-window)<< '/'<< T(me+window) << ": " << kl << '/' << kh << ' '<< khh << ' '<< tot<<'/'<(); + + return 0; +} diff --git a/HeterogeneousCore/CUDAUtilities/test/cudastdAlgorithm_t.cpp b/HeterogeneousCore/CUDAUtilities/test/cudastdAlgorithm_t.cpp new file mode 100644 index 0000000000000..ea45a8bf77f83 --- /dev/null +++ b/HeterogeneousCore/CUDAUtilities/test/cudastdAlgorithm_t.cpp @@ -0,0 +1,41 @@ +#include "HeterogeneousCore/CUDAUtilities/interface/cudastdAlgorithm.h" +#include +#include +#include +#include + +void testBinaryFind() +{ + std::vector data = { 1, 1, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5, 6 }; + + auto lower = cuda_std::lower_bound(data.begin(), data.end(), 4); + auto upper = cuda_std::upper_bound(data.begin(), data.end(), 4); + + std::copy(lower, upper, std::ostream_iterator(std::cout, " ")); + + std::cout << '\n'; + + // classic binary search, returning a value only if it is present + + data = { 1, 2, 4, 6, 9, 10 }; + + auto test = [&](auto v) { + auto it = cuda_std::binary_find(data.cbegin(), data.cend(), v); + + if(it != data.cend()) + std::cout << *it << " found at index "<< std::distance(data.cbegin(), it) << std::endl; + else + std::cout << v << " non found" << std::endl; + }; + + test(4); + test(5); + +} + +int main() { + + testBinaryFind(); + + +} diff --git a/HeterogeneousCore/CUDAUtilities/test/cudastdAlgorithm_t.cu b/HeterogeneousCore/CUDAUtilities/test/cudastdAlgorithm_t.cu new file mode 100644 index 0000000000000..df5f84453af99 --- /dev/null +++ b/HeterogeneousCore/CUDAUtilities/test/cudastdAlgorithm_t.cu @@ -0,0 +1,49 @@ +#include "HeterogeneousCore/CUDAUtilities/interface/cudastdAlgorithm.h" + + +#include "cuda/api_wrappers.h" +#include + +__global__ +void testBinaryFind() +{ + int data[] = { 1, 1, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5, 6 }; + + auto lower = cuda_std::lower_bound(data, data+13, 4); + auto upper = cuda_std::upper_bound(data, data+12, 4); + + assert(3 == upper-lower); + + // classic binary search, returning a value only if it is present + + constexpr int data2[] = { 1, 2, 4, 6, 9, 10 }; + + assert(data2+2 == cuda_std::binary_find(data2, data2+6, 4)); + assert(data2+6 == cuda_std::binary_find(data2, data2+6, 5)); +} + +#include +void wrapper() +{ + + if (cuda::device::count() == 0) { + std::cerr << "No CUDA devices on this system" << "\n"; + exit(EXIT_FAILURE); + } + + auto current_device = cuda::device::current::get(); + + cuda::launch( + testBinaryFind, + { 32, 64 } + ); + + +} + +int main() { + + wrapper(); + + +} diff --git a/HeterogeneousCore/CUDAUtilities/test/radixSort_t.cu b/HeterogeneousCore/CUDAUtilities/test/radixSort_t.cu new file mode 100644 index 0000000000000..32d8317dc7a42 --- /dev/null +++ b/HeterogeneousCore/CUDAUtilities/test/radixSort_t.cu @@ -0,0 +1,121 @@ +#include "HeterogeneousCore/CUDAUtilities/interface/radixSort.h" + +#include "cuda/api_wrappers.h" + +#include +#include +#include +#include +#include + + +#include +#include +#include + + +template +void go() { + +std::mt19937 eng; +// std::mt19937 eng2; +std::uniform_int_distribution rgen(std::numeric_limits::min(),std::numeric_limits::max()); + + + auto start = std::chrono::high_resolution_clock::now(); + auto delta = start - start; + + if (cuda::device::count() == 0) { + std::cerr << "No CUDA devices on this system" << "\n"; + exit(EXIT_FAILURE); + } + + auto current_device = cuda::device::current::get(); + + constexpr int blocks=10; + constexpr int blockSize = 256*32; + constexpr int N=blockSize*blocks; + T v[N]; + uint16_t ind[N]; + + + + + std::cout << "Will sort " << N << " 'ints' of size " << sizeof(T) << std::endl; + + for (int i=0; i<50; ++i) { + + if (i==49) { + for (long long j = 0; j < N; j++) v[j]=0; + } else if (i>30) { + for (long long j = 0; j < N; j++) v[j]=rgen(eng); + } else { + long long imax = (i<15) ? std::numeric_limits::max() +1LL : 255; + for (long long j = 0; j < N; j++) { + v[j]=(j%imax); if(j%2 && i%2) v[j]=-v[j]; + } + } + + uint32_t offsets[blocks+1]; + offsets[0]=0; + for (int j=1; j(current_device, N); + auto ind_d = cuda::memory::device::make_unique(current_device, N); + auto off_d = cuda::memory::device::make_unique(current_device, blocks+1); + + cuda::memory::copy(v_d.get(), v, N*sizeof(T)); + cuda::memory::copy(off_d.get(), offsets, 4*(blocks+1)); + + if (i<2) std::cout << "lauch for " << offsets[blocks] << std::endl; + + delta -= (std::chrono::high_resolution_clock::now()-start); + cuda::launch( + radixSortMultiWrapper, + { blocks, 256 }, + v_d.get(),ind_d.get(),off_d.get() + ); + + if (i==0) std::cout << "done for " << offsets[blocks] << std::endl; + +// cuda::memory::copy(v, v_d.get(), 2*N); + cuda::memory::copy(ind, ind_d.get(), 2*N); + + delta += (std::chrono::high_resolution_clock::now()-start); + + if (i==0) std::cout << "done for " << offsets[blocks] << std::endl; + + if (32==i) { + std::cout << v[ind[0]] << ' ' << v[ind[1]] << ' ' << v[ind[2]] << std::endl; + std::cout << v[ind[3]] << ' ' << v[ind[10]] << ' ' << v[ind[blockSize-1000]] << std::endl; + std::cout << v[ind[blockSize/2-1]] << ' ' << v[ind[blockSize/2]] << ' ' << v[ind[blockSize/2+1]] << std::endl; + } + for (int ib=0; ib(delta).count()/50. + << " ms" << std::endl; +} + + +int main() { + + go(); + go(); + return 0; +} From ba0347370e14e3fefbad7b4d9f763010e565bb54 Mon Sep 17 00:00:00 2001 From: Andrea Bocci Date: Sun, 8 Jul 2018 12:16:12 +0200 Subject: [PATCH 72/88] Update the PixelCPEFast code following the reorganisation in #23571 --- .../SiPixelRecHits/interface/PixelCPEFast.h | 22 +++---- .../SiPixelRecHits/src/PixelCPEFast.cc | 66 +++++++++---------- 2 files changed, 42 insertions(+), 46 deletions(-) diff --git a/RecoLocalTracker/SiPixelRecHits/interface/PixelCPEFast.h b/RecoLocalTracker/SiPixelRecHits/interface/PixelCPEFast.h index 0066361483318..35a3e6bf2a82c 100644 --- a/RecoLocalTracker/SiPixelRecHits/interface/PixelCPEFast.h +++ b/RecoLocalTracker/SiPixelRecHits/interface/PixelCPEFast.h @@ -3,16 +3,16 @@ #include +#include + #include "CalibTracker/SiPixelESProducers/interface/SiPixelCPEGenericDBErrorParametrization.h" +#include "CondFormats/SiPixelTransient/interface/SiPixelGenError.h" +#include "CondFormats/SiPixelTransient/interface/SiPixelTemplate.h" #include "HeterogeneousCore/CUDACore/interface/CUDAESProduct.h" #include "HeterogeneousCore/CUDAUtilities/interface/CUDAHostAllocator.h" #include "RecoLocalTracker/SiPixelRecHits/interface/PixelCPEBase.h" -#include "RecoLocalTracker/SiPixelRecHits/interface/SiPixelGenError.h" -#include "RecoLocalTracker/SiPixelRecHits/interface/SiPixelTemplate.h" #include "RecoLocalTracker/SiPixelRecHits/interface/pixelCPEforGPU.h" -#include - class MagneticField; class PixelCPEFast final : public PixelCPEBase { @@ -29,10 +29,10 @@ class PixelCPEFast final : public PixelCPEBase // These are errors predicted by PIXELAV float sigmay; // CPE Generic y-error for multi-pixel cluster float sigmax; // CPE Generic x-error for multi-pixel cluster - float sy1 ; // CPE Generic y-error for single single-pixel - float sy2 ; // CPE Generic y-error for single double-pixel cluster - float sx1 ; // CPE Generic x-error for single single-pixel cluster - float sx2 ; // CPE Generic x-error for single double-pixel cluster + float sy1; // CPE Generic y-error for single single-pixel + float sy2; // CPE Generic y-error for single double-pixel cluster + float sx1; // CPE Generic x-error for single single-pixel cluster + float sx2; // CPE Generic x-error for single double-pixel cluster }; @@ -69,9 +69,9 @@ class PixelCPEFast final : public PixelCPEBase float EdgeClusterErrorX_; float EdgeClusterErrorY_; - std::vector xerr_barrel_l1_,yerr_barrel_l1_,xerr_barrel_ln_; - std::vector yerr_barrel_ln_,xerr_endcap_,yerr_endcap_; - float xerr_barrel_l1_def_, yerr_barrel_l1_def_,xerr_barrel_ln_def_; + std::vector xerr_barrel_l1_, yerr_barrel_l1_, xerr_barrel_ln_; + std::vector yerr_barrel_ln_, xerr_endcap_, yerr_endcap_; + float xerr_barrel_l1_def_, yerr_barrel_l1_def_, xerr_barrel_ln_def_; float yerr_barrel_ln_def_, xerr_endcap_def_, yerr_endcap_def_; //--- DB Error Parametrization object, new light templates diff --git a/RecoLocalTracker/SiPixelRecHits/src/PixelCPEFast.cc b/RecoLocalTracker/SiPixelRecHits/src/PixelCPEFast.cc index e4f588aab14f9..af7dd7337084e 100644 --- a/RecoLocalTracker/SiPixelRecHits/src/PixelCPEFast.cc +++ b/RecoLocalTracker/SiPixelRecHits/src/PixelCPEFast.cc @@ -1,26 +1,22 @@ -#include "RecoLocalTracker/SiPixelRecHits/interface/PixelCPEFast.h" - -#include "Geometry/TrackerGeometryBuilder/interface/phase1PixelTopology.h" +#include -#include "Geometry/TrackerGeometryBuilder/interface/PixelGeomDetUnit.h" -#include "Geometry/TrackerGeometryBuilder/interface/RectangularPixelTopology.h" +#include +#include -// this is needed to get errors from templates -#include "RecoLocalTracker/SiPixelRecHits/interface/SiPixelTemplate.h" +#include "CondFormats/SiPixelTransient/interface/SiPixelTemplate.h" #include "DataFormats/DetId/interface/DetId.h" - - -// Services #include "FWCore/MessageLogger/interface/MessageLogger.h" +#include "Geometry/TrackerGeometryBuilder/interface/PixelGeomDetUnit.h" +#include "Geometry/TrackerGeometryBuilder/interface/RectangularPixelTopology.h" +#include "Geometry/TrackerGeometryBuilder/interface/phase1PixelTopology.h" +#include "HeterogeneousCore/CUDAServices/interface/numberOfCUDADevices.h" +#include "HeterogeneousCore/CUDAUtilities/interface/cudaCheck.h" #include "MagneticField/Engine/interface/MagneticField.h" -#include -#include - -#include "HeterogeneousCore/CUDAUtilities/interface/cudaCheck.h" -#include "HeterogeneousCore/CUDAServices/interface/numberOfCUDADevices.h" +#include "RecoLocalTracker/SiPixelRecHits/interface/PixelCPEFast.h" -#include +// Services +// this is needed to get errors from templates namespace { constexpr float micronsToCm = 1.0e-4; @@ -54,18 +50,18 @@ PixelCPEFast::PixelCPEFast(edm::ParameterSet const & conf, // Rechit errors in case other, more correct, errors are not vailable // This are constants. Maybe there is a more efficienct way to store them. - xerr_barrel_l1_= {0.00115, 0.00120, 0.00088}; - xerr_barrel_l1_def_=0.01030; - yerr_barrel_l1_= {0.00375,0.00230,0.00250,0.00250,0.00230,0.00230,0.00210,0.00210,0.00240}; - yerr_barrel_l1_def_=0.00210; - xerr_barrel_ln_= {0.00115, 0.00120, 0.00088}; - xerr_barrel_ln_def_=0.01030; - yerr_barrel_ln_= {0.00375,0.00230,0.00250,0.00250,0.00230,0.00230,0.00210,0.00210,0.00240}; - yerr_barrel_ln_def_=0.00210; - xerr_endcap_= {0.0020, 0.0020}; - xerr_endcap_def_=0.0020; - yerr_endcap_= {0.00210}; - yerr_endcap_def_=0.00075; + xerr_barrel_l1_ = { 0.00115, 0.00120, 0.00088 }; + xerr_barrel_l1_def_ = 0.01030; + yerr_barrel_l1_ = { 0.00375, 0.00230, 0.00250, 0.00250, 0.00230, 0.00230, 0.00210, 0.00210, 0.00240 }; + yerr_barrel_l1_def_ = 0.00210; + xerr_barrel_ln_ = { 0.00115, 0.00120, 0.00088}; + xerr_barrel_ln_def_ = 0.01030; + yerr_barrel_ln_ = { 0.00375, 0.00230, 0.00250, 0.00250, 0.00230, 0.00230, 0.00210, 0.00210, 0.00240 }; + yerr_barrel_ln_def_ = 0.00210; + xerr_endcap_ = { 0.0020, 0.0020 }; + xerr_endcap_def_ = 0.0020; + yerr_endcap_ = { 0.00210 }; + yerr_endcap_def_ = 0.00075; fillParamsForGpu(); } @@ -90,7 +86,7 @@ void PixelCPEFast::fillParamsForGpu() { m_commonParamsGPU.thePitchX = m_DetParams[0].thePitchX; m_commonParamsGPU.thePitchY = m_DetParams[0].thePitchY; - uint32_t oldLayer = 0; + //uint32_t oldLayer = 0; m_detParamsGPU.resize(m_DetParams.size()); for (auto i=0U; iindex()==int(i)); assert(m_commonParamsGPU.thePitchY==p.thePitchY); assert(m_commonParamsGPU.thePitchX==p.thePitchX); - // assert(m_commonParamsGPU.theThickness==p.theThickness); + //assert(m_commonParamsGPU.theThickness==p.theThickness); g.isBarrel = GeomDetEnumerators::isBarrel(p.thePart); g.isPosZ = p.theDet->surface().position().z()>0; @@ -109,13 +105,13 @@ void PixelCPEFast::fillParamsForGpu() { assert( (g.isBarrel ?m_commonParamsGPU.theThicknessB : m_commonParamsGPU.theThicknessE) ==p.theThickness ); - // if (m_commonParamsGPU.theThickness!=p.theThickness) + //if (m_commonParamsGPU.theThickness!=p.theThickness) // std::cout << i << (g.isBarrel ? "B " : "E ") << m_commonParamsGPU.theThickness<<"!="< Date: Sun, 8 Jul 2018 14:35:44 +0200 Subject: [PATCH 73/88] Update CA GPU code following the reorganisation in #23363 --- .../CAHitNtupletHeterogeneousEDProducer.cc | 6 ++--- .../plugins/CAHitQuadrupletGeneratorGPU.cc | 18 +++++-------- .../plugins/CAHitQuadrupletGeneratorGPU.h | 26 +++++++++---------- 3 files changed, 22 insertions(+), 28 deletions(-) diff --git a/RecoPixelVertexing/PixelTriplets/plugins/CAHitNtupletHeterogeneousEDProducer.cc b/RecoPixelVertexing/PixelTriplets/plugins/CAHitNtupletHeterogeneousEDProducer.cc index 1e4f2fcd56ad6..186a84617e8d3 100644 --- a/RecoPixelVertexing/PixelTriplets/plugins/CAHitNtupletHeterogeneousEDProducer.cc +++ b/RecoPixelVertexing/PixelTriplets/plugins/CAHitNtupletHeterogeneousEDProducer.cc @@ -11,13 +11,13 @@ #include "HeterogeneousCore/CUDACore/interface/GPUCuda.h" #include "HeterogeneousCore/CUDAServices/interface/CUDAService.h" #include "HeterogeneousCore/Producer/interface/HeterogeneousEDProducer.h" - -#include "CAHitQuadrupletGenerator.h" -#include "CAHitQuadrupletGeneratorGPU.h" +#include "RecoPixelVertexing/PixelTriplets/interface/CAHitQuadrupletGenerator.h" #include "RecoPixelVertexing/PixelTriplets/interface/OrderedHitSeeds.h" #include "RecoTracker/TkHitPairs/interface/IntermediateHitDoublets.h" #include "RecoTracker/TkHitPairs/interface/RegionsSeedingHitSets.h" +#include "CAHitQuadrupletGeneratorGPU.h" + namespace { void fillNtuplets(RegionsSeedingHitSets::RegionFiller &seedingHitSetsFiller, const OrderedHitSeeds &quadruplets) { diff --git a/RecoPixelVertexing/PixelTriplets/plugins/CAHitQuadrupletGeneratorGPU.cc b/RecoPixelVertexing/PixelTriplets/plugins/CAHitQuadrupletGeneratorGPU.cc index d7abc6dc65e5b..1230d29f123ff 100644 --- a/RecoPixelVertexing/PixelTriplets/plugins/CAHitQuadrupletGeneratorGPU.cc +++ b/RecoPixelVertexing/PixelTriplets/plugins/CAHitQuadrupletGeneratorGPU.cc @@ -2,24 +2,20 @@ // Author: Felice Pantaleo, CERN // -#include "FWCore/MessageLogger/interface/MessageLogger.h" -#include "CAHitQuadrupletGeneratorGPU.h" -#include "RecoPixelVertexing/PixelTriplets/interface/ThirdHitPredictionFromCircle.h" +#include +#include "CommonTools/Utils/interface/DynArray.h" #include "DataFormats/Common/interface/Handle.h" #include "FWCore/Framework/interface/ConsumesCollector.h" #include "FWCore/Framework/interface/Event.h" +#include "FWCore/MessageLogger/interface/MessageLogger.h" #include "FWCore/ParameterSet/interface/ParameterSetDescription.h" - -#include "TrackingTools/DetLayers/interface/BarrelDetLayer.h" - -#include "CellularAutomaton.h" - -#include "CommonTools/Utils/interface/DynArray.h" - #include "FWCore/Utilities/interface/isFinite.h" +#include "RecoPixelVertexing/PixelTriplets/interface/ThirdHitPredictionFromCircle.h" +#include "RecoPixelVertexing/PixelTriplets/src/CellularAutomaton.h" +#include "TrackingTools/DetLayers/interface/BarrelDetLayer.h" -#include +#include "CAHitQuadrupletGeneratorGPU.h" namespace { diff --git a/RecoPixelVertexing/PixelTriplets/plugins/CAHitQuadrupletGeneratorGPU.h b/RecoPixelVertexing/PixelTriplets/plugins/CAHitQuadrupletGeneratorGPU.h index 5df14e1857a2e..a6e9db46e68e7 100644 --- a/RecoPixelVertexing/PixelTriplets/plugins/CAHitQuadrupletGeneratorGPU.h +++ b/RecoPixelVertexing/PixelTriplets/plugins/CAHitQuadrupletGeneratorGPU.h @@ -2,26 +2,24 @@ #define RECOPIXELVERTEXING_PIXELTRIPLETS_CAHITQUADRUPLETGENERATORGPU_H #include -#include "GPUHitsAndDoublets.h" -#include "RecoTracker/TkSeedingLayers/interface/SeedComparitorFactory.h" -#include "RecoTracker/TkSeedingLayers/interface/SeedComparitor.h" -#include "RecoPixelVertexing/PixelTrackFitting/interface/RZLine.h" -#include "RecoTracker/TkSeedGenerator/interface/FastCircleFit.h" -#include "RecoTracker/TkMSParametrization/interface/PixelRecoUtilities.h" -#include "RecoTracker/TkMSParametrization/interface/LongitudinalBendingCorrection.h" #include "DataFormats/SiPixelDetId/interface/PixelSubdetector.h" -#include "CAGraph.h" - -#include "RecoTracker/TkHitPairs/interface/HitPairGeneratorFromLayerPair.h" -#include "RecoTracker/TkHitPairs/interface/LayerHitMapCache.h" #include "FWCore/ParameterSet/interface/ParameterSet.h" #include "FWCore/Utilities/interface/EDGetToken.h" - -#include "RecoTracker/TkHitPairs/interface/IntermediateHitDoublets.h" -#include "RecoPixelVertexing/PixelTriplets/interface/OrderedHitSeeds.h" #include "HeterogeneousCore/CUDAUtilities/interface/GPUSimpleVector.h" +#include "RecoPixelVertexing/PixelTrackFitting/interface/RZLine.h" +#include "RecoPixelVertexing/PixelTriplets/interface/OrderedHitSeeds.h" +#include "RecoTracker/TkHitPairs/interface/HitPairGeneratorFromLayerPair.h" +#include "RecoTracker/TkHitPairs/interface/IntermediateHitDoublets.h" +#include "RecoTracker/TkHitPairs/interface/LayerHitMapCache.h" +#include "RecoTracker/TkMSParametrization/interface/LongitudinalBendingCorrection.h" +#include "RecoTracker/TkMSParametrization/interface/PixelRecoUtilities.h" +#include "RecoTracker/TkSeedGenerator/interface/FastCircleFit.h" +#include "RecoTracker/TkSeedingLayers/interface/SeedComparitor.h" +#include "RecoTracker/TkSeedingLayers/interface/SeedComparitorFactory.h" + #include "GPUCACell.h" +#include "GPUHitsAndDoublets.h" class TrackingRegion; class SeedingLayerSetsHits; From 5ec134c81b8e7de803c271e2a11e3b053e923648 Mon Sep 17 00:00:00 2001 From: Andrea Bocci Date: Thu, 19 Jul 2018 15:07:32 +0200 Subject: [PATCH 74/88] Add a workaround for CAHitNtupletHeterogeneousEDProducer in fast simulation (#95) --- FastSimulation/Tracking/python/SeedingMigration.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/FastSimulation/Tracking/python/SeedingMigration.py b/FastSimulation/Tracking/python/SeedingMigration.py index 751670daa50c8..3a982eba55e36 100644 --- a/FastSimulation/Tracking/python/SeedingMigration.py +++ b/FastSimulation/Tracking/python/SeedingMigration.py @@ -13,8 +13,9 @@ def _hitSetProducerToFactoryPSet(producer): "PixelTripletLargeTipEDProducer": "PixelTripletLargeTipGenerator", "MultiHitFromChi2EDProducer": "MultiHitGeneratorFromChi2", "CAHitTripletEDProducer": "CAHitTripletGenerator", - "CAHitQuadrupletEDProducer": "CAHitQuadrupletGenerator", - } + "CAHitQuadrupletEDProducer": "CAHitQuadrupletGenerator", + "CAHitNtupletHeterogeneousEDProducer": "CAHitQuadrupletGenerator", + } ret = cms.PSet() _copy(producer, ret) ret.ComponentName = cms.string(_map[producer._TypedParameterizable__type]); From fa24ba1e640a4c238c29eef7c03884cbc9589c11 Mon Sep 17 00:00:00 2001 From: Matti Kortelainen Date: Thu, 19 Jul 2018 15:13:42 +0200 Subject: [PATCH 75/88] HeterogeneousEvent::getByToken() returns bool (#96) Return bool as the edm::Event::getByToken() does. --- .../Producer/interface/HeterogeneousEvent.h | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/HeterogeneousCore/Producer/interface/HeterogeneousEvent.h b/HeterogeneousCore/Producer/interface/HeterogeneousEvent.h index 02366a2a92a36..bfdc30661172a 100644 --- a/HeterogeneousCore/Producer/interface/HeterogeneousEvent.h +++ b/HeterogeneousCore/Producer/interface/HeterogeneousEvent.h @@ -33,13 +33,13 @@ namespace edm { template - void getByToken(const Token& token, edm::Handle& handle) const { + bool getByToken(const Token& token, edm::Handle& handle) const { edm::Handle tmp; constEvent_->getByToken(token, tmp); if(tmp.failedToGet()) { auto copy = tmp.whyFailedFactory(); handle = edm::Handle(std::move(copy)); - return; + return false; } if(tmp.isValid()) { #define CASE(ENUM) case ENUM: this->template get(handle, tmp, 0); break @@ -51,13 +51,15 @@ namespace edm { throw cms::Exception("LogicError") << "edm::HeterogeneousEvent::getByToken(): no case statement for device " << static_cast(location().deviceType()) << ". If you are calling getByToken() from produceX() where X != CPU, please move the call to acquireX()."; } #undef CASE + return true; } + return false; } // Delegate standard getByToken to edm::Event template - void getByToken(const Token& token, edm::Handle& handle) const { - constEvent_->getByToken(token, handle); + bool getByToken(const Token& token, edm::Handle& handle) const { + return constEvent_->getByToken(token, handle); } template From e61eb060c337c36166933fa9424d2a9ef8164e1b Mon Sep 17 00:00:00 2001 From: Andrea Bocci Date: Tue, 24 Jul 2018 12:56:38 +0200 Subject: [PATCH 76/88] Various fixes and cleanup (#101) Fix errors found by cuda-memcheck: - properly initialise device memory - fix various cudaMemcpy calls Remove unused debug variables and function declarations, and #ifdef some debug printouts. Call cudaDeviceReset() before exiting, via the destructor of CUDAService. This explicitly destroys and cleans up all resources associated with the current device, and is useful to check for memory leaks with cuda-memcheck --tool memcheck --leak-check full. --- .../CUDAServices/interface/CUDAService.h | 7 ++++--- .../CUDAServices/src/CUDAService.cc | 21 ++++++++++++------- .../plugins/SiPixelRawToClusterGPUKernel.cu | 8 +------ .../plugins/SiPixelRawToClusterGPUKernel.h | 14 ------------- .../plugins/gpuClustering.h | 3 +-- .../src/SiPixelFedCablingMapGPUWrapper.cc | 2 +- .../SiPixelClusterizer/test/gpuClustering.cu | 1 - .../SiPixelRecHits/plugins/PixelRecHits.cu | 2 ++ .../plugins/CAHitQuadrupletGeneratorGPU.cu | 1 + 9 files changed, 24 insertions(+), 35 deletions(-) diff --git a/HeterogeneousCore/CUDAServices/interface/CUDAService.h b/HeterogeneousCore/CUDAServices/interface/CUDAService.h index 19cbc6447eb55..e359a5018813a 100644 --- a/HeterogeneousCore/CUDAServices/interface/CUDAService.h +++ b/HeterogeneousCore/CUDAServices/interface/CUDAService.h @@ -1,11 +1,11 @@ #ifndef HeterogeneousCore_CUDAServices_CUDAService_h #define HeterogeneousCore_CUDAServices_CUDAService_h -#include "FWCore/Utilities/interface/StreamID.h" - #include #include +#include "FWCore/Utilities/interface/StreamID.h" + namespace edm { class ParameterSet; class ActivityRegistry; @@ -23,6 +23,7 @@ namespace edm { class CUDAService { public: CUDAService(edm::ParameterSet const& iConfig, edm::ActivityRegistry& iRegistry); + ~CUDAService(); static void fillDescriptions(edm::ConfigurationDescriptions & descriptions); @@ -49,7 +50,7 @@ class CUDAService { private: int numberOfDevices_ = 0; unsigned int numberOfStreamsTotal_ = 0; - std::vector > computeCapabilities_; + std::vector> computeCapabilities_; bool enabled_ = false; }; diff --git a/HeterogeneousCore/CUDAServices/src/CUDAService.cc b/HeterogeneousCore/CUDAServices/src/CUDAService.cc index d520567cc4770..14eeaff109b0c 100644 --- a/HeterogeneousCore/CUDAServices/src/CUDAService.cc +++ b/HeterogeneousCore/CUDAServices/src/CUDAService.cc @@ -1,16 +1,14 @@ -#include "HeterogeneousCore/CUDAServices/interface/CUDAService.h" +#include +#include #include "FWCore/MessageLogger/interface/MessageLogger.h" +#include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h" #include "FWCore/ParameterSet/interface/ParameterSet.h" #include "FWCore/ParameterSet/interface/ParameterSetDescription.h" -#include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h" - -#include -#include +#include "HeterogeneousCore/CUDAServices/interface/CUDAService.h" +#include "HeterogeneousCore/CUDAUtilities/interface/cudaCheck.h" #include "HeterogeneousCore/CUDAUtilities/interface/getCudaDrvErrorString.h" -#include - CUDAService::CUDAService(edm::ParameterSet const& iConfig, edm::ActivityRegistry& iRegistry) { bool configEnabled = iConfig.getUntrackedParameter("enabled"); if(!configEnabled) { @@ -64,6 +62,15 @@ CUDAService::CUDAService(edm::ParameterSet const& iConfig, edm::ActivityRegistry enabled_ = true; } +CUDAService::~CUDAService() { + if (enabled_) { + // Explicitly destroys and cleans up all resources associated with the current device in the + // current process. Any subsequent API call to this device will reinitialize the device. + // Useful to check for memory leaks with `cuda-memcheck --tool memcheck --leak-check full`. + cudaCheck(cudaDeviceReset()); + } +} + void CUDAService::fillDescriptions(edm::ConfigurationDescriptions & descriptions) { edm::ParameterSetDescription desc; desc.addUntracked("enabled", true); diff --git a/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelRawToClusterGPUKernel.cu b/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelRawToClusterGPUKernel.cu index 991e82ccd2491..65d3fc3626137 100644 --- a/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelRawToClusterGPUKernel.cu +++ b/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelRawToClusterGPUKernel.cu @@ -90,10 +90,7 @@ namespace pixelgpudetails { cudaCheck(cudaMalloc((void**) & moduleStart_d, (MaxNumModules+1)*sizeof(uint32_t) )); cudaCheck(cudaMalloc((void**) & clusInModule_d,(MaxNumModules)*sizeof(uint32_t) )); cudaCheck(cudaMalloc((void**) & moduleId_d, (MaxNumModules)*sizeof(uint32_t) )); - - cudaCheck(cudaMalloc((void**) & debug_d, MAX_WORD32_SIZE)); } - SiPixelRawToClusterGPUKernel::~SiPixelRawToClusterGPUKernel() { // free device memory used for RawToDigi on GPU @@ -114,7 +111,6 @@ namespace pixelgpudetails { cudaCheck(cudaFree(clus_d)); cudaCheck(cudaFree(clusInModule_d)); cudaCheck(cudaFree(moduleId_d)); - cudaCheck(cudaFree(debug_d)); } void SiPixelRawToClusterGPUKernel::initializeWordFed(int fedId, unsigned int wordCounterGPU, const cms_uint32_t *src, unsigned int length) { @@ -662,7 +658,7 @@ namespace pixelgpudetails { cudaCheck(cudaGetLastError()); // calibrated adc - cudaCheck(cudaMemcpyAsync(adc_h, adc_d, wordCounter*sizeof(uint32_t), cudaMemcpyDefault, stream.id())); + cudaCheck(cudaMemcpyAsync(adc_h, adc_d, wordCounter*sizeof(uint16_t), cudaMemcpyDefault, stream.id())); /* std::cout @@ -700,14 +696,12 @@ namespace pixelgpudetails { moduleStart_d, clusInModule_d, moduleId_d, clus_d, - debug_d, wordCounter ); // clusters cudaCheck(cudaMemcpyAsync(clus_h, clus_d, wordCounter*sizeof(uint32_t), cudaMemcpyDefault, stream.id())); - cudaStreamSynchronize(stream.id()); cudaCheck(cudaGetLastError()); diff --git a/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelRawToClusterGPUKernel.h b/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelRawToClusterGPUKernel.h index ccc9e85ff3d24..2b0b205c9f536 100644 --- a/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelRawToClusterGPUKernel.h +++ b/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelRawToClusterGPUKernel.h @@ -208,9 +208,7 @@ namespace pixelgpudetails { int32_t * clus_d; uint32_t * clusInModule_d; uint32_t * moduleId_d; - uint32_t * debug_d; }; - // configuration and memory buffers alocated on the GPU struct context { @@ -234,18 +232,6 @@ namespace pixelgpudetails { uint32_t * debug_d; }; - // wrapper function to call RawToDigi on the GPU from host side - void RawToDigi_wrapper(context &, const SiPixelFedCablingMapGPU* cablingMapDevice, - SiPixelGainForHLTonGPU * const ped, - const uint32_t wordCounter, uint32_t *word, - const uint32_t fedCounter, uint8_t *fedId_h, - bool convertADCtoElectrons, uint32_t * pdigi_h, - uint32_t *rawIdArr_h, GPU::SimpleVector *error_h, - GPU::SimpleVector *error_h_tmp, error_obj *data_h, - uint16_t * adc_h, int32_t * clus_h, - bool useQualityInfo, bool includeErrors, bool debug, - uint32_t & nModulesActive); - // void initCablingMap(); context initDeviceMemory(); void freeMemory(context &); diff --git a/RecoLocalTracker/SiPixelClusterizer/plugins/gpuClustering.h b/RecoLocalTracker/SiPixelClusterizer/plugins/gpuClustering.h index 12f205742433e..60be134a4ee46 100644 --- a/RecoLocalTracker/SiPixelClusterizer/plugins/gpuClustering.h +++ b/RecoLocalTracker/SiPixelClusterizer/plugins/gpuClustering.h @@ -36,7 +36,7 @@ namespace gpuClustering { uint16_t const * adc, uint32_t const * moduleStart, uint32_t * clusInModule, uint32_t * moduleId, - int32_t * clus, uint32_t * debug, + int32_t * clus, int numElements) { __shared__ bool go; @@ -98,7 +98,6 @@ namespace gpuClustering { if (id[i] == InvId) // not valid continue; assert(id[i] == me); // break; // end of module - ++debug[i]; auto js = i + 1; auto jm = jmax[k]; jmax[k] = i + 1; diff --git a/RecoLocalTracker/SiPixelClusterizer/src/SiPixelFedCablingMapGPUWrapper.cc b/RecoLocalTracker/SiPixelClusterizer/src/SiPixelFedCablingMapGPUWrapper.cc index e0b9a29eaf077..df2f488fe488c 100644 --- a/RecoLocalTracker/SiPixelClusterizer/src/SiPixelFedCablingMapGPUWrapper.cc +++ b/RecoLocalTracker/SiPixelClusterizer/src/SiPixelFedCablingMapGPUWrapper.cc @@ -154,7 +154,7 @@ void SiPixelFedCablingMapGPUWrapper::ModulesToUnpack::fillAsync(SiPixelFedCablin } } - cuda::memory::async::copy(modToUnpHost.data(), modToUnpDevice.get(), modToUnpHost.size() * sizeof(unsigned char), cudaStream.id()); + cuda::memory::async::copy(modToUnpDevice.get(), modToUnpHost.data(), modToUnpHost.size() * sizeof(unsigned char), cudaStream.id()); } diff --git a/RecoLocalTracker/SiPixelClusterizer/test/gpuClustering.cu b/RecoLocalTracker/SiPixelClusterizer/test/gpuClustering.cu index 8c6b6cdf7a821..fba4946b178ec 100644 --- a/RecoLocalTracker/SiPixelClusterizer/test/gpuClustering.cu +++ b/RecoLocalTracker/SiPixelClusterizer/test/gpuClustering.cu @@ -196,7 +196,6 @@ int main(void) d_moduleStart.get(), d_clusInModule.get(), d_moduleId.get(), d_clus.get(), - d_debug.get(), n ); diff --git a/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.cu b/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.cu index 813c4f0a05290..999fdcd6eff19 100644 --- a/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.cu +++ b/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.cu @@ -108,9 +108,11 @@ namespace pixelgpudetails { for (int i=0;i<10;++i) hitsLayerStart_[i]=hitsModuleStart_[phase1PixelTopology::layerStart[i]]; hitsLayerStart_[10]=nhits; +#ifdef GPU_DEBUG std::cout << "hit layerStart "; for (int i=0;i<10;++i) std::cout << phase1PixelTopology::layerName[i] << ':' << hitsLayerStart_[i] << ' '; std::cout << "end:" << hitsLayerStart_[10] << std::endl; +#endif cudaCheck(cudaMemcpyAsync(gpu_.hitsLayerStart_d, hitsLayerStart_, (11) * sizeof(uint32_t), cudaMemcpyDefault, stream.id())); diff --git a/RecoPixelVertexing/PixelTriplets/plugins/CAHitQuadrupletGeneratorGPU.cu b/RecoPixelVertexing/PixelTriplets/plugins/CAHitQuadrupletGeneratorGPU.cu index aece273083048..4a7f3ce5aa5f1 100644 --- a/RecoPixelVertexing/PixelTriplets/plugins/CAHitQuadrupletGeneratorGPU.cu +++ b/RecoPixelVertexing/PixelTriplets/plugins/CAHitQuadrupletGeneratorGPU.cu @@ -423,6 +423,7 @@ void CAHitQuadrupletGeneratorGPU::allocateOnGPU() cudaCheck(cudaMallocHost(&h_foundNtupletsVec_[i], sizeof(GPU::SimpleVector))); new(h_foundNtupletsVec_[i]) GPU::SimpleVector(maxNumberOfQuadruplets_, h_foundNtupletsData_[i]); cudaCheck(cudaMalloc(&d_foundNtupletsData_[i], sizeof(Quadruplet) * maxNumberOfQuadruplets_)); + cudaCheck(cudaMemset(d_foundNtupletsData_[i], 0x00, sizeof(Quadruplet) * maxNumberOfQuadruplets_)); cudaCheck(cudaMalloc(&d_foundNtupletsVec_[i], sizeof(GPU::SimpleVector))); GPU::SimpleVector tmp_foundNtuplets(maxNumberOfQuadruplets_, d_foundNtupletsData_[i]); cudaCheck(cudaMemcpy(d_foundNtupletsVec_[i], & tmp_foundNtuplets, sizeof(GPU::SimpleVector), cudaMemcpyDefault)); From f4840297ee95ce4a741eebea33fe6403b615a814 Mon Sep 17 00:00:00 2001 From: Andrea Bocci Date: Wed, 25 Jul 2018 22:10:18 +0200 Subject: [PATCH 77/88] Fix synchronisation problems in the clusterizer (#102) Fix the use of `__syncthreads()` in the `calibDigis` and `findClus` kernels (possibly fixes #84). Improve `SiPixelRawToClusterGPUKernel::makeClustersAsync()` to avoid calls to `cudaStreamSynchronize` (fixes #66). Improve the documentation. --- .../plugins/SiPixelRawToClusterGPUKernel.cu | 371 ++++++++---------- .../plugins/gpuCalibPixel.h | 3 - .../plugins/gpuClustering.h | 211 +++++----- .../SiPixelClusterizer/test/gpuClustering.cu | 2 +- 4 files changed, 286 insertions(+), 301 deletions(-) diff --git a/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelRawToClusterGPUKernel.cu b/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelRawToClusterGPUKernel.cu index 65d3fc3626137..29e5e82049b5c 100644 --- a/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelRawToClusterGPUKernel.cu +++ b/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelRawToClusterGPUKernel.cu @@ -91,7 +91,7 @@ namespace pixelgpudetails { cudaCheck(cudaMalloc((void**) & clusInModule_d,(MaxNumModules)*sizeof(uint32_t) )); cudaCheck(cudaMalloc((void**) & moduleId_d, (MaxNumModules)*sizeof(uint32_t) )); } - + SiPixelRawToClusterGPUKernel::~SiPixelRawToClusterGPUKernel() { // free device memory used for RawToDigi on GPU // free the GPU memory @@ -118,7 +118,6 @@ namespace pixelgpudetails { std::memset(fedId_h+wordCounterGPU/2, fedId - 1200, length/2); } - //////////////////// __device__ uint32_t getLink(uint32_t ww) { @@ -140,15 +139,12 @@ namespace pixelgpudetails { return (1==((rawId>>25)&0x7)); } - - __device__ pixelgpudetails::DetIdGPU getRawId(const SiPixelFedCablingMapGPU * Map, uint32_t fed, uint32_t link, uint32_t roc) { uint32_t index = fed * MAX_LINK * MAX_ROC + (link-1) * MAX_ROC + roc; pixelgpudetails::DetIdGPU detId = { Map->RawId[index], Map->rocInDet[index], Map->moduleId[index] }; return detId; } - //reference http://cmsdoxygen.web.cern.ch/cmsdoxygen/CMSSW_9_2_0/doc/html/dd/d31/FrameConversion_8cc_source.html //http://cmslxr.fnal.gov/source/CondFormats/SiPixelObjects/src/PixelROC.cc?v=CMSSW_9_2_0#0071 // Convert local pixel to pixelgpudetails::global pixel @@ -232,141 +228,132 @@ namespace pixelgpudetails { __device__ uint32_t conversionError(uint32_t fedId, uint32_t status, bool debug = false) { - uint32_t errorType = 0; // debug = true; switch (status) { - case(1) : { - if (debug) printf("Error in Fed: %i, invalid channel Id (errorType = 35\n)", fedId ); - errorType = 35; - break; - } - case(2) : { - if (debug) printf("Error in Fed: %i, invalid ROC Id (errorType = 36)\n", fedId); - errorType = 36; - break; - } - case(3) : { - if (debug) printf("Error in Fed: %i, invalid dcol/pixel value (errorType = 37)\n", fedId); - errorType = 37; - break; - } - case(4) : { - if (debug) printf("Error in Fed: %i, dcol/pixel read out of order (errorType = 38)\n", fedId); - errorType = 38; - break; - } - default: if (debug) printf("Cabling check returned unexpected result, status = %i\n", status); + case(1) : { + if (debug) printf("Error in Fed: %i, invalid channel Id (errorType = 35\n)", fedId ); + errorType = 35; + break; + } + case(2) : { + if (debug) printf("Error in Fed: %i, invalid ROC Id (errorType = 36)\n", fedId); + errorType = 36; + break; + } + case(3) : { + if (debug) printf("Error in Fed: %i, invalid dcol/pixel value (errorType = 37)\n", fedId); + errorType = 37; + break; + } + case(4) : { + if (debug) printf("Error in Fed: %i, dcol/pixel read out of order (errorType = 38)\n", fedId); + errorType = 38; + break; + } + default: + if (debug) printf("Cabling check returned unexpected result, status = %i\n", status); }; return errorType; - } - __device__ bool rocRowColIsValid(uint32_t rocRow, uint32_t rocCol) { - uint32_t numRowsInRoc = 80; - uint32_t numColsInRoc = 52; + uint32_t numRowsInRoc = 80; + uint32_t numColsInRoc = 52; - /// row and collumn in ROC representation - return ((rocRow < numRowsInRoc) & (rocCol < numColsInRoc)); + /// row and collumn in ROC representation + return ((rocRow < numRowsInRoc) & (rocCol < numColsInRoc)); } - __device__ bool dcolIsValid(uint32_t dcol, uint32_t pxid) { - return ((dcol < 26) & (2 <= pxid) & (pxid < 162)); + return ((dcol < 26) & (2 <= pxid) & (pxid < 162)); } - __device__ uint32_t checkROC(uint32_t errorWord, uint32_t fedId, uint32_t link, const SiPixelFedCablingMapGPU *Map, bool debug = false) { + int errorType = (errorWord >> pixelgpudetails::ROC_shift) & pixelgpudetails::ERROR_mask; + if (errorType < 25) return false; + bool errorFound = false; - int errorType = (errorWord >> pixelgpudetails::ROC_shift) & pixelgpudetails::ERROR_mask; - if (errorType < 25) return false; - bool errorFound = false; - - switch (errorType) { + switch (errorType) { case(25) : { - errorFound = true; - uint32_t index = fedId * MAX_LINK * MAX_ROC + (link-1) * MAX_ROC + 1; - if (index > 1 && index <= Map->size){ - if (!(link == Map->link[index] && 1 == Map->roc[index])) errorFound = false; - } - if (debug&errorFound) printf("Invalid ROC = 25 found (errorType = 25)\n"); - break; - } - case(26) : { - if (debug) printf("Gap word found (errorType = 26)\n"); - errorFound = true; - break; - } - case(27) : { - if (debug) printf("Dummy word found (errorType = 27)\n"); - errorFound = true; - break; - } - case(28) : { - if (debug) printf("Error fifo nearly full (errorType = 28)\n"); - errorFound = true; - break; - } - case(29) : { - if (debug) printf("Timeout on a channel (errorType = 29)\n"); - if ((errorWord >> pixelgpudetails::OMIT_ERR_shift) & pixelgpudetails::OMIT_ERR_mask) { - if (debug) printf("...first errorType=29 error, this gets masked out\n"); - } - errorFound = true; - break; - } - case(30) : { - if (debug) printf("TBM error trailer (errorType = 30)\n"); - int StateMatch_bits = 4; - int StateMatch_shift = 8; - uint32_t StateMatch_mask = ~(~uint32_t(0) << StateMatch_bits); - int StateMatch = (errorWord >> StateMatch_shift) & StateMatch_mask; - if ( StateMatch != 1 && StateMatch != 8 ) { - if (debug) printf("FED error 30 with unexpected State Bits (errorType = 30)\n"); - } - if ( StateMatch == 1 ) errorType = 40; // 1=Overflow -> 40, 8=number of ROCs -> 30 - errorFound = true; - break; - } - case(31) : { - if (debug) printf("Event number error (errorType = 31)\n"); - errorFound = true; - break; - } - default: errorFound = false; - - }; - - return errorFound? errorType : 0; + errorFound = true; + uint32_t index = fedId * MAX_LINK * MAX_ROC + (link-1) * MAX_ROC + 1; + if (index > 1 && index <= Map->size) { + if (!(link == Map->link[index] && 1 == Map->roc[index])) errorFound = false; + } + if (debug&errorFound) printf("Invalid ROC = 25 found (errorType = 25)\n"); + break; + } + case(26) : { + if (debug) printf("Gap word found (errorType = 26)\n"); + errorFound = true; + break; + } + case(27) : { + if (debug) printf("Dummy word found (errorType = 27)\n"); + errorFound = true; + break; + } + case(28) : { + if (debug) printf("Error fifo nearly full (errorType = 28)\n"); + errorFound = true; + break; + } + case(29) : { + if (debug) printf("Timeout on a channel (errorType = 29)\n"); + if ((errorWord >> pixelgpudetails::OMIT_ERR_shift) & pixelgpudetails::OMIT_ERR_mask) { + if (debug) printf("...first errorType=29 error, this gets masked out\n"); + } + errorFound = true; + break; + } + case(30) : { + if (debug) printf("TBM error trailer (errorType = 30)\n"); + int StateMatch_bits = 4; + int StateMatch_shift = 8; + uint32_t StateMatch_mask = ~(~uint32_t(0) << StateMatch_bits); + int StateMatch = (errorWord >> StateMatch_shift) & StateMatch_mask; + if ( StateMatch != 1 && StateMatch != 8 ) { + if (debug) printf("FED error 30 with unexpected State Bits (errorType = 30)\n"); + } + if ( StateMatch == 1 ) errorType = 40; // 1=Overflow -> 40, 8=number of ROCs -> 30 + errorFound = true; + break; + } + case(31) : { + if (debug) printf("Event number error (errorType = 31)\n"); + errorFound = true; + break; + } + default: + errorFound = false; + }; + return errorFound? errorType : 0; } - __device__ uint32_t getErrRawID(uint32_t fedId, uint32_t errWord, uint32_t errorType, const SiPixelFedCablingMapGPU *Map, bool debug = false) { - uint32_t rID = 0xffffffff; switch (errorType) { - case 25 : case 30 : case 31 : case 36 : case 40 : { + case 25 : case 30 : case 31 : case 36 : case 40 : { //set dummy values for cabling just to get detId from link //cabling.dcol = 0; //cabling.pxid = 2; uint32_t roc = 1; uint32_t link = (errWord >> pixelgpudetails::LINK_shift) & pixelgpudetails::LINK_mask; - uint32_t rID_temp = getRawId(Map, fedId, link, roc).RawId; - if(rID_temp != 9999) rID = rID_temp; + if (rID_temp != 9999) rID = rID_temp; break; } - case 29 : { + case 29 : { int chanNmbr = 0; const int DB0_shift = 0; const int DB1_shift = DB0_shift + 1; @@ -398,7 +385,7 @@ namespace pixelgpudetails { if(rID_temp != 9999) rID = rID_temp; break; } - case 37 : case 38: { + case 37 : case 38: { //cabling.dcol = 0; //cabling.pxid = 2; uint32_t roc = (errWord >> pixelgpudetails::ROC_shift) & pixelgpudetails::ROC_mask; @@ -407,25 +394,22 @@ namespace pixelgpudetails { if(rID_temp != 9999) rID = rID_temp; break; } - - default : break; - + default: + break; }; return rID; - } - /*---------- - * Name: applyADCthreshold_kernel() - * Desc: converts adc count to electrons and then applies the - * threshold on each channel. - * make pixel to 0 if it is below the threshold - * Input: xx_d[], yy_d[], layer_d[], wordCounter, adc[], ADCThreshold - *----------- - * Output: xx_adc[], yy_adc[] with pixel threshold applied - */ + * Name: applyADCthreshold_kernel() + * Desc: converts adc count to electrons and then applies the + * threshold on each channel. + * make pixel to 0 if it is below the threshold + * Input: xx_d[], yy_d[], layer_d[], wordCounter, adc[], ADCThreshold + *----------- + * Output: xx_adc[], yy_adc[] with pixel threshold applied + */ // kernel to apply adc threshold on the channels @@ -465,28 +449,28 @@ namespace pixelgpudetails { // Kernel to perform Raw to Digi conversion __global__ void RawToDigi_kernel(const SiPixelFedCablingMapGPU *Map, const unsigned char *modToUnp, - const uint32_t wordCounter, const uint32_t *Word, const uint8_t *fedIds, - uint16_t * XX, uint16_t * YY, uint16_t * ADC, - uint32_t * pdigi, uint32_t *rawIdArr, uint16_t * moduleId, - GPU::SimpleVector *err, - bool useQualityInfo, bool includeErrors, bool debug) + const uint32_t wordCounter, const uint32_t *Word, const uint8_t *fedIds, + uint16_t * XX, uint16_t * YY, uint16_t * ADC, + uint32_t * pdigi, uint32_t *rawIdArr, uint16_t * moduleId, + GPU::SimpleVector *err, + bool useQualityInfo, bool includeErrors, bool debug) { uint32_t blockId = blockIdx.x; uint32_t threadId = threadIdx.x; bool skipROC = false; //if (threadId==0) printf("Event: %u blockId: %u start: %u end: %u\n", eventno, blockId, begin, end); - + for (int aaa=0; aaa<1; ++aaa) { // too many coninue below.... (to be fixed) auto gIndex = threadId + blockId*blockDim.x; if (gIndex < wordCounter) { - - uint32_t fedId = fedIds[gIndex/2]; // +1200; + + uint32_t fedId = fedIds[gIndex/2]; // +1200; // initialize (too many coninue below) pdigi[gIndex] = 0; rawIdArr[gIndex] = 0; - moduleId[gIndex] = 9999; + moduleId[gIndex] = 9999; uint32_t ww = Word[gIndex]; // Array containing 32 bit raw data if (ww == 0) { @@ -517,8 +501,8 @@ namespace pixelgpudetails { uint32_t index = fedId * MAX_LINK * MAX_ROC + (link-1) * MAX_ROC + roc; if (useQualityInfo) { - skipROC = Map->badRocs[index]; - if (skipROC) continue; + skipROC = Map->badRocs[index]; + if (skipROC) continue; } skipROC = modToUnp[index]; @@ -581,17 +565,16 @@ namespace pixelgpudetails { moduleId[gIndex] = detId.moduleId; rawIdArr[gIndex] = rawId; } // end of if (gIndex < end) - } // end fake loop + } // end fake loop } // end of Raw to Digi kernel - // Interface to outside void SiPixelRawToClusterGPUKernel::makeClustersAsync( const SiPixelFedCablingMapGPU *cablingMap, const unsigned char *modToUnp, const SiPixelGainForHLTonGPU *gains, const uint32_t wordCounter, const uint32_t fedCounter, - bool convertADCtoElectrons, + bool convertADCtoElectrons, bool useQualityInfo, bool includeErrors, bool debug, cuda::stream_t<>& stream) { @@ -605,11 +588,11 @@ namespace pixelgpudetails { // wordCounter is the total no of words in each event to be trasfered on device cudaCheck(cudaMemcpyAsync(&word_d[0], &word[0], wordCounter*sizeof(uint32_t), cudaMemcpyDefault, stream.id())); cudaCheck(cudaMemcpyAsync(&fedId_d[0], &fedId_h[0], wordCounter*sizeof(uint8_t)/2, cudaMemcpyDefault, stream.id())); - + constexpr uint32_t vsize = sizeof(GPU::SimpleVector); constexpr uint32_t esize = sizeof(pixelgpudetails::error_obj); cudaCheck(cudaMemcpyAsync(error_d, error_h_tmp, vsize, cudaMemcpyDefault, stream.id())); - + // Launch rawToDigi kernel RawToDigi_kernel<<>>( cablingMap, @@ -633,80 +616,64 @@ namespace pixelgpudetails { cudaCheck(cudaMemcpyAsync(rawIdArr_h, rawIdArr_d, wordCounter*sizeof(uint32_t), cudaMemcpyDefault, stream.id())); if (includeErrors) { - cudaCheck(cudaMemcpyAsync(error_h, error_d, vsize, cudaMemcpyDefault, stream.id())); - cudaStreamSynchronize(stream.id()); - error_h->set_data(data_h); - int size = error_h->size(); - cudaCheck(cudaMemcpyAsync(data_h, data_d, size*esize, cudaMemcpyDefault, stream.id())); + cudaCheck(cudaMemcpyAsync(error_h, error_d, vsize, cudaMemcpyDefault, stream.id())); + cudaCheck(cudaStreamSynchronize(stream.id())); + error_h->set_data(data_h); + int size = error_h->size(); + cudaCheck(cudaMemcpyAsync(data_h, data_d, size*esize, cudaMemcpyDefault, stream.id())); } // End of Raw2Digi and passing data for cluserisation - { - // clusterizer ... - using namespace gpuClustering; - int threadsPerBlock = 256; - int blocks = (wordCounter + threadsPerBlock - 1) / threadsPerBlock; - - - gpuCalibPixel::calibDigis<<>>( - moduleInd_d, - xx_d, yy_d, adc_d, - gains, - wordCounter - ); - - cudaCheck(cudaGetLastError()); - - // calibrated adc - cudaCheck(cudaMemcpyAsync(adc_h, adc_d, wordCounter*sizeof(uint16_t), cudaMemcpyDefault, stream.id())); - - /* - std::cout - << "CUDA countModules kernel launch with " << blocks - << " blocks of " << threadsPerBlock << " threads\n"; - */ - - nModulesActive = 0; - cudaCheck(cudaMemcpyAsync(moduleStart_d, &nModulesActive, sizeof(uint32_t), cudaMemcpyDefault, stream.id())); - - countModules<<>>(moduleInd_d, moduleStart_d, clus_d, wordCounter); - cudaCheck(cudaGetLastError()); - - cudaCheck(cudaMemcpyAsync(&nModulesActive, moduleStart_d, sizeof(uint32_t), cudaMemcpyDefault, stream.id())); - - // std::cout << "found " << nModulesActive << " Modules active" << std::endl; - - // In order to avoid the cudaStreamSynchronize, create a new kernel which launches countModules and findClus. - cudaStreamSynchronize(stream.id()); - - threadsPerBlock = 256; - blocks = nModulesActive; - - /* - std::cout - << "CUDA findClus kernel launch with " << blocks - << " blocks of " << threadsPerBlock << " threads\n"; - */ - - cudaCheck(cudaMemsetAsync(clusInModule_d, 0, (MaxNumModules)*sizeof(uint32_t), stream.id())); - - findClus<<>>( - moduleInd_d, - xx_d, yy_d, adc_d, - moduleStart_d, - clusInModule_d, moduleId_d, - clus_d, - wordCounter - ); - - // clusters - cudaCheck(cudaMemcpyAsync(clus_h, clus_d, wordCounter*sizeof(uint32_t), cudaMemcpyDefault, stream.id())); - - cudaStreamSynchronize(stream.id()); - cudaCheck(cudaGetLastError()); - - } // end clusterizer scope - + { + // clusterizer ... + using namespace gpuClustering; + int threadsPerBlock = 256; + int blocks = (wordCounter + threadsPerBlock - 1) / threadsPerBlock; + + + gpuCalibPixel::calibDigis<<>>( + moduleInd_d, + xx_d, yy_d, adc_d, + gains, + wordCounter); + cudaCheck(cudaGetLastError()); + + // calibrated adc + cudaCheck(cudaMemcpyAsync(adc_h, adc_d, wordCounter*sizeof(uint16_t), cudaMemcpyDefault, stream.id())); + + /* + std::cout + << "CUDA countModules kernel launch with " << blocks + << " blocks of " << threadsPerBlock << " threads\n"; + */ + + cudaCheck(cudaMemsetAsync(moduleStart_d, 0x00, sizeof(uint32_t), stream.id())); + + countModules<<>>(moduleInd_d, moduleStart_d, clus_d, wordCounter); + cudaCheck(cudaGetLastError()); + + // read the number of modules into a data member, used by getProduct()) + cudaCheck(cudaMemcpyAsync(&nModulesActive, moduleStart_d, sizeof(uint32_t), cudaMemcpyDefault, stream.id())); + + threadsPerBlock = 256; + blocks = MaxNumModules; + /* + std::cout << "CUDA findClus kernel launch with " << blocks + << " blocks of " << threadsPerBlock << " threads\n"; + */ + cudaCheck(cudaMemsetAsync(clusInModule_d, 0, (MaxNumModules)*sizeof(uint32_t), stream.id())); + findClus<<>>( + moduleInd_d, + xx_d, yy_d, + moduleStart_d, + clusInModule_d, moduleId_d, + clus_d, + wordCounter); + cudaCheck(cudaGetLastError()); + + // clusters + cudaCheck(cudaMemcpyAsync(clus_h, clus_d, wordCounter*sizeof(uint32_t), cudaMemcpyDefault, stream.id())); + } // end clusterizer scope } } diff --git a/RecoLocalTracker/SiPixelClusterizer/plugins/gpuCalibPixel.h b/RecoLocalTracker/SiPixelClusterizer/plugins/gpuCalibPixel.h index 5e1c2a7486b56..c096afd5f44fc 100644 --- a/RecoLocalTracker/SiPixelClusterizer/plugins/gpuCalibPixel.h +++ b/RecoLocalTracker/SiPixelClusterizer/plugins/gpuCalibPixel.h @@ -52,9 +52,6 @@ namespace gpuCalibPixel { // if (threadIdx.x==0) // printf ("calibrated %d\n",id[i]); - - __syncthreads(); - } __global__ void calibADCByModule(uint16_t * id, diff --git a/RecoLocalTracker/SiPixelClusterizer/plugins/gpuClustering.h b/RecoLocalTracker/SiPixelClusterizer/plugins/gpuClustering.h index 60be134a4ee46..d9a98437b52cf 100644 --- a/RecoLocalTracker/SiPixelClusterizer/plugins/gpuClustering.h +++ b/RecoLocalTracker/SiPixelClusterizer/plugins/gpuClustering.h @@ -11,13 +11,13 @@ namespace gpuClustering { __global__ void countModules(uint16_t const * id, uint32_t * moduleStart, - int32_t * clus, + int32_t * clusterId, int numElements) { int i = blockDim.x * blockIdx.x + threadIdx.x; if (i >= numElements) return; - clus[i] = i; + clusterId[i] = i; if (InvId == id[i]) return; auto j = i - 1; @@ -30,137 +30,158 @@ namespace gpuClustering { } } - __global__ void findClus(uint16_t const * id, - uint16_t const * x, - uint16_t const * y, - uint16_t const * adc, - uint32_t const * moduleStart, - uint32_t * clusInModule, uint32_t * moduleId, - int32_t * clus, + __global__ void findClus(uint16_t const * id, // module id of each pixel + uint16_t const * x, // local coordinates of each pixel + uint16_t const * y, // + uint32_t const * moduleStart, // index of the first pixel of each module + uint32_t * nClustersInModule, // output: number of clusters found in each module + uint32_t * moduleId, // output: module id of each module + int32_t * clusterId, // output: cluster id of each pixel int numElements) { - __shared__ bool go; - __shared__ int nclus; - __shared__ int msize; - if (blockIdx.x >= moduleStart[0]) return; - auto first = moduleStart[1 + blockIdx.x]; - auto me = id[first]; - - assert(me < MaxNumModules); + auto firstPixel = moduleStart[1 + blockIdx.x]; + auto thisModuleId = id[firstPixel]; + assert(thisModuleId < MaxNumModules); #ifdef GPU_DEBUG - if (me%100 == 1) + if (thisModuleId % 100 == 1) if (threadIdx.x == 0) - printf("start clusterizer for module %d in block %d\n", me, blockIdx.x); + printf("start clusterizer for module %d in block %d\n", thisModuleId, blockIdx.x); #endif - first += threadIdx.x; - if (first>= numElements) - return; - - go = true; - nclus = 0; + auto first = firstPixel + threadIdx.x; + // find the index of the first pixel not belonging to this module (or invalid) + __shared__ int msize; msize = numElements; __syncthreads(); - for (int i = first; i < numElements; i += blockDim.x) { - if (id[i] == InvId) // not valid - continue; - if (id[i] != me) { // end of module - atomicMin(&msize, i); - break; + // skip threads not associated to an existing pixel + bool active = (first < numElements); + if (active) { + for (int i = first; i < numElements; i += blockDim.x) { + if (id[i] == InvId) // skip invalid pixels + continue; + if (id[i] != thisModuleId) { // find the first pixel in a different module + atomicMin(&msize, i); + break; + } } } + __syncthreads(); + assert((msize == numElements) or ((msize < numElements) and (id[msize] != thisModuleId))); - assert(msize<= numElements); - if (first>= msize) - return; + // skip threads not assocoated to pixels in this module + active = (first < msize); - int jmax[10]; - auto niter = (msize - first) / blockDim.x; - assert(niter < 10); - for (int k = 0; k < niter + 1; ++k) + // assume that we can cover the whole module with up to 10 blockDim.x-wide iterations + constexpr int maxiter = 10; + if (active) { + assert(((msize - first) / blockDim.x) <= maxiter); + } + int jmax[maxiter]; + for (int k = 0; k < maxiter; ++k) jmax[k] = msize; - while (go) { - __syncthreads(); - go = false; - - __syncthreads(); - int k = -1; - for (int i = first; i < msize; i += blockDim.x) { - ++k; - if (id[i] == InvId) // not valid - continue; - assert(id[i] == me); // break; // end of module - auto js = i + 1; - auto jm = jmax[k]; - jmax[k] = i + 1; - for (int j = js; j < jm; ++j) { - if (id[j] == InvId) // not valid - continue; - if (std::abs(int(x[j]) - int(x[i])) > 1 | - std::abs(int(y[j]) - int(y[i])) > 1) + __syncthreads(); + // for each pixel, look at all the pixels until the end of the module; + // when two valid pixels within +/- 1 in x or y are found, set their id to the minimum; + // after the loop, all the pixel in each cluster should have the id equeal to the lowest + // pixel in the cluster ( clus[i] == i ). + bool done = false; + while (not __syncthreads_and(done)) { + done = true; + if (active) { + for (int i = first, k = 0; i < msize; i += blockDim.x, ++k) { + if (id[i] == InvId) // skip invalid pixels continue; - auto old = atomicMin(&clus[j], clus[i]); - if (old != clus[i]) go = true; - atomicMin(&clus[i], old); - jmax[k] = j + 1; + assert(id[i] == thisModuleId); // same module + auto js = i + 1; + auto jm = jmax[k]; + jmax[k] = i + 1; + for (int j = js; j < jm; ++j) { + if (id[j] == InvId) // skip invalid pixels + continue; + if (std::abs(int(x[j]) - int(x[i])) > 1 or + std::abs(int(y[j]) - int(y[i])) > 1) + continue; + auto old = atomicMin(&clusterId[j], clusterId[i]); + if (old != clusterId[i]) { + // end the loop only if no changes were applied + done = false; + } + atomicMin(&clusterId[i], old); + // update the loop boundary for the next iteration + jmax[k] = j + 1; + } } } - assert (k<= niter); - __syncthreads(); } - nclus = 0; + __shared__ int foundClusters; + foundClusters = 0; __syncthreads(); - for (int i = first; i < numElements; i += blockDim.x) { - if (id[i] == InvId) // not valid - continue; - if (id[i] != me) // end of module - break; - if (clus[i] == i) { - auto old = atomicAdd(&nclus, 1); - clus[i] = -(old + 1); + + // find the number of different clusters, identified by a pixels with clus[i] == i; + // mark these pixels with a negative id. + if (active) { + for (int i = first; i < numElements; i += blockDim.x) { + if (id[i] == InvId) // skip invalid pixels + continue; + if (id[i] != thisModuleId) // stop once in a different module + break; + if (clusterId[i] == i) { + auto old = atomicAdd(&foundClusters, 1); + clusterId[i] = -(old + 1); + } } } - __syncthreads(); - for (int i = first; i < numElements; i += blockDim.x) { - if (id[i] == InvId) // not valid - continue; - if (id[i] != me) // end of module - break; - if (clus[i]>= 0) clus[i] = clus[clus[i]]; - } - __syncthreads(); - for (int i = first; i < numElements; i += blockDim.x) { - if (id[i] == InvId) { // not valid - clus[i] = -9999; - continue; + // propagate the negative id to all the pixels in the cluster. + if (active) { + for (int i = first; i < numElements; i += blockDim.x) { + if (id[i] == InvId) // skip invalid pixels + continue; + if (id[i] != thisModuleId) // stop once in a different module + break; + if (clusterId[i] >= 0) { + // mark each pixel in a cluster with the same id as the first one + clusterId[i] = clusterId[clusterId[i]]; + } } - if (id[i] != me) // end of module - break; - clus[i] = - clus[i] - 1; } - __syncthreads(); - if (threadIdx.x == 0) { - clusInModule[me] = nclus; - moduleId[blockIdx.x] = me; + + // adjust the cluster id to be a positive value starting from 0 + if (active) { + for (int i = first; i < numElements; i += blockDim.x) { + if (id[i] == InvId) { // skip invalid pixels + clusterId[i] = -9999; + continue; + } + if (id[i] != thisModuleId) // stop once in a different module + break; + clusterId[i] = - clusterId[i] - 1; + } } + __syncthreads(); + if (active) { + if (threadIdx.x == 0) { + nClustersInModule[thisModuleId] = foundClusters; + moduleId[blockIdx.x] = thisModuleId; + } #ifdef GPU_DEBUG - if (me % 100 == 1) - if (threadIdx.x == 0) - printf("%d clusters in module %d\n", nclus, me); + if (thisModuleId % 100 == 1) + if (threadIdx.x == 0) + printf("%d clusters in module %d\n", foundClusters, thisModuleId); #endif + } } } // namespace gpuClustering diff --git a/RecoLocalTracker/SiPixelClusterizer/test/gpuClustering.cu b/RecoLocalTracker/SiPixelClusterizer/test/gpuClustering.cu index fba4946b178ec..2264be0de02af 100644 --- a/RecoLocalTracker/SiPixelClusterizer/test/gpuClustering.cu +++ b/RecoLocalTracker/SiPixelClusterizer/test/gpuClustering.cu @@ -192,7 +192,7 @@ int main(void) cuda::launch( findClus, { blocksPerGrid, threadsPerBlock }, - d_id.get(), d_x.get(), d_y.get(), d_adc.get(), + d_id.get(), d_x.get(), d_y.get(), d_moduleStart.get(), d_clusInModule.get(), d_moduleId.get(), d_clus.get(), From 64e6201d65501b62587ca96a8e1409e22757b8ff Mon Sep 17 00:00:00 2001 From: Andrea Bocci Date: Thu, 26 Jul 2018 09:28:04 +0200 Subject: [PATCH 78/88] Always set the thread stack size when initialising TBB (#104) Set the thread stack size even if the number of threads is not specified on the command line nor in the process.options ParameterSet. --- FWCore/Framework/bin/cmsRun.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FWCore/Framework/bin/cmsRun.cpp b/FWCore/Framework/bin/cmsRun.cpp index 3970c7f439b46..0ca9d6444717c 100644 --- a/FWCore/Framework/bin/cmsRun.cpp +++ b/FWCore/Framework/bin/cmsRun.cpp @@ -134,7 +134,7 @@ int main(int argc, char* argv[]) { //NOTE: with new version of TBB (44_20160316oss) we can only construct 1 tbb::task_scheduler_init per job // else we get a crash. So for now we can't have any services use tasks in their constructors. bool setNThreadsOnCommandLine = false; - std::unique_ptr tsiPtr = std::make_unique(edm::s_defaultNumberOfThreads); + std::unique_ptr tsiPtr = std::make_unique(edm::s_defaultNumberOfThreads, kDefaultSizeOfStackForThreadsInKB * 1024); std::shared_ptr theMessageServicePresence; std::unique_ptr jobReportStreamPtr; std::shared_ptr > jobRep; From 8c948e7bef9d8cecd178ecb646bec5c27504b086 Mon Sep 17 00:00:00 2001 From: Matti Kortelainen Date: Mon, 30 Jul 2018 13:23:42 +0200 Subject: [PATCH 79/88] Customize function to provide a minimal configuration for profiling (#106) Can be included with the following snippet in the configuration: from RecoPixelVertexing.Configuration.customizePixelTracksForProfiling import customizePixelTracksForProfiling process = customizePixelTracksForProfiling(process) Removes validation, DQM, and output modules. As suggested in #70 (comment), an `AsciiOutputModule` is used to require the `pixelTracks`. --- .../python/customizePixelTracksForProfiling.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 RecoPixelVertexing/Configuration/python/customizePixelTracksForProfiling.py diff --git a/RecoPixelVertexing/Configuration/python/customizePixelTracksForProfiling.py b/RecoPixelVertexing/Configuration/python/customizePixelTracksForProfiling.py new file mode 100644 index 0000000000000..dc6524babec9d --- /dev/null +++ b/RecoPixelVertexing/Configuration/python/customizePixelTracksForProfiling.py @@ -0,0 +1,15 @@ +import FWCore.ParameterSet.Config as cms + +def customizePixelTracksForProfiling(process): + process.out = cms.OutputModule("AsciiOutputModule", + outputCommands = cms.untracked.vstring( + "keep *_pixelTracks_*_*", + ), + verbosity = cms.untracked.uint32(0), + ) + + process.outPath = cms.EndPath(process.out) + + process.schedule = cms.Schedule(process.raw2digi_step, process.reconstruction_step, process.outPath) + + return process From f4e5462fadc682ea80f871fc4b9bde280ae5ab34 Mon Sep 17 00:00:00 2001 From: Andrea Bocci Date: Mon, 30 Jul 2018 19:21:46 +0200 Subject: [PATCH 80/88] Fix the race condition between the CUDAService and NVProfilerService destructors (#107) Make sure that CUDA is properly initialised, and that the CUDAService's destructor is called after the NVProfilerService's destructor. --- HeterogeneousCore/CUDAServices/plugins/NVProfilerService.cc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/HeterogeneousCore/CUDAServices/plugins/NVProfilerService.cc b/HeterogeneousCore/CUDAServices/plugins/NVProfilerService.cc index 2d0b68e352ec7..1f3ad644288c2 100644 --- a/HeterogeneousCore/CUDAServices/plugins/NVProfilerService.cc +++ b/HeterogeneousCore/CUDAServices/plugins/NVProfilerService.cc @@ -34,12 +34,14 @@ #include "FWCore/ServiceRegistry/interface/PathContext.h" #include "FWCore/ServiceRegistry/interface/PathsAndConsumesOfModulesBase.h" #include "FWCore/ServiceRegistry/interface/ProcessContext.h" +#include "FWCore/ServiceRegistry/interface/Service.h" #include "FWCore/ServiceRegistry/interface/StreamContext.h" #include "FWCore/ServiceRegistry/interface/SystemBounds.h" #include "FWCore/Utilities/interface/BranchType.h" #include "FWCore/Utilities/interface/Exception.h" #include "FWCore/Utilities/interface/ProductKindOfType.h" #include "FWCore/Utilities/interface/TimeOfDay.h" +#include "HeterogeneousCore/CUDAServices/interface/CUDAService.h" using namespace std::string_literals; @@ -330,6 +332,9 @@ NVProfilerService::NVProfilerService(edm::ParameterSet const & config, edm::Acti concurrentStreams_(0), domains_(this) { + // make sure that CUDA is initialised, and that the CUDAService destructor is called after this service's destructor + edm::Service cudaService; + std::sort(highlightModules_.begin(), highlightModules_.end()); // enables profile collection; if profiling is already enabled, has no effect From dc060eb626bde09965a1a9d7ae8ffee16123e7ed Mon Sep 17 00:00:00 2001 From: Vincenzo Innocente Date: Tue, 31 Jul 2018 12:03:15 +0200 Subject: [PATCH 81/88] Heterogeneous ClusterTPAssociation (#105) Implement a heterogeneous Cluster-to-TrackingParticle associator running on the GPU. --- .../CUDAUtilities/interface/HistoContainer.h | 8 - .../interface/cudastdAlgorithm.h | 7 + .../CUDAUtilities/test/BuildFile.xml | 16 +- .../plugins/SiPixelRawToClusterGPUKernel.cu | 21 +- .../plugins/SiPixelRawToClusterGPUKernel.h | 32 +- .../SiPixelRawToClusterHeterogeneous.cc | 24 +- .../siPixelRawToClusterHeterogeneousProduct.h | 8 +- .../SiPixelRecHits/plugins/PixelRecHits.cu | 20 +- .../siPixelRecHitsHeterogeneousProduct.h | 39 +- .../CAHitNtupletHeterogeneousEDProducer.cc | 20 +- .../plugins/CAHitQuadrupletGeneratorGPU.cu | 14 +- .../plugins/CAHitQuadrupletGeneratorGPU.h | 13 +- .../PixelTriplets/plugins/gpuPixelDoublets.h | 161 +++++++ .../plugins/BuildFile.xml | 11 +- .../plugins/ClusterSLOnGPU.cu | 220 +++++++++ .../plugins/ClusterSLOnGPU.h | 44 ++ .../ClusterTPAssociationHeterogeneous.cc | 442 ++++++++++++++++++ ...sterTPAssociationHeterogeneousConverter.cc | 59 +++ ...rackerHitAssociationHeterogeneousProduct.h | 47 ++ .../python/tpClusterProducer_cfi.py | 10 + .../RecoTrack/python/TrackValidation_cff.py | 15 +- .../RecoTrack/python/associators_cff.py | 3 +- 22 files changed, 1148 insertions(+), 86 deletions(-) create mode 100644 RecoPixelVertexing/PixelTriplets/plugins/gpuPixelDoublets.h create mode 100644 SimTracker/TrackerHitAssociation/plugins/ClusterSLOnGPU.cu create mode 100644 SimTracker/TrackerHitAssociation/plugins/ClusterSLOnGPU.h create mode 100644 SimTracker/TrackerHitAssociation/plugins/ClusterTPAssociationHeterogeneous.cc create mode 100644 SimTracker/TrackerHitAssociation/plugins/ClusterTPAssociationHeterogeneousConverter.cc create mode 100644 SimTracker/TrackerHitAssociation/plugins/trackerHitAssociationHeterogeneousProduct.h diff --git a/HeterogeneousCore/CUDAUtilities/interface/HistoContainer.h b/HeterogeneousCore/CUDAUtilities/interface/HistoContainer.h index baa2e7f64c613..c398b29a64c69 100644 --- a/HeterogeneousCore/CUDAUtilities/interface/HistoContainer.h +++ b/HeterogeneousCore/CUDAUtilities/interface/HistoContainer.h @@ -8,14 +8,6 @@ #include #endif // __CUDA_ARCH__ -#ifdef __CUDACC__ -#include -#else -#define __device__ -#define __global__ -#define __host__ -#endif // __CUDACC__ - #include "HeterogeneousCore/CUDAUtilities/interface/cudastdAlgorithm.h" #ifdef __CUDACC__ diff --git a/HeterogeneousCore/CUDAUtilities/interface/cudastdAlgorithm.h b/HeterogeneousCore/CUDAUtilities/interface/cudastdAlgorithm.h index 4bfa4e694d9dc..94067095e51d7 100644 --- a/HeterogeneousCore/CUDAUtilities/interface/cudastdAlgorithm.h +++ b/HeterogeneousCore/CUDAUtilities/interface/cudastdAlgorithm.h @@ -3,6 +3,8 @@ #include +#include + // reimplementation of std algorithms able to compile with CUDA and run on GPUs, // mostly by declaringthem constexpr @@ -10,6 +12,7 @@ namespace cuda_std { template struct less { + __host__ __device__ constexpr bool operator()(const T &lhs, const T &rhs) const { return lhs < rhs; } @@ -18,10 +21,12 @@ namespace cuda_std { template<> struct less { template + __host__ __device__ constexpr bool operator()(const T &lhs, const U &rhs ) const { return lhs < rhs;} }; template> + __host__ __device__ constexpr RandomIt lower_bound(RandomIt first, RandomIt last, const T& value, Compare comp={}) { @@ -43,6 +48,7 @@ namespace cuda_std { } template> + __host__ __device__ constexpr RandomIt upper_bound(RandomIt first, RandomIt last, const T& value, Compare comp={}) { @@ -64,6 +70,7 @@ namespace cuda_std { } template> + __host__ __device__ constexpr RandomIt binary_find(RandomIt first, RandomIt last, const T& value, Compare comp={}) { diff --git a/HeterogeneousCore/CUDAUtilities/test/BuildFile.xml b/HeterogeneousCore/CUDAUtilities/test/BuildFile.xml index 1c1d28dbf3761..ab97c243c4385 100644 --- a/HeterogeneousCore/CUDAUtilities/test/BuildFile.xml +++ b/HeterogeneousCore/CUDAUtilities/test/BuildFile.xml @@ -1,31 +1,31 @@ + + - + + + - - - - + + + - - - diff --git a/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelRawToClusterGPUKernel.cu b/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelRawToClusterGPUKernel.cu index 29e5e82049b5c..7eb90cffa2d77 100644 --- a/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelRawToClusterGPUKernel.cu +++ b/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelRawToClusterGPUKernel.cu @@ -38,7 +38,7 @@ namespace pixelgpudetails { - SiPixelRawToClusterGPUKernel::SiPixelRawToClusterGPUKernel() { + SiPixelRawToClusterGPUKernel::SiPixelRawToClusterGPUKernel(cuda::stream_t<>& cudaStream) { int WSIZE = pixelgpudetails::MAX_FED * pixelgpudetails::MAX_WORD; cudaMallocHost(&word, sizeof(unsigned int)*WSIZE); cudaMallocHost(&fedId_h, sizeof(unsigned char)*WSIZE); @@ -90,6 +90,12 @@ namespace pixelgpudetails { cudaCheck(cudaMalloc((void**) & moduleStart_d, (MaxNumModules+1)*sizeof(uint32_t) )); cudaCheck(cudaMalloc((void**) & clusInModule_d,(MaxNumModules)*sizeof(uint32_t) )); cudaCheck(cudaMalloc((void**) & moduleId_d, (MaxNumModules)*sizeof(uint32_t) )); + + cudaCheck(cudaMalloc((void**) & gpuProduct_d, sizeof(GPUProduct))); + gpuProduct = getProduct(); + assert(xx_d==gpuProduct.xx_d); + + cudaCheck(cudaMemcpyAsync(gpuProduct_d, &gpuProduct, sizeof(GPUProduct), cudaMemcpyDefault,cudaStream.id())); } SiPixelRawToClusterGPUKernel::~SiPixelRawToClusterGPUKernel() { @@ -111,6 +117,7 @@ namespace pixelgpudetails { cudaCheck(cudaFree(clus_d)); cudaCheck(cudaFree(clusInModule_d)); cudaCheck(cudaFree(moduleId_d)); + cudaCheck(cudaFree(gpuProduct_d)); } void SiPixelRawToClusterGPUKernel::initializeWordFed(int fedId, unsigned int wordCounterGPU, const cms_uint32_t *src, unsigned int length) { @@ -478,7 +485,7 @@ namespace pixelgpudetails { XX[gIndex] = 0; // 0 is an indicator of a noise/dead channel YY[gIndex] = 0; // skip these pixels during clusterization ADC[gIndex] = 0; - continue ; // 0: bad word + continue; // 0: bad word } uint32_t link = getLink(ww); // Extract link @@ -521,9 +528,9 @@ namespace pixelgpudetails { // endcap ids layer = 0; panel = (rawId >> pixelgpudetails::panelStartBit) & pixelgpudetails::panelMask; - //disk = (rawId >> diskStartBit_) & diskMask_ ; + //disk = (rawId >> diskStartBit_) & diskMask_; side = (panel == 1)? -1 : 1; - //blade = (rawId>>bladeStartBit_) & bladeMask_; + //blade = (rawId >> bladeStartBit_) & bladeMask_; } // ***special case of layer to 1 be handled here @@ -558,8 +565,8 @@ namespace pixelgpudetails { } pixelgpudetails::Pixel globalPix = frameConversion(barrel, side, layer, rocIdInDetUnit, localPix); - XX[gIndex] = globalPix.row ; // origin shifting by 1 0-159 - YY[gIndex] = globalPix.col ; // origin shifting by 1 0-415 + XX[gIndex] = globalPix.row; // origin shifting by 1 0-159 + YY[gIndex] = globalPix.col; // origin shifting by 1 0-415 ADC[gIndex] = getADC(ww); pdigi[gIndex] = pixelgpudetails::pack(globalPix.row,globalPix.col,ADC[gIndex]); moduleId[gIndex] = detId.moduleId; @@ -583,7 +590,6 @@ namespace pixelgpudetails { const int threadsPerBlock = 512; const int blocks = (wordCounter + threadsPerBlock-1) /threadsPerBlock; // fill it all - assert(0 == wordCounter%2); // wordCounter is the total no of words in each event to be trasfered on device cudaCheck(cudaMemcpyAsync(&word_d[0], &word[0], wordCounter*sizeof(uint32_t), cudaMemcpyDefault, stream.id())); @@ -630,7 +636,6 @@ namespace pixelgpudetails { int threadsPerBlock = 256; int blocks = (wordCounter + threadsPerBlock - 1) / threadsPerBlock; - gpuCalibPixel::calibDigis<<>>( moduleInd_d, xx_d, yy_d, adc_d, diff --git a/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelRawToClusterGPUKernel.h b/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelRawToClusterGPUKernel.h index 2b0b205c9f536..2f7436052902b 100644 --- a/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelRawToClusterGPUKernel.h +++ b/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelRawToClusterGPUKernel.h @@ -83,7 +83,7 @@ namespace pixelgpudetails { class Packing { public: using PackedDigiType = uint32_t; - + // Constructor: pre-computes masks and shifts from field widths __host__ __device__ inline @@ -144,22 +144,32 @@ namespace pixelgpudetails { (adc << thePacking.adc_shift); } + constexpr + uint32_t pixelToChannel( int row, int col) { + constexpr Packing thePacking = packing(); + return (row << thePacking.column_width) | col; + } + + using error_obj = siPixelRawToClusterHeterogeneousProduct::error_obj; class SiPixelRawToClusterGPUKernel { public: - SiPixelRawToClusterGPUKernel(); + + using GPUProduct = siPixelRawToClusterHeterogeneousProduct::GPUProduct; + + SiPixelRawToClusterGPUKernel(cuda::stream_t<>& cudaStream); ~SiPixelRawToClusterGPUKernel(); - + SiPixelRawToClusterGPUKernel(const SiPixelRawToClusterGPUKernel&) = delete; SiPixelRawToClusterGPUKernel(SiPixelRawToClusterGPUKernel&&) = delete; SiPixelRawToClusterGPUKernel& operator=(const SiPixelRawToClusterGPUKernel&) = delete; SiPixelRawToClusterGPUKernel& operator=(SiPixelRawToClusterGPUKernel&&) = delete; void initializeWordFed(int fedId, unsigned int wordCounterGPU, const cms_uint32_t *src, unsigned int length); - + // Not really very async yet... void makeClustersAsync(const SiPixelFedCablingMapGPU *cablingMap, const unsigned char *modToUnp, const SiPixelGainForHLTonGPU *gains, @@ -170,8 +180,9 @@ namespace pixelgpudetails { auto getProduct() const { return siPixelRawToClusterHeterogeneousProduct::GPUProduct{ pdigi_h, rawIdArr_h, clus_h, adc_h, error_h, - nDigis, nModulesActive, - xx_d, yy_d, adc_d, moduleInd_d, moduleStart_d,clus_d, clusInModule_d, moduleId_d + gpuProduct_d, + xx_d, yy_d, adc_d, moduleInd_d, moduleStart_d,clus_d, clusInModule_d, moduleId_d, + nDigis, nModulesActive }; } @@ -181,6 +192,11 @@ namespace pixelgpudetails { unsigned char *fedId_h = nullptr; // to hold fed index for each word // output + GPUProduct gpuProduct; + GPUProduct * gpuProduct_d; + + // FIXME cleanup all these are in the gpuProduct above... + uint32_t *pdigi_h = nullptr, *rawIdArr_h = nullptr; // host copy of output uint16_t *adc_h = nullptr; int32_t *clus_h = nullptr; // host copy of calib&clus output pixelgpudetails::error_obj *data_h = nullptr; @@ -209,7 +225,7 @@ namespace pixelgpudetails { uint32_t * clusInModule_d; uint32_t * moduleId_d; }; - + // configuration and memory buffers alocated on the GPU struct context { uint32_t * word_d; @@ -223,7 +239,7 @@ namespace pixelgpudetails { GPU::SimpleVector * error_d; error_obj * data_d; - + // these are for the clusterizer (to be moved) uint32_t * moduleStart_d; int32_t * clus_d; diff --git a/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelRawToClusterHeterogeneous.cc b/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelRawToClusterHeterogeneous.cc index 196a08b85d861..0dc715973aa9b 100644 --- a/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelRawToClusterHeterogeneous.cc +++ b/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelRawToClusterHeterogeneous.cc @@ -67,14 +67,14 @@ namespace { UShort xmin=16000; UShort ymin=16000; unsigned int isize=0; - int charge=0; + int charge=0; void clear() { isize=0; charge=0; xmin=16000; ymin=16000; - } + } bool add(SiPixelCluster::PixelPos const & p, UShort const iadc) { if (isize==MAXSIZE) return false; @@ -117,12 +117,12 @@ class SiPixelRawToClusterHeterogeneous: public HeterogeneousEDProducer cabling_; const SiPixelQuality *badPixelInfo_ = nullptr; const SiPixelFedCablingMap *cablingMap_ = nullptr; std::unique_ptr regions_; - edm::EDGetTokenT tFEDRawDataCollection; + edm::EDGetTokenT tFEDRawDataCollection; bool includeErrors; bool useQuality; @@ -144,7 +144,7 @@ std::unique_ptr regions_; PixelThresholdClusterizer clusterizer_; const TrackerGeometry *geom_ = nullptr; const TrackerTopology *ttopo_ = nullptr; - + // gain calib SiPixelGainCalibrationForHLTService theSiPixelGainCalibration_; @@ -336,7 +336,7 @@ void SiPixelRawToClusterHeterogeneous::produceCPU(edm::HeterogeneousEvent& ev, c errorDetSet.data.insert(errorDetSet.data.end(), is->second.begin(), is->second.end()); // Fill detid of the detectors where there is error AND the error number is listed // in the configurable error list in the job option cfi. - // Code needs to be here, because there can be a set of errors for each + // Code needs to be here, because there can be a set of errors for each // entry in the for loop over PixelDataFormatter::Errors std::vector disabledChannelsDetSet; @@ -405,7 +405,7 @@ void SiPixelRawToClusterHeterogeneous::produceCPU(edm::HeterogeneousEvent& ev, c // Comment: At the moment the clusterizer depends on geometry // to access information as the pixel topology (number of columns - // and rows in a detector module). + // and rows in a detector module). // In the future the geometry service will be replaced with // a ES service. const GeomDetUnit * geoUnit = geom_->idToDetUnit( detId ); @@ -417,15 +417,15 @@ void SiPixelRawToClusterHeterogeneous::produceCPU(edm::HeterogeneousEvent& ev, c } } output->outputClusters.shrink_to_fit(); - - //send digis and errors back to framework + + //send digis and errors back to framework ev.put(std::move(output)); } // ----------------------------------------------------------------------------- void SiPixelRawToClusterHeterogeneous::beginStreamGPUCuda(edm::StreamID streamId, cuda::stream_t<>& cudaStream) { // Allocate GPU resources here - gpuAlgo_ = std::make_unique(); + gpuAlgo_ = std::make_unique(cudaStream); gpuModulesToUnpack_ = std::make_unique(); } @@ -523,6 +523,7 @@ void SiPixelRawToClusterHeterogeneous::acquireGPUCuda(const edm::HeterogeneousEv void SiPixelRawToClusterHeterogeneous::produceGPUCuda(edm::HeterogeneousEvent& ev, const edm::EventSetup& es, cuda::stream_t<>& cudaStream) { auto output = std::make_unique(gpuAlgo_->getProduct()); + assert(output->me_d); ev.put(std::move(output), [this](const GPUProduct& gpu, CPUProduct& cpu) { this->convertGPUtoCPU(gpu, cpu); }); @@ -560,7 +561,7 @@ void SiPixelRawToClusterHeterogeneous::convertGPUtoCPU(const SiPixelRawToCluster std::push_heap(spc.begin(),spc.end(),[](SiPixelCluster const & cl1,SiPixelCluster const & cl2) { return cl1.minPixelRow() < cl2.minPixelRow();}); } for (int32_t ic=0; ic const * error_h = nullptr; + GPUProduct const * me_d = nullptr; + // Needed for GPU rechits - uint32_t nDigis; - uint32_t nModules; uint16_t const * xx_d; uint16_t const * yy_d; uint16_t const * adc_d; @@ -55,6 +56,9 @@ namespace siPixelRawToClusterHeterogeneousProduct { int32_t const * clus_d; uint32_t const * clusInModule_d; uint32_t const * moduleId_d; + + uint32_t nDigis; + uint32_t nModules; }; using HeterogeneousDigiCluster = HeterogeneousProductImpl, diff --git a/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.cu b/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.cu index 999fdcd6eff19..62253ca9d7e1b 100644 --- a/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.cu +++ b/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.cu @@ -36,11 +36,10 @@ namespace pixelgpudetails { cudaCheck(cudaMalloc((void**) & gpu_.sortIndex_d,(gpuClustering::MaxNumModules*256)*sizeof(uint16_t))); cudaCheck(cudaMalloc((void**) & gpu_.mr_d,(gpuClustering::MaxNumModules*256)*sizeof(uint16_t))); cudaCheck(cudaMalloc((void**) & gpu_.mc_d,(gpuClustering::MaxNumModules*256)*sizeof(uint16_t))); -// cudaCheck(cudaMalloc((void**) & gpu_.hist_d, 10*sizeof(HitsOnGPU::Hist))); - + cudaCheck(cudaMalloc((void**) & gpu_.hist_d, 10*sizeof(HitsOnGPU::Hist))); cudaCheck(cudaMalloc((void**) & gpu_d, sizeof(HitsOnGPU))); + gpu_.me_d = gpu_d; cudaCheck(cudaMemcpyAsync(gpu_d, &gpu_, sizeof(HitsOnGPU), cudaMemcpyDefault,cudaStream.id())); - } PixelRecHitGPUKernel::~PixelRecHitGPUKernel() { @@ -59,8 +58,7 @@ namespace pixelgpudetails { cudaCheck(cudaFree(gpu_.sortIndex_d)); cudaCheck(cudaFree(gpu_.mr_d)); cudaCheck(cudaFree(gpu_.mc_d)); - // cudaCheck(cudaFree(gpu_.hist_d)); - + cudaCheck(cudaFree(gpu_.hist_d)); cudaCheck(cudaFree(gpu_d)); } @@ -78,7 +76,7 @@ namespace pixelgpudetails { input.clusInModule_d, input.clusInModule_d + gpuClustering::MaxNumModules, &gpu_.hitsModuleStart_d[1]); - + int threadsPerBlock = 256; int blocks = input.nModules; // active modules (with digis) gpuPixelRecHits::getHits<<>>( @@ -96,20 +94,20 @@ namespace pixelgpudetails { gpu_.xg_d, gpu_.yg_d, gpu_.zg_d, gpu_.rg_d, gpu_.iphi_d, gpu_.xl_d, gpu_.yl_d, - gpu_.xerr_d, gpu_.yerr_d, + gpu_.xerr_d, gpu_.yerr_d, gpu_.mr_d, gpu_.mc_d ); // needed only if hits on CPU are required... cudaCheck(cudaMemcpyAsync(hitsModuleStart_, gpu_.hitsModuleStart_d, (gpuClustering::MaxNumModules+1) * sizeof(uint32_t), cudaMemcpyDefault, stream.id())); - + // to be moved to gpu? auto nhits = hitsModuleStart_[gpuClustering::MaxNumModules]; for (int i=0;i<10;++i) hitsLayerStart_[i]=hitsModuleStart_[phase1PixelTopology::layerStart[i]]; hitsLayerStart_[10]=nhits; #ifdef GPU_DEBUG - std::cout << "hit layerStart "; + std::cout << "hit layerStart "; for (int i=0;i<10;++i) std::cout << phase1PixelTopology::layerName[i] << ':' << hitsLayerStart_[i] << ' '; std::cout << "end:" << hitsLayerStart_[10] << std::endl; #endif @@ -119,9 +117,7 @@ namespace pixelgpudetails { // for timing test // radixSortMultiWrapper<<<10, 256, 0, c.stream>>>(gpu_.iphi_d,gpu_.sortIndex_d,gpu_.hitsLayerStart_d); - // fillManyFromVector(gpu_.hist_d,10,gpu_.iphi_d, gpu_.hitsLayerStart_d, nhits,256,c.stream); - - + cudautils::fillManyFromVector(gpu_.hist_d,10,gpu_.iphi_d, gpu_.hitsLayerStart_d, nhits,256,stream.id()); } HitsOnCPU PixelRecHitGPUKernel::getOutput(cuda::stream_t<>& stream) const { diff --git a/RecoLocalTracker/SiPixelRecHits/plugins/siPixelRecHitsHeterogeneousProduct.h b/RecoLocalTracker/SiPixelRecHits/plugins/siPixelRecHitsHeterogeneousProduct.h index 6ccd435faa7ba..87a3cab0e5e98 100644 --- a/RecoLocalTracker/SiPixelRecHits/plugins/siPixelRecHitsHeterogeneousProduct.h +++ b/RecoLocalTracker/SiPixelRecHits/plugins/siPixelRecHitsHeterogeneousProduct.h @@ -1,15 +1,12 @@ #ifndef RecoLocalTracker_SiPixelRecHits_plugins_siPixelRecHitsHeterogeneousProduct_h #define RecoLocalTracker_SiPixelRecHits_plugins_siPixelRecHitsHeterogeneousProduct_h -#include "DataFormats/TrackerRecHit2D/interface/SiPixelRecHitCollection.h" -#include "HeterogeneousCore/Product/interface/HeterogeneousProduct.h" - - #include #include -// #include "HeterogeneousCore/CUDAUtilities/interface/HistoContainer.h" - +#include "DataFormats/TrackerRecHit2D/interface/SiPixelRecHitCollection.h" +#include "HeterogeneousCore/Product/interface/HeterogeneousProduct.h" +#include "HeterogeneousCore/CUDAUtilities/interface/HistoContainer.h" namespace siPixelRecHitsHeterogeneousProduct { @@ -31,15 +28,26 @@ namespace siPixelRecHitsHeterogeneousProduct { uint16_t * mr_d; uint16_t * mc_d; - // using Hist = HistoContainer; - // Hist * hist_d; - }; + using Hist = HistoContainer; + Hist * hist_d; + HitsOnGPU const * me_d = nullptr; + }; struct HitsOnCPU { HitsOnCPU() = default; + explicit HitsOnCPU(uint32_t nhits) : - charge(nhits),xl(nhits),yl(nhits),xe(nhits),ye(nhits), mr(nhits), mc(nhits){} + charge(nhits), + xl(nhits), + yl(nhits), + xe(nhits), + ye(nhits), + mr(nhits), + mc(nhits), + nHits(nhits) + { } + uint32_t hitsModuleStart[2001]; std::vector charge; std::vector xl, yl; @@ -47,19 +55,14 @@ namespace siPixelRecHitsHeterogeneousProduct { std::vector mr; std::vector mc; - HitsOnGPU const * gpu_d=nullptr; + uint32_t nHits; + HitsOnGPU const * gpu_d = nullptr; }; - using GPUProduct = HitsOnCPU; // FIXME fill cpu vectors on demand - using HeterogeneousPixelRecHit = HeterogeneousProductImpl, heterogeneous::GPUCudaProduct >; - - } - - -#endif +#endif // RecoLocalTracker_SiPixelRecHits_plugins_siPixelRecHitsHeterogeneousProduct_h diff --git a/RecoPixelVertexing/PixelTriplets/plugins/CAHitNtupletHeterogeneousEDProducer.cc b/RecoPixelVertexing/PixelTriplets/plugins/CAHitNtupletHeterogeneousEDProducer.cc index 186a84617e8d3..a4183d17e070f 100644 --- a/RecoPixelVertexing/PixelTriplets/plugins/CAHitNtupletHeterogeneousEDProducer.cc +++ b/RecoPixelVertexing/PixelTriplets/plugins/CAHitNtupletHeterogeneousEDProducer.cc @@ -11,6 +11,7 @@ #include "HeterogeneousCore/CUDACore/interface/GPUCuda.h" #include "HeterogeneousCore/CUDAServices/interface/CUDAService.h" #include "HeterogeneousCore/Producer/interface/HeterogeneousEDProducer.h" +#include "RecoLocalTracker/SiPixelRecHits/plugins/siPixelRecHitsHeterogeneousProduct.h" #include "RecoPixelVertexing/PixelTriplets/interface/CAHitQuadrupletGenerator.h" #include "RecoPixelVertexing/PixelTriplets/interface/OrderedHitSeeds.h" #include "RecoTracker/TkHitPairs/interface/IntermediateHitDoublets.h" @@ -31,13 +32,16 @@ class CAHitNtupletHeterogeneousEDProducer : public HeterogeneousEDProducer> { public: + + using PixelRecHitsH = siPixelRecHitsHeterogeneousProduct::HeterogeneousPixelRecHit; + + CAHitNtupletHeterogeneousEDProducer(const edm::ParameterSet &iConfig); ~CAHitNtupletHeterogeneousEDProducer() = default; static void fillDescriptions(edm::ConfigurationDescriptions &descriptions); void beginStreamGPUCuda(edm::StreamID streamId, cuda::stream_t<> &cudaStream) override; - void acquireGPUCuda(const edm::HeterogeneousEvent &iEvent, const edm::EventSetup &iSetup, cuda::stream_t<> &cudaStream) override; @@ -50,6 +54,9 @@ class CAHitNtupletHeterogeneousEDProducer private: edm::EDGetTokenT doubletToken_; + edm::EDGetTokenT tGpuHits; + + edm::RunningAverage localRA_; CAHitQuadrupletGeneratorGPU GPUGenerator_; CAHitQuadrupletGenerator CPUGenerator_; @@ -63,6 +70,7 @@ CAHitNtupletHeterogeneousEDProducer::CAHitNtupletHeterogeneousEDProducer( : HeterogeneousEDProducer(iConfig), doubletToken_(consumes( iConfig.getParameter("doublets"))), + tGpuHits(consumesHeterogeneous(iConfig.getParameter("heterogeneousPixelRecHitSrc"))), GPUGenerator_(iConfig, consumesCollector()), CPUGenerator_(iConfig, consumesCollector()) { produces(); @@ -73,6 +81,9 @@ void CAHitNtupletHeterogeneousEDProducer::fillDescriptions( edm::ParameterSetDescription desc; desc.add("doublets", edm::InputTag("hitPairEDProducer")); + + desc.add("heterogeneousPixelRecHitSrc", edm::InputTag("siPixelRecHitHeterogeneous")); + CAHitQuadrupletGeneratorGPU::fillDescriptions(desc); HeterogeneousEDProducer::fillPSetDescription(desc); auto label = "caHitQuadrupletHeterogeneousEDProducer"; @@ -106,6 +117,13 @@ void CAHitNtupletHeterogeneousEDProducer::acquireGPUCuda( seedingHitSets_ = std::make_unique(); + edm::Handle gh; + iEvent.getByToken(tGpuHits, gh); + auto const & gHits = *gh; +// auto nhits = gHits.nHits; + + GPUGenerator_.buildDoublets(gHits,0.06f,cudaStream.id()); + if (regionDoublets.empty()) { emptyRegionDoublets = true; } else { diff --git a/RecoPixelVertexing/PixelTriplets/plugins/CAHitQuadrupletGeneratorGPU.cu b/RecoPixelVertexing/PixelTriplets/plugins/CAHitQuadrupletGeneratorGPU.cu index 4a7f3ce5aa5f1..126aa3eb4b874 100644 --- a/RecoPixelVertexing/PixelTriplets/plugins/CAHitQuadrupletGeneratorGPU.cu +++ b/RecoPixelVertexing/PixelTriplets/plugins/CAHitQuadrupletGeneratorGPU.cu @@ -3,8 +3,9 @@ // #include "HeterogeneousCore/CUDAUtilities/interface/cudaCheck.h" -#include "GPUCACell.h" #include "CAHitQuadrupletGeneratorGPU.h" +#include "GPUCACell.h" +#include "gpuPixelDoublets.h" __global__ void kernel_debug(unsigned int numberOfLayerPairs_, unsigned int numberOfLayers_, @@ -385,7 +386,6 @@ void CAHitQuadrupletGeneratorGPU::deallocateOnGPU() void CAHitQuadrupletGeneratorGPU::allocateOnGPU() { cudaCheck(cudaMallocHost(&h_doublets_, maxNumberOfLayerPairs_ * sizeof(GPULayerDoublets))); - cudaCheck(cudaMallocHost(&h_indices_, maxNumberOfLayerPairs_ * maxNumberOfDoublets_ * 2 * sizeof(int))); cudaCheck(cudaMallocHost(&h_x_, maxNumberOfLayers_ * maxNumberOfHits_ * sizeof(float))); cudaCheck(cudaMallocHost(&h_y_, maxNumberOfLayers_ * maxNumberOfHits_ * sizeof(float))); @@ -490,3 +490,13 @@ CAHitQuadrupletGeneratorGPU::fetchKernelResult(int regionIndex, cudaStream_t cud } return quadsInterface; } + +void CAHitQuadrupletGeneratorGPU::buildDoublets(HitsOnCPU const & hh, float phicut, cudaStream_t stream) { + auto nhits = hh.nHits; + + float phiCut=0.06; + int threadsPerBlock = 256; + int blocks = (nhits + threadsPerBlock - 1) / threadsPerBlock; + + gpuPixelDoublets::getDoubletsFromHisto<<>>(hh.gpu_d,phiCut); +} diff --git a/RecoPixelVertexing/PixelTriplets/plugins/CAHitQuadrupletGeneratorGPU.h b/RecoPixelVertexing/PixelTriplets/plugins/CAHitQuadrupletGeneratorGPU.h index a6e9db46e68e7..a7f33219f66a1 100644 --- a/RecoPixelVertexing/PixelTriplets/plugins/CAHitQuadrupletGeneratorGPU.h +++ b/RecoPixelVertexing/PixelTriplets/plugins/CAHitQuadrupletGeneratorGPU.h @@ -1,5 +1,5 @@ -#ifndef RECOPIXELVERTEXING_PIXELTRIPLETS_CAHITQUADRUPLETGENERATORGPU_H -#define RECOPIXELVERTEXING_PIXELTRIPLETS_CAHITQUADRUPLETGENERATORGPU_H +#ifndef RecoPixelVertexing_PixelTriplets_plugins_CAHitQuadrupletGeneratorGPU_h +#define RecoPixelVertexing_PixelTriplets_plugins_CAHitQuadrupletGeneratorGPU_h #include @@ -7,6 +7,7 @@ #include "FWCore/ParameterSet/interface/ParameterSet.h" #include "FWCore/Utilities/interface/EDGetToken.h" #include "HeterogeneousCore/CUDAUtilities/interface/GPUSimpleVector.h" +#include "RecoLocalTracker/SiPixelRecHits/plugins/siPixelRecHitsHeterogeneousProduct.h" #include "RecoPixelVertexing/PixelTrackFitting/interface/RZLine.h" #include "RecoPixelVertexing/PixelTriplets/interface/OrderedHitSeeds.h" #include "RecoTracker/TkHitPairs/interface/HitPairGeneratorFromLayerPair.h" @@ -32,6 +33,10 @@ namespace edm { class CAHitQuadrupletGeneratorGPU { public: + + using HitsOnGPU = siPixelRecHitsHeterogeneousProduct::HitsOnGPU; + using HitsOnCPU = siPixelRecHitsHeterogeneousProduct::HitsOnCPU; + typedef LayerHitMapCache LayerCacheType; static constexpr unsigned int minLayers = 4; @@ -49,6 +54,8 @@ class CAHitQuadrupletGeneratorGPU { void initEvent(const edm::Event& ev, const edm::EventSetup& es); + void buildDoublets(HitsOnCPU const & hh, float phicut, cudaStream_t stream); + void hitNtuplets(const IntermediateHitDoublets& regionDoublets, const edm::EventSetup& es, const SeedingLayerSetsHits& layers, cudaStream_t stream); @@ -180,4 +187,4 @@ class CAHitQuadrupletGeneratorGPU { GPULayerDoublets* tmp_layerDoublets_ = nullptr; }; -#endif +#endif // RecoPixelVertexing_PixelTriplets_plugins_CAHitQuadrupletGeneratorGPU_h diff --git a/RecoPixelVertexing/PixelTriplets/plugins/gpuPixelDoublets.h b/RecoPixelVertexing/PixelTriplets/plugins/gpuPixelDoublets.h new file mode 100644 index 0000000000000..f09ae6aba5efb --- /dev/null +++ b/RecoPixelVertexing/PixelTriplets/plugins/gpuPixelDoublets.h @@ -0,0 +1,161 @@ +#ifndef RecoLocalTracker_SiPixelRecHits_plugins_gpuPixelDoublets_h +#define RecoLocalTracker_SiPixelRecHits_plugins_gpuPixelDouplets_h + +#include +#include +#include +#include +#include +#include + +#include "DataFormats/Math/interface/approx_atan2.h" +#include "RecoLocalTracker/SiPixelRecHits/plugins/siPixelRecHitsHeterogeneousProduct.h" + +namespace gpuPixelDoublets { + + __device__ + std::pair + findPhiLimits(int16_t phiMe, int16_t * iphi, uint16_t * index, uint16_t size, int16_t iphicut) { + + assert(iphicut>0); + + // find extreemes in top + int16_t minPhi = phiMe-iphicut; + int16_t maxPhi = phiMe+iphicut; + + // std::cout << "\n phi min/max " << phiMe << ' ' << minPhi << ' ' << maxPhi << std::endl; + + // guess and adjust + auto findLimit = [&](int16_t mPhi) { + int jm = float(0.5f*size)*(1.f+float(mPhi)/float(std::numeric_limits::max())); + // std::cout << "jm for " << mPhi << ' ' << jm << std::endl; + jm = std::min(size-1,std::max(0,jm)); + bool notDone=true; + while(jm>0 && mPhiiphi[index[++jm]]){} + jm = std::min(size-1,std::max(0,jm)); + return jm; + }; + + auto jmin = findLimit(minPhi); + auto jmax = findLimit(maxPhi); + + + /* + std::cout << "j min/max " << jmin << ' ' << jmax << std::endl; + std::cout << "found min/max " << iphi[index[jmin]] << ' ' << iphi[index[jmax]] << std::endl; + std::cout << "found min/max +1 " << iphi[index[jmin+1]] << ' ' << iphi[index[jmax+1]] << std::endl; + std::cout << "found min/max -1 " << iphi[index[jmin-1]] << ' ' << iphi[index[jmax-1]] << std::endl; + */ + + return std::make_pair(jmin,jmax); + } + + + __global__ + void getDoubletsFromSorted(int16_t * iphi, uint16_t * index, uint32_t * offsets, float phiCut) { + auto iphicut = phi2short(phiCut); + auto i = blockIdx.x*blockDim.x + threadIdx.x; + if (i>=offsets[9]) { + // get rid of last layer + return; + } + + assert(0==offsets[0]); + int top = (i>offsets[5]) ? 5: 0; + while (i>=offsets[++top]){}; + assert(top<10); + auto bottom = top-1; + if (bottom == 3 or bottom == 6) { + // do not have UP... (9 we got rid already) + return; + } + assert(i >= offsets[bottom]); + assert(i < offsets[top]); + + if (index[i]>= (offsets[top]-offsets[bottom])) { + printf("index problem: %d %d %d %d %d\n",i, offsets[top], offsets[bottom], offsets[top]-offsets[bottom], index[i]); + return; + } + + assert(index[i]::max()); + + auto jLimits = findPhiLimits(phiMe, iphi+offsets[top],index+offsets[top],size,iphicut); + + auto slidingWindow = [&](uint16_t mysize, uint16_t mymin,uint16_t mymax) { + auto topPhi = iphi+offsets[top]; + uint16_t imax = std::numeric_limits::max(); + uint16_t offset = (mymin>mymax) ? imax-(mysize-1) : 0; + int n=0; + for (uint16_t i = mymin+offset; i!=mymax; i++) { + assert(i<=imax); + uint16_t k = (i>mymax) ? i-offset : i; + assert(k=mymin || k2*iphicut && int16_t(phiMe-topPhi[k])>2*iphicut) + printf("deltaPhi problem: %d %d %d %d, deltas %d:%d cut %d\n",i,k,phiMe,topPhi[k],int16_t(topPhi[k]-phiMe),int16_t(phiMe-topPhi[k]),iphicut); + n++; + } + int tot = (mymin>mymax) ? (mysize-mymin)+mymax : mymax-mymin; + assert(n==tot); + }; + + slidingWindow(size,jLimits.first,jLimits.second); + } + + template + __device__ + void doubletsFromHisto(int16_t const * iphi, Hist const * hist, uint32_t const * offsets, float phiCut) { + auto iphicut = phi2short(phiCut); + auto i = blockIdx.x*blockDim.x + threadIdx.x; + if (i>=offsets[9]) { + // get rid of last layer + return; + } + + assert(0==offsets[0]); + int top = (i>offsets[5]) ? 5: 0; + while (i>=offsets[++top]){}; + assert(top<10); + auto bottom = top-1; + if (bottom==3 || bottom==6) { + // do not have UP... (9 we got rid already) + return; + } + assert(i>=offsets[bottom]); + assert(i iphicut) + continue; + ++tot; + } + } + if (0==hist[top].nspills) assert(tot>=nmin); + // look in spill bin as well.... + } + + __global__ + void getDoubletsFromHisto(siPixelRecHitsHeterogeneousProduct::HitsOnGPU const * hhp, float phiCut) { + auto const & hh = *hhp; + doubletsFromHisto(hh.iphi_d,hh.hist_d,hh.hitsLayerStart_d,phiCut); + } + +} // namespace end + +#endif // RecoLocalTracker_SiPixelRecHits_plugins_gpuPixelDouplets_h diff --git a/SimTracker/TrackerHitAssociation/plugins/BuildFile.xml b/SimTracker/TrackerHitAssociation/plugins/BuildFile.xml index 7cc02d9313e26..c767b1e68936a 100644 --- a/SimTracker/TrackerHitAssociation/plugins/BuildFile.xml +++ b/SimTracker/TrackerHitAssociation/plugins/BuildFile.xml @@ -1,5 +1,14 @@ + + + - + + + + + + + diff --git a/SimTracker/TrackerHitAssociation/plugins/ClusterSLOnGPU.cu b/SimTracker/TrackerHitAssociation/plugins/ClusterSLOnGPU.cu new file mode 100644 index 0000000000000..7a3e4eb83161d --- /dev/null +++ b/SimTracker/TrackerHitAssociation/plugins/ClusterSLOnGPU.cu @@ -0,0 +1,220 @@ +#include "ClusterSLOnGPU.h" + +// for the "packing" +#include "RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelRawToClusterGPUKernel.h" +#include "HeterogeneousCore/CUDAUtilities/interface/cudastdAlgorithm.h" +#include +#include +#include +#include + + +using ClusterSLGPU = trackerHitAssociationHeterogeneousProduct::ClusterSLGPU; + +__global__ +void simLink(clusterSLOnGPU::DigisOnGPU const * ddp, uint32_t ndigis, clusterSLOnGPU::HitsOnGPU const * hhp, ClusterSLGPU const * slp, uint32_t n) { + + assert(slp==slp->me_d); + + constexpr int32_t invTK = 0; // std::numeric_limits::max(); + + constexpr uint16_t InvId=9999; // must be > MaxNumModules + + auto const & dd = *ddp; + auto const & hh = *hhp; + auto const & sl = *slp; + auto i = blockIdx.x*blockDim.x + threadIdx.x; + + if (i>ndigis) return; + + auto id = dd.moduleInd_d[i]; + if (InvId==id) return; + assert(id<2000); + + auto ch = pixelgpudetails::pixelToChannel(dd.xx_d[i], dd.yy_d[i]); + auto first = hh.hitsModuleStart_d[id]; + auto cl = first + dd.clus_d[i]; + assert(cl<256*2000); + + const std::array me{{id,ch,0,0}}; + + auto less = [] __device__ __host__ (std::array const & a, std::array const & b)->bool { + return a[0] const & a, std::array const & b)->bool { + return a[0]==b[0] && a[1]==b[1]; // in this context we do not care of [2] + }; + + auto const * b = sl.links_d; + auto const * e = b+n; + + auto p = cuda_std::lower_bound(b,e,me,less); + int32_t j = p-sl.links_d; + assert(j>=0); + + auto getTK = [&](int i) { auto const & l = sl.links_d[i]; return l[2];}; + + j = std::min(int(j),int(n-1)); + if (equal(me,sl.links_d[j])) { + auto const itk = j; + auto const tk = getTK(j); + auto old = atomicCAS(&sl.tkId_d[cl],invTK,itk); + if (invTK==old || tk==getTK(old)) { + atomicAdd(&sl.n1_d[cl],1); +// sl.n1_d[cl] = tk; + } else { + auto old = atomicCAS(&sl.tkId2_d[cl],invTK,itk); + if (invTK==old || tk==getTK(old)) atomicAdd(&sl.n2_d[cl],1); + } +// if (92==tk) printf("TK3: %d %d %d %d: %d,%d ?%d?%d\n", j, cl, id, i, dd.xx_d[i], dd.yy_d[i], hh.mr_d[cl], hh.mc_d[cl]); + } + /* + else { + auto const & k=sl.links_d[j]; + auto const & kk = j+1nhits) return; + +// auto const & dd = *ddp; +// auto const & hh = *hhp; + auto const & sl = *slp; + + assert(sl.tkId_d[i]==0); + auto const & tk = sl.links_d[0]; + assert(tk[0]==0); + assert(tk[1]==0); + assert(tk[2]==0); + assert(tk[3]==0); + + // if (i==0) printf("xx_d gpu %x\n",dd.xx_d); + +} + + +__global__ +void dumpLink(int first, int ev, clusterSLOnGPU::HitsOnGPU const * hhp, uint32_t nhits, ClusterSLGPU const * slp) { + auto i = first + blockIdx.x*blockDim.x + threadIdx.x; + if (i>nhits) return; + + auto const & hh = *hhp; + auto const & sl = *slp; + + auto const & tk1 = sl.links_d[sl.tkId_d[i]]; + auto const & tk2 = sl.links_d[sl.tkId2_d[i]]; + + printf("HIT: %d %d %d %d %f %f %f %f %d %d %d %d %d %d %d\n",ev, i, + hh.detInd_d[i], hh.charge_d[i], + hh.xg_d[i],hh.yg_d[i],hh.zg_d[i],hh.rg_d[i],hh.iphi_d[i], + tk1[2],tk1[3],sl.n1_d[i], + tk2[2],tk2[3],sl.n2_d[i] + ); + +} + + + +namespace clusterSLOnGPU { + + constexpr uint32_t invTK = 0; // std::numeric_limits::max(); + + void printCSVHeader() { + printf("HIT: %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s\n", "ev", "ind", + "det", "charge", + "xg","yg","zg","rg","iphi", + "tkId","pt","n1","tkId2","pt2","n2" + ); + } + + + std::atomic evId(0); + std::once_flag doneCSVHeader; + + Kernel::Kernel(cuda::stream_t<>& stream, bool dump) : doDump(dump) { + if (doDump) std::call_once(doneCSVHeader,printCSVHeader); + alloc(stream); + } + + + void + Kernel::alloc(cuda::stream_t<>& stream) { + cudaCheck(cudaMalloc((void**) & slgpu.links_d,(ClusterSLGPU::MAX_DIGIS)*sizeof(std::array))); + + cudaCheck(cudaMalloc((void**) & slgpu.tkId_d,(ClusterSLGPU::MaxNumModules*256)*sizeof(uint32_t))); + cudaCheck(cudaMalloc((void**) & slgpu.tkId2_d,(ClusterSLGPU::MaxNumModules*256)*sizeof(uint32_t))); + cudaCheck(cudaMalloc((void**) & slgpu.n1_d,(ClusterSLGPU::MaxNumModules*256)*sizeof(uint32_t))); + cudaCheck(cudaMalloc((void**) & slgpu.n2_d,(ClusterSLGPU::MaxNumModules*256)*sizeof(uint32_t))); + + + cudaCheck(cudaMalloc((void**) & slgpu.me_d, sizeof(ClusterSLGPU))); + cudaCheck(cudaMemcpyAsync(slgpu.me_d, &slgpu, sizeof(ClusterSLGPU), cudaMemcpyDefault, stream.id())); + } + + void + Kernel::deAlloc() { + cudaCheck(cudaFree(slgpu.links_d)); + cudaCheck(cudaFree(slgpu.tkId_d)); + cudaCheck(cudaFree(slgpu.tkId2_d)); + cudaCheck(cudaFree(slgpu.n1_d)); + cudaCheck(cudaFree(slgpu.n2_d)); + cudaCheck(cudaFree(slgpu.me_d)); +} + + + void + Kernel::zero(cudaStream_t stream) { + cudaCheck(cudaMemsetAsync(slgpu.tkId_d,invTK,(ClusterSLGPU::MaxNumModules*256)*sizeof(uint32_t), stream)); + cudaCheck(cudaMemsetAsync(slgpu.tkId2_d,invTK,(ClusterSLGPU::MaxNumModules*256)*sizeof(uint32_t), stream)); + cudaCheck(cudaMemsetAsync(slgpu.n1_d,0,(ClusterSLGPU::MaxNumModules*256)*sizeof(uint32_t), stream)); + cudaCheck(cudaMemsetAsync(slgpu.n2_d,0,(ClusterSLGPU::MaxNumModules*256)*sizeof(uint32_t), stream)); + } + + + void + Kernel::algo(DigisOnGPU const & dd, uint32_t ndigis, HitsOnCPU const & hh, uint32_t nhits, uint32_t n, cuda::stream_t<>& stream) { + + /* + size_t pfs = 16*1024*1024; + // cudaDeviceSetLimit(cudaLimitPrintfFifoSize,pfs); + cudaDeviceGetLimit(&pfs,cudaLimitPrintfFifoSize); + std::cout << "cudaLimitPrintfFifoSize " << pfs << std::endl; + */ + + zero(stream.id()); + + ClusterSLGPU const & sl = slgpu; + + int ev = ++evId; + int threadsPerBlock = 256; + + int blocks = (nhits + threadsPerBlock - 1) / threadsPerBlock; + verifyZero<<>>(ev, dd.me_d, hh.gpu_d, nhits, sl.me_d); + + + blocks = (ndigis + threadsPerBlock - 1) / threadsPerBlock; + + assert(sl.me_d); + simLink<<>>(dd.me_d,ndigis, hh.gpu_d, sl.me_d,n); + + if (doDump) { + cudaStreamSynchronize(stream.id()); // flush previous printf + // one line == 200B so each kernel can print only 5K lines.... + blocks = 16; // (nhits + threadsPerBlock - 1) / threadsPerBlock; + for (int first=0; first>>(first, ev, hh.gpu_d, nhits, sl.me_d); + cudaStreamSynchronize(stream.id()); + } + } + cudaCheck(cudaGetLastError()); + + } + +} diff --git a/SimTracker/TrackerHitAssociation/plugins/ClusterSLOnGPU.h b/SimTracker/TrackerHitAssociation/plugins/ClusterSLOnGPU.h new file mode 100644 index 0000000000000..352337e783105 --- /dev/null +++ b/SimTracker/TrackerHitAssociation/plugins/ClusterSLOnGPU.h @@ -0,0 +1,44 @@ +#ifndef SimTrackerTrackerHitAssociationClusterSLOnGPU_H +#define SimTrackerTrackerHitAssociationClusterSLOnGPU_H + +#include +#include +#include "HeterogeneousCore/CUDAUtilities/interface/cudaCheck.h" + + +#include "trackerHitAssociationHeterogeneousProduct.h" + +#include "RecoLocalTracker/SiPixelClusterizer/plugins/siPixelRawToClusterHeterogeneousProduct.h" +#include "RecoLocalTracker/SiPixelRecHits/plugins/siPixelRecHitsHeterogeneousProduct.h" + + + + +namespace clusterSLOnGPU { + + using ClusterSLGPU = trackerHitAssociationHeterogeneousProduct::ClusterSLGPU; + using GPUProduct = trackerHitAssociationHeterogeneousProduct::GPUProduct; + + using DigisOnGPU = siPixelRawToClusterHeterogeneousProduct::GPUProduct; + using HitsOnGPU = siPixelRecHitsHeterogeneousProduct::HitsOnGPU; + using HitsOnCPU = siPixelRecHitsHeterogeneousProduct::HitsOnCPU; + + + class Kernel { + public: + Kernel(cuda::stream_t<>& stream, bool dump); + ~Kernel() {deAlloc();} + void algo(DigisOnGPU const & dd, uint32_t ndigis, HitsOnCPU const & hh, uint32_t nhits, uint32_t n, cuda::stream_t<>& stream); + GPUProduct getProduct() { return GPUProduct{slgpu.me_d};} + + private: + void alloc(cuda::stream_t<>& stream); + void deAlloc(); + void zero(cudaStream_t stream); + public: + ClusterSLGPU slgpu; + bool doDump; + }; +} + +#endif diff --git a/SimTracker/TrackerHitAssociation/plugins/ClusterTPAssociationHeterogeneous.cc b/SimTracker/TrackerHitAssociation/plugins/ClusterTPAssociationHeterogeneous.cc new file mode 100644 index 0000000000000..6cffed8ad0cd5 --- /dev/null +++ b/SimTracker/TrackerHitAssociation/plugins/ClusterTPAssociationHeterogeneous.cc @@ -0,0 +1,442 @@ +#include +#include +#include + +#include "FWCore/Framework/interface/Frameworkfwd.h" +#include "FWCore/Framework/interface/stream/EDProducer.h" +#include "FWCore/Framework/interface/Event.h" +#include "FWCore/Framework/interface/EventSetup.h" +#include "FWCore/Utilities/interface/InputTag.h" +#include "FWCore/Utilities/interface/EDGetToken.h" +#include "FWCore/ParameterSet/interface/ParameterSet.h" +#include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h" +#include "FWCore/ParameterSet/interface/ParameterSetDescription.h" + +#include "HeterogeneousCore/CUDACore/interface/GPUCuda.h" +#include "HeterogeneousCore/CUDAServices/interface/CUDAService.h" +#include "HeterogeneousCore/Producer/interface/HeterogeneousEDProducer.h" + + +#include "DataFormats/Common/interface/Handle.h" +#include "FWCore/Framework/interface/ESHandle.h" +#include "DataFormats/Common/interface/DetSetVector.h" +#include "DataFormats/Common/interface/DetSetVectorNew.h" +#include "DataFormats/DetId/interface/DetId.h" +#include "DataFormats/SiPixelDetId/interface/PixelChannelIdentifier.h" +#include "DataFormats/TrackerRecHit2D/interface/OmniClusterRef.h" +#include "DataFormats/SiPixelCluster/interface/SiPixelCluster.h" +#include "DataFormats/SiStripCluster/interface/SiStripCluster.h" +#include "DataFormats/Phase2TrackerCluster/interface/Phase2TrackerCluster1D.h" + +#include "SimDataFormats/Track/interface/SimTrackContainer.h" +#include "SimDataFormats/TrackerDigiSimLink/interface/StripDigiSimLink.h" +#include "SimDataFormats/TrackerDigiSimLink/interface/PixelDigiSimLink.h" +#include "DataFormats/Phase2TrackerDigi/interface/Phase2TrackerDigi.h" +#include "SimDataFormats/TrackingAnalysis/interface/TrackingParticle.h" +#include "SimDataFormats/TrackingAnalysis/interface/TrackingParticleFwd.h" +#include "SimTracker/TrackerHitAssociation/interface/ClusterTPAssociation.h" + +#include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h" +#include "Geometry/Records/interface/TrackerDigiGeometryRecord.h" + + +// gpu +#include "RecoLocalTracker/SiPixelClusterizer/plugins/siPixelRawToClusterHeterogeneousProduct.h" +#include "RecoLocalTracker/SiPixelRecHits/plugins/siPixelRecHitsHeterogeneousProduct.h" + +#include +#include "HeterogeneousCore/CUDAUtilities/interface/cudaCheck.h" +#include "ClusterSLOnGPU.h" + +class ClusterTPAssociationHeterogeneous : public HeterogeneousEDProducer> +{ +public: + typedef std::vector OmniClusterCollection; + + using ClusterSLGPU = trackerHitAssociationHeterogeneousProduct::ClusterSLGPU; + using GPUProduct = trackerHitAssociationHeterogeneousProduct::GPUProduct; + using CPUProduct = trackerHitAssociationHeterogeneousProduct::CPUProduct; + using Output = trackerHitAssociationHeterogeneousProduct::ClusterTPAHeterogeneousProduct; + + using PixelDigiClustersH = siPixelRawToClusterHeterogeneousProduct::HeterogeneousDigiCluster; + using PixelRecHitsH = siPixelRecHitsHeterogeneousProduct::HeterogeneousPixelRecHit; + + explicit ClusterTPAssociationHeterogeneous(const edm::ParameterSet&); + ~ClusterTPAssociationHeterogeneous() = default; + + static void fillDescriptions(edm::ConfigurationDescriptions& descriptions); + +private: + + void beginStreamGPUCuda(edm::StreamID streamId, + cuda::stream_t<> &cudaStream) override; + + void acquireGPUCuda(const edm::HeterogeneousEvent &iEvent, + const edm::EventSetup &iSetup, + cuda::stream_t<> &cudaStream) override; + void produceGPUCuda(edm::HeterogeneousEvent &iEvent, + const edm::EventSetup &iSetup, + cuda::stream_t<> &cudaStream) override; + void produceCPU(edm::HeterogeneousEvent &iEvent, + const edm::EventSetup &iSetup) override; + + void makeMap(const edm::HeterogeneousEvent &iEvent); + std::unique_ptr produceLegacy(edm::HeterogeneousEvent &iEvent, const edm::EventSetup& es); + + template + std::vector > + getSimTrackId(const edm::Handle >& simLinks, const DetId& detId, uint32_t channel) const; + + edm::EDGetTokenT > sipixelSimLinksToken_; + edm::EDGetTokenT > sistripSimLinksToken_; + edm::EDGetTokenT > siphase2OTSimLinksToken_; + edm::EDGetTokenT > pixelClustersToken_; + edm::EDGetTokenT > stripClustersToken_; + edm::EDGetTokenT > phase2OTClustersToken_; + edm::EDGetTokenT trackingParticleToken_; + + edm::EDGetTokenT tGpuDigis; + edm::EDGetTokenT tGpuHits; + + std::unique_ptr gpuAlgo; + + std::map, TrackingParticleRef> mapping; + + std::vector> digi2tp; + + bool doDump; + +}; + +ClusterTPAssociationHeterogeneous::ClusterTPAssociationHeterogeneous(const edm::ParameterSet & cfg) + : HeterogeneousEDProducer(cfg), + sipixelSimLinksToken_(consumes >(cfg.getParameter("pixelSimLinkSrc"))), + sistripSimLinksToken_(consumes >(cfg.getParameter("stripSimLinkSrc"))), + siphase2OTSimLinksToken_(consumes >(cfg.getParameter("phase2OTSimLinkSrc"))), + pixelClustersToken_(consumes >(cfg.getParameter("pixelClusterSrc"))), + stripClustersToken_(consumes >(cfg.getParameter("stripClusterSrc"))), + phase2OTClustersToken_(consumes >(cfg.getParameter("phase2OTClusterSrc"))), + trackingParticleToken_(consumes(cfg.getParameter("trackingParticleSrc"))), + tGpuDigis(consumesHeterogeneous(cfg.getParameter("heterogeneousPixelDigiClusterSrc"))), + tGpuHits(consumesHeterogeneous(cfg.getParameter("heterogeneousPixelRecHitSrc"))), + doDump(cfg.getParameter("dumpCSV")) +{ + produces(); +} + +void ClusterTPAssociationHeterogeneous::fillDescriptions(edm::ConfigurationDescriptions& descriptions) { + edm::ParameterSetDescription desc; + desc.add("simTrackSrc", edm::InputTag("g4SimHits")); + desc.add("pixelSimLinkSrc", edm::InputTag("simSiPixelDigis")); + desc.add("stripSimLinkSrc", edm::InputTag("simSiStripDigis")); + desc.add("phase2OTSimLinkSrc", edm::InputTag("simSiPixelDigis","Tracker")); + desc.add("pixelClusterSrc", edm::InputTag("siPixelClusters")); + desc.add("stripClusterSrc", edm::InputTag("siStripClusters")); + desc.add("phase2OTClusterSrc", edm::InputTag("siPhase2Clusters")); + desc.add("trackingParticleSrc", edm::InputTag("mix", "MergedTrackTruth")); + desc.add("heterogeneousPixelDigiClusterSrc", edm::InputTag("siPixelClustersHeterogeneous")); + desc.add("heterogeneousPixelRecHitSrc", edm::InputTag("siPixelRecHitHeterogeneous")); + + desc.add("dumpCSV",false); + + HeterogeneousEDProducer::fillPSetDescription(desc); + + descriptions.add("tpClusterProducerHeterogeneousDefault", desc); +} + + +void ClusterTPAssociationHeterogeneous::beginStreamGPUCuda(edm::StreamID streamId, + cuda::stream_t<> &cudaStream) { + + gpuAlgo = std::make_unique(cudaStream,doDump); + +} + +void ClusterTPAssociationHeterogeneous::makeMap(const edm::HeterogeneousEvent &iEvent) { + // TrackingParticle + edm::Handle TPCollectionH; + iEvent.getByToken(trackingParticleToken_,TPCollectionH); + + + // prepare temporary map between SimTrackId and TrackingParticle index + mapping.clear(); + for (TrackingParticleCollection::size_type itp = 0; + itp < TPCollectionH.product()->size(); ++itp) { + TrackingParticleRef trackingParticle(TPCollectionH, itp); + + // SimTracks inside TrackingParticle + EncodedEventId eid(trackingParticle->eventId()); + for (auto itrk = trackingParticle->g4Track_begin(); + itrk != trackingParticle->g4Track_end(); ++itrk) { + std::pair trkid(itrk->trackId(), eid); + //std::cout << "creating map for id: " << trkid.first << " with tp: " << trackingParticle.key() << std::endl; + mapping.insert(std::make_pair(trkid, trackingParticle)); + } + } + + +} + + +void ClusterTPAssociationHeterogeneous::acquireGPUCuda(const edm::HeterogeneousEvent &iEvent, + const edm::EventSetup &iSetup, + cuda::stream_t<> &cudaStream) { + + edm::ESHandle geom; + iSetup.get().get( geom ); + + // Pixel DigiSimLink + edm::Handle > sipixelSimLinks; + // iEvent.getByLabel(_pixelSimLinkSrc, sipixelSimLinks); + iEvent.getByToken(sipixelSimLinksToken_,sipixelSimLinks); + + // TrackingParticle + edm::Handle TPCollectionH; + iEvent.getByToken(trackingParticleToken_,TPCollectionH); + + makeMap(iEvent); + + // gpu stuff ------------------------ + + // std::cout << "In tpsimlink " << mapping.size() << std::endl; + + edm::Handle gd; + edm::Handle gh; + iEvent.getByToken(tGpuDigis, gd); + iEvent.getByToken(tGpuHits, gh); + auto const & gDigis = *gd; + auto const & gHits = *gh; + auto ndigis = gDigis.nDigis; + auto nhits = gHits.nHits; + + uint32_t nn=0, ng=0, ng10=0; + digi2tp.clear(); + {std::array a{{0,0,0,0}}; digi2tp.push_back(a);} // put at 0 0 + for (auto const & links : *sipixelSimLinks) { + DetId detId(links.detId()); + const GeomDetUnit * genericDet = geom->idToDetUnit(detId); + uint32_t gind = genericDet->index(); + for (auto const & link : links) { + ++ng; + if (link.fraction() > 0.3f) ++ng10; + if (link.fraction() < 0.5f) continue; + auto tkid = std::make_pair(link.SimTrackId(), link.eventId()); + auto ipos = mapping.find(tkid); + if (ipos != mapping.end()) { + uint32_t pt = 1000*(*ipos).second->pt(); + ++nn; + std::array a{{gind,uint32_t(link.channel()),(*ipos).second.key(),pt}}; + digi2tp.push_back(a); + } + } + } + std::sort(digi2tp.begin(),digi2tp.end()); + + // std::cout << "In tpsimlink found " << nn << " valid link out of " << ng << '/' << ng10 << ' ' << digi2tp.size() << std::endl; + + cudaCheck(cudaMemcpyAsync(gpuAlgo->slgpu.links_d, digi2tp.data(), sizeof(std::array)*digi2tp.size(), cudaMemcpyDefault, cudaStream.id())); + gpuAlgo->algo(gDigis, ndigis, gHits, nhits, digi2tp.size(),cudaStream); + + // end gpu stuff --------------------- + + +} + +void ClusterTPAssociationHeterogeneous::produceGPUCuda(edm::HeterogeneousEvent &iEvent, + const edm::EventSetup &iSetup, + cuda::stream_t<> &cudaStream) { + + auto output = std::make_unique(gpuAlgo->getProduct()); + + auto legacy = produceLegacy(iEvent,iSetup).release(); + + iEvent.put(std::move(output), [legacy](const GPUProduct& hits, CPUProduct& cpu) { + cpu = *legacy; delete legacy; + }); + +} + + +void ClusterTPAssociationHeterogeneous::produceCPU(edm::HeterogeneousEvent &iEvent, const edm::EventSetup& es) { + + makeMap(iEvent); + iEvent.put(std::move(produceLegacy(iEvent,es))); + +} + +std::unique_ptr +ClusterTPAssociationHeterogeneous::produceLegacy(edm::HeterogeneousEvent &iEvent, const edm::EventSetup& es) { + + + // Pixel DigiSimLink + edm::Handle > sipixelSimLinks; + // iEvent.getByLabel(_pixelSimLinkSrc, sipixelSimLinks); + iEvent.getByToken(sipixelSimLinksToken_,sipixelSimLinks); + + // SiStrip DigiSimLink + edm::Handle > sistripSimLinks; + iEvent.getByToken(sistripSimLinksToken_,sistripSimLinks); + + // Phase2 OT DigiSimLink + edm::Handle > siphase2OTSimLinks; + iEvent.getByToken(siphase2OTSimLinksToken_, siphase2OTSimLinks); + + // Pixel Cluster + edm::Handle > pixelClusters; + bool foundPixelClusters = iEvent.getByToken(pixelClustersToken_,pixelClusters); + + // Strip Cluster + edm::Handle > stripClusters; + bool foundStripClusters = iEvent.getByToken(stripClustersToken_,stripClusters); + + // Phase2 Cluster + edm::Handle > phase2OTClusters; + bool foundPhase2OTClusters = iEvent.getByToken(phase2OTClustersToken_, phase2OTClusters); + + // TrackingParticle + edm::Handle TPCollectionH; + iEvent.getByToken(trackingParticleToken_,TPCollectionH); + + auto output = std::make_unique(TPCollectionH); + auto & clusterTPList = output->collection; + + if ( foundPixelClusters ) { + // Pixel Clusters + for (edmNew::DetSetVector::const_iterator iter = pixelClusters->begin(); + iter != pixelClusters->end(); ++iter) { + uint32_t detid = iter->id(); + DetId detId(detid); + edmNew::DetSet link_pixel = (*iter); + for (edmNew::DetSet::const_iterator di = link_pixel.begin(); + di != link_pixel.end(); ++di) { + const SiPixelCluster& cluster = (*di); + edm::Ref, SiPixelCluster> c_ref = + edmNew::makeRefTo(pixelClusters, di); + + std::set > simTkIds; + for (int irow = cluster.minPixelRow(); irow <= cluster.maxPixelRow(); ++irow) { + for (int icol = cluster.minPixelCol(); icol <= cluster.maxPixelCol(); ++icol) { + uint32_t channel = PixelChannelIdentifier::pixelToChannel(irow, icol); + std::vector > trkid(getSimTrackId(sipixelSimLinks, detId, channel)); + if (trkid.empty()) continue; + simTkIds.insert(trkid.begin(),trkid.end()); + } + } + for (std::set >::const_iterator iset = simTkIds.begin(); + iset != simTkIds.end(); iset++) { + auto ipos = mapping.find(*iset); + if (ipos != mapping.end()) { + //std::cout << "cluster in detid: " << detid << " from tp: " << ipos->second.key() << " " << iset->first << std::endl; + clusterTPList.emplace_back(OmniClusterRef(c_ref), ipos->second); + } + } + } + } + } + + if ( foundStripClusters ) { + // Strip Clusters + for (edmNew::DetSetVector::const_iterator iter = stripClusters->begin(false), eter = stripClusters->end(false); + iter != eter; ++iter) { + if (!(*iter).isValid()) continue; + uint32_t detid = iter->id(); + DetId detId(detid); + edmNew::DetSet link_strip = (*iter); + for (edmNew::DetSet::const_iterator di = link_strip.begin(); + di != link_strip.end(); di++) { + const SiStripCluster& cluster = (*di); + edm::Ref, SiStripCluster> c_ref = + edmNew::makeRefTo(stripClusters, di); + + std::set > simTkIds; + int first = cluster.firstStrip(); + int last = first + cluster.amplitudes().size(); + + for (int istr = first; istr < last; ++istr) { + std::vector > trkid(getSimTrackId(sistripSimLinks, detId, istr)); + if (trkid.empty()) continue; + simTkIds.insert(trkid.begin(),trkid.end()); + } + for (std::set >::const_iterator iset = simTkIds.begin(); + iset != simTkIds.end(); iset++) { + auto ipos = mapping.find(*iset); + if (ipos != mapping.end()) { + //std::cout << "cluster in detid: " << detid << " from tp: " << ipos->second.key() << " " << iset->first << std::endl; + clusterTPList.emplace_back(OmniClusterRef(c_ref), ipos->second); + } + } + } + } + } + + if ( foundPhase2OTClusters ) { + + // Phase2 Clusters + if(phase2OTClusters.isValid()){ + for (edmNew::DetSetVector::const_iterator iter = phase2OTClusters->begin(false), eter = phase2OTClusters->end(false); + iter != eter; ++iter) { + if (!(*iter).isValid()) continue; + uint32_t detid = iter->id(); + DetId detId(detid); + edmNew::DetSet link_phase2 = (*iter); + for (edmNew::DetSet::const_iterator di = link_phase2.begin(); + di != link_phase2.end(); di++) { + const Phase2TrackerCluster1D& cluster = (*di); + edm::Ref, Phase2TrackerCluster1D> c_ref = + edmNew::makeRefTo(phase2OTClusters, di); + + std::set > simTkIds; + + for (unsigned int istr(0); istr < cluster.size(); ++istr) { + uint32_t channel = Phase2TrackerDigi::pixelToChannel(cluster.firstRow() + istr, cluster.column()); + std::vector > trkid(getSimTrackId(siphase2OTSimLinks, detId, channel)); + if (trkid.empty()) continue; + simTkIds.insert(trkid.begin(),trkid.end()); + } + + for (std::set >::const_iterator iset = simTkIds.begin(); + iset != simTkIds.end(); iset++) { + auto ipos = mapping.find(*iset); + if (ipos != mapping.end()) { + clusterTPList.emplace_back(OmniClusterRef(c_ref), ipos->second); + } + } + } + } + } + + } + + + clusterTPList.sortAndUnique(); + + return output; + mapping.clear(); +} + +template +std::vector > +//std::pair +ClusterTPAssociationHeterogeneous::getSimTrackId(const edm::Handle >& simLinks, + const DetId& detId, uint32_t channel) const +{ + //std::pair simTrkId; + std::vector > simTrkId; + auto isearch = simLinks->find(detId); + if (isearch != simLinks->end()) { + // Loop over DigiSimLink in this det unit + edm::DetSet link_detset = (*isearch); + for (typename edm::DetSet::const_iterator it = link_detset.data.begin(); + it != link_detset.data.end(); ++it) { + if (channel == it->channel()) { + simTrkId.push_back(std::make_pair(it->SimTrackId(), it->eventId())); + } + } + } + return simTrkId; +} +#include "FWCore/PluginManager/interface/ModuleDef.h" +#include "FWCore/Framework/interface/MakerMacros.h" + +DEFINE_FWK_MODULE(ClusterTPAssociationHeterogeneous); diff --git a/SimTracker/TrackerHitAssociation/plugins/ClusterTPAssociationHeterogeneousConverter.cc b/SimTracker/TrackerHitAssociation/plugins/ClusterTPAssociationHeterogeneousConverter.cc new file mode 100644 index 0000000000000..d8b9e099c3474 --- /dev/null +++ b/SimTracker/TrackerHitAssociation/plugins/ClusterTPAssociationHeterogeneousConverter.cc @@ -0,0 +1,59 @@ +#include "FWCore/Framework/interface/Event.h" +#include "FWCore/Framework/interface/MakerMacros.h" +#include "FWCore/Framework/interface/global/EDProducer.h" +#include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h" +#include "FWCore/ParameterSet/interface/ParameterSetDescription.h" +#include "FWCore/ParameterSet/interface/ParameterSet.h" +#include "HeterogeneousCore/Product/interface/HeterogeneousProduct.h" + +#include "trackerHitAssociationHeterogeneousProduct.h" + + +class ClusterTPAssociationHeterogeneousConverter: public edm::global::EDProducer<> { +public: + + using Input = trackerHitAssociationHeterogeneousProduct::ClusterTPAHeterogeneousProduct; + using Product = ClusterTPAssociation; + + explicit ClusterTPAssociationHeterogeneousConverter(edm::ParameterSet const& iConfig); + ~ClusterTPAssociationHeterogeneousConverter() = default; + + static void fillDescriptions(edm::ConfigurationDescriptions& descriptions); + +private: + void produce(edm::StreamID, edm::Event& iEvent, const edm::EventSetup& iSetup) const override; + + edm::EDGetTokenT token_; +}; + +ClusterTPAssociationHeterogeneousConverter::ClusterTPAssociationHeterogeneousConverter(edm::ParameterSet const& iConfig): + token_(consumes(iConfig.getParameter("src"))) +{ + produces(); +} + +void ClusterTPAssociationHeterogeneousConverter::fillDescriptions(edm::ConfigurationDescriptions& descriptions) { + edm::ParameterSetDescription desc; + desc.add("src", edm::InputTag("tpClusterProducerHeterogeneos")); + + descriptions.add("tpClusterHeterogeneousConverter",desc); +} + +namespace { + template + auto copy_unique(const T& t) { + return std::make_unique(t); + } +} + +void ClusterTPAssociationHeterogeneousConverter::produce(edm::StreamID, edm::Event& iEvent, const edm::EventSetup& iSetup) const { + edm::Handle hinput; + iEvent.getByToken(token_, hinput); + + const auto& input = hinput->get().getProduct(); + + iEvent.put(copy_unique(input.collection)); +} + + +DEFINE_FWK_MODULE(ClusterTPAssociationHeterogeneousConverter); diff --git a/SimTracker/TrackerHitAssociation/plugins/trackerHitAssociationHeterogeneousProduct.h b/SimTracker/TrackerHitAssociation/plugins/trackerHitAssociationHeterogeneousProduct.h new file mode 100644 index 0000000000000..c3f86ddf855c8 --- /dev/null +++ b/SimTracker/TrackerHitAssociation/plugins/trackerHitAssociationHeterogeneousProduct.h @@ -0,0 +1,47 @@ +#ifndef SimTrackerTrackerHitAssociationClusterHeterogeneousProduct_H +#define SimTrackerTrackerHitAssociationClusterHeterogeneousProduct_H + +#ifndef __CUDACC__ +#include "SimTracker/TrackerHitAssociation/interface/ClusterTPAssociation.h" +#endif + +#include "HeterogeneousCore/Product/interface/HeterogeneousProduct.h" + + +namespace trackerHitAssociationHeterogeneousProduct { + +#ifndef __CUDACC__ + struct CPUProduct { + CPUProduct() = default; + template + explicit CPUProduct(T const & t) : collection(t){} + ClusterTPAssociation collection; + }; +#endif + + struct ClusterSLGPU { + + ClusterSLGPU * me_d=nullptr; + std::array * links_d; + uint32_t * tkId_d; + uint32_t * tkId2_d; + uint32_t * n1_d; + uint32_t * n2_d; + + static constexpr uint32_t MAX_DIGIS = 2000*150; + static constexpr uint32_t MaxNumModules = 2000; + + }; + + struct GPUProduct { + ClusterSLGPU * gpu_d=nullptr; + }; + +#ifndef __CUDACC__ + using ClusterTPAHeterogeneousProduct = HeterogeneousProductImpl, + heterogeneous::GPUCudaProduct >; +#endif + +} + +#endif diff --git a/SimTracker/TrackerHitAssociation/python/tpClusterProducer_cfi.py b/SimTracker/TrackerHitAssociation/python/tpClusterProducer_cfi.py index 8757a67226fb8..e8330c074dfac 100644 --- a/SimTracker/TrackerHitAssociation/python/tpClusterProducer_cfi.py +++ b/SimTracker/TrackerHitAssociation/python/tpClusterProducer_cfi.py @@ -1,4 +1,5 @@ import FWCore.ParameterSet.Config as cms +from Configuration.ProcessModifiers.gpu_cff import gpu from SimTracker.TrackerHitAssociation.tpClusterProducerDefault_cfi import tpClusterProducerDefault as _tpClusterProducerDefault @@ -18,3 +19,12 @@ stripSimLinkSrc = "mixData:StripDigiSimLink", phase2OTSimLinkSrc = "mixData:Phase2OTDigiSimLink", ) + + +from SimTracker.TrackerHitAssociation.tpClusterProducerHeterogeneousDefault_cfi import tpClusterProducerHeterogeneousDefault as _tpClusterProducerHeterogeneous +tpClusterProducerHeterogeneous = _tpClusterProducerHeterogeneous.clone() + +from SimTracker.TrackerHitAssociation.tpClusterHeterogeneousConverter_cfi import tpClusterHeterogeneousConverter as _tpHeterogeneousConverter + +gpu.toReplaceWith(tpClusterProducer, _tpHeterogeneousConverter.clone()) + diff --git a/Validation/RecoTrack/python/TrackValidation_cff.py b/Validation/RecoTrack/python/TrackValidation_cff.py index b6251473fcab4..dff571862bb46 100644 --- a/Validation/RecoTrack/python/TrackValidation_cff.py +++ b/Validation/RecoTrack/python/TrackValidation_cff.py @@ -709,9 +709,14 @@ def _uniqueFirstLayers(layerList): ### Pixel tracking only mode (placeholder for now) -tpClusterProducerPixelTrackingOnly = tpClusterProducer.clone( - pixelClusterSrc = "siPixelClustersPreSplitting" + +tpClusterProducerHeterogeneousPixelTrackingOnly = tpClusterProducerHeterogeneous.clone( + pixelClusterSrc = "siPixelClustersPreSplitting" ) +tpClusterProducerPixelTrackingOnly = tpClusterProducer.clone() +# Need to use the modifier to customize because the exact EDProducer type depends on the modifier +gpu.toModify(tpClusterProducerPixelTrackingOnly, src = "tpClusterProducerHeterogeneousPixelTrackingOnly") + quickTrackAssociatorByHitsPixelTrackingOnly = quickTrackAssociatorByHits.clone( cluster2TPSrc = "tpClusterProducerPixelTrackingOnly" ) @@ -739,12 +744,18 @@ def _uniqueFirstLayers(layerList): tracksValidationTruthPixelTrackingOnly.replace(quickTrackAssociatorByHits, quickTrackAssociatorByHitsPixelTrackingOnly) tracksValidationTruthPixelTrackingOnly.replace(trackingParticleRecoTrackAsssociation, trackingParticlePixelTrackAsssociation) tracksValidationTruthPixelTrackingOnly.replace(VertexAssociatorByPositionAndTracks, PixelVertexAssociatorByPositionAndTracks) + +_tracksValidationTruthPixelTrackingOnlyGPU = tracksValidationTruthPixelTrackingOnly.copy() +_tracksValidationTruthPixelTrackingOnlyGPU.insert(0, tpClusterProducerHeterogeneousPixelTrackingOnly) +gpu.toReplaceWith(tracksValidationTruthPixelTrackingOnly, _tracksValidationTruthPixelTrackingOnlyGPU) + tracksValidationPixelTrackingOnly = cms.Sequence( tracksValidationTruthPixelTrackingOnly + trackValidatorPixelTrackingOnly ) + ### Lite mode (only generalTracks and HP) trackValidatorLite = trackValidator.clone( label = ["generalTracks", "cutsRecoTracksHp"] diff --git a/Validation/RecoTrack/python/associators_cff.py b/Validation/RecoTrack/python/associators_cff.py index 73c6f416e509c..8c2c8b7c7c85e 100644 --- a/Validation/RecoTrack/python/associators_cff.py +++ b/Validation/RecoTrack/python/associators_cff.py @@ -3,7 +3,8 @@ #### TrackAssociation import SimTracker.TrackAssociatorProducers.quickTrackAssociatorByHits_cfi import SimTracker.TrackAssociatorProducers.trackAssociatorByPosition_cfi -from SimTracker.TrackerHitAssociation.tpClusterProducer_cfi import tpClusterProducer as _tpClusterProducer +# from SimTracker.TrackerHitAssociation.tpClusterProducer_cfi import tpClusterProducer as _tpClusterProducer +from SimTracker.TrackerHitAssociation.tpClusterProducer_cfi import tpClusterProducerHeterogeneous as _tpClusterProducer from SimTracker.TrackAssociation.trackingParticleRecoTrackAsssociation_cfi import trackingParticleRecoTrackAsssociation as _trackingParticleRecoTrackAsssociation hltTPClusterProducer = _tpClusterProducer.clone( From a8d41ef9c37e8563ec7ff03ba6ae5c01af86986b Mon Sep 17 00:00:00 2001 From: Andrea Bocci Date: Tue, 31 Jul 2018 19:28:09 +0200 Subject: [PATCH 82/88] Fix the NVProfilerService crash(es) (#110) NVProfilerService: - take into account the proper number of modules: increment by one pathsAndConsumes.allModules().size(), because it does not include the "source" module; - add asserts to check that all ranges are properly closed. CUDAService: - rewrite to use the CUDA runtime API; - fix the possible race condition in the destructor. --- .../CUDAServices/plugins/NVProfilerService.cc | 154 ++++++++---------- .../CUDAServices/src/CUDAService.cc | 63 +++---- 2 files changed, 91 insertions(+), 126 deletions(-) diff --git a/HeterogeneousCore/CUDAServices/plugins/NVProfilerService.cc b/HeterogeneousCore/CUDAServices/plugins/NVProfilerService.cc index 1f3ad644288c2..e1fa8044c9233 100644 --- a/HeterogeneousCore/CUDAServices/plugins/NVProfilerService.cc +++ b/HeterogeneousCore/CUDAServices/plugins/NVProfilerService.cc @@ -9,8 +9,8 @@ #include #include -#include #include +#include #include @@ -120,6 +120,8 @@ namespace { nvtxLightAmber = 0x00fff2cc, nvtxWhite = 0x00ffffff }; + + constexpr nvtxRangeId_t nvtxInvalidRangeId = 0xfffffffffffffffful; } class NVProfilerService { @@ -275,7 +277,17 @@ class NVProfilerService { void postEventReadFromSource(edm::StreamContext const&, edm::ModuleCallingContext const&); private: - bool highlight(std::string const&); + bool highlight(std::string const& label) const { + return (std::binary_search(highlightModules_.begin(), highlightModules_.end(), label)); + } + + uint32_t labelColor(std::string const& label) const { + return highlight(label) ? nvtxAmber : nvtxGreen; + } + + uint32_t labelColorLight(std::string const& label) const { + return highlight(label) ? nvtxLightAmber : nvtxLightGreen; + } std::vector highlightModules_; bool showModulePrefetching_; @@ -490,11 +502,6 @@ NVProfilerService::~NVProfilerService() { cudaProfilerStop(); } -bool -NVProfilerService::highlight(std::string const& label) { - return (std::binary_search(highlightModules_.begin(), highlightModules_.end(), label)); -} - void NVProfilerService::fillDescriptions(edm::ConfigurationDescriptions & descriptions) { edm::ParameterSetDescription desc; @@ -530,10 +537,11 @@ NVProfilerService::preBeginJob(edm::PathsAndConsumesOfModulesBase const& pathsAn nvtxDomainMark(global_domain(), "preBeginJob"); // FIXME this probably works only in the absence of subprocesses - unsigned int modules = pathsAndConsumes.allModules().size(); - global_modules_.resize(modules); + // size() + 1 because pathsAndConsumes.allModules() does not include the source + unsigned int modules = pathsAndConsumes.allModules().size() + 1; + global_modules_.resize(modules, nvtxInvalidRangeId); for (unsigned int sid = 0; sid < concurrentStreams_; ++sid) { - stream_modules_[sid].resize(modules); + stream_modules_[sid].resize(modules, nvtxInvalidRangeId); } } @@ -603,10 +611,8 @@ NVProfilerService::preModuleBeginStream(edm::StreamContext const& sc, edm::Modul auto mid = mcc.moduleDescription()->id(); auto const & label = mcc.moduleDescription()->moduleLabel(); auto const & msg = label + " begin stream"; - if (highlight(label)) - stream_modules_[sid][mid] = nvtxDomainRangeStartColor(stream_domain(sid), msg.c_str(), nvtxAmber); - else - stream_modules_[sid][mid] = nvtxDomainRangeStartColor(stream_domain(sid), msg.c_str(), nvtxGreen);; + assert(stream_modules_[sid][mid] == nvtxInvalidRangeId); + stream_modules_[sid][mid] = nvtxDomainRangeStartColor(stream_domain(sid), msg.c_str(), labelColor(label)); } void @@ -614,6 +620,7 @@ NVProfilerService::postModuleBeginStream(edm::StreamContext const& sc, edm::Modu auto sid = sc.streamID(); auto mid = mcc.moduleDescription()->id(); nvtxDomainRangeEnd(stream_domain(sid), stream_modules_[sid][mid]); + stream_modules_[sid][mid] = nvtxInvalidRangeId; } void @@ -622,10 +629,8 @@ NVProfilerService::preModuleEndStream(edm::StreamContext const& sc, edm::ModuleC auto mid = mcc.moduleDescription()->id(); auto const & label = mcc.moduleDescription()->moduleLabel(); auto const & msg = label + " end stream"; - if (highlight(label)) - stream_modules_[sid][mid] = nvtxDomainRangeStartColor(stream_domain(sid), msg.c_str(), nvtxAmber); - else - stream_modules_[sid][mid] = nvtxDomainRangeStartColor(stream_domain(sid), msg.c_str(), nvtxGreen);; + assert(stream_modules_[sid][mid] == nvtxInvalidRangeId); + stream_modules_[sid][mid] = nvtxDomainRangeStartColor(stream_domain(sid), msg.c_str(), labelColor(label)); } void @@ -633,6 +638,7 @@ NVProfilerService::postModuleEndStream(edm::StreamContext const& sc, edm::Module auto sid = sc.streamID(); auto mid = mcc.moduleDescription()->id(); nvtxDomainRangeEnd(stream_domain(sid), stream_modules_[sid][mid]); + stream_modules_[sid][mid] = nvtxInvalidRangeId; } void @@ -733,6 +739,7 @@ void NVProfilerService::postEvent(edm::StreamContext const& sc) { auto sid = sc.streamID(); nvtxDomainRangeEnd(stream_domain(sid), event_[sid]); + event_[sid] = nvtxInvalidRangeId; } void @@ -754,10 +761,8 @@ NVProfilerService::preModuleEventPrefetching(edm::StreamContext const& sc, edm:: auto mid = mcc.moduleDescription()->id(); auto const & label = mcc.moduleDescription()->moduleLabel(); auto const & msg = label + " prefetching"; - if (highlight(label)) - stream_modules_[sid][mid] = nvtxDomainRangeStartColor(stream_domain(sid), msg.c_str(), nvtxLightAmber); - else - stream_modules_[sid][mid] = nvtxDomainRangeStartColor(stream_domain(sid), msg.c_str(), nvtxLightGreen); + assert(stream_modules_[sid][mid] == nvtxInvalidRangeId); + stream_modules_[sid][mid] = nvtxDomainRangeStartColor(stream_domain(sid), msg.c_str(), labelColorLight(label)); } } @@ -767,6 +772,7 @@ NVProfilerService::postModuleEventPrefetching(edm::StreamContext const& sc, edm: auto sid = sc.streamID(); auto mid = mcc.moduleDescription()->id(); nvtxDomainRangeEnd(stream_domain(sid), stream_modules_[sid][mid]); + stream_modules_[sid][mid] = nvtxInvalidRangeId; } } @@ -776,16 +782,14 @@ NVProfilerService::preModuleConstruction(edm::ModuleDescription const& desc) { global_modules_.grow_to_at_least(mid+1); auto const & label = desc.moduleLabel(); auto const & msg = label + " construction"; - if (highlight(label)) - global_modules_[mid] = nvtxDomainRangeStartColor(global_domain(), msg.c_str(), nvtxAmber); - else - global_modules_[mid] = nvtxDomainRangeStartColor(global_domain(), msg.c_str(), nvtxGreen);; + global_modules_[mid] = nvtxDomainRangeStartColor(global_domain(), msg.c_str(), labelColor(label)); } void NVProfilerService::postModuleConstruction(edm::ModuleDescription const& desc) { auto mid = desc.id(); nvtxDomainRangeEnd(global_domain(), global_modules_[mid]); + global_modules_[mid] = nvtxInvalidRangeId; } void @@ -793,16 +797,14 @@ NVProfilerService::preModuleBeginJob(edm::ModuleDescription const& desc) { auto mid = desc.id(); auto const & label = desc.moduleLabel(); auto const & msg = label + " begin job"; - if (highlight(label)) - global_modules_[mid] = nvtxDomainRangeStartColor(global_domain(), msg.c_str(), nvtxAmber); - else - global_modules_[mid] = nvtxDomainRangeStartColor(global_domain(), msg.c_str(), nvtxGreen);; + global_modules_[mid] = nvtxDomainRangeStartColor(global_domain(), msg.c_str(), labelColor(label)); } void NVProfilerService::postModuleBeginJob(edm::ModuleDescription const& desc) { auto mid = desc.id(); nvtxDomainRangeEnd(global_domain(), global_modules_[mid]); + global_modules_[mid] = nvtxInvalidRangeId; } void @@ -810,16 +812,14 @@ NVProfilerService::preModuleEndJob(edm::ModuleDescription const& desc) { auto mid = desc.id(); auto const & label = desc.moduleLabel(); auto const & msg = label + " end job"; - if (highlight(label)) - global_modules_[mid] = nvtxDomainRangeStartColor(global_domain(), msg.c_str(), nvtxAmber); - else - global_modules_[mid] = nvtxDomainRangeStartColor(global_domain(), msg.c_str(), nvtxGreen);; + global_modules_[mid] = nvtxDomainRangeStartColor(global_domain(), msg.c_str(), labelColor(label)); } void NVProfilerService::postModuleEndJob(edm::ModuleDescription const& desc) { auto mid = desc.id(); nvtxDomainRangeEnd(global_domain(), global_modules_[mid]); + global_modules_[mid] = nvtxInvalidRangeId; } void @@ -828,10 +828,8 @@ NVProfilerService::preModuleEventAcquire(edm::StreamContext const& sc, edm::Modu auto mid = mcc.moduleDescription()->id(); auto const & label = mcc.moduleDescription()->moduleLabel(); auto const & msg = label + " acquire"; - if (highlight(label)) - stream_modules_[sid][mid] = nvtxDomainRangeStartColor(stream_domain(sid), msg.c_str(), nvtxAmber); - else - stream_modules_[sid][mid] = nvtxDomainRangeStartColor(stream_domain(sid), msg.c_str(), nvtxGreen);; + assert(stream_modules_[sid][mid] == nvtxInvalidRangeId); + stream_modules_[sid][mid] = nvtxDomainRangeStartColor(stream_domain(sid), msg.c_str(), labelColor(label)); } void @@ -839,6 +837,7 @@ NVProfilerService::postModuleEventAcquire(edm::StreamContext const& sc, edm::Mod auto sid = sc.streamID(); auto mid = mcc.moduleDescription()->id(); nvtxDomainRangeEnd(stream_domain(sid), stream_modules_[sid][mid]); + stream_modules_[sid][mid] = nvtxInvalidRangeId; } void @@ -846,10 +845,8 @@ NVProfilerService::preModuleEvent(edm::StreamContext const& sc, edm::ModuleCalli auto sid = sc.streamID(); auto mid = mcc.moduleDescription()->id(); auto const & label = mcc.moduleDescription()->moduleLabel(); - if (highlight(label)) - stream_modules_[sid][mid] = nvtxDomainRangeStartColor(stream_domain(sid), label.c_str(), nvtxAmber); - else - stream_modules_[sid][mid] = nvtxDomainRangeStartColor(stream_domain(sid), label.c_str(), nvtxGreen);; + assert(stream_modules_[sid][mid] == nvtxInvalidRangeId); + stream_modules_[sid][mid] = nvtxDomainRangeStartColor(stream_domain(sid), label.c_str(), labelColor(label)); } void @@ -857,6 +854,7 @@ NVProfilerService::postModuleEvent(edm::StreamContext const& sc, edm::ModuleCall auto sid = sc.streamID(); auto mid = mcc.moduleDescription()->id(); nvtxDomainRangeEnd(stream_domain(sid), stream_modules_[sid][mid]); + stream_modules_[sid][mid] = nvtxInvalidRangeId; } void @@ -866,10 +864,8 @@ NVProfilerService::preModuleEventDelayedGet(edm::StreamContext const& sc, edm::M auto mid = mcc.moduleDescription()->id(); auto const & label = mcc.moduleDescription()->moduleLabel(); auto const & msg = label + " delayed get"; - if (highlight(label)) - stream_modules_[sid][mid] = nvtxDomainRangeStartColor(stream_domain(sid), label.c_str(), nvtxAmber); - else - stream_modules_[sid][mid] = nvtxDomainRangeStartColor(stream_domain(sid), label.c_str(), nvtxGreen);; + assert(stream_modules_[sid][mid] == nvtxInvalidRangeId); + stream_modules_[sid][mid] = nvtxDomainRangeStartColor(stream_domain(sid), label.c_str(), labelColorLight(label)); */ } @@ -879,6 +875,7 @@ NVProfilerService::postModuleEventDelayedGet(edm::StreamContext const& sc, edm:: auto sid = sc.streamID(); auto mid = mcc.moduleDescription()->id(); nvtxDomainRangeEnd(stream_domain(sid), stream_modules_[sid][mid]); + stream_modules_[sid][mid] = nvtxInvalidRangeId; */ } @@ -889,10 +886,8 @@ NVProfilerService::preEventReadFromSource(edm::StreamContext const& sc, edm::Mod auto mid = mcc.moduleDescription()->id(); auto const & label = mcc.moduleDescription()->moduleLabel(); auto const & msg = label + " read from source"; - if (highlight(label)) - stream_modules_[sid][mid] = nvtxDomainRangeStartColor(stream_domain(sid), msg.c_str(), nvtxAmber); - else - stream_modules_[sid][mid] = nvtxDomainRangeStartColor(stream_domain(sid), msg.c_str(), nvtxGreen);; + assert(stream_modules_[sid][mid] == nvtxInvalidRangeId); + stream_modules_[sid][mid] = nvtxDomainRangeStartColor(stream_domain(sid), msg.c_str(), labelColorLight(label)); */ } @@ -902,6 +897,7 @@ NVProfilerService::postEventReadFromSource(edm::StreamContext const& sc, edm::Mo auto sid = sc.streamID(); auto mid = mcc.moduleDescription()->id(); nvtxDomainRangeEnd(stream_domain(sid), stream_modules_[sid][mid]); + stream_modules_[sid][mid] = nvtxInvalidRangeId; */ } @@ -911,10 +907,8 @@ NVProfilerService::preModuleStreamBeginRun(edm::StreamContext const& sc, edm::Mo auto mid = mcc.moduleDescription()->id(); auto const & label = mcc.moduleDescription()->moduleLabel(); auto const & msg = label + " stream begin run"; - if (highlight(label)) - stream_modules_[sid][mid] = nvtxDomainRangeStartColor(stream_domain(sid), msg.c_str(), nvtxAmber); - else - stream_modules_[sid][mid] = nvtxDomainRangeStartColor(stream_domain(sid), msg.c_str(), nvtxGreen);; + assert(stream_modules_[sid][mid] == nvtxInvalidRangeId); + stream_modules_[sid][mid] = nvtxDomainRangeStartColor(stream_domain(sid), msg.c_str(), labelColor(label)); } void @@ -922,6 +916,7 @@ NVProfilerService::postModuleStreamBeginRun(edm::StreamContext const& sc, edm::M auto sid = sc.streamID(); auto mid = mcc.moduleDescription()->id(); nvtxDomainRangeEnd(stream_domain(sid), stream_modules_[sid][mid]); + stream_modules_[sid][mid] = nvtxInvalidRangeId; } void @@ -930,10 +925,8 @@ NVProfilerService::preModuleStreamEndRun(edm::StreamContext const& sc, edm::Modu auto mid = mcc.moduleDescription()->id(); auto const & label = mcc.moduleDescription()->moduleLabel(); auto const & msg = label + " stream end run"; - if (highlight(label)) - stream_modules_[sid][mid] = nvtxDomainRangeStartColor(stream_domain(sid), msg.c_str(), nvtxAmber); - else - stream_modules_[sid][mid] = nvtxDomainRangeStartColor(stream_domain(sid), msg.c_str(), nvtxGreen);; + assert(stream_modules_[sid][mid] == nvtxInvalidRangeId); + stream_modules_[sid][mid] = nvtxDomainRangeStartColor(stream_domain(sid), msg.c_str(), labelColor(label)); } void @@ -941,6 +934,7 @@ NVProfilerService::postModuleStreamEndRun(edm::StreamContext const& sc, edm::Mod auto sid = sc.streamID(); auto mid = mcc.moduleDescription()->id(); nvtxDomainRangeEnd(stream_domain(sid), stream_modules_[sid][mid]); + stream_modules_[sid][mid] = nvtxInvalidRangeId; } void @@ -949,10 +943,8 @@ NVProfilerService::preModuleStreamBeginLumi(edm::StreamContext const& sc, edm::M auto mid = mcc.moduleDescription()->id(); auto const & label = mcc.moduleDescription()->moduleLabel(); auto const & msg = label + " stream begin lumi"; - if (highlight(label)) - stream_modules_[sid][mid] = nvtxDomainRangeStartColor(stream_domain(sid), msg.c_str(), nvtxAmber); - else - stream_modules_[sid][mid] = nvtxDomainRangeStartColor(stream_domain(sid), msg.c_str(), nvtxGreen);; + assert(stream_modules_[sid][mid] == nvtxInvalidRangeId); + stream_modules_[sid][mid] = nvtxDomainRangeStartColor(stream_domain(sid), msg.c_str(), labelColor(label)); } void @@ -960,6 +952,7 @@ NVProfilerService::postModuleStreamBeginLumi(edm::StreamContext const& sc, edm:: auto sid = sc.streamID(); auto mid = mcc.moduleDescription()->id(); nvtxDomainRangeEnd(stream_domain(sid), stream_modules_[sid][mid]); + stream_modules_[sid][mid] = nvtxInvalidRangeId; } void @@ -968,10 +961,8 @@ NVProfilerService::preModuleStreamEndLumi(edm::StreamContext const& sc, edm::Mod auto mid = mcc.moduleDescription()->id(); auto const & label = mcc.moduleDescription()->moduleLabel(); auto const & msg = label + " stream end lumi"; - if (highlight(label)) - stream_modules_[sid][mid] = nvtxDomainRangeStartColor(stream_domain(sid), msg.c_str(), nvtxAmber); - else - stream_modules_[sid][mid] = nvtxDomainRangeStartColor(stream_domain(sid), msg.c_str(), nvtxGreen);; + assert(stream_modules_[sid][mid] == nvtxInvalidRangeId); + stream_modules_[sid][mid] = nvtxDomainRangeStartColor(stream_domain(sid), msg.c_str(), labelColor(label)); } void @@ -979,6 +970,7 @@ NVProfilerService::postModuleStreamEndLumi(edm::StreamContext const& sc, edm::Mo auto sid = sc.streamID(); auto mid = mcc.moduleDescription()->id(); nvtxDomainRangeEnd(stream_domain(sid), stream_modules_[sid][mid]); + stream_modules_[sid][mid] = nvtxInvalidRangeId; } void @@ -986,16 +978,14 @@ NVProfilerService::preModuleGlobalBeginRun(edm::GlobalContext const& gc, edm::Mo auto mid = mcc.moduleDescription()->id(); auto const & label = mcc.moduleDescription()->moduleLabel(); auto const & msg = label + " global begin run"; - if (highlight(label)) - global_modules_[mid] = nvtxDomainRangeStartColor(global_domain(), msg.c_str(), nvtxAmber); - else - global_modules_[mid] = nvtxDomainRangeStartColor(global_domain(), msg.c_str(), nvtxGreen);; + global_modules_[mid] = nvtxDomainRangeStartColor(global_domain(), msg.c_str(), labelColor(label)); } void NVProfilerService::postModuleGlobalBeginRun(edm::GlobalContext const& gc, edm::ModuleCallingContext const& mcc) { auto mid = mcc.moduleDescription()->id(); nvtxDomainRangeEnd(global_domain(), global_modules_[mid]); + global_modules_[mid] = nvtxInvalidRangeId; } void @@ -1003,16 +993,14 @@ NVProfilerService::preModuleGlobalEndRun(edm::GlobalContext const& gc, edm::Modu auto mid = mcc.moduleDescription()->id(); auto const & label = mcc.moduleDescription()->moduleLabel(); auto const & msg = label + " global end run"; - if (highlight(label)) - global_modules_[mid] = nvtxDomainRangeStartColor(global_domain(), msg.c_str(), nvtxAmber); - else - global_modules_[mid] = nvtxDomainRangeStartColor(global_domain(), msg.c_str(), nvtxGreen);; + global_modules_[mid] = nvtxDomainRangeStartColor(global_domain(), msg.c_str(), labelColor(label)); } void NVProfilerService::postModuleGlobalEndRun(edm::GlobalContext const& gc, edm::ModuleCallingContext const& mcc) { auto mid = mcc.moduleDescription()->id(); nvtxDomainRangeEnd(global_domain(), global_modules_[mid]); + global_modules_[mid] = nvtxInvalidRangeId; } void @@ -1020,16 +1008,14 @@ NVProfilerService::preModuleGlobalBeginLumi(edm::GlobalContext const& gc, edm::M auto mid = mcc.moduleDescription()->id(); auto const & label = mcc.moduleDescription()->moduleLabel(); auto const & msg = label + " global begin lumi"; - if (highlight(label)) - global_modules_[mid] = nvtxDomainRangeStartColor(global_domain(), msg.c_str(), nvtxAmber); - else - global_modules_[mid] = nvtxDomainRangeStartColor(global_domain(), msg.c_str(), nvtxGreen);; + global_modules_[mid] = nvtxDomainRangeStartColor(global_domain(), msg.c_str(), labelColor(label)); } void NVProfilerService::postModuleGlobalBeginLumi(edm::GlobalContext const& gc, edm::ModuleCallingContext const& mcc) { auto mid = mcc.moduleDescription()->id(); nvtxDomainRangeEnd(global_domain(), global_modules_[mid]); + global_modules_[mid] = nvtxInvalidRangeId; } void @@ -1037,16 +1023,14 @@ NVProfilerService::preModuleGlobalEndLumi(edm::GlobalContext const& gc, edm::Mod auto mid = mcc.moduleDescription()->id(); auto const & label = mcc.moduleDescription()->moduleLabel(); auto const & msg = label + " global end lumi"; - if (highlight(label)) - global_modules_[mid] = nvtxDomainRangeStartColor(global_domain(), msg.c_str(), nvtxAmber); - else - global_modules_[mid] = nvtxDomainRangeStartColor(global_domain(), msg.c_str(), nvtxGreen);; + global_modules_[mid] = nvtxDomainRangeStartColor(global_domain(), msg.c_str(), labelColor(label)); } void NVProfilerService::postModuleGlobalEndLumi(edm::GlobalContext const& gc, edm::ModuleCallingContext const& mcc) { auto mid = mcc.moduleDescription()->id(); nvtxDomainRangeEnd(global_domain(), global_modules_[mid]); + global_modules_[mid] = nvtxInvalidRangeId; } void @@ -1055,16 +1039,14 @@ NVProfilerService::preSourceConstruction(edm::ModuleDescription const& desc) { global_modules_.grow_to_at_least(mid+1); auto const & label = desc.moduleLabel(); auto const & msg = label + " construction"; - if (highlight(label)) - global_modules_[mid] = nvtxDomainRangeStartColor(global_domain(), msg.c_str(), nvtxAmber); - else - global_modules_[mid] = nvtxDomainRangeStartColor(global_domain(), msg.c_str(), nvtxGreen);; + global_modules_[mid] = nvtxDomainRangeStartColor(global_domain(), msg.c_str(), labelColor(label)); } void NVProfilerService::postSourceConstruction(edm::ModuleDescription const& desc) { auto mid = desc.id(); nvtxDomainRangeEnd(global_domain(), global_modules_[mid]); + global_modules_[mid] = nvtxInvalidRangeId; } #include "FWCore/ServiceRegistry/interface/ServiceMaker.h" diff --git a/HeterogeneousCore/CUDAServices/src/CUDAService.cc b/HeterogeneousCore/CUDAServices/src/CUDAService.cc index 14eeaff109b0c..5300f8d2d2fba 100644 --- a/HeterogeneousCore/CUDAServices/src/CUDAService.cc +++ b/HeterogeneousCore/CUDAServices/src/CUDAService.cc @@ -9,53 +9,32 @@ #include "HeterogeneousCore/CUDAUtilities/interface/cudaCheck.h" #include "HeterogeneousCore/CUDAUtilities/interface/getCudaDrvErrorString.h" -CUDAService::CUDAService(edm::ParameterSet const& iConfig, edm::ActivityRegistry& iRegistry) { - bool configEnabled = iConfig.getUntrackedParameter("enabled"); - if(!configEnabled) { +CUDAService::CUDAService(edm::ParameterSet const& config, edm::ActivityRegistry& iRegistry) { + bool configEnabled = config.getUntrackedParameter("enabled"); + if (not configEnabled) { edm::LogInfo("CUDAService") << "CUDAService disabled by configuration"; return; } - auto ret = cuInit(0); - if(CUDA_SUCCESS != ret) { - edm::LogWarning("CUDAService") << "Failed to initialize the CUDA driver API by calling cuInit, return value " << ret << " ("<< getCudaDrvErrorString(ret) << "), disabling CUDAService"; + auto status = cudaGetDeviceCount(&numberOfDevices_); + if (cudaSuccess != status) { + edm::LogWarning("CUDAService") << "Failed to initialize the CUDA runtime.\n" << ".\n" << "Disabling the CUDAService."; return; } - edm::LogInfo("CUDAService") << "cuInit succeeded"; + edm::LogInfo("CUDAService") << "CUDA runtime successfully initialised, found " << numberOfDevices_ << " compute devices"; - ret = cuDeviceGetCount(&numberOfDevices_); - if(CUDA_SUCCESS != ret) { - edm::LogWarning("CUDAService") << "Failed to call cuDeviceGetCount from CUDA driver API, return value " << ret << " ("<< getCudaDrvErrorString(ret) << "), disabling CUDAService"; - return; - } - edm::LogInfo("CUDAService") << "cuDeviceGetCount succeeded, found " << numberOfDevices_ << " devices"; - if(numberOfDevices_ < 1) { - edm::LogWarning("CUDAService") << "Number of devices < 1, disabling CUDAService"; - return; - } - - auto numberOfStreamsPerDevice = iConfig.getUntrackedParameter("numberOfStreamsPerDevice"); - if(numberOfStreamsPerDevice > 0) { + auto numberOfStreamsPerDevice = config.getUntrackedParameter("numberOfStreamsPerDevice"); + if (numberOfStreamsPerDevice > 0) { numberOfStreamsTotal_ = numberOfStreamsPerDevice * numberOfDevices_; edm::LogSystem("CUDAService") << "Number of edm::Streams per CUDA device has been set to " << numberOfStreamsPerDevice << ". With " << numberOfDevices_ << " CUDA devices, this means total of " << numberOfStreamsTotal_ << " edm::Streams for all CUDA devices."; // TODO: eventually silence to LogDebug } computeCapabilities_.reserve(numberOfDevices_); - for(int i=0; i Date: Tue, 31 Jul 2018 22:17:08 +0200 Subject: [PATCH 83/88] Remove all remaining calls to cudaStreamSynchronize() (#109) Remove all of the remaining calls to cudaStreamSynchronize() from the pixel "raw to cluster" workflow. Replace thrust::inclusive_scan with cub::DeviceScan::InclusiveSum to avoid implicit cudaStreamSynchronize and per-event buffer allocations Avoid a data dependency on the number of hits: - in raw2cluster, always transfer the errors for the maximum number of modules. - in rechits, replace the calculation of the total number of hits with the total number of clusters Copy the phase1PixelTopology::layerStart array to the GPU to avoid an extra copy back and forth from the CPU. --- .../SiPixelClusterizer/plugins/BuildFile.xml | 1 + .../plugins/SiPixelRawToClusterGPUKernel.cu | 45 +++++++++- .../plugins/SiPixelRawToClusterGPUKernel.h | 13 ++- .../siPixelRawToClusterHeterogeneousProduct.h | 4 + .../SiPixelRecHits/plugins/PixelRecHits.cu | 83 ++++++++++--------- .../SiPixelRecHits/plugins/PixelRecHits.h | 4 +- .../plugins/SiPixelRecHitHeterogeneous.cc | 2 +- .../siPixelRecHitsHeterogeneousProduct.h | 2 +- 8 files changed, 106 insertions(+), 48 deletions(-) diff --git a/RecoLocalTracker/SiPixelClusterizer/plugins/BuildFile.xml b/RecoLocalTracker/SiPixelClusterizer/plugins/BuildFile.xml index 1dc69b4dd7b73..9db4a46f367b3 100644 --- a/RecoLocalTracker/SiPixelClusterizer/plugins/BuildFile.xml +++ b/RecoLocalTracker/SiPixelClusterizer/plugins/BuildFile.xml @@ -12,6 +12,7 @@ + diff --git a/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelRawToClusterGPUKernel.cu b/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelRawToClusterGPUKernel.cu index 7eb90cffa2d77..839cb6c6202a3 100644 --- a/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelRawToClusterGPUKernel.cu +++ b/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelRawToClusterGPUKernel.cu @@ -27,6 +27,9 @@ #include #include +// cub includes +#include + // CMSSW includes #include "HeterogeneousCore/CUDAUtilities/interface/cudaCheck.h" #include "RecoLocalTracker/SiPixelClusterizer/plugins/gpuCalibPixel.h" @@ -96,6 +99,12 @@ namespace pixelgpudetails { assert(xx_d==gpuProduct.xx_d); cudaCheck(cudaMemcpyAsync(gpuProduct_d, &gpuProduct, sizeof(GPUProduct), cudaMemcpyDefault,cudaStream.id())); + + // originally from rechits + cudaCheck(cudaMalloc((void**) & clusModuleStart_d, (MaxNumModules+1)*sizeof(uint32_t) )); + uint32_t *tmp = nullptr; + cudaCheck(cub::DeviceScan::InclusiveSum(nullptr, tempScanStorageSize, tmp, tmp, MaxNumModules)); + cudaCheck(cudaMalloc(&tempScanStorage_d, tempScanStorageSize)); } SiPixelRawToClusterGPUKernel::~SiPixelRawToClusterGPUKernel() { @@ -118,6 +127,10 @@ namespace pixelgpudetails { cudaCheck(cudaFree(clusInModule_d)); cudaCheck(cudaFree(moduleId_d)); cudaCheck(cudaFree(gpuProduct_d)); + + // originally from rechits + cudaCheck(cudaFree(tempScanStorage_d)); + cudaCheck(cudaFree(clusModuleStart_d)); } void SiPixelRawToClusterGPUKernel::initializeWordFed(int fedId, unsigned int wordCounterGPU, const cms_uint32_t *src, unsigned int length) { @@ -623,10 +636,19 @@ namespace pixelgpudetails { if (includeErrors) { cudaCheck(cudaMemcpyAsync(error_h, error_d, vsize, cudaMemcpyDefault, stream.id())); - cudaCheck(cudaStreamSynchronize(stream.id())); - error_h->set_data(data_h); - int size = error_h->size(); - cudaCheck(cudaMemcpyAsync(data_h, data_d, size*esize, cudaMemcpyDefault, stream.id())); + cudaCheck(cudaMemcpyAsync(data_h, data_d, MAX_FED*pixelgpudetails::MAX_WORD*esize, cudaMemcpyDefault, stream.id())); + // If we want to transfer only the minimal amount of data, we + // need a synchronization point. A single ExternalWork (of + // SiPixelRawToClusterHeterogeneous) does not help because it is + // already used to synchronize the data movement. So we'd need + // two ExternalWorks (or explicit use of TBB tasks). The + // prototype of #100 would allow this easily (as there would be + // two ExternalWorks). + // + //error_h->set_data(data_h); + //cudaCheck(cudaStreamSynchronize(stream.id())); + //int size = error_h->size(); + //cudaCheck(cudaMemcpyAsync(data_h, data_d, size*esize, cudaMemcpyDefault, stream.id())); } // End of Raw2Digi and passing data for cluserisation @@ -676,6 +698,21 @@ namespace pixelgpudetails { wordCounter); cudaCheck(cudaGetLastError()); + // count the module start indices already here (instead of + // rechits) so that the number of clusters/hits can be made + // available in the rechit producer without additional points of + // synchronization/ExternalWork + // + // Set first the first element to 0 + cudaCheck(cudaMemsetAsync(clusModuleStart_d, 0, sizeof(uint32_t), stream.id())); + // Then use inclusive_scan to get the partial sum to the rest + cudaCheck(cub::DeviceScan::InclusiveSum(tempScanStorage_d, tempScanStorageSize, + clusInModule_d, &clusModuleStart_d[1], gpuClustering::MaxNumModules, + stream.id())); + // last element holds the number of all clusters + cudaCheck(cudaMemcpyAsync(&nClusters, clusModuleStart_d+gpuClustering::MaxNumModules, sizeof(uint32_t), cudaMemcpyDefault, stream.id())); + + // clusters cudaCheck(cudaMemcpyAsync(clus_h, clus_d, wordCounter*sizeof(uint32_t), cudaMemcpyDefault, stream.id())); } // end clusterizer scope diff --git a/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelRawToClusterGPUKernel.h b/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelRawToClusterGPUKernel.h index 2f7436052902b..2f8a51901eaab 100644 --- a/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelRawToClusterGPUKernel.h +++ b/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelRawToClusterGPUKernel.h @@ -170,19 +170,20 @@ namespace pixelgpudetails { void initializeWordFed(int fedId, unsigned int wordCounterGPU, const cms_uint32_t *src, unsigned int length); - // Not really very async yet... void makeClustersAsync(const SiPixelFedCablingMapGPU *cablingMap, const unsigned char *modToUnp, const SiPixelGainForHLTonGPU *gains, const uint32_t wordCounter, const uint32_t fedCounter, bool convertADCtoElectrons, bool useQualityInfo, bool includeErrors, bool debug, cuda::stream_t<>& stream); - auto getProduct() const { + auto getProduct() { + error_h->set_data(data_h); return siPixelRawToClusterHeterogeneousProduct::GPUProduct{ pdigi_h, rawIdArr_h, clus_h, adc_h, error_h, gpuProduct_d, xx_d, yy_d, adc_d, moduleInd_d, moduleStart_d,clus_d, clusInModule_d, moduleId_d, - nDigis, nModulesActive + clusModuleStart_d, + nDigis, nModulesActive, nClusters }; } @@ -205,6 +206,7 @@ namespace pixelgpudetails { uint32_t nDigis = 0; uint32_t nModulesActive = 0; + uint32_t nClusters = 0; // scratch memory buffers uint32_t * word_d; @@ -224,6 +226,11 @@ namespace pixelgpudetails { int32_t * clus_d; uint32_t * clusInModule_d; uint32_t * moduleId_d; + + // originally in rechit, moved here + uint32_t *clusModuleStart_d = nullptr; + void *tempScanStorage_d = nullptr; + size_t tempScanStorageSize = 0; }; // configuration and memory buffers alocated on the GPU diff --git a/RecoLocalTracker/SiPixelClusterizer/plugins/siPixelRawToClusterHeterogeneousProduct.h b/RecoLocalTracker/SiPixelClusterizer/plugins/siPixelRawToClusterHeterogeneousProduct.h index ac4cba5e356ad..a37f780b52e5e 100644 --- a/RecoLocalTracker/SiPixelClusterizer/plugins/siPixelRawToClusterHeterogeneousProduct.h +++ b/RecoLocalTracker/SiPixelClusterizer/plugins/siPixelRawToClusterHeterogeneousProduct.h @@ -57,8 +57,12 @@ namespace siPixelRawToClusterHeterogeneousProduct { uint32_t const * clusInModule_d; uint32_t const * moduleId_d; + // originally from rechits + uint32_t const * clusModuleStart_d; + uint32_t nDigis; uint32_t nModules; + uint32_t nClusters; }; using HeterogeneousDigiCluster = HeterogeneousProductImpl, diff --git a/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.cu b/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.cu index 62253ca9d7e1b..bb1a7cc2707bd 100644 --- a/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.cu +++ b/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.cu @@ -5,10 +5,6 @@ // CUDA runtime #include -// thrust heders -#include -#include - // CMSSW headers #include "RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelRawToClusterGPUKernel.h" #include "HeterogeneousCore/CUDAUtilities/interface/cudaCheck.h" @@ -16,11 +12,24 @@ #include "PixelRecHits.h" #include "gpuPixelRecHits.h" +namespace { + __global__ + void setHitsLayerStart(const uint32_t *hitsModuleStart, const uint32_t *layerStart, uint32_t *hitsLayerStart) { + auto i = blockIdx.x*blockDim.x + threadIdx.x; + + if(i < 10) { + hitsLayerStart[i] = hitsModuleStart[layerStart[i]]; + } + else if(i == 10) { + hitsLayerStart[i] = hitsModuleStart[gpuClustering::MaxNumModules]; + } + } +} + namespace pixelgpudetails { PixelRecHitGPUKernel::PixelRecHitGPUKernel(cuda::stream_t<>& cudaStream) { cudaCheck(cudaMalloc((void**) & gpu_.bs_d,3*sizeof(float))); - cudaCheck(cudaMalloc((void**) & gpu_.hitsModuleStart_d,(gpuClustering::MaxNumModules+1)*sizeof(uint32_t))); cudaCheck(cudaMalloc((void**) & gpu_.hitsLayerStart_d,(11)*sizeof(uint32_t))); cudaCheck(cudaMalloc((void**) & gpu_.charge_d,(gpuClustering::MaxNumModules*256)*sizeof(float))); cudaCheck(cudaMalloc((void**) & gpu_.detInd_d,(gpuClustering::MaxNumModules*256)*sizeof(uint16_t))); @@ -40,10 +49,15 @@ namespace pixelgpudetails { cudaCheck(cudaMalloc((void**) & gpu_d, sizeof(HitsOnGPU))); gpu_.me_d = gpu_d; cudaCheck(cudaMemcpyAsync(gpu_d, &gpu_, sizeof(HitsOnGPU), cudaMemcpyDefault,cudaStream.id())); + + // Feels a bit dumb but constexpr arrays are not supported for device code + // TODO: should be moved to EventSetup (or better ideas?) + // Would it be better to use "constant memory"? + cudaCheck(cudaMalloc((void**) & d_phase1TopologyLayerStart_, 11*sizeof(uint32_t))); + cudaCheck(cudaMemcpyAsync(d_phase1TopologyLayerStart_, phase1PixelTopology::layerStart, 11*sizeof(uint32_t), cudaMemcpyDefault, cudaStream.id())); } PixelRecHitGPUKernel::~PixelRecHitGPUKernel() { - cudaCheck(cudaFree(gpu_.hitsModuleStart_d)); cudaCheck(cudaFree(gpu_.charge_d)); cudaCheck(cudaFree(gpu_.detInd_d)); cudaCheck(cudaFree(gpu_.xg_d)); @@ -60,22 +74,17 @@ namespace pixelgpudetails { cudaCheck(cudaFree(gpu_.mc_d)); cudaCheck(cudaFree(gpu_.hist_d)); cudaCheck(cudaFree(gpu_d)); + + cudaCheck(cudaFree(d_phase1TopologyLayerStart_)); } void PixelRecHitGPUKernel::makeHitsAsync(const siPixelRawToClusterHeterogeneousProduct::GPUProduct& input, float const * bs, pixelCPEforGPU::ParamsOnGPU const * cpeParams, cuda::stream_t<>& stream) { - cudaCheck(cudaMemcpyAsync(gpu_.bs_d, bs, 3*sizeof(float), cudaMemcpyDefault, stream.id())); - - // Set first the first element to 0 - cudaCheck(cudaMemsetAsync(gpu_.hitsModuleStart_d, 0, sizeof(uint32_t), stream.id())); - // Then use inclusive_scan to get the partial sum to the rest - thrust::inclusive_scan(thrust::cuda::par.on(stream.id()), - input.clusInModule_d, - input.clusInModule_d + gpuClustering::MaxNumModules, - &gpu_.hitsModuleStart_d[1]); + gpu_.hitsModuleStart_d = input.clusModuleStart_d; + cudaCheck(cudaMemcpyAsync(gpu_d, &gpu_, sizeof(HitsOnGPU), cudaMemcpyDefault, stream.id())); int threadsPerBlock = 256; int blocks = input.nModules; // active modules (with digis) @@ -98,43 +107,41 @@ namespace pixelgpudetails { gpu_.mr_d, gpu_.mc_d ); + // assuming full warp of threads is better than a smaller number... + setHitsLayerStart<<<1, 32, 0, stream.id()>>>(gpu_.hitsModuleStart_d, d_phase1TopologyLayerStart_, gpu_.hitsLayerStart_d); + // needed only if hits on CPU are required... cudaCheck(cudaMemcpyAsync(hitsModuleStart_, gpu_.hitsModuleStart_d, (gpuClustering::MaxNumModules+1) * sizeof(uint32_t), cudaMemcpyDefault, stream.id())); - - // to be moved to gpu? - auto nhits = hitsModuleStart_[gpuClustering::MaxNumModules]; - for (int i=0;i<10;++i) hitsLayerStart_[i]=hitsModuleStart_[phase1PixelTopology::layerStart[i]]; - hitsLayerStart_[10]=nhits; + cudaCheck(cudaMemcpyAsync(hitsLayerStart_, gpu_.hitsLayerStart_d, 11*sizeof(uint32_t), cudaMemcpyDefault, stream.id())); + auto nhits = input.nClusters; + cpu_ = std::make_unique(nhits); + cudaCheck(cudaMemcpyAsync(cpu_->charge.data(), gpu_.charge_d, nhits*sizeof(int32_t), cudaMemcpyDefault, stream.id())); + cudaCheck(cudaMemcpyAsync(cpu_->xl.data(), gpu_.xl_d, nhits*sizeof(float), cudaMemcpyDefault, stream.id())); + cudaCheck(cudaMemcpyAsync(cpu_->yl.data(), gpu_.yl_d, nhits*sizeof(float), cudaMemcpyDefault, stream.id())); + cudaCheck(cudaMemcpyAsync(cpu_->xe.data(), gpu_.xerr_d, nhits*sizeof(float), cudaMemcpyDefault, stream.id())); + cudaCheck(cudaMemcpyAsync(cpu_->ye.data(), gpu_.yerr_d, nhits*sizeof(float), cudaMemcpyDefault, stream.id())); + cudaCheck(cudaMemcpyAsync(cpu_->mr.data(), gpu_.mr_d, nhits*sizeof(uint16_t), cudaMemcpyDefault, stream.id())); + cudaCheck(cudaMemcpyAsync(cpu_->mc.data(), gpu_.mc_d, nhits*sizeof(uint16_t), cudaMemcpyDefault, stream.id())); #ifdef GPU_DEBUG + cudaStreamSynchronize(stream.id()); + std::cout << "hit layerStart "; for (int i=0;i<10;++i) std::cout << phase1PixelTopology::layerName[i] << ':' << hitsLayerStart_[i] << ' '; std::cout << "end:" << hitsLayerStart_[10] << std::endl; #endif - cudaCheck(cudaMemcpyAsync(gpu_.hitsLayerStart_d, hitsLayerStart_, (11) * sizeof(uint32_t), cudaMemcpyDefault, stream.id())); - // for timing test + // cudaStreamSynchronize(stream.id()); + // auto nhits = hitsLayerStart_[10]; // radixSortMultiWrapper<<<10, 256, 0, c.stream>>>(gpu_.iphi_d,gpu_.sortIndex_d,gpu_.hitsLayerStart_d); cudautils::fillManyFromVector(gpu_.hist_d,10,gpu_.iphi_d, gpu_.hitsLayerStart_d, nhits,256,stream.id()); } - HitsOnCPU PixelRecHitGPUKernel::getOutput(cuda::stream_t<>& stream) const { - // needed only if hits on CPU are required... - auto nhits = hitsModuleStart_[gpuClustering::MaxNumModules]; - - HitsOnCPU hoc(nhits); - hoc.gpu_d = gpu_d; - memcpy(hoc.hitsModuleStart, hitsModuleStart_, (gpuClustering::MaxNumModules+1) * sizeof(uint32_t)); - cudaCheck(cudaMemcpyAsync(hoc.charge.data(), gpu_.charge_d, nhits*sizeof(int32_t), cudaMemcpyDefault, stream.id())); - cudaCheck(cudaMemcpyAsync(hoc.xl.data(), gpu_.xl_d, nhits*sizeof(float), cudaMemcpyDefault, stream.id())); - cudaCheck(cudaMemcpyAsync(hoc.yl.data(), gpu_.yl_d, nhits*sizeof(float), cudaMemcpyDefault, stream.id())); - cudaCheck(cudaMemcpyAsync(hoc.xe.data(), gpu_.xerr_d, nhits*sizeof(float), cudaMemcpyDefault, stream.id())); - cudaCheck(cudaMemcpyAsync(hoc.ye.data(), gpu_.yerr_d, nhits*sizeof(float), cudaMemcpyDefault, stream.id())); - cudaCheck(cudaMemcpyAsync(hoc.mr.data(), gpu_.mr_d, nhits*sizeof(uint16_t), cudaMemcpyDefault, stream.id())); - cudaCheck(cudaMemcpyAsync(hoc.mc.data(), gpu_.mc_d, nhits*sizeof(uint16_t), cudaMemcpyDefault, stream.id())); - cudaCheck(cudaStreamSynchronize(stream.id())); - return hoc; + std::unique_ptr&& PixelRecHitGPUKernel::getOutput(cuda::stream_t<>& stream) { + cpu_->gpu_d = gpu_d; + memcpy(cpu_->hitsModuleStart, hitsModuleStart_, (gpuClustering::MaxNumModules+1) * sizeof(uint32_t)); + return std::move(cpu_); } } diff --git a/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.h b/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.h index 1493180e58b75..21549936a4fc6 100644 --- a/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.h +++ b/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.h @@ -36,11 +36,13 @@ namespace pixelgpudetails { pixelCPEforGPU::ParamsOnGPU const * cpeParams, cuda::stream_t<>& stream); - HitsOnCPU getOutput(cuda::stream_t<>& stream) const; + std::unique_ptr&& getOutput(cuda::stream_t<>& stream); private: HitsOnGPU * gpu_d; // copy of the structure on the gpu itself: this is the "Product" HitsOnGPU gpu_; + std::unique_ptr cpu_; + uint32_t *d_phase1TopologyLayerStart_ = nullptr; uint32_t hitsModuleStart_[gpuClustering::MaxNumModules+1]; uint32_t hitsLayerStart_[11]; }; diff --git a/RecoLocalTracker/SiPixelRecHits/plugins/SiPixelRecHitHeterogeneous.cc b/RecoLocalTracker/SiPixelRecHits/plugins/SiPixelRecHitHeterogeneous.cc index bfd839295bc8f..05b6846b9aacb 100644 --- a/RecoLocalTracker/SiPixelRecHits/plugins/SiPixelRecHitHeterogeneous.cc +++ b/RecoLocalTracker/SiPixelRecHits/plugins/SiPixelRecHitHeterogeneous.cc @@ -179,7 +179,7 @@ void SiPixelRecHitHeterogeneous::acquireGPUCuda(const edm::HeterogeneousEvent& i } void SiPixelRecHitHeterogeneous::produceGPUCuda(edm::HeterogeneousEvent& iEvent, const edm::EventSetup& iSetup, cuda::stream_t<>& cudaStream) { - auto output = std::make_unique(gpuAlgo_->getOutput(cudaStream)); + auto output = gpuAlgo_->getOutput(cudaStream); // Need the CPU clusters to // - properly fill the output DetSetVector of hits diff --git a/RecoLocalTracker/SiPixelRecHits/plugins/siPixelRecHitsHeterogeneousProduct.h b/RecoLocalTracker/SiPixelRecHits/plugins/siPixelRecHitsHeterogeneousProduct.h index 87a3cab0e5e98..498dc3d04b925 100644 --- a/RecoLocalTracker/SiPixelRecHits/plugins/siPixelRecHitsHeterogeneousProduct.h +++ b/RecoLocalTracker/SiPixelRecHits/plugins/siPixelRecHitsHeterogeneousProduct.h @@ -16,7 +16,7 @@ namespace siPixelRecHitsHeterogeneousProduct { struct HitsOnGPU{ float * bs_d; - uint32_t * hitsModuleStart_d; + const uint32_t * hitsModuleStart_d; // forwarded from clusters uint32_t * hitsLayerStart_d; int32_t * charge_d; uint16_t * detInd_d; From 9090a44bf627174b6a83085495fb31493e03421b Mon Sep 17 00:00:00 2001 From: Matti Kortelainen Date: Wed, 1 Aug 2018 12:08:58 +0200 Subject: [PATCH 84/88] Fix Cluster-to-TrackingParticle matching for pixel tracking CPU workflow (#111) --- .../python/tpClusterProducer_cfi.py | 4 +--- Validation/RecoTrack/python/TrackValidation_cff.py | 10 +++++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/SimTracker/TrackerHitAssociation/python/tpClusterProducer_cfi.py b/SimTracker/TrackerHitAssociation/python/tpClusterProducer_cfi.py index e8330c074dfac..a8de0a96e4678 100644 --- a/SimTracker/TrackerHitAssociation/python/tpClusterProducer_cfi.py +++ b/SimTracker/TrackerHitAssociation/python/tpClusterProducer_cfi.py @@ -1,5 +1,4 @@ import FWCore.ParameterSet.Config as cms -from Configuration.ProcessModifiers.gpu_cff import gpu from SimTracker.TrackerHitAssociation.tpClusterProducerDefault_cfi import tpClusterProducerDefault as _tpClusterProducerDefault @@ -25,6 +24,5 @@ tpClusterProducerHeterogeneous = _tpClusterProducerHeterogeneous.clone() from SimTracker.TrackerHitAssociation.tpClusterHeterogeneousConverter_cfi import tpClusterHeterogeneousConverter as _tpHeterogeneousConverter - -gpu.toReplaceWith(tpClusterProducer, _tpHeterogeneousConverter.clone()) +tpClusterProducerConverter = _tpHeterogeneousConverter.clone() diff --git a/Validation/RecoTrack/python/TrackValidation_cff.py b/Validation/RecoTrack/python/TrackValidation_cff.py index dff571862bb46..5a806298bb7b3 100644 --- a/Validation/RecoTrack/python/TrackValidation_cff.py +++ b/Validation/RecoTrack/python/TrackValidation_cff.py @@ -713,9 +713,13 @@ def _uniqueFirstLayers(layerList): tpClusterProducerHeterogeneousPixelTrackingOnly = tpClusterProducerHeterogeneous.clone( pixelClusterSrc = "siPixelClustersPreSplitting" ) -tpClusterProducerPixelTrackingOnly = tpClusterProducer.clone() -# Need to use the modifier to customize because the exact EDProducer type depends on the modifier -gpu.toModify(tpClusterProducerPixelTrackingOnly, src = "tpClusterProducerHeterogeneousPixelTrackingOnly") +tpClusterProducerPixelTrackingOnly = tpClusterProducer.clone( + pixelClusterSrc = "siPixelClustersPreSplitting" +) +from Configuration.ProcessModifiers.gpu_cff import gpu +gpu.toReplaceWith(tpClusterProducerPixelTrackingOnly, tpClusterProducerConverter.clone( + src = "tpClusterProducerHeterogeneousPixelTrackingOnly" +)) quickTrackAssociatorByHitsPixelTrackingOnly = quickTrackAssociatorByHits.clone( cluster2TPSrc = "tpClusterProducerPixelTrackingOnly" From c8067d7f08aa6f1b1f0f0f6baae5e43e2c912473 Mon Sep 17 00:00:00 2001 From: Andrea Bocci Date: Wed, 1 Aug 2018 15:01:56 +0200 Subject: [PATCH 85/88] Extend the CUDAService to support CUDA device flags and limits (#103) Print a single LogInfo status message with all the devices' details. Set the CUDA device flags (hard coded) and print them. Configure the CUDA device limits and print them. See the documentation of cudaSetDeviceFlags and cudaDeviceSetLimit for more information. --- .../CUDAServices/src/CUDAService.cc | 175 ++++++++++++++++-- 1 file changed, 155 insertions(+), 20 deletions(-) diff --git a/HeterogeneousCore/CUDAServices/src/CUDAService.cc b/HeterogeneousCore/CUDAServices/src/CUDAService.cc index 5300f8d2d2fba..5051a012af9e0 100644 --- a/HeterogeneousCore/CUDAServices/src/CUDAService.cc +++ b/HeterogeneousCore/CUDAServices/src/CUDAService.cc @@ -1,3 +1,6 @@ +#include +#include + #include #include @@ -7,7 +10,26 @@ #include "FWCore/ParameterSet/interface/ParameterSetDescription.h" #include "HeterogeneousCore/CUDAServices/interface/CUDAService.h" #include "HeterogeneousCore/CUDAUtilities/interface/cudaCheck.h" -#include "HeterogeneousCore/CUDAUtilities/interface/getCudaDrvErrorString.h" + +void setCudaLimit(cudaLimit limit, const char* name, size_t request) { + // read the current device + int device; + cudaCheck(cudaGetDevice(&device)); + // try to set the requested limit + auto result = cudaDeviceSetLimit(limit, request); + if (cudaErrorUnsupportedLimit == result) { + edm::LogWarning("CUDAService") << "CUDA device " << device << ": unsupported limit \"" << name << "\""; + return; + } + // read back the limit value + size_t value; + cudaCheck(cudaDeviceGetLimit(&value, limit)); + if (cudaSuccess != result) { + edm::LogWarning("CUDAService") << "CUDA device " << device << ": failed to set limit \"" << name << "\" to " << request << ", current value is " << value ; + } else if (value != request) { + edm::LogWarning("CUDAService") << "CUDA device " << device << ": limit \"" << name << "\" set to " << value << " instead of requested " << request; + } +} CUDAService::CUDAService(edm::ParameterSet const& config, edm::ActivityRegistry& iRegistry) { bool configEnabled = config.getUntrackedParameter("enabled"); @@ -21,23 +43,123 @@ CUDAService::CUDAService(edm::ParameterSet const& config, edm::ActivityRegistry& edm::LogWarning("CUDAService") << "Failed to initialize the CUDA runtime.\n" << ".\n" << "Disabling the CUDAService."; return; } - edm::LogInfo("CUDAService") << "CUDA runtime successfully initialised, found " << numberOfDevices_ << " compute devices"; + edm::LogInfo log("CUDAService"); + computeCapabilities_.reserve(numberOfDevices_); + log << "CUDA runtime successfully initialised, found " << numberOfDevices_ << " compute devices.\n\n"; auto numberOfStreamsPerDevice = config.getUntrackedParameter("numberOfStreamsPerDevice"); if (numberOfStreamsPerDevice > 0) { numberOfStreamsTotal_ = numberOfStreamsPerDevice * numberOfDevices_; - edm::LogSystem("CUDAService") << "Number of edm::Streams per CUDA device has been set to " << numberOfStreamsPerDevice << ". With " << numberOfDevices_ << " CUDA devices, this means total of " << numberOfStreamsTotal_ << " edm::Streams for all CUDA devices."; // TODO: eventually silence to LogDebug + log << "Number of edm::Streams per CUDA device has been set to " << numberOfStreamsPerDevice << ", for a total of " << numberOfStreamsTotal_ << " edm::Streams across all CUDA device(s).\n\n"; } - computeCapabilities_.reserve(numberOfDevices_); + auto const& limits = config.getUntrackedParameter("limits"); + auto printfFifoSize = limits.getUntrackedParameter("cudaLimitPrintfFifoSize"); + auto stackSize = limits.getUntrackedParameter("cudaLimitStackSize"); + auto mallocHeapSize = limits.getUntrackedParameter("cudaLimitMallocHeapSize"); + auto devRuntimeSyncDepth = limits.getUntrackedParameter("cudaLimitDevRuntimeSyncDepth"); + auto devRuntimePendingLaunchCount = limits.getUntrackedParameter("cudaLimitDevRuntimePendingLaunchCount"); + for (int i = 0; i < numberOfDevices_; ++i) { + // read information about the compute device. + // see the documentation of cudaGetDeviceProperties() for more information. cudaDeviceProp properties; - cudaCheck(cudaGetDeviceProperties(&properties, i)); - edm::LogInfo("CUDAService") << "Device " << i << " with compute capability " << properties.major << "." << properties.minor; + cudaCheck(cudaGetDeviceProperties(&properties, i)); + log << "CUDA device " << i << ": " << properties.name << '\n'; + log << " compute capability: " << properties.major << "." << properties.minor << '\n'; computeCapabilities_.emplace_back(properties.major, properties.minor); + + cudaCheck(cudaSetDevice(i)); + cudaCheck(cudaSetDeviceFlags(cudaDeviceScheduleAuto | cudaDeviceMapHost)); + + // read the free and total amount of memory available for allocation by the device, in bytes. + // see the documentation of cudaMemGetInfo() for more information. + size_t freeMemory, totalMemory; + cudaCheck(cudaMemGetInfo(&freeMemory, &totalMemory)); + log << " memory: " << std::setw(6) << freeMemory / (1 << 20) << " MB free / " << std::setw(6) << totalMemory / (1 << 20) << " MB total\n"; + log << '\n'; + + // set and read the CUDA device flags. + // see the documentation of cudaSetDeviceFlags and cudaGetDeviceFlags for more information. + log << "CUDA flags\n"; + unsigned int flags; + cudaCheck(cudaGetDeviceFlags(&flags)); + switch (flags & cudaDeviceScheduleMask) { + case cudaDeviceScheduleAuto: + log << " thread policy: default\n"; + break; + case cudaDeviceScheduleSpin: + log << " thread policy: spin\n"; + break; + case cudaDeviceScheduleYield: + log << " thread policy: yield\n"; + break; + case cudaDeviceScheduleBlockingSync: + log << " thread policy: blocking sync\n"; + break; + default: + log << " thread policy: undefined\n"; + } + if (flags & cudaDeviceMapHost) { + log << " pinned host memory allocations: enabled\n"; + } else { + log << " pinned host memory allocations: disabled\n"; + } + if (flags & cudaDeviceLmemResizeToMax) { + log << " kernel host memory reuse: enabled\n"; + } else { + log << " kernel host memory reuse: disabled\n"; + } + log << '\n'; + + // set and read the CUDA resource limits. + // see the documentation of cudaDeviceSetLimit() for more information. + + // cudaLimitPrintfFifoSize controls the size in bytes of the shared FIFO used by the + // printf() device system call. + if (printfFifoSize >= 0) { + setCudaLimit(cudaLimitPrintfFifoSize, "cudaLimitPrintfFifoSize", printfFifoSize); + } + // cudaLimitStackSize controls the stack size in bytes of each GPU thread. + if (stackSize >= 0) { + setCudaLimit(cudaLimitStackSize, "cudaLimitStackSize", stackSize); + } + // cudaLimitMallocHeapSize controls the size in bytes of the heap used by the malloc() + // and free() device system calls. + if (mallocHeapSize >= 0) { + setCudaLimit(cudaLimitMallocHeapSize, "cudaLimitMallocHeapSize", mallocHeapSize); + } + if ((properties.major > 3) or (properties.major == 3 and properties.minor >= 5)) { + // cudaLimitDevRuntimeSyncDepth controls the maximum nesting depth of a grid at which + // a thread can safely call cudaDeviceSynchronize(). + if (devRuntimeSyncDepth >= 0) { + setCudaLimit(cudaLimitDevRuntimeSyncDepth, "cudaLimitDevRuntimeSyncDepth", devRuntimeSyncDepth); + } + // cudaLimitDevRuntimePendingLaunchCount controls the maximum number of outstanding + // device runtime launches that can be made from the current device. + if (devRuntimePendingLaunchCount >= 0) { + setCudaLimit(cudaLimitDevRuntimePendingLaunchCount, "cudaLimitDevRuntimePendingLaunchCount", devRuntimePendingLaunchCount); + } + } + + size_t value; + log << "CUDA limits\n"; + cudaCheck(cudaDeviceGetLimit(&value, cudaLimitPrintfFifoSize)); + log << " printf buffer size: " << std::setw(10) << value << '\n'; + cudaCheck(cudaDeviceGetLimit(&value, cudaLimitStackSize)); + log << " stack size: " << std::setw(10) << value << '\n'; + cudaCheck(cudaDeviceGetLimit(&value, cudaLimitMallocHeapSize)); + log << " malloc heap size: " << std::setw(10) << value << '\n'; + if ((properties.major > 3) or (properties.major == 3 and properties.minor >= 5)) { + cudaCheck(cudaDeviceGetLimit(&value, cudaLimitDevRuntimeSyncDepth)); + log << " runtime sync depth: " << std::setw(10) << value << '\n'; + cudaCheck(cudaDeviceGetLimit(&value, cudaLimitDevRuntimePendingLaunchCount)); + log << " runtime pending launch count: " << std::setw(10) << value << '\n'; + } + log << '\n'; } - edm::LogInfo("CUDAService") << "CUDAService fully initialized"; + log << "CUDAService fully initialized"; enabled_ = true; } @@ -57,31 +179,44 @@ CUDAService::~CUDAService() { void CUDAService::fillDescriptions(edm::ConfigurationDescriptions & descriptions) { edm::ParameterSetDescription desc; desc.addUntracked("enabled", true); - desc.addUntracked("numberOfStreamsPerDevice", 0)->setComment("Upper limit of the number of edm::Streams that will run on a single CUDA GPU device. The remaining edm::Streams will be run only on other devices (for time being this means CPU in practice). The value '0' means 'unlimited', a value >= 1 imposes the limit."); + desc.addUntracked("numberOfStreamsPerDevice", 0)->setComment("Upper limit of the number of edm::Streams that will run on a single CUDA GPU device. The remaining edm::Streams will be run only on other devices (for time being this means CPU in practice).\nThe value '0' means 'unlimited', a value >= 1 imposes the limit."); + + edm::ParameterSetDescription limits; + limits.addUntracked("cudaLimitPrintfFifoSize", -1)->setComment("Size in bytes of the shared FIFO used by the printf() device system call."); + limits.addUntracked("cudaLimitStackSize", -1)->setComment("Stack size in bytes of each GPU thread."); + limits.addUntracked("cudaLimitMallocHeapSize", -1)->setComment("Size in bytes of the heap used by the malloc() and free() device system calls."); + limits.addUntracked("cudaLimitDevRuntimeSyncDepth", -1)->setComment("Maximum nesting depth of a grid at which a thread can safely call cudaDeviceSynchronize()."); + limits.addUntracked("cudaLimitDevRuntimePendingLaunchCount", -1)->setComment("Maximum number of outstanding device runtime launches that can be made from the current device."); + desc.addUntracked("limits", limits)->setComment("See the documentation of cudaDeviceSetLimit for more information.\nSetting any of these options to -1 keeps the default value."); descriptions.add("CUDAService", desc); } int CUDAService::deviceWithMostFreeMemory() const { - size_t freeMem = 0; - int devId = -1; + // save the current device + int currentDevice; + cudaCheck(cudaGetDevice(¤tDevice)); + + size_t maxFreeMemory = 0; + int device = -1; for(int i = 0; i < numberOfDevices_; ++i) { - // TODO: understand why the api-wrappers version gives same value for all devices /* + // TODO: understand why the api-wrappers version gives same value for all devices auto device = cuda::device::get(i); - auto mem = device.memory.amount_free(); + auto freeMemory = device.memory.amount_free(); */ - size_t free, tot; + size_t freeMemory, totalMemory; cudaSetDevice(i); - cudaMemGetInfo(&free, &tot); - auto mem = free; - edm::LogPrint("CUDAService") << "Device " << i << " free memory " << mem; - if(mem > freeMem) { - freeMem = mem; - devId = i; + cudaMemGetInfo(&freeMemory, &totalMemory); + edm::LogPrint("CUDAService") << "CUDA device " << i << ": " << freeMemory / (1 << 20) << " MB free / " << totalMemory / (1 << 20) << " MB total memory"; + if (freeMemory > maxFreeMemory) { + maxFreeMemory = freeMemory; + device = i; } } - return devId; + // restore the current device + cudaCheck(cudaSetDevice(currentDevice)); + return device; } void CUDAService::setCurrentDevice(int device) const { From efdd6214f7a54ee95dffe4b3508a89c6603a2a0d Mon Sep 17 00:00:00 2001 From: Matti Kortelainen Date: Wed, 1 Aug 2018 17:07:14 +0200 Subject: [PATCH 86/88] Make all device->host cudaMemcpyAsync transfers use pinned memory (#112) Use pinned host memory as target for device-to-host transfers: - cudaMemcpyAsync to pinned memory in raw2cluster; - cudaMemcpyAsync to pinned memory in rechits . --- .../plugins/SiPixelRawToClusterGPUKernel.cu | 21 ++++++++++++++-- .../plugins/SiPixelRawToClusterGPUKernel.h | 6 ++--- .../SiPixelRecHits/plugins/PixelRecHits.cu | 24 ++++++++++++++----- .../SiPixelRecHits/plugins/PixelRecHits.h | 6 +++-- .../siPixelRecHitsHeterogeneousProduct.h | 11 +++++---- 5 files changed, 50 insertions(+), 18 deletions(-) diff --git a/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelRawToClusterGPUKernel.cu b/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelRawToClusterGPUKernel.cu index 839cb6c6202a3..2496fb40114f0 100644 --- a/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelRawToClusterGPUKernel.cu +++ b/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelRawToClusterGPUKernel.cu @@ -66,6 +66,10 @@ namespace pixelgpudetails { assert(error_h_tmp->size() == 0); assert(error_h_tmp->capacity() == static_cast(MAX_FED*pixelgpudetails::MAX_WORD)); + // Need these in pinned memory to be truly asynchronous + cudaCheck(cudaMallocHost(&nModulesActive, sizeof(uint32_t))); + cudaCheck(cudaMallocHost(&nClusters, sizeof(uint32_t))); + // allocate memory for RawToDigi on GPU using namespace gpuClustering; @@ -108,6 +112,19 @@ namespace pixelgpudetails { } SiPixelRawToClusterGPUKernel::~SiPixelRawToClusterGPUKernel() { + // free the host memory + cudaCheck(cudaFreeHost(word)); + cudaCheck(cudaFreeHost(fedId_h)); + cudaCheck(cudaFreeHost(pdigi_h)); + cudaCheck(cudaFreeHost(rawIdArr_h)); + cudaCheck(cudaFreeHost(adc_h)); + cudaCheck(cudaFreeHost(clus_h)); + cudaCheck(cudaFreeHost(error_h)); + cudaCheck(cudaFreeHost(error_h_tmp)); + cudaCheck(cudaFreeHost(data_h)); + cudaCheck(cudaFreeHost(nModulesActive)); + cudaCheck(cudaFreeHost(nClusters)); + // free device memory used for RawToDigi on GPU // free the GPU memory cudaCheck(cudaFree(word_d)); @@ -680,7 +697,7 @@ namespace pixelgpudetails { cudaCheck(cudaGetLastError()); // read the number of modules into a data member, used by getProduct()) - cudaCheck(cudaMemcpyAsync(&nModulesActive, moduleStart_d, sizeof(uint32_t), cudaMemcpyDefault, stream.id())); + cudaCheck(cudaMemcpyAsync(nModulesActive, moduleStart_d, sizeof(uint32_t), cudaMemcpyDefault, stream.id())); threadsPerBlock = 256; blocks = MaxNumModules; @@ -710,7 +727,7 @@ namespace pixelgpudetails { clusInModule_d, &clusModuleStart_d[1], gpuClustering::MaxNumModules, stream.id())); // last element holds the number of all clusters - cudaCheck(cudaMemcpyAsync(&nClusters, clusModuleStart_d+gpuClustering::MaxNumModules, sizeof(uint32_t), cudaMemcpyDefault, stream.id())); + cudaCheck(cudaMemcpyAsync(nClusters, clusModuleStart_d+gpuClustering::MaxNumModules, sizeof(uint32_t), cudaMemcpyDefault, stream.id())); // clusters diff --git a/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelRawToClusterGPUKernel.h b/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelRawToClusterGPUKernel.h index 2f8a51901eaab..9cff737140a90 100644 --- a/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelRawToClusterGPUKernel.h +++ b/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelRawToClusterGPUKernel.h @@ -183,7 +183,7 @@ namespace pixelgpudetails { gpuProduct_d, xx_d, yy_d, adc_d, moduleInd_d, moduleStart_d,clus_d, clusInModule_d, moduleId_d, clusModuleStart_d, - nDigis, nModulesActive, nClusters + nDigis, *nModulesActive, *nClusters }; } @@ -205,8 +205,8 @@ namespace pixelgpudetails { GPU::SimpleVector *error_h_tmp = nullptr; uint32_t nDigis = 0; - uint32_t nModulesActive = 0; - uint32_t nClusters = 0; + uint32_t *nModulesActive = nullptr; + uint32_t *nClusters = nullptr; // scratch memory buffers uint32_t * word_d; diff --git a/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.cu b/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.cu index bb1a7cc2707bd..a8d19e490f76c 100644 --- a/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.cu +++ b/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.cu @@ -55,6 +55,11 @@ namespace pixelgpudetails { // Would it be better to use "constant memory"? cudaCheck(cudaMalloc((void**) & d_phase1TopologyLayerStart_, 11*sizeof(uint32_t))); cudaCheck(cudaMemcpyAsync(d_phase1TopologyLayerStart_, phase1PixelTopology::layerStart, 11*sizeof(uint32_t), cudaMemcpyDefault, cudaStream.id())); + + cudaCheck(cudaMallocHost(&h_hitsModuleStart_, (gpuClustering::MaxNumModules+1)*sizeof(uint32_t))); +#ifdef GPU_DEBUG + cudaCheck(cudaMallocHost(&h_hitsLayerStart_, 11*sizeof(uint32_t))); +#endif } PixelRecHitGPUKernel::~PixelRecHitGPUKernel() { @@ -76,6 +81,11 @@ namespace pixelgpudetails { cudaCheck(cudaFree(gpu_d)); cudaCheck(cudaFree(d_phase1TopologyLayerStart_)); + + cudaCheck(cudaFreeHost(h_hitsModuleStart_)); +#ifdef GPU_DEBUG + cudaCheck(cudaFreeHost(h_hitsLayerStart_)); +#endif } void PixelRecHitGPUKernel::makeHitsAsync(const siPixelRawToClusterHeterogeneousProduct::GPUProduct& input, @@ -111,8 +121,10 @@ namespace pixelgpudetails { setHitsLayerStart<<<1, 32, 0, stream.id()>>>(gpu_.hitsModuleStart_d, d_phase1TopologyLayerStart_, gpu_.hitsLayerStart_d); // needed only if hits on CPU are required... - cudaCheck(cudaMemcpyAsync(hitsModuleStart_, gpu_.hitsModuleStart_d, (gpuClustering::MaxNumModules+1) * sizeof(uint32_t), cudaMemcpyDefault, stream.id())); - cudaCheck(cudaMemcpyAsync(hitsLayerStart_, gpu_.hitsLayerStart_d, 11*sizeof(uint32_t), cudaMemcpyDefault, stream.id())); + cudaCheck(cudaMemcpyAsync(h_hitsModuleStart_, gpu_.hitsModuleStart_d, (gpuClustering::MaxNumModules+1) * sizeof(uint32_t), cudaMemcpyDefault, stream.id())); +#ifdef GPU_DEBUG + cudaCheck(cudaMemcpyAsync(h_hitsLayerStart_, gpu_.hitsLayerStart_d, 11*sizeof(uint32_t), cudaMemcpyDefault, stream.id())); +#endif auto nhits = input.nClusters; cpu_ = std::make_unique(nhits); cudaCheck(cudaMemcpyAsync(cpu_->charge.data(), gpu_.charge_d, nhits*sizeof(int32_t), cudaMemcpyDefault, stream.id())); @@ -127,13 +139,13 @@ namespace pixelgpudetails { cudaStreamSynchronize(stream.id()); std::cout << "hit layerStart "; - for (int i=0;i<10;++i) std::cout << phase1PixelTopology::layerName[i] << ':' << hitsLayerStart_[i] << ' '; - std::cout << "end:" << hitsLayerStart_[10] << std::endl; + for (int i=0;i<10;++i) std::cout << phase1PixelTopology::layerName[i] << ':' << h_hitsLayerStart_[i] << ' '; + std::cout << "end:" << h_hitsLayerStart_[10] << std::endl; #endif // for timing test // cudaStreamSynchronize(stream.id()); - // auto nhits = hitsLayerStart_[10]; + // auto nhits = h_hitsLayerStart_[10]; // radixSortMultiWrapper<<<10, 256, 0, c.stream>>>(gpu_.iphi_d,gpu_.sortIndex_d,gpu_.hitsLayerStart_d); cudautils::fillManyFromVector(gpu_.hist_d,10,gpu_.iphi_d, gpu_.hitsLayerStart_d, nhits,256,stream.id()); @@ -141,7 +153,7 @@ namespace pixelgpudetails { std::unique_ptr&& PixelRecHitGPUKernel::getOutput(cuda::stream_t<>& stream) { cpu_->gpu_d = gpu_d; - memcpy(cpu_->hitsModuleStart, hitsModuleStart_, (gpuClustering::MaxNumModules+1) * sizeof(uint32_t)); + memcpy(cpu_->hitsModuleStart, h_hitsModuleStart_, (gpuClustering::MaxNumModules+1) * sizeof(uint32_t)); return std::move(cpu_); } } diff --git a/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.h b/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.h index 21549936a4fc6..9e66a9a89a17a 100644 --- a/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.h +++ b/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.h @@ -43,8 +43,10 @@ namespace pixelgpudetails { HitsOnGPU gpu_; std::unique_ptr cpu_; uint32_t *d_phase1TopologyLayerStart_ = nullptr; - uint32_t hitsModuleStart_[gpuClustering::MaxNumModules+1]; - uint32_t hitsLayerStart_[11]; + uint32_t *h_hitsModuleStart_ = nullptr; +#ifdef GPU_DEBUG + uint32_t *h_hitsLayerStart_ = nullptr; +#endif }; } diff --git a/RecoLocalTracker/SiPixelRecHits/plugins/siPixelRecHitsHeterogeneousProduct.h b/RecoLocalTracker/SiPixelRecHits/plugins/siPixelRecHitsHeterogeneousProduct.h index 498dc3d04b925..23ca8805991bd 100644 --- a/RecoLocalTracker/SiPixelRecHits/plugins/siPixelRecHitsHeterogeneousProduct.h +++ b/RecoLocalTracker/SiPixelRecHits/plugins/siPixelRecHitsHeterogeneousProduct.h @@ -7,6 +7,7 @@ #include "DataFormats/TrackerRecHit2D/interface/SiPixelRecHitCollection.h" #include "HeterogeneousCore/Product/interface/HeterogeneousProduct.h" #include "HeterogeneousCore/CUDAUtilities/interface/HistoContainer.h" +#include "HeterogeneousCore/CUDAUtilities/interface/CUDAHostAllocator.h" namespace siPixelRecHitsHeterogeneousProduct { @@ -49,11 +50,11 @@ namespace siPixelRecHitsHeterogeneousProduct { { } uint32_t hitsModuleStart[2001]; - std::vector charge; - std::vector xl, yl; - std::vector xe, ye; - std::vector mr; - std::vector mc; + std::vector> charge; + std::vector> xl, yl; + std::vector> xe, ye; + std::vector> mr; + std::vector> mc; uint32_t nHits; HitsOnGPU const * gpu_d = nullptr; From f8f701b460de1f337ec25d82bfdd0c5cbdc85bde Mon Sep 17 00:00:00 2001 From: Andrea Bocci Date: Thu, 2 Aug 2018 16:49:40 +0200 Subject: [PATCH 87/88] Add missing checks for the status of each kernel launch (#113) --- .../CUDAUtilities/interface/HistoContainer.h | 4 ++++ .../CUDAUtilities/test/test_GPUSimpleVector.cu | 11 ++++++++--- .../TestHeterogeneousEDProducerGPUHelpers.cu | 18 ++++++++++++------ .../SiPixelRecHits/plugins/PixelRecHits.cu | 2 ++ .../src/PixelTrackReconstructionGPU_impl.cu | 5 ++++- .../plugins/CAHitQuadrupletGeneratorGPU.cu | 4 ++++ .../plugins/ClusterSLOnGPU.cu | 5 +++-- 7 files changed, 37 insertions(+), 12 deletions(-) diff --git a/HeterogeneousCore/CUDAUtilities/interface/HistoContainer.h b/HeterogeneousCore/CUDAUtilities/interface/HistoContainer.h index c398b29a64c69..d96514a727346 100644 --- a/HeterogeneousCore/CUDAUtilities/interface/HistoContainer.h +++ b/HeterogeneousCore/CUDAUtilities/interface/HistoContainer.h @@ -9,6 +9,7 @@ #endif // __CUDA_ARCH__ #include "HeterogeneousCore/CUDAUtilities/interface/cudastdAlgorithm.h" +#include "HeterogeneousCore/CUDAUtilities/interface/cudaCheck.h" #ifdef __CUDACC__ namespace cudautils { @@ -50,6 +51,7 @@ namespace cudautils { void zero(Histo * h, uint32_t nh, int nthreads, cudaStream_t stream) { auto nblocks = (nh * Histo::nbins() + nthreads - 1) / nthreads; zeroMany<<>>(h, nh); + cudaCheck(cudaGetLastError()); } template @@ -57,6 +59,7 @@ namespace cudautils { zero(h, 1, nthreads, stream); auto nblocks = (size + nthreads - 1) / nthreads; fillFromVector<<>>(h, v, size); + cudaCheck(cudaGetLastError()); } template @@ -64,6 +67,7 @@ namespace cudautils { zero(h, nh, nthreads, stream); auto nblocks = (totSize + nthreads - 1) / nthreads; fillFromVector<<>>(h, nh, v, offsets); + cudaCheck(cudaGetLastError()); } } // namespace cudautils diff --git a/HeterogeneousCore/CUDAUtilities/test/test_GPUSimpleVector.cu b/HeterogeneousCore/CUDAUtilities/test/test_GPUSimpleVector.cu index 08f08b044a054..d5db90952cbcb 100644 --- a/HeterogeneousCore/CUDAUtilities/test/test_GPUSimpleVector.cu +++ b/HeterogeneousCore/CUDAUtilities/test/test_GPUSimpleVector.cu @@ -1,11 +1,13 @@ // author: Felice Pantaleo, CERN, 2018 -#include "../interface/GPUSimpleVector.h" #include -#include -#include #include #include +#include +#include + +#include "HeterogeneousCore/CUDAUtilities/interface/GPUSimpleVector.h" + __global__ void vector_pushback(GPU::SimpleVector *foo) { auto index = threadIdx.x + blockIdx.x * blockDim.x; foo->push_back(index); @@ -52,6 +54,7 @@ int main() { int numThreadsPerBlock = 256; assert(success); vector_pushback<<>>(d_obj_ptr); + success = success && cudaGetLastError(); cudaMemcpy(obj_ptr, d_obj_ptr, sizeof(GPU::SimpleVector), cudaMemcpyDefault); @@ -59,12 +62,14 @@ int main() { ? numBlocks * numThreadsPerBlock : maxN)); vector_reset<<>>(d_obj_ptr); + success = success && cudaGetLastError(); cudaMemcpy(obj_ptr, d_obj_ptr, sizeof(GPU::SimpleVector), cudaMemcpyDefault); assert(obj_ptr->size() == 0); vector_emplace_back<<>>(d_obj_ptr); + success = success && cudaGetLastError(); cudaMemcpy(obj_ptr, d_obj_ptr, sizeof(GPU::SimpleVector), cudaMemcpyDefault); diff --git a/HeterogeneousCore/Producer/test/TestHeterogeneousEDProducerGPUHelpers.cu b/HeterogeneousCore/Producer/test/TestHeterogeneousEDProducerGPUHelpers.cu index 79f05f7907576..01107a34cb8d4 100644 --- a/HeterogeneousCore/Producer/test/TestHeterogeneousEDProducerGPUHelpers.cu +++ b/HeterogeneousCore/Producer/test/TestHeterogeneousEDProducerGPUHelpers.cu @@ -1,11 +1,11 @@ -#include "TestHeterogeneousEDProducerGPUHelpers.h" - -#include "FWCore/MessageLogger/interface/MessageLogger.h" - -#include "cuda/api_wrappers.h" +#include #include #include +#include "FWCore/MessageLogger/interface/MessageLogger.h" +#include "HeterogeneousCore/CUDAUtilities/interface/cudaCheck.h" +#include "TestHeterogeneousEDProducerGPUHelpers.h" + // // Vector Addition Kernel // @@ -85,6 +85,7 @@ int TestAcceleratorServiceProducerGPUHelpers_simple_kernel(int input) { int blocksPerGrid = (NUM_VALUES + threadsPerBlock - 1) / threadsPerBlock; vectorAdd<<>>(d_a.get(), d_b.get(), d_c.get(), NUM_VALUES); + cudaCheck(cudaGetLastError()); /* // doesn't work with header-only? cuda::launch(vectorAdd, {blocksPerGrid, threadsPerBlock}, @@ -153,8 +154,10 @@ TestHeterogeneousEDProducerGPUTask::runAlgo(const std::string& label, int input, edm::LogPrint("TestHeterogeneousEDProducerGPU") << " " << label << " GPU launching kernels device " << current_device.id() << " CUDA stream " << stream.id(); vectorAdd<<>>(d_a.get(), d_b.get(), d_c.get(), NUM_VALUES); + cudaCheck(cudaGetLastError()); if(inputArrays.second != nullptr) { vectorAdd<<>>(inputArrays.second, d_c.get(), d_d.get(), NUM_VALUES); + cudaCheck(cudaGetLastError()); std::swap(d_c, d_d); } @@ -167,10 +170,13 @@ TestHeterogeneousEDProducerGPUTask::runAlgo(const std::string& label, int input, blocksPerGrid3.y = ceil(double(NUM_VALUES)/double(threadsPerBlock3.y)); } vectorProd<<>>(d_a.get(), d_b.get(), d_ma.get(), NUM_VALUES); + cudaCheck(cudaGetLastError()); vectorProd<<>>(d_a.get(), d_c.get(), d_mb.get(), NUM_VALUES); + cudaCheck(cudaGetLastError()); matrixMul<<>>(d_ma.get(), d_mb.get(), d_mc.get(), NUM_VALUES); - + cudaCheck(cudaGetLastError()); matrixMulVector<<>>(d_mc.get(), d_b.get(), d_c.get(), NUM_VALUES); + cudaCheck(cudaGetLastError()); edm::LogPrint("TestHeterogeneousEDProducerGPU") << " " << label << " GPU kernels launched, returning return pointer device " << current_device.id() << " CUDA stream " << stream.id(); return std::make_pair(std::move(d_a), std::move(d_c)); diff --git a/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.cu b/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.cu index a8d19e490f76c..1e3d6a72d0a94 100644 --- a/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.cu +++ b/RecoLocalTracker/SiPixelRecHits/plugins/PixelRecHits.cu @@ -116,9 +116,11 @@ namespace pixelgpudetails { gpu_.xerr_d, gpu_.yerr_d, gpu_.mr_d, gpu_.mc_d ); + cudaCheck(cudaGetLastError()); // assuming full warp of threads is better than a smaller number... setHitsLayerStart<<<1, 32, 0, stream.id()>>>(gpu_.hitsModuleStart_d, d_phase1TopologyLayerStart_, gpu_.hitsLayerStart_d); + cudaCheck(cudaGetLastError()); // needed only if hits on CPU are required... cudaCheck(cudaMemcpyAsync(h_hitsModuleStart_, gpu_.hitsModuleStart_d, (gpuClustering::MaxNumModules+1) * sizeof(uint32_t), cudaMemcpyDefault, stream.id())); diff --git a/RecoPixelVertexing/PixelTrackFitting/src/PixelTrackReconstructionGPU_impl.cu b/RecoPixelVertexing/PixelTrackFitting/src/PixelTrackReconstructionGPU_impl.cu index 4b7a10a91fc70..5af4af0035258 100644 --- a/RecoPixelVertexing/PixelTrackFitting/src/PixelTrackReconstructionGPU_impl.cu +++ b/RecoPixelVertexing/PixelTrackFitting/src/PixelTrackReconstructionGPU_impl.cu @@ -1,7 +1,9 @@ -#include "RecoPixelVertexing/PixelTrackFitting/interface/PixelTrackReconstructionGPU.h" #include #include +#include "HeterogeneousCore/CUDAUtilities/interface/cudaCheck.h" +#include "RecoPixelVertexing/PixelTrackFitting/interface/PixelTrackReconstructionGPU.h" + #define DEBUG 0 using namespace Eigen; @@ -114,5 +116,6 @@ void PixelTrackReconstructionGPU::launchKernelFit(float * hits_and_covariancesGP // 12(3+9) * hits_in_fit int num_blocks = cumulative_size/(hits_in_fit*12)/threads_per_block.x + 1; KernelFullFitAllHits<<>>(hits_and_covariancesGPU, hits_in_fit, cumulative_size, B, results); + cudaCheck(cudaGetLastError()); } diff --git a/RecoPixelVertexing/PixelTriplets/plugins/CAHitQuadrupletGeneratorGPU.cu b/RecoPixelVertexing/PixelTriplets/plugins/CAHitQuadrupletGeneratorGPU.cu index 126aa3eb4b874..6e367e59e320d 100644 --- a/RecoPixelVertexing/PixelTriplets/plugins/CAHitQuadrupletGeneratorGPU.cu +++ b/RecoPixelVertexing/PixelTriplets/plugins/CAHitQuadrupletGeneratorGPU.cu @@ -447,6 +447,7 @@ void CAHitQuadrupletGeneratorGPU::launchKernels(const TrackingRegion ®ion, device_isOuterHitOfCell_, d_foundNtupletsVec_[regionIndex], region.origin().x(), region.origin().y(), maxNumberOfDoublets_, maxNumberOfHits_); + cudaCheck(cudaGetLastError()); kernel_connect<<>>( numberOfLayerPairs_, d_doublets_, device_theCells_, @@ -454,11 +455,13 @@ void CAHitQuadrupletGeneratorGPU::launchKernels(const TrackingRegion ®ion, region.ptMin(), region.origin().x(), region.origin().y(), region.originRBound(), caThetaCut, caPhiCut, caHardPtCut, maxNumberOfDoublets_, maxNumberOfHits_); + cudaCheck(cudaGetLastError()); kernel_find_ntuplets<<>>( numberOfRootLayerPairs_, d_doublets_, device_theCells_, d_foundNtupletsVec_[regionIndex], d_rootLayerPairs_, 4, maxNumberOfDoublets_); + cudaCheck(cudaGetLastError()); cudaCheck(cudaMemcpyAsync(h_foundNtupletsVec_[regionIndex], d_foundNtupletsVec_[regionIndex], sizeof(GPU::SimpleVector), @@ -499,4 +502,5 @@ void CAHitQuadrupletGeneratorGPU::buildDoublets(HitsOnCPU const & hh, float phic int blocks = (nhits + threadsPerBlock - 1) / threadsPerBlock; gpuPixelDoublets::getDoubletsFromHisto<<>>(hh.gpu_d,phiCut); + cudaCheck(cudaGetLastError()); } diff --git a/SimTracker/TrackerHitAssociation/plugins/ClusterSLOnGPU.cu b/SimTracker/TrackerHitAssociation/plugins/ClusterSLOnGPU.cu index 7a3e4eb83161d..204122e000da1 100644 --- a/SimTracker/TrackerHitAssociation/plugins/ClusterSLOnGPU.cu +++ b/SimTracker/TrackerHitAssociation/plugins/ClusterSLOnGPU.cu @@ -197,12 +197,13 @@ namespace clusterSLOnGPU { int blocks = (nhits + threadsPerBlock - 1) / threadsPerBlock; verifyZero<<>>(ev, dd.me_d, hh.gpu_d, nhits, sl.me_d); - + cudaCheck(cudaGetLastError()); blocks = (ndigis + threadsPerBlock - 1) / threadsPerBlock; assert(sl.me_d); simLink<<>>(dd.me_d,ndigis, hh.gpu_d, sl.me_d,n); + cudaCheck(cudaGetLastError()); if (doDump) { cudaStreamSynchronize(stream.id()); // flush previous printf @@ -210,11 +211,11 @@ namespace clusterSLOnGPU { blocks = 16; // (nhits + threadsPerBlock - 1) / threadsPerBlock; for (int first=0; first>>(first, ev, hh.gpu_d, nhits, sl.me_d); + cudaCheck(cudaGetLastError()); cudaStreamSynchronize(stream.id()); } } cudaCheck(cudaGetLastError()); - } } From 4fe0cb4ead5f2dfcdeaf27589174e50c529320c3 Mon Sep 17 00:00:00 2001 From: Andrea Bocci Date: Thu, 2 Aug 2018 17:50:05 +0200 Subject: [PATCH 88/88] Fix memory initialisation problems in the clusterizer (again) (#114) --- .../plugins/SiPixelRawToClusterGPUKernel.cu | 73 +++++++++---------- 1 file changed, 36 insertions(+), 37 deletions(-) diff --git a/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelRawToClusterGPUKernel.cu b/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelRawToClusterGPUKernel.cu index 2496fb40114f0..0ab7682911f1c 100644 --- a/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelRawToClusterGPUKernel.cu +++ b/RecoLocalTracker/SiPixelClusterizer/plugins/SiPixelRawToClusterGPUKernel.cu @@ -41,43 +41,32 @@ namespace pixelgpudetails { - SiPixelRawToClusterGPUKernel::SiPixelRawToClusterGPUKernel(cuda::stream_t<>& cudaStream) { - int WSIZE = pixelgpudetails::MAX_FED * pixelgpudetails::MAX_WORD; - cudaMallocHost(&word, sizeof(unsigned int)*WSIZE); - cudaMallocHost(&fedId_h, sizeof(unsigned char)*WSIZE); + // data structures size + constexpr uint32_t vsize = sizeof(GPU::SimpleVector); + constexpr uint32_t esize = sizeof(pixelgpudetails::error_obj); - // to store the output of RawToDigi - cudaMallocHost(&pdigi_h, sizeof(uint32_t)*WSIZE); - cudaMallocHost(&rawIdArr_h, sizeof(uint32_t)*WSIZE); + // number of words for all the FEDs + constexpr uint32_t MAX_FED_WORDS = pixelgpudetails::MAX_FED * pixelgpudetails::MAX_WORD; + constexpr uint32_t MAX_WORD08_SIZE = MAX_FED_WORDS * sizeof(uint8_t); + constexpr uint32_t MAX_WORD32_SIZE = MAX_FED_WORDS * sizeof(uint32_t); + constexpr uint32_t MAX_WORD16_SIZE = MAX_FED_WORDS * sizeof(uint16_t); + constexpr uint32_t MAX_ERROR_SIZE = MAX_FED_WORDS * esize; - cudaMallocHost(&adc_h, sizeof(uint16_t)*WSIZE); - cudaMallocHost(&clus_h, sizeof(int32_t)*WSIZE); + SiPixelRawToClusterGPUKernel::SiPixelRawToClusterGPUKernel(cuda::stream_t<>& cudaStream) { - constexpr uint32_t vsize = sizeof(GPU::SimpleVector); - constexpr uint32_t esize = sizeof(pixelgpudetails::error_obj); - cudaCheck(cudaMallocHost(&error_h, vsize)); - cudaCheck(cudaMallocHost(&error_h_tmp, vsize)); - cudaCheck(cudaMallocHost(&data_h, MAX_FED*pixelgpudetails::MAX_WORD*esize)); + cudaCheck(cudaMallocHost(&word, MAX_FED_WORDS * sizeof(unsigned int))); + cudaCheck(cudaMallocHost(&fedId_h, MAX_FED_WORDS * sizeof(unsigned char))); - new (error_h) GPU::SimpleVector(MAX_FED*pixelgpudetails::MAX_WORD, data_h); - new (error_h_tmp) GPU::SimpleVector(MAX_FED*pixelgpudetails::MAX_WORD, data_d); - assert(error_h->size() == 0); - assert(error_h->capacity() == static_cast(MAX_FED*pixelgpudetails::MAX_WORD)); - assert(error_h_tmp->size() == 0); - assert(error_h_tmp->capacity() == static_cast(MAX_FED*pixelgpudetails::MAX_WORD)); - - // Need these in pinned memory to be truly asynchronous - cudaCheck(cudaMallocHost(&nModulesActive, sizeof(uint32_t))); - cudaCheck(cudaMallocHost(&nClusters, sizeof(uint32_t))); + // to store the output of RawToDigi + cudaCheck(cudaMallocHost(&pdigi_h, MAX_FED_WORDS * sizeof(uint32_t))); + cudaCheck(cudaMallocHost(&rawIdArr_h, MAX_FED_WORDS * sizeof(uint32_t))); - // allocate memory for RawToDigi on GPU - using namespace gpuClustering; + cudaCheck(cudaMallocHost(&adc_h, MAX_FED_WORDS * sizeof(uint16_t))); + cudaCheck(cudaMallocHost(&clus_h, MAX_FED_WORDS * sizeof(int32_t))); - // Number of words for all the feds - constexpr uint32_t MAX_WORD08_SIZE = MAX_FED * pixelgpudetails::MAX_WORD * sizeof(uint8_t); - constexpr uint32_t MAX_WORD32_SIZE = MAX_FED * pixelgpudetails::MAX_WORD * sizeof(uint32_t); - constexpr uint32_t MAX_WORD16_SIZE = MAX_FED * pixelgpudetails::MAX_WORD * sizeof(uint16_t); - constexpr uint32_t MAX_ERROR_SIZE = MAX_FED * pixelgpudetails::MAX_WORD * esize; + cudaCheck(cudaMallocHost(&error_h, vsize)); + cudaCheck(cudaMallocHost(&error_h_tmp, vsize)); + cudaCheck(cudaMallocHost(&data_h, MAX_ERROR_SIZE)); cudaCheck(cudaMalloc((void**) & word_d, MAX_WORD32_SIZE)); cudaCheck(cudaMalloc((void**) & fedId_d, MAX_WORD08_SIZE)); @@ -90,14 +79,27 @@ namespace pixelgpudetails { cudaCheck(cudaMalloc((void**) & rawIdArr_d, MAX_WORD32_SIZE)); cudaCheck(cudaMalloc((void**) & error_d, vsize)); cudaCheck(cudaMalloc((void**) & data_d, MAX_ERROR_SIZE)); + cudaCheck(cudaMemset(data_d, 0x00, MAX_ERROR_SIZE)); // for the clusterizer cudaCheck(cudaMalloc((void**) & clus_d, MAX_WORD32_SIZE)); // cluser index in module + using namespace gpuClustering; cudaCheck(cudaMalloc((void**) & moduleStart_d, (MaxNumModules+1)*sizeof(uint32_t) )); cudaCheck(cudaMalloc((void**) & clusInModule_d,(MaxNumModules)*sizeof(uint32_t) )); cudaCheck(cudaMalloc((void**) & moduleId_d, (MaxNumModules)*sizeof(uint32_t) )); + new (error_h) GPU::SimpleVector(MAX_FED_WORDS, data_h); + new (error_h_tmp) GPU::SimpleVector(MAX_FED_WORDS, data_d); + assert(error_h->size() == 0); + assert(error_h->capacity() == static_cast(MAX_FED_WORDS)); + assert(error_h_tmp->size() == 0); + assert(error_h_tmp->capacity() == static_cast(MAX_FED_WORDS)); + + // Need these in pinned memory to be truly asynchronous + cudaCheck(cudaMallocHost(&nModulesActive, sizeof(uint32_t))); + cudaCheck(cudaMallocHost(&nClusters, sizeof(uint32_t))); + cudaCheck(cudaMalloc((void**) & gpuProduct_d, sizeof(GPUProduct))); gpuProduct = getProduct(); assert(xx_d==gpuProduct.xx_d); @@ -622,11 +624,8 @@ namespace pixelgpudetails { assert(0 == wordCounter%2); // wordCounter is the total no of words in each event to be trasfered on device - cudaCheck(cudaMemcpyAsync(&word_d[0], &word[0], wordCounter*sizeof(uint32_t), cudaMemcpyDefault, stream.id())); - cudaCheck(cudaMemcpyAsync(&fedId_d[0], &fedId_h[0], wordCounter*sizeof(uint8_t)/2, cudaMemcpyDefault, stream.id())); - - constexpr uint32_t vsize = sizeof(GPU::SimpleVector); - constexpr uint32_t esize = sizeof(pixelgpudetails::error_obj); + cudaCheck(cudaMemcpyAsync(&word_d[0], &word[0], wordCounter*sizeof(uint32_t), cudaMemcpyDefault, stream.id())); + cudaCheck(cudaMemcpyAsync(&fedId_d[0], &fedId_h[0], wordCounter*sizeof(uint8_t) / 2, cudaMemcpyDefault, stream.id())); cudaCheck(cudaMemcpyAsync(error_d, error_h_tmp, vsize, cudaMemcpyDefault, stream.id())); // Launch rawToDigi kernel @@ -653,7 +652,7 @@ namespace pixelgpudetails { if (includeErrors) { cudaCheck(cudaMemcpyAsync(error_h, error_d, vsize, cudaMemcpyDefault, stream.id())); - cudaCheck(cudaMemcpyAsync(data_h, data_d, MAX_FED*pixelgpudetails::MAX_WORD*esize, cudaMemcpyDefault, stream.id())); + cudaCheck(cudaMemcpyAsync(data_h, data_d, MAX_ERROR_SIZE, cudaMemcpyDefault, stream.id())); // If we want to transfer only the minimal amount of data, we // need a synchronization point. A single ExternalWork (of // SiPixelRawToClusterHeterogeneous) does not help because it is