You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flink.apache.org by fh...@apache.org on 2017/11/22 22:10:38 UTC

[1/9] flink git commit: [FLINK-2170] [connectors] Add OrcRowInputFormat and OrcTableSource.

Repository: flink
Updated Branches:
  refs/heads/master 5017c679c -> 200612ee0


http://git-wip-us.apache.org/repos/asf/flink/blob/edbf8c9e/flink-connectors/flink-orc/src/test/resources/TestOrcFile.testDate1900.orc
----------------------------------------------------------------------
diff --git a/flink-connectors/flink-orc/src/test/resources/TestOrcFile.testDate1900.orc b/flink-connectors/flink-orc/src/test/resources/TestOrcFile.testDate1900.orc
new file mode 100644
index 0000000..f51ffdb
Binary files /dev/null and b/flink-connectors/flink-orc/src/test/resources/TestOrcFile.testDate1900.orc differ

http://git-wip-us.apache.org/repos/asf/flink/blob/edbf8c9e/flink-connectors/flink-orc/src/test/resources/decimal.dat
----------------------------------------------------------------------
diff --git a/flink-connectors/flink-orc/src/test/resources/decimal.dat b/flink-connectors/flink-orc/src/test/resources/decimal.dat
new file mode 100644
index 0000000..42010b5
--- /dev/null
+++ b/flink-connectors/flink-orc/src/test/resources/decimal.dat
@@ -0,0 +1,6000 @@
+-1000.5
+-999.6
+-998.7
+-997.8
+-996.9
+-995.1
+-994.11
+-993.12
+-992.13
+-991.14
+-990.15
+-989.16
+-988.17
+-987.18
+-986.19
+-985.2
+-984.21
+-983.22
+-982.23
+-981.24
+-980.25
+-979.26
+-978.27
+-977.28
+-976.29
+-975.3
+-974.31
+-973.32
+-972.33
+-971.34
+-970.35
+-969.36
+-968.37
+-967.38
+-966.39
+-965.4
+-964.41
+-963.42
+-962.43
+-961.44
+-960.45
+-959.46
+-958.47
+-957.48
+-956.49
+-955.5
+-954.51
+-953.52
+-952.53
+-951.54
+-950.55
+-949.56
+-948.57
+-947.58
+-946.59
+-945.6
+-944.61
+-943.62
+-942.63
+-941.64
+-940.65
+-939.66
+-938.67
+-937.68
+-936.69
+-935.7
+-934.71
+-933.72
+-932.73
+-931.74
+-930.75
+-929.76
+-928.77
+-927.78
+-926.79
+-925.8
+-924.81
+-923.82
+-922.83
+-921.84
+-920.85
+-919.86
+-918.87
+-917.88
+-916.89
+-915.9
+-914.91
+-913.92
+-912.93
+-911.94
+-910.95
+-909.96
+-908.97
+-907.98
+-906.99
+-905.1
+-904.101
+-903.102
+-902.103
+-901.104
+-900.105
+-899.106
+-898.107
+-897.108
+-896.109
+-895.11
+-894.111
+-893.112
+-892.113
+-891.114
+-890.115
+-889.116
+-888.117
+-887.118
+-886.119
+-885.12
+-884.121
+-883.122
+-882.123
+-881.124
+-880.125
+-879.126
+-878.127
+-877.128
+-876.129
+-875.13
+-874.131
+-873.132
+-872.133
+-871.134
+-870.135
+-869.136
+-868.137
+-867.138
+-866.139
+-865.14
+-864.141
+-863.142
+-862.143
+-861.144
+-860.145
+-859.146
+-858.147
+-857.148
+-856.149
+-855.15
+-854.151
+-853.152
+-852.153
+-851.154
+-850.155
+-849.156
+-848.157
+-847.158
+-846.159
+-845.16
+-844.161
+-843.162
+-842.163
+-841.164
+-840.165
+-839.166
+-838.167
+-837.168
+-836.169
+-835.17
+-834.171
+-833.172
+-832.173
+-831.174
+-830.175
+-829.176
+-828.177
+-827.178
+-826.179
+-825.18
+-824.181
+-823.182
+-822.183
+-821.184
+-820.185
+-819.186
+-818.187
+-817.188
+-816.189
+-815.19
+-814.191
+-813.192
+-812.193
+-811.194
+-810.195
+-809.196
+-808.197
+-807.198
+-806.199
+-805.2
+-804.201
+-803.202
+-802.203
+-801.204
+-800.205
+-799.206
+-798.207
+-797.208
+-796.209
+-795.21
+-794.211
+-793.212
+-792.213
+-791.214
+-790.215
+-789.216
+-788.217
+-787.218
+-786.219
+-785.22
+-784.221
+-783.222
+-782.223
+-781.224
+-780.225
+-779.226
+-778.227
+-777.228
+-776.229
+-775.23
+-774.231
+-773.232
+-772.233
+-771.234
+-770.235
+-769.236
+-768.237
+-767.238
+-766.239
+-765.24
+-764.241
+-763.242
+-762.243
+-761.244
+-760.245
+-759.246
+-758.247
+-757.248
+-756.249
+-755.25
+-754.251
+-753.252
+-752.253
+-751.254
+-750.255
+-749.256
+-748.257
+-747.258
+-746.259
+-745.26
+-744.261
+-743.262
+-742.263
+-741.264
+-740.265
+-739.266
+-738.267
+-737.268
+-736.269
+-735.27
+-734.271
+-733.272
+-732.273
+-731.274
+-730.275
+-729.276
+-728.277
+-727.278
+-726.279
+-725.28
+-724.281
+-723.282
+-722.283
+-721.284
+-720.285
+-719.286
+-718.287
+-717.288
+-716.289
+-715.29
+-714.291
+-713.292
+-712.293
+-711.294
+-710.295
+-709.296
+-708.297
+-707.298
+-706.299
+-705.3
+-704.301
+-703.302
+-702.303
+-701.304
+-700.305
+-699.306
+-698.307
+-697.308
+-696.309
+-695.31
+-694.311
+-693.312
+-692.313
+-691.314
+-690.315
+-689.316
+-688.317
+-687.318
+-686.319
+-685.32
+-684.321
+-683.322
+-682.323
+-681.324
+-680.325
+-679.326
+-678.327
+-677.328
+-676.329
+-675.33
+-674.331
+-673.332
+-672.333
+-671.334
+-670.335
+-669.336
+-668.337
+-667.338
+-666.339
+-665.34
+-664.341
+-663.342
+-662.343
+-661.344
+-660.345
+-659.346
+-658.347
+-657.348
+-656.349
+-655.35
+-654.351
+-653.352
+-652.353
+-651.354
+-650.355
+-649.356
+-648.357
+-647.358
+-646.359
+-645.36
+-644.361
+-643.362
+-642.363
+-641.364
+-640.365
+-639.366
+-638.367
+-637.368
+-636.369
+-635.37
+-634.371
+-633.372
+-632.373
+-631.374
+-630.375
+-629.376
+-628.377
+-627.378
+-626.379
+-625.38
+-624.381
+-623.382
+-622.383
+-621.384
+-620.385
+-619.386
+-618.387
+-617.388
+-616.389
+-615.39
+-614.391
+-613.392
+-612.393
+-611.394
+-610.395
+-609.396
+-608.397
+-607.398
+-606.399
+-605.4
+-604.401
+-603.402
+-602.403
+-601.404
+-600.405
+-599.406
+-598.407
+-597.408
+-596.409
+-595.41
+-594.411
+-593.412
+-592.413
+-591.414
+-590.415
+-589.416
+-588.417
+-587.418
+-586.419
+-585.42
+-584.421
+-583.422
+-582.423
+-581.424
+-580.425
+-579.426
+-578.427
+-577.428
+-576.429
+-575.43
+-574.431
+-573.432
+-572.433
+-571.434
+-570.435
+-569.436
+-568.437
+-567.438
+-566.439
+-565.44
+-564.441
+-563.442
+-562.443
+-561.444
+-560.445
+-559.446
+-558.447
+-557.448
+-556.449
+-555.45
+-554.451
+-553.452
+-552.453
+-551.454
+-550.455
+-549.456
+-548.457
+-547.458
+-546.459
+-545.46
+-544.461
+-543.462
+-542.463
+-541.464
+-540.465
+-539.466
+-538.467
+-537.468
+-536.469
+-535.47
+-534.471
+-533.472
+-532.473
+-531.474
+-530.475
+-529.476
+-528.477
+-527.478
+-526.479
+-525.48
+-524.481
+-523.482
+-522.483
+-521.484
+-520.485
+-519.486
+-518.487
+-517.488
+-516.489
+-515.49
+-514.491
+-513.492
+-512.493
+-511.494
+-510.495
+-509.496
+-508.497
+-507.498
+-506.499
+-505.5
+-504.501
+-503.502
+-502.503
+-501.504
+-500.505
+-499.506
+-498.507
+-497.508
+-496.509
+-495.51
+-494.511
+-493.512
+-492.513
+-491.514
+-490.515
+-489.516
+-488.517
+-487.518
+-486.519
+-485.52
+-484.521
+-483.522
+-482.523
+-481.524
+-480.525
+-479.526
+-478.527
+-477.528
+-476.529
+-475.53
+-474.531
+-473.532
+-472.533
+-471.534
+-470.535
+-469.536
+-468.537
+-467.538
+-466.539
+-465.54
+-464.541
+-463.542
+-462.543
+-461.544
+-460.545
+-459.546
+-458.547
+-457.548
+-456.549
+-455.55
+-454.551
+-453.552
+-452.553
+-451.554
+-450.555
+-449.556
+-448.557
+-447.558
+-446.559
+-445.56
+-444.561
+-443.562
+-442.563
+-441.564
+-440.565
+-439.566
+-438.567
+-437.568
+-436.569
+-435.57
+-434.571
+-433.572
+-432.573
+-431.574
+-430.575
+-429.576
+-428.577
+-427.578
+-426.579
+-425.58
+-424.581
+-423.582
+-422.583
+-421.584
+-420.585
+-419.586
+-418.587
+-417.588
+-416.589
+-415.59
+-414.591
+-413.592
+-412.593
+-411.594
+-410.595
+-409.596
+-408.597
+-407.598
+-406.599
+-405.6
+-404.601
+-403.602
+-402.603
+-401.604
+-400.605
+-399.606
+-398.607
+-397.608
+-396.609
+-395.61
+-394.611
+-393.612
+-392.613
+-391.614
+-390.615
+-389.616
+-388.617
+-387.618
+-386.619
+-385.62
+-384.621
+-383.622
+-382.623
+-381.624
+-380.625
+-379.626
+-378.627
+-377.628
+-376.629
+-375.63
+-374.631
+-373.632
+-372.633
+-371.634
+-370.635
+-369.636
+-368.637
+-367.638
+-366.639
+-365.64
+-364.641
+-363.642
+-362.643
+-361.644
+-360.645
+-359.646
+-358.647
+-357.648
+-356.649
+-355.65
+-354.651
+-353.652
+-352.653
+-351.654
+-350.655
+-349.656
+-348.657
+-347.658
+-346.659
+-345.66
+-344.661
+-343.662
+-342.663
+-341.664
+-340.665
+-339.666
+-338.667
+-337.668
+-336.669
+-335.67
+-334.671
+-333.672
+-332.673
+-331.674
+-330.675
+-329.676
+-328.677
+-327.678
+-326.679
+-325.68
+-324.681
+-323.682
+-322.683
+-321.684
+-320.685
+-319.686
+-318.687
+-317.688
+-316.689
+-315.69
+-314.691
+-313.692
+-312.693
+-311.694
+-310.695
+-309.696
+-308.697
+-307.698
+-306.699
+-305.7
+-304.701
+-303.702
+-302.703
+-301.704
+-300.705
+-299.706
+-298.707
+-297.708
+-296.709
+-295.71
+-294.711
+-293.712
+-292.713
+-291.714
+-290.715
+-289.716
+-288.717
+-287.718
+-286.719
+-285.72
+-284.721
+-283.722
+-282.723
+-281.724
+-280.725
+-279.726
+-278.727
+-277.728
+-276.729
+-275.73
+-274.731
+-273.732
+-272.733
+-271.734
+-270.735
+-269.736
+-268.737
+-267.738
+-266.739
+-265.74
+-264.741
+-263.742
+-262.743
+-261.744
+-260.745
+-259.746
+-258.747
+-257.748
+-256.749
+-255.75
+-254.751
+-253.752
+-252.753
+-251.754
+-250.755
+-249.756
+-248.757
+-247.758
+-246.759
+-245.76
+-244.761
+-243.762
+-242.763
+-241.764
+-240.765
+-239.766
+-238.767
+-237.768
+-236.769
+-235.77
+-234.771
+-233.772
+-232.773
+-231.774
+-230.775
+-229.776
+-228.777
+-227.778
+-226.779
+-225.78
+-224.781
+-223.782
+-222.783
+-221.784
+-220.785
+-219.786
+-218.787
+-217.788
+-216.789
+-215.79
+-214.791
+-213.792
+-212.793
+-211.794
+-210.795
+-209.796
+-208.797
+-207.798
+-206.799
+-205.8
+-204.801
+-203.802
+-202.803
+-201.804
+-200.805
+-199.806
+-198.807
+-197.808
+-196.809
+-195.81
+-194.811
+-193.812
+-192.813
+-191.814
+-190.815
+-189.816
+-188.817
+-187.818
+-186.819
+-185.82
+-184.821
+-183.822
+-182.823
+-181.824
+-180.825
+-179.826
+-178.827
+-177.828
+-176.829
+-175.83
+-174.831
+-173.832
+-172.833
+-171.834
+-170.835
+-169.836
+-168.837
+-167.838
+-166.839
+-165.84
+-164.841
+-163.842
+-162.843
+-161.844
+-160.845
+-159.846
+-158.847
+-157.848
+-156.849
+-155.85
+-154.851
+-153.852
+-152.853
+-151.854
+-150.855
+-149.856
+-148.857
+-147.858
+-146.859
+-145.86
+-144.861
+-143.862
+-142.863
+-141.864
+-140.865
+-139.866
+-138.867
+-137.868
+-136.869
+-135.87
+-134.871
+-133.872
+-132.873
+-131.874
+-130.875
+-129.876
+-128.877
+-127.878
+-126.879
+-125.88
+-124.881
+-123.882
+-122.883
+-121.884
+-120.885
+-119.886
+-118.887
+-117.888
+-116.889
+-115.89
+-114.891
+-113.892
+-112.893
+-111.894
+-110.895
+-109.896
+-108.897
+-107.898
+-106.899
+-105.9
+-104.901
+-103.902
+-102.903
+-101.904
+-100.905
+-99.906
+-98.907
+-97.908
+-96.909
+-95.91
+-94.911
+-93.912
+-92.913
+-91.914
+-90.915
+-89.916
+-88.917
+-87.918
+-86.919
+-85.92
+-84.921
+-83.922
+-82.923
+-81.924
+-80.925
+-79.926
+-78.927
+-77.928
+-76.929
+-75.93
+-74.931
+-73.932
+-72.933
+-71.934
+-70.935
+-69.936
+-68.937
+-67.938
+-66.939
+-65.94
+-64.941
+-63.942
+-62.943
+-61.944
+-60.945
+-59.946
+-58.947
+-57.948
+-56.949
+-55.95
+-54.951
+-53.952
+-52.953
+-51.954
+-50.955
+-49.956
+-48.957
+-47.958
+-46.959
+-45.96
+-44.961
+-43.962
+-42.963
+-41.964
+-40.965
+-39.966
+-38.967
+-37.968
+-36.969
+-35.97
+-34.971
+-33.972
+-32.973
+-31.974
+-30.975
+-29.976
+-28.977
+-27.978
+-26.979
+-25.98
+-24.981
+-23.982
+-22.983
+-21.984
+-20.985
+-19.986
+-18.987
+-17.988
+-16.989
+-15.99
+-14.991
+-13.992
+-12.993
+-11.994
+-10.995
+-9.996
+-8.997
+-7.998
+-6.999
+-5.1
+-4.1001
+-3.1002
+-2.1003
+-1.1004
+0.1005
+1.1006
+2.1007
+3.1008
+4.1009
+5.101
+6.1011
+7.1012
+8.1013
+9.1014
+10.1015
+11.1016
+12.1017
+13.1018
+14.1019
+15.102
+16.1021
+17.1022
+18.1023
+19.1024
+20.1025
+21.1026
+22.1027
+23.1028
+24.1029
+25.103
+26.1031
+27.1032
+28.1033
+29.1034
+30.1035
+31.1036
+32.1037
+33.1038
+34.1039
+35.104
+36.1041
+37.1042
+38.1043
+39.1044
+40.1045
+41.1046
+42.1047
+43.1048
+44.1049
+45.105
+46.1051
+47.1052
+48.1053
+49.1054
+50.1055
+51.1056
+52.1057
+53.1058
+54.1059
+55.106
+56.1061
+57.1062
+58.1063
+59.1064
+60.1065
+61.1066
+62.1067
+63.1068
+64.1069
+65.107
+66.1071
+67.1072
+68.1073
+69.1074
+70.1075
+71.1076
+72.1077
+73.1078
+74.1079
+75.108
+76.1081
+77.1082
+78.1083
+79.1084
+80.1085
+81.1086
+82.1087
+83.1088
+84.1089
+85.109
+86.1091
+87.1092
+88.1093
+89.1094
+90.1095
+91.1096
+92.1097
+93.1098
+94.1099
+95.11
+96.1101
+97.1102
+98.1103
+99.1104
+100.1105
+101.1106
+102.1107
+103.1108
+104.1109
+105.111
+106.1111
+107.1112
+108.1113
+109.1114
+110.1115
+111.1116
+112.1117
+113.1118
+114.1119
+115.112
+116.1121
+117.1122
+118.1123
+119.1124
+120.1125
+121.1126
+122.1127
+123.1128
+124.1129
+125.113
+126.1131
+127.1132
+128.1133
+129.1134
+130.1135
+131.1136
+132.1137
+133.1138
+134.1139
+135.114
+136.1141
+137.1142
+138.1143
+139.1144
+140.1145
+141.1146
+142.1147
+143.1148
+144.1149
+145.115
+146.1151
+147.1152
+148.1153
+149.1154
+150.1155
+151.1156
+152.1157
+153.1158
+154.1159
+155.116
+156.1161
+157.1162
+158.1163
+159.1164
+160.1165
+161.1166
+162.1167
+163.1168
+164.1169
+165.117
+166.1171
+167.1172
+168.1173
+169.1174
+170.1175
+171.1176
+172.1177
+173.1178
+174.1179
+175.118
+176.1181
+177.1182
+178.1183
+179.1184
+180.1185
+181.1186
+182.1187
+183.1188
+184.1189
+185.119
+186.1191
+187.1192
+188.1193
+189.1194
+190.1195
+191.1196
+192.1197
+193.1198
+194.1199
+195.12
+196.1201
+197.1202
+198.1203
+199.1204
+200.1205
+201.1206
+202.1207
+203.1208
+204.1209
+205.121
+206.1211
+207.1212
+208.1213
+209.1214
+210.1215
+211.1216
+212.1217
+213.1218
+214.1219
+215.122
+216.1221
+217.1222
+218.1223
+219.1224
+220.1225
+221.1226
+222.1227
+223.1228
+224.1229
+225.123
+226.1231
+227.1232
+228.1233
+229.1234
+230.1235
+231.1236
+232.1237
+233.1238
+234.1239
+235.124
+236.1241
+237.1242
+238.1243
+239.1244
+240.1245
+241.1246
+242.1247
+243.1248
+244.1249
+245.125
+246.1251
+247.1252
+248.1253
+249.1254
+250.1255
+251.1256
+252.1257
+253.1258
+254.1259
+255.126
+256.1261
+257.1262
+258.1263
+259.1264
+260.1265
+261.1266
+262.1267
+263.1268
+264.1269
+265.127
+266.1271
+267.1272
+268.1273
+269.1274
+270.1275
+271.1276
+272.1277
+273.1278
+274.1279
+275.128
+276.1281
+277.1282
+278.1283
+279.1284
+280.1285
+281.1286
+282.1287
+283.1288
+284.1289
+285.129
+286.1291
+287.1292
+288.1293
+289.1294
+290.1295
+291.1296
+292.1297
+293.1298
+294.1299
+295.13
+296.1301
+297.1302
+298.1303
+299.1304
+300.1305
+301.1306
+302.1307
+303.1308
+304.1309
+305.131
+306.1311
+307.1312
+308.1313
+309.1314
+310.1315
+311.1316
+312.1317
+313.1318
+314.1319
+315.132
+316.1321
+317.1322
+318.1323
+319.1324
+320.1325
+321.1326
+322.1327
+323.1328
+324.1329
+325.133
+326.1331
+327.1332
+328.1333
+329.1334
+330.1335
+331.1336
+332.1337
+333.1338
+334.1339
+335.134
+336.1341
+337.1342
+338.1343
+339.1344
+340.1345
+341.1346
+342.1347
+343.1348
+344.1349
+345.135
+346.1351
+347.1352
+348.1353
+349.1354
+350.1355
+351.1356
+352.1357
+353.1358
+354.1359
+355.136
+356.1361
+357.1362
+358.1363
+359.1364
+360.1365
+361.1366
+362.1367
+363.1368
+364.1369
+365.137
+366.1371
+367.1372
+368.1373
+369.1374
+370.1375
+371.1376
+372.1377
+373.1378
+374.1379
+375.138
+376.1381
+377.1382
+378.1383
+379.1384
+380.1385
+381.1386
+382.1387
+383.1388
+384.1389
+385.139
+386.1391
+387.1392
+388.1393
+389.1394
+390.1395
+391.1396
+392.1397
+393.1398
+394.1399
+395.14
+396.1401
+397.1402
+398.1403
+399.1404
+400.1405
+401.1406
+402.1407
+403.1408
+404.1409
+405.141
+406.1411
+407.1412
+408.1413
+409.1414
+410.1415
+411.1416
+412.1417
+413.1418
+414.1419
+415.142
+416.1421
+417.1422
+418.1423
+419.1424
+420.1425
+421.1426
+422.1427
+423.1428
+424.1429
+425.143
+426.1431
+427.1432
+428.1433
+429.1434
+430.1435
+431.1436
+432.1437
+433.1438
+434.1439
+435.144
+436.1441
+437.1442
+438.1443
+439.1444
+440.1445
+441.1446
+442.1447
+443.1448
+444.1449
+445.145
+446.1451
+447.1452
+448.1453
+449.1454
+450.1455
+451.1456
+452.1457
+453.1458
+454.1459
+455.146
+456.1461
+457.1462
+458.1463
+459.1464
+460.1465
+461.1466
+462.1467
+463.1468
+464.1469
+465.147
+466.1471
+467.1472
+468.1473
+469.1474
+470.1475
+471.1476
+472.1477
+473.1478
+474.1479
+475.148
+476.1481
+477.1482
+478.1483
+479.1484
+480.1485
+481.1486
+482.1487
+483.1488
+484.1489
+485.149
+486.1491
+487.1492
+488.1493
+489.1494
+490.1495
+491.1496
+492.1497
+493.1498
+494.1499
+495.15
+496.1501
+497.1502
+498.1503
+499.1504
+500.1505
+501.1506
+502.1507
+503.1508
+504.1509
+505.151
+506.1511
+507.1512
+508.1513
+509.1514
+510.1515
+511.1516
+512.1517
+513.1518
+514.1519
+515.152
+516.1521
+517.1522
+518.1523
+519.1524
+520.1525
+521.1526
+522.1527
+523.1528
+524.1529
+525.153
+526.1531
+527.1532
+528.1533
+529.1534
+530.1535
+531.1536
+532.1537
+533.1538
+534.1539
+535.154
+536.1541
+537.1542
+538.1543
+539.1544
+540.1545
+541.1546
+542.1547
+543.1548
+544.1549
+545.155
+546.1551
+547.1552
+548.1553
+549.1554
+550.1555
+551.1556
+552.1557
+553.1558
+554.1559
+555.156
+556.1561
+557.1562
+558.1563
+559.1564
+560.1565
+561.1566
+562.1567
+563.1568
+564.1569
+565.157
+566.1571
+567.1572
+568.1573
+569.1574
+570.1575
+571.1576
+572.1577
+573.1578
+574.1579
+575.158
+576.1581
+577.1582
+578.1583
+579.1584
+580.1585
+581.1586
+582.1587
+583.1588
+584.1589
+585.159
+586.1591
+587.1592
+588.1593
+589.1594
+590.1595
+591.1596
+592.1597
+593.1598
+594.1599
+595.16
+596.1601
+597.1602
+598.1603
+599.1604
+600.1605
+601.1606
+602.1607
+603.1608
+604.1609
+605.161
+606.1611
+607.1612
+608.1613
+609.1614
+610.1615
+611.1616
+612.1617
+613.1618
+614.1619
+615.162
+616.1621
+617.1622
+618.1623
+619.1624
+620.1625
+621.1626
+622.1627
+623.1628
+624.1629
+625.163
+626.1631
+627.1632
+628.1633
+629.1634
+630.1635
+631.1636
+632.1637
+633.1638
+634.1639
+635.164
+636.1641
+637.1642
+638.1643
+639.1644
+640.1645
+641.1646
+642.1647
+643.1648
+644.1649
+645.165
+646.1651
+647.1652
+648.1653
+649.1654
+650.1655
+651.1656
+652.1657
+653.1658
+654.1659
+655.166
+656.1661
+657.1662
+658.1663
+659.1664
+660.1665
+661.1666
+662.1667
+663.1668
+664.1669
+665.167
+666.1671
+667.1672
+668.1673
+669.1674
+670.1675
+671.1676
+672.1677
+673.1678
+674.1679
+675.168
+676.1681
+677.1682
+678.1683
+679.1684
+680.1685
+681.1686
+682.1687
+683.1688
+684.1689
+685.169
+686.1691
+687.1692
+688.1693
+689.1694
+690.1695
+691.1696
+692.1697
+693.1698
+694.1699
+695.17
+696.1701
+697.1702
+698.1703
+699.1704
+700.1705
+701.1706
+702.1707
+703.1708
+704.1709
+705.171
+706.1711
+707.1712
+708.1713
+709.1714
+710.1715
+711.1716
+712.1717
+713.1718
+714.1719
+715.172
+716.1721
+717.1722
+718.1723
+719.1724
+720.1725
+721.1726
+722.1727
+723.1728
+724.1729
+725.173
+726.1731
+727.1732
+728.1733
+729.1734
+730.1735
+731.1736
+732.1737
+733.1738
+734.1739
+735.174
+736.1741
+737.1742
+738.1743
+739.1744
+740.1745
+741.1746
+742.1747
+743.1748
+744.1749
+745.175
+746.1751
+747.1752
+748.1753
+749.1754
+750.1755
+751.1756
+752.1757
+753.1758
+754.1759
+755.176
+756.1761
+757.1762
+758.1763
+759.1764
+760.1765
+761.1766
+762.1767
+763.1768
+764.1769
+765.177
+766.1771
+767.1772
+768.1773
+769.1774
+770.1775
+771.1776
+772.1777
+773.1778
+774.1779
+775.178
+776.1781
+777.1782
+778.1783
+779.1784
+780.1785
+781.1786
+782.1787
+783.1788
+784.1789
+785.179
+786.1791
+787.1792
+788.1793
+789.1794
+790.1795
+791.1796
+792.1797
+793.1798
+794.1799
+795.18
+796.1801
+797.1802
+798.1803
+799.1804
+800.1805
+801.1806
+802.1807
+803.1808
+804.1809
+805.181
+806.1811
+807.1812
+808.1813
+809.1814
+810.1815
+811.1816
+812.1817
+813.1818
+814.1819
+815.182
+816.1821
+817.1822
+818.1823
+819.1824
+820.1825
+821.1826
+822.1827
+823.1828
+824.1829
+825.183
+826.1831
+827.1832
+828.1833
+829.1834
+830.1835
+831.1836
+832.1837
+833.1838
+834.1839
+835.184
+836.1841
+837.1842
+838.1843
+839.1844
+840.1845
+841.1846
+842.1847
+843.1848
+844.1849
+845.185
+846.1851
+847.1852
+848.1853
+849.1854
+850.1855
+851.1856
+852.1857
+853.1858
+854.1859
+855.186
+856.1861
+857.1862
+858.1863
+859.1864
+860.1865
+861.1866
+862.1867
+863.1868
+864.1869
+865.187
+866.1871
+867.1872
+868.1873
+869.1874
+870.1875
+871.1876
+872.1877
+873.1878
+874.1879
+875.188
+876.1881
+877.1882
+878.1883
+879.1884
+880.1885
+881.1886
+882.1887
+883.1888
+884.1889
+885.189
+886.1891
+887.1892
+888.1893
+889.1894
+890.1895
+891.1896
+892.1897
+893.1898
+894.1899
+895.19
+896.1901
+897.1902
+898.1903
+899.1904
+900.1905
+901.1906
+902.1907
+903.1908
+904.1909
+905.191
+906.1911
+907.1912
+908.1913
+909.1914
+910.1915
+911.1916
+912.1917
+913.1918
+914.1919
+915.192
+916.1921
+917.1922
+918.1923
+919.1924
+920.1925
+921.1926
+922.1927
+923.1928
+924.1929
+925.193
+926.1931
+927.1932
+928.1933
+929.1934
+930.1935
+931.1936
+932.1937
+933.1938
+934.1939
+935.194
+936.1941
+937.1942
+938.1943
+939.1944
+940.1945
+941.1946
+942.1947
+943.1948
+944.1949
+945.195
+946.1951
+947.1952
+948.1953
+949.1954
+950.1955
+951.1956
+952.1957
+953.1958
+954.1959
+955.196
+956.1961
+957.1962
+958.1963
+959.1964
+960.1965
+961.1966
+962.1967
+963.1968
+964.1969
+965.197
+966.1971
+967.1972
+968.1973
+969.1974
+970.1975
+971.1976
+972.1977
+973.1978
+974.1979
+975.198
+976.1981
+977.1982
+978.1983
+979.1984
+980.1985
+981.1986
+982.1987
+983.1988
+984.1989
+985.199
+986.1991
+987.1992
+988.1993
+989.1994
+990.1995
+991.1996
+992.1997
+993.1998
+994.1999
+995.2
+996.2001
+997.2002
+998.2003
+999.2004
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+null
+0.1
+1.2
+2.3
+3.4
+4.5
+5.6
+6.7
+7.8
+8.9
+9.1
+10.11
+11.12
+12.13
+13.14
+14.15
+15.16
+16.17
+17.18
+18.19
+19.2
+20.21
+21.22
+22.23
+23.24
+24.25
+25.26
+26.27
+27.28
+28.29
+29.3
+30.31
+31.32
+32.33
+33.34
+34.35
+35.36
+36.37
+37.38
+38.39
+39.4
+40.41
+41.42
+42.43
+43.44
+44.45
+45.46
+46.47
+47.48
+48.49
+49.5
+50.51
+51.52
+52.53
+53.54
+54.55
+55.56
+56.57
+57.58
+58.59
+59.6
+60.61
+61.62
+62.63
+63.64
+64.65
+65.66
+66.67
+67.68
+68.69
+69.7
+70.71
+71.72
+72.73
+73.74
+74.75
+75.76
+76.77
+77.78
+78.79
+79.8
+80.81
+81.82
+82.83
+83.84
+84.85
+85.86
+86.87
+87.88
+88.89
+89.9
+90.91
+91.92
+92.93
+93.94
+94.95
+95.96
+96.97
+97.98
+98.99
+99.1
+100.101
+101.102
+102.103
+103.104
+104.105
+105.106
+106.107
+107.108
+108.109
+109.11
+110.111
+111.112
+112.113
+113.114
+114.115
+115.116
+116.117
+117.118
+118.119
+119.12
+120.121
+121.122
+122.123
+123.124
+124.125
+125.126
+126.127
+127.128
+128.129
+129.13
+130.131
+131.132
+132.133
+133.134
+134.135
+135.136
+136.137
+137.138
+138.139
+139.14
+140.141
+141.142
+142.143
+143.144
+144.145
+145.146
+146.147
+147.148
+148.149
+149.15
+150.151
+151.152
+152.153
+153.154
+154.155
+155.156
+156.157
+157.158
+158.159
+159.16
+160.161
+161.162
+162.163
+163.164
+164.165
+165.166
+166.167
+167.168
+168.169
+169.17
+170.171
+171.172
+172.173
+173.174
+174.175
+175.176
+176.177
+177.178
+178.179
+179.18
+180.181
+181.182
+182.183
+183.184
+184.185
+185.186
+186.187
+187.188
+188.189
+189.19
+190.191
+191.192
+192.193
+193.194
+194.195
+195.196
+196.197
+197.198
+198.199
+199.2
+200.201
+201.202
+202.203
+203.204
+204.205
+205.206
+206.207
+207.208
+208.209
+209.21
+210.211
+211.212
+212.213
+213.214
+214.215
+215.216
+216.217
+217.218
+218.219
+219.22
+220.221
+221.222
+222.223
+223.224
+224.225
+225.226
+226.227
+227.228
+228.229
+229.23
+230.231
+231.232
+232.233
+233.234
+234.235
+235.236
+236.237
+237.238
+238.239
+239.24
+240.241
+241.242
+242.243
+243.244
+244.245
+245.246
+246.247
+247.248
+248.249
+249.25
+250.251
+251.252
+252.253
+253.254
+254.255
+255.256
+256.257
+257.258
+258.259
+259.26
+260.261
+261.262
+262.263
+263.264
+264.265
+265.266
+266.267
+267.268
+268.269
+269.27
+270.271
+271.272
+272.273
+273.274
+274.275
+275.276
+276.277
+277.278
+278.279
+279.28
+280.281
+281.282
+282.283
+283.284
+284.285
+285.286
+286.287
+287.288
+288.289
+289.29
+290.291
+291.292
+292.293
+293.294
+294.295
+295.296
+296.297
+297.298
+298.299
+299.3
+300.301
+301.302
+302.303
+303.304
+304.305
+305.306
+306.307
+307.308
+308.309
+309.31
+310.311
+311.312
+312.313
+313.314
+314.315
+315.316
+316.317
+317.318
+318.319
+319.32
+320.321
+321.322
+322.323
+323.324
+324.325
+325.326
+326.327
+327.328
+328.329
+329.33
+330.331
+331.332
+332.333
+333.334
+334.335
+335.336
+336.337
+337.338
+338.339
+339.34
+340.341
+341.342
+342.343
+343.344
+344.345
+345.346
+346.347
+347.348
+348.349
+349.35
+350.351
+351.352
+352.353
+353.354
+354.355
+355.356
+356.357
+357.358
+358.359
+359.36
+360.361
+361.362
+362.363
+363.364
+364.365
+365.366
+366.367
+367.368
+368.369
+369.37
+370.371
+371.372
+372.373
+373.374
+374.375
+375.376
+376.377
+377.378
+378.379
+379.38
+380.381
+381.382
+382.383
+383.384
+384.385
+385.386
+386.387
+387.388
+388.389
+389.39
+390.391
+391.392
+392.393
+393.394
+394.395
+395.396
+396.397
+397.398
+398.399
+399.4
+400.401
+401.402
+402.403
+403.404
+404.405
+405.406
+406.407
+407.408
+408.409
+409.41
+410.411
+411.412
+412.413
+413.414
+414.415
+415.416
+416.417
+417.418
+418.419
+419.42
+420.421
+421.422
+422.423
+423.424
+424.425
+425.426
+426.427
+427.428
+428.429
+429.43
+430.431
+431.432
+432.433
+433.434
+434.435
+435.436
+436.437
+437.438
+438.439
+439.44
+440.441
+441.442
+442.443
+443.444
+444.445
+445.446
+446.447
+447.448
+448.449
+449.45
+450.451
+451.452
+452.453
+453.454
+454.455
+455.456
+456.457
+457.458
+458.459
+459.46
+460.461
+461.462
+462.463
+463.464
+464.465
+465.466
+466.467
+467.468
+468.469
+469.47
+470.471
+471.472
+472.473
+473.474
+474.475
+475.476
+476.477
+477.478
+478.479
+479.48
+480.481
+481.482
+482.483
+483.484
+484.485
+485.486
+486.487
+487.488
+488.489
+489.49
+490.491
+491.492
+492.493
+493.494
+494.495
+495.496
+496.497
+497.498
+498.499
+499.5
+500.501
+501.502
+502.503
+503.504
+504.505
+505.506
+506.507
+507.508
+508.509
+509.51
+510.511
+511.512
+512.513
+513.514
+514.515
+515.516
+516.517
+517.518
+518.519
+519.52
+520.521
+521.522
+522.523
+523.524
+524.525
+525.526
+526.527
+527.528
+528.529
+529.53
+530.531
+531.532
+532.533
+533.534
+534.535
+535.536
+536.537
+537.538
+538.539
+539.54
+540.541
+541.542
+542.543
+543.544
+544.545
+545.546
+546.547
+547.548
+548.549
+549.55
+550.551
+551.552
+552.553
+553.554
+554.555
+555.556
+556.557
+557.558
+558.559
+559.56
+560.561
+561.562
+562.563
+563.564
+564.565
+565.566
+566.567
+567.568
+568.569
+569.57
+570.571
+571.572
+572.573
+573.574
+574.575
+575.576
+576.577
+577.578
+578.579
+579.58
+580.581
+581.582
+582.583
+583.584
+584.585
+585.586
+586.587
+587.588
+588.589
+589.59
+590.591
+591.592
+592.593
+593.594
+594.595
+595.596
+596.597
+597.598
+598.599
+599.6
+600.601
+601.602
+602.603
+603.604
+604.605
+605.606
+606.607
+607.608
+608.609
+609.61
+610.611
+611.612
+612.613
+613.614
+614.615
+615.616
+616.617
+617.618
+618.619
+619.62
+620.621
+621.622
+622.623
+623.624
+624.625
+625.626
+626.627
+627.628
+628.629
+629.63
+630.631
+631.632
+632.633
+633.634
+634.635
+635.636
+636.637
+637.638
+638.639
+639.64
+640.641
+641.642
+642.643
+643.644
+644.645
+645.646
+646.647
+647.648
+648.649
+649.65
+650.651
+651.652
+652.653
+653.654
+654.655
+655.656
+656.657
+657.658
+658.659
+659.66
+660.661
+661.662
+662.663
+663.664
+664.665
+665.666
+666.667
+667.668
+668.669
+669.67
+670.671
+671.672
+672.673
+673.674
+674.675
+675.676
+676.677
+677.678
+678.679
+679.68
+680.681
+681.682
+682.683
+683.684
+684.685
+685.686
+686.687
+687.688
+688.689
+689.69
+690.691
+691.692
+692.693
+693.694
+694.695
+695.696
+696.697
+697.698
+698.699
+699.7
+700.701
+701.702
+702.703
+703.704
+704.705
+705.706
+706.707
+707.708
+708.709
+709.71
+710.711
+711.712
+712.713
+713.714
+714.715
+715.716
+716.717
+717.718
+718.719
+719.72
+720.721
+721.722
+722.723
+723.724
+724.725
+725.726
+726.727
+727.728
+728.729
+729.73
+730.731
+731.732
+732.733
+733.734
+734.735
+735.736
+736.737
+737.738
+738.739
+739.74
+740.741
+741.742
+742.743
+743.744
+744.745
+745.746
+746.747
+747.748
+748.749
+749.75
+750.751
+751.752
+752.753
+753.754
+754.755
+755.756
+756.757
+757.758
+758.759
+759.76
+760.761
+761.762
+762.763
+763.764
+764.765
+765.766
+766.767
+767.768
+768.769
+769.77
+770.771
+771.772
+772.773
+773.774
+774.775
+775.776
+776.777
+777.778
+778.779
+779.78
+780.781
+781.782
+782.783
+783.784
+784.785
+785.786
+786.787
+787.788
+788.789
+789.79
+790.791
+791.792
+792.793
+793.794
+794.795
+795.796
+796.797
+797.798
+798.799
+799.8
+800.801
+801.802
+802.803
+803.804
+804.805
+805.806
+806.807
+807.808
+808.809
+809.81
+810.811
+811.812
+812.813
+813.814
+814.815
+815.816
+816.817
+817.818
+818.819
+819.82
+820.821
+821.822
+822.823
+823.824
+824.825
+825.826
+826.827
+827.828
+828.829
+829.83
+830.831
+831.832
+832.833
+833.834
+834.835
+835.836
+836.837
+837.838
+838.839
+839.84
+840.841
+841.842
+842.843
+843.844
+844.845
+845.846
+846.847
+847.848
+848.849
+849.85
+850.851
+851.852
+852.853
+853.854
+854.855
+855.856
+856.857
+857.858
+858.859
+859.86
+860.861
+861.862
+862.863
+863.864
+864.865
+865.866
+866.867
+867.868
+868.869
+869.87
+870.871
+871.872
+872.873
+873.874
+874.875
+875.876
+876.877
+877.878
+878.879
+879.88
+880.881
+881.882
+882.883
+883.884
+884.885
+885.886
+886.887
+887.888
+888.889
+889.89
+890.891
+891.892
+892.893
+893.894
+894.895
+895.896
+896.897
+897.898
+898.899
+899.9
+900.901
+901.902
+902.903
+903.904
+904.905
+905.906
+906.907
+907.908
+908.909
+909.91
+910.911
+911.912
+912.913
+913.914
+914.915
+915.916
+916.917
+917.918
+918.919
+919.92
+920.921
+921.922
+922.923
+923.924
+924.925
+925.926
+926.927
+927.928
+928.929
+929.93
+930.931
+931.932
+932.933
+933.934
+934.935
+935.936
+936.937
+937.938
+938.939
+939.94
+940.941
+941.942
+942.943
+943.944
+944.945
+945.946
+946.947
+947.948
+948.949
+949.95
+950.951
+951.952
+952.953
+953.954
+954.955
+955.956
+956.957
+957.958
+958.959
+959.96
+960.961
+961.962
+962.963
+963.964
+964.965
+965.966
+966.967
+967.968
+968.969
+969.97
+970.971
+971.972
+972.973
+973.974
+974.975
+975.976
+976.977
+977.978
+978.979
+979.98
+980.981
+981.982
+982.983
+983.984
+984.985
+985.986
+986.987
+987.988
+988.989
+989.99
+990.991
+991.992
+992.993
+993.994
+994.995
+995.996
+996.997
+997.998
+998.999
+999.1
+1000.1001
+1001.1002
+1002.1003
+1003.1004
+1004.1005
+1005.1006
+1006.1007
+1007.1008
+1008.1009
+1009.101
+1010.1011
+1011.1012
+1012.1013
+1013.1014
+1014.1015
+1015.1016
+1016.1017
+1017.1018
+1018.1019
+1019.102
+1020.1021
+1021.1022
+1022.1023
+1023.1024
+1024.1025
+1025.1026
+1026.1027
+1027.1028
+1028.1029
+1029.103
+1030.1031
+1031.1032
+1032.1033
+1033.1034
+1034.1035
+1035.1036
+1036.1037
+1037.1038
+1038.1039
+1039.104
+1040.1041
+1041.1042
+1042.1043
+1043.1044
+1044.1045
+1045.1046
+1046.1047
+1047.1048
+1048.1049
+1049.105
+1050.1051
+1051.1052
+1052.1053
+1053.1054
+1054.1055
+1055.1056
+1056.1057
+1057.1058
+1058.1059
+1059.106
+1060.1061
+1061.1062
+1062.1063
+1063.1064
+1064.1065
+1065.1066
+1066.1067
+1067.1068
+1068.1069
+1069.107
+1070.1071
+1071.1072
+1072.1073
+1073.1074
+1074.1075
+1075.1076
+1076.1077
+1077.1078
+1078.1079
+1079.108
+1080.1081
+1081.1082
+1082.1083
+1083.1084
+1084.1085
+1085.1086
+1086.1087
+1087.1088
+1088.1089
+1089.109
+1090.1091
+1091.1092
+1092.1093
+1093.1094
+1094.1095
+1095.1096
+1096.1097
+1097.1098
+1098.1099
+1099.11
+1100.1101
+1101.1102
+1102.1103
+1103.1104
+1104.1105
+1105.1106
+1106.1107
+1107.1108
+1108.1109
+1109.111
+1110.1111
+1111.1112
+1112.1113
+1113.1114
+1114.1115
+1115.1116
+1116.1117
+1117.1118
+1118.1119
+1119.112
+1120.1121
+1121.1122
+1122.1123
+1123.1124
+1124.1125
+1125.1126
+1126.1127
+1127.1128
+1128.1129
+1129.113
+1130.1131
+1131.1132
+1132.1133
+1133.1134
+1134.1135
+1135.1136
+1136.1137
+1137.1138
+1138.1139
+1139.114
+1140.1141
+1141.1142
+1142.1143
+1143.1144
+1144.1145
+1145.1146
+1146.1147
+1147.1148
+1148.1149
+1149.115
+1150.1151
+1151.1152
+1152.1153
+1153.1154
+1154.1155
+1155.1156
+1156.1157
+1157.1158
+1158.1159
+1159.116
+1160.1161
+1161.1162
+1162.1163
+1163.1164
+1164.1165
+1165.1166
+1166.1167
+1167.1168
+1168.1169
+1169.117
+1170.1171
+1171.1172
+1172.1173
+1173.1174
+1174.1175
+1175.1176
+1176.1177
+1177.1178
+1178.1179
+1179.118
+1180.1181
+1181.1182
+1182.1183
+1183.1184
+1184.1185
+1185.1186
+1186.1187
+1187.1188
+1188.1189
+1189.119
+1190.1191
+1191.1192
+1192.1193
+1193.1194
+1194.1195
+1195.1196
+1196.1197
+1197.1198
+1198.1199
+1199.12
+1200.1201
+1201.1202
+1202.1203
+1203.1204
+1204.1205
+1205.1206
+1206.1207
+1207.1208
+1208.1209
+1209.121
+1210.1211
+1211.1212
+1212.1213
+1213.1214
+1214.1215
+1215.1216
+1216.1217
+1217.1218
+1218.1219
+1219.122
+1220.1221
+1221.1222
+1222.1223
+1223.1224
+1224.1225
+1225.1226
+1226.1227
+1227.1228
+1228.1229
+1229.123
+1230.1231
+1231.1232
+1232.1233
+1233.1234
+1234.1235
+1235.1236
+1236.1237
+1237.1238
+1238.1239
+1239.124
+1240.1241
+1241.1242
+1242.1243
+1243.1244
+1244.1245
+1245.1246
+1246.1247
+1247.1248
+1248.1249
+1249.125
+1250.1251
+1251.1252
+1252.1253
+1253.1254
+1254.1255
+1255.1256
+1256.1257
+1257.1258
+1258.1259
+1259.126
+1260.1261
+1261.1262
+1262.1263
+1263.1264
+1264.1265
+1265.1266
+1266.1267
+1267.1268
+1268.1269
+1269.127
+1270.1271
+1271.1272
+1272.1273
+1273.1274
+1274.1275
+1275.1276
+1276.1277
+1277.1278
+1278.1279
+1279.128
+1280.1281
+1281.1282
+1282.1283
+1283.1284
+1284.1285
+1285.1286
+1286.1287
+1287.1288
+1288.1289
+1289.129
+1290.1291
+1291.1292
+1292.1293
+1293.1294
+1294.1295
+1295.1296
+1296.1297
+1297.1298
+1298.1299
+1299.13
+1300.1301
+1301.1302
+1302.1303
+1303.1304
+1304.1305
+1305.1306
+1306.1307
+1307.1308
+1308.1309
+1309.131
+1310.1311
+1311.1312
+1312.1313
+1313.1314
+1314.1315
+1315.1316
+1316.1317
+1317.1318
+1318.1319
+1319.132
+1320.1321
+1321.1322
+1322.1323
+1323.1324
+1324.1325
+1325.1326
+1326.1327
+1327.1328
+1328.1329
+1329.133
+1330.1331
+1331.1332
+1332.1333
+1333.1334
+1334.1335
+1335.1336
+1336.1337
+1337.1338
+1338.1339
+1339.134
+1340.1341
+1341.1342
+1342.1343
+1343.1344
+1344.1345
+1345.1346
+1346.1347
+1347.1348
+1348.1349
+1349.135
+1350.1351
+1351.1352
+1352.1353
+1353.1354
+1354.1355
+1355.1356
+1356.1357
+1357.1358
+1358.1359
+1359.136
+1360.1361
+1361.1362
+1362.1363
+1363.1364
+1364.1365
+1365.1366
+1366.1367
+1367.1368
+1368.1369
+1369.137
+1370.1371
+1371.1372
+1372.1373
+1373.1374
+1374.1375
+1375.1376
+1376.1377
+1377.1378
+1378.1379
+1379.138
+1380.1381
+1381.1382
+1382.1383
+1383.1384
+1384.1385
+1385.1386
+1386.1387
+1387.1388
+1388.1389
+1389.139
+1390.1391
+1391.1392
+1392.1393
+1393.1394
+1394.1395
+1395.1396
+1396.1397
+1397.1398
+1398.1399
+1399.14
+1400.1401
+1401.1402
+1402.1403
+1403.1404
+1404.1405
+1405.1406
+1406.1407
+1407.1408
+1408.1409
+1409.141
+1410.1411
+1411.1412
+1412.1413
+1413.1414
+1414.1415
+1415.1416
+1416.1417
+1417.1418
+1418.1419
+1419.142
+1420.1421
+1421.1422
+1422.1423
+1423.1424
+1424.1425
+1425.1426
+1426.1427
+1427.1428
+1428.1429
+1429.143
+1430.1431
+1431.1432
+1432.1433
+1433.1434
+1434.1435
+1435.1436
+1436.1437
+1437.1438
+1438.1439
+1439.144
+1440.1441
+1441.1442
+1442.1443
+1443.1444
+1444.1445
+1445.1446
+1446.1447
+1447.1448
+1448.1449
+1449.145
+1450.1451
+1451.1452
+1452.1453
+1453.1454
+1454.1455
+1455.1456
+1456.1457
+1457.1458
+1458.1459
+1459.146
+1460.1461
+1461.1462
+1462.1463
+1463.1464
+1464.1465
+1465.1466
+1466.1467
+1467.1468
+1468.1469
+1469.147
+1470.1471
+1471.1472
+1472.1473
+1473.1474
+1474.1475
+1475.1476
+1476.1477
+1477.1478
+1478.1479
+1479.148
+1480.1481
+1481.1482
+1482.1483
+1483.1484
+1484.1485
+1485.1486
+1486.1487
+1487.1488
+1488.1489
+1489.149
+1490.1491
+1491.1492
+1492.1493
+1493.1494
+1494.1495
+1495.1496
+1496.1497
+1497.1498
+1498.1499
+1499.15
+1500.1501
+1501.1502
+1502.1503
+1503.1504
+1504.1505
+1505.1506
+1506.1507
+1507.1508
+1508.1509
+1509.151
+1510.1511
+1511.1512
+1512.1513
+1513.1514
+1514.1515
+1515.1516
+1516.1517
+1517.1518
+1518.1519
+1519.152
+1520.1521
+1521.1522
+1522.1523
+1523.1524
+1524.1525
+1525.1526
+1526.1527
+1527.1528
+1528.1529
+1529.153
+1530.1531
+1531.1532
+1532.1533
+1533.1534
+1534.1535
+1535.1536
+1536.1537
+1537.1538
+1538.1539
+1539.154
+1540.1541
+1541.1542
+1542.1543
+1543.1544
+1544.1545
+1545.1546
+1546.1547
+1547.1548
+1548.1549
+1549.155
+1550.1551
+1551.1552
+1552.1553
+1553.1554
+1554.1555
+1555.1556
+1556.1557
+1557.1558
+1558.1559
+1559.156
+1560.1561
+1561.1562
+1562.1563
+1563.1564
+1564.1565
+1565.1566
+1566.1567
+1567.1568
+1568.1569
+1569.157
+1570.1571
+1571.1572
+1572.1573
+1573.1574
+1574.1575
+1575.1576
+1576.1577
+1577.1578
+1578.1579
+1579.158
+1580.1581
+1581.1582
+1582.1583
+1583.1584
+1584.1585
+1585.1586
+1586.1587
+1587.1588
+1588.1589
+1589.159
+1590.1591
+1591.1592
+1592.1593
+1593.1594
+1594.1595
+1595.1596
+1596.1597
+1597.1598
+1598.1599
+1599.16
+1600.1601
+1601.1602
+1602.1603
+1603.1604
+1604.1605
+1605.1606
+1606.1607
+1607.1608
+1608.1609
+1609.161
+1610.1611
+1611.1612
+1612.1613
+1613.1614
+1614.1615
+1615.1616
+1616.1617
+1617.1618
+1618.1619
+1619.162
+1620.1621
+1621.1622
+1622.1623
+1623.1624
+1624.1625
+1625.1626
+1626.1627
+1627.1628
+1628.1629
+1629.163
+1630.1631
+1631.1632
+1632.1633
+1633.1634
+1634.1635
+1635.1636
+1636.1637
+1637.1638
+1638.1639
+1639.164
+1640.1641
+1641.1642
+1642.1643
+1643.1644
+1644.1645
+1645.1646
+1646.1647
+1647.1648
+1648.1649
+1649.165
+1650.1651
+1651.1652
+1652.1653
+1653.1654
+1654.1655
+1655.1656
+1656.1657
+1657.1658
+1658.1659
+1659.166
+1660.1661
+1661.1662
+1662.1663
+1663.1664
+1664.1665
+1665.1666
+1666.1667
+1667.1668
+1668.1669
+1669.167
+1670.1671
+1671.1672
+1672.1673
+1673.1674
+1674.1675
+1675.1676
+1676.1677
+1677.1678
+1678.1679
+1679.168
+1680.1681
+1681.1682
+1682.1683
+1683.1684
+1684.1685
+1685.1686
+1686.1687
+1687.1688
+1688.1689
+1689.169
+1690.1691
+1691.1692
+1692.1693
+1693.1694
+1694.1695
+1695.1696
+1696.1697
+1697.1698
+1698.1699
+1699.17
+1700.1701
+1701.1702
+1702.1703
+1703.1704
+1704.1705
+1705.1706
+1706.1707
+1707.1708
+1708.1709
+1709.171
+1710.1711
+1711.1712
+1712.1713
+1713.1714
+1714.1715
+1715.1716
+1716.1717
+1717.1718
+1718.1719
+1719.172
+1720.1721
+1721.1722
+1722.1723
+1723.1724
+1724.1725
+1725.1726
+1726.1727
+1727.1728
+1728.1729
+1729.173
+1730.1731
+1731.1732
+1732.1733
+1733.1734
+1734.1735
+1735.1736
+1736.1737
+1737.1738
+1738.1739
+1739.174
+1740.1741
+1741.1742
+1742.1743
+1743.1744
+1744.1745
+1745.1746
+1746.1747
+1747.1748
+1748.1749
+1749.175
+1750.1751
+1751.1752
+1752.1753
+1753.1754
+1754.1755
+1755.1756
+1756.1757
+1757.1758
+1758.1759
+1759.176
+1760.1761
+1761.1762
+1762.1763
+1763.1764
+1764.1765
+1765.1766
+1766.1767
+1767.1768
+1768.1769
+1769.177
+1770.1771
+1771.1772
+1772.1773
+1773.1774
+1774.1775
+1775.1776
+1776.1777
+1777.1778
+1778.1779
+1779.178
+1780.1781
+1781.1782
+1782.1783
+1783.1784
+1784.1785
+1785.1786
+1786.1787
+1787.1788
+1788.1789
+1789.179
+1790.1791
+1791.1792
+1792.1793
+1793.1794
+1794.1795
+1795.1796
+1796.1797
+1797.1798
+1798.1799
+1799.18
+1800.1801
+1801.1802
+1802.1803
+1803.1804
+1804.1805
+1805.1806
+1806.1807
+1807.1808
+1808.1809
+1809.181
+1810.1811
+1811.1812
+1812.1813
+1813.1814
+1814.1815
+1815.1816
+1816.1817
+1817.1818
+1818.1819
+1819.182
+1820.1821
+1821.1822
+1822.1823
+1823.1824
+1824.1825
+1825.1826
+1826.1827
+1827.1828
+1828.1829
+1829.183
+1830.1831
+1831.1832
+1832.1833
+1833.1834
+1834.1835
+1835.1836
+1836.1837
+1837.1838
+1838.1839
+1839.184
+1840.1841
+1841.1842
+1842.1843
+1843.1844
+1844.1845
+1845.1846
+1846.1847
+1847.1848
+1848.1849
+1849.185
+1850.1851
+1851.1852
+1852.1853
+1853.1854
+1854.1855
+1855.1856
+1856.1857
+1857.1858
+1858.1859
+1859.186
+1860.1861
+1861.1862
+1862.1863
+1863.1864
+1864.1865
+1865.1866
+1866.1867
+1867.1868
+1868.1869
+1869.187
+1870.1871
+1871.1872
+1872.1873
+1873.1874
+1874.1875
+1875.1876
+1876.1877
+1877.1878
+1878.1879
+1879.188
+1880.1881
+1881.1882
+1882.1883
+1883.1884
+1884.1885
+1885.1886
+1886.1887
+1887.1888
+1888.1889
+1889.189
+1890.1891
+1891.1892
+1892.1893
+1893.1894
+1894.1895
+1895.1896
+1896.1897
+1897.1898
+1898.1899
+1899.19
+1900.1901
+1901.1902
+1902.1903
+1903.1904
+1904.1905
+1905.1906
+1906.1907
+1907.1908
+1908.1909
+1909.191
+1910.1911
+1911.1912
+1912.1913
+1913.1914
+1914.1915
+1915.1916
+1916.1917
+1917.1918
+1918.1919
+1919.192
+1920.1921
+1921.1922
+1922.1923
+1923.1924
+1924.1925
+1925.1926
+1926.1927
+1927.1928
+1928.1929
+1929.193
+1930.1931
+1931.1932
+1932.1933
+1933.1934
+1934.1935
+1935.1936
+1936.1937
+1937.1938
+1938.1939
+1939.194
+1940.1941
+1941.1942
+1942.1943
+1943.1944
+1944.1945
+1945.1946
+1946.1947
+1947.1948
+1948.1949
+1949.195
+1950.1951
+1951.1952
+1952.1953
+1953.1954
+1954.1955
+1955.1956
+1956.1957
+1957.1958
+1958.1959
+1959.196
+1960.1961
+1961.1962
+1962.1963
+1963.1964
+1964.1965
+1965.1966
+1966.1967
+1967.1968
+1968.1969
+1969.197
+1970.1971
+1971.1972
+1972.1973
+1973.1974
+1974.1975
+1975.1976
+1976.1977
+1977.1978
+1978.1979
+1979.198
+1980.1981
+1981.1982
+1982.1983
+1983.1984
+1984.1985
+1985.1986
+1986.1987
+1987.1988
+1988.1989
+1989.199
+1990.1991
+1991.1992
+1992.1993
+1993.1994
+1994.1995
+1995.1996
+1996.1997
+1997.1998
+1998.1999
+1999.2

http://git-wip-us.apache.org/repos/asf/flink/blob/edbf8c9e/flink-connectors/flink-orc/src/test/resources/decimal.orc
----------------------------------------------------------------------
diff --git a/flink-connectors/flink-orc/src/test/resources/decimal.orc b/flink-connectors/flink-orc/src/test/resources/decimal.orc
new file mode 100644
index 0000000..cb0f7b9
Binary files /dev/null and b/flink-connectors/flink-orc/src/test/resources/decimal.orc differ

http://git-wip-us.apache.org/repos/asf/flink/blob/edbf8c9e/flink-connectors/flink-orc/src/test/resources/demo-11-none.orc
----------------------------------------------------------------------
diff --git a/flink-connectors/flink-orc/src/test/resources/demo-11-none.orc b/flink-connectors/flink-orc/src/test/resources/demo-11-none.orc
new file mode 100644
index 0000000..1d1d714
Binary files /dev/null and b/flink-connectors/flink-orc/src/test/resources/demo-11-none.orc differ

http://git-wip-us.apache.org/repos/asf/flink/blob/edbf8c9e/flink-connectors/flink-orc/src/test/resources/log4j-test.properties
----------------------------------------------------------------------
diff --git a/flink-connectors/flink-orc/src/test/resources/log4j-test.properties b/flink-connectors/flink-orc/src/test/resources/log4j-test.properties
new file mode 100644
index 0000000..881dc06
--- /dev/null
+++ b/flink-connectors/flink-orc/src/test/resources/log4j-test.properties
@@ -0,0 +1,27 @@
+################################################################################
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+#  Unless required by applicable law or agreed to in writing, software
+#  distributed under the License is distributed on an "AS IS" BASIS,
+#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#  See the License for the specific language governing permissions and
+# limitations under the License.
+################################################################################
+
+# Set root logger level to DEBUG and its only appender to A1.
+log4j.rootLogger=OFF, A1
+
+# A1 is set to be a ConsoleAppender.
+log4j.appender.A1=org.apache.log4j.ConsoleAppender
+
+# A1 uses PatternLayout.
+log4j.appender.A1.layout=org.apache.log4j.PatternLayout
+log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n

http://git-wip-us.apache.org/repos/asf/flink/blob/edbf8c9e/flink-connectors/pom.xml
----------------------------------------------------------------------
diff --git a/flink-connectors/pom.xml b/flink-connectors/pom.xml
index c2d7bb0..e8dd7a8 100644
--- a/flink-connectors/pom.xml
+++ b/flink-connectors/pom.xml
@@ -36,6 +36,7 @@ under the License.
 	<packaging>pom</packaging>
 
 	<modules>
+		<module>flink-orc</module>
 		<module>flink-jdbc</module>
 		<module>flink-hadoop-compatibility</module>
 		<module>flink-hbase</module>


[8/9] flink git commit: [FLINK-2170] [connectors] Add OrcRowInputFormat and OrcTableSource.

Posted by fh...@apache.org.
http://git-wip-us.apache.org/repos/asf/flink/blob/200612ee/flink-connectors/flink-orc/src/main/java/org/apache/flink/orc/OrcUtils.java
----------------------------------------------------------------------
diff --git a/flink-connectors/flink-orc/src/main/java/org/apache/flink/orc/OrcUtils.java b/flink-connectors/flink-orc/src/main/java/org/apache/flink/orc/OrcUtils.java
index c7557c7..cfb4e0e 100644
--- a/flink-connectors/flink-orc/src/main/java/org/apache/flink/orc/OrcUtils.java
+++ b/flink-connectors/flink-orc/src/main/java/org/apache/flink/orc/OrcUtils.java
@@ -39,29 +39,36 @@ import org.apache.hadoop.hive.ql.exec.vector.StructColumnVector;
 import org.apache.hadoop.hive.ql.exec.vector.TimestampColumnVector;
 import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch;
 import org.apache.hadoop.hive.serde2.io.HiveDecimalWritable;
-
 import org.apache.orc.TypeDescription;
 
 import java.lang.reflect.Array;
 import java.math.BigDecimal;
+import java.nio.charset.StandardCharsets;
 import java.sql.Date;
 import java.sql.Timestamp;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
+import java.util.TimeZone;
+import java.util.function.DoubleFunction;
+import java.util.function.IntFunction;
+import java.util.function.LongFunction;
 
 /**
  * A class that provides utility methods for orc file reading.
  */
-public class OrcUtils {
+class OrcUtils {
+
+	private static final long MILLIS_PER_DAY = 86400000; // = 24 * 60 * 60 * 1000
+	private static final TimeZone LOCAL_TZ = TimeZone.getDefault();
 
 	/**
-	 * Convert ORC schema types to Flink types.
-	 *
-	 * @param schema schema of orc file
+	 * Converts an ORC schema to a Flink TypeInformation.
 	 *
+	 * @param schema The ORC schema.
+	 * @return The TypeInformation that corresponds to the ORC schema.
 	 */
-	public static TypeInformation schemaToTypeInfo(TypeDescription schema) {
+	static TypeInformation schemaToTypeInfo(TypeDescription schema) {
 		switch (schema.getCategory()) {
 			case BOOLEAN:
 				return BasicTypeInfo.BOOLEAN_TYPE_INFO;
@@ -77,6 +84,8 @@ public class OrcUtils {
 				return BasicTypeInfo.FLOAT_TYPE_INFO;
 			case DOUBLE:
 				return BasicTypeInfo.DOUBLE_TYPE_INFO;
+			case DECIMAL:
+				return BasicTypeInfo.BIG_DEC_TYPE_INFO;
 			case STRING:
 			case CHAR:
 			case VARCHAR:
@@ -97,154 +106,164 @@ public class OrcUtils {
 				return new RowTypeInfo(fieldTypes, fieldNames);
 			case LIST:
 				TypeDescription elementSchema = schema.getChildren().get(0);
-				TypeInformation elementType = schemaToTypeInfo(elementSchema);
+				TypeInformation<?> elementType = schemaToTypeInfo(elementSchema);
+				// arrays of primitive types are handled as object arrays to support null values
 				return ObjectArrayTypeInfo.getInfoFor(elementType);
 			case MAP:
 				TypeDescription keySchema = schema.getChildren().get(0);
 				TypeDescription valSchema = schema.getChildren().get(1);
-				TypeInformation keyType = schemaToTypeInfo(keySchema);
-				TypeInformation valType = schemaToTypeInfo(valSchema);
-				return new MapTypeInfo(keyType, valType);
-			case DECIMAL:
-				return BasicTypeInfo.BIG_DEC_TYPE_INFO;
+				TypeInformation<?> keyType = schemaToTypeInfo(keySchema);
+				TypeInformation<?> valType = schemaToTypeInfo(valSchema);
+				return new MapTypeInfo<>(keyType, valType);
 			case UNION:
-				throw new UnsupportedOperationException("UNION type not supported yet.");
+				throw new UnsupportedOperationException("UNION type is not supported yet.");
 			default:
 				throw new IllegalArgumentException("Unknown type " + schema);
 		}
 	}
 
 	/**
-	 * Fill rows from orc batch.
-	 *
-	 * @param rows the batch of rows need to be filled
-	 * @param schema schema of orc file
-	 * @param batch current orc batch data used to fill the rows
-	 * @param fieldMapping field mapping
+	 * Fills an ORC batch into an array of Row.
 	 *
+	 * @param rows The batch of rows need to be filled.
+	 * @param schema The schema of the ORC data.
+	 * @param batch The ORC data.
+	 * @param selectedFields The list of selected ORC fields.
+	 * @return The number of rows that were filled.
 	 */
-	public static void fillRows(Object[] rows, TypeDescription schema, VectorizedRowBatch batch, int[] fieldMapping) {
+	static int fillRows(Row[] rows, TypeDescription schema, VectorizedRowBatch batch, int[] selectedFields) {
 
-		int totalRowsInBatch = (int) batch.count();
+		int rowsToRead = Math.min((int) batch.count(), rows.length);
 
 		List<TypeDescription> fieldTypes = schema.getChildren();
-		for (int outIdx = 0; outIdx < fieldMapping.length; outIdx++) {
-			int inIdx = fieldMapping[outIdx];
-			readField(rows, outIdx, fieldTypes.get(inIdx), batch.cols[inIdx], null, Math.min((int) totalRowsInBatch, rows.length));
+		// read each selected field
+		for (int rowIdx = 0; rowIdx < selectedFields.length; rowIdx++) {
+			int orcIdx = selectedFields[rowIdx];
+			readField(rows, rowIdx, fieldTypes.get(orcIdx), batch.cols[orcIdx], null, rowsToRead);
 		}
+		return rowsToRead;
 	}
 
-	private static void readField(Object[] rows, int fieldIdx, TypeDescription schema, ColumnVector vector, long[] lengthVector, int childCount) {
+	/**
+	 * Reads a vector of data into an array of objects.
+	 *
+	 * @param vals The array that needs to be filled.
+	 * @param fieldIdx If the vals array is an array of Row, the index of the field that needs to be filled.
+	 *                 Otherwise a -1 must be passed and the data is directly filled into the array.
+	 * @param schema The schema of the vector to read.
+	 * @param vector The vector to read.
+	 * @param lengthVector If the vector is of type List or Map, the number of sub-elements to read for each field. Otherwise, it must be null.
+	 * @param childCount The number of vector entries to read.
+	 */
+	private static void readField(Object[] vals, int fieldIdx, TypeDescription schema, ColumnVector vector, long[] lengthVector, int childCount) {
 
+		// check the type of the vector to decide how to read it.
 		switch (schema.getCategory()) {
 			case BOOLEAN:
 				if (vector.noNulls) {
-					readNonNullBooleanColumn(rows, fieldIdx, (LongColumnVector) vector, lengthVector, childCount);
+					readNonNullLongColumn(vals, fieldIdx, (LongColumnVector) vector, lengthVector, childCount, OrcUtils::readBoolean, OrcUtils::boolArray);
 				} else {
-					readBooleanColumn(rows, fieldIdx, (LongColumnVector) vector, lengthVector, childCount);
+					readLongColumn(vals, fieldIdx, (LongColumnVector) vector, lengthVector, childCount, OrcUtils::readBoolean, OrcUtils::boolArray);
 				}
 				break;
 			case BYTE:
 				if (vector.noNulls) {
-					readNonNullByteColumn(rows, fieldIdx, (LongColumnVector) vector, lengthVector, childCount);
+					readNonNullLongColumn(vals, fieldIdx, (LongColumnVector) vector, lengthVector, childCount, OrcUtils::readByte, OrcUtils::byteArray);
 				} else {
-					readByteColumn(rows, fieldIdx, (LongColumnVector) vector, lengthVector, childCount);
+					readLongColumn(vals, fieldIdx, (LongColumnVector) vector, lengthVector, childCount, OrcUtils::readByte, OrcUtils::byteArray);
 				}
 				break;
 			case SHORT:
 				if (vector.noNulls) {
-					readNonNullShortColumn(rows, fieldIdx, (LongColumnVector) vector, lengthVector, childCount);
+					readNonNullLongColumn(vals, fieldIdx, (LongColumnVector) vector, lengthVector, childCount, OrcUtils::readShort, OrcUtils::shortArray);
 				} else {
-					readShortColumn(rows, fieldIdx, (LongColumnVector) vector, lengthVector, childCount);
+					readLongColumn(vals, fieldIdx, (LongColumnVector) vector, lengthVector, childCount, OrcUtils::readShort, OrcUtils::shortArray);
 				}
 				break;
 			case INT:
 				if (vector.noNulls) {
-					readNonNullIntColumn(rows, fieldIdx, (LongColumnVector) vector, lengthVector, childCount);
+					readNonNullLongColumn(vals, fieldIdx, (LongColumnVector) vector, lengthVector, childCount, OrcUtils::readInt, OrcUtils::intArray);
 				} else {
-					readIntColumn(rows, fieldIdx, (LongColumnVector) vector, lengthVector, childCount);
+					readLongColumn(vals, fieldIdx, (LongColumnVector) vector, lengthVector, childCount, OrcUtils::readInt, OrcUtils::intArray);
 				}
 				break;
 			case LONG:
 				if (vector.noNulls) {
-					readNonNullLongColumn(rows, fieldIdx, (LongColumnVector) vector, lengthVector, childCount);
+					readNonNullLongColumn(vals, fieldIdx, (LongColumnVector) vector, lengthVector, childCount, OrcUtils::readLong, OrcUtils::longArray);
 				} else {
-					readLongColumn(rows, fieldIdx, (LongColumnVector) vector, lengthVector, childCount);
+					readLongColumn(vals, fieldIdx, (LongColumnVector) vector, lengthVector, childCount, OrcUtils::readLong, OrcUtils::longArray);
 				}
 				break;
 			case FLOAT:
 				if (vector.noNulls) {
-					readNonNullFloatColumn(rows, fieldIdx, (DoubleColumnVector) vector, lengthVector, childCount);
+					readNonNullDoubleColumn(vals, fieldIdx, (DoubleColumnVector) vector, lengthVector, childCount, OrcUtils::readFloat, OrcUtils::floatArray);
 				} else {
-					readFloatColumn(rows, fieldIdx, (DoubleColumnVector) vector, lengthVector, childCount);
+					readDoubleColumn(vals, fieldIdx, (DoubleColumnVector) vector, lengthVector, childCount, OrcUtils::readFloat, OrcUtils::floatArray);
 				}
 				break;
 			case DOUBLE:
 				if (vector.noNulls) {
-					readNonNullDoubleColumn(rows, fieldIdx, (DoubleColumnVector) vector, lengthVector, childCount);
+					readNonNullDoubleColumn(vals, fieldIdx, (DoubleColumnVector) vector, lengthVector, childCount, OrcUtils::readDouble, OrcUtils::doubleArray);
 				} else {
-					readDoubleColumn(rows, fieldIdx, (DoubleColumnVector) vector, lengthVector, childCount);
+					readDoubleColumn(vals, fieldIdx, (DoubleColumnVector) vector, lengthVector, childCount, OrcUtils::readDouble, OrcUtils::doubleArray);
 				}
 				break;
 			case CHAR:
 			case VARCHAR:
 			case STRING:
 				if (vector.noNulls) {
-					readNonNullStringColumn(rows, fieldIdx, (BytesColumnVector) vector, lengthVector, childCount);
+					readNonNullBytesColumnAsString(vals, fieldIdx, (BytesColumnVector) vector, lengthVector, childCount);
 				} else {
-					readStringColumn(rows, fieldIdx, (BytesColumnVector) vector, lengthVector, childCount);
+					readBytesColumnAsString(vals, fieldIdx, (BytesColumnVector) vector, lengthVector, childCount);
 				}
 				break;
 			case DATE:
 				if (vector.noNulls) {
-					readNonNullDateColumn(rows, fieldIdx, (LongColumnVector) vector, lengthVector, childCount);
+					readNonNullLongColumnAsDate(vals, fieldIdx, (LongColumnVector) vector, lengthVector, childCount);
 				} else {
-					readDateColumn(rows, fieldIdx, (LongColumnVector) vector, lengthVector, childCount);
+					readLongColumnAsDate(vals, fieldIdx, (LongColumnVector) vector, lengthVector, childCount);
 				}
 				break;
 			case TIMESTAMP:
 				if (vector.noNulls) {
-					readNonNullTimestampColumn(rows, fieldIdx, (TimestampColumnVector) vector, lengthVector, childCount);
+					readNonNullTimestampColumn(vals, fieldIdx, (TimestampColumnVector) vector, lengthVector, childCount);
 				} else {
-					readTimestampColumn(rows, fieldIdx, (TimestampColumnVector) vector, lengthVector, childCount);
+					readTimestampColumn(vals, fieldIdx, (TimestampColumnVector) vector, lengthVector, childCount);
 				}
 				break;
 			case BINARY:
 				if (vector.noNulls) {
-					readNonNullBinaryColumn(rows, fieldIdx, (BytesColumnVector) vector, lengthVector, childCount);
+					readNonNullBytesColumnAsBinary(vals, fieldIdx, (BytesColumnVector) vector, lengthVector, childCount);
 				} else {
-					readBinaryColumn(rows, fieldIdx, (BytesColumnVector) vector, lengthVector, childCount);
+					readBytesColumnAsBinary(vals, fieldIdx, (BytesColumnVector) vector, lengthVector, childCount);
 				}
 				break;
 			case DECIMAL:
 				if (vector.noNulls) {
-					readNonNullDecimalColumn(rows, fieldIdx, (DecimalColumnVector) vector, lengthVector, childCount);
-				}
-				else {
-					readDecimalColumn(rows, fieldIdx, (DecimalColumnVector) vector, lengthVector, childCount);
+					readNonNullDecimalColumn(vals, fieldIdx, (DecimalColumnVector) vector, lengthVector, childCount);
+				} else {
+					readDecimalColumn(vals, fieldIdx, (DecimalColumnVector) vector, lengthVector, childCount);
 				}
 				break;
 			case STRUCT:
 				if (vector.noNulls) {
-					readNonNullStructColumn(rows, fieldIdx, (StructColumnVector) vector, schema, lengthVector, childCount);
+					readNonNullStructColumn(vals, fieldIdx, (StructColumnVector) vector, schema, lengthVector, childCount);
 				} else {
-					readStructColumn(rows, fieldIdx, (StructColumnVector) vector, schema, lengthVector, childCount);
+					readStructColumn(vals, fieldIdx, (StructColumnVector) vector, schema, lengthVector, childCount);
 				}
 				break;
 			case LIST:
 				if (vector.noNulls) {
-					readNonNullListColumn(rows, fieldIdx, (ListColumnVector) vector, schema, lengthVector, childCount);
-				}
-				else {
-					readListColumn(rows, fieldIdx, (ListColumnVector) vector, schema, lengthVector, childCount);
+					readNonNullListColumn(vals, fieldIdx, (ListColumnVector) vector, schema, lengthVector, childCount);
+				} else {
+					readListColumn(vals, fieldIdx, (ListColumnVector) vector, schema, lengthVector, childCount);
 				}
 				break;
 			case MAP:
 				if (vector.noNulls) {
-					readNonNullMapColumn(rows, fieldIdx, (MapColumnVector) vector, schema, lengthVector, childCount);
-				}
-				else {
-					readMapColumn(rows, fieldIdx, (MapColumnVector) vector, schema, lengthVector, childCount);
+					readNonNullMapColumn(vals, fieldIdx, (MapColumnVector) vector, schema, lengthVector, childCount);
+				} else {
+					readMapColumn(vals, fieldIdx, (MapColumnVector) vector, schema, lengthVector, childCount);
 				}
 				break;
 			case UNION:
@@ -254,1870 +273,1013 @@ public class OrcUtils {
 		}
 	}
 
-	private static void readNonNullBooleanColumn(Object[] rows, int fieldIdx, LongColumnVector vector, long[] lengthVector, int childCount) {
+	private static <T> void readNonNullLongColumn(Object[] vals, int fieldIdx, LongColumnVector vector, long[] lengthVector, int childCount,
+													LongFunction<T> reader, IntFunction<T[]> array) {
 
-		// check if boolean is directly in a list or not, e.g, array<boolean>
+		// check if the values need to be read into lists or as single values
 		if (lengthVector == null) {
 			if (vector.isRepeating) { // fill complete column with first value
-				boolean repeatingValue = vector.vector[0] != 0;
-				fillColumnWithRepeatingValue(rows, fieldIdx, repeatingValue, childCount);
+				T repeatingValue = reader.apply(vector.vector[0]);
+				fillColumnWithRepeatingValue(vals, fieldIdx, repeatingValue, childCount);
 			} else {
 				if (fieldIdx == -1) { // set as an object
 					for (int i = 0; i < childCount; i++) {
-						rows[i] = vector.vector[i] != 0;
+						vals[i] = reader.apply(vector.vector[i]);
 					}
 				} else { // set as a field of Row
+					Row[] rows = (Row[]) vals;
 					for (int i = 0; i < childCount; i++) {
-						((Row) rows[i]).setField(fieldIdx, vector.vector[i] != 0);
+						rows[i].setField(fieldIdx, reader.apply(vector.vector[i]));
 					}
 				}
 			}
 		} else { // in a list
-			boolean[] temp;
+			T[] temp;
 			int offset = 0;
 			if (vector.isRepeating) { // fill complete list with first value
-				boolean repeatingValue = vector.vector[0] != 0;
-				if (fieldIdx == -1) { // set list as an object
-					for (int i = 0; offset < childCount; i++) {
-						temp = new boolean[(int) lengthVector[i]];
-						Arrays.fill(temp, repeatingValue);
-						rows[i] = temp;
-						offset += temp.length;
-					}
-				} else { // set list as a field of Row
-					for (int i = 0; offset < childCount; i++) {
-						temp = new boolean[(int) lengthVector[i]];
-						Arrays.fill(temp, repeatingValue);
-						((Row) rows[i]).setField(fieldIdx, temp);
-						offset += temp.length;
+				T repeatingValue = reader.apply(vector.vector[0]);
+				for (int i = 0; offset < childCount; i++) {
+					temp = array.apply((int) lengthVector[i]);
+					Arrays.fill(temp, repeatingValue);
+					offset += temp.length;
+					if (fieldIdx == -1) {
+						vals[i] = temp;
+					} else {
+						((Row) vals[i]).setField(fieldIdx, temp);
 					}
 				}
 			} else {
-				if (fieldIdx == -1) { // set list as an object
-					for (int i = 0; offset < childCount; i++) {
-						temp = new boolean[(int) lengthVector[i]];
-						for (int j = 0; j < temp.length; j++) {
-							temp[j] = vector.vector[offset++] != 0;
-						}
-						rows[i] = temp;
+				for (int i = 0; offset < childCount; i++) {
+					temp = array.apply((int) lengthVector[i]);
+					for (int j = 0; j < temp.length; j++) {
+						temp[j] = reader.apply(vector.vector[offset++]);
 					}
-				} else { // set list as a field of Row
-					for (int i = 0; offset < childCount; i++) {
-						temp = new boolean[(int) lengthVector[i]];
-						for (int j = 0; j < temp.length; j++) {
-							temp[j] = vector.vector[offset++] != 0;
-						}
-						((Row) rows[i]).setField(fieldIdx, temp);
+					if (fieldIdx == -1) {
+						vals[i] = temp;
+					} else {
+						((Row) vals[i]).setField(fieldIdx, temp);
 					}
 				}
 			}
 		}
 	}
 
-	private static void readNonNullByteColumn(Object[] rows, int fieldIdx, LongColumnVector vector, long[] lengthVector, int childCount) {
+	private static <T> void readNonNullDoubleColumn(Object[] vals, int fieldIdx, DoubleColumnVector vector, long[] lengthVector, int childCount,
+													DoubleFunction<T> reader, IntFunction<T[]> array) {
 
-		// check if byte is directly in a list or not, e.g, array<byte>
+		// check if the values need to be read into lists or as single values
 		if (lengthVector == null) {
 			if (vector.isRepeating) { // fill complete column with first value
-				byte repeatingValue = (byte) vector.vector[0];
-				fillColumnWithRepeatingValue(rows, fieldIdx, repeatingValue, childCount);
+				T repeatingValue = reader.apply(vector.vector[0]);
+				fillColumnWithRepeatingValue(vals, fieldIdx, repeatingValue, childCount);
 			} else {
 				if (fieldIdx == -1) { // set as an object
 					for (int i = 0; i < childCount; i++) {
-						rows[i] = (byte) vector.vector[i];
+						vals[i] = reader.apply(vector.vector[i]);
 					}
 				} else { // set as a field of Row
+					Row[] rows = (Row[]) vals;
 					for (int i = 0; i < childCount; i++) {
-						((Row) rows[i]).setField(fieldIdx, (byte) vector.vector[i]);
+						rows[i].setField(fieldIdx, reader.apply(vector.vector[i]));
 					}
 				}
 			}
 		} else { // in a list
-			byte[] temp;
+			T[] temp;
 			int offset = 0;
 			if (vector.isRepeating) { // fill complete list with first value
-				byte repeatingValue = (byte) vector.vector[0];
-				if (fieldIdx == -1) { // set list as an object
-					for (int i = 0; offset < childCount; i++) {
-						temp = new byte[(int) lengthVector[i]];
-						Arrays.fill(temp, repeatingValue);
-						rows[i] = temp;
-						offset += temp.length;
-					}
-				} else { // set list as a field of Row
-					for (int i = 0; offset < childCount; i++) {
-						temp = new byte[(int) lengthVector[i]];
-						Arrays.fill(temp, repeatingValue);
-						((Row) rows[i]).setField(fieldIdx, temp);
-						offset += temp.length;
+				T repeatingValue = reader.apply(vector.vector[0]);
+				for (int i = 0; offset < childCount; i++) {
+					temp = array.apply((int) lengthVector[i]);
+					Arrays.fill(temp, repeatingValue);
+					offset += temp.length;
+					if (fieldIdx == -1) {
+						vals[i] = temp;
+					} else {
+						((Row) vals[i]).setField(fieldIdx, temp);
 					}
 				}
 			} else {
-				if (fieldIdx == -1) { // set list as an object
-					for (int i = 0; offset < childCount; i++) {
-						temp = new byte[(int) lengthVector[i]];
-						for (int j = 0; j < temp.length; j++) {
-							temp[j] = (byte) vector.vector[offset++];
-						}
-						rows[i] = temp;
+				for (int i = 0; offset < childCount; i++) {
+					temp = array.apply((int) lengthVector[i]);
+					for (int j = 0; j < temp.length; j++) {
+						temp[j] = reader.apply(vector.vector[offset++]);
 					}
-				} else { // set list as a field of Row
-					for (int i = 0; offset < childCount; i++) {
-						temp = new byte[(int) lengthVector[i]];
-						for (int j = 0; j < temp.length; j++) {
-							temp[j] = (byte) vector.vector[offset++];
-						}
-						((Row) rows[i]).setField(fieldIdx, temp);
+					if (fieldIdx == -1) {
+						vals[i] = temp;
+					} else {
+						((Row) vals[i]).setField(fieldIdx, temp);
 					}
 				}
 			}
 		}
 	}
 
-	private static void readNonNullShortColumn(Object[] rows, int fieldIdx, LongColumnVector vector, long[] lengthVector, int childCount) {
-
-		// check if short is directly in a list or not, e.g, array<short>
+	private static void readNonNullBytesColumnAsString(Object[] vals, int fieldIdx, BytesColumnVector bytes, long[] lengthVector, int childCount) {
+		// check if the values need to be read into lists or as single values
 		if (lengthVector == null) {
-			if (vector.isRepeating) { // fill complete column with first value
-				short repeatingValue = (short) vector.vector[0];
-				fillColumnWithRepeatingValue(rows, fieldIdx, repeatingValue, childCount);
+			if (bytes.isRepeating) { // fill complete column with first value
+				String repeatingValue = new String(bytes.vector[0], bytes.start[0], bytes.length[0]);
+				fillColumnWithRepeatingValue(vals, fieldIdx, repeatingValue, childCount);
 			} else {
 				if (fieldIdx == -1) { // set as an object
 					for (int i = 0; i < childCount; i++) {
-						rows[i] = (short) vector.vector[i];
+						vals[i] = new String(bytes.vector[i], bytes.start[i], bytes.length[i], StandardCharsets.UTF_8);
 					}
 				} else { // set as a field of Row
+					Row[] rows = (Row[]) vals;
 					for (int i = 0; i < childCount; i++) {
-						((Row) rows[i]).setField(fieldIdx, (short) vector.vector[i]);
+						rows[i].setField(fieldIdx, new String(bytes.vector[i], bytes.start[i], bytes.length[i], StandardCharsets.UTF_8));
 					}
 				}
 			}
-		} else { // in a list
-			short[] temp;
+		} else {
+			String[] temp;
 			int offset = 0;
-			if (vector.isRepeating) { // fill complete list with first value
-				short repeatingValue = (short) vector.vector[0];
-				if (fieldIdx == -1) { // set list as an object
-					for (int i = 0; offset < childCount; i++) {
-						temp = new short[(int) lengthVector[i]];
-						Arrays.fill(temp, repeatingValue);
-						rows[i] = temp;
-						offset += temp.length;
-					}
-				} else { // set list as a field of Row
-					for (int i = 0; offset < childCount; i++) {
-						temp = new short[(int) lengthVector[i]];
-						Arrays.fill(temp, repeatingValue);
-						((Row) rows[i]).setField(fieldIdx, temp);
-						offset += temp.length;
+			if (bytes.isRepeating) { // fill complete list with first value
+				String repeatingValue = new String(bytes.vector[0], bytes.start[0], bytes.length[0], StandardCharsets.UTF_8);
+				for (int i = 0; offset < childCount; i++) {
+					temp = new String[(int) lengthVector[i]];
+					Arrays.fill(temp, repeatingValue);
+					offset += temp.length;
+					if (fieldIdx == -1) {
+						vals[i] = temp;
+					} else {
+						((Row) vals[i]).setField(fieldIdx, temp);
 					}
 				}
 			} else {
-				if (fieldIdx == -1) { // set list as an object
-					for (int i = 0; offset < childCount; i++) {
-						temp = new short[(int) lengthVector[i]];
-						for (int j = 0; j < temp.length; j++) {
-							temp[j] = (short) vector.vector[offset++];
-						}
-						rows[i] = temp;
+				for (int i = 0; offset < childCount; i++) {
+					temp = new String[(int) lengthVector[i]];
+					for (int j = 0; j < temp.length; j++) {
+						temp[j] = new String(bytes.vector[offset], bytes.start[offset], bytes.length[offset], StandardCharsets.UTF_8);
+						offset++;
 					}
-				} else { // set list as a field of Row
-					for (int i = 0; offset < childCount; i++) {
-						temp = new short[(int) lengthVector[i]];
-						for (int j = 0; j < temp.length; j++) {
-							temp[j] = (short) vector.vector[offset++];
-						}
-						((Row) rows[i]).setField(fieldIdx, temp);
+					if (fieldIdx == -1) {
+						vals[i] = temp;
+					} else {
+						((Row) vals[i]).setField(fieldIdx, temp);
 					}
 				}
 			}
 		}
 	}
 
-	private static void readNonNullIntColumn(Object[] rows, int fieldIdx, LongColumnVector vector, long[] lengthVector, int childCount) {
-
-		// check if int is directly in a list or not, e.g, array<int>
+	private static void readNonNullBytesColumnAsBinary(Object[] vals, int fieldIdx, BytesColumnVector bytes, long[] lengthVector, int childCount) {
+		// check if the values need to be read into lists or as single values
 		if (lengthVector == null) {
-			if (vector.isRepeating) { // fill complete column with first value
-				int repeatingValue = (int) vector.vector[0];
-				fillColumnWithRepeatingValue(rows, fieldIdx, repeatingValue, childCount);
+			if (bytes.isRepeating) { // fill complete column with first value
+				if (fieldIdx == -1) { // set as an object
+					for (int i = 0; i < childCount; i++) {
+						// don't reuse repeating val to avoid object mutation
+						vals[i] = readBinary(bytes.vector[0], bytes.start[0], bytes.length[0]);
+					}
+				} else { // set as a field of Row
+					Row[] rows = (Row[]) vals;
+					for (int i = 0; i < childCount; i++) {
+						// don't reuse repeating val to avoid object mutation
+						rows[i].setField(fieldIdx, readBinary(bytes.vector[0], bytes.start[0], bytes.length[0]));
+					}
+				}
 			} else {
 				if (fieldIdx == -1) { // set as an object
 					for (int i = 0; i < childCount; i++) {
-						rows[i] = (int) vector.vector[i];
+						vals[i] = readBinary(bytes.vector[i], bytes.start[i], bytes.length[i]);
 					}
 				} else { // set as a field of Row
+					Row[] rows = (Row[]) vals;
 					for (int i = 0; i < childCount; i++) {
-						((Row) rows[i]).setField(fieldIdx, (int) vector.vector[i]);
+						rows[i].setField(fieldIdx, readBinary(bytes.vector[i], bytes.start[i], bytes.length[i]));
 					}
 				}
 			}
-		} else { // in a list
-			int[] temp;
+		} else {
+			byte[][] temp;
 			int offset = 0;
-			if (vector.isRepeating) { // fill complete list with first value
-				int repeatingValue = (int) vector.vector[0];
-				if (fieldIdx == -1) { // set list as an object
-					for (int i = 0; offset < childCount; i++) {
-						temp = new int[(int) lengthVector[i]];
-						Arrays.fill(temp, repeatingValue);
-						rows[i] = temp;
-						offset += temp.length;
-					}
-				} else { // set list as a field of Row
-					for (int i = 0; offset < childCount; i++) {
-						temp = new int[(int) lengthVector[i]];
-						Arrays.fill(temp, repeatingValue);
-						((Row) rows[i]).setField(fieldIdx, temp);
-						offset += temp.length;
+			if (bytes.isRepeating) { // fill complete list with first value
+				for (int i = 0; offset < childCount; i++) {
+					temp = new byte[(int) lengthVector[i]][];
+					for (int j = 0; j < temp.length; j++) {
+						temp[j] = readBinary(bytes.vector[0], bytes.start[0], bytes.length[0]);
+					}
+					offset += temp.length;
+					if (fieldIdx == -1) {
+						vals[i] = temp;
+					} else {
+						((Row) vals[i]).setField(fieldIdx, temp);
 					}
 				}
 			} else {
-				if (fieldIdx == -1) { // set list as an object
-					for (int i = 0; offset < childCount; i++) {
-						temp = new int[(int) lengthVector[i]];
-						for (int j = 0; j < temp.length; j++) {
-							temp[j] = (int) vector.vector[offset++];
-						}
-						rows[i] = temp;
+				for (int i = 0; offset < childCount; i++) {
+					temp = new byte[(int) lengthVector[i]][];
+					for (int j = 0; j < temp.length; j++) {
+						temp[j] = readBinary(bytes.vector[offset], bytes.start[offset], bytes.length[offset]);
+						offset++;
 					}
-				} else { // set list as a field of Row
-					for (int i = 0; offset < childCount; i++) {
-						temp = new int[(int) lengthVector[i]];
-						for (int j = 0; j < temp.length; j++) {
-							temp[j] = (int) vector.vector[offset++];
-						}
-						((Row) rows[i]).setField(fieldIdx, temp);
+					if (fieldIdx == -1) {
+						vals[i] = temp;
+					} else {
+						((Row) vals[i]).setField(fieldIdx, temp);
 					}
 				}
 			}
 		}
 	}
 
-	private static void readNonNullLongColumn(Object[] rows, int fieldIdx, LongColumnVector vector, long[] lengthVector, int childCount) {
+	private static void readNonNullLongColumnAsDate(Object[] vals, int fieldIdx, LongColumnVector vector, long[] lengthVector, int childCount) {
 
-		// check if long is directly in a list or not, e.g, array<long>
+		// check if the values need to be read into lists or as single values
 		if (lengthVector == null) {
 			if (vector.isRepeating) { // fill complete column with first value
-				long repeatingValue = vector.vector[0];
-				fillColumnWithRepeatingValue(rows, fieldIdx, repeatingValue, childCount);
+				if (fieldIdx == -1) { // set as an object
+					for (int i = 0; i < childCount; i++) {
+						// do not reuse repeated value due to mutability of Date
+						vals[i] = readDate(vector.vector[0]);
+					}
+				} else { // set as a field of Row
+					Row[] rows = (Row[]) vals;
+					for (int i = 0; i < childCount; i++) {
+						// do not reuse repeated value due to mutability of Date
+						rows[i].setField(fieldIdx, readDate(vector.vector[0]));
+					}
+				}
 			} else {
 				if (fieldIdx == -1) { // set as an object
 					for (int i = 0; i < childCount; i++) {
-						rows[i] = vector.vector[i];
+						vals[i] = readDate(vector.vector[i]);
 					}
 				} else { // set as a field of Row
+					Row[] rows = (Row[]) vals;
 					for (int i = 0; i < childCount; i++) {
-						((Row) rows[i]).setField(fieldIdx, (Long) vector.vector[i]);
+						rows[i].setField(fieldIdx, readDate(vector.vector[i]));
 					}
 				}
 			}
 		} else { // in a list
-			long[] temp;
+			Date[] temp;
 			int offset = 0;
 			if (vector.isRepeating) { // fill complete list with first value
-				long repeatingValue = vector.vector[0];
-				if (fieldIdx == -1) { // set list as an object
-					for (int i = 0; offset < childCount; i++) {
-						temp = new long[(int) lengthVector[i]];
-						Arrays.fill(temp, repeatingValue);
-						rows[i] = temp;
-						offset += temp.length;
-					}
-				} else { // set list as a field of Row
-					for (int i = 0; offset < childCount; i++) {
-						temp = new long[(int) lengthVector[i]];
-						Arrays.fill(temp, repeatingValue);
-						((Row) rows[i]).setField(fieldIdx, temp);
-						offset += temp.length;
+				for (int i = 0; offset < childCount; i++) {
+					temp = new Date[(int) lengthVector[i]];
+					for (int j = 0; j < temp.length; j++) {
+						temp[j] = readDate(vector.vector[0]);
+					}
+					offset += temp.length;
+					if (fieldIdx == -1) {
+						vals[i] = temp;
+					} else {
+						((Row) vals[i]).setField(fieldIdx, temp);
 					}
 				}
 			} else {
-				if (fieldIdx == -1) { // set list as an object
-					for (int i = 0; offset < childCount; i++) {
-						temp = new long[(int) lengthVector[i]];
-						for (int j = 0; j < temp.length; j++) {
-							temp[j] = vector.vector[offset++];
-						}
-						rows[i] = temp;
+				for (int i = 0; offset < childCount; i++) {
+					temp = new Date[(int) lengthVector[i]];
+					for (int j = 0; j < temp.length; j++) {
+						temp[j] = readDate(vector.vector[offset++]);
 					}
-				} else { // set list as a field of Row
-					for (int i = 0; offset < childCount; i++) {
-						temp = new long[(int) lengthVector[i]];
-						for (int j = 0; j < temp.length; j++) {
-							temp[j] = vector.vector[offset++];
-						}
-						((Row) rows[i]).setField(fieldIdx, temp);
+					if (fieldIdx == -1) {
+						vals[i] = temp;
+					} else {
+						((Row) vals[i]).setField(fieldIdx, temp);
 					}
 				}
 			}
 		}
 	}
 
-	private static void readNonNullFloatColumn(Object[] rows, int fieldIdx, DoubleColumnVector vector, long[] lengthVector, int childCount) {
+	private static void readNonNullTimestampColumn(Object[] vals, int fieldIdx, TimestampColumnVector vector, long[] lengthVector, int childCount) {
 
-		// check if float is directly in a list or not, e.g, array<float>
+		// check if the timestamps need to be read into lists or as single values
 		if (lengthVector == null) {
 			if (vector.isRepeating) { // fill complete column with first value
-				float repeatingValue = (float) vector.vector[0];
-				fillColumnWithRepeatingValue(rows, fieldIdx, repeatingValue, childCount);
+				if (fieldIdx == -1) { // set as an object
+					for (int i = 0; i < childCount; i++) {
+						// do not reuse value to prevent object mutation
+						vals[i] = readTimestamp(vector.time[0], vector.nanos[0]);
+					}
+				} else { // set as a field of Row
+					Row[] rows = (Row[]) vals;
+					for (int i = 0; i < childCount; i++) {
+						// do not reuse value to prevent object mutation
+						rows[i].setField(fieldIdx, readTimestamp(vector.time[0], vector.nanos[0]));
+					}
+				}
 			} else {
 				if (fieldIdx == -1) { // set as an object
 					for (int i = 0; i < childCount; i++) {
-						rows[i] = (float) vector.vector[i];
+						vals[i] = readTimestamp(vector.time[i], vector.nanos[i]);
 					}
 				} else { // set as a field of Row
+					Row[] rows = (Row[]) vals;
 					for (int i = 0; i < childCount; i++) {
-						((Row) rows[i]).setField(fieldIdx, (float) vector.vector[i]);
+						rows[i].setField(fieldIdx, readTimestamp(vector.time[i], vector.nanos[i]));
 					}
 				}
 			}
-		} else { // in a list
-			float[] temp;
+		} else {
+			Timestamp[] temp;
 			int offset = 0;
 			if (vector.isRepeating) { // fill complete list with first value
-				float repeatingValue = (float) vector.vector[0];
-				if (fieldIdx == -1) { // set list as an object
-					for (int i = 0; offset < childCount; i++) {
-						temp = new float[(int) lengthVector[i]];
-						Arrays.fill(temp, repeatingValue);
-						rows[i] = temp;
-						offset += temp.length;
-					}
-				} else { // set list as a field of Row
-					for (int i = 0; offset < childCount; i++) {
-						temp = new float[(int) lengthVector[i]];
-						Arrays.fill(temp, repeatingValue);
-						((Row) rows[i]).setField(fieldIdx, temp);
-						offset += temp.length;
+				for (int i = 0; offset < childCount; i++) {
+					temp = new Timestamp[(int) lengthVector[i]];
+					for (int j = 0; j < temp.length; j++) {
+						// do not reuse value to prevent object mutation
+						temp[j] = readTimestamp(vector.time[0], vector.nanos[0]);
+					}
+					offset += temp.length;
+					if (fieldIdx == -1) {
+						vals[i] = temp;
+					} else {
+						((Row) vals[i]).setField(fieldIdx, temp);
 					}
 				}
 			} else {
-				if (fieldIdx == -1) { // set list as an object
-					for (int i = 0; offset < childCount; i++) {
-						temp = new float[(int) lengthVector[i]];
-						for (int j = 0; j < temp.length; j++) {
-							temp[j] = (float) vector.vector[offset++];
-						}
-						rows[i] = temp;
+				for (int i = 0; offset < childCount; i++) {
+					temp = new Timestamp[(int) lengthVector[i]];
+					for (int j = 0; j < temp.length; j++) {
+						temp[j] = readTimestamp(vector.time[offset], vector.nanos[offset]);
+						offset++;
 					}
-				} else { // set list as a field of Row
-					for (int i = 0; offset < childCount; i++) {
-						temp = new float[(int) lengthVector[i]];
-						for (int j = 0; j < temp.length; j++) {
-							temp[j] = (float) vector.vector[offset++];
-						}
-						((Row) rows[i]).setField(fieldIdx, temp);
+					if (fieldIdx == -1) {
+						vals[i] = temp;
+					} else {
+						((Row) vals[i]).setField(fieldIdx, temp);
 					}
 				}
 			}
 		}
 	}
 
-	private static void readNonNullDoubleColumn(Object[] rows, int fieldIdx, DoubleColumnVector vector, long[] lengthVector, int childCount) {
+	private static void readNonNullDecimalColumn(Object[] vals, int fieldIdx, DecimalColumnVector vector, long[] lengthVector, int childCount) {
 
-		// check if double is directly in a list or not, e.g, array<double>
+		// check if the decimals need to be read into lists or as single values
 		if (lengthVector == null) {
 			if (vector.isRepeating) { // fill complete column with first value
-				double repeatingValue = vector.vector[0];
-				fillColumnWithRepeatingValue(rows, fieldIdx, repeatingValue, childCount);
+				fillColumnWithRepeatingValue(vals, fieldIdx, readBigDecimal(vector.vector[0]), childCount);
 			} else {
 				if (fieldIdx == -1) { // set as an object
 					for (int i = 0; i < childCount; i++) {
-						rows[i] = vector.vector[i];
+						vals[i] = readBigDecimal(vector.vector[i]);
 					}
 				} else { // set as a field of Row
+					Row[] rows = (Row[]) vals;
 					for (int i = 0; i < childCount; i++) {
-						((Row) rows[i]).setField(fieldIdx, vector.vector[i]);
+						rows[i].setField(fieldIdx, readBigDecimal(vector.vector[i]));
 					}
 				}
 			}
-		} else { // in a list
-			double[] temp;
+		} else {
+			BigDecimal[] temp;
 			int offset = 0;
 			if (vector.isRepeating) { // fill complete list with first value
-				double repeatingValue = vector.vector[0];
-				if (fieldIdx == -1) { // set list as an object
-					for (int i = 0; offset < childCount; i++) {
-						temp = new double[(int) lengthVector[i]];
-						Arrays.fill(temp, repeatingValue);
-						rows[i] = temp;
-						offset += temp.length;
-					}
-				} else { // set list as a field of Row
-					for (int i = 0; offset < childCount; i++) {
-						temp = new double[(int) lengthVector[i]];
-						Arrays.fill(temp, repeatingValue);
-						((Row) rows[i]).setField(fieldIdx, temp);
-						offset += temp.length;
+				BigDecimal repeatingValue = readBigDecimal(vector.vector[0]);
+				for (int i = 0; offset < childCount; i++) {
+					temp = new BigDecimal[(int) lengthVector[i]];
+					Arrays.fill(temp, repeatingValue);
+					offset += temp.length;
+					if (fieldIdx == -1) {
+						vals[i] = temp;
+					} else {
+						((Row) vals[i]).setField(fieldIdx, temp);
 					}
 				}
 			} else {
-				if (fieldIdx == -1) { // set list as an object
-					for (int i = 0; offset < childCount; i++) {
-						temp = new double[(int) lengthVector[i]];
-						for (int j = 0; j < temp.length; j++) {
-							temp[j] = vector.vector[offset++];
-						}
-						rows[i] = temp;
+				for (int i = 0; offset < childCount; i++) {
+					temp = new BigDecimal[(int) lengthVector[i]];
+					for (int j = 0; j < temp.length; j++) {
+						temp[j] = readBigDecimal(vector.vector[offset++]);
 					}
-				} else { // set list as a field of Row
-					for (int i = 0; offset < childCount; i++) {
-						temp = new double[(int) lengthVector[i]];
-						for (int j = 0; j < temp.length; j++) {
-							temp[j] = vector.vector[offset++];
-						}
-						((Row) rows[i]).setField(fieldIdx, temp);
+					if (fieldIdx == -1) {
+						vals[i] = temp;
+					} else {
+						((Row) vals[i]).setField(fieldIdx, temp);
 					}
 				}
 			}
 		}
+
 	}
 
-	private static void readNonNullStringColumn(Object[] rows, int fieldIdx, BytesColumnVector bytes, long[] lengthVector, int childCount) {
+	private static void readNonNullStructColumn(Object[] vals, int fieldIdx, StructColumnVector structVector, TypeDescription schema, long[] lengthVector, int childCount) {
+
+		List<TypeDescription> childrenTypes = schema.getChildren();
+
+		int numFields = childrenTypes.size();
+		// create a batch of Rows to read the structs
+		Row[] structs = new Row[childCount];
+		// TODO: possible improvement: reuse existing Row objects
+		for (int i = 0; i < childCount; i++) {
+			structs[i] = new Row(numFields);
+		}
+
+		// read struct fields
+		for (int i = 0; i < numFields; i++) {
+			readField(structs, i, childrenTypes.get(i), structVector.fields[i], null, childCount);
+		}
 
-		// check if string is directly in a list or not, e.g, array<string>
+		// check if the structs need to be read into lists or as single values
 		if (lengthVector == null) {
-			if (bytes.isRepeating) { // fill complete column with first value
-				String repeatingValue = new String(bytes.vector[0], bytes.start[0], bytes.length[0]);
-				fillColumnWithRepeatingValue(rows, fieldIdx, repeatingValue, childCount);
-			} else {
-				if (fieldIdx == -1) { // set as an object
-					for (int i = 0; i < childCount; i++) {
-						rows[i] = new String(bytes.vector[i], bytes.start[i], bytes.length[i]);
-					}
-				} else { // set as a field of Row
-					for (int i = 0; i < childCount; i++) {
-						((Row) rows[i]).setField(fieldIdx, new String(bytes.vector[i], bytes.start[i], bytes.length[i]));
-					}
+			if (fieldIdx == -1) { // set struct as an object
+				System.arraycopy(structs, 0, vals, 0, childCount);
+			} else { // set struct as a field of Row
+				Row[] rows = (Row[]) vals;
+				for (int i = 0; i < childCount; i++) {
+					rows[i].setField(fieldIdx, structs[i]);
 				}
 			}
-		}
-		else { // in a list
-			String[] temp;
+		} else { // struct in a list
 			int offset = 0;
-			if (bytes.isRepeating) { // fill list with first value
-				String repeatingValue = new String(bytes.vector[0], bytes.start[0], bytes.length[0]);
-				if (fieldIdx == -1) { // set list as an object
-					for (int i = 0; i < childCount; i++) {
-						temp = new String[(int) lengthVector[i]];
-						Arrays.fill(temp, repeatingValue);
-						rows[i] = temp;
-						offset += temp.length;
-					}
-				} else { // set list as a field
-					for (int i = 0; i < childCount; i++) {
-						temp = new String[(int) lengthVector[i]];
-						Arrays.fill(temp, repeatingValue);
-						((Row) rows[i]).setField(fieldIdx, temp);
-						offset += temp.length;
-					}
+			Row[] temp;
+			for (int i = 0; offset < childCount; i++) {
+				temp = new Row[(int) lengthVector[i]];
+				System.arraycopy(structs, offset, temp, 0, temp.length);
+				offset = offset + temp.length;
+				if (fieldIdx == -1) {
+					vals[i] = temp;
+				} else {
+					((Row) vals[i]).setField(fieldIdx, temp);
 				}
-			} else {
-				if (fieldIdx == -1) { // set list as an object
-					for (int i = 0; offset < childCount; i++) {
-						temp = new String[(int) lengthVector[i]];
-						for (int j = 0; j < temp.length; j++) {
-							temp[j] = new String(bytes.vector[offset], bytes.start[offset], bytes.length[offset]);
-							offset++;
-						}
-						rows[i] = temp;
-					}
-				} else { // set list as a field
-					for (int i = 0; offset < childCount; i++) {
-						temp = new String[(int) lengthVector[i]];
-						for (int j = 0; j < temp.length; j++) {
-							temp[j] = new String(bytes.vector[offset], bytes.start[offset], bytes.length[offset]);
-							offset++;
-						}
-						((Row) rows[i]).setField(fieldIdx, temp);
-					}
+			}
+		}
+	}
+
+	private static void readNonNullListColumn(Object[] vals, int fieldIdx, ListColumnVector list, TypeDescription schema, long[] lengthVector, int childCount) {
+
+		TypeDescription fieldType = schema.getChildren().get(0);
+		// check if the list need to be read into lists or as single values
+		if (lengthVector == null) {
+			long[] lengthVectorNested = list.lengths;
+			readField(vals, fieldIdx, fieldType, list.child, lengthVectorNested, list.childCount);
+		} else { // list in a list
+			Object[] nestedLists = new Object[childCount];
+			// length vector for nested list
+			long[] lengthVectorNested = list.lengths;
+			// read nested list
+			readField(nestedLists, -1, fieldType, list.child, lengthVectorNested, list.childCount);
+			// get type of nestedList
+			Class<?> classType = nestedLists[0].getClass();
+
+			// fill outer list with nested list
+			int offset = 0;
+			int length;
+			for (int i = 0; offset < childCount; i++) {
+				length = (int) lengthVector[i];
+				Object[] temp = (Object[]) Array.newInstance(classType, length);
+				System.arraycopy(nestedLists, offset, temp, 0, length);
+				offset = offset + length;
+				if (fieldIdx == -1) {
+					vals[i] = temp;
+				} else {
+					((Row) vals[i]).setField(fieldIdx, temp);
 				}
 			}
 		}
+	}
+
+	private static void readNonNullMapColumn(Object[] vals, int fieldIdx, MapColumnVector mapsVector, TypeDescription schema, long[] lengthVector, int childCount) {
+
+		List<TypeDescription> fieldType = schema.getChildren();
+		TypeDescription keyType = fieldType.get(0);
+		TypeDescription valueType = fieldType.get(1);
+
+		ColumnVector keys = mapsVector.keys;
+		ColumnVector values = mapsVector.values;
+		Object[] keyRows = new Object[mapsVector.childCount];
+		Object[] valueRows = new Object[mapsVector.childCount];
+
+		// read map keys and values
+		readField(keyRows, -1, keyType, keys, null, keyRows.length);
+		readField(valueRows, -1, valueType, values, null, valueRows.length);
+
+		// check if the maps need to be read into lists or as single values
+		if (lengthVector == null) {
+			long[] lengthVectorMap = mapsVector.lengths;
+			int offset = 0;
+
+			for (int i = 0; i < childCount; i++) {
+				long numMapEntries = lengthVectorMap[i];
+				HashMap map = readHashMap(keyRows, valueRows, offset, numMapEntries);
+				offset += numMapEntries;
+
+				if (fieldIdx == -1) {
+					vals[i] = map;
+				} else {
+					((Row) vals[i]).setField(fieldIdx, map);
+				}
+			}
+		} else { // list of map
+
+			long[] lengthVectorMap = mapsVector.lengths;
+			int mapOffset = 0; // offset of map element
+			int offset = 0; // offset of map
+			HashMap[] temp;
 
+			for (int i = 0; offset < childCount; i++) {
+				temp = new HashMap[(int) lengthVector[i]];
+				for (int j = 0; j < temp.length; j++) {
+					long numMapEntries = lengthVectorMap[offset];
+					temp[j] = readHashMap(keyRows, valueRows, mapOffset, numMapEntries);
+					mapOffset += numMapEntries;
+					offset++;
+				}
+				if (fieldIdx == 1) {
+					vals[i] = temp;
+				} else {
+					((Row) vals[i]).setField(fieldIdx, temp);
+				}
+			}
+		}
 	}
 
-	private static void readNonNullDateColumn(Object[] rows, int fieldIdx, LongColumnVector vector, long[] lengthVector, int childCount) {
+	private static <T> void readLongColumn(Object[] vals, int fieldIdx, LongColumnVector vector, long[] lengthVector, int childCount,
+											LongFunction<T> reader, IntFunction<T[]> array) {
 
-		// check if date is directly in a list or not, e.g, array<date>
+		// check if the values need to be read into lists or as single values
 		if (lengthVector == null) {
 			if (vector.isRepeating) { // fill complete column with first value
-				if (fieldIdx == -1) { // set as an object
-					for (int i = 0; i < childCount; i++) {
-						rows[i] = readDate(vector.vector[0]);
-					}
-				} else { // set as a field of Row
-					for (int i = 0; i < childCount; i++) {
-						((Row) rows[i]).setField(fieldIdx, readDate(vector.vector[0]));
-					}
-				}
+				// since the column contains null values and has just one distinct value, the repeated value is null
+				fillColumnWithRepeatingValue(vals, fieldIdx, null, childCount);
 			} else {
+				boolean[] isNullVector = vector.isNull;
 				if (fieldIdx == -1) { // set as an object
 					for (int i = 0; i < childCount; i++) {
-						rows[i] = readDate(vector.vector[i]);
+						if (isNullVector[i]) {
+							vals[i] = null;
+						} else {
+							vals[i] = reader.apply(vector.vector[i]);
+						}
 					}
 				} else { // set as a field of Row
+					Row[] rows = (Row[]) vals;
 					for (int i = 0; i < childCount; i++) {
-						((Row) rows[i]).setField(fieldIdx, readDate(vector.vector[i]));
-					}
-				}
-			}
-		} else {
-			Date[] temp;
-			int offset = 0;
-			if (vector.isRepeating) { // fill complete list with first value
-				if (fieldIdx == -1) { // set list as an object
-					for (int i = 0; offset < childCount; i++) {
-						temp = new Date[(int) lengthVector[i]];
-						for (int j = 0; j < temp.length; j++) {
-							temp[j] = readDate(vector.vector[0]);
-						}
-						rows[i] = temp;
-						offset += temp.length;
-					}
-				} else { // set list as a field of Row
-					for (int i = 0; offset < childCount; i++) {
-						temp = new Date[(int) lengthVector[i]];
-						for (int j = 0; j < temp.length; j++) {
-							temp[j] = readDate(vector.vector[0]);
+						if (isNullVector[i]) {
+							rows[i].setField(fieldIdx, null);
+						} else {
+							rows[i].setField(fieldIdx, reader.apply(vector.vector[i]));
 						}
-						((Row) rows[i]).setField(fieldIdx, temp);
-						offset += temp.length;
 					}
 				}
+			}
+		} else { // in a list
+			if (vector.isRepeating) { // // fill complete list with first value
+				// since the column contains null values and has just one distinct value, the repeated value is null
+				fillListWithRepeatingNull(vals, fieldIdx, lengthVector, childCount, array);
 			} else {
-				if (fieldIdx == -1) { // set list as an object
-					for (int i = 0; offset < childCount; i++) {
-						temp = new Date[(int) lengthVector[i]];
-						for (int j = 0; j < temp.length; j++) {
-							temp[j] = readDate(vector.vector[offset++]);
+				// column contain null values
+				int offset = 0;
+				T[] temp;
+				boolean[] isNullVector = vector.isNull;
+				for (int i = 0; offset < childCount; i++) {
+					temp = array.apply((int) lengthVector[i]);
+					for (int j = 0; j < temp.length; j++) {
+						if (isNullVector[offset]) {
+							offset++;
+						} else {
+							temp[j] = reader.apply(vector.vector[offset++]);
 						}
-						rows[i] = temp;
 					}
-				} else { // set list as a field of Row
-					for (int i = 0; offset < childCount; i++) {
-						temp = new Date[(int) lengthVector[i]];
-						for (int j = 0; j < temp.length; j++) {
-							temp[j] = readDate(vector.vector[offset++]);
-						}
-						((Row) rows[i]).setField(fieldIdx, temp);
+					if (fieldIdx == -1) {
+						vals[i] = temp;
+					} else {
+						((Row) vals[i]).setField(fieldIdx, temp);
 					}
 				}
 			}
 		}
 	}
 
-	private static void readNonNullTimestampColumn(Object[] rows, int fieldIdx, TimestampColumnVector vector, long[] lengthVector, int childCount) {
+	private static <T> void readDoubleColumn(Object[] vals, int fieldIdx, DoubleColumnVector vector, long[] lengthVector, int childCount,
+												DoubleFunction<T> reader, IntFunction<T[]> array) {
 
-		// check if timestamp is directly in a list or not, e.g, array<timestamp>
+		// check if the values need to be read into lists or as single values
 		if (lengthVector == null) {
 			if (vector.isRepeating) { // fill complete column with first value
-				if (fieldIdx == -1) { // set as an object
-					for (int i = 0; i < childCount; i++) {
-						rows[i] = readTimeStamp(vector.time[0], vector.nanos[0]);
-					}
-				} else { // set as a field of Row
-					for (int i = 0; i < childCount; i++) {
-						((Row) rows[i]).setField(fieldIdx, readTimeStamp(vector.time[0], vector.nanos[0]));
-					}
-				}
+				// since the column contains null values and has just one distinct value, the repeated value is null
+				fillColumnWithRepeatingValue(vals, fieldIdx, null, childCount);
 			} else {
+				boolean[] isNullVector = vector.isNull;
 				if (fieldIdx == -1) { // set as an object
 					for (int i = 0; i < childCount; i++) {
-						rows[i] = readTimeStamp(vector.time[i], vector.nanos[i]);
+						if (isNullVector[i]) {
+							vals[i] = null;
+						} else {
+							vals[i] = reader.apply(vector.vector[i]);
+						}
 					}
 				} else { // set as a field of Row
+					Row[] rows = (Row[]) vals;
 					for (int i = 0; i < childCount; i++) {
-						((Row) rows[i]).setField(fieldIdx, readTimeStamp(vector.time[i], vector.nanos[i]));
-					}
-				}
-			}
-		} else {
-			Timestamp[] temp;
-			int offset = 0;
-			if (vector.isRepeating) { // fill complete list with first value
-				if (fieldIdx == -1) { // set list as an object
-					for (int i = 0; offset < childCount; i++) {
-						temp = new Timestamp[(int) lengthVector[i]];
-						for (int j = 0; j < temp.length; j++) {
-							temp[j] = readTimeStamp(vector.time[0], vector.nanos[0]);
-						}
-						rows[i] = temp;
-						offset += temp.length;
-					}
-				} else { // set list as a field of Row
-					for (int i = 0; offset < childCount; i++) {
-						temp = new Timestamp[(int) lengthVector[i]];
-						for (int j = 0; j < temp.length; j++) {
-							temp[j] = readTimeStamp(vector.time[0], vector.nanos[0]);
+						if (isNullVector[i]) {
+							rows[i].setField(fieldIdx, null);
+						} else {
+							rows[i].setField(fieldIdx, reader.apply(vector.vector[i]));
 						}
-						((Row) rows[i]).setField(fieldIdx, temp);
-						offset += temp.length;
 					}
 				}
+			}
+		} else { // in a list
+			if (vector.isRepeating) { // // fill complete list with first value
+				// since the column contains null values and has just one distinct value, the repeated value is null
+				fillListWithRepeatingNull(vals, fieldIdx, lengthVector, childCount, array);
 			} else {
-				if (fieldIdx == -1) { // set list as an object
-					for (int i = 0; offset < childCount; i++) {
-						temp = new Timestamp[(int) lengthVector[i]];
-						for (int j = 0; j < temp.length; j++) {
-							temp[j] = readTimeStamp(vector.time[offset], vector.nanos[offset]);
+				// column contain null values
+				int offset = 0;
+				T[] temp;
+				boolean[] isNullVector = vector.isNull;
+				for (int i = 0; offset < childCount; i++) {
+					temp = array.apply((int) lengthVector[i]);
+					for (int j = 0; j < temp.length; j++) {
+						if (isNullVector[offset]) {
 							offset++;
+						} else {
+							temp[j] = reader.apply(vector.vector[offset++]);
 						}
-						rows[i] = temp;
 					}
-				} else { // set list as a field of Row
-					for (int i = 0; offset < childCount; i++) {
-						temp = new Timestamp[(int) lengthVector[i]];
-						for (int j = 0; j < temp.length; j++) {
-							temp[j] = readTimeStamp(vector.time[offset], vector.nanos[offset]);
-							offset++;
-						}
-						((Row) rows[i]).setField(fieldIdx, temp);
+					if (fieldIdx == -1) {
+						vals[i] = temp;
+					} else {
+						((Row) vals[i]).setField(fieldIdx, temp);
 					}
 				}
 			}
 		}
 	}
 
-	private static void readNonNullBinaryColumn(Object[] rows, int fieldIdx, BytesColumnVector bytes, long[] lengthVector, int childCount) {
+	private static void readBytesColumnAsString(Object[] vals, int fieldIdx, BytesColumnVector bytes, long[] lengthVector, int childCount) {
 
-		// check if string is directly in a list or not, e.g, array<string>
+		// check if the values need to be read into lists or as single values
 		if (lengthVector == null) {
 			if (bytes.isRepeating) { // fill complete column with first value
-				if (fieldIdx == -1) { // set as an object
-					for (int i = 0; i < childCount; i++) {
-						rows[i] = readBinary(bytes.vector[0], bytes.start[0], bytes.length[0]);
-					}
-				} else { // set as a field of Row
-					for (int i = 0; i < childCount; i++) {
-						((Row) rows[i]).setField(fieldIdx, readBinary(bytes.vector[0], bytes.start[0], bytes.length[0]));
-					}
-				}
-			} else {
-				if (fieldIdx == -1) { // set as an object
-					for (int i = 0; i < childCount; i++) {
-						rows[i] = readBinary(bytes.vector[i], bytes.start[i], bytes.length[i]);
-					}
-				} else { // set as a field of Row
-					for (int i = 0; i < childCount; i++) {
-						((Row) rows[i]).setField(fieldIdx, readBinary(bytes.vector[i], bytes.start[i], bytes.length[i]));
-					}
-				}
-			}
-		} else {
-			byte[][] temp;
-			int offset = 0;
-			if (bytes.isRepeating) { // fill complete list with first value
-				if (fieldIdx == -1) { // set list as an object
-					for (int i = 0; offset < childCount; i++) {
-						temp = new byte[(int) lengthVector[i]][];
-						for (int j = 0; j < temp.length; j++) {
-							temp[j] = readBinary(bytes.vector[0], bytes.start[0], bytes.length[0]);
-						}
-						rows[i] = temp;
-						offset += temp.length;
-					}
-				} else { // set list as a field
-					for (int i = 0; offset < childCount; i++) {
-						temp = new byte[(int) lengthVector[i]][];
-						for (int j = 0; j < temp.length; j++) {
-							temp[j] = readBinary(bytes.vector[0], bytes.start[0], bytes.length[0]);
-						}
-						((Row) rows[i]).setField(fieldIdx, temp);
-						offset += temp.length;
-					}
-				}
-			} else {
-				if (fieldIdx == -1) { // set list as an object
-					for (int i = 0; offset < childCount; i++) {
-						temp = new byte[(int) lengthVector[i]][];
-						for (int j = 0; j < temp.length; j++) {
-							temp[j] = readBinary(bytes.vector[offset], bytes.start[offset], bytes.length[offset]);
-							offset++;
-						}
-						rows[i] = temp;
-					}
-				} else { // set list as a field
-					for (int i = 0; offset < childCount; i++) {
-						temp = new byte[(int) lengthVector[i]][];
-						for (int j = 0; j < temp.length; j++) {
-							temp[j] = readBinary(bytes.vector[offset], bytes.start[offset], bytes.length[offset]);
-							offset++;
-						}
-						((Row) rows[i]).setField(fieldIdx, temp);
-					}
-				}
-			}
-		}
-
-	}
-
-	private static void readNonNullDecimalColumn(Object[] rows, int fieldIdx, DecimalColumnVector vector, long[] lengthVector, int childCount) {
-
-		// check if decimal is directly in a list or not, e.g, array<decimal>
-		if (lengthVector == null) {
-			if (vector.isRepeating) { // fill complete column with first value
-				fillColumnWithRepeatingValue(rows, fieldIdx, readBigDecimal(vector.vector[0]), childCount);
-			} else {
-				if (fieldIdx == -1) { // set as an object
-					for (int i = 0; i < childCount; i++) {
-						rows[i] = readBigDecimal(vector.vector[i]);
-					}
-				} else { // set as a field of Row
-					for (int i = 0; i < childCount; i++) {
-						((Row) rows[i]).setField(fieldIdx, readBigDecimal(vector.vector[i]));
-					}
-				}
-			}
-		} else {
-			BigDecimal[] temp;
-			int offset = 0;
-			if (vector.isRepeating) { // fill complete list with first value
-				BigDecimal repeatingValue = readBigDecimal(vector.vector[0]);
-				if (fieldIdx == -1) { // set list as an object
-					for (int i = 0; offset < childCount; i++) {
-						temp = new BigDecimal[(int) lengthVector[i]];
-						Arrays.fill(temp, repeatingValue);
-						rows[i] = temp;
-						offset += temp.length;
-					}
-				} else { // set list as a field of Row
-					for (int i = 0; offset < childCount; i++) {
-						temp = new BigDecimal[(int) lengthVector[i]];
-						Arrays.fill(temp, repeatingValue);
-						((Row) rows[i]).setField(fieldIdx, temp);
-						offset += temp.length;
-					}
-				}
-			} else {
-				if (fieldIdx == -1) { // set list as an object
-					for (int i = 0; offset < childCount; i++) {
-						temp = new BigDecimal[(int) lengthVector[i]];
-						for (int j = 0; j < temp.length; j++) {
-							temp[j] = readBigDecimal(vector.vector[offset++]);
-						}
-						rows[i] = temp;
-					}
-				} else { // set list as a field of Row
-					for (int i = 0; offset < childCount; i++) {
-						temp = new BigDecimal[(int) lengthVector[i]];
-						for (int j = 0; j < temp.length; j++) {
-							temp[j] = readBigDecimal(vector.vector[offset++]);
-						}
-						((Row) rows[i]).setField(fieldIdx, temp);
-					}
-				}
-			}
-		}
-
-	}
-
-	private static void readNonNullStructColumn(Object[] rows, int fieldIdx, StructColumnVector struct, TypeDescription schema, long[] lengthVector, int childCount) {
-
-		List<TypeDescription> childrenTypes = schema.getChildren();
-
-		int numChildren = childrenTypes.size();
-		Row[] nestedFields = new Row[childCount];
-		for (int i = 0; i < childCount; i++) {
-			nestedFields[i] = new Row(numChildren);
-		}
-		for (int i = 0; i < numChildren; i++) {
-			readField(nestedFields, i, childrenTypes.get(i), struct.fields[i], null, childCount);
-		}
-
-		// check if struct is directly in a list or not, e.g, array<struct<dt>>
-		if (lengthVector == null) {
-			if (fieldIdx == -1) { // set struct as an object
-				System.arraycopy(nestedFields, 0, rows, 0, childCount);
-			}
-			else { // set struct as a field of Row
-				for (int i = 0; i < childCount; i++) {
-					((Row) rows[i]).setField(fieldIdx, nestedFields[i]);
-				}
-			}
-		}
-		else { // struct in a list
-			int offset = 0;
-			Row[] temp;
-			if (fieldIdx == -1) { // set list of struct as an object
-				for (int i = 0; offset < childCount; i++) {
-					temp = new Row[(int) lengthVector[i]];
-					System.arraycopy(nestedFields, offset, temp, 0, temp.length);
-					offset = offset + temp.length;
-					rows[i] = temp;
-				}
-			}
-			else { // set list of struct as a field of Row
-				for (int i = 0; offset < childCount; i++) {
-					temp = new Row[(int) lengthVector[i]];
-					System.arraycopy(nestedFields, offset, temp, 0, temp.length);
-					offset = offset + temp.length;
-					((Row) rows[i]).setField(fieldIdx, temp);
-				}
-			}
-		}
-	}
-
-	private static void readNonNullListColumn(Object[] rows, int fieldIdx, ListColumnVector list, TypeDescription schema, long[] lengthVector, int childCount) {
-
-		TypeDescription fieldType = schema.getChildren().get(0);
-		if (lengthVector == null) {
-			long[] lengthVectorNested = list.lengths;
-			readField(rows, fieldIdx, fieldType, list.child, lengthVectorNested, list.childCount);
-		}
-		else { // list in a list
-
-			Object[] nestedList = new Object[childCount];
-
-			// length vector for nested list
-			long[] lengthVectorNested = list.lengths;
-
-			// read nested list
-			readField(nestedList, -1, fieldType, list.child, lengthVectorNested, list.childCount);
-
-			// get type of nestedList
-			Class<?> classType = nestedList[0].getClass();
-
-			// fill outer list with nested list
-			int offset = 0;
-			int length;
-			if (fieldIdx == -1) { // set list of list as an object
-				for (int i = 0; offset < childCount; i++) {
-					length = (int) lengthVector[i];
-					Object temp = Array.newInstance(classType, length);
-					System.arraycopy(nestedList, offset, temp, 0, length);
-					offset = offset + length;
-					rows[i] = temp;
-
-				}
-			} else { // set list of list as an field on Row
-				for (int i = 0; offset < childCount; i++) {
-					length = (int) lengthVector[i];
-					Object temp = Array.newInstance(classType, length);
-					System.arraycopy(nestedList, offset, temp, 0, length);
-					offset = offset + length;
-					((Row) rows[i]).setField(fieldIdx, temp);
-				}
-			}
-		}
-
-	}
-
-	private static void readNonNullMapColumn(Object[] rows, int fieldIdx, MapColumnVector map, TypeDescription schema, long[] lengthVector, int childCount) {
-
-		List<TypeDescription> fieldType = schema.getChildren();
-		TypeDescription keyType = fieldType.get(0);
-		TypeDescription valueType = fieldType.get(1);
-
-		ColumnVector keys = map.keys;
-		ColumnVector values = map.values;
-		Object[] keyRows = new Object[map.childCount];
-		Object[] valueRows = new Object[map.childCount];
-
-		// read map kes and values
-		readField(keyRows, -1, keyType, keys, null, keyRows.length);
-		readField(valueRows, -1, valueType, values, null, valueRows.length);
-
-		// check if map is directly in a list or not, e.g, array<map<k,v>>
-		if (lengthVector == null) {
-			long[] lengthVectorMap = map.lengths;
-			int offset = 0;
-			if (fieldIdx == -1) {
-				for (int i = 0; i < childCount; i++) {
-					rows[i] = readHashMap(keyRows, valueRows, offset, lengthVectorMap[i]);
-					offset += lengthVectorMap[i];
-				}
-			} else {
-				for (int i = 0; i < childCount; i++) {
-					((Row) rows[i]).setField(fieldIdx, readHashMap(keyRows, valueRows, offset, lengthVectorMap[i]));
-					offset += lengthVectorMap[i];
-				}
-			}
-		} else { // list of map
-
-			long[] lengthVectorMap = map.lengths;
-			int mapOffset = 0; // offset of map element
-			int offset = 0; // offset of map
-			HashMap[] temp;
-			if (fieldIdx == -1) { // set map list as an object
-				for (int i = 0; offset < childCount; i++) {
-					temp = new HashMap[(int) lengthVector[i]];
-					for (int j = 0; j < temp.length; j++) {
-						temp[j] = readHashMap(keyRows, valueRows, mapOffset, lengthVectorMap[offset]);
-						mapOffset += lengthVectorMap[offset];
-						offset++;
-					}
-					rows[i] = temp;
-				}
-			} else { // set map list as a field of Row
-				for (int i = 0; offset < childCount; i++) {
-					temp = new HashMap[(int) lengthVector[i]];
-					for (int j = 0; j < temp.length; j++) {
-						temp[j] = readHashMap(keyRows, valueRows, mapOffset, lengthVectorMap[offset]);
-						mapOffset += lengthVectorMap[offset];
-						offset++;
-					}
-					((Row) rows[i]).setField(fieldIdx, temp);
-				}
-			}
-		}
-	}
-
-	private static void fillColumnWithRepeatingValue(Object[] rows, int fieldIdx, Object repeatingValue, int childCount) {
-
-		if (fieldIdx == -1) { // set as an object
-			for (int i = 0; i < childCount; i++) {
-				rows[i] = repeatingValue;
-			}
-		} else { // set as a field of Row
-			for (int i = 0; i < childCount; i++) {
-				((Row) rows[i]).setField(fieldIdx, repeatingValue);
-			}
-		}
-	}
-
-	private static void fillListWithRepeatingNull(Object[] rows, int fieldIdx, Class<?> classType, long[] lengthVector, int childCount) {
-
-		int length;
-		if (fieldIdx == -1) {
-			for (int i = 0; i < childCount; i++) {
-				length = (int) lengthVector[i];
-				Object temp = Array.newInstance(classType, length);
-				rows[i] = temp;
-			}
-		} else {
-			for (int i = 0; i < childCount; i++) {
-				length = (int) lengthVector[i];
-				Object temp = Array.newInstance(classType, length);
-				((Row) rows[i]).setField(fieldIdx, temp);
-			}
-		}
-	}
-
-	private static void readBooleanColumn(Object[] rows, int fieldIdx, LongColumnVector vector, long[] lengthVector, int childCount) {
-
-		// check if data type(dt) is directly in list or not, e.g, array<dt>
-		if (lengthVector == null) {
-			if (vector.isRepeating) { // fill complete column with first value
-				// Also column contains null value and it's repeating
-				fillColumnWithRepeatingValue(rows, fieldIdx, null, childCount);
-			} else {
-				boolean[] isNullVector = vector.isNull;
-				if (fieldIdx == -1) { // set as an object
-					for (int i = 0; i < childCount; i++) {
-						if (isNullVector[i]) {
-							rows[i] = null;
-							continue;
-						}
-						rows[i] = vector.vector[i] != 0;
-					}
-				} else { // set as a field of Row
-					for (int i = 0; i < childCount; i++) {
-						if (isNullVector[i]) {
-							((Row) rows[i]).setField(fieldIdx, null);
-							continue;
-						}
-						((Row) rows[i]).setField(fieldIdx, vector.vector[i] != 0);
-					}
-				}
-			}
-		} else { // in a list
-			if (vector.isRepeating) { // // fill complete list with first value
-				// Also column contains null value and it's repeating
-				// so all values are null, but we need to set list with null values
-				fillListWithRepeatingNull(rows, fieldIdx, boolean[].class, lengthVector, childCount);
-			} else {
-				// column contain null values
-				int offset = 0;
-				boolean[] temp;
-				boolean[] isNullVector = vector.isNull;
-				if (fieldIdx == -1) { // set list as an object
-					for (int i = 0; offset < childCount; i++) {
-						temp = new boolean[(int) lengthVector[i]];
-						for (int j = 0; j < temp.length; j++) {
-							if (isNullVector[offset]) {
-								offset++;
-								continue;
-							}
-							temp[j] = vector.vector[offset++] != 0;
-						}
-						rows[i] = temp;
-					}
-				} else { // set list as a field of Row
-					for (int i = 0; offset < childCount; i++) {
-						temp = new boolean[(int) lengthVector[i]];
-						for (int j = 0; j < temp.length; j++) {
-							if (isNullVector[offset]) {
-								offset++;
-								continue;
-							}
-							temp[j] = vector.vector[offset++] != 0;
-						}
-						((Row) rows[i]).setField(fieldIdx, temp);
-					}
-				}
-			}
-		}
-	}
-
-	private static void readByteColumn(Object[] rows, int fieldIdx, LongColumnVector vector, long[] lengthVector, int childCount) {
-
-		// check if data type(dt) is directly in list or not, e.g, array<dt>
-		if (lengthVector == null) {
-			if (vector.isRepeating) { // fill complete column with first value
-				// Also column contains null value and it's repeating
-				fillColumnWithRepeatingValue(rows, fieldIdx, null, childCount);
-			} else {
-				boolean[] isNullVector = vector.isNull;
-				if (fieldIdx == -1) { // set as an object
-					for (int i = 0; i < childCount; i++) {
-						if (isNullVector[i]) {
-							rows[i] = null;
-							continue;
-						}
-						rows[i] = (byte) vector.vector[i];
-					}
-				} else { // set as a field of Row
-					for (int i = 0; i < childCount; i++) {
-						if (isNullVector[i]) {
-							((Row) rows[i]).setField(fieldIdx, null);
-							continue;
-						}
-						((Row) rows[i]).setField(fieldIdx, (byte) vector.vector[i]);
-					}
-				}
-			}
-		} else { // in a list
-			if (vector.isRepeating) { // // fill complete list with first value
-				// Also column contains null value and it's repeating
-				// so all values are null, but we need to set list with null values
-				fillListWithRepeatingNull(rows, fieldIdx, byte[].class, lengthVector, childCount);
-			} else {
-				// column contain null values
-				int offset = 0;
-				byte[] temp;
-				boolean[] isNullVector = vector.isNull;
-				if (fieldIdx == -1) { // set list as an object
-					for (int i = 0; offset < childCount; i++) {
-						temp = new byte[(int) lengthVector[i]];
-						for (int j = 0; j < temp.length; j++) {
-							if (isNullVector[offset]) {
-								offset++;
-								continue;
-							}
-							temp[j] = (byte) vector.vector[offset++];
-						}
-						rows[i] = temp;
-					}
-				} else { // set list as a field of Row
-					for (int i = 0; offset < childCount; i++) {
-						temp = new byte[(int) lengthVector[i]];
-						for (int j = 0; j < temp.length; j++) {
-							if (isNullVector[offset]) {
-								offset++;
-								continue;
-							}
-							temp[j] = (byte) vector.vector[offset++];
-						}
-						((Row) rows[i]).setField(fieldIdx, temp);
-					}
-				}
-			}
-		}
-	}
-
-	private static void readShortColumn(Object[] rows, int fieldIdx, LongColumnVector vector, long[] lengthVector, int childCount) {
-
-		// check if data type(dt) is directly in list or not, e.g, array<dt>
-		if (lengthVector == null) {
-			if (vector.isRepeating) { // fill complete column with first value
-				// Also column contains null value and it's repeating
-				fillColumnWithRepeatingValue(rows, fieldIdx, null, childCount);
-			} else {
-				boolean[] isNullVector = vector.isNull;
-				if (fieldIdx == -1) { // set as an object
-					for (int i = 0; i < childCount; i++) {
-						if (isNullVector[i]) {
-							rows[i] = null;
-							continue;
-						}
-						rows[i] = (short) vector.vector[i];
-					}
-				} else { // set as field of Row
-					for (int i = 0; i < childCount; i++) {
-						if (isNullVector[i]) {
-							((Row) rows[i]).setField(fieldIdx, null);
-							continue;
-						}
-						((Row) rows[i]).setField(fieldIdx, (short) vector.vector[i]);
-					}
-				}
-			}
-		} else { // in a list
-			if (vector.isRepeating) { // // fill complete list with first value
-				// Also column contains null value and it's repeating
-				// so all values are null, but we need to set list with null values
-				fillListWithRepeatingNull(rows, fieldIdx, short[].class, lengthVector, childCount);
-			} else {
-				// column contain null values
-				int offset = 0;
-				short[] temp;
-				boolean[] isNullVector = vector.isNull;
-				if (fieldIdx == -1) { // set list as an object
-					for (int i = 0; offset < childCount; i++) {
-						temp = new short[(int) lengthVector[i]];
-						for (int j = 0; j < temp.length; j++) {
-							if (isNullVector[offset]) {
-								offset++;
-								continue;
-							}
-							temp[j] = (short) vector.vector[offset++];
-						}
-						rows[i] = temp;
-					}
-				} else { // set list as a field of Row
-					for (int i = 0; offset < childCount; i++) {
-						temp = new short[(int) lengthVector[i]];
-						for (int j = 0; j < temp.length; j++) {
-							if (isNullVector[offset]) {
-								offset++;
-								continue;
-							}
-							temp[j] = (short) vector.vector[offset++];
-						}
-						((Row) rows[i]).setField(fieldIdx, temp);
-					}
-				}
-			}
-		}
-	}
-
-	private static void readIntColumn(Object[] rows, int fieldIdx, LongColumnVector vector, long[] lengthVector, int childCount) {
-
-		// check if data type(dt) is directly in list or not, e.g, array<dt>
-		if (lengthVector == null) {
-			if (vector.isRepeating) { // fill complete column with first value
-				// Also column contains null value and it's repeating
-				fillColumnWithRepeatingValue(rows, fieldIdx, null, childCount);
-			} else {
-				boolean[] isNullVector = vector.isNull;
-				if (fieldIdx == -1) { // set as an object
-					for (int i = 0; i < childCount; i++) {
-						if (isNullVector[i]) {
-							rows[i] = null;
-							continue;
-						}
-						rows[i] = (int) vector.vector[i];
-					}
-				} else { // set as a field of Row
-					for (int i = 0; i < childCount; i++) {
-						if (isNullVector[i]) {
-							((Row) rows[i]).setField(fieldIdx, null);
-							continue;
-						}
-						((Row) rows[i]).setField(fieldIdx, (int) vector.vector[i]);
-					}
-				}
-			}
-		} else { // in a list
-			if (vector.isRepeating) { // // fill complete list with first value
-				// Also column contains null value and it's repeating
-				// so all values are null, but we need to set list with null values
-				fillListWithRepeatingNull(rows, fieldIdx, int[].class, lengthVector, childCount);
-			} else {
-				// column contain null values
-				int offset = 0;
-				int[] temp;
-				boolean[] isNullVector = vector.isNull;
-				if (fieldIdx == -1) { // set list as an object
-					for (int i = 0; offset < childCount; i++) {
-						temp = new int[(int) lengthVector[i]];
-						for (int j = 0; j < temp.length; j++) {
-							if (isNullVector[offset]) {
-								offset++;
-								continue;
-							}
-							temp[j] = (int) vector.vector[offset++];
-						}
-						rows[i] = temp;
-					}
-				} else { // set list as a field of Row
-					for (int i = 0; offset < childCount; i++) {
-						temp = new int[(int) lengthVector[i]];
-						for (int j = 0; j < temp.length; j++) {
-							if (isNullVector[offset]) {
-								offset++;
-								continue;
-							}
-							temp[j] = (int) vector.vector[offset++];
-						}
-						((Row) rows[i]).setField(fieldIdx, temp);
-					}
-				}
-			}
-		}
-	}
-
-	private static void readLongColumn(Object[] rows, int fieldIdx, LongColumnVector vector, long[] lengthVector, int childCount) {
-
-		// check if data type(dt) is directly in list or not, e.g, array<dt>
-		if (lengthVector == null) {
-			if (vector.isRepeating) { // fill complete column with first value
-				// Also column contains null value and it's repeating
-				fillColumnWithRepeatingValue(rows, fieldIdx, null, childCount);
-			} else {
-				boolean[] isNullVector = vector.isNull;
-				if (fieldIdx == -1) { // set as an object
-					for (int i = 0; i < childCount; i++) {
-						if (isNullVector[i]) {
-							rows[i] = null;
-							continue;
-						}
-						rows[i] = vector.vector[i];
-					}
-				} else { // set as a field of Row
-					for (int i = 0; i < childCount; i++) {
-						if (isNullVector[i]) {
-							((Row) rows[i]).setField(fieldIdx, null);
-							continue;
-						}
-						((Row) rows[i]).setField(fieldIdx, vector.vector[i]);
-					}
-				}
-			}
-		} else { // in a list
-			if (vector.isRepeating) { // // fill complete list with first value
-				// Also column contains null value and it's repeating
-				// so all values are null, but we need to set list with null values
-				fillListWithRepeatingNull(rows, fieldIdx, long[].class, lengthVector, childCount);
-			} else {
-				// column contain null values
-				int offset = 0;
-				long[] temp;
-				boolean[] isNullVector = vector.isNull;
-				if (fieldIdx == -1) { // set list as an object
-					for (int i = 0; offset < childCount; i++) {
-						temp = new long[(int) lengthVector[i]];
-						for (int j = 0; j < temp.length; j++) {
-							if (isNullVector[offset]) {
-								offset++;
-								continue;
-							}
-							temp[j] = vector.vector[offset++];
-						}
-						rows[i] = temp;
-					}
-				} else { // set list as a field of Row
-					for (int i = 0; offset < childCount; i++) {
-						temp = new long[(int) lengthVector[i]];
-						for (int j = 0; j < temp.length; j++) {
-							if (isNullVector[offset]) {
-								offset++;
-								continue;
-							}
-							temp[j] = vector.vector[offset++];
-						}
-						((Row) rows[i]).setField(fieldIdx, temp);
-					}
-				}
-			}
-		}
-	}
-
-	private static void readFloatColumn(Object[] rows, int fieldIdx, DoubleColumnVector vector, long[] lengthVector, int childCount) {
-
-		// check if data type(dt) is directly in list or not, e.g, array<dt>
-		if (lengthVector == null) {
-			if (vector.isRepeating) { // fill complete column with first value
-				// Also column contains null value and it's repeating
-				fillColumnWithRepeatingValue(rows, fieldIdx, null, childCount);
+				// since the column contains null values and has just one distinct value, the repeated value is null
+				fillColumnWithRepeatingValue(vals, fieldIdx, null, childCount);
 			} else {
-				boolean[] isNullVector = vector.isNull;
+				boolean[] isNullVector = bytes.isNull;
 				if (fieldIdx == -1) { // set as an object
 					for (int i = 0; i < childCount; i++) {
 						if (isNullVector[i]) {
-							rows[i] = null;
-							continue;
+							vals[i] = null;
+						} else {
+							vals[i] = new String(bytes.vector[i], bytes.start[i], bytes.length[i]);
 						}
-						rows[i] = (float) vector.vector[i];
 					}
 				} else { // set as a field of Row
+					Row[] rows = (Row[]) vals;
 					for (int i = 0; i < childCount; i++) {
 						if (isNullVector[i]) {
-							((Row) rows[i]).setField(fieldIdx, null);
-							continue;
+							rows[i].setField(fieldIdx, null);
+						} else {
+							rows[i].setField(fieldIdx, new String(bytes.vector[i], bytes.start[i], bytes.length[i]));
 						}
-						((Row) rows[i]).setField(fieldIdx, (float) vector.vector[i]);
 					}
 				}
 			}
 		} else { // in a list
-			if (vector.isRepeating) { // // fill complete list with first value
-				// Also column contains null value and it's repeating
-				// so all values are null, but we need to set list with null values
-				fillListWithRepeatingNull(rows, fieldIdx, float[].class, lengthVector, childCount);
+			if (bytes.isRepeating) { // fill list with first value
+				// since the column contains null values and has just one distinct value, the repeated value is null
+				fillListWithRepeatingNull(vals, fieldIdx, lengthVector, childCount, OrcUtils::stringArray);
 			} else {
-				// column contain null values
 				int offset = 0;
-				float[] temp;
-				boolean[] isNullVector = vector.isNull;
-				if (fieldIdx == -1) { // set list as an object
-					for (int i = 0; offset < childCount; i++) {
-						temp = new float[(int) lengthVector[i]];
-						for (int j = 0; j < temp.length; j++) {
-							if (isNullVector[offset]) {
-								offset++;
-								continue;
-							}
-							temp[j] = (float) vector.vector[offset++];
-						}
-						rows[i] = temp;
-					}
-				} else { // set list as a field of Row
-					for (int i = 0; i < childCount; i++) {
-						temp = new float[(int) lengthVector[i]];
-						for (int j = 0; j < temp.length; j++) {
-							if (isNullVector[offset]) {
-								offset++;
-								continue;
-							}
-							temp[j] = (float) vector.vector[offset++];
-						}
-						((Row) rows[i]).setField(fieldIdx, temp);
-					}
-				}
-			}
-		}
-	}
-
-	private static void readDoubleColumn(Object[] rows, int fieldIdx, DoubleColumnVector vector, long[] lengthVector, int childCount) {
-
-		// check if data type(dt) is directly in list or not, e.g, array<dt>
-		if (lengthVector == null) {
-			if (vector.isRepeating) { // fill complete column with first value
-				// Also column contains null value and it's repeating
-				fillColumnWithRepeatingValue(rows, fieldIdx, null, childCount);
-			} else {
-				boolean[] isNullVector = vector.isNull;
-				if (fieldIdx == -1) { // set as an object
-					for (int i = 0; i < childCount; i++) {
-						if (isNullVector[i]) {
-							rows[i] = null;
-							continue;
-						}
-						rows[i] = vector.vector[i];
-					}
-				} else { // set as field of Row
-					for (int i = 0; i < childCount; i++) {
-						if (isNullVector[i]) {
-							((Row) rows[i]).setField(fieldIdx, null);
-							continue;
+				String[] temp;
+				boolean[] isNullVector = bytes.isNull;
+				for (int i = 0; offset < childCount; i++) {
+					temp = new String[(int) lengthVector[i]];
+					for (int j = 0; j < temp.length; j++) {
+						if (isNullVector[offset]) {
+							offset++;
+						} else {
+							temp[j] = new String(bytes.vector[offset], bytes.start[offset], bytes.length[offset]);
+							offset++;
 						}
-						((Row) rows[i]).setField(fieldIdx, vector.vector[i]);
 					}
-				}
-			}
-		} else { // in a list
-			if (vector.isRepeating) { // // fill complete list with first value
-				// Also column contains null value and it's repeating
-				// so all values are null, but we need to set list with null values
-				fillListWithRepeatingNull(rows, fieldIdx, double[].class, lengthVector, childCount);
-			} else {
-				// column contain null values
-				int offset = 0;
-				double[] temp;
-				boolean[] isNullVector = vector.isNull;
-				if (fieldIdx == -1) { // set list as an object
-					for (int i = 0; offset < childCount; i++) {
-						temp = new double[(int) lengthVector[i]];
-						for (int j = 0; j < temp.length; j++) {
-							if (isNullVector[offset]) {
-								offset++;
-								continue;
-							}
-							temp[j] = vector.vector[offset++];
-						}
-						rows[i] = temp;
-					}
-				} else { // set list as a field of Row
-					for (int i = 0; offset < childCount; i++) {
-						temp = new double[(int) lengthVector[i]];
-						for (int j = 0; j < temp.length; j++) {
-							if (isNullVector[offset]) {
-								offset++;
-								continue;
-							}
-							temp[j] = vector.vector[offset++];
-						}
-						((Row) rows[i]).setField(fieldIdx, temp);
+					if (fieldIdx == -1) {
+						vals[i] = temp;
+					} else {
+						((Row) vals[i]).setField(fieldIdx, temp);
 					}
 				}
 			}
 		}
 	}
 
-	private static void readStringColumn(Object[] rows, int fieldIdx, BytesColumnVector bytes, long[] lengthVector, int childCount) {
+	private static void readBytesColumnAsBinary(Object[] vals, int fieldIdx, BytesColumnVector bytes, long[] lengthVector, int childCount) {
 
-		// check if string is directly in a list or not, e.g, array<string>
+		// check if the binary need to be read into lists or as single values
 		if (lengthVector == null) {
 			if (bytes.isRepeating) { // fill complete column with first value
-				// Also column contains null value and it's repeating
-				fillColumnWithRepeatingValue(rows, fieldIdx, null, childCount);
+				// since the column contains null values and has just one distinct value, the repeated value is null
+				fillColumnWithRepeatingValue(vals, fieldIdx, null, childCount);
 			} else {
 				boolean[] isNullVector = bytes.isNull;
 				if (fieldIdx == -1) { // set as an object
 					for (int i = 0; i < childCount; i++) {
 						if (isNullVector[i]) {
-							rows[i] = null;
-							continue;
+							vals[i] = null;
+						} else {
+							vals[i] = readBinary(bytes.vector[i], bytes.start[i], bytes.length[i]);
 						}
-						rows[i] = new String(bytes.vector[i], bytes.start[i], bytes.length[i]);
 					}
 				} else { // set as a field of Row
+					Row[] rows = (Row[]) vals;
 					for (int i = 0; i < childCount; i++) {
 						if (isNullVector[i]) {
-							((Row) rows[i]).setField(fieldIdx, null);
-							continue;
+							rows[i].setField(fieldIdx, null);
+						} else {
+							rows[i].setField(fieldIdx, readBinary(bytes.vector[i], bytes.start[i], bytes.length[i]));
 						}
-						((Row) rows[i]).setField(fieldIdx, new String(bytes.vector[i], bytes.start[i], bytes.length[i]));
 					}
 				}
 			}
-		} else { // in a list
-			if (bytes.isRepeating) { // fill list with first value
-				// Also column contains null value and it's repeating
-				// so all values are null, but we need to set list with null values
-				fillListWithRepeatingNull(rows, fieldIdx, String[].class, lengthVector, childCount);
+		} else {
+			if (bytes.isRepeating) { // fill complete list with first value
+				// since the column contains null values and has just one distinct value, the repeated value is null
+				fillListWithRepeatingNull(vals, fieldIdx, lengthVector, childCount, OrcUtils::binaryArray);
 			} else {
 				int offset = 0;
-				String[] temp;
+				byte[][] temp;
 				boolean[] isNullVector = bytes.isNull;
-				if (fieldIdx == -1) { // set list as an object
-					for (int i = 0; offset < childCount; i++) {
-						temp = new String[(int) lengthVector[i]];
-						for (int j = 0; j < temp.length; j++) {
-							if (isNullVector[offset]) {
-								offset++;
-								temp[j] = null;
-								continue; // skip null value
-							}
-							temp[j] = new String(bytes.vector[offset], bytes.start[offset], bytes.length[offset]);
+				for (int i = 0; offset < childCount; i++) {
+					temp = new byte[(int) lengthVector[i]][];
+					for (int j = 0; j < temp.length; j++) {
+						if (isNullVector[offset]) {
 							offset++;
-						}
-						rows[i] = temp;
-					}
-				} else { // set list as a field
-					for (int i = 0; offset < childCount; i++) {
-						temp = new String[(int) lengthVector[i]];
-						for (int j = 0; j < temp.length; j++) {
-							if (isNullVector[offset]) {
-								offset++;
-								temp[j] = null;
-								continue; // skip null value
-							}
-							temp[j] = new String(bytes.vector[offset], bytes.start[offset], bytes.length[offset]);
+						} else {
+							temp[j] = readBinary(bytes.vector[offset], bytes.start[offset], bytes.length[offset]);
 							offset++;
 						}
-						((Row) rows[i]).setField(fieldIdx, temp);
+					}
+					if (fieldIdx == -1) {
+						vals[i] = temp;
+					} else {
+						((Row) vals[i]).setField(fieldIdx, temp);
 					}
 				}
 			}
 		}
-
 	}
 
-	private static void readDateColumn(Object[] rows, int fieldIdx, LongColumnVector vector, long[] lengthVector, int childCount) {
+	private static void readLongColumnAsDate(Object[] vals, int fieldIdx, LongColumnVector vector, long[] lengthVector, int childCount) {
 
-		// check if date is directly in a list or not, e.g, array<date>
+		// check if the values need to be read into lists or as single values
 		if (lengthVector == null) {
 			if (vector.isRepeating) { // fill complete column with first value
-				// Also column contains null value and it's repeating
-				fillColumnWithRepeatingValue(rows, fieldIdx, null, childCount);
+				// since the column contains null values and has just one distinct value, the repeated value is null
+				fillColumnWithRepeatingValue(vals, fieldIdx, null, childCount);
 			} else {
 				boolean[] isNullVector = vector.isNull;
 				if (fieldIdx == -1) { // set as an object
 					for (int i = 0; i < childCount; i++) {
 						if (isNullVector[i]) {
-							rows[i] = null;
-							continue;
+							vals[i] = null;
+						} else {
+							vals[i] = readDate(vector.vector[i]);
 						}
-						rows[i] = readDate(vector.vector[i]);
 					}
 				} else { // set as a field of Row
+					Row[] rows = (Row[]) vals;
 					for (int i = 0; i < childCount; i++) {
 						if (isNullVector[i]) {
-							((Row) rows[i]).setField(fieldIdx, null);
-							continue;
+							rows[i].setField(fieldIdx, null);
+						} else {
+							rows[i].setField(fieldIdx, readDate(vector.vector[i]));
 						}
-						((Row) rows[i]).setField(fieldIdx, readDate(vector.vector[i]));
 					}
 				}
 			}
-		} else {
-			if (vector.isRepeating) { // fill complete list with first value
-				// Also column contains null value and it's repeating
-				// so all values are null, but we need to set list with null values
-				fillListWithRepeatingNull(rows, fieldIdx, Date[].class, lengthVector, childCount);
+		} else { // in a list
+			if (vector.isRepeating) { // // fill complete list with first value
+				// since the column contains null values and has just one distinct value, the repeated value is null
+				fillListWithRepeatingNull(vals, fieldIdx, lengthVector, childCount, OrcUtils::dateArray);
 			} else {
+				// column contain null values
 				int offset = 0;
 				Date[] temp;
 				boolean[] isNullVector = vector.isNull;
-				if (fieldIdx == -1) { // set list as an object
-					for (int i = 0; offset < childCount; i++) {
-						temp = new Date[(int) lengthVector[i]];
-						for (int j = 0; j < temp.length; j++) {
-							if (isNullVector[offset]) {
-								offset++;
-								temp[j] = null;
-								continue;
-							}
-							temp[j] = readDate(vector.vector[offset++]);
-						}
-						rows[i] = temp;
-					}
-				} else { // set list as a field of Row
-					for (int i = 0; offset < childCount; i++) {
-						temp = new Date[(int) lengthVector[i]];
-						for (int j = 0; j < temp.length; j++) {
-							if (isNullVector[offset]) {
-								offset++;
-								temp[j] = null;
-								continue;
-							}
+				for (int i = 0; offset < childCount; i++) {
+					temp = new Date[(int) lengthVector[i]];
+					for (int j = 0; j < temp.length; j++) {
+						if (isNullVector[offset]) {
+							offset++;
+						} else {
 							temp[j] = readDate(vector.vector[offset++]);
 						}
-						((Row) rows[i]).setField(fieldIdx, temp);
+					}
+					if (fieldIdx == -1) {
+						vals[i] = temp;
+					} else {
+						((Row) vals[i]).setField(fieldIdx, temp);
 					}
 				}
 			}
 		}
-
 	}
 
-

<TRUNCATED>

[6/9] flink git commit: [FLINK-2170] [connectors] Add OrcRowInputFormat and OrcTableSource.

Posted by fh...@apache.org.
http://git-wip-us.apache.org/repos/asf/flink/blob/200612ee/flink-connectors/flink-orc/src/test/resources/TestOrcFile.testDate1900.dat
----------------------------------------------------------------------
diff --git a/flink-connectors/flink-orc/src/test/resources/TestOrcFile.testDate1900.dat b/flink-connectors/flink-orc/src/test/resources/TestOrcFile.testDate1900.dat
deleted file mode 100644
index 59b933d..0000000
--- a/flink-connectors/flink-orc/src/test/resources/TestOrcFile.testDate1900.dat
+++ /dev/null
@@ -1,10000 +0,0 @@
-1900-05-05 12:34:56.1,1900-12-25
-1900-05-05 12:34:56.1001,1900-12-25
-1900-05-05 12:34:56.1002,1900-12-25
-1900-05-05 12:34:56.1003,1900-12-25
-1900-05-05 12:34:56.1004,1900-12-25
-1900-05-05 12:34:56.1005,1900-12-25
-1900-05-05 12:34:56.1006,1900-12-25
-1900-05-05 12:34:56.1007,1900-12-25
-1900-05-05 12:34:56.1008,1900-12-25
-1900-05-05 12:34:56.1009,1900-12-25
-1900-05-05 12:34:56.101,1900-12-25
-1900-05-05 12:34:56.1011,1900-12-25
-1900-05-05 12:34:56.1012,1900-12-25
-1900-05-05 12:34:56.1013,1900-12-25
-1900-05-05 12:34:56.1014,1900-12-25
-1900-05-05 12:34:56.1015,1900-12-25
-1900-05-05 12:34:56.1016,1900-12-25
-1900-05-05 12:34:56.1017,1900-12-25
-1900-05-05 12:34:56.1018,1900-12-25
-1900-05-05 12:34:56.1019,1900-12-25
-1900-05-05 12:34:56.102,1900-12-25
-1900-05-05 12:34:56.1021,1900-12-25
-1900-05-05 12:34:56.1022,1900-12-25
-1900-05-05 12:34:56.1023,1900-12-25
-1900-05-05 12:34:56.1024,1900-12-25
-1900-05-05 12:34:56.1025,1900-12-25
-1900-05-05 12:34:56.1026,1900-12-25
-1900-05-05 12:34:56.1027,1900-12-25
-1900-05-05 12:34:56.1028,1900-12-25
-1900-05-05 12:34:56.1029,1900-12-25
-1900-05-05 12:34:56.103,1900-12-25
-1900-05-05 12:34:56.1031,1900-12-25
-1900-05-05 12:34:56.1032,1900-12-25
-1900-05-05 12:34:56.1033,1900-12-25
-1900-05-05 12:34:56.1034,1900-12-25
-1900-05-05 12:34:56.1035,1900-12-25
-1900-05-05 12:34:56.1036,1900-12-25
-1900-05-05 12:34:56.1037,1900-12-25
-1900-05-05 12:34:56.1038,1900-12-25
-1900-05-05 12:34:56.1039,1900-12-25
-1900-05-05 12:34:56.104,1900-12-25
-1900-05-05 12:34:56.1041,1900-12-25
-1900-05-05 12:34:56.1042,1900-12-25
-1900-05-05 12:34:56.1043,1900-12-25
-1900-05-05 12:34:56.1044,1900-12-25
-1900-05-05 12:34:56.1045,1900-12-25
-1900-05-05 12:34:56.1046,1900-12-25
-1900-05-05 12:34:56.1047,1900-12-25
-1900-05-05 12:34:56.1048,1900-12-25
-1900-05-05 12:34:56.1049,1900-12-25
-1900-05-05 12:34:56.105,1900-12-25
-1900-05-05 12:34:56.1051,1900-12-25
-1900-05-05 12:34:56.1052,1900-12-25
-1900-05-05 12:34:56.1053,1900-12-25
-1900-05-05 12:34:56.1054,1900-12-25
-1900-05-05 12:34:56.1055,1900-12-25
-1900-05-05 12:34:56.1056,1900-12-25
-1900-05-05 12:34:56.1057,1900-12-25
-1900-05-05 12:34:56.1058,1900-12-25
-1900-05-05 12:34:56.1059,1900-12-25
-1900-05-05 12:34:56.106,1900-12-25
-1900-05-05 12:34:56.1061,1900-12-25
-1900-05-05 12:34:56.1062,1900-12-25
-1900-05-05 12:34:56.1063,1900-12-25
-1900-05-05 12:34:56.1064,1900-12-25
-1900-05-05 12:34:56.1065,1900-12-25
-1900-05-05 12:34:56.1066,1900-12-25
-1900-05-05 12:34:56.1067,1900-12-25
-1900-05-05 12:34:56.1068,1900-12-25
-1900-05-05 12:34:56.1069,1900-12-25
-1900-05-05 12:34:56.107,1900-12-25
-1900-05-05 12:34:56.1071,1900-12-25
-1900-05-05 12:34:56.1072,1900-12-25
-1900-05-05 12:34:56.1073,1900-12-25
-1900-05-05 12:34:56.1074,1900-12-25
-1900-05-05 12:34:56.1075,1900-12-25
-1900-05-05 12:34:56.1076,1900-12-25
-1900-05-05 12:34:56.1077,1900-12-25
-1900-05-05 12:34:56.1078,1900-12-25
-1900-05-05 12:34:56.1079,1900-12-25
-1900-05-05 12:34:56.108,1900-12-25
-1900-05-05 12:34:56.1081,1900-12-25
-1900-05-05 12:34:56.1082,1900-12-25
-1900-05-05 12:34:56.1083,1900-12-25
-1900-05-05 12:34:56.1084,1900-12-25
-1900-05-05 12:34:56.1085,1900-12-25
-1900-05-05 12:34:56.1086,1900-12-25
-1900-05-05 12:34:56.1087,1900-12-25
-1900-05-05 12:34:56.1088,1900-12-25
-1900-05-05 12:34:56.1089,1900-12-25
-1900-05-05 12:34:56.109,1900-12-25
-1900-05-05 12:34:56.1091,1900-12-25
-1900-05-05 12:34:56.1092,1900-12-25
-1900-05-05 12:34:56.1093,1900-12-25
-1900-05-05 12:34:56.1094,1900-12-25
-1900-05-05 12:34:56.1095,1900-12-25
-1900-05-05 12:34:56.1096,1900-12-25
-1900-05-05 12:34:56.1097,1900-12-25
-1900-05-05 12:34:56.1098,1900-12-25
-1900-05-05 12:34:56.1099,1900-12-25
-1900-05-05 12:34:56.11,1900-12-25
-1900-05-05 12:34:56.1101,1900-12-25
-1900-05-05 12:34:56.1102,1900-12-25
-1900-05-05 12:34:56.1103,1900-12-25
-1900-05-05 12:34:56.1104,1900-12-25
-1900-05-05 12:34:56.1105,1900-12-25
-1900-05-05 12:34:56.1106,1900-12-25
-1900-05-05 12:34:56.1107,1900-12-25
-1900-05-05 12:34:56.1108,1900-12-25
-1900-05-05 12:34:56.1109,1900-12-25
-1900-05-05 12:34:56.111,1900-12-25
-1900-05-05 12:34:56.1111,1900-12-25
-1900-05-05 12:34:56.1112,1900-12-25
-1900-05-05 12:34:56.1113,1900-12-25
-1900-05-05 12:34:56.1114,1900-12-25
-1900-05-05 12:34:56.1115,1900-12-25
-1900-05-05 12:34:56.1116,1900-12-25
-1900-05-05 12:34:56.1117,1900-12-25
-1900-05-05 12:34:56.1118,1900-12-25
-1900-05-05 12:34:56.1119,1900-12-25
-1900-05-05 12:34:56.112,1900-12-25
-1900-05-05 12:34:56.1121,1900-12-25
-1900-05-05 12:34:56.1122,1900-12-25
-1900-05-05 12:34:56.1123,1900-12-25
-1900-05-05 12:34:56.1124,1900-12-25
-1900-05-05 12:34:56.1125,1900-12-25
-1900-05-05 12:34:56.1126,1900-12-25
-1900-05-05 12:34:56.1127,1900-12-25
-1900-05-05 12:34:56.1128,1900-12-25
-1900-05-05 12:34:56.1129,1900-12-25
-1900-05-05 12:34:56.113,1900-12-25
-1900-05-05 12:34:56.1131,1900-12-25
-1900-05-05 12:34:56.1132,1900-12-25
-1900-05-05 12:34:56.1133,1900-12-25
-1900-05-05 12:34:56.1134,1900-12-25
-1900-05-05 12:34:56.1135,1900-12-25
-1900-05-05 12:34:56.1136,1900-12-25
-1900-05-05 12:34:56.1137,1900-12-25
-1900-05-05 12:34:56.1138,1900-12-25
-1900-05-05 12:34:56.1139,1900-12-25
-1900-05-05 12:34:56.114,1900-12-25
-1900-05-05 12:34:56.1141,1900-12-25
-1900-05-05 12:34:56.1142,1900-12-25
-1900-05-05 12:34:56.1143,1900-12-25
-1900-05-05 12:34:56.1144,1900-12-25
-1900-05-05 12:34:56.1145,1900-12-25
-1900-05-05 12:34:56.1146,1900-12-25
-1900-05-05 12:34:56.1147,1900-12-25
-1900-05-05 12:34:56.1148,1900-12-25
-1900-05-05 12:34:56.1149,1900-12-25
-1900-05-05 12:34:56.115,1900-12-25
-1900-05-05 12:34:56.1151,1900-12-25
-1900-05-05 12:34:56.1152,1900-12-25
-1900-05-05 12:34:56.1153,1900-12-25
-1900-05-05 12:34:56.1154,1900-12-25
-1900-05-05 12:34:56.1155,1900-12-25
-1900-05-05 12:34:56.1156,1900-12-25
-1900-05-05 12:34:56.1157,1900-12-25
-1900-05-05 12:34:56.1158,1900-12-25
-1900-05-05 12:34:56.1159,1900-12-25
-1900-05-05 12:34:56.116,1900-12-25
-1900-05-05 12:34:56.1161,1900-12-25
-1900-05-05 12:34:56.1162,1900-12-25
-1900-05-05 12:34:56.1163,1900-12-25
-1900-05-05 12:34:56.1164,1900-12-25
-1900-05-05 12:34:56.1165,1900-12-25
-1900-05-05 12:34:56.1166,1900-12-25
-1900-05-05 12:34:56.1167,1900-12-25
-1900-05-05 12:34:56.1168,1900-12-25
-1900-05-05 12:34:56.1169,1900-12-25
-1900-05-05 12:34:56.117,1900-12-25
-1900-05-05 12:34:56.1171,1900-12-25
-1900-05-05 12:34:56.1172,1900-12-25
-1900-05-05 12:34:56.1173,1900-12-25
-1900-05-05 12:34:56.1174,1900-12-25
-1900-05-05 12:34:56.1175,1900-12-25
-1900-05-05 12:34:56.1176,1900-12-25
-1900-05-05 12:34:56.1177,1900-12-25
-1900-05-05 12:34:56.1178,1900-12-25
-1900-05-05 12:34:56.1179,1900-12-25
-1900-05-05 12:34:56.118,1900-12-25
-1900-05-05 12:34:56.1181,1900-12-25
-1900-05-05 12:34:56.1182,1900-12-25
-1900-05-05 12:34:56.1183,1900-12-25
-1900-05-05 12:34:56.1184,1900-12-25
-1900-05-05 12:34:56.1185,1900-12-25
-1900-05-05 12:34:56.1186,1900-12-25
-1900-05-05 12:34:56.1187,1900-12-25
-1900-05-05 12:34:56.1188,1900-12-25
-1900-05-05 12:34:56.1189,1900-12-25
-1900-05-05 12:34:56.119,1900-12-25
-1900-05-05 12:34:56.1191,1900-12-25
-1900-05-05 12:34:56.1192,1900-12-25
-1900-05-05 12:34:56.1193,1900-12-25
-1900-05-05 12:34:56.1194,1900-12-25
-1900-05-05 12:34:56.1195,1900-12-25
-1900-05-05 12:34:56.1196,1900-12-25
-1900-05-05 12:34:56.1197,1900-12-25
-1900-05-05 12:34:56.1198,1900-12-25
-1900-05-05 12:34:56.1199,1900-12-25
-1900-05-05 12:34:56.12,1900-12-25
-1900-05-05 12:34:56.1201,1900-12-25
-1900-05-05 12:34:56.1202,1900-12-25
-1900-05-05 12:34:56.1203,1900-12-25
-1900-05-05 12:34:56.1204,1900-12-25
-1900-05-05 12:34:56.1205,1900-12-25
-1900-05-05 12:34:56.1206,1900-12-25
-1900-05-05 12:34:56.1207,1900-12-25
-1900-05-05 12:34:56.1208,1900-12-25
-1900-05-05 12:34:56.1209,1900-12-25
-1900-05-05 12:34:56.121,1900-12-25
-1900-05-05 12:34:56.1211,1900-12-25
-1900-05-05 12:34:56.1212,1900-12-25
-1900-05-05 12:34:56.1213,1900-12-25
-1900-05-05 12:34:56.1214,1900-12-25
-1900-05-05 12:34:56.1215,1900-12-25
-1900-05-05 12:34:56.1216,1900-12-25
-1900-05-05 12:34:56.1217,1900-12-25
-1900-05-05 12:34:56.1218,1900-12-25
-1900-05-05 12:34:56.1219,1900-12-25
-1900-05-05 12:34:56.122,1900-12-25
-1900-05-05 12:34:56.1221,1900-12-25
-1900-05-05 12:34:56.1222,1900-12-25
-1900-05-05 12:34:56.1223,1900-12-25
-1900-05-05 12:34:56.1224,1900-12-25
-1900-05-05 12:34:56.1225,1900-12-25
-1900-05-05 12:34:56.1226,1900-12-25
-1900-05-05 12:34:56.1227,1900-12-25
-1900-05-05 12:34:56.1228,1900-12-25
-1900-05-05 12:34:56.1229,1900-12-25
-1900-05-05 12:34:56.123,1900-12-25
-1900-05-05 12:34:56.1231,1900-12-25
-1900-05-05 12:34:56.1232,1900-12-25
-1900-05-05 12:34:56.1233,1900-12-25
-1900-05-05 12:34:56.1234,1900-12-25
-1900-05-05 12:34:56.1235,1900-12-25
-1900-05-05 12:34:56.1236,1900-12-25
-1900-05-05 12:34:56.1237,1900-12-25
-1900-05-05 12:34:56.1238,1900-12-25
-1900-05-05 12:34:56.1239,1900-12-25
-1900-05-05 12:34:56.124,1900-12-25
-1900-05-05 12:34:56.1241,1900-12-25
-1900-05-05 12:34:56.1242,1900-12-25
-1900-05-05 12:34:56.1243,1900-12-25
-1900-05-05 12:34:56.1244,1900-12-25
-1900-05-05 12:34:56.1245,1900-12-25
-1900-05-05 12:34:56.1246,1900-12-25
-1900-05-05 12:34:56.1247,1900-12-25
-1900-05-05 12:34:56.1248,1900-12-25
-1900-05-05 12:34:56.1249,1900-12-25
-1900-05-05 12:34:56.125,1900-12-25
-1900-05-05 12:34:56.1251,1900-12-25
-1900-05-05 12:34:56.1252,1900-12-25
-1900-05-05 12:34:56.1253,1900-12-25
-1900-05-05 12:34:56.1254,1900-12-25
-1900-05-05 12:34:56.1255,1900-12-25
-1900-05-05 12:34:56.1256,1900-12-25
-1900-05-05 12:34:56.1257,1900-12-25
-1900-05-05 12:34:56.1258,1900-12-25
-1900-05-05 12:34:56.1259,1900-12-25
-1900-05-05 12:34:56.126,1900-12-25
-1900-05-05 12:34:56.1261,1900-12-25
-1900-05-05 12:34:56.1262,1900-12-25
-1900-05-05 12:34:56.1263,1900-12-25
-1900-05-05 12:34:56.1264,1900-12-25
-1900-05-05 12:34:56.1265,1900-12-25
-1900-05-05 12:34:56.1266,1900-12-25
-1900-05-05 12:34:56.1267,1900-12-25
-1900-05-05 12:34:56.1268,1900-12-25
-1900-05-05 12:34:56.1269,1900-12-25
-1900-05-05 12:34:56.127,1900-12-25
-1900-05-05 12:34:56.1271,1900-12-25
-1900-05-05 12:34:56.1272,1900-12-25
-1900-05-05 12:34:56.1273,1900-12-25
-1900-05-05 12:34:56.1274,1900-12-25
-1900-05-05 12:34:56.1275,1900-12-25
-1900-05-05 12:34:56.1276,1900-12-25
-1900-05-05 12:34:56.1277,1900-12-25
-1900-05-05 12:34:56.1278,1900-12-25
-1900-05-05 12:34:56.1279,1900-12-25
-1900-05-05 12:34:56.128,1900-12-25
-1900-05-05 12:34:56.1281,1900-12-25
-1900-05-05 12:34:56.1282,1900-12-25
-1900-05-05 12:34:56.1283,1900-12-25
-1900-05-05 12:34:56.1284,1900-12-25
-1900-05-05 12:34:56.1285,1900-12-25
-1900-05-05 12:34:56.1286,1900-12-25
-1900-05-05 12:34:56.1287,1900-12-25
-1900-05-05 12:34:56.1288,1900-12-25
-1900-05-05 12:34:56.1289,1900-12-25
-1900-05-05 12:34:56.129,1900-12-25
-1900-05-05 12:34:56.1291,1900-12-25
-1900-05-05 12:34:56.1292,1900-12-25
-1900-05-05 12:34:56.1293,1900-12-25
-1900-05-05 12:34:56.1294,1900-12-25
-1900-05-05 12:34:56.1295,1900-12-25
-1900-05-05 12:34:56.1296,1900-12-25
-1900-05-05 12:34:56.1297,1900-12-25
-1900-05-05 12:34:56.1298,1900-12-25
-1900-05-05 12:34:56.1299,1900-12-25
-1900-05-05 12:34:56.13,1900-12-25
-1900-05-05 12:34:56.1301,1900-12-25
-1900-05-05 12:34:56.1302,1900-12-25
-1900-05-05 12:34:56.1303,1900-12-25
-1900-05-05 12:34:56.1304,1900-12-25
-1900-05-05 12:34:56.1305,1900-12-25
-1900-05-05 12:34:56.1306,1900-12-25
-1900-05-05 12:34:56.1307,1900-12-25
-1900-05-05 12:34:56.1308,1900-12-25
-1900-05-05 12:34:56.1309,1900-12-25
-1900-05-05 12:34:56.131,1900-12-25
-1900-05-05 12:34:56.1311,1900-12-25
-1900-05-05 12:34:56.1312,1900-12-25
-1900-05-05 12:34:56.1313,1900-12-25
-1900-05-05 12:34:56.1314,1900-12-25
-1900-05-05 12:34:56.1315,1900-12-25
-1900-05-05 12:34:56.1316,1900-12-25
-1900-05-05 12:34:56.1317,1900-12-25
-1900-05-05 12:34:56.1318,1900-12-25
-1900-05-05 12:34:56.1319,1900-12-25
-1900-05-05 12:34:56.132,1900-12-25
-1900-05-05 12:34:56.1321,1900-12-25
-1900-05-05 12:34:56.1322,1900-12-25
-1900-05-05 12:34:56.1323,1900-12-25
-1900-05-05 12:34:56.1324,1900-12-25
-1900-05-05 12:34:56.1325,1900-12-25
-1900-05-05 12:34:56.1326,1900-12-25
-1900-05-05 12:34:56.1327,1900-12-25
-1900-05-05 12:34:56.1328,1900-12-25
-1900-05-05 12:34:56.1329,1900-12-25
-1900-05-05 12:34:56.133,1900-12-25
-1900-05-05 12:34:56.1331,1900-12-25
-1900-05-05 12:34:56.1332,1900-12-25
-1900-05-05 12:34:56.1333,1900-12-25
-1900-05-05 12:34:56.1334,1900-12-25
-1900-05-05 12:34:56.1335,1900-12-25
-1900-05-05 12:34:56.1336,1900-12-25
-1900-05-05 12:34:56.1337,1900-12-25
-1900-05-05 12:34:56.1338,1900-12-25
-1900-05-05 12:34:56.1339,1900-12-25
-1900-05-05 12:34:56.134,1900-12-25
-1900-05-05 12:34:56.1341,1900-12-25
-1900-05-05 12:34:56.1342,1900-12-25
-1900-05-05 12:34:56.1343,1900-12-25
-1900-05-05 12:34:56.1344,1900-12-25
-1900-05-05 12:34:56.1345,1900-12-25
-1900-05-05 12:34:56.1346,1900-12-25
-1900-05-05 12:34:56.1347,1900-12-25
-1900-05-05 12:34:56.1348,1900-12-25
-1900-05-05 12:34:56.1349,1900-12-25
-1900-05-05 12:34:56.135,1900-12-25
-1900-05-05 12:34:56.1351,1900-12-25
-1900-05-05 12:34:56.1352,1900-12-25
-1900-05-05 12:34:56.1353,1900-12-25
-1900-05-05 12:34:56.1354,1900-12-25
-1900-05-05 12:34:56.1355,1900-12-25
-1900-05-05 12:34:56.1356,1900-12-25
-1900-05-05 12:34:56.1357,1900-12-25
-1900-05-05 12:34:56.1358,1900-12-25
-1900-05-05 12:34:56.1359,1900-12-25
-1900-05-05 12:34:56.136,1900-12-25
-1900-05-05 12:34:56.1361,1900-12-25
-1900-05-05 12:34:56.1362,1900-12-25
-1900-05-05 12:34:56.1363,1900-12-25
-1900-05-05 12:34:56.1364,1900-12-25
-1900-05-05 12:34:56.1365,1900-12-25
-1900-05-05 12:34:56.1366,1900-12-25
-1900-05-05 12:34:56.1367,1900-12-25
-1900-05-05 12:34:56.1368,1900-12-25
-1900-05-05 12:34:56.1369,1900-12-25
-1900-05-05 12:34:56.137,1900-12-25
-1900-05-05 12:34:56.1371,1900-12-25
-1900-05-05 12:34:56.1372,1900-12-25
-1900-05-05 12:34:56.1373,1900-12-25
-1900-05-05 12:34:56.1374,1900-12-25
-1900-05-05 12:34:56.1375,1900-12-25
-1900-05-05 12:34:56.1376,1900-12-25
-1900-05-05 12:34:56.1377,1900-12-25
-1900-05-05 12:34:56.1378,1900-12-25
-1900-05-05 12:34:56.1379,1900-12-25
-1900-05-05 12:34:56.138,1900-12-25
-1900-05-05 12:34:56.1381,1900-12-25
-1900-05-05 12:34:56.1382,1900-12-25
-1900-05-05 12:34:56.1383,1900-12-25
-1900-05-05 12:34:56.1384,1900-12-25
-1900-05-05 12:34:56.1385,1900-12-25
-1900-05-05 12:34:56.1386,1900-12-25
-1900-05-05 12:34:56.1387,1900-12-25
-1900-05-05 12:34:56.1388,1900-12-25
-1900-05-05 12:34:56.1389,1900-12-25
-1900-05-05 12:34:56.139,1900-12-25
-1900-05-05 12:34:56.1391,1900-12-25
-1900-05-05 12:34:56.1392,1900-12-25
-1900-05-05 12:34:56.1393,1900-12-25
-1900-05-05 12:34:56.1394,1900-12-25
-1900-05-05 12:34:56.1395,1900-12-25
-1900-05-05 12:34:56.1396,1900-12-25
-1900-05-05 12:34:56.1397,1900-12-25
-1900-05-05 12:34:56.1398,1900-12-25
-1900-05-05 12:34:56.1399,1900-12-25
-1900-05-05 12:34:56.14,1900-12-25
-1900-05-05 12:34:56.1401,1900-12-25
-1900-05-05 12:34:56.1402,1900-12-25
-1900-05-05 12:34:56.1403,1900-12-25
-1900-05-05 12:34:56.1404,1900-12-25
-1900-05-05 12:34:56.1405,1900-12-25
-1900-05-05 12:34:56.1406,1900-12-25
-1900-05-05 12:34:56.1407,1900-12-25
-1900-05-05 12:34:56.1408,1900-12-25
-1900-05-05 12:34:56.1409,1900-12-25
-1900-05-05 12:34:56.141,1900-12-25
-1900-05-05 12:34:56.1411,1900-12-25
-1900-05-05 12:34:56.1412,1900-12-25
-1900-05-05 12:34:56.1413,1900-12-25
-1900-05-05 12:34:56.1414,1900-12-25
-1900-05-05 12:34:56.1415,1900-12-25
-1900-05-05 12:34:56.1416,1900-12-25
-1900-05-05 12:34:56.1417,1900-12-25
-1900-05-05 12:34:56.1418,1900-12-25
-1900-05-05 12:34:56.1419,1900-12-25
-1900-05-05 12:34:56.142,1900-12-25
-1900-05-05 12:34:56.1421,1900-12-25
-1900-05-05 12:34:56.1422,1900-12-25
-1900-05-05 12:34:56.1423,1900-12-25
-1900-05-05 12:34:56.1424,1900-12-25
-1900-05-05 12:34:56.1425,1900-12-25
-1900-05-05 12:34:56.1426,1900-12-25
-1900-05-05 12:34:56.1427,1900-12-25
-1900-05-05 12:34:56.1428,1900-12-25
-1900-05-05 12:34:56.1429,1900-12-25
-1900-05-05 12:34:56.143,1900-12-25
-1900-05-05 12:34:56.1431,1900-12-25
-1900-05-05 12:34:56.1432,1900-12-25
-1900-05-05 12:34:56.1433,1900-12-25
-1900-05-05 12:34:56.1434,1900-12-25
-1900-05-05 12:34:56.1435,1900-12-25
-1900-05-05 12:34:56.1436,1900-12-25
-1900-05-05 12:34:56.1437,1900-12-25
-1900-05-05 12:34:56.1438,1900-12-25
-1900-05-05 12:34:56.1439,1900-12-25
-1900-05-05 12:34:56.144,1900-12-25
-1900-05-05 12:34:56.1441,1900-12-25
-1900-05-05 12:34:56.1442,1900-12-25
-1900-05-05 12:34:56.1443,1900-12-25
-1900-05-05 12:34:56.1444,1900-12-25
-1900-05-05 12:34:56.1445,1900-12-25
-1900-05-05 12:34:56.1446,1900-12-25
-1900-05-05 12:34:56.1447,1900-12-25
-1900-05-05 12:34:56.1448,1900-12-25
-1900-05-05 12:34:56.1449,1900-12-25
-1900-05-05 12:34:56.145,1900-12-25
-1900-05-05 12:34:56.1451,1900-12-25
-1900-05-05 12:34:56.1452,1900-12-25
-1900-05-05 12:34:56.1453,1900-12-25
-1900-05-05 12:34:56.1454,1900-12-25
-1900-05-05 12:34:56.1455,1900-12-25
-1900-05-05 12:34:56.1456,1900-12-25
-1900-05-05 12:34:56.1457,1900-12-25
-1900-05-05 12:34:56.1458,1900-12-25
-1900-05-05 12:34:56.1459,1900-12-25
-1900-05-05 12:34:56.146,1900-12-25
-1900-05-05 12:34:56.1461,1900-12-25
-1900-05-05 12:34:56.1462,1900-12-25
-1900-05-05 12:34:56.1463,1900-12-25
-1900-05-05 12:34:56.1464,1900-12-25
-1900-05-05 12:34:56.1465,1900-12-25
-1900-05-05 12:34:56.1466,1900-12-25
-1900-05-05 12:34:56.1467,1900-12-25
-1900-05-05 12:34:56.1468,1900-12-25
-1900-05-05 12:34:56.1469,1900-12-25
-1900-05-05 12:34:56.147,1900-12-25
-1900-05-05 12:34:56.1471,1900-12-25
-1900-05-05 12:34:56.1472,1900-12-25
-1900-05-05 12:34:56.1473,1900-12-25
-1900-05-05 12:34:56.1474,1900-12-25
-1900-05-05 12:34:56.1475,1900-12-25
-1900-05-05 12:34:56.1476,1900-12-25
-1900-05-05 12:34:56.1477,1900-12-25
-1900-05-05 12:34:56.1478,1900-12-25
-1900-05-05 12:34:56.1479,1900-12-25
-1900-05-05 12:34:56.148,1900-12-25
-1900-05-05 12:34:56.1481,1900-12-25
-1900-05-05 12:34:56.1482,1900-12-25
-1900-05-05 12:34:56.1483,1900-12-25
-1900-05-05 12:34:56.1484,1900-12-25
-1900-05-05 12:34:56.1485,1900-12-25
-1900-05-05 12:34:56.1486,1900-12-25
-1900-05-05 12:34:56.1487,1900-12-25
-1900-05-05 12:34:56.1488,1900-12-25
-1900-05-05 12:34:56.1489,1900-12-25
-1900-05-05 12:34:56.149,1900-12-25
-1900-05-05 12:34:56.1491,1900-12-25
-1900-05-05 12:34:56.1492,1900-12-25
-1900-05-05 12:34:56.1493,1900-12-25
-1900-05-05 12:34:56.1494,1900-12-25
-1900-05-05 12:34:56.1495,1900-12-25
-1900-05-05 12:34:56.1496,1900-12-25
-1900-05-05 12:34:56.1497,1900-12-25
-1900-05-05 12:34:56.1498,1900-12-25
-1900-05-05 12:34:56.1499,1900-12-25
-1900-05-05 12:34:56.15,1900-12-25
-1900-05-05 12:34:56.1501,1900-12-25
-1900-05-05 12:34:56.1502,1900-12-25
-1900-05-05 12:34:56.1503,1900-12-25
-1900-05-05 12:34:56.1504,1900-12-25
-1900-05-05 12:34:56.1505,1900-12-25
-1900-05-05 12:34:56.1506,1900-12-25
-1900-05-05 12:34:56.1507,1900-12-25
-1900-05-05 12:34:56.1508,1900-12-25
-1900-05-05 12:34:56.1509,1900-12-25
-1900-05-05 12:34:56.151,1900-12-25
-1900-05-05 12:34:56.1511,1900-12-25
-1900-05-05 12:34:56.1512,1900-12-25
-1900-05-05 12:34:56.1513,1900-12-25
-1900-05-05 12:34:56.1514,1900-12-25
-1900-05-05 12:34:56.1515,1900-12-25
-1900-05-05 12:34:56.1516,1900-12-25
-1900-05-05 12:34:56.1517,1900-12-25
-1900-05-05 12:34:56.1518,1900-12-25
-1900-05-05 12:34:56.1519,1900-12-25
-1900-05-05 12:34:56.152,1900-12-25
-1900-05-05 12:34:56.1521,1900-12-25
-1900-05-05 12:34:56.1522,1900-12-25
-1900-05-05 12:34:56.1523,1900-12-25
-1900-05-05 12:34:56.1524,1900-12-25
-1900-05-05 12:34:56.1525,1900-12-25
-1900-05-05 12:34:56.1526,1900-12-25
-1900-05-05 12:34:56.1527,1900-12-25
-1900-05-05 12:34:56.1528,1900-12-25
-1900-05-05 12:34:56.1529,1900-12-25
-1900-05-05 12:34:56.153,1900-12-25
-1900-05-05 12:34:56.1531,1900-12-25
-1900-05-05 12:34:56.1532,1900-12-25
-1900-05-05 12:34:56.1533,1900-12-25
-1900-05-05 12:34:56.1534,1900-12-25
-1900-05-05 12:34:56.1535,1900-12-25
-1900-05-05 12:34:56.1536,1900-12-25
-1900-05-05 12:34:56.1537,1900-12-25
-1900-05-05 12:34:56.1538,1900-12-25
-1900-05-05 12:34:56.1539,1900-12-25
-1900-05-05 12:34:56.154,1900-12-25
-1900-05-05 12:34:56.1541,1900-12-25
-1900-05-05 12:34:56.1542,1900-12-25
-1900-05-05 12:34:56.1543,1900-12-25
-1900-05-05 12:34:56.1544,1900-12-25
-1900-05-05 12:34:56.1545,1900-12-25
-1900-05-05 12:34:56.1546,1900-12-25
-1900-05-05 12:34:56.1547,1900-12-25
-1900-05-05 12:34:56.1548,1900-12-25
-1900-05-05 12:34:56.1549,1900-12-25
-1900-05-05 12:34:56.155,1900-12-25
-1900-05-05 12:34:56.1551,1900-12-25
-1900-05-05 12:34:56.1552,1900-12-25
-1900-05-05 12:34:56.1553,1900-12-25
-1900-05-05 12:34:56.1554,1900-12-25
-1900-05-05 12:34:56.1555,1900-12-25
-1900-05-05 12:34:56.1556,1900-12-25
-1900-05-05 12:34:56.1557,1900-12-25
-1900-05-05 12:34:56.1558,1900-12-25
-1900-05-05 12:34:56.1559,1900-12-25
-1900-05-05 12:34:56.156,1900-12-25
-1900-05-05 12:34:56.1561,1900-12-25
-1900-05-05 12:34:56.1562,1900-12-25
-1900-05-05 12:34:56.1563,1900-12-25
-1900-05-05 12:34:56.1564,1900-12-25
-1900-05-05 12:34:56.1565,1900-12-25
-1900-05-05 12:34:56.1566,1900-12-25
-1900-05-05 12:34:56.1567,1900-12-25
-1900-05-05 12:34:56.1568,1900-12-25
-1900-05-05 12:34:56.1569,1900-12-25
-1900-05-05 12:34:56.157,1900-12-25
-1900-05-05 12:34:56.1571,1900-12-25
-1900-05-05 12:34:56.1572,1900-12-25
-1900-05-05 12:34:56.1573,1900-12-25
-1900-05-05 12:34:56.1574,1900-12-25
-1900-05-05 12:34:56.1575,1900-12-25
-1900-05-05 12:34:56.1576,1900-12-25
-1900-05-05 12:34:56.1577,1900-12-25
-1900-05-05 12:34:56.1578,1900-12-25
-1900-05-05 12:34:56.1579,1900-12-25
-1900-05-05 12:34:56.158,1900-12-25
-1900-05-05 12:34:56.1581,1900-12-25
-1900-05-05 12:34:56.1582,1900-12-25
-1900-05-05 12:34:56.1583,1900-12-25
-1900-05-05 12:34:56.1584,1900-12-25
-1900-05-05 12:34:56.1585,1900-12-25
-1900-05-05 12:34:56.1586,1900-12-25
-1900-05-05 12:34:56.1587,1900-12-25
-1900-05-05 12:34:56.1588,1900-12-25
-1900-05-05 12:34:56.1589,1900-12-25
-1900-05-05 12:34:56.159,1900-12-25
-1900-05-05 12:34:56.1591,1900-12-25
-1900-05-05 12:34:56.1592,1900-12-25
-1900-05-05 12:34:56.1593,1900-12-25
-1900-05-05 12:34:56.1594,1900-12-25
-1900-05-05 12:34:56.1595,1900-12-25
-1900-05-05 12:34:56.1596,1900-12-25
-1900-05-05 12:34:56.1597,1900-12-25
-1900-05-05 12:34:56.1598,1900-12-25
-1900-05-05 12:34:56.1599,1900-12-25
-1900-05-05 12:34:56.16,1900-12-25
-1900-05-05 12:34:56.1601,1900-12-25
-1900-05-05 12:34:56.1602,1900-12-25
-1900-05-05 12:34:56.1603,1900-12-25
-1900-05-05 12:34:56.1604,1900-12-25
-1900-05-05 12:34:56.1605,1900-12-25
-1900-05-05 12:34:56.1606,1900-12-25
-1900-05-05 12:34:56.1607,1900-12-25
-1900-05-05 12:34:56.1608,1900-12-25
-1900-05-05 12:34:56.1609,1900-12-25
-1900-05-05 12:34:56.161,1900-12-25
-1900-05-05 12:34:56.1611,1900-12-25
-1900-05-05 12:34:56.1612,1900-12-25
-1900-05-05 12:34:56.1613,1900-12-25
-1900-05-05 12:34:56.1614,1900-12-25
-1900-05-05 12:34:56.1615,1900-12-25
-1900-05-05 12:34:56.1616,1900-12-25
-1900-05-05 12:34:56.1617,1900-12-25
-1900-05-05 12:34:56.1618,1900-12-25
-1900-05-05 12:34:56.1619,1900-12-25
-1900-05-05 12:34:56.162,1900-12-25
-1900-05-05 12:34:56.1621,1900-12-25
-1900-05-05 12:34:56.1622,1900-12-25
-1900-05-05 12:34:56.1623,1900-12-25
-1900-05-05 12:34:56.1624,1900-12-25
-1900-05-05 12:34:56.1625,1900-12-25
-1900-05-05 12:34:56.1626,1900-12-25
-1900-05-05 12:34:56.1627,1900-12-25
-1900-05-05 12:34:56.1628,1900-12-25
-1900-05-05 12:34:56.1629,1900-12-25
-1900-05-05 12:34:56.163,1900-12-25
-1900-05-05 12:34:56.1631,1900-12-25
-1900-05-05 12:34:56.1632,1900-12-25
-1900-05-05 12:34:56.1633,1900-12-25
-1900-05-05 12:34:56.1634,1900-12-25
-1900-05-05 12:34:56.1635,1900-12-25
-1900-05-05 12:34:56.1636,1900-12-25
-1900-05-05 12:34:56.1637,1900-12-25
-1900-05-05 12:34:56.1638,1900-12-25
-1900-05-05 12:34:56.1639,1900-12-25
-1900-05-05 12:34:56.164,1900-12-25
-1900-05-05 12:34:56.1641,1900-12-25
-1900-05-05 12:34:56.1642,1900-12-25
-1900-05-05 12:34:56.1643,1900-12-25
-1900-05-05 12:34:56.1644,1900-12-25
-1900-05-05 12:34:56.1645,1900-12-25
-1900-05-05 12:34:56.1646,1900-12-25
-1900-05-05 12:34:56.1647,1900-12-25
-1900-05-05 12:34:56.1648,1900-12-25
-1900-05-05 12:34:56.1649,1900-12-25
-1900-05-05 12:34:56.165,1900-12-25
-1900-05-05 12:34:56.1651,1900-12-25
-1900-05-05 12:34:56.1652,1900-12-25
-1900-05-05 12:34:56.1653,1900-12-25
-1900-05-05 12:34:56.1654,1900-12-25
-1900-05-05 12:34:56.1655,1900-12-25
-1900-05-05 12:34:56.1656,1900-12-25
-1900-05-05 12:34:56.1657,1900-12-25
-1900-05-05 12:34:56.1658,1900-12-25
-1900-05-05 12:34:56.1659,1900-12-25
-1900-05-05 12:34:56.166,1900-12-25
-1900-05-05 12:34:56.1661,1900-12-25
-1900-05-05 12:34:56.1662,1900-12-25
-1900-05-05 12:34:56.1663,1900-12-25
-1900-05-05 12:34:56.1664,1900-12-25
-1900-05-05 12:34:56.1665,1900-12-25
-1900-05-05 12:34:56.1666,1900-12-25
-1900-05-05 12:34:56.1667,1900-12-25
-1900-05-05 12:34:56.1668,1900-12-25
-1900-05-05 12:34:56.1669,1900-12-25
-1900-05-05 12:34:56.167,1900-12-25
-1900-05-05 12:34:56.1671,1900-12-25
-1900-05-05 12:34:56.1672,1900-12-25
-1900-05-05 12:34:56.1673,1900-12-25
-1900-05-05 12:34:56.1674,1900-12-25
-1900-05-05 12:34:56.1675,1900-12-25
-1900-05-05 12:34:56.1676,1900-12-25
-1900-05-05 12:34:56.1677,1900-12-25
-1900-05-05 12:34:56.1678,1900-12-25
-1900-05-05 12:34:56.1679,1900-12-25
-1900-05-05 12:34:56.168,1900-12-25
-1900-05-05 12:34:56.1681,1900-12-25
-1900-05-05 12:34:56.1682,1900-12-25
-1900-05-05 12:34:56.1683,1900-12-25
-1900-05-05 12:34:56.1684,1900-12-25
-1900-05-05 12:34:56.1685,1900-12-25
-1900-05-05 12:34:56.1686,1900-12-25
-1900-05-05 12:34:56.1687,1900-12-25
-1900-05-05 12:34:56.1688,1900-12-25
-1900-05-05 12:34:56.1689,1900-12-25
-1900-05-05 12:34:56.169,1900-12-25
-1900-05-05 12:34:56.1691,1900-12-25
-1900-05-05 12:34:56.1692,1900-12-25
-1900-05-05 12:34:56.1693,1900-12-25
-1900-05-05 12:34:56.1694,1900-12-25
-1900-05-05 12:34:56.1695,1900-12-25
-1900-05-05 12:34:56.1696,1900-12-25
-1900-05-05 12:34:56.1697,1900-12-25
-1900-05-05 12:34:56.1698,1900-12-25
-1900-05-05 12:34:56.1699,1900-12-25
-1900-05-05 12:34:56.17,1900-12-25
-1900-05-05 12:34:56.1701,1900-12-25
-1900-05-05 12:34:56.1702,1900-12-25
-1900-05-05 12:34:56.1703,1900-12-25
-1900-05-05 12:34:56.1704,1900-12-25
-1900-05-05 12:34:56.1705,1900-12-25
-1900-05-05 12:34:56.1706,1900-12-25
-1900-05-05 12:34:56.1707,1900-12-25
-1900-05-05 12:34:56.1708,1900-12-25
-1900-05-05 12:34:56.1709,1900-12-25
-1900-05-05 12:34:56.171,1900-12-25
-1900-05-05 12:34:56.1711,1900-12-25
-1900-05-05 12:34:56.1712,1900-12-25
-1900-05-05 12:34:56.1713,1900-12-25
-1900-05-05 12:34:56.1714,1900-12-25
-1900-05-05 12:34:56.1715,1900-12-25
-1900-05-05 12:34:56.1716,1900-12-25
-1900-05-05 12:34:56.1717,1900-12-25
-1900-05-05 12:34:56.1718,1900-12-25
-1900-05-05 12:34:56.1719,1900-12-25
-1900-05-05 12:34:56.172,1900-12-25
-1900-05-05 12:34:56.1721,1900-12-25
-1900-05-05 12:34:56.1722,1900-12-25
-1900-05-05 12:34:56.1723,1900-12-25
-1900-05-05 12:34:56.1724,1900-12-25
-1900-05-05 12:34:56.1725,1900-12-25
-1900-05-05 12:34:56.1726,1900-12-25
-1900-05-05 12:34:56.1727,1900-12-25
-1900-05-05 12:34:56.1728,1900-12-25
-1900-05-05 12:34:56.1729,1900-12-25
-1900-05-05 12:34:56.173,1900-12-25
-1900-05-05 12:34:56.1731,1900-12-25
-1900-05-05 12:34:56.1732,1900-12-25
-1900-05-05 12:34:56.1733,1900-12-25
-1900-05-05 12:34:56.1734,1900-12-25
-1900-05-05 12:34:56.1735,1900-12-25
-1900-05-05 12:34:56.1736,1900-12-25
-1900-05-05 12:34:56.1737,1900-12-25
-1900-05-05 12:34:56.1738,1900-12-25
-1900-05-05 12:34:56.1739,1900-12-25
-1900-05-05 12:34:56.174,1900-12-25
-1900-05-05 12:34:56.1741,1900-12-25
-1900-05-05 12:34:56.1742,1900-12-25
-1900-05-05 12:34:56.1743,1900-12-25
-1900-05-05 12:34:56.1744,1900-12-25
-1900-05-05 12:34:56.1745,1900-12-25
-1900-05-05 12:34:56.1746,1900-12-25
-1900-05-05 12:34:56.1747,1900-12-25
-1900-05-05 12:34:56.1748,1900-12-25
-1900-05-05 12:34:56.1749,1900-12-25
-1900-05-05 12:34:56.175,1900-12-25
-1900-05-05 12:34:56.1751,1900-12-25
-1900-05-05 12:34:56.1752,1900-12-25
-1900-05-05 12:34:56.1753,1900-12-25
-1900-05-05 12:34:56.1754,1900-12-25
-1900-05-05 12:34:56.1755,1900-12-25
-1900-05-05 12:34:56.1756,1900-12-25
-1900-05-05 12:34:56.1757,1900-12-25
-1900-05-05 12:34:56.1758,1900-12-25
-1900-05-05 12:34:56.1759,1900-12-25
-1900-05-05 12:34:56.176,1900-12-25
-1900-05-05 12:34:56.1761,1900-12-25
-1900-05-05 12:34:56.1762,1900-12-25
-1900-05-05 12:34:56.1763,1900-12-25
-1900-05-05 12:34:56.1764,1900-12-25
-1900-05-05 12:34:56.1765,1900-12-25
-1900-05-05 12:34:56.1766,1900-12-25
-1900-05-05 12:34:56.1767,1900-12-25
-1900-05-05 12:34:56.1768,1900-12-25
-1900-05-05 12:34:56.1769,1900-12-25
-1900-05-05 12:34:56.177,1900-12-25
-1900-05-05 12:34:56.1771,1900-12-25
-1900-05-05 12:34:56.1772,1900-12-25
-1900-05-05 12:34:56.1773,1900-12-25
-1900-05-05 12:34:56.1774,1900-12-25
-1900-05-05 12:34:56.1775,1900-12-25
-1900-05-05 12:34:56.1776,1900-12-25
-1900-05-05 12:34:56.1777,1900-12-25
-1900-05-05 12:34:56.1778,1900-12-25
-1900-05-05 12:34:56.1779,1900-12-25
-1900-05-05 12:34:56.178,1900-12-25
-1900-05-05 12:34:56.1781,1900-12-25
-1900-05-05 12:34:56.1782,1900-12-25
-1900-05-05 12:34:56.1783,1900-12-25
-1900-05-05 12:34:56.1784,1900-12-25
-1900-05-05 12:34:56.1785,1900-12-25
-1900-05-05 12:34:56.1786,1900-12-25
-1900-05-05 12:34:56.1787,1900-12-25
-1900-05-05 12:34:56.1788,1900-12-25
-1900-05-05 12:34:56.1789,1900-12-25
-1900-05-05 12:34:56.179,1900-12-25
-1900-05-05 12:34:56.1791,1900-12-25
-1900-05-05 12:34:56.1792,1900-12-25
-1900-05-05 12:34:56.1793,1900-12-25
-1900-05-05 12:34:56.1794,1900-12-25
-1900-05-05 12:34:56.1795,1900-12-25
-1900-05-05 12:34:56.1796,1900-12-25
-1900-05-05 12:34:56.1797,1900-12-25
-1900-05-05 12:34:56.1798,1900-12-25
-1900-05-05 12:34:56.1799,1900-12-25
-1900-05-05 12:34:56.18,1900-12-25
-1900-05-05 12:34:56.1801,1900-12-25
-1900-05-05 12:34:56.1802,1900-12-25
-1900-05-05 12:34:56.1803,1900-12-25
-1900-05-05 12:34:56.1804,1900-12-25
-1900-05-05 12:34:56.1805,1900-12-25
-1900-05-05 12:34:56.1806,1900-12-25
-1900-05-05 12:34:56.1807,1900-12-25
-1900-05-05 12:34:56.1808,1900-12-25
-1900-05-05 12:34:56.1809,1900-12-25
-1900-05-05 12:34:56.181,1900-12-25
-1900-05-05 12:34:56.1811,1900-12-25
-1900-05-05 12:34:56.1812,1900-12-25
-1900-05-05 12:34:56.1813,1900-12-25
-1900-05-05 12:34:56.1814,1900-12-25
-1900-05-05 12:34:56.1815,1900-12-25
-1900-05-05 12:34:56.1816,1900-12-25
-1900-05-05 12:34:56.1817,1900-12-25
-1900-05-05 12:34:56.1818,1900-12-25
-1900-05-05 12:34:56.1819,1900-12-25
-1900-05-05 12:34:56.182,1900-12-25
-1900-05-05 12:34:56.1821,1900-12-25
-1900-05-05 12:34:56.1822,1900-12-25
-1900-05-05 12:34:56.1823,1900-12-25
-1900-05-05 12:34:56.1824,1900-12-25
-1900-05-05 12:34:56.1825,1900-12-25
-1900-05-05 12:34:56.1826,1900-12-25
-1900-05-05 12:34:56.1827,1900-12-25
-1900-05-05 12:34:56.1828,1900-12-25
-1900-05-05 12:34:56.1829,1900-12-25
-1900-05-05 12:34:56.183,1900-12-25
-1900-05-05 12:34:56.1831,1900-12-25
-1900-05-05 12:34:56.1832,1900-12-25
-1900-05-05 12:34:56.1833,1900-12-25
-1900-05-05 12:34:56.1834,1900-12-25
-1900-05-05 12:34:56.1835,1900-12-25
-1900-05-05 12:34:56.1836,1900-12-25
-1900-05-05 12:34:56.1837,1900-12-25
-1900-05-05 12:34:56.1838,1900-12-25
-1900-05-05 12:34:56.1839,1900-12-25
-1900-05-05 12:34:56.184,1900-12-25
-1900-05-05 12:34:56.1841,1900-12-25
-1900-05-05 12:34:56.1842,1900-12-25
-1900-05-05 12:34:56.1843,1900-12-25
-1900-05-05 12:34:56.1844,1900-12-25
-1900-05-05 12:34:56.1845,1900-12-25
-1900-05-05 12:34:56.1846,1900-12-25
-1900-05-05 12:34:56.1847,1900-12-25
-1900-05-05 12:34:56.1848,1900-12-25
-1900-05-05 12:34:56.1849,1900-12-25
-1900-05-05 12:34:56.185,1900-12-25
-1900-05-05 12:34:56.1851,1900-12-25
-1900-05-05 12:34:56.1852,1900-12-25
-1900-05-05 12:34:56.1853,1900-12-25
-1900-05-05 12:34:56.1854,1900-12-25
-1900-05-05 12:34:56.1855,1900-12-25
-1900-05-05 12:34:56.1856,1900-12-25
-1900-05-05 12:34:56.1857,1900-12-25
-1900-05-05 12:34:56.1858,1900-12-25
-1900-05-05 12:34:56.1859,1900-12-25
-1900-05-05 12:34:56.186,1900-12-25
-1900-05-05 12:34:56.1861,1900-12-25
-1900-05-05 12:34:56.1862,1900-12-25
-1900-05-05 12:34:56.1863,1900-12-25
-1900-05-05 12:34:56.1864,1900-12-25
-1900-05-05 12:34:56.1865,1900-12-25
-1900-05-05 12:34:56.1866,1900-12-25
-1900-05-05 12:34:56.1867,1900-12-25
-1900-05-05 12:34:56.1868,1900-12-25
-1900-05-05 12:34:56.1869,1900-12-25
-1900-05-05 12:34:56.187,1900-12-25
-1900-05-05 12:34:56.1871,1900-12-25
-1900-05-05 12:34:56.1872,1900-12-25
-1900-05-05 12:34:56.1873,1900-12-25
-1900-05-05 12:34:56.1874,1900-12-25
-1900-05-05 12:34:56.1875,1900-12-25
-1900-05-05 12:34:56.1876,1900-12-25
-1900-05-05 12:34:56.1877,1900-12-25
-1900-05-05 12:34:56.1878,1900-12-25
-1900-05-05 12:34:56.1879,1900-12-25
-1900-05-05 12:34:56.188,1900-12-25
-1900-05-05 12:34:56.1881,1900-12-25
-1900-05-05 12:34:56.1882,1900-12-25
-1900-05-05 12:34:56.1883,1900-12-25
-1900-05-05 12:34:56.1884,1900-12-25
-1900-05-05 12:34:56.1885,1900-12-25
-1900-05-05 12:34:56.1886,1900-12-25
-1900-05-05 12:34:56.1887,1900-12-25
-1900-05-05 12:34:56.1888,1900-12-25
-1900-05-05 12:34:56.1889,1900-12-25
-1900-05-05 12:34:56.189,1900-12-25
-1900-05-05 12:34:56.1891,1900-12-25
-1900-05-05 12:34:56.1892,1900-12-25
-1900-05-05 12:34:56.1893,1900-12-25
-1900-05-05 12:34:56.1894,1900-12-25
-1900-05-05 12:34:56.1895,1900-12-25
-1900-05-05 12:34:56.1896,1900-12-25
-1900-05-05 12:34:56.1897,1900-12-25
-1900-05-05 12:34:56.1898,1900-12-25
-1900-05-05 12:34:56.1899,1900-12-25
-1900-05-05 12:34:56.19,1900-12-25
-1900-05-05 12:34:56.1901,1900-12-25
-1900-05-05 12:34:56.1902,1900-12-25
-1900-05-05 12:34:56.1903,1900-12-25
-1900-05-05 12:34:56.1904,1900-12-25
-1900-05-05 12:34:56.1905,1900-12-25
-1900-05-05 12:34:56.1906,1900-12-25
-1900-05-05 12:34:56.1907,1900-12-25
-1900-05-05 12:34:56.1908,1900-12-25
-1900-05-05 12:34:56.1909,1900-12-25
-1900-05-05 12:34:56.191,1900-12-25
-1900-05-05 12:34:56.1911,1900-12-25
-1900-05-05 12:34:56.1912,1900-12-25
-1900-05-05 12:34:56.1913,1900-12-25
-1900-05-05 12:34:56.1914,1900-12-25
-1900-05-05 12:34:56.1915,1900-12-25
-1900-05-05 12:34:56.1916,1900-12-25
-1900-05-05 12:34:56.1917,1900-12-25
-1900-05-05 12:34:56.1918,1900-12-25
-1900-05-05 12:34:56.1919,1900-12-25
-1900-05-05 12:34:56.192,1900-12-25
-1900-05-05 12:34:56.1921,1900-12-25
-1900-05-05 12:34:56.1922,1900-12-25
-1900-05-05 12:34:56.1923,1900-12-25
-1900-05-05 12:34:56.1924,1900-12-25
-1900-05-05 12:34:56.1925,1900-12-25
-1900-05-05 12:34:56.1926,1900-12-25
-1900-05-05 12:34:56.1927,1900-12-25
-1900-05-05 12:34:56.1928,1900-12-25
-1900-05-05 12:34:56.1929,1900-12-25
-1900-05-05 12:34:56.193,1900-12-25
-1900-05-05 12:34:56.1931,1900-12-25
-1900-05-05 12:34:56.1932,1900-12-25
-1900-05-05 12:34:56.1933,1900-12-25
-1900-05-05 12:34:56.1934,1900-12-25
-1900-05-05 12:34:56.1935,1900-12-25
-1900-05-05 12:34:56.1936,1900-12-25
-1900-05-05 12:34:56.1937,1900-12-25
-1900-05-05 12:34:56.1938,1900-12-25
-1900-05-05 12:34:56.1939,1900-12-25
-1900-05-05 12:34:56.194,1900-12-25
-1900-05-05 12:34:56.1941,1900-12-25
-1900-05-05 12:34:56.1942,1900-12-25
-1900-05-05 12:34:56.1943,1900-12-25
-1900-05-05 12:34:56.1944,1900-12-25
-1900-05-05 12:34:56.1945,1900-12-25
-1900-05-05 12:34:56.1946,1900-12-25
-1900-05-05 12:34:56.1947,1900-12-25
-1900-05-05 12:34:56.1948,1900-12-25
-1900-05-05 12:34:56.1949,1900-12-25
-1900-05-05 12:34:56.195,1900-12-25
-1900-05-05 12:34:56.1951,1900-12-25
-1900-05-05 12:34:56.1952,1900-12-25
-1900-05-05 12:34:56.1953,1900-12-25
-1900-05-05 12:34:56.1954,1900-12-25
-1900-05-05 12:34:56.1955,1900-12-25
-1900-05-05 12:34:56.1956,1900-12-25
-1900-05-05 12:34:56.1957,1900-12-25
-1900-05-05 12:34:56.1958,1900-12-25
-1900-05-05 12:34:56.1959,1900-12-25
-1900-05-05 12:34:56.196,1900-12-25
-1900-05-05 12:34:56.1961,1900-12-25
-1900-05-05 12:34:56.1962,1900-12-25
-1900-05-05 12:34:56.1963,1900-12-25
-1900-05-05 12:34:56.1964,1900-12-25
-1900-05-05 12:34:56.1965,1900-12-25
-1900-05-05 12:34:56.1966,1900-12-25
-1900-05-05 12:34:56.1967,1900-12-25
-1900-05-05 12:34:56.1968,1900-12-25
-1900-05-05 12:34:56.1969,1900-12-25
-1900-05-05 12:34:56.197,1900-12-25
-1900-05-05 12:34:56.1971,1900-12-25
-1900-05-05 12:34:56.1972,1900-12-25
-1900-05-05 12:34:56.1973,1900-12-25
-1900-05-05 12:34:56.1974,1900-12-25
-1900-05-05 12:34:56.1975,1900-12-25
-1900-05-05 12:34:56.1976,1900-12-25
-1900-05-05 12:34:56.1977,1900-12-25
-1900-05-05 12:34:56.1978,1900-12-25
-1900-05-05 12:34:56.1979,1900-12-25
-1900-05-05 12:34:56.198,1900-12-25
-1900-05-05 12:34:56.1981,1900-12-25
-1900-05-05 12:34:56.1982,1900-12-25
-1900-05-05 12:34:56.1983,1900-12-25
-1900-05-05 12:34:56.1984,1900-12-25
-1900-05-05 12:34:56.1985,1900-12-25
-1900-05-05 12:34:56.1986,1900-12-25
-1900-05-05 12:34:56.1987,1900-12-25
-1900-05-05 12:34:56.1988,1900-12-25
-1900-05-05 12:34:56.1989,1900-12-25
-1900-05-05 12:34:56.199,1900-12-25
-1900-05-05 12:34:56.1991,1900-12-25
-1900-05-05 12:34:56.1992,1900-12-25
-1900-05-05 12:34:56.1993,1900-12-25
-1900-05-05 12:34:56.1994,1900-12-25
-1900-05-05 12:34:56.1995,1900-12-25
-1900-05-05 12:34:56.1996,1900-12-25
-1900-05-05 12:34:56.1997,1900-12-25
-1900-05-05 12:34:56.1998,1900-12-25
-1900-05-05 12:34:56.1999,1900-12-25
-1901-05-05 12:34:56.1,1901-12-25
-1901-05-05 12:34:56.1001,1901-12-25
-1901-05-05 12:34:56.1002,1901-12-25
-1901-05-05 12:34:56.1003,1901-12-25
-1901-05-05 12:34:56.1004,1901-12-25
-1901-05-05 12:34:56.1005,1901-12-25
-1901-05-05 12:34:56.1006,1901-12-25
-1901-05-05 12:34:56.1007,1901-12-25
-1901-05-05 12:34:56.1008,1901-12-25
-1901-05-05 12:34:56.1009,1901-12-25
-1901-05-05 12:34:56.101,1901-12-25
-1901-05-05 12:34:56.1011,1901-12-25
-1901-05-05 12:34:56.1012,1901-12-25
-1901-05-05 12:34:56.1013,1901-12-25
-1901-05-05 12:34:56.1014,1901-12-25
-1901-05-05 12:34:56.1015,1901-12-25
-1901-05-05 12:34:56.1016,1901-12-25
-1901-05-05 12:34:56.1017,1901-12-25
-1901-05-05 12:34:56.1018,1901-12-25
-1901-05-05 12:34:56.1019,1901-12-25
-1901-05-05 12:34:56.102,1901-12-25
-1901-05-05 12:34:56.1021,1901-12-25
-1901-05-05 12:34:56.1022,1901-12-25
-1901-05-05 12:34:56.1023,1901-12-25
-1901-05-05 12:34:56.1024,1901-12-25
-1901-05-05 12:34:56.1025,1901-12-25
-1901-05-05 12:34:56.1026,1901-12-25
-1901-05-05 12:34:56.1027,1901-12-25
-1901-05-05 12:34:56.1028,1901-12-25
-1901-05-05 12:34:56.1029,1901-12-25
-1901-05-05 12:34:56.103,1901-12-25
-1901-05-05 12:34:56.1031,1901-12-25
-1901-05-05 12:34:56.1032,1901-12-25
-1901-05-05 12:34:56.1033,1901-12-25
-1901-05-05 12:34:56.1034,1901-12-25
-1901-05-05 12:34:56.1035,1901-12-25
-1901-05-05 12:34:56.1036,1901-12-25
-1901-05-05 12:34:56.1037,1901-12-25
-1901-05-05 12:34:56.1038,1901-12-25
-1901-05-05 12:34:56.1039,1901-12-25
-1901-05-05 12:34:56.104,1901-12-25
-1901-05-05 12:34:56.1041,1901-12-25
-1901-05-05 12:34:56.1042,1901-12-25
-1901-05-05 12:34:56.1043,1901-12-25
-1901-05-05 12:34:56.1044,1901-12-25
-1901-05-05 12:34:56.1045,1901-12-25
-1901-05-05 12:34:56.1046,1901-12-25
-1901-05-05 12:34:56.1047,1901-12-25
-1901-05-05 12:34:56.1048,1901-12-25
-1901-05-05 12:34:56.1049,1901-12-25
-1901-05-05 12:34:56.105,1901-12-25
-1901-05-05 12:34:56.1051,1901-12-25
-1901-05-05 12:34:56.1052,1901-12-25
-1901-05-05 12:34:56.1053,1901-12-25
-1901-05-05 12:34:56.1054,1901-12-25
-1901-05-05 12:34:56.1055,1901-12-25
-1901-05-05 12:34:56.1056,1901-12-25
-1901-05-05 12:34:56.1057,1901-12-25
-1901-05-05 12:34:56.1058,1901-12-25
-1901-05-05 12:34:56.1059,1901-12-25
-1901-05-05 12:34:56.106,1901-12-25
-1901-05-05 12:34:56.1061,1901-12-25
-1901-05-05 12:34:56.1062,1901-12-25
-1901-05-05 12:34:56.1063,1901-12-25
-1901-05-05 12:34:56.1064,1901-12-25
-1901-05-05 12:34:56.1065,1901-12-25
-1901-05-05 12:34:56.1066,1901-12-25
-1901-05-05 12:34:56.1067,1901-12-25
-1901-05-05 12:34:56.1068,1901-12-25
-1901-05-05 12:34:56.1069,1901-12-25
-1901-05-05 12:34:56.107,1901-12-25
-1901-05-05 12:34:56.1071,1901-12-25
-1901-05-05 12:34:56.1072,1901-12-25
-1901-05-05 12:34:56.1073,1901-12-25
-1901-05-05 12:34:56.1074,1901-12-25
-1901-05-05 12:34:56.1075,1901-12-25
-1901-05-05 12:34:56.1076,1901-12-25
-1901-05-05 12:34:56.1077,1901-12-25
-1901-05-05 12:34:56.1078,1901-12-25
-1901-05-05 12:34:56.1079,1901-12-25
-1901-05-05 12:34:56.108,1901-12-25
-1901-05-05 12:34:56.1081,1901-12-25
-1901-05-05 12:34:56.1082,1901-12-25
-1901-05-05 12:34:56.1083,1901-12-25
-1901-05-05 12:34:56.1084,1901-12-25
-1901-05-05 12:34:56.1085,1901-12-25
-1901-05-05 12:34:56.1086,1901-12-25
-1901-05-05 12:34:56.1087,1901-12-25
-1901-05-05 12:34:56.1088,1901-12-25
-1901-05-05 12:34:56.1089,1901-12-25
-1901-05-05 12:34:56.109,1901-12-25
-1901-05-05 12:34:56.1091,1901-12-25
-1901-05-05 12:34:56.1092,1901-12-25
-1901-05-05 12:34:56.1093,1901-12-25
-1901-05-05 12:34:56.1094,1901-12-25
-1901-05-05 12:34:56.1095,1901-12-25
-1901-05-05 12:34:56.1096,1901-12-25
-1901-05-05 12:34:56.1097,1901-12-25
-1901-05-05 12:34:56.1098,1901-12-25
-1901-05-05 12:34:56.1099,1901-12-25
-1901-05-05 12:34:56.11,1901-12-25
-1901-05-05 12:34:56.1101,1901-12-25
-1901-05-05 12:34:56.1102,1901-12-25
-1901-05-05 12:34:56.1103,1901-12-25
-1901-05-05 12:34:56.1104,1901-12-25
-1901-05-05 12:34:56.1105,1901-12-25
-1901-05-05 12:34:56.1106,1901-12-25
-1901-05-05 12:34:56.1107,1901-12-25
-1901-05-05 12:34:56.1108,1901-12-25
-1901-05-05 12:34:56.1109,1901-12-25
-1901-05-05 12:34:56.111,1901-12-25
-1901-05-05 12:34:56.1111,1901-12-25
-1901-05-05 12:34:56.1112,1901-12-25
-1901-05-05 12:34:56.1113,1901-12-25
-1901-05-05 12:34:56.1114,1901-12-25
-1901-05-05 12:34:56.1115,1901-12-25
-1901-05-05 12:34:56.1116,1901-12-25
-1901-05-05 12:34:56.1117,1901-12-25
-1901-05-05 12:34:56.1118,1901-12-25
-1901-05-05 12:34:56.1119,1901-12-25
-1901-05-05 12:34:56.112,1901-12-25
-1901-05-05 12:34:56.1121,1901-12-25
-1901-05-05 12:34:56.1122,1901-12-25
-1901-05-05 12:34:56.1123,1901-12-25
-1901-05-05 12:34:56.1124,1901-12-25
-1901-05-05 12:34:56.1125,1901-12-25
-1901-05-05 12:34:56.1126,1901-12-25
-1901-05-05 12:34:56.1127,1901-12-25
-1901-05-05 12:34:56.1128,1901-12-25
-1901-05-05 12:34:56.1129,1901-12-25
-1901-05-05 12:34:56.113,1901-12-25
-1901-05-05 12:34:56.1131,1901-12-25
-1901-05-05 12:34:56.1132,1901-12-25
-1901-05-05 12:34:56.1133,1901-12-25
-1901-05-05 12:34:56.1134,1901-12-25
-1901-05-05 12:34:56.1135,1901-12-25
-1901-05-05 12:34:56.1136,1901-12-25
-1901-05-05 12:34:56.1137,1901-12-25
-1901-05-05 12:34:56.1138,1901-12-25
-1901-05-05 12:34:56.1139,1901-12-25
-1901-05-05 12:34:56.114,1901-12-25
-1901-05-05 12:34:56.1141,1901-12-25
-1901-05-05 12:34:56.1142,1901-12-25
-1901-05-05 12:34:56.1143,1901-12-25
-1901-05-05 12:34:56.1144,1901-12-25
-1901-05-05 12:34:56.1145,1901-12-25
-1901-05-05 12:34:56.1146,1901-12-25
-1901-05-05 12:34:56.1147,1901-12-25
-1901-05-05 12:34:56.1148,1901-12-25
-1901-05-05 12:34:56.1149,1901-12-25
-1901-05-05 12:34:56.115,1901-12-25
-1901-05-05 12:34:56.1151,1901-12-25
-1901-05-05 12:34:56.1152,1901-12-25
-1901-05-05 12:34:56.1153,1901-12-25
-1901-05-05 12:34:56.1154,1901-12-25
-1901-05-05 12:34:56.1155,1901-12-25
-1901-05-05 12:34:56.1156,1901-12-25
-1901-05-05 12:34:56.1157,1901-12-25
-1901-05-05 12:34:56.1158,1901-12-25
-1901-05-05 12:34:56.1159,1901-12-25
-1901-05-05 12:34:56.116,1901-12-25
-1901-05-05 12:34:56.1161,1901-12-25
-1901-05-05 12:34:56.1162,1901-12-25
-1901-05-05 12:34:56.1163,1901-12-25
-1901-05-05 12:34:56.1164,1901-12-25
-1901-05-05 12:34:56.1165,1901-12-25
-1901-05-05 12:34:56.1166,1901-12-25
-1901-05-05 12:34:56.1167,1901-12-25
-1901-05-05 12:34:56.1168,1901-12-25
-1901-05-05 12:34:56.1169,1901-12-25
-1901-05-05 12:34:56.117,1901-12-25
-1901-05-05 12:34:56.1171,1901-12-25
-1901-05-05 12:34:56.1172,1901-12-25
-1901-05-05 12:34:56.1173,1901-12-25
-1901-05-05 12:34:56.1174,1901-12-25
-1901-05-05 12:34:56.1175,1901-12-25
-1901-05-05 12:34:56.1176,1901-12-25
-1901-05-05 12:34:56.1177,1901-12-25
-1901-05-05 12:34:56.1178,1901-12-25
-1901-05-05 12:34:56.1179,1901-12-25
-1901-05-05 12:34:56.118,1901-12-25
-1901-05-05 12:34:56.1181,1901-12-25
-1901-05-05 12:34:56.1182,1901-12-25
-1901-05-05 12:34:56.1183,1901-12-25
-1901-05-05 12:34:56.1184,1901-12-25
-1901-05-05 12:34:56.1185,1901-12-25
-1901-05-05 12:34:56.1186,1901-12-25
-1901-05-05 12:34:56.1187,1901-12-25
-1901-05-05 12:34:56.1188,1901-12-25
-1901-05-05 12:34:56.1189,1901-12-25
-1901-05-05 12:34:56.119,1901-12-25
-1901-05-05 12:34:56.1191,1901-12-25
-1901-05-05 12:34:56.1192,1901-12-25
-1901-05-05 12:34:56.1193,1901-12-25
-1901-05-05 12:34:56.1194,1901-12-25
-1901-05-05 12:34:56.1195,1901-12-25
-1901-05-05 12:34:56.1196,1901-12-25
-1901-05-05 12:34:56.1197,1901-12-25
-1901-05-05 12:34:56.1198,1901-12-25
-1901-05-05 12:34:56.1199,1901-12-25
-1901-05-05 12:34:56.12,1901-12-25
-1901-05-05 12:34:56.1201,1901-12-25
-1901-05-05 12:34:56.1202,1901-12-25
-1901-05-05 12:34:56.1203,1901-12-25
-1901-05-05 12:34:56.1204,1901-12-25
-1901-05-05 12:34:56.1205,1901-12-25
-1901-05-05 12:34:56.1206,1901-12-25
-1901-05-05 12:34:56.1207,1901-12-25
-1901-05-05 12:34:56.1208,1901-12-25
-1901-05-05 12:34:56.1209,1901-12-25
-1901-05-05 12:34:56.121,1901-12-25
-1901-05-05 12:34:56.1211,1901-12-25
-1901-05-05 12:34:56.1212,1901-12-25
-1901-05-05 12:34:56.1213,1901-12-25
-1901-05-05 12:34:56.1214,1901-12-25
-1901-05-05 12:34:56.1215,1901-12-25
-1901-05-05 12:34:56.1216,1901-12-25
-1901-05-05 12:34:56.1217,1901-12-25
-1901-05-05 12:34:56.1218,1901-12-25
-1901-05-05 12:34:56.1219,1901-12-25
-1901-05-05 12:34:56.122,1901-12-25
-1901-05-05 12:34:56.1221,1901-12-25
-1901-05-05 12:34:56.1222,1901-12-25
-1901-05-05 12:34:56.1223,1901-12-25
-1901-05-05 12:34:56.1224,1901-12-25
-1901-05-05 12:34:56.1225,1901-12-25
-1901-05-05 12:34:56.1226,1901-12-25
-1901-05-05 12:34:56.1227,1901-12-25
-1901-05-05 12:34:56.1228,1901-12-25
-1901-05-05 12:34:56.1229,1901-12-25
-1901-05-05 12:34:56.123,1901-12-25
-1901-05-05 12:34:56.1231,1901-12-25
-1901-05-05 12:34:56.1232,1901-12-25
-1901-05-05 12:34:56.1233,1901-12-25
-1901-05-05 12:34:56.1234,1901-12-25
-1901-05-05 12:34:56.1235,1901-12-25
-1901-05-05 12:34:56.1236,1901-12-25
-1901-05-05 12:34:56.1237,1901-12-25
-1901-05-05 12:34:56.1238,1901-12-25
-1901-05-05 12:34:56.1239,1901-12-25
-1901-05-05 12:34:56.124,1901-12-25
-1901-05-05 12:34:56.1241,1901-12-25
-1901-05-05 12:34:56.1242,1901-12-25
-1901-05-05 12:34:56.1243,1901-12-25
-1901-05-05 12:34:56.1244,1901-12-25
-1901-05-05 12:34:56.1245,1901-12-25
-1901-05-05 12:34:56.1246,1901-12-25
-1901-05-05 12:34:56.1247,1901-12-25
-1901-05-05 12:34:56.1248,1901-12-25
-1901-05-05 12:34:56.1249,1901-12-25
-1901-05-05 12:34:56.125,1901-12-25
-1901-05-05 12:34:56.1251,1901-12-25
-1901-05-05 12:34:56.1252,1901-12-25
-1901-05-05 12:34:56.1253,1901-12-25
-1901-05-05 12:34:56.1254,1901-12-25
-1901-05-05 12:34:56.1255,1901-12-25
-1901-05-05 12:34:56.1256,1901-12-25
-1901-05-05 12:34:56.1257,1901-12-25
-1901-05-05 12:34:56.1258,1901-12-25
-1901-05-05 12:34:56.1259,1901-12-25
-1901-05-05 12:34:56.126,1901-12-25
-1901-05-05 12:34:56.1261,1901-12-25
-1901-05-05 12:34:56.1262,1901-12-25
-1901-05-05 12:34:56.1263,1901-12-25
-1901-05-05 12:34:56.1264,1901-12-25
-1901-05-05 12:34:56.1265,1901-12-25
-1901-05-05 12:34:56.1266,1901-12-25
-1901-05-05 12:34:56.1267,1901-12-25
-1901-05-05 12:34:56.1268,1901-12-25
-1901-05-05 12:34:56.1269,1901-12-25
-1901-05-05 12:34:56.127,1901-12-25
-1901-05-05 12:34:56.1271,1901-12-25
-1901-05-05 12:34:56.1272,1901-12-25
-1901-05-05 12:34:56.1273,1901-12-25
-1901-05-05 12:34:56.1274,1901-12-25
-1901-05-05 12:34:56.1275,1901-12-25
-1901-05-05 12:34:56.1276,1901-12-25
-1901-05-05 12:34:56.1277,1901-12-25
-1901-05-05 12:34:56.1278,1901-12-25
-1901-05-05 12:34:56.1279,1901-12-25
-1901-05-05 12:34:56.128,1901-12-25
-1901-05-05 12:34:56.1281,1901-12-25
-1901-05-05 12:34:56.1282,1901-12-25
-1901-05-05 12:34:56.1283,1901-12-25
-1901-05-05 12:34:56.1284,1901-12-25
-1901-05-05 12:34:56.1285,1901-12-25
-1901-05-05 12:34:56.1286,1901-12-25
-1901-05-05 12:34:56.1287,1901-12-25
-1901-05-05 12:34:56.1288,1901-12-25
-1901-05-05 12:34:56.1289,1901-12-25
-1901-05-05 12:34:56.129,1901-12-25
-1901-05-05 12:34:56.1291,1901-12-25
-1901-05-05 12:34:56.1292,1901-12-25
-1901-05-05 12:34:56.1293,1901-12-25
-1901-05-05 12:34:56.1294,1901-12-25
-1901-05-05 12:34:56.1295,1901-12-25
-1901-05-05 12:34:56.1296,1901-12-25
-1901-05-05 12:34:56.1297,1901-12-25
-1901-05-05 12:34:56.1298,1901-12-25
-1901-05-05 12:34:56.1299,1901-12-25
-1901-05-05 12:34:56.13,1901-12-25
-1901-05-05 12:34:56.1301,1901-12-25
-1901-05-05 12:34:56.1302,1901-12-25
-1901-05-05 12:34:56.1303,1901-12-25
-1901-05-05 12:34:56.1304,1901-12-25
-1901-05-05 12:34:56.1305,1901-12-25
-1901-05-05 12:34:56.1306,1901-12-25
-1901-05-05 12:34:56.1307,1901-12-25
-1901-05-05 12:34:56.1308,1901-12-25
-1901-05-05 12:34:56.1309,1901-12-25
-1901-05-05 12:34:56.131,1901-12-25
-1901-05-05 12:34:56.1311,1901-12-25
-1901-05-05 12:34:56.1312,1901-12-25
-1901-05-05 12:34:56.1313,1901-12-25
-1901-05-05 12:34:56.1314,1901-12-25
-1901-05-05 12:34:56.1315,1901-12-25
-1901-05-05 12:34:56.1316,1901-12-25
-1901-05-05 12:34:56.1317,1901-12-25
-1901-05-05 12:34:56.1318,1901-12-25
-1901-05-05 12:34:56.1319,1901-12-25
-1901-05-05 12:34:56.132,1901-12-25
-1901-05-05 12:34:56.1321,1901-12-25
-1901-05-05 12:34:56.1322,1901-12-25
-1901-05-05 12:34:56.1323,1901-12-25
-1901-05-05 12:34:56.1324,1901-12-25
-1901-05-05 12:34:56.1325,1901-12-25
-1901-05-05 12:34:56.1326,1901-12-25
-1901-05-05 12:34:56.1327,1901-12-25
-1901-05-05 12:34:56.1328,1901-12-25
-1901-05-05 12:34:56.1329,1901-12-25
-1901-05-05 12:34:56.133,1901-12-25
-1901-05-05 12:34:56.1331,1901-12-25
-1901-05-05 12:34:56.1332,1901-12-25
-1901-05-05 12:34:56.1333,1901-12-25
-1901-05-05 12:34:56.1334,1901-12-25
-1901-05-05 12:34:56.1335,1901-12-25
-1901-05-05 12:34:56.1336,1901-12-25
-1901-05-05 12:34:56.1337,1901-12-25
-1901-05-05 12:34:56.1338,1901-12-25
-1901-05-05 12:34:56.1339,1901-12-25
-1901-05-05 12:34:56.134,1901-12-25
-1901-05-05 12:34:56.1341,1901-12-25
-1901-05-05 12:34:56.1342,1901-12-25
-1901-05-05 12:34:56.1343,1901-12-25
-1901-05-05 12:34:56.1344,1901-12-25
-1901-05-05 12:34:56.1345,1901-12-25
-1901-05-05 12:34:56.1346,1901-12-25
-1901-05-05 12:34:56.1347,1901-12-25
-1901-05-05 12:34:56.1348,1901-12-25
-1901-05-05 12:34:56.1349,1901-12-25
-1901-05-05 12:34:56.135,1901-12-25
-1901-05-05 12:34:56.1351,1901-12-25
-1901-05-05 12:34:56.1352,1901-12-25
-1901-05-05 12:34:56.1353,1901-12-25
-1901-05-05 12:34:56.1354,1901-12-25
-1901-05-05 12:34:56.1355,1901-12-25
-1901-05-05 12:34:56.1356,1901-12-25
-1901-05-05 12:34:56.1357,1901-12-25
-1901-05-05 12:34:56.1358,1901-12-25
-1901-05-05 12:34:56.1359,1901-12-25
-1901-05-05 12:34:56.136,1901-12-25
-1901-05-05 12:34:56.1361,1901-12-25
-1901-05-05 12:34:56.1362,1901-12-25
-1901-05-05 12:34:56.1363,1901-12-25
-1901-05-05 12:34:56.1364,1901-12-25
-1901-05-05 12:34:56.1365,1901-12-25
-1901-05-05 12:34:56.1366,1901-12-25
-1901-05-05 12:34:56.1367,1901-12-25
-1901-05-05 12:34:56.1368,1901-12-25
-1901-05-05 12:34:56.1369,1901-12-25
-1901-05-05 12:34:56.137,1901-12-25
-1901-05-05 12:34:56.1371,1901-12-25
-1901-05-05 12:34:56.1372,1901-12-25
-1901-05-05 12:34:56.1373,1901-12-25
-1901-05-05 12:34:56.1374,1901-12-25
-1901-05-05 12:34:56.1375,1901-12-25
-1901-05-05 12:34:56.1376,1901-12-25
-1901-05-05 12:34:56.1377,1901-12-25
-1901-05-05 12:34:56.1378,1901-12-25
-1901-05-05 12:34:56.1379,1901-12-25
-1901-05-05 12:34:56.138,1901-12-25
-1901-05-05 12:34:56.1381,1901-12-25
-1901-05-05 12:34:56.1382,1901-12-25
-1901-05-05 12:34:56.1383,1901-12-25
-1901-05-05 12:34:56.1384,1901-12-25
-1901-05-05 12:34:56.1385,1901-12-25
-1901-05-05 12:34:56.1386,1901-12-25
-1901-05-05 12:34:56.1387,1901-12-25
-1901-05-05 12:34:56.1388,1901-12-25
-1901-05-05 12:34:56.1389,1901-12-25
-1901-05-05 12:34:56.139,1901-12-25
-1901-05-05 12:34:56.1391,1901-12-25
-1901-05-05 12:34:56.1392,1901-12-25
-1901-05-05 12:34:56.1393,1901-12-25
-1901-05-05 12:34:56.1394,1901-12-25
-1901-05-05 12:34:56.1395,1901-12-25
-1901-05-05 12:34:56.1396,1901-12-25
-1901-05-05 12:34:56.1397,1901-12-25
-1901-05-05 12:34:56.1398,1901-12-25
-1901-05-05 12:34:56.1399,1901-12-25
-1901-05-05 12:34:56.14,1901-12-25
-1901-05-05 12:34:56.1401,1901-12-25
-1901-05-05 12:34:56.1402,1901-12-25
-1901-05-05 12:34:56.1403,1901-12-25
-1901-05-05 12:34:56.1404,1901-12-25
-1901-05-05 12:34:56.1405,1901-12-25
-1901-05-05 12:34:56.1406,1901-12-25
-1901-05-05 12:34:56.1407,1901-12-25
-1901-05-05 12:34:56.1408,1901-12-25
-1901-05-05 12:34:56.1409,1901-12-25
-1901-05-05 12:34:56.141,1901-12-25
-1901-05-05 12:34:56.1411,1901-12-25
-1901-05-05 12:34:56.1412,1901-12-25
-1901-05-05 12:34:56.1413,1901-12-25
-1901-05-05 12:34:56.1414,1901-12-25
-1901-05-05 12:34:56.1415,1901-12-25
-1901-05-05 12:34:56.1416,1901-12-25
-1901-05-05 12:34:56.1417,1901-12-25
-1901-05-05 12:34:56.1418,1901-12-25
-1901-05-05 12:34:56.1419,1901-12-25
-1901-05-05 12:34:56.142,1901-12-25
-1901-05-05 12:34:56.1421,1901-12-25
-1901-05-05 12:34:56.1422,1901-12-25
-1901-05-05 12:34:56.1423,1901-12-25
-1901-05-05 12:34:56.1424,1901-12-25
-1901-05-05 12:34:56.1425,1901-12-25
-1901-05-05 12:34:56.1426,1901-12-25
-1901-05-05 12:34:56.1427,1901-12-25
-1901-05-05 12:34:56.1428,1901-12-25
-1901-05-05 12:34:56.1429,1901-12-25
-1901-05-05 12:34:56.143,1901-12-25
-1901-05-05 12:34:56.1431,1901-12-25
-1901-05-05 12:34:56.1432,1901-12-25
-1901-05-05 12:34:56.1433,1901-12-25
-1901-05-05 12:34:56.1434,1901-12-25
-1901-05-05 12:34:56.1435,1901-12-25
-1901-05-05 12:34:56.1436,1901-12-25
-1901-05-05 12:34:56.1437,1901-12-25
-1901-05-05 12:34:56.1438,1901-12-25
-1901-05-05 12:34:56.1439,1901-12-25
-1901-05-05 12:34:56.144,1901-12-25
-1901-05-05 12:34:56.1441,1901-12-25
-1901-05-05 12:34:56.1442,1901-12-25
-1901-05-05 12:34:56.1443,1901-12-25
-1901-05-05 12:34:56.1444,1901-12-25
-1901-05-05 12:34:56.1445,1901-12-25
-1901-05-05 12:34:56.1446,1901-12-25
-1901-05-05 12:34:56.1447,1901-12-25
-1901-05-05 12:34:56.1448,1901-12-25
-1901-05-05 12:34:56.1449,1901-12-25
-1901-05-05 12:34:56.145,1901-12-25
-1901-05-05 12:34:56.1451,1901-12-25
-1901-05-05 12:34:56.1452,1901-12-25
-1901-05-05 12:34:56.1453,1901-12-25
-1901-05-05 12:34:56.1454,1901-12-25
-1901-05-05 12:34:56.1455,1901-12-25
-1901-05-05 12:34:56.1456,1901-12-25
-1901-05-05 12:34:56.1457,1901-12-25
-1901-05-05 12:34:56.1458,1901-12-25
-1901-05-05 12:34:56.1459,1901-12-25
-1901-05-05 12:34:56.146,1901-12-25
-1901-05-05 12:34:56.1461,1901-12-25
-1901-05-05 12:34:56.1462,1901-12-25
-1901-05-05 12:34:56.1463,1901-12-25
-1901-05-05 12:34:56.1464,1901-12-25
-1901-05-05 12:34:56.1465,1901-12-25
-1901-05-05 12:34:56.1466,1901-12-25
-1901-05-05 12:34:56.1467,1901-12-25
-1901-05-05 12:34:56.1468,1901-12-25
-1901-05-05 12:34:56.1469,1901-12-25
-1901-05-05 12:34:56.147,1901-12-25
-1901-05-05 12:34:56.1471,1901-12-25
-1901-05-05 12:34:56.1472,1901-12-25
-1901-05-05 12:34:56.1473,1901-12-25
-1901-05-05 12:34:56.1474,1901-12-25
-1901-05-05 12:34:56.1475,1901-12-25
-1901-05-05 12:34:56.1476,1901-12-25
-1901-05-05 12:34:56.1477,1901-12-25
-1901-05-05 12:34:56.1478,1901-12-25
-1901-05-05 12:34:56.1479,1901-12-25
-1901-05-05 12:34:56.148,1901-12-25
-1901-05-05 12:34:56.1481,1901-12-25
-1901-05-05 12:34:56.1482,1901-12-25
-1901-05-05 12:34:56.1483,1901-12-25
-1901-05-05 12:34:56.1484,1901-12-25
-1901-05-05 12:34:56.1485,1901-12-25
-1901-05-05 12:34:56.1486,1901-12-25
-1901-05-05 12:34:56.1487,1901-12-25
-1901-05-05 12:34:56.1488,1901-12-25
-1901-05-05 12:34:56.1489,1901-12-25
-1901-05-05 12:34:56.149,1901-12-25
-1901-05-05 12:34:56.1491,1901-12-25
-1901-05-05 12:34:56.1492,1901-12-25
-1901-05-05 12:34:56.1493,1901-12-25
-1901-05-05 12:34:56.1494,1901-12-25
-1901-05-05 12:34:56.1495,1901-12-25
-1901-05-05 12:34:56.1496,1901-12-25
-1901-05-05 12:34:56.1497,1901-12-25
-1901-05-05 12:34:56.1498,1901-12-25
-1901-05-05 12:34:56.1499,1901-12-25
-1901-05-05 12:34:56.15,1901-12-25
-1901-05-05 12:34:56.1501,1901-12-25
-1901-05-05 12:34:56.1502,1901-12-25
-1901-05-05 12:34:56.1503,1901-12-25
-1901-05-05 12:34:56.1504,1901-12-25
-1901-05-05 12:34:56.1505,1901-12-25
-1901-05-05 12:34:56.1506,1901-12-25
-1901-05-05 12:34:56.1507,1901-12-25
-1901-05-05 12:34:56.1508,1901-12-25
-1901-05-05 12:34:56.1509,1901-12-25
-1901-05-05 12:34:56.151,1901-12-25
-1901-05-05 12:34:56.1511,1901-12-25
-1901-05-05 12:34:56.1512,1901-12-25
-1901-05-05 12:34:56.1513,1901-12-25
-1901-05-05 12:34:56.1514,1901-12-25
-1901-05-05 12:34:56.1515,1901-12-25
-1901-05-05 12:34:56.1516,1901-12-25
-1901-05-05 12:34:56.1517,1901-12-25
-1901-05-05 12:34:56.1518,1901-12-25
-1901-05-05 12:34:56.1519,1901-12-25
-1901-05-05 12:34:56.152,1901-12-25
-1901-05-05 12:34:56.1521,1901-12-25
-1901-05-05 12:34:56.1522,1901-12-25
-1901-05-05 12:34:56.1523,1901-12-25
-1901-05-05 12:34:56.1524,1901-12-25
-1901-05-05 12:34:56.1525,1901-12-25
-1901-05-05 12:34:56.1526,1901-12-25
-1901-05-05 12:34:56.1527,1901-12-25
-1901-05-05 12:34:56.1528,1901-12-25
-1901-05-05 12:34:56.1529,1901-12-25
-1901-05-05 12:34:56.153,1901-12-25
-1901-05-05 12:34:56.1531,1901-12-25
-1901-05-05 12:34:56.1532,1901-12-25
-1901-05-05 12:34:56.1533,1901-12-25
-1901-05-05 12:34:56.1534,1901-12-25
-1901-05-05 12:34:56.1535,1901-12-25
-1901-05-05 12:34:56.1536,1901-12-25
-1901-05-05 12:34:56.1537,1901-12-25
-1901-05-05 12:34:56.1538,1901-12-25
-1901-05-05 12:34:56.1539,1901-12-25
-1901-05-05 12:34:56.154,1901-12-25
-1901-05-05 12:34:56.1541,1901-12-25
-1901-05-05 12:34:56.1542,1901-12-25
-1901-05-05 12:34:56.1543,1901-12-25
-1901-05-05 12:34:56.1544,1901-12-25
-1901-05-05 12:34:56.1545,1901-12-25
-1901-05-05 12:34:56.1546,1901-12-25
-1901-05-05 12:34:56.1547,1901-12-25
-1901-05-05 12:34:56.1548,1901-12-25
-1901-05-05 12:34:56.1549,1901-12-25
-1901-05-05 12:34:56.155,1901-12-25
-1901-05-05 12:34:56.1551,1901-12-25
-1901-05-05 12:34:56.1552,1901-12-25
-1901-05-05 12:34:56.1553,1901-12-25
-1901-05-05 12:34:56.1554,1901-12-25
-1901-05-05 12:34:56.1555,1901-12-25
-1901-05-05 12:34:56.1556,1901-12-25
-1901-05-05 12:34:56.1557,1901-12-25
-1901-05-05 12:34:56.1558,1901-12-25
-1901-05-05 12:34:56.1559,1901-12-25
-1901-05-05 12:34:56.156,1901-12-25
-1901-05-05 12:34:56.1561,1901-12-25
-1901-05-05 12:34:56.1562,1901-12-25
-1901-05-05 12:34:56.1563,1901-12-25
-1901-05-05 12:34:56.1564,1901-12-25
-1901-05-05 12:34:56.1565,1901-12-25
-1901-05-05 12:34:56.1566,1901-12-25
-1901-05-05 12:34:56.1567,1901-12-25
-1901-05-05 12:34:56.1568,1901-12-25
-1901-05-05 12:34:56.1569,1901-12-25
-1901-05-05 12:34:56.157,1901-12-25
-1901-05-05 12:34:56.1571,1901-12-25
-1901-05-05 12:34:56.1572,1901-12-25
-1901-05-05 12:34:56.1573,1901-12-25
-1901-05-05 12:34:56.1574,1901-12-25
-1901-05-05 12:34:56.1575,1901-12-25
-1901-05-05 12:34:56.1576,1901-12-25
-1901-05-05 12:34:56.1577,1901-12-25
-1901-05-05 12:34:56.1578,1901-12-25
-1901-05-05 12:34:56.1579,1901-12-25
-1901-05-05 12:34:56.158,1901-12-25
-1901-05-05 12:34:56.1581,1901-12-25
-1901-05-05 12:34:56.1582,1901-12-25
-1901-05-05 12:34:56.1583,1901-12-25
-1901-05-05 12:34:56.1584,1901-12-25
-1901-05-05 12:34:56.1585,1901-12-25
-1901-05-05 12:34:56.1586,1901-12-25
-1901-05-05 12:34:56.1587,1901-12-25
-1901-05-05 12:34:56.1588,1901-12-25
-1901-05-05 12:34:56.1589,1901-12-25
-1901-05-05 12:34:56.159,1901-12-25
-1901-05-05 12:34:56.1591,1901-12-25
-1901-05-05 12:34:56.1592,1901-12-25
-1901-05-05 12:34:56.1593,1901-12-25
-1901-05-05 12:34:56.1594,1901-12-25
-1901-05-05 12:34:56.1595,1901-12-25
-1901-05-05 12:34:56.1596,1901-12-25
-1901-05-05 12:34:56.1597,1901-12-25
-1901-05-05 12:34:56.1598,1901-12-25
-1901-05-05 12:34:56.1599,1901-12-25
-1901-05-05 12:34:56.16,1901-12-25
-1901-05-05 12:34:56.1601,1901-12-25
-1901-05-05 12:34:56.1602,1901-12-25
-1901-05-05 12:34:56.1603,1901-12-25
-1901-05-05 12:34:56.1604,1901-12-25
-1901-05-05 12:34:56.1605,1901-12-25
-1901-05-05 12:34:56.1606,1901-12-25
-1901-05-05 12:34:56.1607,1901-12-25
-1901-05-05 12:34:56.1608,1901-12-25
-1901-05-05 12:34:56.1609,1901-12-25
-1901-05-05 12:34:56.161,1901-12-25
-1901-05-05 12:34:56.1611,1901-12-25
-1901-05-05 12:34:56.1612,1901-12-25
-1901-05-05 12:34:56.1613,1901-12-25
-1901-05-05 12:34:56.1614,1901-12-25
-1901-05-05 12:34:56.1615,1901-12-25
-1901-05-05 12:34:56.1616,1901-12-25
-1901-05-05 12:34:56.1617,1901-12-25
-1901-05-05 12:34:56.1618,1901-12-25
-1901-05-05 12:34:56.1619,1901-12-25
-1901-05-05 12:34:56.162,1901-12-25
-1901-05-05 12:34:56.1621,1901-12-25
-1901-05-05 12:34:56.1622,1901-12-25
-1901-05-05 12:34:56.1623,1901-12-25
-1901-05-05 12:34:56.1624,1901-12-25
-1901-05-05 12:34:56.1625,1901-12-25
-1901-05-05 12:34:56.1626,1901-12-25
-1901-05-05 12:34:56.1627,1901-12-25
-1901-05-05 12:34:56.1628,1901-12-25
-1901-05-05 12:34:56.1629,1901-12-25
-1901-05-05 12:34:56.163,1901-12-25
-1901-05-05 12:34:56.1631,1901-12-25
-1901-05-05 12:34:56.1632,1901-12-25
-1901-05-05 12:34:56.1633,1901-12-25
-1901-05-05 12:34:56.1634,1901-12-25
-1901-05-05 12:34:56.1635,1901-12-25
-1901-05-05 12:34:56.1636,1901-12-25
-1901-05-05 12:34:56.1637,1901-12-25
-1901-05-05 12:34:56.1638,1901-12-25
-1901-05-05 12:34:56.1639,1901-12-25
-1901-05-05 12:34:56.164,1901-12-25
-1901-05-05 12:34:56.1641,1901-12-25
-1901-05-05 12:34:56.1642,1901-12-25
-1901-05-05 12:34:56.1643,1901-12-25
-1901-05-05 12:34:56.1644,1901-12-25
-1901-05-05 12:34:56.1645,1901-12-25
-1901-05-05 12:34:56.1646,1901-12-25
-1901-05-05 12:34:56.1647,1901-12-25
-1901-05-05 12:34:56.1648,1901-12-25
-1901-05-05 12:34:56.1649,1901-12-25
-1901-05-05 12:34:56.165,1901-12-25
-1901-05-05 12:34:56.1651,1901-12-25
-1901-05-05 12:34:56.1652,1901-12-25
-1901-05-05 12:34:56.1653,1901-12-25
-1901-05-05 12:34:56.1654,1901-12-25
-1901-05-05 12:34:56.1655,1901-12-25
-1901-05-05 12:34:56.1656,1901-12-25
-1901-05-05 12:34:56.1657,1901-12-25
-1901-05-05 12:34:56.1658,1901-12-25
-1901-05-05 12:34:56.1659,1901-12-25
-1901-05-05 12:34:56.166,1901-12-25
-1901-05-05 12:34:56.1661,1901-12-25
-1901-05-05 12:34:56.1662,1901-12-25
-1901-05-05 12:34:56.1663,1901-12-25
-1901-05-05 12:34:56.1664,1901-12-25
-1901-05-05 12:34:56.1665,1901-12-25
-1901-05-05 12:34:56.1666,1901-12-25
-1901-05-05 12:34:56.1667,1901-12-25
-1901-05-05 12:34:56.1668,1901-12-25
-1901-05-05 12:34:56.1669,1901-12-25
-1901-05-05 12:34:56.167,1901-12-25
-1901-05-05 12:34:56.1671,1901-12-25
-1901-05-05 12:34:56.1672,1901-12-25
-1901-05-05 12:34:56.1673,1901-12-25
-1901-05-05 12:34:56.1674,1901-12-25
-1901-05-05 12:34:56.1675,1901-12-25
-1901-05-05 12:34:56.1676,1901-12-25
-1901-05-05 12:34:56.1677,1901-12-25
-1901-05-05 12:34:56.1678,1901-12-25
-1901-05-05 12:34:56.1679,1901-12-25
-1901-05-05 12:34:56.168,1901-12-25
-1901-05-05 12:34:56.1681,1901-12-25
-1901-05-05 12:34:56.1682,1901-12-25
-1901-05-05 12:34:56.1683,1901-12-25
-1901-05-05 12:34:56.1684,1901-12-25
-1901-05-05 12:34:56.1685,1901-12-25
-1901-05-05 12:34:56.1686,1901-12-25
-1901-05-05 12:34:56.1687,1901-12-25
-1901-05-05 12:34:56.1688,1901-12-25
-1901-05-05 12:34:56.1689,1901-12-25
-1901-05-05 12:34:56.169,1901-12-25
-1901-05-05 12:34:56.1691,1901-12-25
-1901-05-05 12:34:56.1692,1901-12-25
-1901-05-05 12:34:56.1693,1901-12-25
-1901-05-05 12:34:56.1694,1901-12-25
-1901-05-05 12:34:56.1695,1901-12-25
-1901-05-05 12:34:56.1696,1901-12-25
-1901-05-05 12:34:56.1697,1901-12-25
-1901-05-05 12:34:56.1698,1901-12-25
-1901-05-05 12:34:56.1699,1901-12-25
-1901-05-05 12:34:56.17,1901-12-25
-1901-05-05 12:34:56.1701,1901-12-25
-1901-05-05 12:34:56.1702,1901-12-25
-1901-05-05 12:34:56.1703,1901-12-25
-1901-05-05 12:34:56.1704,1901-12-25
-1901-05-05 12:34:56.1705,1901-12-25
-1901-05-05 12:34:56.1706,1901-12-25
-1901-05-05 12:34:56.1707,1901-12-25
-1901-05-05 12:34:56.1708,1901-12-25
-1901-05-05 12:34:56.1709,1901-12-25
-1901-05-05 12:34:56.171,1901-12-25
-1901-05-05 12:34:56.1711,1901-12-25
-1901-05-05 12:34:56.1712,1901-12-25
-1901-05-05 12:34:56.1713,1901-12-25
-1901-05-05 12:34:56.1714,1901-12-25
-1901-05-05 12:34:56.1715,1901-12-25
-1901-05-05 12:34:56.1716,1901-12-25
-1901-05-05 12:34:56.1717,1901-12-25
-1901-05-05 12:34:56.1718,1901-12-25
-1901-05-05 12:34:56.1719,1901-12-25
-1901-05-05 12:34:56.172,1901-12-25
-1901-05-05 12:34:56.1721,1901-12-25
-1901-05-05 12:34:56.1722,1901-12-25
-1901-05-05 12:34:56.1723,1901-12-25
-1901-05-05 12:34:56.1724,1901-12-25
-1901-05-05 12:34:56.1725,1901-12-25
-1901-05-05 12:34:56.1726,1901-12-25
-1901-05-05 12:34:56.1727,1901-12-25
-1901-05-05 12:34:56.1728,1901-12-25
-1901-05-05 12:34:56.1729,1901-12-25
-1901-05-05 12:34:56.173,1901-12-25
-1901-05-05 12:34:56.1731,1901-12-25
-1901-05-05 12:34:56.1732,1901-12-25
-1901-05-05 12:34:56.1733,1901-12-25
-1901-05-05 12:34:56.1734,1901-12-25
-1901-05-05 12:34:56.1735,1901-12-25
-1901-05-05 12:34:56.1736,1901-12-25
-1901-05-05 12:34:56.1737,1901-12-25
-1901-05-05 12:34:56.1738,1901-12-25
-1901-05-05 12:34:56.1739,1901-12-25
-1901-05-05 12:34:56.174,1901-12-25
-1901-05-05 12:34:56.1741,1901-12-25
-1901-05-05 12:34:56.1742,1901-12-25
-1901-05-05 12:34:56.1743,1901-12-25
-1901-05-05 12:34:56.1744,1901-12-25
-1901-05-05 12:34:56.1745,1901-12-25
-1901-05-05 12:34:56.1746,1901-12-25
-1901-05-05 12:34:56.1747,1901-12-25
-1901-05-05 12:34:56.1748,1901-12-25
-1901-05-05 12:34:56.1749,1901-12-25
-1901-05-05 12:34:56.175,1901-12-25
-1901-05-05 12:34:56.1751,1901-12-25
-1901-05-05 12:34:56.1752,1901-12-25
-1901-05-05 12:34:56.1753,1901-12-25
-1901-05-05 12:34:56.1754,1901-12-25
-1901-05-05 12:34:56.1755,1901-12-25
-1901-05-05 12:34:56.1756,1901-12-25
-1901-05-05 12:34:56.1757,1901-12-25
-1901-05-05 12:34:56.1758,1901-12-25
-1901-05-05 12:34:56.1759,1901-12-25
-1901-05-05 12:34:56.176,1901-12-25
-1901-05-05 12:34:56.1761,1901-12-25
-1901-05-05 12:34:56.1762,1901-12-25
-1901-05-05 12:34:56.1763,1901-12-25
-1901-05-05 12:34:56.1764,1901-12-25
-1901-05-05 12:34:56.1765,1901-12-25
-1901-05-05 12:34:56.1766,1901-12-25
-1901-05-05 12:34:56.1767,1901-12-25
-1901-05-05 12:34:56.1768,1901-12-25
-1901-05-05 12:34:56.1769,1901-12-25
-1901-05-05 12:34:56.177,1901-12-25
-1901-05-05 12:34:56.1771,1901-12-25
-1901-05-05 12:34:56.1772,1901-12-25
-1901-05-05 12:34:56.1773,1901-12-25
-1901-05-05 12:34:56.1774,1901-12-25
-1901-05-05 12:34:56.1775,1901-12-25
-1901-05-05 12:34:56.1776,1901-12-25
-1901-05-05 12:34:56.1777,1901-12-25
-1901-05-05 12:34:56.1778,1901-12-25
-1901-05-05 12:34:56.1779,1901-12-25
-1901-05-05 12:34:56.178,1901-12-25
-1901-05-05 12:34:56.1781,1901-12-25
-1901-05-05 12:34:56.1782,1901-12-25
-1901-05-05 12:34:56.1783,1901-12-25
-1901-05-05 12:34:56.1784,1901-12-25
-1901-05-05 12:34:56.1785,1901-12-25
-1901-05-05 12:34:56.1786,1901-12-25
-1901-05-05 12:34:56.1787,1901-12-25
-1901-05-05 12:34:56.1788,1901-12-25
-1901-05-05 12:34:56.1789,1901-12-25
-1901-05-05 12:34:56.179,1901-12-25
-1901-05-05 12:34:56.1791,1901-12-25
-1901-05-05 12:34:56.1792,1901-12-25
-1901-05-05 12:34:56.1793,1901-12-25
-1901-05-05 12:34:56.1794,1901-12-25
-1901-05-05 12:34:56.1795,1901-12-25
-1901-05-05 12:34:56.1796,1901-12-25
-1901-05-05 12:34:56.1797,1901-12-25
-1901-05-05 12:34:56.1798,1901-12-25
-1901-05-05 12:34:56.1799,1901-12-25
-1901-05-05 12:34:56.18,1901-12-25
-1901-05-05 12:34:56.1801,1901-12-25
-1901-05-05 12:34:56.1802,1901-12-25
-1901-05-05 12:34:56.1803,1901-12-25
-1901-05-05 12:34:56.1804,1901-12-25
-1901-05-05 12:34:56.1805,1901-12-25
-1901-05-05 12:34:56.1806,1901-12-25
-1901-05-05 12:34:56.1807,1901-12-25
-1901-05-05 12:34:56.1808,1901-12-25
-1901-05-05 12:34:56.1809,1901-12-25
-1901-05-05 12:34:56.181,1901-12-25
-1901-05-05 12:34:56.1811,1901-12-25
-1901-05-05 12:34:56.1812,1901-12-25
-1901-05-05 12:34:56.1813,1901-12-25
-1901-05-05 12:34:56.1814,1901-12-25
-1901-05-05 12:34:56.1815,1901-12-25
-1901-05-05 12:34:56.1816,1901-12-25
-1901-05-05 12:34:56.1817,1901-12-25
-1901-05-05 12:34:56.1818,1901-12-25
-1901-05-05 12:34:56.1819,1901-12-25
-1901-05-05 12:34:56.182,1901-12-25
-1901-05-05 12:34:56.1821,1901-12-25
-1901-05-05 12:34:56.1822,1901-12-25
-1901-05-05 12:34:56.1823,1901-12-25
-1901-05-05 12:34:56.1824,1901-12-25
-1901-05-05 12:34:56.1825,1901-12-25
-1901-05-05 12:34:56.1826,1901-12-25
-1901-05-05 12:34:56.1827,1901-12-25
-1901-05-05 12:34:56.1828,1901-12-25
-1901-05-05 12:34:56.1829,1901-12-25
-1901-05-05 12:34:56.183,1901-12-25
-1901-05-05 12:34:56.1831,1901-12-25
-1901-05-05 12:34:56.1832,1901-12-25
-1901-05-05 12:34:56.1833,1901-12-25
-1901-05-05 12:34:56.1834,1901-12-25
-1901-05-05 12:34:56.1835,1901-12-25
-1901-05-05 12:34:56.1836,1901-12-25
-1901-05-05 12:34:56.1837,1901-12-25
-1901-05-05 12:34:56.1838,1901-12-25
-1901-05-05 12:34:56.1839,1901-12-25
-1901-05-05 12:34:56.184,1901-12-25
-1901-05-05 12:34:56.1841,1901-12-25
-1901-05-05 12:34:56.1842,1901-12-25
-1901-05-05 12:34:56.1843,1901-12-25
-1901-05-05 12:34:56.1844,1901-12-25
-1901-05-05 12:34:56.1845,1901-12-25
-1901-05-05 12:34:56.1846,1901-12-25
-1901-05-05 12:34:56.1847,1901-12-25
-1901-05-05 12:34:56.1848,1901-12-25
-1901-05-05 12:34:56.1849,1901-12-25
-1901-05-05 12:34:56.185,1901-12-25
-1901-05-05 12:34:56.1851,1901-12-25
-1901-05-05 12:34:56.1852,1901-12-25
-1901-05-05 12:34:56.1853,1901-12-25
-1901-05-05 12:34:56.1854,1901-12-25
-1901-05-05 12:34:56.1855,1901-12-25
-1901-05-05 12:34:56.1856,1901-12-25
-1901-05-05 12:34:56.1857,1901-12-25
-1901-05-05 12:34:56.1858,1901-12-25
-1901-05-05 12:34:56.1859,1901-12-25
-1901-05-05 12:34:56.186,1901-12-25
-1901-05-05 12:34:56.1861,1901-12-25
-1901-05-05 12:34:56.1862,1901-12-25
-1901-05-05 12:34:56.1863,1901-12-25
-1901-05-05 12:34:56.1864,1901-12-25
-1901-05-05 12:34:56.1865,1901-12-25
-1901-05-05 12:34:56.1866,1901-12-25
-1901-05-05 12:34:56.1867,1901-12-25
-1901-05-05 12:34:56.1868,1901-12-25
-1901-05-05 12:34:56.1869,1901-12-25
-1901-05-05 12:34:56.187,1901-12-25
-1901-05-05 12:34:56.1871,1901-12-25
-1901-05-05 12:34:56.1872,1901-12-25
-1901-05-05 12:34:56.1873,1901-12-25
-1901-05-05 12:34:56.1874,1901-12-25
-1901-05-05 12:34:56.1875,1901-12-25
-1901-05-05 12:34:56.1876,1901-12-25
-1901-05-05 12:34:56.1877,1901-12-25
-1901-05-05 12:34:56.1878,1901-12-25
-1901-05-05 12:34:56.1879,1901-12-25
-1901-05-05 12:34:56.188,1901-12-25
-1901-05-05 12:34:56.1881,1901-12-25
-1901-05-05 12:34:56.1882,1901-12-25
-1901-05-05 12:34:56.1883,1901-12-25
-1901-05-05 12:34:56.1884,1901-12-25
-1901-05-05 12:34:56.1885,1901-12-25
-1901-05-05 12:34:56.1886,1901-12-25
-1901-05-05 12:34:56.1887,1901-12-25
-1901-05-05 12:34:56.1888,1901-12-25
-1901-05-05 12:34:56.1889,1901-12-25
-1901-05-05 12:34:56.189,1901-12-25
-1901-05-05 12:34:56.1891,1901-12-25
-1901-05-05 12:34:56.1892,1901-12-25
-1901-05-05 12:34:56.1893,1901-12-25
-1901-05-05 12:34:56.1894,1901-12-25
-1901-05-05 12:34:56.1895,1901-12-25
-1901-05-05 12:34:56.1896,1901-12-25
-1901-05-05 12:34:56.1897,1901-12-25
-1901-05-05 12:34:56.1898,1901-12-25
-1901-05-05 12:34:56.1899,1901-12-25
-1901-05-05 12:34:56.19,1901-12-25
-1901-05-05 12:34:56.1901,1901-12-25
-1901-05-05 12:34:56.1902,1901-12-25
-1901-05-05 12:34:56.1903,1901-12-25
-1901-05-05 12:34:56.1904,1901-12-25
-1901-05-05 12:34:56.1905,1901-12-25
-1901-05-05 12:34:56.1906,1901-12-25
-1901-05-05 12:34:56.1907,1901-12-25
-1901-05-05 12:34:56.1908,1901-12-25
-1901-05-05 12:34:56.1909,1901-12-25
-1901-05-05 12:34:56.191,1901-12-25
-1901-05-05 12:34:56.1911,1901-12-25
-1901-05-05 12:34:56.1912,1901-12-25
-1901-05-05 12:34:56.1913,1901-12-25
-1901-05-05 12:34:56.1914,1901-12-25
-1901-05-05 12:34:56.1915,1901-12-25
-1901-05-05 12:34:56.1916,1901-12-25
-1901-05-05 12:34:56.1917,1901-12-25
-1901-05-05 12:34:56.1918,1901-12-25
-1901-05-05 12:34:56.1919,1901-12-25
-1901-05-05 12:34:56.192,1901-12-25
-1901-05-05 12:34:56.1921,1901-12-25
-1901-05-05 12:34:56.1922,1901-12-25
-1901-05-05 12:34:56.1923,1901-12-25
-1901-05-05 12:34:56.1924,1901-12-25
-1901-05-05 12:34:56.1925,1901-12-25
-1901-05-05 12:34:56.1926,1901-12-25
-1901-05-05 12:34:56.1927,1901-12-25
-1901-05-05 12:34:56.1928,1901-12-25
-1901-05-05 12:34:56.1929,1901-12-25
-1901-05-05 12:34:56.193,1901-12-25
-1901-05-05 12:34:56.1931,1901-12-25
-1901-05-05 12:34:56.1932,1901-12-25
-1901-05-05 12:34:56.1933,1901-12-25
-1901-05-05 12:34:56.1934,1901-12-25
-1901-05-05 12:34:56.1935,1901-12-25
-1901-05-05 12:34:56.1936,1901-12-25
-1901-05-05 12:34:56.1937,1901-12-25
-1901-05-05 12:34:56.1938,1901-12-25
-1901-05-05 12:34:56.1939,1901-12-25
-1901-05-05 12:34:56.194,1901-12-25
-1901-05-05 12:34:56.1941,1901-12-25
-1901-05-05 12:34:56.1942,1901-12-25
-1901-05-05 12:34:56.1943,1901-12-25
-1901-05-05 12:34:56.1944,1901-12-25
-1901-05-05 12:34:56.1945,1901-12-25
-1901-05-05 12:34:56.1946,1901-12-25
-1901-05-05 12:34:56.1947,1901-12-25
-1901-05-05 12:34:56.1948,1901-12-25
-1901-05-05 12:34:56.1949,1901-12-25
-1901-05-05 12:34:56.195,1901-12-25
-1901-05-05 12:34:56.1951,1901-12-25
-1901-05-05 12:34:56.1952,1901-12-25
-1901-05-05 12:34:56.1953,1901-12-25
-1901-05-05 12:34:56.1954,1901-12-25
-1901-05-05 12:34:56.1955,1901-12-25
-1901-05-05 12:34:56.1956,1901-12-25
-1901-05-05 12:34:56.1957,1901-12-25
-1901-05-05 12:34:56.1958,1901-12-25
-1901-05-05 12:34:56.1959,1901-12-25
-1901-05-05 12:34:56.196,1901-12-25
-1901-05-05 12:34:56.1961,1901-12-25
-1901-05-05 12:34:56.1962,1901-12-25
-1901-05-05 12:34:56.1963,1901-12-25
-1901-05-05 12:34:56.1964,1901-12-25
-1901-05-05 12:34:56.1965,1901-12-25
-1901-05-05 12:34:56.1966,1901-12-25
-1901-05-05 12:34:56.1967,1901-12-25
-1901-05-05 12:34:56.1968,1901-12-25
-1901-05-05 12:34:56.1969,1901-12-25
-1901-05-05 12:34:56.197,1901-12-25
-1901-05-05 12:34:56.1971,1901-12-25
-1901-05-05 12:34:56.1972,1901-12-25
-1901-05-05 12:34:56.1973,1901-12-25
-1901-05-05 12:34:56.1974,1901-12-25
-1901-05-05 12:34:56.1975,1901-12-25
-1901-05-05 12:34:56.1976,1901-12-25
-1901-05-05 12:34:56.1977,1901-12-25
-1901-05-05 12:34:56.1978,1901-12-25
-1901-05-05 12:34:56.1979,1901-12-25
-1901-05-05 12:34:56.198,1901-12-25
-1901-05-05 12:34:56.1981,1901-12-25
-1901-05-05 12:34:56.1982,1901-12-25
-1901-05-05 12:34:56.1983,1901-12-25
-1901-05-05 12:34:56.1984,1901-12-25
-1901-05-05 12:34:56.1985,1901-12-25
-1901-05-05 12:34:56.1986,1901-12-25
-1901-05-05 12:34:56.1987,1901-12-25
-1901-05-05 12:34:56.1988,1901-12-25
-1901-05-05 12:34:56.1989,1901-12-25
-1901-05-05 12:34:56.199,1901-12-25
-1901-05-05 12:34:56.1991,1901-12-25
-1901-05-05 12:34:56.1992,1901-12-25
-1901-05-05 12:34:56.1993,1901-12-25
-1901-05-05 12:34:56.1994,1901-12-25
-1901-05-05 12:34:56.1995,1901-12-25
-1901-05-05 12:34:56.1996,1901-12-25
-1901-05-05 12:34:56.1997,1901-12-25
-1901-05-05 12:34:56.1998,1901-12-25
-1901-05-05 12:34:56.1999,1901-12-25
-1902-05-05 12:34:56.1,1902-12-25
-1902-05-05 12:34:56.1001,1902-12-25
-1902-05-05 12:34:56.1002,1902-12-25
-1902-05-05 12:34:56.1003,1902-12-25
-1902-05-05 12:34:56.1004,1902-12-25
-1902-05-05 12:34:56.1005,1902-12-25
-1902-05-05 12:34:56.1006,1902-12-25
-1902-05-05 12:34:56.1007,1902-12-25
-1902-05-05 12:34:56.1008,1902-12-25
-1902-05-05 12:34:56.1009,1902-12-25
-1902-05-05 12:34:56.101,1902-12-25
-1902-05-05 12:34:56.1011,1902-12-25
-1902-05-05 12:34:56.1012,1902-12-25
-1902-05-05 12:34:56.1013,1902-12-25
-1902-05-05 12:34:56.1014,1902-12-25
-1902-05-05 12:34:56.1015,1902-12-25
-1902-05-05 12:34:56.1016,1902-12-25
-1902-05-05 12:34:56.1017,1902-12-25
-1902-05-05 12:34:56.1018,1902-12-25
-1902-05-05 12:34:56.1019,1902-12-25
-1902-05-05 12:34:56.102,1902-12-25
-1902-05-05 12:34:56.1021,1902-12-25
-1902-05-05 12:34:56.1022,1902-12-25
-1902-05-05 12:34:56.1023,1902-12-25
-1902-05-05 12:34:56.1024,1902-12-25
-1902-05-05 12:34:56.1025,1902-12-25
-1902-05-05 12:34:56.1026,1902-12-25
-1902-05-05 12:34:56.1027,1902-12-25
-1902-05-05 12:34:56.1028,1902-12-25
-1902-05-05 12:34:56.1029,1902-12-25
-1902-05-05 12:34:56.103,1902-12-25
-1902-05-05 12:34:56.1031,1902-12-25
-1902-05-05 12:34:56.1032,1902-12-25
-1902-05-05 12:34:56.1033,1902-12-25
-1902-05-05 12:34:56.1034,1902-12-25
-1902-05-05 12:34:56.1035,1902-12-25
-1902-05-05 12:34:56.1036,1902-12-25
-1902-05-05 12:34:56.1037,1902-12-25
-1902-05-05 12:34:56.1038,1902-12-25
-1902-05-05 12:34:56.1039,1902-12-25
-1902-05-05 12:34:56.104,1902-12-25
-1902-05-05 12:34:56.1041,1902-12-25
-1902-05-05 12:34:56.1042,1902-12-25
-1902-05-05 12:34:56.1043,1902-12-25
-1902-05-05 12:34:56.1044,1902-12-25
-1902-05-05 12:34:56.1045,1902-12-25
-1902-05-05 12:34:56.1046,1902-12-25
-1902-05-05 12:34:56.1047,1902-12-25
-1902-05-05 12:34:56.1048,1902-12-25
-1902-05-05 12:34:56.1049,1902-12-25
-1902-05-05 12:34:56.105,1902-12-25
-1902-05-05 12:34:56.1051,1902-12-25
-1902-05-05 12:34:56.1052,1902-12-25
-1902-05-05 12:34:56.1053,1902-12-25
-1902-05-05 12:34:56.1054,1902-12-25
-1902-05-05 12:34:56.1055,1902-12-25
-1902-05-05 12:34:56.1056,1902-12-25
-1902-05-05 12:34:56.1057,1902-12-25
-1902-05-05 12:34:56.1058,1902-12-25
-1902-05-05 12:34:56.1059,1902-12-25
-1902-05-05 12:34:56.106,1902-12-25
-1902-05-05 12:34:56.1061,1902-12-25
-1902-05-05 12:34:56.1062,1902-12-25
-1902-05-05 12:34:56.1063,1902-12-25
-1902-05-05 12:34:56.1064,1902-12-25
-1902-05-05 12:34:56.1065,1902-12-25
-1902-05-05 12:34:56.1066,1902-12-25
-1902-05-05 12:34:56.1067,1902-12-25
-1902-05-05 12:34:56.1068,1902-12-25
-1902-05-05 12:34:56.1069,1902-12-25
-1902-05-05 12:34:56.107,1902-12-25
-1902-05-05 12:34:56.1071,1902-12-25
-1902-05-05 12:34:56.1072,1902-12-25
-1902-05-05 12:34:56.1073,1902-12-25
-1902-05-05 12:34:56.1074,1902-12-25
-1902-05-05 12:34:56.1075,1902-12-25
-1902-05-05 12:34:56.1076,1902-12-25
-1902-05-05 12:34:56.1077,1902-12-25
-1902-05-05 12:34:56.1078,1902-12-25
-1902-05-05 12:34:56.1079,1902-12-25
-1902-05-05 12:34:56.108,1902-12-25
-1902-05-05 12:34:56.1081,1902-12-25
-1902-05-05 12:34:56.1082,1902-12-25
-1902-05-05 12:34:56.1083,1902-12-25
-1902-05-05 12:34:56.1084,1902-12-25
-1902-05-05 12:34:56.1085,1902-12-25
-1902-05-05 12:34:56.1086,1902-12-25
-1902-05-05 12:34:56.1087,1902-12-25
-1902-05-05 12:34:56.1088,1902-12-25
-1902-05-05 12:34:56.1089,1902-12-25
-1902-05-05 12:34:56.109,1902-12-25
-1902-05-05 12:34:56.1091,1902-12-25
-1902-05-05 12:34:56.1092,1902-12-25
-1902-05-05 12:34:56.1093,1902-12-25
-1902-05-05 12:34:56.1094,1902-12-25
-1902-05-05 12:34:56.1095,1902-12-25
-1902-05-05 12:34:56.1096,1902-12-25
-1902-05-05 12:34:56.1097,1902-12-25
-1902-05-05 12:34:56.1098,1902-12-25
-1902-05-05 12:34:56.1099,1902-12-25
-1902-05-05 12:34:56.11,1902-12-25
-1902-05-05 12:34:56.1101,1902-12-25
-1902-05-05 12:34:56.1102,1902-12-25
-1902-05-05 12:34:56.1103,1902-12-25
-1902-05-05 12:34:56.1104,1902-12-25
-1902-05-05 12:34:56.1105,1902-12-25
-1902-05-05 12:34:56.1106,1902-12-25
-1902-05-05 12:34:56.1107,1902-12-25
-1902-05-05 12:34:56.1108,1902-12-25
-1902-05-05 12:34:56.1109,1902-12-25
-1902-05-05 12:34:56.111,1902-12-25
-1902-05-05 12:34:56.1111,1902-12-25
-1902-05-05 12:34:56.1112,1902-12-25
-1902-05-05 12:34:56.1113,1902-12-25
-1902-05-05 12:34:56.1114,1902-12-25
-1902-05-05 12:34:56.1115,1902-12-25
-1902-05-05 12:34:56.1116,1902-12-25
-1902-05-05 12:34:56.1117,1902-12-25
-1902-05-05 12:34:56.1118,1902-12-25
-1902-05-05 12:34:56.1119,1902-12-25
-1902-05-05 12:34:56.112,1902-12-25
-1902-05-05 12:34:56.1121,1902-12-25
-1902-05-05 12:34:56.1122,1902-12-25
-1902-05-05 12:34:56.1123,1902-12-25
-1902-05-05 12:34:56.1124,1902-12-25
-1902-05-05 12:34:56.1125,1902-12-25
-1902-05-05 12:34:56.1126,1902-12-25
-1902-05-05 12:34:56.1127,1902-12-25
-1902-05-05 12:34:56.1128,1902-12-25
-1902-05-05 12:34:56.1129,1902-12-25
-1902-05-05 12:34:56.113,1902-12-25
-1902-05-05 12:34:56.1131,1902-12-25
-1902-05-05 12:34:56.1132,1902-12-25
-1902-05-05 12:34:56.1133,1902-12-25
-1902-05-05 12:34:56.1134,1902-12-25
-1902-05-05 12:34:56.1135,1902-12-25
-1902-05-05 12:34:56.1136,1902-12-25
-1902-05-05 12:34:56.1137,1902-12-25
-1902-05-05 12:34:56.1138,1902-12-25
-1902-05-05 12:34:56.1139,1902-12-25
-1902-05-05 12:34:56.114,1902-12-25
-1902-05-05 12:34:56.1141,1902-12-25
-1902-05-05 12:34:56.1142,1902-12-25
-1902-05-05 12:34:56.1143,1902-12-25
-1902-05-05 12:34:56.1144,1902-12-25
-1902-05-05 12:34:56.1145,1902-12-25
-1902-05-05 12:34:56.1146,1902-12-25
-1902-05-05 12:34:56.1147,1902-12-25
-1902-05-05 12:34:56.1148,1902-12-25
-1902-05-05 12:34:56.1149,1902-12-25
-1902-05-05 12:34:56.115,1902-12-25
-1902-05-05 12:34:56.1151,1902-12-25
-1902-05-05 12:34:56.1152,1902-12-25
-1902-05-05 12:34:56.1153,1902-12-25
-1902-05-05 12:34:56.1154,1902-12-25
-1902-05-05 12:34:56.1155,1902-12-25
-1902-05-05 12:34:56.1156,1902-12-25
-1902-05-05 12:34:56.1157,1902-12-25
-1902-05-05 12:34:56.1158,1902-12-25
-1902-05-05 12:34:56.1159,1902-12-25
-1902-05-05 12:34:56.116,1902-12-25
-1902-05-05 12:34:56.1161,1902-12-25
-1902-05-05 12:34:56.1162,1902-12-25
-1902-05-05 12:34:56.1163,1902-12-25
-1902-05-05 12:34:56.1164,1902-12-25
-1902-05-05 12:34:56.1165,1902-12-25
-1902-05-05 12:34:56.1166,1902-12-25
-1902-05-05 12:34:56.1167,1902-12-25
-1902-05-05 12:34:56.1168,1902-12-25
-1902-05-05 12:34:56.1169,1902-12-25
-1902-05-05 12:34:56.117,1902-12-25
-1902-05-05 12:34:56.1171,1902-12-25
-1902-05-05 12:34:56.1172,1902-12-25
-1902-05-05 12:34:56.1173,1902-12-25
-1902-05-05 12:34:56.1174,1902-12-25
-1902-05-05 12:34:56.1175,1902-12-25
-1902-05-05 12:34:56.1176,1902-12-25
-1902-05-05 12:34:56.1177,1902-12-25
-1902-05-05 12:34:56.1178,1902-12-25
-1902-05-05 12:34:56.1179,1902-12-25
-1902-05-05 12:34:56.118,1902-12-25
-1902-05-05 12:34:56.1181,1902-12-25
-1902-05-05 12:34:56.1182,1902-12-25
-1902-05-05 12:34:56.1183,1902-12-25
-1902-05-05 12:34:56.1184,1902-12-25
-1902-05-05 12:34:56.1185,1902-12-25
-1902-05-05 12:34:56.1186,1902-12-25
-1902-05-05 12:34:56.1187,1902-12-25
-1902-05-05 12:34:56.1188,1902-12-25
-1902-05-05 12:34:56.1189,1902-12-25
-1902-05-05 12:34:56.119,1902-12-25
-1902-05-05 12:34:56.1191,1902-12-25
-1902-05-05 12:34:56.1192,1902-12-25
-1902-05-05 12:34:56.1193,1902-12-25
-1902-05-05 12:34:56.1194,1902-12-25
-1902-05-05 12:34:56.1195,1902-12-25
-1902-05-05 12:34:56.1196,1902-12-25
-1902-05-05 12:34:56.1197,1902-12-25
-1902-05-05 12:34:56.1198,1902-12-25
-1902-05-05 12:34:56.1199,1902-12-25
-1902-05-05 12:34:56.12,1902-12-25
-1902-05-05 12:34:56.1201,1902-12-25
-1902-05-05 12:34:56.1202,1902-12-25
-1902-05-05 12:34:56.1203,1902-12-25
-1902-05-05 12:34:56.1204,1902-12-25
-1902-05-05 12:34:56.1205,1902-12-25
-1902-05-05 12:34:56.1206,1902-12-25
-1902-05-05 12:34:56.1207,1902-12-25
-1902-05-05 12:34:56.1208,1902-12-25
-1902-05-05 12:34:56.1209,1902-12-25
-1902-05-05 12:34:56.121,1902-12-25
-1902-05-05 12:34:56.1211,1902-12-25
-1902-05-05 12:34:56.1212,1902-12-25
-1902-05-05 12:34:56.1213,1902-12-25
-1902-05-05 12:34:56.1214,1902-12-25
-1902-05-05 12:34:56.1215,1902-12-25
-1902-05-05 12:34:56.1216,1902-12-25
-1902-05-05 12:34:56.1217,1902-12-25
-1902-05-05 12:34:56.1218,1902-12-25
-1902-05-05 12:34:56.1219,1902-12-25
-1902-05-05 12:34:56.122,1902-12-25
-1902-05-05 12:34:56.1221,1902-12-25
-1902-05-05 12:34:56.1222,1902-12-25
-1902-05-05 12:34:56.1223,1902-12-25
-1902-05-05 12:34:56.1224,1902-12-25
-1902-05-05 12:34:56.1225,1902-12-25
-1902-05-05 12:34:56.1226,1902-12-25
-1902-05-05 12:34:56.1227,1902-12-25
-1902-05-05 12:34:56.1228,1902-12-25
-1902-05-05 12:34:56.1229,1902-12-25
-1902-05-05 12:34:56.123,1902-12-25
-1902-05-05 12:34:56.1231,1902-12-25
-1902-05-05 12:34:56.1232,1902-12-25
-1902-05-05 12:34:56.1233,1902-12-25
-1902-05-05 12:34:56.1234,1902-12-25
-1902-05-05 12:34:56.1235,1902-12-25
-1902-05-05 12:34:56.1236,1902-12-25
-1902-05-05 12:34:56.1237,1902-12-25
-1902-05-05 12:34:56.1238,1902-12-25
-1902-05-05 12:34:56.1239,1902-12-25
-1902-05-05 12:34:56.124,1902-12-25
-1902-05-05 12:34:56.1241,1902-12-25
-1902-05-05 12:34:56.1242,1902-12-25
-1902-05-05 12:34:56.1243,1902-12-25
-1902-05-05 12:34:56.1244,1902-12-25
-1902-05-05 12:34:56.1245,1902-12-25
-1902-05-05 12:34:56.1246,1902-12-25
-1902-05-05 12:34:56.1247,1902-12-25
-1902-05-05 12:34:56.1248,1902-12-25
-1902-05-05 12:34:56.1249,1902-12-25
-1902-05-05 12:34:56.125,1902-12-25
-1902-05-05 12:34:56.1251,1902-12-25
-1902-05-05 12:34:56.1252,1902-12-25
-1902-05-05 12:34:56.1253,1902-12-25
-1902-05-05 12:34:56.1254,1902-12-25
-1902-05-05 12:34:56.1255,1902-12-25
-1902-05-05 12:34:56.1256,1902-12-25
-1902-05-05 12:34:56.1257,1902-12-25
-1902-05-05 12:34:56.1258,1902-12-25
-1902-05-05 12:34:56.1259,1902-12-25
-1902-05-05 12:34:56.126,1902-12-25
-1902-05-05 12:34:56.1261,1902-12-25
-1902-05-05 12:34:56.1262,1902-12-25
-1902-05-05 12:34:56.1263,1902-12-25
-1902-05-05 12:34:56.1264,1902-12-25
-1902-05-05 12:34:56.1265,1902-12-25
-1902-05-05 12:34:56.1266,1902-12-25
-1902-05-05 12:34:56.1267,1902-12-25
-1902-05-05 12:34:56.1268,1902-12-25
-1902-05-05 12:34:56.1269,1902-12-25
-1902-05-05 12:34:56.127,1902-12-25
-1902-05-05 12:34:56.1271,1902-12-25
-1902-05-05 12:34:56.1272,1902-12-25
-1902-05-05 12:34:56.1273,1902-12-25
-1902-05-05 12:34:56.1274,1902-12-25
-1902-05-05 12:34:56.1275,1902-12-25
-1902-05-05 12:34:56.1276,1902-12-25
-1902-05-05 12:34:56.1277,1902-12-25
-1902-05-05 12:34:56.1278,1902-12-25
-1902-05-05 12:34:56.1279,1902-12-25
-1902-05-05 12:34:56.128,1902-12-25
-1902-05-05 12:34:56.1281,1902-12-25
-1902-05-05 12:34:56.1282,1902-12-25
-1902-05-05 12:34:56.1283,1902-12-25
-1902-05-05 12:34:56.1284,1902-12-25
-1902-05-05 12:34:56.1285,1902-12-25
-1902-05-05 12:34:56.1286,1902-12-25
-1902-05-05 12:34:56.1287,1902-12-25
-1902-05-05 12:34:56.1288,1902-12-25
-1902-05-05 12:34:56.1289,1902-12-25
-1902-05-05 12:34:56.129,1902-12-25
-1902-05-05 12:34:56.1291,1902-12-25
-1902-05-05 12:34:56.1292,1902-12-25
-1902-05-05 12:34:56.1293,1902-12-25
-1902-05-05 12:34:56.1294,1902-12-25
-1902-05-05 12:34:56.1295,1902-12-25
-1902-05-05 12:34:56.1296,1902-12-25
-1902-05-05 12:34:56.1297,1902-12-25
-1902-05-05 12:34:56.1298,1902-12-25
-1902-05-05 12:34:56.1299,1902-12-25
-1902-05-05 12:34:56.13,1902-12-25
-1902-05-05 12:34:56.1301,1902-12-25
-1902-05-05 12:34:56.1302,1902-12-25
-1902-05-05 12:34:56.1303,1902-12-25
-1902-05-05 12:34:56.1304,1902-12-25
-1902-05-05 12:34:56.1305,1902-12-25
-1902-05-05 12:34:56.1306,1902-12-25
-1902-05-05 12:34:56.1307,1902-12-25
-1902-05-05 12:34:56.1308,1902-12-25
-1902-05-05 12:34:56.1309,1902-12-25
-1902-05-05 12:34:56.131,1902-12-25
-1902-05-05 12:34:56.1311,1902-12-25
-1902-05-05 12:34:56.1312,1902-12-25
-1902-05-05 12:34:56.1313,1902-12-25
-1902-05-05 12:34:56.1314,1902-12-25
-1902-05-05 12:34:56.1315,1902-12-25
-1902-05-05 12:34:56.1316,1902-12-25
-1902-05-05 12:34:56.1317,1902-12-25
-1902-05-05 12:34:56.1318,1902-12-25
-1902-05-05 12:34:56.1319,1902-12-25
-1902-05-05 12:34:56.132,1902-12-25
-1902-05-05 12:34:56.1321,1902-12-25
-1902-05-05 12:34:56.1322,1902-12-25
-1902-05-05 12:34:56.1323,1902-12-25
-1902-05-05 12:34:56.1324,1902-12-25
-1902-05-05 12:34:56.1325,1902-12-25
-1902-05-05 12:34:56.1326,1902-12-25
-1902-05-05 12:34:56.1327,1902-12-25
-1902-05-05 12:34:56.1328,1902-12-25
-1902-05-05 12:34:56.1329,1902-12-25
-1902-05-05 12:34:56.133,1902-12-25
-1902-05-05 12:34:56.1331,1902-12-25
-1902-05-05 12:34:56.1332,1902-12-25
-1902-05-05 12:34:56.1333,1902-12-25
-1902-05-05 12:34:56.1334,1902-12-25
-1902-05-05 12:34:56.1335,1902-12-25
-1902-05-05 12:34:56.1336,1902-12-25
-1902-05-05 12:34:56.1337,1902-12-25
-1902-05-05 12:34:56.1338,1902-12-25
-1902-05-05 12:34:56.1339,1902-12-25
-1902-05-05 12:34:56.134,1902-12-25
-1902-05-05 12:34:56.1341,1902-12-25
-1902-05-05 12:34:56.1342,1902-12-25
-1902-05-05 12:34:56.1343,1902-12-25
-1902-05-05 12:34:56.1344,1902-12-25
-1902-05-05 12:34:56.1345,1902-12-25
-1902-05-05 12:34:56.1346,1902-12-25
-1902-05-05 12:34:56.1347,1902-12-25
-1902-05-05 12:34:56.1348,1902-12-25
-1902-05-05 12:34:56.1349,1902-12-25
-1902-05-05 12:34:56.135,1902-12-25
-1902-05-05 12:34:56.1351,1902-12-25
-1902-05-05 12:34:56.1352,1902-12-25
-1902-05-05 12:34:56.1353,1902-12-25
-1902-05-05 12:34:56.1354,1902-12-25
-1902-05-05 12:34:56.1355,1902-12-25
-1902-05-05 12:34:56.1356,1902-12-25
-1902-05-05 12:34:56.1357,1902-12-25
-1902-05-05 12:34:56.1358,1902-12-25
-1902-05-05 12:34:56.1359,1902-12-25
-1902-05-05 12:34:56.136,1902-12-25
-1902-05-05 12:34:56.1361,1902-12-25
-1902-05-05 12:34:56.1362,1902-12-25
-1902-05-05 12:34:56.1363,1902-12-25
-1902-05-05 12:34:56.1364,1902-12-25
-1902-05-05 12:34:56.1365,1902-12-25
-1902-05-05 12:34:56.1366,1902-12-25
-1902-05-05 12:34:56.1367,1902-12-25
-1902-05-05 12:34:56.1368,1902-12-25
-1902-05-05 12:34:56.1369,1902-12-25
-1902-05-05 12:34:56.137,1902-12-25
-1902-05-05 12:34:56.1371,1902-12-25
-1902-05-05 12:34:56.1372,1902-12-25
-1902-05-05 12:34:56.1373,1902-12-25
-1902-05-05 12:34:56.1374,1902-12-25
-1902-05-05 12:34:56.1375,1902-12-25
-1902-05-05 12:34:56.1376,1902-12-25
-1902-05-05 12:34:56.1377,1902-12-25
-1902-05-05 12:34:56.1378,1902-12-25
-1902-05-05 12:34:56.1379,1902-12-25
-1902-05-05 12:34:56.138,1902-12-25
-1902-05-05 12:34:56.1381,1902-12-25
-1902-05-05 12:34:56.1382,1902-12-25
-1902-05-05 12:34:56.1383,1902-12-25
-1902-05-05 12:34:56.1384,1902-12-25
-1902-05-05 12:34:56.1385,1902-12-25
-1902-05-05 12:34:56.1386,1902-12-25
-1902-05-05 12:34:56.1387,1902-12-25
-1902-05-05 12:34:56.1388,1902-12-25
-1902-05-05 12:34:56.1389,1902-12-25
-1902-05-05 12:34:56.139,1902-12-25
-1902-05-05 12:34:56.1391,1902-12-25
-1902-05-05 12:34:56.1392,1902-12-25
-1902-05-05 12:34:56.1393,1902-12-25
-1902-05-05 12:34:56.1394,1902-12-25
-1902-05-05 12:34:56.1395,1902-12-25
-1902-05-05 12:34:56.1396,1902-12-25
-1902-05-05 12:34:56.1397,1902-12-25
-1902-05-05 12:34:56.1398,1902-12-25
-1902-05-05 12:34:56.1399,1902-12-25
-1902-05-05 12:34:56.14,1902-12-25
-1902-05-05 12:34:56.1401,1902-12-25
-1902-05-05 12:34:56.1402,1902-12-25
-1902-05-05 12:34:56.1403,1902-12-25
-1902-05-05 12:34:56.1404,1902-12-25
-1902-05-05 12:34:56.1405,1902-12-25
-1902-05-05 12:34:56.1406,1902-12-25
-1902-05-05 12:34:56.1407,1902-12-25
-1902-05-05 12:34:56.1408,1902-12-25
-1902-05-05 12:34:56.1409,1902-12-25
-1902-05-05 12:34:56.141,1902-12-25
-1902-05-05 12:34:

<TRUNCATED>

[3/9] flink git commit: [FLINK-2170] [connectors] Add OrcRowInputFormat and OrcTableSource.

Posted by fh...@apache.org.
http://git-wip-us.apache.org/repos/asf/flink/blob/edbf8c9e/flink-connectors/flink-orc/src/main/java/org/apache/flink/orc/RowOrcInputFormat.java
----------------------------------------------------------------------
diff --git a/flink-connectors/flink-orc/src/main/java/org/apache/flink/orc/RowOrcInputFormat.java b/flink-connectors/flink-orc/src/main/java/org/apache/flink/orc/RowOrcInputFormat.java
new file mode 100644
index 0000000..0c9c549
--- /dev/null
+++ b/flink-connectors/flink-orc/src/main/java/org/apache/flink/orc/RowOrcInputFormat.java
@@ -0,0 +1,241 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.flink.orc;
+
+import org.apache.flink.api.common.io.FileInputFormat;
+import org.apache.flink.api.common.typeinfo.TypeInformation;
+import org.apache.flink.api.java.typeutils.ResultTypeQueryable;
+import org.apache.flink.api.java.typeutils.RowTypeInfo;
+import org.apache.flink.core.fs.FileInputSplit;
+import org.apache.flink.core.fs.Path;
+import org.apache.flink.types.Row;
+import org.apache.flink.util.Preconditions;
+
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch;
+
+import org.apache.orc.OrcConf;
+import org.apache.orc.OrcFile;
+import org.apache.orc.Reader;
+import org.apache.orc.RecordReader;
+import org.apache.orc.TypeDescription;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+
+import static org.apache.flink.orc.OrcUtils.fillRows;
+
+/**
+ * InputFormat to read ORC data.
+ * For Optimization, reading is done in batch instead of a single row.
+ */
+public class RowOrcInputFormat
+	extends FileInputFormat<Row>
+	implements ResultTypeQueryable<Row> {
+
+	private static final Logger LOG = LoggerFactory.getLogger(RowOrcInputFormat.class);
+	private static final int BATCH_SIZE = 1024;
+
+	private org.apache.hadoop.conf.Configuration config;
+	private TypeDescription schema;
+	private int[] fieldMapping;
+
+	private transient RowTypeInfo rowType;
+	private transient RecordReader orcRowsReader;
+	private transient VectorizedRowBatch rowBatch;
+	private transient Row[] rows;
+
+	private transient int rowInBatch;
+
+	public RowOrcInputFormat(String path, String schemaString, Configuration orcConfig) {
+		this(path, TypeDescription.fromString(schemaString), orcConfig);
+	}
+
+	public RowOrcInputFormat(String path, TypeDescription orcSchema, Configuration orcConfig) {
+		super(new Path(path));
+		this.unsplittable = false;
+		this.schema = orcSchema;
+		this.rowType = (RowTypeInfo) OrcUtils.schemaToTypeInfo(schema);
+		this.config = orcConfig;
+
+		this.fieldMapping = new int[this.schema.getChildren().size()];
+		for (int i = 0; i < fieldMapping.length; i++) {
+			this.fieldMapping[i] = i;
+		}
+
+	}
+
+	public void setFieldMapping(int[] fieldMapping) {
+		this.fieldMapping = fieldMapping;
+		// adapt result type
+
+		TypeInformation[] fieldTypes = new TypeInformation[fieldMapping.length];
+		String[] fieldNames = new String[fieldMapping.length];
+		for (int i = 0; i < fieldMapping.length; i++) {
+			fieldTypes[i] = this.rowType.getTypeAt(fieldMapping[i]);
+			fieldNames[i] = this.rowType.getFieldNames()[fieldMapping[i]];
+		}
+		this.rowType = new RowTypeInfo(fieldTypes, fieldNames);
+	}
+
+	private boolean[] computeProjectionMask() {
+		boolean[] projectionMask = new boolean[schema.getMaximumId() + 1];
+		for (int inIdx : fieldMapping) {
+			TypeDescription fieldSchema = schema.getChildren().get(inIdx);
+			for (int i = fieldSchema.getId(); i <= fieldSchema.getMaximumId(); i++) {
+				projectionMask[i] = true;
+			}
+		}
+		return projectionMask;
+	}
+
+	@Override
+	public void openInputFormat() throws IOException {
+		super.openInputFormat();
+		this.rows = new Row[BATCH_SIZE];
+		for (int i = 0; i < BATCH_SIZE; i++) {
+			rows[i] = new Row(fieldMapping.length);
+		}
+	}
+
+	@Override
+	public void open(FileInputSplit fileSplit) throws IOException {
+
+		this.currentSplit = fileSplit;
+		Preconditions.checkArgument(this.splitStart == 0, "ORC files must be read from the start.");
+
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("Opening ORC file " + fileSplit.getPath());
+		}
+
+		org.apache.hadoop.fs.Path hPath = new org.apache.hadoop.fs.Path(fileSplit.getPath().getPath());
+
+		Reader orcReader = OrcFile.createReader(hPath, OrcFile.readerOptions(config));
+
+		Reader.Options options = orcReader.options()
+			.range(fileSplit.getStart(), fileSplit.getLength())
+			.useZeroCopy(OrcConf.USE_ZEROCOPY.getBoolean(config))
+			.skipCorruptRecords(OrcConf.SKIP_CORRUPT_DATA.getBoolean(config))
+			.tolerateMissingSchema(OrcConf.TOLERATE_MISSING_SCHEMA.getBoolean(config));
+
+		options.include(computeProjectionMask());
+
+		// check that schema of file is as expected
+		if (!this.schema.equals(orcReader.getSchema())) {
+
+			throw new RuntimeException("Invalid schema for file at " + this.filePath +
+				" Expected:" + this.schema + " Actual: " + orcReader.getSchema());
+		}
+
+		this.orcRowsReader = orcReader.rows(options);
+
+		// assign ids
+		this.schema.getId();
+
+		this.rowBatch = schema.createRowBatch(BATCH_SIZE);
+		rowInBatch = 0;
+	}
+
+	@Override
+	public void close() throws IOException {
+
+		if (orcRowsReader != null) {
+			this.orcRowsReader.close();
+		}
+		this.orcRowsReader = null;
+
+	}
+
+	@Override
+	public void closeInputFormat() throws IOException {
+		this.rows = null;
+		this.rows = null;
+		this.schema = null;
+		this.rowBatch = null;
+	}
+
+	@Override
+	public boolean reachedEnd() throws IOException {
+		return !ensureBatch();
+	}
+
+	private boolean ensureBatch() throws IOException {
+
+		if (rowInBatch >= rowBatch.size) {
+			rowInBatch = 0;
+			boolean moreRows = orcRowsReader.nextBatch(rowBatch);
+
+			if (moreRows) {
+				// read rows
+				fillRows(rows, schema, rowBatch, fieldMapping);
+			}
+			return moreRows;
+		}
+
+		return true;
+	}
+
+	@Override
+	public Row nextRecord(Row reuse) throws IOException {
+		return rows[this.rowInBatch++];
+	}
+
+	@Override
+	public TypeInformation<Row> getProducedType() {
+		return rowType;
+	}
+
+	// --------------------------------------------------------------------------------------------
+	//  Custom serialization methods
+	// --------------------------------------------------------------------------------------------
+
+	private void writeObject(ObjectOutputStream out) throws IOException {
+		this.config.write(out);
+		out.writeUTF(schema.toString());
+
+		out.writeInt(fieldMapping.length);
+		for (int f : fieldMapping) {
+			out.writeInt(f);
+		}
+
+	}
+
+	@SuppressWarnings("unchecked")
+	private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
+
+		org.apache.hadoop.conf.Configuration configuration = new org.apache.hadoop.conf.Configuration();
+		configuration.readFields(in);
+
+		if (this.config == null) {
+			this.config = configuration;
+		}
+		this.schema = TypeDescription.fromString(in.readUTF());
+
+		this.fieldMapping = new int[in.readInt()];
+		for (int i = 0; i < fieldMapping.length; i++) {
+			this.fieldMapping[i] = in.readInt();
+		}
+
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/flink/blob/edbf8c9e/flink-connectors/flink-orc/src/test/java/org/apache/flink/orc/OrcTableSourceITCase.java
----------------------------------------------------------------------
diff --git a/flink-connectors/flink-orc/src/test/java/org/apache/flink/orc/OrcTableSourceITCase.java b/flink-connectors/flink-orc/src/test/java/org/apache/flink/orc/OrcTableSourceITCase.java
new file mode 100644
index 0000000..3de6ab3
--- /dev/null
+++ b/flink-connectors/flink-orc/src/test/java/org/apache/flink/orc/OrcTableSourceITCase.java
@@ -0,0 +1,142 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.flink.orc;
+
+import org.apache.flink.api.common.typeinfo.BasicTypeInfo;
+import org.apache.flink.api.common.typeinfo.TypeInformation;
+import org.apache.flink.api.java.DataSet;
+import org.apache.flink.api.java.ExecutionEnvironment;
+import org.apache.flink.api.java.typeutils.MapTypeInfo;
+import org.apache.flink.api.java.typeutils.ObjectArrayTypeInfo;
+import org.apache.flink.api.java.typeutils.RowTypeInfo;
+import org.apache.flink.table.api.Table;
+import org.apache.flink.table.api.TableEnvironment;
+import org.apache.flink.table.api.TableSchema;
+import org.apache.flink.table.api.java.BatchTableEnvironment;
+import org.apache.flink.test.util.MultipleProgramsTestBase;
+import org.apache.flink.types.Row;
+
+import org.hamcrest.CoreMatchers;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Tests for {@link OrcTableSource}.
+ */
+public class OrcTableSourceITCase extends MultipleProgramsTestBase {
+
+	private static final String TEST1_SCHEMA = "struct<boolean1:boolean,byte1:tinyint,short1:smallint,int1:int," +
+		"long1:bigint,float1:float,double1:double,bytes1:binary,string1:string," +
+		"middle:struct<list:array<struct<int1:int,string1:string>>>," +
+		"list:array<struct<int1:int,string1:string>>," +
+		"map:map<string,struct<int1:int,string1:string>>>";
+
+	private final URL test1URL = getClass().getClassLoader().getResource("TestOrcFile.test1.orc");
+
+
+	private static final String[] TEST1_DATA = new String[] {
+		"false,1,1024,65536,9223372036854775807,1.0,-15.0,[0, 1, 2, 3, 4],hi,[1,bye, 2,sigh],[3,good, 4,bad],{}",
+		"true,100,2048,65536,9223372036854775807,2.0,-5.0,[],bye,[1,bye, 2,sigh]," +
+			"[100000000,cat, -100000,in, 1234,hat],{chani=5,chani, mauddib=1,mauddib}" };
+
+	public OrcTableSourceITCase() {
+		super(TestExecutionMode.COLLECTION);
+	}
+
+	@Test
+	public void testOrcTableSource() throws Exception {
+
+		ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
+		BatchTableEnvironment tEnv = TableEnvironment.getTableEnvironment(env);
+
+		assert (test1URL != null);
+		OrcTableSource orc = new OrcTableSource(test1URL.getPath(), TEST1_SCHEMA);
+
+		tEnv.registerTableSource("orcTable", orc);
+
+		String query = "Select * from orcTable";
+		Table t = tEnv.sql(query);
+
+		DataSet<Row> dataSet = tEnv.toDataSet(t, Row.class);
+		List<Row> records = dataSet.collect();
+
+		Assert.assertEquals(records.size(), 2);
+
+		List<String> actualRecords = new ArrayList<>();
+		for (Row record : records) {
+			Assert.assertEquals(record.getArity(), 12);
+			actualRecords.add(record.toString());
+		}
+
+		Assert.assertThat(actualRecords, CoreMatchers.hasItems(TEST1_DATA));
+	}
+
+	@Test
+	public void testOrcTableProjection() throws Exception {
+
+		ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
+		BatchTableEnvironment tEnv = TableEnvironment.getTableEnvironment(env);
+
+		assert(test1URL != null);
+		OrcTableSource orc = new OrcTableSource(test1URL.getPath(), TEST1_SCHEMA);
+
+		tEnv.registerTableSource("orcTable", orc);
+
+		String query = "Select middle,list,map from orcTable";
+		Table t = tEnv.sql(query);
+
+		String[] colNames = new String[] {"middle", "list", "map"};
+
+		RowTypeInfo rowTypeInfo = new RowTypeInfo(
+			new TypeInformation[] {
+				BasicTypeInfo.INT_TYPE_INFO,
+				BasicTypeInfo.STRING_TYPE_INFO},
+			new String[] {"int1", "string1"});
+
+		RowTypeInfo structTypeInfo = new RowTypeInfo(
+			new TypeInformation[] {ObjectArrayTypeInfo.getInfoFor(rowTypeInfo)},
+			new String[] {"list"});
+
+		TypeInformation[] colTypes = new TypeInformation[] {
+			structTypeInfo,
+			ObjectArrayTypeInfo.getInfoFor(rowTypeInfo),
+			new MapTypeInfo(BasicTypeInfo.STRING_TYPE_INFO, rowTypeInfo)
+		};
+
+		TableSchema actualTableSchema = new TableSchema(colNames, colTypes);
+
+		Assert.assertArrayEquals(t.getSchema().getColumnNames(), colNames);
+		Assert.assertArrayEquals(t.getSchema().getTypes(), colTypes);
+		Assert.assertEquals(actualTableSchema.toString(), t.getSchema().toString());
+
+		DataSet<Row> dataSet = tEnv.toDataSet(t, Row.class);
+		List<Row> records = dataSet.collect();
+
+		Assert.assertEquals(records.size(), 2);
+		for (Row record: records) {
+			Assert.assertEquals(record.getArity(), 3);
+		}
+
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/flink/blob/edbf8c9e/flink-connectors/flink-orc/src/test/java/org/apache/flink/orc/OrcTableSourceTest.java
----------------------------------------------------------------------
diff --git a/flink-connectors/flink-orc/src/test/java/org/apache/flink/orc/OrcTableSourceTest.java b/flink-connectors/flink-orc/src/test/java/org/apache/flink/orc/OrcTableSourceTest.java
new file mode 100644
index 0000000..c285054
--- /dev/null
+++ b/flink-connectors/flink-orc/src/test/java/org/apache/flink/orc/OrcTableSourceTest.java
@@ -0,0 +1,113 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.flink.orc;
+
+import org.apache.flink.api.common.typeinfo.BasicTypeInfo;
+import org.apache.flink.api.common.typeinfo.PrimitiveArrayTypeInfo;
+import org.apache.flink.api.common.typeinfo.TypeInformation;
+import org.apache.flink.api.java.ExecutionEnvironment;
+import org.apache.flink.api.java.typeutils.MapTypeInfo;
+import org.apache.flink.api.java.typeutils.ObjectArrayTypeInfo;
+import org.apache.flink.api.java.typeutils.RowTypeInfo;
+import org.apache.flink.table.api.Table;
+import org.apache.flink.table.api.TableEnvironment;
+import org.apache.flink.table.api.TableSchema;
+import org.apache.flink.table.api.java.BatchTableEnvironment;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.net.URL;
+
+/**
+ * Unit Tests for {@link OrcTableSource}.
+ */
+public class OrcTableSourceTest {
+
+	private static final String TEST1_SCHEMA = "struct<boolean1:boolean,byte1:tinyint,short1:smallint,int1:int," +
+		"long1:bigint,float1:float,double1:double,bytes1:binary,string1:string," +
+		"middle:struct<list:array<struct<int1:int,string1:string>>>," +
+		"list:array<struct<int1:int,string1:string>>," +
+		"map:map<string,struct<int1:int,string1:string>>>";
+
+	private final URL test1URL = getClass().getClassLoader().getResource("TestOrcFile.test1.orc");
+
+	@Test
+	public void testOrcSchema() throws Exception {
+
+		assert(test1URL != null);
+		OrcTableSource orc = new OrcTableSource(test1URL.getPath(), TEST1_SCHEMA);
+
+		String expectedSchema = "Row(boolean1: Boolean, byte1: Byte, short1: Short, int1: Integer, long1: Long, " +
+			"float1: Float, double1: Double, bytes1: byte[], string1: String, " +
+			"middle: Row(list: ObjectArrayTypeInfo<Row(int1: Integer, string1: String)>), " +
+			"list: ObjectArrayTypeInfo<Row(int1: Integer, string1: String)>, " +
+			"map: Map<String, Row(int1: Integer, string1: String)>)";
+
+		Assert.assertEquals(expectedSchema, orc.getReturnType().toString());
+
+	}
+
+	@Test
+	public void testOrcTableSchema() throws Exception {
+
+		ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
+		BatchTableEnvironment tEnv = TableEnvironment.getTableEnvironment(env);
+
+		assert(test1URL != null);
+		OrcTableSource orc = new OrcTableSource(test1URL.getPath(), TEST1_SCHEMA);
+
+		tEnv.registerTableSource("orcTable", orc);
+		String query = "Select * from orcTable";
+		Table t = tEnv.sql(query);
+
+		String[] colNames = new String[] {
+			"boolean1", "byte1", "short1", "int1", "long1", "float1",
+			"double1", "bytes1", "string1", "list", "list0", "map"
+		};
+
+		RowTypeInfo rowTypeInfo = new RowTypeInfo(
+			new TypeInformation[] {
+				BasicTypeInfo.INT_TYPE_INFO,
+				BasicTypeInfo.STRING_TYPE_INFO},
+			new String[] {"int1", "string1"});
+
+		TypeInformation[] colTypes = new TypeInformation[] {
+			BasicTypeInfo.BOOLEAN_TYPE_INFO,
+			BasicTypeInfo.BYTE_TYPE_INFO,
+			BasicTypeInfo.SHORT_TYPE_INFO,
+			BasicTypeInfo.INT_TYPE_INFO,
+			BasicTypeInfo.LONG_TYPE_INFO,
+			BasicTypeInfo.FLOAT_TYPE_INFO,
+			BasicTypeInfo.DOUBLE_TYPE_INFO,
+			PrimitiveArrayTypeInfo.BYTE_PRIMITIVE_ARRAY_TYPE_INFO,
+			BasicTypeInfo.STRING_TYPE_INFO,
+			ObjectArrayTypeInfo.getInfoFor(rowTypeInfo),
+			ObjectArrayTypeInfo.getInfoFor(rowTypeInfo),
+			new MapTypeInfo(BasicTypeInfo.STRING_TYPE_INFO, rowTypeInfo)
+		};
+		TableSchema expectedTableSchema = new TableSchema(colNames, colTypes);
+
+		Assert.assertArrayEquals(t.getSchema().getColumnNames(), colNames);
+		Assert.assertArrayEquals(t.getSchema().getTypes(), colTypes);
+		Assert.assertEquals(expectedTableSchema.toString(), t.getSchema().toString());
+
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/flink/blob/edbf8c9e/flink-connectors/flink-orc/src/test/java/org/apache/flink/orc/RowOrcInputFormatTest.java
----------------------------------------------------------------------
diff --git a/flink-connectors/flink-orc/src/test/java/org/apache/flink/orc/RowOrcInputFormatTest.java b/flink-connectors/flink-orc/src/test/java/org/apache/flink/orc/RowOrcInputFormatTest.java
new file mode 100644
index 0000000..60008a0
--- /dev/null
+++ b/flink-connectors/flink-orc/src/test/java/org/apache/flink/orc/RowOrcInputFormatTest.java
@@ -0,0 +1,472 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.flink.orc;
+
+import org.apache.flink.api.common.typeinfo.TypeInformation;
+import org.apache.flink.core.fs.FileInputSplit;
+import org.apache.flink.types.Row;
+
+import org.apache.hadoop.conf.Configuration;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.net.URL;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Tests for the {@link RowOrcInputFormat}.
+ */
+
+public class RowOrcInputFormatTest {
+
+	private RowOrcInputFormat rowOrcInputFormat;
+
+	@After
+	public void tearDown() throws IOException {
+		if (rowOrcInputFormat != null) {
+			rowOrcInputFormat.close();
+			rowOrcInputFormat.closeInputFormat();
+		}
+		rowOrcInputFormat = null;
+	}
+
+	private final URL test1URL = getClass().getClassLoader().getResource("TestOrcFile.test1.orc");
+
+	private static final String TEST1_SCHEMA = "struct<boolean1:boolean,byte1:tinyint,short1:smallint,int1:int," +
+		"long1:bigint,float1:float,double1:double,bytes1:binary,string1:string," +
+		"middle:struct<list:array<struct<int1:int,string1:string>>>," +
+		"list:array<struct<int1:int,string1:string>>," +
+		"map:map<string,struct<int1:int,string1:string>>>";
+
+	private static final String[] TEST1_DATA = new String[] {
+		"false,1,1024,65536,9223372036854775807,1.0,-15.0,[0, 1, 2, 3, 4],hi,[1,bye, 2,sigh],[3,good, 4,bad],{}",
+		"true,100,2048,65536,9223372036854775807,2.0,-5.0,[],bye,[1,bye, 2,sigh]," +
+			"[100000000,cat, -100000,in, 1234,hat],{chani=5,chani, mauddib=1,mauddib}" };
+
+	private static final String[] TEST1_PROJECTED_DATA = new String[] {
+		"{},[3,good, 4,bad],[1,bye, 2,sigh],hi,[0, 1, 2, 3, 4],-15.0,1.0,9223372036854775807,65536,1024,1,false",
+		"{chani=5,chani, mauddib=1,mauddib},[100000000,cat, -100000,in, 1234,hat],[1,bye, 2,sigh],bye," +
+			"[],-5.0,2.0,9223372036854775807,65536,2048,100,true" };
+
+	private static final String TEST1_INVALID_SCHEMA = "struct<boolean1:int,byte1:tinyint,short1:smallint,int1:int," +
+		"long1:bigint,float1:float,double1:double,bytes1:binary,string1:string," +
+		"middle:struct<list:array<struct<int1:int,string1:string>>>," +
+		"list:array<struct<int1:int,string1:string>>," +
+		"map:map<string,struct<int1:int,string1:string>>>";
+
+	@Test(expected = FileNotFoundException.class)
+	public void testInvalidPath() throws IOException{
+
+		rowOrcInputFormat = new RowOrcInputFormat("TestOrcFile.test2.orc", TEST1_SCHEMA, new Configuration());
+		rowOrcInputFormat.openInputFormat();
+		FileInputSplit[] inputSplits = rowOrcInputFormat.createInputSplits(1);
+		rowOrcInputFormat.open(inputSplits[0]);
+
+	}
+
+	@Test(expected = RuntimeException.class)
+	public void testInvalidSchema() throws IOException{
+
+		assert(test1URL != null);
+		rowOrcInputFormat = new RowOrcInputFormat(test1URL.getPath(), TEST1_INVALID_SCHEMA, new Configuration());
+		rowOrcInputFormat.openInputFormat();
+		FileInputSplit[] inputSplits = rowOrcInputFormat.createInputSplits(1);
+		rowOrcInputFormat.open(inputSplits[0]);
+
+	}
+
+	@Test(expected = IndexOutOfBoundsException.class)
+	public void testInvalidProjection() throws IOException{
+
+		assert(test1URL != null);
+		rowOrcInputFormat = new RowOrcInputFormat(test1URL.getPath(), TEST1_SCHEMA, new Configuration());
+		int[] projectionMask = {14};
+		rowOrcInputFormat.setFieldMapping(projectionMask);
+	}
+
+	@Test
+	public void testMajorDataTypes() throws IOException{
+
+		// test for boolean,byte,short,int,long,float,double,bytes,string,struct,list,map
+		assert(test1URL != null);
+		rowOrcInputFormat = new RowOrcInputFormat(test1URL.getPath(), TEST1_SCHEMA, new Configuration());
+		rowOrcInputFormat.openInputFormat();
+		FileInputSplit[] inputSplits = rowOrcInputFormat.createInputSplits(1);
+
+		Assert.assertEquals(inputSplits.length, 1);
+
+		Row row = null;
+		int count = 0;
+		for (FileInputSplit split : inputSplits) {
+			rowOrcInputFormat.open(split);
+			while (!rowOrcInputFormat.reachedEnd()) {
+				row = rowOrcInputFormat.nextRecord(row);
+				Assert.assertEquals(row.toString(), TEST1_DATA[count++]);
+			}
+		}
+	}
+
+	@Test
+	public void testProjection() throws IOException{
+
+		assert(test1URL != null);
+		rowOrcInputFormat = new RowOrcInputFormat(test1URL.getPath(), TEST1_SCHEMA, new Configuration());
+		int[] projectionMask = {11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
+		rowOrcInputFormat.setFieldMapping(projectionMask);
+		rowOrcInputFormat.openInputFormat();
+		FileInputSplit[] inputSplits = rowOrcInputFormat.createInputSplits(1);
+
+		Assert.assertEquals(inputSplits.length, 1);
+
+		Row row = null;
+		int count = 0;
+		for (FileInputSplit split : inputSplits) {
+			rowOrcInputFormat.open(split);
+			while (!rowOrcInputFormat.reachedEnd()) {
+				row = rowOrcInputFormat.nextRecord(row);
+				Assert.assertEquals(row.toString(), TEST1_PROJECTED_DATA[count++]);
+			}
+		}
+
+	}
+
+	@Test
+	public void testTimeStampAndDate() throws IOException{
+
+		URL expectedDataURL = getClass().getClassLoader().getResource("TestOrcFile.testDate1900.dat");
+		assert(expectedDataURL != null);
+		List<String> expectedTimeStampAndDate = Files.readAllLines(Paths.get(expectedDataURL.getPath()));
+
+		URL testInputURL = getClass().getClassLoader().getResource("TestOrcFile.testDate1900.orc");
+		assert(testInputURL != null);
+		String path = testInputURL.getPath();
+		String schema = "struct<time:timestamp,date:date>";
+		rowOrcInputFormat = new RowOrcInputFormat(path, schema, new Configuration());
+		rowOrcInputFormat.openInputFormat();
+
+		FileInputSplit[] inputSplits = rowOrcInputFormat.createInputSplits(1);
+
+		Assert.assertEquals(inputSplits.length, 1);
+
+		List<Object> actualTimeStampAndDate = new ArrayList<>();
+
+		Row row = null;
+		int count = 0;
+		for (FileInputSplit split : inputSplits) {
+			rowOrcInputFormat.open(split);
+			while (!rowOrcInputFormat.reachedEnd()) {
+				row = rowOrcInputFormat.nextRecord(row);
+				count++;
+				if (count <= 10000) {
+					actualTimeStampAndDate.add(row.getField(0) + "," + row.getField(1));
+				}
+
+			}
+		}
+		Assert.assertEquals(count, 70000);
+		Assert.assertEquals(expectedTimeStampAndDate.size(), actualTimeStampAndDate.size());
+		Assert.assertEquals(expectedTimeStampAndDate.toString(), actualTimeStampAndDate.toString());
+
+	}
+
+	@Test
+	public void testDecimal() throws IOException{
+
+		URL expectedDataURL = getClass().getClassLoader().getResource("decimal.dat");
+		List<String> expectedDecimal = Files.readAllLines(Paths.get(expectedDataURL.getPath()));
+
+		URL testInputURL = getClass().getClassLoader().getResource("decimal.orc");
+		assert(testInputURL != null);
+		String path = testInputURL.getPath();
+		String schema = "struct<_col0:decimal(10,5)>";
+		rowOrcInputFormat = new RowOrcInputFormat(path, schema, new Configuration());
+		rowOrcInputFormat.openInputFormat();
+
+		FileInputSplit[] inputSplits = rowOrcInputFormat.createInputSplits(1);
+
+		Assert.assertEquals(inputSplits.length, 1);
+
+		List<Object> actualDecimal = new ArrayList<>();
+
+		Row row = null;
+		for (FileInputSplit split : inputSplits) {
+			rowOrcInputFormat.open(split);
+			while (!rowOrcInputFormat.reachedEnd()) {
+				row = rowOrcInputFormat.nextRecord(row);
+				actualDecimal.add(row.getField(0));
+			}
+		}
+
+		Assert.assertEquals(expectedDecimal.size(), actualDecimal.size());
+		Assert.assertEquals(expectedDecimal.toString(), actualDecimal.toString());
+
+	}
+
+	@Test
+	public void testEmptyFile() throws IOException{
+
+		URL testInputURL = getClass().getClassLoader().getResource("TestOrcFile.emptyFile.orc");
+		assert(testInputURL != null);
+		String path = testInputURL.getPath();
+
+		rowOrcInputFormat = new RowOrcInputFormat(path, TEST1_SCHEMA, new Configuration());
+		rowOrcInputFormat.openInputFormat();
+
+		FileInputSplit[] inputSplits = rowOrcInputFormat.createInputSplits(1);
+
+		Assert.assertEquals(inputSplits.length, 1);
+
+		Row row = new Row(1);
+		int count = 0;
+		for (FileInputSplit split : inputSplits) {
+			rowOrcInputFormat.open(split);
+			while (!rowOrcInputFormat.reachedEnd()) {
+				row = rowOrcInputFormat.nextRecord(row);
+				count++;
+			}
+		}
+
+		Assert.assertEquals(count, 0);
+	}
+
+	@Test
+	public void testLargeFile() throws IOException{
+
+		URL testInputURL = getClass().getClassLoader().getResource("demo-11-none.orc");
+		assert(testInputURL != null);
+		String path = testInputURL.getPath();
+		String schema = "struct<_col0:int,_col1:string,_col2:string,_col3:string,_col4:int," +
+			"_col5:string,_col6:int,_col7:int,_col8:int>";
+
+		rowOrcInputFormat = new RowOrcInputFormat(path, schema, new Configuration());
+		rowOrcInputFormat.openInputFormat();
+
+		FileInputSplit[] inputSplits = rowOrcInputFormat.createInputSplits(1);
+
+		Assert.assertEquals(inputSplits.length, 1);
+
+		Row row = new Row(1);
+		int count = 0;
+		for (FileInputSplit split : inputSplits) {
+			rowOrcInputFormat.open(split);
+			while (!rowOrcInputFormat.reachedEnd()) {
+				row = rowOrcInputFormat.nextRecord(row);
+				count++;
+			}
+		}
+
+		Assert.assertEquals(count, 1920800);
+	}
+
+	@Test
+	public void testProducedType() throws IOException{
+
+		assert(test1URL != null);
+		rowOrcInputFormat = new RowOrcInputFormat(test1URL.getPath(), TEST1_SCHEMA, new Configuration());
+		rowOrcInputFormat.openInputFormat();
+		FileInputSplit[] inputSplits = rowOrcInputFormat.createInputSplits(1);
+
+		Assert.assertEquals(inputSplits.length, 1);
+
+		rowOrcInputFormat.open(inputSplits[0]);
+
+		TypeInformation<Row> type = rowOrcInputFormat.getProducedType();
+		Assert.assertEquals(type.toString(), "Row(boolean1: Boolean, byte1: Byte, short1: Short, int1: Integer," +
+			" long1: Long, float1: Float, double1: Double, bytes1: byte[], string1: String," +
+			" middle: Row(list: ObjectArrayTypeInfo<Row(int1: Integer, string1: String)>)," +
+			" list: ObjectArrayTypeInfo<Row(int1: Integer, string1: String)>," +
+			" map: Map<String, Row(int1: Integer, string1: String)>)");
+
+	}
+
+	@Test
+	public void testProducedTypeWithProjection() throws IOException{
+
+		assert(test1URL != null);
+		rowOrcInputFormat = new RowOrcInputFormat(test1URL.getPath(), TEST1_SCHEMA, new Configuration());
+		int[] projectionMask = {9, 10, 11};
+		rowOrcInputFormat.setFieldMapping(projectionMask);
+		rowOrcInputFormat.openInputFormat();
+		FileInputSplit[] inputSplits = rowOrcInputFormat.createInputSplits(1);
+
+		Assert.assertEquals(inputSplits.length, 1);
+
+		rowOrcInputFormat.open(inputSplits[0]);
+
+		TypeInformation<Row> type = rowOrcInputFormat.getProducedType();
+		Assert.assertEquals(type.toString(), "Row(middle: Row(list: ObjectArrayTypeInfo<Row(int1: Integer, string1: String)>)," +
+			" list: ObjectArrayTypeInfo<Row(int1: Integer, string1: String)>," +
+			" map: Map<String, Row(int1: Integer, string1: String)>)");
+
+	}
+
+	@Test
+	public void testLongList() throws Exception {
+
+		URL testInputURL = getClass().getClassLoader().getResource("TestOrcFile.listlong.orc");
+		assert(testInputURL != null);
+		String path = testInputURL.getPath();
+		String schema = "struct<mylist1:array<bigint>>";
+
+		rowOrcInputFormat = new RowOrcInputFormat(path, schema, new Configuration());
+
+		rowOrcInputFormat.openInputFormat();
+		FileInputSplit[] inputSplits = rowOrcInputFormat.createInputSplits(1);
+
+		Assert.assertEquals(inputSplits.length, 1);
+
+		Row row = null;
+		long count = 0;
+		for (FileInputSplit split : inputSplits) {
+			rowOrcInputFormat.open(split);
+			while (!rowOrcInputFormat.reachedEnd()) {
+				row = rowOrcInputFormat.nextRecord(row);
+				Assert.assertEquals(row.getArity(), 1);
+				Object object = row.getField(0);
+				long[] l = (long[]) object;
+
+				Assert.assertEquals(l.length, 2);
+				if (count < 50) {
+					Assert.assertArrayEquals(l, new long[]{count, count + 1});
+				}
+				else {
+					Assert.assertArrayEquals(l, new long[]{0L, 0L});
+				}
+				count = count + 2;
+			}
+		}
+		Assert.assertEquals(count, 100);
+	}
+
+	@Test
+	public void testStringList() throws Exception {
+
+		URL testInputURL = getClass().getClassLoader().getResource("TestOrcFile.liststring.orc");
+		assert(testInputURL != null);
+		String path = testInputURL.getPath();
+		String schema = "struct<mylist1:array<string>>";
+
+		rowOrcInputFormat = new RowOrcInputFormat(path, schema, new Configuration());
+
+		rowOrcInputFormat.openInputFormat();
+		FileInputSplit[] inputSplits = rowOrcInputFormat.createInputSplits(1);
+
+		Assert.assertEquals(inputSplits.length, 1);
+
+		Row row = null;
+		long count = 0;
+		for (FileInputSplit split : inputSplits) {
+			rowOrcInputFormat.open(split);
+			while (!rowOrcInputFormat.reachedEnd()) {
+				row = rowOrcInputFormat.nextRecord(row);
+				Assert.assertEquals(row.getArity(), 1);
+				Object object = row.getField(0);
+				String[] l = (String[]) object;
+
+				Assert.assertEquals(l.length, 2);
+				Assert.assertArrayEquals(l, new String[]{"hello" + count, "hello" + (count + 1) });
+				count = count + 2;
+			}
+		}
+		Assert.assertEquals(count, 200);
+	}
+
+	@Test
+	public void testListOfListOfStructOfLong() throws Exception {
+		URL testInputURL = getClass().getClassLoader().getResource("TestOrcFile.listliststructlong.orc");
+		assert(testInputURL != null);
+		String path = testInputURL.getPath();
+		String schema = "struct<mylist1:array<array<struct<mylong1:bigint>>>>";
+
+		rowOrcInputFormat = new RowOrcInputFormat(path, schema, new Configuration());
+
+		rowOrcInputFormat.openInputFormat();
+		FileInputSplit[] inputSplits = rowOrcInputFormat.createInputSplits(1);
+
+		Assert.assertEquals(inputSplits.length, 1);
+
+		Row row = null;
+		long count = 0;
+		for (FileInputSplit split : inputSplits) {
+			rowOrcInputFormat.open(split);
+			while (!rowOrcInputFormat.reachedEnd()) {
+
+				row = rowOrcInputFormat.nextRecord(row);
+				Assert.assertEquals(row.getArity(), 1);
+
+				Object[] objects = (Object[]) row.getField(0);
+				Assert.assertEquals(objects.length, 1);
+
+				Object[] objects1 = (Object[]) objects[0];
+				Assert.assertEquals(objects1.length, 1);
+
+				Row[] nestedRows = Arrays.copyOf(objects1, objects1.length, Row[].class);
+				Assert.assertEquals(nestedRows.length, 1);
+
+				Assert.assertEquals(nestedRows[0].getArity(), 1);
+
+				Assert.assertEquals(nestedRows[0].getField(0), count);
+
+				count++;
+			}
+		}
+		Assert.assertEquals(count, 100);
+	}
+
+	@Test
+	public void testSplit() throws IOException{
+
+		URL testInputURL = getClass().getClassLoader().getResource("demo-11-none.orc");
+		assert(testInputURL != null);
+		String path = testInputURL.getPath();
+		String schema = "struct<_col0:int,_col1:string,_col2:string,_col3:string,_col4:int," +
+			"_col5:string,_col6:int,_col7:int,_col8:int>";
+
+		rowOrcInputFormat = new RowOrcInputFormat(path, schema, new Configuration());
+		rowOrcInputFormat.openInputFormat();
+
+		FileInputSplit[] inputSplits = rowOrcInputFormat.createInputSplits(10);
+
+		Assert.assertEquals(inputSplits.length, 10);
+
+		Row row = null;
+		int countTotalRecords = 0;
+		for (FileInputSplit split : inputSplits) {
+			rowOrcInputFormat.open(split);
+			int countSplitRecords = 0;
+			while (!rowOrcInputFormat.reachedEnd()) {
+				row = rowOrcInputFormat.nextRecord(row);
+				countSplitRecords++;
+			}
+			Assert.assertNotEquals(countSplitRecords, 1920800);
+			countTotalRecords += countSplitRecords;
+		}
+
+		Assert.assertEquals(countTotalRecords, 1920800);
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/flink/blob/edbf8c9e/flink-connectors/flink-orc/src/test/resources/TestOrcFile.emptyFile.orc
----------------------------------------------------------------------
diff --git a/flink-connectors/flink-orc/src/test/resources/TestOrcFile.emptyFile.orc b/flink-connectors/flink-orc/src/test/resources/TestOrcFile.emptyFile.orc
new file mode 100644
index 0000000..ecdadcb
Binary files /dev/null and b/flink-connectors/flink-orc/src/test/resources/TestOrcFile.emptyFile.orc differ

http://git-wip-us.apache.org/repos/asf/flink/blob/edbf8c9e/flink-connectors/flink-orc/src/test/resources/TestOrcFile.listliststructlong.orc
----------------------------------------------------------------------
diff --git a/flink-connectors/flink-orc/src/test/resources/TestOrcFile.listliststructlong.orc b/flink-connectors/flink-orc/src/test/resources/TestOrcFile.listliststructlong.orc
new file mode 100644
index 0000000..0f3f9c8
Binary files /dev/null and b/flink-connectors/flink-orc/src/test/resources/TestOrcFile.listliststructlong.orc differ

http://git-wip-us.apache.org/repos/asf/flink/blob/edbf8c9e/flink-connectors/flink-orc/src/test/resources/TestOrcFile.listlong.orc
----------------------------------------------------------------------
diff --git a/flink-connectors/flink-orc/src/test/resources/TestOrcFile.listlong.orc b/flink-connectors/flink-orc/src/test/resources/TestOrcFile.listlong.orc
new file mode 100644
index 0000000..648ea18
Binary files /dev/null and b/flink-connectors/flink-orc/src/test/resources/TestOrcFile.listlong.orc differ

http://git-wip-us.apache.org/repos/asf/flink/blob/edbf8c9e/flink-connectors/flink-orc/src/test/resources/TestOrcFile.liststring.orc
----------------------------------------------------------------------
diff --git a/flink-connectors/flink-orc/src/test/resources/TestOrcFile.liststring.orc b/flink-connectors/flink-orc/src/test/resources/TestOrcFile.liststring.orc
new file mode 100644
index 0000000..75a5f2a
Binary files /dev/null and b/flink-connectors/flink-orc/src/test/resources/TestOrcFile.liststring.orc differ

http://git-wip-us.apache.org/repos/asf/flink/blob/edbf8c9e/flink-connectors/flink-orc/src/test/resources/TestOrcFile.test1.orc
----------------------------------------------------------------------
diff --git a/flink-connectors/flink-orc/src/test/resources/TestOrcFile.test1.orc b/flink-connectors/flink-orc/src/test/resources/TestOrcFile.test1.orc
new file mode 100644
index 0000000..4fb0bef
Binary files /dev/null and b/flink-connectors/flink-orc/src/test/resources/TestOrcFile.test1.orc differ


[2/9] flink git commit: [FLINK-2170] [connectors] Add OrcRowInputFormat and OrcTableSource.

Posted by fh...@apache.org.
http://git-wip-us.apache.org/repos/asf/flink/blob/edbf8c9e/flink-connectors/flink-orc/src/test/resources/TestOrcFile.testDate1900.dat
----------------------------------------------------------------------
diff --git a/flink-connectors/flink-orc/src/test/resources/TestOrcFile.testDate1900.dat b/flink-connectors/flink-orc/src/test/resources/TestOrcFile.testDate1900.dat
new file mode 100644
index 0000000..59b933d
--- /dev/null
+++ b/flink-connectors/flink-orc/src/test/resources/TestOrcFile.testDate1900.dat
@@ -0,0 +1,10000 @@
+1900-05-05 12:34:56.1,1900-12-25
+1900-05-05 12:34:56.1001,1900-12-25
+1900-05-05 12:34:56.1002,1900-12-25
+1900-05-05 12:34:56.1003,1900-12-25
+1900-05-05 12:34:56.1004,1900-12-25
+1900-05-05 12:34:56.1005,1900-12-25
+1900-05-05 12:34:56.1006,1900-12-25
+1900-05-05 12:34:56.1007,1900-12-25
+1900-05-05 12:34:56.1008,1900-12-25
+1900-05-05 12:34:56.1009,1900-12-25
+1900-05-05 12:34:56.101,1900-12-25
+1900-05-05 12:34:56.1011,1900-12-25
+1900-05-05 12:34:56.1012,1900-12-25
+1900-05-05 12:34:56.1013,1900-12-25
+1900-05-05 12:34:56.1014,1900-12-25
+1900-05-05 12:34:56.1015,1900-12-25
+1900-05-05 12:34:56.1016,1900-12-25
+1900-05-05 12:34:56.1017,1900-12-25
+1900-05-05 12:34:56.1018,1900-12-25
+1900-05-05 12:34:56.1019,1900-12-25
+1900-05-05 12:34:56.102,1900-12-25
+1900-05-05 12:34:56.1021,1900-12-25
+1900-05-05 12:34:56.1022,1900-12-25
+1900-05-05 12:34:56.1023,1900-12-25
+1900-05-05 12:34:56.1024,1900-12-25
+1900-05-05 12:34:56.1025,1900-12-25
+1900-05-05 12:34:56.1026,1900-12-25
+1900-05-05 12:34:56.1027,1900-12-25
+1900-05-05 12:34:56.1028,1900-12-25
+1900-05-05 12:34:56.1029,1900-12-25
+1900-05-05 12:34:56.103,1900-12-25
+1900-05-05 12:34:56.1031,1900-12-25
+1900-05-05 12:34:56.1032,1900-12-25
+1900-05-05 12:34:56.1033,1900-12-25
+1900-05-05 12:34:56.1034,1900-12-25
+1900-05-05 12:34:56.1035,1900-12-25
+1900-05-05 12:34:56.1036,1900-12-25
+1900-05-05 12:34:56.1037,1900-12-25
+1900-05-05 12:34:56.1038,1900-12-25
+1900-05-05 12:34:56.1039,1900-12-25
+1900-05-05 12:34:56.104,1900-12-25
+1900-05-05 12:34:56.1041,1900-12-25
+1900-05-05 12:34:56.1042,1900-12-25
+1900-05-05 12:34:56.1043,1900-12-25
+1900-05-05 12:34:56.1044,1900-12-25
+1900-05-05 12:34:56.1045,1900-12-25
+1900-05-05 12:34:56.1046,1900-12-25
+1900-05-05 12:34:56.1047,1900-12-25
+1900-05-05 12:34:56.1048,1900-12-25
+1900-05-05 12:34:56.1049,1900-12-25
+1900-05-05 12:34:56.105,1900-12-25
+1900-05-05 12:34:56.1051,1900-12-25
+1900-05-05 12:34:56.1052,1900-12-25
+1900-05-05 12:34:56.1053,1900-12-25
+1900-05-05 12:34:56.1054,1900-12-25
+1900-05-05 12:34:56.1055,1900-12-25
+1900-05-05 12:34:56.1056,1900-12-25
+1900-05-05 12:34:56.1057,1900-12-25
+1900-05-05 12:34:56.1058,1900-12-25
+1900-05-05 12:34:56.1059,1900-12-25
+1900-05-05 12:34:56.106,1900-12-25
+1900-05-05 12:34:56.1061,1900-12-25
+1900-05-05 12:34:56.1062,1900-12-25
+1900-05-05 12:34:56.1063,1900-12-25
+1900-05-05 12:34:56.1064,1900-12-25
+1900-05-05 12:34:56.1065,1900-12-25
+1900-05-05 12:34:56.1066,1900-12-25
+1900-05-05 12:34:56.1067,1900-12-25
+1900-05-05 12:34:56.1068,1900-12-25
+1900-05-05 12:34:56.1069,1900-12-25
+1900-05-05 12:34:56.107,1900-12-25
+1900-05-05 12:34:56.1071,1900-12-25
+1900-05-05 12:34:56.1072,1900-12-25
+1900-05-05 12:34:56.1073,1900-12-25
+1900-05-05 12:34:56.1074,1900-12-25
+1900-05-05 12:34:56.1075,1900-12-25
+1900-05-05 12:34:56.1076,1900-12-25
+1900-05-05 12:34:56.1077,1900-12-25
+1900-05-05 12:34:56.1078,1900-12-25
+1900-05-05 12:34:56.1079,1900-12-25
+1900-05-05 12:34:56.108,1900-12-25
+1900-05-05 12:34:56.1081,1900-12-25
+1900-05-05 12:34:56.1082,1900-12-25
+1900-05-05 12:34:56.1083,1900-12-25
+1900-05-05 12:34:56.1084,1900-12-25
+1900-05-05 12:34:56.1085,1900-12-25
+1900-05-05 12:34:56.1086,1900-12-25
+1900-05-05 12:34:56.1087,1900-12-25
+1900-05-05 12:34:56.1088,1900-12-25
+1900-05-05 12:34:56.1089,1900-12-25
+1900-05-05 12:34:56.109,1900-12-25
+1900-05-05 12:34:56.1091,1900-12-25
+1900-05-05 12:34:56.1092,1900-12-25
+1900-05-05 12:34:56.1093,1900-12-25
+1900-05-05 12:34:56.1094,1900-12-25
+1900-05-05 12:34:56.1095,1900-12-25
+1900-05-05 12:34:56.1096,1900-12-25
+1900-05-05 12:34:56.1097,1900-12-25
+1900-05-05 12:34:56.1098,1900-12-25
+1900-05-05 12:34:56.1099,1900-12-25
+1900-05-05 12:34:56.11,1900-12-25
+1900-05-05 12:34:56.1101,1900-12-25
+1900-05-05 12:34:56.1102,1900-12-25
+1900-05-05 12:34:56.1103,1900-12-25
+1900-05-05 12:34:56.1104,1900-12-25
+1900-05-05 12:34:56.1105,1900-12-25
+1900-05-05 12:34:56.1106,1900-12-25
+1900-05-05 12:34:56.1107,1900-12-25
+1900-05-05 12:34:56.1108,1900-12-25
+1900-05-05 12:34:56.1109,1900-12-25
+1900-05-05 12:34:56.111,1900-12-25
+1900-05-05 12:34:56.1111,1900-12-25
+1900-05-05 12:34:56.1112,1900-12-25
+1900-05-05 12:34:56.1113,1900-12-25
+1900-05-05 12:34:56.1114,1900-12-25
+1900-05-05 12:34:56.1115,1900-12-25
+1900-05-05 12:34:56.1116,1900-12-25
+1900-05-05 12:34:56.1117,1900-12-25
+1900-05-05 12:34:56.1118,1900-12-25
+1900-05-05 12:34:56.1119,1900-12-25
+1900-05-05 12:34:56.112,1900-12-25
+1900-05-05 12:34:56.1121,1900-12-25
+1900-05-05 12:34:56.1122,1900-12-25
+1900-05-05 12:34:56.1123,1900-12-25
+1900-05-05 12:34:56.1124,1900-12-25
+1900-05-05 12:34:56.1125,1900-12-25
+1900-05-05 12:34:56.1126,1900-12-25
+1900-05-05 12:34:56.1127,1900-12-25
+1900-05-05 12:34:56.1128,1900-12-25
+1900-05-05 12:34:56.1129,1900-12-25
+1900-05-05 12:34:56.113,1900-12-25
+1900-05-05 12:34:56.1131,1900-12-25
+1900-05-05 12:34:56.1132,1900-12-25
+1900-05-05 12:34:56.1133,1900-12-25
+1900-05-05 12:34:56.1134,1900-12-25
+1900-05-05 12:34:56.1135,1900-12-25
+1900-05-05 12:34:56.1136,1900-12-25
+1900-05-05 12:34:56.1137,1900-12-25
+1900-05-05 12:34:56.1138,1900-12-25
+1900-05-05 12:34:56.1139,1900-12-25
+1900-05-05 12:34:56.114,1900-12-25
+1900-05-05 12:34:56.1141,1900-12-25
+1900-05-05 12:34:56.1142,1900-12-25
+1900-05-05 12:34:56.1143,1900-12-25
+1900-05-05 12:34:56.1144,1900-12-25
+1900-05-05 12:34:56.1145,1900-12-25
+1900-05-05 12:34:56.1146,1900-12-25
+1900-05-05 12:34:56.1147,1900-12-25
+1900-05-05 12:34:56.1148,1900-12-25
+1900-05-05 12:34:56.1149,1900-12-25
+1900-05-05 12:34:56.115,1900-12-25
+1900-05-05 12:34:56.1151,1900-12-25
+1900-05-05 12:34:56.1152,1900-12-25
+1900-05-05 12:34:56.1153,1900-12-25
+1900-05-05 12:34:56.1154,1900-12-25
+1900-05-05 12:34:56.1155,1900-12-25
+1900-05-05 12:34:56.1156,1900-12-25
+1900-05-05 12:34:56.1157,1900-12-25
+1900-05-05 12:34:56.1158,1900-12-25
+1900-05-05 12:34:56.1159,1900-12-25
+1900-05-05 12:34:56.116,1900-12-25
+1900-05-05 12:34:56.1161,1900-12-25
+1900-05-05 12:34:56.1162,1900-12-25
+1900-05-05 12:34:56.1163,1900-12-25
+1900-05-05 12:34:56.1164,1900-12-25
+1900-05-05 12:34:56.1165,1900-12-25
+1900-05-05 12:34:56.1166,1900-12-25
+1900-05-05 12:34:56.1167,1900-12-25
+1900-05-05 12:34:56.1168,1900-12-25
+1900-05-05 12:34:56.1169,1900-12-25
+1900-05-05 12:34:56.117,1900-12-25
+1900-05-05 12:34:56.1171,1900-12-25
+1900-05-05 12:34:56.1172,1900-12-25
+1900-05-05 12:34:56.1173,1900-12-25
+1900-05-05 12:34:56.1174,1900-12-25
+1900-05-05 12:34:56.1175,1900-12-25
+1900-05-05 12:34:56.1176,1900-12-25
+1900-05-05 12:34:56.1177,1900-12-25
+1900-05-05 12:34:56.1178,1900-12-25
+1900-05-05 12:34:56.1179,1900-12-25
+1900-05-05 12:34:56.118,1900-12-25
+1900-05-05 12:34:56.1181,1900-12-25
+1900-05-05 12:34:56.1182,1900-12-25
+1900-05-05 12:34:56.1183,1900-12-25
+1900-05-05 12:34:56.1184,1900-12-25
+1900-05-05 12:34:56.1185,1900-12-25
+1900-05-05 12:34:56.1186,1900-12-25
+1900-05-05 12:34:56.1187,1900-12-25
+1900-05-05 12:34:56.1188,1900-12-25
+1900-05-05 12:34:56.1189,1900-12-25
+1900-05-05 12:34:56.119,1900-12-25
+1900-05-05 12:34:56.1191,1900-12-25
+1900-05-05 12:34:56.1192,1900-12-25
+1900-05-05 12:34:56.1193,1900-12-25
+1900-05-05 12:34:56.1194,1900-12-25
+1900-05-05 12:34:56.1195,1900-12-25
+1900-05-05 12:34:56.1196,1900-12-25
+1900-05-05 12:34:56.1197,1900-12-25
+1900-05-05 12:34:56.1198,1900-12-25
+1900-05-05 12:34:56.1199,1900-12-25
+1900-05-05 12:34:56.12,1900-12-25
+1900-05-05 12:34:56.1201,1900-12-25
+1900-05-05 12:34:56.1202,1900-12-25
+1900-05-05 12:34:56.1203,1900-12-25
+1900-05-05 12:34:56.1204,1900-12-25
+1900-05-05 12:34:56.1205,1900-12-25
+1900-05-05 12:34:56.1206,1900-12-25
+1900-05-05 12:34:56.1207,1900-12-25
+1900-05-05 12:34:56.1208,1900-12-25
+1900-05-05 12:34:56.1209,1900-12-25
+1900-05-05 12:34:56.121,1900-12-25
+1900-05-05 12:34:56.1211,1900-12-25
+1900-05-05 12:34:56.1212,1900-12-25
+1900-05-05 12:34:56.1213,1900-12-25
+1900-05-05 12:34:56.1214,1900-12-25
+1900-05-05 12:34:56.1215,1900-12-25
+1900-05-05 12:34:56.1216,1900-12-25
+1900-05-05 12:34:56.1217,1900-12-25
+1900-05-05 12:34:56.1218,1900-12-25
+1900-05-05 12:34:56.1219,1900-12-25
+1900-05-05 12:34:56.122,1900-12-25
+1900-05-05 12:34:56.1221,1900-12-25
+1900-05-05 12:34:56.1222,1900-12-25
+1900-05-05 12:34:56.1223,1900-12-25
+1900-05-05 12:34:56.1224,1900-12-25
+1900-05-05 12:34:56.1225,1900-12-25
+1900-05-05 12:34:56.1226,1900-12-25
+1900-05-05 12:34:56.1227,1900-12-25
+1900-05-05 12:34:56.1228,1900-12-25
+1900-05-05 12:34:56.1229,1900-12-25
+1900-05-05 12:34:56.123,1900-12-25
+1900-05-05 12:34:56.1231,1900-12-25
+1900-05-05 12:34:56.1232,1900-12-25
+1900-05-05 12:34:56.1233,1900-12-25
+1900-05-05 12:34:56.1234,1900-12-25
+1900-05-05 12:34:56.1235,1900-12-25
+1900-05-05 12:34:56.1236,1900-12-25
+1900-05-05 12:34:56.1237,1900-12-25
+1900-05-05 12:34:56.1238,1900-12-25
+1900-05-05 12:34:56.1239,1900-12-25
+1900-05-05 12:34:56.124,1900-12-25
+1900-05-05 12:34:56.1241,1900-12-25
+1900-05-05 12:34:56.1242,1900-12-25
+1900-05-05 12:34:56.1243,1900-12-25
+1900-05-05 12:34:56.1244,1900-12-25
+1900-05-05 12:34:56.1245,1900-12-25
+1900-05-05 12:34:56.1246,1900-12-25
+1900-05-05 12:34:56.1247,1900-12-25
+1900-05-05 12:34:56.1248,1900-12-25
+1900-05-05 12:34:56.1249,1900-12-25
+1900-05-05 12:34:56.125,1900-12-25
+1900-05-05 12:34:56.1251,1900-12-25
+1900-05-05 12:34:56.1252,1900-12-25
+1900-05-05 12:34:56.1253,1900-12-25
+1900-05-05 12:34:56.1254,1900-12-25
+1900-05-05 12:34:56.1255,1900-12-25
+1900-05-05 12:34:56.1256,1900-12-25
+1900-05-05 12:34:56.1257,1900-12-25
+1900-05-05 12:34:56.1258,1900-12-25
+1900-05-05 12:34:56.1259,1900-12-25
+1900-05-05 12:34:56.126,1900-12-25
+1900-05-05 12:34:56.1261,1900-12-25
+1900-05-05 12:34:56.1262,1900-12-25
+1900-05-05 12:34:56.1263,1900-12-25
+1900-05-05 12:34:56.1264,1900-12-25
+1900-05-05 12:34:56.1265,1900-12-25
+1900-05-05 12:34:56.1266,1900-12-25
+1900-05-05 12:34:56.1267,1900-12-25
+1900-05-05 12:34:56.1268,1900-12-25
+1900-05-05 12:34:56.1269,1900-12-25
+1900-05-05 12:34:56.127,1900-12-25
+1900-05-05 12:34:56.1271,1900-12-25
+1900-05-05 12:34:56.1272,1900-12-25
+1900-05-05 12:34:56.1273,1900-12-25
+1900-05-05 12:34:56.1274,1900-12-25
+1900-05-05 12:34:56.1275,1900-12-25
+1900-05-05 12:34:56.1276,1900-12-25
+1900-05-05 12:34:56.1277,1900-12-25
+1900-05-05 12:34:56.1278,1900-12-25
+1900-05-05 12:34:56.1279,1900-12-25
+1900-05-05 12:34:56.128,1900-12-25
+1900-05-05 12:34:56.1281,1900-12-25
+1900-05-05 12:34:56.1282,1900-12-25
+1900-05-05 12:34:56.1283,1900-12-25
+1900-05-05 12:34:56.1284,1900-12-25
+1900-05-05 12:34:56.1285,1900-12-25
+1900-05-05 12:34:56.1286,1900-12-25
+1900-05-05 12:34:56.1287,1900-12-25
+1900-05-05 12:34:56.1288,1900-12-25
+1900-05-05 12:34:56.1289,1900-12-25
+1900-05-05 12:34:56.129,1900-12-25
+1900-05-05 12:34:56.1291,1900-12-25
+1900-05-05 12:34:56.1292,1900-12-25
+1900-05-05 12:34:56.1293,1900-12-25
+1900-05-05 12:34:56.1294,1900-12-25
+1900-05-05 12:34:56.1295,1900-12-25
+1900-05-05 12:34:56.1296,1900-12-25
+1900-05-05 12:34:56.1297,1900-12-25
+1900-05-05 12:34:56.1298,1900-12-25
+1900-05-05 12:34:56.1299,1900-12-25
+1900-05-05 12:34:56.13,1900-12-25
+1900-05-05 12:34:56.1301,1900-12-25
+1900-05-05 12:34:56.1302,1900-12-25
+1900-05-05 12:34:56.1303,1900-12-25
+1900-05-05 12:34:56.1304,1900-12-25
+1900-05-05 12:34:56.1305,1900-12-25
+1900-05-05 12:34:56.1306,1900-12-25
+1900-05-05 12:34:56.1307,1900-12-25
+1900-05-05 12:34:56.1308,1900-12-25
+1900-05-05 12:34:56.1309,1900-12-25
+1900-05-05 12:34:56.131,1900-12-25
+1900-05-05 12:34:56.1311,1900-12-25
+1900-05-05 12:34:56.1312,1900-12-25
+1900-05-05 12:34:56.1313,1900-12-25
+1900-05-05 12:34:56.1314,1900-12-25
+1900-05-05 12:34:56.1315,1900-12-25
+1900-05-05 12:34:56.1316,1900-12-25
+1900-05-05 12:34:56.1317,1900-12-25
+1900-05-05 12:34:56.1318,1900-12-25
+1900-05-05 12:34:56.1319,1900-12-25
+1900-05-05 12:34:56.132,1900-12-25
+1900-05-05 12:34:56.1321,1900-12-25
+1900-05-05 12:34:56.1322,1900-12-25
+1900-05-05 12:34:56.1323,1900-12-25
+1900-05-05 12:34:56.1324,1900-12-25
+1900-05-05 12:34:56.1325,1900-12-25
+1900-05-05 12:34:56.1326,1900-12-25
+1900-05-05 12:34:56.1327,1900-12-25
+1900-05-05 12:34:56.1328,1900-12-25
+1900-05-05 12:34:56.1329,1900-12-25
+1900-05-05 12:34:56.133,1900-12-25
+1900-05-05 12:34:56.1331,1900-12-25
+1900-05-05 12:34:56.1332,1900-12-25
+1900-05-05 12:34:56.1333,1900-12-25
+1900-05-05 12:34:56.1334,1900-12-25
+1900-05-05 12:34:56.1335,1900-12-25
+1900-05-05 12:34:56.1336,1900-12-25
+1900-05-05 12:34:56.1337,1900-12-25
+1900-05-05 12:34:56.1338,1900-12-25
+1900-05-05 12:34:56.1339,1900-12-25
+1900-05-05 12:34:56.134,1900-12-25
+1900-05-05 12:34:56.1341,1900-12-25
+1900-05-05 12:34:56.1342,1900-12-25
+1900-05-05 12:34:56.1343,1900-12-25
+1900-05-05 12:34:56.1344,1900-12-25
+1900-05-05 12:34:56.1345,1900-12-25
+1900-05-05 12:34:56.1346,1900-12-25
+1900-05-05 12:34:56.1347,1900-12-25
+1900-05-05 12:34:56.1348,1900-12-25
+1900-05-05 12:34:56.1349,1900-12-25
+1900-05-05 12:34:56.135,1900-12-25
+1900-05-05 12:34:56.1351,1900-12-25
+1900-05-05 12:34:56.1352,1900-12-25
+1900-05-05 12:34:56.1353,1900-12-25
+1900-05-05 12:34:56.1354,1900-12-25
+1900-05-05 12:34:56.1355,1900-12-25
+1900-05-05 12:34:56.1356,1900-12-25
+1900-05-05 12:34:56.1357,1900-12-25
+1900-05-05 12:34:56.1358,1900-12-25
+1900-05-05 12:34:56.1359,1900-12-25
+1900-05-05 12:34:56.136,1900-12-25
+1900-05-05 12:34:56.1361,1900-12-25
+1900-05-05 12:34:56.1362,1900-12-25
+1900-05-05 12:34:56.1363,1900-12-25
+1900-05-05 12:34:56.1364,1900-12-25
+1900-05-05 12:34:56.1365,1900-12-25
+1900-05-05 12:34:56.1366,1900-12-25
+1900-05-05 12:34:56.1367,1900-12-25
+1900-05-05 12:34:56.1368,1900-12-25
+1900-05-05 12:34:56.1369,1900-12-25
+1900-05-05 12:34:56.137,1900-12-25
+1900-05-05 12:34:56.1371,1900-12-25
+1900-05-05 12:34:56.1372,1900-12-25
+1900-05-05 12:34:56.1373,1900-12-25
+1900-05-05 12:34:56.1374,1900-12-25
+1900-05-05 12:34:56.1375,1900-12-25
+1900-05-05 12:34:56.1376,1900-12-25
+1900-05-05 12:34:56.1377,1900-12-25
+1900-05-05 12:34:56.1378,1900-12-25
+1900-05-05 12:34:56.1379,1900-12-25
+1900-05-05 12:34:56.138,1900-12-25
+1900-05-05 12:34:56.1381,1900-12-25
+1900-05-05 12:34:56.1382,1900-12-25
+1900-05-05 12:34:56.1383,1900-12-25
+1900-05-05 12:34:56.1384,1900-12-25
+1900-05-05 12:34:56.1385,1900-12-25
+1900-05-05 12:34:56.1386,1900-12-25
+1900-05-05 12:34:56.1387,1900-12-25
+1900-05-05 12:34:56.1388,1900-12-25
+1900-05-05 12:34:56.1389,1900-12-25
+1900-05-05 12:34:56.139,1900-12-25
+1900-05-05 12:34:56.1391,1900-12-25
+1900-05-05 12:34:56.1392,1900-12-25
+1900-05-05 12:34:56.1393,1900-12-25
+1900-05-05 12:34:56.1394,1900-12-25
+1900-05-05 12:34:56.1395,1900-12-25
+1900-05-05 12:34:56.1396,1900-12-25
+1900-05-05 12:34:56.1397,1900-12-25
+1900-05-05 12:34:56.1398,1900-12-25
+1900-05-05 12:34:56.1399,1900-12-25
+1900-05-05 12:34:56.14,1900-12-25
+1900-05-05 12:34:56.1401,1900-12-25
+1900-05-05 12:34:56.1402,1900-12-25
+1900-05-05 12:34:56.1403,1900-12-25
+1900-05-05 12:34:56.1404,1900-12-25
+1900-05-05 12:34:56.1405,1900-12-25
+1900-05-05 12:34:56.1406,1900-12-25
+1900-05-05 12:34:56.1407,1900-12-25
+1900-05-05 12:34:56.1408,1900-12-25
+1900-05-05 12:34:56.1409,1900-12-25
+1900-05-05 12:34:56.141,1900-12-25
+1900-05-05 12:34:56.1411,1900-12-25
+1900-05-05 12:34:56.1412,1900-12-25
+1900-05-05 12:34:56.1413,1900-12-25
+1900-05-05 12:34:56.1414,1900-12-25
+1900-05-05 12:34:56.1415,1900-12-25
+1900-05-05 12:34:56.1416,1900-12-25
+1900-05-05 12:34:56.1417,1900-12-25
+1900-05-05 12:34:56.1418,1900-12-25
+1900-05-05 12:34:56.1419,1900-12-25
+1900-05-05 12:34:56.142,1900-12-25
+1900-05-05 12:34:56.1421,1900-12-25
+1900-05-05 12:34:56.1422,1900-12-25
+1900-05-05 12:34:56.1423,1900-12-25
+1900-05-05 12:34:56.1424,1900-12-25
+1900-05-05 12:34:56.1425,1900-12-25
+1900-05-05 12:34:56.1426,1900-12-25
+1900-05-05 12:34:56.1427,1900-12-25
+1900-05-05 12:34:56.1428,1900-12-25
+1900-05-05 12:34:56.1429,1900-12-25
+1900-05-05 12:34:56.143,1900-12-25
+1900-05-05 12:34:56.1431,1900-12-25
+1900-05-05 12:34:56.1432,1900-12-25
+1900-05-05 12:34:56.1433,1900-12-25
+1900-05-05 12:34:56.1434,1900-12-25
+1900-05-05 12:34:56.1435,1900-12-25
+1900-05-05 12:34:56.1436,1900-12-25
+1900-05-05 12:34:56.1437,1900-12-25
+1900-05-05 12:34:56.1438,1900-12-25
+1900-05-05 12:34:56.1439,1900-12-25
+1900-05-05 12:34:56.144,1900-12-25
+1900-05-05 12:34:56.1441,1900-12-25
+1900-05-05 12:34:56.1442,1900-12-25
+1900-05-05 12:34:56.1443,1900-12-25
+1900-05-05 12:34:56.1444,1900-12-25
+1900-05-05 12:34:56.1445,1900-12-25
+1900-05-05 12:34:56.1446,1900-12-25
+1900-05-05 12:34:56.1447,1900-12-25
+1900-05-05 12:34:56.1448,1900-12-25
+1900-05-05 12:34:56.1449,1900-12-25
+1900-05-05 12:34:56.145,1900-12-25
+1900-05-05 12:34:56.1451,1900-12-25
+1900-05-05 12:34:56.1452,1900-12-25
+1900-05-05 12:34:56.1453,1900-12-25
+1900-05-05 12:34:56.1454,1900-12-25
+1900-05-05 12:34:56.1455,1900-12-25
+1900-05-05 12:34:56.1456,1900-12-25
+1900-05-05 12:34:56.1457,1900-12-25
+1900-05-05 12:34:56.1458,1900-12-25
+1900-05-05 12:34:56.1459,1900-12-25
+1900-05-05 12:34:56.146,1900-12-25
+1900-05-05 12:34:56.1461,1900-12-25
+1900-05-05 12:34:56.1462,1900-12-25
+1900-05-05 12:34:56.1463,1900-12-25
+1900-05-05 12:34:56.1464,1900-12-25
+1900-05-05 12:34:56.1465,1900-12-25
+1900-05-05 12:34:56.1466,1900-12-25
+1900-05-05 12:34:56.1467,1900-12-25
+1900-05-05 12:34:56.1468,1900-12-25
+1900-05-05 12:34:56.1469,1900-12-25
+1900-05-05 12:34:56.147,1900-12-25
+1900-05-05 12:34:56.1471,1900-12-25
+1900-05-05 12:34:56.1472,1900-12-25
+1900-05-05 12:34:56.1473,1900-12-25
+1900-05-05 12:34:56.1474,1900-12-25
+1900-05-05 12:34:56.1475,1900-12-25
+1900-05-05 12:34:56.1476,1900-12-25
+1900-05-05 12:34:56.1477,1900-12-25
+1900-05-05 12:34:56.1478,1900-12-25
+1900-05-05 12:34:56.1479,1900-12-25
+1900-05-05 12:34:56.148,1900-12-25
+1900-05-05 12:34:56.1481,1900-12-25
+1900-05-05 12:34:56.1482,1900-12-25
+1900-05-05 12:34:56.1483,1900-12-25
+1900-05-05 12:34:56.1484,1900-12-25
+1900-05-05 12:34:56.1485,1900-12-25
+1900-05-05 12:34:56.1486,1900-12-25
+1900-05-05 12:34:56.1487,1900-12-25
+1900-05-05 12:34:56.1488,1900-12-25
+1900-05-05 12:34:56.1489,1900-12-25
+1900-05-05 12:34:56.149,1900-12-25
+1900-05-05 12:34:56.1491,1900-12-25
+1900-05-05 12:34:56.1492,1900-12-25
+1900-05-05 12:34:56.1493,1900-12-25
+1900-05-05 12:34:56.1494,1900-12-25
+1900-05-05 12:34:56.1495,1900-12-25
+1900-05-05 12:34:56.1496,1900-12-25
+1900-05-05 12:34:56.1497,1900-12-25
+1900-05-05 12:34:56.1498,1900-12-25
+1900-05-05 12:34:56.1499,1900-12-25
+1900-05-05 12:34:56.15,1900-12-25
+1900-05-05 12:34:56.1501,1900-12-25
+1900-05-05 12:34:56.1502,1900-12-25
+1900-05-05 12:34:56.1503,1900-12-25
+1900-05-05 12:34:56.1504,1900-12-25
+1900-05-05 12:34:56.1505,1900-12-25
+1900-05-05 12:34:56.1506,1900-12-25
+1900-05-05 12:34:56.1507,1900-12-25
+1900-05-05 12:34:56.1508,1900-12-25
+1900-05-05 12:34:56.1509,1900-12-25
+1900-05-05 12:34:56.151,1900-12-25
+1900-05-05 12:34:56.1511,1900-12-25
+1900-05-05 12:34:56.1512,1900-12-25
+1900-05-05 12:34:56.1513,1900-12-25
+1900-05-05 12:34:56.1514,1900-12-25
+1900-05-05 12:34:56.1515,1900-12-25
+1900-05-05 12:34:56.1516,1900-12-25
+1900-05-05 12:34:56.1517,1900-12-25
+1900-05-05 12:34:56.1518,1900-12-25
+1900-05-05 12:34:56.1519,1900-12-25
+1900-05-05 12:34:56.152,1900-12-25
+1900-05-05 12:34:56.1521,1900-12-25
+1900-05-05 12:34:56.1522,1900-12-25
+1900-05-05 12:34:56.1523,1900-12-25
+1900-05-05 12:34:56.1524,1900-12-25
+1900-05-05 12:34:56.1525,1900-12-25
+1900-05-05 12:34:56.1526,1900-12-25
+1900-05-05 12:34:56.1527,1900-12-25
+1900-05-05 12:34:56.1528,1900-12-25
+1900-05-05 12:34:56.1529,1900-12-25
+1900-05-05 12:34:56.153,1900-12-25
+1900-05-05 12:34:56.1531,1900-12-25
+1900-05-05 12:34:56.1532,1900-12-25
+1900-05-05 12:34:56.1533,1900-12-25
+1900-05-05 12:34:56.1534,1900-12-25
+1900-05-05 12:34:56.1535,1900-12-25
+1900-05-05 12:34:56.1536,1900-12-25
+1900-05-05 12:34:56.1537,1900-12-25
+1900-05-05 12:34:56.1538,1900-12-25
+1900-05-05 12:34:56.1539,1900-12-25
+1900-05-05 12:34:56.154,1900-12-25
+1900-05-05 12:34:56.1541,1900-12-25
+1900-05-05 12:34:56.1542,1900-12-25
+1900-05-05 12:34:56.1543,1900-12-25
+1900-05-05 12:34:56.1544,1900-12-25
+1900-05-05 12:34:56.1545,1900-12-25
+1900-05-05 12:34:56.1546,1900-12-25
+1900-05-05 12:34:56.1547,1900-12-25
+1900-05-05 12:34:56.1548,1900-12-25
+1900-05-05 12:34:56.1549,1900-12-25
+1900-05-05 12:34:56.155,1900-12-25
+1900-05-05 12:34:56.1551,1900-12-25
+1900-05-05 12:34:56.1552,1900-12-25
+1900-05-05 12:34:56.1553,1900-12-25
+1900-05-05 12:34:56.1554,1900-12-25
+1900-05-05 12:34:56.1555,1900-12-25
+1900-05-05 12:34:56.1556,1900-12-25
+1900-05-05 12:34:56.1557,1900-12-25
+1900-05-05 12:34:56.1558,1900-12-25
+1900-05-05 12:34:56.1559,1900-12-25
+1900-05-05 12:34:56.156,1900-12-25
+1900-05-05 12:34:56.1561,1900-12-25
+1900-05-05 12:34:56.1562,1900-12-25
+1900-05-05 12:34:56.1563,1900-12-25
+1900-05-05 12:34:56.1564,1900-12-25
+1900-05-05 12:34:56.1565,1900-12-25
+1900-05-05 12:34:56.1566,1900-12-25
+1900-05-05 12:34:56.1567,1900-12-25
+1900-05-05 12:34:56.1568,1900-12-25
+1900-05-05 12:34:56.1569,1900-12-25
+1900-05-05 12:34:56.157,1900-12-25
+1900-05-05 12:34:56.1571,1900-12-25
+1900-05-05 12:34:56.1572,1900-12-25
+1900-05-05 12:34:56.1573,1900-12-25
+1900-05-05 12:34:56.1574,1900-12-25
+1900-05-05 12:34:56.1575,1900-12-25
+1900-05-05 12:34:56.1576,1900-12-25
+1900-05-05 12:34:56.1577,1900-12-25
+1900-05-05 12:34:56.1578,1900-12-25
+1900-05-05 12:34:56.1579,1900-12-25
+1900-05-05 12:34:56.158,1900-12-25
+1900-05-05 12:34:56.1581,1900-12-25
+1900-05-05 12:34:56.1582,1900-12-25
+1900-05-05 12:34:56.1583,1900-12-25
+1900-05-05 12:34:56.1584,1900-12-25
+1900-05-05 12:34:56.1585,1900-12-25
+1900-05-05 12:34:56.1586,1900-12-25
+1900-05-05 12:34:56.1587,1900-12-25
+1900-05-05 12:34:56.1588,1900-12-25
+1900-05-05 12:34:56.1589,1900-12-25
+1900-05-05 12:34:56.159,1900-12-25
+1900-05-05 12:34:56.1591,1900-12-25
+1900-05-05 12:34:56.1592,1900-12-25
+1900-05-05 12:34:56.1593,1900-12-25
+1900-05-05 12:34:56.1594,1900-12-25
+1900-05-05 12:34:56.1595,1900-12-25
+1900-05-05 12:34:56.1596,1900-12-25
+1900-05-05 12:34:56.1597,1900-12-25
+1900-05-05 12:34:56.1598,1900-12-25
+1900-05-05 12:34:56.1599,1900-12-25
+1900-05-05 12:34:56.16,1900-12-25
+1900-05-05 12:34:56.1601,1900-12-25
+1900-05-05 12:34:56.1602,1900-12-25
+1900-05-05 12:34:56.1603,1900-12-25
+1900-05-05 12:34:56.1604,1900-12-25
+1900-05-05 12:34:56.1605,1900-12-25
+1900-05-05 12:34:56.1606,1900-12-25
+1900-05-05 12:34:56.1607,1900-12-25
+1900-05-05 12:34:56.1608,1900-12-25
+1900-05-05 12:34:56.1609,1900-12-25
+1900-05-05 12:34:56.161,1900-12-25
+1900-05-05 12:34:56.1611,1900-12-25
+1900-05-05 12:34:56.1612,1900-12-25
+1900-05-05 12:34:56.1613,1900-12-25
+1900-05-05 12:34:56.1614,1900-12-25
+1900-05-05 12:34:56.1615,1900-12-25
+1900-05-05 12:34:56.1616,1900-12-25
+1900-05-05 12:34:56.1617,1900-12-25
+1900-05-05 12:34:56.1618,1900-12-25
+1900-05-05 12:34:56.1619,1900-12-25
+1900-05-05 12:34:56.162,1900-12-25
+1900-05-05 12:34:56.1621,1900-12-25
+1900-05-05 12:34:56.1622,1900-12-25
+1900-05-05 12:34:56.1623,1900-12-25
+1900-05-05 12:34:56.1624,1900-12-25
+1900-05-05 12:34:56.1625,1900-12-25
+1900-05-05 12:34:56.1626,1900-12-25
+1900-05-05 12:34:56.1627,1900-12-25
+1900-05-05 12:34:56.1628,1900-12-25
+1900-05-05 12:34:56.1629,1900-12-25
+1900-05-05 12:34:56.163,1900-12-25
+1900-05-05 12:34:56.1631,1900-12-25
+1900-05-05 12:34:56.1632,1900-12-25
+1900-05-05 12:34:56.1633,1900-12-25
+1900-05-05 12:34:56.1634,1900-12-25
+1900-05-05 12:34:56.1635,1900-12-25
+1900-05-05 12:34:56.1636,1900-12-25
+1900-05-05 12:34:56.1637,1900-12-25
+1900-05-05 12:34:56.1638,1900-12-25
+1900-05-05 12:34:56.1639,1900-12-25
+1900-05-05 12:34:56.164,1900-12-25
+1900-05-05 12:34:56.1641,1900-12-25
+1900-05-05 12:34:56.1642,1900-12-25
+1900-05-05 12:34:56.1643,1900-12-25
+1900-05-05 12:34:56.1644,1900-12-25
+1900-05-05 12:34:56.1645,1900-12-25
+1900-05-05 12:34:56.1646,1900-12-25
+1900-05-05 12:34:56.1647,1900-12-25
+1900-05-05 12:34:56.1648,1900-12-25
+1900-05-05 12:34:56.1649,1900-12-25
+1900-05-05 12:34:56.165,1900-12-25
+1900-05-05 12:34:56.1651,1900-12-25
+1900-05-05 12:34:56.1652,1900-12-25
+1900-05-05 12:34:56.1653,1900-12-25
+1900-05-05 12:34:56.1654,1900-12-25
+1900-05-05 12:34:56.1655,1900-12-25
+1900-05-05 12:34:56.1656,1900-12-25
+1900-05-05 12:34:56.1657,1900-12-25
+1900-05-05 12:34:56.1658,1900-12-25
+1900-05-05 12:34:56.1659,1900-12-25
+1900-05-05 12:34:56.166,1900-12-25
+1900-05-05 12:34:56.1661,1900-12-25
+1900-05-05 12:34:56.1662,1900-12-25
+1900-05-05 12:34:56.1663,1900-12-25
+1900-05-05 12:34:56.1664,1900-12-25
+1900-05-05 12:34:56.1665,1900-12-25
+1900-05-05 12:34:56.1666,1900-12-25
+1900-05-05 12:34:56.1667,1900-12-25
+1900-05-05 12:34:56.1668,1900-12-25
+1900-05-05 12:34:56.1669,1900-12-25
+1900-05-05 12:34:56.167,1900-12-25
+1900-05-05 12:34:56.1671,1900-12-25
+1900-05-05 12:34:56.1672,1900-12-25
+1900-05-05 12:34:56.1673,1900-12-25
+1900-05-05 12:34:56.1674,1900-12-25
+1900-05-05 12:34:56.1675,1900-12-25
+1900-05-05 12:34:56.1676,1900-12-25
+1900-05-05 12:34:56.1677,1900-12-25
+1900-05-05 12:34:56.1678,1900-12-25
+1900-05-05 12:34:56.1679,1900-12-25
+1900-05-05 12:34:56.168,1900-12-25
+1900-05-05 12:34:56.1681,1900-12-25
+1900-05-05 12:34:56.1682,1900-12-25
+1900-05-05 12:34:56.1683,1900-12-25
+1900-05-05 12:34:56.1684,1900-12-25
+1900-05-05 12:34:56.1685,1900-12-25
+1900-05-05 12:34:56.1686,1900-12-25
+1900-05-05 12:34:56.1687,1900-12-25
+1900-05-05 12:34:56.1688,1900-12-25
+1900-05-05 12:34:56.1689,1900-12-25
+1900-05-05 12:34:56.169,1900-12-25
+1900-05-05 12:34:56.1691,1900-12-25
+1900-05-05 12:34:56.1692,1900-12-25
+1900-05-05 12:34:56.1693,1900-12-25
+1900-05-05 12:34:56.1694,1900-12-25
+1900-05-05 12:34:56.1695,1900-12-25
+1900-05-05 12:34:56.1696,1900-12-25
+1900-05-05 12:34:56.1697,1900-12-25
+1900-05-05 12:34:56.1698,1900-12-25
+1900-05-05 12:34:56.1699,1900-12-25
+1900-05-05 12:34:56.17,1900-12-25
+1900-05-05 12:34:56.1701,1900-12-25
+1900-05-05 12:34:56.1702,1900-12-25
+1900-05-05 12:34:56.1703,1900-12-25
+1900-05-05 12:34:56.1704,1900-12-25
+1900-05-05 12:34:56.1705,1900-12-25
+1900-05-05 12:34:56.1706,1900-12-25
+1900-05-05 12:34:56.1707,1900-12-25
+1900-05-05 12:34:56.1708,1900-12-25
+1900-05-05 12:34:56.1709,1900-12-25
+1900-05-05 12:34:56.171,1900-12-25
+1900-05-05 12:34:56.1711,1900-12-25
+1900-05-05 12:34:56.1712,1900-12-25
+1900-05-05 12:34:56.1713,1900-12-25
+1900-05-05 12:34:56.1714,1900-12-25
+1900-05-05 12:34:56.1715,1900-12-25
+1900-05-05 12:34:56.1716,1900-12-25
+1900-05-05 12:34:56.1717,1900-12-25
+1900-05-05 12:34:56.1718,1900-12-25
+1900-05-05 12:34:56.1719,1900-12-25
+1900-05-05 12:34:56.172,1900-12-25
+1900-05-05 12:34:56.1721,1900-12-25
+1900-05-05 12:34:56.1722,1900-12-25
+1900-05-05 12:34:56.1723,1900-12-25
+1900-05-05 12:34:56.1724,1900-12-25
+1900-05-05 12:34:56.1725,1900-12-25
+1900-05-05 12:34:56.1726,1900-12-25
+1900-05-05 12:34:56.1727,1900-12-25
+1900-05-05 12:34:56.1728,1900-12-25
+1900-05-05 12:34:56.1729,1900-12-25
+1900-05-05 12:34:56.173,1900-12-25
+1900-05-05 12:34:56.1731,1900-12-25
+1900-05-05 12:34:56.1732,1900-12-25
+1900-05-05 12:34:56.1733,1900-12-25
+1900-05-05 12:34:56.1734,1900-12-25
+1900-05-05 12:34:56.1735,1900-12-25
+1900-05-05 12:34:56.1736,1900-12-25
+1900-05-05 12:34:56.1737,1900-12-25
+1900-05-05 12:34:56.1738,1900-12-25
+1900-05-05 12:34:56.1739,1900-12-25
+1900-05-05 12:34:56.174,1900-12-25
+1900-05-05 12:34:56.1741,1900-12-25
+1900-05-05 12:34:56.1742,1900-12-25
+1900-05-05 12:34:56.1743,1900-12-25
+1900-05-05 12:34:56.1744,1900-12-25
+1900-05-05 12:34:56.1745,1900-12-25
+1900-05-05 12:34:56.1746,1900-12-25
+1900-05-05 12:34:56.1747,1900-12-25
+1900-05-05 12:34:56.1748,1900-12-25
+1900-05-05 12:34:56.1749,1900-12-25
+1900-05-05 12:34:56.175,1900-12-25
+1900-05-05 12:34:56.1751,1900-12-25
+1900-05-05 12:34:56.1752,1900-12-25
+1900-05-05 12:34:56.1753,1900-12-25
+1900-05-05 12:34:56.1754,1900-12-25
+1900-05-05 12:34:56.1755,1900-12-25
+1900-05-05 12:34:56.1756,1900-12-25
+1900-05-05 12:34:56.1757,1900-12-25
+1900-05-05 12:34:56.1758,1900-12-25
+1900-05-05 12:34:56.1759,1900-12-25
+1900-05-05 12:34:56.176,1900-12-25
+1900-05-05 12:34:56.1761,1900-12-25
+1900-05-05 12:34:56.1762,1900-12-25
+1900-05-05 12:34:56.1763,1900-12-25
+1900-05-05 12:34:56.1764,1900-12-25
+1900-05-05 12:34:56.1765,1900-12-25
+1900-05-05 12:34:56.1766,1900-12-25
+1900-05-05 12:34:56.1767,1900-12-25
+1900-05-05 12:34:56.1768,1900-12-25
+1900-05-05 12:34:56.1769,1900-12-25
+1900-05-05 12:34:56.177,1900-12-25
+1900-05-05 12:34:56.1771,1900-12-25
+1900-05-05 12:34:56.1772,1900-12-25
+1900-05-05 12:34:56.1773,1900-12-25
+1900-05-05 12:34:56.1774,1900-12-25
+1900-05-05 12:34:56.1775,1900-12-25
+1900-05-05 12:34:56.1776,1900-12-25
+1900-05-05 12:34:56.1777,1900-12-25
+1900-05-05 12:34:56.1778,1900-12-25
+1900-05-05 12:34:56.1779,1900-12-25
+1900-05-05 12:34:56.178,1900-12-25
+1900-05-05 12:34:56.1781,1900-12-25
+1900-05-05 12:34:56.1782,1900-12-25
+1900-05-05 12:34:56.1783,1900-12-25
+1900-05-05 12:34:56.1784,1900-12-25
+1900-05-05 12:34:56.1785,1900-12-25
+1900-05-05 12:34:56.1786,1900-12-25
+1900-05-05 12:34:56.1787,1900-12-25
+1900-05-05 12:34:56.1788,1900-12-25
+1900-05-05 12:34:56.1789,1900-12-25
+1900-05-05 12:34:56.179,1900-12-25
+1900-05-05 12:34:56.1791,1900-12-25
+1900-05-05 12:34:56.1792,1900-12-25
+1900-05-05 12:34:56.1793,1900-12-25
+1900-05-05 12:34:56.1794,1900-12-25
+1900-05-05 12:34:56.1795,1900-12-25
+1900-05-05 12:34:56.1796,1900-12-25
+1900-05-05 12:34:56.1797,1900-12-25
+1900-05-05 12:34:56.1798,1900-12-25
+1900-05-05 12:34:56.1799,1900-12-25
+1900-05-05 12:34:56.18,1900-12-25
+1900-05-05 12:34:56.1801,1900-12-25
+1900-05-05 12:34:56.1802,1900-12-25
+1900-05-05 12:34:56.1803,1900-12-25
+1900-05-05 12:34:56.1804,1900-12-25
+1900-05-05 12:34:56.1805,1900-12-25
+1900-05-05 12:34:56.1806,1900-12-25
+1900-05-05 12:34:56.1807,1900-12-25
+1900-05-05 12:34:56.1808,1900-12-25
+1900-05-05 12:34:56.1809,1900-12-25
+1900-05-05 12:34:56.181,1900-12-25
+1900-05-05 12:34:56.1811,1900-12-25
+1900-05-05 12:34:56.1812,1900-12-25
+1900-05-05 12:34:56.1813,1900-12-25
+1900-05-05 12:34:56.1814,1900-12-25
+1900-05-05 12:34:56.1815,1900-12-25
+1900-05-05 12:34:56.1816,1900-12-25
+1900-05-05 12:34:56.1817,1900-12-25
+1900-05-05 12:34:56.1818,1900-12-25
+1900-05-05 12:34:56.1819,1900-12-25
+1900-05-05 12:34:56.182,1900-12-25
+1900-05-05 12:34:56.1821,1900-12-25
+1900-05-05 12:34:56.1822,1900-12-25
+1900-05-05 12:34:56.1823,1900-12-25
+1900-05-05 12:34:56.1824,1900-12-25
+1900-05-05 12:34:56.1825,1900-12-25
+1900-05-05 12:34:56.1826,1900-12-25
+1900-05-05 12:34:56.1827,1900-12-25
+1900-05-05 12:34:56.1828,1900-12-25
+1900-05-05 12:34:56.1829,1900-12-25
+1900-05-05 12:34:56.183,1900-12-25
+1900-05-05 12:34:56.1831,1900-12-25
+1900-05-05 12:34:56.1832,1900-12-25
+1900-05-05 12:34:56.1833,1900-12-25
+1900-05-05 12:34:56.1834,1900-12-25
+1900-05-05 12:34:56.1835,1900-12-25
+1900-05-05 12:34:56.1836,1900-12-25
+1900-05-05 12:34:56.1837,1900-12-25
+1900-05-05 12:34:56.1838,1900-12-25
+1900-05-05 12:34:56.1839,1900-12-25
+1900-05-05 12:34:56.184,1900-12-25
+1900-05-05 12:34:56.1841,1900-12-25
+1900-05-05 12:34:56.1842,1900-12-25
+1900-05-05 12:34:56.1843,1900-12-25
+1900-05-05 12:34:56.1844,1900-12-25
+1900-05-05 12:34:56.1845,1900-12-25
+1900-05-05 12:34:56.1846,1900-12-25
+1900-05-05 12:34:56.1847,1900-12-25
+1900-05-05 12:34:56.1848,1900-12-25
+1900-05-05 12:34:56.1849,1900-12-25
+1900-05-05 12:34:56.185,1900-12-25
+1900-05-05 12:34:56.1851,1900-12-25
+1900-05-05 12:34:56.1852,1900-12-25
+1900-05-05 12:34:56.1853,1900-12-25
+1900-05-05 12:34:56.1854,1900-12-25
+1900-05-05 12:34:56.1855,1900-12-25
+1900-05-05 12:34:56.1856,1900-12-25
+1900-05-05 12:34:56.1857,1900-12-25
+1900-05-05 12:34:56.1858,1900-12-25
+1900-05-05 12:34:56.1859,1900-12-25
+1900-05-05 12:34:56.186,1900-12-25
+1900-05-05 12:34:56.1861,1900-12-25
+1900-05-05 12:34:56.1862,1900-12-25
+1900-05-05 12:34:56.1863,1900-12-25
+1900-05-05 12:34:56.1864,1900-12-25
+1900-05-05 12:34:56.1865,1900-12-25
+1900-05-05 12:34:56.1866,1900-12-25
+1900-05-05 12:34:56.1867,1900-12-25
+1900-05-05 12:34:56.1868,1900-12-25
+1900-05-05 12:34:56.1869,1900-12-25
+1900-05-05 12:34:56.187,1900-12-25
+1900-05-05 12:34:56.1871,1900-12-25
+1900-05-05 12:34:56.1872,1900-12-25
+1900-05-05 12:34:56.1873,1900-12-25
+1900-05-05 12:34:56.1874,1900-12-25
+1900-05-05 12:34:56.1875,1900-12-25
+1900-05-05 12:34:56.1876,1900-12-25
+1900-05-05 12:34:56.1877,1900-12-25
+1900-05-05 12:34:56.1878,1900-12-25
+1900-05-05 12:34:56.1879,1900-12-25
+1900-05-05 12:34:56.188,1900-12-25
+1900-05-05 12:34:56.1881,1900-12-25
+1900-05-05 12:34:56.1882,1900-12-25
+1900-05-05 12:34:56.1883,1900-12-25
+1900-05-05 12:34:56.1884,1900-12-25
+1900-05-05 12:34:56.1885,1900-12-25
+1900-05-05 12:34:56.1886,1900-12-25
+1900-05-05 12:34:56.1887,1900-12-25
+1900-05-05 12:34:56.1888,1900-12-25
+1900-05-05 12:34:56.1889,1900-12-25
+1900-05-05 12:34:56.189,1900-12-25
+1900-05-05 12:34:56.1891,1900-12-25
+1900-05-05 12:34:56.1892,1900-12-25
+1900-05-05 12:34:56.1893,1900-12-25
+1900-05-05 12:34:56.1894,1900-12-25
+1900-05-05 12:34:56.1895,1900-12-25
+1900-05-05 12:34:56.1896,1900-12-25
+1900-05-05 12:34:56.1897,1900-12-25
+1900-05-05 12:34:56.1898,1900-12-25
+1900-05-05 12:34:56.1899,1900-12-25
+1900-05-05 12:34:56.19,1900-12-25
+1900-05-05 12:34:56.1901,1900-12-25
+1900-05-05 12:34:56.1902,1900-12-25
+1900-05-05 12:34:56.1903,1900-12-25
+1900-05-05 12:34:56.1904,1900-12-25
+1900-05-05 12:34:56.1905,1900-12-25
+1900-05-05 12:34:56.1906,1900-12-25
+1900-05-05 12:34:56.1907,1900-12-25
+1900-05-05 12:34:56.1908,1900-12-25
+1900-05-05 12:34:56.1909,1900-12-25
+1900-05-05 12:34:56.191,1900-12-25
+1900-05-05 12:34:56.1911,1900-12-25
+1900-05-05 12:34:56.1912,1900-12-25
+1900-05-05 12:34:56.1913,1900-12-25
+1900-05-05 12:34:56.1914,1900-12-25
+1900-05-05 12:34:56.1915,1900-12-25
+1900-05-05 12:34:56.1916,1900-12-25
+1900-05-05 12:34:56.1917,1900-12-25
+1900-05-05 12:34:56.1918,1900-12-25
+1900-05-05 12:34:56.1919,1900-12-25
+1900-05-05 12:34:56.192,1900-12-25
+1900-05-05 12:34:56.1921,1900-12-25
+1900-05-05 12:34:56.1922,1900-12-25
+1900-05-05 12:34:56.1923,1900-12-25
+1900-05-05 12:34:56.1924,1900-12-25
+1900-05-05 12:34:56.1925,1900-12-25
+1900-05-05 12:34:56.1926,1900-12-25
+1900-05-05 12:34:56.1927,1900-12-25
+1900-05-05 12:34:56.1928,1900-12-25
+1900-05-05 12:34:56.1929,1900-12-25
+1900-05-05 12:34:56.193,1900-12-25
+1900-05-05 12:34:56.1931,1900-12-25
+1900-05-05 12:34:56.1932,1900-12-25
+1900-05-05 12:34:56.1933,1900-12-25
+1900-05-05 12:34:56.1934,1900-12-25
+1900-05-05 12:34:56.1935,1900-12-25
+1900-05-05 12:34:56.1936,1900-12-25
+1900-05-05 12:34:56.1937,1900-12-25
+1900-05-05 12:34:56.1938,1900-12-25
+1900-05-05 12:34:56.1939,1900-12-25
+1900-05-05 12:34:56.194,1900-12-25
+1900-05-05 12:34:56.1941,1900-12-25
+1900-05-05 12:34:56.1942,1900-12-25
+1900-05-05 12:34:56.1943,1900-12-25
+1900-05-05 12:34:56.1944,1900-12-25
+1900-05-05 12:34:56.1945,1900-12-25
+1900-05-05 12:34:56.1946,1900-12-25
+1900-05-05 12:34:56.1947,1900-12-25
+1900-05-05 12:34:56.1948,1900-12-25
+1900-05-05 12:34:56.1949,1900-12-25
+1900-05-05 12:34:56.195,1900-12-25
+1900-05-05 12:34:56.1951,1900-12-25
+1900-05-05 12:34:56.1952,1900-12-25
+1900-05-05 12:34:56.1953,1900-12-25
+1900-05-05 12:34:56.1954,1900-12-25
+1900-05-05 12:34:56.1955,1900-12-25
+1900-05-05 12:34:56.1956,1900-12-25
+1900-05-05 12:34:56.1957,1900-12-25
+1900-05-05 12:34:56.1958,1900-12-25
+1900-05-05 12:34:56.1959,1900-12-25
+1900-05-05 12:34:56.196,1900-12-25
+1900-05-05 12:34:56.1961,1900-12-25
+1900-05-05 12:34:56.1962,1900-12-25
+1900-05-05 12:34:56.1963,1900-12-25
+1900-05-05 12:34:56.1964,1900-12-25
+1900-05-05 12:34:56.1965,1900-12-25
+1900-05-05 12:34:56.1966,1900-12-25
+1900-05-05 12:34:56.1967,1900-12-25
+1900-05-05 12:34:56.1968,1900-12-25
+1900-05-05 12:34:56.1969,1900-12-25
+1900-05-05 12:34:56.197,1900-12-25
+1900-05-05 12:34:56.1971,1900-12-25
+1900-05-05 12:34:56.1972,1900-12-25
+1900-05-05 12:34:56.1973,1900-12-25
+1900-05-05 12:34:56.1974,1900-12-25
+1900-05-05 12:34:56.1975,1900-12-25
+1900-05-05 12:34:56.1976,1900-12-25
+1900-05-05 12:34:56.1977,1900-12-25
+1900-05-05 12:34:56.1978,1900-12-25
+1900-05-05 12:34:56.1979,1900-12-25
+1900-05-05 12:34:56.198,1900-12-25
+1900-05-05 12:34:56.1981,1900-12-25
+1900-05-05 12:34:56.1982,1900-12-25
+1900-05-05 12:34:56.1983,1900-12-25
+1900-05-05 12:34:56.1984,1900-12-25
+1900-05-05 12:34:56.1985,1900-12-25
+1900-05-05 12:34:56.1986,1900-12-25
+1900-05-05 12:34:56.1987,1900-12-25
+1900-05-05 12:34:56.1988,1900-12-25
+1900-05-05 12:34:56.1989,1900-12-25
+1900-05-05 12:34:56.199,1900-12-25
+1900-05-05 12:34:56.1991,1900-12-25
+1900-05-05 12:34:56.1992,1900-12-25
+1900-05-05 12:34:56.1993,1900-12-25
+1900-05-05 12:34:56.1994,1900-12-25
+1900-05-05 12:34:56.1995,1900-12-25
+1900-05-05 12:34:56.1996,1900-12-25
+1900-05-05 12:34:56.1997,1900-12-25
+1900-05-05 12:34:56.1998,1900-12-25
+1900-05-05 12:34:56.1999,1900-12-25
+1901-05-05 12:34:56.1,1901-12-25
+1901-05-05 12:34:56.1001,1901-12-25
+1901-05-05 12:34:56.1002,1901-12-25
+1901-05-05 12:34:56.1003,1901-12-25
+1901-05-05 12:34:56.1004,1901-12-25
+1901-05-05 12:34:56.1005,1901-12-25
+1901-05-05 12:34:56.1006,1901-12-25
+1901-05-05 12:34:56.1007,1901-12-25
+1901-05-05 12:34:56.1008,1901-12-25
+1901-05-05 12:34:56.1009,1901-12-25
+1901-05-05 12:34:56.101,1901-12-25
+1901-05-05 12:34:56.1011,1901-12-25
+1901-05-05 12:34:56.1012,1901-12-25
+1901-05-05 12:34:56.1013,1901-12-25
+1901-05-05 12:34:56.1014,1901-12-25
+1901-05-05 12:34:56.1015,1901-12-25
+1901-05-05 12:34:56.1016,1901-12-25
+1901-05-05 12:34:56.1017,1901-12-25
+1901-05-05 12:34:56.1018,1901-12-25
+1901-05-05 12:34:56.1019,1901-12-25
+1901-05-05 12:34:56.102,1901-12-25
+1901-05-05 12:34:56.1021,1901-12-25
+1901-05-05 12:34:56.1022,1901-12-25
+1901-05-05 12:34:56.1023,1901-12-25
+1901-05-05 12:34:56.1024,1901-12-25
+1901-05-05 12:34:56.1025,1901-12-25
+1901-05-05 12:34:56.1026,1901-12-25
+1901-05-05 12:34:56.1027,1901-12-25
+1901-05-05 12:34:56.1028,1901-12-25
+1901-05-05 12:34:56.1029,1901-12-25
+1901-05-05 12:34:56.103,1901-12-25
+1901-05-05 12:34:56.1031,1901-12-25
+1901-05-05 12:34:56.1032,1901-12-25
+1901-05-05 12:34:56.1033,1901-12-25
+1901-05-05 12:34:56.1034,1901-12-25
+1901-05-05 12:34:56.1035,1901-12-25
+1901-05-05 12:34:56.1036,1901-12-25
+1901-05-05 12:34:56.1037,1901-12-25
+1901-05-05 12:34:56.1038,1901-12-25
+1901-05-05 12:34:56.1039,1901-12-25
+1901-05-05 12:34:56.104,1901-12-25
+1901-05-05 12:34:56.1041,1901-12-25
+1901-05-05 12:34:56.1042,1901-12-25
+1901-05-05 12:34:56.1043,1901-12-25
+1901-05-05 12:34:56.1044,1901-12-25
+1901-05-05 12:34:56.1045,1901-12-25
+1901-05-05 12:34:56.1046,1901-12-25
+1901-05-05 12:34:56.1047,1901-12-25
+1901-05-05 12:34:56.1048,1901-12-25
+1901-05-05 12:34:56.1049,1901-12-25
+1901-05-05 12:34:56.105,1901-12-25
+1901-05-05 12:34:56.1051,1901-12-25
+1901-05-05 12:34:56.1052,1901-12-25
+1901-05-05 12:34:56.1053,1901-12-25
+1901-05-05 12:34:56.1054,1901-12-25
+1901-05-05 12:34:56.1055,1901-12-25
+1901-05-05 12:34:56.1056,1901-12-25
+1901-05-05 12:34:56.1057,1901-12-25
+1901-05-05 12:34:56.1058,1901-12-25
+1901-05-05 12:34:56.1059,1901-12-25
+1901-05-05 12:34:56.106,1901-12-25
+1901-05-05 12:34:56.1061,1901-12-25
+1901-05-05 12:34:56.1062,1901-12-25
+1901-05-05 12:34:56.1063,1901-12-25
+1901-05-05 12:34:56.1064,1901-12-25
+1901-05-05 12:34:56.1065,1901-12-25
+1901-05-05 12:34:56.1066,1901-12-25
+1901-05-05 12:34:56.1067,1901-12-25
+1901-05-05 12:34:56.1068,1901-12-25
+1901-05-05 12:34:56.1069,1901-12-25
+1901-05-05 12:34:56.107,1901-12-25
+1901-05-05 12:34:56.1071,1901-12-25
+1901-05-05 12:34:56.1072,1901-12-25
+1901-05-05 12:34:56.1073,1901-12-25
+1901-05-05 12:34:56.1074,1901-12-25
+1901-05-05 12:34:56.1075,1901-12-25
+1901-05-05 12:34:56.1076,1901-12-25
+1901-05-05 12:34:56.1077,1901-12-25
+1901-05-05 12:34:56.1078,1901-12-25
+1901-05-05 12:34:56.1079,1901-12-25
+1901-05-05 12:34:56.108,1901-12-25
+1901-05-05 12:34:56.1081,1901-12-25
+1901-05-05 12:34:56.1082,1901-12-25
+1901-05-05 12:34:56.1083,1901-12-25
+1901-05-05 12:34:56.1084,1901-12-25
+1901-05-05 12:34:56.1085,1901-12-25
+1901-05-05 12:34:56.1086,1901-12-25
+1901-05-05 12:34:56.1087,1901-12-25
+1901-05-05 12:34:56.1088,1901-12-25
+1901-05-05 12:34:56.1089,1901-12-25
+1901-05-05 12:34:56.109,1901-12-25
+1901-05-05 12:34:56.1091,1901-12-25
+1901-05-05 12:34:56.1092,1901-12-25
+1901-05-05 12:34:56.1093,1901-12-25
+1901-05-05 12:34:56.1094,1901-12-25
+1901-05-05 12:34:56.1095,1901-12-25
+1901-05-05 12:34:56.1096,1901-12-25
+1901-05-05 12:34:56.1097,1901-12-25
+1901-05-05 12:34:56.1098,1901-12-25
+1901-05-05 12:34:56.1099,1901-12-25
+1901-05-05 12:34:56.11,1901-12-25
+1901-05-05 12:34:56.1101,1901-12-25
+1901-05-05 12:34:56.1102,1901-12-25
+1901-05-05 12:34:56.1103,1901-12-25
+1901-05-05 12:34:56.1104,1901-12-25
+1901-05-05 12:34:56.1105,1901-12-25
+1901-05-05 12:34:56.1106,1901-12-25
+1901-05-05 12:34:56.1107,1901-12-25
+1901-05-05 12:34:56.1108,1901-12-25
+1901-05-05 12:34:56.1109,1901-12-25
+1901-05-05 12:34:56.111,1901-12-25
+1901-05-05 12:34:56.1111,1901-12-25
+1901-05-05 12:34:56.1112,1901-12-25
+1901-05-05 12:34:56.1113,1901-12-25
+1901-05-05 12:34:56.1114,1901-12-25
+1901-05-05 12:34:56.1115,1901-12-25
+1901-05-05 12:34:56.1116,1901-12-25
+1901-05-05 12:34:56.1117,1901-12-25
+1901-05-05 12:34:56.1118,1901-12-25
+1901-05-05 12:34:56.1119,1901-12-25
+1901-05-05 12:34:56.112,1901-12-25
+1901-05-05 12:34:56.1121,1901-12-25
+1901-05-05 12:34:56.1122,1901-12-25
+1901-05-05 12:34:56.1123,1901-12-25
+1901-05-05 12:34:56.1124,1901-12-25
+1901-05-05 12:34:56.1125,1901-12-25
+1901-05-05 12:34:56.1126,1901-12-25
+1901-05-05 12:34:56.1127,1901-12-25
+1901-05-05 12:34:56.1128,1901-12-25
+1901-05-05 12:34:56.1129,1901-12-25
+1901-05-05 12:34:56.113,1901-12-25
+1901-05-05 12:34:56.1131,1901-12-25
+1901-05-05 12:34:56.1132,1901-12-25
+1901-05-05 12:34:56.1133,1901-12-25
+1901-05-05 12:34:56.1134,1901-12-25
+1901-05-05 12:34:56.1135,1901-12-25
+1901-05-05 12:34:56.1136,1901-12-25
+1901-05-05 12:34:56.1137,1901-12-25
+1901-05-05 12:34:56.1138,1901-12-25
+1901-05-05 12:34:56.1139,1901-12-25
+1901-05-05 12:34:56.114,1901-12-25
+1901-05-05 12:34:56.1141,1901-12-25
+1901-05-05 12:34:56.1142,1901-12-25
+1901-05-05 12:34:56.1143,1901-12-25
+1901-05-05 12:34:56.1144,1901-12-25
+1901-05-05 12:34:56.1145,1901-12-25
+1901-05-05 12:34:56.1146,1901-12-25
+1901-05-05 12:34:56.1147,1901-12-25
+1901-05-05 12:34:56.1148,1901-12-25
+1901-05-05 12:34:56.1149,1901-12-25
+1901-05-05 12:34:56.115,1901-12-25
+1901-05-05 12:34:56.1151,1901-12-25
+1901-05-05 12:34:56.1152,1901-12-25
+1901-05-05 12:34:56.1153,1901-12-25
+1901-05-05 12:34:56.1154,1901-12-25
+1901-05-05 12:34:56.1155,1901-12-25
+1901-05-05 12:34:56.1156,1901-12-25
+1901-05-05 12:34:56.1157,1901-12-25
+1901-05-05 12:34:56.1158,1901-12-25
+1901-05-05 12:34:56.1159,1901-12-25
+1901-05-05 12:34:56.116,1901-12-25
+1901-05-05 12:34:56.1161,1901-12-25
+1901-05-05 12:34:56.1162,1901-12-25
+1901-05-05 12:34:56.1163,1901-12-25
+1901-05-05 12:34:56.1164,1901-12-25
+1901-05-05 12:34:56.1165,1901-12-25
+1901-05-05 12:34:56.1166,1901-12-25
+1901-05-05 12:34:56.1167,1901-12-25
+1901-05-05 12:34:56.1168,1901-12-25
+1901-05-05 12:34:56.1169,1901-12-25
+1901-05-05 12:34:56.117,1901-12-25
+1901-05-05 12:34:56.1171,1901-12-25
+1901-05-05 12:34:56.1172,1901-12-25
+1901-05-05 12:34:56.1173,1901-12-25
+1901-05-05 12:34:56.1174,1901-12-25
+1901-05-05 12:34:56.1175,1901-12-25
+1901-05-05 12:34:56.1176,1901-12-25
+1901-05-05 12:34:56.1177,1901-12-25
+1901-05-05 12:34:56.1178,1901-12-25
+1901-05-05 12:34:56.1179,1901-12-25
+1901-05-05 12:34:56.118,1901-12-25
+1901-05-05 12:34:56.1181,1901-12-25
+1901-05-05 12:34:56.1182,1901-12-25
+1901-05-05 12:34:56.1183,1901-12-25
+1901-05-05 12:34:56.1184,1901-12-25
+1901-05-05 12:34:56.1185,1901-12-25
+1901-05-05 12:34:56.1186,1901-12-25
+1901-05-05 12:34:56.1187,1901-12-25
+1901-05-05 12:34:56.1188,1901-12-25
+1901-05-05 12:34:56.1189,1901-12-25
+1901-05-05 12:34:56.119,1901-12-25
+1901-05-05 12:34:56.1191,1901-12-25
+1901-05-05 12:34:56.1192,1901-12-25
+1901-05-05 12:34:56.1193,1901-12-25
+1901-05-05 12:34:56.1194,1901-12-25
+1901-05-05 12:34:56.1195,1901-12-25
+1901-05-05 12:34:56.1196,1901-12-25
+1901-05-05 12:34:56.1197,1901-12-25
+1901-05-05 12:34:56.1198,1901-12-25
+1901-05-05 12:34:56.1199,1901-12-25
+1901-05-05 12:34:56.12,1901-12-25
+1901-05-05 12:34:56.1201,1901-12-25
+1901-05-05 12:34:56.1202,1901-12-25
+1901-05-05 12:34:56.1203,1901-12-25
+1901-05-05 12:34:56.1204,1901-12-25
+1901-05-05 12:34:56.1205,1901-12-25
+1901-05-05 12:34:56.1206,1901-12-25
+1901-05-05 12:34:56.1207,1901-12-25
+1901-05-05 12:34:56.1208,1901-12-25
+1901-05-05 12:34:56.1209,1901-12-25
+1901-05-05 12:34:56.121,1901-12-25
+1901-05-05 12:34:56.1211,1901-12-25
+1901-05-05 12:34:56.1212,1901-12-25
+1901-05-05 12:34:56.1213,1901-12-25
+1901-05-05 12:34:56.1214,1901-12-25
+1901-05-05 12:34:56.1215,1901-12-25
+1901-05-05 12:34:56.1216,1901-12-25
+1901-05-05 12:34:56.1217,1901-12-25
+1901-05-05 12:34:56.1218,1901-12-25
+1901-05-05 12:34:56.1219,1901-12-25
+1901-05-05 12:34:56.122,1901-12-25
+1901-05-05 12:34:56.1221,1901-12-25
+1901-05-05 12:34:56.1222,1901-12-25
+1901-05-05 12:34:56.1223,1901-12-25
+1901-05-05 12:34:56.1224,1901-12-25
+1901-05-05 12:34:56.1225,1901-12-25
+1901-05-05 12:34:56.1226,1901-12-25
+1901-05-05 12:34:56.1227,1901-12-25
+1901-05-05 12:34:56.1228,1901-12-25
+1901-05-05 12:34:56.1229,1901-12-25
+1901-05-05 12:34:56.123,1901-12-25
+1901-05-05 12:34:56.1231,1901-12-25
+1901-05-05 12:34:56.1232,1901-12-25
+1901-05-05 12:34:56.1233,1901-12-25
+1901-05-05 12:34:56.1234,1901-12-25
+1901-05-05 12:34:56.1235,1901-12-25
+1901-05-05 12:34:56.1236,1901-12-25
+1901-05-05 12:34:56.1237,1901-12-25
+1901-05-05 12:34:56.1238,1901-12-25
+1901-05-05 12:34:56.1239,1901-12-25
+1901-05-05 12:34:56.124,1901-12-25
+1901-05-05 12:34:56.1241,1901-12-25
+1901-05-05 12:34:56.1242,1901-12-25
+1901-05-05 12:34:56.1243,1901-12-25
+1901-05-05 12:34:56.1244,1901-12-25
+1901-05-05 12:34:56.1245,1901-12-25
+1901-05-05 12:34:56.1246,1901-12-25
+1901-05-05 12:34:56.1247,1901-12-25
+1901-05-05 12:34:56.1248,1901-12-25
+1901-05-05 12:34:56.1249,1901-12-25
+1901-05-05 12:34:56.125,1901-12-25
+1901-05-05 12:34:56.1251,1901-12-25
+1901-05-05 12:34:56.1252,1901-12-25
+1901-05-05 12:34:56.1253,1901-12-25
+1901-05-05 12:34:56.1254,1901-12-25
+1901-05-05 12:34:56.1255,1901-12-25
+1901-05-05 12:34:56.1256,1901-12-25
+1901-05-05 12:34:56.1257,1901-12-25
+1901-05-05 12:34:56.1258,1901-12-25
+1901-05-05 12:34:56.1259,1901-12-25
+1901-05-05 12:34:56.126,1901-12-25
+1901-05-05 12:34:56.1261,1901-12-25
+1901-05-05 12:34:56.1262,1901-12-25
+1901-05-05 12:34:56.1263,1901-12-25
+1901-05-05 12:34:56.1264,1901-12-25
+1901-05-05 12:34:56.1265,1901-12-25
+1901-05-05 12:34:56.1266,1901-12-25
+1901-05-05 12:34:56.1267,1901-12-25
+1901-05-05 12:34:56.1268,1901-12-25
+1901-05-05 12:34:56.1269,1901-12-25
+1901-05-05 12:34:56.127,1901-12-25
+1901-05-05 12:34:56.1271,1901-12-25
+1901-05-05 12:34:56.1272,1901-12-25
+1901-05-05 12:34:56.1273,1901-12-25
+1901-05-05 12:34:56.1274,1901-12-25
+1901-05-05 12:34:56.1275,1901-12-25
+1901-05-05 12:34:56.1276,1901-12-25
+1901-05-05 12:34:56.1277,1901-12-25
+1901-05-05 12:34:56.1278,1901-12-25
+1901-05-05 12:34:56.1279,1901-12-25
+1901-05-05 12:34:56.128,1901-12-25
+1901-05-05 12:34:56.1281,1901-12-25
+1901-05-05 12:34:56.1282,1901-12-25
+1901-05-05 12:34:56.1283,1901-12-25
+1901-05-05 12:34:56.1284,1901-12-25
+1901-05-05 12:34:56.1285,1901-12-25
+1901-05-05 12:34:56.1286,1901-12-25
+1901-05-05 12:34:56.1287,1901-12-25
+1901-05-05 12:34:56.1288,1901-12-25
+1901-05-05 12:34:56.1289,1901-12-25
+1901-05-05 12:34:56.129,1901-12-25
+1901-05-05 12:34:56.1291,1901-12-25
+1901-05-05 12:34:56.1292,1901-12-25
+1901-05-05 12:34:56.1293,1901-12-25
+1901-05-05 12:34:56.1294,1901-12-25
+1901-05-05 12:34:56.1295,1901-12-25
+1901-05-05 12:34:56.1296,1901-12-25
+1901-05-05 12:34:56.1297,1901-12-25
+1901-05-05 12:34:56.1298,1901-12-25
+1901-05-05 12:34:56.1299,1901-12-25
+1901-05-05 12:34:56.13,1901-12-25
+1901-05-05 12:34:56.1301,1901-12-25
+1901-05-05 12:34:56.1302,1901-12-25
+1901-05-05 12:34:56.1303,1901-12-25
+1901-05-05 12:34:56.1304,1901-12-25
+1901-05-05 12:34:56.1305,1901-12-25
+1901-05-05 12:34:56.1306,1901-12-25
+1901-05-05 12:34:56.1307,1901-12-25
+1901-05-05 12:34:56.1308,1901-12-25
+1901-05-05 12:34:56.1309,1901-12-25
+1901-05-05 12:34:56.131,1901-12-25
+1901-05-05 12:34:56.1311,1901-12-25
+1901-05-05 12:34:56.1312,1901-12-25
+1901-05-05 12:34:56.1313,1901-12-25
+1901-05-05 12:34:56.1314,1901-12-25
+1901-05-05 12:34:56.1315,1901-12-25
+1901-05-05 12:34:56.1316,1901-12-25
+1901-05-05 12:34:56.1317,1901-12-25
+1901-05-05 12:34:56.1318,1901-12-25
+1901-05-05 12:34:56.1319,1901-12-25
+1901-05-05 12:34:56.132,1901-12-25
+1901-05-05 12:34:56.1321,1901-12-25
+1901-05-05 12:34:56.1322,1901-12-25
+1901-05-05 12:34:56.1323,1901-12-25
+1901-05-05 12:34:56.1324,1901-12-25
+1901-05-05 12:34:56.1325,1901-12-25
+1901-05-05 12:34:56.1326,1901-12-25
+1901-05-05 12:34:56.1327,1901-12-25
+1901-05-05 12:34:56.1328,1901-12-25
+1901-05-05 12:34:56.1329,1901-12-25
+1901-05-05 12:34:56.133,1901-12-25
+1901-05-05 12:34:56.1331,1901-12-25
+1901-05-05 12:34:56.1332,1901-12-25
+1901-05-05 12:34:56.1333,1901-12-25
+1901-05-05 12:34:56.1334,1901-12-25
+1901-05-05 12:34:56.1335,1901-12-25
+1901-05-05 12:34:56.1336,1901-12-25
+1901-05-05 12:34:56.1337,1901-12-25
+1901-05-05 12:34:56.1338,1901-12-25
+1901-05-05 12:34:56.1339,1901-12-25
+1901-05-05 12:34:56.134,1901-12-25
+1901-05-05 12:34:56.1341,1901-12-25
+1901-05-05 12:34:56.1342,1901-12-25
+1901-05-05 12:34:56.1343,1901-12-25
+1901-05-05 12:34:56.1344,1901-12-25
+1901-05-05 12:34:56.1345,1901-12-25
+1901-05-05 12:34:56.1346,1901-12-25
+1901-05-05 12:34:56.1347,1901-12-25
+1901-05-05 12:34:56.1348,1901-12-25
+1901-05-05 12:34:56.1349,1901-12-25
+1901-05-05 12:34:56.135,1901-12-25
+1901-05-05 12:34:56.1351,1901-12-25
+1901-05-05 12:34:56.1352,1901-12-25
+1901-05-05 12:34:56.1353,1901-12-25
+1901-05-05 12:34:56.1354,1901-12-25
+1901-05-05 12:34:56.1355,1901-12-25
+1901-05-05 12:34:56.1356,1901-12-25
+1901-05-05 12:34:56.1357,1901-12-25
+1901-05-05 12:34:56.1358,1901-12-25
+1901-05-05 12:34:56.1359,1901-12-25
+1901-05-05 12:34:56.136,1901-12-25
+1901-05-05 12:34:56.1361,1901-12-25
+1901-05-05 12:34:56.1362,1901-12-25
+1901-05-05 12:34:56.1363,1901-12-25
+1901-05-05 12:34:56.1364,1901-12-25
+1901-05-05 12:34:56.1365,1901-12-25
+1901-05-05 12:34:56.1366,1901-12-25
+1901-05-05 12:34:56.1367,1901-12-25
+1901-05-05 12:34:56.1368,1901-12-25
+1901-05-05 12:34:56.1369,1901-12-25
+1901-05-05 12:34:56.137,1901-12-25
+1901-05-05 12:34:56.1371,1901-12-25
+1901-05-05 12:34:56.1372,1901-12-25
+1901-05-05 12:34:56.1373,1901-12-25
+1901-05-05 12:34:56.1374,1901-12-25
+1901-05-05 12:34:56.1375,1901-12-25
+1901-05-05 12:34:56.1376,1901-12-25
+1901-05-05 12:34:56.1377,1901-12-25
+1901-05-05 12:34:56.1378,1901-12-25
+1901-05-05 12:34:56.1379,1901-12-25
+1901-05-05 12:34:56.138,1901-12-25
+1901-05-05 12:34:56.1381,1901-12-25
+1901-05-05 12:34:56.1382,1901-12-25
+1901-05-05 12:34:56.1383,1901-12-25
+1901-05-05 12:34:56.1384,1901-12-25
+1901-05-05 12:34:56.1385,1901-12-25
+1901-05-05 12:34:56.1386,1901-12-25
+1901-05-05 12:34:56.1387,1901-12-25
+1901-05-05 12:34:56.1388,1901-12-25
+1901-05-05 12:34:56.1389,1901-12-25
+1901-05-05 12:34:56.139,1901-12-25
+1901-05-05 12:34:56.1391,1901-12-25
+1901-05-05 12:34:56.1392,1901-12-25
+1901-05-05 12:34:56.1393,1901-12-25
+1901-05-05 12:34:56.1394,1901-12-25
+1901-05-05 12:34:56.1395,1901-12-25
+1901-05-05 12:34:56.1396,1901-12-25
+1901-05-05 12:34:56.1397,1901-12-25
+1901-05-05 12:34:56.1398,1901-12-25
+1901-05-05 12:34:56.1399,1901-12-25
+1901-05-05 12:34:56.14,1901-12-25
+1901-05-05 12:34:56.1401,1901-12-25
+1901-05-05 12:34:56.1402,1901-12-25
+1901-05-05 12:34:56.1403,1901-12-25
+1901-05-05 12:34:56.1404,1901-12-25
+1901-05-05 12:34:56.1405,1901-12-25
+1901-05-05 12:34:56.1406,1901-12-25
+1901-05-05 12:34:56.1407,1901-12-25
+1901-05-05 12:34:56.1408,1901-12-25
+1901-05-05 12:34:56.1409,1901-12-25
+1901-05-05 12:34:56.141,1901-12-25
+1901-05-05 12:34:56.1411,1901-12-25
+1901-05-05 12:34:56.1412,1901-12-25
+1901-05-05 12:34:56.1413,1901-12-25
+1901-05-05 12:34:56.1414,1901-12-25
+1901-05-05 12:34:56.1415,1901-12-25
+1901-05-05 12:34:56.1416,1901-12-25
+1901-05-05 12:34:56.1417,1901-12-25
+1901-05-05 12:34:56.1418,1901-12-25
+1901-05-05 12:34:56.1419,1901-12-25
+1901-05-05 12:34:56.142,1901-12-25
+1901-05-05 12:34:56.1421,1901-12-25
+1901-05-05 12:34:56.1422,1901-12-25
+1901-05-05 12:34:56.1423,1901-12-25
+1901-05-05 12:34:56.1424,1901-12-25
+1901-05-05 12:34:56.1425,1901-12-25
+1901-05-05 12:34:56.1426,1901-12-25
+1901-05-05 12:34:56.1427,1901-12-25
+1901-05-05 12:34:56.1428,1901-12-25
+1901-05-05 12:34:56.1429,1901-12-25
+1901-05-05 12:34:56.143,1901-12-25
+1901-05-05 12:34:56.1431,1901-12-25
+1901-05-05 12:34:56.1432,1901-12-25
+1901-05-05 12:34:56.1433,1901-12-25
+1901-05-05 12:34:56.1434,1901-12-25
+1901-05-05 12:34:56.1435,1901-12-25
+1901-05-05 12:34:56.1436,1901-12-25
+1901-05-05 12:34:56.1437,1901-12-25
+1901-05-05 12:34:56.1438,1901-12-25
+1901-05-05 12:34:56.1439,1901-12-25
+1901-05-05 12:34:56.144,1901-12-25
+1901-05-05 12:34:56.1441,1901-12-25
+1901-05-05 12:34:56.1442,1901-12-25
+1901-05-05 12:34:56.1443,1901-12-25
+1901-05-05 12:34:56.1444,1901-12-25
+1901-05-05 12:34:56.1445,1901-12-25
+1901-05-05 12:34:56.1446,1901-12-25
+1901-05-05 12:34:56.1447,1901-12-25
+1901-05-05 12:34:56.1448,1901-12-25
+1901-05-05 12:34:56.1449,1901-12-25
+1901-05-05 12:34:56.145,1901-12-25
+1901-05-05 12:34:56.1451,1901-12-25
+1901-05-05 12:34:56.1452,1901-12-25
+1901-05-05 12:34:56.1453,1901-12-25
+1901-05-05 12:34:56.1454,1901-12-25
+1901-05-05 12:34:56.1455,1901-12-25
+1901-05-05 12:34:56.1456,1901-12-25
+1901-05-05 12:34:56.1457,1901-12-25
+1901-05-05 12:34:56.1458,1901-12-25
+1901-05-05 12:34:56.1459,1901-12-25
+1901-05-05 12:34:56.146,1901-12-25
+1901-05-05 12:34:56.1461,1901-12-25
+1901-05-05 12:34:56.1462,1901-12-25
+1901-05-05 12:34:56.1463,1901-12-25
+1901-05-05 12:34:56.1464,1901-12-25
+1901-05-05 12:34:56.1465,1901-12-25
+1901-05-05 12:34:56.1466,1901-12-25
+1901-05-05 12:34:56.1467,1901-12-25
+1901-05-05 12:34:56.1468,1901-12-25
+1901-05-05 12:34:56.1469,1901-12-25
+1901-05-05 12:34:56.147,1901-12-25
+1901-05-05 12:34:56.1471,1901-12-25
+1901-05-05 12:34:56.1472,1901-12-25
+1901-05-05 12:34:56.1473,1901-12-25
+1901-05-05 12:34:56.1474,1901-12-25
+1901-05-05 12:34:56.1475,1901-12-25
+1901-05-05 12:34:56.1476,1901-12-25
+1901-05-05 12:34:56.1477,1901-12-25
+1901-05-05 12:34:56.1478,1901-12-25
+1901-05-05 12:34:56.1479,1901-12-25
+1901-05-05 12:34:56.148,1901-12-25
+1901-05-05 12:34:56.1481,1901-12-25
+1901-05-05 12:34:56.1482,1901-12-25
+1901-05-05 12:34:56.1483,1901-12-25
+1901-05-05 12:34:56.1484,1901-12-25
+1901-05-05 12:34:56.1485,1901-12-25
+1901-05-05 12:34:56.1486,1901-12-25
+1901-05-05 12:34:56.1487,1901-12-25
+1901-05-05 12:34:56.1488,1901-12-25
+1901-05-05 12:34:56.1489,1901-12-25
+1901-05-05 12:34:56.149,1901-12-25
+1901-05-05 12:34:56.1491,1901-12-25
+1901-05-05 12:34:56.1492,1901-12-25
+1901-05-05 12:34:56.1493,1901-12-25
+1901-05-05 12:34:56.1494,1901-12-25
+1901-05-05 12:34:56.1495,1901-12-25
+1901-05-05 12:34:56.1496,1901-12-25
+1901-05-05 12:34:56.1497,1901-12-25
+1901-05-05 12:34:56.1498,1901-12-25
+1901-05-05 12:34:56.1499,1901-12-25
+1901-05-05 12:34:56.15,1901-12-25
+1901-05-05 12:34:56.1501,1901-12-25
+1901-05-05 12:34:56.1502,1901-12-25
+1901-05-05 12:34:56.1503,1901-12-25
+1901-05-05 12:34:56.1504,1901-12-25
+1901-05-05 12:34:56.1505,1901-12-25
+1901-05-05 12:34:56.1506,1901-12-25
+1901-05-05 12:34:56.1507,1901-12-25
+1901-05-05 12:34:56.1508,1901-12-25
+1901-05-05 12:34:56.1509,1901-12-25
+1901-05-05 12:34:56.151,1901-12-25
+1901-05-05 12:34:56.1511,1901-12-25
+1901-05-05 12:34:56.1512,1901-12-25
+1901-05-05 12:34:56.1513,1901-12-25
+1901-05-05 12:34:56.1514,1901-12-25
+1901-05-05 12:34:56.1515,1901-12-25
+1901-05-05 12:34:56.1516,1901-12-25
+1901-05-05 12:34:56.1517,1901-12-25
+1901-05-05 12:34:56.1518,1901-12-25
+1901-05-05 12:34:56.1519,1901-12-25
+1901-05-05 12:34:56.152,1901-12-25
+1901-05-05 12:34:56.1521,1901-12-25
+1901-05-05 12:34:56.1522,1901-12-25
+1901-05-05 12:34:56.1523,1901-12-25
+1901-05-05 12:34:56.1524,1901-12-25
+1901-05-05 12:34:56.1525,1901-12-25
+1901-05-05 12:34:56.1526,1901-12-25
+1901-05-05 12:34:56.1527,1901-12-25
+1901-05-05 12:34:56.1528,1901-12-25
+1901-05-05 12:34:56.1529,1901-12-25
+1901-05-05 12:34:56.153,1901-12-25
+1901-05-05 12:34:56.1531,1901-12-25
+1901-05-05 12:34:56.1532,1901-12-25
+1901-05-05 12:34:56.1533,1901-12-25
+1901-05-05 12:34:56.1534,1901-12-25
+1901-05-05 12:34:56.1535,1901-12-25
+1901-05-05 12:34:56.1536,1901-12-25
+1901-05-05 12:34:56.1537,1901-12-25
+1901-05-05 12:34:56.1538,1901-12-25
+1901-05-05 12:34:56.1539,1901-12-25
+1901-05-05 12:34:56.154,1901-12-25
+1901-05-05 12:34:56.1541,1901-12-25
+1901-05-05 12:34:56.1542,1901-12-25
+1901-05-05 12:34:56.1543,1901-12-25
+1901-05-05 12:34:56.1544,1901-12-25
+1901-05-05 12:34:56.1545,1901-12-25
+1901-05-05 12:34:56.1546,1901-12-25
+1901-05-05 12:34:56.1547,1901-12-25
+1901-05-05 12:34:56.1548,1901-12-25
+1901-05-05 12:34:56.1549,1901-12-25
+1901-05-05 12:34:56.155,1901-12-25
+1901-05-05 12:34:56.1551,1901-12-25
+1901-05-05 12:34:56.1552,1901-12-25
+1901-05-05 12:34:56.1553,1901-12-25
+1901-05-05 12:34:56.1554,1901-12-25
+1901-05-05 12:34:56.1555,1901-12-25
+1901-05-05 12:34:56.1556,1901-12-25
+1901-05-05 12:34:56.1557,1901-12-25
+1901-05-05 12:34:56.1558,1901-12-25
+1901-05-05 12:34:56.1559,1901-12-25
+1901-05-05 12:34:56.156,1901-12-25
+1901-05-05 12:34:56.1561,1901-12-25
+1901-05-05 12:34:56.1562,1901-12-25
+1901-05-05 12:34:56.1563,1901-12-25
+1901-05-05 12:34:56.1564,1901-12-25
+1901-05-05 12:34:56.1565,1901-12-25
+1901-05-05 12:34:56.1566,1901-12-25
+1901-05-05 12:34:56.1567,1901-12-25
+1901-05-05 12:34:56.1568,1901-12-25
+1901-05-05 12:34:56.1569,1901-12-25
+1901-05-05 12:34:56.157,1901-12-25
+1901-05-05 12:34:56.1571,1901-12-25
+1901-05-05 12:34:56.1572,1901-12-25
+1901-05-05 12:34:56.1573,1901-12-25
+1901-05-05 12:34:56.1574,1901-12-25
+1901-05-05 12:34:56.1575,1901-12-25
+1901-05-05 12:34:56.1576,1901-12-25
+1901-05-05 12:34:56.1577,1901-12-25
+1901-05-05 12:34:56.1578,1901-12-25
+1901-05-05 12:34:56.1579,1901-12-25
+1901-05-05 12:34:56.158,1901-12-25
+1901-05-05 12:34:56.1581,1901-12-25
+1901-05-05 12:34:56.1582,1901-12-25
+1901-05-05 12:34:56.1583,1901-12-25
+1901-05-05 12:34:56.1584,1901-12-25
+1901-05-05 12:34:56.1585,1901-12-25
+1901-05-05 12:34:56.1586,1901-12-25
+1901-05-05 12:34:56.1587,1901-12-25
+1901-05-05 12:34:56.1588,1901-12-25
+1901-05-05 12:34:56.1589,1901-12-25
+1901-05-05 12:34:56.159,1901-12-25
+1901-05-05 12:34:56.1591,1901-12-25
+1901-05-05 12:34:56.1592,1901-12-25
+1901-05-05 12:34:56.1593,1901-12-25
+1901-05-05 12:34:56.1594,1901-12-25
+1901-05-05 12:34:56.1595,1901-12-25
+1901-05-05 12:34:56.1596,1901-12-25
+1901-05-05 12:34:56.1597,1901-12-25
+1901-05-05 12:34:56.1598,1901-12-25
+1901-05-05 12:34:56.1599,1901-12-25
+1901-05-05 12:34:56.16,1901-12-25
+1901-05-05 12:34:56.1601,1901-12-25
+1901-05-05 12:34:56.1602,1901-12-25
+1901-05-05 12:34:56.1603,1901-12-25
+1901-05-05 12:34:56.1604,1901-12-25
+1901-05-05 12:34:56.1605,1901-12-25
+1901-05-05 12:34:56.1606,1901-12-25
+1901-05-05 12:34:56.1607,1901-12-25
+1901-05-05 12:34:56.1608,1901-12-25
+1901-05-05 12:34:56.1609,1901-12-25
+1901-05-05 12:34:56.161,1901-12-25
+1901-05-05 12:34:56.1611,1901-12-25
+1901-05-05 12:34:56.1612,1901-12-25
+1901-05-05 12:34:56.1613,1901-12-25
+1901-05-05 12:34:56.1614,1901-12-25
+1901-05-05 12:34:56.1615,1901-12-25
+1901-05-05 12:34:56.1616,1901-12-25
+1901-05-05 12:34:56.1617,1901-12-25
+1901-05-05 12:34:56.1618,1901-12-25
+1901-05-05 12:34:56.1619,1901-12-25
+1901-05-05 12:34:56.162,1901-12-25
+1901-05-05 12:34:56.1621,1901-12-25
+1901-05-05 12:34:56.1622,1901-12-25
+1901-05-05 12:34:56.1623,1901-12-25
+1901-05-05 12:34:56.1624,1901-12-25
+1901-05-05 12:34:56.1625,1901-12-25
+1901-05-05 12:34:56.1626,1901-12-25
+1901-05-05 12:34:56.1627,1901-12-25
+1901-05-05 12:34:56.1628,1901-12-25
+1901-05-05 12:34:56.1629,1901-12-25
+1901-05-05 12:34:56.163,1901-12-25
+1901-05-05 12:34:56.1631,1901-12-25
+1901-05-05 12:34:56.1632,1901-12-25
+1901-05-05 12:34:56.1633,1901-12-25
+1901-05-05 12:34:56.1634,1901-12-25
+1901-05-05 12:34:56.1635,1901-12-25
+1901-05-05 12:34:56.1636,1901-12-25
+1901-05-05 12:34:56.1637,1901-12-25
+1901-05-05 12:34:56.1638,1901-12-25
+1901-05-05 12:34:56.1639,1901-12-25
+1901-05-05 12:34:56.164,1901-12-25
+1901-05-05 12:34:56.1641,1901-12-25
+1901-05-05 12:34:56.1642,1901-12-25
+1901-05-05 12:34:56.1643,1901-12-25
+1901-05-05 12:34:56.1644,1901-12-25
+1901-05-05 12:34:56.1645,1901-12-25
+1901-05-05 12:34:56.1646,1901-12-25
+1901-05-05 12:34:56.1647,1901-12-25
+1901-05-05 12:34:56.1648,1901-12-25
+1901-05-05 12:34:56.1649,1901-12-25
+1901-05-05 12:34:56.165,1901-12-25
+1901-05-05 12:34:56.1651,1901-12-25
+1901-05-05 12:34:56.1652,1901-12-25
+1901-05-05 12:34:56.1653,1901-12-25
+1901-05-05 12:34:56.1654,1901-12-25
+1901-05-05 12:34:56.1655,1901-12-25
+1901-05-05 12:34:56.1656,1901-12-25
+1901-05-05 12:34:56.1657,1901-12-25
+1901-05-05 12:34:56.1658,1901-12-25
+1901-05-05 12:34:56.1659,1901-12-25
+1901-05-05 12:34:56.166,1901-12-25
+1901-05-05 12:34:56.1661,1901-12-25
+1901-05-05 12:34:56.1662,1901-12-25
+1901-05-05 12:34:56.1663,1901-12-25
+1901-05-05 12:34:56.1664,1901-12-25
+1901-05-05 12:34:56.1665,1901-12-25
+1901-05-05 12:34:56.1666,1901-12-25
+1901-05-05 12:34:56.1667,1901-12-25
+1901-05-05 12:34:56.1668,1901-12-25
+1901-05-05 12:34:56.1669,1901-12-25
+1901-05-05 12:34:56.167,1901-12-25
+1901-05-05 12:34:56.1671,1901-12-25
+1901-05-05 12:34:56.1672,1901-12-25
+1901-05-05 12:34:56.1673,1901-12-25
+1901-05-05 12:34:56.1674,1901-12-25
+1901-05-05 12:34:56.1675,1901-12-25
+1901-05-05 12:34:56.1676,1901-12-25
+1901-05-05 12:34:56.1677,1901-12-25
+1901-05-05 12:34:56.1678,1901-12-25
+1901-05-05 12:34:56.1679,1901-12-25
+1901-05-05 12:34:56.168,1901-12-25
+1901-05-05 12:34:56.1681,1901-12-25
+1901-05-05 12:34:56.1682,1901-12-25
+1901-05-05 12:34:56.1683,1901-12-25
+1901-05-05 12:34:56.1684,1901-12-25
+1901-05-05 12:34:56.1685,1901-12-25
+1901-05-05 12:34:56.1686,1901-12-25
+1901-05-05 12:34:56.1687,1901-12-25
+1901-05-05 12:34:56.1688,1901-12-25
+1901-05-05 12:34:56.1689,1901-12-25
+1901-05-05 12:34:56.169,1901-12-25
+1901-05-05 12:34:56.1691,1901-12-25
+1901-05-05 12:34:56.1692,1901-12-25
+1901-05-05 12:34:56.1693,1901-12-25
+1901-05-05 12:34:56.1694,1901-12-25
+1901-05-05 12:34:56.1695,1901-12-25
+1901-05-05 12:34:56.1696,1901-12-25
+1901-05-05 12:34:56.1697,1901-12-25
+1901-05-05 12:34:56.1698,1901-12-25
+1901-05-05 12:34:56.1699,1901-12-25
+1901-05-05 12:34:56.17,1901-12-25
+1901-05-05 12:34:56.1701,1901-12-25
+1901-05-05 12:34:56.1702,1901-12-25
+1901-05-05 12:34:56.1703,1901-12-25
+1901-05-05 12:34:56.1704,1901-12-25
+1901-05-05 12:34:56.1705,1901-12-25
+1901-05-05 12:34:56.1706,1901-12-25
+1901-05-05 12:34:56.1707,1901-12-25
+1901-05-05 12:34:56.1708,1901-12-25
+1901-05-05 12:34:56.1709,1901-12-25
+1901-05-05 12:34:56.171,1901-12-25
+1901-05-05 12:34:56.1711,1901-12-25
+1901-05-05 12:34:56.1712,1901-12-25
+1901-05-05 12:34:56.1713,1901-12-25
+1901-05-05 12:34:56.1714,1901-12-25
+1901-05-05 12:34:56.1715,1901-12-25
+1901-05-05 12:34:56.1716,1901-12-25
+1901-05-05 12:34:56.1717,1901-12-25
+1901-05-05 12:34:56.1718,1901-12-25
+1901-05-05 12:34:56.1719,1901-12-25
+1901-05-05 12:34:56.172,1901-12-25
+1901-05-05 12:34:56.1721,1901-12-25
+1901-05-05 12:34:56.1722,1901-12-25
+1901-05-05 12:34:56.1723,1901-12-25
+1901-05-05 12:34:56.1724,1901-12-25
+1901-05-05 12:34:56.1725,1901-12-25
+1901-05-05 12:34:56.1726,1901-12-25
+1901-05-05 12:34:56.1727,1901-12-25
+1901-05-05 12:34:56.1728,1901-12-25
+1901-05-05 12:34:56.1729,1901-12-25
+1901-05-05 12:34:56.173,1901-12-25
+1901-05-05 12:34:56.1731,1901-12-25
+1901-05-05 12:34:56.1732,1901-12-25
+1901-05-05 12:34:56.1733,1901-12-25
+1901-05-05 12:34:56.1734,1901-12-25
+1901-05-05 12:34:56.1735,1901-12-25
+1901-05-05 12:34:56.1736,1901-12-25
+1901-05-05 12:34:56.1737,1901-12-25
+1901-05-05 12:34:56.1738,1901-12-25
+1901-05-05 12:34:56.1739,1901-12-25
+1901-05-05 12:34:56.174,1901-12-25
+1901-05-05 12:34:56.1741,1901-12-25
+1901-05-05 12:34:56.1742,1901-12-25
+1901-05-05 12:34:56.1743,1901-12-25
+1901-05-05 12:34:56.1744,1901-12-25
+1901-05-05 12:34:56.1745,1901-12-25
+1901-05-05 12:34:56.1746,1901-12-25
+1901-05-05 12:34:56.1747,1901-12-25
+1901-05-05 12:34:56.1748,1901-12-25
+1901-05-05 12:34:56.1749,1901-12-25
+1901-05-05 12:34:56.175,1901-12-25
+1901-05-05 12:34:56.1751,1901-12-25
+1901-05-05 12:34:56.1752,1901-12-25
+1901-05-05 12:34:56.1753,1901-12-25
+1901-05-05 12:34:56.1754,1901-12-25
+1901-05-05 12:34:56.1755,1901-12-25
+1901-05-05 12:34:56.1756,1901-12-25
+1901-05-05 12:34:56.1757,1901-12-25
+1901-05-05 12:34:56.1758,1901-12-25
+1901-05-05 12:34:56.1759,1901-12-25
+1901-05-05 12:34:56.176,1901-12-25
+1901-05-05 12:34:56.1761,1901-12-25
+1901-05-05 12:34:56.1762,1901-12-25
+1901-05-05 12:34:56.1763,1901-12-25
+1901-05-05 12:34:56.1764,1901-12-25
+1901-05-05 12:34:56.1765,1901-12-25
+1901-05-05 12:34:56.1766,1901-12-25
+1901-05-05 12:34:56.1767,1901-12-25
+1901-05-05 12:34:56.1768,1901-12-25
+1901-05-05 12:34:56.1769,1901-12-25
+1901-05-05 12:34:56.177,1901-12-25
+1901-05-05 12:34:56.1771,1901-12-25
+1901-05-05 12:34:56.1772,1901-12-25
+1901-05-05 12:34:56.1773,1901-12-25
+1901-05-05 12:34:56.1774,1901-12-25
+1901-05-05 12:34:56.1775,1901-12-25
+1901-05-05 12:34:56.1776,1901-12-25
+1901-05-05 12:34:56.1777,1901-12-25
+1901-05-05 12:34:56.1778,1901-12-25
+1901-05-05 12:34:56.1779,1901-12-25
+1901-05-05 12:34:56.178,1901-12-25
+1901-05-05 12:34:56.1781,1901-12-25
+1901-05-05 12:34:56.1782,1901-12-25
+1901-05-05 12:34:56.1783,1901-12-25
+1901-05-05 12:34:56.1784,1901-12-25
+1901-05-05 12:34:56.1785,1901-12-25
+1901-05-05 12:34:56.1786,1901-12-25
+1901-05-05 12:34:56.1787,1901-12-25
+1901-05-05 12:34:56.1788,1901-12-25
+1901-05-05 12:34:56.1789,1901-12-25
+1901-05-05 12:34:56.179,1901-12-25
+1901-05-05 12:34:56.1791,1901-12-25
+1901-05-05 12:34:56.1792,1901-12-25
+1901-05-05 12:34:56.1793,1901-12-25
+1901-05-05 12:34:56.1794,1901-12-25
+1901-05-05 12:34:56.1795,1901-12-25
+1901-05-05 12:34:56.1796,1901-12-25
+1901-05-05 12:34:56.1797,1901-12-25
+1901-05-05 12:34:56.1798,1901-12-25
+1901-05-05 12:34:56.1799,1901-12-25
+1901-05-05 12:34:56.18,1901-12-25
+1901-05-05 12:34:56.1801,1901-12-25
+1901-05-05 12:34:56.1802,1901-12-25
+1901-05-05 12:34:56.1803,1901-12-25
+1901-05-05 12:34:56.1804,1901-12-25
+1901-05-05 12:34:56.1805,1901-12-25
+1901-05-05 12:34:56.1806,1901-12-25
+1901-05-05 12:34:56.1807,1901-12-25
+1901-05-05 12:34:56.1808,1901-12-25
+1901-05-05 12:34:56.1809,1901-12-25
+1901-05-05 12:34:56.181,1901-12-25
+1901-05-05 12:34:56.1811,1901-12-25
+1901-05-05 12:34:56.1812,1901-12-25
+1901-05-05 12:34:56.1813,1901-12-25
+1901-05-05 12:34:56.1814,1901-12-25
+1901-05-05 12:34:56.1815,1901-12-25
+1901-05-05 12:34:56.1816,1901-12-25
+1901-05-05 12:34:56.1817,1901-12-25
+1901-05-05 12:34:56.1818,1901-12-25
+1901-05-05 12:34:56.1819,1901-12-25
+1901-05-05 12:34:56.182,1901-12-25
+1901-05-05 12:34:56.1821,1901-12-25
+1901-05-05 12:34:56.1822,1901-12-25
+1901-05-05 12:34:56.1823,1901-12-25
+1901-05-05 12:34:56.1824,1901-12-25
+1901-05-05 12:34:56.1825,1901-12-25
+1901-05-05 12:34:56.1826,1901-12-25
+1901-05-05 12:34:56.1827,1901-12-25
+1901-05-05 12:34:56.1828,1901-12-25
+1901-05-05 12:34:56.1829,1901-12-25
+1901-05-05 12:34:56.183,1901-12-25
+1901-05-05 12:34:56.1831,1901-12-25
+1901-05-05 12:34:56.1832,1901-12-25
+1901-05-05 12:34:56.1833,1901-12-25
+1901-05-05 12:34:56.1834,1901-12-25
+1901-05-05 12:34:56.1835,1901-12-25
+1901-05-05 12:34:56.1836,1901-12-25
+1901-05-05 12:34:56.1837,1901-12-25
+1901-05-05 12:34:56.1838,1901-12-25
+1901-05-05 12:34:56.1839,1901-12-25
+1901-05-05 12:34:56.184,1901-12-25
+1901-05-05 12:34:56.1841,1901-12-25
+1901-05-05 12:34:56.1842,1901-12-25
+1901-05-05 12:34:56.1843,1901-12-25
+1901-05-05 12:34:56.1844,1901-12-25
+1901-05-05 12:34:56.1845,1901-12-25
+1901-05-05 12:34:56.1846,1901-12-25
+1901-05-05 12:34:56.1847,1901-12-25
+1901-05-05 12:34:56.1848,1901-12-25
+1901-05-05 12:34:56.1849,1901-12-25
+1901-05-05 12:34:56.185,1901-12-25
+1901-05-05 12:34:56.1851,1901-12-25
+1901-05-05 12:34:56.1852,1901-12-25
+1901-05-05 12:34:56.1853,1901-12-25
+1901-05-05 12:34:56.1854,1901-12-25
+1901-05-05 12:34:56.1855,1901-12-25
+1901-05-05 12:34:56.1856,1901-12-25
+1901-05-05 12:34:56.1857,1901-12-25
+1901-05-05 12:34:56.1858,1901-12-25
+1901-05-05 12:34:56.1859,1901-12-25
+1901-05-05 12:34:56.186,1901-12-25
+1901-05-05 12:34:56.1861,1901-12-25
+1901-05-05 12:34:56.1862,1901-12-25
+1901-05-05 12:34:56.1863,1901-12-25
+1901-05-05 12:34:56.1864,1901-12-25
+1901-05-05 12:34:56.1865,1901-12-25
+1901-05-05 12:34:56.1866,1901-12-25
+1901-05-05 12:34:56.1867,1901-12-25
+1901-05-05 12:34:56.1868,1901-12-25
+1901-05-05 12:34:56.1869,1901-12-25
+1901-05-05 12:34:56.187,1901-12-25
+1901-05-05 12:34:56.1871,1901-12-25
+1901-05-05 12:34:56.1872,1901-12-25
+1901-05-05 12:34:56.1873,1901-12-25
+1901-05-05 12:34:56.1874,1901-12-25
+1901-05-05 12:34:56.1875,1901-12-25
+1901-05-05 12:34:56.1876,1901-12-25
+1901-05-05 12:34:56.1877,1901-12-25
+1901-05-05 12:34:56.1878,1901-12-25
+1901-05-05 12:34:56.1879,1901-12-25
+1901-05-05 12:34:56.188,1901-12-25
+1901-05-05 12:34:56.1881,1901-12-25
+1901-05-05 12:34:56.1882,1901-12-25
+1901-05-05 12:34:56.1883,1901-12-25
+1901-05-05 12:34:56.1884,1901-12-25
+1901-05-05 12:34:56.1885,1901-12-25
+1901-05-05 12:34:56.1886,1901-12-25
+1901-05-05 12:34:56.1887,1901-12-25
+1901-05-05 12:34:56.1888,1901-12-25
+1901-05-05 12:34:56.1889,1901-12-25
+1901-05-05 12:34:56.189,1901-12-25
+1901-05-05 12:34:56.1891,1901-12-25
+1901-05-05 12:34:56.1892,1901-12-25
+1901-05-05 12:34:56.1893,1901-12-25
+1901-05-05 12:34:56.1894,1901-12-25
+1901-05-05 12:34:56.1895,1901-12-25
+1901-05-05 12:34:56.1896,1901-12-25
+1901-05-05 12:34:56.1897,1901-12-25
+1901-05-05 12:34:56.1898,1901-12-25
+1901-05-05 12:34:56.1899,1901-12-25
+1901-05-05 12:34:56.19,1901-12-25
+1901-05-05 12:34:56.1901,1901-12-25
+1901-05-05 12:34:56.1902,1901-12-25
+1901-05-05 12:34:56.1903,1901-12-25
+1901-05-05 12:34:56.1904,1901-12-25
+1901-05-05 12:34:56.1905,1901-12-25
+1901-05-05 12:34:56.1906,1901-12-25
+1901-05-05 12:34:56.1907,1901-12-25
+1901-05-05 12:34:56.1908,1901-12-25
+1901-05-05 12:34:56.1909,1901-12-25
+1901-05-05 12:34:56.191,1901-12-25
+1901-05-05 12:34:56.1911,1901-12-25
+1901-05-05 12:34:56.1912,1901-12-25
+1901-05-05 12:34:56.1913,1901-12-25
+1901-05-05 12:34:56.1914,1901-12-25
+1901-05-05 12:34:56.1915,1901-12-25
+1901-05-05 12:34:56.1916,1901-12-25
+1901-05-05 12:34:56.1917,1901-12-25
+1901-05-05 12:34:56.1918,1901-12-25
+1901-05-05 12:34:56.1919,1901-12-25
+1901-05-05 12:34:56.192,1901-12-25
+1901-05-05 12:34:56.1921,1901-12-25
+1901-05-05 12:34:56.1922,1901-12-25
+1901-05-05 12:34:56.1923,1901-12-25
+1901-05-05 12:34:56.1924,1901-12-25
+1901-05-05 12:34:56.1925,1901-12-25
+1901-05-05 12:34:56.1926,1901-12-25
+1901-05-05 12:34:56.1927,1901-12-25
+1901-05-05 12:34:56.1928,1901-12-25
+1901-05-05 12:34:56.1929,1901-12-25
+1901-05-05 12:34:56.193,1901-12-25
+1901-05-05 12:34:56.1931,1901-12-25
+1901-05-05 12:34:56.1932,1901-12-25
+1901-05-05 12:34:56.1933,1901-12-25
+1901-05-05 12:34:56.1934,1901-12-25
+1901-05-05 12:34:56.1935,1901-12-25
+1901-05-05 12:34:56.1936,1901-12-25
+1901-05-05 12:34:56.1937,1901-12-25
+1901-05-05 12:34:56.1938,1901-12-25
+1901-05-05 12:34:56.1939,1901-12-25
+1901-05-05 12:34:56.194,1901-12-25
+1901-05-05 12:34:56.1941,1901-12-25
+1901-05-05 12:34:56.1942,1901-12-25
+1901-05-05 12:34:56.1943,1901-12-25
+1901-05-05 12:34:56.1944,1901-12-25
+1901-05-05 12:34:56.1945,1901-12-25
+1901-05-05 12:34:56.1946,1901-12-25
+1901-05-05 12:34:56.1947,1901-12-25
+1901-05-05 12:34:56.1948,1901-12-25
+1901-05-05 12:34:56.1949,1901-12-25
+1901-05-05 12:34:56.195,1901-12-25
+1901-05-05 12:34:56.1951,1901-12-25
+1901-05-05 12:34:56.1952,1901-12-25
+1901-05-05 12:34:56.1953,1901-12-25
+1901-05-05 12:34:56.1954,1901-12-25
+1901-05-05 12:34:56.1955,1901-12-25
+1901-05-05 12:34:56.1956,1901-12-25
+1901-05-05 12:34:56.1957,1901-12-25
+1901-05-05 12:34:56.1958,1901-12-25
+1901-05-05 12:34:56.1959,1901-12-25
+1901-05-05 12:34:56.196,1901-12-25
+1901-05-05 12:34:56.1961,1901-12-25
+1901-05-05 12:34:56.1962,1901-12-25
+1901-05-05 12:34:56.1963,1901-12-25
+1901-05-05 12:34:56.1964,1901-12-25
+1901-05-05 12:34:56.1965,1901-12-25
+1901-05-05 12:34:56.1966,1901-12-25
+1901-05-05 12:34:56.1967,1901-12-25
+1901-05-05 12:34:56.1968,1901-12-25
+1901-05-05 12:34:56.1969,1901-12-25
+1901-05-05 12:34:56.197,1901-12-25
+1901-05-05 12:34:56.1971,1901-12-25
+1901-05-05 12:34:56.1972,1901-12-25
+1901-05-05 12:34:56.1973,1901-12-25
+1901-05-05 12:34:56.1974,1901-12-25
+1901-05-05 12:34:56.1975,1901-12-25
+1901-05-05 12:34:56.1976,1901-12-25
+1901-05-05 12:34:56.1977,1901-12-25
+1901-05-05 12:34:56.1978,1901-12-25
+1901-05-05 12:34:56.1979,1901-12-25
+1901-05-05 12:34:56.198,1901-12-25
+1901-05-05 12:34:56.1981,1901-12-25
+1901-05-05 12:34:56.1982,1901-12-25
+1901-05-05 12:34:56.1983,1901-12-25
+1901-05-05 12:34:56.1984,1901-12-25
+1901-05-05 12:34:56.1985,1901-12-25
+1901-05-05 12:34:56.1986,1901-12-25
+1901-05-05 12:34:56.1987,1901-12-25
+1901-05-05 12:34:56.1988,1901-12-25
+1901-05-05 12:34:56.1989,1901-12-25
+1901-05-05 12:34:56.199,1901-12-25
+1901-05-05 12:34:56.1991,1901-12-25
+1901-05-05 12:34:56.1992,1901-12-25
+1901-05-05 12:34:56.1993,1901-12-25
+1901-05-05 12:34:56.1994,1901-12-25
+1901-05-05 12:34:56.1995,1901-12-25
+1901-05-05 12:34:56.1996,1901-12-25
+1901-05-05 12:34:56.1997,1901-12-25
+1901-05-05 12:34:56.1998,1901-12-25
+1901-05-05 12:34:56.1999,1901-12-25
+1902-05-05 12:34:56.1,1902-12-25
+1902-05-05 12:34:56.1001,1902-12-25
+1902-05-05 12:34:56.1002,1902-12-25
+1902-05-05 12:34:56.1003,1902-12-25
+1902-05-05 12:34:56.1004,1902-12-25
+1902-05-05 12:34:56.1005,1902-12-25
+1902-05-05 12:34:56.1006,1902-12-25
+1902-05-05 12:34:56.1007,1902-12-25
+1902-05-05 12:34:56.1008,1902-12-25
+1902-05-05 12:34:56.1009,1902-12-25
+1902-05-05 12:34:56.101,1902-12-25
+1902-05-05 12:34:56.1011,1902-12-25
+1902-05-05 12:34:56.1012,1902-12-25
+1902-05-05 12:34:56.1013,1902-12-25
+1902-05-05 12:34:56.1014,1902-12-25
+1902-05-05 12:34:56.1015,1902-12-25
+1902-05-05 12:34:56.1016,1902-12-25
+1902-05-05 12:34:56.1017,1902-12-25
+1902-05-05 12:34:56.1018,1902-12-25
+1902-05-05 12:34:56.1019,1902-12-25
+1902-05-05 12:34:56.102,1902-12-25
+1902-05-05 12:34:56.1021,1902-12-25
+1902-05-05 12:34:56.1022,1902-12-25
+1902-05-05 12:34:56.1023,1902-12-25
+1902-05-05 12:34:56.1024,1902-12-25
+1902-05-05 12:34:56.1025,1902-12-25
+1902-05-05 12:34:56.1026,1902-12-25
+1902-05-05 12:34:56.1027,1902-12-25
+1902-05-05 12:34:56.1028,1902-12-25
+1902-05-05 12:34:56.1029,1902-12-25
+1902-05-05 12:34:56.103,1902-12-25
+1902-05-05 12:34:56.1031,1902-12-25
+1902-05-05 12:34:56.1032,1902-12-25
+1902-05-05 12:34:56.1033,1902-12-25
+1902-05-05 12:34:56.1034,1902-12-25
+1902-05-05 12:34:56.1035,1902-12-25
+1902-05-05 12:34:56.1036,1902-12-25
+1902-05-05 12:34:56.1037,1902-12-25
+1902-05-05 12:34:56.1038,1902-12-25
+1902-05-05 12:34:56.1039,1902-12-25
+1902-05-05 12:34:56.104,1902-12-25
+1902-05-05 12:34:56.1041,1902-12-25
+1902-05-05 12:34:56.1042,1902-12-25
+1902-05-05 12:34:56.1043,1902-12-25
+1902-05-05 12:34:56.1044,1902-12-25
+1902-05-05 12:34:56.1045,1902-12-25
+1902-05-05 12:34:56.1046,1902-12-25
+1902-05-05 12:34:56.1047,1902-12-25
+1902-05-05 12:34:56.1048,1902-12-25
+1902-05-05 12:34:56.1049,1902-12-25
+1902-05-05 12:34:56.105,1902-12-25
+1902-05-05 12:34:56.1051,1902-12-25
+1902-05-05 12:34:56.1052,1902-12-25
+1902-05-05 12:34:56.1053,1902-12-25
+1902-05-05 12:34:56.1054,1902-12-25
+1902-05-05 12:34:56.1055,1902-12-25
+1902-05-05 12:34:56.1056,1902-12-25
+1902-05-05 12:34:56.1057,1902-12-25
+1902-05-05 12:34:56.1058,1902-12-25
+1902-05-05 12:34:56.1059,1902-12-25
+1902-05-05 12:34:56.106,1902-12-25
+1902-05-05 12:34:56.1061,1902-12-25
+1902-05-05 12:34:56.1062,1902-12-25
+1902-05-05 12:34:56.1063,1902-12-25
+1902-05-05 12:34:56.1064,1902-12-25
+1902-05-05 12:34:56.1065,1902-12-25
+1902-05-05 12:34:56.1066,1902-12-25
+1902-05-05 12:34:56.1067,1902-12-25
+1902-05-05 12:34:56.1068,1902-12-25
+1902-05-05 12:34:56.1069,1902-12-25
+1902-05-05 12:34:56.107,1902-12-25
+1902-05-05 12:34:56.1071,1902-12-25
+1902-05-05 12:34:56.1072,1902-12-25
+1902-05-05 12:34:56.1073,1902-12-25
+1902-05-05 12:34:56.1074,1902-12-25
+1902-05-05 12:34:56.1075,1902-12-25
+1902-05-05 12:34:56.1076,1902-12-25
+1902-05-05 12:34:56.1077,1902-12-25
+1902-05-05 12:34:56.1078,1902-12-25
+1902-05-05 12:34:56.1079,1902-12-25
+1902-05-05 12:34:56.108,1902-12-25
+1902-05-05 12:34:56.1081,1902-12-25
+1902-05-05 12:34:56.1082,1902-12-25
+1902-05-05 12:34:56.1083,1902-12-25
+1902-05-05 12:34:56.1084,1902-12-25
+1902-05-05 12:34:56.1085,1902-12-25
+1902-05-05 12:34:56.1086,1902-12-25
+1902-05-05 12:34:56.1087,1902-12-25
+1902-05-05 12:34:56.1088,1902-12-25
+1902-05-05 12:34:56.1089,1902-12-25
+1902-05-05 12:34:56.109,1902-12-25
+1902-05-05 12:34:56.1091,1902-12-25
+1902-05-05 12:34:56.1092,1902-12-25
+1902-05-05 12:34:56.1093,1902-12-25
+1902-05-05 12:34:56.1094,1902-12-25
+1902-05-05 12:34:56.1095,1902-12-25
+1902-05-05 12:34:56.1096,1902-12-25
+1902-05-05 12:34:56.1097,1902-12-25
+1902-05-05 12:34:56.1098,1902-12-25
+1902-05-05 12:34:56.1099,1902-12-25
+1902-05-05 12:34:56.11,1902-12-25
+1902-05-05 12:34:56.1101,1902-12-25
+1902-05-05 12:34:56.1102,1902-12-25
+1902-05-05 12:34:56.1103,1902-12-25
+1902-05-05 12:34:56.1104,1902-12-25
+1902-05-05 12:34:56.1105,1902-12-25
+1902-05-05 12:34:56.1106,1902-12-25
+1902-05-05 12:34:56.1107,1902-12-25
+1902-05-05 12:34:56.1108,1902-12-25
+1902-05-05 12:34:56.1109,1902-12-25
+1902-05-05 12:34:56.111,1902-12-25
+1902-05-05 12:34:56.1111,1902-12-25
+1902-05-05 12:34:56.1112,1902-12-25
+1902-05-05 12:34:56.1113,1902-12-25
+1902-05-05 12:34:56.1114,1902-12-25
+1902-05-05 12:34:56.1115,1902-12-25
+1902-05-05 12:34:56.1116,1902-12-25
+1902-05-05 12:34:56.1117,1902-12-25
+1902-05-05 12:34:56.1118,1902-12-25
+1902-05-05 12:34:56.1119,1902-12-25
+1902-05-05 12:34:56.112,1902-12-25
+1902-05-05 12:34:56.1121,1902-12-25
+1902-05-05 12:34:56.1122,1902-12-25
+1902-05-05 12:34:56.1123,1902-12-25
+1902-05-05 12:34:56.1124,1902-12-25
+1902-05-05 12:34:56.1125,1902-12-25
+1902-05-05 12:34:56.1126,1902-12-25
+1902-05-05 12:34:56.1127,1902-12-25
+1902-05-05 12:34:56.1128,1902-12-25
+1902-05-05 12:34:56.1129,1902-12-25
+1902-05-05 12:34:56.113,1902-12-25
+1902-05-05 12:34:56.1131,1902-12-25
+1902-05-05 12:34:56.1132,1902-12-25
+1902-05-05 12:34:56.1133,1902-12-25
+1902-05-05 12:34:56.1134,1902-12-25
+1902-05-05 12:34:56.1135,1902-12-25
+1902-05-05 12:34:56.1136,1902-12-25
+1902-05-05 12:34:56.1137,1902-12-25
+1902-05-05 12:34:56.1138,1902-12-25
+1902-05-05 12:34:56.1139,1902-12-25
+1902-05-05 12:34:56.114,1902-12-25
+1902-05-05 12:34:56.1141,1902-12-25
+1902-05-05 12:34:56.1142,1902-12-25
+1902-05-05 12:34:56.1143,1902-12-25
+1902-05-05 12:34:56.1144,1902-12-25
+1902-05-05 12:34:56.1145,1902-12-25
+1902-05-05 12:34:56.1146,1902-12-25
+1902-05-05 12:34:56.1147,1902-12-25
+1902-05-05 12:34:56.1148,1902-12-25
+1902-05-05 12:34:56.1149,1902-12-25
+1902-05-05 12:34:56.115,1902-12-25
+1902-05-05 12:34:56.1151,1902-12-25
+1902-05-05 12:34:56.1152,1902-12-25
+1902-05-05 12:34:56.1153,1902-12-25
+1902-05-05 12:34:56.1154,1902-12-25
+1902-05-05 12:34:56.1155,1902-12-25
+1902-05-05 12:34:56.1156,1902-12-25
+1902-05-05 12:34:56.1157,1902-12-25
+1902-05-05 12:34:56.1158,1902-12-25
+1902-05-05 12:34:56.1159,1902-12-25
+1902-05-05 12:34:56.116,1902-12-25
+1902-05-05 12:34:56.1161,1902-12-25
+1902-05-05 12:34:56.1162,1902-12-25
+1902-05-05 12:34:56.1163,1902-12-25
+1902-05-05 12:34:56.1164,1902-12-25
+1902-05-05 12:34:56.1165,1902-12-25
+1902-05-05 12:34:56.1166,1902-12-25
+1902-05-05 12:34:56.1167,1902-12-25
+1902-05-05 12:34:56.1168,1902-12-25
+1902-05-05 12:34:56.1169,1902-12-25
+1902-05-05 12:34:56.117,1902-12-25
+1902-05-05 12:34:56.1171,1902-12-25
+1902-05-05 12:34:56.1172,1902-12-25
+1902-05-05 12:34:56.1173,1902-12-25
+1902-05-05 12:34:56.1174,1902-12-25
+1902-05-05 12:34:56.1175,1902-12-25
+1902-05-05 12:34:56.1176,1902-12-25
+1902-05-05 12:34:56.1177,1902-12-25
+1902-05-05 12:34:56.1178,1902-12-25
+1902-05-05 12:34:56.1179,1902-12-25
+1902-05-05 12:34:56.118,1902-12-25
+1902-05-05 12:34:56.1181,1902-12-25
+1902-05-05 12:34:56.1182,1902-12-25
+1902-05-05 12:34:56.1183,1902-12-25
+1902-05-05 12:34:56.1184,1902-12-25
+1902-05-05 12:34:56.1185,1902-12-25
+1902-05-05 12:34:56.1186,1902-12-25
+1902-05-05 12:34:56.1187,1902-12-25
+1902-05-05 12:34:56.1188,1902-12-25
+1902-05-05 12:34:56.1189,1902-12-25
+1902-05-05 12:34:56.119,1902-12-25
+1902-05-05 12:34:56.1191,1902-12-25
+1902-05-05 12:34:56.1192,1902-12-25
+1902-05-05 12:34:56.1193,1902-12-25
+1902-05-05 12:34:56.1194,1902-12-25
+1902-05-05 12:34:56.1195,1902-12-25
+1902-05-05 12:34:56.1196,1902-12-25
+1902-05-05 12:34:56.1197,1902-12-25
+1902-05-05 12:34:56.1198,1902-12-25
+1902-05-05 12:34:56.1199,1902-12-25
+1902-05-05 12:34:56.12,1902-12-25
+1902-05-05 12:34:56.1201,1902-12-25
+1902-05-05 12:34:56.1202,1902-12-25
+1902-05-05 12:34:56.1203,1902-12-25
+1902-05-05 12:34:56.1204,1902-12-25
+1902-05-05 12:34:56.1205,1902-12-25
+1902-05-05 12:34:56.1206,1902-12-25
+1902-05-05 12:34:56.1207,1902-12-25
+1902-05-05 12:34:56.1208,1902-12-25
+1902-05-05 12:34:56.1209,1902-12-25
+1902-05-05 12:34:56.121,1902-12-25
+1902-05-05 12:34:56.1211,1902-12-25
+1902-05-05 12:34:56.1212,1902-12-25
+1902-05-05 12:34:56.1213,1902-12-25
+1902-05-05 12:34:56.1214,1902-12-25
+1902-05-05 12:34:56.1215,1902-12-25
+1902-05-05 12:34:56.1216,1902-12-25
+1902-05-05 12:34:56.1217,1902-12-25
+1902-05-05 12:34:56.1218,1902-12-25
+1902-05-05 12:34:56.1219,1902-12-25
+1902-05-05 12:34:56.122,1902-12-25
+1902-05-05 12:34:56.1221,1902-12-25
+1902-05-05 12:34:56.1222,1902-12-25
+1902-05-05 12:34:56.1223,1902-12-25
+1902-05-05 12:34:56.1224,1902-12-25
+1902-05-05 12:34:56.1225,1902-12-25
+1902-05-05 12:34:56.1226,1902-12-25
+1902-05-05 12:34:56.1227,1902-12-25
+1902-05-05 12:34:56.1228,1902-12-25
+1902-05-05 12:34:56.1229,1902-12-25
+1902-05-05 12:34:56.123,1902-12-25
+1902-05-05 12:34:56.1231,1902-12-25
+1902-05-05 12:34:56.1232,1902-12-25
+1902-05-05 12:34:56.1233,1902-12-25
+1902-05-05 12:34:56.1234,1902-12-25
+1902-05-05 12:34:56.1235,1902-12-25
+1902-05-05 12:34:56.1236,1902-12-25
+1902-05-05 12:34:56.1237,1902-12-25
+1902-05-05 12:34:56.1238,1902-12-25
+1902-05-05 12:34:56.1239,1902-12-25
+1902-05-05 12:34:56.124,1902-12-25
+1902-05-05 12:34:56.1241,1902-12-25
+1902-05-05 12:34:56.1242,1902-12-25
+1902-05-05 12:34:56.1243,1902-12-25
+1902-05-05 12:34:56.1244,1902-12-25
+1902-05-05 12:34:56.1245,1902-12-25
+1902-05-05 12:34:56.1246,1902-12-25
+1902-05-05 12:34:56.1247,1902-12-25
+1902-05-05 12:34:56.1248,1902-12-25
+1902-05-05 12:34:56.1249,1902-12-25
+1902-05-05 12:34:56.125,1902-12-25
+1902-05-05 12:34:56.1251,1902-12-25
+1902-05-05 12:34:56.1252,1902-12-25
+1902-05-05 12:34:56.1253,1902-12-25
+1902-05-05 12:34:56.1254,1902-12-25
+1902-05-05 12:34:56.1255,1902-12-25
+1902-05-05 12:34:56.1256,1902-12-25
+1902-05-05 12:34:56.1257,1902-12-25
+1902-05-05 12:34:56.1258,1902-12-25
+1902-05-05 12:34:56.1259,1902-12-25
+1902-05-05 12:34:56.126,1902-12-25
+1902-05-05 12:34:56.1261,1902-12-25
+1902-05-05 12:34:56.1262,1902-12-25
+1902-05-05 12:34:56.1263,1902-12-25
+1902-05-05 12:34:56.1264,1902-12-25
+1902-05-05 12:34:56.1265,1902-12-25
+1902-05-05 12:34:56.1266,1902-12-25
+1902-05-05 12:34:56.1267,1902-12-25
+1902-05-05 12:34:56.1268,1902-12-25
+1902-05-05 12:34:56.1269,1902-12-25
+1902-05-05 12:34:56.127,1902-12-25
+1902-05-05 12:34:56.1271,1902-12-25
+1902-05-05 12:34:56.1272,1902-12-25
+1902-05-05 12:34:56.1273,1902-12-25
+1902-05-05 12:34:56.1274,1902-12-25
+1902-05-05 12:34:56.1275,1902-12-25
+1902-05-05 12:34:56.1276,1902-12-25
+1902-05-05 12:34:56.1277,1902-12-25
+1902-05-05 12:34:56.1278,1902-12-25
+1902-05-05 12:34:56.1279,1902-12-25
+1902-05-05 12:34:56.128,1902-12-25
+1902-05-05 12:34:56.1281,1902-12-25
+1902-05-05 12:34:56.1282,1902-12-25
+1902-05-05 12:34:56.1283,1902-12-25
+1902-05-05 12:34:56.1284,1902-12-25
+1902-05-05 12:34:56.1285,1902-12-25
+1902-05-05 12:34:56.1286,1902-12-25
+1902-05-05 12:34:56.1287,1902-12-25
+1902-05-05 12:34:56.1288,1902-12-25
+1902-05-05 12:34:56.1289,1902-12-25
+1902-05-05 12:34:56.129,1902-12-25
+1902-05-05 12:34:56.1291,1902-12-25
+1902-05-05 12:34:56.1292,1902-12-25
+1902-05-05 12:34:56.1293,1902-12-25
+1902-05-05 12:34:56.1294,1902-12-25
+1902-05-05 12:34:56.1295,1902-12-25
+1902-05-05 12:34:56.1296,1902-12-25
+1902-05-05 12:34:56.1297,1902-12-25
+1902-05-05 12:34:56.1298,1902-12-25
+1902-05-05 12:34:56.1299,1902-12-25
+1902-05-05 12:34:56.13,1902-12-25
+1902-05-05 12:34:56.1301,1902-12-25
+1902-05-05 12:34:56.1302,1902-12-25
+1902-05-05 12:34:56.1303,1902-12-25
+1902-05-05 12:34:56.1304,1902-12-25
+1902-05-05 12:34:56.1305,1902-12-25
+1902-05-05 12:34:56.1306,1902-12-25
+1902-05-05 12:34:56.1307,1902-12-25
+1902-05-05 12:34:56.1308,1902-12-25
+1902-05-05 12:34:56.1309,1902-12-25
+1902-05-05 12:34:56.131,1902-12-25
+1902-05-05 12:34:56.1311,1902-12-25
+1902-05-05 12:34:56.1312,1902-12-25
+1902-05-05 12:34:56.1313,1902-12-25
+1902-05-05 12:34:56.1314,1902-12-25
+1902-05-05 12:34:56.1315,1902-12-25
+1902-05-05 12:34:56.1316,1902-12-25
+1902-05-05 12:34:56.1317,1902-12-25
+1902-05-05 12:34:56.1318,1902-12-25
+1902-05-05 12:34:56.1319,1902-12-25
+1902-05-05 12:34:56.132,1902-12-25
+1902-05-05 12:34:56.1321,1902-12-25
+1902-05-05 12:34:56.1322,1902-12-25
+1902-05-05 12:34:56.1323,1902-12-25
+1902-05-05 12:34:56.1324,1902-12-25
+1902-05-05 12:34:56.1325,1902-12-25
+1902-05-05 12:34:56.1326,1902-12-25
+1902-05-05 12:34:56.1327,1902-12-25
+1902-05-05 12:34:56.1328,1902-12-25
+1902-05-05 12:34:56.1329,1902-12-25
+1902-05-05 12:34:56.133,1902-12-25
+1902-05-05 12:34:56.1331,1902-12-25
+1902-05-05 12:34:56.1332,1902-12-25
+1902-05-05 12:34:56.1333,1902-12-25
+1902-05-05 12:34:56.1334,1902-12-25
+1902-05-05 12:34:56.1335,1902-12-25
+1902-05-05 12:34:56.1336,1902-12-25
+1902-05-05 12:34:56.1337,1902-12-25
+1902-05-05 12:34:56.1338,1902-12-25
+1902-05-05 12:34:56.1339,1902-12-25
+1902-05-05 12:34:56.134,1902-12-25
+1902-05-05 12:34:56.1341,1902-12-25
+1902-05-05 12:34:56.1342,1902-12-25
+1902-05-05 12:34:56.1343,1902-12-25
+1902-05-05 12:34:56.1344,1902-12-25
+1902-05-05 12:34:56.1345,1902-12-25
+1902-05-05 12:34:56.1346,1902-12-25
+1902-05-05 12:34:56.1347,1902-12-25
+1902-05-05 12:34:56.1348,1902-12-25
+1902-05-05 12:34:56.1349,1902-12-25
+1902-05-05 12:34:56.135,1902-12-25
+1902-05-05 12:34:56.1351,1902-12-25
+1902-05-05 12:34:56.1352,1902-12-25
+1902-05-05 12:34:56.1353,1902-12-25
+1902-05-05 12:34:56.1354,1902-12-25
+1902-05-05 12:34:56.1355,1902-12-25
+1902-05-05 12:34:56.1356,1902-12-25
+1902-05-05 12:34:56.1357,1902-12-25
+1902-05-05 12:34:56.1358,1902-12-25
+1902-05-05 12:34:56.1359,1902-12-25
+1902-05-05 12:34:56.136,1902-12-25
+1902-05-05 12:34:56.1361,1902-12-25
+1902-05-05 12:34:56.1362,1902-12-25
+1902-05-05 12:34:56.1363,1902-12-25
+1902-05-05 12:34:56.1364,1902-12-25
+1902-05-05 12:34:56.1365,1902-12-25
+1902-05-05 12:34:56.1366,1902-12-25
+1902-05-05 12:34:56.1367,1902-12-25
+1902-05-05 12:34:56.1368,1902-12-25
+1902-05-05 12:34:56.1369,1902-12-25
+1902-05-05 12:34:56.137,1902-12-25
+1902-05-05 12:34:56.1371,1902-12-25
+1902-05-05 12:34:56.1372,1902-12-25
+1902-05-05 12:34:56.1373,1902-12-25
+1902-05-05 12:34:56.1374,1902-12-25
+1902-05-05 12:34:56.1375,1902-12-25
+1902-05-05 12:34:56.1376,1902-12-25
+1902-05-05 12:34:56.1377,1902-12-25
+1902-05-05 12:34:56.1378,1902-12-25
+1902-05-05 12:34:56.1379,1902-12-25
+1902-05-05 12:34:56.138,1902-12-25
+1902-05-05 12:34:56.1381,1902-12-25
+1902-05-05 12:34:56.1382,1902-12-25
+1902-05-05 12:34:56.1383,1902-12-25
+1902-05-05 12:34:56.1384,1902-12-25
+1902-05-05 12:34:56.1385,1902-12-25
+1902-05-05 12:34:56.1386,1902-12-25
+1902-05-05 12:34:56.1387,1902-12-25
+1902-05-05 12:34:56.1388,1902-12-25
+1902-05-05 12:34:56.1389,1902-12-25
+1902-05-05 12:34:56.139,1902-12-25
+1902-05-05 12:34:56.1391,1902-12-25
+1902-05-05 12:34:56.1392,1902-12-25
+1902-05-05 12:34:56.1393,1902-12-25
+1902-05-05 12:34:56.1394,1902-12-25
+1902-05-05 12:34:56.1395,1902-12-25
+1902-05-05 12:34:56.1396,1902-12-25
+1902-05-05 12:34:56.1397,1902-12-25
+1902-05-05 12:34:56.1398,1902-12-25
+1902-05-05 12:34:56.1399,1902-12-25
+1902-05-05 12:34:56.14,1902-12-25
+1902-05-05 12:34:56.1401,1902-12-25
+1902-05-05 12:34:56.1402,1902-12-25
+1902-05-05 12:34:56.1403,1902-12-25
+1902-05-05 12:34:56.1404,1902-12-25
+1902-05-05 12:34:56.1405,1902-12-25
+1902-05-05 12:34:56.1406,1902-12-25
+1902-05-05 12:34:56.1407,1902-12-25
+1902-05-05 12:34:56.1408,1902-12-25
+1902-05-05 12:34:56.1409,1902-12-25
+1902-05-05 12:34:56.141,1902-12-25
+1902-05-05 12:34:56.1

<TRUNCATED>

[9/9] flink git commit: [FLINK-2170] [connectors] Add OrcRowInputFormat and OrcTableSource.

Posted by fh...@apache.org.
[FLINK-2170] [connectors] Add OrcRowInputFormat and OrcTableSource.

This closes #5043.


Project: http://git-wip-us.apache.org/repos/asf/flink/repo
Commit: http://git-wip-us.apache.org/repos/asf/flink/commit/200612ee
Tree: http://git-wip-us.apache.org/repos/asf/flink/tree/200612ee
Diff: http://git-wip-us.apache.org/repos/asf/flink/diff/200612ee

Branch: refs/heads/master
Commit: 200612ee0eaa42fdba141be138de172f86798f54
Parents: edbf8c9
Author: Fabian Hueske <fh...@apache.org>
Authored: Mon Nov 13 14:54:54 2017 +0100
Committer: Fabian Hueske <fh...@apache.org>
Committed: Wed Nov 22 23:11:30 2017 +0100

----------------------------------------------------------------------
 docs/dev/table/sourceSinks.md                   |    49 +
 flink-connectors/flink-orc/pom.xml              |    89 +-
 .../org/apache/flink/orc/OrcRowInputFormat.java |   745 ++
 .../org/apache/flink/orc/OrcTableSource.java    |   455 +-
 .../java/org/apache/flink/orc/OrcUtils.java     |  2379 ++--
 .../org/apache/flink/orc/RowOrcInputFormat.java |   241 -
 .../apache/flink/orc/OrcRowInputFormatTest.java |   795 ++
 .../apache/flink/orc/OrcTableSourceITCase.java  |   134 +-
 .../apache/flink/orc/OrcTableSourceTest.java    |   266 +-
 .../java/org/apache/flink/orc/OrcUtilsTest.java |   148 +
 .../apache/flink/orc/RowOrcInputFormatTest.java |   472 -
 .../test/resources/TestOrcFile.emptyFile.orc    |   Bin 523 -> 0 bytes
 .../TestOrcFile.listliststructlong.orc          |   Bin 845 -> 0 bytes
 .../src/test/resources/TestOrcFile.listlong.orc |   Bin 627 -> 0 bytes
 .../test/resources/TestOrcFile.liststring.orc   |   Bin 1298 -> 0 bytes
 .../src/test/resources/TestOrcFile.test1.orc    |   Bin 1711 -> 0 bytes
 .../test/resources/TestOrcFile.testDate1900.dat | 10000 -----------------
 .../test/resources/TestOrcFile.testDate1900.orc |   Bin 30941 -> 0 bytes
 .../flink-orc/src/test/resources/decimal.dat    |  6000 ----------
 .../flink-orc/src/test/resources/decimal.orc    |   Bin 16337 -> 0 bytes
 .../src/test/resources/demo-11-none.orc         |   Bin 5147970 -> 0 bytes
 .../src/test/resources/test-data-decimal.orc    |   Bin 0 -> 16337 bytes
 .../src/test/resources/test-data-flat.orc       |   Bin 0 -> 408522 bytes
 .../src/test/resources/test-data-nested.orc     |   Bin 0 -> 1711 bytes
 .../src/test/resources/test-data-nestedlist.orc |   Bin 0 -> 845 bytes
 .../src/test/resources/test-data-timetypes.orc  |   Bin 0 -> 30941 bytes
 .../flink/api/java/typeutils/RowTypeInfo.java   |    17 +
 .../logical/FlinkLogicalTableSourceScan.scala   |    16 +-
 .../table/plan/util/RexProgramExtractor.scala   |    12 +
 29 files changed, 3306 insertions(+), 18512 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flink/blob/200612ee/docs/dev/table/sourceSinks.md
----------------------------------------------------------------------
diff --git a/docs/dev/table/sourceSinks.md b/docs/dev/table/sourceSinks.md
index 0b4bdbe..7387358 100644
--- a/docs/dev/table/sourceSinks.md
+++ b/docs/dev/table/sourceSinks.md
@@ -47,6 +47,7 @@ A custom `TableSource` can be defined by implementing the `BatchTableSource` or
 | `Kafka08AvroTableSource` | `flink-connector-kafka-0.8` | N | Y | A `TableSource` for Avro-encoded Kafka 0.8 topics.
 | `Kafka08JsonTableSource` | `flink-connector-kafka-0.8` | N | Y | A `TableSource` for flat Json-encoded Kafka 0.8 topics.
 | `CsvTableSource` | `flink-table` | Y | Y | A simple `TableSource` for CSV files.
+| `OrcTableSource` | `flink-orc` | Y | N | A `TableSource` for ORC files.
 
 All sources that come with the `flink-table` dependency are directly available for Table API or SQL programs. For all other table sources, you have to add the respective dependency in addition to the `flink-table` dependency.
 
@@ -485,6 +486,54 @@ val csvTableSource = CsvTableSource
 
 {% top %}
 
+### OrcTableSource
+
+The `OrcTableSource` reads [ORC files](https://orc.apache.org). ORC is a file format for structured data and stores the data in a compressed, columnar representation. ORC is very storage efficient and supports projection and filter push-down.
+
+An `OrcTableSource` is created as shown below:
+
+<div class="codetabs" markdown="1">
+<div data-lang="java" markdown="1">
+{% highlight java %}
+
+// create Hadoop Configuration
+Configuration config = new Configuration();
+
+OrcTableSource orcTableSource = OrcTableSource.builder()
+  // path to ORC file(s)
+  .path("file:///path/to/data")
+  // schema of ORC files
+  .forOrcSchema("struct<name:string,addresses:array<struct<street:string,zip:smallint>>>")
+  // Hadoop configuration
+  .withConfiguration(config)
+  // build OrcTableSource
+  .build();
+{% endhighlight %}
+</div>
+
+<div data-lang="scala" markdown="1">
+{% highlight scala %}
+
+// create Hadoop Configuration
+val config = new Configuration()
+
+val orcTableSource = OrcTableSource.builder()
+  // path to ORC file(s)
+  .path("file:///path/to/data")
+  // schema of ORC files
+  .forOrcSchema("struct<name:string,addresses:array<struct<street:string,zip:smallint>>>")
+  // Hadoop configuration
+  .withConfiguration(config)
+  // build OrcTableSource
+  .build()
+{% endhighlight %}
+</div>
+</div>
+
+**Note:** The `OrcTableSource` does not support ORC's `Union` type yet.
+
+{% top %}
+
 Provided TableSinks
 -------------------
 

http://git-wip-us.apache.org/repos/asf/flink/blob/200612ee/flink-connectors/flink-orc/pom.xml
----------------------------------------------------------------------
diff --git a/flink-connectors/flink-orc/pom.xml b/flink-connectors/flink-orc/pom.xml
index 1ac7eaa..3ee5e49 100644
--- a/flink-connectors/flink-orc/pom.xml
+++ b/flink-connectors/flink-orc/pom.xml
@@ -25,7 +25,7 @@ under the License.
 	<parent>
 		<groupId>org.apache.flink</groupId>
 		<artifactId>flink-connectors</artifactId>
-		<version>1.4-SNAPSHOT</version>
+		<version>1.5-SNAPSHOT</version>
 		<relativePath>..</relativePath>
 	</parent>
 
@@ -40,22 +40,39 @@ under the License.
 
 		<dependency>
 			<groupId>org.apache.flink</groupId>
-			<artifactId>flink-table_${scala.binary.version}</artifactId>
+			<artifactId>flink-streaming-scala_${scala.binary.version}</artifactId>
 			<version>${project.version}</version>
-			<scope>compile</scope>
+			<scope>provided</scope>
 		</dependency>
 
 		<dependency>
 			<groupId>org.apache.flink</groupId>
-			<artifactId>flink-streaming-scala_${scala.binary.version}</artifactId>
+			<artifactId>flink-table_${scala.binary.version}</artifactId>
 			<version>${project.version}</version>
-			<scope>compile</scope>
+			<scope>provided</scope>
+			<!-- Projects depending on this project, won't depend on flink-table. -->
+			<optional>true</optional>
 		</dependency>
 
 		<dependency>
 			<groupId>org.apache.orc</groupId>
 			<artifactId>orc-core</artifactId>
-			<version>1.4.0</version>
+			<version>1.4.1</version>
+			<exclusions>
+				<!-- Exclude ORC's Hadoop dependency and pull in Flink's shaded Hadoop. -->
+				<exclusion>
+					<groupId>org.apache.hadoop</groupId>
+					<artifactId>hadoop-common</artifactId>
+				</exclusion>
+			</exclusions>
+		</dependency>
+
+		<!-- Replacement for ORC's Hadoop dependency. -->
+		<dependency>
+			<groupId>org.apache.flink</groupId>
+			<artifactId>flink-shaded-hadoop2</artifactId>
+			<version>${project.version}</version>
+			<scope>provided</scope>
 		</dependency>
 
 		<!-- test dependencies -->
@@ -88,65 +105,7 @@ under the License.
 			<scope>test</scope>
 			<type>test-jar</type>
 		</dependency>
-	</dependencies>
 
-	<build>
-
-		<pluginManagement>
-			<plugins>
-				<!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
-				<plugin>
-					<groupId>org.eclipse.m2e</groupId>
-					<artifactId>lifecycle-mapping</artifactId>
-					<version>1.0.0</version>
-					<configuration>
-						<lifecycleMappingMetadata>
-							<pluginExecutions>
-								<pluginExecution>
-									<pluginExecutionFilter>
-										<groupId>org.apache.maven.plugins</groupId>
-										<artifactId>maven-assembly-plugin</artifactId>
-										<versionRange>[2.4,)</versionRange>
-										<goals>
-											<goal>single</goal>
-										</goals>
-									</pluginExecutionFilter>
-									<action>
-										<ignore/>
-									</action>
-								</pluginExecution>
-								<pluginExecution>
-									<pluginExecutionFilter>
-										<groupId>org.apache.maven.plugins</groupId>
-										<artifactId>maven-clean-plugin</artifactId>
-										<versionRange>[1,)</versionRange>
-										<goals>
-											<goal>clean</goal>
-										</goals>
-									</pluginExecutionFilter>
-									<action>
-										<ignore/>
-									</action>
-								</pluginExecution>
-								<pluginExecution>
-									<pluginExecutionFilter>
-										<groupId>org.apache.avro</groupId>
-										<artifactId>avro-maven-plugin</artifactId>
-										<versionRange>[1.7.7,)</versionRange>
-										<goals>
-											<goal>schema</goal>
-										</goals>
-									</pluginExecutionFilter>
-									<action>
-										<ignore/>
-									</action>
-								</pluginExecution>
-							</pluginExecutions>
-						</lifecycleMappingMetadata>
-					</configuration>
-				</plugin>
-			</plugins>
-		</pluginManagement>
-	</build>
+	</dependencies>
 
 </project>

http://git-wip-us.apache.org/repos/asf/flink/blob/200612ee/flink-connectors/flink-orc/src/main/java/org/apache/flink/orc/OrcRowInputFormat.java
----------------------------------------------------------------------
diff --git a/flink-connectors/flink-orc/src/main/java/org/apache/flink/orc/OrcRowInputFormat.java b/flink-connectors/flink-orc/src/main/java/org/apache/flink/orc/OrcRowInputFormat.java
new file mode 100644
index 0000000..4353cbc
--- /dev/null
+++ b/flink-connectors/flink-orc/src/main/java/org/apache/flink/orc/OrcRowInputFormat.java
@@ -0,0 +1,745 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.flink.orc;
+
+import org.apache.flink.annotation.VisibleForTesting;
+import org.apache.flink.api.common.io.FileInputFormat;
+import org.apache.flink.api.common.typeinfo.TypeInformation;
+import org.apache.flink.api.java.tuple.Tuple2;
+import org.apache.flink.api.java.typeutils.ResultTypeQueryable;
+import org.apache.flink.api.java.typeutils.RowTypeInfo;
+import org.apache.flink.core.fs.FileInputSplit;
+import org.apache.flink.core.fs.Path;
+import org.apache.flink.types.Row;
+
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.hive.common.type.HiveDecimal;
+import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch;
+import org.apache.hadoop.hive.ql.io.sarg.PredicateLeaf;
+import org.apache.hadoop.hive.ql.io.sarg.SearchArgument;
+import org.apache.hadoop.hive.ql.io.sarg.SearchArgumentFactory;
+import org.apache.hadoop.hive.serde2.io.HiveDecimalWritable;
+import org.apache.orc.OrcConf;
+import org.apache.orc.OrcFile;
+import org.apache.orc.Reader;
+import org.apache.orc.RecordReader;
+import org.apache.orc.StripeInformation;
+import org.apache.orc.TypeDescription;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.sql.Date;
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import static org.apache.flink.orc.OrcUtils.fillRows;
+
+/**
+ * InputFormat to read ORC files.
+ */
+public class OrcRowInputFormat extends FileInputFormat<Row> implements ResultTypeQueryable<Row> {
+
+	private static final Logger LOG = LoggerFactory.getLogger(OrcRowInputFormat.class);
+	// the number of rows read in a batch
+	private static final int DEFAULT_BATCH_SIZE = 1000;
+
+	// the number of fields rows to read in a batch
+	private int batchSize;
+	// the configuration to read with
+	private Configuration conf;
+	// the schema of the ORC files to read
+	private TypeDescription schema;
+
+	// the fields of the ORC schema that the returned Rows are composed of.
+	private int[] selectedFields;
+	// the type information of the Rows returned by this InputFormat.
+	private transient RowTypeInfo rowType;
+
+	// the ORC reader
+	private transient RecordReader orcRowsReader;
+	// the vectorized row data to be read in a batch
+	private transient VectorizedRowBatch rowBatch;
+	// the vector of rows that is read in a batch
+	private transient Row[] rows;
+
+	// the number of rows in the current batch
+	private transient int rowsInBatch;
+	// the index of the next row to return
+	private transient int nextRow;
+
+	private ArrayList<Predicate> conjunctPredicates = new ArrayList<>();
+
+	/**
+	 * Creates an OrcRowInputFormat.
+	 *
+	 * @param path The path to read ORC files from.
+	 * @param schemaString The schema of the ORC files as String.
+	 * @param orcConfig The configuration to read the ORC files with.
+	 */
+	public OrcRowInputFormat(String path, String schemaString, Configuration orcConfig) {
+		this(path, TypeDescription.fromString(schemaString), orcConfig, DEFAULT_BATCH_SIZE);
+	}
+
+	/**
+	 * Creates an OrcRowInputFormat.
+	 *
+	 * @param path The path to read ORC files from.
+	 * @param schemaString The schema of the ORC files as String.
+	 * @param orcConfig The configuration to read the ORC files with.
+	 * @param batchSize The number of Row objects to read in a batch.
+	 */
+	public OrcRowInputFormat(String path, String schemaString, Configuration orcConfig, int batchSize) {
+		this(path, TypeDescription.fromString(schemaString), orcConfig, batchSize);
+	}
+
+	/**
+	 * Creates an OrcRowInputFormat.
+	 *
+	 * @param path The path to read ORC files from.
+	 * @param orcSchema The schema of the ORC files as ORC TypeDescription.
+	 * @param orcConfig The configuration to read the ORC files with.
+	 * @param batchSize The number of Row objects to read in a batch.
+	 */
+	public OrcRowInputFormat(String path, TypeDescription orcSchema, Configuration orcConfig, int batchSize) {
+		super(new Path(path));
+
+		// configure OrcRowInputFormat
+		this.schema = orcSchema;
+		this.rowType = (RowTypeInfo) OrcUtils.schemaToTypeInfo(schema);
+		this.conf = orcConfig;
+		this.batchSize = batchSize;
+
+		// set default selection mask, i.e., all fields.
+		this.selectedFields = new int[this.schema.getChildren().size()];
+		for (int i = 0; i < selectedFields.length; i++) {
+			this.selectedFields[i] = i;
+		}
+	}
+
+	/**
+	 * Adds a filter predicate to reduce the number of rows to be returned by the input format.
+	 * Multiple conjunctive predicates can be added by calling this method multiple times.
+	 *
+	 * <p>Note: Predicates can significantly reduce the amount of data that is read.
+	 * However, the OrcRowInputFormat does not guarantee that all returned rows qualify the
+	 * predicates. Moreover, predicates are only applied if the referenced field is among the
+	 * selected fields.
+	 *
+	 * @param predicate The filter predicate.
+	 */
+	public void addPredicate(Predicate predicate) {
+		// validate
+		validatePredicate(predicate);
+		// add predicate
+		this.conjunctPredicates.add(predicate);
+	}
+
+	private void validatePredicate(Predicate pred) {
+		if (pred instanceof ColumnPredicate) {
+			// check column name
+			String colName = ((ColumnPredicate) pred).columnName;
+			if (!this.schema.getFieldNames().contains(colName)) {
+				throw new IllegalArgumentException("Predicate cannot be applied. " +
+					"Column '" + colName + "' does not exist in ORC schema.");
+			}
+		} else if (pred instanceof Not) {
+			validatePredicate(((Not) pred).child());
+		} else if (pred instanceof Or) {
+			for (Predicate p : ((Or) pred).children()) {
+				validatePredicate(p);
+			}
+		}
+	}
+
+	/**
+	 * Selects the fields from the ORC schema that are returned by InputFormat.
+	 *
+	 * @param selectedFields The indices of the fields of the ORC schema that are returned by the InputFormat.
+	 */
+	public void selectFields(int... selectedFields) {
+		// set field mapping
+		this.selectedFields = selectedFields;
+		// adapt result type
+		this.rowType = RowTypeInfo.projectFields(this.rowType, selectedFields);
+	}
+
+	/**
+	 * Computes the ORC projection mask of the fields to include from the selected fields.rowOrcInputFormat.nextRecord(null).
+	 *
+	 * @return The ORC projection mask.
+	 */
+	private boolean[] computeProjectionMask() {
+		// mask with all fields of the schema
+		boolean[] projectionMask = new boolean[schema.getMaximumId() + 1];
+		// for each selected field
+		for (int inIdx : selectedFields) {
+			// set all nested fields of a selected field to true
+			TypeDescription fieldSchema = schema.getChildren().get(inIdx);
+			for (int i = fieldSchema.getId(); i <= fieldSchema.getMaximumId(); i++) {
+				projectionMask[i] = true;
+			}
+		}
+		return projectionMask;
+	}
+
+	@Override
+	public void openInputFormat() throws IOException {
+		super.openInputFormat();
+		// create and initialize the row batch
+		this.rows = new Row[batchSize];
+		for (int i = 0; i < batchSize; i++) {
+			rows[i] = new Row(selectedFields.length);
+		}
+	}
+
+	@Override
+	public void open(FileInputSplit fileSplit) throws IOException {
+
+		LOG.debug("Opening ORC file {}", fileSplit.getPath());
+
+		// open ORC file and create reader
+		org.apache.hadoop.fs.Path hPath = new org.apache.hadoop.fs.Path(fileSplit.getPath().getPath());
+		Reader orcReader = OrcFile.createReader(hPath, OrcFile.readerOptions(conf));
+
+		// get offset and length for the stripes that start in the split
+		Tuple2<Long, Long> offsetAndLength = getOffsetAndLengthForSplit(fileSplit, getStripes(orcReader));
+
+		// create ORC row reader configuration
+		Reader.Options options = getOptions(orcReader)
+			.schema(schema)
+			.range(offsetAndLength.f0, offsetAndLength.f1)
+			.useZeroCopy(OrcConf.USE_ZEROCOPY.getBoolean(conf))
+			.skipCorruptRecords(OrcConf.SKIP_CORRUPT_DATA.getBoolean(conf))
+			.tolerateMissingSchema(OrcConf.TOLERATE_MISSING_SCHEMA.getBoolean(conf));
+
+		// configure filters
+		if (!conjunctPredicates.isEmpty()) {
+			SearchArgument.Builder b = SearchArgumentFactory.newBuilder();
+			b = b.startAnd();
+			for (Predicate predicate : conjunctPredicates) {
+				predicate.add(b);
+			}
+			b = b.end();
+			options.searchArgument(b.build(), new String[]{});
+		}
+
+		// configure selected fields
+		options.include(computeProjectionMask());
+
+		// create ORC row reader
+		this.orcRowsReader = orcReader.rows(options);
+
+		// assign ids
+		this.schema.getId();
+		// create row batch
+		this.rowBatch = schema.createRowBatch(batchSize);
+		rowsInBatch = 0;
+		nextRow = 0;
+	}
+
+	@VisibleForTesting
+	Reader.Options getOptions(Reader orcReader) {
+		return orcReader.options();
+	}
+
+	@VisibleForTesting
+	List<StripeInformation> getStripes(Reader orcReader) {
+		return orcReader.getStripes();
+	}
+
+	private Tuple2<Long, Long> getOffsetAndLengthForSplit(FileInputSplit split, List<StripeInformation> stripes) {
+		long splitStart = split.getStart();
+		long splitEnd = splitStart + split.getLength();
+
+		long readStart = Long.MAX_VALUE;
+		long readEnd = Long.MIN_VALUE;
+
+		for (StripeInformation s : stripes) {
+			if (splitStart <= s.getOffset() && s.getOffset() < splitEnd) {
+				// stripe starts in split, so it is included
+				readStart = Math.min(readStart, s.getOffset());
+				readEnd = Math.max(readEnd, s.getOffset() + s.getLength());
+			}
+		}
+
+		if (readStart < Long.MAX_VALUE) {
+			// at least one split is included
+			return Tuple2.of(readStart, readEnd - readStart);
+		} else {
+			return Tuple2.of(0L, 0L);
+		}
+	}
+
+	@Override
+	public void close() throws IOException {
+		if (orcRowsReader != null) {
+			this.orcRowsReader.close();
+		}
+		this.orcRowsReader = null;
+	}
+
+	@Override
+	public void closeInputFormat() throws IOException {
+		this.rows = null;
+		this.rows = null;
+		this.schema = null;
+		this.rowBatch = null;
+	}
+
+	@Override
+	public boolean reachedEnd() throws IOException {
+		return !ensureBatch();
+	}
+
+	/**
+	 * Checks if there is at least one row left in the batch to return.
+	 * If no more row are available, it reads another batch of rows.
+	 *
+	 * @return Returns true if there is one more row to return, false otherwise.
+	 * @throws IOException throw if an exception happens while reading a batch.
+	 */
+	private boolean ensureBatch() throws IOException {
+
+		if (nextRow >= rowsInBatch) {
+			// No more rows available in the Rows array.
+			nextRow = 0;
+			// Try to read the next batch if rows from the ORC file.
+			boolean moreRows = orcRowsReader.nextBatch(rowBatch);
+
+			if (moreRows) {
+				// Load the data into the Rows array.
+				rowsInBatch = fillRows(rows, schema, rowBatch, selectedFields);
+			}
+			return moreRows;
+		}
+		// there is at least one Row left in the Rows array.
+		return true;
+	}
+
+	@Override
+	public Row nextRecord(Row reuse) throws IOException {
+		// return the next row
+		return rows[this.nextRow++];
+	}
+
+	@Override
+	public TypeInformation<Row> getProducedType() {
+		return rowType;
+	}
+
+	// --------------------------------------------------------------------------------------------
+	//  Custom serialization methods
+	// --------------------------------------------------------------------------------------------
+
+	private void writeObject(ObjectOutputStream out) throws IOException {
+		out.writeInt(batchSize);
+		this.conf.write(out);
+		out.writeUTF(schema.toString());
+
+		out.writeInt(selectedFields.length);
+		for (int f : selectedFields) {
+			out.writeInt(f);
+		}
+
+		out.writeInt(conjunctPredicates.size());
+		for (Predicate p : conjunctPredicates) {
+			out.writeObject(p);
+		}
+	}
+
+	@SuppressWarnings("unchecked")
+	private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
+		batchSize = in.readInt();
+		org.apache.hadoop.conf.Configuration configuration = new org.apache.hadoop.conf.Configuration();
+		configuration.readFields(in);
+
+		if (this.conf == null) {
+			this.conf = configuration;
+		}
+		this.schema = TypeDescription.fromString(in.readUTF());
+
+		this.selectedFields = new int[in.readInt()];
+		for (int i = 0; i < selectedFields.length; i++) {
+			this.selectedFields[i] = in.readInt();
+		}
+
+		this.conjunctPredicates = new ArrayList<>();
+		int numPreds = in.readInt();
+		for (int i = 0; i < numPreds; i++) {
+			conjunctPredicates.add((Predicate) in.readObject());
+		}
+	}
+
+	// --------------------------------------------------------------------------------------------
+	//  Classes to define predicates
+	// --------------------------------------------------------------------------------------------
+
+	/**
+	 * A filter predicate that can be evaluated by the OrcRowInputFormat.
+	 */
+	public abstract static class Predicate implements Serializable {
+		protected abstract SearchArgument.Builder add(SearchArgument.Builder builder);
+	}
+
+	abstract static class ColumnPredicate extends Predicate {
+		final String columnName;
+		final PredicateLeaf.Type literalType;
+
+		ColumnPredicate(String columnName, PredicateLeaf.Type literalType) {
+			this.columnName = columnName;
+			this.literalType = literalType;
+		}
+
+		Object castLiteral(Serializable literal) {
+
+			switch (literalType) {
+				case LONG:
+					if (literal instanceof Byte) {
+						return new Long((Byte) literal);
+					} else if (literal instanceof Short) {
+						return new Long((Short) literal);
+					} else if (literal instanceof Integer) {
+						return new Long((Integer) literal);
+					} else if (literal instanceof Long) {
+						return literal;
+					} else {
+						throw new IllegalArgumentException("A predicate on a LONG column requires an integer " +
+							"literal, i.e., Byte, Short, Integer, or Long.");
+					}
+				case FLOAT:
+					if (literal instanceof Float) {
+						return new Double((Float) literal);
+					} else if (literal instanceof Double) {
+						return literal;
+					} else if (literal instanceof BigDecimal) {
+						return ((BigDecimal) literal).doubleValue();
+					} else {
+						throw new IllegalArgumentException("A predicate on a FLOAT column requires a floating " +
+							"literal, i.e., Float or Double.");
+					}
+				case STRING:
+					if (literal instanceof String) {
+						return literal;
+					} else {
+						throw new IllegalArgumentException("A predicate on a STRING column requires a floating " +
+							"literal, i.e., Float or Double.");
+					}
+				case BOOLEAN:
+					if (literal instanceof Boolean) {
+						return literal;
+					} else {
+						throw new IllegalArgumentException("A predicate on a BOOLEAN column requires a Boolean literal.");
+					}
+				case DATE:
+					if (literal instanceof Date) {
+						return literal;
+					} else {
+						throw new IllegalArgumentException("A predicate on a DATE column requires a java.sql.Date literal.");
+					}
+				case TIMESTAMP:
+					if (literal instanceof Timestamp) {
+						return literal;
+					} else {
+						throw new IllegalArgumentException("A predicate on a TIMESTAMP column requires a java.sql.Timestamp literal.");
+					}
+				case DECIMAL:
+					if (literal instanceof BigDecimal) {
+						return new HiveDecimalWritable(HiveDecimal.create((BigDecimal) literal));
+					} else {
+						throw new IllegalArgumentException("A predicate on a DECIMAL column requires a BigDecimal literal.");
+					}
+				default:
+					throw new IllegalArgumentException("Unknown literal type " + literalType);
+			}
+		}
+	}
+
+	abstract static class BinaryPredicate extends ColumnPredicate {
+		final Serializable literal;
+
+		BinaryPredicate(String columnName, PredicateLeaf.Type literalType, Serializable literal) {
+			super(columnName, literalType);
+			this.literal = literal;
+		}
+	}
+
+	/**
+	 * An EQUALS predicate that can be evaluated by the OrcRowInputFormat.
+	 */
+	public static class Equals extends BinaryPredicate {
+		/**
+		 * Creates an EQUALS predicate.
+		 *
+		 * @param columnName The column to check.
+		 * @param literalType The type of the literal.
+		 * @param literal The literal value to check the column against.
+		 */
+		public Equals(String columnName, PredicateLeaf.Type literalType, Serializable literal) {
+			super(columnName, literalType, literal);
+		}
+
+		@Override
+		protected SearchArgument.Builder add(SearchArgument.Builder builder) {
+			return builder.equals(columnName, literalType, castLiteral(literal));
+		}
+
+		@Override
+		public String toString() {
+			return columnName + " = " + literal;
+		}
+	}
+
+	/**
+	 * An EQUALS predicate that can be evaluated with Null safety by the OrcRowInputFormat.
+	 */
+	public static class NullSafeEquals extends BinaryPredicate {
+		/**
+		 * Creates a null-safe EQUALS predicate.
+		 *
+		 * @param columnName The column to check.
+		 * @param literalType The type of the literal.
+		 * @param literal The literal value to check the column against.
+		 */
+		public NullSafeEquals(String columnName, PredicateLeaf.Type literalType, Serializable literal) {
+			super(columnName, literalType, literal);
+		}
+
+		@Override
+		protected SearchArgument.Builder add(SearchArgument.Builder builder) {
+			return builder.nullSafeEquals(columnName, literalType, castLiteral(literal));
+		}
+
+		@Override
+		public String toString() {
+			return columnName + " = " + literal;
+		}
+	}
+
+	/**
+	 * A LESS_THAN predicate that can be evaluated by the OrcRowInputFormat.
+	 */
+	public static class LessThan extends BinaryPredicate {
+		/**
+		 * Creates a LESS_THAN predicate.
+		 *
+		 * @param columnName The column to check.
+		 * @param literalType The type of the literal.
+		 * @param literal The literal value to check the column against.
+		 */
+		public LessThan(String columnName, PredicateLeaf.Type literalType, Serializable literal) {
+			super(columnName, literalType, literal);
+		}
+
+		@Override
+		protected SearchArgument.Builder add(SearchArgument.Builder builder) {
+			return builder.lessThan(columnName, literalType, castLiteral(literal));
+		}
+
+		@Override
+		public String toString() {
+			return columnName + " < " + literal;
+		}
+	}
+
+	/**
+	 * A LESS_THAN_EQUALS predicate that can be evaluated by the OrcRowInputFormat.
+	 */
+	public static class LessThanEquals extends BinaryPredicate {
+		/**
+		 * Creates a LESS_THAN_EQUALS predicate.
+		 *
+		 * @param columnName The column to check.
+		 * @param literalType The type of the literal.
+		 * @param literal The literal value to check the column against.
+		 */
+		public LessThanEquals(String columnName, PredicateLeaf.Type literalType, Serializable literal) {
+			super(columnName, literalType, literal);
+		}
+
+		@Override
+		protected SearchArgument.Builder add(SearchArgument.Builder builder) {
+			return builder.lessThanEquals(columnName, literalType, castLiteral(literal));
+		}
+
+		@Override
+		public String toString() {
+			return columnName + " <= " + literal;
+		}
+	}
+
+	/**
+	 * An IS_NULL predicate that can be evaluated by the OrcRowInputFormat.
+	 */
+	public static class IsNull extends ColumnPredicate {
+		/**
+		 * Creates an IS_NULL predicate.
+		 *
+		 * @param columnName The column to check for null.
+		 * @param literalType The type of the column to check for null.
+		 */
+		public IsNull(String columnName, PredicateLeaf.Type literalType) {
+			super(columnName, literalType);
+		}
+
+		@Override
+		protected SearchArgument.Builder add(SearchArgument.Builder builder) {
+			return builder.isNull(columnName, literalType);
+		}
+
+		@Override
+		public String toString() {
+			return columnName + " IS NULL";
+		}
+	}
+
+	/**
+	 * An BETWEEN predicate that can be evaluated by the OrcRowInputFormat.
+	 */
+	public static class Between extends ColumnPredicate {
+		private Serializable lowerBound;
+		private Serializable upperBound;
+
+		/**
+		 * Creates an BETWEEN predicate.
+		 *
+		 * @param columnName The column to check.
+		 * @param literalType The type of the literals.
+		 * @param lowerBound The literal value of the (inclusive) lower bound to check the column against.
+		 * @param upperBound The literal value of the (inclusive) upper bound to check the column against.
+		 */
+		public Between(String columnName, PredicateLeaf.Type literalType, Serializable lowerBound, Serializable upperBound) {
+			super(columnName, literalType);
+			this.lowerBound = lowerBound;
+			this.upperBound = upperBound;
+		}
+
+		@Override
+		protected SearchArgument.Builder add(SearchArgument.Builder builder) {
+			return builder.between(columnName, literalType, castLiteral(lowerBound), castLiteral(upperBound));
+		}
+
+		@Override
+		public String toString() {
+			return lowerBound + " <= " + columnName + " <= " + upperBound;
+		}
+	}
+
+	/**
+	 * An IN predicate that can be evaluated by the OrcRowInputFormat.
+	 */
+	public static class In extends ColumnPredicate {
+		private Serializable[] literals;
+
+		/**
+		 * Creates an IN predicate.
+		 *
+		 * @param columnName The column to check.
+		 * @param literalType The type of the literals.
+		 * @param literals The literal values to check the column against.
+		 */
+		public In(String columnName, PredicateLeaf.Type literalType, Serializable... literals) {
+			super(columnName, literalType);
+			this.literals = literals;
+		}
+
+		@Override
+		protected SearchArgument.Builder add(SearchArgument.Builder builder) {
+			Object[] castedLiterals = new Object[literals.length];
+			for (int i = 0; i < literals.length; i++) {
+				castedLiterals[i] = castLiteral(literals[i]);
+			}
+			return builder.in(columnName, literalType, (Object[]) castedLiterals);
+		}
+
+		@Override
+		public String toString() {
+			return columnName + " IN " + Arrays.toString(literals);
+		}
+	}
+
+	/**
+	 * A NOT predicate to negate a predicate that can be evaluated by the OrcRowInputFormat.
+	 */
+	public static class Not extends Predicate {
+		private final Predicate pred;
+
+		/**
+		 * Creates a NOT predicate.
+		 *
+		 * @param predicate The predicate to negate.
+		 */
+		public Not(Predicate predicate) {
+			this.pred = predicate;
+		}
+
+		protected SearchArgument.Builder add(SearchArgument.Builder builder) {
+			return pred.add(builder.startNot()).end();
+		}
+
+		protected Predicate child() {
+			return pred;
+		}
+
+		@Override
+		public String toString() {
+			return "NOT(" + pred.toString() + ")";
+		}
+	}
+
+	/**
+	 * An OR predicate that can be evaluated by the OrcRowInputFormat.
+	 */
+	public static class Or extends Predicate {
+		private final Predicate[] preds;
+
+		/**
+		 * Creates an OR predicate.
+		 *
+		 * @param predicates The disjunctive predicates.
+		 */
+		public Or(Predicate... predicates) {
+			this.preds = predicates;
+		}
+
+		@Override
+		protected SearchArgument.Builder add(SearchArgument.Builder builder) {
+			SearchArgument.Builder withOr = builder.startOr();
+			for (Predicate p : preds) {
+				withOr = p.add(withOr);
+			}
+			return withOr.end();
+		}
+
+		protected Iterable<Predicate> children() {
+			return Arrays.asList(preds);
+		}
+
+		@Override
+		public String toString() {
+			return "OR(" + Arrays.toString(preds) + ")";
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/flink/blob/200612ee/flink-connectors/flink-orc/src/main/java/org/apache/flink/orc/OrcTableSource.java
----------------------------------------------------------------------
diff --git a/flink-connectors/flink-orc/src/main/java/org/apache/flink/orc/OrcTableSource.java b/flink-connectors/flink-orc/src/main/java/org/apache/flink/orc/OrcTableSource.java
index 0454ba4..b7c5378 100644
--- a/flink-connectors/flink-orc/src/main/java/org/apache/flink/orc/OrcTableSource.java
+++ b/flink-connectors/flink-orc/src/main/java/org/apache/flink/orc/OrcTableSource.java
@@ -18,111 +18,474 @@
 
 package org.apache.flink.orc;
 
+import org.apache.flink.annotation.VisibleForTesting;
+import org.apache.flink.api.common.typeinfo.BasicTypeInfo;
+import org.apache.flink.api.common.typeinfo.SqlTimeTypeInfo;
 import org.apache.flink.api.common.typeinfo.TypeInformation;
 import org.apache.flink.api.java.DataSet;
 import org.apache.flink.api.java.ExecutionEnvironment;
 import org.apache.flink.api.java.typeutils.RowTypeInfo;
+import org.apache.flink.orc.OrcRowInputFormat.Predicate;
+import org.apache.flink.table.api.TableSchema;
+import org.apache.flink.table.expressions.Attribute;
+import org.apache.flink.table.expressions.BinaryComparison;
+import org.apache.flink.table.expressions.EqualTo;
+import org.apache.flink.table.expressions.Expression;
+import org.apache.flink.table.expressions.GreaterThan;
+import org.apache.flink.table.expressions.GreaterThanOrEqual;
+import org.apache.flink.table.expressions.IsNotNull;
+import org.apache.flink.table.expressions.IsNull;
+import org.apache.flink.table.expressions.LessThan;
+import org.apache.flink.table.expressions.LessThanOrEqual;
+import org.apache.flink.table.expressions.Literal;
+import org.apache.flink.table.expressions.Not;
+import org.apache.flink.table.expressions.NotEqualTo;
+import org.apache.flink.table.expressions.Or;
+import org.apache.flink.table.expressions.UnaryExpression;
 import org.apache.flink.table.sources.BatchTableSource;
+import org.apache.flink.table.sources.FilterableTableSource;
 import org.apache.flink.table.sources.ProjectableTableSource;
 import org.apache.flink.table.sources.TableSource;
 import org.apache.flink.types.Row;
+import org.apache.flink.util.Preconditions;
 
 import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.hive.ql.io.sarg.PredicateLeaf;
 import org.apache.orc.TypeDescription;
 
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
 /**
- * Creates a TableSource to read ORC file.
+ * A TableSource to read ORC files.
  *
- * <p>The ORC file path and schema is passed during {@link OrcTableSource} construction. configuration is optional.
+ * <p>The {@link OrcTableSource} supports projection and filter push-down.</p>
  *
- * <p>The OrcTableSource is used as shown in the example below.
+ * <p>An {@link OrcTableSource} is used as shown in the example below.
  *
  * <pre>
  * {@code
- * String path = testInputURL.getPath();
- * String schema = "struct<col1:boolean,col2:tinyint,col3:smallint,col4:int>"
- * OrcTableSource orcSrc = new OrcTableSource(path, schema);
+ * OrcTableSource orcSrc = OrcTableSource.builder()
+ *   .path("file:///my/data/file.orc")
+ *   .forOrcSchema("struct<col1:boolean,col2:tinyint,col3:smallint,col4:int>")
+ *   .build();
+ *
  * tEnv.registerTableSource("orcTable", orcSrc);
  * Table res = tableEnv.sql("SELECT * FROM orcTable");
  * }
  * </pre>
  */
-public class OrcTableSource implements BatchTableSource<Row>, ProjectableTableSource<Row> {
+public class OrcTableSource
+	implements BatchTableSource<Row>, ProjectableTableSource<Row>, FilterableTableSource<Row> {
 
-	private String path;
-	private TypeDescription orcSchema;
-	private RowTypeInfo typeInfo;
-	private Configuration orcConfig;
-	private int[] fieldMapping;
+	private static final int DEFAULT_BATCH_SIZE = 1000;
 
-	/**
-	 * The ORC file path and schema.
-	 *
-	 * @param path      the path of orc file
-	 * @param orcSchema schema of orc file
-	 */
-	public OrcTableSource(String path, String orcSchema) {
-		this(path, orcSchema, new Configuration());
-	}
+	// path to read ORC files from
+	private final String path;
+	// schema of the ORC file
+	private final TypeDescription orcSchema;
+	// the schema of the Table
+	private final TableSchema tableSchema;
+	// the configuration to read the file
+	private final Configuration orcConfig;
+	// the number of rows to read in a batch
+	private final int batchSize;
+
+	// type information of the data returned by the InputFormat
+	private final RowTypeInfo typeInfo;
+	// list of selected ORC fields to return
+	private final int[] selectedFields;
+	// list of predicates to apply
+	private final Predicate[] predicates;
 
 	/**
-	 * The file path and schema of orc file, and configuration to read orc file .
+	 * Creates an OrcTableSouce from an ORC TypeDescription.
 	 *
-	 * @param path      the path of orc file
-	 * @param orcSchema schema of orc file
-	 * @param orcConfig configuration to read orc file
+	 * @param path		The path to read the ORC files from.
+	 * @param orcSchema The schema of the ORC files as TypeDescription.
+	 * @param orcConfig The configuration to read the ORC files.
+	 * @param batchSize The number of Rows to read in a batch, default is 1000.
 	 */
-	public OrcTableSource(String path, String orcSchema, Configuration orcConfig) {
-		this(path, TypeDescription.fromString(orcSchema), orcConfig);
+	private OrcTableSource(String path, TypeDescription orcSchema, Configuration orcConfig, int batchSize) {
+		this(path, orcSchema, orcConfig, batchSize, null, null);
 	}
 
-	public OrcTableSource(String path, TypeDescription orcSchema, Configuration orcConfig) {
+	private OrcTableSource(String path, TypeDescription orcSchema, Configuration orcConfig,
+							int batchSize, int[] selectedFields, Predicate[] predicates) {
+
+		Preconditions.checkNotNull(path, "Path must not be null.");
+		Preconditions.checkNotNull(orcSchema, "OrcSchema must not be null.");
+		Preconditions.checkNotNull(path, "Configuration must not be null.");
+		Preconditions.checkArgument(batchSize > 0, "Batch size must be larger than null.");
 		this.path = path;
 		this.orcSchema = orcSchema;
 		this.orcConfig = orcConfig;
+		this.batchSize = batchSize;
+		this.selectedFields = selectedFields;
+		this.predicates = predicates;
 
-		this.typeInfo = (RowTypeInfo) OrcUtils.schemaToTypeInfo(this.orcSchema);
+		// determine the type information from the ORC schema
+		RowTypeInfo typeInfoFromSchema = (RowTypeInfo) OrcUtils.schemaToTypeInfo(this.orcSchema);
+
+		// set return type info
+		if (selectedFields == null) {
+			this.typeInfo = typeInfoFromSchema;
+		} else {
+			this.typeInfo = RowTypeInfo.projectFields(typeInfoFromSchema, selectedFields);
+		}
 
+		// create a TableSchema that corresponds to the ORC schema
+		this.tableSchema = new TableSchema(
+			typeInfoFromSchema.getFieldNames(),
+			typeInfoFromSchema.getFieldTypes()
+		);
 	}
 
 	@Override
 	public DataSet<Row> getDataSet(ExecutionEnvironment execEnv) {
-
-		RowOrcInputFormat orcIF = new RowOrcInputFormat(path, orcSchema, orcConfig);
-		if (fieldMapping != null) {
-			orcIF.setFieldMapping(fieldMapping);
+		OrcRowInputFormat orcIF = buildOrcInputFormat();
+		if (selectedFields != null) {
+			orcIF.selectFields(selectedFields);
+		}
+		if (predicates != null) {
+			for (OrcRowInputFormat.Predicate pred : predicates) {
+				orcIF.addPredicate(pred);
+			}
 		}
 		return execEnv.createInput(orcIF);
 	}
 
+	@VisibleForTesting
+	protected OrcRowInputFormat buildOrcInputFormat() {
+		return new OrcRowInputFormat(path, orcSchema, orcConfig, batchSize);
+	}
+
 	@Override
 	public TypeInformation<Row> getReturnType() {
 		return typeInfo;
 	}
 
 	@Override
-	public TableSource<Row> projectFields(int[] fields) {
+	public TableSchema getTableSchema() {
+		return this.tableSchema;
+	}
 
-		OrcTableSource copy = new OrcTableSource(path, orcSchema, orcConfig);
+	@Override
+	public TableSource<Row> projectFields(int[] selectedFields) {
+		// create a copy of the OrcTableSouce with new selected fields
+		return new OrcTableSource(path, orcSchema, orcConfig, batchSize, selectedFields, predicates);
+	}
 
-		// set field mapping
-		copy.fieldMapping = fields;
+	@Override
+	public TableSource<Row> applyPredicate(List<Expression> predicates) {
+		ArrayList<Predicate> orcPredicates = new ArrayList<>();
 
-		// adapt TypeInfo
-		TypeInformation[] fieldTypes = new TypeInformation[fields.length];
-		String[] fieldNames = new String[fields.length];
-		for (int i = 0; i < fields.length; i++) {
-			fieldTypes[i] = this.typeInfo.getTypeAt(fields[i]);
-			fieldNames[i] = this.typeInfo.getFieldNames()[fields[i]];
+		// we do not remove any predicates from the list because ORC does not fully apply predicates
+		for (Expression pred : predicates) {
+			Predicate orcPred = toOrcPredicate(pred);
+			if (orcPred != null) {
+				orcPredicates.add(orcPred);
+			}
 		}
-		copy.typeInfo = new RowTypeInfo(fieldTypes, fieldNames);
 
-		return copy;
+		return new OrcTableSource(path, orcSchema, orcConfig, batchSize, selectedFields, orcPredicates.toArray(new Predicate[]{}));
+	}
+
+	@Override
+	public boolean isFilterPushedDown() {
+		return this.predicates != null;
 	}
 
 	@Override
 	public String explainSource() {
-		return "ORC Source file at path " + this.path + " with schema " + this.orcSchema;
+		return "OrcFile[path=" + path + ", schema=" + orcSchema + ", filter=" + predicateString() + "]";
+	}
+
+	private String predicateString() {
+		if (predicates != null) {
+			return "AND(" + Arrays.toString(predicates) + ")";
+		} else {
+			return "TRUE";
+		}
+	}
+
+	// Predicate conversion for filter push-down.
+
+	private Predicate toOrcPredicate(Expression pred) {
+		if (pred instanceof Or) {
+			Predicate c1 = toOrcPredicate(((Or) pred).left());
+			Predicate c2 = toOrcPredicate(((Or) pred).right());
+			if (c1 == null || c2 == null) {
+				return null;
+			} else {
+				return new OrcRowInputFormat.Or(c1, c2);
+			}
+		} else if (pred instanceof Not) {
+			Predicate c = toOrcPredicate(((Not) pred).child());
+			if (c == null) {
+				return null;
+			} else {
+				return new OrcRowInputFormat.Not(c);
+			}
+		} else if (pred instanceof BinaryComparison) {
+
+			BinaryComparison binComp = (BinaryComparison) pred;
+
+			if (!isValid(binComp)) {
+				// not a valid predicate
+				return null;
+			}
+			PredicateLeaf.Type litType = getLiteralType(binComp);
+			if (litType == null) {
+				// unsupported literal type
+				return null;
+			}
+
+			boolean literalOnRight = literalOnRight(binComp);
+			String colName = getColumnName(binComp);
+			Serializable literal = (Serializable) getLiteral(binComp);
+
+			if (pred instanceof EqualTo) {
+				return new OrcRowInputFormat.Equals(colName, litType, literal);
+			} else if (pred instanceof NotEqualTo) {
+				return new OrcRowInputFormat.Not(
+					new OrcRowInputFormat.Equals(colName, litType, literal));
+			} else if (pred instanceof GreaterThan) {
+				if (literalOnRight) {
+					return new OrcRowInputFormat.Not(
+						new OrcRowInputFormat.LessThanEquals(colName, litType, literal));
+				} else {
+					return new OrcRowInputFormat.LessThan(colName, litType, literal);
+				}
+			} else if (pred instanceof GreaterThanOrEqual) {
+				if (literalOnRight) {
+					return new OrcRowInputFormat.Not(
+						new OrcRowInputFormat.LessThan(colName, litType, literal));
+				} else {
+					return new OrcRowInputFormat.LessThanEquals(colName, litType, literal);
+				}
+			} else if (pred instanceof LessThan) {
+				if (literalOnRight) {
+					return new OrcRowInputFormat.LessThan(colName, litType, literal);
+				} else {
+					return new OrcRowInputFormat.Not(
+						new OrcRowInputFormat.LessThanEquals(colName, litType, literal));
+				}
+			} else if (pred instanceof LessThanOrEqual) {
+				if (literalOnRight) {
+					return new OrcRowInputFormat.LessThanEquals(colName, litType, literal);
+				} else {
+					return new OrcRowInputFormat.Not(
+						new OrcRowInputFormat.LessThan(colName, litType, literal));
+				}
+			} else {
+				// unsupported predicate
+				return null;
+			}
+		} else if (pred instanceof UnaryExpression) {
+
+			UnaryExpression unary = (UnaryExpression) pred;
+			if (!isValid(unary)) {
+				// not a valid predicate
+				return null;
+			}
+			PredicateLeaf.Type colType = toOrcType(((UnaryExpression) pred).child().resultType());
+			if (colType == null) {
+				// unsupported type
+				return null;
+			}
+
+			String colName = getColumnName(unary);
+
+			if (pred instanceof IsNull) {
+				return new OrcRowInputFormat.IsNull(colName, colType);
+			} else if (pred instanceof IsNotNull) {
+				return new OrcRowInputFormat.Not(
+					new OrcRowInputFormat.IsNull(colName, colType));
+			} else {
+				// unsupported predicate
+				return null;
+			}
+		} else {
+			// unsupported predicate
+			return null;
+		}
+	}
+
+	private boolean isValid(UnaryExpression unary) {
+		return unary.child() instanceof Attribute;
+	}
+
+	private boolean isValid(BinaryComparison comp) {
+		return (comp.left() instanceof Literal && comp.right() instanceof Attribute) ||
+			(comp.left() instanceof Attribute && comp.right() instanceof Literal);
+	}
+
+	private boolean literalOnRight(BinaryComparison comp) {
+		if (comp.left() instanceof Literal && comp.right() instanceof Attribute) {
+			return false;
+		} else if (comp.left() instanceof Attribute && comp.right() instanceof Literal) {
+			return true;
+		} else {
+			throw new RuntimeException("Invalid binary comparison.");
+		}
+	}
+
+	private String getColumnName(UnaryExpression unary) {
+		return ((Attribute) unary.child()).name();
+	}
+
+	private String getColumnName(BinaryComparison comp) {
+		if (literalOnRight(comp)) {
+			return ((Attribute) comp.left()).name();
+		} else {
+			return ((Attribute) comp.right()).name();
+		}
+	}
+
+	private PredicateLeaf.Type getLiteralType(BinaryComparison comp) {
+		if (literalOnRight(comp)) {
+			return toOrcType(((Literal) comp.right()).resultType());
+		} else {
+			return toOrcType(((Literal) comp.left()).resultType());
+		}
+	}
+
+	private Object getLiteral(BinaryComparison comp) {
+		if (literalOnRight(comp)) {
+			return ((Literal) comp.right()).value();
+		} else {
+			return ((Literal) comp.left()).value();
+		}
+	}
+
+	private PredicateLeaf.Type toOrcType(TypeInformation<?> type) {
+		if (type == BasicTypeInfo.BYTE_TYPE_INFO ||
+			type == BasicTypeInfo.SHORT_TYPE_INFO ||
+			type == BasicTypeInfo.INT_TYPE_INFO ||
+			type == BasicTypeInfo.LONG_TYPE_INFO) {
+			return PredicateLeaf.Type.LONG;
+		} else if (type == BasicTypeInfo.FLOAT_TYPE_INFO ||
+			type == BasicTypeInfo.DOUBLE_TYPE_INFO) {
+			return PredicateLeaf.Type.FLOAT;
+		} else if (type == BasicTypeInfo.BOOLEAN_TYPE_INFO) {
+			return PredicateLeaf.Type.BOOLEAN;
+		} else if (type == BasicTypeInfo.STRING_TYPE_INFO) {
+			return PredicateLeaf.Type.STRING;
+		} else if (type == SqlTimeTypeInfo.TIMESTAMP) {
+			return PredicateLeaf.Type.TIMESTAMP;
+		} else if (type == SqlTimeTypeInfo.DATE) {
+			return PredicateLeaf.Type.DATE;
+		} else if (type == BasicTypeInfo.BIG_DEC_TYPE_INFO) {
+			return PredicateLeaf.Type.DECIMAL;
+		} else {
+			// unsupported type
+			return null;
+		}
+	}
+
+	// Builder
+
+	public static Builder builder() {
+		return new Builder();
+	}
+
+	/**
+	 * Constructs an {@link OrcTableSource}.
+	 */
+	public static class Builder {
+
+		private String path;
+
+		private TypeDescription schema;
+
+		private Configuration config;
+
+		private int batchSize = 0;
+
+		/**
+		 * Sets the path of the ORC file(s).
+		 *
+		 * @param path The path of the ORC file(s).
+		 * @return The builder.
+		 */
+		public Builder path(String path) {
+			Preconditions.checkNotNull(path, "Path must not be null.");
+			Preconditions.checkArgument(!path.isEmpty(), "Path must not be empty.");
+			this.path = path;
+			return this;
+		}
+
+		/**
+		 * Sets the ORC schema of the files to read as a String.
+		 *
+		 * @param orcSchema The ORC schema of the files to read as a String.
+		 * @return The builder.
+		 */
+		public Builder forOrcSchema(String orcSchema) {
+			Preconditions.checkNotNull(orcSchema, "ORC schema must not be null.");
+			this.schema = TypeDescription.fromString(orcSchema);
+			return this;
+		}
+
+		/**
+		 * Sets the ORC schema of the files to read as a {@link TypeDescription}.
+		 *
+		 * @param orcSchema The ORC schema of the files to read as a String.
+		 * @return The builder.
+		 */
+		public Builder forOrcSchema(TypeDescription orcSchema) {
+			Preconditions.checkNotNull(orcSchema, "ORC Schema must not be null.");
+			this.schema = orcSchema;
+			return this;
+		}
+
+		/**
+		 * Sets a Hadoop {@link Configuration} for the ORC reader. If no configuration is configured,
+		 * an empty configuration is used.
+		 *
+		 * @param config The Hadoop Configuration for the ORC reader.
+		 * @return The builder.
+		 */
+		public Builder withConfiguration(Configuration config) {
+			Preconditions.checkNotNull(config, "Configuration must not be null.");
+			this.config = config;
+			return this;
+		}
+
+		/**
+		 * Sets the number of rows that are read in a batch. If not configured, the ORC files are
+		 * read with a batch size of 1000.
+		 *
+		 * @param batchSize The number of rows that are read in a batch.
+		 * @return The builder.
+		 */
+		public Builder withBatchSize(int batchSize) {
+			Preconditions.checkArgument(batchSize > 0, "Batch size must be greater than zero.");
+			this.batchSize = batchSize;
+			return this;
+		}
+
+		/**
+		 * Builds the OrcTableSource for this builder.
+		 *
+		 * @return The OrcTableSource for this builder.
+		 */
+		public OrcTableSource build() {
+			Preconditions.checkNotNull(this.path, "Path must not be null.");
+			Preconditions.checkNotNull(this.schema, "ORC schema must not be null.");
+			if (this.config == null) {
+				this.config = new Configuration();
+			}
+			if (this.batchSize == 0) {
+				// set default batch size
+				this.batchSize = DEFAULT_BATCH_SIZE;
+			}
+			return new OrcTableSource(this.path, this.schema, this.config, this.batchSize);
+		}
+
 	}
 
 }


[7/9] flink git commit: [FLINK-2170] [connectors] Add OrcRowInputFormat and OrcTableSource.

Posted by fh...@apache.org.
http://git-wip-us.apache.org/repos/asf/flink/blob/200612ee/flink-connectors/flink-orc/src/main/java/org/apache/flink/orc/RowOrcInputFormat.java
----------------------------------------------------------------------
diff --git a/flink-connectors/flink-orc/src/main/java/org/apache/flink/orc/RowOrcInputFormat.java b/flink-connectors/flink-orc/src/main/java/org/apache/flink/orc/RowOrcInputFormat.java
deleted file mode 100644
index 0c9c549..0000000
--- a/flink-connectors/flink-orc/src/main/java/org/apache/flink/orc/RowOrcInputFormat.java
+++ /dev/null
@@ -1,241 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.flink.orc;
-
-import org.apache.flink.api.common.io.FileInputFormat;
-import org.apache.flink.api.common.typeinfo.TypeInformation;
-import org.apache.flink.api.java.typeutils.ResultTypeQueryable;
-import org.apache.flink.api.java.typeutils.RowTypeInfo;
-import org.apache.flink.core.fs.FileInputSplit;
-import org.apache.flink.core.fs.Path;
-import org.apache.flink.types.Row;
-import org.apache.flink.util.Preconditions;
-
-import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch;
-
-import org.apache.orc.OrcConf;
-import org.apache.orc.OrcFile;
-import org.apache.orc.Reader;
-import org.apache.orc.RecordReader;
-import org.apache.orc.TypeDescription;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-
-import static org.apache.flink.orc.OrcUtils.fillRows;
-
-/**
- * InputFormat to read ORC data.
- * For Optimization, reading is done in batch instead of a single row.
- */
-public class RowOrcInputFormat
-	extends FileInputFormat<Row>
-	implements ResultTypeQueryable<Row> {
-
-	private static final Logger LOG = LoggerFactory.getLogger(RowOrcInputFormat.class);
-	private static final int BATCH_SIZE = 1024;
-
-	private org.apache.hadoop.conf.Configuration config;
-	private TypeDescription schema;
-	private int[] fieldMapping;
-
-	private transient RowTypeInfo rowType;
-	private transient RecordReader orcRowsReader;
-	private transient VectorizedRowBatch rowBatch;
-	private transient Row[] rows;
-
-	private transient int rowInBatch;
-
-	public RowOrcInputFormat(String path, String schemaString, Configuration orcConfig) {
-		this(path, TypeDescription.fromString(schemaString), orcConfig);
-	}
-
-	public RowOrcInputFormat(String path, TypeDescription orcSchema, Configuration orcConfig) {
-		super(new Path(path));
-		this.unsplittable = false;
-		this.schema = orcSchema;
-		this.rowType = (RowTypeInfo) OrcUtils.schemaToTypeInfo(schema);
-		this.config = orcConfig;
-
-		this.fieldMapping = new int[this.schema.getChildren().size()];
-		for (int i = 0; i < fieldMapping.length; i++) {
-			this.fieldMapping[i] = i;
-		}
-
-	}
-
-	public void setFieldMapping(int[] fieldMapping) {
-		this.fieldMapping = fieldMapping;
-		// adapt result type
-
-		TypeInformation[] fieldTypes = new TypeInformation[fieldMapping.length];
-		String[] fieldNames = new String[fieldMapping.length];
-		for (int i = 0; i < fieldMapping.length; i++) {
-			fieldTypes[i] = this.rowType.getTypeAt(fieldMapping[i]);
-			fieldNames[i] = this.rowType.getFieldNames()[fieldMapping[i]];
-		}
-		this.rowType = new RowTypeInfo(fieldTypes, fieldNames);
-	}
-
-	private boolean[] computeProjectionMask() {
-		boolean[] projectionMask = new boolean[schema.getMaximumId() + 1];
-		for (int inIdx : fieldMapping) {
-			TypeDescription fieldSchema = schema.getChildren().get(inIdx);
-			for (int i = fieldSchema.getId(); i <= fieldSchema.getMaximumId(); i++) {
-				projectionMask[i] = true;
-			}
-		}
-		return projectionMask;
-	}
-
-	@Override
-	public void openInputFormat() throws IOException {
-		super.openInputFormat();
-		this.rows = new Row[BATCH_SIZE];
-		for (int i = 0; i < BATCH_SIZE; i++) {
-			rows[i] = new Row(fieldMapping.length);
-		}
-	}
-
-	@Override
-	public void open(FileInputSplit fileSplit) throws IOException {
-
-		this.currentSplit = fileSplit;
-		Preconditions.checkArgument(this.splitStart == 0, "ORC files must be read from the start.");
-
-		if (LOG.isDebugEnabled()) {
-			LOG.debug("Opening ORC file " + fileSplit.getPath());
-		}
-
-		org.apache.hadoop.fs.Path hPath = new org.apache.hadoop.fs.Path(fileSplit.getPath().getPath());
-
-		Reader orcReader = OrcFile.createReader(hPath, OrcFile.readerOptions(config));
-
-		Reader.Options options = orcReader.options()
-			.range(fileSplit.getStart(), fileSplit.getLength())
-			.useZeroCopy(OrcConf.USE_ZEROCOPY.getBoolean(config))
-			.skipCorruptRecords(OrcConf.SKIP_CORRUPT_DATA.getBoolean(config))
-			.tolerateMissingSchema(OrcConf.TOLERATE_MISSING_SCHEMA.getBoolean(config));
-
-		options.include(computeProjectionMask());
-
-		// check that schema of file is as expected
-		if (!this.schema.equals(orcReader.getSchema())) {
-
-			throw new RuntimeException("Invalid schema for file at " + this.filePath +
-				" Expected:" + this.schema + " Actual: " + orcReader.getSchema());
-		}
-
-		this.orcRowsReader = orcReader.rows(options);
-
-		// assign ids
-		this.schema.getId();
-
-		this.rowBatch = schema.createRowBatch(BATCH_SIZE);
-		rowInBatch = 0;
-	}
-
-	@Override
-	public void close() throws IOException {
-
-		if (orcRowsReader != null) {
-			this.orcRowsReader.close();
-		}
-		this.orcRowsReader = null;
-
-	}
-
-	@Override
-	public void closeInputFormat() throws IOException {
-		this.rows = null;
-		this.rows = null;
-		this.schema = null;
-		this.rowBatch = null;
-	}
-
-	@Override
-	public boolean reachedEnd() throws IOException {
-		return !ensureBatch();
-	}
-
-	private boolean ensureBatch() throws IOException {
-
-		if (rowInBatch >= rowBatch.size) {
-			rowInBatch = 0;
-			boolean moreRows = orcRowsReader.nextBatch(rowBatch);
-
-			if (moreRows) {
-				// read rows
-				fillRows(rows, schema, rowBatch, fieldMapping);
-			}
-			return moreRows;
-		}
-
-		return true;
-	}
-
-	@Override
-	public Row nextRecord(Row reuse) throws IOException {
-		return rows[this.rowInBatch++];
-	}
-
-	@Override
-	public TypeInformation<Row> getProducedType() {
-		return rowType;
-	}
-
-	// --------------------------------------------------------------------------------------------
-	//  Custom serialization methods
-	// --------------------------------------------------------------------------------------------
-
-	private void writeObject(ObjectOutputStream out) throws IOException {
-		this.config.write(out);
-		out.writeUTF(schema.toString());
-
-		out.writeInt(fieldMapping.length);
-		for (int f : fieldMapping) {
-			out.writeInt(f);
-		}
-
-	}
-
-	@SuppressWarnings("unchecked")
-	private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
-
-		org.apache.hadoop.conf.Configuration configuration = new org.apache.hadoop.conf.Configuration();
-		configuration.readFields(in);
-
-		if (this.config == null) {
-			this.config = configuration;
-		}
-		this.schema = TypeDescription.fromString(in.readUTF());
-
-		this.fieldMapping = new int[in.readInt()];
-		for (int i = 0; i < fieldMapping.length; i++) {
-			this.fieldMapping[i] = in.readInt();
-		}
-
-	}
-
-}

http://git-wip-us.apache.org/repos/asf/flink/blob/200612ee/flink-connectors/flink-orc/src/test/java/org/apache/flink/orc/OrcRowInputFormatTest.java
----------------------------------------------------------------------
diff --git a/flink-connectors/flink-orc/src/test/java/org/apache/flink/orc/OrcRowInputFormatTest.java b/flink-connectors/flink-orc/src/test/java/org/apache/flink/orc/OrcRowInputFormatTest.java
new file mode 100644
index 0000000..0efe41f
--- /dev/null
+++ b/flink-connectors/flink-orc/src/test/java/org/apache/flink/orc/OrcRowInputFormatTest.java
@@ -0,0 +1,795 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.flink.orc;
+
+import org.apache.flink.api.common.typeinfo.PrimitiveArrayTypeInfo;
+import org.apache.flink.api.common.typeinfo.TypeInformation;
+import org.apache.flink.api.common.typeinfo.Types;
+import org.apache.flink.api.java.typeutils.MapTypeInfo;
+import org.apache.flink.api.java.typeutils.ObjectArrayTypeInfo;
+import org.apache.flink.api.java.typeutils.RowTypeInfo;
+import org.apache.flink.core.fs.FileInputSplit;
+import org.apache.flink.core.fs.Path;
+import org.apache.flink.types.Row;
+import org.apache.flink.util.InstantiationUtil;
+
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.hive.ql.io.sarg.PredicateLeaf;
+import org.apache.hadoop.hive.ql.io.sarg.SearchArgument;
+import org.apache.orc.Reader;
+import org.apache.orc.StripeInformation;
+import org.junit.After;
+import org.junit.Test;
+
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.sql.Date;
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+/**
+ * Unit tests for {@link OrcRowInputFormat}.
+ *
+ */
+public class OrcRowInputFormatTest {
+
+	private OrcRowInputFormat rowOrcInputFormat;
+
+	@After
+	public void tearDown() throws IOException {
+		if (rowOrcInputFormat != null) {
+			rowOrcInputFormat.close();
+			rowOrcInputFormat.closeInputFormat();
+		}
+		rowOrcInputFormat = null;
+	}
+
+	private static final String TEST_FILE_FLAT = "test-data-flat.orc";
+	private static final String TEST_SCHEMA_FLAT =
+		"struct<_col0:int,_col1:string,_col2:string,_col3:string,_col4:int,_col5:string,_col6:int,_col7:int,_col8:int>";
+
+	private static final String TEST_FILE_NESTED = "test-data-nested.orc";
+	private static final String TEST_SCHEMA_NESTED =
+		"struct<" +
+			"boolean1:boolean," +
+			"byte1:tinyint," +
+			"short1:smallint," +
+			"int1:int," +
+			"long1:bigint," +
+			"float1:float," +
+			"double1:double," +
+			"bytes1:binary," +
+			"string1:string," +
+			"middle:struct<" +
+				"list:array<" +
+					"struct<" +
+						"int1:int," +
+						"string1:string" +
+					">" +
+				">" +
+			">," +
+			"list:array<" +
+				"struct<" +
+					"int1:int," +
+					"string1:string" +
+				">" +
+			">," +
+			"map:map<" +
+				"string," +
+				"struct<" +
+					"int1:int," +
+					"string1:string" +
+				">" +
+			">" +
+		">";
+
+	private static final String TEST_FILE_TIMETYPES = "test-data-timetypes.orc";
+	private static final String TEST_SCHEMA_TIMETYPES = "struct<time:timestamp,date:date>";
+
+	private static final String TEST_FILE_DECIMAL = "test-data-decimal.orc";
+	private static final String TEST_SCHEMA_DECIMAL = "struct<_col0:decimal(10,5)>";
+
+	private static final String TEST_FILE_NESTEDLIST = "test-data-nestedlist.orc";
+	private static final String TEST_SCHEMA_NESTEDLIST = "struct<mylist1:array<array<struct<mylong1:bigint>>>>";
+
+	@Test(expected = FileNotFoundException.class)
+	public void testInvalidPath() throws IOException{
+		rowOrcInputFormat =
+			new OrcRowInputFormat("/does/not/exist", TEST_SCHEMA_FLAT, new Configuration());
+		rowOrcInputFormat.openInputFormat();
+		FileInputSplit[] inputSplits = rowOrcInputFormat.createInputSplits(1);
+		rowOrcInputFormat.open(inputSplits[0]);
+	}
+
+	@Test(expected = IndexOutOfBoundsException.class)
+	public void testInvalidProjection1() throws IOException{
+		rowOrcInputFormat =
+			new OrcRowInputFormat(getPath(TEST_FILE_FLAT), TEST_SCHEMA_FLAT, new Configuration());
+		int[] projectionMask = {1, 2, 3, -1};
+		rowOrcInputFormat.selectFields(projectionMask);
+	}
+
+	@Test(expected = IndexOutOfBoundsException.class)
+	public void testInvalidProjection2() throws IOException{
+		rowOrcInputFormat =
+			new OrcRowInputFormat(getPath(TEST_FILE_FLAT), TEST_SCHEMA_FLAT, new Configuration());
+		int[] projectionMask = {1, 2, 3, 9};
+		rowOrcInputFormat.selectFields(projectionMask);
+	}
+
+	@Test
+	public void testProjectionMaskNested() throws IOException{
+		rowOrcInputFormat =
+			new OrcRowInputFormat(getPath(TEST_FILE_NESTED), TEST_SCHEMA_NESTED, new Configuration());
+
+		OrcRowInputFormat spy = spy(rowOrcInputFormat);
+
+		// mock options to check configuration of ORC reader
+		Reader.Options options = new Reader.Options();
+		doReturn(options).when(spy).getOptions(any());
+
+		spy.selectFields(9, 11, 2);
+		spy.openInputFormat();
+		FileInputSplit[] splits = spy.createInputSplits(1);
+		spy.open(splits[0]);
+
+		// top-level struct is false
+		boolean[] expected = new boolean[]{
+			false, // top level
+			false, false, // flat fields 0, 1 are out
+			true, // flat field 2 is in
+			false, false, false, false, false, false, // flat fields 3, 4, 5, 6, 7, 8 are out
+			true, true, true, true, true, // nested field 9 is in
+			false, false, false, false, // nested field 10 is out
+			true, true, true, true, true}; // nested field 11 is in
+		assertArrayEquals(expected, options.getInclude());
+	}
+
+	@Test
+	public void testSplitStripesGivenSplits() throws IOException {
+		rowOrcInputFormat =
+			new OrcRowInputFormat(getPath(TEST_FILE_FLAT), TEST_SCHEMA_FLAT, new Configuration());
+
+		OrcRowInputFormat spy = spy(rowOrcInputFormat);
+
+		// mock options to check configuration of ORC reader
+		Reader.Options options = spy(new Reader.Options());
+		doReturn(options).when(spy).getOptions(any());
+
+		FileInputSplit[] splits = spy.createInputSplits(3);
+
+		spy.openInputFormat();
+		spy.open(splits[0]);
+		verify(options).range(eq(3L), eq(137005L));
+		spy.open(splits[1]);
+		verify(options).range(eq(137008L), eq(136182L));
+		spy.open(splits[2]);
+		verify(options).range(eq(273190L), eq(123633L));
+	}
+
+	@Test
+	public void testSplitStripesCustomSplits() throws IOException {
+		rowOrcInputFormat =
+			new OrcRowInputFormat(getPath(TEST_FILE_FLAT), TEST_SCHEMA_FLAT, new Configuration());
+
+		OrcRowInputFormat spy = spy(rowOrcInputFormat);
+
+		// mock list of stripes
+		List<StripeInformation> stripes = new ArrayList<>();
+		StripeInformation stripe1 = mock(StripeInformation.class);
+		when(stripe1.getOffset()).thenReturn(10L);
+		when(stripe1.getLength()).thenReturn(90L);
+		StripeInformation stripe2 = mock(StripeInformation.class);
+		when(stripe2.getOffset()).thenReturn(100L);
+		when(stripe2.getLength()).thenReturn(100L);
+		StripeInformation stripe3 = mock(StripeInformation.class);
+		when(stripe3.getOffset()).thenReturn(200L);
+		when(stripe3.getLength()).thenReturn(100L);
+		StripeInformation stripe4 = mock(StripeInformation.class);
+		when(stripe4.getOffset()).thenReturn(300L);
+		when(stripe4.getLength()).thenReturn(100L);
+		StripeInformation stripe5 = mock(StripeInformation.class);
+		when(stripe5.getOffset()).thenReturn(400L);
+		when(stripe5.getLength()).thenReturn(100L);
+		stripes.add(stripe1);
+		stripes.add(stripe2);
+		stripes.add(stripe3);
+		stripes.add(stripe4);
+		stripes.add(stripe5);
+		doReturn(stripes).when(spy).getStripes(any());
+
+		// mock options to check configuration of ORC reader
+		Reader.Options options = spy(new Reader.Options());
+		doReturn(options).when(spy).getOptions(any());
+
+		spy.openInputFormat();
+		// split ranging 2 stripes
+		spy.open(new FileInputSplit(0, new Path(getPath(TEST_FILE_FLAT)), 0, 150, new String[]{}));
+		verify(options).range(eq(10L), eq(190L));
+		// split ranging 0 stripes
+		spy.open(new FileInputSplit(1, new Path(getPath(TEST_FILE_FLAT)), 150, 10, new String[]{}));
+		verify(options).range(eq(0L), eq(0L));
+		// split ranging 1 stripe
+		spy.open(new FileInputSplit(2, new Path(getPath(TEST_FILE_FLAT)), 160, 41, new String[]{}));
+		verify(options).range(eq(200L), eq(100L));
+		// split ranging 2 stripe
+		spy.open(new FileInputSplit(3, new Path(getPath(TEST_FILE_FLAT)), 201, 299, new String[]{}));
+		verify(options).range(eq(300L), eq(200L));
+	}
+
+	@Test
+	public void testProducedType() throws IOException {
+		rowOrcInputFormat =
+			new OrcRowInputFormat(getPath(TEST_FILE_NESTED), TEST_SCHEMA_NESTED, new Configuration());
+
+		assertTrue(rowOrcInputFormat.getProducedType() instanceof RowTypeInfo);
+		RowTypeInfo producedType = (RowTypeInfo) rowOrcInputFormat.getProducedType();
+
+		assertArrayEquals(
+			new TypeInformation[]{
+				// primitives
+				Types.BOOLEAN, Types.BYTE, Types.SHORT, Types.INT, Types.LONG, Types.FLOAT, Types.DOUBLE,
+				// binary
+				PrimitiveArrayTypeInfo.BYTE_PRIMITIVE_ARRAY_TYPE_INFO,
+				// string
+				Types.STRING,
+				// struct
+				Types.ROW_NAMED(
+					new String[]{"list"},
+					ObjectArrayTypeInfo.getInfoFor(
+						Types.ROW_NAMED(new String[]{"int1", "string1"}, Types.INT, Types.STRING))),
+				// list
+				ObjectArrayTypeInfo.getInfoFor(
+					Types.ROW_NAMED(new String[]{"int1", "string1"}, Types.INT, Types.STRING)),
+				// map
+				new MapTypeInfo<>(Types.STRING, Types.ROW_NAMED(new String[]{"int1", "string1"}, Types.INT, Types.STRING))
+			},
+			producedType.getFieldTypes());
+		assertArrayEquals(
+			new String[]{"boolean1", "byte1", "short1", "int1", "long1", "float1", "double1", "bytes1", "string1", "middle", "list", "map"},
+			producedType.getFieldNames());
+	}
+
+	@Test
+	public void testProducedTypeWithProjection() throws IOException {
+		rowOrcInputFormat =
+			new OrcRowInputFormat(getPath(TEST_FILE_NESTED), TEST_SCHEMA_NESTED, new Configuration());
+
+		rowOrcInputFormat.selectFields(9, 3, 7, 10);
+
+		assertTrue(rowOrcInputFormat.getProducedType() instanceof RowTypeInfo);
+		RowTypeInfo producedType = (RowTypeInfo) rowOrcInputFormat.getProducedType();
+
+		assertArrayEquals(
+			new TypeInformation[]{
+				// struct
+				Types.ROW_NAMED(
+					new String[]{"list"},
+					ObjectArrayTypeInfo.getInfoFor(
+						Types.ROW_NAMED(new String[]{"int1", "string1"}, Types.INT, Types.STRING))),
+				// int
+				Types.INT,
+				// binary
+				PrimitiveArrayTypeInfo.BYTE_PRIMITIVE_ARRAY_TYPE_INFO,
+				// list
+				ObjectArrayTypeInfo.getInfoFor(
+					Types.ROW_NAMED(new String[]{"int1", "string1"}, Types.INT, Types.STRING))
+			},
+			producedType.getFieldTypes());
+		assertArrayEquals(
+			new String[]{"middle", "int1", "bytes1", "list"},
+			producedType.getFieldNames());
+	}
+
+	@Test
+	public void testSerialization() throws Exception {
+		rowOrcInputFormat =
+			new OrcRowInputFormat(getPath(TEST_FILE_FLAT), TEST_SCHEMA_FLAT, new Configuration());
+
+		rowOrcInputFormat.selectFields(0, 4, 1);
+		rowOrcInputFormat.addPredicate(
+			new OrcRowInputFormat.Equals("_col1", PredicateLeaf.Type.STRING, "M"));
+
+		byte[] bytes = InstantiationUtil.serializeObject(rowOrcInputFormat);
+		OrcRowInputFormat copy = InstantiationUtil.deserializeObject(bytes, getClass().getClassLoader());
+
+		FileInputSplit[] splits = copy.createInputSplits(1);
+		copy.openInputFormat();
+		copy.open(splits[0]);
+		assertFalse(copy.reachedEnd());
+		Row row = copy.nextRecord(null);
+
+		assertNotNull(row);
+		assertEquals(3, row.getArity());
+		// check first row
+		assertEquals(1, row.getField(0));
+		assertEquals(500, row.getField(1));
+		assertEquals("M", row.getField(2));
+	}
+
+	@Test
+	public void testNumericBooleanStringPredicates() throws Exception {
+		rowOrcInputFormat =
+			new OrcRowInputFormat(getPath(TEST_FILE_NESTED), TEST_SCHEMA_NESTED, new Configuration());
+
+		rowOrcInputFormat.selectFields(0, 1, 2, 3, 4, 5, 6, 8);
+
+		// boolean pred
+		rowOrcInputFormat.addPredicate(
+			new OrcRowInputFormat.Equals("boolean1", PredicateLeaf.Type.BOOLEAN, false));
+		// boolean pred
+		rowOrcInputFormat.addPredicate(
+			new OrcRowInputFormat.LessThan("byte1", PredicateLeaf.Type.LONG, 1));
+		// boolean pred
+		rowOrcInputFormat.addPredicate(
+			new OrcRowInputFormat.LessThanEquals("short1", PredicateLeaf.Type.LONG, 1024));
+		// boolean pred
+		rowOrcInputFormat.addPredicate(
+			new OrcRowInputFormat.Between("int1", PredicateLeaf.Type.LONG, -1, 65536));
+		// boolean pred
+		rowOrcInputFormat.addPredicate(
+			new OrcRowInputFormat.Equals("long1", PredicateLeaf.Type.LONG, 9223372036854775807L));
+		// boolean pred
+		rowOrcInputFormat.addPredicate(
+			new OrcRowInputFormat.Equals("float1", PredicateLeaf.Type.FLOAT, 1.0));
+		// boolean pred
+		rowOrcInputFormat.addPredicate(
+			new OrcRowInputFormat.Equals("double1", PredicateLeaf.Type.FLOAT, -15.0));
+		// boolean pred
+		rowOrcInputFormat.addPredicate(
+			new OrcRowInputFormat.IsNull("string1", PredicateLeaf.Type.STRING));
+		// boolean pred
+		rowOrcInputFormat.addPredicate(
+			new OrcRowInputFormat.Equals("string1", PredicateLeaf.Type.STRING, "hello"));
+
+		FileInputSplit[] splits = rowOrcInputFormat.createInputSplits(1);
+		rowOrcInputFormat.openInputFormat();
+
+		// mock options to check configuration of ORC reader
+		OrcRowInputFormat spy = spy(rowOrcInputFormat);
+		Reader.Options options = new Reader.Options();
+		doReturn(options).when(spy).getOptions(any());
+
+		spy.openInputFormat();
+		spy.open(splits[0]);
+
+		// verify predicate configuration
+		SearchArgument sarg = options.getSearchArgument();
+		assertNotNull(sarg);
+		assertEquals("(and leaf-0 leaf-1 leaf-2 leaf-3 leaf-4 leaf-5 leaf-6 leaf-7 leaf-8)", sarg.getExpression().toString());
+		assertEquals(9, sarg.getLeaves().size());
+		List<PredicateLeaf> leaves = sarg.getLeaves();
+		assertEquals("(EQUALS boolean1 false)", leaves.get(0).toString());
+		assertEquals("(LESS_THAN byte1 1)", leaves.get(1).toString());
+		assertEquals("(LESS_THAN_EQUALS short1 1024)", leaves.get(2).toString());
+		assertEquals("(BETWEEN int1 -1 65536)", leaves.get(3).toString());
+		assertEquals("(EQUALS long1 9223372036854775807)", leaves.get(4).toString());
+		assertEquals("(EQUALS float1 1.0)", leaves.get(5).toString());
+		assertEquals("(EQUALS double1 -15.0)", leaves.get(6).toString());
+		assertEquals("(IS_NULL string1)", leaves.get(7).toString());
+		assertEquals("(EQUALS string1 hello)", leaves.get(8).toString());
+	}
+
+	@Test
+	public void testTimePredicates() throws Exception {
+		rowOrcInputFormat =
+			new OrcRowInputFormat(getPath(TEST_FILE_TIMETYPES), TEST_SCHEMA_TIMETYPES, new Configuration());
+
+		rowOrcInputFormat.addPredicate(
+			// OR
+			new OrcRowInputFormat.Or(
+				// timestamp pred
+				new OrcRowInputFormat.Equals("time", PredicateLeaf.Type.TIMESTAMP, Timestamp.valueOf("1900-05-05 12:34:56.100")),
+				// date pred
+				new OrcRowInputFormat.Equals("date", PredicateLeaf.Type.DATE, Date.valueOf("1900-12-25")))
+			);
+
+		FileInputSplit[] splits = rowOrcInputFormat.createInputSplits(1);
+		rowOrcInputFormat.openInputFormat();
+
+		// mock options to check configuration of ORC reader
+		OrcRowInputFormat spy = spy(rowOrcInputFormat);
+		Reader.Options options = new Reader.Options();
+		doReturn(options).when(spy).getOptions(any());
+
+		spy.openInputFormat();
+		spy.open(splits[0]);
+
+		// verify predicate configuration
+		SearchArgument sarg = options.getSearchArgument();
+		assertNotNull(sarg);
+		assertEquals("(or leaf-0 leaf-1)", sarg.getExpression().toString());
+		assertEquals(2, sarg.getLeaves().size());
+		List<PredicateLeaf> leaves = sarg.getLeaves();
+		assertEquals("(EQUALS time 1900-05-05 12:34:56.1)", leaves.get(0).toString());
+		assertEquals("(EQUALS date 1900-12-25)", leaves.get(1).toString());
+	}
+
+	@Test
+	public void testDecimalPredicate() throws Exception {
+		rowOrcInputFormat =
+			new OrcRowInputFormat(getPath(TEST_FILE_DECIMAL), TEST_SCHEMA_DECIMAL, new Configuration());
+
+		rowOrcInputFormat.addPredicate(
+			new OrcRowInputFormat.Not(
+				// decimal pred
+				new OrcRowInputFormat.Equals("_col0", PredicateLeaf.Type.DECIMAL, BigDecimal.valueOf(-1000.5))));
+
+		FileInputSplit[] splits = rowOrcInputFormat.createInputSplits(1);
+		rowOrcInputFormat.openInputFormat();
+
+		// mock options to check configuration of ORC reader
+		OrcRowInputFormat spy = spy(rowOrcInputFormat);
+		Reader.Options options = new Reader.Options();
+		doReturn(options).when(spy).getOptions(any());
+
+		spy.openInputFormat();
+		spy.open(splits[0]);
+
+		// verify predicate configuration
+		SearchArgument sarg = options.getSearchArgument();
+		assertNotNull(sarg);
+		assertEquals("(not leaf-0)", sarg.getExpression().toString());
+		assertEquals(1, sarg.getLeaves().size());
+		List<PredicateLeaf> leaves = sarg.getLeaves();
+		assertEquals("(EQUALS _col0 -1000.5)", leaves.get(0).toString());
+	}
+
+	@Test(expected = IllegalArgumentException.class)
+	public void testPredicateWithInvalidColumn() throws Exception {
+		rowOrcInputFormat =
+			new OrcRowInputFormat(getPath(TEST_FILE_NESTED), TEST_SCHEMA_NESTED, new Configuration());
+
+		rowOrcInputFormat.addPredicate(
+			new OrcRowInputFormat.Equals("unknown", PredicateLeaf.Type.LONG, 42));
+	}
+
+	@Test
+	public void testReadNestedFile() throws IOException{
+		rowOrcInputFormat = new OrcRowInputFormat(getPath(TEST_FILE_NESTED), TEST_SCHEMA_NESTED, new Configuration());
+
+		FileInputSplit[] splits = rowOrcInputFormat.createInputSplits(1);
+		assertEquals(1, splits.length);
+		rowOrcInputFormat.openInputFormat();
+		rowOrcInputFormat.open(splits[0]);
+
+		assertFalse(rowOrcInputFormat.reachedEnd());
+		Row row = rowOrcInputFormat.nextRecord(null);
+
+		// validate first row
+		assertNotNull(row);
+		assertEquals(12, row.getArity());
+		assertEquals(false, row.getField(0));
+		assertEquals((byte) 1, row.getField(1));
+		assertEquals((short) 1024, row.getField(2));
+		assertEquals(65536, row.getField(3));
+		assertEquals(9223372036854775807L, row.getField(4));
+		assertEquals(1.0f, row.getField(5));
+		assertEquals(-15.0d, row.getField(6));
+		assertArrayEquals(new byte[]{0, 1, 2, 3, 4}, (byte[]) row.getField(7));
+		assertEquals("hi", row.getField(8));
+		// check nested field
+		assertTrue(row.getField(9) instanceof Row);
+		Row nested1 = (Row) row.getField(9);
+		assertEquals(1, nested1.getArity());
+		assertTrue(nested1.getField(0) instanceof Object[]);
+		Object[] nestedList1 = (Object[]) nested1.getField(0);
+		assertEquals(2, nestedList1.length);
+		assertEquals(Row.of(1, "bye"), nestedList1[0]);
+		assertEquals(Row.of(2, "sigh"), nestedList1[1]);
+		// check list
+		assertTrue(row.getField(10) instanceof Object[]);
+		Object[] list1 = (Object[]) row.getField(10);
+		assertEquals(2, list1.length);
+		assertEquals(Row.of(3, "good"), list1[0]);
+		assertEquals(Row.of(4, "bad"), list1[1]);
+		// check map
+		assertTrue(row.getField(11) instanceof HashMap);
+		HashMap map1 = (HashMap) row.getField(11);
+		assertEquals(0, map1.size());
+
+		// read second row
+		assertFalse(rowOrcInputFormat.reachedEnd());
+		row = rowOrcInputFormat.nextRecord(null);
+
+		// validate second row
+		assertNotNull(row);
+		assertEquals(12, row.getArity());
+		assertEquals(true, row.getField(0));
+		assertEquals((byte) 100, row.getField(1));
+		assertEquals((short) 2048, row.getField(2));
+		assertEquals(65536, row.getField(3));
+		assertEquals(9223372036854775807L, row.getField(4));
+		assertEquals(2.0f, row.getField(5));
+		assertEquals(-5.0d, row.getField(6));
+		assertArrayEquals(new byte[]{}, (byte[]) row.getField(7));
+		assertEquals("bye", row.getField(8));
+		// check nested field
+		assertTrue(row.getField(9) instanceof Row);
+		Row nested2 = (Row) row.getField(9);
+		assertEquals(1, nested2.getArity());
+		assertTrue(nested2.getField(0) instanceof Object[]);
+		Object[] nestedList2 = (Object[]) nested2.getField(0);
+		assertEquals(2, nestedList2.length);
+		assertEquals(Row.of(1, "bye"), nestedList2[0]);
+		assertEquals(Row.of(2, "sigh"), nestedList2[1]);
+		// check list
+		assertTrue(row.getField(10) instanceof Object[]);
+		Object[] list2 = (Object[]) row.getField(10);
+		assertEquals(3, list2.length);
+		assertEquals(Row.of(100000000, "cat"), list2[0]);
+		assertEquals(Row.of(-100000, "in"), list2[1]);
+		assertEquals(Row.of(1234, "hat"), list2[2]);
+		// check map
+		assertTrue(row.getField(11) instanceof HashMap);
+		HashMap map = (HashMap) row.getField(11);
+		assertEquals(2, map.size());
+		assertEquals(Row.of(5, "chani"), map.get("chani"));
+		assertEquals(Row.of(1, "mauddib"), map.get("mauddib"));
+
+		assertTrue(rowOrcInputFormat.reachedEnd());
+	}
+
+	@Test
+	public void testReadTimeTypeFile() throws IOException{
+		rowOrcInputFormat = new OrcRowInputFormat(getPath(TEST_FILE_TIMETYPES), TEST_SCHEMA_TIMETYPES, new Configuration());
+
+		FileInputSplit[] splits = rowOrcInputFormat.createInputSplits(1);
+		assertEquals(1, splits.length);
+		rowOrcInputFormat.openInputFormat();
+		rowOrcInputFormat.open(splits[0]);
+
+		assertFalse(rowOrcInputFormat.reachedEnd());
+		Row row = rowOrcInputFormat.nextRecord(null);
+
+		// validate first row
+		assertNotNull(row);
+		assertEquals(2, row.getArity());
+		assertEquals(Timestamp.valueOf("1900-05-05 12:34:56.1"), row.getField(0));
+		assertEquals(Date.valueOf("1900-12-25"), row.getField(1));
+
+		// check correct number of rows
+		long cnt = 1;
+		while (!rowOrcInputFormat.reachedEnd()) {
+			assertNotNull(rowOrcInputFormat.nextRecord(null));
+			cnt++;
+		}
+		assertEquals(70000, cnt);
+	}
+
+	@Test
+	public void testReadDecimalTypeFile() throws IOException{
+		rowOrcInputFormat = new OrcRowInputFormat(getPath(TEST_FILE_DECIMAL), TEST_SCHEMA_DECIMAL, new Configuration());
+
+		FileInputSplit[] splits = rowOrcInputFormat.createInputSplits(1);
+		assertEquals(1, splits.length);
+		rowOrcInputFormat.openInputFormat();
+		rowOrcInputFormat.open(splits[0]);
+
+		assertFalse(rowOrcInputFormat.reachedEnd());
+		Row row = rowOrcInputFormat.nextRecord(null);
+
+		// validate first row
+		assertNotNull(row);
+		assertEquals(1, row.getArity());
+		assertEquals(BigDecimal.valueOf(-1000.5d), row.getField(0));
+
+		// check correct number of rows
+		long cnt = 1;
+		while (!rowOrcInputFormat.reachedEnd()) {
+			assertNotNull(rowOrcInputFormat.nextRecord(null));
+			cnt++;
+		}
+		assertEquals(6000, cnt);
+	}
+
+	@Test
+	public void testReadNestedListFile() throws Exception {
+		rowOrcInputFormat = new OrcRowInputFormat(getPath(TEST_FILE_NESTEDLIST), TEST_SCHEMA_NESTEDLIST, new Configuration());
+
+		FileInputSplit[] splits = rowOrcInputFormat.createInputSplits(1);
+		assertEquals(1, splits.length);
+		rowOrcInputFormat.openInputFormat();
+		rowOrcInputFormat.open(splits[0]);
+
+		assertFalse(rowOrcInputFormat.reachedEnd());
+
+		Row row = null;
+		long cnt = 0;
+
+		// read all rows
+		while (!rowOrcInputFormat.reachedEnd()) {
+
+			row = rowOrcInputFormat.nextRecord(row);
+			assertEquals(1, row.getArity());
+
+			// outer list
+			Object[] list = (Object[]) row.getField(0);
+			assertEquals(1, list.length);
+
+			// nested list of rows
+			Row[] nestedRows = (Row[]) list[0];
+			assertEquals(1, nestedRows.length);
+			assertEquals(1, nestedRows[0].getArity());
+
+			// verify list value
+			assertEquals(cnt, nestedRows[0].getField(0));
+			cnt++;
+		}
+		// number of rows in file
+		assertEquals(100, cnt);
+	}
+
+	@Test
+	public void testReadWithProjection() throws IOException{
+		rowOrcInputFormat = new OrcRowInputFormat(getPath(TEST_FILE_NESTED), TEST_SCHEMA_NESTED, new Configuration());
+
+		rowOrcInputFormat.selectFields(7, 0, 10, 8);
+
+		FileInputSplit[] splits = rowOrcInputFormat.createInputSplits(1);
+		assertEquals(1, splits.length);
+		rowOrcInputFormat.openInputFormat();
+		rowOrcInputFormat.open(splits[0]);
+
+		assertFalse(rowOrcInputFormat.reachedEnd());
+		Row row = rowOrcInputFormat.nextRecord(null);
+
+		// validate first row
+		assertNotNull(row);
+		assertEquals(4, row.getArity());
+		// check binary
+		assertArrayEquals(new byte[]{0, 1, 2, 3, 4}, (byte[]) row.getField(0));
+		// check boolean
+		assertEquals(false, row.getField(1));
+		// check list
+		assertTrue(row.getField(2) instanceof Object[]);
+		Object[] list1 = (Object[]) row.getField(2);
+		assertEquals(2, list1.length);
+		assertEquals(Row.of(3, "good"), list1[0]);
+		assertEquals(Row.of(4, "bad"), list1[1]);
+		// check string
+		assertEquals("hi", row.getField(3));
+
+		// check that there is a second row with four fields
+		assertFalse(rowOrcInputFormat.reachedEnd());
+		row = rowOrcInputFormat.nextRecord(null);
+		assertNotNull(row);
+		assertEquals(4, row.getArity());
+		assertTrue(rowOrcInputFormat.reachedEnd());
+	}
+
+	@Test
+	public void testReadFileInSplits() throws IOException{
+
+		rowOrcInputFormat = new OrcRowInputFormat(getPath(TEST_FILE_FLAT), TEST_SCHEMA_FLAT, new Configuration());
+		rowOrcInputFormat.selectFields(0, 1);
+
+		FileInputSplit[] splits = rowOrcInputFormat.createInputSplits(4);
+		assertEquals(4, splits.length);
+		rowOrcInputFormat.openInputFormat();
+
+		long cnt = 0;
+		// read all splits
+		for (FileInputSplit split : splits) {
+
+			// open split
+			rowOrcInputFormat.open(split);
+			// read and count all rows
+			while (!rowOrcInputFormat.reachedEnd()) {
+				assertNotNull(rowOrcInputFormat.nextRecord(null));
+				cnt++;
+			}
+		}
+		// check that all rows have been read
+		assertEquals(1920800, cnt);
+	}
+
+	@Test
+	public void testReadFileWithFilter() throws IOException{
+
+		rowOrcInputFormat = new OrcRowInputFormat(getPath(TEST_FILE_FLAT), TEST_SCHEMA_FLAT, new Configuration());
+		rowOrcInputFormat.selectFields(0, 1);
+
+		// read head and tail of file
+		rowOrcInputFormat.addPredicate(
+			new OrcRowInputFormat.Or(
+				new OrcRowInputFormat.LessThan("_col0", PredicateLeaf.Type.LONG, 10L),
+				new OrcRowInputFormat.Not(
+					new OrcRowInputFormat.LessThanEquals("_col0", PredicateLeaf.Type.LONG, 1920000L))
+			));
+		rowOrcInputFormat.addPredicate(
+			new OrcRowInputFormat.Equals("_col1", PredicateLeaf.Type.STRING, "M"));
+
+		FileInputSplit[] splits = rowOrcInputFormat.createInputSplits(1);
+		assertEquals(1, splits.length);
+		rowOrcInputFormat.openInputFormat();
+
+		// open split
+		rowOrcInputFormat.open(splits[0]);
+
+		// read and count all rows
+		long cnt = 0;
+		while (!rowOrcInputFormat.reachedEnd()) {
+			assertNotNull(rowOrcInputFormat.nextRecord(null));
+			cnt++;
+		}
+		// check that only the first and last stripes of the file have been read.
+		// Each stripe has 5000 rows, except the last which has 800 rows.
+		assertEquals(5800, cnt);
+	}
+
+	@Test
+	public void testReadFileWithEvolvedSchema() throws IOException{
+
+		rowOrcInputFormat = new OrcRowInputFormat(
+			getPath(TEST_FILE_FLAT),
+			"struct<_col0:int,_col1:string,_col4:string,_col3:string>", // previous version of schema
+			new Configuration());
+		rowOrcInputFormat.selectFields(3, 0, 2);
+
+		rowOrcInputFormat.addPredicate(
+			new OrcRowInputFormat.LessThan("_col0", PredicateLeaf.Type.LONG, 10L));
+
+		FileInputSplit[] splits = rowOrcInputFormat.createInputSplits(1);
+		assertEquals(1, splits.length);
+		rowOrcInputFormat.openInputFormat();
+
+		// open split
+		rowOrcInputFormat.open(splits[0]);
+
+		// read and validate first row
+		assertFalse(rowOrcInputFormat.reachedEnd());
+		Row row = rowOrcInputFormat.nextRecord(null);
+		assertNotNull(row);
+		assertEquals(3, row.getArity());
+		assertEquals("Primary", row.getField(0));
+		assertEquals(1, row.getField(1));
+		assertEquals("M", row.getField(2));
+
+		// read and count remaining rows
+		long cnt = 1;
+		while (!rowOrcInputFormat.reachedEnd()) {
+			assertNotNull(rowOrcInputFormat.nextRecord(null));
+			cnt++;
+		}
+		// check that only the first and last stripes of the file have been read.
+		// Each stripe has 5000 rows, except the last which has 800 rows.
+		assertEquals(5000, cnt);
+	}
+
+	private String getPath(String fileName) {
+		return getClass().getClassLoader().getResource(fileName).getPath();
+	}
+}

http://git-wip-us.apache.org/repos/asf/flink/blob/200612ee/flink-connectors/flink-orc/src/test/java/org/apache/flink/orc/OrcTableSourceITCase.java
----------------------------------------------------------------------
diff --git a/flink-connectors/flink-orc/src/test/java/org/apache/flink/orc/OrcTableSourceITCase.java b/flink-connectors/flink-orc/src/test/java/org/apache/flink/orc/OrcTableSourceITCase.java
index 3de6ab3..e6ef1e1 100644
--- a/flink-connectors/flink-orc/src/test/java/org/apache/flink/orc/OrcTableSourceITCase.java
+++ b/flink-connectors/flink-orc/src/test/java/org/apache/flink/orc/OrcTableSourceITCase.java
@@ -18,125 +18,101 @@
 
 package org.apache.flink.orc;
 
-import org.apache.flink.api.common.typeinfo.BasicTypeInfo;
-import org.apache.flink.api.common.typeinfo.TypeInformation;
 import org.apache.flink.api.java.DataSet;
 import org.apache.flink.api.java.ExecutionEnvironment;
-import org.apache.flink.api.java.typeutils.MapTypeInfo;
-import org.apache.flink.api.java.typeutils.ObjectArrayTypeInfo;
-import org.apache.flink.api.java.typeutils.RowTypeInfo;
 import org.apache.flink.table.api.Table;
 import org.apache.flink.table.api.TableEnvironment;
-import org.apache.flink.table.api.TableSchema;
 import org.apache.flink.table.api.java.BatchTableEnvironment;
 import org.apache.flink.test.util.MultipleProgramsTestBase;
 import org.apache.flink.types.Row;
 
-import org.hamcrest.CoreMatchers;
-import org.junit.Assert;
 import org.junit.Test;
 
-import java.net.URL;
-import java.util.ArrayList;
 import java.util.List;
 
+import static org.junit.Assert.assertEquals;
+
 /**
  * Tests for {@link OrcTableSource}.
  */
 public class OrcTableSourceITCase extends MultipleProgramsTestBase {
 
-	private static final String TEST1_SCHEMA = "struct<boolean1:boolean,byte1:tinyint,short1:smallint,int1:int," +
-		"long1:bigint,float1:float,double1:double,bytes1:binary,string1:string," +
-		"middle:struct<list:array<struct<int1:int,string1:string>>>," +
-		"list:array<struct<int1:int,string1:string>>," +
-		"map:map<string,struct<int1:int,string1:string>>>";
-
-	private final URL test1URL = getClass().getClassLoader().getResource("TestOrcFile.test1.orc");
-
-
-	private static final String[] TEST1_DATA = new String[] {
-		"false,1,1024,65536,9223372036854775807,1.0,-15.0,[0, 1, 2, 3, 4],hi,[1,bye, 2,sigh],[3,good, 4,bad],{}",
-		"true,100,2048,65536,9223372036854775807,2.0,-5.0,[],bye,[1,bye, 2,sigh]," +
-			"[100000000,cat, -100000,in, 1234,hat],{chani=5,chani, mauddib=1,mauddib}" };
+	private static final String TEST_FILE_FLAT = "test-data-flat.orc";
+	private static final String TEST_SCHEMA_FLAT =
+		"struct<_col0:int,_col1:string,_col2:string,_col3:string,_col4:int,_col5:string,_col6:int,_col7:int,_col8:int>";
 
 	public OrcTableSourceITCase() {
 		super(TestExecutionMode.COLLECTION);
 	}
 
 	@Test
-	public void testOrcTableSource() throws Exception {
+	public void testFullScan() throws Exception {
 
 		ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
 		BatchTableEnvironment tEnv = TableEnvironment.getTableEnvironment(env);
 
-		assert (test1URL != null);
-		OrcTableSource orc = new OrcTableSource(test1URL.getPath(), TEST1_SCHEMA);
-
-		tEnv.registerTableSource("orcTable", orc);
-
-		String query = "Select * from orcTable";
-		Table t = tEnv.sql(query);
+		OrcTableSource orc = OrcTableSource.builder()
+			.path(getPath(TEST_FILE_FLAT))
+			.forOrcSchema(TEST_SCHEMA_FLAT)
+			.build();
+		tEnv.registerTableSource("OrcTable", orc);
+
+		String query =
+			"SELECT COUNT(*), " +
+				"MIN(_col0), MAX(_col0), " +
+				"MIN(_col1), MAX(_col1), " +
+				"MIN(_col2), MAX(_col2), " +
+				"MIN(_col3), MAX(_col3), " +
+				"MIN(_col4), MAX(_col4), " +
+				"MIN(_col5), MAX(_col5), " +
+				"MIN(_col6), MAX(_col6), " +
+				"MIN(_col7), MAX(_col7), " +
+				"MIN(_col8), MAX(_col8) " +
+			"FROM OrcTable";
+		Table t = tEnv.sqlQuery(query);
 
 		DataSet<Row> dataSet = tEnv.toDataSet(t, Row.class);
-		List<Row> records = dataSet.collect();
-
-		Assert.assertEquals(records.size(), 2);
+		List<Row> result = dataSet.collect();
 
-		List<String> actualRecords = new ArrayList<>();
-		for (Row record : records) {
-			Assert.assertEquals(record.getArity(), 12);
-			actualRecords.add(record.toString());
-		}
-
-		Assert.assertThat(actualRecords, CoreMatchers.hasItems(TEST1_DATA));
+		assertEquals(1, result.size());
+		assertEquals(
+			"1920800,1,1920800,F,M,D,W,2 yr Degree,Unknown,500,10000,Good,Unknown,0,6,0,6,0,6",
+			result.get(0).toString());
 	}
 
 	@Test
-	public void testOrcTableProjection() throws Exception {
+	public void testScanWithProjectionAndFilter() throws Exception {
 
 		ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
 		BatchTableEnvironment tEnv = TableEnvironment.getTableEnvironment(env);
 
-		assert(test1URL != null);
-		OrcTableSource orc = new OrcTableSource(test1URL.getPath(), TEST1_SCHEMA);
-
-		tEnv.registerTableSource("orcTable", orc);
-
-		String query = "Select middle,list,map from orcTable";
-		Table t = tEnv.sql(query);
-
-		String[] colNames = new String[] {"middle", "list", "map"};
-
-		RowTypeInfo rowTypeInfo = new RowTypeInfo(
-			new TypeInformation[] {
-				BasicTypeInfo.INT_TYPE_INFO,
-				BasicTypeInfo.STRING_TYPE_INFO},
-			new String[] {"int1", "string1"});
-
-		RowTypeInfo structTypeInfo = new RowTypeInfo(
-			new TypeInformation[] {ObjectArrayTypeInfo.getInfoFor(rowTypeInfo)},
-			new String[] {"list"});
-
-		TypeInformation[] colTypes = new TypeInformation[] {
-			structTypeInfo,
-			ObjectArrayTypeInfo.getInfoFor(rowTypeInfo),
-			new MapTypeInfo(BasicTypeInfo.STRING_TYPE_INFO, rowTypeInfo)
-		};
-
-		TableSchema actualTableSchema = new TableSchema(colNames, colTypes);
-
-		Assert.assertArrayEquals(t.getSchema().getColumnNames(), colNames);
-		Assert.assertArrayEquals(t.getSchema().getTypes(), colTypes);
-		Assert.assertEquals(actualTableSchema.toString(), t.getSchema().toString());
+		OrcTableSource orc = OrcTableSource.builder()
+			.path(getPath(TEST_FILE_FLAT))
+			.forOrcSchema(TEST_SCHEMA_FLAT)
+			.build();
+		tEnv.registerTableSource("OrcTable", orc);
+
+		String query =
+			"SELECT " +
+				"MIN(_col4), MAX(_col4), " +
+				"MIN(_col3), MAX(_col3), " +
+				"MIN(_col0), MAX(_col0), " +
+				"MIN(_col2), MAX(_col2), " +
+				"COUNT(*) " +
+				"FROM OrcTable " +
+				"WHERE (_col0 BETWEEN 4975 and 5024 OR _col0 BETWEEN 9975 AND 10024) AND _col1 = 'F'";
+		Table t = tEnv.sqlQuery(query);
 
 		DataSet<Row> dataSet = tEnv.toDataSet(t, Row.class);
-		List<Row> records = dataSet.collect();
-
-		Assert.assertEquals(records.size(), 2);
-		for (Row record: records) {
-			Assert.assertEquals(record.getArity(), 3);
-		}
+		List<Row> result = dataSet.collect();
 
+		assertEquals(1, result.size());
+		assertEquals(
+			"1500,6000,2 yr Degree,Unknown,4976,10024,D,W,50",
+			result.get(0).toString());
 	}
 
+	private String getPath(String fileName) {
+		return getClass().getClassLoader().getResource(fileName).getPath();
+	}
 }

http://git-wip-us.apache.org/repos/asf/flink/blob/200612ee/flink-connectors/flink-orc/src/test/java/org/apache/flink/orc/OrcTableSourceTest.java
----------------------------------------------------------------------
diff --git a/flink-connectors/flink-orc/src/test/java/org/apache/flink/orc/OrcTableSourceTest.java b/flink-connectors/flink-orc/src/test/java/org/apache/flink/orc/OrcTableSourceTest.java
index c285054..4e4be77 100644
--- a/flink-connectors/flink-orc/src/test/java/org/apache/flink/orc/OrcTableSourceTest.java
+++ b/flink-connectors/flink-orc/src/test/java/org/apache/flink/orc/OrcTableSourceTest.java
@@ -18,96 +18,248 @@
 
 package org.apache.flink.orc;
 
-import org.apache.flink.api.common.typeinfo.BasicTypeInfo;
 import org.apache.flink.api.common.typeinfo.PrimitiveArrayTypeInfo;
 import org.apache.flink.api.common.typeinfo.TypeInformation;
+import org.apache.flink.api.common.typeinfo.Types;
 import org.apache.flink.api.java.ExecutionEnvironment;
 import org.apache.flink.api.java.typeutils.MapTypeInfo;
 import org.apache.flink.api.java.typeutils.ObjectArrayTypeInfo;
 import org.apache.flink.api.java.typeutils.RowTypeInfo;
-import org.apache.flink.table.api.Table;
-import org.apache.flink.table.api.TableEnvironment;
 import org.apache.flink.table.api.TableSchema;
-import org.apache.flink.table.api.java.BatchTableEnvironment;
+import org.apache.flink.table.expressions.EqualTo;
+import org.apache.flink.table.expressions.Expression;
+import org.apache.flink.table.expressions.GetCompositeField;
+import org.apache.flink.table.expressions.GreaterThan;
+import org.apache.flink.table.expressions.ItemAt;
+import org.apache.flink.table.expressions.Literal;
+import org.apache.flink.table.expressions.ResolvedFieldReference;
+import org.apache.flink.types.Row;
 
-import org.junit.Assert;
+import org.apache.hadoop.hive.ql.io.sarg.PredicateLeaf;
 import org.junit.Test;
+import org.mockito.ArgumentCaptor;
 
-import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
 
 /**
  * Unit Tests for {@link OrcTableSource}.
  */
 public class OrcTableSourceTest {
 
-	private static final String TEST1_SCHEMA = "struct<boolean1:boolean,byte1:tinyint,short1:smallint,int1:int," +
-		"long1:bigint,float1:float,double1:double,bytes1:binary,string1:string," +
-		"middle:struct<list:array<struct<int1:int,string1:string>>>," +
-		"list:array<struct<int1:int,string1:string>>," +
-		"map:map<string,struct<int1:int,string1:string>>>";
+	private static final String TEST_FILE_NESTED = "test-data-nested.orc";
+	private static final String TEST_SCHEMA_NESTED =
+		"struct<" +
+			"boolean1:boolean," +
+			"byte1:tinyint," +
+			"short1:smallint," +
+			"int1:int," +
+			"long1:bigint," +
+			"float1:float," +
+			"double1:double," +
+			"bytes1:binary," +
+			"string1:string," +
+			"middle:struct<" +
+				"list:array<" +
+					"struct<" +
+						"int1:int," +
+						"string1:string" +
+					">" +
+				">" +
+			">," +
+			"list:array<" +
+				"struct<" +
+					"int1:int," +
+					"string1:string" +
+				">" +
+			">," +
+			"map:map<" +
+				"string," +
+				"struct<" +
+					"int1:int," +
+					"string1:string" +
+				">" +
+			">" +
+		">";
+
+	@Test
+	public void testGetReturnType() throws Exception {
+
+		OrcTableSource orc = OrcTableSource.builder()
+			.path(getPath(TEST_FILE_NESTED))
+			.forOrcSchema(TEST_SCHEMA_NESTED)
+			.build();
 
-	private final URL test1URL = getClass().getClassLoader().getResource("TestOrcFile.test1.orc");
+		TypeInformation<Row> returnType = orc.getReturnType();
+		assertNotNull(returnType);
+		assertTrue(returnType instanceof RowTypeInfo);
+		RowTypeInfo rowType = (RowTypeInfo) returnType;
+
+		RowTypeInfo expected = Types.ROW_NAMED(getNestedFieldNames(), getNestedFieldTypes());
+		assertEquals(expected, rowType);
+	}
 
 	@Test
-	public void testOrcSchema() throws Exception {
+	public void testGetTableSchema() throws Exception {
+
+		OrcTableSource orc = OrcTableSource.builder()
+			.path(getPath(TEST_FILE_NESTED))
+			.forOrcSchema(TEST_SCHEMA_NESTED)
+			.build();
+
+		TableSchema schema = orc.getTableSchema();
+		assertNotNull(schema);
+		assertArrayEquals(getNestedFieldNames(), schema.getColumnNames());
+		assertArrayEquals(getNestedFieldTypes(), schema.getTypes());
+	}
+
+	@Test
+	public void testProjectFields() throws Exception {
+
+		OrcTableSource orc = OrcTableSource.builder()
+			.path(getPath(TEST_FILE_NESTED))
+			.forOrcSchema(TEST_SCHEMA_NESTED)
+			.build();
+
+		OrcTableSource projected = (OrcTableSource) orc.projectFields(new int[]{3, 5, 1, 0});
 
-		assert(test1URL != null);
-		OrcTableSource orc = new OrcTableSource(test1URL.getPath(), TEST1_SCHEMA);
+		// ensure copy is returned
+		assertTrue(orc != projected);
 
-		String expectedSchema = "Row(boolean1: Boolean, byte1: Byte, short1: Short, int1: Integer, long1: Long, " +
-			"float1: Float, double1: Double, bytes1: byte[], string1: String, " +
-			"middle: Row(list: ObjectArrayTypeInfo<Row(int1: Integer, string1: String)>), " +
-			"list: ObjectArrayTypeInfo<Row(int1: Integer, string1: String)>, " +
-			"map: Map<String, Row(int1: Integer, string1: String)>)";
+		// ensure table schema is identical
+		assertEquals(orc.getTableSchema(), projected.getTableSchema());
 
-		Assert.assertEquals(expectedSchema, orc.getReturnType().toString());
+		// ensure return type was adapted
+		String[] fieldNames = getNestedFieldNames();
+		TypeInformation[] fieldTypes = getNestedFieldTypes();
+		assertEquals(
+			Types.ROW_NAMED(
+				new String[] {fieldNames[3], fieldNames[5], fieldNames[1], fieldNames[0]},
+				new TypeInformation[] {fieldTypes[3], fieldTypes[5], fieldTypes[1], fieldTypes[0]}),
+			projected.getReturnType());
 
+		// ensure IF is configured with selected fields
+		OrcTableSource spyTS = spy(projected);
+		OrcRowInputFormat mockIF = mock(OrcRowInputFormat.class);
+		doReturn(mockIF).when(spyTS).buildOrcInputFormat();
+		spyTS.getDataSet(mock(ExecutionEnvironment.class));
+		verify(mockIF).selectFields(eq(3), eq(5), eq(1), eq(0));
 	}
 
 	@Test
-	public void testOrcTableSchema() throws Exception {
+	public void testApplyPredicate() throws Exception {
 
-		ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
-		BatchTableEnvironment tEnv = TableEnvironment.getTableEnvironment(env);
+		OrcTableSource orc = OrcTableSource.builder()
+			.path(getPath(TEST_FILE_NESTED))
+			.forOrcSchema(TEST_SCHEMA_NESTED)
+			.build();
 
-		assert(test1URL != null);
-		OrcTableSource orc = new OrcTableSource(test1URL.getPath(), TEST1_SCHEMA);
+		// expressions for predicates
+		Expression pred1 = new GreaterThan(
+			new ResolvedFieldReference("int1", Types.INT),
+			new Literal(100, Types.INT));
+		Expression pred2 = new EqualTo(
+			new ResolvedFieldReference("string1", Types.STRING),
+			new Literal("hello", Types.STRING));
+		Expression pred3 = new EqualTo(
+			new GetCompositeField(
+				new ItemAt(
+					new ResolvedFieldReference(
+						"list",
+						ObjectArrayTypeInfo.getInfoFor(
+							Types.ROW_NAMED(new String[] {"int1", "string1"}, Types.INT, Types.STRING))),
+					new Literal(1, Types.INT)),
+				"int1"),
+			new Literal(1, Types.INT)
+			);
+		ArrayList<Expression> preds = new ArrayList<>();
+		preds.add(pred1);
+		preds.add(pred2);
+		preds.add(pred3);
 
-		tEnv.registerTableSource("orcTable", orc);
-		String query = "Select * from orcTable";
-		Table t = tEnv.sql(query);
+		// apply predicates on TableSource
+		OrcTableSource projected = (OrcTableSource) orc.applyPredicate(preds);
 
-		String[] colNames = new String[] {
-			"boolean1", "byte1", "short1", "int1", "long1", "float1",
-			"double1", "bytes1", "string1", "list", "list0", "map"
-		};
+		// ensure copy is returned
+		assertTrue(orc != projected);
 
-		RowTypeInfo rowTypeInfo = new RowTypeInfo(
-			new TypeInformation[] {
-				BasicTypeInfo.INT_TYPE_INFO,
-				BasicTypeInfo.STRING_TYPE_INFO},
-			new String[] {"int1", "string1"});
-
-		TypeInformation[] colTypes = new TypeInformation[] {
-			BasicTypeInfo.BOOLEAN_TYPE_INFO,
-			BasicTypeInfo.BYTE_TYPE_INFO,
-			BasicTypeInfo.SHORT_TYPE_INFO,
-			BasicTypeInfo.INT_TYPE_INFO,
-			BasicTypeInfo.LONG_TYPE_INFO,
-			BasicTypeInfo.FLOAT_TYPE_INFO,
-			BasicTypeInfo.DOUBLE_TYPE_INFO,
-			PrimitiveArrayTypeInfo.BYTE_PRIMITIVE_ARRAY_TYPE_INFO,
-			BasicTypeInfo.STRING_TYPE_INFO,
-			ObjectArrayTypeInfo.getInfoFor(rowTypeInfo),
-			ObjectArrayTypeInfo.getInfoFor(rowTypeInfo),
-			new MapTypeInfo(BasicTypeInfo.STRING_TYPE_INFO, rowTypeInfo)
-		};
-		TableSchema expectedTableSchema = new TableSchema(colNames, colTypes);
+		// ensure table schema is identical
+		assertEquals(orc.getTableSchema(), projected.getTableSchema());
+
+		// ensure return type is identical
+		assertEquals(
+			Types.ROW_NAMED(getNestedFieldNames(), getNestedFieldTypes()),
+			projected.getReturnType());
+
+		// ensure IF is configured with supported predicates
+		OrcTableSource spyTS = spy(projected);
+		OrcRowInputFormat mockIF = mock(OrcRowInputFormat.class);
+		doReturn(mockIF).when(spyTS).buildOrcInputFormat();
+		spyTS.getDataSet(mock(ExecutionEnvironment.class));
+
+		ArgumentCaptor<OrcRowInputFormat.Predicate> arguments = ArgumentCaptor.forClass(OrcRowInputFormat.Predicate.class);
+		verify(mockIF, times(2)).addPredicate(arguments.capture());
+		List<String> values = arguments.getAllValues().stream().map(Object::toString).collect(Collectors.toList());
+		assertTrue(values.contains(
+			new OrcRowInputFormat.Not(new OrcRowInputFormat.LessThanEquals("int1", PredicateLeaf.Type.LONG, 100)).toString()));
+		assertTrue(values.contains(
+			new OrcRowInputFormat.Equals("string1", PredicateLeaf.Type.STRING, "hello").toString()));
+
+		// ensure filter pushdown is correct
+		assertTrue(spyTS.isFilterPushedDown());
+		assertFalse(orc.isFilterPushedDown());
+	}
+
+	private String getPath(String fileName) {
+		return getClass().getClassLoader().getResource(fileName).getPath();
+	}
 
-		Assert.assertArrayEquals(t.getSchema().getColumnNames(), colNames);
-		Assert.assertArrayEquals(t.getSchema().getTypes(), colTypes);
-		Assert.assertEquals(expectedTableSchema.toString(), t.getSchema().toString());
+	private String[] getNestedFieldNames() {
+		return new String[] {
+			"boolean1", "byte1", "short1", "int1", "long1", "float1", "double1", "bytes1", "string1", "middle", "list", "map"
+		};
+	}
 
+	private TypeInformation[] getNestedFieldTypes() {
+		return new TypeInformation[]{
+			Types.BOOLEAN, Types.BYTE, Types.SHORT, Types.INT, Types.LONG, Types.FLOAT, Types.DOUBLE,
+			PrimitiveArrayTypeInfo.BYTE_PRIMITIVE_ARRAY_TYPE_INFO, Types.STRING,
+			Types.ROW_NAMED(
+				new String[]{"list"},
+				ObjectArrayTypeInfo.getInfoFor(
+					Types.ROW_NAMED(
+						new String[]{"int1", "string1"},
+						Types.INT, Types.STRING
+					)
+				)
+			),
+			ObjectArrayTypeInfo.getInfoFor(
+				Types.ROW_NAMED(
+					new String[]{"int1", "string1"},
+					Types.INT, Types.STRING
+				)
+			),
+			new MapTypeInfo<>(
+				Types.STRING,
+				Types.ROW_NAMED(
+					new String[]{"int1", "string1"},
+					Types.INT, Types.STRING
+				)
+			)
+		};
 	}
 
 }

http://git-wip-us.apache.org/repos/asf/flink/blob/200612ee/flink-connectors/flink-orc/src/test/java/org/apache/flink/orc/OrcUtilsTest.java
----------------------------------------------------------------------
diff --git a/flink-connectors/flink-orc/src/test/java/org/apache/flink/orc/OrcUtilsTest.java b/flink-connectors/flink-orc/src/test/java/org/apache/flink/orc/OrcUtilsTest.java
new file mode 100644
index 0000000..2cb1715
--- /dev/null
+++ b/flink-connectors/flink-orc/src/test/java/org/apache/flink/orc/OrcUtilsTest.java
@@ -0,0 +1,148 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.flink.orc;
+
+import org.apache.flink.api.common.typeinfo.BasicTypeInfo;
+import org.apache.flink.api.common.typeinfo.PrimitiveArrayTypeInfo;
+import org.apache.flink.api.common.typeinfo.TypeInformation;
+import org.apache.flink.api.common.typeinfo.Types;
+import org.apache.flink.api.java.typeutils.MapTypeInfo;
+import org.apache.flink.api.java.typeutils.ObjectArrayTypeInfo;
+import org.apache.flink.api.java.typeutils.RowTypeInfo;
+
+import org.apache.orc.TypeDescription;
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * Unit tests for {@link OrcUtils}.
+ *
+ */
+public class OrcUtilsTest {
+
+	@Test
+	public void testFlatSchemaToTypeInfo1() {
+
+		String schema =
+			"struct<" +
+				"boolean1:boolean," +
+				"byte1:tinyint," +
+				"short1:smallint," +
+				"int1:int," +
+				"long1:bigint," +
+				"float1:float," +
+				"double1:double," +
+				"bytes1:binary," +
+				"string1:string," +
+				"date1:date," +
+				"timestamp1:timestamp," +
+				"decimal1:decimal(5,2)" +
+			">";
+		TypeInformation typeInfo = OrcUtils.schemaToTypeInfo(TypeDescription.fromString(schema));
+
+		Assert.assertNotNull(typeInfo);
+		Assert.assertTrue(typeInfo instanceof RowTypeInfo);
+		RowTypeInfo rowTypeInfo = (RowTypeInfo) typeInfo;
+
+		// validate field types
+		Assert.assertArrayEquals(
+			new TypeInformation[]{
+				Types.BOOLEAN, Types.BYTE, Types.SHORT, Types.INT, Types.LONG, Types.FLOAT, Types.DOUBLE,
+				PrimitiveArrayTypeInfo.BYTE_PRIMITIVE_ARRAY_TYPE_INFO, Types.STRING,
+				Types.SQL_DATE, Types.SQL_TIMESTAMP, BasicTypeInfo.BIG_DEC_TYPE_INFO
+			},
+			rowTypeInfo.getFieldTypes());
+
+		// validate field names
+		Assert.assertArrayEquals(
+			new String[] {
+				"boolean1", "byte1", "short1", "int1", "long1", "float1", "double1",
+				"bytes1", "string1", "date1", "timestamp1", "decimal1"
+			},
+			rowTypeInfo.getFieldNames());
+
+	}
+
+	@Test
+	public void testNestedSchemaToTypeInfo1() {
+
+		String schema =
+			"struct<" +
+				"middle:struct<" +
+					"list:array<" +
+						"struct<" +
+							"int1:int," +
+							"string1:string" +
+						">" +
+					">" +
+				">," +
+				"list:array<" +
+					"struct<" +
+						"int1:int," +
+						"string1:string" +
+					">" +
+				">," +
+				"map:map<" +
+					"string," +
+					"struct<" +
+						"int1:int," +
+						"string1:string" +
+					">" +
+				">" +
+			">";
+		TypeInformation typeInfo = OrcUtils.schemaToTypeInfo(TypeDescription.fromString(schema));
+
+		Assert.assertNotNull(typeInfo);
+		Assert.assertTrue(typeInfo instanceof RowTypeInfo);
+		RowTypeInfo rowTypeInfo = (RowTypeInfo) typeInfo;
+
+		// validate field types
+		Assert.assertArrayEquals(
+			new TypeInformation[]{
+				Types.ROW_NAMED(
+					new String[]{"list"},
+					ObjectArrayTypeInfo.getInfoFor(
+						Types.ROW_NAMED(
+							new String[]{"int1", "string1"},
+							Types.INT, Types.STRING
+						)
+					)
+				),
+				ObjectArrayTypeInfo.getInfoFor(
+					Types.ROW_NAMED(
+						new String[]{"int1", "string1"},
+						Types.INT, Types.STRING
+					)
+				),
+				new MapTypeInfo<>(
+					Types.STRING,
+					Types.ROW_NAMED(
+						new String[]{"int1", "string1"},
+						Types.INT, Types.STRING
+					)
+				)
+			},
+			rowTypeInfo.getFieldTypes());
+
+		// validate field names
+		Assert.assertArrayEquals(
+			new String[] {"middle", "list", "map"},
+			rowTypeInfo.getFieldNames());
+	}
+}

http://git-wip-us.apache.org/repos/asf/flink/blob/200612ee/flink-connectors/flink-orc/src/test/java/org/apache/flink/orc/RowOrcInputFormatTest.java
----------------------------------------------------------------------
diff --git a/flink-connectors/flink-orc/src/test/java/org/apache/flink/orc/RowOrcInputFormatTest.java b/flink-connectors/flink-orc/src/test/java/org/apache/flink/orc/RowOrcInputFormatTest.java
deleted file mode 100644
index 60008a0..0000000
--- a/flink-connectors/flink-orc/src/test/java/org/apache/flink/orc/RowOrcInputFormatTest.java
+++ /dev/null
@@ -1,472 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.flink.orc;
-
-import org.apache.flink.api.common.typeinfo.TypeInformation;
-import org.apache.flink.core.fs.FileInputSplit;
-import org.apache.flink.types.Row;
-
-import org.apache.hadoop.conf.Configuration;
-
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Test;
-
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.net.URL;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * Tests for the {@link RowOrcInputFormat}.
- */
-
-public class RowOrcInputFormatTest {
-
-	private RowOrcInputFormat rowOrcInputFormat;
-
-	@After
-	public void tearDown() throws IOException {
-		if (rowOrcInputFormat != null) {
-			rowOrcInputFormat.close();
-			rowOrcInputFormat.closeInputFormat();
-		}
-		rowOrcInputFormat = null;
-	}
-
-	private final URL test1URL = getClass().getClassLoader().getResource("TestOrcFile.test1.orc");
-
-	private static final String TEST1_SCHEMA = "struct<boolean1:boolean,byte1:tinyint,short1:smallint,int1:int," +
-		"long1:bigint,float1:float,double1:double,bytes1:binary,string1:string," +
-		"middle:struct<list:array<struct<int1:int,string1:string>>>," +
-		"list:array<struct<int1:int,string1:string>>," +
-		"map:map<string,struct<int1:int,string1:string>>>";
-
-	private static final String[] TEST1_DATA = new String[] {
-		"false,1,1024,65536,9223372036854775807,1.0,-15.0,[0, 1, 2, 3, 4],hi,[1,bye, 2,sigh],[3,good, 4,bad],{}",
-		"true,100,2048,65536,9223372036854775807,2.0,-5.0,[],bye,[1,bye, 2,sigh]," +
-			"[100000000,cat, -100000,in, 1234,hat],{chani=5,chani, mauddib=1,mauddib}" };
-
-	private static final String[] TEST1_PROJECTED_DATA = new String[] {
-		"{},[3,good, 4,bad],[1,bye, 2,sigh],hi,[0, 1, 2, 3, 4],-15.0,1.0,9223372036854775807,65536,1024,1,false",
-		"{chani=5,chani, mauddib=1,mauddib},[100000000,cat, -100000,in, 1234,hat],[1,bye, 2,sigh],bye," +
-			"[],-5.0,2.0,9223372036854775807,65536,2048,100,true" };
-
-	private static final String TEST1_INVALID_SCHEMA = "struct<boolean1:int,byte1:tinyint,short1:smallint,int1:int," +
-		"long1:bigint,float1:float,double1:double,bytes1:binary,string1:string," +
-		"middle:struct<list:array<struct<int1:int,string1:string>>>," +
-		"list:array<struct<int1:int,string1:string>>," +
-		"map:map<string,struct<int1:int,string1:string>>>";
-
-	@Test(expected = FileNotFoundException.class)
-	public void testInvalidPath() throws IOException{
-
-		rowOrcInputFormat = new RowOrcInputFormat("TestOrcFile.test2.orc", TEST1_SCHEMA, new Configuration());
-		rowOrcInputFormat.openInputFormat();
-		FileInputSplit[] inputSplits = rowOrcInputFormat.createInputSplits(1);
-		rowOrcInputFormat.open(inputSplits[0]);
-
-	}
-
-	@Test(expected = RuntimeException.class)
-	public void testInvalidSchema() throws IOException{
-
-		assert(test1URL != null);
-		rowOrcInputFormat = new RowOrcInputFormat(test1URL.getPath(), TEST1_INVALID_SCHEMA, new Configuration());
-		rowOrcInputFormat.openInputFormat();
-		FileInputSplit[] inputSplits = rowOrcInputFormat.createInputSplits(1);
-		rowOrcInputFormat.open(inputSplits[0]);
-
-	}
-
-	@Test(expected = IndexOutOfBoundsException.class)
-	public void testInvalidProjection() throws IOException{
-
-		assert(test1URL != null);
-		rowOrcInputFormat = new RowOrcInputFormat(test1URL.getPath(), TEST1_SCHEMA, new Configuration());
-		int[] projectionMask = {14};
-		rowOrcInputFormat.setFieldMapping(projectionMask);
-	}
-
-	@Test
-	public void testMajorDataTypes() throws IOException{
-
-		// test for boolean,byte,short,int,long,float,double,bytes,string,struct,list,map
-		assert(test1URL != null);
-		rowOrcInputFormat = new RowOrcInputFormat(test1URL.getPath(), TEST1_SCHEMA, new Configuration());
-		rowOrcInputFormat.openInputFormat();
-		FileInputSplit[] inputSplits = rowOrcInputFormat.createInputSplits(1);
-
-		Assert.assertEquals(inputSplits.length, 1);
-
-		Row row = null;
-		int count = 0;
-		for (FileInputSplit split : inputSplits) {
-			rowOrcInputFormat.open(split);
-			while (!rowOrcInputFormat.reachedEnd()) {
-				row = rowOrcInputFormat.nextRecord(row);
-				Assert.assertEquals(row.toString(), TEST1_DATA[count++]);
-			}
-		}
-	}
-
-	@Test
-	public void testProjection() throws IOException{
-
-		assert(test1URL != null);
-		rowOrcInputFormat = new RowOrcInputFormat(test1URL.getPath(), TEST1_SCHEMA, new Configuration());
-		int[] projectionMask = {11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
-		rowOrcInputFormat.setFieldMapping(projectionMask);
-		rowOrcInputFormat.openInputFormat();
-		FileInputSplit[] inputSplits = rowOrcInputFormat.createInputSplits(1);
-
-		Assert.assertEquals(inputSplits.length, 1);
-
-		Row row = null;
-		int count = 0;
-		for (FileInputSplit split : inputSplits) {
-			rowOrcInputFormat.open(split);
-			while (!rowOrcInputFormat.reachedEnd()) {
-				row = rowOrcInputFormat.nextRecord(row);
-				Assert.assertEquals(row.toString(), TEST1_PROJECTED_DATA[count++]);
-			}
-		}
-
-	}
-
-	@Test
-	public void testTimeStampAndDate() throws IOException{
-
-		URL expectedDataURL = getClass().getClassLoader().getResource("TestOrcFile.testDate1900.dat");
-		assert(expectedDataURL != null);
-		List<String> expectedTimeStampAndDate = Files.readAllLines(Paths.get(expectedDataURL.getPath()));
-
-		URL testInputURL = getClass().getClassLoader().getResource("TestOrcFile.testDate1900.orc");
-		assert(testInputURL != null);
-		String path = testInputURL.getPath();
-		String schema = "struct<time:timestamp,date:date>";
-		rowOrcInputFormat = new RowOrcInputFormat(path, schema, new Configuration());
-		rowOrcInputFormat.openInputFormat();
-
-		FileInputSplit[] inputSplits = rowOrcInputFormat.createInputSplits(1);
-
-		Assert.assertEquals(inputSplits.length, 1);
-
-		List<Object> actualTimeStampAndDate = new ArrayList<>();
-
-		Row row = null;
-		int count = 0;
-		for (FileInputSplit split : inputSplits) {
-			rowOrcInputFormat.open(split);
-			while (!rowOrcInputFormat.reachedEnd()) {
-				row = rowOrcInputFormat.nextRecord(row);
-				count++;
-				if (count <= 10000) {
-					actualTimeStampAndDate.add(row.getField(0) + "," + row.getField(1));
-				}
-
-			}
-		}
-		Assert.assertEquals(count, 70000);
-		Assert.assertEquals(expectedTimeStampAndDate.size(), actualTimeStampAndDate.size());
-		Assert.assertEquals(expectedTimeStampAndDate.toString(), actualTimeStampAndDate.toString());
-
-	}
-
-	@Test
-	public void testDecimal() throws IOException{
-
-		URL expectedDataURL = getClass().getClassLoader().getResource("decimal.dat");
-		List<String> expectedDecimal = Files.readAllLines(Paths.get(expectedDataURL.getPath()));
-
-		URL testInputURL = getClass().getClassLoader().getResource("decimal.orc");
-		assert(testInputURL != null);
-		String path = testInputURL.getPath();
-		String schema = "struct<_col0:decimal(10,5)>";
-		rowOrcInputFormat = new RowOrcInputFormat(path, schema, new Configuration());
-		rowOrcInputFormat.openInputFormat();
-
-		FileInputSplit[] inputSplits = rowOrcInputFormat.createInputSplits(1);
-
-		Assert.assertEquals(inputSplits.length, 1);
-
-		List<Object> actualDecimal = new ArrayList<>();
-
-		Row row = null;
-		for (FileInputSplit split : inputSplits) {
-			rowOrcInputFormat.open(split);
-			while (!rowOrcInputFormat.reachedEnd()) {
-				row = rowOrcInputFormat.nextRecord(row);
-				actualDecimal.add(row.getField(0));
-			}
-		}
-
-		Assert.assertEquals(expectedDecimal.size(), actualDecimal.size());
-		Assert.assertEquals(expectedDecimal.toString(), actualDecimal.toString());
-
-	}
-
-	@Test
-	public void testEmptyFile() throws IOException{
-
-		URL testInputURL = getClass().getClassLoader().getResource("TestOrcFile.emptyFile.orc");
-		assert(testInputURL != null);
-		String path = testInputURL.getPath();
-
-		rowOrcInputFormat = new RowOrcInputFormat(path, TEST1_SCHEMA, new Configuration());
-		rowOrcInputFormat.openInputFormat();
-
-		FileInputSplit[] inputSplits = rowOrcInputFormat.createInputSplits(1);
-
-		Assert.assertEquals(inputSplits.length, 1);
-
-		Row row = new Row(1);
-		int count = 0;
-		for (FileInputSplit split : inputSplits) {
-			rowOrcInputFormat.open(split);
-			while (!rowOrcInputFormat.reachedEnd()) {
-				row = rowOrcInputFormat.nextRecord(row);
-				count++;
-			}
-		}
-
-		Assert.assertEquals(count, 0);
-	}
-
-	@Test
-	public void testLargeFile() throws IOException{
-
-		URL testInputURL = getClass().getClassLoader().getResource("demo-11-none.orc");
-		assert(testInputURL != null);
-		String path = testInputURL.getPath();
-		String schema = "struct<_col0:int,_col1:string,_col2:string,_col3:string,_col4:int," +
-			"_col5:string,_col6:int,_col7:int,_col8:int>";
-
-		rowOrcInputFormat = new RowOrcInputFormat(path, schema, new Configuration());
-		rowOrcInputFormat.openInputFormat();
-
-		FileInputSplit[] inputSplits = rowOrcInputFormat.createInputSplits(1);
-
-		Assert.assertEquals(inputSplits.length, 1);
-
-		Row row = new Row(1);
-		int count = 0;
-		for (FileInputSplit split : inputSplits) {
-			rowOrcInputFormat.open(split);
-			while (!rowOrcInputFormat.reachedEnd()) {
-				row = rowOrcInputFormat.nextRecord(row);
-				count++;
-			}
-		}
-
-		Assert.assertEquals(count, 1920800);
-	}
-
-	@Test
-	public void testProducedType() throws IOException{
-
-		assert(test1URL != null);
-		rowOrcInputFormat = new RowOrcInputFormat(test1URL.getPath(), TEST1_SCHEMA, new Configuration());
-		rowOrcInputFormat.openInputFormat();
-		FileInputSplit[] inputSplits = rowOrcInputFormat.createInputSplits(1);
-
-		Assert.assertEquals(inputSplits.length, 1);
-
-		rowOrcInputFormat.open(inputSplits[0]);
-
-		TypeInformation<Row> type = rowOrcInputFormat.getProducedType();
-		Assert.assertEquals(type.toString(), "Row(boolean1: Boolean, byte1: Byte, short1: Short, int1: Integer," +
-			" long1: Long, float1: Float, double1: Double, bytes1: byte[], string1: String," +
-			" middle: Row(list: ObjectArrayTypeInfo<Row(int1: Integer, string1: String)>)," +
-			" list: ObjectArrayTypeInfo<Row(int1: Integer, string1: String)>," +
-			" map: Map<String, Row(int1: Integer, string1: String)>)");
-
-	}
-
-	@Test
-	public void testProducedTypeWithProjection() throws IOException{
-
-		assert(test1URL != null);
-		rowOrcInputFormat = new RowOrcInputFormat(test1URL.getPath(), TEST1_SCHEMA, new Configuration());
-		int[] projectionMask = {9, 10, 11};
-		rowOrcInputFormat.setFieldMapping(projectionMask);
-		rowOrcInputFormat.openInputFormat();
-		FileInputSplit[] inputSplits = rowOrcInputFormat.createInputSplits(1);
-
-		Assert.assertEquals(inputSplits.length, 1);
-
-		rowOrcInputFormat.open(inputSplits[0]);
-
-		TypeInformation<Row> type = rowOrcInputFormat.getProducedType();
-		Assert.assertEquals(type.toString(), "Row(middle: Row(list: ObjectArrayTypeInfo<Row(int1: Integer, string1: String)>)," +
-			" list: ObjectArrayTypeInfo<Row(int1: Integer, string1: String)>," +
-			" map: Map<String, Row(int1: Integer, string1: String)>)");
-
-	}
-
-	@Test
-	public void testLongList() throws Exception {
-
-		URL testInputURL = getClass().getClassLoader().getResource("TestOrcFile.listlong.orc");
-		assert(testInputURL != null);
-		String path = testInputURL.getPath();
-		String schema = "struct<mylist1:array<bigint>>";
-
-		rowOrcInputFormat = new RowOrcInputFormat(path, schema, new Configuration());
-
-		rowOrcInputFormat.openInputFormat();
-		FileInputSplit[] inputSplits = rowOrcInputFormat.createInputSplits(1);
-
-		Assert.assertEquals(inputSplits.length, 1);
-
-		Row row = null;
-		long count = 0;
-		for (FileInputSplit split : inputSplits) {
-			rowOrcInputFormat.open(split);
-			while (!rowOrcInputFormat.reachedEnd()) {
-				row = rowOrcInputFormat.nextRecord(row);
-				Assert.assertEquals(row.getArity(), 1);
-				Object object = row.getField(0);
-				long[] l = (long[]) object;
-
-				Assert.assertEquals(l.length, 2);
-				if (count < 50) {
-					Assert.assertArrayEquals(l, new long[]{count, count + 1});
-				}
-				else {
-					Assert.assertArrayEquals(l, new long[]{0L, 0L});
-				}
-				count = count + 2;
-			}
-		}
-		Assert.assertEquals(count, 100);
-	}
-
-	@Test
-	public void testStringList() throws Exception {
-
-		URL testInputURL = getClass().getClassLoader().getResource("TestOrcFile.liststring.orc");
-		assert(testInputURL != null);
-		String path = testInputURL.getPath();
-		String schema = "struct<mylist1:array<string>>";
-
-		rowOrcInputFormat = new RowOrcInputFormat(path, schema, new Configuration());
-
-		rowOrcInputFormat.openInputFormat();
-		FileInputSplit[] inputSplits = rowOrcInputFormat.createInputSplits(1);
-
-		Assert.assertEquals(inputSplits.length, 1);
-
-		Row row = null;
-		long count = 0;
-		for (FileInputSplit split : inputSplits) {
-			rowOrcInputFormat.open(split);
-			while (!rowOrcInputFormat.reachedEnd()) {
-				row = rowOrcInputFormat.nextRecord(row);
-				Assert.assertEquals(row.getArity(), 1);
-				Object object = row.getField(0);
-				String[] l = (String[]) object;
-
-				Assert.assertEquals(l.length, 2);
-				Assert.assertArrayEquals(l, new String[]{"hello" + count, "hello" + (count + 1) });
-				count = count + 2;
-			}
-		}
-		Assert.assertEquals(count, 200);
-	}
-
-	@Test
-	public void testListOfListOfStructOfLong() throws Exception {
-		URL testInputURL = getClass().getClassLoader().getResource("TestOrcFile.listliststructlong.orc");
-		assert(testInputURL != null);
-		String path = testInputURL.getPath();
-		String schema = "struct<mylist1:array<array<struct<mylong1:bigint>>>>";
-
-		rowOrcInputFormat = new RowOrcInputFormat(path, schema, new Configuration());
-
-		rowOrcInputFormat.openInputFormat();
-		FileInputSplit[] inputSplits = rowOrcInputFormat.createInputSplits(1);
-
-		Assert.assertEquals(inputSplits.length, 1);
-
-		Row row = null;
-		long count = 0;
-		for (FileInputSplit split : inputSplits) {
-			rowOrcInputFormat.open(split);
-			while (!rowOrcInputFormat.reachedEnd()) {
-
-				row = rowOrcInputFormat.nextRecord(row);
-				Assert.assertEquals(row.getArity(), 1);
-
-				Object[] objects = (Object[]) row.getField(0);
-				Assert.assertEquals(objects.length, 1);
-
-				Object[] objects1 = (Object[]) objects[0];
-				Assert.assertEquals(objects1.length, 1);
-
-				Row[] nestedRows = Arrays.copyOf(objects1, objects1.length, Row[].class);
-				Assert.assertEquals(nestedRows.length, 1);
-
-				Assert.assertEquals(nestedRows[0].getArity(), 1);
-
-				Assert.assertEquals(nestedRows[0].getField(0), count);
-
-				count++;
-			}
-		}
-		Assert.assertEquals(count, 100);
-	}
-
-	@Test
-	public void testSplit() throws IOException{
-
-		URL testInputURL = getClass().getClassLoader().getResource("demo-11-none.orc");
-		assert(testInputURL != null);
-		String path = testInputURL.getPath();
-		String schema = "struct<_col0:int,_col1:string,_col2:string,_col3:string,_col4:int," +
-			"_col5:string,_col6:int,_col7:int,_col8:int>";
-
-		rowOrcInputFormat = new RowOrcInputFormat(path, schema, new Configuration());
-		rowOrcInputFormat.openInputFormat();
-
-		FileInputSplit[] inputSplits = rowOrcInputFormat.createInputSplits(10);
-
-		Assert.assertEquals(inputSplits.length, 10);
-
-		Row row = null;
-		int countTotalRecords = 0;
-		for (FileInputSplit split : inputSplits) {
-			rowOrcInputFormat.open(split);
-			int countSplitRecords = 0;
-			while (!rowOrcInputFormat.reachedEnd()) {
-				row = rowOrcInputFormat.nextRecord(row);
-				countSplitRecords++;
-			}
-			Assert.assertNotEquals(countSplitRecords, 1920800);
-			countTotalRecords += countSplitRecords;
-		}
-
-		Assert.assertEquals(countTotalRecords, 1920800);
-	}
-
-}

http://git-wip-us.apache.org/repos/asf/flink/blob/200612ee/flink-connectors/flink-orc/src/test/resources/TestOrcFile.emptyFile.orc
----------------------------------------------------------------------
diff --git a/flink-connectors/flink-orc/src/test/resources/TestOrcFile.emptyFile.orc b/flink-connectors/flink-orc/src/test/resources/TestOrcFile.emptyFile.orc
deleted file mode 100644
index ecdadcb..0000000
Binary files a/flink-connectors/flink-orc/src/test/resources/TestOrcFile.emptyFile.orc and /dev/null differ

http://git-wip-us.apache.org/repos/asf/flink/blob/200612ee/flink-connectors/flink-orc/src/test/resources/TestOrcFile.listliststructlong.orc
----------------------------------------------------------------------
diff --git a/flink-connectors/flink-orc/src/test/resources/TestOrcFile.listliststructlong.orc b/flink-connectors/flink-orc/src/test/resources/TestOrcFile.listliststructlong.orc
deleted file mode 100644
index 0f3f9c8..0000000
Binary files a/flink-connectors/flink-orc/src/test/resources/TestOrcFile.listliststructlong.orc and /dev/null differ

http://git-wip-us.apache.org/repos/asf/flink/blob/200612ee/flink-connectors/flink-orc/src/test/resources/TestOrcFile.listlong.orc
----------------------------------------------------------------------
diff --git a/flink-connectors/flink-orc/src/test/resources/TestOrcFile.listlong.orc b/flink-connectors/flink-orc/src/test/resources/TestOrcFile.listlong.orc
deleted file mode 100644
index 648ea18..0000000
Binary files a/flink-connectors/flink-orc/src/test/resources/TestOrcFile.listlong.orc and /dev/null differ

http://git-wip-us.apache.org/repos/asf/flink/blob/200612ee/flink-connectors/flink-orc/src/test/resources/TestOrcFile.liststring.orc
----------------------------------------------------------------------
diff --git a/flink-connectors/flink-orc/src/test/resources/TestOrcFile.liststring.orc b/flink-connectors/flink-orc/src/test/resources/TestOrcFile.liststring.orc
deleted file mode 100644
index 75a5f2a..0000000
Binary files a/flink-connectors/flink-orc/src/test/resources/TestOrcFile.liststring.orc and /dev/null differ

http://git-wip-us.apache.org/repos/asf/flink/blob/200612ee/flink-connectors/flink-orc/src/test/resources/TestOrcFile.test1.orc
----------------------------------------------------------------------
diff --git a/flink-connectors/flink-orc/src/test/resources/TestOrcFile.test1.orc b/flink-connectors/flink-orc/src/test/resources/TestOrcFile.test1.orc
deleted file mode 100644
index 4fb0bef..0000000
Binary files a/flink-connectors/flink-orc/src/test/resources/TestOrcFile.test1.orc and /dev/null differ


[5/9] flink git commit: [FLINK-2170] [connectors] Add OrcRowInputFormat and OrcTableSource.

Posted by fh...@apache.org.
http://git-wip-us.apache.org/repos/asf/flink/blob/200612ee/flink-connectors/flink-orc/src/test/resources/TestOrcFile.testDate1900.orc
----------------------------------------------------------------------
diff --git a/flink-connectors/flink-orc/src/test/resources/TestOrcFile.testDate1900.orc b/flink-connectors/flink-orc/src/test/resources/TestOrcFile.testDate1900.orc
deleted file mode 100644
index f51ffdb..0000000
Binary files a/flink-connectors/flink-orc/src/test/resources/TestOrcFile.testDate1900.orc and /dev/null differ

http://git-wip-us.apache.org/repos/asf/flink/blob/200612ee/flink-connectors/flink-orc/src/test/resources/decimal.dat
----------------------------------------------------------------------
diff --git a/flink-connectors/flink-orc/src/test/resources/decimal.dat b/flink-connectors/flink-orc/src/test/resources/decimal.dat
deleted file mode 100644
index 42010b5..0000000
--- a/flink-connectors/flink-orc/src/test/resources/decimal.dat
+++ /dev/null
@@ -1,6000 +0,0 @@
--1000.5
--999.6
--998.7
--997.8
--996.9
--995.1
--994.11
--993.12
--992.13
--991.14
--990.15
--989.16
--988.17
--987.18
--986.19
--985.2
--984.21
--983.22
--982.23
--981.24
--980.25
--979.26
--978.27
--977.28
--976.29
--975.3
--974.31
--973.32
--972.33
--971.34
--970.35
--969.36
--968.37
--967.38
--966.39
--965.4
--964.41
--963.42
--962.43
--961.44
--960.45
--959.46
--958.47
--957.48
--956.49
--955.5
--954.51
--953.52
--952.53
--951.54
--950.55
--949.56
--948.57
--947.58
--946.59
--945.6
--944.61
--943.62
--942.63
--941.64
--940.65
--939.66
--938.67
--937.68
--936.69
--935.7
--934.71
--933.72
--932.73
--931.74
--930.75
--929.76
--928.77
--927.78
--926.79
--925.8
--924.81
--923.82
--922.83
--921.84
--920.85
--919.86
--918.87
--917.88
--916.89
--915.9
--914.91
--913.92
--912.93
--911.94
--910.95
--909.96
--908.97
--907.98
--906.99
--905.1
--904.101
--903.102
--902.103
--901.104
--900.105
--899.106
--898.107
--897.108
--896.109
--895.11
--894.111
--893.112
--892.113
--891.114
--890.115
--889.116
--888.117
--887.118
--886.119
--885.12
--884.121
--883.122
--882.123
--881.124
--880.125
--879.126
--878.127
--877.128
--876.129
--875.13
--874.131
--873.132
--872.133
--871.134
--870.135
--869.136
--868.137
--867.138
--866.139
--865.14
--864.141
--863.142
--862.143
--861.144
--860.145
--859.146
--858.147
--857.148
--856.149
--855.15
--854.151
--853.152
--852.153
--851.154
--850.155
--849.156
--848.157
--847.158
--846.159
--845.16
--844.161
--843.162
--842.163
--841.164
--840.165
--839.166
--838.167
--837.168
--836.169
--835.17
--834.171
--833.172
--832.173
--831.174
--830.175
--829.176
--828.177
--827.178
--826.179
--825.18
--824.181
--823.182
--822.183
--821.184
--820.185
--819.186
--818.187
--817.188
--816.189
--815.19
--814.191
--813.192
--812.193
--811.194
--810.195
--809.196
--808.197
--807.198
--806.199
--805.2
--804.201
--803.202
--802.203
--801.204
--800.205
--799.206
--798.207
--797.208
--796.209
--795.21
--794.211
--793.212
--792.213
--791.214
--790.215
--789.216
--788.217
--787.218
--786.219
--785.22
--784.221
--783.222
--782.223
--781.224
--780.225
--779.226
--778.227
--777.228
--776.229
--775.23
--774.231
--773.232
--772.233
--771.234
--770.235
--769.236
--768.237
--767.238
--766.239
--765.24
--764.241
--763.242
--762.243
--761.244
--760.245
--759.246
--758.247
--757.248
--756.249
--755.25
--754.251
--753.252
--752.253
--751.254
--750.255
--749.256
--748.257
--747.258
--746.259
--745.26
--744.261
--743.262
--742.263
--741.264
--740.265
--739.266
--738.267
--737.268
--736.269
--735.27
--734.271
--733.272
--732.273
--731.274
--730.275
--729.276
--728.277
--727.278
--726.279
--725.28
--724.281
--723.282
--722.283
--721.284
--720.285
--719.286
--718.287
--717.288
--716.289
--715.29
--714.291
--713.292
--712.293
--711.294
--710.295
--709.296
--708.297
--707.298
--706.299
--705.3
--704.301
--703.302
--702.303
--701.304
--700.305
--699.306
--698.307
--697.308
--696.309
--695.31
--694.311
--693.312
--692.313
--691.314
--690.315
--689.316
--688.317
--687.318
--686.319
--685.32
--684.321
--683.322
--682.323
--681.324
--680.325
--679.326
--678.327
--677.328
--676.329
--675.33
--674.331
--673.332
--672.333
--671.334
--670.335
--669.336
--668.337
--667.338
--666.339
--665.34
--664.341
--663.342
--662.343
--661.344
--660.345
--659.346
--658.347
--657.348
--656.349
--655.35
--654.351
--653.352
--652.353
--651.354
--650.355
--649.356
--648.357
--647.358
--646.359
--645.36
--644.361
--643.362
--642.363
--641.364
--640.365
--639.366
--638.367
--637.368
--636.369
--635.37
--634.371
--633.372
--632.373
--631.374
--630.375
--629.376
--628.377
--627.378
--626.379
--625.38
--624.381
--623.382
--622.383
--621.384
--620.385
--619.386
--618.387
--617.388
--616.389
--615.39
--614.391
--613.392
--612.393
--611.394
--610.395
--609.396
--608.397
--607.398
--606.399
--605.4
--604.401
--603.402
--602.403
--601.404
--600.405
--599.406
--598.407
--597.408
--596.409
--595.41
--594.411
--593.412
--592.413
--591.414
--590.415
--589.416
--588.417
--587.418
--586.419
--585.42
--584.421
--583.422
--582.423
--581.424
--580.425
--579.426
--578.427
--577.428
--576.429
--575.43
--574.431
--573.432
--572.433
--571.434
--570.435
--569.436
--568.437
--567.438
--566.439
--565.44
--564.441
--563.442
--562.443
--561.444
--560.445
--559.446
--558.447
--557.448
--556.449
--555.45
--554.451
--553.452
--552.453
--551.454
--550.455
--549.456
--548.457
--547.458
--546.459
--545.46
--544.461
--543.462
--542.463
--541.464
--540.465
--539.466
--538.467
--537.468
--536.469
--535.47
--534.471
--533.472
--532.473
--531.474
--530.475
--529.476
--528.477
--527.478
--526.479
--525.48
--524.481
--523.482
--522.483
--521.484
--520.485
--519.486
--518.487
--517.488
--516.489
--515.49
--514.491
--513.492
--512.493
--511.494
--510.495
--509.496
--508.497
--507.498
--506.499
--505.5
--504.501
--503.502
--502.503
--501.504
--500.505
--499.506
--498.507
--497.508
--496.509
--495.51
--494.511
--493.512
--492.513
--491.514
--490.515
--489.516
--488.517
--487.518
--486.519
--485.52
--484.521
--483.522
--482.523
--481.524
--480.525
--479.526
--478.527
--477.528
--476.529
--475.53
--474.531
--473.532
--472.533
--471.534
--470.535
--469.536
--468.537
--467.538
--466.539
--465.54
--464.541
--463.542
--462.543
--461.544
--460.545
--459.546
--458.547
--457.548
--456.549
--455.55
--454.551
--453.552
--452.553
--451.554
--450.555
--449.556
--448.557
--447.558
--446.559
--445.56
--444.561
--443.562
--442.563
--441.564
--440.565
--439.566
--438.567
--437.568
--436.569
--435.57
--434.571
--433.572
--432.573
--431.574
--430.575
--429.576
--428.577
--427.578
--426.579
--425.58
--424.581
--423.582
--422.583
--421.584
--420.585
--419.586
--418.587
--417.588
--416.589
--415.59
--414.591
--413.592
--412.593
--411.594
--410.595
--409.596
--408.597
--407.598
--406.599
--405.6
--404.601
--403.602
--402.603
--401.604
--400.605
--399.606
--398.607
--397.608
--396.609
--395.61
--394.611
--393.612
--392.613
--391.614
--390.615
--389.616
--388.617
--387.618
--386.619
--385.62
--384.621
--383.622
--382.623
--381.624
--380.625
--379.626
--378.627
--377.628
--376.629
--375.63
--374.631
--373.632
--372.633
--371.634
--370.635
--369.636
--368.637
--367.638
--366.639
--365.64
--364.641
--363.642
--362.643
--361.644
--360.645
--359.646
--358.647
--357.648
--356.649
--355.65
--354.651
--353.652
--352.653
--351.654
--350.655
--349.656
--348.657
--347.658
--346.659
--345.66
--344.661
--343.662
--342.663
--341.664
--340.665
--339.666
--338.667
--337.668
--336.669
--335.67
--334.671
--333.672
--332.673
--331.674
--330.675
--329.676
--328.677
--327.678
--326.679
--325.68
--324.681
--323.682
--322.683
--321.684
--320.685
--319.686
--318.687
--317.688
--316.689
--315.69
--314.691
--313.692
--312.693
--311.694
--310.695
--309.696
--308.697
--307.698
--306.699
--305.7
--304.701
--303.702
--302.703
--301.704
--300.705
--299.706
--298.707
--297.708
--296.709
--295.71
--294.711
--293.712
--292.713
--291.714
--290.715
--289.716
--288.717
--287.718
--286.719
--285.72
--284.721
--283.722
--282.723
--281.724
--280.725
--279.726
--278.727
--277.728
--276.729
--275.73
--274.731
--273.732
--272.733
--271.734
--270.735
--269.736
--268.737
--267.738
--266.739
--265.74
--264.741
--263.742
--262.743
--261.744
--260.745
--259.746
--258.747
--257.748
--256.749
--255.75
--254.751
--253.752
--252.753
--251.754
--250.755
--249.756
--248.757
--247.758
--246.759
--245.76
--244.761
--243.762
--242.763
--241.764
--240.765
--239.766
--238.767
--237.768
--236.769
--235.77
--234.771
--233.772
--232.773
--231.774
--230.775
--229.776
--228.777
--227.778
--226.779
--225.78
--224.781
--223.782
--222.783
--221.784
--220.785
--219.786
--218.787
--217.788
--216.789
--215.79
--214.791
--213.792
--212.793
--211.794
--210.795
--209.796
--208.797
--207.798
--206.799
--205.8
--204.801
--203.802
--202.803
--201.804
--200.805
--199.806
--198.807
--197.808
--196.809
--195.81
--194.811
--193.812
--192.813
--191.814
--190.815
--189.816
--188.817
--187.818
--186.819
--185.82
--184.821
--183.822
--182.823
--181.824
--180.825
--179.826
--178.827
--177.828
--176.829
--175.83
--174.831
--173.832
--172.833
--171.834
--170.835
--169.836
--168.837
--167.838
--166.839
--165.84
--164.841
--163.842
--162.843
--161.844
--160.845
--159.846
--158.847
--157.848
--156.849
--155.85
--154.851
--153.852
--152.853
--151.854
--150.855
--149.856
--148.857
--147.858
--146.859
--145.86
--144.861
--143.862
--142.863
--141.864
--140.865
--139.866
--138.867
--137.868
--136.869
--135.87
--134.871
--133.872
--132.873
--131.874
--130.875
--129.876
--128.877
--127.878
--126.879
--125.88
--124.881
--123.882
--122.883
--121.884
--120.885
--119.886
--118.887
--117.888
--116.889
--115.89
--114.891
--113.892
--112.893
--111.894
--110.895
--109.896
--108.897
--107.898
--106.899
--105.9
--104.901
--103.902
--102.903
--101.904
--100.905
--99.906
--98.907
--97.908
--96.909
--95.91
--94.911
--93.912
--92.913
--91.914
--90.915
--89.916
--88.917
--87.918
--86.919
--85.92
--84.921
--83.922
--82.923
--81.924
--80.925
--79.926
--78.927
--77.928
--76.929
--75.93
--74.931
--73.932
--72.933
--71.934
--70.935
--69.936
--68.937
--67.938
--66.939
--65.94
--64.941
--63.942
--62.943
--61.944
--60.945
--59.946
--58.947
--57.948
--56.949
--55.95
--54.951
--53.952
--52.953
--51.954
--50.955
--49.956
--48.957
--47.958
--46.959
--45.96
--44.961
--43.962
--42.963
--41.964
--40.965
--39.966
--38.967
--37.968
--36.969
--35.97
--34.971
--33.972
--32.973
--31.974
--30.975
--29.976
--28.977
--27.978
--26.979
--25.98
--24.981
--23.982
--22.983
--21.984
--20.985
--19.986
--18.987
--17.988
--16.989
--15.99
--14.991
--13.992
--12.993
--11.994
--10.995
--9.996
--8.997
--7.998
--6.999
--5.1
--4.1001
--3.1002
--2.1003
--1.1004
-0.1005
-1.1006
-2.1007
-3.1008
-4.1009
-5.101
-6.1011
-7.1012
-8.1013
-9.1014
-10.1015
-11.1016
-12.1017
-13.1018
-14.1019
-15.102
-16.1021
-17.1022
-18.1023
-19.1024
-20.1025
-21.1026
-22.1027
-23.1028
-24.1029
-25.103
-26.1031
-27.1032
-28.1033
-29.1034
-30.1035
-31.1036
-32.1037
-33.1038
-34.1039
-35.104
-36.1041
-37.1042
-38.1043
-39.1044
-40.1045
-41.1046
-42.1047
-43.1048
-44.1049
-45.105
-46.1051
-47.1052
-48.1053
-49.1054
-50.1055
-51.1056
-52.1057
-53.1058
-54.1059
-55.106
-56.1061
-57.1062
-58.1063
-59.1064
-60.1065
-61.1066
-62.1067
-63.1068
-64.1069
-65.107
-66.1071
-67.1072
-68.1073
-69.1074
-70.1075
-71.1076
-72.1077
-73.1078
-74.1079
-75.108
-76.1081
-77.1082
-78.1083
-79.1084
-80.1085
-81.1086
-82.1087
-83.1088
-84.1089
-85.109
-86.1091
-87.1092
-88.1093
-89.1094
-90.1095
-91.1096
-92.1097
-93.1098
-94.1099
-95.11
-96.1101
-97.1102
-98.1103
-99.1104
-100.1105
-101.1106
-102.1107
-103.1108
-104.1109
-105.111
-106.1111
-107.1112
-108.1113
-109.1114
-110.1115
-111.1116
-112.1117
-113.1118
-114.1119
-115.112
-116.1121
-117.1122
-118.1123
-119.1124
-120.1125
-121.1126
-122.1127
-123.1128
-124.1129
-125.113
-126.1131
-127.1132
-128.1133
-129.1134
-130.1135
-131.1136
-132.1137
-133.1138
-134.1139
-135.114
-136.1141
-137.1142
-138.1143
-139.1144
-140.1145
-141.1146
-142.1147
-143.1148
-144.1149
-145.115
-146.1151
-147.1152
-148.1153
-149.1154
-150.1155
-151.1156
-152.1157
-153.1158
-154.1159
-155.116
-156.1161
-157.1162
-158.1163
-159.1164
-160.1165
-161.1166
-162.1167
-163.1168
-164.1169
-165.117
-166.1171
-167.1172
-168.1173
-169.1174
-170.1175
-171.1176
-172.1177
-173.1178
-174.1179
-175.118
-176.1181
-177.1182
-178.1183
-179.1184
-180.1185
-181.1186
-182.1187
-183.1188
-184.1189
-185.119
-186.1191
-187.1192
-188.1193
-189.1194
-190.1195
-191.1196
-192.1197
-193.1198
-194.1199
-195.12
-196.1201
-197.1202
-198.1203
-199.1204
-200.1205
-201.1206
-202.1207
-203.1208
-204.1209
-205.121
-206.1211
-207.1212
-208.1213
-209.1214
-210.1215
-211.1216
-212.1217
-213.1218
-214.1219
-215.122
-216.1221
-217.1222
-218.1223
-219.1224
-220.1225
-221.1226
-222.1227
-223.1228
-224.1229
-225.123
-226.1231
-227.1232
-228.1233
-229.1234
-230.1235
-231.1236
-232.1237
-233.1238
-234.1239
-235.124
-236.1241
-237.1242
-238.1243
-239.1244
-240.1245
-241.1246
-242.1247
-243.1248
-244.1249
-245.125
-246.1251
-247.1252
-248.1253
-249.1254
-250.1255
-251.1256
-252.1257
-253.1258
-254.1259
-255.126
-256.1261
-257.1262
-258.1263
-259.1264
-260.1265
-261.1266
-262.1267
-263.1268
-264.1269
-265.127
-266.1271
-267.1272
-268.1273
-269.1274
-270.1275
-271.1276
-272.1277
-273.1278
-274.1279
-275.128
-276.1281
-277.1282
-278.1283
-279.1284
-280.1285
-281.1286
-282.1287
-283.1288
-284.1289
-285.129
-286.1291
-287.1292
-288.1293
-289.1294
-290.1295
-291.1296
-292.1297
-293.1298
-294.1299
-295.13
-296.1301
-297.1302
-298.1303
-299.1304
-300.1305
-301.1306
-302.1307
-303.1308
-304.1309
-305.131
-306.1311
-307.1312
-308.1313
-309.1314
-310.1315
-311.1316
-312.1317
-313.1318
-314.1319
-315.132
-316.1321
-317.1322
-318.1323
-319.1324
-320.1325
-321.1326
-322.1327
-323.1328
-324.1329
-325.133
-326.1331
-327.1332
-328.1333
-329.1334
-330.1335
-331.1336
-332.1337
-333.1338
-334.1339
-335.134
-336.1341
-337.1342
-338.1343
-339.1344
-340.1345
-341.1346
-342.1347
-343.1348
-344.1349
-345.135
-346.1351
-347.1352
-348.1353
-349.1354
-350.1355
-351.1356
-352.1357
-353.1358
-354.1359
-355.136
-356.1361
-357.1362
-358.1363
-359.1364
-360.1365
-361.1366
-362.1367
-363.1368
-364.1369
-365.137
-366.1371
-367.1372
-368.1373
-369.1374
-370.1375
-371.1376
-372.1377
-373.1378
-374.1379
-375.138
-376.1381
-377.1382
-378.1383
-379.1384
-380.1385
-381.1386
-382.1387
-383.1388
-384.1389
-385.139
-386.1391
-387.1392
-388.1393
-389.1394
-390.1395
-391.1396
-392.1397
-393.1398
-394.1399
-395.14
-396.1401
-397.1402
-398.1403
-399.1404
-400.1405
-401.1406
-402.1407
-403.1408
-404.1409
-405.141
-406.1411
-407.1412
-408.1413
-409.1414
-410.1415
-411.1416
-412.1417
-413.1418
-414.1419
-415.142
-416.1421
-417.1422
-418.1423
-419.1424
-420.1425
-421.1426
-422.1427
-423.1428
-424.1429
-425.143
-426.1431
-427.1432
-428.1433
-429.1434
-430.1435
-431.1436
-432.1437
-433.1438
-434.1439
-435.144
-436.1441
-437.1442
-438.1443
-439.1444
-440.1445
-441.1446
-442.1447
-443.1448
-444.1449
-445.145
-446.1451
-447.1452
-448.1453
-449.1454
-450.1455
-451.1456
-452.1457
-453.1458
-454.1459
-455.146
-456.1461
-457.1462
-458.1463
-459.1464
-460.1465
-461.1466
-462.1467
-463.1468
-464.1469
-465.147
-466.1471
-467.1472
-468.1473
-469.1474
-470.1475
-471.1476
-472.1477
-473.1478
-474.1479
-475.148
-476.1481
-477.1482
-478.1483
-479.1484
-480.1485
-481.1486
-482.1487
-483.1488
-484.1489
-485.149
-486.1491
-487.1492
-488.1493
-489.1494
-490.1495
-491.1496
-492.1497
-493.1498
-494.1499
-495.15
-496.1501
-497.1502
-498.1503
-499.1504
-500.1505
-501.1506
-502.1507
-503.1508
-504.1509
-505.151
-506.1511
-507.1512
-508.1513
-509.1514
-510.1515
-511.1516
-512.1517
-513.1518
-514.1519
-515.152
-516.1521
-517.1522
-518.1523
-519.1524
-520.1525
-521.1526
-522.1527
-523.1528
-524.1529
-525.153
-526.1531
-527.1532
-528.1533
-529.1534
-530.1535
-531.1536
-532.1537
-533.1538
-534.1539
-535.154
-536.1541
-537.1542
-538.1543
-539.1544
-540.1545
-541.1546
-542.1547
-543.1548
-544.1549
-545.155
-546.1551
-547.1552
-548.1553
-549.1554
-550.1555
-551.1556
-552.1557
-553.1558
-554.1559
-555.156
-556.1561
-557.1562
-558.1563
-559.1564
-560.1565
-561.1566
-562.1567
-563.1568
-564.1569
-565.157
-566.1571
-567.1572
-568.1573
-569.1574
-570.1575
-571.1576
-572.1577
-573.1578
-574.1579
-575.158
-576.1581
-577.1582
-578.1583
-579.1584
-580.1585
-581.1586
-582.1587
-583.1588
-584.1589
-585.159
-586.1591
-587.1592
-588.1593
-589.1594
-590.1595
-591.1596
-592.1597
-593.1598
-594.1599
-595.16
-596.1601
-597.1602
-598.1603
-599.1604
-600.1605
-601.1606
-602.1607
-603.1608
-604.1609
-605.161
-606.1611
-607.1612
-608.1613
-609.1614
-610.1615
-611.1616
-612.1617
-613.1618
-614.1619
-615.162
-616.1621
-617.1622
-618.1623
-619.1624
-620.1625
-621.1626
-622.1627
-623.1628
-624.1629
-625.163
-626.1631
-627.1632
-628.1633
-629.1634
-630.1635
-631.1636
-632.1637
-633.1638
-634.1639
-635.164
-636.1641
-637.1642
-638.1643
-639.1644
-640.1645
-641.1646
-642.1647
-643.1648
-644.1649
-645.165
-646.1651
-647.1652
-648.1653
-649.1654
-650.1655
-651.1656
-652.1657
-653.1658
-654.1659
-655.166
-656.1661
-657.1662
-658.1663
-659.1664
-660.1665
-661.1666
-662.1667
-663.1668
-664.1669
-665.167
-666.1671
-667.1672
-668.1673
-669.1674
-670.1675
-671.1676
-672.1677
-673.1678
-674.1679
-675.168
-676.1681
-677.1682
-678.1683
-679.1684
-680.1685
-681.1686
-682.1687
-683.1688
-684.1689
-685.169
-686.1691
-687.1692
-688.1693
-689.1694
-690.1695
-691.1696
-692.1697
-693.1698
-694.1699
-695.17
-696.1701
-697.1702
-698.1703
-699.1704
-700.1705
-701.1706
-702.1707
-703.1708
-704.1709
-705.171
-706.1711
-707.1712
-708.1713
-709.1714
-710.1715
-711.1716
-712.1717
-713.1718
-714.1719
-715.172
-716.1721
-717.1722
-718.1723
-719.1724
-720.1725
-721.1726
-722.1727
-723.1728
-724.1729
-725.173
-726.1731
-727.1732
-728.1733
-729.1734
-730.1735
-731.1736
-732.1737
-733.1738
-734.1739
-735.174
-736.1741
-737.1742
-738.1743
-739.1744
-740.1745
-741.1746
-742.1747
-743.1748
-744.1749
-745.175
-746.1751
-747.1752
-748.1753
-749.1754
-750.1755
-751.1756
-752.1757
-753.1758
-754.1759
-755.176
-756.1761
-757.1762
-758.1763
-759.1764
-760.1765
-761.1766
-762.1767
-763.1768
-764.1769
-765.177
-766.1771
-767.1772
-768.1773
-769.1774
-770.1775
-771.1776
-772.1777
-773.1778
-774.1779
-775.178
-776.1781
-777.1782
-778.1783
-779.1784
-780.1785
-781.1786
-782.1787
-783.1788
-784.1789
-785.179
-786.1791
-787.1792
-788.1793
-789.1794
-790.1795
-791.1796
-792.1797
-793.1798
-794.1799
-795.18
-796.1801
-797.1802
-798.1803
-799.1804
-800.1805
-801.1806
-802.1807
-803.1808
-804.1809
-805.181
-806.1811
-807.1812
-808.1813
-809.1814
-810.1815
-811.1816
-812.1817
-813.1818
-814.1819
-815.182
-816.1821
-817.1822
-818.1823
-819.1824
-820.1825
-821.1826
-822.1827
-823.1828
-824.1829
-825.183
-826.1831
-827.1832
-828.1833
-829.1834
-830.1835
-831.1836
-832.1837
-833.1838
-834.1839
-835.184
-836.1841
-837.1842
-838.1843
-839.1844
-840.1845
-841.1846
-842.1847
-843.1848
-844.1849
-845.185
-846.1851
-847.1852
-848.1853
-849.1854
-850.1855
-851.1856
-852.1857
-853.1858
-854.1859
-855.186
-856.1861
-857.1862
-858.1863
-859.1864
-860.1865
-861.1866
-862.1867
-863.1868
-864.1869
-865.187
-866.1871
-867.1872
-868.1873
-869.1874
-870.1875
-871.1876
-872.1877
-873.1878
-874.1879
-875.188
-876.1881
-877.1882
-878.1883
-879.1884
-880.1885
-881.1886
-882.1887
-883.1888
-884.1889
-885.189
-886.1891
-887.1892
-888.1893
-889.1894
-890.1895
-891.1896
-892.1897
-893.1898
-894.1899
-895.19
-896.1901
-897.1902
-898.1903
-899.1904
-900.1905
-901.1906
-902.1907
-903.1908
-904.1909
-905.191
-906.1911
-907.1912
-908.1913
-909.1914
-910.1915
-911.1916
-912.1917
-913.1918
-914.1919
-915.192
-916.1921
-917.1922
-918.1923
-919.1924
-920.1925
-921.1926
-922.1927
-923.1928
-924.1929
-925.193
-926.1931
-927.1932
-928.1933
-929.1934
-930.1935
-931.1936
-932.1937
-933.1938
-934.1939
-935.194
-936.1941
-937.1942
-938.1943
-939.1944
-940.1945
-941.1946
-942.1947
-943.1948
-944.1949
-945.195
-946.1951
-947.1952
-948.1953
-949.1954
-950.1955
-951.1956
-952.1957
-953.1958
-954.1959
-955.196
-956.1961
-957.1962
-958.1963
-959.1964
-960.1965
-961.1966
-962.1967
-963.1968
-964.1969
-965.197
-966.1971
-967.1972
-968.1973
-969.1974
-970.1975
-971.1976
-972.1977
-973.1978
-974.1979
-975.198
-976.1981
-977.1982
-978.1983
-979.1984
-980.1985
-981.1986
-982.1987
-983.1988
-984.1989
-985.199
-986.1991
-987.1992
-988.1993
-989.1994
-990.1995
-991.1996
-992.1997
-993.1998
-994.1999
-995.2
-996.2001
-997.2002
-998.2003
-999.2004
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-null
-0.1
-1.2
-2.3
-3.4
-4.5
-5.6
-6.7
-7.8
-8.9
-9.1
-10.11
-11.12
-12.13
-13.14
-14.15
-15.16
-16.17
-17.18
-18.19
-19.2
-20.21
-21.22
-22.23
-23.24
-24.25
-25.26
-26.27
-27.28
-28.29
-29.3
-30.31
-31.32
-32.33
-33.34
-34.35
-35.36
-36.37
-37.38
-38.39
-39.4
-40.41
-41.42
-42.43
-43.44
-44.45
-45.46
-46.47
-47.48
-48.49
-49.5
-50.51
-51.52
-52.53
-53.54
-54.55
-55.56
-56.57
-57.58
-58.59
-59.6
-60.61
-61.62
-62.63
-63.64
-64.65
-65.66
-66.67
-67.68
-68.69
-69.7
-70.71
-71.72
-72.73
-73.74
-74.75
-75.76
-76.77
-77.78
-78.79
-79.8
-80.81
-81.82
-82.83
-83.84
-84.85
-85.86
-86.87
-87.88
-88.89
-89.9
-90.91
-91.92
-92.93
-93.94
-94.95
-95.96
-96.97
-97.98
-98.99
-99.1
-100.101
-101.102
-102.103
-103.104
-104.105
-105.106
-106.107
-107.108
-108.109
-109.11
-110.111
-111.112
-112.113
-113.114
-114.115
-115.116
-116.117
-117.118
-118.119
-119.12
-120.121
-121.122
-122.123
-123.124
-124.125
-125.126
-126.127
-127.128
-128.129
-129.13
-130.131
-131.132
-132.133
-133.134
-134.135
-135.136
-136.137
-137.138
-138.139
-139.14
-140.141
-141.142
-142.143
-143.144
-144.145
-145.146
-146.147
-147.148
-148.149
-149.15
-150.151
-151.152
-152.153
-153.154
-154.155
-155.156
-156.157
-157.158
-158.159
-159.16
-160.161
-161.162
-162.163
-163.164
-164.165
-165.166
-166.167
-167.168
-168.169
-169.17
-170.171
-171.172
-172.173
-173.174
-174.175
-175.176
-176.177
-177.178
-178.179
-179.18
-180.181
-181.182
-182.183
-183.184
-184.185
-185.186
-186.187
-187.188
-188.189
-189.19
-190.191
-191.192
-192.193
-193.194
-194.195
-195.196
-196.197
-197.198
-198.199
-199.2
-200.201
-201.202
-202.203
-203.204
-204.205
-205.206
-206.207
-207.208
-208.209
-209.21
-210.211
-211.212
-212.213
-213.214
-214.215
-215.216
-216.217
-217.218
-218.219
-219.22
-220.221
-221.222
-222.223
-223.224
-224.225
-225.226
-226.227
-227.228
-228.229
-229.23
-230.231
-231.232
-232.233
-233.234
-234.235
-235.236
-236.237
-237.238
-238.239
-239.24
-240.241
-241.242
-242.243
-243.244
-244.245
-245.246
-246.247
-247.248
-248.249
-249.25
-250.251
-251.252
-252.253
-253.254
-254.255
-255.256
-256.257
-257.258
-258.259
-259.26
-260.261
-261.262
-262.263
-263.264
-264.265
-265.266
-266.267
-267.268
-268.269
-269.27
-270.271
-271.272
-272.273
-273.274
-274.275
-275.276
-276.277
-277.278
-278.279
-279.28
-280.281
-281.282
-282.283
-283.284
-284.285
-285.286
-286.287
-287.288
-288.289
-289.29
-290.291
-291.292
-292.293
-293.294
-294.295
-295.296
-296.297
-297.298
-298.299
-299.3
-300.301
-301.302
-302.303
-303.304
-304.305
-305.306
-306.307
-307.308
-308.309
-309.31
-310.311
-311.312
-312.313
-313.314
-314.315
-315.316
-316.317
-317.318
-318.319
-319.32
-320.321
-321.322
-322.323
-323.324
-324.325
-325.326
-326.327
-327.328
-328.329
-329.33
-330.331
-331.332
-332.333
-333.334
-334.335
-335.336
-336.337
-337.338
-338.339
-339.34
-340.341
-341.342
-342.343
-343.344
-344.345
-345.346
-346.347
-347.348
-348.349
-349.35
-350.351
-351.352
-352.353
-353.354
-354.355
-355.356
-356.357
-357.358
-358.359
-359.36
-360.361
-361.362
-362.363
-363.364
-364.365
-365.366
-366.367
-367.368
-368.369
-369.37
-370.371
-371.372
-372.373
-373.374
-374.375
-375.376
-376.377
-377.378
-378.379
-379.38
-380.381
-381.382
-382.383
-383.384
-384.385
-385.386
-386.387
-387.388
-388.389
-389.39
-390.391
-391.392
-392.393
-393.394
-394.395
-395.396
-396.397
-397.398
-398.399
-399.4
-400.401
-401.402
-402.403
-403.404
-404.405
-405.406
-406.407
-407.408
-408.409
-409.41
-410.411
-411.412
-412.413
-413.414
-414.415
-415.416
-416.417
-417.418
-418.419
-419.42
-420.421
-421.422
-422.423
-423.424
-424.425
-425.426
-426.427
-427.428
-428.429
-429.43
-430.431
-431.432
-432.433
-433.434
-434.435
-435.436
-436.437
-437.438
-438.439
-439.44
-440.441
-441.442
-442.443
-443.444
-444.445
-445.446
-446.447
-447.448
-448.449
-449.45
-450.451
-451.452
-452.453
-453.454
-454.455
-455.456
-456.457
-457.458
-458.459
-459.46
-460.461
-461.462
-462.463
-463.464
-464.465
-465.466
-466.467
-467.468
-468.469
-469.47
-470.471
-471.472
-472.473
-473.474
-474.475
-475.476
-476.477
-477.478
-478.479
-479.48
-480.481
-481.482
-482.483
-483.484
-484.485
-485.486
-486.487
-487.488
-488.489
-489.49
-490.491
-491.492
-492.493
-493.494
-494.495
-495.496
-496.497
-497.498
-498.499
-499.5
-500.501
-501.502
-502.503
-503.504
-504.505
-505.506
-506.507
-507.508
-508.509
-509.51
-510.511
-511.512
-512.513
-513.514
-514.515
-515.516
-516.517
-517.518
-518.519
-519.52
-520.521
-521.522
-522.523
-523.524
-524.525
-525.526
-526.527
-527.528
-528.529
-529.53
-530.531
-531.532
-532.533
-533.534
-534.535
-535.536
-536.537
-537.538
-538.539
-539.54
-540.541
-541.542
-542.543
-543.544
-544.545
-545.546
-546.547
-547.548
-548.549
-549.55
-550.551
-551.552
-552.553
-553.554
-554.555
-555.556
-556.557
-557.558
-558.559
-559.56
-560.561
-561.562
-562.563
-563.564
-564.565
-565.566
-566.567
-567.568
-568.569
-569.57
-570.571
-571.572
-572.573
-573.574
-574.575
-575.576
-576.577
-577.578
-578.579
-579.58
-580.581
-581.582
-582.583
-583.584
-584.585
-585.586
-586.587
-587.588
-588.589
-589.59
-590.591
-591.592
-592.593
-593.594
-594.595
-595.596
-596.597
-597.598
-598.599
-599.6
-600.601
-601.602
-602.603
-603.604
-604.605
-605.606
-606.607
-607.608
-608.609
-609.61
-610.611
-611.612
-612.613
-613.614
-614.615
-615.616
-616.617
-617.618
-618.619
-619.62
-620.621
-621.622
-622.623
-623.624
-624.625
-625.626
-626.627
-627.628
-628.629
-629.63
-630.631
-631.632
-632.633
-633.634
-634.635
-635.636
-636.637
-637.638
-638.639
-639.64
-640.641
-641.642
-642.643
-643.644
-644.645
-645.646
-646.647
-647.648
-648.649
-649.65
-650.651
-651.652
-652.653
-653.654
-654.655
-655.656
-656.657
-657.658
-658.659
-659.66
-660.661
-661.662
-662.663
-663.664
-664.665
-665.666
-666.667
-667.668
-668.669
-669.67
-670.671
-671.672
-672.673
-673.674
-674.675
-675.676
-676.677
-677.678
-678.679
-679.68
-680.681
-681.682
-682.683
-683.684
-684.685
-685.686
-686.687
-687.688
-688.689
-689.69
-690.691
-691.692
-692.693
-693.694
-694.695
-695.696
-696.697
-697.698
-698.699
-699.7
-700.701
-701.702
-702.703
-703.704
-704.705
-705.706
-706.707
-707.708
-708.709
-709.71
-710.711
-711.712
-712.713
-713.714
-714.715
-715.716
-716.717
-717.718
-718.719
-719.72
-720.721
-721.722
-722.723
-723.724
-724.725
-725.726
-726.727
-727.728
-728.729
-729.73
-730.731
-731.732
-732.733
-733.734
-734.735
-735.736
-736.737
-737.738
-738.739
-739.74
-740.741
-741.742
-742.743
-743.744
-744.745
-745.746
-746.747
-747.748
-748.749
-749.75
-750.751
-751.752
-752.753
-753.754
-754.755
-755.756
-756.757
-757.758
-758.759
-759.76
-760.761
-761.762
-762.763
-763.764
-764.765
-765.766
-766.767
-767.768
-768.769
-769.77
-770.771
-771.772
-772.773
-773.774
-774.775
-775.776
-776.777
-777.778
-778.779
-779.78
-780.781
-781.782
-782.783
-783.784
-784.785
-785.786
-786.787
-787.788
-788.789
-789.79
-790.791
-791.792
-792.793
-793.794
-794.795
-795.796
-796.797
-797.798
-798.799
-799.8
-800.801
-801.802
-802.803
-803.804
-804.805
-805.806
-806.807
-807.808
-808.809
-809.81
-810.811
-811.812
-812.813
-813.814
-814.815
-815.816
-816.817
-817.818
-818.819
-819.82
-820.821
-821.822
-822.823
-823.824
-824.825
-825.826
-826.827
-827.828
-828.829
-829.83
-830.831
-831.832
-832.833
-833.834
-834.835
-835.836
-836.837
-837.838
-838.839
-839.84
-840.841
-841.842
-842.843
-843.844
-844.845
-845.846
-846.847
-847.848
-848.849
-849.85
-850.851
-851.852
-852.853
-853.854
-854.855
-855.856
-856.857
-857.858
-858.859
-859.86
-860.861
-861.862
-862.863
-863.864
-864.865
-865.866
-866.867
-867.868
-868.869
-869.87
-870.871
-871.872
-872.873
-873.874
-874.875
-875.876
-876.877
-877.878
-878.879
-879.88
-880.881
-881.882
-882.883
-883.884
-884.885
-885.886
-886.887
-887.888
-888.889
-889.89
-890.891
-891.892
-892.893
-893.894
-894.895
-895.896
-896.897
-897.898
-898.899
-899.9
-900.901
-901.902
-902.903
-903.904
-904.905
-905.906
-906.907
-907.908
-908.909
-909.91
-910.911
-911.912
-912.913
-913.914
-914.915
-915.916
-916.917
-917.918
-918.919
-919.92
-920.921
-921.922
-922.923
-923.924
-924.925
-925.926
-926.927
-927.928
-928.929
-929.93
-930.931
-931.932
-932.933
-933.934
-934.935
-935.936
-936.937
-937.938
-938.939
-939.94
-940.941
-941.942
-942.943
-943.944
-944.945
-945.946
-946.947
-947.948
-948.949
-949.95
-950.951
-951.952
-952.953
-953.954
-954.955
-955.956
-956.957
-957.958
-958.959
-959.96
-960.961
-961.962
-962.963
-963.964
-964.965
-965.966
-966.967
-967.968
-968.969
-969.97
-970.971
-971.972
-972.973
-973.974
-974.975
-975.976
-976.977
-977.978
-978.979
-979.98
-980.981
-981.982
-982.983
-983.984
-984.985
-985.986
-986.987
-987.988
-988.989
-989.99
-990.991
-991.992
-992.993
-993.994
-994.995
-995.996
-996.997
-997.998
-998.999
-999.1
-1000.1001
-1001.1002
-1002.1003
-1003.1004
-1004.1005
-1005.1006
-1006.1007
-1007.1008
-1008.1009
-1009.101
-1010.1011
-1011.1012
-1012.1013
-1013.1014
-1014.1015
-1015.1016
-1016.1017
-1017.1018
-1018.1019
-1019.102
-1020.1021
-1021.1022
-1022.1023
-1023.1024
-1024.1025
-1025.1026
-1026.1027
-1027.1028
-1028.1029
-1029.103
-1030.1031
-1031.1032
-1032.1033
-1033.1034
-1034.1035
-1035.1036
-1036.1037
-1037.1038
-1038.1039
-1039.104
-1040.1041
-1041.1042
-1042.1043
-1043.1044
-1044.1045
-1045.1046
-1046.1047
-1047.1048
-1048.1049
-1049.105
-1050.1051
-1051.1052
-1052.1053
-1053.1054
-1054.1055
-1055.1056
-1056.1057
-1057.1058
-1058.1059
-1059.106
-1060.1061
-1061.1062
-1062.1063
-1063.1064
-1064.1065
-1065.1066
-1066.1067
-1067.1068
-1068.1069
-1069.107
-1070.1071
-1071.1072
-1072.1073
-1073.1074
-1074.1075
-1075.1076
-1076.1077
-1077.1078
-1078.1079
-1079.108
-1080.1081
-1081.1082
-1082.1083
-1083.1084
-1084.1085
-1085.1086
-1086.1087
-1087.1088
-1088.1089
-1089.109
-1090.1091
-1091.1092
-1092.1093
-1093.1094
-1094.1095
-1095.1096
-1096.1097
-1097.1098
-1098.1099
-1099.11
-1100.1101
-1101.1102
-1102.1103
-1103.1104
-1104.1105
-1105.1106
-1106.1107
-1107.1108
-1108.1109
-1109.111
-1110.1111
-1111.1112
-1112.1113
-1113.1114
-1114.1115
-1115.1116
-1116.1117
-1117.1118
-1118.1119
-1119.112
-1120.1121
-1121.1122
-1122.1123
-1123.1124
-1124.1125
-1125.1126
-1126.1127
-1127.1128
-1128.1129
-1129.113
-1130.1131
-1131.1132
-1132.1133
-1133.1134
-1134.1135
-1135.1136
-1136.1137
-1137.1138
-1138.1139
-1139.114
-1140.1141
-1141.1142
-1142.1143
-1143.1144
-1144.1145
-1145.1146
-1146.1147
-1147.1148
-1148.1149
-1149.115
-1150.1151
-1151.1152
-1152.1153
-1153.1154
-1154.1155
-1155.1156
-1156.1157
-1157.1158
-1158.1159
-1159.116
-1160.1161
-1161.1162
-1162.1163
-1163.1164
-1164.1165
-1165.1166
-1166.1167
-1167.1168
-1168.1169
-1169.117
-1170.1171
-1171.1172
-1172.1173
-1173.1174
-1174.1175
-1175.1176
-1176.1177
-1177.1178
-1178.1179
-1179.118
-1180.1181
-1181.1182
-1182.1183
-1183.1184
-1184.1185
-1185.1186
-1186.1187
-1187.1188
-1188.1189
-1189.119
-1190.1191
-1191.1192
-1192.1193
-1193.1194
-1194.1195
-1195.1196
-1196.1197
-1197.1198
-1198.1199
-1199.12
-1200.1201
-1201.1202
-1202.1203
-1203.1204
-1204.1205
-1205.1206
-1206.1207
-1207.1208
-1208.1209
-1209.121
-1210.1211
-1211.1212
-1212.1213
-1213.1214
-1214.1215
-1215.1216
-1216.1217
-1217.1218
-1218.1219
-1219.122
-1220.1221
-1221.1222
-1222.1223
-1223.1224
-1224.1225
-1225.1226
-1226.1227
-1227.1228
-1228.1229
-1229.123
-1230.1231
-1231.1232
-1232.1233
-1233.1234
-1234.1235
-1235.1236
-1236.1237
-1237.1238
-1238.1239
-1239.124
-1240.1241
-1241.1242
-1242.1243
-1243.1244
-1244.1245
-1245.1246
-1246.1247
-1247.1248
-1248.1249
-1249.125
-1250.1251
-1251.1252
-1252.1253
-1253.1254
-1254.1255
-1255.1256
-1256.1257
-1257.1258
-1258.1259
-1259.126
-1260.1261
-1261.1262
-1262.1263
-1263.1264
-1264.1265
-1265.1266
-1266.1267
-1267.1268
-1268.1269
-1269.127
-1270.1271
-1271.1272
-1272.1273
-1273.1274
-1274.1275
-1275.1276
-1276.1277
-1277.1278
-1278.1279
-1279.128
-1280.1281
-1281.1282
-1282.1283
-1283.1284
-1284.1285
-1285.1286
-1286.1287
-1287.1288
-1288.1289
-1289.129
-1290.1291
-1291.1292
-1292.1293
-1293.1294
-1294.1295
-1295.1296
-1296.1297
-1297.1298
-1298.1299
-1299.13
-1300.1301
-1301.1302
-1302.1303
-1303.1304
-1304.1305
-1305.1306
-1306.1307
-1307.1308
-1308.1309
-1309.131
-1310.1311
-1311.1312
-1312.1313
-1313.1314
-1314.1315
-1315.1316
-1316.1317
-1317.1318
-1318.1319
-1319.132
-1320.1321
-1321.1322
-1322.1323
-1323.1324
-1324.1325
-1325.1326
-1326.1327
-1327.1328
-1328.1329
-1329.133
-1330.1331
-1331.1332
-1332.1333
-1333.1334
-1334.1335
-1335.1336
-1336.1337
-1337.1338
-1338.1339
-1339.134
-1340.1341
-1341.1342
-1342.1343
-1343.1344
-1344.1345
-1345.1346
-1346.1347
-1347.1348
-1348.1349
-1349.135
-1350.1351
-1351.1352
-1352.1353
-1353.1354
-1354.1355
-1355.1356
-1356.1357
-1357.1358
-1358.1359
-1359.136
-1360.1361
-1361.1362
-1362.1363
-1363.1364
-1364.1365
-1365.1366
-1366.1367
-1367.1368
-1368.1369
-1369.137
-1370.1371
-1371.1372
-1372.1373
-1373.1374
-1374.1375
-1375.1376
-1376.1377
-1377.1378
-1378.1379
-1379.138
-1380.1381
-1381.1382
-1382.1383
-1383.1384
-1384.1385
-1385.1386
-1386.1387
-1387.1388
-1388.1389
-1389.139
-1390.1391
-1391.1392
-1392.1393
-1393.1394
-1394.1395
-1395.1396
-1396.1397
-1397.1398
-1398.1399
-1399.14
-1400.1401
-1401.1402
-1402.1403
-1403.1404
-1404.1405
-1405.1406
-1406.1407
-1407.1408
-1408.1409
-1409.141
-1410.1411
-1411.1412
-1412.1413
-1413.1414
-1414.1415
-1415.1416
-1416.1417
-1417.1418
-1418.1419
-1419.142
-1420.1421
-1421.1422
-1422.1423
-1423.1424
-1424.1425
-1425.1426
-1426.1427
-1427.1428
-1428.1429
-1429.143
-1430.1431
-1431.1432
-1432.1433
-1433.1434
-1434.1435
-1435.1436
-1436.1437
-1437.1438
-1438.1439
-1439.144
-1440.1441
-1441.1442
-1442.1443
-1443.1444
-1444.1445
-1445.1446
-1446.1447
-1447.1448
-1448.1449
-1449.145
-1450.1451
-1451.1452
-1452.1453
-1453.1454
-1454.1455
-1455.1456
-1456.1457
-1457.1458
-1458.1459
-1459.146
-1460.1461
-1461.1462
-1462.1463
-1463.1464
-1464.1465
-1465.1466
-1466.1467
-1467.1468
-1468.1469
-1469.147
-1470.1471
-1471.1472
-1472.1473
-1473.1474
-1474.1475
-1475.1476
-1476.1477
-1477.1478
-1478.1479
-1479.148
-1480.1481
-1481.1482
-1482.1483
-1483.1484
-1484.1485
-1485.1486
-1486.1487
-1487.1488
-1488.1489
-1489.149
-1490.1491
-1491.1492
-1492.1493
-1493.1494
-1494.1495
-1495.1496
-1496.1497
-1497.1498
-1498.1499
-1499.15
-1500.1501
-1501.1502
-1502.1503
-1503.1504
-1504.1505
-1505.1506
-1506.1507
-1507.1508
-1508.1509
-1509.151
-1510.1511
-1511.1512
-1512.1513
-1513.1514
-1514.1515
-1515.1516
-1516.1517
-1517.1518
-1518.1519
-1519.152
-1520.1521
-1521.1522
-1522.1523
-1523.1524
-1524.1525
-1525.1526
-1526.1527
-1527.1528
-1528.1529
-1529.153
-1530.1531
-1531.1532
-1532.1533
-1533.1534
-1534.1535
-1535.1536
-1536.1537
-1537.1538
-1538.1539
-1539.154
-1540.1541
-1541.1542
-1542.1543
-1543.1544
-1544.1545
-1545.1546
-1546.1547
-1547.1548
-1548.1549
-1549.155
-1550.1551
-1551.1552
-1552.1553
-1553.1554
-1554.1555
-1555.1556
-1556.1557
-1557.1558
-1558.1559
-1559.156
-1560.1561
-1561.1562
-1562.1563
-1563.1564
-1564.1565
-1565.1566
-1566.1567
-1567.1568
-1568.1569
-1569.157
-1570.1571
-1571.1572
-1572.1573
-1573.1574
-1574.1575
-1575.1576
-1576.1577
-1577.1578
-1578.1579
-1579.158
-1580.1581
-1581.1582
-1582.1583
-1583.1584
-1584.1585
-1585.1586
-1586.1587
-1587.1588
-1588.1589
-1589.159
-1590.1591
-1591.1592
-1592.1593
-1593.1594
-1594.1595
-1595.1596
-1596.1597
-1597.1598
-1598.1599
-1599.16
-1600.1601
-1601.1602
-1602.1603
-1603.1604
-1604.1605
-1605.1606
-1606.1607
-1607.1608
-1608.1609
-1609.161
-1610.1611
-1611.1612
-1612.1613
-1613.1614
-1614.1615
-1615.1616
-1616.1617
-1617.1618
-1618.1619
-1619.162
-1620.1621
-1621.1622
-1622.1623
-1623.1624
-1624.1625
-1625.1626
-1626.1627
-1627.1628
-1628.1629
-1629.163
-1630.1631
-1631.1632
-1632.1633
-1633.1634
-1634.1635
-1635.1636
-1636.1637
-1637.1638
-1638.1639
-1639.164
-1640.1641
-1641.1642
-1642.1643
-1643.1644
-1644.1645
-1645.1646
-1646.1647
-1647.1648
-1648.1649
-1649.165
-1650.1651
-1651.1652
-1652.1653
-1653.1654
-1654.1655
-1655.1656
-1656.1657
-1657.1658
-1658.1659
-1659.166
-1660.1661
-1661.1662
-1662.1663
-1663.1664
-1664.1665
-1665.1666
-1666.1667
-1667.1668
-1668.1669
-1669.167
-1670.1671
-1671.1672
-1672.1673
-1673.1674
-1674.1675
-1675.1676
-1676.1677
-1677.1678
-1678.1679
-1679.168
-1680.1681
-1681.1682
-1682.1683
-1683.1684
-1684.1685
-1685.1686
-1686.1687
-1687.1688
-1688.1689
-1689.169
-1690.1691
-1691.1692
-1692.1693
-1693.1694
-1694.1695
-1695.1696
-1696.1697
-1697.1698
-1698.1699
-1699.17
-1700.1701
-1701.1702
-1702.1703
-1703.1704
-1704.1705
-1705.1706
-1706.1707
-1707.1708
-1708.1709
-1709.171
-1710.1711
-1711.1712
-1712.1713
-1713.1714
-1714.1715
-1715.1716
-1716.1717
-1717.1718
-1718.1719
-1719.172
-1720.1721
-1721.1722
-1722.1723
-1723.1724
-1724.1725
-1725.1726
-1726.1727
-1727.1728
-1728.1729
-1729.173
-1730.1731
-1731.1732
-1732.1733
-1733.1734
-1734.1735
-1735.1736
-1736.1737
-1737.1738
-1738.1739
-1739.174
-1740.1741
-1741.1742
-1742.1743
-1743.1744
-1744.1745
-1745.1746
-1746.1747
-1747.1748
-1748.1749
-1749.175
-1750.1751
-1751.1752
-1752.1753
-1753.1754
-1754.1755
-1755.1756
-1756.1757
-1757.1758
-1758.1759
-1759.176
-1760.1761
-1761.1762
-1762.1763
-1763.1764
-1764.1765
-1765.1766
-1766.1767
-1767.1768
-1768.1769
-1769.177
-1770.1771
-1771.1772
-1772.1773
-1773.1774
-1774.1775
-1775.1776
-1776.1777
-1777.1778
-1778.1779
-1779.178
-1780.1781
-1781.1782
-1782.1783
-1783.1784
-1784.1785
-1785.1786
-1786.1787
-1787.1788
-1788.1789
-1789.179
-1790.1791
-1791.1792
-1792.1793
-1793.1794
-1794.1795
-1795.1796
-1796.1797
-1797.1798
-1798.1799
-1799.18
-1800.1801
-1801.1802
-1802.1803
-1803.1804
-1804.1805
-1805.1806
-1806.1807
-1807.1808
-1808.1809
-1809.181
-1810.1811
-1811.1812
-1812.1813
-1813.1814
-1814.1815
-1815.1816
-1816.1817
-1817.1818
-1818.1819
-1819.182
-1820.1821
-1821.1822
-1822.1823
-1823.1824
-1824.1825
-1825.1826
-1826.1827
-1827.1828
-1828.1829
-1829.183
-1830.1831
-1831.1832
-1832.1833
-1833.1834
-1834.1835
-1835.1836
-1836.1837
-1837.1838
-1838.1839
-1839.184
-1840.1841
-1841.1842
-1842.1843
-1843.1844
-1844.1845
-1845.1846
-1846.1847
-1847.1848
-1848.1849
-1849.185
-1850.1851
-1851.1852
-1852.1853
-1853.1854
-1854.1855
-1855.1856
-1856.1857
-1857.1858
-1858.1859
-1859.186
-1860.1861
-1861.1862
-1862.1863
-1863.1864
-1864.1865
-1865.1866
-1866.1867
-1867.1868
-1868.1869
-1869.187
-1870.1871
-1871.1872
-1872.1873
-1873.1874
-1874.1875
-1875.1876
-1876.1877
-1877.1878
-1878.1879
-1879.188
-1880.1881
-1881.1882
-1882.1883
-1883.1884
-1884.1885
-1885.1886
-1886.1887
-1887.1888
-1888.1889
-1889.189
-1890.1891
-1891.1892
-1892.1893
-1893.1894
-1894.1895
-1895.1896
-1896.1897
-1897.1898
-1898.1899
-1899.19
-1900.1901
-1901.1902
-1902.1903
-1903.1904
-1904.1905
-1905.1906
-1906.1907
-1907.1908
-1908.1909
-1909.191
-1910.1911
-1911.1912
-1912.1913
-1913.1914
-1914.1915
-1915.1916
-1916.1917
-1917.1918
-1918.1919
-1919.192
-1920.1921
-1921.1922
-1922.1923
-1923.1924
-1924.1925
-1925.1926
-1926.1927
-1927.1928
-1928.1929
-1929.193
-1930.1931
-1931.1932
-1932.1933
-1933.1934
-1934.1935
-1935.1936
-1936.1937
-1937.1938
-1938.1939
-1939.194
-1940.1941
-1941.1942
-1942.1943
-1943.1944
-1944.1945
-1945.1946
-1946.1947
-1947.1948
-1948.1949
-1949.195
-1950.1951
-1951.1952
-1952.1953
-1953.1954
-1954.1955
-1955.1956
-1956.1957
-1957.1958
-1958.1959
-1959.196
-1960.1961
-1961.1962
-1962.1963
-1963.1964
-1964.1965
-1965.1966
-1966.1967
-1967.1968
-1968.1969
-1969.197
-1970.1971
-1971.1972
-1972.1973
-1973.1974
-1974.1975
-1975.1976
-1976.1977
-1977.1978
-1978.1979
-1979.198
-1980.1981
-1981.1982
-1982.1983
-1983.1984
-1984.1985
-1985.1986
-1986.1987
-1987.1988
-1988.1989
-1989.199
-1990.1991
-1991.1992
-1992.1993
-1993.1994
-1994.1995
-1995.1996
-1996.1997
-1997.1998
-1998.1999
-1999.2

http://git-wip-us.apache.org/repos/asf/flink/blob/200612ee/flink-connectors/flink-orc/src/test/resources/decimal.orc
----------------------------------------------------------------------
diff --git a/flink-connectors/flink-orc/src/test/resources/decimal.orc b/flink-connectors/flink-orc/src/test/resources/decimal.orc
deleted file mode 100644
index cb0f7b9..0000000
Binary files a/flink-connectors/flink-orc/src/test/resources/decimal.orc and /dev/null differ

http://git-wip-us.apache.org/repos/asf/flink/blob/200612ee/flink-connectors/flink-orc/src/test/resources/demo-11-none.orc
----------------------------------------------------------------------
diff --git a/flink-connectors/flink-orc/src/test/resources/demo-11-none.orc b/flink-connectors/flink-orc/src/test/resources/demo-11-none.orc
deleted file mode 100644
index 1d1d714..0000000
Binary files a/flink-connectors/flink-orc/src/test/resources/demo-11-none.orc and /dev/null differ

http://git-wip-us.apache.org/repos/asf/flink/blob/200612ee/flink-connectors/flink-orc/src/test/resources/test-data-decimal.orc
----------------------------------------------------------------------
diff --git a/flink-connectors/flink-orc/src/test/resources/test-data-decimal.orc b/flink-connectors/flink-orc/src/test/resources/test-data-decimal.orc
new file mode 100644
index 0000000..cb0f7b9
Binary files /dev/null and b/flink-connectors/flink-orc/src/test/resources/test-data-decimal.orc differ

http://git-wip-us.apache.org/repos/asf/flink/blob/200612ee/flink-connectors/flink-orc/src/test/resources/test-data-flat.orc
----------------------------------------------------------------------
diff --git a/flink-connectors/flink-orc/src/test/resources/test-data-flat.orc b/flink-connectors/flink-orc/src/test/resources/test-data-flat.orc
new file mode 100644
index 0000000..db0ff15
Binary files /dev/null and b/flink-connectors/flink-orc/src/test/resources/test-data-flat.orc differ

http://git-wip-us.apache.org/repos/asf/flink/blob/200612ee/flink-connectors/flink-orc/src/test/resources/test-data-nested.orc
----------------------------------------------------------------------
diff --git a/flink-connectors/flink-orc/src/test/resources/test-data-nested.orc b/flink-connectors/flink-orc/src/test/resources/test-data-nested.orc
new file mode 100644
index 0000000..4fb0bef
Binary files /dev/null and b/flink-connectors/flink-orc/src/test/resources/test-data-nested.orc differ

http://git-wip-us.apache.org/repos/asf/flink/blob/200612ee/flink-connectors/flink-orc/src/test/resources/test-data-nestedlist.orc
----------------------------------------------------------------------
diff --git a/flink-connectors/flink-orc/src/test/resources/test-data-nestedlist.orc b/flink-connectors/flink-orc/src/test/resources/test-data-nestedlist.orc
new file mode 100644
index 0000000..0f3f9c8
Binary files /dev/null and b/flink-connectors/flink-orc/src/test/resources/test-data-nestedlist.orc differ

http://git-wip-us.apache.org/repos/asf/flink/blob/200612ee/flink-connectors/flink-orc/src/test/resources/test-data-timetypes.orc
----------------------------------------------------------------------
diff --git a/flink-connectors/flink-orc/src/test/resources/test-data-timetypes.orc b/flink-connectors/flink-orc/src/test/resources/test-data-timetypes.orc
new file mode 100644
index 0000000..f51ffdb
Binary files /dev/null and b/flink-connectors/flink-orc/src/test/resources/test-data-timetypes.orc differ

http://git-wip-us.apache.org/repos/asf/flink/blob/200612ee/flink-core/src/main/java/org/apache/flink/api/java/typeutils/RowTypeInfo.java
----------------------------------------------------------------------
diff --git a/flink-core/src/main/java/org/apache/flink/api/java/typeutils/RowTypeInfo.java b/flink-core/src/main/java/org/apache/flink/api/java/typeutils/RowTypeInfo.java
index 1d4b8a1..24ccfb1 100644
--- a/flink-core/src/main/java/org/apache/flink/api/java/typeutils/RowTypeInfo.java
+++ b/flink-core/src/main/java/org/apache/flink/api/java/typeutils/RowTypeInfo.java
@@ -355,4 +355,21 @@ public class RowTypeInfo extends TupleTypeInfoBase<Row> {
 				comparatorOrders);
 		}
 	}
+
+	/**
+	 * Creates a {@link RowTypeInfo} with projected fields.
+	 *
+	 * @param rowType The original RowTypeInfo whose fields are projected
+	 * @param fieldMapping The field mapping of the projection
+	 * @return A RowTypeInfo with projected fields.
+	 */
+	public static RowTypeInfo projectFields(RowTypeInfo rowType, int[] fieldMapping) {
+		TypeInformation[] fieldTypes = new TypeInformation[fieldMapping.length];
+		String[] fieldNames = new String[fieldMapping.length];
+		for (int i = 0; i < fieldMapping.length; i++) {
+			fieldTypes[i] = rowType.getTypeAt(fieldMapping[i]);
+			fieldNames[i] = rowType.getFieldNames()[fieldMapping[i]];
+		}
+		return new RowTypeInfo(fieldTypes, fieldNames);
+	}
 }

http://git-wip-us.apache.org/repos/asf/flink/blob/200612ee/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/plan/nodes/logical/FlinkLogicalTableSourceScan.scala
----------------------------------------------------------------------
diff --git a/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/plan/nodes/logical/FlinkLogicalTableSourceScan.scala b/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/plan/nodes/logical/FlinkLogicalTableSourceScan.scala
index 337025f..ca8e569 100644
--- a/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/plan/nodes/logical/FlinkLogicalTableSourceScan.scala
+++ b/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/plan/nodes/logical/FlinkLogicalTableSourceScan.scala
@@ -29,7 +29,7 @@ import org.apache.flink.table.api.TableException
 import org.apache.flink.table.calcite.FlinkTypeFactory
 import org.apache.flink.table.plan.nodes.FlinkConventions
 import org.apache.flink.table.plan.schema.{BatchTableSourceTable, StreamTableSourceTable, TableSourceTable}
-import org.apache.flink.table.sources.{TableSource, TableSourceUtil}
+import org.apache.flink.table.sources.{FilterableTableSource, TableSource, TableSourceUtil}
 
 import scala.collection.JavaConverters._
 
@@ -62,7 +62,19 @@ class FlinkLogicalTableSourceScan(
 
   override def computeSelfCost(planner: RelOptPlanner, metadata: RelMetadataQuery): RelOptCost = {
     val rowCnt = metadata.getRowCount(this)
-    planner.getCostFactory.makeCost(rowCnt, rowCnt, rowCnt * estimateRowSize(getRowType))
+
+    val adjustedCnt: Double = tableSource match {
+      case f: FilterableTableSource[_] if f.isFilterPushedDown =>
+        // ensure we prefer FilterableTableSources with pushed-down filters.
+        rowCnt - 1.0
+      case _ =>
+        rowCnt
+    }
+
+    planner.getCostFactory.makeCost(
+      adjustedCnt,
+      adjustedCnt,
+      adjustedCnt * estimateRowSize(getRowType))
   }
 
   override def explainTerms(pw: RelWriter): RelWriter = {

http://git-wip-us.apache.org/repos/asf/flink/blob/200612ee/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/plan/util/RexProgramExtractor.scala
----------------------------------------------------------------------
diff --git a/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/plan/util/RexProgramExtractor.scala b/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/plan/util/RexProgramExtractor.scala
index 9c06135..a377a95 100644
--- a/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/plan/util/RexProgramExtractor.scala
+++ b/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/plan/util/RexProgramExtractor.scala
@@ -202,6 +202,18 @@ class RexNodeToExpressionConverter(
         // convert from BigDecimal to Double
         literal.getValueAs(classOf[java.lang.Double])
 
+      case _@BasicTypeInfo.STRING_TYPE_INFO =>
+        // convert from NlsString to String
+        literal.getValueAs(classOf[java.lang.String])
+
+      case _@BasicTypeInfo.BOOLEAN_TYPE_INFO =>
+        // convert to Boolean
+        literal.getValueAs(classOf[java.lang.Boolean])
+
+      case _@BasicTypeInfo.BIG_DEC_TYPE_INFO =>
+        // convert to BigDecimal
+        literal.getValueAs(classOf[java.math.BigDecimal])
+
       case _ => literal.getValue
     }
 


[4/9] flink git commit: [FLINK-2170] [connectors] Add OrcRowInputFormat and OrcTableSource.

Posted by fh...@apache.org.
[FLINK-2170] [connectors] Add OrcRowInputFormat and OrcTableSource.

This closes #4670.


Project: http://git-wip-us.apache.org/repos/asf/flink/repo
Commit: http://git-wip-us.apache.org/repos/asf/flink/commit/edbf8c9e
Tree: http://git-wip-us.apache.org/repos/asf/flink/tree/edbf8c9e
Diff: http://git-wip-us.apache.org/repos/asf/flink/diff/edbf8c9e

Branch: refs/heads/master
Commit: edbf8c9e2810e8686eb4c81458011822dbaac6a7
Parents: 5017c67
Author: uybhatti <uy...@gmail.com>
Authored: Fri Mar 3 23:55:22 2017 +0100
Committer: Fabian Hueske <fh...@apache.org>
Committed: Wed Nov 22 23:11:21 2017 +0100

----------------------------------------------------------------------
 flink-connectors/flink-orc/pom.xml              |   152 +
 .../org/apache/flink/orc/OrcTableSource.java    |   128 +
 .../java/org/apache/flink/orc/OrcUtils.java     |  2229 ++++
 .../org/apache/flink/orc/RowOrcInputFormat.java |   241 +
 .../apache/flink/orc/OrcTableSourceITCase.java  |   142 +
 .../apache/flink/orc/OrcTableSourceTest.java    |   113 +
 .../apache/flink/orc/RowOrcInputFormatTest.java |   472 +
 .../test/resources/TestOrcFile.emptyFile.orc    |   Bin 0 -> 523 bytes
 .../TestOrcFile.listliststructlong.orc          |   Bin 0 -> 845 bytes
 .../src/test/resources/TestOrcFile.listlong.orc |   Bin 0 -> 627 bytes
 .../test/resources/TestOrcFile.liststring.orc   |   Bin 0 -> 1298 bytes
 .../src/test/resources/TestOrcFile.test1.orc    |   Bin 0 -> 1711 bytes
 .../test/resources/TestOrcFile.testDate1900.dat | 10000 +++++++++++++++++
 .../test/resources/TestOrcFile.testDate1900.orc |   Bin 0 -> 30941 bytes
 .../flink-orc/src/test/resources/decimal.dat    |  6000 ++++++++++
 .../flink-orc/src/test/resources/decimal.orc    |   Bin 0 -> 16337 bytes
 .../src/test/resources/demo-11-none.orc         |   Bin 0 -> 5147970 bytes
 .../src/test/resources/log4j-test.properties    |    27 +
 flink-connectors/pom.xml                        |     1 +
 19 files changed, 19505 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flink/blob/edbf8c9e/flink-connectors/flink-orc/pom.xml
----------------------------------------------------------------------
diff --git a/flink-connectors/flink-orc/pom.xml b/flink-connectors/flink-orc/pom.xml
new file mode 100644
index 0000000..1ac7eaa
--- /dev/null
+++ b/flink-connectors/flink-orc/pom.xml
@@ -0,0 +1,152 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+	
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>org.apache.flink</groupId>
+		<artifactId>flink-connectors</artifactId>
+		<version>1.4-SNAPSHOT</version>
+		<relativePath>..</relativePath>
+	</parent>
+
+	<artifactId>flink-orc_${scala.binary.version}</artifactId>
+	<name>flink-orc</name>
+
+	<packaging>jar</packaging>
+
+	<dependencies>
+
+		<!-- core dependencies -->
+
+		<dependency>
+			<groupId>org.apache.flink</groupId>
+			<artifactId>flink-table_${scala.binary.version}</artifactId>
+			<version>${project.version}</version>
+			<scope>compile</scope>
+		</dependency>
+
+		<dependency>
+			<groupId>org.apache.flink</groupId>
+			<artifactId>flink-streaming-scala_${scala.binary.version}</artifactId>
+			<version>${project.version}</version>
+			<scope>compile</scope>
+		</dependency>
+
+		<dependency>
+			<groupId>org.apache.orc</groupId>
+			<artifactId>orc-core</artifactId>
+			<version>1.4.0</version>
+		</dependency>
+
+		<!-- test dependencies -->
+
+		<dependency>
+			<groupId>org.apache.flink</groupId>
+			<artifactId>flink-test-utils-junit</artifactId>
+			<version>${project.version}</version>
+			<scope>test</scope>
+		</dependency>
+
+		<dependency>
+			<groupId>org.apache.flink</groupId>
+			<artifactId>flink-test-utils_${scala.binary.version}</artifactId>
+			<version>${project.version}</version>
+			<scope>test</scope>
+		</dependency>
+
+		<dependency>
+			<groupId>org.apache.flink</groupId>
+			<artifactId>flink-clients_${scala.binary.version}</artifactId>
+			<version>${project.version}</version>
+			<scope>test</scope>
+		</dependency>
+
+		<dependency>
+			<groupId>org.apache.flink</groupId>
+			<artifactId>flink-core</artifactId>
+			<version>${project.version}</version>
+			<scope>test</scope>
+			<type>test-jar</type>
+		</dependency>
+	</dependencies>
+
+	<build>
+
+		<pluginManagement>
+			<plugins>
+				<!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
+				<plugin>
+					<groupId>org.eclipse.m2e</groupId>
+					<artifactId>lifecycle-mapping</artifactId>
+					<version>1.0.0</version>
+					<configuration>
+						<lifecycleMappingMetadata>
+							<pluginExecutions>
+								<pluginExecution>
+									<pluginExecutionFilter>
+										<groupId>org.apache.maven.plugins</groupId>
+										<artifactId>maven-assembly-plugin</artifactId>
+										<versionRange>[2.4,)</versionRange>
+										<goals>
+											<goal>single</goal>
+										</goals>
+									</pluginExecutionFilter>
+									<action>
+										<ignore/>
+									</action>
+								</pluginExecution>
+								<pluginExecution>
+									<pluginExecutionFilter>
+										<groupId>org.apache.maven.plugins</groupId>
+										<artifactId>maven-clean-plugin</artifactId>
+										<versionRange>[1,)</versionRange>
+										<goals>
+											<goal>clean</goal>
+										</goals>
+									</pluginExecutionFilter>
+									<action>
+										<ignore/>
+									</action>
+								</pluginExecution>
+								<pluginExecution>
+									<pluginExecutionFilter>
+										<groupId>org.apache.avro</groupId>
+										<artifactId>avro-maven-plugin</artifactId>
+										<versionRange>[1.7.7,)</versionRange>
+										<goals>
+											<goal>schema</goal>
+										</goals>
+									</pluginExecutionFilter>
+									<action>
+										<ignore/>
+									</action>
+								</pluginExecution>
+							</pluginExecutions>
+						</lifecycleMappingMetadata>
+					</configuration>
+				</plugin>
+			</plugins>
+		</pluginManagement>
+	</build>
+
+</project>

http://git-wip-us.apache.org/repos/asf/flink/blob/edbf8c9e/flink-connectors/flink-orc/src/main/java/org/apache/flink/orc/OrcTableSource.java
----------------------------------------------------------------------
diff --git a/flink-connectors/flink-orc/src/main/java/org/apache/flink/orc/OrcTableSource.java b/flink-connectors/flink-orc/src/main/java/org/apache/flink/orc/OrcTableSource.java
new file mode 100644
index 0000000..0454ba4
--- /dev/null
+++ b/flink-connectors/flink-orc/src/main/java/org/apache/flink/orc/OrcTableSource.java
@@ -0,0 +1,128 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.flink.orc;
+
+import org.apache.flink.api.common.typeinfo.TypeInformation;
+import org.apache.flink.api.java.DataSet;
+import org.apache.flink.api.java.ExecutionEnvironment;
+import org.apache.flink.api.java.typeutils.RowTypeInfo;
+import org.apache.flink.table.sources.BatchTableSource;
+import org.apache.flink.table.sources.ProjectableTableSource;
+import org.apache.flink.table.sources.TableSource;
+import org.apache.flink.types.Row;
+
+import org.apache.hadoop.conf.Configuration;
+import org.apache.orc.TypeDescription;
+
+/**
+ * Creates a TableSource to read ORC file.
+ *
+ * <p>The ORC file path and schema is passed during {@link OrcTableSource} construction. configuration is optional.
+ *
+ * <p>The OrcTableSource is used as shown in the example below.
+ *
+ * <pre>
+ * {@code
+ * String path = testInputURL.getPath();
+ * String schema = "struct<col1:boolean,col2:tinyint,col3:smallint,col4:int>"
+ * OrcTableSource orcSrc = new OrcTableSource(path, schema);
+ * tEnv.registerTableSource("orcTable", orcSrc);
+ * Table res = tableEnv.sql("SELECT * FROM orcTable");
+ * }
+ * </pre>
+ */
+public class OrcTableSource implements BatchTableSource<Row>, ProjectableTableSource<Row> {
+
+	private String path;
+	private TypeDescription orcSchema;
+	private RowTypeInfo typeInfo;
+	private Configuration orcConfig;
+	private int[] fieldMapping;
+
+	/**
+	 * The ORC file path and schema.
+	 *
+	 * @param path      the path of orc file
+	 * @param orcSchema schema of orc file
+	 */
+	public OrcTableSource(String path, String orcSchema) {
+		this(path, orcSchema, new Configuration());
+	}
+
+	/**
+	 * The file path and schema of orc file, and configuration to read orc file .
+	 *
+	 * @param path      the path of orc file
+	 * @param orcSchema schema of orc file
+	 * @param orcConfig configuration to read orc file
+	 */
+	public OrcTableSource(String path, String orcSchema, Configuration orcConfig) {
+		this(path, TypeDescription.fromString(orcSchema), orcConfig);
+	}
+
+	public OrcTableSource(String path, TypeDescription orcSchema, Configuration orcConfig) {
+		this.path = path;
+		this.orcSchema = orcSchema;
+		this.orcConfig = orcConfig;
+
+		this.typeInfo = (RowTypeInfo) OrcUtils.schemaToTypeInfo(this.orcSchema);
+
+	}
+
+	@Override
+	public DataSet<Row> getDataSet(ExecutionEnvironment execEnv) {
+
+		RowOrcInputFormat orcIF = new RowOrcInputFormat(path, orcSchema, orcConfig);
+		if (fieldMapping != null) {
+			orcIF.setFieldMapping(fieldMapping);
+		}
+		return execEnv.createInput(orcIF);
+	}
+
+	@Override
+	public TypeInformation<Row> getReturnType() {
+		return typeInfo;
+	}
+
+	@Override
+	public TableSource<Row> projectFields(int[] fields) {
+
+		OrcTableSource copy = new OrcTableSource(path, orcSchema, orcConfig);
+
+		// set field mapping
+		copy.fieldMapping = fields;
+
+		// adapt TypeInfo
+		TypeInformation[] fieldTypes = new TypeInformation[fields.length];
+		String[] fieldNames = new String[fields.length];
+		for (int i = 0; i < fields.length; i++) {
+			fieldTypes[i] = this.typeInfo.getTypeAt(fields[i]);
+			fieldNames[i] = this.typeInfo.getFieldNames()[fields[i]];
+		}
+		copy.typeInfo = new RowTypeInfo(fieldTypes, fieldNames);
+
+		return copy;
+	}
+
+	@Override
+	public String explainSource() {
+		return "ORC Source file at path " + this.path + " with schema " + this.orcSchema;
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/flink/blob/edbf8c9e/flink-connectors/flink-orc/src/main/java/org/apache/flink/orc/OrcUtils.java
----------------------------------------------------------------------
diff --git a/flink-connectors/flink-orc/src/main/java/org/apache/flink/orc/OrcUtils.java b/flink-connectors/flink-orc/src/main/java/org/apache/flink/orc/OrcUtils.java
new file mode 100644
index 0000000..c7557c7
--- /dev/null
+++ b/flink-connectors/flink-orc/src/main/java/org/apache/flink/orc/OrcUtils.java
@@ -0,0 +1,2229 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.flink.orc;
+
+import org.apache.flink.api.common.typeinfo.BasicTypeInfo;
+import org.apache.flink.api.common.typeinfo.PrimitiveArrayTypeInfo;
+import org.apache.flink.api.common.typeinfo.SqlTimeTypeInfo;
+import org.apache.flink.api.common.typeinfo.TypeInformation;
+import org.apache.flink.api.java.typeutils.MapTypeInfo;
+import org.apache.flink.api.java.typeutils.ObjectArrayTypeInfo;
+import org.apache.flink.api.java.typeutils.RowTypeInfo;
+import org.apache.flink.types.Row;
+
+import org.apache.hadoop.hive.common.type.HiveDecimal;
+import org.apache.hadoop.hive.ql.exec.vector.BytesColumnVector;
+import org.apache.hadoop.hive.ql.exec.vector.ColumnVector;
+import org.apache.hadoop.hive.ql.exec.vector.DecimalColumnVector;
+import org.apache.hadoop.hive.ql.exec.vector.DoubleColumnVector;
+import org.apache.hadoop.hive.ql.exec.vector.ListColumnVector;
+import org.apache.hadoop.hive.ql.exec.vector.LongColumnVector;
+import org.apache.hadoop.hive.ql.exec.vector.MapColumnVector;
+import org.apache.hadoop.hive.ql.exec.vector.StructColumnVector;
+import org.apache.hadoop.hive.ql.exec.vector.TimestampColumnVector;
+import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch;
+import org.apache.hadoop.hive.serde2.io.HiveDecimalWritable;
+
+import org.apache.orc.TypeDescription;
+
+import java.lang.reflect.Array;
+import java.math.BigDecimal;
+import java.sql.Date;
+import java.sql.Timestamp;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * A class that provides utility methods for orc file reading.
+ */
+public class OrcUtils {
+
+	/**
+	 * Convert ORC schema types to Flink types.
+	 *
+	 * @param schema schema of orc file
+	 *
+	 */
+	public static TypeInformation schemaToTypeInfo(TypeDescription schema) {
+		switch (schema.getCategory()) {
+			case BOOLEAN:
+				return BasicTypeInfo.BOOLEAN_TYPE_INFO;
+			case BYTE:
+				return BasicTypeInfo.BYTE_TYPE_INFO;
+			case SHORT:
+				return BasicTypeInfo.SHORT_TYPE_INFO;
+			case INT:
+				return BasicTypeInfo.INT_TYPE_INFO;
+			case LONG:
+				return BasicTypeInfo.LONG_TYPE_INFO;
+			case FLOAT:
+				return BasicTypeInfo.FLOAT_TYPE_INFO;
+			case DOUBLE:
+				return BasicTypeInfo.DOUBLE_TYPE_INFO;
+			case STRING:
+			case CHAR:
+			case VARCHAR:
+				return BasicTypeInfo.STRING_TYPE_INFO;
+			case DATE:
+				return SqlTimeTypeInfo.DATE;
+			case TIMESTAMP:
+				return SqlTimeTypeInfo.TIMESTAMP;
+			case BINARY:
+				return PrimitiveArrayTypeInfo.BYTE_PRIMITIVE_ARRAY_TYPE_INFO;
+			case STRUCT:
+				List<TypeDescription> fieldSchemas = schema.getChildren();
+				TypeInformation[] fieldTypes = new TypeInformation[fieldSchemas.size()];
+				for (int i = 0; i < fieldSchemas.size(); i++) {
+					fieldTypes[i] = schemaToTypeInfo(fieldSchemas.get(i));
+				}
+				String[] fieldNames = schema.getFieldNames().toArray(new String[]{});
+				return new RowTypeInfo(fieldTypes, fieldNames);
+			case LIST:
+				TypeDescription elementSchema = schema.getChildren().get(0);
+				TypeInformation elementType = schemaToTypeInfo(elementSchema);
+				return ObjectArrayTypeInfo.getInfoFor(elementType);
+			case MAP:
+				TypeDescription keySchema = schema.getChildren().get(0);
+				TypeDescription valSchema = schema.getChildren().get(1);
+				TypeInformation keyType = schemaToTypeInfo(keySchema);
+				TypeInformation valType = schemaToTypeInfo(valSchema);
+				return new MapTypeInfo(keyType, valType);
+			case DECIMAL:
+				return BasicTypeInfo.BIG_DEC_TYPE_INFO;
+			case UNION:
+				throw new UnsupportedOperationException("UNION type not supported yet.");
+			default:
+				throw new IllegalArgumentException("Unknown type " + schema);
+		}
+	}
+
+	/**
+	 * Fill rows from orc batch.
+	 *
+	 * @param rows the batch of rows need to be filled
+	 * @param schema schema of orc file
+	 * @param batch current orc batch data used to fill the rows
+	 * @param fieldMapping field mapping
+	 *
+	 */
+	public static void fillRows(Object[] rows, TypeDescription schema, VectorizedRowBatch batch, int[] fieldMapping) {
+
+		int totalRowsInBatch = (int) batch.count();
+
+		List<TypeDescription> fieldTypes = schema.getChildren();
+		for (int outIdx = 0; outIdx < fieldMapping.length; outIdx++) {
+			int inIdx = fieldMapping[outIdx];
+			readField(rows, outIdx, fieldTypes.get(inIdx), batch.cols[inIdx], null, Math.min((int) totalRowsInBatch, rows.length));
+		}
+	}
+
+	private static void readField(Object[] rows, int fieldIdx, TypeDescription schema, ColumnVector vector, long[] lengthVector, int childCount) {
+
+		switch (schema.getCategory()) {
+			case BOOLEAN:
+				if (vector.noNulls) {
+					readNonNullBooleanColumn(rows, fieldIdx, (LongColumnVector) vector, lengthVector, childCount);
+				} else {
+					readBooleanColumn(rows, fieldIdx, (LongColumnVector) vector, lengthVector, childCount);
+				}
+				break;
+			case BYTE:
+				if (vector.noNulls) {
+					readNonNullByteColumn(rows, fieldIdx, (LongColumnVector) vector, lengthVector, childCount);
+				} else {
+					readByteColumn(rows, fieldIdx, (LongColumnVector) vector, lengthVector, childCount);
+				}
+				break;
+			case SHORT:
+				if (vector.noNulls) {
+					readNonNullShortColumn(rows, fieldIdx, (LongColumnVector) vector, lengthVector, childCount);
+				} else {
+					readShortColumn(rows, fieldIdx, (LongColumnVector) vector, lengthVector, childCount);
+				}
+				break;
+			case INT:
+				if (vector.noNulls) {
+					readNonNullIntColumn(rows, fieldIdx, (LongColumnVector) vector, lengthVector, childCount);
+				} else {
+					readIntColumn(rows, fieldIdx, (LongColumnVector) vector, lengthVector, childCount);
+				}
+				break;
+			case LONG:
+				if (vector.noNulls) {
+					readNonNullLongColumn(rows, fieldIdx, (LongColumnVector) vector, lengthVector, childCount);
+				} else {
+					readLongColumn(rows, fieldIdx, (LongColumnVector) vector, lengthVector, childCount);
+				}
+				break;
+			case FLOAT:
+				if (vector.noNulls) {
+					readNonNullFloatColumn(rows, fieldIdx, (DoubleColumnVector) vector, lengthVector, childCount);
+				} else {
+					readFloatColumn(rows, fieldIdx, (DoubleColumnVector) vector, lengthVector, childCount);
+				}
+				break;
+			case DOUBLE:
+				if (vector.noNulls) {
+					readNonNullDoubleColumn(rows, fieldIdx, (DoubleColumnVector) vector, lengthVector, childCount);
+				} else {
+					readDoubleColumn(rows, fieldIdx, (DoubleColumnVector) vector, lengthVector, childCount);
+				}
+				break;
+			case CHAR:
+			case VARCHAR:
+			case STRING:
+				if (vector.noNulls) {
+					readNonNullStringColumn(rows, fieldIdx, (BytesColumnVector) vector, lengthVector, childCount);
+				} else {
+					readStringColumn(rows, fieldIdx, (BytesColumnVector) vector, lengthVector, childCount);
+				}
+				break;
+			case DATE:
+				if (vector.noNulls) {
+					readNonNullDateColumn(rows, fieldIdx, (LongColumnVector) vector, lengthVector, childCount);
+				} else {
+					readDateColumn(rows, fieldIdx, (LongColumnVector) vector, lengthVector, childCount);
+				}
+				break;
+			case TIMESTAMP:
+				if (vector.noNulls) {
+					readNonNullTimestampColumn(rows, fieldIdx, (TimestampColumnVector) vector, lengthVector, childCount);
+				} else {
+					readTimestampColumn(rows, fieldIdx, (TimestampColumnVector) vector, lengthVector, childCount);
+				}
+				break;
+			case BINARY:
+				if (vector.noNulls) {
+					readNonNullBinaryColumn(rows, fieldIdx, (BytesColumnVector) vector, lengthVector, childCount);
+				} else {
+					readBinaryColumn(rows, fieldIdx, (BytesColumnVector) vector, lengthVector, childCount);
+				}
+				break;
+			case DECIMAL:
+				if (vector.noNulls) {
+					readNonNullDecimalColumn(rows, fieldIdx, (DecimalColumnVector) vector, lengthVector, childCount);
+				}
+				else {
+					readDecimalColumn(rows, fieldIdx, (DecimalColumnVector) vector, lengthVector, childCount);
+				}
+				break;
+			case STRUCT:
+				if (vector.noNulls) {
+					readNonNullStructColumn(rows, fieldIdx, (StructColumnVector) vector, schema, lengthVector, childCount);
+				} else {
+					readStructColumn(rows, fieldIdx, (StructColumnVector) vector, schema, lengthVector, childCount);
+				}
+				break;
+			case LIST:
+				if (vector.noNulls) {
+					readNonNullListColumn(rows, fieldIdx, (ListColumnVector) vector, schema, lengthVector, childCount);
+				}
+				else {
+					readListColumn(rows, fieldIdx, (ListColumnVector) vector, schema, lengthVector, childCount);
+				}
+				break;
+			case MAP:
+				if (vector.noNulls) {
+					readNonNullMapColumn(rows, fieldIdx, (MapColumnVector) vector, schema, lengthVector, childCount);
+				}
+				else {
+					readMapColumn(rows, fieldIdx, (MapColumnVector) vector, schema, lengthVector, childCount);
+				}
+				break;
+			case UNION:
+				throw new UnsupportedOperationException("UNION type not supported yet");
+			default:
+				throw new IllegalArgumentException("Unknown type " + schema);
+		}
+	}
+
+	private static void readNonNullBooleanColumn(Object[] rows, int fieldIdx, LongColumnVector vector, long[] lengthVector, int childCount) {
+
+		// check if boolean is directly in a list or not, e.g, array<boolean>
+		if (lengthVector == null) {
+			if (vector.isRepeating) { // fill complete column with first value
+				boolean repeatingValue = vector.vector[0] != 0;
+				fillColumnWithRepeatingValue(rows, fieldIdx, repeatingValue, childCount);
+			} else {
+				if (fieldIdx == -1) { // set as an object
+					for (int i = 0; i < childCount; i++) {
+						rows[i] = vector.vector[i] != 0;
+					}
+				} else { // set as a field of Row
+					for (int i = 0; i < childCount; i++) {
+						((Row) rows[i]).setField(fieldIdx, vector.vector[i] != 0);
+					}
+				}
+			}
+		} else { // in a list
+			boolean[] temp;
+			int offset = 0;
+			if (vector.isRepeating) { // fill complete list with first value
+				boolean repeatingValue = vector.vector[0] != 0;
+				if (fieldIdx == -1) { // set list as an object
+					for (int i = 0; offset < childCount; i++) {
+						temp = new boolean[(int) lengthVector[i]];
+						Arrays.fill(temp, repeatingValue);
+						rows[i] = temp;
+						offset += temp.length;
+					}
+				} else { // set list as a field of Row
+					for (int i = 0; offset < childCount; i++) {
+						temp = new boolean[(int) lengthVector[i]];
+						Arrays.fill(temp, repeatingValue);
+						((Row) rows[i]).setField(fieldIdx, temp);
+						offset += temp.length;
+					}
+				}
+			} else {
+				if (fieldIdx == -1) { // set list as an object
+					for (int i = 0; offset < childCount; i++) {
+						temp = new boolean[(int) lengthVector[i]];
+						for (int j = 0; j < temp.length; j++) {
+							temp[j] = vector.vector[offset++] != 0;
+						}
+						rows[i] = temp;
+					}
+				} else { // set list as a field of Row
+					for (int i = 0; offset < childCount; i++) {
+						temp = new boolean[(int) lengthVector[i]];
+						for (int j = 0; j < temp.length; j++) {
+							temp[j] = vector.vector[offset++] != 0;
+						}
+						((Row) rows[i]).setField(fieldIdx, temp);
+					}
+				}
+			}
+		}
+	}
+
+	private static void readNonNullByteColumn(Object[] rows, int fieldIdx, LongColumnVector vector, long[] lengthVector, int childCount) {
+
+		// check if byte is directly in a list or not, e.g, array<byte>
+		if (lengthVector == null) {
+			if (vector.isRepeating) { // fill complete column with first value
+				byte repeatingValue = (byte) vector.vector[0];
+				fillColumnWithRepeatingValue(rows, fieldIdx, repeatingValue, childCount);
+			} else {
+				if (fieldIdx == -1) { // set as an object
+					for (int i = 0; i < childCount; i++) {
+						rows[i] = (byte) vector.vector[i];
+					}
+				} else { // set as a field of Row
+					for (int i = 0; i < childCount; i++) {
+						((Row) rows[i]).setField(fieldIdx, (byte) vector.vector[i]);
+					}
+				}
+			}
+		} else { // in a list
+			byte[] temp;
+			int offset = 0;
+			if (vector.isRepeating) { // fill complete list with first value
+				byte repeatingValue = (byte) vector.vector[0];
+				if (fieldIdx == -1) { // set list as an object
+					for (int i = 0; offset < childCount; i++) {
+						temp = new byte[(int) lengthVector[i]];
+						Arrays.fill(temp, repeatingValue);
+						rows[i] = temp;
+						offset += temp.length;
+					}
+				} else { // set list as a field of Row
+					for (int i = 0; offset < childCount; i++) {
+						temp = new byte[(int) lengthVector[i]];
+						Arrays.fill(temp, repeatingValue);
+						((Row) rows[i]).setField(fieldIdx, temp);
+						offset += temp.length;
+					}
+				}
+			} else {
+				if (fieldIdx == -1) { // set list as an object
+					for (int i = 0; offset < childCount; i++) {
+						temp = new byte[(int) lengthVector[i]];
+						for (int j = 0; j < temp.length; j++) {
+							temp[j] = (byte) vector.vector[offset++];
+						}
+						rows[i] = temp;
+					}
+				} else { // set list as a field of Row
+					for (int i = 0; offset < childCount; i++) {
+						temp = new byte[(int) lengthVector[i]];
+						for (int j = 0; j < temp.length; j++) {
+							temp[j] = (byte) vector.vector[offset++];
+						}
+						((Row) rows[i]).setField(fieldIdx, temp);
+					}
+				}
+			}
+		}
+	}
+
+	private static void readNonNullShortColumn(Object[] rows, int fieldIdx, LongColumnVector vector, long[] lengthVector, int childCount) {
+
+		// check if short is directly in a list or not, e.g, array<short>
+		if (lengthVector == null) {
+			if (vector.isRepeating) { // fill complete column with first value
+				short repeatingValue = (short) vector.vector[0];
+				fillColumnWithRepeatingValue(rows, fieldIdx, repeatingValue, childCount);
+			} else {
+				if (fieldIdx == -1) { // set as an object
+					for (int i = 0; i < childCount; i++) {
+						rows[i] = (short) vector.vector[i];
+					}
+				} else { // set as a field of Row
+					for (int i = 0; i < childCount; i++) {
+						((Row) rows[i]).setField(fieldIdx, (short) vector.vector[i]);
+					}
+				}
+			}
+		} else { // in a list
+			short[] temp;
+			int offset = 0;
+			if (vector.isRepeating) { // fill complete list with first value
+				short repeatingValue = (short) vector.vector[0];
+				if (fieldIdx == -1) { // set list as an object
+					for (int i = 0; offset < childCount; i++) {
+						temp = new short[(int) lengthVector[i]];
+						Arrays.fill(temp, repeatingValue);
+						rows[i] = temp;
+						offset += temp.length;
+					}
+				} else { // set list as a field of Row
+					for (int i = 0; offset < childCount; i++) {
+						temp = new short[(int) lengthVector[i]];
+						Arrays.fill(temp, repeatingValue);
+						((Row) rows[i]).setField(fieldIdx, temp);
+						offset += temp.length;
+					}
+				}
+			} else {
+				if (fieldIdx == -1) { // set list as an object
+					for (int i = 0; offset < childCount; i++) {
+						temp = new short[(int) lengthVector[i]];
+						for (int j = 0; j < temp.length; j++) {
+							temp[j] = (short) vector.vector[offset++];
+						}
+						rows[i] = temp;
+					}
+				} else { // set list as a field of Row
+					for (int i = 0; offset < childCount; i++) {
+						temp = new short[(int) lengthVector[i]];
+						for (int j = 0; j < temp.length; j++) {
+							temp[j] = (short) vector.vector[offset++];
+						}
+						((Row) rows[i]).setField(fieldIdx, temp);
+					}
+				}
+			}
+		}
+	}
+
+	private static void readNonNullIntColumn(Object[] rows, int fieldIdx, LongColumnVector vector, long[] lengthVector, int childCount) {
+
+		// check if int is directly in a list or not, e.g, array<int>
+		if (lengthVector == null) {
+			if (vector.isRepeating) { // fill complete column with first value
+				int repeatingValue = (int) vector.vector[0];
+				fillColumnWithRepeatingValue(rows, fieldIdx, repeatingValue, childCount);
+			} else {
+				if (fieldIdx == -1) { // set as an object
+					for (int i = 0; i < childCount; i++) {
+						rows[i] = (int) vector.vector[i];
+					}
+				} else { // set as a field of Row
+					for (int i = 0; i < childCount; i++) {
+						((Row) rows[i]).setField(fieldIdx, (int) vector.vector[i]);
+					}
+				}
+			}
+		} else { // in a list
+			int[] temp;
+			int offset = 0;
+			if (vector.isRepeating) { // fill complete list with first value
+				int repeatingValue = (int) vector.vector[0];
+				if (fieldIdx == -1) { // set list as an object
+					for (int i = 0; offset < childCount; i++) {
+						temp = new int[(int) lengthVector[i]];
+						Arrays.fill(temp, repeatingValue);
+						rows[i] = temp;
+						offset += temp.length;
+					}
+				} else { // set list as a field of Row
+					for (int i = 0; offset < childCount; i++) {
+						temp = new int[(int) lengthVector[i]];
+						Arrays.fill(temp, repeatingValue);
+						((Row) rows[i]).setField(fieldIdx, temp);
+						offset += temp.length;
+					}
+				}
+			} else {
+				if (fieldIdx == -1) { // set list as an object
+					for (int i = 0; offset < childCount; i++) {
+						temp = new int[(int) lengthVector[i]];
+						for (int j = 0; j < temp.length; j++) {
+							temp[j] = (int) vector.vector[offset++];
+						}
+						rows[i] = temp;
+					}
+				} else { // set list as a field of Row
+					for (int i = 0; offset < childCount; i++) {
+						temp = new int[(int) lengthVector[i]];
+						for (int j = 0; j < temp.length; j++) {
+							temp[j] = (int) vector.vector[offset++];
+						}
+						((Row) rows[i]).setField(fieldIdx, temp);
+					}
+				}
+			}
+		}
+	}
+
+	private static void readNonNullLongColumn(Object[] rows, int fieldIdx, LongColumnVector vector, long[] lengthVector, int childCount) {
+
+		// check if long is directly in a list or not, e.g, array<long>
+		if (lengthVector == null) {
+			if (vector.isRepeating) { // fill complete column with first value
+				long repeatingValue = vector.vector[0];
+				fillColumnWithRepeatingValue(rows, fieldIdx, repeatingValue, childCount);
+			} else {
+				if (fieldIdx == -1) { // set as an object
+					for (int i = 0; i < childCount; i++) {
+						rows[i] = vector.vector[i];
+					}
+				} else { // set as a field of Row
+					for (int i = 0; i < childCount; i++) {
+						((Row) rows[i]).setField(fieldIdx, (Long) vector.vector[i]);
+					}
+				}
+			}
+		} else { // in a list
+			long[] temp;
+			int offset = 0;
+			if (vector.isRepeating) { // fill complete list with first value
+				long repeatingValue = vector.vector[0];
+				if (fieldIdx == -1) { // set list as an object
+					for (int i = 0; offset < childCount; i++) {
+						temp = new long[(int) lengthVector[i]];
+						Arrays.fill(temp, repeatingValue);
+						rows[i] = temp;
+						offset += temp.length;
+					}
+				} else { // set list as a field of Row
+					for (int i = 0; offset < childCount; i++) {
+						temp = new long[(int) lengthVector[i]];
+						Arrays.fill(temp, repeatingValue);
+						((Row) rows[i]).setField(fieldIdx, temp);
+						offset += temp.length;
+					}
+				}
+			} else {
+				if (fieldIdx == -1) { // set list as an object
+					for (int i = 0; offset < childCount; i++) {
+						temp = new long[(int) lengthVector[i]];
+						for (int j = 0; j < temp.length; j++) {
+							temp[j] = vector.vector[offset++];
+						}
+						rows[i] = temp;
+					}
+				} else { // set list as a field of Row
+					for (int i = 0; offset < childCount; i++) {
+						temp = new long[(int) lengthVector[i]];
+						for (int j = 0; j < temp.length; j++) {
+							temp[j] = vector.vector[offset++];
+						}
+						((Row) rows[i]).setField(fieldIdx, temp);
+					}
+				}
+			}
+		}
+	}
+
+	private static void readNonNullFloatColumn(Object[] rows, int fieldIdx, DoubleColumnVector vector, long[] lengthVector, int childCount) {
+
+		// check if float is directly in a list or not, e.g, array<float>
+		if (lengthVector == null) {
+			if (vector.isRepeating) { // fill complete column with first value
+				float repeatingValue = (float) vector.vector[0];
+				fillColumnWithRepeatingValue(rows, fieldIdx, repeatingValue, childCount);
+			} else {
+				if (fieldIdx == -1) { // set as an object
+					for (int i = 0; i < childCount; i++) {
+						rows[i] = (float) vector.vector[i];
+					}
+				} else { // set as a field of Row
+					for (int i = 0; i < childCount; i++) {
+						((Row) rows[i]).setField(fieldIdx, (float) vector.vector[i]);
+					}
+				}
+			}
+		} else { // in a list
+			float[] temp;
+			int offset = 0;
+			if (vector.isRepeating) { // fill complete list with first value
+				float repeatingValue = (float) vector.vector[0];
+				if (fieldIdx == -1) { // set list as an object
+					for (int i = 0; offset < childCount; i++) {
+						temp = new float[(int) lengthVector[i]];
+						Arrays.fill(temp, repeatingValue);
+						rows[i] = temp;
+						offset += temp.length;
+					}
+				} else { // set list as a field of Row
+					for (int i = 0; offset < childCount; i++) {
+						temp = new float[(int) lengthVector[i]];
+						Arrays.fill(temp, repeatingValue);
+						((Row) rows[i]).setField(fieldIdx, temp);
+						offset += temp.length;
+					}
+				}
+			} else {
+				if (fieldIdx == -1) { // set list as an object
+					for (int i = 0; offset < childCount; i++) {
+						temp = new float[(int) lengthVector[i]];
+						for (int j = 0; j < temp.length; j++) {
+							temp[j] = (float) vector.vector[offset++];
+						}
+						rows[i] = temp;
+					}
+				} else { // set list as a field of Row
+					for (int i = 0; offset < childCount; i++) {
+						temp = new float[(int) lengthVector[i]];
+						for (int j = 0; j < temp.length; j++) {
+							temp[j] = (float) vector.vector[offset++];
+						}
+						((Row) rows[i]).setField(fieldIdx, temp);
+					}
+				}
+			}
+		}
+	}
+
+	private static void readNonNullDoubleColumn(Object[] rows, int fieldIdx, DoubleColumnVector vector, long[] lengthVector, int childCount) {
+
+		// check if double is directly in a list or not, e.g, array<double>
+		if (lengthVector == null) {
+			if (vector.isRepeating) { // fill complete column with first value
+				double repeatingValue = vector.vector[0];
+				fillColumnWithRepeatingValue(rows, fieldIdx, repeatingValue, childCount);
+			} else {
+				if (fieldIdx == -1) { // set as an object
+					for (int i = 0; i < childCount; i++) {
+						rows[i] = vector.vector[i];
+					}
+				} else { // set as a field of Row
+					for (int i = 0; i < childCount; i++) {
+						((Row) rows[i]).setField(fieldIdx, vector.vector[i]);
+					}
+				}
+			}
+		} else { // in a list
+			double[] temp;
+			int offset = 0;
+			if (vector.isRepeating) { // fill complete list with first value
+				double repeatingValue = vector.vector[0];
+				if (fieldIdx == -1) { // set list as an object
+					for (int i = 0; offset < childCount; i++) {
+						temp = new double[(int) lengthVector[i]];
+						Arrays.fill(temp, repeatingValue);
+						rows[i] = temp;
+						offset += temp.length;
+					}
+				} else { // set list as a field of Row
+					for (int i = 0; offset < childCount; i++) {
+						temp = new double[(int) lengthVector[i]];
+						Arrays.fill(temp, repeatingValue);
+						((Row) rows[i]).setField(fieldIdx, temp);
+						offset += temp.length;
+					}
+				}
+			} else {
+				if (fieldIdx == -1) { // set list as an object
+					for (int i = 0; offset < childCount; i++) {
+						temp = new double[(int) lengthVector[i]];
+						for (int j = 0; j < temp.length; j++) {
+							temp[j] = vector.vector[offset++];
+						}
+						rows[i] = temp;
+					}
+				} else { // set list as a field of Row
+					for (int i = 0; offset < childCount; i++) {
+						temp = new double[(int) lengthVector[i]];
+						for (int j = 0; j < temp.length; j++) {
+							temp[j] = vector.vector[offset++];
+						}
+						((Row) rows[i]).setField(fieldIdx, temp);
+					}
+				}
+			}
+		}
+	}
+
+	private static void readNonNullStringColumn(Object[] rows, int fieldIdx, BytesColumnVector bytes, long[] lengthVector, int childCount) {
+
+		// check if string is directly in a list or not, e.g, array<string>
+		if (lengthVector == null) {
+			if (bytes.isRepeating) { // fill complete column with first value
+				String repeatingValue = new String(bytes.vector[0], bytes.start[0], bytes.length[0]);
+				fillColumnWithRepeatingValue(rows, fieldIdx, repeatingValue, childCount);
+			} else {
+				if (fieldIdx == -1) { // set as an object
+					for (int i = 0; i < childCount; i++) {
+						rows[i] = new String(bytes.vector[i], bytes.start[i], bytes.length[i]);
+					}
+				} else { // set as a field of Row
+					for (int i = 0; i < childCount; i++) {
+						((Row) rows[i]).setField(fieldIdx, new String(bytes.vector[i], bytes.start[i], bytes.length[i]));
+					}
+				}
+			}
+		}
+		else { // in a list
+			String[] temp;
+			int offset = 0;
+			if (bytes.isRepeating) { // fill list with first value
+				String repeatingValue = new String(bytes.vector[0], bytes.start[0], bytes.length[0]);
+				if (fieldIdx == -1) { // set list as an object
+					for (int i = 0; i < childCount; i++) {
+						temp = new String[(int) lengthVector[i]];
+						Arrays.fill(temp, repeatingValue);
+						rows[i] = temp;
+						offset += temp.length;
+					}
+				} else { // set list as a field
+					for (int i = 0; i < childCount; i++) {
+						temp = new String[(int) lengthVector[i]];
+						Arrays.fill(temp, repeatingValue);
+						((Row) rows[i]).setField(fieldIdx, temp);
+						offset += temp.length;
+					}
+				}
+			} else {
+				if (fieldIdx == -1) { // set list as an object
+					for (int i = 0; offset < childCount; i++) {
+						temp = new String[(int) lengthVector[i]];
+						for (int j = 0; j < temp.length; j++) {
+							temp[j] = new String(bytes.vector[offset], bytes.start[offset], bytes.length[offset]);
+							offset++;
+						}
+						rows[i] = temp;
+					}
+				} else { // set list as a field
+					for (int i = 0; offset < childCount; i++) {
+						temp = new String[(int) lengthVector[i]];
+						for (int j = 0; j < temp.length; j++) {
+							temp[j] = new String(bytes.vector[offset], bytes.start[offset], bytes.length[offset]);
+							offset++;
+						}
+						((Row) rows[i]).setField(fieldIdx, temp);
+					}
+				}
+			}
+		}
+
+	}
+
+	private static void readNonNullDateColumn(Object[] rows, int fieldIdx, LongColumnVector vector, long[] lengthVector, int childCount) {
+
+		// check if date is directly in a list or not, e.g, array<date>
+		if (lengthVector == null) {
+			if (vector.isRepeating) { // fill complete column with first value
+				if (fieldIdx == -1) { // set as an object
+					for (int i = 0; i < childCount; i++) {
+						rows[i] = readDate(vector.vector[0]);
+					}
+				} else { // set as a field of Row
+					for (int i = 0; i < childCount; i++) {
+						((Row) rows[i]).setField(fieldIdx, readDate(vector.vector[0]));
+					}
+				}
+			} else {
+				if (fieldIdx == -1) { // set as an object
+					for (int i = 0; i < childCount; i++) {
+						rows[i] = readDate(vector.vector[i]);
+					}
+				} else { // set as a field of Row
+					for (int i = 0; i < childCount; i++) {
+						((Row) rows[i]).setField(fieldIdx, readDate(vector.vector[i]));
+					}
+				}
+			}
+		} else {
+			Date[] temp;
+			int offset = 0;
+			if (vector.isRepeating) { // fill complete list with first value
+				if (fieldIdx == -1) { // set list as an object
+					for (int i = 0; offset < childCount; i++) {
+						temp = new Date[(int) lengthVector[i]];
+						for (int j = 0; j < temp.length; j++) {
+							temp[j] = readDate(vector.vector[0]);
+						}
+						rows[i] = temp;
+						offset += temp.length;
+					}
+				} else { // set list as a field of Row
+					for (int i = 0; offset < childCount; i++) {
+						temp = new Date[(int) lengthVector[i]];
+						for (int j = 0; j < temp.length; j++) {
+							temp[j] = readDate(vector.vector[0]);
+						}
+						((Row) rows[i]).setField(fieldIdx, temp);
+						offset += temp.length;
+					}
+				}
+			} else {
+				if (fieldIdx == -1) { // set list as an object
+					for (int i = 0; offset < childCount; i++) {
+						temp = new Date[(int) lengthVector[i]];
+						for (int j = 0; j < temp.length; j++) {
+							temp[j] = readDate(vector.vector[offset++]);
+						}
+						rows[i] = temp;
+					}
+				} else { // set list as a field of Row
+					for (int i = 0; offset < childCount; i++) {
+						temp = new Date[(int) lengthVector[i]];
+						for (int j = 0; j < temp.length; j++) {
+							temp[j] = readDate(vector.vector[offset++]);
+						}
+						((Row) rows[i]).setField(fieldIdx, temp);
+					}
+				}
+			}
+		}
+	}
+
+	private static void readNonNullTimestampColumn(Object[] rows, int fieldIdx, TimestampColumnVector vector, long[] lengthVector, int childCount) {
+
+		// check if timestamp is directly in a list or not, e.g, array<timestamp>
+		if (lengthVector == null) {
+			if (vector.isRepeating) { // fill complete column with first value
+				if (fieldIdx == -1) { // set as an object
+					for (int i = 0; i < childCount; i++) {
+						rows[i] = readTimeStamp(vector.time[0], vector.nanos[0]);
+					}
+				} else { // set as a field of Row
+					for (int i = 0; i < childCount; i++) {
+						((Row) rows[i]).setField(fieldIdx, readTimeStamp(vector.time[0], vector.nanos[0]));
+					}
+				}
+			} else {
+				if (fieldIdx == -1) { // set as an object
+					for (int i = 0; i < childCount; i++) {
+						rows[i] = readTimeStamp(vector.time[i], vector.nanos[i]);
+					}
+				} else { // set as a field of Row
+					for (int i = 0; i < childCount; i++) {
+						((Row) rows[i]).setField(fieldIdx, readTimeStamp(vector.time[i], vector.nanos[i]));
+					}
+				}
+			}
+		} else {
+			Timestamp[] temp;
+			int offset = 0;
+			if (vector.isRepeating) { // fill complete list with first value
+				if (fieldIdx == -1) { // set list as an object
+					for (int i = 0; offset < childCount; i++) {
+						temp = new Timestamp[(int) lengthVector[i]];
+						for (int j = 0; j < temp.length; j++) {
+							temp[j] = readTimeStamp(vector.time[0], vector.nanos[0]);
+						}
+						rows[i] = temp;
+						offset += temp.length;
+					}
+				} else { // set list as a field of Row
+					for (int i = 0; offset < childCount; i++) {
+						temp = new Timestamp[(int) lengthVector[i]];
+						for (int j = 0; j < temp.length; j++) {
+							temp[j] = readTimeStamp(vector.time[0], vector.nanos[0]);
+						}
+						((Row) rows[i]).setField(fieldIdx, temp);
+						offset += temp.length;
+					}
+				}
+			} else {
+				if (fieldIdx == -1) { // set list as an object
+					for (int i = 0; offset < childCount; i++) {
+						temp = new Timestamp[(int) lengthVector[i]];
+						for (int j = 0; j < temp.length; j++) {
+							temp[j] = readTimeStamp(vector.time[offset], vector.nanos[offset]);
+							offset++;
+						}
+						rows[i] = temp;
+					}
+				} else { // set list as a field of Row
+					for (int i = 0; offset < childCount; i++) {
+						temp = new Timestamp[(int) lengthVector[i]];
+						for (int j = 0; j < temp.length; j++) {
+							temp[j] = readTimeStamp(vector.time[offset], vector.nanos[offset]);
+							offset++;
+						}
+						((Row) rows[i]).setField(fieldIdx, temp);
+					}
+				}
+			}
+		}
+	}
+
+	private static void readNonNullBinaryColumn(Object[] rows, int fieldIdx, BytesColumnVector bytes, long[] lengthVector, int childCount) {
+
+		// check if string is directly in a list or not, e.g, array<string>
+		if (lengthVector == null) {
+			if (bytes.isRepeating) { // fill complete column with first value
+				if (fieldIdx == -1) { // set as an object
+					for (int i = 0; i < childCount; i++) {
+						rows[i] = readBinary(bytes.vector[0], bytes.start[0], bytes.length[0]);
+					}
+				} else { // set as a field of Row
+					for (int i = 0; i < childCount; i++) {
+						((Row) rows[i]).setField(fieldIdx, readBinary(bytes.vector[0], bytes.start[0], bytes.length[0]));
+					}
+				}
+			} else {
+				if (fieldIdx == -1) { // set as an object
+					for (int i = 0; i < childCount; i++) {
+						rows[i] = readBinary(bytes.vector[i], bytes.start[i], bytes.length[i]);
+					}
+				} else { // set as a field of Row
+					for (int i = 0; i < childCount; i++) {
+						((Row) rows[i]).setField(fieldIdx, readBinary(bytes.vector[i], bytes.start[i], bytes.length[i]));
+					}
+				}
+			}
+		} else {
+			byte[][] temp;
+			int offset = 0;
+			if (bytes.isRepeating) { // fill complete list with first value
+				if (fieldIdx == -1) { // set list as an object
+					for (int i = 0; offset < childCount; i++) {
+						temp = new byte[(int) lengthVector[i]][];
+						for (int j = 0; j < temp.length; j++) {
+							temp[j] = readBinary(bytes.vector[0], bytes.start[0], bytes.length[0]);
+						}
+						rows[i] = temp;
+						offset += temp.length;
+					}
+				} else { // set list as a field
+					for (int i = 0; offset < childCount; i++) {
+						temp = new byte[(int) lengthVector[i]][];
+						for (int j = 0; j < temp.length; j++) {
+							temp[j] = readBinary(bytes.vector[0], bytes.start[0], bytes.length[0]);
+						}
+						((Row) rows[i]).setField(fieldIdx, temp);
+						offset += temp.length;
+					}
+				}
+			} else {
+				if (fieldIdx == -1) { // set list as an object
+					for (int i = 0; offset < childCount; i++) {
+						temp = new byte[(int) lengthVector[i]][];
+						for (int j = 0; j < temp.length; j++) {
+							temp[j] = readBinary(bytes.vector[offset], bytes.start[offset], bytes.length[offset]);
+							offset++;
+						}
+						rows[i] = temp;
+					}
+				} else { // set list as a field
+					for (int i = 0; offset < childCount; i++) {
+						temp = new byte[(int) lengthVector[i]][];
+						for (int j = 0; j < temp.length; j++) {
+							temp[j] = readBinary(bytes.vector[offset], bytes.start[offset], bytes.length[offset]);
+							offset++;
+						}
+						((Row) rows[i]).setField(fieldIdx, temp);
+					}
+				}
+			}
+		}
+
+	}
+
+	private static void readNonNullDecimalColumn(Object[] rows, int fieldIdx, DecimalColumnVector vector, long[] lengthVector, int childCount) {
+
+		// check if decimal is directly in a list or not, e.g, array<decimal>
+		if (lengthVector == null) {
+			if (vector.isRepeating) { // fill complete column with first value
+				fillColumnWithRepeatingValue(rows, fieldIdx, readBigDecimal(vector.vector[0]), childCount);
+			} else {
+				if (fieldIdx == -1) { // set as an object
+					for (int i = 0; i < childCount; i++) {
+						rows[i] = readBigDecimal(vector.vector[i]);
+					}
+				} else { // set as a field of Row
+					for (int i = 0; i < childCount; i++) {
+						((Row) rows[i]).setField(fieldIdx, readBigDecimal(vector.vector[i]));
+					}
+				}
+			}
+		} else {
+			BigDecimal[] temp;
+			int offset = 0;
+			if (vector.isRepeating) { // fill complete list with first value
+				BigDecimal repeatingValue = readBigDecimal(vector.vector[0]);
+				if (fieldIdx == -1) { // set list as an object
+					for (int i = 0; offset < childCount; i++) {
+						temp = new BigDecimal[(int) lengthVector[i]];
+						Arrays.fill(temp, repeatingValue);
+						rows[i] = temp;
+						offset += temp.length;
+					}
+				} else { // set list as a field of Row
+					for (int i = 0; offset < childCount; i++) {
+						temp = new BigDecimal[(int) lengthVector[i]];
+						Arrays.fill(temp, repeatingValue);
+						((Row) rows[i]).setField(fieldIdx, temp);
+						offset += temp.length;
+					}
+				}
+			} else {
+				if (fieldIdx == -1) { // set list as an object
+					for (int i = 0; offset < childCount; i++) {
+						temp = new BigDecimal[(int) lengthVector[i]];
+						for (int j = 0; j < temp.length; j++) {
+							temp[j] = readBigDecimal(vector.vector[offset++]);
+						}
+						rows[i] = temp;
+					}
+				} else { // set list as a field of Row
+					for (int i = 0; offset < childCount; i++) {
+						temp = new BigDecimal[(int) lengthVector[i]];
+						for (int j = 0; j < temp.length; j++) {
+							temp[j] = readBigDecimal(vector.vector[offset++]);
+						}
+						((Row) rows[i]).setField(fieldIdx, temp);
+					}
+				}
+			}
+		}
+
+	}
+
+	private static void readNonNullStructColumn(Object[] rows, int fieldIdx, StructColumnVector struct, TypeDescription schema, long[] lengthVector, int childCount) {
+
+		List<TypeDescription> childrenTypes = schema.getChildren();
+
+		int numChildren = childrenTypes.size();
+		Row[] nestedFields = new Row[childCount];
+		for (int i = 0; i < childCount; i++) {
+			nestedFields[i] = new Row(numChildren);
+		}
+		for (int i = 0; i < numChildren; i++) {
+			readField(nestedFields, i, childrenTypes.get(i), struct.fields[i], null, childCount);
+		}
+
+		// check if struct is directly in a list or not, e.g, array<struct<dt>>
+		if (lengthVector == null) {
+			if (fieldIdx == -1) { // set struct as an object
+				System.arraycopy(nestedFields, 0, rows, 0, childCount);
+			}
+			else { // set struct as a field of Row
+				for (int i = 0; i < childCount; i++) {
+					((Row) rows[i]).setField(fieldIdx, nestedFields[i]);
+				}
+			}
+		}
+		else { // struct in a list
+			int offset = 0;
+			Row[] temp;
+			if (fieldIdx == -1) { // set list of struct as an object
+				for (int i = 0; offset < childCount; i++) {
+					temp = new Row[(int) lengthVector[i]];
+					System.arraycopy(nestedFields, offset, temp, 0, temp.length);
+					offset = offset + temp.length;
+					rows[i] = temp;
+				}
+			}
+			else { // set list of struct as a field of Row
+				for (int i = 0; offset < childCount; i++) {
+					temp = new Row[(int) lengthVector[i]];
+					System.arraycopy(nestedFields, offset, temp, 0, temp.length);
+					offset = offset + temp.length;
+					((Row) rows[i]).setField(fieldIdx, temp);
+				}
+			}
+		}
+	}
+
+	private static void readNonNullListColumn(Object[] rows, int fieldIdx, ListColumnVector list, TypeDescription schema, long[] lengthVector, int childCount) {
+
+		TypeDescription fieldType = schema.getChildren().get(0);
+		if (lengthVector == null) {
+			long[] lengthVectorNested = list.lengths;
+			readField(rows, fieldIdx, fieldType, list.child, lengthVectorNested, list.childCount);
+		}
+		else { // list in a list
+
+			Object[] nestedList = new Object[childCount];
+
+			// length vector for nested list
+			long[] lengthVectorNested = list.lengths;
+
+			// read nested list
+			readField(nestedList, -1, fieldType, list.child, lengthVectorNested, list.childCount);
+
+			// get type of nestedList
+			Class<?> classType = nestedList[0].getClass();
+
+			// fill outer list with nested list
+			int offset = 0;
+			int length;
+			if (fieldIdx == -1) { // set list of list as an object
+				for (int i = 0; offset < childCount; i++) {
+					length = (int) lengthVector[i];
+					Object temp = Array.newInstance(classType, length);
+					System.arraycopy(nestedList, offset, temp, 0, length);
+					offset = offset + length;
+					rows[i] = temp;
+
+				}
+			} else { // set list of list as an field on Row
+				for (int i = 0; offset < childCount; i++) {
+					length = (int) lengthVector[i];
+					Object temp = Array.newInstance(classType, length);
+					System.arraycopy(nestedList, offset, temp, 0, length);
+					offset = offset + length;
+					((Row) rows[i]).setField(fieldIdx, temp);
+				}
+			}
+		}
+
+	}
+
+	private static void readNonNullMapColumn(Object[] rows, int fieldIdx, MapColumnVector map, TypeDescription schema, long[] lengthVector, int childCount) {
+
+		List<TypeDescription> fieldType = schema.getChildren();
+		TypeDescription keyType = fieldType.get(0);
+		TypeDescription valueType = fieldType.get(1);
+
+		ColumnVector keys = map.keys;
+		ColumnVector values = map.values;
+		Object[] keyRows = new Object[map.childCount];
+		Object[] valueRows = new Object[map.childCount];
+
+		// read map kes and values
+		readField(keyRows, -1, keyType, keys, null, keyRows.length);
+		readField(valueRows, -1, valueType, values, null, valueRows.length);
+
+		// check if map is directly in a list or not, e.g, array<map<k,v>>
+		if (lengthVector == null) {
+			long[] lengthVectorMap = map.lengths;
+			int offset = 0;
+			if (fieldIdx == -1) {
+				for (int i = 0; i < childCount; i++) {
+					rows[i] = readHashMap(keyRows, valueRows, offset, lengthVectorMap[i]);
+					offset += lengthVectorMap[i];
+				}
+			} else {
+				for (int i = 0; i < childCount; i++) {
+					((Row) rows[i]).setField(fieldIdx, readHashMap(keyRows, valueRows, offset, lengthVectorMap[i]));
+					offset += lengthVectorMap[i];
+				}
+			}
+		} else { // list of map
+
+			long[] lengthVectorMap = map.lengths;
+			int mapOffset = 0; // offset of map element
+			int offset = 0; // offset of map
+			HashMap[] temp;
+			if (fieldIdx == -1) { // set map list as an object
+				for (int i = 0; offset < childCount; i++) {
+					temp = new HashMap[(int) lengthVector[i]];
+					for (int j = 0; j < temp.length; j++) {
+						temp[j] = readHashMap(keyRows, valueRows, mapOffset, lengthVectorMap[offset]);
+						mapOffset += lengthVectorMap[offset];
+						offset++;
+					}
+					rows[i] = temp;
+				}
+			} else { // set map list as a field of Row
+				for (int i = 0; offset < childCount; i++) {
+					temp = new HashMap[(int) lengthVector[i]];
+					for (int j = 0; j < temp.length; j++) {
+						temp[j] = readHashMap(keyRows, valueRows, mapOffset, lengthVectorMap[offset]);
+						mapOffset += lengthVectorMap[offset];
+						offset++;
+					}
+					((Row) rows[i]).setField(fieldIdx, temp);
+				}
+			}
+		}
+	}
+
+	private static void fillColumnWithRepeatingValue(Object[] rows, int fieldIdx, Object repeatingValue, int childCount) {
+
+		if (fieldIdx == -1) { // set as an object
+			for (int i = 0; i < childCount; i++) {
+				rows[i] = repeatingValue;
+			}
+		} else { // set as a field of Row
+			for (int i = 0; i < childCount; i++) {
+				((Row) rows[i]).setField(fieldIdx, repeatingValue);
+			}
+		}
+	}
+
+	private static void fillListWithRepeatingNull(Object[] rows, int fieldIdx, Class<?> classType, long[] lengthVector, int childCount) {
+
+		int length;
+		if (fieldIdx == -1) {
+			for (int i = 0; i < childCount; i++) {
+				length = (int) lengthVector[i];
+				Object temp = Array.newInstance(classType, length);
+				rows[i] = temp;
+			}
+		} else {
+			for (int i = 0; i < childCount; i++) {
+				length = (int) lengthVector[i];
+				Object temp = Array.newInstance(classType, length);
+				((Row) rows[i]).setField(fieldIdx, temp);
+			}
+		}
+	}
+
+	private static void readBooleanColumn(Object[] rows, int fieldIdx, LongColumnVector vector, long[] lengthVector, int childCount) {
+
+		// check if data type(dt) is directly in list or not, e.g, array<dt>
+		if (lengthVector == null) {
+			if (vector.isRepeating) { // fill complete column with first value
+				// Also column contains null value and it's repeating
+				fillColumnWithRepeatingValue(rows, fieldIdx, null, childCount);
+			} else {
+				boolean[] isNullVector = vector.isNull;
+				if (fieldIdx == -1) { // set as an object
+					for (int i = 0; i < childCount; i++) {
+						if (isNullVector[i]) {
+							rows[i] = null;
+							continue;
+						}
+						rows[i] = vector.vector[i] != 0;
+					}
+				} else { // set as a field of Row
+					for (int i = 0; i < childCount; i++) {
+						if (isNullVector[i]) {
+							((Row) rows[i]).setField(fieldIdx, null);
+							continue;
+						}
+						((Row) rows[i]).setField(fieldIdx, vector.vector[i] != 0);
+					}
+				}
+			}
+		} else { // in a list
+			if (vector.isRepeating) { // // fill complete list with first value
+				// Also column contains null value and it's repeating
+				// so all values are null, but we need to set list with null values
+				fillListWithRepeatingNull(rows, fieldIdx, boolean[].class, lengthVector, childCount);
+			} else {
+				// column contain null values
+				int offset = 0;
+				boolean[] temp;
+				boolean[] isNullVector = vector.isNull;
+				if (fieldIdx == -1) { // set list as an object
+					for (int i = 0; offset < childCount; i++) {
+						temp = new boolean[(int) lengthVector[i]];
+						for (int j = 0; j < temp.length; j++) {
+							if (isNullVector[offset]) {
+								offset++;
+								continue;
+							}
+							temp[j] = vector.vector[offset++] != 0;
+						}
+						rows[i] = temp;
+					}
+				} else { // set list as a field of Row
+					for (int i = 0; offset < childCount; i++) {
+						temp = new boolean[(int) lengthVector[i]];
+						for (int j = 0; j < temp.length; j++) {
+							if (isNullVector[offset]) {
+								offset++;
+								continue;
+							}
+							temp[j] = vector.vector[offset++] != 0;
+						}
+						((Row) rows[i]).setField(fieldIdx, temp);
+					}
+				}
+			}
+		}
+	}
+
+	private static void readByteColumn(Object[] rows, int fieldIdx, LongColumnVector vector, long[] lengthVector, int childCount) {
+
+		// check if data type(dt) is directly in list or not, e.g, array<dt>
+		if (lengthVector == null) {
+			if (vector.isRepeating) { // fill complete column with first value
+				// Also column contains null value and it's repeating
+				fillColumnWithRepeatingValue(rows, fieldIdx, null, childCount);
+			} else {
+				boolean[] isNullVector = vector.isNull;
+				if (fieldIdx == -1) { // set as an object
+					for (int i = 0; i < childCount; i++) {
+						if (isNullVector[i]) {
+							rows[i] = null;
+							continue;
+						}
+						rows[i] = (byte) vector.vector[i];
+					}
+				} else { // set as a field of Row
+					for (int i = 0; i < childCount; i++) {
+						if (isNullVector[i]) {
+							((Row) rows[i]).setField(fieldIdx, null);
+							continue;
+						}
+						((Row) rows[i]).setField(fieldIdx, (byte) vector.vector[i]);
+					}
+				}
+			}
+		} else { // in a list
+			if (vector.isRepeating) { // // fill complete list with first value
+				// Also column contains null value and it's repeating
+				// so all values are null, but we need to set list with null values
+				fillListWithRepeatingNull(rows, fieldIdx, byte[].class, lengthVector, childCount);
+			} else {
+				// column contain null values
+				int offset = 0;
+				byte[] temp;
+				boolean[] isNullVector = vector.isNull;
+				if (fieldIdx == -1) { // set list as an object
+					for (int i = 0; offset < childCount; i++) {
+						temp = new byte[(int) lengthVector[i]];
+						for (int j = 0; j < temp.length; j++) {
+							if (isNullVector[offset]) {
+								offset++;
+								continue;
+							}
+							temp[j] = (byte) vector.vector[offset++];
+						}
+						rows[i] = temp;
+					}
+				} else { // set list as a field of Row
+					for (int i = 0; offset < childCount; i++) {
+						temp = new byte[(int) lengthVector[i]];
+						for (int j = 0; j < temp.length; j++) {
+							if (isNullVector[offset]) {
+								offset++;
+								continue;
+							}
+							temp[j] = (byte) vector.vector[offset++];
+						}
+						((Row) rows[i]).setField(fieldIdx, temp);
+					}
+				}
+			}
+		}
+	}
+
+	private static void readShortColumn(Object[] rows, int fieldIdx, LongColumnVector vector, long[] lengthVector, int childCount) {
+
+		// check if data type(dt) is directly in list or not, e.g, array<dt>
+		if (lengthVector == null) {
+			if (vector.isRepeating) { // fill complete column with first value
+				// Also column contains null value and it's repeating
+				fillColumnWithRepeatingValue(rows, fieldIdx, null, childCount);
+			} else {
+				boolean[] isNullVector = vector.isNull;
+				if (fieldIdx == -1) { // set as an object
+					for (int i = 0; i < childCount; i++) {
+						if (isNullVector[i]) {
+							rows[i] = null;
+							continue;
+						}
+						rows[i] = (short) vector.vector[i];
+					}
+				} else { // set as field of Row
+					for (int i = 0; i < childCount; i++) {
+						if (isNullVector[i]) {
+							((Row) rows[i]).setField(fieldIdx, null);
+							continue;
+						}
+						((Row) rows[i]).setField(fieldIdx, (short) vector.vector[i]);
+					}
+				}
+			}
+		} else { // in a list
+			if (vector.isRepeating) { // // fill complete list with first value
+				// Also column contains null value and it's repeating
+				// so all values are null, but we need to set list with null values
+				fillListWithRepeatingNull(rows, fieldIdx, short[].class, lengthVector, childCount);
+			} else {
+				// column contain null values
+				int offset = 0;
+				short[] temp;
+				boolean[] isNullVector = vector.isNull;
+				if (fieldIdx == -1) { // set list as an object
+					for (int i = 0; offset < childCount; i++) {
+						temp = new short[(int) lengthVector[i]];
+						for (int j = 0; j < temp.length; j++) {
+							if (isNullVector[offset]) {
+								offset++;
+								continue;
+							}
+							temp[j] = (short) vector.vector[offset++];
+						}
+						rows[i] = temp;
+					}
+				} else { // set list as a field of Row
+					for (int i = 0; offset < childCount; i++) {
+						temp = new short[(int) lengthVector[i]];
+						for (int j = 0; j < temp.length; j++) {
+							if (isNullVector[offset]) {
+								offset++;
+								continue;
+							}
+							temp[j] = (short) vector.vector[offset++];
+						}
+						((Row) rows[i]).setField(fieldIdx, temp);
+					}
+				}
+			}
+		}
+	}
+
+	private static void readIntColumn(Object[] rows, int fieldIdx, LongColumnVector vector, long[] lengthVector, int childCount) {
+
+		// check if data type(dt) is directly in list or not, e.g, array<dt>
+		if (lengthVector == null) {
+			if (vector.isRepeating) { // fill complete column with first value
+				// Also column contains null value and it's repeating
+				fillColumnWithRepeatingValue(rows, fieldIdx, null, childCount);
+			} else {
+				boolean[] isNullVector = vector.isNull;
+				if (fieldIdx == -1) { // set as an object
+					for (int i = 0; i < childCount; i++) {
+						if (isNullVector[i]) {
+							rows[i] = null;
+							continue;
+						}
+						rows[i] = (int) vector.vector[i];
+					}
+				} else { // set as a field of Row
+					for (int i = 0; i < childCount; i++) {
+						if (isNullVector[i]) {
+							((Row) rows[i]).setField(fieldIdx, null);
+							continue;
+						}
+						((Row) rows[i]).setField(fieldIdx, (int) vector.vector[i]);
+					}
+				}
+			}
+		} else { // in a list
+			if (vector.isRepeating) { // // fill complete list with first value
+				// Also column contains null value and it's repeating
+				// so all values are null, but we need to set list with null values
+				fillListWithRepeatingNull(rows, fieldIdx, int[].class, lengthVector, childCount);
+			} else {
+				// column contain null values
+				int offset = 0;
+				int[] temp;
+				boolean[] isNullVector = vector.isNull;
+				if (fieldIdx == -1) { // set list as an object
+					for (int i = 0; offset < childCount; i++) {
+						temp = new int[(int) lengthVector[i]];
+						for (int j = 0; j < temp.length; j++) {
+							if (isNullVector[offset]) {
+								offset++;
+								continue;
+							}
+							temp[j] = (int) vector.vector[offset++];
+						}
+						rows[i] = temp;
+					}
+				} else { // set list as a field of Row
+					for (int i = 0; offset < childCount; i++) {
+						temp = new int[(int) lengthVector[i]];
+						for (int j = 0; j < temp.length; j++) {
+							if (isNullVector[offset]) {
+								offset++;
+								continue;
+							}
+							temp[j] = (int) vector.vector[offset++];
+						}
+						((Row) rows[i]).setField(fieldIdx, temp);
+					}
+				}
+			}
+		}
+	}
+
+	private static void readLongColumn(Object[] rows, int fieldIdx, LongColumnVector vector, long[] lengthVector, int childCount) {
+
+		// check if data type(dt) is directly in list or not, e.g, array<dt>
+		if (lengthVector == null) {
+			if (vector.isRepeating) { // fill complete column with first value
+				// Also column contains null value and it's repeating
+				fillColumnWithRepeatingValue(rows, fieldIdx, null, childCount);
+			} else {
+				boolean[] isNullVector = vector.isNull;
+				if (fieldIdx == -1) { // set as an object
+					for (int i = 0; i < childCount; i++) {
+						if (isNullVector[i]) {
+							rows[i] = null;
+							continue;
+						}
+						rows[i] = vector.vector[i];
+					}
+				} else { // set as a field of Row
+					for (int i = 0; i < childCount; i++) {
+						if (isNullVector[i]) {
+							((Row) rows[i]).setField(fieldIdx, null);
+							continue;
+						}
+						((Row) rows[i]).setField(fieldIdx, vector.vector[i]);
+					}
+				}
+			}
+		} else { // in a list
+			if (vector.isRepeating) { // // fill complete list with first value
+				// Also column contains null value and it's repeating
+				// so all values are null, but we need to set list with null values
+				fillListWithRepeatingNull(rows, fieldIdx, long[].class, lengthVector, childCount);
+			} else {
+				// column contain null values
+				int offset = 0;
+				long[] temp;
+				boolean[] isNullVector = vector.isNull;
+				if (fieldIdx == -1) { // set list as an object
+					for (int i = 0; offset < childCount; i++) {
+						temp = new long[(int) lengthVector[i]];
+						for (int j = 0; j < temp.length; j++) {
+							if (isNullVector[offset]) {
+								offset++;
+								continue;
+							}
+							temp[j] = vector.vector[offset++];
+						}
+						rows[i] = temp;
+					}
+				} else { // set list as a field of Row
+					for (int i = 0; offset < childCount; i++) {
+						temp = new long[(int) lengthVector[i]];
+						for (int j = 0; j < temp.length; j++) {
+							if (isNullVector[offset]) {
+								offset++;
+								continue;
+							}
+							temp[j] = vector.vector[offset++];
+						}
+						((Row) rows[i]).setField(fieldIdx, temp);
+					}
+				}
+			}
+		}
+	}
+
+	private static void readFloatColumn(Object[] rows, int fieldIdx, DoubleColumnVector vector, long[] lengthVector, int childCount) {
+
+		// check if data type(dt) is directly in list or not, e.g, array<dt>
+		if (lengthVector == null) {
+			if (vector.isRepeating) { // fill complete column with first value
+				// Also column contains null value and it's repeating
+				fillColumnWithRepeatingValue(rows, fieldIdx, null, childCount);
+			} else {
+				boolean[] isNullVector = vector.isNull;
+				if (fieldIdx == -1) { // set as an object
+					for (int i = 0; i < childCount; i++) {
+						if (isNullVector[i]) {
+							rows[i] = null;
+							continue;
+						}
+						rows[i] = (float) vector.vector[i];
+					}
+				} else { // set as a field of Row
+					for (int i = 0; i < childCount; i++) {
+						if (isNullVector[i]) {
+							((Row) rows[i]).setField(fieldIdx, null);
+							continue;
+						}
+						((Row) rows[i]).setField(fieldIdx, (float) vector.vector[i]);
+					}
+				}
+			}
+		} else { // in a list
+			if (vector.isRepeating) { // // fill complete list with first value
+				// Also column contains null value and it's repeating
+				// so all values are null, but we need to set list with null values
+				fillListWithRepeatingNull(rows, fieldIdx, float[].class, lengthVector, childCount);
+			} else {
+				// column contain null values
+				int offset = 0;
+				float[] temp;
+				boolean[] isNullVector = vector.isNull;
+				if (fieldIdx == -1) { // set list as an object
+					for (int i = 0; offset < childCount; i++) {
+						temp = new float[(int) lengthVector[i]];
+						for (int j = 0; j < temp.length; j++) {
+							if (isNullVector[offset]) {
+								offset++;
+								continue;
+							}
+							temp[j] = (float) vector.vector[offset++];
+						}
+						rows[i] = temp;
+					}
+				} else { // set list as a field of Row
+					for (int i = 0; i < childCount; i++) {
+						temp = new float[(int) lengthVector[i]];
+						for (int j = 0; j < temp.length; j++) {
+							if (isNullVector[offset]) {
+								offset++;
+								continue;
+							}
+							temp[j] = (float) vector.vector[offset++];
+						}
+						((Row) rows[i]).setField(fieldIdx, temp);
+					}
+				}
+			}
+		}
+	}
+
+	private static void readDoubleColumn(Object[] rows, int fieldIdx, DoubleColumnVector vector, long[] lengthVector, int childCount) {
+
+		// check if data type(dt) is directly in list or not, e.g, array<dt>
+		if (lengthVector == null) {
+			if (vector.isRepeating) { // fill complete column with first value
+				// Also column contains null value and it's repeating
+				fillColumnWithRepeatingValue(rows, fieldIdx, null, childCount);
+			} else {
+				boolean[] isNullVector = vector.isNull;
+				if (fieldIdx == -1) { // set as an object
+					for (int i = 0; i < childCount; i++) {
+						if (isNullVector[i]) {
+							rows[i] = null;
+							continue;
+						}
+						rows[i] = vector.vector[i];
+					}
+				} else { // set as field of Row
+					for (int i = 0; i < childCount; i++) {
+						if (isNullVector[i]) {
+							((Row) rows[i]).setField(fieldIdx, null);
+							continue;
+						}
+						((Row) rows[i]).setField(fieldIdx, vector.vector[i]);
+					}
+				}
+			}
+		} else { // in a list
+			if (vector.isRepeating) { // // fill complete list with first value
+				// Also column contains null value and it's repeating
+				// so all values are null, but we need to set list with null values
+				fillListWithRepeatingNull(rows, fieldIdx, double[].class, lengthVector, childCount);
+			} else {
+				// column contain null values
+				int offset = 0;
+				double[] temp;
+				boolean[] isNullVector = vector.isNull;
+				if (fieldIdx == -1) { // set list as an object
+					for (int i = 0; offset < childCount; i++) {
+						temp = new double[(int) lengthVector[i]];
+						for (int j = 0; j < temp.length; j++) {
+							if (isNullVector[offset]) {
+								offset++;
+								continue;
+							}
+							temp[j] = vector.vector[offset++];
+						}
+						rows[i] = temp;
+					}
+				} else { // set list as a field of Row
+					for (int i = 0; offset < childCount; i++) {
+						temp = new double[(int) lengthVector[i]];
+						for (int j = 0; j < temp.length; j++) {
+							if (isNullVector[offset]) {
+								offset++;
+								continue;
+							}
+							temp[j] = vector.vector[offset++];
+						}
+						((Row) rows[i]).setField(fieldIdx, temp);
+					}
+				}
+			}
+		}
+	}
+
+	private static void readStringColumn(Object[] rows, int fieldIdx, BytesColumnVector bytes, long[] lengthVector, int childCount) {
+
+		// check if string is directly in a list or not, e.g, array<string>
+		if (lengthVector == null) {
+			if (bytes.isRepeating) { // fill complete column with first value
+				// Also column contains null value and it's repeating
+				fillColumnWithRepeatingValue(rows, fieldIdx, null, childCount);
+			} else {
+				boolean[] isNullVector = bytes.isNull;
+				if (fieldIdx == -1) { // set as an object
+					for (int i = 0; i < childCount; i++) {
+						if (isNullVector[i]) {
+							rows[i] = null;
+							continue;
+						}
+						rows[i] = new String(bytes.vector[i], bytes.start[i], bytes.length[i]);
+					}
+				} else { // set as a field of Row
+					for (int i = 0; i < childCount; i++) {
+						if (isNullVector[i]) {
+							((Row) rows[i]).setField(fieldIdx, null);
+							continue;
+						}
+						((Row) rows[i]).setField(fieldIdx, new String(bytes.vector[i], bytes.start[i], bytes.length[i]));
+					}
+				}
+			}
+		} else { // in a list
+			if (bytes.isRepeating) { // fill list with first value
+				// Also column contains null value and it's repeating
+				// so all values are null, but we need to set list with null values
+				fillListWithRepeatingNull(rows, fieldIdx, String[].class, lengthVector, childCount);
+			} else {
+				int offset = 0;
+				String[] temp;
+				boolean[] isNullVector = bytes.isNull;
+				if (fieldIdx == -1) { // set list as an object
+					for (int i = 0; offset < childCount; i++) {
+						temp = new String[(int) lengthVector[i]];
+						for (int j = 0; j < temp.length; j++) {
+							if (isNullVector[offset]) {
+								offset++;
+								temp[j] = null;
+								continue; // skip null value
+							}
+							temp[j] = new String(bytes.vector[offset], bytes.start[offset], bytes.length[offset]);
+							offset++;
+						}
+						rows[i] = temp;
+					}
+				} else { // set list as a field
+					for (int i = 0; offset < childCount; i++) {
+						temp = new String[(int) lengthVector[i]];
+						for (int j = 0; j < temp.length; j++) {
+							if (isNullVector[offset]) {
+								offset++;
+								temp[j] = null;
+								continue; // skip null value
+							}
+							temp[j] = new String(bytes.vector[offset], bytes.start[offset], bytes.length[offset]);
+							offset++;
+						}
+						((Row) rows[i]).setField(fieldIdx, temp);
+					}
+				}
+			}
+		}
+
+	}
+
+	private static void readDateColumn(Object[] rows, int fieldIdx, LongColumnVector vector, long[] lengthVector, int childCount) {
+
+		// check if date is directly in a list or not, e.g, array<date>
+		if (lengthVector == null) {
+			if (vector.isRepeating) { // fill complete column with first value
+				// Also column contains null value and it's repeating
+				fillColumnWithRepeatingValue(rows, fieldIdx, null, childCount);
+			} else {
+				boolean[] isNullVector = vector.isNull;
+				if (fieldIdx == -1) { // set as an object
+					for (int i = 0; i < childCount; i++) {
+						if (isNullVector[i]) {
+							rows[i] = null;
+							continue;
+						}
+						rows[i] = readDate(vector.vector[i]);
+					}
+				} else { // set as a field of Row
+					for (int i = 0; i < childCount; i++) {
+						if (isNullVector[i]) {
+							((Row) rows[i]).setField(fieldIdx, null);
+							continue;
+						}
+						((Row) rows[i]).setField(fieldIdx, readDate(vector.vector[i]));
+					}
+				}
+			}
+		} else {
+			if (vector.isRepeating) { // fill complete list with first value
+				// Also column contains null value and it's repeating
+				// so all values are null, but we need to set list with null values
+				fillListWithRepeatingNull(rows, fieldIdx, Date[].class, lengthVector, childCount);
+			} else {
+				int offset = 0;
+				Date[] temp;
+				boolean[] isNullVector = vector.isNull;
+				if (fieldIdx == -1) { // set list as an object
+					for (int i = 0; offset < childCount; i++) {
+						temp = new Date[(int) lengthVector[i]];
+						for (int j = 0; j < temp.length; j++) {
+							if (isNullVector[offset]) {
+								offset++;
+								temp[j] = null;
+								continue;
+							}
+							temp[j] = readDate(vector.vector[offset++]);
+						}
+						rows[i] = temp;
+					}
+				} else { // set list as a field of Row
+					for (int i = 0; offset < childCount; i++) {
+						temp = new Date[(int) lengthVector[i]];
+						for (int j = 0; j < temp.length; j++) {
+							if (isNullVector[offset]) {
+								offset++;
+								temp[j] = null;
+								continue;
+							}
+							temp[j] = readDate(vector.vector[offset++]);
+						}
+						((Row) rows[i]).setField(fieldIdx, temp);
+					}
+				}
+			}
+		}
+
+	}
+
+	private static void readTimestampColumn(Object[] rows, int fieldIdx, TimestampColumnVector vector, long[] lengthVector, int childCount) {
+
+		// check if timestamp is directly in a list or not, e.g, array<timestamp>
+		if (lengthVector == null) {
+			if (vector.isRepeating) { // fill complete column with first value
+				// Also column contains null value and it's repeating
+				fillColumnWithRepeatingValue(rows, fieldIdx, null, childCount);
+			} else {
+				boolean[] isNullVector = vector.isNull;
+				if (fieldIdx == -1) { // set as an object
+					for (int i = 0; i < childCount; i++) {
+						if (isNullVector[i]) {
+							rows[i] = null;
+							continue;
+						}
+						Timestamp ts = new Timestamp(vector.time[i]);
+						ts.setNanos(vector.nanos[i]);
+						rows[i] = ts;
+					}
+				} else { // set as a field of Row
+					for (int i = 0; i < childCount; i++) {
+						if (isNullVector[i]) {
+							((Row) rows[i]).setField(fieldIdx, null);
+							continue;
+						}
+						Timestamp ts = new Timestamp(vector.time[i]);
+						ts.setNanos(vector.nanos[i]);
+						((Row) rows[i]).setField(fieldIdx, ts);
+					}
+				}
+			}
+		}
+		else {
+			if (vector.isRepeating) { // fill complete list with first value
+				// Also column contains null value and it's repeating
+				// so all values are null, but we need to set list with null values
+				fillListWithRepeatingNull(rows, fieldIdx, Timestamp[].class, lengthVector, childCount);
+			} else {
+				int offset = 0;
+				Timestamp[] temp;
+				boolean[] isNullVector = vector.isNull;
+				if (fieldIdx == -1) { // set list as an object
+					for (int i = 0; offset < childCount; i++) {
+						temp = new Timestamp[(int) lengthVector[i]];
+						for (int j = 0; j < temp.length; j++) {
+							if (isNullVector[offset]) {
+								offset++;
+								temp[j] = null;
+								continue;
+							}
+							temp[j] = new Timestamp(vector.time[offset]);
+							temp[j].setNanos(vector.nanos[offset]);
+							offset++;
+						}
+						rows[i] = temp;
+					}
+				} else { // set list as a field of Row
+					for (int i = 0; offset < childCount; i++) {
+						temp = new Timestamp[(int) lengthVector[i]];
+						for (int j = 0; j < temp.length; j++) {
+							if (isNullVector[offset]) {
+								offset++;
+								temp[j] = null;
+								continue;
+							}
+							temp[j] = new Timestamp(vector.time[offset]);
+							temp[j].setNanos(vector.nanos[offset]);
+							offset++;
+						}
+						((Row) rows[i]).setField(fieldIdx, temp);
+					}
+				}
+			}
+		}
+	}
+
+	private static void readBinaryColumn(Object[] rows, int fieldIdx, BytesColumnVector bytes, long[] lengthVector, int childCount) {
+
+		// check if string is directly in a list or not, e.g, array<string>
+		if (lengthVector == null) {
+			if (bytes.isRepeating) { // fill complete column with first value
+				// Also column contains null value and it's repeating
+				fillColumnWithRepeatingValue(rows, fieldIdx, null, childCount);
+			} else {
+				boolean[] isNullVectorIndex = bytes.isNull;
+				if (fieldIdx == -1) { // set as an object
+					for (int i = 0; i < childCount; i++) {
+						if (isNullVectorIndex[i]) {
+							rows[i] = null;
+							continue;
+						}
+						rows[i] = readBinary(bytes.vector[i], bytes.start[i], bytes.length[i]);
+					}
+				} else { // set as a field of Row
+					for (int i = 0; i < childCount; i++) {
+						if (isNullVectorIndex[i]) {
+							((Row) rows[i]).setField(fieldIdx, null);
+							continue;
+						}
+						((Row) rows[i]).setField(fieldIdx, readBinary(bytes.vector[i], bytes.start[i], bytes.length[i]));
+					}
+				}
+			}
+		} else {
+			if (bytes.isRepeating) { // fill complete list with first value
+				// Also column contains null value and it's repeating
+				// so all values are null, but we need to set list with null values
+				fillListWithRepeatingNull(rows, fieldIdx, byte[][].class, lengthVector, childCount);
+			} else {
+				int offset = 0;
+				byte[][] temp;
+				boolean[] isNullVector = bytes.isNull;
+				if (fieldIdx == -1) { // set list as an object
+					for (int i = 0; offset < childCount; i++) {
+						temp = new byte[(int) lengthVector[i]][];
+						for (int j = 0; j < temp.length; j++) {
+							if (isNullVector[offset]) {
+								offset++;
+								temp[j] = null;
+								continue;
+							}
+							temp[j] = readBinary(bytes.vector[offset], bytes.start[offset], bytes.length[offset]);
+							offset++;
+						}
+						rows[i] = temp;
+					}
+				} else { // set list as a field
+					for (int i = 0; offset < childCount; i++) {
+						temp = new byte[(int) lengthVector[i]][];
+						for (int j = 0; j < temp.length; j++) {
+							if (isNullVector[offset]) {
+								offset++;
+								temp[j] = null;
+								continue;
+							}
+							temp[j] = readBinary(bytes.vector[offset], bytes.start[offset], bytes.length[offset]);
+							offset++;
+						}
+						((Row) rows[i]).setField(fieldIdx, temp);
+					}
+				}
+			}
+		}
+	}
+
+	private static void readDecimalColumn(Object[] rows, int fieldIdx, DecimalColumnVector vector, long[] lengthVector, int childCount) {
+
+		// check if decimal is directly in a list or not, e.g, array<decimal>
+		if (lengthVector == null) {
+			if (vector.isRepeating) { // fill complete column with first value
+				// Also column contains null value and it's repeating
+				fillColumnWithRepeatingValue(rows, fieldIdx, null, childCount);
+			} else {
+				boolean[] isNullVector = vector.isNull;
+				if (fieldIdx == -1) { // set as an object
+					for (int i = 0; i < childCount; i++) {
+						if (isNullVector[i]) {
+							rows[i] = null;
+							continue;
+						}
+						rows[i] = readBigDecimal(vector.vector[i]);
+					}
+				} else { // set as a field of Row
+					for (int i = 0; i < childCount; i++) {
+						if (isNullVector[i]) {
+							((Row) rows[i]).setField(fieldIdx, null);
+							continue;
+						}
+						((Row) rows[i]).setField(fieldIdx, readBigDecimal(vector.vector[i]));
+					}
+				}
+			}
+		} else {
+			if (vector.isRepeating) { // fill complete list with first value
+				// Also column contains null value and it's repeating
+				// so all values are null, but we need to set list with null values
+				fillListWithRepeatingNull(rows, fieldIdx, BigDecimal[].class, lengthVector, childCount);
+			} else {
+				int offset = 0;
+				BigDecimal[] temp;
+				boolean[] isNullVector = vector.isNull;
+				if (fieldIdx == -1) { // set list as an object
+					for (int i = 0; offset < childCount; i++) {
+						temp = new BigDecimal[(int) lengthVector[i]];
+						for (int j = 0; j < temp.length; j++) {
+							if (isNullVector[offset]) {
+								offset++;
+								temp[j] = null;
+								continue;
+							}
+							temp[j] = readBigDecimal(vector.vector[offset++]);
+						}
+						rows[i] = temp;
+					}
+				} else { // set list as a field of Row
+					for (int i = 0; offset < childCount; i++) {
+						temp = new BigDecimal[(int) lengthVector[i]];
+						for (int j = 0; j < temp.length; j++) {
+							if (isNullVector[offset]) {
+								offset++;
+								temp[j] = null;
+								continue;
+							}
+							temp[j] = readBigDecimal(vector.vector[offset++]);
+						}
+						((Row) rows[i]).setField(fieldIdx, temp);
+					}
+				}
+			}
+		}
+	}
+
+	private static void readStructColumn(Object[] rows, int fieldIdx, StructColumnVector struct, TypeDescription schema, long[] lengthVector, int childCount) {
+
+		List<TypeDescription> childrenTypes = schema.getChildren();
+
+		int numChildren = childrenTypes.size();
+		Row[] nestedFields = new Row[childCount];
+		for (int i = 0; i < childCount; i++) {
+			nestedFields[i] = new Row(numChildren);
+		}
+		for (int i = 0; i < numChildren; i++) {
+			readField(nestedFields, i, childrenTypes.get(i), struct.fields[i], null, childCount);
+		}
+
+		boolean[] isNullVector = struct.isNull;
+
+		// check if struct is directly in a list or not, e.g, array<struct<dt>>
+		if (lengthVector == null) {
+			if (fieldIdx == -1) { // set struct as an object
+				for (int i = 0; i < childCount; i++) {
+					if (isNullVector[i]) {
+						rows[i] = null;
+						continue;
+					}
+					rows[i] = nestedFields[i];
+				}
+			} else { // set struct as a field of Row
+				for (int i = 0; i < childCount; i++) {
+					if (isNullVector[i]) {
+						((Row) rows[i]).setField(fieldIdx, null);
+						continue;
+					}
+					((Row) rows[i]).setField(fieldIdx, nestedFields[i]);
+				}
+			}
+		} else { // struct in a list
+			int offset = 0;
+			Row[] temp;
+			if (fieldIdx == -1) { // set list of struct as an object
+				for (int i = 0; offset < childCount; i++) {
+					temp = new Row[(int) lengthVector[i]];
+					for (int j = 0; j < temp.length; j++) {
+						if (isNullVector[offset]) {
+							temp[j] = null;
+							continue;
+						}
+						temp[j] = nestedFields[offset++];
+					}
+					rows[i] = temp;
+				}
+			}
+			else { // set list of struct as a field of Row
+				for (int i = 0; offset < childCount; i++) {
+					temp = new Row[(int) lengthVector[i]];
+					for (int j = 0; j < temp.length; j++) {
+						if (isNullVector[offset]) {
+							temp[j] = null;
+							continue;
+						}
+						temp[j] = nestedFields[offset++];
+					}
+					((Row) rows[i]).setField(fieldIdx, temp);
+				}
+			}
+		}
+	}
+
+	private static void readListColumn(Object[] rows, int fieldIdx, ListColumnVector list, TypeDescription schema, long[] lengthVector, int childCount) {
+
+		TypeDescription fieldType = schema.getChildren().get(0);
+		if (lengthVector == null) {
+			long[] lengthVectorNested = list.lengths;
+			readField(rows, fieldIdx, fieldType, list.child, lengthVectorNested, list.childCount);
+		}
+		else { // list in a list
+
+			Object[] nestedList = new Object[childCount];
+
+			// length vector for nested list
+			long[] lengthVectorNested = list.lengths;
+
+			// read nested list
+			readField(nestedList, -1, fieldType, list.child, lengthVectorNested, list.childCount);
+
+			// get type of nestedList
+			Class<?> classType = nestedList[0].getClass();
+
+			// fill outer list with nested list
+			int offset = 0;
+			int length;
+			if (fieldIdx == -1) { // set list of list as an object
+				for (int i = 0; offset < childCount; i++) {
+					length = (int) lengthVector[i];
+					Object temp = Array.newInstance(classType, length);
+					System.arraycopy(nestedList, offset, temp, 0, length);
+					offset = offset + length;
+					rows[i] = temp;
+
+				}
+			} else { // set list of list as an field on Row
+				for (int i = 0; offset < childCount; i++) {
+					length = (int) lengthVector[i];
+					Object temp = Array.newInstance(classType, length);
+					System.arraycopy(nestedList, offset, temp, 0, length);
+					offset = offset + length;
+					((Row) rows[i]).setField(fieldIdx, temp);
+				}
+			}
+		}
+	}
+
+	private static void readMapColumn(Object[] rows, int fieldIdx, MapColumnVector map, TypeDescription schema, long[] lengthVector, int childCount) {
+
+		List<TypeDescription> fieldType = schema.getChildren();
+		TypeDescription keyType = fieldType.get(0);
+		TypeDescription valueType = fieldType.get(1);
+
+		ColumnVector keys = map.keys;
+		ColumnVector values = map.values;
+		Object[] keyRows = new Object[map.childCount];
+		Object[] valueRows = new Object[map.childCount];
+
+		// read map kes and values
+		readField(keyRows, -1, keyType, keys, null, keyRows.length);
+		readField(valueRows, -1, valueType, values, null, valueRows.length);
+
+		boolean[] isNullVector = map.isNull;
+
+		// check if map is directly in a list or not, e.g, array<map<k,v>>
+		if (lengthVector == null) {
+			long[] lengthVectorMap = map.lengths;
+			int offset = 0;
+			if (fieldIdx == -1) { // set map as an object
+				for (int i = 0; i < childCount; i++) {
+					if (isNullVector[i]) {
+						rows[i] = null;
+						continue;
+					}
+					rows[i] = readHashMap(keyRows, valueRows, offset, lengthVectorMap[i]);
+					offset += lengthVectorMap[i];
+				}
+			} else { // set map as a field of Row
+				for (int i = 0; i < childCount; i++) {
+					if (isNullVector[i]) {
+						((Row) rows[i]).setField(fieldIdx, null);
+						continue;
+					}
+					((Row) rows[i]).setField(fieldIdx, readHashMap(keyRows, valueRows, offset, lengthVectorMap[i]));
+					offset += lengthVectorMap[i];
+				}
+			}
+		} else { // list of map
+			long[] lengthVectorMap = map.lengths;
+			int mapOffset = 0; // offset of map element
+			int offset = 0; // offset of map
+			HashMap[] temp;
+			if (fieldIdx == -1) { // set map list as an object
+				for (int i = 0; offset < childCount; i++) {
+					temp = new HashMap[(int) lengthVector[i]];
+					for (int j = 0; j < temp.length; j++) {
+						if (isNullVector[offset]) {
+							temp[j] = null;
+							continue;
+						}
+						temp[j] = readHashMap(keyRows, valueRows, mapOffset, lengthVectorMap[offset]);
+						mapOffset += lengthVectorMap[offset];
+						offset++;
+					}
+					rows[i] = temp;
+				}
+			} else { // set map list as a field of Row
+				for (int i = 0; offset < childCount; i++) {
+					temp = new HashMap[(int) lengthVector[i]];
+					for (int j = 0; j < temp.length; j++) {
+						if (isNullVector[offset]) {
+							temp[j] = null;
+							continue;
+						}
+						temp[j] = readHashMap(keyRows, valueRows, mapOffset, lengthVectorMap[offset]);
+						mapOffset += lengthVectorMap[offset];
+						offset++;
+					}
+					((Row) rows[i]).setField(fieldIdx, temp);
+				}
+			}
+		}
+	}
+
+	private static BigDecimal readBigDecimal(HiveDecimalWritable hiveDecimalWritable) {
+		HiveDecimal hiveDecimal = hiveDecimalWritable.getHiveDecimal();
+		return hiveDecimal.bigDecimalValue();
+	}
+
+	private static byte[] readBinary(byte[] src, int srcPos, int length) {
+		byte[] result = new byte[length];
+		System.arraycopy(src, srcPos, result, 0, length);
+		return result;
+	}
+
+	private static Timestamp readTimeStamp(long time, int nanos) {
+		Timestamp ts = new Timestamp(time);
+		ts.setNanos(nanos);
+		return ts;
+	}
+
+	private static Date readDate(long days) {
+		// day to milliseconds
+		return new Date(days * 24 * 60 * 60 * 1000);
+	}
+
+	private static HashMap readHashMap(Object[] keyRows, Object[] valueRows, int offset, long length) {
+
+		HashMap<Object, Object> resultMap = new HashMap<>();
+		for (int j = 0; j < length; j++) {
+			resultMap.put(keyRows[offset], valueRows[offset]);
+			offset++;
+		}
+		return resultMap;
+	}
+
+}