[FFmpeg-devel,v3] fate: add api-h264-slice test

Submitted by joshdk@ob-encoder.com on Oct. 9, 2018, 12:07 p.m.

Details

Message ID 20181009120715.27917-1-joshdk@obe.tv
State New
Headers show

Commit Message

joshdk@ob-encoder.com Oct. 9, 2018, 12:07 p.m.
From: Josh de Kock <joshdk@obe.tv>

This test ensures that you are able to send N number of slice NALUs in slice threaded mode to be decoded simultaneously
---

 Tested with `./configure --cc='cc -m32'` now, seems to be fine. Will send sample to Michael on IRC.

 tests/api/Makefile              |   1 +
 tests/api/api-h264-slice-test.c | 212 ++++++++++++++++++++++
 tests/fate/api.mak              |   4 +
 tests/ref/fate/api-h264-slice   | 309 ++++++++++++++++++++++++++++++++
 4 files changed, 526 insertions(+)
 create mode 100644 tests/api/api-h264-slice-test.c
 create mode 100644 tests/ref/fate/api-h264-slice

Patch hide | download patch | download mbox

diff --git a/tests/api/Makefile b/tests/api/Makefile
index 759dd9d243..b5c4ccae23 100644
--- a/tests/api/Makefile
+++ b/tests/api/Makefile
@@ -1,5 +1,6 @@ 
 APITESTPROGS-$(call ENCDEC, FLAC, FLAC) += api-flac
 APITESTPROGS-$(call DEMDEC, H264, H264) += api-h264
+APITESTPROGS-$(call DEMDEC, H264, H264) += api-h264-slice
 APITESTPROGS-yes += api-seek
 APITESTPROGS-yes += api-codec-param
 APITESTPROGS-$(call DEMDEC, H263, H263) += api-band
diff --git a/tests/api/api-h264-slice-test.c b/tests/api/api-h264-slice-test.c
new file mode 100644
index 0000000000..114561f3aa
--- /dev/null
+++ b/tests/api/api-h264-slice-test.c
@@ -0,0 +1,212 @@ 
+/*
+ * Copyright (c) 2001 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#define MAX_SLICES 8
+
+// ./fate 2 ./crew_cif out.y4m
+
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#include <libavcodec/avcodec.h>
+#include <libavutil/pixdesc.h>
+#include <libavutil/hash.h>
+
+static int header = 0;
+static FILE *ofd;
+
+static void decode(AVCodecContext *dec_ctx, AVFrame *frame,
+           AVPacket *pkt)
+{
+    static uint64_t frame_cnt = 0;
+    int ret;
+
+    ret = avcodec_send_packet(dec_ctx, pkt);
+    if (ret < 0) {
+        fprintf(stderr, "Error sending a packet for decoding: %s\n", av_err2str(ret));
+        exit(1);
+    }
+
+    while (ret >= 0) {
+        const AVPixFmtDescriptor *desc;
+        char *sum;
+        struct AVHashContext *hash;
+
+        ret = avcodec_receive_frame(dec_ctx, frame);
+        if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) {
+            return;
+        } else if (ret < 0) {
+            fprintf(stderr, "Error during decoding: %s\n", av_err2str(ret));
+            exit(1);
+        }
+
+        if (!header) {
+            printf(
+            "#format: frame checksums\n"
+            "#version: 2\n"
+            "#hash: MD5\n"
+            "#tb 0: 1/30\n"
+            "#media_type 0: video\n"
+            "#codec_id 0: rawvideo\n"
+            "#dimensions 0: 352x288\n"
+            "#sar 0: 128/117\n"
+            "#stream#, dts,        pts, duration,     size, hash\n");
+            header = 1;
+        }
+        desc = av_pix_fmt_desc_get(dec_ctx->pix_fmt);
+        av_hash_alloc(&hash, "md5");
+        av_hash_init(hash);
+        sum = av_mallocz(av_hash_get_size(hash) * 2 + 1);
+
+        for (int i = 0; i < frame->height; i++)
+            av_hash_update(hash, &frame->data[0][i * frame->linesize[0]], frame->width);
+        for (int i = 0; i < frame->height >> desc->log2_chroma_h; i++)
+            av_hash_update(hash, &frame->data[1][i * frame->linesize[1]], frame->width >> desc->log2_chroma_w);
+        for (int i = 0; i < frame->height >> desc->log2_chroma_h; i++)
+            av_hash_update(hash, &frame->data[2][i * frame->linesize[2]], frame->width >> desc->log2_chroma_w);
+
+        av_hash_final_hex(hash, sum, av_hash_get_size(hash) * 2 + 1);
+        printf("0, %10"PRId64", %10"PRId64",        1, %8d, %s\n",
+            frame_cnt, frame_cnt,
+            (frame->width * frame->height + 2 * (frame->height >> desc->log2_chroma_h) * (frame->width >> desc->log2_chroma_w)), sum); 
+        frame_cnt += 1;
+        av_free(hash);
+        av_free(sum);
+    }
+}
+
+int main(int argc, char **argv)
+{
+    const AVCodec *codec;
+    AVCodecContext *c = NULL;
+    AVFrame *frame;
+    unsigned int threads;
+    AVPacket *pkt;
+    int fd = 0;
+    char nal[MAX_SLICES * UINT16_MAX + AV_INPUT_BUFFER_PADDING_SIZE];
+    int nals = 0;
+    char *p = nal;
+
+    if (argc < 4) {
+        fprintf(stderr, "Usage: %s <threads> <input file> <output file>\n", argv[0]);
+        exit(0);
+    }
+
+    if (!(threads = strtoul(argv[1], NULL, 0)))
+        threads = 1;
+    else if (threads > MAX_SLICES)
+        threads = MAX_SLICES;
+
+    if ((ofd = fopen(argv[3], "w")) < 0) {
+        perror("open out");
+        exit(1);
+    }
+
+    if (!(pkt = av_packet_alloc()))
+        exit(1);
+
+    if (!(codec = avcodec_find_decoder(AV_CODEC_ID_H264))) {
+        fprintf(stderr, "Codec not found\n");
+        exit(1);
+    }
+
+    if (!(c = avcodec_alloc_context3(codec))) {
+        fprintf(stderr, "Could not allocate video codec context\n");
+        exit(1);
+    }
+
+    c->width  = 352;
+    c->height = 288;
+
+    c->flags2 |= AV_CODEC_FLAG2_CHUNKS;
+    c->thread_type = FF_THREAD_SLICE;
+    c->thread_count = threads;
+
+    if (avcodec_open2(c, codec, NULL) < 0) {
+        fprintf(stderr, "Could not open codec\n");
+        exit(1);
+    }
+
+    if (c->active_thread_type != FF_THREAD_SLICE) {
+        fprintf(stderr, "Couldn't activate slice threading: %d\n", c->active_thread_type);
+        exit(1);
+    }
+
+    if (!(frame = av_frame_alloc())) {
+        fprintf(stderr, "Could not allocate video frame\n");
+        exit(1);
+    }
+
+    if ((fd = open(argv[2], O_RDONLY)) < 0) {
+        fprintf(stderr, "Couldn't open NALU file: %s\n", argv[2]);
+        exit(1);
+    }
+
+    while(1) {
+        uint16_t size = 0;
+        ssize_t ret = read(fd, &size, sizeof(uint16_t));
+        if (ret < 0) {
+            perror("Couldn't read size");
+            exit(1);
+        } else if (ret != sizeof(uint16_t))
+            break;
+
+        ret = read(fd, p, size);
+        if (ret < 0 || ret != size) {
+            perror("Couldn't read size");
+            exit(1);
+        }
+        p += ret;
+
+        if (++nals >= threads) {
+            pkt->data = nal;
+            pkt->size = p - nal;
+            decode(c, frame, pkt);
+            memset(nal, 0, MAX_SLICES * UINT16_MAX + AV_INPUT_BUFFER_PADDING_SIZE);
+            nals = 0;
+            p = nal;
+        }
+    }
+
+    if (nals) {
+        pkt->data = nal;
+        pkt->size = p - nal;
+        decode(c, frame, pkt);
+    }
+
+    decode(c, frame, NULL);
+
+    close(fd);
+    fclose(ofd);
+    avcodec_free_context(&c);
+    av_frame_free(&frame);
+    av_packet_free(&pkt);
+
+    return 0;
+}
diff --git a/tests/fate/api.mak b/tests/fate/api.mak
index eb656e68a3..132c38f2c2 100644
--- a/tests/fate/api.mak
+++ b/tests/fate/api.mak
@@ -12,6 +12,10 @@  FATE_API_SAMPLES_LIBAVFORMAT-$(call DEMDEC, H264, H264) += fate-api-h264
 fate-api-h264: $(APITESTSDIR)/api-h264-test$(EXESUF)
 fate-api-h264: CMD = run $(APITESTSDIR)/api-h264-test $(TARGET_SAMPLES)/h264-conformance/SVA_NL2_E.264
 
+FATE_API_SAMPLES_LIBAVFORMAT-$(call DEMDEC, H264, H264) += fate-api-h264-slice
+fate-api-h264-slice: $(APITESTSDIR)/api-h264-slice-test$(EXESUF)
+fate-api-h264-slice: CMD = run $(APITESTSDIR)/api-h264-slice-test 2 $(TARGET_SAMPLES)/h264/crew_cif.nal api-h264-slice.h264
+
 FATE_API_LIBAVFORMAT-$(call DEMDEC, FLV, FLV) += fate-api-seek
 fate-api-seek: $(APITESTSDIR)/api-seek-test$(EXESUF) fate-lavf-flv_fmt
 fate-api-seek: CMD = run $(APITESTSDIR)/api-seek-test $(TARGET_PATH)/tests/data/lavf/lavf.flv 0 720
diff --git a/tests/ref/fate/api-h264-slice b/tests/ref/fate/api-h264-slice
new file mode 100644
index 0000000000..1d463d30ac
--- /dev/null
+++ b/tests/ref/fate/api-h264-slice
@@ -0,0 +1,309 @@ 
+#format: frame checksums
+#version: 2
+#hash: MD5
+#tb 0: 1/30
+#media_type 0: video
+#codec_id 0: rawvideo
+#dimensions 0: 352x288
+#sar 0: 128/117
+#stream#, dts,        pts, duration,     size, hash
+0,          0,          0,        1,   152064, 28a2f99d62b553403fcffc1f680d5403
+0,          1,          1,        1,   152064, cd95f40841e08160ace0d64506f8adbf
+0,          2,          2,        1,   152064, 32f37a1b3ddc2b8b0f6283f0c403a976
+0,          3,          3,        1,   152064, 643c0b0702072038578ef5ae2000c1a0
+0,          4,          4,        1,   152064, 8d9c9660705f7533e7f49f11693aedf9
+0,          5,          5,        1,   152064, 66a794f8a116c055451091e0e4cd911e
+0,          6,          6,        1,   152064, 8ad529648796ae6da279de0b7ca34f72
+0,          7,          7,        1,   152064, 898ad4170eb740d713de254eb4bfe255
+0,          8,          8,        1,   152064, f96cfc1f00df10003e144529a5fae6c6
+0,          9,          9,        1,   152064, 0351a3b68dc87ba5963624e1461788da
+0,         10,         10,        1,   152064, 6718e4086a0039584bcc37dcd4be6a67
+0,         11,         11,        1,   152064, fb4fec78d9434b9579b31f8ad0472762
+0,         12,         12,        1,   152064, ec2dcc547d84e15383dcee8462bb9d0c
+0,         13,         13,        1,   152064, ea62711bf59b4d1d56cb9dbcb68a8eda
+0,         14,         14,        1,   152064, 75b1cb899a9d9e695106f187c20b91f8
+0,         15,         15,        1,   152064, 44a13e4235c2ed3692af5ef698efe4d3
+0,         16,         16,        1,   152064, 6d5f1249d96573782fa95e9228d1ad0a
+0,         17,         17,        1,   152064, fce8503dd9472fc7932ffbe21425d45a
+0,         18,         18,        1,   152064, e93489a6b4c38d611493a3721aa994d7
+0,         19,         19,        1,   152064, 04580677a663ddba1b747c2ab0d598e6
+0,         20,         20,        1,   152064, a28cceb666c92eaecc3da3e092b83715
+0,         21,         21,        1,   152064, ba9ce0f84fb16c27453666265ad54e35
+0,         22,         22,        1,   152064, 946e014822ab2b45c52d3e08e7db97c2
+0,         23,         23,        1,   152064, b7a40ebb6ac72b322ccfca2568fa521a
+0,         24,         24,        1,   152064, cb5a0564af00a00496950ad705a160ce
+0,         25,         25,        1,   152064, dbad9e8e79c04b1df497884ec28e3a59
+0,         26,         26,        1,   152064, 3c748cdc0e6ec79ca72482e22f0c3ef8
+0,         27,         27,        1,   152064, 1740911da2ebbdc729cbbea0df466c44
+0,         28,         28,        1,   152064, 3b322e03fcc16d6a0dea651634ce0b40
+0,         29,         29,        1,   152064, a7fca405425015b85cb58ec1aece575b
+0,         30,         30,        1,   152064, 2004eec0c923f1855b4b918e6dcb5e02
+0,         31,         31,        1,   152064, 20542f58f1622f58f3cbf4b2bf0b772f
+0,         32,         32,        1,   152064, 8872f5cb900ed8d317f3abe50a147934
+0,         33,         33,        1,   152064, 774ba43dc0cd7932099e3e0633e25721
+0,         34,         34,        1,   152064, 4f2d9b7e6d115bd103ccd9945f85582f
+0,         35,         35,        1,   152064, f53542ca7f6d5ec462770ffff3f4bfd0
+0,         36,         36,        1,   152064, 43b5f8c4e6dc3dc1acc903687bc90293
+0,         37,         37,        1,   152064, aa7d265ab285ded777a970debe6a08d5
+0,         38,         38,        1,   152064, 818ae082b3dd9557e04710d7cfd700be
+0,         39,         39,        1,   152064, 44cfe472ccedf8a44d0b90c97932caae
+0,         40,         40,        1,   152064, 5d2756c81c90bb10484e2e892fce0e0c
+0,         41,         41,        1,   152064, c1b254a4b66dc9d769e10316976f5538
+0,         42,         42,        1,   152064, 03808a3f7b01293dbe6089b33e3dc103
+0,         43,         43,        1,   152064, 8c689a6143a8a89415d2e645bb0fe925
+0,         44,         44,        1,   152064, 24268cac7d78eefd8e247ec599e60b4f
+0,         45,         45,        1,   152064, ac3195c57a3ebe3871992acfc3182e2f
+0,         46,         46,        1,   152064, 8730a99fb5a2573475f61d4e7998ba44
+0,         47,         47,        1,   152064, 651042c34273096db82879fcdd91310d
+0,         48,         48,        1,   152064, 972b47241098a9b6471ba6c8ccc2b83b
+0,         49,         49,        1,   152064, e8e53022355e6bf7ac50d53bcb1bdc92
+0,         50,         50,        1,   152064, e5b003b04a88e0d60d446eb5b600cc66
+0,         51,         51,        1,   152064, 1c2317c071a33b0b465bbcea04411ddf
+0,         52,         52,        1,   152064, 7bd53f4e852370aaeb6b0d042d24b94a
+0,         53,         53,        1,   152064, 6ef30966b0d9c0d92b2350e2f45197a8
+0,         54,         54,        1,   152064, 354e2afff0d056193d6c4c2667c638d3
+0,         55,         55,        1,   152064, e67767e97f44c3ef80ea4acee41af0ff
+0,         56,         56,        1,   152064, 32589395bf7d07c1c6df644d43b5bbba
+0,         57,         57,        1,   152064, 2f2b56210b87142fa3620cce5c56af02
+0,         58,         58,        1,   152064, 599781773ace555c82ac591cc2acf8ec
+0,         59,         59,        1,   152064, 2465cf6313dab6bda9171993ff6168de
+0,         60,         60,        1,   152064, 54cc6c8a9b3fd95b9700d319c4a69297
+0,         61,         61,        1,   152064, 9e813429ebf7ee4e11fcd4976974fea0
+0,         62,         62,        1,   152064, fac0303897b4d1bd1a202fe0a7d1c6f7
+0,         63,         63,        1,   152064, accb382b99f2d27cefbc9f7ea315f80c
+0,         64,         64,        1,   152064, b88711feaee9f7f84da34028b7e2cc81
+0,         65,         65,        1,   152064, 80549aebdcc5629dfc3bee8112536bac
+0,         66,         66,        1,   152064, 9c63aa480b5d9937d839b809ba67eee2
+0,         67,         67,        1,   152064, 5e5a729c45a995ba2a97083fca69c9e9
+0,         68,         68,        1,   152064, 6b59c5d4460d78fa337b94b080e72215
+0,         69,         69,        1,   152064, 166d675f774f4f74dbce7e2728afd16c
+0,         70,         70,        1,   152064, 3051629ff9281ea8879bce0ed62c1e71
+0,         71,         71,        1,   152064, c2ff4493434ca4fea45c724c10bcbe55
+0,         72,         72,        1,   152064, 907274f16ebeb7c09de8bc124c1fe586
+0,         73,         73,        1,   152064, 88efefc9fc00d88fbce20f4d74a55d25
+0,         74,         74,        1,   152064, 357bdbcb828c088b748022df9e47b9c7
+0,         75,         75,        1,   152064, 4550087923c1d4195ab536899a99d429
+0,         76,         76,        1,   152064, 2b07777d9109577eaedc87321dd3ff69
+0,         77,         77,        1,   152064, 4a377c552c62cba06d5285aa8478a540
+0,         78,         78,        1,   152064, a0e893c028e106c2394f0578f00ae88a
+0,         79,         79,        1,   152064, c0db0e2ee3768d2e4e71581a2be30707
+0,         80,         80,        1,   152064, 954e0cd38b00ea2181b8c322511536f0
+0,         81,         81,        1,   152064, 53ff687670a2490ac3f94405014251b8
+0,         82,         82,        1,   152064, 64a588b7adbc560ec4ad6823c37e41c6
+0,         83,         83,        1,   152064, 60d65e899976214cd3b2b5abb10f2b83
+0,         84,         84,        1,   152064, 1bf0efef4b204a72d05b21c18a569585
+0,         85,         85,        1,   152064, 65d814be6b698ab1185f082c9c9d7de3
+0,         86,         86,        1,   152064, de26e7e663aaeb642e0a94776c5bf22c
+0,         87,         87,        1,   152064, f7b0b259ccf21e59fcacd95945a013c3
+0,         88,         88,        1,   152064, 7f3185bb4dc3368733bd29c9aa9e08eb
+0,         89,         89,        1,   152064, 3cedc14798d145fcdc8b8a3082de3b88
+0,         90,         90,        1,   152064, c5792622ca4a04d21e1f2c2b2ff692fe
+0,         91,         91,        1,   152064, d13199fa94e53643902a8a26e33c9862
+0,         92,         92,        1,   152064, b380359e836896d7698a8dadfe6d6fdc
+0,         93,         93,        1,   152064, 4c7c5f1f093f7bcaddf06068b9b1d2e5
+0,         94,         94,        1,   152064, 73f33e1eedea9aa5e6c3f2b636dd2c23
+0,         95,         95,        1,   152064, f0d2aad6477ace945f87b25cb44f3ff0
+0,         96,         96,        1,   152064, d90bddd7c2279bbd0266a26915202712
+0,         97,         97,        1,   152064, 0b377a48dea8fc2702395796808af63f
+0,         98,         98,        1,   152064, ea0099179e806a9680f019446e39d125
+0,         99,         99,        1,   152064, a77dd3069c54b255e45b261f31be80d2
+0,        100,        100,        1,   152064, d362dcbe415329e713ff6ef9e6447d87
+0,        101,        101,        1,   152064, 15441bcb307ac24766ceba8db42f9413
+0,        102,        102,        1,   152064, 79b953e72d11d3fa6d6974e4b8b13392
+0,        103,        103,        1,   152064, ec8c35c829fac56ca8ae2f0160ae5d7f
+0,        104,        104,        1,   152064, c104f8f1d17629b0449f4a2af2e40f73
+0,        105,        105,        1,   152064, 4661c4b3c2b1a03a8e23e7e88e974f22
+0,        106,        106,        1,   152064, 7cb48bae9841f67294b2e25a73d46a8e
+0,        107,        107,        1,   152064, bddcb2c64a4257760f50714ec8c49243
+0,        108,        108,        1,   152064, c2123750802357c25c352f09bd1b1de2
+0,        109,        109,        1,   152064, 6eb5af4f3ad69cc88e0c08f6aa9bb034
+0,        110,        110,        1,   152064, 063991a633a051d6889f0fff41059e5f
+0,        111,        111,        1,   152064, fa736839a01ad04fe08d437c7fa60a2d
+0,        112,        112,        1,   152064, 85a43397c5a1defe15b61464c8d1457a
+0,        113,        113,        1,   152064, da50c437613be59486012b69c7953f63
+0,        114,        114,        1,   152064, eb32e24757a98192928324d3a389a3dc
+0,        115,        115,        1,   152064, 1bf511fb8245e3be71ebefdcf506575d
+0,        116,        116,        1,   152064, 4479c195c4cd4111afe561a07c0f626d
+0,        117,        117,        1,   152064, 0b1815f0c28bb55aae515a5dc3a34f3b
+0,        118,        118,        1,   152064, 300d3c32442bd554384b3c804dd519ad
+0,        119,        119,        1,   152064, 197df868e0488b8b12c0b42d8c4b2aec
+0,        120,        120,        1,   152064, 03bce34c3214e0144a0928b9b9acc8e8
+0,        121,        121,        1,   152064, ba73a879b8fca5db4a354075b26ccb6a
+0,        122,        122,        1,   152064, b1c34c6d2535bf1e7af3a6936d1627df
+0,        123,        123,        1,   152064, 77d162995974428c5c7766ee5627eac1
+0,        124,        124,        1,   152064, fa4c70aa68850bcae2579046557c0b5f
+0,        125,        125,        1,   152064, 63ce618e67f380000030c97db78ac4ae
+0,        126,        126,        1,   152064, 7e32538d501127faf058792e83fbbe43
+0,        127,        127,        1,   152064, 61bc1d685553a97a7c3b0cbb3790faad
+0,        128,        128,        1,   152064, 57f3b97e4a80ded30b9e8f12cfc8ff44
+0,        129,        129,        1,   152064, 31db51a64307ca6f1db866a01befa301
+0,        130,        130,        1,   152064, 59924d342068caf1ad7329b947279e2d
+0,        131,        131,        1,   152064, 2f0f9dd3056cac40c17684bcccdf267d
+0,        132,        132,        1,   152064, b00df17142f99bdc077cb2e4c5c8b747
+0,        133,        133,        1,   152064, e7c40734dea5433038b975666be7b21e
+0,        134,        134,        1,   152064, 51d77965d3a9d431a2c409244c9bc465
+0,        135,        135,        1,   152064, 15b54bdc5e2098fe7c01ce689babe08b
+0,        136,        136,        1,   152064, 3fa3284ae3f714ea197ad614bff7c5c5
+0,        137,        137,        1,   152064, c6512a19b7b1b29c05c7b825b41ab930
+0,        138,        138,        1,   152064, b13c8bc436186d47595dc69186f1f927
+0,        139,        139,        1,   152064, d5eff490784883a93dd3aaea08c46d5b
+0,        140,        140,        1,   152064, a005ac77851ea3a44e261d9067ee835f
+0,        141,        141,        1,   152064, 6706b74dc10c72f27e9f6341710e56ac
+0,        142,        142,        1,   152064, 46479f86f53f55d2094354eb9bed78df
+0,        143,        143,        1,   152064, 17f5cd040eb766ece29d1c1e283e9c20
+0,        144,        144,        1,   152064, 4f34c43eeeac2c751aac486ba42d9b9a
+0,        145,        145,        1,   152064, 24c16b9d01c316305686af1a12f7be49
+0,        146,        146,        1,   152064, 9ae9b1f109fa3d02f226fefdaf395be6
+0,        147,        147,        1,   152064, eb98c1c6e473d8b53069206ffc69a9cb
+0,        148,        148,        1,   152064, f0768d9cb981d277b70d1b3b928f4915
+0,        149,        149,        1,   152064, c1a5cef2bdb3f3b932a051c29d31f889
+0,        150,        150,        1,   152064, 8f75fb3a6f994b90999f8b0c664ad7c4
+0,        151,        151,        1,   152064, 3a778c9c86afaf03f2e60668d849e25b
+0,        152,        152,        1,   152064, 4c3dd11965a2cf55790088a99289981a
+0,        153,        153,        1,   152064, 763f810845e6f4e798a6edb6633f5506
+0,        154,        154,        1,   152064, 6b305b9d79151c1644c924d522091eea
+0,        155,        155,        1,   152064, e981ce0e01f24eca2e89c7c81480fb07
+0,        156,        156,        1,   152064, 91349f36d44383dc1cd72f0a3f9c76ed
+0,        157,        157,        1,   152064, 9a67f029ed2370983ff3e24d8c2c65d2
+0,        158,        158,        1,   152064, cf5717cb593fbafad6abf8bdb7ca2737
+0,        159,        159,        1,   152064, 7ece8c2497ca72e4f8e9eb69048391f8
+0,        160,        160,        1,   152064, 9dccce22ca32a7ec8890f77e4de1fa42
+0,        161,        161,        1,   152064, f418dc75e266c47ba84275741f0635cb
+0,        162,        162,        1,   152064, aeddab213baab78ed0c44abb7409e291
+0,        163,        163,        1,   152064, a0b5e3c0616105580a310529ed71d072
+0,        164,        164,        1,   152064, e0e96da8724b472868634b6b145ebb2e
+0,        165,        165,        1,   152064, bdaaf9623f5d329c8706e4850db0beea
+0,        166,        166,        1,   152064, 6566ddd82da9096458e039caa7d56674
+0,        167,        167,        1,   152064, b882cb5f1c6059d338273e8fdb18e41e
+0,        168,        168,        1,   152064, f9723e59ce02828e64c16d32216441b2
+0,        169,        169,        1,   152064, 98b5a843bf125eeae0240bde40016d6a
+0,        170,        170,        1,   152064, 8958b81f8a028928c4b9a7024a4eebff
+0,        171,        171,        1,   152064, 25a8acfdd14a472a8090d41626472070
+0,        172,        172,        1,   152064, 6faf859c0b264b6d76e0823c6045cebd
+0,        173,        173,        1,   152064, 0774a3470360c37ede375d19aebe1844
+0,        174,        174,        1,   152064, 5dd921d4f05976fb6bbf5cc6996254e0
+0,        175,        175,        1,   152064, d03d789e3c439420a07e3e919ddd1cf0
+0,        176,        176,        1,   152064, 1fad139023f7d7022f8f65a6e31f68a9
+0,        177,        177,        1,   152064, 0c706070d649da054eeaf686d2e14a1d
+0,        178,        178,        1,   152064, 51e4156b19bdc55e993d1956473827e3
+0,        179,        179,        1,   152064, e447458fd86c022852cedf56dc58f34f
+0,        180,        180,        1,   152064, 59732caeb824f052044b4434ef564227
+0,        181,        181,        1,   152064, cf5ccf671ddc89e1f430878afb86fced
+0,        182,        182,        1,   152064, e3e98f92e4cf8f0ccce27482407ebbf1
+0,        183,        183,        1,   152064, 089d236d04d1918b319524e3002d21c8
+0,        184,        184,        1,   152064, 7063afc35aa2c24b1e3dc781bb612af1
+0,        185,        185,        1,   152064, 902e5153028215ac60bf0f998673e3ca
+0,        186,        186,        1,   152064, 2360fb2ed2b0e7c37a318fb7f9df7550
+0,        187,        187,        1,   152064, be0788a6a06906f57f7ad1e0e4c0aba7
+0,        188,        188,        1,   152064, db90ee89bbeefcd54b79f022ed9d62d9
+0,        189,        189,        1,   152064, 7237b5c1e6f182805d4e324e636f2a45
+0,        190,        190,        1,   152064, e5da5c0643e457087f54935cfa50f7c0
+0,        191,        191,        1,   152064, 89b5d462accdc4cfaed1e57de4589f39
+0,        192,        192,        1,   152064, b670710e2f897f20d83c42bcd0ee7d85
+0,        193,        193,        1,   152064, 9c7ceba12895f2a670e4a1498d28951c
+0,        194,        194,        1,   152064, 4b426b0719a67bc228e1928e83b47b53
+0,        195,        195,        1,   152064, b2c646cd4d3b100619fd6e626ea8b3cb
+0,        196,        196,        1,   152064, ad9abc825e1b87ec0defb1df032364e6
+0,        197,        197,        1,   152064, 21423e23c708f43a9d615bc2bc700d97
+0,        198,        198,        1,   152064, 14a42211968cd4b8416ebc0285eb02b3
+0,        199,        199,        1,   152064, a45eb0c4f6a9c5beeb90a292be71461e
+0,        200,        200,        1,   152064, f9bfba991f0a0ea6bbfdde5d23bd8785
+0,        201,        201,        1,   152064, 49d33752288ddef86dc702652f688c75
+0,        202,        202,        1,   152064, 97b50290b4a1e2f31c704cc302fe89d8
+0,        203,        203,        1,   152064, c3006dcc89d2f45379c840c7dd5f7559
+0,        204,        204,        1,   152064, 4a861c22e63478ffe73571909da9a15f
+0,        205,        205,        1,   152064, e7a8bff496059d3cd40470920fb26c75
+0,        206,        206,        1,   152064, 989d818e0d7d8eea14da209c37ad3e0b
+0,        207,        207,        1,   152064, 1732c746805ca221c85fb5570911378d
+0,        208,        208,        1,   152064, 60ece5f795f5756bef34ba84fb6fec2a
+0,        209,        209,        1,   152064, 9fd355648ef40dd0e15c81554b111637
+0,        210,        210,        1,   152064, 2a3b9220b98ea648e395ab9ea12023d2
+0,        211,        211,        1,   152064, eea2a06e68196917ba2a754563953cd5
+0,        212,        212,        1,   152064, 3c2ec831a9802a968654df1bee81ca40
+0,        213,        213,        1,   152064, 590abeedce1cfa9df8a00d7ab9cf2c8e
+0,        214,        214,        1,   152064, bc07f89391568a78854f99ad9fd62c49
+0,        215,        215,        1,   152064, 0bd866450376be96a85690595d96d909
+0,        216,        216,        1,   152064, 33483531a4d760bdc30a77d5de49aff7
+0,        217,        217,        1,   152064, b0294c6e784fa3f15532331063c5036f
+0,        218,        218,        1,   152064, f4f3ba2781b2a9be3c2dd5b4c445e0d9
+0,        219,        219,        1,   152064, 8550626512e0602a1c53bfb8c51427d8
+0,        220,        220,        1,   152064, 0c2d0229196825910e5f487c33b45ef3
+0,        221,        221,        1,   152064, 93dbbed468f0012b921aa0b2b6751a70
+0,        222,        222,        1,   152064, 2f0d99dc6d4b5c65bc18946b1e6cdc4c
+0,        223,        223,        1,   152064, fb25cbe655fc050bbcbfe9cc3fa06ffe
+0,        224,        224,        1,   152064, 376d3f894957b3bac2308f2662ad5c82
+0,        225,        225,        1,   152064, 46b5c54ea38987b9e3d371a64d06300d
+0,        226,        226,        1,   152064, 9bd24bc1a94aed633ff63aac5b720269
+0,        227,        227,        1,   152064, df0bb3f7724048f67c4a60a1dbb3d5e6
+0,        228,        228,        1,   152064, a9d1c8b8007ea61c0ab2f97b3cfc2aea
+0,        229,        229,        1,   152064, fd5a4ccab51773b09edca30e665999e8
+0,        230,        230,        1,   152064, 0eaf8218244c9b2e78660cf923755557
+0,        231,        231,        1,   152064, 40f4fc64016fd148b14aea2da7652125
+0,        232,        232,        1,   152064, 6f075b312e9f7e1b4c3343441a9e1f7f
+0,        233,        233,        1,   152064, 93f7523632abfe91fa701208aafdc29a
+0,        234,        234,        1,   152064, 3c3ea7aa12a89df2309b76c22053b0ff
+0,        235,        235,        1,   152064, 2181a1aec4278efa70dec025878d88c0
+0,        236,        236,        1,   152064, 35dffda6543fdf43ad182484564abda8
+0,        237,        237,        1,   152064, bf2b65551a8fcf3b1b4185e0ebfca2a7
+0,        238,        238,        1,   152064, 49fd2dd18ddbb7f005c3705910bff99f
+0,        239,        239,        1,   152064, 9f6826599ebd45a1159e46d293fc8f7b
+0,        240,        240,        1,   152064, 5b88b8ec1da51a165e2741f8a6b710ad
+0,        241,        241,        1,   152064, a81229c0d464cc8d376f8b0153b50fc2
+0,        242,        242,        1,   152064, 07ef482c1c9967700a6cef5cdd010384
+0,        243,        243,        1,   152064, d4ebe4de6e096f7cccd5ae2be856e983
+0,        244,        244,        1,   152064, 6daf25ffb2c2baf02e483e84733fc37b
+0,        245,        245,        1,   152064, d52f485c747e945bfe34aeeaaec4fe78
+0,        246,        246,        1,   152064, 408e5b502af7a10454af6f388e2722be
+0,        247,        247,        1,   152064, 684d285dc9c08791ce16e02a1f65e22b
+0,        248,        248,        1,   152064, 5de9b8f8678c6b7a1ff04f217ef8c0c3
+0,        249,        249,        1,   152064, b60f9e37dcfc3924adcfc96d08fb2656
+0,        250,        250,        1,   152064, 8975d551bb7c01cb520b5694e73d1809
+0,        251,        251,        1,   152064, af55f9897a3fa51eacdcebf3a21f5fe5
+0,        252,        252,        1,   152064, 10c21c5167cba09ce54f361e88e6e3c9
+0,        253,        253,        1,   152064, 8cb92c4a8d32fe00a92c5bd4a163cc45
+0,        254,        254,        1,   152064, 3d39fd1222c8421f0eed3c8249c3d772
+0,        255,        255,        1,   152064, 43c5629af47dc4fd659bffe481e84999
+0,        256,        256,        1,   152064, ad6d5a0f4d2d2738809b7f610f6da823
+0,        257,        257,        1,   152064, d2f0dbca68098d58468e94b84ef0fb8b
+0,        258,        258,        1,   152064, 247487ae60500313df92dd0175ac4e0f
+0,        259,        259,        1,   152064, cfbbabb4b8c93c87c221f76a155bb0fc
+0,        260,        260,        1,   152064, c708254a644abc41788d717dd59b8baf
+0,        261,        261,        1,   152064, fa710d87bddd1a65970c5618a8a0158f
+0,        262,        262,        1,   152064, 31210937c8a67c6aafda2e03226b9770
+0,        263,        263,        1,   152064, ac518a56fc537de251f3d28d380e25cb
+0,        264,        264,        1,   152064, afcb7642c336bcef9b605a40e518d305
+0,        265,        265,        1,   152064, 15fd29e16aaebae6f74e49455631c1f8
+0,        266,        266,        1,   152064, 938b90999b05595e9875c6d4f9836407
+0,        267,        267,        1,   152064, 2fe744b939902a5f4bb69e9243c55d08
+0,        268,        268,        1,   152064, a902057edac1638a1cd218fe5b88bfc2
+0,        269,        269,        1,   152064, 78087115b9600b5499866c127d175c0f
+0,        270,        270,        1,   152064, 877c729e2d2b599dd6cac1f59f12e068
+0,        271,        271,        1,   152064, 77e6b4b761902fbe27fb0ff9eb6d02ac
+0,        272,        272,        1,   152064, dd3ee373cb4935eca46947aedda3b991
+0,        273,        273,        1,   152064, b3ee6b4a18f6d20f9b9fd8dc9e8af90e
+0,        274,        274,        1,   152064, 492afb7421667468fa95017c693ec47b
+0,        275,        275,        1,   152064, 9abb912d8101de895b8f482c199934c2
+0,        276,        276,        1,   152064, 08ca372dfb5e90382f1b58345a0e51b1
+0,        277,        277,        1,   152064, 805559cb3f3385e7865df692336dba29
+0,        278,        278,        1,   152064, c5cc85e4d44010e048fd2013535d7180
+0,        279,        279,        1,   152064, ef9a05a7a4e0b5beff9a8119af44ebc7
+0,        280,        280,        1,   152064, e6983be0a0c1705cfede1e7476aad381
+0,        281,        281,        1,   152064, a4bb0c3d4deb17784b07d3713db05302
+0,        282,        282,        1,   152064, 0fd5bb9259e8c27aba7670b08cd9a26b
+0,        283,        283,        1,   152064, 43d6df9fd672b13e2c59db924e9fe30b
+0,        284,        284,        1,   152064, 3aaf3b87705c46495c9d1b9f4ea706bf
+0,        285,        285,        1,   152064, 0d2ba631f5c716d9c5e5b2a75d3b6433
+0,        286,        286,        1,   152064, bf29cc016dce85e621aaa7647fae1544
+0,        287,        287,        1,   152064, 3374284a808d79e9be32bf3610b0fd17
+0,        288,        288,        1,   152064, ea3f305e76009f3bf2cd5014d339eafa
+0,        289,        289,        1,   152064, 95ce7320a841a71b5a8871cef385ce41
+0,        290,        290,        1,   152064, 88613d96dbda681edab4ed41c3f08536
+0,        291,        291,        1,   152064, b9e9e9045b91c4f7917274088de64a5e
+0,        292,        292,        1,   152064, e0b90055449e7403289a8dda9c02add0
+0,        293,        293,        1,   152064, 367ee1603fa7778dad3e99be8db779ee
+0,        294,        294,        1,   152064, 6bb0eaa6140d673b452eee6ac6c262c2
+0,        295,        295,        1,   152064, 9af4ef919ae61e1597db1b9acd6af95a
+0,        296,        296,        1,   152064, e8f29872e86e54ac26b5fb0a20f10d3e
+0,        297,        297,        1,   152064, 09aaad95cd7d173bfe609b79440cbfc8
+0,        298,        298,        1,   152064, c03abe502be10f76e33d93e1c40cc674
+0,        299,        299,        1,   152064, 3e7e315be8aef281714a63f4cf086085