[PATCH] Pageinspect - add functions on GIN and GiST indexes from gevel
Hi all,
the following patch transfers functionality from gevel module
(http://www.sai.msu.su/~megera/wiki/Gevel) which provides functions for
analyzing GIN and GiST indexes to pageinspect. Gevel was originally
designed by Oleg Bartunov, and Teodor Sigaev for developers of GiST and
GIN indexes.
Functions added:
- gist_stat(text) - shows statistics on GiST Tree
- gist_tree(text) - shows GiST tree
- gist_tree(text, int4) - shows GiST tree up to MAXLEVEL
- gist_print(text) - prints objects stored in GiST tree
- spgist_stat(text) - shows statistics on SP-GiST
- spgist_print(text) - prints objects stored in index
- gin_value_count() - originally gin_stat(text) - prints estimated counts
for index values
- gin_stats() - originally gin_statpage(text) - shows statistics
- gin_count_estimate(text, tsquery) - shows number of indexed rows matched
query
Tests also transferred, docs for new functions are added. I run pgindent
over the code, but the result is different from those I expected, so I leave
pgindented one.
The patch is applicable to the commit
866f4a7c210857aa342bf901558d170325094dde.
--
Alexey Chernyshov
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company
Attachments:
0001-gevel_to_pageinspect-v1.patchtext/x-patch; name=0001-gevel_to_pageinspect-v1.patchDownload
From 31b8f699e94863012441574239576c852ea8a8a7 Mon Sep 17 00:00:00 2001
From: Alexey Chernyshov <a.chernyshov@postgrespro.ru>
Date: Fri, 21 Jul 2017 10:46:32 +0300
Subject: [PATCH] adds gevel functionality to pageinspect
---
contrib/pageinspect/Makefile | 15 +-
contrib/pageinspect/brinfuncs.c | 4 +-
contrib/pageinspect/data/rect.data | 3378 ++++++++++++
contrib/pageinspect/data/test__int.data | 7000 +++++++++++++++++++++++++
contrib/pageinspect/expected/gin.out | 317 ++
contrib/pageinspect/expected/gist.out | 18 +
contrib/pageinspect/expected/spgist.out | 120 +
contrib/pageinspect/ginfuncs.c | 589 ++-
contrib/pageinspect/gistfuncs.c | 509 ++
contrib/pageinspect/hashfuncs.c | 2 +-
contrib/pageinspect/pageinspect--1.6--1.7.sql | 57 +
contrib/pageinspect/pageinspect.control | 2 +-
contrib/pageinspect/spgistfuncs.c | 439 ++
contrib/pageinspect/sql/gin.sql | 12 +
contrib/pageinspect/sql/gist.sql | 6 +
contrib/pageinspect/sql/spgist.sql | 11 +
doc/src/sgml/pageinspect.sgml | 390 ++
17 files changed, 12843 insertions(+), 26 deletions(-)
create mode 100644 contrib/pageinspect/data/rect.data
create mode 100644 contrib/pageinspect/data/test__int.data
create mode 100644 contrib/pageinspect/expected/gist.out
create mode 100644 contrib/pageinspect/expected/spgist.out
create mode 100644 contrib/pageinspect/gistfuncs.c
create mode 100644 contrib/pageinspect/pageinspect--1.6--1.7.sql
create mode 100644 contrib/pageinspect/spgistfuncs.c
create mode 100644 contrib/pageinspect/sql/gist.sql
create mode 100644 contrib/pageinspect/sql/spgist.sql
diff --git a/contrib/pageinspect/Makefile b/contrib/pageinspect/Makefile
index 0a3cbee..f468d14 100644
--- a/contrib/pageinspect/Makefile
+++ b/contrib/pageinspect/Makefile
@@ -1,17 +1,18 @@
# contrib/pageinspect/Makefile
MODULE_big = pageinspect
-OBJS = rawpage.o heapfuncs.o btreefuncs.o fsmfuncs.o \
- brinfuncs.o ginfuncs.o hashfuncs.o $(WIN32RES)
+OBJS = rawpage.o heapfuncs.o btreefuncs.o fsmfuncs.o brinfuncs.o \
+ ginfuncs.o hashfuncs.o gistfuncs.o spgistfuncs.o $(WIN32RES)
EXTENSION = pageinspect
-DATA = pageinspect--1.5.sql pageinspect--1.5--1.6.sql \
- pageinspect--1.4--1.5.sql pageinspect--1.3--1.4.sql \
- pageinspect--1.2--1.3.sql pageinspect--1.1--1.2.sql \
- pageinspect--1.0--1.1.sql pageinspect--unpackaged--1.0.sql
+DATA = pageinspect--1.5.sql pageinspect--1.6--1.7.sql \
+ pageinspect--1.5--1.6.sql pageinspect--1.4--1.5.sql \
+ pageinspect--1.3--1.4.sql pageinspect--1.2--1.3.sql \
+ pageinspect--1.1--1.2.sql pageinspect--1.0--1.1.sql \
+ pageinspect--unpackaged--1.0.sql
PGFILEDESC = "pageinspect - functions to inspect contents of database pages"
-REGRESS = page btree brin gin hash
+REGRESS = page btree brin gin hash gist spgist
ifdef USE_PGXS
PG_CONFIG = pg_config
diff --git a/contrib/pageinspect/brinfuncs.c b/contrib/pageinspect/brinfuncs.c
index 13da761..5eb4b25 100644
--- a/contrib/pageinspect/brinfuncs.c
+++ b/contrib/pageinspect/brinfuncs.c
@@ -11,21 +11,21 @@
#include "pageinspect.h"
-#include "access/htup_details.h"
#include "access/brin.h"
#include "access/brin_internal.h"
#include "access/brin_page.h"
#include "access/brin_revmap.h"
#include "access/brin_tuple.h"
+#include "access/htup_details.h"
#include "catalog/index.h"
#include "catalog/pg_type.h"
#include "funcapi.h"
#include "lib/stringinfo.h"
+#include "miscadmin.h"
#include "utils/array.h"
#include "utils/builtins.h"
#include "utils/lsyscache.h"
#include "utils/rel.h"
-#include "miscadmin.h"
PG_FUNCTION_INFO_V1(brin_page_type);
diff --git a/contrib/pageinspect/data/rect.data b/contrib/pageinspect/data/rect.data
new file mode 100644
index 0000000..e32b6fe
--- /dev/null
+++ b/contrib/pageinspect/data/rect.data
@@ -0,0 +1,3378 @@
+(12699,9028,12654,8987)
+(22689,4680,22614,4626)
+(43263,47296,43217,47217)
+(6184,8397,6182,8379)
+(863,28537,788,28456)
+(33783,4733,33746,4693)
+(40456,47134,40426,47087)
+(45950,8153,45887,8060)
+(33433,36474,33399,36460)
+(41106,22017,41086,21962)
+(19214,36781,19179,36767)
+(11582,40823,11498,40737)
+(35565,5404,35546,5360)
+(26489,17387,26405,17356)
+(30874,13849,30796,13814)
+(38255,1619,38227,1593)
+(4445,32006,4405,31914)
+(3923,32921,3876,32913)
+(36054,39464,36032,39434)
+(46540,6780,46524,6758)
+(12184,45811,12118,45787)
+(13198,17090,13143,17051)
+(30939,44578,30865,44486)
+(12502,4939,12431,4902)
+(3250,1108,3169,1063)
+(34029,41240,33976,41180)
+(47057,44018,46967,43927)
+(699,10114,686,10058)
+(5925,26020,5845,25979)
+(9462,39388,9382,39388)
+(270,32616,226,32607)
+(3959,49145,3861,49115)
+(207,40886,179,40879)
+(48480,43312,48412,43233)
+(37183,37209,37161,37110)
+(13576,13505,13521,13487)
+(5877,1037,5818,1036)
+(6777,16694,6776,16692)
+(49362,13905,49299,13845)
+(29356,14606,29313,14562)
+(5492,6976,5441,6971)
+(288,49588,204,49571)
+(36698,37213,36682,37158)
+(718,41336,645,41272)
+(8725,23369,8660,23333)
+(40115,9894,40025,9818)
+(40051,41181,40015,41153)
+(5739,1740,5715,1731)
+(25120,27935,25054,27876)
+(27475,46084,27447,46003)
+\N
+(33197,3252,33161,3245)
+(10892,15691,10869,15662)
+(39012,44712,38995,44640)
+(4506,6484,4458,6459)
+(13970,26316,13964,26236)
+(28009,28104,27968,28030)
+(5991,27613,5906,27607)
+(23649,6338,23610,6314)
+(25942,10008,25911,9928)
+(25651,29943,25590,29906)
+\N
+(24555,40334,24546,40330)
+(46870,43762,46789,43709)
+\N
+(20030,2752,19945,2687)
+(30758,26754,30718,26678)
+\N
+(4320,44673,4286,44625)
+\N
+(1011,15576,939,15574)
+(41936,40699,41854,40655)
+(20594,19002,20561,18995)
+(9388,41056,9325,41042)
+(34771,46693,34751,46645)
+(49398,46359,49332,46357)
+\N
+(23115,35380,23036,35306)
+(46305,34840,46283,34765)
+(16768,21692,16691,21647)
+(28695,3128,28654,3112)
+(22182,7107,22107,7074)
+(14567,1210,14468,1139)
+(14156,37139,14136,37119)
+(33500,38351,33477,38286)
+(39983,41981,39944,41954)
+(26773,20824,26719,20813)
+(42516,22947,42460,22932)
+(26127,10701,26044,10650)
+(17808,13803,17724,13710)
+(14913,49873,14849,49836)
+(37013,820,36955,736)
+(39071,1399,39022,1381)
+\N
+(9785,42546,9687,42540)
+(13423,14066,13354,14052)
+(3417,14558,3336,14478)
+(25212,46368,25128,46316)
+(10124,39848,10027,39820)
+(39722,39226,39656,39162)
+(6298,28101,6250,28076)
+(45852,5846,45809,5750)
+(48292,4885,48290,4841)
+(18905,4454,18894,4424)
+(18965,43474,18902,43444)
+(39843,28239,39761,28199)
+(18087,44660,18019,44632)
+(33886,10382,33794,10286)
+(38383,13163,38362,13092)
+(18861,25050,18842,24965)
+(29887,14326,29806,14274)
+(18733,11644,18698,11644)
+(5119,37952,5089,37950)
+(16191,34884,16149,34864)
+(29544,1104,29496,1062)
+(27740,41555,27701,41540)
+(4672,4087,4633,4060)
+(45441,38994,45377,38958)
+(3272,1176,3232,1146)
+(12820,26606,12790,26575)
+(30910,7590,30877,7512)
+(42476,39152,42377,39127)
+(6562,38490,6542,38447)
+(30046,20332,29988,20259)
+(40723,15950,40671,15949)
+(4945,46857,4908,46817)
+(47986,16882,47963,16877)
+(9842,22339,9805,22305)
+(29831,23169,29818,23122)
+(12322,34404,12250,34312)
+(22846,11091,22759,10992)
+(47627,2424,47603,2397)
+(18375,43632,18347,43577)
+(40441,974,40394,965)
+(34260,10573,34194,10522)
+(32914,9549,32828,9503)
+(49023,37827,48978,37799)
+(22183,10691,22111,10669)
+\N
+(38036,15828,38014,15759)
+(34604,16801,34508,16746)
+(26737,29997,26675,29976)
+(47375,40298,47293,40210)
+(771,2661,732,2649)
+(28514,25659,28504,25577)
+(13438,46494,13376,46455)
+(7187,17877,7125,17786)
+(49957,43390,49897,43384)
+(26543,20067,26482,20057)
+(16416,29803,16385,29724)
+(36353,7484,36286,7414)
+(26498,3377,26415,3358)
+(28990,32205,28936,32193)
+(45005,3842,45001,3816)
+(21672,23566,21603,23566)
+(33360,43465,33302,43429)
+\N
+(29884,9544,29838,9520)
+\N
+(5599,15012,5596,14930)
+(22396,21481,22344,21422)
+(24810,14955,24780,14887)
+(47114,18866,47081,18784)
+(39013,39245,38953,39237)
+(12863,40534,12803,40529)
+(351,37068,310,37019)
+\N
+(12916,34327,12891,34240)
+\N
+(49191,2694,49170,2628)
+(24127,38407,24050,38325)
+(3264,23053,3213,23007)
+(8172,30385,8144,30336)
+(19630,35716,19573,35640)
+(42554,5148,42521,5117)
+(42168,33453,42136,33426)
+(17732,32093,17666,32057)
+(1039,16626,1037,16587)
+(21287,7757,21265,7679)
+(47063,8260,47039,8225)
+(38645,16238,38561,16204)
+(18258,25358,18196,25341)
+(30458,1742,30458,1695)
+(35147,9273,35121,9233)
+(7670,16625,7642,16545)
+(49503,23432,49484,23383)
+(31089,23146,31062,23093)
+(47758,2734,47670,2703)
+\N
+(35276,1027,35259,972)
+(26337,17603,26313,17579)
+(35649,16777,35626,16777)
+(42454,5105,42362,5101)
+(21682,24951,21646,24920)
+\N
+(48383,25174,48303,25156)
+(14672,3532,14601,3460)
+(22570,22587,22515,22512)
+(23566,25623,23484,25573)
+(9530,24542,9504,24459)
+(41271,451,41236,401)
+(5556,37528,5502,37527)
+(12479,25042,12447,24991)
+(16568,22916,16499,22864)
+(42700,13084,42676,12992)
+\N
+(35523,40973,35504,40932)
+(32948,16962,32857,16901)
+(7808,13469,7712,13469)
+(13920,35203,13870,35131)
+(22731,31563,22658,31557)
+\N
+(22909,43956,22900,43857)
+(33077,35080,33074,35030)
+(48064,29307,48022,29280)
+(20232,46682,20212,46613)
+(29949,16790,29867,16711)
+(30260,32029,30180,31979)
+(17184,34503,17110,34482)
+(16066,42687,16039,42648)
+(2947,19819,2857,19788)
+(4900,47934,4818,47894)
+(27193,19014,27174,18976)
+\N
+(15597,27948,15590,27939)
+(11090,28623,11002,28589)
+(26956,18651,26920,18620)
+(3107,47753,3103,47711)
+(6745,24151,6711,24083)
+(43923,19213,43871,19124)
+(33451,23578,33370,23534)
+(8944,20605,8862,20601)
+(14905,7536,14892,7441)
+(2412,18357,2383,18354)
+(37060,1443,36974,1366)
+(15501,6230,15429,6190)
+\N
+(30333,50,30273,6)
+(35567,9965,35482,9912)
+(49847,7128,49798,7067)
+\N
+(27685,36396,27668,36384)
+(43832,18491,43825,18431)
+(36849,34600,36785,34589)
+(2348,47938,2307,47902)
+\N
+(20473,22131,20445,22113)
+(38486,4293,38471,4288)
+(30611,30451,30553,30400)
+(3883,21299,3819,21260)
+(7696,37555,7644,37534)
+(22399,7913,22317,7911)
+(42565,38605,42500,38598)
+(36595,12151,36500,12106)
+(587,35217,571,35123)
+(5764,15300,5764,15231)
+(12003,21265,11983,21210)
+(42564,4803,42470,4737)
+(42359,36834,42271,36746)
+(44700,14680,44658,14670)
+(19690,5627,19620,5607)
+(17780,43602,17714,43565)
+(45073,3491,45041,3434)
+(35043,2136,35017,2084)
+\N
+(39653,19215,39646,19198)
+(23970,25560,23935,25502)
+(28698,49233,28600,49223)
+(30266,3605,30245,3540)
+(25538,7857,25500,7791)
+(17711,1757,17708,1756)
+(5248,594,5190,587)
+(2730,32454,2671,32436)
+(1722,49089,1635,49067)
+(40954,5743,40921,5722)
+\N
+(21382,4426,21298,4331)
+(7885,18629,7872,18605)
+(42838,6459,42748,6451)
+(8217,19894,8207,19845)
+(20489,18524,20433,18520)
+(17383,23559,17309,23515)
+(38952,38968,38934,38913)
+(44665,18137,44636,18051)
+(22416,41220,22383,41213)
+(9901,664,9818,646)
+(23475,21981,23449,21973)
+(41875,17991,41818,17988)
+(36517,47731,36509,47713)
+(37595,49849,37581,49834)
+(38771,32720,38748,32684)
+(810,38523,736,38452)
+(29695,14942,29665,14907)
+(31911,15168,31906,15113)
+(3454,36839,3438,36831)
+(4832,47554,4820,47473)
+\N
+(11590,8292,11539,8272)
+(8193,33323,8106,33317)
+(16043,14799,16001,14710)
+(19574,11395,19514,11316)
+(26290,41424,26224,41342)
+(22844,12516,22807,12471)
+\N
+(15709,49580,15655,49553)
+(13387,28084,13379,28066)
+(2780,38807,2690,38711)
+(22031,32458,22028,32377)
+(13511,3351,13440,3297)
+(14648,26473,14614,26383)
+(17798,19885,17726,19852)
+(32355,27940,32324,27861)
+(43773,21031,43767,20985)
+(15419,45759,15403,45666)
+(770,38863,729,38806)
+(21221,35619,21183,35596)
+(38924,31021,38894,30961)
+(7395,32439,7345,32416)
+(2324,25118,2268,25074)
+(2958,15089,2935,15087)
+(2424,160,2424,81)
+(12123,18644,12099,18616)
+(7459,30276,7422,30218)
+(15847,45488,15814,45428)
+(26409,29897,26389,29863)
+(12336,34322,12279,34322)
+(9440,23550,9396,23466)
+(4991,30850,4905,30768)
+(47262,11940,47201,11939)
+(30584,42868,30555,42838)
+(23144,24089,23056,24067)
+\N
+(35930,11609,35847,11573)
+(7812,17271,7789,17203)
+(17946,37554,17878,37480)
+(27356,32869,27298,32813)
+(29971,47783,29933,47697)
+(26075,46494,25988,46451)
+(39314,41366,39289,41269)
+(31708,42900,31688,42865)
+(4510,10231,4439,10203)
+(43806,8482,43758,8446)
+(45990,49694,45927,49617)
+(48815,27640,48782,27573)
+(41675,26733,41622,26723)
+(23229,7709,23175,7693)
+(48976,17733,48962,17731)
+(10686,41470,10597,41434)
+(18053,27059,17989,27012)
+\N
+(35495,25950,35459,25912)
+(41896,45014,41881,44999)
+(22654,41896,22572,41801)
+(18581,7087,18524,6988)
+\N
+(14697,22406,14681,22311)
+(40092,28122,40043,28030)
+(35844,24243,35816,24238)
+(1254,25653,1250,25644)
+(1603,21730,1556,21640)
+(33048,21779,32991,21763)
+(29979,1632,29916,1592)
+(8620,633,8580,620)
+(22992,27035,22932,27008)
+(21409,29315,21390,29309)
+(3610,44748,3547,44699)
+(20402,9318,20343,9267)
+(31001,8709,30908,8658)
+(46840,47640,46773,47551)
+(49173,4705,49143,4630)
+(5339,31657,5251,31622)
+(8644,49668,8630,49648)
+(45387,2893,45309,2885)
+(47641,31020,47584,30941)
+(40238,10636,40208,10568)
+(19247,36924,19227,36924)
+(917,19957,827,19887)
+(40967,17841,40870,17820)
+(15850,4109,15794,4085)
+(20181,30916,20085,30870)
+(161,24465,107,24374)
+(21737,49690,21667,49663)
+(10328,20911,10232,20852)
+(24187,49823,24128,49768)
+(36084,4578,36007,4501)
+(38771,31741,38673,31674)
+(2202,30102,2111,30006)
+(27322,16074,27228,16039)
+(6843,17280,6765,17248)
+(16972,39744,16912,39700)
+(10608,38741,10553,38708)
+\N
+(4917,34801,4828,34766)
+(39281,33659,39268,33618)
+(31706,7119,31645,7063)
+(3427,44006,3422,44004)
+\N
+(10134,42608,10044,42599)
+(26294,32080,26200,32068)
+(21777,34680,21769,34606)
+(23373,25957,23314,25915)
+(10710,8401,10681,8400)
+(42062,19458,42019,19394)
+(26530,43036,26458,43004)
+(3394,46081,3360,46077)
+(38743,33953,38677,33924)
+(32438,8226,32345,8160)
+(9210,27333,9118,27301)
+(19594,1600,19568,1551)
+(10003,12278,9952,12255)
+(31737,7206,31650,7146)
+(16594,15821,16502,15759)
+(28208,30296,28189,30278)
+(30602,46237,30555,46185)
+(20715,5155,20697,5140)
+(48892,35271,48793,35210)
+(3175,5590,3113,5525)
+(34220,27947,34132,27865)
+(35105,39792,35011,39727)
+(21919,27314,21839,27286)
+\N
+(23963,3723,23917,3699)
+(16312,14078,16236,14045)
+(19233,49824,19185,49794)
+(1447,11768,1356,11699)
+(17311,17709,17224,17653)
+(11962,31709,11871,31627)
+(21355,40131,21355,40085)
+(33750,35273,33724,35180)
+(38896,25539,38879,25524)
+(39569,44899,39569,44893)
+(11075,41547,11039,41500)
+(3215,12202,3199,12127)
+(46215,33458,46132,33455)
+(15121,38012,15083,37974)
+(44448,18726,44412,18690)
+(3899,38263,3870,38262)
+(13854,13353,13786,13298)
+(8252,5402,8191,5320)
+(46849,37968,46820,37897)
+(16422,13957,16376,13897)
+(47369,7665,47353,7629)
+(11982,40874,11956,40806)
+\N
+(9552,27580,9496,27562)
+(32247,19399,32176,19337)
+(32704,2169,32635,2091)
+(7471,44213,7411,44130)
+(48433,7096,48379,7089)
+(37357,6543,37338,6452)
+(30460,29624,30433,29535)
+(20350,28794,20341,28705)
+(6326,32360,6267,32317)
+(1711,47519,1654,47430)
+(49540,16510,49521,16426)
+\N
+(26975,618,26908,579)
+(24118,30880,24020,30821)
+(3675,15477,3625,15418)
+(44953,9577,44953,9530)
+(38323,7965,38235,7910)
+(6629,36482,6579,36448)
+(33953,16460,33878,16408)
+(49222,16790,49186,16695)
+(17308,16951,17274,16904)
+(14135,6888,14077,6833)
+(38617,47768,38603,47760)
+(7345,10992,7290,10914)
+(35261,42152,35176,42096)
+(28586,4809,28544,4735)
+(37521,25299,37495,25217)
+(41941,17954,41912,17915)
+(1209,46863,1171,46863)
+(20103,34947,20048,34896)
+(32716,33816,32656,33769)
+(11113,6531,11036,6467)
+(48635,7321,48563,7262)
+(28435,37059,28349,37014)
+(12311,17208,12232,17112)
+(1466,48010,1379,48008)
+(11226,11997,11223,11925)
+(46896,32540,46821,32510)
+(32661,31255,32632,31187)
+(37739,20376,37655,20306)
+(44002,43326,43920,43257)
+(30337,1023,30271,968)
+(34436,23357,34432,23345)
+\N
+(21367,8168,21353,8091)
+(36370,21611,36369,21569)
+(4152,36488,4080,36476)
+(17696,13924,17664,13853)
+(34252,19395,34159,19316)
+(12574,3072,12573,2975)
+(3995,21243,3943,21167)
+(44553,30126,44513,30108)
+\N
+(4599,45275,4552,45254)
+(33191,11404,33176,11348)
+\N
+(14245,18633,14177,18540)
+(32457,20705,32393,20700)
+(40052,10499,40016,10457)
+(29824,44065,29785,44037)
+(31613,12565,31557,12543)
+(42692,29000,42652,28996)
+\N
+(40680,22219,40603,22140)
+\N
+(33575,27661,33488,27644)
+(46194,1385,46184,1355)
+(38442,48501,38407,48426)
+(25305,21544,25236,21523)
+(15562,8226,15561,8208)
+\N
+(20844,43614,20752,43558)
+(22566,30541,22554,30532)
+(2760,47802,2672,47789)
+(25515,30745,25433,30675)
+(48382,45134,48382,45093)
+(9940,27094,9871,27087)
+\N
+(48690,44361,48610,44338)
+(18992,11585,18899,11582)
+(21551,49983,21492,49885)
+(46778,29113,46770,29071)
+(43219,9593,43212,9548)
+(40291,1248,40224,1190)
+(12687,22225,12635,22219)
+(49372,38790,49306,38721)
+(49503,46808,49411,46798)
+(24745,5162,24732,5138)
+(5046,26517,5023,26424)
+(5583,46538,5495,46531)
+(6084,35950,6079,35895)
+(3503,23096,3437,23024)
+\N
+(45275,8420,45244,8418)
+(13514,45251,13491,45249)
+(42112,2748,42047,2668)
+\N
+(7810,21907,7806,21878)
+(48378,36029,48303,35979)
+(32568,48605,32510,48563)
+(859,18915,810,18915)
+(41963,17950,41939,17915)
+\N
+(42723,8031,42685,7955)
+\N
+(19587,5965,19556,5961)
+(8713,33083,8629,32996)
+(21243,7769,21226,7740)
+(43752,43026,43720,42944)
+(7883,41311,7859,41242)
+(10178,47874,10157,47826)
+(32177,48725,32093,48646)
+(22960,2784,22953,2774)
+(25101,49159,25087,49090)
+(32142,48915,32086,48850)
+(6636,44887,6590,44825)
+(37814,11606,37769,11578)
+(2870,23198,2820,23121)
+(21025,16364,20947,16271)
+(31341,36137,31269,36114)
+(38921,7906,38888,7831)
+(6966,17259,6922,17199)
+(32426,13344,32401,13253)
+(8084,30572,8078,30572)
+(42230,47674,42150,47603)
+(20724,44854,20724,44830)
+(27471,38453,27454,38430)
+(24590,37973,24544,37941)
+(45832,26077,45772,26031)
+(9589,24239,9582,24156)
+(37484,49472,37409,49432)
+(30044,19340,30004,19333)
+(16966,14632,16936,14572)
+(9439,40491,9403,40482)
+(28945,5814,28913,5805)
+(43788,41302,43746,41231)
+(33631,43451,33614,43354)
+(17590,49396,17510,49324)
+(15173,32572,15109,32507)
+(1912,23580,1840,23504)
+(38165,16185,38076,16154)
+(6729,1179,6637,1177)
+\N
+(6994,45406,6983,45325)
+(2912,21327,2908,21305)
+(14678,14244,14659,14222)
+(29944,14959,29898,14900)
+(47432,35658,47407,35610)
+(25542,39243,25466,39149)
+(5330,7206,5304,7165)
+(24790,27196,24695,27118)
+(38806,1961,38795,1906)
+(23290,4487,23212,4416)
+\N
+(35035,24337,34990,24297)
+(5549,38948,5549,38891)
+(24558,15492,24501,15425)
+(4636,3011,4574,2933)
+(26522,39986,26451,39940)
+(33486,18424,33410,18366)
+(36638,14324,36625,14287)
+(35115,41236,35055,41191)
+(31927,16896,31841,16806)
+(5796,43937,5697,43886)
+(25681,41645,25663,41608)
+(10962,42777,10894,42732)
+(32715,11026,32672,10991)
+(45803,20406,45710,20371)
+(34730,17672,34658,17606)
+(8809,6323,8798,6232)
+\N
+(39471,23837,39390,23749)
+\N
+(34078,17435,33987,17433)
+(9133,4544,9041,4509)
+(47274,29126,47242,29060)
+(6404,28488,6403,28475)
+(48894,49751,48846,49694)
+(17324,43023,17301,42972)
+(15599,8433,15557,8386)
+(48575,10202,48488,10175)
+(27638,24428,27608,24378)
+(45277,47456,45240,47422)
+(26482,46607,26482,46570)
+(41400,33898,41397,33802)
+\N
+(49853,18504,49848,18503)
+(11528,25165,11476,25080)
+(49902,41752,49818,41746)
+(1956,47506,1922,47424)
+(21834,22058,21802,21964)
+\N
+(19414,21842,19386,21822)
+(34801,13722,34744,13681)
+(13924,29243,13835,29160)
+(47749,21986,47664,21894)
+(47051,39582,46974,39489)
+(31287,49923,31236,49913)
+(47429,8625,47337,8585)
+(46987,44364,46901,44277)
+(16158,27510,16099,27467)
+(41184,6400,41148,6317)
+(1847,42471,1829,42426)
+\N
+(14409,48602,14320,48555)
+\N
+(38137,42951,38045,42918)
+(42875,2312,42832,2243)
+(27242,30617,27181,30535)
+(24882,44559,24812,44548)
+(22021,1596,22015,1581)
+(24300,1523,24250,1443)
+(43946,35909,43869,35868)
+(816,15988,776,15967)
+(25243,9401,25237,9332)
+(27967,25958,27928,25949)
+(6575,33949,6484,33900)
+(44812,35980,44800,35913)
+(37577,13064,37495,13019)
+\N
+(30891,29967,30814,29884)
+(15829,28836,15753,28807)
+(11128,34180,11126,34117)
+(9834,12537,9801,12508)
+(4899,29069,4809,29024)
+(29370,38459,29276,38382)
+(40743,46653,40647,46559)
+(9618,2723,9578,2631)
+(32542,26837,32515,26769)
+(5625,13409,5576,13355)
+(47490,19229,47472,19203)
+(48118,40275,48063,40203)
+(19245,20549,19227,20546)
+(25312,22243,25280,22164)
+(18797,28934,18723,28881)
+(31609,49393,31512,49366)
+(26183,32888,26135,32824)
+(46198,26153,46180,26149)
+\N
+(45383,16904,45353,16888)
+(7132,11408,7091,11338)
+(48262,43227,48236,43159)
+(31722,12861,31675,12810)
+\N
+(41695,48924,41691,48921)
+(48318,12877,48287,12802)
+(12069,32241,11978,32231)
+(8395,2694,8380,2661)
+(19552,34590,19550,34497)
+(12203,26166,12187,26143)
+(35745,9571,35654,9542)
+(22384,22535,22352,22439)
+(21459,28189,21360,28189)
+(7418,7203,7343,7182)
+(39497,48412,39413,48318)
+(1058,11132,979,11051)
+(45623,31417,45548,31381)
+\N
+(23887,31921,23876,31891)
+(7797,1244,7785,1155)
+(23679,43650,23594,43644)
+(21891,30561,21833,30485)
+(4069,6870,4019,6785)
+(5134,25117,5103,25034)
+(36101,41895,36085,41810)
+(39617,39211,39544,39191)
+(37437,6604,37434,6585)
+\N
+(7749,32601,7740,32515)
+(26203,34991,26159,34946)
+(31856,39006,31783,39003)
+(45828,24767,45788,24723)
+\N
+(49836,35965,49757,35871)
+(44113,49024,44033,48995)
+(38237,22326,38187,22253)
+(45235,19087,45190,19005)
+(1588,45285,1520,45254)
+(46628,8701,46552,8665)
+(47707,18258,47668,18250)
+(9377,26162,9325,26079)
+(28331,16766,28302,16731)
+(15792,27875,15727,27809)
+(16454,1972,16415,1967)
+(21012,15828,20972,15784)
+(27465,30603,27390,30560)
+(39256,7697,39225,7604)
+(25908,32801,25854,32770)
+(25215,40109,25201,40106)
+\N
+(23280,4613,23190,4596)
+(32440,30879,32405,30807)
+(49156,4224,49126,4126)
+(20005,40423,19911,40370)
+(20978,8226,20930,8170)
+(32127,22611,32126,22579)
+(21764,26509,21701,26455)
+\N
+(32923,2834,32914,2830)
+(7499,25331,7426,25300)
+(6163,36942,6107,36908)
+(41118,14583,41034,14486)
+(21211,33369,21208,33331)
+(7899,27682,7853,27603)
+(16546,48436,16535,48400)
+(24898,40195,24855,40174)
+(43029,982,43004,952)
+(26266,7962,26252,7950)
+\N
+(11308,44367,11210,44322)
+(8902,28402,8808,28334)
+(11671,19619,11665,19549)
+(47202,23593,47153,23505)
+(21981,40220,21905,40160)
+(46721,2514,46687,2471)
+(3450,33839,3424,33811)
+(41854,45864,41762,45792)
+(40183,47816,40114,47742)
+(26119,33910,26077,33816)
+(3430,16518,3365,16500)
+(40063,32176,40005,32166)
+(38702,15253,38679,15187)
+(17719,12291,17658,12257)
+(46131,30669,46068,30587)
+(42738,10952,42731,10907)
+(8721,45155,8650,45076)
+(45317,26123,45244,26113)
+(42694,11561,42614,11490)
+(10043,12479,10009,12391)
+(27584,2345,27578,2257)
+(30889,8253,30866,8167)
+\N
+(5176,48928,5107,48838)
+(9781,21023,9745,20976)
+(32430,27908,32404,27859)
+(3984,7391,3973,7352)
+(18904,8094,18842,8091)
+(20573,5508,20482,5496)
+(7806,44368,7753,44297)
+(18875,41452,18817,41376)
+(6632,12142,6566,12079)
+(33066,17865,33055,17854)
+(45726,19628,45714,19589)
+(26971,18459,26941,18423)
+(26554,23641,26515,23592)
+(45503,1325,45441,1231)
+(11898,20164,11880,20115)
+(27868,22837,27843,22776)
+(34931,8206,34855,8144)
+(42375,33603,42350,33539)
+(3184,8308,3129,8238)
+(26667,15813,26661,15785)
+\N
+(5760,49617,5730,49546)
+(794,27001,777,26992)
+(13518,45289,13459,45235)
+\N
+(34430,29754,34363,29736)
+(37912,24574,37880,24543)
+(8130,2270,8083,2258)
+\N
+(26930,21516,26848,21455)
+(3634,33511,3592,33489)
+(33080,5036,33035,4972)
+(48389,13942,48316,13915)
+(9231,5298,9150,5232)
+(1357,10601,1321,10548)
+\N
+(35175,15295,35091,15269)
+(33917,36863,33879,36784)
+(8279,12052,8239,12021)
+(11868,19083,11862,19034)
+(24019,30777,24006,30703)
+(44619,6959,44618,6938)
+(28610,2626,28523,2582)
+(29579,41801,29482,41775)
+(23448,37609,23396,37534)
+(40676,11252,40670,11191)
+(39656,14077,39564,13999)
+(33060,31042,33033,30950)
+(11720,6816,11654,6792)
+(13775,28873,13730,28868)
+(47851,39121,47802,39084)
+(30923,40255,30860,40199)
+(44169,15070,44085,15015)
+(42574,28664,42558,28590)
+(8993,43487,8941,43460)
+(40782,11648,40763,11631)
+(18516,10143,18423,10137)
+(39068,551,39005,491)
+\N
+(39672,12000,39575,11913)
+(18508,37761,18464,37712)
+(19083,35318,19079,35280)
+(30286,13736,30222,13672)
+(7223,9164,7132,9069)
+(20764,29286,20700,29210)
+(5733,8063,5699,8058)
+(8566,43873,8549,43797)
+(22126,27444,22062,27366)
+(15105,8717,15078,8660)
+(43987,33145,43940,33083)
+\N
+(46833,38652,46755,38612)
+(47768,27202,47681,27169)
+(22792,1183,22731,1152)
+(25650,43310,25562,43247)
+(37084,20116,37045,20057)
+(47461,32556,47423,32555)
+\N
+(41225,18124,41215,18117)
+(17623,25218,17553,25158)
+(13770,21703,13770,21700)
+(48958,35441,48870,35388)
+(2976,1808,2892,1802)
+(45118,22318,45049,22224)
+(42287,26616,42281,26560)
+(25525,6327,25468,6244)
+\N
+(40756,31634,40713,31568)
+(23105,26565,23078,26565)
+(48268,39862,48265,39827)
+(41656,26254,41567,26243)
+(28062,17920,28045,17825)
+(6443,17321,6402,17238)
+(10191,45466,10151,45447)
+(18097,39706,18043,39649)
+(37592,3244,37569,3197)
+(29809,5978,29762,5950)
+(12145,11251,12130,11202)
+(37507,42999,37446,42956)
+(10820,2866,10782,2830)
+(36440,42904,36421,42832)
+(38370,3386,38279,3311)
+(9345,17279,9313,17197)
+(20477,14864,20395,14807)
+(37147,37769,37110,37729)
+(15325,36135,15284,36053)
+(29034,32897,29009,32854)
+(2116,22274,2037,22216)
+(15078,38330,15048,38251)
+(7968,33600,7914,33573)
+(832,23851,770,23786)
+(38669,4348,38594,4344)
+(8521,48573,8425,48564)
+(1060,43320,969,43289)
+(26170,10150,26144,10069)
+(32324,8539,32285,8506)
+(13121,18044,13109,18021)
+(1597,9383,1594,9367)
+(49539,35164,49505,35065)
+(39464,10295,39409,10261)
+(8921,37898,8825,37803)
+(31171,47076,31093,47039)
+(7178,41397,7108,41304)
+(16240,34832,16162,34761)
+(2829,20119,2782,20091)
+(45854,21265,45810,21250)
+(6382,12106,6315,12030)
+(22301,46291,22291,46274)
+(34142,14181,34078,14158)
+(11258,29748,11198,29742)
+\N
+(37450,6943,37398,6882)
+(41675,27207,41643,27130)
+(13578,49562,13573,49479)
+(37132,37397,37081,37301)
+(49404,37193,49332,37170)
+(33536,31809,33444,31735)
+(45990,42751,45893,42708)
+(38852,20510,38802,20509)
+(27453,15836,27391,15802)
+(9347,29004,9284,28946)
+(44871,27727,44778,27668)
+(14978,19646,14970,19644)
+(23243,47091,23166,47080)
+(45204,21431,45167,21370)
+(14082,22316,14078,22235)
+(42778,22694,42744,22606)
+(4834,25241,4760,25196)
+(20497,18110,20494,18038)
+(45738,35524,45706,35496)
+(21575,5151,21493,5092)
+(2194,10052,2172,9960)
+\N
+(47735,24472,47682,24460)
+(46740,35700,46695,35609)
+(24647,42807,24568,42779)
+(18000,30576,17975,30506)
+(48638,46630,48544,46628)
+(48508,33600,48477,33578)
+(38703,45408,38670,45313)
+(21712,15015,21625,14956)
+(5840,42007,5768,41992)
+(44011,11138,43953,11117)
+(3899,33262,3897,33238)
+(30142,23967,30096,23927)
+(36950,13226,36908,13141)
+(13130,26915,13071,26873)
+(38576,35408,38539,35392)
+(16776,46244,16700,46176)
+(38251,25969,38168,25948)
+\N
+(3512,32256,3417,32242)
+(31923,31225,31832,31197)
+(5144,4969,5124,4937)
+(34499,46164,34430,46162)
+\N
+(39432,31907,39388,31828)
+(17316,24606,17221,24533)
+(20751,49352,20709,49323)
+(41673,30418,41623,30377)
+(29026,24400,28971,24345)
+(21929,30617,21894,30598)
+(35539,12421,35536,12355)
+(24938,45583,24870,45525)
+\N
+(27442,33090,27353,33064)
+(23949,12046,23949,12036)
+(11399,377,11360,294)
+(47099,9989,47023,9942)
+(641,33118,639,33084)
+(13687,41308,13682,41290)
+\N
+(3682,17727,3645,17660)
+(13262,19396,13185,19357)
+(18791,389,18774,366)
+(12489,45384,12403,45369)
+\N
+(12065,6364,12015,6325)
+\N
+(32705,23886,32619,23827)
+\N
+(7004,37333,6911,37240)
+(28594,38078,28530,38050)
+(5805,21797,5710,21701)
+(41145,18905,41058,18873)
+(35599,10002,35591,9956)
+(5387,39087,5326,38994)
+(11703,14003,11671,13912)
+(4093,10472,4091,10470)
+\N
+(14110,49740,14063,49695)
+(4170,470,4097,463)
+(22219,17296,22164,17221)
+(2505,20879,2446,20842)
+\N
+(47235,24744,47151,24667)
+(30035,23234,30013,23197)
+(3489,11659,3461,11607)
+(38435,46322,38429,46230)
+(12315,32880,12277,32854)
+(33350,35297,33317,35263)
+(18845,37671,18836,37589)
+(24855,23554,24783,23520)
+(48251,44461,48188,44408)
+(17695,43353,17605,43286)
+(4964,21292,4893,21270)
+(33919,29907,33852,29878)
+(29139,40010,29084,39957)
+(41611,37750,41572,37741)
+(41773,34717,41682,34700)
+(8225,7424,8221,7363)
+(1785,28248,1771,28219)
+(21553,36307,21505,36257)
+(7552,18199,7527,18119)
+\N
+(14410,30977,14349,30944)
+\N
+(20940,49142,20901,49069)
+(36892,5522,36810,5478)
+(40192,20926,40179,20926)
+(44702,15182,44641,15117)
+(43431,4921,43337,4827)
+(41129,21654,41084,21642)
+(6205,42785,6113,42722)
+(23714,10224,23666,10205)
+(9318,35175,9274,35139)
+(40698,12676,40618,12627)
+(49954,1340,49905,1294)
+(32774,33062,32763,33062)
+(4336,22183,4241,22157)
+(10241,47657,10151,47592)
+(6746,16718,6666,16634)
+(26842,49694,26839,49680)
+(34870,47437,34820,47347)
+(26365,22266,26326,22183)
+(39859,932,39829,840)
+(33995,10888,33902,10793)
+(32972,22342,32951,22340)
+\N
+(19951,10161,19932,10111)
+(26779,45188,26745,45151)
+(11235,13593,11184,13589)
+(27334,20968,27288,20953)
+(9586,43102,9488,43085)
+(43935,49759,43925,49680)
+(10548,37032,10474,36955)
+(9326,14927,9295,14848)
+(41340,11312,41311,11303)
+(6500,44553,6454,44515)
+\N
+(8198,26841,8104,26749)
+(47761,34183,47702,34140)
+(43637,17912,43577,17910)
+(17623,11138,17590,11122)
+(48122,13132,48077,13060)
+(27911,39796,27908,39777)
+(1108,7918,1080,7832)
+(18776,24329,18699,24326)
+(1171,37901,1075,37871)
+(38437,33948,38364,33907)
+(1913,11593,1817,11533)
+(22684,266,22656,181)
+(13299,17075,13241,17074)
+(6924,30196,6851,30113)
+\N
+(4367,13150,4298,13053)
+(37381,6101,37380,6046)
+(10307,28383,10270,28349)
+(12283,8636,12256,8610)
+(20230,32775,20144,32723)
+(32942,12812,32905,12714)
+(46140,7138,46140,7047)
+(37235,29436,37161,29425)
+(42486,25454,42478,25444)
+(47860,46973,47842,46961)
+(41760,21026,41662,20955)
+(29663,20088,29566,20026)
+(19167,33241,19101,33235)
+(12306,37845,12301,37803)
+(11288,873,11203,857)
+(30309,5120,30282,5060)
+(46927,19737,46856,19687)
+(16664,20052,16649,19989)
+(7330,8675,7296,8613)
+(45067,45724,44991,45631)
+(45317,10862,45218,10842)
+(15012,47009,14998,46956)
+(47882,10146,47813,10099)
+(31571,46215,31511,46148)
+(32257,2619,32187,2531)
+(38924,41305,38872,41285)
+(49981,34876,49898,34786)
+(30501,35099,30418,35011)
+\N
+(45862,41438,45854,41434)
+(38448,31878,38391,31822)
+(8278,43463,8274,43378)
+(5883,30629,5878,30564)
+(49501,40346,49447,40275)
+(31651,43116,31560,43106)
+(44244,32940,44244,32926)
+\N
+(17941,18079,17938,18035)
+(9518,32524,9470,32511)
+(30707,43469,30686,43457)
+(3284,46542,3187,46477)
+(43423,29642,43393,29602)
+(19940,16825,19877,16736)
+(26194,47446,26194,47407)
+(30386,24675,30333,24652)
+(42707,44466,42688,44456)
+\N
+(43395,18525,43320,18467)
+(28346,32259,28276,32196)
+(45106,40786,45026,40767)
+(36734,20414,36722,20363)
+(37140,11569,37099,11475)
+(8967,6409,8882,6341)
+(31036,27923,30993,27890)
+(22442,47682,22347,47663)
+(32511,24029,32482,23970)
+(22593,34444,22519,34399)
+(41534,15495,41518,15455)
+\N
+(35862,19997,35818,19928)
+(31419,8323,31404,8285)
+(31036,19023,30978,19000)
+(46900,15192,46891,15102)
+(12774,9651,12765,9604)
+(49985,6436,49927,6338)
+(7184,47344,7089,47285)
+(12792,45021,12740,45011)
+(15019,27192,14940,27096)
+(35415,23106,35381,23095)
+(42129,14283,42095,14245)
+(29375,45807,29347,45743)
+(21763,24916,21700,24889)
+(47656,8794,47579,8774)
+(6139,49571,6059,49472)
+(44492,45607,44483,45532)
+(22699,4301,22628,4240)
+(27407,24241,27335,24158)
+\N
+(38424,34460,38403,34458)
+(46572,48456,46554,48402)
+(39676,29056,39643,28981)
+(4202,33076,4107,33010)
+(32499,10592,32482,10575)
+(22504,45417,22459,45378)
+(49619,40322,49619,40268)
+(14463,9305,14426,9224)
+(10070,20300,10035,20211)
+(35060,28561,34965,28553)
+(23970,47522,23887,47428)
+(46803,19155,46790,19131)
+\N
+(46151,49848,46058,49830)
+(45266,40766,45209,40738)
+(31041,32195,31007,32110)
+(41401,17245,41334,17224)
+(37445,654,37435,602)
+(45568,31904,45508,31857)
+(29326,7923,29285,7896)
+(27078,34643,27027,34606)
+(34492,43443,34437,43345)
+(34109,4307,34083,4265)
+(2755,45325,2727,45312)
+(12571,24218,12536,24195)
+(41224,2454,41149,2445)
+(711,34828,655,34788)
+(9104,18865,9036,18850)
+(3508,26816,3456,26771)
+(20159,16212,20116,16160)
+(36871,7425,36777,7421)
+(2751,45244,2734,45222)
+(35867,28071,35769,28052)
+(46878,35730,46850,35725)
+(20610,35086,20513,35037)
+(3903,32612,3887,32517)
+(9330,40226,9289,40169)
+(6338,28242,6329,28184)
+(35668,18344,35606,18304)
+(29892,48927,29878,48879)
+(26999,646,26932,612)
+(36377,38898,36338,38847)
+(40289,31459,40236,31436)
+(30377,1164,30306,1069)
+(7642,12183,7590,12112)
+(40325,1716,40296,1662)
+(36412,38787,36318,38691)
+(3967,33268,3923,33261)
+(33914,40774,33873,40763)
+(45978,41431,45963,41332)
+(39195,12546,39120,12520)
+(29962,30878,29941,30846)
+(9365,10732,9310,10726)
+(28801,23943,28740,23885)
+(28934,38858,28928,38807)
+(22126,45897,22068,45803)
+(2923,33832,2918,33751)
+(25116,2276,25083,2272)
+(31174,14546,31144,14460)
+(11728,9072,11658,9004)
+(19804,49195,19730,49125)
+(23090,28826,23010,28787)
+(33989,27553,33947,27486)
+(39702,47613,39641,47553)
+(31397,3607,31304,3519)
+(5835,9262,5791,9226)
+(40112,37022,40038,36926)
+(12346,29356,12282,29344)
+(28503,9623,28469,9591)
+(38449,43143,38378,43066)
+(36950,37311,36905,37265)
+(34824,5729,34818,5706)
+(9288,26969,9225,26900)
+(2535,42176,2478,42159)
+(29098,49051,29085,49031)
+(44759,33326,44727,33230)
+(42849,2970,42821,2919)
+(46014,27193,45985,27151)
+(14506,13713,14417,13626)
+(19342,44905,19332,44895)
+(38178,37003,38147,36925)
+(29179,27310,29084,27288)
+(42713,10158,42671,10060)
+(43336,38389,43290,38326)
+(41260,34410,41245,34327)
+(27907,2695,27830,2596)
+(16309,44972,16222,44966)
+(6230,22262,6214,22249)
+\N
+(9266,39458,9175,39447)
+(33120,33548,33087,33538)
+(43659,11416,43599,11375)
+(49707,39258,49702,39159)
+(23520,22140,23486,22072)
+(24736,46502,24668,46412)
+(7826,16851,7730,16807)
+(39114,6048,39056,5965)
+(11859,8753,11764,8701)
+(42254,48367,42240,48328)
+(26136,49185,26056,49175)
+(38395,11209,38334,11137)
+(33249,9425,33209,9348)
+(22131,38502,22112,38460)
+(5306,24344,5267,24268)
+(30292,1198,30233,1149)
+(9903,10896,9850,10806)
+(25568,22911,25487,22868)
+(22048,43391,22043,43362)
+(20852,25827,20851,25766)
+(35204,17119,35114,17093)
+(5575,43431,5554,43410)
+(17727,13623,17678,13560)
+(14721,29520,14709,29461)
+(40317,42220,40267,42166)
+(31435,31012,31386,30931)
+(40655,10103,40645,10006)
+(35783,17802,35773,17763)
+(34874,10210,34856,10200)
+(3694,14279,3610,14239)
+(27854,5493,27799,5433)
+(34913,7234,34894,7220)
+(15758,26445,15738,26421)
+(23710,7272,23705,7270)
+\N
+(33679,13468,33628,13415)
+\N
+(31271,40495,31178,40461)
+(759,187,662,163)
+(14419,40434,14402,40381)
+(45879,42933,45814,42872)
+(167,17214,92,17184)
+(9964,12210,9958,12195)
+(35834,46257,35817,46211)
+(26077,5629,25978,5621)
+(46177,44640,46082,44544)
+(44780,28753,44707,28692)
+(35491,24729,35425,24690)
+(33914,34190,33914,34131)
+(17709,33253,17668,33227)
+(45516,11888,45423,11848)
+(24497,24752,24411,24710)
+(30333,5952,30331,5886)
+(444,12587,430,12497)
+(7592,22353,7541,22287)
+\N
+(13387,37414,13329,37318)
+\N
+(21504,35227,21449,35210)
+(18533,12909,18438,12848)
+(41049,27148,41048,27088)
+(18205,12222,18151,12140)
+(18026,5164,18026,5156)
+(34104,29862,34006,29815)
+(18520,49686,18454,49602)
+(37000,41493,36920,41424)
+(43025,25711,42986,25687)
+(38620,47018,38535,46934)
+(24119,36813,24023,36739)
+(48887,26359,48879,26302)
+(47827,14625,47810,14609)
+(10792,30746,10776,30716)
+(30384,40672,30318,40582)
+(48417,22790,48358,22746)
+(14854,5819,14785,5798)
+(19142,44414,19085,44406)
+(31179,27081,31145,27005)
+\N
+(19692,8711,19659,8642)
+(39689,14082,39603,14051)
+(11181,39091,11119,39002)
+(46015,23374,45936,23328)
+(12517,49702,12427,49690)
+(21926,21137,21841,21111)
+(31956,12509,31870,12494)
+(5895,2030,5851,2020)
+(27094,5447,27014,5377)
+(35781,8717,35780,8618)
+(14012,12023,13972,12015)
+(1702,12442,1696,12419)
+(28549,5251,28462,5248)
+(26441,21007,26360,20925)
+(49820,7990,49771,7967)
+(26424,29698,26339,29693)
+(35146,6820,35071,6817)
+\N
+(15438,18788,15435,18729)
+(47115,5235,47096,5143)
+(33982,9002,33915,8925)
+(14206,37041,14174,36955)
+(24300,36616,24232,36613)
+(44658,1788,44580,1769)
+\N
+(31539,43550,31463,43464)
+\N
+(16722,9673,16633,9652)
+(44813,20573,44733,20544)
+\N
+(42114,32559,42040,32552)
+(41561,36244,41477,36241)
+(39589,33796,39548,33716)
+(20365,26770,20329,26709)
+(28511,208,28479,114)
+(10010,25524,9930,25508)
+\N
+(1549,45666,1512,45621)
+(16193,1927,16166,1869)
+(34486,11500,34421,11401)
+(14048,37944,13994,37901)
+(21692,9594,21617,9496)
+(2568,37899,2557,37811)
+(4360,24503,4278,24443)
+(50027,49230,49951,49214)
+(44849,14867,44836,14813)
+(16695,34896,16683,34840)
+(12600,35217,12593,35129)
+(23113,24009,23030,23962)
+(49907,30225,49810,30158)
+(18026,25208,17970,25208)
+(49711,39844,49651,39790)
+(5427,42682,5357,42637)
+(23901,14221,23802,14184)
+(15470,12185,15376,12163)
+(47302,34023,47292,34001)
+(24336,17418,24315,17393)
+(13948,17043,13903,16970)
+(8555,8986,8530,8953)
+(48830,6038,48743,5986)
+(48720,40687,48623,40610)
+(21161,30970,21146,30896)
+(9507,36316,9411,36261)
+\N
+(36643,18136,36614,18106)
+(1858,7457,1851,7402)
+(24452,44306,24372,44252)
+\N
+(3292,807,3205,806)
+(6845,30694,6792,30627)
+(21333,25786,21237,25751)
+(23008,22574,22999,22511)
+(8790,8893,8772,8806)
+(43333,47968,43264,47900)
+(5377,24103,5302,24076)
+(18410,23993,18329,23907)
+(24752,19126,24713,19069)
+(49772,11378,49696,11293)
+(3468,12920,3396,12873)
+(1746,40342,1736,40333)
+(49187,29737,49139,29681)
+(27657,44952,27581,44917)
+\N
+(35407,30177,35345,30151)
+(4071,40568,4058,40544)
+(25998,30513,25965,30452)
+(8195,45403,8097,45310)
+(8276,41689,8183,41670)
+\N
+(48435,28550,48355,28455)
+\N
+(8139,25449,8136,25380)
+(20302,25574,20297,25531)
+\N
+(22055,46659,22034,46567)
+(3531,49962,3463,49934)
+(46828,46938,46739,46902)
+(42294,786,42212,739)
+(8779,3292,8761,3275)
+(48146,46170,48082,46151)
+(21571,10000,21531,9919)
+(35526,26029,35450,25945)
+(38893,22225,38865,22197)
+(22189,37520,22132,37497)
+(810,43261,751,43198)
+(10352,39144,10290,39093)
+(8740,35435,8720,35432)
+(31657,13551,31583,13484)
+(39803,4019,39755,4014)
+(46353,7853,46312,7824)
+(30078,48975,30021,48970)
+(2847,32036,2819,31966)
+(25250,10147,25165,10140)
+\N
+(15643,38953,15585,38947)
+(40792,29798,40731,29731)
+(43249,26858,43215,26835)
+(47229,2199,47201,2134)
+(10052,23601,9958,23570)
+(38981,21615,38892,21604)
+(3651,45004,3570,44917)
+(21503,8261,21409,8166)
+(13518,34201,13465,34105)
+(13899,25117,13836,25114)
+(18327,17403,18301,17349)
+(19503,13648,19483,13607)
+(3554,19487,3529,19466)
+(41102,43355,41070,43314)
+(4663,45858,4583,45765)
+(3971,3023,3931,2975)
+(37124,7061,37080,6993)
+(48530,47172,48459,47160)
+(14575,29843,14509,29750)
+(43443,23124,43357,23038)
+(8864,48290,8857,48263)
+(41597,39852,41577,39791)
+(35610,33392,35556,33353)
+(36415,17906,36328,17846)
+(24919,43933,24839,43883)
+(7457,14056,7395,14051)
+(43851,4090,43801,4080)
+(43567,18468,43471,18388)
+(16711,6084,16652,6055)
+(45888,45934,45846,45880)
+(45630,9313,45585,9248)
+(27119,25969,27094,25884)
+(36155,11420,36120,11405)
+(41880,47111,41808,47049)
+\N
+(17554,20379,17482,20374)
+(38848,5936,38763,5869)
+(28324,31019,28276,30944)
+(43257,17152,43176,17091)
+(42717,24613,42691,24527)
+(16786,41486,16763,41403)
+(19259,28780,19160,28711)
+(25843,28265,25760,28171)
+(48645,34816,48546,34755)
+(7004,49289,6976,49236)
+(30261,21833,30181,21776)
+(5290,46672,5219,46661)
+(21237,31901,21188,31849)
+(23340,38537,23253,38472)
+(17269,3682,17183,3586)
+\N
+(48200,15377,48110,15369)
+(16546,22195,16477,22142)
+(21436,8460,21378,8449)
+\N
+(46598,17235,46577,17138)
+\N
+(30212,36184,30152,36092)
+(18037,155,17941,109)
+(4945,29201,4933,29184)
+(32835,18782,32770,18750)
+(34160,33104,34120,33007)
+(5151,26989,5149,26909)
+(1801,15549,1710,15461)
+(48988,34819,48951,34764)
+(20904,32547,20856,32497)
+\N
+(32654,35183,32606,35144)
+(14336,11763,14328,11712)
+(30546,23808,30463,23773)
+(6813,21006,6781,20924)
+\N
+(14199,22030,14185,21934)
+(3783,14709,3747,14658)
+(49428,47052,49422,46973)
+(29551,27682,29470,27654)
+(29170,37260,29151,37181)
+(48924,24689,48894,24680)
+(48497,34052,48453,33966)
+\N
+(21263,8203,21242,8176)
+(46537,3797,46462,3735)
+(18406,14579,18393,14563)
+\N
+(11583,16529,11536,16471)
+(10564,46257,10478,46228)
+(49769,34513,49761,34458)
+\N
+(9202,6482,9138,6391)
+(40387,37411,40357,37360)
+(11966,11802,11888,11751)
+(15551,47438,15486,47406)
+(12017,43288,11969,43230)
+(9717,22574,9701,22495)
+\N
+(35083,49443,35075,49355)
+(33857,9320,33813,9269)
+(32106,10581,32012,10560)
+(14345,12485,14273,12424)
+(24187,46416,24175,46402)
+(43854,42159,43808,42129)
+(35399,40707,35359,40646)
+(29585,25576,29493,25556)
+(24919,7829,24911,7753)
+\N
+(17049,48390,17022,48304)
+(25224,35012,25217,34922)
+(47397,20853,47346,20779)
+(17221,16558,17181,16516)
+(8669,16491,8645,16486)
+(23502,44241,23484,44164)
+(36169,37046,36072,37010)
+(44775,32394,44763,32357)
+(30685,36871,30662,36792)
+(21783,47642,21714,47630)
+(34847,27467,34761,27372)
+(43925,49912,43888,49878)
+(16455,27861,16364,27813)
+(38406,18310,38329,18309)
+(5408,9461,5319,9426)
+(41856,36900,41784,36854)
+(23723,4460,23646,4448)
+(18454,40138,18430,40046)
+(17505,36822,17418,36763)
+(36686,33534,36641,33476)
+(11347,9454,11289,9436)
+\N
+(27816,34752,27745,34736)
+(44213,8559,44162,8461)
+(45359,26789,45315,26776)
+(31249,19475,31224,19421)
+(25917,44239,25819,44149)
+(47313,40691,47264,40685)
+(40577,33848,40513,33794)
+(9606,45253,9582,45174)
+(30005,24521,29910,24496)
+(49332,35375,49309,35299)
+\N
+(12164,33871,12075,33820)
+(19598,43327,19593,43314)
+\N
+(3818,28584,3815,28504)
+\N
+(35579,8611,35541,8604)
+(8811,20986,8750,20954)
+(16139,44777,16128,44686)
+(35550,41501,35534,41458)
+(43180,11927,43109,11891)
+(45798,8465,45711,8460)
+(18196,6886,18126,6845)
+(1774,32167,1701,32073)
+(7030,40790,7029,40711)
+(11676,23009,11665,22915)
+(33990,22561,33953,22474)
+\N
+(30366,9447,30284,9353)
+(37626,32913,37596,32853)
+(7730,42561,7665,42470)
+(49347,8403,49315,8387)
+(6874,3499,6812,3458)
+(44189,16999,44169,16964)
+(6312,30167,6231,30083)
+(18932,6611,18909,6518)
+(32262,13076,32223,13057)
+(45989,249,45910,222)
+(42710,855,42692,796)
+(25562,9849,25535,9802)
+(13348,46719,13260,46689)
+(30022,42196,30005,42160)
+\N
+(22263,45954,22243,45950)
+(18918,18890,18820,18795)
+(31918,12003,31852,11989)
+(12252,39453,12211,39398)
+(40208,9789,40194,9759)
+(35943,21767,35914,21693)
+(18439,10706,18383,10618)
+(2803,18999,2778,18925)
+(14953,27444,14875,27397)
+(12587,22025,12545,21928)
+(33930,21090,33918,21009)
+(10444,2606,10407,2553)
+(28700,29782,28665,29703)
+\N
+(1402,13497,1397,13465)
+\N
+(24155,3075,24083,3062)
+(38378,1864,38339,1849)
+(29261,49910,29247,49818)
+(38139,37073,38098,37057)
+\N
+(24468,41130,24418,41053)
+(9989,1015,9959,939)
+(47001,33561,46994,33518)
+(47058,16030,46983,16012)
+(35509,1814,35426,1748)
+(3630,48019,3597,47923)
+(47781,12986,47741,12947)
+(16364,9908,16356,9882)
+(17290,41508,17287,41410)
+(42423,26477,42349,26434)
+(10039,920,9952,833)
+(16851,21338,16846,21314)
+\N
+(23104,7700,23062,7688)
+(5619,2079,5611,2075)
+(31471,49632,31375,49549)
+(25793,12526,25783,12456)
+(3935,29528,3866,29513)
+\N
+(5957,1646,5947,1595)
+(2467,22376,2429,22349)
+(43715,32673,43664,32595)
+(6726,13093,6636,12994)
+(31477,18347,31421,18299)
+(34232,36635,34200,36552)
+(49061,14516,49008,14442)
+(43996,6129,43955,6074)
+(7728,33802,7670,33703)
+\N
+(6131,36766,6053,36749)
+(35791,16361,35696,16329)
+(45759,8935,45675,8886)
+(43634,2029,43537,1940)
+(4916,32233,4844,32181)
+(46701,23508,46623,23477)
+(29590,4893,29552,4871)
+(38647,4423,38574,4396)
+(7593,25845,7497,25751)
+(8510,43552,8432,43492)
+(18791,39181,18730,39162)
+(7462,2956,7454,2858)
+(1394,26795,1392,26780)
+(16707,21993,16609,21932)
+(26838,10866,26803,10836)
+(31642,29842,31585,29760)
+(21891,3502,21863,3406)
+(13258,587,13250,507)
+(6072,47397,6021,47369)
+(16605,49730,16579,49659)
+(42830,40981,42791,40981)
+(12975,3706,12913,3637)
+(30925,21660,30826,21649)
+(1455,14229,1410,14156)
+\N
+(17583,16486,17562,16474)
+(33377,3387,33333,3381)
+(784,6177,750,6095)
+(22111,44110,22106,44013)
+(1444,403,1346,344)
+(4010,46220,3982,46212)
+(17932,8150,17861,8127)
+(38685,31466,38636,31416)
+(14257,11549,14242,11522)
+(14990,15217,14904,15211)
+(21395,21533,21307,21520)
+\N
+(31948,33725,31885,33694)
+(433,49033,390,48961)
+(45205,609,45173,523)
+(25065,35494,25003,35455)
+(33265,6677,33224,6611)
+(18179,22345,18133,22256)
+(3916,13759,3820,13732)
+(1696,13478,1604,13436)
+(47203,25980,47130,25907)
+(24913,13361,24868,13268)
+(13824,40177,13792,40130)
+(25671,13555,25585,13494)
+\N
+(20133,37769,20105,37679)
+\N
+(26368,16734,26288,16726)
+(30545,35438,30458,35376)
+(48816,22926,48812,22831)
+(48807,31389,48739,31330)
+(11003,10859,10950,10765)
+(17288,8570,17247,8485)
+(38377,31415,38331,31379)
+\N
+(19085,23425,19059,23326)
+(40059,17068,40052,17006)
+(18811,13493,18734,13394)
+(36319,17197,36225,17181)
+(14939,38780,14863,38714)
+(49539,17656,49479,17629)
+(42530,45951,42466,45854)
+(27318,26654,27233,26610)
+(49980,35004,49937,34963)
+(18326,32558,18322,32502)
+(45951,28555,45896,28481)
+(12104,33531,12014,33501)
+(22311,41113,22215,41066)
+(25073,18721,25047,18656)
+\N
+(14524,13486,14510,13390)
+(40040,36688,40000,36599)
+(21594,11473,21563,11436)
+(44031,22274,43938,22187)
+(729,30683,668,30601)
+(14114,20873,14102,20803)
+(28239,41377,28222,41308)
+(26404,11922,26317,11843)
+(41660,34586,41585,34501)
+\N
+(21128,2384,21101,2368)
+(30209,16952,30156,16858)
+(39078,24963,39045,24898)
+(5598,1348,5499,1294)
+\N
+(38474,7436,38450,7364)
+(15117,45734,15024,45693)
+\N
+(23909,39853,23888,39780)
+(24292,30183,24282,30148)
+(48871,17661,48868,17637)
+(918,18752,847,18708)
+\N
+(43615,16162,43606,16104)
+(33763,47410,33751,47409)
+(4798,6485,4773,6388)
+\N
+(18524,41539,18433,41518)
+(47745,42449,47651,42364)
+(38936,21237,38864,21204)
+\N
+(5251,3516,5194,3475)
+(22269,36269,22183,36228)
+(18736,40983,18685,40947)
+(38393,15444,38356,15363)
+(38134,29898,38103,29862)
+(37789,39557,37732,39474)
+(31906,23005,31838,23003)
+(10647,40094,10560,40040)
+(9914,41547,9867,41545)
+(44221,443,44125,433)
+(41479,10936,41381,10847)
+(42586,6301,42563,6235)
+(2504,17588,2449,17554)
+(7045,18782,7028,18764)
+(41840,32018,41768,31938)
+(38416,17158,38330,17060)
+\N
+(8605,39015,8605,38933)
+(5764,43548,5719,43496)
+\N
+(20789,29902,20696,29843)
+\N
+(36104,47896,36079,47816)
+(31736,13834,31722,13832)
+(32617,19701,32597,19684)
+(1671,18997,1622,18945)
+(36007,26545,36005,26535)
+(31864,17494,31820,17455)
+(27346,28388,27303,28289)
+(8191,9653,8133,9589)
+(7501,21616,7405,21536)
+(35450,9580,35368,9563)
+(29281,37276,29247,37255)
+(6225,17192,6200,17135)
+\N
+(43689,8119,43670,8028)
+(41917,49601,41835,49563)
+(44295,13116,44205,13078)
+(22721,44772,22667,44748)
+(32640,11107,32636,11050)
+(20639,28851,20613,28839)
+\N
+(32479,10159,32446,10061)
+(27251,16978,27196,16959)
+(41401,33148,41339,33074)
+\N
+(49001,8538,48989,8444)
+(37958,35843,37874,35802)
+(46969,41229,46903,41138)
+(18541,8876,18541,8870)
+(4080,31634,4061,31627)
+(8097,35240,8040,35152)
+(18470,21414,18463,21412)
+(20914,17897,20838,17869)
+(42688,11681,42666,11641)
+(47525,25005,47443,24907)
+(32439,14438,32397,14400)
+\N
+(39667,19626,39622,19542)
+(1212,44525,1169,44516)
+(29766,4433,29668,4401)
+(25847,49657,25813,49605)
+(33859,17356,33827,17263)
+(28989,45953,28904,45854)
+(37211,30830,37113,30819)
+\N
+(45220,26382,45219,26340)
+(12312,43250,12234,43246)
+(37775,41504,37762,41421)
+(45889,33499,45822,33411)
+(49461,22601,49369,22553)
+(39857,33844,39816,33824)
+(46102,15822,46030,15778)
+(46605,31239,46598,31170)
+(23925,5856,23862,5808)
+(15459,4262,15407,4241)
+(12019,4907,12015,4818)
+(38258,17973,38229,17923)
+(40575,29566,40477,29521)
+\N
+(29715,45919,29697,45891)
+(11694,9510,11670,9490)
+(7053,44257,7012,44231)
+(16465,8603,16391,8505)
+(29170,15592,29098,15527)
+(20400,37354,20345,37328)
+(5281,10265,5252,10184)
+(6084,48782,6058,48727)
+(11006,6889,10971,6796)
+(16299,19461,16286,19411)
+(13718,29192,13642,29106)
+(3999,2965,3963,2903)
+(18509,12235,18430,12208)
+(49542,38575,49537,38534)
+(15093,41715,15071,41634)
+(6802,8385,6714,8300)
+(15127,17507,15097,17424)
+(36921,3025,36835,2995)
+(32117,24327,32101,24262)
+(27244,24151,27165,24104)
+(36339,42360,36313,42358)
+(47288,46252,47245,46184)
+(37867,6649,37818,6565)
+(14886,22103,14865,22089)
+(39611,17952,39513,17951)
+(37329,31436,37298,31436)
+(5715,39115,5698,39099)
+(13266,7364,13203,7296)
+(16076,10945,16006,10942)
+(7197,41509,7126,41413)
+(14411,40868,14330,40772)
+(12872,33481,12862,33454)
+(17786,19616,17758,19560)
+(1052,37358,996,37311)
+(42825,12643,42762,12625)
+(20007,49858,19921,49778)
+(27155,6355,27072,6257)
+(14117,40208,14022,40155)
+(47280,34069,47279,34028)
+(17551,15803,17482,15763)
+(1725,6673,1676,6649)
+(43984,31128,43961,31105)
+(43772,47042,43731,47038)
+(46901,47317,46817,47228)
+(19877,14179,19837,14168)
+(20691,19989,20675,19935)
+(4011,18914,3963,18817)
+(1023,23378,933,23317)
+(30051,46118,29966,46039)
+(43499,46488,43496,46409)
+\N
+(43531,2412,43447,2396)
+\N
+(16034,32285,15976,32220)
+(12817,21365,12740,21298)
+(7607,47293,7585,47293)
+(32512,12218,32463,12170)
+(1848,21496,1839,21439)
+(17567,23073,17478,23046)
+(35813,31847,35807,31792)
+\N
+(563,30859,540,30842)
+(13145,15488,13063,15433)
+(36754,37479,36731,37411)
+(1125,26069,1057,25997)
+(4539,20676,4519,20618)
+(8476,34721,8409,34681)
+(7794,25691,7727,25656)
+(23842,514,23800,473)
+(47678,41396,47668,41365)
+(6837,25974,6799,25892)
+(13355,11174,13304,11161)
+\N
+(37243,25548,37158,25471)
+(12528,30208,12441,30205)
+(14929,1672,14886,1607)
+(27263,49026,27263,49010)
+(15892,21645,15835,21642)
+(29446,48978,29360,48967)
+(41304,9892,41211,9825)
+(37418,49393,37338,49296)
+(41146,32178,41120,32165)
+(28738,13326,28722,13266)
+(14899,36595,14873,36559)
+(1973,31435,1921,31426)
+(19485,17742,19421,17661)
+(33072,20995,32980,20903)
+(47091,30055,47080,30037)
+(45753,12998,45686,12992)
+\N
+(11528,7826,11509,7794)
+(21104,13921,21060,13836)
+(16768,15491,16747,15470)
+(13279,20396,13249,20326)
+(4342,49518,4339,49446)
+(20413,15476,20349,15447)
+(45532,5649,45484,5627)
+(18647,27196,18619,27115)
+(1326,17473,1261,17400)
+(47646,19644,47588,19609)
+(35088,1813,35080,1732)
+(38461,34839,38410,34838)
+(34358,11540,34285,11506)
+\N
+(26969,7078,26953,6989)
+(12629,40352,12617,40264)
+(33800,7037,33731,6992)
+(24462,13518,24392,13486)
+(33164,47357,33096,47329)
+(15422,18451,15413,18376)
+(19643,12916,19567,12912)
+(40860,42125,40770,42050)
+(49103,29614,49039,29606)
+(36319,35582,36222,35528)
+(8924,36083,8873,36018)
+(49603,44022,49505,44021)
+(7783,40633,7702,40618)
+(25388,49107,25346,49042)
+(28375,38947,28306,38919)
+(47324,22672,47321,22660)
+(2287,8808,2266,8719)
+(44343,16339,44248,16318)
+(2374,28839,2336,28798)
+(22913,40710,22819,40688)
+\N
+(47747,684,47658,627)
+(16043,46011,16021,45984)
+(34958,32168,34903,32092)
+(4840,49328,4752,49258)
+(24341,2087,24330,2009)
+(18378,19374,18327,19358)
+(48165,7217,48156,7141)
+(14232,6044,14182,6004)
+(23080,4196,22983,4191)
+(259,1850,175,1820)
+(270,29508,264,29440)
+(45088,11375,45050,11295)
+(29666,39386,29656,39302)
+(8712,8782,8660,8713)
+(15900,6650,15855,6561)
+(28946,28348,28917,28347)
+(32544,25845,32538,25779)
+(44047,6957,43951,6942)
+(36465,588,36382,503)
+\N
+(28167,26679,28150,26673)
+(16065,4268,15975,4180)
+(12950,23494,12893,23494)
+(30145,24679,30056,24654)
+(3027,16162,3001,16071)
+(8259,34537,8202,34484)
+(41447,1515,41427,1454)
+(18407,28362,18309,28303)
+(21393,41872,21328,41816)
+(46040,26497,45996,26408)
+\N
+(49944,25163,49902,25153)
+\N
+(16195,11843,16159,11831)
+(44257,15270,44254,15214)
+(49760,4791,49699,4713)
+(22558,33709,22519,33681)
+(28375,10003,28336,9938)
+(18179,24310,18106,24256)
+(707,30688,664,30669)
+(5851,26118,5822,26037)
+(4266,1292,4221,1217)
+(16516,11331,16432,11248)
+(32374,38277,32313,38245)
+(21939,8015,21927,7952)
+(34322,32051,34242,32003)
+(6262,35977,6260,35953)
+(16717,38594,16622,38498)
+(14564,3433,14535,3425)
+(21078,1000,20994,974)
+(28584,956,28575,868)
+(5538,9962,5465,9870)
+(34183,44102,34175,44085)
+\N
+(42507,10289,42441,10288)
+(12671,19936,12594,19920)
+(24835,12179,24770,12173)
+(15664,11538,15598,11494)
+(28892,24446,28821,24350)
+(41654,26720,41570,26632)
+(36583,387,36503,357)
+(10842,34824,10795,34788)
+(11518,42588,11429,42565)
+(12577,40322,12486,40266)
+(2453,4045,2439,3956)
+(31837,33705,31803,33681)
+(24403,27711,24383,27705)
+(4431,2748,4337,2656)
+\N
+(3036,2887,3014,2826)
+(37664,16118,37615,16022)
+(8606,18063,8587,18038)
+(24738,25458,24656,25362)
+(45756,34022,45671,33948)
+(34079,15236,33981,15171)
+(9251,22488,9228,22470)
+(25136,2809,25126,2717)
+(5548,47695,5543,47685)
+(13765,40800,13707,40754)
+(25216,30678,25144,30677)
+(22441,17169,22392,17106)
+(1091,4770,1054,4734)
+(36311,50073,36258,49987)
+(22461,33163,22457,33128)
+(35873,28907,35845,28867)
+(42907,15848,42904,15785)
+(6549,24897,6540,24861)
+(21928,37764,21891,37681)
+(21237,41132,21139,41086)
+(12207,24266,12173,24235)
+(40643,49770,40574,49687)
+(32833,35686,32815,35674)
+\N
+(14545,18143,14541,18098)
+(33892,42783,33884,42707)
+(33933,8381,33921,8369)
+(12450,19044,12403,19002)
+(10176,45158,10088,45145)
+(35828,12080,35732,12022)
+(28102,13694,28061,13666)
+(49432,31744,49340,31711)
+(16192,37743,16162,37697)
+(46830,867,46756,790)
+(9200,28048,9159,27986)
+(13397,19369,13340,19288)
+(30879,43562,30785,43545)
+(21995,48224,21920,48143)
+\N
+(11871,47569,11809,47568)
+(29366,22196,29280,22154)
+(26243,28176,26203,28116)
+(28995,35031,28906,35014)
+(29384,39276,29352,39183)
+(8497,13798,8471,13789)
+(7412,27226,7334,27220)
+(25403,47678,25363,47654)
+(11599,5556,11574,5502)
+(44056,5123,44008,5111)
+(49603,30877,49579,30840)
+(32261,45876,32206,45865)
+(35104,41659,35048,41587)
+\N
+(5457,35844,5376,35782)
+(29423,3977,29354,3959)
+(18059,3001,17965,2961)
+(8509,5691,8463,5620)
+\N
+(27118,5762,27083,5747)
+(2991,48605,2939,48559)
+(44482,3484,44425,3459)
+(45143,16439,45046,16365)
+(2236,37531,2147,37530)
+(41561,3217,41490,3210)
+\N
+(6270,27200,6171,27166)
+(49195,24871,49138,24798)
+\N
+(46985,38881,46897,38845)
+(37486,23522,37404,23441)
+(26907,14490,26900,14391)
+(30829,16111,30756,16056)
+(3644,17291,3587,17262)
+(20508,49775,20472,49680)
+\N
+(43279,8972,43198,8936)
+(33744,7470,33734,7439)
+(46303,20538,46284,20498)
+(10365,48246,10291,48154)
+(12636,24987,12545,24933)
+(40998,46992,40989,46916)
+(30536,6073,30531,6018)
+(22102,9643,22051,9594)
+(18616,34348,18530,34332)
+(8222,8907,8123,8848)
+(45698,28860,45698,28770)
+(26958,1748,26924,1726)
+\N
+(26735,35073,26659,35025)
+(48370,40813,48293,40737)
+(13140,993,13108,934)
+(10588,22893,10528,22883)
+(23645,40789,23567,40698)
+(49548,12374,49546,12329)
+(41135,39626,41100,39602)
+(41374,10856,41328,10769)
+(12234,5765,12146,5674)
+(12832,46941,12764,46917)
+(47886,34532,47851,34500)
+(23777,10549,23735,10495)
+(1291,16913,1194,16873)
+\N
+(29239,30554,29202,30500)
+\N
+(36485,30007,36454,29924)
+(7067,11320,7045,11229)
+(16939,30482,16904,30462)
+(27423,34386,27379,34303)
+(35170,32021,35155,31979)
+(42570,36477,42474,36457)
+(19695,679,19682,594)
+(47537,39450,47446,39450)
+(19410,22942,19375,22922)
+(34216,40166,34152,40158)
+(37000,24351,36972,24299)
+(24989,1681,24954,1672)
+(54,38679,3,38602)
+(41461,40693,41411,40599)
+(7576,46054,7545,45963)
+(35505,28262,35413,28222)
+(1158,16976,1145,16927)
+(23494,42291,23437,42229)
+(32894,32519,32880,32485)
+(604,13413,509,13401)
+(18396,19712,18355,19646)
+\N
+(26657,28234,26597,28191)
+(24240,47211,24154,47191)
+(41778,10741,41766,10730)
+(44022,43776,44010,43677)
+(35967,30055,35906,29969)
+(28878,18042,28806,18027)
+(31507,27302,31428,27267)
+(13267,21935,13265,21872)
+(122,46832,64,46762)
+(10348,45916,10306,45844)
+(22962,12644,22927,12607)
+(6320,22290,6284,22247)
+(2297,11372,2216,11298)
+(29366,36660,29325,36654)
+(13962,39307,13921,39220)
+(11094,19151,11092,19143)
+(32289,23776,32258,23760)
+\N
+(36044,17356,35956,17273)
+(46304,38692,46232,38675)
+(10934,42999,10922,42909)
+(4271,21177,4207,21093)
+(7837,19926,7747,19905)
+(25537,36605,25477,36584)
+(22161,14999,22079,14962)
+(5127,31243,5074,31213)
+\N
+(14904,40664,14838,40593)
+(29308,8480,29268,8438)
+(17731,7410,17699,7352)
+(44840,29293,44797,29248)
+(15523,31519,15505,31485)
+(34429,38479,34421,38478)
+(3530,23456,3440,23390)
+(4699,6889,4603,6796)
+(47405,48524,47389,48514)
+\N
+(23357,43160,23305,43156)
+(16923,1995,16860,1937)
+(47592,33853,47537,33758)
+(31624,37490,31595,37473)
+(42321,13380,42303,13337)
+(3088,16094,3079,16060)
+(22884,2955,22856,2857)
+(17784,23073,17724,23044)
+(32638,45577,32553,45512)
+(13876,44091,13801,44000)
+(27844,24384,27758,24330)
+(28178,10225,28155,10167)
+(39910,14277,39857,14241)
+(30372,19524,30301,19514)
+(38732,43151,38724,43151)
+(32628,2068,32547,2068)
+(13950,28652,13932,28566)
+(38996,41070,38919,40993)
+(31759,45246,31676,45215)
+\N
+(5424,34145,5382,34106)
+(14727,45600,14699,45547)
+\N
+(31429,21537,31414,21499)
+(14740,3420,14650,3323)
+(21793,39498,21743,39471)
+(18102,25924,18037,25868)
+(33299,683,33213,594)
+(45882,48765,45809,48721)
+(49215,4098,49180,4067)
+(49698,33743,49614,33663)
+(21532,5215,21514,5151)
+(24840,26877,24826,26808)
+(32680,28433,32631,28364)
+(20661,27511,20584,27414)
+(28048,30385,28009,30315)
+(45403,42533,45389,42464)
+(46531,36947,46531,36850)
+(36943,32817,36865,32737)
+\N
+(37984,43763,37888,43748)
+(20593,10650,20557,10610)
+(5387,40595,5326,40585)
+(34412,10600,34352,10539)
+(7237,47546,7206,47451)
+(39931,26644,39915,26598)
+(29843,4734,29800,4669)
+(37503,8867,37406,8821)
+(2583,2373,2570,2294)
+(29275,46433,29256,46350)
+(3332,45620,3287,45581)
+(22472,39287,22472,39257)
+(36786,18907,36708,18884)
+(45503,28576,45482,28494)
+(33262,28386,33163,28365)
+(3606,49757,3538,49697)
+(2082,49380,1991,49281)
+(12065,3734,11983,3663)
+(15606,9048,15596,9028)
+(14687,19309,14637,19263)
+(4568,15461,4499,15428)
+\N
+(43938,7429,43923,7391)
+\N
+(2168,50012,2108,49914)
+(16022,8934,15963,8928)
+(24567,39147,24561,39102)
+\N
+(42781,14149,42765,14088)
+(39501,21084,39468,21078)
+(6697,29628,6693,29584)
+(11441,16164,11364,16125)
+(39946,1920,39868,1844)
+\N
+(18138,45512,18111,45438)
+\N
+(20799,41217,20718,41138)
+(30264,16697,30240,16639)
+\N
+(30746,50040,30727,49992)
+(37429,43273,37423,43205)
+(22854,28863,22789,28810)
+(11380,48298,11287,48242)
+(16471,37273,16439,37223)
+(32737,39842,32661,39811)
+(30959,3447,30949,3357)
+(36396,13263,36348,13187)
+(29607,14625,29531,14619)
+(7851,43399,7824,43334)
+(38515,14575,38496,14492)
+(29125,3289,29086,3264)
+(6866,10476,6839,10424)
+(318,31489,235,31404)
+(1140,7007,1113,6945)
+(36574,9291,36484,9275)
+\N
+(40320,40937,40246,40866)
+(588,25849,552,25801)
+(6728,42539,6645,42507)
+(12180,6185,12123,6123)
+(32913,44123,32899,44037)
+(25464,16803,25441,16749)
+(23711,5829,23695,5750)
+(31424,34930,31377,34906)
+(42171,8298,42124,8222)
+(451,31104,375,31083)
+(39996,3278,39943,3260)
+(25816,40396,25735,40362)
+(34471,28587,34399,28547)
+(45344,21540,45297,21496)
+(27269,16787,27246,16763)
+(18070,4469,18022,4423)
+\N
+(12668,16367,12645,16295)
+(13823,17276,13730,17251)
+(20555,45544,20511,45498)
+(35893,42189,35861,42177)
+(37081,45730,37076,45705)
+(17270,15651,17201,15552)
+(48690,46034,48667,45945)
+(456,16088,368,16023)
+(48707,12416,48670,12363)
+(29692,11509,29614,11483)
+(7005,3668,6981,3574)
+(12162,389,12103,309)
+(12371,24983,12366,24964)
+(6886,48414,6868,48327)
+(10653,26234,10624,26142)
+(8526,48205,8517,48117)
+(10521,31892,10480,31798)
+(43353,1086,43281,1071)
+(21007,35650,20998,35649)
+(2343,4396,2310,4320)
+(29379,12895,29284,12891)
+(27662,17407,27570,17313)
+(9845,29346,9807,29321)
+(43855,38669,43790,38599)
+\N
+(20461,44189,20397,44158)
+(11627,17368,11581,17289)
+(2971,38855,2938,38807)
+(43204,47082,43128,47018)
+(9930,46902,9909,46871)
+(30561,48461,30536,48365)
+(44059,7591,44038,7563)
+(46260,16898,46162,16886)
+(27491,2891,27396,2814)
+(36512,26034,36455,25941)
+(31193,20022,31100,19942)
+(17057,13643,16960,13621)
+(26897,3399,26844,3318)
+(1760,5504,1683,5431)
+(29347,5511,29346,5450)
+(38761,42083,38688,41999)
+(11226,4089,11165,4068)
+(46427,42983,46361,42970)
+(12958,30737,12912,30712)
+(44432,46521,44333,46443)
+(16124,2948,16113,2852)
+\N
+(24704,25422,24635,25340)
+(30833,46152,30790,46122)
+(4487,37006,4473,36968)
+(41047,23376,41036,23327)
+(16312,49392,16298,49330)
+(30081,14687,30042,14660)
+(11160,13954,11103,13938)
+(33207,23246,33143,23168)
+(14872,7635,14860,7585)
+(20139,23987,20059,23955)
+(10946,49757,10923,49746)
+(39438,36158,39426,36134)
+(35502,2385,35464,2327)
+(17073,42173,16987,42130)
+(6079,17258,6068,17195)
+(40458,15752,40364,15728)
+(23340,7879,23313,7806)
+\N
+(31819,15096,31762,15059)
+(31159,40864,31158,40780)
+(26975,32144,26915,32113)
+(34530,10378,34440,10298)
+(18855,49577,18780,49528)
+(16787,16625,16723,16586)
+(32330,26538,32314,26458)
+(34270,28674,34265,28595)
+(10022,16026,10006,15962)
+(23143,1479,23095,1469)
+(33676,4483,33583,4408)
+(31066,22074,31059,22035)
+(21603,47121,21563,47082)
+(30051,4244,30021,4157)
+(30634,39478,30615,39446)
+(34404,48724,34393,48724)
+(31103,21414,31039,21380)
+(22945,47397,22849,47313)
+(18133,32025,18073,31941)
+(4053,25759,3977,25667)
+(39185,39091,39102,39068)
+(43287,7407,43225,7314)
+(13137,31188,13112,31182)
+(46264,1438,46258,1389)
+(22804,43892,22769,43822)
+(7542,1044,7487,983)
+(33022,8321,32925,8267)
+(384,39161,286,39073)
+(28205,24401,28142,24382)
+(31708,39086,31696,39026)
+(36626,15708,36560,15690)
+(17099,16924,17079,16924)
+(10817,6989,10747,6955)
+(24338,19293,24291,19277)
+(27566,17576,27544,17545)
+(23041,38384,22970,38320)
+\N
+(12786,8485,12702,8435)
+(13876,49473,13813,49448)
+(31585,46998,31490,46929)
+\N
+(30227,8768,30206,8715)
+(32062,39306,32023,39292)
+(25003,35753,24921,35687)
+(3281,6758,3232,6704)
+\N
+(11395,30299,11376,30220)
+(5088,15275,5007,15203)
+(31100,39538,31003,39444)
+(2741,17877,2726,17793)
+(42897,48620,42860,48537)
+(4230,15778,4181,15776)
+(17835,27530,17815,27431)
+(34189,10933,34135,10921)
+(7537,39974,7494,39973)
+(21554,3507,21528,3476)
+(9350,32326,9273,32275)
+(16455,8874,16420,8793)
+\N
+(7346,34235,7330,34224)
+(16417,48134,16352,48066)
+\N
+(41916,4971,41849,4886)
+(15856,1522,15807,1521)
+(41549,40218,41494,40144)
+\N
+(9978,16226,9972,16181)
+(14856,13312,14808,13283)
+(38490,41641,38428,41583)
+(25828,7438,25807,7378)
+(21876,30633,21796,30587)
+(1908,14279,1825,14247)
+\N
+(32207,10251,32121,10184)
+(370,9493,328,9441)
+(42072,17634,41974,17600)
+\N
+(47298,9910,47235,9846)
+(17856,11266,17782,11225)
+(35009,21400,34956,21396)
+(18337,11145,18335,11133)
+\N
+(25425,9139,25381,9085)
+(35642,27783,35621,27782)
+(3629,33164,3575,33163)
+(17151,41255,17115,41204)
+(17417,5835,17402,5751)
+(33407,14226,33329,14141)
+(1930,29955,1889,29931)
+(41101,10942,41065,10844)
+(36333,27288,36281,27233)
+(21423,36868,21367,36825)
+(36385,19566,36341,19510)
+(27073,38301,27066,38232)
+(43989,34187,43984,34174)
+(48366,7488,48316,7483)
+(37497,36075,37415,36043)
+(46917,9891,46887,9870)
+(37179,657,37103,634)
+(3877,44736,3811,44684)
+(30556,2975,30547,2962)
+(7629,11447,7547,11416)
+(45687,48147,45591,48088)
+(5635,7184,5571,7146)
+(9611,47327,9541,47246)
+(7119,48224,7117,48152)
+(15233,26480,15138,26430)
+(37468,1526,37466,1513)
+\N
+(20855,2786,20828,2711)
+(30538,44084,30480,44061)
+(42231,41527,42149,41454)
+(14963,13239,14952,13146)
+(26819,43996,26745,43934)
+(42172,35953,42086,35928)
+(28785,12611,28710,12534)
+(14089,1704,14047,1629)
+(4343,26242,4341,26169)
+(20327,42244,20231,42212)
+(33671,12700,33666,12630)
+(42144,32642,42128,32569)
+(26590,19483,26503,19442)
+(21741,46259,21723,46226)
+(8822,34700,8760,34693)
+\N
+(2710,33521,2675,33505)
+(26067,19998,26026,19989)
+(12244,34509,12202,34489)
+\N
+(47162,598,47119,499)
+(33093,49382,33068,49359)
+(35170,26340,35153,26264)
+(22552,35785,22490,35735)
+(36791,23032,36781,22976)
+(22857,10857,22833,10797)
+\N
+(47207,37405,47138,37365)
+(21867,2836,21854,2811)
+(3387,31487,3311,31456)
+(47174,48121,47167,48101)
+(24415,22232,24366,22224)
+(7970,29251,7959,29211)
+(18635,31294,18539,31221)
+(8403,13380,8370,13372)
+(738,18097,737,18054)
+(37238,19195,37218,19114)
+(582,47934,570,47897)
+(12359,4635,12350,4619)
+(43272,2013,43195,1958)
+(47568,27149,47521,27088)
+(24695,12827,24661,12796)
+(26259,14077,26168,14019)
+\N
+(48478,36135,48425,36092)
+(5230,39250,5206,39174)
+(3488,18562,3423,18489)
+(39502,16331,39460,16275)
+(18296,1478,18233,1471)
+\N
+(28627,12430,28559,12410)
+(25257,21981,25206,21954)
+\N
+(2410,41192,2325,41142)
+(43681,9631,43587,9538)
+\N
+(15086,45309,15064,45270)
+(13824,40807,13759,40787)
+(7090,2207,7062,2159)
+(3685,2480,3630,2391)
+(14810,38335,14801,38275)
+(26668,38018,26581,38012)
+(45562,1517,45506,1424)
+(11001,32481,10962,32402)
+(27743,25245,27673,25161)
+(15952,10598,15948,10535)
+(12705,13308,12694,13232)
+(31992,21195,31975,21118)
+(25834,16652,25745,16626)
+(21022,43625,20990,43576)
+(45094,27254,45000,27240)
+(9688,42601,9643,42533)
+(17746,24659,17694,24616)
+(1509,38859,1503,38809)
+(2067,20438,2041,20369)
+(7885,44528,7839,44444)
+(27432,33052,27422,32987)
+(26577,17157,26563,17142)
+(10815,35985,10734,35908)
+(44891,24067,44794,23979)
+(48626,1900,48595,1850)
+\N
+(40659,35541,40659,35489)
+(22231,26628,22210,26579)
+(37408,23016,37375,22919)
+(5920,15916,5906,15895)
+\N
+(33125,9952,33037,9880)
+(12142,29705,12141,29670)
+(3672,20995,3649,20899)
+(39147,31967,39101,31907)
+\N
+(33812,48458,33748,48399)
+(25038,14639,24978,14586)
+(3859,16010,3857,15994)
+(31926,39496,31889,39417)
+(49300,28064,49297,28026)
+(24121,38305,24048,38256)
+(9252,4205,9155,4149)
+(36124,30451,36056,30395)
+(28809,49557,28794,49533)
+(30500,44504,30471,44476)
+(26866,42395,26822,42332)
+(48195,1784,48101,1734)
+(46201,14109,46112,14097)
+\N
+(2415,9975,2354,9914)
+(30485,9581,30415,9558)
+(6385,36838,6305,36838)
+(2799,11189,2723,11095)
+(21998,20503,21923,20406)
+(29151,10714,29090,10671)
+(28850,29276,28757,29207)
+(43386,48845,43305,48834)
+(25173,8310,25101,8294)
+(34244,32352,34204,32342)
+(35595,23728,35533,23672)
+(1122,13581,1119,13538)
+\N
+(388,21716,296,21678)
+(48782,11064,48701,11005)
+(40293,12997,40213,12927)
+\N
+(28194,46428,28113,46414)
+(4791,18118,4708,18105)
+(471,29808,448,29775)
+(3536,37803,3447,37737)
+(1336,28416,1275,28392)
+(16484,48478,16422,48454)
+(25846,19320,25811,19296)
+(48669,27703,48575,27615)
+(24032,44217,24029,44127)
+(12236,5019,12233,4986)
+(1179,29838,1113,29778)
+(33893,22049,33867,21955)
+(16718,19462,16700,19440)
+(17992,49438,17894,49433)
+(35163,39941,35081,39885)
+(33897,8362,33853,8328)
+(2480,6640,2456,6599)
+(28011,19729,27937,19679)
+(15819,41516,15809,41440)
+(29818,9136,29747,9089)
+(28551,37016,28529,36941)
+(36406,26879,36374,26872)
+(16821,48925,16758,48914)
+(23692,48163,23595,48160)
+\N
+(4803,10619,4759,10522)
+(46600,33581,46553,33518)
+(41349,11767,41310,11710)
+(20856,29642,20799,29562)
+(16559,46161,16504,46131)
+(23041,1300,23003,1287)
+(16630,44902,16554,44853)
+(43065,14299,43013,14274)
+(24818,22397,24796,22348)
+(22282,24949,22218,24921)
+(36668,28538,36631,28456)
+(8080,1220,8018,1146)
+(47282,34302,47277,34269)
+(35603,33558,35557,33495)
+(44764,32189,44700,32175)
+\N
+(46488,23965,46449,23868)
+(46314,15047,46216,15013)
+(6348,25381,6286,25363)
+(3871,49288,3819,49251)
+(462,38894,398,38867)
+(23196,29214,23136,29169)
+(29024,9775,29016,9759)
+(42016,18555,41934,18472)
+(8772,45981,8692,45973)
+(11028,1351,10986,1278)
+(26684,21668,26641,21656)
+\N
+(37262,26005,37260,25947)
+(14899,44069,14814,44066)
+\N
+(39635,18701,39587,18698)
+(28528,22948,28457,22857)
+(7755,36528,7681,36454)
+(32461,1172,32427,1106)
+\N
+(18775,27359,18736,27329)
+(15379,20031,15337,19934)
+(45888,33592,45881,33544)
+(44013,24694,43962,24645)
+\N
+(43347,10699,43343,10699)
+(49999,27218,49908,27176)
+(13698,17326,13630,17317)
+(34850,44313,34775,44302)
+(38076,49235,37983,49214)
+(35570,40218,35500,40136)
+(40062,28973,40032,28878)
+(3567,39847,3523,39781)
+(498,2442,480,2401)
+(29660,43620,29577,43561)
+(10946,47356,10878,47351)
+(8073,44233,8005,44144)
+(9720,13473,9710,13462)
+(3643,38014,3598,37932)
+(16887,1408,16810,1375)
+(7559,27914,7508,27874)
+(30356,18573,30275,18569)
+(12193,48176,12130,48116)
+(11884,7756,11819,7731)
+(18293,33272,18227,33234)
+(46697,47874,46696,47828)
+(35788,32517,35760,32446)
+(33877,36987,33821,36958)
+(31253,22819,31184,22808)
+(7744,23115,7729,23103)
+(21291,39817,21219,39778)
+(13877,43379,13861,43290)
+(42955,1406,42876,1382)
+(49232,15950,49210,15880)
+(48419,32001,48326,31902)
+(18940,43246,18860,43150)
+(32317,38240,32310,38201)
+(11307,48298,11304,48222)
+(38015,18190,38000,18176)
+(27821,1177,27818,1131)
+(18935,26757,18865,26682)
+(42659,48284,42562,48244)
+(30185,23350,30146,23291)
+\N
+(16496,11970,16441,11919)
+(162,26040,120,25963)
+(24238,47784,24185,47746)
+(32326,8612,32274,8568)
+(26141,13423,26051,13407)
+(40132,22815,40089,22812)
+(21151,48794,21056,48740)
+\N
+(22044,28358,22031,28334)
+(6680,14746,6605,14669)
+(40686,25139,40632,25070)
+(22823,27549,22816,27507)
+(2513,22841,2427,22811)
+(36316,27787,36218,27728)
+(554,35489,540,35441)
+(536,30674,534,30609)
+\N
+(25385,38468,25295,38416)
+(19467,47386,19437,47317)
+(22425,38591,22387,38536)
+(32493,17321,32396,17298)
+(40115,47315,40109,47235)
+(25002,2107,24963,2104)
+(3901,9790,3898,9706)
+\N
+(40316,1721,40315,1658)
+(40089,3454,40074,3443)
+(793,17897,761,17897)
+(6490,43552,6434,43522)
+(10825,487,10820,405)
+(47703,36067,47641,36011)
+\N
+(4480,11671,4468,11653)
+(37713,10642,37711,10615)
+(12315,5302,12273,5203)
+\N
+(8709,6617,8647,6557)
+(24467,30535,24455,30494)
+(40440,32757,40369,32668)
+(49449,42447,49426,42428)
+(44867,11197,44792,11137)
+(39173,33241,39143,33187)
+(43836,2212,43803,2184)
+(23819,47613,23739,47575)
+(20583,2134,20485,2042)
+(48922,6169,48889,6111)
+(5230,44613,5131,44604)
+(37060,8051,37032,7975)
+(19148,36711,19112,36704)
+(36305,4216,36243,4118)
+(6329,39089,6302,39047)
+(36703,26367,36623,26307)
+(44753,19721,44701,19631)
+(42094,43310,42094,43285)
+(4276,22377,4241,22352)
+(30329,18906,30327,18815)
+(21970,19605,21871,19590)
+(23722,41924,23709,41861)
+(30965,39775,30908,39692)
+(32394,37895,32351,37890)
+(23968,42162,23873,42095)
+(1776,2621,1732,2548)
+(24951,47758,24900,47679)
+(32917,35771,32847,35753)
+(5428,27773,5343,27769)
+\N
+(19650,142,19630,51)
+(39769,17276,39743,17229)
+(5171,24562,5119,24470)
+(32976,35249,32917,35199)
+\N
+(4174,24603,4099,24504)
+(38565,36960,38535,36926)
+(39084,4328,39031,4301)
+(32153,38043,32070,37990)
+(38085,30640,38041,30603)
+(14269,18426,14185,18422)
+(42941,30850,42892,30788)
+(32403,25999,32339,25960)
+(16906,191,16816,139)
+(3456,48722,3418,48721)
+(3050,18287,3022,18243)
+(6331,8439,6234,8364)
+(5331,20797,5319,20793)
+(39225,37408,39216,37348)
+(34510,19838,34488,19810)
+(45789,33873,45770,33786)
+(369,1457,278,1409)
+(16531,43785,16482,43729)
+(11974,14789,11973,14730)
+(23128,6811,23094,6798)
+(43962,33659,43944,33599)
+(20967,3115,20947,3079)
+(39257,38606,39241,38595)
+(22431,8246,22381,8235)
+(26007,14672,25996,14593)
+(24762,4261,24675,4261)
+(35402,32077,35343,31988)
+(5141,16476,5139,16393)
+(16439,17564,16344,17472)
+(36983,46663,36903,46567)
+(35170,14144,35162,14048)
+(22290,7841,22283,7810)
+(22414,38398,22404,38319)
+(9011,18177,8932,18150)
+\N
+(154,4019,138,3990)
+(20447,4998,20383,4970)
+(38867,35757,38795,35659)
+(32322,15845,32227,15804)
+\N
+(29889,12142,29852,12055)
+(36235,36918,36217,36897)
+(41620,6581,41568,6581)
+(24758,38504,24731,38483)
+(42524,12904,42473,12895)
+(17954,49975,17865,49915)
+(1938,39019,1927,39013)
+(4864,33279,4817,33258)
+(45373,41967,45313,41885)
+(28786,19028,28782,18978)
+(41913,44950,41911,44908)
+(33408,14698,33392,14681)
+(27602,3460,27576,3419)
+(3336,3728,3334,3715)
+(9099,910,9080,813)
+(34141,6403,34071,6367)
+(48270,17216,48252,17130)
+(2549,16546,2461,16474)
+(27802,33669,27735,33642)
+(48419,1682,48323,1583)
+(5094,41211,5002,41123)
+(11192,6217,11190,6146)
+(6979,18503,6959,18421)
+(41210,48187,41140,48143)
+(15303,29527,15273,29441)
+(12326,45572,12267,45570)
+(29293,5861,29212,5826)
+(23847,37241,23761,37178)
+(44656,23926,44653,23831)
+(30043,16194,29977,16105)
+(902,9358,879,9339)
+(23850,46501,23834,46494)
+(42333,13300,42287,13246)
+(25226,18086,25169,18005)
+(40252,12082,40183,12038)
+(49275,18076,49216,18055)
+(8255,28878,8238,28862)
+(11325,41286,11320,41235)
+(16948,18588,16926,18528)
+(31394,1099,31374,1038)
+(30705,35772,30637,35766)
+(3858,39131,3771,39125)
+(17565,24892,17515,24808)
+(9221,49715,9216,49661)
+(44945,25769,44875,25722)
+(33408,13563,33310,13527)
+(48505,4407,48408,4373)
+(21859,37217,21763,37217)
+(39393,14422,39335,14364)
+\N
+(19905,1154,19841,1098)
+(25946,10388,25906,10366)
+(10104,13748,10027,13746)
+(5822,24629,5820,24599)
+(38194,11287,38127,11252)
+(15694,46757,15625,46716)
+(326,18837,285,18817)
+(49611,47078,49533,47052)
+(48233,18850,48150,18842)
+\N
+(29239,9962,29208,9875)
+(40062,44554,39973,44460)
+(19135,20729,19059,20643)
+(31969,40664,31896,40643)
+\N
+(3725,9191,3711,9095)
+(44280,40158,44264,40108)
+(37236,42756,37160,42694)
+(27958,19055,27888,18959)
+(45270,17661,45187,17601)
+(12115,39546,12061,39525)
+(10227,32295,10168,32231)
+(39264,31123,39226,31085)
+(6566,40000,6532,39904)
+(30058,6975,30012,6903)
+(49631,6909,49597,6823)
+(42168,10926,42134,10905)
+(44892,30042,44858,29970)
+(19540,19803,19495,19788)
+(18403,25454,18371,25404)
+(22929,26795,22841,26722)
+(16648,30213,16626,30174)
+(3440,7495,3429,7468)
+(30708,49028,30643,48998)
+(26258,14164,26255,14151)
+(44206,31653,44121,31637)
+(1510,15179,1426,15130)
+(6986,30496,6887,30416)
+(7192,43403,7138,43339)
+(39921,22071,39866,21976)
+(45870,17011,45796,16919)
+(15939,9563,15917,9539)
+(23728,24737,23691,24725)
+(6444,40416,6363,40375)
+(21899,23861,21857,23765)
+(20610,36765,20533,36742)
+(46520,33082,46433,32983)
+(21406,20902,21311,20895)
+\N
+(37913,42300,37814,42269)
+(18216,8177,18161,8173)
+(32967,8258,32899,8244)
+(14978,40230,14971,40149)
+(30343,39152,30266,39101)
+(25917,5835,25843,5806)
+\N
+(5169,45366,5141,45314)
+\N
+(16221,20898,16209,20875)
+(13151,19869,13145,19811)
+(44399,2801,44337,2713)
+\N
+(10959,48311,10957,48230)
+(4794,11711,4732,11661)
+(764,10149,762,10091)
+(15985,46067,15898,46028)
+(41434,22870,41342,22867)
+(43769,23796,43743,23756)
+(10017,18440,9919,18384)
+(21141,43119,21097,43112)
+(7782,13424,7694,13398)
+(25088,36224,25059,36150)
+(46325,48722,46241,48631)
+\N
+(11042,33125,11011,33071)
+(22347,13460,22290,13375)
+(3508,20538,3483,20536)
+(5331,42945,5272,42875)
+\N
+(2368,15537,2339,15503)
+(45314,31830,45254,31817)
+(34358,2649,34319,2589)
+\N
+(17576,30407,17572,30323)
+(29836,41324,29746,41287)
+(21036,39996,21014,39899)
+(26886,6460,26787,6400)
+(15709,5625,15627,5558)
+(37415,15979,37414,15911)
+(47761,16860,47728,16813)
+(35814,48252,35755,48173)
+\N
+(28559,20810,28496,20715)
+(12034,11921,12002,11905)
+(1818,27450,1805,27406)
+(33810,45499,33806,45413)
+(17376,18175,17323,18138)
+(34106,28135,34049,28106)
+(44947,23165,44919,23091)
+(37670,41904,37616,41840)
+(12614,15027,12555,14969)
+(43301,75,43227,43)
+\N
+(27526,15096,27450,15088)
+(26947,33409,26853,33333)
+(1537,43572,1471,43499)
+\N
+(21607,35452,21605,35375)
+(24869,46565,24818,46531)
+(4774,30335,4723,30257)
+(11615,18316,11579,18310)
+(18444,15819,18354,15763)
+(47267,22574,47203,22518)
+(22287,49538,22203,49511)
+(43010,16270,43010,16202)
+\N
+(1623,8350,1578,8254)
+(21220,43808,21137,43748)
+(40397,16471,40358,16434)
+\N
+(34839,1377,34744,1327)
+(17096,5730,17090,5637)
+\N
+(28156,37782,28155,37723)
+(3672,5686,3586,5638)
+(21856,48656,21840,48638)
+(6907,7791,6892,7761)
+(17952,21370,17862,21350)
+(37793,13461,37784,13381)
+(14740,49655,14709,49604)
+(21690,6337,21593,6289)
+\N
+(10423,33548,10364,33498)
+\N
+(39187,23274,39136,23197)
+\N
+(21882,37247,21835,37167)
+\N
+(11343,16957,11281,16914)
+(38279,43400,38264,43352)
+(23167,30271,23086,30224)
+(46278,6037,46180,5964)
+(28626,31165,28605,31095)
+\N
+(31018,367,30946,333)
+(23541,12541,23530,12523)
+(49741,14535,49691,14511)
+(31444,12702,31425,12612)
+\N
+(22406,26536,22316,26534)
+(6807,9761,6758,9723)
+(15698,1941,15687,1848)
+(49310,4625,49295,4584)
+(21345,18939,21269,18887)
+(31433,30493,31411,30439)
+(44980,12400,44950,12372)
+(25054,13949,24984,13949)
+(40538,7253,40483,7212)
+(16967,8627,16936,8604)
+(26872,3646,26804,3594)
+(24575,42883,24530,42883)
+(11823,5755,11771,5721)
+\N
+(2553,46189,2513,46174)
+(24993,14552,24898,14470)
+(28453,1719,28419,1665)
+(8925,22603,8878,22589)
+(47635,15380,47546,15378)
+(35378,18112,35324,18058)
+(27347,22264,27293,22200)
+\N
+(44323,29044,44273,28958)
+(41538,38324,41484,38290)
+(19128,49932,19112,49849)
+(17904,12548,17867,12503)
+(35103,14426,35092,14336)
+(29807,10142,29714,10052)
+(44507,22903,44462,22847)
+(11419,13324,11399,13251)
+(8573,42221,8562,42123)
+(46798,45843,46765,45765)
+(12028,31783,11967,31749)
+(10635,45300,10604,45251)
+(9626,8248,9587,8194)
+(18290,741,18246,732)
+(39949,44672,39932,44641)
+(7897,11692,7893,11637)
+(20165,42246,20112,42168)
+(4341,48390,4285,48338)
+(30126,28913,30088,28869)
+(40565,1733,40472,1721)
+(9981,30147,9915,30133)
+(47292,25511,47217,25462)
+(20137,24489,20104,24392)
+(2385,28283,2381,28189)
+(20429,10052,20357,10009)
+(8395,38568,8348,38480)
+(17381,36112,17349,36038)
+(37845,30953,37759,30926)
+(27452,12732,27411,12652)
+(38196,32186,38114,32116)
+\N
+(6527,49356,6508,49315)
+(43891,29789,43856,29723)
+(6146,37192,6085,37107)
+\N
+(42012,28897,41939,28808)
+\N
+(14909,13815,14846,13757)
+(11120,24095,11035,24049)
+(3132,41545,3053,41526)
+(40084,40315,39994,40261)
+(39671,17445,39576,17361)
+(47135,35853,47085,35831)
+(39297,1941,39290,1911)
+(47143,35898,47072,35880)
+(16017,6711,15989,6686)
+(47110,30305,47087,30213)
+(38102,27639,38091,27602)
+(17954,22544,17863,22453)
+(39891,11791,39815,11739)
+(13996,20290,13922,20278)
+(22284,23143,22190,23081)
+(25345,24019,25313,24017)
+(47134,44803,47055,44761)
+(41360,16573,41326,16503)
+(10464,1071,10457,998)
+\N
+(23515,47517,23451,47499)
+(9308,8452,9238,8392)
+(28695,5657,28671,5644)
+(45104,9913,45077,9871)
+(337,455,240,359)
+(11562,45479,11472,45428)
+(11952,18466,11931,18425)
+\N
+(35789,5154,35775,5128)
+(19024,18299,18979,18230)
+(43056,38113,42975,38067)
+(10075,26847,10064,26806)
+(3065,8107,3029,8038)
+(24766,19059,24749,18985)
+(14438,24805,14413,24708)
+(9523,3058,9485,2998)
+(24516,31262,24478,31204)
+(49513,26044,49434,26035)
+(14110,38528,14103,38461)
+(31679,35618,31619,35618)
+(10029,20258,10008,20248)
+(39269,37586,39233,37539)
+(12343,8197,12247,8113)
+(11155,44223,11111,44134)
+(25437,20606,25338,20534)
+(46604,16156,46570,16131)
+(4636,14004,4592,13941)
+(15975,29628,15912,29556)
+(49887,24274,49805,24184)
+(11812,13440,11723,13418)
+(21589,38179,21531,38085)
+(32255,44463,32219,44454)
+(15023,12698,14989,12687)
+(28906,48630,28818,48568)
+(28886,38905,28861,38832)
+(34786,22285,34740,22240)
+\N
+(46513,46780,46425,46780)
+\N
+(26626,31759,26551,31677)
+(19792,25967,19763,25933)
+(20432,14394,20388,14365)
+(27092,7301,27052,7278)
+(22283,987,22198,928)
+(6197,24363,6112,24311)
+(46601,49259,46551,49231)
+(12392,48052,12363,48038)
+(46116,31386,46067,31356)
+(7354,16855,7289,16778)
+(47501,42808,47495,42761)
+(16461,25487,16391,25398)
+(42678,18798,42678,18756)
+(9466,18207,9419,18185)
+(17467,14177,17416,14097)
+(28533,31886,28487,31832)
+(13225,38472,13188,38395)
+(5180,40970,5173,40902)
+(83,10271,15,10265)
+(2111,6784,2016,6690)
+(41835,11064,41798,10995)
+(29273,48585,29181,48536)
+(29066,21615,28985,21543)
+(19805,44143,19727,44128)
+(48919,21468,48875,21467)
+(28790,34287,28721,34251)
+(10911,33074,10869,32989)
+(6111,16519,6032,16489)
+(43889,33838,43837,33768)
+(32323,21685,32304,21644)
+(9552,27819,9539,27753)
+(38266,49852,38233,49844)
+(37672,48362,37663,48277)
+(32550,47029,32529,46931)
+(46307,6620,46272,6616)
+(23192,46608,23105,46566)
+(30399,48330,30335,48239)
+(36268,25058,36235,24984)
+(19181,8120,19089,8098)
+(24376,19983,24294,19925)
+(18297,18375,18202,18292)
+\N
+(31608,6215,31575,6168)
+(12788,49510,12784,49468)
+(46071,13013,46035,12991)
+(27647,8218,27582,8201)
+(49580,11076,49537,11050)
+\N
+(35501,33782,35501,33687)
+(19969,3148,19964,3082)
+(37728,49153,37726,49152)
+(5322,48440,5321,48435)
+(48003,10096,47904,10005)
+(39361,22318,39348,22236)
+(30488,7456,30437,7430)
+(18533,39476,18481,39394)
+(39462,23701,39433,23604)
+(26701,18300,26686,18235)
+(17405,35577,17387,35517)
+(33971,29928,33953,29919)
+(6328,10241,6276,10217)
+(32459,44259,32453,44217)
+(1715,42385,1647,42357)
+(48113,6960,48103,6872)
+(30561,4255,30476,4240)
+(38907,43619,38827,43553)
+(29149,20773,29070,20698)
+(17006,1543,16970,1497)
+\N
+(11737,18808,11714,18788)
+(13019,30534,13005,30481)
+(39224,31729,39191,31683)
+(4942,41680,4907,41596)
+(12287,37187,12188,37172)
+(30758,29579,30725,29531)
+\N
+(16604,17963,16581,17912)
+(19459,15888,19409,15812)
+(34696,24783,34600,24725)
+(21621,14159,21558,14110)
+(12193,46149,12145,46096)
+(37781,4715,37692,4635)
+(41854,44125,41807,44040)
+(23604,23585,23571,23533)
+(7853,36967,7797,36908)
+(2755,13279,2720,13206)
+(4314,15424,4283,15383)
+(29584,12685,29493,12594)
+(25138,33726,25042,33691)
+(38393,10270,38326,10185)
+(4247,12615,4225,12567)
+(36100,33156,36100,33107)
+(20024,40796,20016,40708)
+(3927,44892,3914,44843)
+(10317,43168,10226,43096)
+(22057,3419,22042,3334)
+(37097,21814,37025,21811)
+(32084,21564,31996,21491)
+(34079,39921,34058,39911)
+(23078,47459,23018,47373)
+(38109,616,38082,568)
+(11862,40382,11764,40292)
+(33403,33320,33389,33289)
+(36639,24829,36623,24829)
+(12995,45080,12992,45040)
+(16545,19981,16532,19891)
+(26155,10659,26154,10634)
+(24423,255,24360,213)
+(823,22487,781,22442)
+(12823,20064,12735,20040)
+(19688,11710,19681,11654)
+(2892,20452,2836,20424)
+(15533,10807,15464,10711)
+(46994,41143,46955,41082)
+(18155,2421,18069,2392)
+(2628,12688,2605,12602)
+(35128,8396,35044,8365)
+(44765,49615,44758,49524)
+(11226,44529,11178,44515)
+(31334,32463,31291,32456)
+(43224,23387,43168,23364)
+(30882,10414,30798,10395)
+(29139,967,29139,923)
+(29959,45244,29877,45223)
+(19946,217,19941,118)
+(49732,22033,49642,22012)
+(32914,15360,32879,15290)
+(47825,21097,47747,21030)
+(10788,5131,10746,5086)
+\N
+(15497,9698,15481,9678)
+(10617,47195,10601,47117)
+(42392,10583,42340,10550)
+(10753,33520,10669,33509)
+(5553,21580,5521,21527)
+(36840,12336,36817,12320)
+(49785,12554,49702,12553)
+(17737,38349,17639,38277)
+(48000,7823,47956,7814)
+(5019,3184,4931,3160)
+(30120,3524,30063,3492)
+(37044,2016,37001,1942)
+(23496,38566,23469,38528)
+(17255,48957,17200,48903)
+(27815,2138,27808,2090)
+(40440,11129,40368,11105)
+(35305,21772,35272,21717)
+(41308,45065,41229,44973)
+(14893,28807,14817,28789)
+(30776,45824,30731,45772)
+(742,40724,652,40672)
+(5985,41133,5927,41097)
+(9576,10226,9540,10218)
+(21407,23207,21323,23160)
+(44880,34228,44877,34169)
+(29146,49694,29143,49682)
+(28502,34886,28471,34832)
+\N
+(30662,5584,30604,5528)
+(12612,26081,12552,26001)
+(17166,49308,17098,49270)
+(9586,14116,9488,14104)
+(37323,47576,37264,47482)
+(48009,49713,48004,49614)
+(49308,23780,49297,23760)
+(8667,32342,8592,32294)
+(37826,48560,37822,48485)
+\N
+(24493,18653,24486,18616)
+(17914,3850,17887,3775)
+(34270,43873,34231,43826)
+(7753,44715,7660,44651)
+(44328,36364,44265,36350)
+(10146,3030,10111,2975)
+(35273,40106,35269,40062)
+\N
+(38566,43846,38547,43760)
+(12400,41394,12377,41378)
+(45196,38286,45153,38250)
+(48511,14972,48428,14883)
+(25939,36328,25886,36277)
+(38997,11007,38979,10917)
+(30342,518,30244,453)
+(6876,7468,6867,7454)
+(17566,27575,17566,27480)
+(18869,28538,18858,28475)
+(16825,33309,16726,33255)
+(14585,26111,14490,26035)
+(28743,49392,28664,49349)
+(26652,23359,26618,23297)
+\N
+(40129,33653,40102,33584)
+(41074,26393,41038,26389)
+(3869,33564,3869,33536)
+(28455,14205,28364,14163)
+(13866,45603,13770,45543)
+(21666,30586,21578,30544)
+(29978,11931,29893,11868)
+(1594,1043,1517,971)
+(948,1201,907,1156)
+(27547,13692,27545,13677)
+(13661,38184,13566,38154)
+(2389,40026,2317,39938)
+(35481,46379,35481,46320)
+\N
+(26917,45698,26864,45689)
+(23933,41617,23909,41539)
+(8912,8471,8862,8401)
+(9625,4747,9558,4692)
+(34743,35056,34721,34969)
+(39544,21762,39475,21717)
+\N
+(11741,26330,11656,26293)
+(39015,1315,38966,1285)
+(13418,44237,13326,44202)
+(2107,17672,2093,17616)
+(42448,28844,42370,28764)
+(49843,5175,49808,5145)
+(6536,23000,6467,22958)
+(11114,5822,11027,5739)
+(48457,11074,48384,11024)
+(12343,23110,12310,23074)
+(17300,24847,17276,24825)
+(8823,8253,8793,8238)
+(3449,171,3354,108)
+\N
+(21650,23955,21605,23883)
+(13260,3234,13193,3214)
+(25361,10896,25305,10806)
+(25051,25042,25011,25001)
+(25044,25088,25015,25005)
+\N
+(25007,25061,25002,25013)
+(25066,25105,25003,25007)
+(25028,25012,25015,25011)
+(25031,25057,25006,25018)
+(25015,25042,25004,25012)
+(25091,25049,25019,25019)
+(25023,25011,25000,25004)
+\N
+(25053,25104,25010,25012)
+(25058,25001,25018,25000)
+(25059,25051,25008,25016)
+(25043,25069,25007,25004)
+(25006,25101,25002,25002)
+(25095,25012,25014,25007)
+(25054,25052,25019,25013)
+(25108,25077,25009,25018)
+(25007,25023,25003,25002)
+\N
+(25076,25098,25002,25016)
+(25030,25077,25012,25006)
diff --git a/contrib/pageinspect/data/test__int.data b/contrib/pageinspect/data/test__int.data
new file mode 100644
index 0000000..b3903d0
--- /dev/null
+++ b/contrib/pageinspect/data/test__int.data
@@ -0,0 +1,7000 @@
+{18,31,54,95}
+{23,50,13,9,39}
+{99,54,77}
+{79,83,16,63,32}
+{52,41,61,79,94,87}
+{76,59,39,36,21}
+{}
+{41,79,76,96,3}
+{25,59,5,96,32}
+{92,58,12,57}
+{24,48,41,88}
+{39,5,17}
+{10,41,78,25,35}
+{31,89,4}
+{68,74,94}
+{97,78,44,68,81,16}
+{87,76}
+{30,81}
+{72,20,99,26}
+{87,90,98,40,44}
+{24,99,66,61}
+{79,8,48,16}
+{62,99,48,80,75,39}
+{10,60,35,15}
+{45,71,10,97,56}
+{64,79,19,31}
+{30,57,42,31,45}
+{61,42,14,26}
+{12,38,65,36,56,36}
+{17,62,18,56}
+{84,85,90,60,55,17}
+{27,11,82,20,43}
+{14,27,18,48,39,51}
+{53,13,52}
+{56,35,81,60,27}
+{79,89,89,7}
+{65,17,31,17,29,85}
+{21,3}
+{53,55,16,83,4}
+{62,3,63}
+{73,40,99}
+{23,80}
+{2,74,42,37,21}
+{12,16}
+{80,60}
+{19,62,34}
+{38,19,31,6,15,2}
+{63,96,64,4,36,15}
+{9,3}
+{91,87,15,18,7,66}
+{17,10}
+{77,96}
+{11,43,31,2,89}
+{17,77,89,50}
+{24,6,61,88,51}
+{61,50,59,90,5,89}
+{58,1,39,48}
+{78,36,70,92}
+{43,3,22,95,51}
+{}
+{88,64,25,64,86}
+{34,6,49,90,25}
+{86,35,13,22}
+{21,44,83}
+{42,88,72,65,59,96}
+{36,33,1,98}
+{16,54}
+{35,16,44}
+{73,23,20}
+{84,25,1,52,35}
+{27,36,54,87,31}
+{38,47,83,3}
+{64,13}
+{65,84,85,16,22}
+{57,9,39,73}
+{89,11,67,55,73}
+{78,39,84,63,62,45}
+{50,63,8}
+{}
+{96,36,58,65,96}
+{59,86,41,30}
+{90,60,39,47,19}
+{70,100,73,99}
+{}
+{85,14,39}
+{76,53}
+{96,38,52,13,87,85}
+{97,51,15,30,53,87}
+{30,59,9,40,13}
+{31,91,68,79}
+{37,56,39,78,75}
+{82,2,47}
+{33,25,45,40}
+{51,21,92,20,18,76}
+{84,93,36,95,34,69}
+{66,25,5,40}
+{77,6,57,42}
+{}
+{88,81,85,37,12}
+{56,73,38}
+{70,70,6,19}
+{82,54,91}
+{75,8}
+{45,33,64,90,95}
+{8,71,66,12}
+{56,26,68,94}
+{70,77,4,96,62,83}
+{23,87}
+{34,34,4,33}
+{28,84}
+{78,75,77}
+{88,53}
+{27,38}
+{2,2,82}
+{30,52,88,61,33}
+{29,72,94,68}
+{85,72}
+{88,4}
+{63,90,43,66,24,33}
+{88,48,47}
+{3,11,98,37,61}
+{45,65,63,15,38}
+{79,45,56,94}
+{56,74,78,19,76}
+{24,81,64,13,100}
+{93,27,63,71,27,3}
+{74,13,85,86,32,60}
+{98,40,63,13}
+{41,95,19,93,17,84}
+{90,28,100,100,19,2}
+{35,15,54}
+{29,81,77}
+{54,64,63,12,18}
+{38,43,85,21,35}
+{84,28,27,4,80,27}
+{80,77,55,98}
+{13,71,48,55,89,38}
+{58,43,27,5,57}
+{5,33,96,6}
+{73,93,87,69,100,24}
+{58,96,38,85,55,51}
+{37,30,88,4,8,59}
+{24,68,43,48,18,84}
+{23,100,82,30,42}
+{23,36,16,99,27}
+{41,75}
+{66,41,10,37,16,6}
+{54,49,60}
+{4,56,44,72,40}
+{71,96,67,100,59}
+{7,41}
+{8,3,27}
+{38,69,47,68,5,24}
+{43,100,59,62}
+{92,14,34,5,71,48}
+{72,5,91,29,99,36}
+{62,71,37,80,62,50}
+{32,45,17}
+{89,68}
+{52,17,55}
+{21,47,15,92}
+{36,100,5}
+{14,76,59,11,15}
+{59,72}
+{37,55,89,49}
+{87,79,96,20,93}
+{6,44}
+{32,46,25}
+{27,47,76,4,54}
+{2,16}
+{90,36}
+{11,19,27,79}
+{54,4}
+{72,88}
+{14,85,71,69,5,22}
+{31,48}
+{28,35,18}
+{77,55,100,73,57,62}
+{}
+{14,59,53}
+{98,3}
+{13,56}
+{26,61,88,54,88,33}
+{70,12}
+{55,16,15,42,76}
+{13,75}
+{97,38,82,51,86,53}
+{41,76,39,84,32}
+{94,66,47}
+{55,28}
+{}
+{94,65,59,20}
+{55,50,56,14,58}
+{14,94,52,25,69,95}
+{20,96}
+{37,38}
+{26,35,9,98,74}
+{11,9,41,79}
+{36,57,87,69,92,89}
+{11,39,60,4,47,3}
+{97,5}
+{16,58,38,98,42}
+{46,69}
+{35,54}
+{36,79,54}
+{}
+{63,78}
+{12,86,52,29,60,30}
+{29,27,58,86,42,62}
+{42,12,60}
+{90,93,85,29}
+{16,8,45}
+{29,33,85}
+{32,14,6,47,74}
+{14,85,14,26,3}
+{46,71,10,16}
+{30,63}
+{}
+{91,30,56}
+{46,36,68,91,36,88}
+{24,61}
+{66,21,80,14}
+{43,63,50,21,11}
+{38,46,18,51}
+{38,28,70}
+{17,41,76,1,30}
+{47,63}
+{56,80,85,1,7,97}
+{75,5,79,32}
+{5,17,66,51,68}
+{6,83,2}
+{25,40,79,84}
+{58,38,12,68}
+{55,86,20,67,27}
+{58,64}
+{14,51}
+{12,86,57,68}
+{61,91,65,3,83,68}
+{40,31,82,21}
+\N
+{24,64,35,32}
+{32,83,18,27,43,32}
+{50,83}
+{94,84,58,3,25,79}
+{66,2,27,36,24}
+{71,34}
+{17,57}
+{22,40,49,50,10}
+{79,62,94,78}
+{92,79,24,72}
+{23,41}
+{69,60,77,70,18,48}
+{39,45,91,85}
+{27,43,22,21,85}
+{84,51,96,7,18}
+{100,38,69,93,66,39}
+{73,42,35,15,69,98}
+{100,17,37,15,40}
+{1,91,2,17,90,48}
+{18,12,52,24}
+{39,43,89}
+{16,13,88}
+{69,8,75}
+{34,91,54,81}
+{37,68,89,1,56}
+{81,83,39,36,14}
+{12,15,2}
+{14,16,88,43}
+{59,12}
+{1,62,21,94}
+{29,43,70,52,93}
+{29,36,56,78}
+{91,56,86,89,53}
+{14,83,39,94}
+{29,58,72,4,45}
+{76,56,84,28,58}
+{4,52,6,88,43,17}
+{21,1,35,62,77,6}
+{78,74}
+{1,20,93,43}
+\N
+{30,100,35,94,74,64}
+{81,3,21,4}
+{9,19,33}
+{28,62,40,64,26}
+{69,72,26,30,90}
+{52,70,78,43}
+{91,58,33,22,92,26}
+{98,36,96,94,66}
+{86,43,82}
+{93,52,4,58,51}
+\N
+{49,61,80,79,90}
+{50,81,72}
+{57,29}
+{54,31,36}
+{52,31,6,48,2}
+{4,51,37,83,17}
+{60,20,94,82,18}
+{52,64,26,81,69,61}
+{39,8,22,2,8}
+{31,25,95,99}
+{11,72,30,95,20,28}
+{78,87}
+{21,40,98,41,73,33}
+{67,88,42,62,11,47}
+{85,1}
+{4,68,100,72,24}
+{82,43}
+{97,55,47,52}
+{51,52}
+{20,21}
+{69,46,34,59,54,61}
+{9,31,43}
+{68,20}
+{73,63}
+{71,12,93,8,48,10}
+{44,46,42,91,21}
+{98,52}
+{45,60}
+{95,38,30,3}
+{27,77,2,46,53,18}
+{99,5}
+{79,33,34,48,82}
+{3,29,82,72,35}
+{73,75,83}
+{25,43,37,26}
+\N
+{51,95,40}
+{18,23,10,90,15,20}
+{85,66}
+{25,76,22,87,88,18}
+{92,4}
+{27,51}
+{25,77,12,37}
+{44,52,69,39,21,63}
+{94,30,74,36}
+{60,18}
+{62,88,94,93,26}
+{5,72,96,25}
+{99,1,85,98,85,70}
+{33,21,37,19}
+{44,78}
+{47,2,73,32,3}
+{91,35,10,81}
+{80,64,7,45,84}
+{86,16,96,8,88}
+{32,29,84,81,30,8}
+{51,28,6,16}
+{88,51,50,54,56,96}
+{79,19,41,40}
+{40,26,10,26,2}
+{60,34,3,29}
+{68,80,70,56}
+{60,23,39}
+{50,69,6,71,70,25}
+{98,53,94,14,45,11}
+{98,39,64,89,98,32}
+\N
+{45,5,15,23,41,63}
+{54,31,55,58,32}
+{36,56}
+{38,78,65,4,75,38}
+\N
+{40,6,93,40,13,59}
+{42,50,10,65,96}
+{6,94,49}
+{63,44,36,55}
+{40,79}
+{39,75,27}
+{8,31}
+{81,75}
+{99,82,85,34,24,89}
+{86,82,20}
+{63,96}
+{47,83,29}
+{70,46,48}
+{44,11}
+{94,19,84,79,77,22}
+{68,47,100,48,65,77}
+\N
+{76,12,86,58}
+{13,14,79,61,12}
+{68,65,16,93,89}
+{95,18,29,89,92,43}
+{19,12,50,47}
+{82,93,85}
+{71,40,85}
+{95,96,100,86}
+{2,40,71,36,25}
+{11,95,25}
+{79,46,41,35,39}
+\N
+\N
+{88,29}
+{54,14,94,88}
+{59,67,81,41}
+{46,68,78,56,47,30}
+{5,76,87}
+{23,89,47,46}
+{47,98,14,31,1,60}
+{32,14,96,61,37}
+{79,66,93}
+{98,1,77,44}
+{21,68,2,31,17}
+{94,23,15}
+{48,47,57,94,49,71}
+{54,3}
+{99,40,81,86,81}
+{85,12,98,81,5}
+{60,41,21}
+{38,82,55,41,96}
+{11,98,12,69,93}
+{11,70,66,44}
+{23,92,80}
+{10,8,43,97}
+{17,30}
+{78,56,58}
+{84,87,84}
+{12,32,7,58,47,48}
+{29,46}
+{87,34}
+{59,30,72,85,71}
+{67,48,83,98}
+{35,10,73,71,1,77}
+{21,51,16,60,64,12}
+{36,61}
+{54,98}
+{44,74,84}
+{83,14}
+{71,52,48,48,15,92}
+{79,78,98,35}
+{52,29,47,86,96}
+{10,37}
+{21,25}
+{57,22,28,30,97,47}
+{15,28}
+{88,24,98,45,65}
+{78,42}
+{36,70}
+{40,48}
+{72,3,78,69,57,33}
+\N
+{21,96,16,21,75,23}
+{55,5,72,45}
+{99,2,72,29}
+{48,17}
+{84,84,40,1,59}
+{34,11}
+{34,80,45,31}
+{56,82,25,65,22,64}
+{10,4,55}
+{74,67,42,74,80}
+{84,22,42,6,87,30}
+{6,51,89,2,84,78}
+{19,95,93,87,8}
+{45,84,25}
+{7,12,16,92}
+{89,82,16}
+{22,64}
+{16,31,49,48,45,14}
+{69,64,19,14,39,8}
+{40,96,26,48,65}
+{17,45,4,57}
+{73,8}
+{85,89,1,15,74,51}
+\N
+{57,89}
+{25,12,55}
+{39,62,35}
+{85,88,71,98,83}
+{64,63,75,72}
+{100,40,38,1}
+{2,44}
+{13,46,59,43}
+{87,9,93,50}
+{77,7,11,30}
+{61,11,18}
+{19,25,68,83}
+{67,25}
+{54,18,85}
+{96,81,38,11,3}
+{87,32,47,79,62,56}
+{42,49}
+{41,65,24,13,79,75}
+{85,32,96}
+\N
+{3,63,47,84,67,13}
+{53,57,59,61}
+{95,27,8,89,35}
+{76,78,76,76,14,37}
+{31,62,65}
+{97,57,60,80}
+{18,81,93,67}
+{8,10}
+{65,25}
+{68,1,62,63,64,88}
+{27,56,74}
+{29,61,78,40}
+{54,72}
+{96,30,71,21,99}
+{67,11,67}
+{26,65,31}
+{89,90,89,68}
+{56,39,63,39}
+{50,67}
+{72,100,24,84,9}
+{29,57,65,37,3}
+{72,75,79,30}
+{78,44,87,67}
+{100,19}
+{35,60,82}
+{16,83,69,38}
+{29,98,13,60}
+{42,60,87}
+{18,67,60}
+{31,77,50}
+{3,22,40,59,7}
+{82,80}
+\N
+{32,92,70,30,18,35}
+{48,38,92,82}
+{10,92,66,59}
+{4,67,42,21,71}
+{27,88,20,21,9}
+{46,22,27,85,36}
+{42,55,36}
+{24,2,96}
+{96,48,40,48,52}
+{15,5,90,10,68,20}
+{30,2,67,92,96,63}
+{16,82,87,26}
+{88,98,76,29}
+{29,11,94,23}
+{58,20}
+{52,18,55,73}
+{20,81,52,19,37}
+{93,21,97}
+{2,77}
+{46,91,80,48,71,20}
+{87,7,93}
+{68,77,61}
+{59,33,52}
+{67,62,89,2,62,90}
+{30,82,72,44}
+{72,18,60,38}
+{11,14,59}
+{74,65,54,58,67,66}
+{74,56,40,73,50,66}
+{42,17,56,59,53,19}
+{75,25,76,9,72,50}
+{14,57}
+{61,47}
+{90,11,72,13}
+{52,27}
+{80,84,53,55,98}
+{16,26,55,17,79,96}
+{42,73,77}
+{6,84,67,54,96}
+{99,48,99,63,73,77}
+{5,41,72,5,88,81}
+{19,20,20}
+{21,89,55,44}
+{82,67,11,64,61,5}
+{44,34,8,62,53}
+{75,53,66,36,100}
+{46,65,6,70,4}
+{84,10,56,35,18}
+{65,60}
+{88,56,27,11}
+{10,9,97}
+{97,49,100,100,76,32}
+{2,98,57}
+{47,57,84,74,79}
+{80,9,24}
+{96,33,86,28,19}
+{43,76}
+{46,14,55,92}
+{60,69,66,62,22}
+{45,85}
+{45,9,36,13,45,1}
+{24,49,8,37,66,64}
+{98,53,96,47,2}
+{36,44,32,4}
+{77,36,78,51,63}
+{82,36}
+\N
+{54,55,33,45,69,18}
+{82,93}
+{65,59,2,62,10,25}
+{75,70,76,69,7,23}
+{10,34,67,85}
+{94,66,28,40,64,41}
+{35,73,64,28,45,68}
+{75,2}
+{58,49,4,87,19}
+{91,99,11,66,75,70}
+{26,64}
+\N
+{13,51,18}
+{39,33,21,18}
+{27,50,82,2,3,71}
+{51,89,44,53}
+{88,91,34}
+{45,96,27,12,51,52}
+{31,96}
+{2,9,54,89}
+\N
+{57,99}
+{87,84,70,7,98,42}
+{32,80}
+{57,64,28}
+{24,39,76,4,30}
+{59,38,15,45,47,28}
+{71,20,37,1}
+{72,59}
+{7,44}
+{50,37,18,1,58,40}
+{13,18,21,56}
+{72,3,26,74,91}
+{60,22,71,49}
+{55,82,61,8,48,66}
+{28,22,75,41,52}
+{51,63,27,41,16}
+{59,89,40,85,86}
+{12,1}
+{52,11,6}
+{37,10,43,88,15,7}
+{14,94,81}
+{34,56,57,4}
+{81,43,11,88,74,76}
+\N
+{67,10,50,79,70,35}
+{14,51}
+{49,50,23,84}
+{51,41,57,100,19,14}
+{31,55,40,96}
+{8,42,33}
+{83,34,1}
+{56,80,22,93}
+\N
+{8,77,91}
+{58,39}
+{55,30,74}
+{50,22,63,73}
+{80,19,67,70,18}
+{7,99,45,23,59,78}
+{36,97,10,33,22,45}
+{43,78,90}
+\N
+{1,68}
+{63,95,54}
+{5,67,61,37,89}
+{32,97,2,56}
+{83,31,6,80,63}
+\N
+{34,15,30,40,16}
+{13,43,6}
+{35,86,31}
+{45,59,4,95,26}
+{63,48,25}
+{56,97,89,45,87,21}
+{42,81,69}
+{49,99,87}
+{81,21,15,36,70,2}
+{93,41,53}
+{54,71,82}
+{88,90,51}
+{100,35,18}
+{88,81}
+{76,16,87,14}
+{16,83,81,44}
+{16,53,100,91}
+{55,75,92}
+{27,97,76,88,66}
+{14,100,95,95}
+{95,84,93,29,67}
+{32,10}
+{82,12,51}
+{40,6,18,14,29,70}
+{3,100,81}
+{83,69}
+{35,63,31,15}
+{5,100,81,54,37,78}
+{99,76,33}
+{88,85,16}
+{46,20,15,10,6,90}
+{53,15,75,76,94}
+{5,76}
+{16,7,21,70}
+{3,84,15}
+{29,58,73,91}
+{82,39,64}
+{49,66,83,76}
+{79,49,19,67,18,76}
+{9,56,41}
+{12,22,19}
+{62,54}
+{20,73,40}
+{34,53,58,68,96}
+{97,14,61,63}
+{38,55,90,63}
+{83,78,81,29,12,46}
+{96,97,40,89,10}
+{67,33,19,19,74,47}
+{78,31}
+{92,74,93}
+{59,54,90,52,29,87}
+{92,39,55,89,81,21}
+{20,85,64}
+{13,97}
+{88,18,85,24,54,90}
+{67,51,47}
+{27,29,90}
+{48,27,7,92}
+{100,37,24,41,68,66}
+{45,7,100,83,51}
+{34,10}
+{60,36,44}
+{55,46,4}
+{86,64}
+{61,77,98,64}
+{14,82,14,50,1}
+\N
+{53,31}
+{64,43,35,44,98,75}
+{98,15,52,58,76}
+{55,94,92,40,80}
+{1,14,100,42,45,74}
+{13,90,84,97,18,92}
+\N
+{13,91}
+{67,33,15}
+{18,96,38}
+{95,70,34,100}
+{17,29,64,32}
+{19,14,83,69,60,99}
+{69,29,64,61,45,17}
+{78,48,24}
+{40,60,61,93,17}
+{19,89,22,71}
+{48,8,13,11,56}
+{75,18,77,100}
+{29,78}
+{51,92,97,31}
+{83,5,2,97,68,69}
+{39,86,86,94,41}
+{66,21,27}
+{30,84,11,60}
+{50,61,28,46,38,45}
+{12,59,66,80,15,64}
+{69,22}
+{30,54,58,99}
+{14,28,80,22}
+{44,31,14,61,83,72}
+{55,53,78,91,76,55}
+{43,3,90,22,7}
+{51,34,24}
+{3,99,5,72,82}
+{95,38,61}
+{22,8}
+{78,40,93,65,18,26}
+{21,17,19,8,89}
+\N
+\N
+{94,88,27}
+{49,45}
+{67,24,64,86,18,1}
+{5,33,18,84,51}
+{15,71,89,48,94,81}
+{71,69}
+{98,63,73,64}
+{14,75,12}
+{47,42,88,13}
+{35,51,60}
+{63,41}
+{73,11,66,99,8}
+\N
+{2,17,6,44,97}
+{95,24}
+{2,13,35,21}
+{76,29}
+{81,37,21}
+{23,63,27,53}
+{70,66,58,27,4}
+{69,62,22}
+{62,96,44}
+{68,87,99}
+{51,40,81,52,93}
+{81,11,45,92,22,21}
+{5,39,46}
+{44,7}
+{14,63,62,9,12}
+{9,19,90,72,51}
+{70,61,24,36}
+\N
+{29,19,3,30}
+{76,86,28,58,38}
+{59,27}
+{9,65,65,10,37,6}
+{89,51,50,23}
+{65,2}
+{33,51}
+{25,55,69,55,1,78}
+{76,71,93,46,23}
+{70,30,50,11,2,89}
+{74,39}
+{4,29,22,80,15,23}
+{16,30,69,76,61,67}
+{43,34,4,70,36}
+{59,32,25,93,32,98}
+{64,4}
+{52,33,47}
+{31,49,7,62,7,95}
+{44,69,12,45,34,8}
+{81,37,83,35,3}
+{24,74,16,89,94,27}
+{79,71,72,49,88,35}
+{17,96,72,87,48}
+{81,18,50}
+{11,19,70}
+{42,95,42,58,90}
+{27,65,83,86,33}
+{55,7}
+{43,55,92,79}
+{97,55}
+{85,25}
+{93,42,69,44,26,78}
+{2,40,46,19,84}
+{8,42,16,26,87}
+{36,8,42}
+{31,47,61,44,13}
+{85,97,47}
+{27,30,71,88,15,100}
+{69,27,4,19}
+{3,52,31,62,98}
+{64,86}
+{91,6}
+{76,40}
+{57,77,7,40}
+{71,34,48,53,37}
+{36,72}
+{61,99,53,2,31,6}
+{86,15}
+{52,93,59,51}
+{57,27,52}
+{48,67,31,69}
+{34,90,37,73,60,83}
+{71,24,49,59}
+{93,71,90}
+{77,31,77}
+{47,40,32,20}
+{97,40,63,80,44}
+{88,55,10,40}
+{86,36,40,72,38,9}
+{31,97}
+{56,19,55,62,60}
+{53,95}
+{33,36}
+{50,12,55,42,96,100}
+{41,17,100,76}
+{65,1,61,69,64,21}
+{90,92}
+\N
+{74,42,86}
+{2,4}
+{99,78,5,92,1,61}
+{1,69}
+{80,73,60,31}
+\N
+{10,25,13}
+{50,34,75}
+{12,90,6,36,42}
+{23,54,46}
+{67,28,66,87}
+{8,88,88,51,55,32}
+{15,19,24,91,75}
+{80,16,70}
+{41,7,90,37}
+{97,57,32,21}
+{54,74,29,12,55,78}
+{60,76,37,92,44,73}
+{1,56,14}
+{40,79}
+{97,1,30,78,56}
+{36,25,61}
+{33,3,51,30,38}
+{2,94,19,15}
+{7,38,72}
+{96,18,3}
+{18,95,15,62,74,53}
+{59,61}
+{18,66,66,65,4,33}
+{49,83,10}
+{17,52,90,39,61,87}
+{38,92,55,26}
+{8,43}
+{77,51,68,23,47}
+{27,65,24,43,88,73}
+{54,34,30,2,19,62}
+{12,36,81,24,66,8}
+{38,91,90,99,84}
+{51,55,94,97,91,15}
+{50,42,20,22}
+{70,4,22}
+{64,26}
+{56,86,16,21,31,61}
+{7,19,86,49,10,53}
+{81,16,74}
+{95,9,11,46,47}
+{34,23,16}
+{94,38,19,4,4}
+{39,79}
+{41,3,62}
+{84,67,53,90,46}
+{17,46,23}
+{62,1,5,58,52,1}
+{23,83,80,62,19}
+{99,61,77}
+{51,95,48,96,75}
+{39,2,6,95,43,36}
+{69,9,59}
+{62,97,31}
+{75,96}
+{33,29,35,13,94,78}
+{28,71,16,99}
+{72,86,25}
+{5,28,15,33}
+\N
+{13,13,52,20}
+{58,98,83,85,81}
+{13,75,42}
+{7,91,3,83,82,37}
+{72,91}
+{10,67,61}
+\N
+{43,86,76}
+{36,62}
+{64,56}
+{63,13,22,24}
+{76,49,38,23,9,8}
+\N
+{92,58,24,19,96,90}
+{24,37,76,37,1,95}
+{91,9}
+{46,35,48,37,91,76}
+{72,21,6}
+{30,80,39,90,89,18}
+{83,30,67,17}
+{43,36,46,43}
+{4,31,34,36,33,48}
+\N
+{16,49}
+{75,56,8,91,4}
+{92,80}
+{74,72,68,89,7,82}
+{79,17,26}
+{14,15,28,72,58}
+{42,21,9}
+{71,39,98,98,61}
+{68,63,23,74,74,48}
+{91,80,22,100,57,30}
+{63,60}
+{90,9,10,67,89,14}
+{53,93}
+{75,49,34,30,38}
+{2,43}
+{32,4,24,48,23,31}
+{45,24,31,15,51}
+{65,62,21}
+{83,50}
+{10,90,98,86,87,1}
+{63,2,9,17,30}
+\N
+{77,46,60}
+{49,39}
+{37,86,4,63}
+{33,28,37,33}
+{4,88,80,14,47,45}
+{90,64,17,65}
+{60,90,12}
+{7,2,38,33}
+\N
+{39,90,7}
+{89,32}
+{27,47,63,31}
+{54,10,10,73,84,87}
+{55,58,25,87}
+{41,24}
+{71,26,8,31}
+{74,19,33,81,74}
+{47,58}
+{44,16,22,59}
+{2,10,97,16,25}
+{1,98,3,41,6,80}
+{12,13}
+{3,50,61,85}
+{54,5,44,97,71,86}
+{54,72,94}
+{59,13,28,79}
+{73,68,7,13}
+{90,49,63,45}
+{95,47,84}
+{31,79,98,22}
+\N
+{13,15,83,89,87,20}
+{1,58,87}
+{15,21,39}
+{93,27}
+{40,81,13,31}
+{29,52}
+{28,48,36,41}
+\N
+{71,23,89}
+{29,59,31,45,35}
+{49,83,24,19,44,26}
+{41,61,36,34,38,88}
+{66,17,18,9}
+{55,38,93,33}
+{84,42,71,15,12}
+{11,38,78,80,90,92}
+{1,6,28,68,58}
+{96,63,73,22,74,29}
+{65,97,68}
+{92,29,92,36}
+{47,25,30}
+{25,44,67,95,16}
+{7,26,41}
+{79,12,44,69}
+{17,27,4,60}
+{45,30,57}
+{68,24,63}
+{39,64,94,92}
+{27,68,39,68,75,8}
+{88,48,48}
+{86,86,8,54,7,45}
+{93,60,14,90,14}
+{97,42,54,67,38}
+{13,38}
+{84,34,30}
+{34,71,77,71,13}
+{82,18}
+{53,7,79,79}
+{28,65,38,20,93,100}
+{96,10}
+{94,12,93,48,51,20}
+{12,4,41,11,25,59}
+{95,69,23,25,1,19}
+\N
+{44,38}
+{12,4,96,7,48}
+{18,24,52,81,58,77}
+{15,36,1,50,81,23}
+{39,66,74}
+{52,22,99}
+{51,11,77,44,22}
+{51,19,18,91,75}
+{20,17,5,96,63,30}
+{31,56,9,21}
+{45,70,31,62,9}
+{84,22}
+{99,62,97,44,87,90}
+{95,94,95,24,25,47}
+{79,72,57,18,3,26}
+{54,67,37,57}
+{3,90,9,3}
+{95,90,40,7}
+{36,70,76,68,14,71}
+{15,59,7,1,48}
+{91,29,79,62,94}
+{76,36,92,82}
+{50,79,68}
+{55,63,88,87}
+{86,89,49,17}
+{19,74,14,52,8,59}
+{8,58}
+\N
+{77,74,20,39,26,29}
+{38,89}
+{58,21,44,81,17,16}
+{40,72,12,32,90}
+{93,34,92,17,39,85}
+{39,2}
+{43,21,83}
+{81,3,59,28}
+{34,97,52}
+\N
+{84,90,6,74,43,70}
+{41,6,10,98,86,41}
+{13,72,78,11,37,5}
+{100,40,54,75,33}
+{66,31}
+{58,58,75,83}
+{81,90,8,73,87,41}
+{9,63,22}
+{19,66,19,93,52}
+{39,88,13,25,66}
+{80,85,66}
+{66,76,11,71,97,77}
+{70,35,87}
+{36,17,69,2,41}
+{30,85,65,39,38}
+{39,35}
+{64,100}
+{83,53}
+{25,29,29,72}
+{19,63}
+{32,2,82,15}
+{31,31,46,11,2}
+{41,1}
+\N
+{55,41,15}
+{18,61,43,22,100}
+{47,60,16}
+{80,5}
+{52,2,76}
+{40,26}
+{81,12,16,25}
+{31,93,89,20,95,75}
+{26,75,86,1}
+{36,69,70,73,79}
+{38,39}
+{45,49,52}
+{88,53,45,10,49,31}
+{21,14,1,83}
+{7,71}
+{59,38,83,64,44}
+{6,52}
+{99,99,26,54,47,8}
+{13,46,72,5,23}
+{7,86,40,73,55}
+{28,47,50,62,44}
+{32,89}
+{39,48,50,100,62,95}
+{66,56,11,21,58,59}
+{7,44,95,53,95,36}
+{83,33,79}
+{34,65,51,52}
+{67,95,46,45,61}
+{69,84,71,38,46}
+\N
+{24,57,48,27,97}
+{83,91,97,94,37,44}
+{22,31,38,77,21}
+{72,32,53}
+{30,45}
+{93,94,27,95}
+{95,4,79,3}
+{33,90,92,54}
+{55,8,76,39,85,64}
+{82,54,93}
+{31,42,5}
+{38,14,73,12,14}
+{64,13,64,28,32,89}
+{5,28,4,22,72}
+{37,78,94}
+{58,73}
+{24,57,33}
+{48,28}
+{69,42}
+{97,91,75,84}
+{95,69}
+{64,95}
+{1,3}
+{76,38,81,11,90}
+{21,30,54}
+{92,100,97,21}
+{10,76,64}
+{85,79,100,79,76,63}
+{13,96}
+{91,47,84}
+{100,19,45,49}
+{99,71,21,10,69}
+{19,41,7,63,56,85}
+{16,32,6,92}
+\N
+{62,7,22,65}
+{1,86,67,47,83}
+{26,2,100,51,1}
+{20,22,86}
+{74,95,79}
+{8,53}
+{85,59,61,45,83,8}
+{2,76,63,26}
+{40,42,84,55,56,23}
+{37,7,25,14,2,47}
+{86,16,98,41,33}
+{76,30}
+\N
+{16,88,61,4,41,42}
+{59,92,94,76}
+{96,76,57,62,99,61}
+{14,30,23,13,9,32}
+{47,49,86}
+{48,19}
+{73,25,40}
+{29,75,31}
+{53,26}
+{28,95,78,84}
+\N
+{22,77,13,64,68}
+{15,69,82,26}
+{42,37}
+{64,59,95}
+{37,72,86,95}
+{9,59,92,57}
+{65,37,13}
+{93,67,81,54,89}
+{21,52,78,59,30}
+{98,90}
+{17,35,57,4}
+{44,56}
+\N
+\N
+{25,26,13}
+{62,41,60}
+{28,92,16,74,4}
+{92,19,85,77,11}
+{20,67,85,22}
+{75,69,34,29,64,73}
+{70,40,2,29}
+{87,27,70,54,6}
+{10,8,9,62}
+{71,41,14,22,23}
+{83,79,46,37,99}
+{79,42,3,54,20}
+{12,60,42,100,39,33}
+{13,79}
+{95,28,54,52,77,3}
+{55,50,25,41,42,16}
+{96,67,23,54}
+{65,54,32,52,16}
+{100,11,69,96,95}
+{1,18,93}
+{53,78}
+{24,40,47,30,40,11}
+{87,7,12,10,52,90}
+{3,72,95,15,32}
+{60,69,19,8,43,72}
+{88,10,11,55,37}
+{67,48,31,48}
+{98,70,38,97,14}
+\N
+{52,12,94}
+{41,26}
+{81,65}
+{66,74,9,66,12,3}
+{47,6,33,92}
+{95,2,12,90,73,97}
+{23,76,34,23,2,20}
+{7,22,37,83,15}
+{44,61,21,8,36}
+{88,52,8}
+{66,3,67,43,87}
+{16,51,10}
+{66,43,28,69,70}
+{47,2,94}
+{57,67,55}
+{40,59,6}
+{63,19}
+{51,71,68,28}
+{73,97,48,56,70}
+{3,4,28,48,18}
+{31,94,27,70,44}
+{85,18,40,6}
+{78,91,79,88,33}
+{11,90,78,49,97}
+{74,91,27,79,75,53}
+{1,70,3,40,43,99}
+{97,35}
+{58,27,40,6,47,33}
+{43,42,60,94}
+{41,34,23,53}
+{57,44,50}
+{8,10}
+{49,53,22}
+{91,2,90,13}
+{46,80,27,82,42,99}
+{12,96,72,23,83,56}
+{48,82,71,8,35,16}
+{38,69,38,49,47}
+{80,28,13,9}
+\N
+{84,13,12,33}
+{31,57}
+{68,86}
+{4,96,64,19,48,29}
+{66,8}
+{33,86}
+{32,38,86,86,41,84}
+{38,51,31}
+{59,17,76,36}
+{52,87,60,54}
+{7,58}
+{34,52,58,90}
+\N
+{30,67,97,2,1}
+{93,10}
+{47,16,46,8,39,84}
+{90,77,37}
+{92,58}
+{38,94,49,53,11}
+{70,49,35,67,18,28}
+{58,81}
+{79,100,9}
+\N
+{97,13,56}
+{99,40,87,67,58}
+{24,47,19,16}
+{12,27,47,48,3,59}
+{1,58,15}
+{97,28,6}
+{94,50,31}
+{71,34,94,53}
+{26,5}
+{46,66,56,27,37}
+{76,4,1}
+{80,63,40}
+{89,82}
+{39,100,71,82,95,8}
+{81,86,27,83,57,47}
+{30,30,92,8,33}
+{95,20}
+{4,19,8,74}
+{20,32,83,62,19,18}
+{75,29}
+{100,13,6,41,23}
+{63,5,93,72,43}
+{64,13,73}
+{35,91,61,26,41,96}
+{49,56}
+{2,28,80,84}
+{15,48}
+{32,49,96}
+{72,73,57,69,16}
+{95,1,88,64}
+{70,55,88,66}
+{76,66,30,92,1}
+{88,21,74,65,93}
+{72,75,75,3,26}
+{55,32,85,68,84}
+{45,40,93,33,72,20}
+{83,89,6}
+{4,60}
+{72,56}
+{73,7,69,25,96,74}
+{100,72,41,48,63,37}
+{21,72,70,94,67,54}
+{6,9,58,77,35}
+{70,59,35,25}
+{86,96,87,62,13,5}
+{93,52,74,57,58}
+{93,23,88,50,56}
+\N
+{95,72,68}
+{63,52,58,41,54,90}
+{52,23,53,32}
+{93,87,39}
+{23,73,6,46,79,72}
+{44,17,12}
+{79,59}
+{31,62,14,26,75,23}
+{64,72,18,48,63,50}
+{71,40,59,87}
+\N
+{82,17,10}
+{44,29}
+{6,4,39,16,21}
+{94,17}
+{91,61,37,36,9}
+{53,38,7,28,92}
+{95,93,35,18,48}
+{35,77,53,87,97,92}
+{56,28,68,19,28,86}
+\N
+{23,91,56}
+{97,5,89,24}
+{18,81,17,78,63}
+{83,19,46,10,22,66}
+{100,17,45}
+{25,87,61,79}
+{17,57,99,1,39,1}
+\N
+{2,51,26}
+{93,69,84,85,87}
+{40,58,70}
+{86,84,96,41}
+{28,36}
+{39,85}
+{16,84,75,68,87,17}
+{14,84,57}
+{25,85,35,82,56}
+\N
+\N
+{7,30,17,2,66,91}
+{45,17,57,27,98,65}
+{57,86,15,40,68,23}
+{82,32,28,89,41,79}
+{28,3,35,61}
+{76,95,19,81,48,50}
+{34,6,85,47,65,2}
+{70,23,91,33,15}
+{30,24,47,96,61,47}
+{78,88,64,60}
+{87,40,86,97}
+{47,14,54,37,100}
+{48,95,32,77,69}
+{58,12}
+{63,20,49}
+{78,85,41,72,6}
+{39,20,89,21,62,76}
+{71,6,10}
+{63,4,71}
+{51,21,37,63,54}
+{66,6,63,12,58}
+{89,97}
+{64,70}
+{53,1,65}
+{57,73,30,26}
+{15,99,47,89,95,99}
+{12,86,7}
+{50,68,1,31,67}
+{47,86,54,44}
+{78,7,86,76,22}
+{46,71,98,62,67}
+\N
+{64,91,80,63}
+{82,61,17,58}
+{85,64,90}
+{37,26,64,97}
+{68,25,26,61,68}
+{11,21}
+{63,53}
+\N
+{87,88,75,65,10,48}
+{32,7,38,72,44}
+{99,81,59,10}
+{31,58,60,66,41,28}
+{23,27,57,74,4}
+{20,94,28,29}
+{91,5,15,61,50,29}
+{34,58,15,85,65,29}
+{52,50,2,95,87}
+{3,94,54}
+{7,61,96,49}
+{51,70,23}
+{87,49,27,6,7}
+{83,61}
+{36,92,48,57,20,83}
+{53,12,60}
+{60,11}
+{68,43,74,23,66,55}
+{66,8,54,24}
+{48,72,41,74}
+{81,99,50,33,20,13}
+{27,80,60,83,26,74}
+{80,1,59,50,15,99}
+{11,70,20,29}
+{23,84,63}
+{63,24,91,19,28}
+{25,17,95}
+{94,13,81,69,26,89}
+{31,48}
+{45,20,74,51,62,33}
+{77,55,17,63,4,18}
+{89,14}
+{85,85}
+{23,11,85,74}
+{29,76}
+{62,40,96}
+{1,29,25}
+{56,26,12}
+{5,22,6}
+{61,9,6,85}
+\N
+{31,34,49,11,19}
+\N
+{14,20,64,73}
+{63,1,85}
+{2,58,61,100,9}
+{89,92}
+{37,13,81,77}
+{36,26,16,76}
+{78,10,10,92,63}
+{68,6,35,71,92,27}
+{2,88,33,14,85,27}
+{80,95,71,98}
+{8,33,33,55,90}
+{62,74,15,10,64}
+{60,18}
+{6,77}
+{27,38,4,49,27,89}
+{94,84,94,8,98}
+{15,73,47,47,26}
+{73,38,69,90,9,13}
+{17,33,32}
+{51,57,25,40,41,37}
+{77,70}
+{66,10}
+{50,90}
+{96,88,30,65}
+{30,49,100}
+{34,46,19,89,52,24}
+{83,85,62,72,10,64}
+{98,56,23,77,79}
+{97,90,83,85}
+{19,66,70}
+{70,89,59,12,71}
+{24,96,22,4}
+{43,32}
+\N
+{92,85,41}
+{96,90}
+\N
+{4,5,82}
+{58,32,34,86,30}
+{51,8,44}
+{31,96,37,47}
+{51,15,41,97}
+{86,41}
+{41,26,61}
+{62,79,68,73,5}
+{32,9,88,30}
+{89,34,64}
+{70,18}
+{64,31}
+{14,73,1,50,75}
+{57,1}
+{53,92,38,13,56}
+{41,1,87,40,60}
+{83,75,19}
+{69,98,25,64}
+{69,75}
+{84,13,25,8,81}
+{41,52}
+{90,80,17}
+{19,53,72,62,94}
+{29,30,99,32}
+{32,85,73,26,47}
+{6,48,89,93,23}
+{73,47,93,10,48}
+{60,21,26,60,63}
+{85,41}
+{75,61,61,45}
+{51,7,5}
+{9,46}
+{83,36,7,84,96}
+{71,78,55}
+{43,53,88}
+{8,1,80,69}
+{88,86,51,12,37}
+{45,69,40,85}
+\N
+{36,53,60,15,7,7}
+\N
+{92,5}
+\N
+{51,13,34}
+{39,23}
+{16,26,93}
+{91,96,19}
+{89,64,2}
+{8,74,29,24,66}
+{26,19,30,27}
+{81,59,52}
+{99,28}
+{5,12,63,79}
+{14,80,90,83,47,79}
+{67,64,32,58,44,19}
+{27,32,52,79,55}
+{68,87}
+{14,31,20,12}
+{38,99,65,32,15}
+{27,57,35,17,53}
+{63,64,6,60}
+{70,38,47,65}
+{24,87,20,4}
+{86,27,19,56}
+{62,44,1}
+{46,10,26,48}
+{40,57}
+{61,9,59,80,51,20}
+{83,44}
+{77,1}
+{78,63,42}
+{75,93,95,76,9,52}
+{20,58,10,37}
+{72,75,41,73}
+{63,93,5}
+{57,65,47}
+{34,6,51,38,21}
+{54,7,19,9}
+{61,6,47,64,100,86}
+{39,45,55,17}
+{81,53,67,33,70}
+{11,94}
+{57,98}
+{78,81}
+{75,71,20,8,13}
+{3,2,58,95}
+{37,58,5,46,54}
+{40,50,36,27,69}
+{73,42,86}
+{97,73,87,80,38}
+{27,56,94,73}
+{80,81,74}
+{53,79,86}
+{79,4,55,21,34,74}
+{84,63,21,97,92,38}
+{72,38,76,63,97,79}
+\N
+{64,91,100,98}
+{34,10}
+{97,73,7}
+{49,31}
+{87,39,65,96}
+{54,88,60,55,18,4}
+{20,72,96,26}
+{40,51}
+{37,46,89}
+{88,53,3,52,39}
+{10,34,77,95}
+{20,66,84,12}
+{51,19,61}
+{67,35}
+{73,56,89,43,35}
+{94,54,27,63}
+{63,53,21,79,76,49}
+{79,23,28,63,49}
+{47,94,75,11}
+{67,95,56}
+{80,86}
+\N
+{62,73}
+{98,69,11,57,24,90}
+{87,41,77,21,94}
+{21,87}
+{3,40,75}
+{67,53,78,29,16}
+{18,46,70,76,98}
+{14,67,50,63,22}
+{4,2,92,4,8}
+\N
+{41,76,79,95,96,61}
+{35,30,18,57}
+{34,91,89,27}
+{22,25,9,34,85}
+{4,53}
+{23,6,65,86,56,93}
+{54,81,8,59,36,47}
+{90,10,4,25,31,46}
+{91,82,82,80}
+\N
+{64,12,59,21,10}
+{49,93,76,26}
+{22,10,21,15,57}
+{14,29,93,31}
+{68,21}
+{62,95,12}
+{34,74,55,4}
+{26,39,93,31}
+{67,31,63}
+{23,89,98,88}
+{48,93,22,79,28}
+{1,88}
+{95,74,84,18,38}
+\N
+{82,29,22,45,15,81}
+{15,48}
+\N
+{17,36,97,77}
+{93,59,71,15,51,35}
+{67,33,57,11}
+{35,80,72,43}
+{69,89,69,48}
+{52,29,16,52,100,22}
+{60,30,45,19,25}
+{28,3,39,86,13}
+{81,40,25,20,39,5}
+{77,14,93,47,23,6}
+{42,19}
+{52,52,98}
+{9,29}
+{78,77,6,72}
+{2,59,73}
+{13,85,77,26,29}
+{64,63,94}
+{54,76,3}
+{7,1,5,91,100}
+{24,94,57,94,79,55}
+{4,22,1,75}
+{34,53,19,87}
+{69,75}
+{71,47,47,61,42,89}
+{3,32}
+{84,61,4,13,73}
+{74,61}
+{47,65,85}
+{50,84,83,18}
+{51,97,11,3}
+{59,92,4}
+{49,42,65,27,97,52}
+{19,33,40,44,71,100}
+{82,68,99,60,47,59}
+{47,33,82}
+{3,45}
+{47,28,60}
+{3,98,60,30,50}
+\N
+{11,40}
+{33,67,72,43,74}
+{9,49}
+{42,47,48}
+{53,88}
+{17,87,28}
+{20,4,72,62}
+{65,25,22,76,64}
+{9,62,57}
+{59,93,52,93,60}
+{85,85,1,55,50}
+{69,22,57}
+{8,50,81,32,4}
+{80,47}
+{60,88}
+{16,54,80,66}
+{99,87,66,65}
+{60,19,58,18}
+{14,77,66,48,59,41}
+{75,96,82}
+{42,72,93,79}
+{14,23,78,82,40}
+\N
+{29,47,16,41}
+{13,11,45,67,23,92}
+\N
+{8,3,52,41,56}
+{57,41,63}
+{5,50,59,87,50,58}
+{58,99,9}
+{60,99,15,63}
+{59,14,9}
+{68,81,34}
+{83,18,3,94,39}
+{27,52,100,66,48,82}
+{10,23,50,96}
+{72,14,12,68,62}
+\N
+{45,30,55,86,89,48}
+{5,80,97}
+{52,67,86,81}
+{99,4,38,79}
+{21,98,78,71,73}
+{10,23,38,61}
+{12,17,19,70}
+{79,23}
+{55,66,65,60,19}
+{7,34,68,88}
+{37,70,5}
+{41,57,86,31,10,6}
+{70,59,96,78}
+{88,18,32,22,56,21}
+{93,72,81,47,89,72}
+{100,14,49}
+{83,80}
+{73,11,97,14}
+{60,47,32,34,13,29}
+{39,6,88,24,6}
+{54,66,55,52,47}
+{56,89,88,98,94,48}
+{2,37}
+{13,54}
+{68,39,68}
+{60,81,10,85}
+{74,54,14}
+{30,52}
+{41,74,47}
+{77,28,8}
+{90,3,43,89,4}
+{29,46,84,63,79,83}
+{26,15,80,19}
+{76,28,77,6,47,91}
+{51,15}
+{93,15,51}
+{8,68,34,58,15}
+{5,56,57,81}
+{27,87,61,54,41}
+{31,37}
+{68,80,3,98,49,6}
+{96,10,39}
+{25,19,21,72,79}
+{69,1}
+{5,51,61,80}
+{76,25}
+{36,92}
+{54,46,31,87,13,8}
+{25,13,83,57}
+{29,53,73}
+{83,60,26,19}
+{27,89,34,13,20,38}
+{29,74,26,67,65}
+{90,36}
+\N
+{32,15,43,50}
+\N
+{55,86,68,51}
+{91,14,53,70,49,38}
+{75,29,79}
+{19,59,38,44,18,79}
+{43,31,24,20,16}
+{43,83,59,37}
+{61,17,95,61}
+{67,89,1}
+{65,20,46,58,49}
+{72,54,38,52,49}
+{75,12}
+{63,95}
+{99,17,79,11,35}
+{62,60}
+\N
+{69,83,89,73,20}
+{30,60,39,73}
+{78,99,29,45,61,21}
+{38,61}
+{51,15,47,11,4}
+{34,75}
+{57,26,42,42}
+{8,90,4,68}
+{63,70,99,3}
+{74,70,33,50,59}
+{27,18,73,83}
+{36,90}
+{82,77,2,83}
+{90,99}
+{15,25}
+{65,30,39,82,89,34}
+{12,24,64,54,49,83}
+{54,59}
+{63,49,81,36,75,52}
+{6,59,90,55,87}
+\N
+{97,52,54,97,3}
+{8,53,89,42,30}
+{68,42,64}
+{97,42,99,74}
+{19,31,32,52,7}
+{69,83}
+{61,17,35,39}
+{81,47,70,7,63}
+{78,10,63,97,31,48}
+{84,92}
+{64,82,40,39,57,44}
+{39,25,92,33,5}
+{27,74,85}
+{90,67,21,28,84}
+{36,33,62}
+{77,87,98,82,11,88}
+\N
+{11,41,17,91,56}
+{1,1}
+{84,100,8,22,20}
+{57,39,85,5}
+{55,47}
+{13,2,36,59,45}
+{95,66,53,32,29}
+{21,92}
+{35,32,9,58,77}
+{19,71,99,82}
+{19,37,87,43}
+{100,18}
+{67,86,29,40}
+\N
+{66,54,64,55}
+{67,25,18,31}
+{60,26,59,86,26,67}
+{26,21}
+{70,67,30}
+{93,82}
+{89,58,39,91,95}
+{15,86,25,8,12}
+{59,20,41,33,78,87}
+{10,72,89}
+\N
+{52,17,99}
+{77,29,7,7,1}
+{49,96,57,24,66,67}
+{10,26,83,84}
+{82,7,25}
+{66,77,57,25}
+{92,77}
+{24,48}
+{44,26,37,75,11}
+{73,80}
+{51,47,93,21,25,78}
+{76,49,15,98}
+{12,85,63,59,6}
+{25,51,47,58}
+{16,10}
+{17,30}
+{67,5}
+\N
+{54,96,21}
+{12,47}
+{29,90,69,22,89,82}
+{78,93,86,65,66}
+{83,84,58,67,13}
+{85,35,81,27,1,2}
+{76,29}
+{64,82,91}
+{35,89,38,89,10}
+{19,40,96}
+{83,70,85}
+{72,85,70,99}
+{34,1,39,16}
+{84,53,22,86,73}
+{32,23,70,49}
+{15,67,91,11}
+{73,95}
+{71,57,64}
+{88,91,56}
+{12,16}
+\N
+{62,82,26,84}
+{70,51,52,63,96}
+{34,93,49,57}
+{16,5,47}
+{18,59,12,82,83,51}
+{61,93,87,9}
+{46,9,45,38}
+{15,85,28,73}
+{31,99,26,3}
+{66,91,48,73}
+{98,80,9}
+{31,55,42,69,13,58}
+{43,8,70,29,83}
+{39,57,53,70,74}
+{89,13,60,38,89,3}
+{37,28,15}
+{67,77}
+{30,100,89,36,53,75}
+{36,19,48}
+{7,8}
+{12,76,26}
+{14,56,52,47,39,67}
+{87,83,51,2,97,25}
+{51,1}
+{59,69,37}
+{95,93,21}
+{100,92,37}
+{37,23,66,95,7,63}
+{52,56,77,86,46}
+{31,62,17}
+{57,48,79}
+{26,96,40,5,43,54}
+{40,92}
+{75,83,1,73,71}
+{75,61}
+{6,38}
+{35,23,76}
+{52,3,38,25,100,99}
+{45,15,44}
+{96,9,11,35,16,58}
+{9,80,76}
+{22,43,34,43,46}
+{34,68,21}
+{95,70,83}
+{60,7}
+{34,22,68,2}
+{78,30}
+{46,70,90,96}
+{5,24,69,61,32}
+{41,17,79,27}
+{59,88,64}
+{12,48,41,68,15,98}
+{43,84,59,62,36,14}
+{84,8,71,88,4,23}
+{45,67,67,17}
+{14,96,72,66}
+{91,23,4,11,28}
+{18,5}
+{65,51}
+{31,87,33}
+{17,97,76,81,69}
+{56,71}
+{95,23}
+{33,58,66,47}
+{46,99,69}
+{43,87,40}
+{49,1,26}
+{18,36,89,87,25,100}
+{76,37,19}
+{57,91,9,100,23,59}
+{80,60}
+{55,23,32,49}
+{15,73}
+{87,50}
+{43,62,50,54}
+{65,3,89,49,77}
+\N
+{73,12,25,78}
+{79,89,38,59}
+\N
+{44,62,25}
+{96,13,57}
+{35,14,3}
+{90,71}
+{34,8,59,81,63,90}
+{15,90,89,32,69}
+{90,61,54,10,29}
+{22,3,85,41,66}
+{17,4,99,91,45,57}
+{89,32,43,39,61,9}
+{45,40,6}
+{47,100,75,8,85}
+{88,43,89}
+{45,41}
+{54,48,87,66,100,5}
+{58,65,39}
+{17,82}
+{95,14,31,51}
+{30,3,46}
+{8,66,22,52,51,24}
+{61,62,38}
+{4,50,83,32,76}
+{96,36}
+{87,27}
+{82,100,44}
+{30,91,44}
+{29,48,8,38,43,96}
+{56,65}
+{34,36,99,11}
+{11,1,25,65,12,89}
+{17,100,62,53,24}
+{86,81,63}
+{17,63,30,82,87,91}
+{12,63,76,78,85}
+{52,19}
+{21,91,53,86,49,83}
+{67,65,78}
+{8,77}
+{89,1,56,100,72,96}
+{20,51,41,21,30,20}
+{41,73,37,92,9,5}
+{95,34,21,12}
+{28,14,2,62}
+{14,74,33,32}
+{37,82,67}
+{65,99,56,11,21,83}
+{99,51}
+{56,42}
+{59,30,74,40}
+{18,27,63,44,86}
+{48,25,41}
+{5,26,63,88}
+\N
+{24,66,64,1,26}
+{72,74,11,61,70}
+{28,27,90,30}
+{96,35,21}
+{64,100,75,94,88,3}
+{93,79,42}
+\N
+{37,51,4,41}
+{31,68}
+{93,42}
+{76,96,47}
+{8,6,16,57,51,72}
+{67,72}
+{50,36,40}
+{69,28}
+{17,92,40}
+{72,74}
+{76,87,93,22,95,30}
+{14,88}
+{39,56,74,36,25,87}
+{55,68}
+{32,9}
+{35,2,17,86}
+{92,73,82}
+{40,13,95}
+{15,28,95}
+{65,40}
+{47,56}
+{63,72,78,20,22}
+{71,49,4,80}
+{68,16,50,44,29,38}
+{81,96,23}
+{44,73}
+{4,68}
+{30,54,41,66,89}
+{92,33}
+{10,92,49,46,59,42}
+{14,91,18,96,27,37}
+{40,32,12}
+{14,97,15,96,44}
+{75,96,52}
+{50,20,9}
+{39,84,83}
+\N
+{14,48,3}
+{47,85,76,27}
+{5,3,25}
+{55,36,29,76,41,44}
+{34,56}
+{62,29,83,6,58}
+{67,32,85}
+{75,62,4,66,100}
+{47,31,27,43,9,57}
+{92,44,36}
+{31,22}
+{14,88}
+{18,25}
+{82,63}
+{54,67,6,59}
+{90,42,19,91,37,75}
+{70,39,87,52,32}
+{51,20,34}
+{85,62}
+\N
+{95,6,55,93}
+{44,67,15}
+{93,58,20,12}
+{42,6,22,29,36}
+{46,81}
+{57,95,56,52}
+{3,79,69,45,8,74}
+{75,44}
+{4,17,78,96,66,41}
+{27,100}
+{85,76,22,17,45,58}
+{9,12,70,29,96}
+{5,68}
+{54,79,5,19,17,24}
+{99,13,9,52,86}
+{94,6,99,57}
+{71,62}
+{63,50,9}
+{42,42,80}
+{25,96}
+{93,20,10}
+{83,73}
+{14,76,36}
+{57,31,29}
+{17,25,18,18,54,95}
+{34,27,86,37,92,83}
+{57,57,28,32}
+{98,53,60}
+{8,59,41,88,49,46}
+{95,42,30}
+{12,51,98,74,76}
+{6,49,26}
+{21,35,27,32,83,93}
+{16,56,89}
+{85,34,73,74}
+{52,95,22,4,71}
+{96,42,63,88,80,91}
+{78,34,41,99}
+{11,68,27}
+{50,14}
+{78,52,66,15}
+{100,82,1}
+{35,2,93,71,45}
+{4,56,8}
+{83,19,5}
+{82,39,63}
+{50,64,83,87,76}
+{47,59,93,88,22,67}
+{16,6}
+{86,98,88}
+{32,4,52,34,30,71}
+{68,25,97}
+\N
+{19,17,91,84}
+{97,88,89,98,33}
+{37,56,70}
+{27,17}
+{56,58,51}
+{69,80,47,84}
+{89,22,89,88,16,1}
+{95,14}
+{14,95,97}
+{47,15}
+\N
+{19,20,65,74,83,38}
+{57,56}
+{78,67,68,89,1,95}
+{61,84,93}
+{10,56,96,31,56}
+{3,51,90}
+{15,85,42,25,15,41}
+\N
+{50,7,89,89,96}
+{90,10,44}
+{11,43,15,27,30}
+{55,68,48,30,44}
+{38,69,3,95,39,6}
+{57,51,88,94,82,23}
+{69,37,2,67,49}
+{93,94,5,84,39,47}
+{45,47}
+{58,55,79,63,64}
+{63,65,59}
+{42,36,76,75,89,86}
+{41,83,98}
+{13,90,13,46,11,37}
+{76,33,52,65}
+{52,29}
+{20,60,45,23,29}
+{89,6,14,8}
+{91,69,64,72,41}
+{46,91,31,66,83,33}
+{6,58,61,65}
+\N
+\N
+{90,65,16,5}
+{24,46,33,36,47,45}
+{11,62,40,98,21,88}
+{28,95,58,33,27}
+{45,63,99,31,38,90}
+{11,49,41}
+{23,24,82,25,28}
+{42,3,34}
+{52,10,58,88,97,37}
+{20,41,11}
+{86,30}
+{36,92,93,10}
+{5,36,85,50,71}
+{51,75,100,46}
+{55,81,31,45,87,8}
+{83,10,45,81,33}
+{16,94,91,23,76,44}
+{62,73,14,39}
+{16,14,83,100,82,7}
+{25,69,86,12,71}
+{29,86,45}
+{76,62,100,47,57,52}
+{41,21}
+{33,56,58}
+{23,96,44,16,91,86}
+{65,15}
+{3,92,56,4,21}
+{32,39,95}
+{95,87}
+{65,96}
+{16,96,93,100,35,78}
+{64,33,55}
+{96,75,41,40,62}
+{50,50,86,11}
+{93,34,83}
+{19,30,62,67,93,19}
+{53,67}
+{55,46,99}
+{70,32,38,4,84,91}
+{50,36,40}
+{21,93}
+{29,6,10}
+{4,73,45}
+{72,33}
+{36,73,18,55,27,100}
+{65,73,98,90}
+{20,1}
+{59,36,60,87}
+{20,79,63,93,34,31}
+{60,18,92,6}
+{48,34}
+{63,70,78,1,2}
+{15,32}
+{5,15,84,73}
+{32,35,90,11,40,23}
+{91,41,7,52}
+{84,90,88,30}
+{12,10}
+{84,86,36,79}
+{76,45,84,66}
+{41,25,61,96,97}
+{18,100}
+{63,39,17,34,32}
+{22,45,74}
+{83,24,45,48,69,84}
+{43,41,12,44,75,91}
+{69,75,95}
+{100,28,14,66,1,14}
+{94,91,60,36}
+{88,28,54,63}
+{68,78}
+{29,68,6,100}
+{12,84,35,44,59,55}
+{30,59}
+{64,18,40,57}
+{97,97}
+{85,64,73,82,49,88}
+{99,31,24,6,90}
+{23,89,38,20,40,95}
+{84,64}
+{21,3,91,7,7,87}
+{91,74,32,76,43}
+{13,22,96,8,75}
+{59,71}
+\N
+{34,94,45}
+{14,5}
+{95,10,37,74}
+{69,82}
+{6,58,45,49,81}
+{72,72}
+{17,58,10}
+{62,77,9,6,44,62}
+{37,53,49,41}
+{24,11,11}
+{10,57}
+{26,72}
+{18,15,83,60,54,80}
+{88,49,73,92,67}
+{26,88,64,2,59}
+{49,50,3,90,44,49}
+{58,54,43}
+\N
+{86,78,40}
+{42,17,65}
+{1,86,17,6}
+{79,27,37,60,8}
+{46,62,46,22}
+{9,75,17,68,54,35}
+{99,86,64,10,20}
+{3,21,35,6,24,64}
+{25,62,9,50}
+{63,2,79,42,81}
+{44,41,2}
+{99,93,98,78}
+{2,92,9,96}
+{79,82,25,64}
+{47,84,52}
+{97,77}
+\N
+{47,94,38}
+{22,33,76}
+{35,52,11}
+{17,48}
+{1,100,27}
+{87,93,19}
+{72,3,32,78,81}
+{47,28,4,23,79}
+{27,88,7,85}
+{49,40,47}
+\N
+{91,89}
+{80,2}
+{86,78,42,6,81}
+{7,50,25,4,8,22}
+{23,3,64,59,53}
+{1,42,63}
+{95,81,86,31}
+\N
+{81,83,52,47,25,43}
+{17,57,100,49,59,63}
+{44,91,95,72,29,100}
+{80,78,55,41}
+{14,52,20,64,9,87}
+{48,14,82}
+{31,5}
+{64,50,66,38,97}
+{61,2,90,2,64}
+{64,69,26}
+\N
+{64,62,68,89,12}
+{12,10,88,71}
+{41,66}
+\N
+{67,77,25,6}
+{14,75,15,66,19}
+\N
+{88,52}
+{78,56,61}
+{93,88,47,38,52}
+{72,100,54,34,18}
+{77,99,89,53,25}
+{38,51}
+{3,25}
+{83,39,85}
+{60,15,77,59,69}
+{38,64,91,97}
+{65,35,30,8}
+{46,6,48}
+{63,91,29,91,85}
+{43,100,56,60,74,53}
+{95,30}
+{86,63,28,62,37,79}
+{2,48,29}
+{1,44,20,47,56}
+{43,34,86,86,64,14}
+{11,82,99,71,63,41}
+{77,45,74,17,56}
+{18,25}
+{51,82}
+{27,35}
+{1,20,84}
+\N
+{89,37,16,90}
+{58,83,34,88,50,21}
+{61,25,1}
+{41,6}
+{9,100,32,54,38,66}
+{40,53}
+{29,76,16,13,55,31}
+{71,67,54,83,3,82}
+{19,62,18,94,73,38}
+{17,83,8,45,52}
+{80,25,50,59,53}
+{4,2}
+{52,48,6,72}
+{50,32,70}
+{36,97}
+{17,82,36,97,20}
+{22,87}
+{46,29,96,98,14,90}
+{14,92,5}
+{69,9,68}
+{20,86,29,61,54}
+{62,67,87}
+{86,18,31,80,82,45}
+{65,89,67,34,41}
+{44,8,48,38,91}
+{47,32}
+{85,25,56,39}
+{15,54}
+{84,57,44,46}
+{65,61,29,86,77,53}
+\N
+{26,58}
+{76,1,57,93}
+{57,91}
+{13,15,66,11}
+{84,12}
+{43,32}
+{83,24,31}
+{82,9,65,84,27,94}
+{62,93,55,7,39,46}
+{90,100,33,22,61,46}
+{9,51}
+{87,93,82,94}
+{49,45,95,95,66,39}
+{100,56}
+{11,5,78,42,45,37}
+{3,57,80,46,13,34}
+{1,74,53,31,33}
+{11,84,8}
+{27,99,21,31,96,58}
+{99,81,90,17}
+\N
+{66,49,47,55}
+{88,30}
+{76,62,17,88,83}
+{40,7,42,61}
+{17,57,9,64,54,1}
+{9,54,84}
+{50,61}
+{72,15,25,30,6}
+{64,95,69,89,11}
+{64,18,86,25}
+{81,59,70,6,92}
+{78,76}
+{33,40,29}
+{15,63,1,12,14,57}
+{33,81,8,65,26}
+{58,15,56,37,67}
+{2,50,35,92,11,27}
+{17,13}
+{91,100,15,27,39,24}
+{58,48,46}
+{5,95,28}
+{7,21,99}
+{5,15,6,10}
+{82,99}
+{66,22,86,83,76}
+{99,68,39}
+{43,90,22}
+{31,94}
+{21,64,56,26,95,40}
+{7,81,3,53,83}
+{29,42,90,60}
+{53,49}
+\N
+{26,31,14,73,88,51}
+{69,2,100,9,34,16}
+{78,35,97}
+{68,16}
+{34,45,42,73}
+{7,19,55,70,69,11}
+{11,62,61}
+{32,17,51,33,87,6}
+\N
+{54,97,36,13,45,12}
+{46,2,26}
+{14,6,17}
+{99,20,31,61,6,4}
+{60,72,53,31,34,25}
+{88,46,68,78}
+{56,94,49}
+\N
+{33,65}
+{70,51,84}
+{55,91,27,33}
+{22,19}
+{34,78,11,94,3}
+{16,67,91}
+\N
+\N
+{64,5}
+{76,18,83,5}
+{57,13,30,56}
+{60,92,25,31,43}
+{38,17,54,5,2}
+{56,58,39}
+{42,43,5,69,56,89}
+\N
+{50,23,97,85,70,39}
+{97,56,33,90,64,2}
+{9,54,51,26,24,99}
+{18,7,59}
+{44,5,40,69,18}
+{77,96}
+{44,58,47,17,26,45}
+{90,71}
+{88,32,11,96,17,13}
+{42,3}
+{97,28,56,10}
+{38,36}
+{50,52,47,31}
+{64,5,99,77,83}
+{11,56,1}
+{91,92}
+{7,53,35,52}
+{93,65,47,97,44,82}
+\N
+{64,66}
+\N
+{62,4,57,23,34,91}
+{52,55,75,99,27}
+{29,54,44,87,61,96}
+{21,3,66,35,25,80}
+{96,68}
+{3,41,66,81,78}
+{49,98,79,65}
+{71,38}
+{88,79,70,37,3,82}
+{49,74}
+{19,29}
+{57,68,9,8,99}
+{81,88,14}
+{99,29,24,99}
+{55,96,29,89,49}
+\N
+{56,2,84,79,74}
+{30,52,64,74,62,5}
+{88,32,19,25,9}
+{40,11,49}
+{98,52,27}
+{11,86,29,86,6}
+{91,53,63,53,44,28}
+{88,10,30,48}
+{75,64,75}
+{14,92}
+{98,62,35,67,66,35}
+{40,65,11,80,73}
+{1,1,63}
+{85,32,53}
+{91,27,68,50,66,63}
+{66,54,38}
+\N
+{45,43,14,94}
+{62,84}
+{54,24,83,33,46}
+{93,72,2}
+{43,4,14}
+{18,11,5,99,79,94}
+{26,59,9,2}
+{58,69,70,45,14,54}
+{84,5,42,97}
+{7,82,41}
+{69,53,8,55,20}
+{4,13,6,45,83}
+{41,92,41,98,51,85}
+{72,85,74}
+{19,50,79}
+{79,47,47}
+{25,25}
+{17,56,46,30,73,78}
+\N
+{92,42,83,34,92,29}
+{8,52,76,80,9,55}
+{80,100,2,52,24,4}
+{55,15,92,27,86,50}
+{83,79,41,88,86,53}
+\N
+{44,16,90,54}
+{99,20,64}
+{44,30,26,26}
+{35,35,24,74,72}
+{97,24,94,55}
+{78,42,32,76,100,98}
+{31,86,12,87,72,86}
+{87,35,33,88,33}
+{31,83,23}
+{46,51,5,6,71,31}
+{39,97,91,53,39}
+{19,18,25}
+{16,4}
+{65,77,13}
+{61,30,13,26,75}
+{67,9}
+\N
+{31,3}
+{15,19}
+{97,39,71,30}
+{12,96}
+{36,96,82,62,5,74}
+{81,22,46,11,19}
+{97,55}
+{58,67}
+{10,68,79,74,23}
+{29,71}
+{50,59,8,1}
+{12,51,32,7}
+{62,16}
+{48,82}
+{84,21,24,13}
+{46,86}
+{100,96,32,54,13}
+{72,41,3,67}
+{61,9,7,75}
+{39,44,50,30,38,6}
+{63,63,6}
+{69,35,6}
+\N
+{7,91,82,48,55}
+{57,22,31,57}
+{55,72,91}
+\N
+{76,98,43,71,10}
+{100,34}
+{78,53,14,73,23}
+{42,90,28,44,44}
+{90,34,22,81}
+{60,32,56}
+{98,53,58,58,61}
+{61,70,59,78}
+{2,96,27}
+{83,99,25,47,13}
+{17,54,11,47,70}
+{70,43,11,89}
+{93,70,82}
+{72,57}
+{35,95,49,36,19}
+{82,25,16,49,43,93}
+{2,51,96,48,88}
+{20,81}
+{74,4}
+{66,83}
+{90,75,98}
+{25,87,59,92,55,96}
+\N
+{20,80,92,93}
+{59,63,39,3,7,38}
+{64,10,85,22}
+{63,32,18,38,83}
+{49,38,83,54,1}
+{27,97}
+{18,34,84,58,7,86}
+{93,4,67}
+{43,49,32}
+\N
+{29,14,5,50,30}
+{59,15}
+\N
+{76,31,31,47,17,35}
+{95,41,71,27}
+{47,43}
+{75,80,56,78}
+{56,75,43}
+{99,10,100,76,44,1}
+{5,31,72,3,25}
+{21,90,59}
+{59,45,75,93,78,88}
+{76,55,4}
+{20,87,44,94,56,78}
+{38,87,71,13,23}
+{33,6,79,91,92,27}
+{13,15,31,15,11}
+{57,18,57,71,11}
+{67,60,64}
+{66,15}
+{57,45,74}
+{93,91,97,30,12,94}
+{37,83,62,18,28}
+{94,88}
+{12,11,85,10}
+{42,96,89}
+{15,65,5,65}
+{52,58,36,27,10}
+{72,88,76,50,96}
+{40,70,55,93}
+{80,33,24}
+{53,35,50}
+{11,37,55}
+{25,80,32,91,68}
+{11,2,52,39,37}
+{17,51,45,44,85,84}
+{81,21,77,15}
+{67,93,27,70,72,94}
+{86,99,95,98,83,28}
+{9,65}
+{1,26,5,23,5,17}
+{57,82,42,60}
+{46,67,65,98,69,79}
+{41,50,94}
+{77,81}
+{87,82,18,57}
+{88,27}
+\N
+{32,58,81,88,94,90}
+{23,37,65,38,29}
+{61,11,65,77,25}
+{50,53}
+{38,2,11,9,27,94}
+{64,9}
+{1,45,97}
+{61,41,67,46}
+{13,41,90,15,80,82}
+{83,6,9,22,25,37}
+{95,74,22,64}
+{16,17,4,80,66,33}
+{25,42,43,84,96,85}
+{25,93,50,87,6}
+{35,67,90}
+{82,37,59}
+{4,44,83,2,81}
+{78,46}
+{64,79}
+{18,41,3}
+{56,20,51,83}
+{26,77,52,70,93,13}
+{54,53,12,47,57,63}
+{94,48}
+{39,12,41,5,3}
+{28,33,93}
+{20,29,9}
+{75,38,10}
+{96,54,96}
+{47,87}
+{19,35,11,3,80,72}
+{75,56,84,24,55,48}
+{58,5,13,6}
+{10,53,32,6}
+{23,8,59}
+{71,2,35}
+{41,16,99}
+{77,6,16}
+{30,27,56,85,11}
+{47,21,93,82}
+{50,68,85,34,19,57}
+{14,76,58}
+{78,81}
+{68,99}
+{19,79,67}
+{91,73,82,88,44,36}
+{49,18,75,32}
+{54,18,99,74,9}
+{51,58,60,30}
+{99,86,83,22,88}
+{24,42,76,30}
+{86,16,54,69}
+{37,39,72,45}
+{92,62,3,36}
+{31,80}
+{43,22,11,15}
+{38,88,95,25,49}
+{92,21,10,28,47,55}
+{99,18}
+{26,64,72}
+{29,12,17}
+{54,69,49,84}
+{57,42,4,61,10}
+{60,85,74}
+{24,29}
+{91,71}
+{96,49}
+{47,51}
+{88,67,59,18,86}
+{32,18,64,54,41,27}
+{78,100}
+{77,30,85,93,2,20}
+{80,90,68}
+{49,37,5,42}
+{88,12,94,51}
+{85,65,2,41}
+{60,38}
+{87,37,20}
+{27,81,94,37,54,84}
+\N
+\N
+{38,74,78,78,89}
+{3,100}
+{42,80,68}
+{34,17,96,91}
+{7,29,83,71,87,26}
+{28,81,76,8,43,48}
+{74,11}
+{28,85,84,78,59,69}
+{30,22}
+{3,83,75,60,78,11}
+{20,62,18}
+{74,69}
+{91,44,50,62}
+{57,18,9}
+{14,48,21,33}
+{91,1,53,58,92,51}
+{64,41,90,52}
+{81,95,38,78,7,44}
+{65,25,15,90,40,51}
+{66,41,31}
+{5,92}
+{17,98,7,57}
+{97,36,99,77,50,88}
+{96,56}
+{40,62,88,8,53,62}
+{18,91,63,93,94}
+{88,79,43}
+{31,87,98,85}
+{12,88,58,53,77,38}
+{83,10,37,69,1,7}
+{13,47,66}
+{85,33,39,48,6,39}
+{74,87}
+\N
+{26,50,26}
+{48,78,10,39,17}
+{27,43}
+{58,17,18,80}
+{86,43,58,77,67}
+{53,12}
+{9,79,9}
+{85,79,89,88}
+{35,77,22,52}
+{93,64}
+{47,52,90,17}
+{75,15,25,68,28}
+{35,6,68,37,18,53}
+{80,14,2,89,4}
+{52,49,5,66,59,44}
+{5,26,96,1,84}
+{71,8,61,19,72}
+{17,94,84,72,55,83}
+{72,10,16,40,17,75}
+{6,70,15}
+{22,99,7,19}
+{55,19,4}
+{6,47,69,42}
+{17,9,63,44,15}
+{23,20,72}
+{10,80,20,87}
+{99,3,23}
+{11,76,8,77,58,38}
+{45,14}
+{22,89,73,63,54,9}
+{16,19}
+{1,26,29}
+{92,20,65,33,16,40}
+{27,64}
+{22,19,95}
+{36,16,9,30,31,14}
+{40,50,68,52,77,58}
+{35,15,11}
+{67,2}
+\N
+{63,48,76,25}
+{14,65,42,60}
+{61,58,31,51,70,4}
+{35,41,72,29,46,62}
+{98,48}
+{90,23}
+{1,79,80}
+{10,5,54,59,16}
+{15,1,9,75}
+{34,100,90}
+{73,76,25,77}
+{98,82,77,67}
+{79,5,20}
+{9,69,9,52,2}
+{23,22,77,80,79}
+{32,51}
+{23,52,5,33}
+{95,20,96,78,48}
+{100,37,6,15}
+{98,1,53,20,97}
+{5,28,26,78,33}
+{19,75}
+{49,42,30,72}
+{50,98,56,26,87}
+{76,59}
+{51,16,18,48,46,97}
+{80,60,51,43,58,28}
+{23,12,70}
+{40,16,14,18,46,21}
+{72,79,47,57,23}
+{7,17}
+{49,95,6}
+{14,24,29,13,90}
+{82,28,34,55,15,87}
+{31,24,3,50,45}
+{86,95}
+{97,22,17}
+{27,14,27}
+{61,63,31,74}
+{55,81,87,67,90}
+{81,9,79}
+{100,29,43}
+{41,88,37,29}
+{62,57,16,91,60,65}
+{94,90,34,94,27,48}
+{15,36,80,30,23,90}
+{47,91,6,42,93}
+{53,74,5}
+{84,14,56}
+{30,56}
+{10,12,92}
+{33,7,75}
+{96,39,50,77}
+{89,85}
+{20,39,63,22,44,18}
+\N
+{90,23,79,91,85,8}
+\N
+{73,70,52}
+{75,100}
+{27,4,29,96,25}
+{56,31,80,59}
+{1,91}
+{16,67}
+\N
+{17,88,59,41}
+{13,49,29,76,71,9}
+{41,38,16,29,66,40}
+{68,67}
+{39,74,47,71,63,80}
+{4,74,33,92}
+{17,60,82,7,52}
+{62,88,39,19,22}
+{77,21,1,95,42,2}
+{98,62}
+{55,17,81,31,11,88}
+{73,52,18,94}
+{16,64,90,33}
+{87,41,81,95,85}
+{20,55,96,75}
+{71,72,11,11,83}
+{75,94,89,47,41,7}
+{56,48}
+{76,29,74,31,67}
+{47,70,68,36,70}
+{5,69,10,94,54,32}
+{29,96,71}
+{64,28,86,58}
+{82,57}
+{42,2}
+{64,48,59,8,45}
+{61,69,43,40,1}
+{69,84}
+{68,51}
+{32,20}
+{21,7,5,60,35}
+{100,40,18,98,37}
+{50,96}
+{87,10,12,27}
+{47,3,46,43}
+{60,87,10,31}
+{92,87,50,37,72,73}
+{99,61,77,87,29}
+{23,95,31}
+{96,100,43}
+{17,64,84}
+{13,19,57}
+{65,86,4,75,46,69}
+{49,60,99,37,50,11}
+{77,82,88,12}
+{12,95,66,98,63}
+{83,78,68}
+{76,14,87,25,29,14}
+{20,9,99,73,67}
+{42,51}
+{36,22,33,6,63}
+{53,46,22}
+{40,89}
+{37,7,89,17}
+{32,89,16}
+{65,87,4}
+{16,16,57,35}
+{34,90}
+{80,54,1}
+{11,93,34}
+{5,19,31,50,99,33}
+{98,1,33,54,7}
+{45,39,23,78}
+{37,47,98,83,10,5}
+{55,88}
+{42,76,18,99}
+{86,31,25,5,45}
+{67,87,47,1}
+{23,15}
+{78,88,66,96}
+{58,55,41,67,86,41}
+{21,53}
+{90,14,28,38,95,71}
+{20,5,13,52,1,88}
+{29,98,50,75}
+{91,3,24,75,82}
+{62,33}
+{56,69,31,95,66}
+{46,85,40}
+{17,22,67,57,39,16}
+{58,25,92}
+{31,53,82,64,69,40}
+{40,12,30,1,39}
+{78,10,42,40,25}
+{58,27,1,12}
+{28,11,80}
+{36,89,69}
+{50,95}
+{61,63,59,62}
+{51,77}
+{90,24,88,84}
+{61,27,57}
+{51,81,33,75,48}
+{47,30,33,23,44}
+\N
+{79,51}
+{62,44,5}
+{98,83,80}
+{31,33,89,69,19,40}
+{22,38,61}
+\N
+{90,70,10}
+{37,90,49,65,95,52}
+{95,42,4,47}
+{92,100,43,31,27,1}
+{39,17,88,20,2,80}
+{82,64,36,84}
+{31,18,21,18,52,34}
+{3,35,36,33}
+{26,39,69}
+{67,63,66}
+{54,85}
+{65,71}
+{26,14,84}
+{63,82,73,30}
+{66,79,21}
+{71,13}
+{57,25,40,14,22}
+{63,9,91,31}
+{70,63,36,32,93}
+\N
+{11,85,47,31,54}
+{34,47}
+{42,78,92,85}
+{75,64,12,83}
+{33,98,52,91}
+{22,25,91,79,33}
+{33,51,20,77,23,65}
+{83,66,46,24}
+{54,65,31}
+{43,41}
+{52,47,66}
+\N
+{59,85,85,63,83,53}
+{16,76}
+{44,97,48,52}
+{26,36,72}
+{26,55,98,7}
+{70,88,7,87,62,37}
+{11,42}
+{98,38,36,72}
+{51,90,82,33,92}
+{59,80,79}
+{76,77,18,71}
+{34,56,62}
+{85,12,37,66}
+{34,64,74}
+{77,63,28,76,11}
+{2,63,87,50}
+{60,98,60,19,15,57}
+{93,66,33,71,36,3}
+{41,94}
+{62,72,87,19}
+{57,83,36}
+{63,64,21,13,70,32}
+{71,36,9,55,34}
+{92,52,90,45,88}
+{59,54}
+{4,51}
+{55,25,35,90,93,2}
+\N
+{75,15}
+{25,86,43,18,77}
+\N
+{31,40}
+{55,49}
+{67,1,84,20,9}
+{15,1,48,18,100}
+{62,46}
+{4,39,86,55}
+{49,17}
+{65,20,71,49,55,49}
+{40,57,63,14,3}
+{48,68}
+{67,97,58,55,5,34}
+{3,73}
+{79,97}
+{82,63,87,66,32}
+{19,49,96,50,55}
+{32,19,41}
+{17,53}
+{64,81,70}
+{66,75,18,92,54,93}
+{7,94,38,86}
+{16,62,45,19,10,11}
+{18,47}
+{58,96,69}
+{65,25,58,98}
+{29,51,37,40,44}
+{91,78}
+{37,84,85,65}
+{70,61,31,22,32,22}
+{67,12,99,39,78}
+{41,79,46,54,84,22}
+{38,26,43,4,45,75}
+{29,68,35}
+{69,59,69,33}
+{4,46,52,49}
+{1,25,44,12,71,29}
+{38,75,99}
+{83,58,86,6}
+{93,35,35,34}
+{85,26}
+{15,46,95,60}
+{62,63,65,49,10}
+{44,67,19,80,83}
+{63,41,30,43,85}
+{13,46}
+\N
+{13,95,1,34,72,37}
+{4,32,22,47,6}
+{67,65,77,3}
+{40,70,22,44}
+{74,9}
+{44,28,5,32,67,51}
+{55,14}
+{41,3,72,68}
+{64,82,72}
+\N
+{11,88}
+{91,90,92}
+{68,66,95,80,58,54}
+{30,49,11}
+{54,86,59,69,67}
+{56,83,36}
+{15,67,9,47}
+{92,30,78,2,87}
+{12,54,2,1,59,36}
+{84,25,67,38,19,53}
+{28,45}
+{54,84,9,75,59,26}
+{47,35,54,93}
+{36,96,59,75}
+{78,78,52,93}
+{87,96,67}
+{5,61,15,13,27}
+{53,58,6,78,86}
+{43,70}
+{72,38,15,61,58}
+{75,27,30,12,35,71}
+{18,72,35,62,81}
+{45,10}
+{36,91,73,25}
+{81,85,22,34,29}
+\N
+{15,97,82,44,19,83}
+{51,23,18,6,74}
+{53,75}
+{62,9,73,95,37}
+{58,42,33,41,71}
+{5,97}
+{30,2,89,81,93,61}
+{32,3,18,84,24}
+{6,97,20,89,23}
+{27,74}
+{22,86,81}
+{77,19,42}
+{92,9}
+{58,90,59,91,30,54}
+{29,51,92,34}
+{85,68,59}
+{36,83,75}
+{37,50,86,9}
+{79,70}
+{33,46,93}
+{97,17,6,88,10}
+{18,42,88,4}
+{41,95,71,27,95}
+{8,2,81,56}
+{54,94,54,28,70}
+{34,87,20,10,5}
+{36,76,87,5,100}
+{97,91,25,89,89,95}
+{76,26,73}
+{82,23,7,42,58,72}
+{53,16,99}
+{10,34,57,47,2,96}
+{81,93,26,19}
+{8,1}
+{79,55,37,61,62,3}
+{34,16,69,58}
+\N
+{41,7,99,87}
+{70,21,86}
+{59,2,49,45,91,97}
+{37,2,74,2,61,68}
+{97,39,15,4,13,1}
+{67,71,8}
+{51,2,84,38}
+{55,8}
+\N
+{75,27}
+{37,36,49,70,82,41}
+{70,20,85,89,99,90}
+{69,61,100,49,75,35}
+{11,4,67,4,91,17}
+{77,56,65,78,25,8}
+{16,58,6}
+\N
+{88,38,19,88,27,27}
+{12,46}
+{36,67}
+{62,33,96,94,80,96}
+{56,94,12,1,65,54}
+{58,73}
+{19,80,27,72}
+{47,55}
+{14,91}
+{94,75,92,32,19}
+{99,12,91,4,85}
+{56,55}
+{86,83,77,66,66,87}
+{46,68,13,45}
+{49,75,62,35,39}
+{20,25,33}
+\N
+{91,47,56,68,14}
+{88,43,24,42,4}
+{50,24,94,18}
+\N
+{71,54,91,66,97,22}
+{81,16,19,67,6}
+{78,46,81}
+{63,93,71,75,87}
+{90,38,10,85,12}
+{11,24,93,42,25,77}
+{30,14,32,67,70}
+\N
+{86,91,77}
+{73,74,64,66}
+\N
+{7,18}
+{85,94}
+{37,15,55,100,59}
+{55,18,44,79,57}
+\N
+{52,40,97,75}
+{60,53}
+{38,9}
+{27,67,77}
+\N
+{43,83,82,24,35,64}
+{22,75,29}
+{9,19}
+{67,1}
+{15,35,11}
+{65,45,95}
+{65,9}
+{63,84,99,89,6,77}
+{20,44,31}
+{82,50,88}
+{29,12,46,21,98,7}
+{98,71,3,73,6,86}
+{61,44,74,2,45,33}
+{16,56}
+{31,87}
+{72,30,37,94}
+{65,30,82,17,12}
+{86,19}
+{55,76,96,61}
+\N
+{44,92,83}
+{41,22,79,95,20}
+{36,33,86,9,61}
+{22,88,8,57,73,30}
+{63,97}
+{36,53}
+{56,52,48}
+\N
+{35,8,3,93}
+\N
+{53,52}
+{7,48,78,46,70,14}
+{33,92,55,17}
+{39,57}
+{71,43,72,7}
+{92,85,55,38,35}
+{68,30,67,8,18,92}
+{9,85,82,24}
+{46,46,19,14}
+{96,97,31,59}
+{35,99}
+{54,7,20,28,29}
+{20,21,56,82,19,40}
+{2,39}
+{33,49,63,49,93}
+{35,40,26}
+{30,35}
+{94,70,2,23,91,74}
+{34,37,72,19,15}
+{92,21}
+{72,63,64,35,40}
+{59,11,9}
+{24,3}
+{93,75}
+{22,14}
+{63,99}
+{39,47,10,14,3,45}
+{51,74,5,85,70}
+{6,33,15,4,89,20}
+{97,82,29,15,66}
+{47,47}
+{88,79,57,10,68}
+{18,22,13,100,100,67}
+{75,50,9}
+{3,12,34}
+{39,51,20}
+{56,5,63,18}
+{83,44,86,46,37}
+\N
+\N
+{60,16,54,75,62}
+{91,95}
+{39,55,11}
+{37,7}
+{29,49}
+{38,4,52,85,67,38}
+{36,56,2}
+{52,14,92,39,77,16}
+{42,25,49,55}
+{70,10,33}
+{53,46}
+{83,15,28,59}
+{35,69,82,4,58,46}
+{73,55,64,9}
+\N
+\N
+{60,25,8,8,39}
+{50,71,61,64,64}
+\N
+{65,67,67,34}
+{77,59,18,64,16}
+{43,72,32,44,59}
+{55,57}
+{12,47}
+{30,75,89,81}
+{23,92,16,31}
+{64,45,21,74,19}
+{4,47,49,47,96}
+{37,14,20,18,87}
+{61,45,38,39,1,87}
+{4,98,99,52,27}
+\N
+{23,6,50}
+{22,61,46,79}
+{90,54,60,9,49,42}
+{73,27,51,72}
+{73,11,23,60}
+{7,31,52,34}
+{27,68,39}
+{39,8,21,48,64}
+{86,64,92,60}
+{55,36,40,46,23,46}
+{32,79,86,44}
+{72,29}
+{33,87,57}
+{57,87,61,22}
+{67,84}
+{32,99,26,92}
+{22,27,34,82,8}
+{99,25,99}
+\N
+{29,75}
+{39,63,25,45,7}
+{39,67,18,13,18}
+{23,83}
+{77,69,22}
+{60,13,46}
+{2,10,42}
+{37,20,27}
+{30,21}
+{85,15,52}
+{6,89,38}
+{68,22,26,37,96}
+{6,85}
+{93,51,63,46,26,64}
+{79,77,15,26}
+{90,6,39}
+\N
+{50,58,85,27}
+{69,8,72,47}
+{7,59}
+{55,16,54,95}
+{96,5,50}
+\N
+{77,92,13}
+{46,30}
+{43,65}
+{17,65,32}
+{10,6,46,1,47,75}
+{48,82,71}
+{63,12}
+{68,14,10,97,34}
+{15,45,58,100,7,74}
+{9,23,88,1,95}
+{61,60,15,12,58}
+{84,51,46,41,71,26}
+{58,62,39}
+{86,67,31}
+{32,31,89,2,30}
+\N
+{90,74}
+{65,79,76}
+{22,30,77,47,40,23}
+{67,99,56,73}
+{11,24,30,93,89}
+{70,17,65,78}
+{100,6,67,29}
+{39,4,22,59}
+{84,29,70,9}
+{74,43,72,27,55,27}
+{12,39}
+{1,83,100}
+{48,23,9}
+{21,88,21,35,16}
+{92,34,44}
+{91,96,13}
+{93,57,40,79,81}
+{86,3,94,82,43}
+{78,70,19,97,49}
+{47,22,98,36}
+{20,59,65,54,81,27}
+{58,13,73,19,54,96}
+{26,20}
+{70,75,14,70,82}
+{77,67,53,33,83}
+{2,43,36}
+{84,17,28}
+{68,25,95,62,92}
+{47,90,15,69,85,23}
+{92,92,24,37}
+{96,14,14,38,38}
+{80,4}
+{66,86,28,15}
+{18,90,74}
+{93,76}
+{64,96,14}
+{76,41,86,67,64}
+{58,95,2,86}
+{12,60,96,70}
+{22,37,58}
+{1,67}
+{75,23,24,7}
+{3,57,66}
+{57,30,68,100}
+{68,57,33}
+{26,32,65,51,75}
+{40,14,60,97,83}
+{88,96,42}
+{66,21,21,78,34}
+{15,56}
+{86,60,66,66,16}
+{94,6,58}
+{99,63,70,57,10}
+{82,59,62,38,82,51}
+{48,61,9,46,28,57}
+{29,23,61}
+{12,30,42,20}
+{99,65,24,7,97}
+{20,5}
+{6,49,85,56,97,4}
+{62,93,88,86,75,29}
+{46,2,94}
+{57,71,45}
+{38,60,21,78}
+{95,53,92}
+{61,1,88}
+{67,80,49}
+{59,82,1,48}
+{19,94}
+{25,64,16}
+{96,73,50,85}
+{28,17,46}
+{81,51,50,18}
+{57,99,66,93}
+\N
+{23,62,57,94,40}
+{21,6,83}
+{4,11}
+{83,16,50}
+{46,41,23,1}
+{4,15,8}
+{86,51,29,80}
+{48,34,55,81,89}
+{5,2,43,67,66}
+{42,59,37,91,1}
+{14,98,27,80,33}
+{18,58}
+{49,93,60,91,94,88}
+{32,62,64,63,48}
+{51,1,90}
+{56,8,68,49}
+{16,34,79,18,76}
+{66,88,41}
+{31,66,93,44,96,40}
+{100,99,30}
+{37,49,95,91,18,43}
+{95,2,94}
+{84,15,70,31,30,84}
+{31,41,45}
+{9,73,2,7,34}
+{17,35,43,1,25,72}
+{8,70,8}
+{1,93,32,16,71,61}
+{98,51,27,56,46,65}
+{1,11,57,72,33,7}
+{48,96,64,55,75}
+{83,82}
+{7,74,70,29,59,60}
+{29,44,5,77,52}
+{84,58}
+{87,63,62,52,69}
+{29,58,32,11,13,17}
+{35,99,67,67,93}
+{54,31}
+{53,24}
+{58,59,32,22}
+{8,76,23,63,94,54}
+{3,88,75,17,64,91}
+{29,30}
+{3,81,39,9,77,82}
+{77,85,59,56,8}
+{47,12,63,13,40}
+{66,81}
+{67,33}
+{39,46,28,79,95,67}
+{49,13,98,63,10,58}
+{14,42}
+{80,70,60,92}
+{63,54}
+{30,70}
+{60,89,14,62}
+{56,40,94,55}
+{70,31,46,20,95}
+{18,65,89,7,75}
+{60,33,80,43,37,4}
+{85,19,98,79,36,84}
+{69,1,48}
+\N
+{30,87,9,22,99,60}
+\N
+{23,96,9,85}
+{22,94,39,58}
+{30,38,4,97}
+{16,70,62,5}
+{35,52}
+{32,10,72}
+{35,34,40,31,66,80}
+{7,77,14,48,97}
+{67,64,37,22,69}
+{51,53}
+{67,71,90}
+{87,71,45}
+{44,84}
+{19,58,11,34,45,85}
+{68,19,55}
+{27,16}
+{7,14,92,22,33,46}
+{47,2,49,53,63,32}
+{15,39}
+{13,47,84}
+{29,74,97}
+{51,74}
+{70,26,46,33,51}
+{31,86,14,23,61}
+{20,85}
+{21,10,57}
+{90,94,59,72,97}
+{97,30,74,84}
+{15,89,69}
+{11,40,2}
+{68,19,47,28}
+{47,65}
+{2,7,52,53,44}
+{40,74,34,36,78,71}
+{22,60}
+\N
+{37,75,47}
+{53,78,2}
+{4,32,42}
+{35,76,69,88}
+{95,13,3,38,3}
+{74,74,62,90}
+{8,72,42,2}
+{11,43,5,43,70,16}
+{69,19}
+{61,37,26,49}
+{16,100,69,32,35}
+{58,77,26,76}
+{74,87,37,47,84}
+{8,82,29,93,15}
+{74,88,93,85,97,95}
+\N
+{29,23,99,98,36,93}
+{8,36,87,64}
+{71,90,43}
+{7,28,78,46,52}
+{62,25}
+{33,90,7}
+{60,72,39,18,86}
+{98,59,73,24}
+{17,69,2}
+{49,16,63,56}
+{13,37,62,1,95}
+{98,89,69,92}
+{50,26,34}
+{90,16}
+\N
+{40,54,3,79,51,19}
+{29,24}
+{6,12,82,24}
+{92,52}
+{89,2}
+{64,25,68,55,81,2}
+{64,77}
+{71,46,58,50,56,34}
+{94,17,35,30,60,33}
+{37,30,2,40}
+{98,15,16,92,2,50}
+{44,19,82,57}
+{37,34,6}
+{59,43,1,53,79}
+{7,37,14,14,92}
+{80,78,49,81,23,17}
+\N
+{91,51,12,35,79}
+{9,14,2,84}
+{62,3,77}
+{25,5,40,12,40,79}
+{65,88,82,94,89,90}
+{20,35}
+{80,71,83}
+{6,9,83}
+{94,58}
+{2,76,55,61,42,53}
+{60,53,45,82,3}
+{1,37,75,96}
+{82,61,81,10}
+{36,46,1,31,90,45}
+{22,55,11,25,21}
+{69,13,29,20}
+{95,54}
+{16,79,82,67}
+{4,58,84,84}
+{52,7}
+{25,14,94}
+{69,8,67,54}
+{30,71,36}
+{81,78,23,38,76,58}
+{86,59,61}
+{11,42,63,74,99}
+{66,4,55,34,16}
+{39,57}
+{10,81,9,8,21,10}
+{75,55,64,97,7,45}
+{8,46,86}
+{39,100,52}
+{30,51,7,13,54}
+{72,85}
+{10,52}
+\N
+{61,7}
+{93,1}
+\N
+{74,31,3}
+{90,96,26,84}
+{88,58,74}
+{28,45,74,24,74}
+{95,88}
+{42,70,43,64,22}
+{46,83,48,36}
+{81,99,100,43,11}
+{47,24}
+{46,67,63}
+{26,15,36,89}
+{90,11,78,70,81,87}
+{65,90}
+{89,99,21,81,47,38}
+{37,42}
+\N
+{94,51}
+{12,57,95,63,29}
+\N
+{68,99}
+{27,8}
+{16,52,11}
+{72,5,85,44,57,51}
+{11,6,91,7}
+{87,80}
+{94,61,1,38,77,89}
+{93,60,6,98,46}
+{52,47,44}
+{93,66,61,22}
+{7,61}
+{15,83,93,91,12,40}
+{66,3,5,72,72,36}
+{67,72,68}
+{42,42}
+{38,17}
+{75,60,47,39}
+{58,28,51}
+{61,8,61,81,65}
+{46,52,97,84,27,47}
+{97,53,47}
+{64,93,83,72,27}
+{34,79,34,36}
+{25,5,92,37}
+{12,20,55,94}
+{17,43}
+{39,37,16,70}
+{79,62,15,16,64,28}
+{80,87,96,41}
+{51,55,1,94,72}
+{75,22,56}
+{2,55,7,20,39}
+{8,91}
+{73,8,42,73,31}
+{90,90,23}
+{82,68}
+{63,64,68,12,59,19}
+{100,80,23,24,17}
+{23,46}
+{25,13,31}
+{43,95,54,85}
+{40,62,21,21,82}
+{70,20,16}
+{90,11,23,18}
+{16,9}
+{51,57,30,27,21}
+{50,55,75,77,53,33}
+{84,92}
+{14,66,32}
+{44,100,16,30,82}
+{41,48,58,60,7,44}
+{81,76,13}
+{18,26,82}
+{84,35,15,98}
+{52,84}
+{13,80,36,35,28}
+{91,16,71,55}
+{87,89,6,20,28}
+{12,75,92}
+{48,41,55}
+{59,75,26}
+{48,19,48,72}
+{91,4,100,25,17}
+{46,52,97,78,94}
+{7,81,76}
+{54,54,49}
+{89,37}
+{78,22,57}
+{75,25,83}
+{25,89,10,38,96}
+{52,12,1,74,35}
+{13,48,88,7}
+{6,97,20,19,91}
+{53,2,99,76}
+{4,58,46}
+{30,30,89}
+{97,2,87,47,55}
+{14,11,72,83,97,74}
+{44,69,11,51}
+{47,17,86,27}
+{15,19,56,96,24,94}
+{81,67}
+{11,11}
+{20,94,49,36,39}
+{39,78,40,46}
+{33,87}
+{76,89,58}
+{94,74,25}
+{33,77,5,47,55}
+{28,67,99,81,93,83}
+{31,10,19,65,60}
+{53,25,74,24,48}
+{73,69,23,45,88}
+{70,56,41}
+{21,73,72,28,99,5}
+{75,69}
+{78,99}
+{66,49,89,86,2}
+{30,53,18,21}
+{67,69}
+{1,98,38}
+{91,25,16,39}
+\N
+{75,54,93,39,18}
+{96,84}
+\N
+{64,71}
+{6,15,78,50}
+{8,45,26,15,25}
+{8,90,94}
+{52,66,13,98,86,69}
+{3,25,28,56,88}
+{84,72,89}
+{10,33,46,6,57,100}
+{13,91,99,2,49}
+{83,59}
+{88,64,42,50,77,16}
+{81,12,27,45}
+{12,17,31,93,22,53}
+\N
+{28,84,85,35,3}
+\N
+{42,12,86,76,37,63}
+{46,23,18}
+{45,80,76}
+{94,18,100}
+{17,80,84,80}
+{84,88,29,16,10}
+{7,42,90,51,33,40}
+{79,51,22,2}
+{31,30,72,24,23,84}
+\N
+{55,50}
+{69,47,82,29,83}
+{94,56,69,18}
+{7,81,71}
+{95,13,32}
+{66,59,68,62}
+{52,19,62,51,80,32}
+{38,18}
+{73,24,81,58,22}
+{11,59,41,19,96}
+{61,11,56,89,89}
+{61,72,9}
+{63,12,8}
+{76,54,75,84,6,44}
+{74,3,11,62,30,74}
+{46,60,71,55}
+{28,47,52,71,33,33}
+{35,51,37}
+{38,89,40,29,30}
+{18,26,99,89}
+{36,44,8,100,72}
+{1,23,6,5,23}
+\N
+{84,17,16,44,81}
+{29,70,24,85}
+{23,57}
+{20,98,30,23,1,66}
+{82,3}
+{70,7}
+{15,49,58}
+{19,40,70,88,35}
+{45,10}
+{62,89,47,71,55}
+{34,100,88,44,3,91}
+{92,65,16,24,7,9}
+{20,12,61,95,7}
+\N
+{57,49,42,87,88,14}
+{89,99,86,31}
+{32,55,51,78}
+{55,66,78,10,12}
+{37,19}
+{13,5,36,66}
+{89,7,40,45}
+{41,58,41,24,11}
+{98,8,9,27,40}
+{49,83,89}
+{91,36,78,44,100,62}
+{76,78,9,52,57,27}
+{100,59,37}
+{51,1}
+{92,83}
+{45,1,85}
+{8,81,45,94,32}
+{52,26,9,98,7}
+{97,52,4,85,13,11}
+{94,38,58,4,72,91}
+{5,39,26,14,74,51}
+{31,44,37,24,89}
+{8,74}
+{56,93,36,3}
+{23,46,25,90,42}
+{4,98}
+{31,95,27,26,20}
+{3,7,79,9,90}
+{29,22}
+\N
+{35,34}
+{80,28,12,21}
+\N
+\N
+\N
+{36,49,94,83,25,9}
+{6,62,89,93,59}
+{67,75,3,93}
+\N
+{94,62,3}
+{97,36}
+{43,89,26,94}
+{46,56,22}
+{50,15}
+{45,47,39,61}
+{23,32,24,45,43,11}
+{97,66,29,8,52,67}
+{37,1,48}
+{30,84,86,91}
+{4,46,59,35}
+{76,37,41,90}
+{26,28,92,27,88,17}
+{76,37,27,41}
+{74,51,31}
+{16,33}
+{66,85,68}
+{4,81,72,62}
+{65,14}
+\N
+{11,43,28,14,9,43}
+{60,88,95,1}
+{52,92,69,48}
+{37,81,85}
+{57,73,8,79}
+{50,26}
+{52,41,99,6,33}
+{9,34,58,22,9}
+{56,37,19,77,50}
+{93,21,18,90,41,40}
+{28,89,76}
+{4,36}
+{89,54}
+{70,28}
+{66,11,3,47,30,43}
+{69,54,86}
+{45,41,57,34,18}
+{91,46,32,68,42,68}
+{25,87}
+{75,57,12}
+{55,15,68}
+{6,63}
+{22,39,88}
+{77,39,10}
+{39,49,69,61,66,77}
+{78,25,42,73,89}
+{17,47,36,27,79}
+{33,83,44}
+{27,75,12,96,94,87}
+{50,17,95,42,25}
+{67,13,22}
+{59,85,95,2}
+{81,57,83}
+{25,11,72}
+{32,84,97,6,65,52}
+{62,25,24,27,50}
+{80,64,23,74,54,75}
+{97,17,15,100}
+{50,11,41}
+{57,82,40}
+{10,90,41,52,39}
+{4,11,86}
+{79,17,51}
+{48,100,92,77,58}
+{88,67,19}
+{40,96,52,35,16}
+{89,63,32,81,28,63}
+{44,56,66,50,55}
+{28,73,46}
+{32,40}
+{52,65,85}
+\N
+{51,34,18,82,83}
+{49,49,90,71}
+{84,16,74,78,86,10}
+\N
+{73,9,47}
+{51,59,49,90}
+{85,13,78}
+{98,77,18,15,92,85}
+{40,94,66,94}
+{89,51,80,12}
+{23,26,75,17}
+{96,2,51}
+{88,62,90,32}
+{85,19,87,89,30,15}
+{33,38,9,46,19,87}
+{27,45,15}
+{39,79,82,88}
+{31,33}
+{41,64,10,1}
+{35,61,22,76,74}
+{75,11,90,16}
+{71,23,43}
+{35,3,97}
+{88,4,97}
+{100,61,28}
+\N
+{64,74}
+{9,44,81,98,55}
+\N
+\N
+{76,89}
+{18,34,80}
+{77,83,91,50,20,41}
+{65,50,26,65}
+{79,18,90}
+{5,60}
+{42,21}
+{31,70,80}
+{20,98,15,14}
+{58,65,45,6,64}
+\N
+\N
+{88,82,98}
+{75,81,32,34,59}
+{37,14}
+{30,36,55,70,65}
+{84,55,26}
+{56,64,1}
+{31,41,89}
+{46,43,43,90,34,100}
+{78,36,21,14,69}
+{100,10,45}
+{73,69}
+{60,86,5,70,78,99}
+{6,89,92,8}
+{86,68}
+{44,4,71}
+{41,36}
+{95,80,42,94,34}
+{73,29,50,49}
+{61,20,57,17,36}
+{37,58,67}
+{56,83,77,37}
+{98,67,40,10,35,76}
+{54,84,6}
+{7,71}
+{65,74,43,6}
+{62,98,74}
+{81,26,17,22,47}
+{49,32,59,35,11,94}
+{80,50}
+{91,1,50,97}
+{71,35,84}
+{97,4,46,45,8,36}
+\N
+{81,62,76}
+{69,78}
+{89,3,16,64,17,17}
+{78,72,26,88,81}
+{25,34,9}
+{50,27,34}
+\N
+{55,44}
+{61,51,39,53,44,46}
+{23,94,32,92,90}
+{91,47,67}
+{1,13,76,57,63}
+{77,19,73,18,95}
+{100,82,87,6,83,23}
+{69,58,48,97,60,50}
+{4,83,85,6}
+{3,5,91,37,94}
+{91,72,31,32,80}
+{57,23,39,46,50,20}
+{92,28,53}
+{71,27,46}
+\N
+{59,73,29,21,89,30}
+{1,83,96}
+{34,41,65,35}
+{52,89}
+{62,68,80,7}
+{82,82}
+\N
+{11,2,62,46,28,9}
+{9,16}
+\N
+{22,44,73,82,39,86}
+{97,52}
+{46,36,76,56}
+{17,97,26,72}
+{16,78,9,70}
+{65,55,30,91,16}
+{27,45,76}
+{17,5,90}
+{86,52,93,89,42,27}
+{51,70,41,35,1}
+{91,57,66}
+{53,59,62,57,52,56}
+{100,100}
+{32,78,87}
+{61,57,74}
+{86,79}
+{55,94,64}
+{81,20,26,22,23}
+{9,96}
+{86,65,35,19,88}
+{1,37,90,51}
+{79,47}
+{93,93}
+{32,85,69}
+{49,12,6,69}
+{6,44,92,37}
+{28,42,57,28,2,69}
+\N
+{63,90,25}
+{53,28,74,42}
+{83,79,94,37,64,69}
+{93,100,57,84,80}
+{39,93,80}
+{97,92,55}
+{27,6}
+{20,100}
+{19,66,3,66}
+{7,76,15}
+{7,56,92,11}
+{61,76,6,98,52}
+{20,46,51}
+{12,77,45,67}
+{78,79,32,22,21,47}
+{62,35,1}
+{86,66,57,10,47,43}
+{43,24,76,18,87,68}
+{39,52,71,35,87}
+{81,78,8,10}
+{33,70,53,54}
+{25,77,27,68,95}
+{29,53,89,62,51}
+{21,76,33,72,39}
+{13,22}
+{1,1,51,73,20}
+{26,97}
+{64,75,23,94,62,68}
+{25,20,84,57,27}
+{26,7}
+{92,80,17,48,72,73}
+{73,49,88}
+{24,36,70,53}
+{7,79}
+{80,58,33,25,91}
+{19,43,61}
+{54,49,73}
+{51,88,4}
+{9,32,5,83}
+{17,68,90,15,30}
+{98,50,42}
+{29,52}
+{32,41,4}
+{33,97,69,34}
+{94,2,60,5,83}
+{23,86,43,74,35}
+{63,37,38,58,39,14}
+{56,7,82}
+{88,81}
+{50,75}
+{78,49,67,68}
+{10,61,58}
+{84,35,20,30}
+{36,34,48,31,16}
+{35,7,47,22}
+{98,40,56,43}
+{16,4,7,9,44,55}
+{86,90,30,80,47,91}
+{34,91}
+\N
+{12,67,77,23,11}
+{94,8}
+{5,68,31,82}
+{26,65}
+{51,19,86}
+{55,83,39,39,96,51}
+{31,22,70}
+{20,50,15,93}
+{1,55,64}
+{8,2,14,3,40}
+{2,71,25,41,5,5}
+{98,61}
+{21,64}
+{100,76,99,18,78}
+{17,4,69,97,61}
+{52,79,97}
+{52,26}
+\N
+{90,54,2,62,11,51}
+{33,12,34,45,2}
+{91,63,51,42,82}
+{100,79,73,70,54,14}
+{57,94,81,55}
+{13,18,94,17,16,34}
+{58,79}
+{90,64,68,46,95}
+\N
+{37,46}
+{91,94,10,85,100,24}
+{65,86}
+{94,89,7}
+{72,79,77,53,95}
+{65,19,92}
+{41,79,53,8,63}
+{28,60,50,42,9,32}
+\N
+{6,23,97,23,10}
+{12,28,16,39,70,50}
+{26,97,61,48,79,23}
+{38,98,21,34,65,89}
+{29,13,36,19,13,45}
+{72,65,58,81}
+{43,98,84,5}
+{79,41,100}
+{35,30,69,42}
+{59,13}
+{65,90}
+{40,38,21,23}
+{2,19,26,38,66}
+{5,16}
+{84,85,97,84}
+{34,26}
+{87,17,21,32,29,25}
+{75,66,87,90,18}
+{84,32,29,51,71,68}
+{57,25,73,24,53,2}
+{74,16,92}
+{99,60,19}
+{98,14,70,72}
+{24,34}
+{37,34,81,100}
+{67,10,17,60,16,55}
+{39,58,5,23,85,95}
+{75,93,19,31,47}
+{13,27}
+{42,14,32,90}
+{59,79,70}
+{48,96,45,38,58}
+{96,87,84}
+{23,70}
+{25,31,81,36,75,32}
+{64,49}
+{30,18,38}
+{69,27}
+{76,82,43,96,73,17}
+{84,95,97,12,20}
+{57,69,36}
+{60,79,19,67,9,12}
+{32,39,3,21}
+{55,83,51,48}
+\N
+{37,11,98,53,11}
+{2,73,24,18,77,74}
+{69,96,17,49}
+{53,2}
+{1,76,72}
+{35,93}
+{35,36,36,25}
+{59,77,30,13}
+{35,69,36,31}
+\N
+{20,23,51}
+{81,83,57}
+{87,43,40,56,81,64}
+{24,63}
+{29,51,45,93}
+{73,85}
+{59,1}
+\N
+{13,57,14,11,34,91}
+{69,1,4,28,77}
+{63,68,41,53,64,43}
+{11,1,46,40,6,88}
+{51,19,77,10,86,66}
+{74,40}
+{25,54,46,62}
+{94,17,64,15,20,36}
+{100,71}
+{63,66}
+{33,88,5,92}
+{92,86}
+{91,69,75,13,20}
+{57,22,32,33}
+{72,87,44,64,46,6}
+{50,56}
+{36,23,7}
+{74,63,3,6,14,29}
+{91,42,8,11,49}
+{32,64,94,88}
+{91,78,55,27,59}
+{2,20}
+{52,95}
+{57,59,35}
+{51,15,52,24,14,13}
+{64,16,18}
+{50,98,71,10}
+{92,99,92,80,77,73}
+{96,12,70,85,54,73}
+{10,44,30,77}
+{29,47}
+{40,55,62,58,30}
+{59,93,7,21,6,20}
+{58,91}
+{5,70}
+{36,23,58,80}
+{16,93,54}
+{20,8,97}
+{78,32}
+{10,31}
+{24,10}
+{56,14,28,10,45}
+{1,79,53}
+{56,58,86}
+{93,83,17,89,93}
+{12,4,26,45,97,17}
+{42,67,17,13}
+{31,90,59,38,4,20}
+{86,52,67,10}
+\N
+{49,59,10,25}
+{69,88,31,38,7,36}
+{84,21,57}
+\N
+{60,8,19}
+{35,81,66,96}
+{13,95,54,38,31}
+{27,25,34,11,65,64}
+{54,43,20,20,65,95}
+\N
+{19,27,100,69,43}
+{91,8}
+{30,65,98,87,84}
+{83,85,100,16,20,18}
+{80,48,56}
+{61,5,92}
+{14,94,43,91}
+{35,52,60,43}
+{73,25,26,61}
+{66,41,39,16}
+{2,96,90,37,99,92}
+{25,31}
+{72,57,50,82}
+{40,69,5}
+{98,34,66}
+{90,44}
+{34,78,93,15,65,71}
+{98,1,28,36}
+{16,59,79}
+{88,1,14,45}
+{41,91,87,20,72}
+{46,9,81,90,63,32}
+{2,84,29,56}
+{2,57,92,69,63,46}
+{3,32,76,62,36}
+{11,81,3,81,90,16}
+{36,1,42,51}
+{29,86,53,51,85}
+{17,66,16}
+{4,21,25,17,65,92}
+{13,26,33}
+{74,6,46}
+{69,19}
+{47,78,85,46,41}
+{41,62,100,85}
+{22,71,66}
+{28,15,58,84,22,92}
+{68,82,82,85,15,54}
+{34,58,72,35,99}
+{51,100,40,13,61}
+{80,89,94,31,96}
+{48,29,33}
+{32,85,75}
+{76,43,17}
+{79,70,3,64}
+{76,64,85}
+{94,90,3,85}
+{86,21,1,8,54}
+{87,92,30,36,59}
+{20,51,62,17}
+{81,61,86,96,47,67}
+{5,75,97}
+{60,24,79,3}
+{85,49,49,48,61}
+{66,60,58,92,88,90}
+{2,18}
+{42,54}
+{42,83,68}
+{98,76,42,25,90,32}
+{64,36,39,45,34,95}
+{56,43,78,10,63,18}
+{51,40,98}
+{85,11,74,41,14,25}
+{37,12}
+{76,32}
+{6,77,16,86,36,25}
+{23,93,18}
+{75,51,67,29}
+{22,9}
+{18,58,25,88}
+{95,31,12,20,62,54}
+{23,97,89,63,73}
+{77,41,11,27}
+{91,86,97,98}
+{84,6}
+{74,69,55}
+{58,42,92,65,52}
+{77,31}
+{8,91}
+{5,83}
+{64,48}
+{1,37}
+{51,4,49,97,64}
+{29,70,3,62,57,1}
+{91,8,31}
+{86,71}
+\N
+{61,50,8,6,59,76}
+{83,8,54}
+{50,45,66,86,52}
+{75,48,18,88,82}
+{1,52,60,78,45}
+{46,65}
+{53,2,63}
+\N
+{89,97}
+\N
+{75,23}
+{30,58,13,50,2}
+{59,73,52,8,70,39}
+{20,35,77,34,10}
+{55,86,14,74,14}
+{67,46,48}
+{20,9}
+{20,92,62,75,34,98}
+\N
+{72,14,18,46}
+{48,71,92,17,31,13}
+{47,46,42}
+{42,75,14,86}
+{97,55,97,78,72}
+{8,4,96}
+{44,13,13,18,15}
+{16,40,87}
+{87,66,79}
+{14,44}
+{35,79,25,57,99,96}
+{23,66}
+{90,49,24,11,8}
+{50,3,24,55}
+{60,94,68,36}
+{11,20,83}
+{66,100,47,4,56,38}
+{36,34,69}
+{41,57,15,32,84}
+{32,25,100,45,44,44}
+{70,32}
+{15,37,67,63,71,34}
+\N
+{81,62,20,91}
+{32,62,1,68,86,54}
+{20,91,40}
+{79,69,22,98,14}
+{45,42,24,2}
+{30,53,15,62}
+{81,100,42,20,96,42}
+{93,19,7,59,100,49}
+{25,7,18,64}
+{11,27,1}
+{89,67,65}
+{39,97}
+{47,62,30,61,58}
+{4,11,83,18}
+{38,30,95,58,13,81}
+{83,6,33,73,64}
+{89,51,77,45,58,16}
+{13,11,88}
+{96,79,71}
+\N
+{18,66,83,52,84,76}
+{52,17}
+{74,95,16,5,16,51}
+{21,20,16,39,84,71}
+\N
+{75,47,36}
+{65,45,12,5,100}
+{41,74,84,21,73}
+\N
+{8,90,46,39,30}
+{47,84,42,49,17}
+{76,100,35,89,17}
+{61,53,50,31,8}
+{94,53,20,33,15}
+{97,46,62,85,74}
+{8,59,40}
+{95,71,21,41,85,81}
+{55,71,20,74}
+{70,95}
+{61,42}
+{83,74,25,84,18}
+{56,43,46,40}
+{42,78}
+{95,48,98,93,35,98}
+{77,34}
+{4,54,58}
+\N
+{13,54}
+{87,66}
+{12,88,90,95,6,95}
+{65,20,10}
+{62,74,59}
+{49,17,51}
+{14,17,65,3,27,41}
+{43,42,43,46,79}
+{88,75}
+{21,46,84,95,31}
+{17,17,28}
+{32,73,29,11,46,94}
+{3,34,81}
+{80,83,1,92,69,100}
+{9,24,56,17}
+{3,80,57,36,14,94}
+{39,89,54,17,31}
+{70,19,67,21,31,72}
+{82,48,68,52}
+{96,81}
+{92,18,39,50,18}
+{6,54,27,52,28,100}
+{23,40,7,74,93,50}
+{87,51,38,88}
+{98,42,43,30,8,71}
+{33,26}
+{20,21,83,35,99,100}
+{28,77,94,32,1,13}
+{17,15}
+{35,100,9}
+{42,6}
+{16,28,55}
+{7,94,81,60,91}
+{100,63,21,28}
+{65,20,35,16,76}
+{95,3,88,62,1}
+{73,44,46,13,55,69}
+\N
+{60,49,71,77}
+{93,39,75,63,69}
+{97,36}
+\N
+{77,16}
+\N
+{57,30}
+{39,31,56,51}
+{62,78,62,38,54}
+{69,86,99,10,12}
+{11,43}
+{60,70,83}
+{83,82,3,1,60}
+{24,55,61,85}
+{65,72,13,77,79,100}
+\N
+\N
+{28,97,71,78,68,95}
+{34,1,72,79,84}
+{10,49,91,44,27,51}
+{15,48,80,37,69}
+{42,46,32,34,86}
+{80,21,26,50,5,8}
+{61,71,100,78,54,50}
+{36,20,80}
+{67,40,47,68}
+{60,7,36,36,55,2}
+{32,91,13,98,88}
+{15,56,65,23,13}
+{20,66,81}
+{19,36,99,54,86,92}
+{82,28}
+{43,32,91,37,70,68}
+{71,78,82,50}
+{1,31,23,48,10,12}
+{88,96,1,44}
+{27,49,97,29,89,35}
+{63,72,58}
+{79,9,32,64}
+{75,67}
+{46,31,83,54}
+{66,24,6,89}
+{82,10,64}
+\N
+{19,31,52,34,89}
+{16,36,11,12,23}
+{55,50,6,20}
+{81,72}
+{71,74,8,6,31}
+{6,20,96,80}
+{95,85,56,91}
+{36,33,88,12,50}
+{77,44,52,50,50}
+{94,12,7}
+{97,44,40,43,8,21}
+\N
+{61,14,40,75,87}
+{43,21,67,66}
+{46,19,80,12,46,28}
+{56,11,14,59}
+{31,94,50}
+{45,26,61,15}
+{84,45,44,82}
+{9,16,86,54,93,30}
+{50,39,37}
+{35,60,64,55,73,90}
+{61,65,87,20,30}
+{12,59,44}
+{23,8,97}
+{30,59,7}
+{85,32,14,95,38}
+{18,91}
+{10,40,20,8,58}
+{5,58,4,94}
+{100,11,96,70}
+{66,72,7}
+{5,31,89,89,4}
+{81,68,44,37}
+{22,22,76,67,72}
+{22,26,30}
+{73,47,27,18,54,30}
+{44,13,73,95,83}
+{18,93,72}
+{30,22,73,13,16}
+{14,11,66}
+{45,33,59,72,92,81}
+{97,82}
+{30,4}
+{1,9,46,70}
+{47,50,20,71,48,60}
+{26,62,53,70,63,49}
+{39,26}
+{47,94,9}
+{55,3,18,1,75,22}
+{42,87,74,57,60,55}
+{95,46,21,38,27}
+\N
+{13,35,48}
+{24,39,24,67}
+{44,83,49,72}
+{22,8}
+{77,39,87}
+{37,41,44}
+{100,57}
+{48,54,58,79}
+{14,84,40}
+{11,51}
+{23,80}
+{80,82,43,59,2}
+{92,53,56,44,90,66}
+{44,67,78,9}
+{43,91}
+{70,74,100,69}
+{12,5,75}
+{65,51,22,65,56,36}
+{52,54}
+{38,78}
+{30,45,38,99}
+{18,88,88,63,51}
+{61,24,53}
+{72,24,77}
+{61,46}
+{11,83,49,86,27,60}
+{86,60,83,34,33,28}
+{65,15,10,51}
+{98,92}
+{49,49,60,3}
+{58,56,43}
+{19,25,15}
+{24,40,36,49,61}
+{5,62,9}
+{72,8,71}
+{64,85}
+{72,84,67}
+\N
+\N
+{80,87,30,70,21}
+{30,86,95,19,21}
+{17,90,15,89,81}
+{40,51}
+{77,88}
+{14,89,82,62}
+{40,66,93,16,55,45}
+{22,46,31,17,4,71}
+{8,41,88,94,25,61}
+{80,8,23,71,59,53}
+{61,70,23}
+{2,4,79,6,67}
+{27,70,42,68,33}
+{46,27,10}
+{1,93,42,12,8}
+{31,9,19,32,62,15}
+{16,42,81}
+{56,29,12,17,61}
+{52,100,98,42}
+\N
+{29,38}
+{49,40,47,63,22,4}
+{99,70,13}
+{70,28,67,100}
+{37,75,65,63,35}
+{45,67,37,28}
+{42,78,71,39}
+{33,35,76,69}
+{65,84,57,63}
+{17,12,86,23}
+{31,62,79}
+{3,22}
+{85,81,59}
+{38,5,15,100,1,27}
+{36,96,93,46,75}
+{44,61,85,70,71}
+{79,72,86,71,77,9}
+{23,51,47}
+{4,59,48,38,44}
+{93,54,86,98}
+{60,29}
+{49,38}
+{54,84}
+{72,25}
+{51,40,25,27,68}
+{24,17}
+{95,3,82,31,95}
+{56,37,57}
+{15,84,98,16,53}
+{47,36,15}
+{27,36,76}
+{38,82,26}
+{47,70}
+{60,89}
+{59,73,99,7,28,89}
+{87,49,70,76}
+{71,93,76,81,11,46}
+{74,87,92,24,43,22}
+\N
+{26,1,85}
+{18,73,43,94}
+{92,2,73}
+{5,58,85}
+{20,7,39,18,59,90}
+{11,16,19,77,60,56}
+{77,1,95}
+{4,4,11}
+{48,40,56,74,96,29}
+{71,1,62,69}
+\N
+{34,61,26}
+{86,75,13,73,28}
+{17,35}
+{100,29,37,26,47}
+{69,36,52,61}
+\N
+{81,51,54}
+{54,78,46}
+{1,78,96}
+{33,54}
+{72,9,37,30,100}
+{67,10,52}
+{77,19,74}
+{52,27,41,37,98,73}
+{8,74,86}
+{4,40,99,6,59}
+\N
+{98,43}
+{74,91}
+{69,45,73,59,19}
+{87,43,31,85}
+{2,51,54,3}
+{45,73,8,86,4,40}
+{2,51,96}
+{74,5,8,64,1,46}
+{5,64,86,63,12,75}
+{6,62,71,24}
+{56,84,54}
+{61,37,79,63}
+{81,39,78,23,86,74}
+{50,79,34,23}
+{85,36,78,80,19}
+{34,94,1,46}
+{5,23,38,4,78,2}
+{85,100,80,13,73}
+{48,86,9}
+{47,22,65}
+{49,81,18,52,36}
+{84,85}
+{89,15,71,88,44}
+{1,21,81,52,2}
+{53,18,7,53,50,11}
+{91,89}
+\N
+{20,6,20,70,12,32}
+{98,94,70,52,41,35}
+{43,25,2,63}
+{95,86,6,82,2,41}
+{79,24,63}
+{12,96,7,18,48,67}
+{55,35,4,75,28,39}
+{48,46,33,75}
+{10,99,5,5,98,25}
+{43,87,5,53,76,64}
+\N
+{100,13,9,4}
+{4,35,65,56}
+{27,74,88}
+{59,66,10}
+\N
+{59,85,39,48,17,29}
+{59,42,17}
+{27,99,12,21}
+{9,10}
+{15,4,80,25,67,59}
+{12,89,96}
+{50,32,92,49}
+{40,74,10,6,26,43}
+{80,71,29,54}
+{74,82}
+{22,25,27,65,12}
+{84,88,53,43,75}
+{84,16,51,84,46}
+{10,9,44,95}
+{87,19,22,10,44,80}
+{18,20,87,41,86}
+\N
+{9,64,4,33}
+{65,87,23,65,32,92}
+{50,2,23,68}
+{29,8,82,28}
+{54,92,6,2,28,70}
+{23,11,65,78,34}
+{77,85}
+{30,49,59,8,60}
+{77,30,34}
+{55,73}
+{89,68,55,81,8,81}
+{54,28}
+{35,22,67,63,48}
+{43,37,46,56,81}
+{16,78,32,81,77,37}
+{35,80,41,76}
+{4,93}
+{3,32,23}
+{43,18,50}
+{87,5}
+{30,40,91}
+{36,69,17,82,70,57}
+{73,71,47,63,58}
+{24,11,36}
+{2,72,61,76,9}
+{61,97,10,85,92,56}
+{5,44,47}
+{24,57,79}
+{69,39,97,8}
+{78,16}
+{62,52,17,35,28}
+{48,79,66,64,36}
+{14,72,75,30}
+{17,21,41,25}
+{28,100,66,56,15}
+{89,3,32,86,6}
+{67,34,16}
+\N
+{48,27,70,60,1,40}
+{69,34,36,46,95}
+{59,24,84}
+{44,21,90}
+{22,30,5,62,13,58}
+{79,67,44,10,1}
+{67,8}
+{40,48}
+{64,5,65,35}
+{74,45,75,15,31,69}
+{42,3,49,33,52,97}
+{86,59,69,84,53}
+{64,64,41,64,99}
+{47,95,16,78,73,68}
+{54,11,52,90}
+{54,62,79,58,96,59}
+{28,34}
+{52,94,17,42,9}
+{94,22,77,7,56}
+{72,24,47}
+{6,11,3,23}
+{9,6,97,82,40,39}
+{73,47,57,8,7,97}
+{27,26,1,2}
+{64,45,38}
+{71,6,6,83,33}
+{78,28,40}
+{25,8,17,15}
+{24,67,53}
+{72,42}
+{66,25,56,36,32,93}
+{18,11,22}
+{88,9,75,23}
+{20,32,24,44,51,34}
+{76,86,11,7,1,61}
+{11,77,41,55,87,59}
+{62,53,94,46}
+{77,20}
+{74,97,59,78,9}
+{7,94,26,18,77}
+\N
+{49,59}
+{72,22,42,89,14,80}
+{49,14,38,19}
+{43,88,25,58,39,24}
+{21,34,37,65}
+{85,3,46}
+\N
+{11,60,86,65,49,83}
+{51,98,7,28}
+{85,17,34,59,14,86}
+{89,81,48}
+{67,40,11,60,75}
+{13,45,42,22,82,82}
+{98,21,89}
+{30,63}
+{35,45,68}
+{9,29}
+{43,71}
+{82,44,59,72,48}
+{1,48,29,44,14,11}
+{75,33,85}
+{7,32,92}
+{62,14}
+{29,31,1,36,51}
+{92,12,28,20}
+{13,67}
+{88,72,14,22,61,42}
+{15,98,49}
+{65,27,9,76}
+\N
+{15,95,26,12,52,40}
+{17,20,74}
+{57,63,15,22,38}
+{93,71,8}
+{26,84,82}
+{20,52,3,3}
+{72,95}
+{10,9,80}
+{9,9,18,51}
+{74,24,63,63,57,89}
+{64,91,95,18,15}
+{64,37,20,36,74}
+{52,9,53,6}
+{17,31,42}
+{3,73,92,13,62}
+{57,81,58,49}
+{52,56,2,26,18}
+\N
+\N
+{90,90}
+{16,92}
+{66,51,7,19,10}
+{100,81,69,86,95}
+{48,64,81}
+{87,54,73}
+{6,80,100,24,26,8}
+{44,67}
+{27,94,2,25,34}
+{80,25}
+{12,2,77,75,15}
+{63,14,30}
+{85,75,59}
+{72,73,54,44,25,76}
+{95,44,69,91,62}
+{94,73,78,5}
+{28,52}
+{86,31}
+{69,90,95,66}
+{6,10}
+{68,72,112}
+{9,165}
+{91,132,164}
+{57,82,144,167,184}
+{3,6,101,118}
+{111,158}
+{22,29,30,174}
+{41,66}
+{39,76,189}
+{7,20,21,196}
+{52,126,169,171,184}
+{21,77,91,176,196}
+{16,97,121}
+{83,135,137}
+{8,140,160,164,165,195}
+{38,65,185}
+{112,152}
+{111,129,134,148}
+{47,80,114,135,147,165}
+{24,98,119,123}
+{43,48,60,147,154}
+{19,54,138,171,186}
+{156,175}
+{20,51,123,193,193}
+{37,41,136,173,192}
+{14,22,111,125}
+{44,125,160,184}
+{19,75,99,103,107,164}
+{24,113,145}
+{27,157}
+{12,107,133,134}
+{72,94,102,158,194}
+{104,157}
+{122,171}
+{28,47,89,104,112}
+{25,35,82,105,155}
+{106,107,139,181}
+{50,110,132,136}
+{90,110,166}
+{1,1,55,60,85,108}
+{8,22,31,106,172,196}
+{24,69,109,121,154}
+{0,26,44,59,132,175}
+{103,125,172,188,190}
+{11,23,78,109,131}
+{81,146,169,181,196}
+{2,84,113,189}
+{8,46,126,131}
+{13,73,73,125,127}
+{67,117,139,184}
+{29,65,77,120,182}
+{0,87,100,102,135}
+{111,146,156}
+{13,87,123,137,182,197}
+{60,61,164}
+{7,20,186}
+{0,24,53,135,147}
+{94,136}
+{47,168}
+{70,80}
+{43,148}
+{3,81,104,191}
+{104,171,189}
+{9,14,117,160,180}
+{67,158}
+{50,57,66,78,170,197}
+{31,60,73,101,193,197}
+{37,89,92,96,127}
+{29,179}
+{17,47,137,155,157,187}
+{33,77,154}
+{48,63,85,150,184}
+{32,53,61,95,172}
+{20,35,47,171,179,196}
+{2,17,40,169,184}
+{116,127,131,142}
+{16,26,27,87,164,198}
+{58,129}
+{67,98,108,132,157,197}
+{145,157}
+{13,49,56}
+{59,103,180,196}
+{35,65,104,106,120,126}
+{18,96,115,133}
+{27,61}
+{61,194,197}
+{11,27,36,94}
+{15,36,101,128,197}
+{51,62,115,149}
+{83,198}
+{30,120,127,145,184}
+{50,149}
+{13,35,87,117,135,158}
+{57,60,74,113,128,178}
+{11,90,123,163,170}
+{39,121,148,171,198,199}
+{30,77,78,137,140,162}
+{52,69,120,141}
+{9,100,137}
+{56,161}
+{44,57,75,110,154}
+{98,123,155,167}
+{10,60,85,105,164,168}
+{13,92,179,186}
+{13,171,173,176,178}
+{33,53,88,123,144,172}
+{21,57,70,131,151}
+{13,51,63,169,169}
+{36,104,119,166}
+{54,59,84,166,172}
+{7,87,100,102,142,187}
+{2,5,6,43,174}
+{4,26,29,59,77}
+{10,82,98,103,104}
+{104,147}
+{47,55,99}
+{102,154,165}
+{0,96,107,139,157,159}
+{66,167,174}
+{92,97,117}
+{21,75,180,185}
+{54,64,139,180}
+{23,141,189}
+{32,38,147}
+{82,87}
+{6,34,34,161,183}
+{25,64,69,97,122}
+{80,152,170,189}
+{44,78,143,162}
+{52,53,64,69,112,158}
+{77,80,123,150,175}
+{110,121,125,125,128,198}
+{0,8,57,104,127,188}
+{17,46,48,93,129,150}
+{135,193}
+{89,111,135,166,184}
+{132,181}
+{47,54,101,108,125}
+{18,55,103,142}
+{11,125}
+{18,49,58,68,122,153}
+{37,47,137,179,185}
+{57,78,167,187,192}
+{28,32,38,67,77,184}
+{67,83}
+{43,104,191}
+{22,40,118,194}
+{24,53,66,195}
+{27,87,89,101,130,191}
+{71,86,157,167,183}
+{31,87,102}
+{48,53,70,101,149,174}
+{21,33,59,129,195}
+{144,160}
+{4,8,174,194}
+{69,103,127,127,160}
+{6,29,62,77,132}
+{61,69,108,144,174}
+{51,55,109,128,153}
+{10,30}
+{2,5,6,70,146,183}
+{0,1,75,97,166,180}
+{53,78,104}
+{31,45,68,108,161}
+{3,40,78,103,109,130}
+{33,44,159}
+{28,82,93,136,148,157}
+{31,32,76,143,157}
+{2,55,106}
+{21,66,80,129,129,152}
+{1,34,59,128,154,195}
+{10,154,172,177}
+{2,7,31,47,82,125}
+{60,131,149,156}
+{20,141}
+{23,38,43,100}
+{51,70}
+{3,41,164}
+{126,160,165,169}
+{61,71,143}
+{65,70,81,100,146}
+{40,48,57,75,85,85}
+{116,153}
+{31,42,49,103,183}
+{28,44,62,85,133,177}
+{50,68,164,170}
+{4,26,60,87,119,141}
+{5,102,160}
+{20,129,177}
+{98,120,135,157,164,168}
+{66,150}
+{101,101}
+{164,187}
+{43,65,96,166,189}
+{18,36,58,109,118}
+{25,32,135,161,170}
+{55,104,183}
+{69,139,144,181,182}
+{84,131,155}
+{6,18,63,156,159}
+{7,66,67,88}
+{8,46,52,95,178}
+{58,58,83,119,119,163}
+{27,143}
+{78,80,122,149,164,176}
+{6,83,107,183,198}
+{86,199}
+{22,74}
+{28,62,64,114}
+{15,56}
+{41,97,139,152,161,161}
+{48,192}
+{16,62,99,138,155}
+{32,84,145}
+{108,137}
+{93,112,120,155}
+{73,117}
+{20,26,197}
+{4,141}
+{110,132}
+{95,133,142,152,183,193}
+{85,141}
+{53,76,86,131}
+{5,59,73,74,101,130}
+{0,1,64,151,188}
+{15,131,131,174}
+{80,98,106,187}
+{41,102,167,173}
+{9,42,133}
+{103,110,110,134,175,185}
+{168,187}
+{42,47,108,121,165,198}
+{81,171}
+{38,122,123,149}
+{16,79}
+{45,64,131,176,182,197}
+{35,82,87,100,123,196}
+{41,52}
+{33,68}
+{60,140}
+{12,41,152}
+{54,71}
+{88,95,95,146,148,180}
+{47,66,89,121,168,182}
+{15,70,94,122,137,154}
+{42,48,129,162}
+{70,151}
+{11,55,89,118}
+{36,74,121,130,152}
+{46,48,52,120,179}
+{70,81}
+{96,146,183}
+{76,78,108,153}
+{71,168}
+{66,106,108,167}
+{22,44,49,85,87,195}
+{17,52,143,175}
+{86,103}
+{16,46,176}
+{95,111,162,173,198}
+{44,191}
+{7,48,107,115,116}
+{12,120,141,179,184}
+{83,188}
+{83,85,86,139,154}
+{50,74,89,154,179}
+{79,87,120,128,183}
+{13,121}
+{16,52,62,86,168,199}
+{7,16,29,35,157,181}
+{23,48,65,119,180}
+{10,173}
+{7,98,128,143,145,162}
+{23,27,88,91,127}
+{35,53,56,56,118}
+{7,161}
+{0,42,67,174}
+{44,161}
+{75,80,110,170}
+{17,93,117,140,168,196}
+{18,100,150,184}
+{108,132}
+{54,90,97,103,149}
+{9,12,30,43,82,95}
+{131,163}
+{67,99,168}
+{91,150,172}
+{47,164,195}
+{72,90,98}
+{24,78,130,172}
+{1,27,32,64,66,156}
+{7,26,72,88,130,140}
+{56,126,130}
+{1,76,81,122,169,188}
+{60,154}
+{101,103,135,150}
+{22,25,33}
+{99,117}
+{24,95,122,186}
+{48,95,102,108,125,170}
+{13,113,154}
+{155,177}
+{37,73,106}
+{7,64,124,195}
+{101,124,133,157,166,188}
+{27,34,60,100}
+{26,104,163}
+{34,43,108,133,165}
+{64,79,89,122,132}
+{10,96,168}
+{2,22,89,118,122,198}
+{122,192}
+{42,101,104,135,168,181}
+{7,38,63,86,101,152}
+{29,84,89,114,123,184}
+{33,46,59,137,153,175}
+{3,54,66,92}
+{31,34,148,159,185}
+{3,52,97,99}
+{3,26}
+{42,57,62,148,199}
+{15,26,198}
+{14,34,109,111,128,193}
+{107,197}
+{16,107}
+{9,21,136,169}
+{67,97,99,153,165,173}
+{46,76,89,100,164}
+{96,102,150,167,180}
+{31,103,137,146,180}
+{21,40,157,163,170,183}
+{139,170}
+{1,75,82,148,169,198}
+{13,39,107}
+{13,50,97,101,106}
+{52,176}
+{18,169}
+{129,140,146,183,189}
+{95,122,145}
+{5,6,102,130,151}
+{5,118,140,153}
+{27,78,140,164,182}
+{36,140,148}
+{58,100,127}
+{9,16}
+{26,33,119}
+{1,17,18,165}
+{14,182}
+{11,13,48,89,140,165}
+{9,19,78,113}
+{121,171}
+{18,23,46,113,159,162}
+{17,104}
+{50,104,132,167,179}
+{55,89,102,132,176}
+{19,109}
+{60,70,73,153,163}
+{18,127,145}
+{80,106,146,170}
+{10,39,72,74,84,150}
+{3,71}
+{1,10,64}
+{82,95,127,132,141,152}
+{43,55,57,89,120,197}
+{155,182}
+{23,34,57,111,153}
+{99,188}
+{86,114,124}
+{113,191}
+{31,129,184}
+{125,159,159}
+{22,27,81,156}
+{3,54,80,122,128,168}
+{76,112}
+{152,174}
+{22,27,70,172}
+{26,86}
+{49,59,102,186}
+{53,55,75,125}
+{152,199}
+{11,15,46,102,105,168}
+{132,148,154}
+{24,114,121,126,138,165}
+{82,107}
+{36,93,122,184,194}
+{1,59,76,146}
+{73,165}
+{38,98,176}
+{53,72,121,153}
+{127,147}
+{31,77,128,177}
+{107,186,189}
+{119,126,127,160}
+{24,74,148,197}
+{85,126,134,146}
+{76,77,81,134}
+{67,112,159,174,183}
+{22,169,170}
+{79,112,177,199}
+{1,56}
+{21,42,50,172}
+{6,63,105,166,189}
+{31,95,106,152,171,177}
+{21,49,99,101,122,187}
+{63,104,113,161,186}
+{37,126,144,166,173}
+{32,53,147}
+{123,123,130}
+{78,85,177}
+{2,69,95,146,187}
+{6,11,14,43,121}
+{76,105,184}
+{63,96,114,122,195}
+{11,22,34,45,120,156}
+{22,83,119,131,138,167}
+{9,56,96,106,114}
+{92,132,162}
+{25,45,83,119,139,150}
+{19,21,56,59,141}
+{14,26,62,119,180,190}
+{6,34,49,99,139,170}
+{10,56,150,166,166}
+{14,57,119,153,167,198}
+{26,41,150,158,169}
+{152,167}
+{1,61,93,180}
+{46,110,138,199}
+{4,56,81,110,173}
+{28,32,148,185}
+{8,9,28,29,39,195}
+{14,39,68,144}
+{26,37,79,81,110}
+{115,158,161}
+{6,39,145,191}
+{67,118,125,142,184,198}
+{127,163}
+{52,118}
+{22,78,131,156}
+{46,68,86,142,145,197}
+{85,188}
+{37,54,64,147,158}
+{31,134,141,183,185}
+{10,33,135,198}
+{41,124,173,180}
+{0,14,92,129,154,198}
+{39,73,128,154,182,196}
+{40,83,94,168}
+{106,142}
+{76,99}
+{19,62,77,108,165,186}
+{68,90,97,119,176}
+{44,108,193}
+{2,124}
+{137,174,175,176,180}
+{28,62,81,132,165,186}
+{98,112,148,181}
+{86,125}
+{70,161}
+{5,13,188}
+{136,168}
+{82,87}
+{30,42,57}
+{132,136,152}
+{20,59,87,98,195}
+{6,53,112,113,183,195}
+{64,147,157}
+{61,140,192}
+{44,59,88,123,161}
+{90,175}
+{38,46,105,121,159}
+{35,62,66,90,155}
+{2,2,21,38}
+{123,144}
+{117,155}
+{60,86}
+{4,39,129,146,179}
+{66,71,87,135,148,157}
+{29,67,108,196}
+{30,64,76,124,172}
+{36,39,79,130,140,149}
+{30,44,136,196}
+{5,15,20,117,198}
+{20,87,87,121}
+{42,136,142,148}
+{0,56}
+{16,38,56,57}
+{52,138}
+{103,115}
+{10,29,43,93,120,134}
+{44,140,150,180}
+{74,98,132,160}
+{2,62,98,160}
+{14,32,43,63,92}
+{23,87,128,152,177,197}
+{30,86,111,178,180}
+{49,61,114,195,196}
+{133,158,195}
+{18,105,165,190}
+{77,83,175}
+{29,33,51,166,188}
+{37,51,96,103,127}
+{119,125,128,140}
+{8,80,93,189}
+{76,96,110,131,170}
+{81,90}
+{13,25,28,41,128,142}
+{56,62,73,110}
+{60,62,128,136,166,193}
+{34,34,61,74}
+{32,84,87,92,112,181}
+{10,66,93,153}
+{23,77,182}
+{2,7,156}
+{5,13,49,61,103,179}
+{67,136,136,163,181,196}
+{26,60,74,100,160}
+{39,59,69,93,111}
+{9,77,90}
+{1,20,52,75,156,169}
+{25,95,103,157,163,193}
+{95,136}
+{47,108,137,157,164}
+{37,99,151,153,169,189}
+{112,126,139,171,184,195}
+{39,188}
+{4,20,71,80,136,156}
+{24,33,77,82}
+{103,188}
+{74,116}
+{82,90,110,154,194,195}
+{25,149,180}
+{120,123,130,171}
+{20,38,104,126,175,176}
+{14,62,97,130,135,193}
+{35,118}
+{20,42,64,73,76,120}
+{11,40,60,74,144,148}
+{13,26,46,63,76}
+{24,29,98,106}
+{6,139,171,186}
+{5,109,197}
+{20,45,84,125}
+{1,137,150,195}
+{1,8,80,111}
+{57,90,102,167}
+{53,186}
+{8,31,115,145,156,165}
+{10,18,31,116,164}
+{43,47}
+{33,143,154}
+{106,153,174,190}
+{73,106,158}
+{18,137,158,173}
+{73,80,107,123,141,199}
+{17,43,123,130,130,155}
+{15,31,37,91,164,181}
+{38,86}
+{49,105,142,145,173,190}
+{18,107,108,135,138}
+{43,65,107,112,193}
+{8,68,68,74}
+{54,106,108,109,164}
+{53,153}
+{59,134,154,173,180}
+{34,93}
+{11,33,124}
+{8,104}
+{27,37,46,65,125,174}
+{0,122,189}
+{15,74,107,147,188}
+{35,63,78}
+{28,49,123,129,177,193}
+{11,89,104}
+{117,171,197}
+{11,15,62,136,145,145}
+{2,127,193}
+{17,28,42,113,145}
+{31,44,118,148}
+{52,103,128,161,182}
+{45,47,70,102,161,184}
+{15,52,82,86}
+{60,87,102,108,127,170}
+{24,57,102,145,181}
+{12,53}
+{5,52,92,129,164}
+{87,128}
+{80,143,170}
+{59,85,134,139}
+{61,67,110,117,156,157}
+{6,8,60,112,154,170}
+{92,122,133}
+{121,148,161}
+{9,22,61,187}
+{12,40,78,107,176}
+{30,45,58,189,198}
+{83,107,123,148}
+{3,66,98,124,126,150}
+{13,34}
+{16,41,132}
+{16,85}
+{3,25}
+{30,58,138,167}
+{24,36,87,151,159,186}
+{2,4,121,196}
+{79,95,99,107}
+{11,49,146,169}
+{51,90}
+{76,155}
+{26,26,116,120,146,182}
+{44,66,72,117,132,174}
+{7,161,179,197}
+{2,81,158}
+{4,22,59,107,146,170}
+{0,0,133,192}
+{57,82}
+{17,61}
+{28,29,42,77,89,124}
+{53,78,127,188}
+{31,57,103,104,162}
+{9,84,100}
+{3,52,114,133,161,188}
+{8,37,97,158,189}
+{0,13,88}
+{29,79,92,158,160,171}
+{59,63,77,139,165}
+{25,77,116,169}
+{50,88,151,166}
+{52,162,167}
+{32,149,191,194,194}
+{47,57,74,95,97}
+{30,65,96,153,184}
+{80,130,150,172}
+{79,91,141,153,157}
+{93,110,114,194}
+{62,66,156,175}
+{55,56,97,117}
+{74,152,171,186}
+{13,24,50,50,131}
+{0,16,95,141,146,161}
+{1,51,158}
+{37,71,96,122}
+{71,104,145}
+{47,52,124,131,169}
+{111,188}
+{59,61,95,152,156,157}
+{5,31,106,164,176}
+{44,82,113,134,188}
+{13,55,65,99,150}
+{25,73,130,192}
+{88,120,193}
+{79,123,153,175}
+{24,158,162}
+{52,53,81}
+{5,32,78,102}
+{73,97,111,151}
+{71,72,102,151}
+{5,61,73,85,129,151}
+{66,177}
+{26,77,139,152}
+{46,117}
+{55,72,122,148,157,174}
+{3,53,76,184,196}
+{34,36,41,61,194}
+{8,153,163,182}
+{51,59}
+{113,115,149}
+{54,57,78}
+{39,137}
+{75,81,93}
+{5,30,44,80,86,126}
+{68,107,128,160,179}
+{98,108,162}
+{55,126}
+{24,54,121,122}
+{75,90}
+{10,83,139}
+{16,120,148}
+{97,175}
+{53,70,71,120,135,189}
+{9,110,123,150}
+{24,42,44,96,138,170}
+{17,61}
+{23,65,110,135,155,157}
+{19,59,139}
+{50,65,127,179}
+{15,138,152,162}
+{15,34}
+{25,29,63,135,161}
+{47,113,123,129,163}
+{25,138,157,184}
+{50,92,199}
+{110,116}
+{15,36,134,145,165,182}
+{4,75,82,175}
+{24,49,63,89,128}
+{174,182}
+{103,116,119}
+{101,125,180,192}
+{47,66,113,127,148}
+{15,60,118}
+{20,51,90,91,117}
+{25,72,146,199}
+{34,93,199}
+{31,71,106,115,186}
+{1,10,119,144,188,197}
+{49,80,185}
+{134,178,188}
+{42,67,170,172}
+{13,43,91,91}
+{13,31,48,98,155,158}
+{37,44,70,76,141,160}
+{50,60,72}
+{51,65,166,188}
+{11,103,129,144}
+{136,167,181}
+{165,178}
+{34,107}
+{54,120}
+{33,132,136,165,178}
+{60,79,119,127,187,197}
+{27,31,130,132}
+{125,129}
+{97,111}
+{71,171,187,191}
+{68,91,94}
+{94,119,159,178}
+{2,29,51,173}
+{37,61,97,113,147}
+{11,35,79,91}
+{67,71}
+{4,20,103,107,169,179}
+{35,77}
+{71,94}
+{29,31,67,101,172,174}
+{52,122}
+{87,125}
+{129,142,164}
+{13,30,85,139}
+{17,57,65,170,179}
+{46,65,151,167,192,197}
+{31,78,132,136,158}
+{38,161}
+{15,101,111,134}
+{42,118,139,142,178}
+{57,95,132,134}
+{5,42,116,152,173,192}
+{144,199}
+{38,70,77,143,175,188}
+{38,84,93,149}
+{56,98,153,165,170,191}
+{1,52,112,112,131,145}
+{16,132,150,184}
+{14,60,111,153}
+{49,109,112,165}
+{69,136,152}
+{59,90,94,158,168}
+{42,47}
+{18,194}
+{33,70,94,167,175,177}
+{40,57,125,138,159}
+{3,10,31}
+{2,5,8,26,141,181}
+{27,29,142,175,186,195}
+{31,49,99,120}
+{109,123}
+{21,76,112,119,124}
+{41,49,146,173}
+{101,173}
+{49,73,85,89,179}
+{22,36,154,192}
+{136,163}
+{111,165}
+{94,128}
+{81,167}
+{35,165}
+{41,109,119}
+{13,74,80,114}
+{72,106,189}
+{65,172}
+{30,31,35,52,63}
+{80,116}
+{0,149}
+{139,189}
+{0,65,107,153,179}
+{15,40,46,51,75,160}
+{12,28,48,79,105}
+{76,98,146,157,180}
+{45,62,79,83,113,155}
+{130,162,184}
+{78,140,145,181,196,198}
+{108,168}
+{3,13,14,15,77}
+{22,29,68,117,142,143}
+{67,110,122,167,183}
+{22,25,58,93,143,151}
+{53,82,170}
+{1,18,50,98,108,174}
+{58,140}
+{49,179,196}
+{109,171}
+{38,82,132,183}
+{32,151,175}
+{53,90,106,169,187}
+{99,136,141,146,171}
+{27,108,111,155,192}
+{28,77,86}
+{11,109,118,149,154,183}
+{7,74,122,137,185}
+{70,110,151,154,175}
+{7,48,88,181,181,182}
+{97,101,105,123,139,156}
+{19,139}
+{17,107,134}
+{63,64,178}
+{100,133,143}
+{64,173}
+{1,88,109,120,145,160}
+{113,198}
+{84,112,121,184}
+{90,185,193}
+{91,135,155,185}
+{56,191}
+{14,15,48,61,92,171}
+{18,139,152,199}
+{16,80,107,125,144,166}
+{8,92,112,173,176}
+{27,196}
+{9,169,183,190}
+{20,29,40,98,106,182}
+{77,115,149,181}
+{31,65}
+{7,29,62,90,157,178}
+{10,33,79,186}
+{42,74,113,178,192}
+{17,86,88,118}
+{27,58,104,122,166}
+{16,97,102,105,192}
+{16,59,115,127}
+{27,56,60}
+{104,175}
+{52,84}
+{127,137}
+{7,13,18,81,139,140}
+{11,31,81,150,189}
+{44,55,107}
+{45,58,127,137}
+{70,76,80,93,145}
+{27,60}
+{40,76,172}
+{7,123,192}
+{55,170}
+{61,137,137,184,187}
+{49,50,190}
+{99,126,152,164}
+{56,79,88,98,132}
+{45,74,119,123,158,175}
+{66,96}
+{100,114}
+{62,84,111,122}
+{8,22,141,172,181}
+{70,141}
+{3,48,106,193}
+{33,114,168,174,183}
+{46,186,194}
+{58,71,82,122,190}
+{60,67}
+{14,30,132,144,174}
+{9,113,124}
+{11,14,29,63,110,182}
+{4,64,102,168,178}
+{90,108,110,160,165,199}
+{44,86,191}
+{6,19,84,125,125,156}
+{53,105,122,154,175,190}
+{83,177,183}
+{96,103,181}
+{38,156}
+{2,6,60,116,131}
+{12,144}
+{13,73,93,132}
+{142,167}
+{37,61,71,75,121,144}
+{32,43,146}
+{41,59,144,176}
+{11,14,44,54,92,177}
+{37,198}
+{39,80,81,104,138,193}
+{13,73,92,127,149,194}
+{34,57,69,104,118,186}
+{7,48,84,96,108}
+{32,41,64,111}
+{108,131,150,174,195}
+{50,53,184,191}
+{8,32}
+{26,76,88}
+{4,50,100,134,134}
+{36,40,148,158,177}
+{7,16,57,59}
+{35,96,113,129,167}
+{46,63,128,163}
+{8,46,94,97,105,178}
+{12,70}
+{45,93,134,135,188,195}
+{11,52,76,103,131,192}
+{19,45,57,119,123,136}
+{19,62}
+{1,49,64,197}
+{0,42,60,102,134,147}
+{102,152,156,160}
+{51,54,129}
+{50,68,71,72,170}
+{0,11,184}
+{19,105}
+{144,185,191}
+{17,51,76,98,118,135}
+{52,64,143,171}
+{1,46,62,74,81}
+{8,36,129}
+{5,25,96,113,146,152}
+{19,28,59,110,131,142}
+{7,18,176,179}
+{17,21,48,63,121}
+{34,79,81,85,152,155}
+{8,82,104,122,139,193}
+{34,50,128,140,175}
+{51,173}
+{48,128,138}
+{126,129,178}
+{42,51,61,141,170,180}
+{59,91,144}
+{64,74,118,170,191}
+{12,55,116,157,159}
+{97,157}
+{32,34,102,105,178}
+{36,103,125}
+{15,36,184}
+{6,13}
+{0,100,144,185,198}
+{32,47,64,66,118,143}
+{23,112,117}
+{34,44,47,81,124,135}
+{21,49,115}
+{29,158}
+{34,114,127,151}
+{111,199}
+{23,53,76,113,122,123}
+{89,113,117,137}
+{52,76,126,155,164}
+{4,48,78,114,147,179}
+{27,56,151,191}
+{3,183}
+{30,41,72,145}
+{15,41,152,177,196}
+{44,58,124,164,177}
+{9,51,70,174}
+{13,18,81,136,178}
+{85,139,142}
+{12,62,118,156}
+{50,142,149,175}
+{35,38,99,100,128}
+{53,54,92,123,153,160}
+{121,133}
+{12,63,117,148,149,187}
+{88,153,170,192,195}
+{22,51,67,104,141}
+{186,198}
+{39,40,82,159,189}
+{59,74,149}
+{88,99,136,145,191}
+{5,48,90,120,138,193}
+{22,76,155,180}
+{118,122,141,176}
+{87,104,116,159,172,191}
+{63,104,155}
+{8,153,168}
+{119,141,178,179}
+{100,110}
+{14,65,164}
+{2,92,97,117,188}
+{47,59,64,141,148,187}
+{109,137,139,151,169}
+{68,78,156}
+{37,39,103,183,190,194}
+{50,58,74,180}
+{12,121,155,175}
+{26,43,97}
+{102,159,161}
+{3,138,163,179}
+{55,69,78,164}
+{67,87,136}
+{67,150}
+{74,113,199}
+{103,126,187}
+{39,141,155}
+{6,19,25,75,157}
+{10,49,71,105,114,154}
+{3,24,35,54,88}
+{16,25,73,114,181,191}
+{2,2,63,154}
+{68,74,107,187,199}
+{13,235}
+{40,122,203,232,233,235}
+{115,152,193,202,242}
+{3,50,86,111,248}
+{25,66,181,188,279}
+{80,116}
+{38,83,106,119,134}
+{29,63,203}
+{7,27,186,200,201}
+{88,92,94,272,295}
+{35,68,136,158}
+{148,225,293}
+{1,87,195}
+{48,100,203}
+{0,35,61,91,280}
+{130,160,168,216}
+{4,104,148,164}
+{35,40,91,145,155,214}
+{46,107}
+{21,276}
+{42,143,150,238,291}
+{64,70,140,165,228,257}
+{0,148,197}
+{72,131,195,202,251,270}
+{99,195,224,264,292}
+{5,184,186,243}
+{93,132,137,148,228,251}
+{66,125,198,211,285}
+{29,79,180}
+{41,60,65,66,254}
+{4,69,79,207}
+{113,182,203,252,259,298}
+{10,20}
+{99,200,276}
+{109,262}
+{4,87,193,207,220,273}
+{30,183,215}
+{7,138,202,215,217}
+{25,79,194,203,260}
+{128,178}
+{62,152,211,279}
+{57,99,204,280}
+{41,59}
+{18,52,200}
+{81,132,190,275}
+{89,158}
+{32,72,122,228,245,249}
+{24,72,196,233,299}
+{0,5,46,122,213}
+{197,242}
+{43,105,241,272}
+{74,118,158,173,208,288}
+{145,149,197,238,252,297}
+{32,39,189}
+{98,240}
+{65,140,149,197,203,204}
+{103,225,266}
+{84,277,283}
+{35,246}
+{10,101,239}
+{40,75,192,253}
+{106,152,247,272,287}
+{50,293}
+{85,134}
+{59,204}
+{54,64,88,269,286}
+{4,92,111,121,154,182}
+{80,163,202,234,277,298}
+{129,147,158,196,283,290}
+{49,144,232,293}
+{20,29,226,244,274}
+{64,101,185,189,234,268}
+{23,157}
+{56,93,133}
+{9,57,241,289}
+{50,124,181,194,238}
+{11,38,67,69,213}
+{149,220}
+{168,189,267}
+{34,133,235,264,284}
+{81,239,241,260}
+{35,78,80,201,262,297}
+{0,196,285}
+{71,108,239,258,277,278}
+{4,94}
+{77,132,140,251}
+{11,78,132}
+{43,145,188}
+{97,144,148,161,254}
+{109,132}
+{48,83,189,242}
+{115,176,276}
+{162,210}
+{88,109,136,153,154,159}
+{265,280}
+{74,86,195}
+{17,112,188,213,231,266}
+{36,136,160,218,239}
+{179,273}
+{79,118,136,154,200,259}
+{161,212}
+{24,98,178}
+{161,187}
+{45,169,227,236}
+{218,253}
+{10,18,74,258}
+{70,199,210,213,285,291}
+{12,50,69,92,184,186}
+{130,131,163,295}
+{198,239,297}
+{49,86,125,176,234,282}
+{7,129,146,223,269}
+{144,173}
+{30,52,133,228}
+{21,88,176}
+{5,70,299}
+{37,69,285}
+{14,17,45,72,99,197}
+{125,196}
+{30,220}
+{55,103,127,251}
+{108,114,156,200,207,217}
+{7,195,250}
+{64,111,193,202,236}
+{92,115,232,233,240}
+{22,232,260}
+{18,44,191,253,294}
+{40,158}
+{86,92,103,154,207,294}
+{33,177,191,223,235}
+{65,116,158,253}
+{49,125,152,194}
+{100,149,191,266,288}
+{13,64,103,254,283}
+{42,75,80,103,155}
+{77,128,198,280}
+{118,218,287}
+{0,36,52,101,148}
+{1,64,181,201,221}
+{6,44,47,71,150,225}
+{13,85,88,167}
+{31,40,69,91,99,281}
+{60,115,157,224,252,273}
+{30,87,200,270,285}
+{171,293}
+{24,33}
+{59,69,74,118,190,216}
+{147,258,288}
+{62,73,219,232,266}
+{50,74,225,238,271}
+{6,88,115,185,205,262}
+{97,230}
+{76,76,150,211,228,262}
+{134,195}
+{104,235}
+{38,41,204}
+{64,71,124}
+{44,63,111,231}
+{186,188}
+{5,132,225}
+{113,286}
+{43,161,276}
+{8,294}
+{18,90,105,169}
+{213,213}
+{29,45,161,289}
+{79,152}
+{10,110,162,177,217,238}
+{63,98,192,244}
+{118,147,187,281}
+{5,15,36,94,263}
+{40,81,220}
+{29,74,76,157,162,206}
+{11,28,53,68,126,222}
+{73,73,181,239}
+{36,60,164}
+{16,47,82,152,167,289}
+{149,149,219,268,294}
+{97,169}
+{32,160,210,257}
+{32,69}
+{7,63,73,195}
+{54,110}
+{61,75,135,270}
+{22,43,127,174,184,208}
+{106,113,174}
+{0,70,90,239}
+{191,260}
+{43,80,168}
+{25,54,257,263}
+{118,213}
+{110,207,220,251,287}
+{126,139,161,248,252}
+{51,79,116,132,190,291}
+{183,199,200,254}
+{86,233}
+{105,109,176,211}
+{12,109}
+{3,65,158}
+{21,86}
+{12,15,191}
+{181,223,224,256,259,276}
+{112,191,219,232,239}
+{51,215}
+{36,46,278}
+{68,75,169,228,244,270}
+{10,16,52,172,189,274}
+{177,191,197,209,222,282}
+{41,119,190,202}
+{128,277,292,298}
+{34,38}
+{22,36,81,117}
+{81,161,248,279}
+{75,85,103,149,190,211}
+{127,279}
+{50,74,152}
+{122,168,209,240,276,282}
+{66,102,208,239,291}
+{9,113}
+{72,199,237}
+{110,112,135,141,270}
+{26,109,130,159,291}
+{108,206}
+{2,289}
+{63,238}
+{4,57,104,119,142,214}
+{46,97,239}
+{210,297}
+{207,268}
+{13,64,80}
+{62,109,171,195,232}
+{11,260,262,276,292}
+{21,75,78,80,140,226}
+{38,56}
+{122,251,297}
+{108,180,213}
+{57,58,135,231,233}
+{75,136,185,211}
+{52,109,122,174,178,255}
+{65,91,234,249}
+{5,24,53,218}
+{90,211,246}
+{106,242,260}
+{61,136}
+{49,87,177,280}
+{38,89,104,189,297}
+{43,76,293,298}
+{182,255,289}
+{25,57,64,272}
+{23,122,149}
+{49,50,129,153}
+{183,188,204}
+{27,164,226,230}
+{0,13,67,145,160,259}
+{22,32,43,85,105,124}
+{20,199}
+{31,119}
+{14,16,152,158,196}
+{5,59,91,202,217,280}
+{100,128,187}
+{20,193,214,258,272}
+{17,27,55,151,177,219}
+{53,55,63,208,213,230}
+{15,160,258,260}
+{71,147,235,258}
+{26,49,173,234,271}
+{50,52,58,167,257}
+{15,154,213,232}
+{6,35,86,94,286}
+{0,4,83,262,281}
+{93,148,284}
+{28,165,262,290}
+{18,99,160,266}
+{63,223,291,295}
+{103,154,180}
+{12,110,144,221}
+{9,158,203}
+{20,207,275}
+{9,20,48,88,120,289}
+{67,110,133,151,225,297}
+{71,102}
+{168,208}
+{48,137,163,164,280,287}
+{90,209}
+{28,244}
+{107,224,293}
+{86,206}
+{8,113,147,165,285,286}
+{7,159,160,237}
+{0,66,87,146,225,294}
+{58,100,112,124,189}
+{13,108}
+{121,168,216,253}
+{147,242,282}
+{236,240}
+{21,28,83,103,166}
+{30,88,108,280,295}
+{23,136,298}
+{125,290}
+{140,249,276,277}
+{49,81,135,147,164,267}
+{28,63,198,297}
+{30,101,216,232,267,287}
+{54,195,204,223,236,251}
+{27,176,179,204,264,291}
+{136,164,172,273}
+{43,67,81,121,277}
+{128,131,256,269}
+{176,219,289}
+{127,175,259}
+{35,94,153,177,222,253}
+{29,154,178,240,260}
+{165,176,201,243,259}
+{17,298}
+{29,203,232,241,289}
+{107,136,153,238}
+{49,198}
+{68,179,202,253}
+{157,178}
+{23,199,287}
+{131,228}
+{19,19,39,111,138,277}
+{49,86,178,194,223,226}
+{114,201}
+{149,282}
+{109,147,150,176,209,229}
+{122,131,167,228,258}
+{5,40,120,154,266}
+{135,207,238,263}
+{75,128}
+{80,117,296}
+{60,82,122,131,138}
+{57,146,159,233,244,278}
+{15,80,157,182,244,272}
+{114,116,160,176,287}
+{10,133,279}
+{27,115,126,293}
+{89,161}
+{95,120,218}
+{26,269}
+{109,281}
+{53,62,103,107,118,239}
+{185,186,227,252}
+{3,125,146,161,288}
+{171,245,256,283}
+{23,153,201,238}
+{0,82,93,218,242}
+{101,124,137,150,194}
+{21,96,104,201,244,266}
+{88,121,147,155,173,225}
+{24,106,112,193}
+{26,67,115,212,283}
+{23,120,280}
+{45,99}
+{30,66,136,199}
+{17,213}
+{14,37,55,103,265}
+{52,258,284}
+{119,213,272,274,285}
+{43,45,105,254,288}
+{64,81,123,126,164,292}
+{88,229,260}
+{25,117}
+{7,149,197,227,258}
+{74,83,240,246,284,292}
+{2,4,63,103,115,289}
+{92,239}
+{12,26,130,228,265}
+{53,99,131,142,164,291}
+{63,248,259,283}
+{186,215,282}
+{67,110,160}
+{166,191}
+{33,156,224}
+{152,166,190,250,297}
+{123,126,153,199,204}
+{49,70,199,238,238,289}
+{14,18,65,74,146,235}
+{63,77,172,180,186,225}
+{1,48,105,170}
+{37,56,113,133,196}
+{193,261,266}
+{190,273}
+{38,129,261}
+{251,252,253,254,275,296}
+{249,275}
+{167,205,266}
+{27,152,256}
+{19,72,248}
+{40,73,141,249}
+{105,197}
+{156,243,277,282}
+{165,168,227,298}
+{8,31,202,271}
+{10,101,109,167,236,277}
+{33,91,165,192,206,211}
+{102,122,232}
+{190,239,283}
+{160,185}
+{2,13,65,70}
+{11,68,170,192,229,284}
+{66,90,228,237}
+{1,6,92,99,222,242}
+{42,128,133,207,289}
+{12,100,164,191}
+{26,31,120,176,204,220}
+{13,39,95,105,120,182}
+{114,120,295}
+{31,34,55,181,197,235}
+{24,52,64,80,142}
+{3,49,148,255,268}
+{132,175,254}
+{32,71,141}
+{112,116,186,270,271}
+{64,106,209,228,297}
+{128,268}
+{107,208,299}
+{151,173,187,192,213}
+{3,296}
+{20,31,135,153,289}
+{138,193,212,269,277,288}
+{73,92,130,295}
+{73,80,105}
+{50,96,138,199,265}
+{4,7,8,183,260,267}
+{66,71,118,145}
+{15,63,116,160,175,181}
+{88,217}
+{56,69,106,106,127,274}
+{84,205}
+{83,101,241,269}
+{21,254}
+{22,32,83,150,293}
+{198,221}
+{30,46,95,179,197}
+{46,85,208}
+{56,112,236}
+{71,217}
+{31,57,145,253}
+{34,133,170}
+{48,53,119,187,268,287}
+{111,203,229,239}
+{62,136}
+{49,54,187,254,298}
+{20,26,148,159,190,286}
+{3,13,193,252,284}
+{40,137,154,167,248,259}
+{3,47,242,278}
+{77,100,143,232}
+{51,130}
+{66,90,148,220,242,273}
+{143,151,211}
+{10,23}
+{21,30,179}
+{17,47,105,156,193,213}
+{0,23,25,125,144,146}
+{179,209}
+{79,113,117,192}
+{5,53,216,275,285}
+{187,197}
+{22,68,218,221}
+{0,71,78,110,120,173}
+{46,97,117,149,253,286}
+{10,20,129,162,171,195}
+{60,97,130,163,190}
+{57,145,179,283}
+{99,274}
+{151,161,228,251}
+{3,177,192,286}
+{21,81,142}
+{180,283}
+{13,102,131,149,246}
+{19,99,132,162,167,257}
+{15,86,188,260}
+{203,251,281}
+{5,45,138,155,157}
+{1,2,4,213,278}
+{21,123,208,219,263,267}
+{36,106,181,231,238}
+{103,120,168,184,224,287}
+{53,104,139,251}
+{1,91,141,202,268}
+{75,115,216,253}
+{56,167,268,296}
+{66,158,235,249}
+{82,124,198}
+{56,67,112,140,170,176}
+{16,75,266}
+{38,165,200,219,291,297}
+{86,151,229,241,275}
+{0,57,141,176,229,258}
+{18,72,164,195,235}
+{94,282}
+{83,139,242,269,294}
+{9,44,145,251,272}
+{132,203,249,282}
+{7,41,170,254}
+{6,153,193,291}
+{18,134,137,227,261}
+{14,36,115,124,172,229}
+{54,206}
+{49,91,131,185,204}
+{7,242}
+{41,57,161}
+{93,224,241,288}
+{119,288}
+{90,99,117,196,296}
+{67,85,154}
+{147,169,216,264}
+{79,92,164}
+{19,120,132,197,267}
+{76,264}
+{30,133}
+{27,37,93,138,218}
+{152,155,244}
+{41,149,182,259}
+{29,178,224}
+{115,201,268}
+{141,166,253,282}
+{3,65,125,245,264}
+{6,150,159,202,206,277}
+{217,276}
+{28,96,144,193}
+{7,59,190}
+{144,217}
+{10,79,96,100,126,222}
+{7,61,253}
+{14,69,263}
+{3,30,63,125,186,277}
+{2,10,79,100,223}
+{131,131,239}
+{116,195,199,240}
+{87,99,158}
+{52,180}
+{7,12,140,208,275}
+{65,67,83,280}
+{4,52,125,126,137,176}
+{9,48,79,203,217,243}
+{43,206,251}
+{19,112,196,263,266}
+{29,70,256}
+{161,236,258}
+{8,25,42,97,291}
+{63,144,242,271}
+{7,17}
+{1,85,250}
+{104,244,250}
+{18,22,31,99,266,281}
+{51,138,237,268,288}
+{8,40,91,221,273}
+{0,176,230,249,254,255}
+{44,140,176,194,197}
+{56,197,264}
+{229,246,283}
+{53,128,173,233,282}
+{45,193,221}
+{21,80,286}
+{4,18,267}
+{15,97,220}
+{62,70,83,147,149,244}
+{120,134,159,174,250}
+{116,269}
+{23,108}
+{10,91,239}
+{7,128,142,243,286}
+{134,201,245,275,278}
+{13,208,227,288}
+{30,78,85}
+{107,179}
+{31,59,153,217,240,298}
+{27,130,233,282,286}
+{15,59,136,262}
+{85,186,233}
+{10,152,165,181,181}
+{137,183}
+{40,56,125,256,265,280}
+{12,22,120,183}
+{62,229}
+{38,59,81,113,261}
+{67,194,229}
+{7,173}
+{37,43,296}
+{59,162,285}
+{171,200,213,213}
+{116,123,209,234,277}
+{52,175}
+{189,213}
+{30,94,99,228,238}
+{46,101,154,260,272,274}
+{30,32,59}
+{65,172,292}
+{18,22,131,170,271}
+{2,53,88,104,264,265}
+{60,194,288}
+{15,108,121,161,201}
+{40,85,173,195,201,221}
+{54,86,107,174,287}
+{20,71,190,227}
+{16,46,66,175,197,252}
+{130,243,252,282}
+{142,219,266,272}
+{14,202,204,231,241,276}
+{161,172,212,222}
+{15,183,275}
+{83,270}
+{67,204}
+{65,184,264}
+{73,119,183,190,242}
+{53,287}
+{24,171}
+{72,220,220}
+{101,136,176,204,224,280}
+{39,47,282}
+{106,162,238,252}
+{23,242,247,265}
+{98,108,189,209,273}
+{122,245,270}
+{109,127,128,244,299}
+{41,162,186,191}
+{60,196}
+{0,123,129,213,248}
+{29,79,89,91}
+{172,298}
+{122,140,162,228,263,268}
+{2,116,247,294}
+{6,138}
+{17,98,287}
+{53,166,187,219,248,296}
+{15,26,90,175,196}
+{184,193,198}
+{17,69,76,105,183,264}
+{56,101,110}
+{15,108,139,168,272}
+{5,71,104,141}
+{136,179}
+{72,189}
+{54,79,208}
+{98,113,150,184,190,246}
+{37,69,132,210,285}
+{1,29,45,74,109,145}
+{11,72,133,149,216}
+{34,57,84,212,280}
+{131,211,294}
+{70,84,173}
+{193,213,230,266,285,299}
+{57,94,163,182,227}
+{44,133,143}
+{31,32,211}
+{130,142,165,188,194,231}
+{52,61,139,226,239,287}
+{7,103,157}
+{155,224,230}
+{127,135,139}
+{77,237,294}
+{10,213,278}
+{28,90,185,274}
+{59,105,282,297}
+{39,128,174,268}
+{32,158,215}
+{24,145,189,213,278}
+{78,148,230,263}
+{42,68,93,160,287,299}
+{4,12,70,91,191,237}
+{20,294}
+{45,53,77,113,211,240}
+{232,237}
+{125,152,284}
+{58,81,155,215,296}
+{4,8,44}
+{1,52,102,128,184,218}
+{185,199,226,299}
+{10,178,262,285}
+{80,95,230,240,266}
+{4,5,213}
+{156,187,271,298}
+{88,298}
+{109,233,290}
+{47,65,91,105,249,269}
+{97,129}
+{46,92,207}
+{2,163,249,259,291}
+{89,102,140,158,231}
+{162,184,283}
+{36,213}
+{163,259}
+{47,220,250}
+{37,89,105,124,143,198}
+{3,71}
+{142,165,190,256,269,269}
+{152,256}
+{27,49,191,198,220,285}
+{71,73,87,189,260}
+{11,54,90,106,130,216}
+{193,245,252}
+{2,8,57,91,163,184}
+{18,171,283}
+{28,41,110,112}
+{5,57}
+{137,262,285}
+{19,57,156,229,269}
+{138,179,190,199,281}
+{35,98,196,242}
+{122,152}
+{83,132,181,212,280,288}
+{219,298}
+{57,88,103}
+{5,203}
+{98,156,266}
+{10,45,72,169,211}
+{45,101,156,214,269}
+{68,73,81}
+{16,127,259}
+{9,32,246}
+{66,173,261,261,274}
+{17,115,157,169,251}
+{49,158}
+{25,37}
+{2,73,103,178,194,236}
+{238,269,273}
+{162,178,276}
+{48,52,160,237,288}
+{54,82,130,135,169,275}
+{29,142}
+{205,249,253,275,291}
+{60,76,84,115,126}
+{48,108,153,213,231}
+{23,124,175,210,226,293}
+{9,181}
+{20,99,112,166,201,242}
+{102,150,201}
+{41,98,240,244,260}
+{7,44,98,293}
+{0,125,177,283}
+{28,118,124,148,241,290}
+{73,91,122}
+{9,72,109,130,202,290}
+{70,111,120,160,216,262}
+{59,175,296}
+{2,201}
+{83,297}
+{76,293}
+{83,127,136,242,275,285}
+{169,190,195}
+{83,122,186,189,217,229}
+{98,210,229}
+{117,133}
+{74,294}
+{6,31,59,143,156,273}
+{98,180,241}
+{26,52,114,243}
+{112,240}
+{104,217}
+{148,162,259,279}
+{92,101,150,226,272,295}
+{55,86,118,202,237,275}
+{81,203}
+{79,126,177,265}
+{57,193}
+{169,240,244}
+{21,171,190,250,263}
+{23,37,215,235}
+{40,54,240,286}
+{105,177,190,276,285}
+{44,45,122,151}
+{28,31,187}
+{127,135,211}
+{5,13,150,194,259}
+{136,181,280}
+{20,147,158,189,200}
+{15,83,88,128,169}
+{10,14,25,26,150,158}
+{42,101,172,205}
+{85,185,226,236,271}
+{34,127,188,250,268}
+{27,143}
+{26,48,99,110,117,207}
+{22,56,190,269,287}
+{200,278}
+{70,134,138,204,216,298}
+{175,219,297}
+{99,273}
+{206,216}
+{23,214}
+{131,140}
+{11,140,240}
+{73,148}
+{7,66,125,210}
+{2,61,92}
+{0,137}
+{143,188,265}
+{177,238}
+{0,93,163,229}
+{35,49}
+{8,8,111,144,165}
+{99,278}
+{21,44,71,224,252,270}
+{119,150,175,233,245,294}
+{15,87}
+{84,211,217,225}
+{20,41,87,123,124,299}
+{62,120,169}
+{37,43,92,175,206,222}
+{95,168,180,250,269,296}
+{60,228,278,285}
+{173,195,232,276}
+{1,2,139,256,278}
+{51,119}
+{212,238,291}
+{120,172,292}
+{138,279}
+{251,261}
+{151,181,278,296}
+{163,207,220,289,295}
+{89,278,290}
+{24,137,157,206,271,278}
+{7,63,83,89,155,189}
+{2,5,172,195,215,260}
+{243,281}
+{60,125}
+{74,87,222,236}
+{45,70,159,194}
+{69,159,250}
+{150,214,296}
+{101,158,250}
+{56,134}
+{57,87,160,167,247,285}
+{123,269}
+{235,242}
+{79,95,115,167,287}
+{31,56,132,244,276}
+{25,218,241,241}
+{57,82,151,170,204}
+{69,103,288}
+{88,138,154,292}
+{14,98,138,227,245,249}
+{175,222,274}
+{38,139,193,208,277}
+{79,141}
+{5,77,197,209}
+{15,37,77,110,116}
+{26,226}
+{68,93,101,140,233}
+{53,96,170,192,290}
+{29,89,102,216,220}
+{11,85,136,239}
+{158,180,195,200,226}
+{10,49,118,137,172}
+{144,172,183}
+{14,176,188,215,272}
+{42,97,125}
+{114,166}
+{52,61,162,171,249}
+{140,195,242}
+{59,99,233}
+{31,76,136,181,187}
+{81,112,157,168,271,294}
+{8,35,44,48,190,297}
+{145,195,201}
+{160,248,291}
+{94,270,285}
+{116,139,225}
+{111,131,140}
+{158,277}
+{59,229,257}
+{25,47,99,123,239}
+{8,36,205,274,295}
+{132,152,178,192,235}
+{19,40,96,204}
+{7,77}
+{211,282}
+{26,100,180,244,281,296}
+{200,212,286}
+{5,94,151,290}
+{75,80,128,179,269,269}
+{7,111}
+{7,26,69,158,269,276}
+{7,36,74,94,171,215}
+{2,62,65,93,124,271}
+{78,96,109,189}
+{182,197,280,298}
+{17,78,82,85,85,208}
+{6,122,155}
+{14,33,130}
+{1,21,167,169}
+{49,85,158,175,213}
+{59,194}
+{125,132,259,285}
+{20,38,81,89,234,274}
+{106,140,156,287}
+{57,125}
+{53,103,158,204,234,267}
+{0,49,160,189,235}
+{34,115,142,207}
+{162,173,181,190,298}
+{11,76,116,166,191}
+{2,87,99,236,279}
+{40,203}
+{2,33,39,215,254}
+{53,69,83,224,228}
+{79,136,183,216,226,227}
+{10,109,137,163,240}
+{24,126,141}
+{69,255}
+{103,138,230,246,259,283}
+{136,290}
+{13,34,78,145,166,242}
+{38,74,83,242,294}
+{54,248,273}
+{107,162}
+{50,170,176,191,207,275}
+{32,134,166,288,292}
+{163,167,186,274,291,296}
+{31,86,123,156,160}
+{114,133,136,176,281,290}
+{105,147,211}
+{124,151,179,222,299}
+{87,101}
+{145,169,181,205,247}
+{6,266}
+{26,33,52,56,106,116}
+{19,21,65,89,104,168}
+{164,181,208}
+{36,67,92,116,248}
+{145,200,247}
+{155,215}
+{49,212}
+{29,57,105,117,131}
+{2,13,68,128,139,140}
+{193,273,273}
+{3,78,105,111,297}
+{49,142,244}
+{32,259}
+{161,205}
+{96,146,179,259}
+{44,45,211,233}
+{56,91,146,166,285}
+{87,107,120,262,299}
+{76,160,276,297}
+{248,266}
+{5,12,188,240,247}
+{164,206,293}
+{15,18,60,163}
+{53,134,172,230,287,290}
+{117,137,146,153,155}
+{72,270}
+{171,251}
+{80,125,137,141,169}
+{52,108,200,219,225,271}
+{29,78,106,221}
+{21,74,110,273}
+{28,88,98,170}
+{83,104}
+{12,152}
+{7,69,143,246,265,269}
+{62,106,157,200}
+{113,260,272,272,294}
+{16,35,80,121,165,176}
+{96,154,172,198,263}
+{29,53,109,128,129,195}
+{131,230,271,273,295,299}
+{53,160,208,231}
+{23,180,208,249,272}
+{45,208,264}
+{14,29,169}
+{116,147,272}
+{7,193,237,271}
+{158,198,253}
+{41,60,71}
+{110,133,200,249}
+{24,159,255}
+{26,39,61,114,218,229}
+{141,286,299}
+{74,278}
+{67,71,155}
+{151,257,284}
+{13,28,72,131,206}
+{60,152,275,295}
+{88,105,184,185}
+{85,190,205,256,283,285}
+{202,285}
+{14,92,160,200,246,279}
+{42,95,157,195}
+{50,99,224,276}
+{32,97,101,122}
+{66,85}
+{19,146,180,242,269,286}
+{24,86,247,274}
+{54,264,270,284}
+{72,77,85,124,127,285}
+{47,249}
+{25,73,102,237}
+{33,68,84,117,120}
+{29,62,172,240,242,273}
+{42,140,182,248,261,282}
+{118,228,284}
+{1,89,158,294}
+{29,89,122,155,208,283}
+{173,208,229}
+{6,22,142,267,299}
+{22,122,173,245,293}
diff --git a/contrib/pageinspect/expected/gin.out b/contrib/pageinspect/expected/gin.out
index 82f63b2..c4d0ef1 100644
--- a/contrib/pageinspect/expected/gin.out
+++ b/contrib/pageinspect/expected/gin.out
@@ -35,3 +35,320 @@ FROM gin_leafpage_items(get_raw_page('test1_y_idx',
-[ RECORD 1 ]
?column? | t
+\x
+CREATE TABLE test__int(a int[]);
+\copy test__int from 'data/test__int.data'
+CREATE INDEX gin_idx ON test__int USING gin ( a );
+INSERT INTO test__int ( SELECT ARRAY[t] || '{1000}'::_int4 FROM generate_series (1,300) as t );
+INSERT INTO test__int ( SELECT ARRAY[t] || '{1001}'::_int4 FROM generate_series (1,300) as t, generate_series(1,12) );
+VACUUM ANALYZE test__int;
+SELECT * FROM gin_value_count('gin_idx') as t(value int, nrow int);
+ value | nrow
+-------+------
+ 0 | 38
+ 1 | 257
+ 2 | 244
+ 3 | 222
+ 4 | 228
+ 5 | 227
+ 6 | 243
+ 7 | 238
+ 8 | 236
+ 9 | 224
+ 10 | 236
+ 11 | 248
+ 12 | 224
+ 13 | 235
+ 14 | 237
+ 15 | 253
+ 16 | 234
+ 17 | 245
+ 18 | 246
+ 19 | 234
+ 20 | 236
+ 21 | 213
+ 22 | 235
+ 23 | 222
+ 24 | 197
+ 25 | 253
+ 26 | 218
+ 27 | 239
+ 28 | 198
+ 29 | 244
+ 30 | 247
+ 31 | 267
+ 32 | 234
+ 33 | 209
+ 34 | 231
+ 35 | 218
+ 36 | 242
+ 37 | 232
+ 38 | 221
+ 39 | 232
+ 40 | 241
+ 41 | 239
+ 42 | 221
+ 43 | 211
+ 44 | 231
+ 45 | 213
+ 46 | 236
+ 47 | 264
+ 48 | 221
+ 49 | 235
+ 50 | 219
+ 51 | 250
+ 52 | 270
+ 53 | 222
+ 54 | 242
+ 55 | 237
+ 56 | 237
+ 57 | 251
+ 58 | 231
+ 59 | 272
+ 60 | 219
+ 61 | 233
+ 62 | 235
+ 63 | 260
+ 64 | 252
+ 65 | 221
+ 66 | 228
+ 67 | 253
+ 68 | 196
+ 69 | 232
+ 70 | 232
+ 71 | 223
+ 72 | 247
+ 73 | 214
+ 74 | 232
+ 75 | 229
+ 76 | 233
+ 77 | 221
+ 78 | 227
+ 79 | 233
+ 80 | 216
+ 81 | 244
+ 82 | 223
+ 83 | 254
+ 84 | 227
+ 85 | 247
+ 86 | 255
+ 87 | 239
+ 88 | 258
+ 89 | 249
+ 90 | 244
+ 91 | 226
+ 92 | 225
+ 93 | 230
+ 94 | 218
+ 95 | 232
+ 96 | 239
+ 97 | 226
+ 98 | 209
+ 99 | 211
+ 100 | 216
+ 101 | 49
+ 102 | 47
+ 103 | 59
+ 104 | 55
+ 105 | 48
+ 106 | 49
+ 107 | 49
+ 108 | 51
+ 109 | 47
+ 110 | 51
+ 111 | 45
+ 112 | 46
+ 113 | 48
+ 114 | 38
+ 115 | 39
+ 116 | 43
+ 117 | 44
+ 118 | 46
+ 119 | 45
+ 120 | 52
+ 121 | 41
+ 122 | 64
+ 123 | 50
+ 124 | 41
+ 125 | 55
+ 126 | 41
+ 127 | 50
+ 128 | 54
+ 129 | 43
+ 130 | 44
+ 131 | 50
+ 132 | 57
+ 133 | 40
+ 134 | 41
+ 135 | 44
+ 136 | 58
+ 137 | 48
+ 138 | 44
+ 139 | 50
+ 140 | 49
+ 141 | 48
+ 142 | 43
+ 143 | 36
+ 144 | 43
+ 145 | 49
+ 146 | 46
+ 147 | 40
+ 148 | 52
+ 149 | 46
+ 150 | 49
+ 151 | 42
+ 152 | 58
+ 153 | 49
+ 154 | 51
+ 155 | 49
+ 156 | 45
+ 157 | 53
+ 158 | 59
+ 159 | 38
+ 160 | 53
+ 161 | 48
+ 162 | 41
+ 163 | 40
+ 164 | 52
+ 165 | 50
+ 166 | 40
+ 167 | 48
+ 168 | 45
+ 169 | 49
+ 170 | 50
+ 171 | 45
+ 172 | 46
+ 173 | 47
+ 174 | 41
+ 175 | 51
+ 176 | 50
+ 177 | 41
+ 178 | 42
+ 179 | 48
+ 180 | 47
+ 181 | 49
+ 182 | 40
+ 183 | 46
+ 184 | 52
+ 185 | 36
+ 186 | 45
+ 187 | 41
+ 188 | 47
+ 189 | 49
+ 190 | 46
+ 191 | 45
+ 192 | 39
+ 193 | 50
+ 194 | 39
+ 195 | 54
+ 196 | 43
+ 197 | 50
+ 198 | 46
+ 199 | 42
+ 200 | 31
+ 201 | 28
+ 202 | 28
+ 203 | 28
+ 204 | 30
+ 205 | 22
+ 206 | 25
+ 207 | 27
+ 208 | 32
+ 209 | 22
+ 210 | 21
+ 211 | 31
+ 212 | 22
+ 213 | 37
+ 214 | 19
+ 215 | 25
+ 216 | 27
+ 217 | 26
+ 218 | 24
+ 219 | 25
+ 220 | 26
+ 221 | 21
+ 222 | 23
+ 223 | 20
+ 224 | 26
+ 225 | 25
+ 226 | 25
+ 227 | 23
+ 228 | 30
+ 229 | 30
+ 230 | 24
+ 231 | 22
+ 232 | 27
+ 233 | 27
+ 234 | 21
+ 235 | 27
+ 236 | 24
+ 237 | 24
+ 238 | 29
+ 239 | 32
+ 240 | 31
+ 241 | 24
+ 242 | 36
+ 243 | 21
+ 244 | 29
+ 245 | 22
+ 246 | 23
+ 247 | 21
+ 248 | 26
+ 249 | 29
+ 250 | 24
+ 251 | 29
+ 252 | 25
+ 253 | 28
+ 254 | 25
+ 255 | 19
+ 256 | 23
+ 257 | 20
+ 258 | 24
+ 259 | 31
+ 260 | 29
+ 261 | 20
+ 262 | 25
+ 263 | 23
+ 264 | 25
+ 265 | 23
+ 266 | 31
+ 267 | 22
+ 268 | 26
+ 269 | 33
+ 270 | 25
+ 271 | 27
+ 272 | 29
+ 273 | 29
+ 274 | 26
+ 275 | 28
+ 276 | 30
+ 277 | 28
+ 278 | 29
+ 279 | 22
+ 280 | 29
+ 281 | 23
+ 282 | 30
+ 283 | 29
+ 284 | 23
+ 285 | 37
+ 286 | 27
+ 287 | 31
+ 288 | 28
+ 289 | 26
+ 290 | 25
+ 291 | 29
+ 292 | 22
+ 293 | 26
+ 294 | 29
+ 295 | 24
+ 296 | 27
+ 297 | 30
+ 298 | 29
+ 299 | 26
+ 300 | 13
+ 1000 | 300
+ 1001 | 3600
+ | 9
+ | 244
+(305 rows)
+
diff --git a/contrib/pageinspect/expected/gist.out b/contrib/pageinspect/expected/gist.out
new file mode 100644
index 0000000..46e55f4
--- /dev/null
+++ b/contrib/pageinspect/expected/gist.out
@@ -0,0 +1,18 @@
+CREATE TABLE gist_table (t box);
+\copy gist_table from 'data/rect.data'
+CREATE INDEX gist_idx ON gist_table USING gist (t);
+SELECT gist_stats('gist_idx');
+ gist_stats
+-----------------------------------------
+ Number of levels: 2 +
+ Number of pages: 29 +
+ Number of leaf pages: 28 +
+ Number of tuples: 3406 +
+ Number of invalid tuples: 0 +
+ Number of leaf tuples: 3378 +
+ Total size of tuples: 143516 bytes+
+ Total size of leaf tuples: 142296 bytes+
+ Total size of index: 237568 bytes+
+
+(1 row)
+
diff --git a/contrib/pageinspect/expected/spgist.out b/contrib/pageinspect/expected/spgist.out
new file mode 100644
index 0000000..5bab22e
--- /dev/null
+++ b/contrib/pageinspect/expected/spgist.out
@@ -0,0 +1,120 @@
+CREATE TABLE spgist_table (t box);
+\copy spgist_table from 'data/rect.data'
+SELECT center(t) AS p INTO spgist_table_p FROM spgist_table;
+CREATE INDEX spgist_idx ON spgist_table_p USING spgist (p);
+CREATE INDEX kdspgist_idx ON spgist_table_p USING spgist (p kd_point_ops);
+SELECT spgist_stats('spgist_idx');
+ spgist_stats
+----------------------------------
+ totalPages: 21 +
+ deletedPages: 0 +
+ innerPages: 2 +
+ leafPages: 19 +
+ emptyPages: 0 +
+ usedSpace: 126.70 kbytes+
+ usedInnerSpace: 1.17 kbytes +
+ usedLeafSpace: 125.53 kbytes+
+ freeSpace: 40.64 kbytes +
+ fillRatio: 75.71% +
+ leafTuples: 3947 +
+ innerTuples: 20 +
+ innerAllTheSame: 0 +
+ leafPlaceholders: 569 +
+ innerPlaceholders: 0 +
+ leafRedirects: 0 +
+ innerRedirects: 0
+(1 row)
+
+SELECT * FROM spgist_print('kdspgist_idx') as t(tid tid, allthesame bool, node_n int, level int, tid_pointer tid, prefix float8, node_label int, leaf_value point);
+ tid | allthesame | node_n | level | tid_pointer | prefix | node_label | leaf_value
+----------+------------+--------+-------+-------------+---------+------------+-------------------
+ (1,1) | f | 0 | 1 | (5,1) | 23030 | |
+ (1,1) | f | 1 | 1 | (5,2) | 23030 | |
+ (5,2) | f | 0 | 2 | (5,6) | 21664 | |
+ (5,2) | f | 1 | 2 | (5,3) | 21664 | |
+ (5,3) | f | 0 | 3 | (5,5) | 37159.5 | |
+ (5,3) | f | 1 | 3 | (5,12) | 37159.5 | |
+ (5,12) | f | 0 | 4 | (5,13) | 36357.5 | |
+ (5,12) | f | 1 | 4 | (14,226) | 36357.5 | |
+ (14,226) | | | 5 | | | | (43240,47256.5)
+ (5,13) | f | 0 | 5 | (3,112) | 43507 | |
+ (5,13) | f | 1 | 5 | (5,25) | 43507 | |
+ (5,25) | f | 0 | 6 | (22,116) | 28862 | |
+ (5,25) | f | 1 | 6 | (22,115) | 28862 | |
+ (22,115) | | | 7 | | | | (30902,44532)
+ (22,116) | | | 7 | | | | (23048,47416)
+ (3,112) | | | 6 | | | | (35218.5,42124)
+ (5,5) | f | 0 | 4 | (5,11) | 33416 | |
+ (5,5) | f | 1 | 4 | (5,22) | 33416 | |
+ (5,22) | f | 0 | 5 | (20,225) | 30991 | |
+ (5,22) | f | 1 | 5 | (5,23) | 30991 | |
+ (5,23) | f | 0 | 6 | (9,112) | 41820 | |
+ (5,23) | f | 1 | 6 | (9,114) | 41820 | |
+ (9,114) | | | 7 | | | | (44732,32182)
+ (9,112) | | | 7 | | | | (35580,33526.5)
+ (20,225) | | | 6 | | | | (47724.5,27185.5)
+ (5,11) | f | 0 | 5 | (13,101) | 29986.5 | |
+ (5,11) | f | 1 | 5 | (13,100) | 29986.5 | |
+ (13,100) | | | 6 | | | | (24069,30850.5)
+ (13,101) | | | 6 | | | | (29539,25566)
+ (5,6) | f | 0 | 3 | (5,7) | 36774 | |
+ (5,6) | f | 1 | 3 | (5,19) | 36774 | |
+ (5,19) | f | 0 | 4 | (5,20) | 10075.5 | |
+ (5,19) | f | 1 | 4 | (18,225) | 10075.5 | |
+ (18,225) | | | 5 | | | | (20920.5,49105.5)
+ (5,20) | f | 0 | 5 | (10,110) | 44171.5 | |
+ (5,20) | f | 1 | 5 | (10,113) | 44171.5 | |
+ (10,113) | | | 6 | | | | (93,46797)
+ (10,110) | | | 6 | | | | (28.5,38640.5)
+ (5,7) | f | 0 | 4 | (7,113) | 9517 | |
+ (5,7) | f | 1 | 4 | (5,21) | 9517 | |
+ (5,21) | f | 0 | 5 | (19,115) | 28907.5 | |
+ (5,21) | f | 1 | 5 | (19,112) | 28907.5 | |
+ (19,112) | | | 6 | | | | (11916.5,31668)
+ (19,115) | | | 6 | | | | (20622.5,27462.5)
+ (7,113) | | | 5 | | | | (9296,35157)
+ (5,1) | f | 0 | 2 | (5,8) | 26938 | |
+ (5,1) | f | 1 | 2 | (5,4) | 26938 | |
+ (5,4) | f | 0 | 3 | (5,10) | 9532 | |
+ (5,4) | f | 1 | 3 | (5,14) | 9532 | |
+ (5,14) | f | 0 | 4 | (5,15) | 38603 | |
+ (5,14) | f | 1 | 4 | (15,222) | 38603 | |
+ (15,222) | | | 5 | | | | (41926.5,17934.5)
+ (5,15) | f | 0 | 5 | (8,113) | 16345 | |
+ (5,15) | f | 1 | 5 | (8,112) | 16345 | |
+ (8,112) | | | 6 | | | | (32425,20702.5)
+ (8,113) | | | 6 | | | | (29134,15559.5)
+ (5,10) | f | 0 | 4 | (12,94) | 38800.5 | |
+ (5,10) | f | 1 | 4 | (5,24) | 38800.5 | |
+ (5,24) | f | 0 | 5 | (21,108) | 4752 | |
+ (5,24) | f | 1 | 5 | (21,107) | 4752 | |
+ (21,107) | | | 6 | | | | (49822.5,7097.5)
+ (21,108) | | | 6 | | | | (40315.5,1689.5)
+ (12,94) | | | 5 | | | | (30295.5,5090)
+ (5,8) | f | 0 | 3 | (5,17) | 11733.5 | |
+ (5,8) | f | 1 | 3 | (5,9) | 11733.5 | |
+ (5,9) | f | 0 | 4 | (6,114) | 11993 | |
+ (5,9) | f | 1 | 4 | (5,16) | 11993 | |
+ (5,16) | f | 0 | 5 | (16,123) | 17591 | |
+ (5,16) | f | 1 | 5 | (16,127) | 17591 | |
+ (16,127) | | | 6 | | | | (18352.5,19366)
+ (16,123) | | | 6 | | | | (24795,14921)
+ (6,114) | | | 5 | | | | (6706,16676)
+ (5,17) | f | 0 | 4 | (5,18) | 13329.5 | |
+ (5,17) | f | 1 | 4 | (17,226) | 13329.5 | |
+ (17,226) | | | 5 | | | | (23690,10214.5)
+ (5,18) | f | 0 | 5 | (11,113) | 6375 | |
+ (5,18) | f | 1 | 5 | (11,109) | 6375 | |
+ (11,109) | | | 6 | | | | (5501.5,9916)
+ (11,113) | | | 6 | | | | (1072.5,4752)
+(79 rows)
+
+SELECT * FROM spgist_print('spgist_idx') as t(tid tid, allthesame bool, node_n int, level int, tid_pointer tid, prefix point, node_label int, leaf_value point) WHERE level = 1;
+ tid | allthesame | node_n | level | tid_pointer | prefix | node_label | leaf_value
+-------+------------+--------+-------+-------------+-------------------------------------+------------+------------
+ (1,1) | f | 0 | 1 | (5,4) | (24530.2070484581,23595.7092511013) | |
+ (1,1) | f | 1 | 1 | (5,3) | (24530.2070484581,23595.7092511013) | |
+ (1,1) | f | 2 | 1 | (5,2) | (24530.2070484581,23595.7092511013) | |
+ (1,1) | f | 3 | 1 | (5,1) | (24530.2070484581,23595.7092511013) | |
+(4 rows)
+
diff --git a/contrib/pageinspect/ginfuncs.c b/contrib/pageinspect/ginfuncs.c
index f774495..5f86355 100644
--- a/contrib/pageinspect/ginfuncs.c
+++ b/contrib/pageinspect/ginfuncs.c
@@ -2,11 +2,18 @@
* ginfuncs.c
* Functions to investigate the content of GIN indexes
*
+ * Source code is based on Gevel module available at
+ * (http://www.sai.msu.su/~megera/oddmuse/index.cgi/Gevel)
+ * Originally developed by:
+ * - Oleg Bartunov <oleg@sai.msu.su>, Moscow, Moscow University, Russia
+ * - Teodor Sigaev <teodor@sigaev.ru>, Moscow, Moscow University, Russia
+ *
* Copyright (c) 2014-2017, PostgreSQL Global Development Group
*
* IDENTIFICATION
* contrib/pageinspect/ginfuncs.c
*/
+
#include "postgres.h"
#include "pageinspect.h"
@@ -15,22 +22,263 @@
#include "access/gin_private.h"
#include "access/htup_details.h"
#include "catalog/namespace.h"
+#include "catalog/pg_am.h"
#include "catalog/pg_type.h"
#include "funcapi.h"
#include "miscadmin.h"
+#include "tsearch/ts_utils.h"
#include "utils/array.h"
#include "utils/builtins.h"
+#include "utils/datum.h"
+#include "utils/fmgroids.h"
#include "utils/rel.h"
+#include "utils/regproc.h"
+#include "utils/lsyscache.h"
+#include "utils/varlena.h"
+
#define DatumGetItemPointer(X) ((ItemPointer) DatumGetPointer(X))
#define ItemPointerGetDatum(X) PointerGetDatum(X)
+typedef struct GinStatState
+{
+ Relation index;
+ GinState ginstate;
+ OffsetNumber attnum;
+
+ Buffer buffer;
+ OffsetNumber offset;
+ Datum curval; /* Key */
+ GinNullCategory category;
+ Datum dvalues[2]; /* Represents tuple 0 - key; 1 - # of TIDs */
+ char nulls[2];
+} GinStatState;
+
+typedef struct gin_leafpage_items_state
+{
+ TupleDesc tupd;
+ GinPostingList *seg;
+ GinPostingList *lastseg;
+} gin_leafpage_items_state;
+
PG_FUNCTION_INFO_V1(gin_metapage_info);
PG_FUNCTION_INFO_V1(gin_page_opaque_info);
PG_FUNCTION_INFO_V1(gin_leafpage_items);
+PG_FUNCTION_INFO_V1(gin_value_count);
+PG_FUNCTION_INFO_V1(gin_count_estimate);
+PG_FUNCTION_INFO_V1(gin_stats);
+
+/*
+ * process_tuples
+ * Retrieves the number of TIDs in a tuple.
+ */
+static void
+process_tuple(FuncCallContext *funcctx, GinStatState * st, IndexTuple itup)
+{
+ MemoryContext oldcontext;
+ Datum key;
+
+ oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
+
+ key = gintuple_get_key(&st->ginstate, itup, &st->category);
+
+ if (st->category != GIN_CAT_NORM_KEY)
+ st->curval = (Datum) 0;
+ else
+ st->curval = datumCopy(
+ key,
+ st->index->rd_att->attrs[st->attnum]->attbyval,
+ st->index->rd_att->attrs[st->attnum]->attlen);
+ MemoryContextSwitchTo(oldcontext);
+
+ st->dvalues[0] = st->curval;
+
+ /* do no distiguish various null category */
+ st->nulls[0] = (st->category == GIN_CAT_NORM_KEY) ? false : true;
+
+ if (GinIsPostingTree(itup))
+ {
+ BlockNumber rootblkno = GinGetPostingTree(itup);
+ GinBtreeData btree;
+ GinBtreeStack *stack;
+ ItemPointerData minItem;
+ int nlist;
+ ItemPointer list;
+ Page page;
+ uint32 predictNumber;
+
+ LockBuffer(st->buffer, GIN_UNLOCK);
+ stack = ginScanBeginPostingTree(&btree, st->index, rootblkno, NULL);
+ page = BufferGetPage(stack->buffer);
+ ItemPointerSetMin(&minItem);
+ list = GinDataLeafPageGetItems(page, &nlist, minItem);
+ pfree(list);
+ predictNumber = stack->predictNumber;
+ st->dvalues[1] = Int32GetDatum(predictNumber * nlist);
+
+ LockBuffer(stack->buffer, GIN_UNLOCK);
+ freeGinBtreeStack(stack);
+ }
+ else
+ {
+ st->dvalues[1] = Int32GetDatum(GinGetNPosting(itup));
+ LockBuffer(st->buffer, GIN_UNLOCK);
+ }
+}
+
+static bool
+move_right_if_needed(GinStatState * st)
+{
+ Page page = BufferGetPage(st->buffer);
+
+ if (st->offset > PageGetMaxOffsetNumber(page))
+ {
+ /*
+ * We scaned the whole page, so we should take right page
+ */
+ BlockNumber blkno = GinPageGetOpaque(page)->rightlink;
+
+ if (GinPageRightMost(page))
+ return false; /* no more page */
+
+ LockBuffer(st->buffer, GIN_UNLOCK);
+ st->buffer = ReleaseAndReadBuffer(st->buffer, st->index, blkno);
+ LockBuffer(st->buffer, GIN_SHARE);
+ st->offset = FirstOffsetNumber;
+ }
+
+ return true;
+}
+
+/*
+ * refind_position
+ * Refinds a previois position, at returns it has correctly
+ * set offset and buffer is locked.
+ */
+static bool
+refind_position(GinStatState * st)
+{
+ Page page;
+
+ /* find left if needed (it causes only for first search) */
+ for (;;)
+ {
+ IndexTuple itup;
+ BlockNumber blkno;
+
+ LockBuffer(st->buffer, GIN_SHARE);
+
+ page = BufferGetPage(st->buffer);
+ if (GinPageIsLeaf(page))
+ break;
+
+ itup = (IndexTuple) PageGetItem(page,
+ PageGetItemId(page, FirstOffsetNumber));
+ blkno = GinItemPointerGetBlockNumber(&(itup)->t_tid);
+
+ LockBuffer(st->buffer, GIN_UNLOCK);
+ st->buffer = ReleaseAndReadBuffer(st->buffer, st->index, blkno);
+ }
+
+ if (st->offset == InvalidOffsetNumber)
+ {
+ return (PageGetMaxOffsetNumber(page) >= FirstOffsetNumber) ? true : false;
+ }
+
+ for (;;)
+ {
+ int cmp;
+ GinNullCategory category;
+ Datum datum;
+ IndexTuple itup;
+
+ if (move_right_if_needed(st) == false)
+ return false;
+
+ itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, st->offset));
+ datum = gintuple_get_key(&st->ginstate, itup, &category);
+ cmp = ginCompareAttEntries(&st->ginstate,
+ st->attnum + 1, st->curval, st->category,
+ gintuple_get_attrnum(&st->ginstate, itup),
+ datum, category);
+ if (cmp == 0)
+ {
+ if (st->curval && !st->index->rd_att->attrs[st->attnum]->attbyval)
+ pfree((void *) st->curval);
+ return true;
+ }
+
+ st->offset++;
+ }
+
+ return false;
+}
+
+static Relation
+gin_index_open(RangeVar *relvar)
+{
+ Oid relOid = RangeVarGetRelid(relvar, NoLock, false);
+ Relation rel = index_open(relOid, AccessShareLock);
+
+ if (rel->rd_index == NULL)
+ elog(ERROR, "Relation %s.%s is not an index",
+ get_namespace_name(RelationGetNamespace(rel)),
+ RelationGetRelationName(rel)
+ );
+
+ if (rel->rd_rel->relam != GIN_AM_OID)
+ elog(ERROR, "Index %s.%s has wrong type",
+ get_namespace_name(RelationGetNamespace(rel)),
+ RelationGetRelationName(rel)
+ );
+ return rel;
+}
+
+static void
+gin_setup_firstcall(FuncCallContext *funcctx, text *name, int attnum)
+{
+ MemoryContext oldcontext;
+ GinStatState *st;
+ char *relname = text_to_cstring(name);
+ TupleDesc tupdesc;
+ oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
+
+ st = (GinStatState *) palloc(sizeof(GinStatState));
+ memset(st, 0, sizeof(GinStatState));
+ st->index = gin_index_open(
+ makeRangeVarFromNameList(stringToQualifiedNameList(relname)));
+ initGinState(&st->ginstate, st->index);
+
+ if (attnum < 0 || attnum >= st->index->rd_att->natts)
+ elog(ERROR, "Wrong column's number");
+ st->attnum = attnum;
+
+ funcctx->user_fctx = (void *) st;
+
+ tupdesc = CreateTemplateTupleDesc(2, false);
+ TupleDescInitEntry(tupdesc, 1, "value",
+ st->index->rd_att->attrs[st->attnum]->atttypid,
+ st->index->rd_att->attrs[st->attnum]->atttypmod,
+ st->index->rd_att->attrs[st->attnum]->attndims);
+ TupleDescInitEntry(tupdesc, 2, "nrow", INT4OID, -1, 0);
+
+ memset(st->nulls, false, 2 * sizeof(*st->nulls));
+
+ funcctx->slot = TupleDescGetSlot(tupdesc);
+ funcctx->attinmeta = TupleDescGetAttInMetadata(tupdesc);
+
+ MemoryContextSwitchTo(oldcontext);
+ pfree(relname);
+
+ st->offset = InvalidOffsetNumber;
+ st->buffer = ReadBuffer(st->index, GIN_ROOT_BLKNO);
+}
+/*
+ * gin_metapage_info
+ */
Datum
gin_metapage_info(PG_FUNCTION_ARGS)
{
@@ -46,7 +294,8 @@ gin_metapage_info(PG_FUNCTION_ARGS)
if (!superuser())
ereport(ERROR,
(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
- (errmsg("must be superuser to use raw page functions"))));
+ (errmsg("must be superuser to use raw page functions")))
+ );
page = get_page_from_raw(raw_page);
@@ -56,7 +305,8 @@ gin_metapage_info(PG_FUNCTION_ARGS)
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("input page is not a GIN metapage"),
errdetail("Flags %04X, expected %04X",
- opaq->flags, GIN_META)));
+ opaq->flags, GIN_META))
+ );
/* Build a tuple descriptor for our result type */
if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE)
@@ -86,7 +336,9 @@ gin_metapage_info(PG_FUNCTION_ARGS)
return HeapTupleGetDatum(resultTuple);
}
-
+/*
+ * gin_page_opaque_info
+ */
Datum
gin_page_opaque_info(PG_FUNCTION_ARGS)
{
@@ -104,7 +356,8 @@ gin_page_opaque_info(PG_FUNCTION_ARGS)
if (!superuser())
ereport(ERROR,
(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
- (errmsg("must be superuser to use raw page functions"))));
+ (errmsg("must be superuser to use raw page functions")))
+ );
page = get_page_from_raw(raw_page);
@@ -137,7 +390,8 @@ gin_page_opaque_info(PG_FUNCTION_ARGS)
if (flagbits)
{
/* any flags we don't recognize are printed in hex */
- flags[nflags++] = DirectFunctionCall1(to_hex32, Int32GetDatum(flagbits));
+ flags[nflags++] = DirectFunctionCall1(to_hex32,
+ Int32GetDatum(flagbits));
}
memset(nulls, 0, sizeof(nulls));
@@ -153,13 +407,9 @@ gin_page_opaque_info(PG_FUNCTION_ARGS)
return HeapTupleGetDatum(resultTuple);
}
-typedef struct gin_leafpage_items_state
-{
- TupleDesc tupd;
- GinPostingList *seg;
- GinPostingList *lastseg;
-} gin_leafpage_items_state;
-
+/*
+ * gin_leafpage_items
+ */
Datum
gin_leafpage_items(PG_FUNCTION_ARGS)
{
@@ -170,7 +420,8 @@ gin_leafpage_items(PG_FUNCTION_ARGS)
if (!superuser())
ereport(ERROR,
(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
- (errmsg("must be superuser to use raw page functions"))));
+ (errmsg("must be superuser to use raw page functions")))
+ );
if (SRF_IS_FIRSTCALL())
{
@@ -190,7 +441,8 @@ gin_leafpage_items(PG_FUNCTION_ARGS)
errmsg("input page is not a valid GIN data leaf page"),
errdetail("Special size %d, expected %d",
(int) PageGetSpecialSize(page),
- (int) MAXALIGN(sizeof(GinPageOpaqueData)))));
+ (int) MAXALIGN(sizeof(GinPageOpaqueData))))
+ );
opaq = (GinPageOpaque) PageGetSpecialPointer(page);
if (opaq->flags != (GIN_DATA | GIN_LEAF | GIN_COMPRESSED))
@@ -199,7 +451,8 @@ gin_leafpage_items(PG_FUNCTION_ARGS)
errmsg("input page is not a compressed GIN data leaf page"),
errdetail("Flags %04X, expected %04X",
opaq->flags,
- (GIN_DATA | GIN_LEAF | GIN_COMPRESSED))));
+ (GIN_DATA | GIN_LEAF | GIN_COMPRESSED)))
+ );
inter_call_data = palloc(sizeof(gin_leafpage_items_state));
@@ -261,5 +514,311 @@ gin_leafpage_items(PG_FUNCTION_ARGS)
SRF_RETURN_NEXT(fctx, result);
}
else
+ {
SRF_RETURN_DONE(fctx);
+ }
+}
+
+/*
+ * gin_value_count
+ * Prints estimated counts for each indexed values.
+ */
+Datum
+gin_value_count(PG_FUNCTION_ARGS)
+{
+ FuncCallContext *funcctx;
+ GinStatState *st;
+ Datum result = (Datum) 0;
+ IndexTuple ituple;
+ HeapTuple htuple;
+ Page page;
+
+ if (SRF_IS_FIRSTCALL())
+ {
+ text *name = PG_GETARG_TEXT_P(0);
+
+ funcctx = SRF_FIRSTCALL_INIT();
+ gin_setup_firstcall(funcctx, name, (PG_NARGS() == 2) ?
+ PG_GETARG_INT32(1) : 0);
+ PG_FREE_IF_COPY(name, 0);
+ }
+
+ funcctx = SRF_PERCALL_SETUP();
+ st = (GinStatState *) (funcctx->user_fctx);
+
+ if (refind_position(st) == false)
+ {
+ UnlockReleaseBuffer(st->buffer);
+ index_close(st->index, AccessShareLock);
+
+ SRF_RETURN_DONE(funcctx);
+ }
+
+ for (;;)
+ {
+ st->offset++;
+
+ if (move_right_if_needed(st) == false)
+ {
+ UnlockReleaseBuffer(st->buffer);
+ index_close(st->index, AccessShareLock);
+
+ SRF_RETURN_DONE(funcctx);
+ }
+
+ page = BufferGetPage(st->buffer);
+ ituple = (IndexTuple) PageGetItem(page,
+ PageGetItemId(page, st->offset));
+
+ if (st->attnum + 1 == gintuple_get_attrnum(&st->ginstate, ituple))
+ break;
+ }
+
+ process_tuple(funcctx, st, ituple);
+
+ htuple = heap_form_tuple(funcctx->attinmeta->tupdesc,
+ st->dvalues,
+ st->nulls);
+ result = TupleGetDatum(funcctx->slot, htuple);
+
+ SRF_RETURN_NEXT(funcctx, result);
+}
+
+/*
+ * gin_count_estimate
+ * Outputs number of indexed rows matched query. It doesn't touch heap at
+ * all.
+ *
+ * Usage:
+ * SELECT gin_count_estimate('index_name', 'query');
+ */
+Datum
+gin_count_estimate(PG_FUNCTION_ARGS)
+{
+ text *name = PG_GETARG_TEXT_P(0);
+ Relation index;
+ IndexScanDesc scan;
+ int64 count = 0;
+ char *relname = text_to_cstring(name);
+ ScanKeyData key;
+ TIDBitmap *bitmap = tbm_create(work_mem * 1024L, NULL);
+
+ index = gin_index_open(makeRangeVarFromNameList(stringToQualifiedNameList(relname)));
+
+ if (index->rd_opcintype[0] != TSVECTOROID)
+ {
+ index_close(index, AccessShareLock);
+ elog(ERROR, "Column type is not a tsvector");
+ }
+
+ key.sk_flags = 0;
+ key.sk_attno = 1;
+ key.sk_strategy = TSearchStrategyNumber;
+ key.sk_subtype = 0;
+ key.sk_argument = PG_GETARG_DATUM(1);
+
+ fmgr_info(F_TS_MATCH_VQ, &key.sk_func);
+
+ scan = index_beginscan_bitmap(index, SnapshotSelf, 1);
+ index_rescan(scan, &key, 1, NULL, 0);
+
+ count = index_getbitmap(scan, bitmap);
+ tbm_free(bitmap);
+
+ pfree(relname);
+
+ index_endscan(scan);
+ index_close(index, AccessShareLock);
+
+ PG_RETURN_INT64(count);
+}
+
+/*
+ * gin_stat
+ * Prints various stat about index internals.
+ *
+ * Usage:
+ * SELECT * FROM gin_stat('gin_idx') as t(value int, nrow int);
+ */
+Datum
+gin_stats(PG_FUNCTION_ARGS)
+{
+ text *name = PG_GETARG_TEXT_P(0);
+ RangeVar *relvar;
+ Relation index;
+ BlockNumber blkno;
+ char res[1024];
+ uint32 totalPages,
+ deletedPages = 0,
+ emptyDataPages = 0,
+ entryPages = 0,
+ dataPages = 0,
+ dataInnerPages = 0,
+ dataLeafPages = 0,
+ entryInnerPages = 0,
+ entryLeafPages = 0;
+
+ uint64 dataInnerFreeSpace = 0,
+ dataLeafFreeSpace = 0,
+ dataInnerTuplesCount = 0,
+ dataLeafIptrsCount = 0,
+ entryInnerFreeSpace = 0,
+ entryLeafFreeSpace = 0,
+ entryInnerTuplesCount = 0,
+ entryLeafTuplesCount = 0,
+ entryPostingSize = 0,
+ entryPostingCount = 0,
+ entryAttrSize = 0;
+
+ relvar = makeRangeVarFromNameList(textToQualifiedNameList(name));
+ index = relation_openrv(relvar, AccessExclusiveLock);
+
+ if (index->rd_rel->relkind != RELKIND_INDEX ||
+ index->rd_rel->relam != GIN_AM_OID)
+ elog(ERROR, "relation \"%s\" is not a GIN index",
+ RelationGetRelationName(index));
+
+ totalPages = RelationGetNumberOfBlocks(index);
+
+ for (blkno = GIN_ROOT_BLKNO; blkno < totalPages; blkno++)
+ {
+ Buffer buffer;
+ Page page;
+ PageHeader header;
+
+ buffer = ReadBuffer(index, blkno);
+ LockBuffer(buffer, BUFFER_LOCK_SHARE);
+
+ page = BufferGetPage(buffer);
+ header = (PageHeader) page;
+
+ if (GinPageIsDeleted(page))
+ {
+ deletedPages++;
+ }
+ else if (GinPageIsData(page))
+ {
+ dataPages++;
+ if (GinPageIsLeaf(page))
+ {
+ ItemPointerData minItem,
+ *ptr;
+ int nlist;
+
+
+ dataLeafPages++;
+ dataLeafFreeSpace += header->pd_upper - header->pd_lower;
+ ItemPointerSetMin(&minItem);
+
+ ptr = GinDataLeafPageGetItems(page, &nlist, minItem);
+
+ if (ptr)
+ {
+ pfree(ptr);
+ dataLeafIptrsCount += nlist;
+ }
+ else
+ emptyDataPages++;
+ }
+ else
+ {
+ dataInnerPages++;
+ dataInnerFreeSpace += header->pd_upper - header->pd_lower;
+ dataInnerTuplesCount += GinPageGetOpaque(page)->maxoff;
+ }
+ }
+ else
+ {
+ IndexTuple itup;
+ OffsetNumber i,
+ maxoff;
+
+ maxoff = PageGetMaxOffsetNumber(page);
+
+ entryPages++;
+ if (GinPageIsLeaf(page))
+ {
+ entryLeafPages++;
+ entryLeafFreeSpace += header->pd_upper - header->pd_lower;
+ entryLeafTuplesCount += maxoff;
+ }
+ else
+ {
+ entryInnerPages++;
+ entryInnerFreeSpace += header->pd_upper - header->pd_lower;
+ entryInnerTuplesCount += maxoff;
+ }
+
+ for (i = 1; i <= maxoff; i++)
+ {
+ itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, i));
+
+ if (GinPageIsLeaf(page))
+ {
+ GinPostingList *list = (GinPostingList *) GinGetPosting(itup);
+
+ entryPostingCount += GinGetNPosting(itup);
+ entryPostingSize += SizeOfGinPostingList(list);
+ entryAttrSize += GinGetPostingOffset(itup) -
+ IndexInfoFindDataOffset((itup)->t_info);
+ }
+ else
+ {
+ entryAttrSize += IndexTupleSize(itup) -
+ IndexInfoFindDataOffset((itup)->t_info);
+ }
+ }
+ }
+
+ UnlockReleaseBuffer(buffer);
+ }
+
+ index_close(index, AccessExclusiveLock);
+ totalPages--;
+
+ snprintf(res, sizeof(res),
+ "totalPages: %u\n"
+ "deletedPages: %u\n"
+ "emptyDataPages: %u\n"
+ "dataPages: %u\n"
+ "dataInnerPages: %u\n"
+ "dataLeafPages: %u\n"
+ "dataInnerFreeSpace: " INT64_FORMAT "\n"
+ "dataLeafFreeSpace: " INT64_FORMAT "\n"
+ "dataInnerTuplesCount: " INT64_FORMAT "\n"
+ "dataLeafIptrsCount: " INT64_FORMAT "\n"
+ "entryPages: %u\n"
+ "entryInnerPages: %u\n"
+ "entryLeafPages: %u\n"
+ "entryInnerFreeSpace: " INT64_FORMAT "\n"
+ "entryLeafFreeSpace: " INT64_FORMAT "\n"
+ "entryInnerTuplesCount: " INT64_FORMAT "\n"
+ "entryLeafTuplesCount: " INT64_FORMAT "\n"
+ "entryPostingSize: " INT64_FORMAT "\n"
+ "entryPostingCount: " INT64_FORMAT "\n"
+ "entryAttrSize: " INT64_FORMAT "\n"
+ ,
+ totalPages,
+ deletedPages,
+ emptyDataPages,
+ dataPages,
+ dataInnerPages,
+ dataLeafPages,
+ dataInnerFreeSpace,
+ dataLeafFreeSpace,
+ dataInnerTuplesCount,
+ dataLeafIptrsCount,
+ entryPages,
+ entryInnerPages,
+ entryLeafPages,
+ entryInnerFreeSpace,
+ entryLeafFreeSpace,
+ entryInnerTuplesCount,
+ entryLeafTuplesCount,
+ entryPostingSize,
+ entryPostingCount,
+ entryAttrSize
+ );
+
+ PG_RETURN_TEXT_P(CStringGetTextDatum(res));
}
diff --git a/contrib/pageinspect/gistfuncs.c b/contrib/pageinspect/gistfuncs.c
new file mode 100644
index 0000000..c285606
--- /dev/null
+++ b/contrib/pageinspect/gistfuncs.c
@@ -0,0 +1,509 @@
+/*
+ * gistfuncs.c
+ * Functions to investigate the content of GiST indexes
+ *
+ * Source code is based on Gevel module available at
+ * (http://www.sai.msu.su/~megera/oddmuse/index.cgi/Gevel)
+ * Originally developed by:
+ * - Oleg Bartunov <oleg@sai.msu.su>, Moscow, Moscow University, Russia
+ * - Teodor Sigaev <teodor@sigaev.ru>, Moscow, Moscow University, Russia
+ *
+ * Copyright (c) 2017, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * contrib/pageinspect/gistfuncs.c
+ */
+
+#include "postgres.h"
+
+#include "access/gist_private.h"
+#include "access/relscan.h"
+#include "catalog/namespace.h"
+#include "catalog/pg_am.h"
+#include "catalog/pg_type.h"
+#include "funcapi.h"
+#include "utils/builtins.h"
+#include "utils/lsyscache.h"
+#include "utils/regproc.h"
+
+#define PAGESIZE (BLCKSZ - MAXALIGN(sizeof(PageHeaderData) + \
+ sizeof(ItemIdData)))
+
+/*
+ * For GiST tree dumping.
+ */
+typedef struct
+{
+ int maxlevel; /* Max level of tree to look through. */
+ text *txt;
+ char *ptr;
+ int len;
+} IdxInfo;
+
+/*
+ * For GiST tree traversal and statistics collection.
+ */
+typedef struct
+{
+ int level;
+ int numpages;
+ int numleafpages;
+ int numtuple;
+ int numinvalidtuple;
+ int numleaftuple;
+ uint64 tuplesize;
+ uint64 leaftuplesize;
+ uint64 totalsize;
+} IdxStat;
+
+/*
+ * GiST page.
+ */
+typedef struct GPItem
+{
+ Buffer buffer;
+ Page page;
+ OffsetNumber offset;
+ int level;
+ struct GPItem *next;
+} GPItem;
+
+typedef struct
+{
+ List *relname_list;
+ RangeVar *relvar;
+ Relation index;
+ Datum *dvalues;
+ bool *nulls;
+ GPItem *item;
+} TypeStorage;
+
+
+PG_FUNCTION_INFO_V1(gist_stats);
+PG_FUNCTION_INFO_V1(gist_tree);
+PG_FUNCTION_INFO_V1(gist_print);
+
+
+static Relation
+gist_index_open(RangeVar *relvar)
+{
+ Oid relOid = RangeVarGetRelid(relvar, NoLock, false);
+ Relation r = index_open(relOid, AccessExclusiveLock);
+
+ if (r->rd_index == NULL)
+ elog(ERROR, "Relation %s.%s is not an index",
+ get_namespace_name(RelationGetNamespace(r)),
+ RelationGetRelationName(r)
+ );
+
+ if (r->rd_rel->relam != GIST_AM_OID)
+ elog(ERROR, "Index %s.%s has wrong type",
+ get_namespace_name(RelationGetNamespace(r)),
+ RelationGetRelationName(r)
+ );
+
+ return r;
+}
+
+/* open_gp_page
+ * Opens GiST page.
+ */
+static GPItem *
+open_gp_page(FuncCallContext *funcctx, BlockNumber blk)
+{
+ GPItem *nitem;
+ MemoryContext oldcontext;
+ Relation index = ((TypeStorage *) (funcctx->user_fctx))->index;
+
+ oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
+ nitem = (GPItem *) palloc(sizeof(GPItem));
+ memset(nitem, 0, sizeof(GPItem));
+
+ nitem->buffer = ReadBuffer(index, blk);
+ nitem->page = (Page) BufferGetPage(nitem->buffer);
+ nitem->offset = FirstOffsetNumber;
+ nitem->next = ((TypeStorage *) (funcctx->user_fctx))->item;
+ nitem->level = (nitem->next) ? nitem->next->level + 1 : 1;
+ ((TypeStorage *) (funcctx->user_fctx))->item = nitem;
+
+ MemoryContextSwitchTo(oldcontext);
+ return nitem;
+}
+
+/*
+ * close_gp_page
+ * Close GiST page.
+ */
+static GPItem *
+close_gp_page(FuncCallContext *funcctx)
+{
+ GPItem *oitem = ((TypeStorage *) (funcctx->user_fctx))->item;
+
+ ((TypeStorage *) (funcctx->user_fctx))->item = oitem->next;
+
+ ReleaseBuffer(oitem->buffer);
+ pfree(oitem);
+ return ((TypeStorage *) (funcctx->user_fctx))->item;
+}
+
+/*
+ * gist_stattree
+ * Traverses GiST tree and collects statistics.
+ */
+static void
+gist_stattree(Relation r, int level, BlockNumber blk, OffsetNumber coff,
+ IdxStat * info)
+{
+ Buffer buffer;
+ Page page;
+ IndexTuple which;
+ ItemId iid;
+ OffsetNumber i,
+ maxoff;
+ BlockNumber cblk;
+ char *pred;
+
+ pred = (char *) palloc(sizeof(char) * level * 4 + 1);
+ MemSet(pred, ' ', level * 4);
+ pred[level * 4] = '\0';
+
+ buffer = ReadBuffer(r, blk);
+ page = (Page) BufferGetPage(buffer);
+
+ maxoff = PageGetMaxOffsetNumber(page);
+
+ info->numpages++;
+ info->tuplesize += PAGESIZE - PageGetFreeSpace(page);
+ info->totalsize += BLCKSZ;
+ info->numtuple += maxoff;
+ if (info->level < level)
+ info->level = level;
+
+ if (GistPageIsLeaf(page))
+ {
+ info->numleafpages++;
+ info->leaftuplesize += PAGESIZE - PageGetFreeSpace(page);
+ info->numleaftuple += maxoff;
+ }
+ else
+ {
+ for (i = FirstOffsetNumber; i <= maxoff; i = OffsetNumberNext(i))
+ {
+ iid = PageGetItemId(page, i);
+ which = (IndexTuple) PageGetItem(page, iid);
+ if (GistTupleIsInvalid(which))
+ info->numinvalidtuple++;
+ cblk = ItemPointerGetBlockNumber(&(which->t_tid));
+ gist_stattree(r, level + 1, cblk, i, info);
+ }
+ }
+
+ ReleaseBuffer(buffer);
+ pfree(pred);
+}
+
+/*
+ * gist_dumptree
+ * Recursively prints GiST tree.
+ */
+static void
+gist_dumptree(Relation r, int level, BlockNumber blk, OffsetNumber coff,
+ IdxInfo * info)
+{
+ Buffer buffer;
+ Page page;
+ IndexTuple which;
+ ItemId iid;
+ OffsetNumber i,
+ maxoff;
+ BlockNumber cblk;
+ char *pred;
+
+ pred = (char *) palloc(sizeof(char) * level * 4 + 1);
+ MemSet(pred, ' ', level * 4);
+ pred[level * 4] = '\0';
+
+ buffer = ReadBuffer(r, blk);
+ page = (Page) BufferGetPage(buffer);
+
+ maxoff = PageGetMaxOffsetNumber(page);
+
+
+ while ((info->ptr - ((char *) info->txt)) + level * 4 + 128 >= info->len)
+ {
+ int dist = info->ptr - ((char *) info->txt);
+
+ info->len *= 2;
+ info->txt = (text *) repalloc(info->txt, info->len);
+ info->ptr = ((char *) info->txt) + dist;
+ }
+
+ sprintf(info->ptr,
+ "%s%d(l:%d) blk: %u numTuple: %d free: %db(%.2f%%) rightlink:%u (%s)\n",
+ pred,
+ coff,
+ level,
+ blk,
+ (int) maxoff,
+ (int) PageGetFreeSpace(page),
+ 100.0 * (((float) PAGESIZE) - (float) PageGetFreeSpace(page)) /
+ ((float) PAGESIZE),
+ GistPageGetOpaque(page)->rightlink,
+ (GistPageGetOpaque(page)->rightlink == InvalidBlockNumber) ?
+ "InvalidBlockNumber" : "OK");
+ info->ptr = strchr(info->ptr, '\0');
+
+ if (!GistPageIsLeaf(page) && (info->maxlevel < 0 || level < info->maxlevel))
+ for (i = FirstOffsetNumber; i <= maxoff; i = OffsetNumberNext(i))
+ {
+ iid = PageGetItemId(page, i);
+ which = (IndexTuple) PageGetItem(page, iid);
+ cblk = ItemPointerGetBlockNumber(&(which->t_tid));
+ gist_dumptree(r, level + 1, cblk, i, info);
+ }
+ ReleaseBuffer(buffer);
+ pfree(pred);
+}
+
+/*
+ * setup_firstcall
+ * Initialization for first call of SRF.
+ */
+static void
+setup_firstcall(FuncCallContext *funcctx, text *name)
+{
+ MemoryContext oldcontext;
+ TypeStorage *st;
+ char *relname = text_to_cstring(name);
+ TupleDesc tupdesc;
+ char attname[NAMEDATALEN];
+ int i;
+
+ oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
+
+ st = (TypeStorage *) palloc(sizeof(TypeStorage));
+ memset(st, 0, sizeof(TypeStorage));
+ st->relname_list = stringToQualifiedNameList(relname);
+ st->relvar = makeRangeVarFromNameList(st->relname_list);
+ st->index = gist_index_open(st->relvar);
+ funcctx->user_fctx = (void *) st;
+
+ tupdesc = CreateTemplateTupleDesc(st->index->rd_att->natts + 2, false);
+ TupleDescInitEntry(tupdesc, 1, "level", INT4OID, -1, 0);
+ TupleDescInitEntry(tupdesc, 2, "valid", BOOLOID, -1, 0);
+ for (i = 0; i < st->index->rd_att->natts; i++)
+ {
+ sprintf(attname, "z%d", i + 2);
+ TupleDescInitEntry(
+ tupdesc,
+ i + 3,
+ attname,
+ st->index->rd_att->attrs[i]->atttypid,
+ st->index->rd_att->attrs[i]->atttypmod,
+ st->index->rd_att->attrs[i]->attndims
+ );
+ }
+
+ st->dvalues = (Datum *) palloc((tupdesc->natts + 2) * sizeof(Datum));
+ st->nulls = (char *) palloc((tupdesc->natts + 2) * sizeof(*st->nulls));
+
+ funcctx->slot = TupleDescGetSlot(tupdesc);
+ funcctx->attinmeta = TupleDescGetAttInMetadata(tupdesc);
+
+ MemoryContextSwitchTo(oldcontext);
+ pfree(relname);
+
+ st->item = open_gp_page(funcctx, GIST_ROOT_BLKNO);
+}
+
+/*
+ * close_call
+ * Clean up before SRF returns.
+ */
+static void
+close_call(FuncCallContext *funcctx)
+{
+ TypeStorage *st = (TypeStorage *) (funcctx->user_fctx);
+
+ while (st->item && close_gp_page(funcctx));
+
+ pfree(st->dvalues);
+ pfree(st->nulls);
+
+ index_close(st->index, AccessExclusiveLock);
+}
+
+/*
+ * gist_stats
+ * Returns statistics about GiST tree.
+ *
+ * Usage:
+ * select gist_stats('pix');
+ */
+Datum
+gist_stats(PG_FUNCTION_ARGS)
+{
+ text *name = PG_GETARG_TEXT_P(0);
+ char *relname = text_to_cstring(name);
+ RangeVar *relvar;
+ Relation index;
+ List *relname_list;
+ IdxStat info;
+ text *out = (text *) palloc(1024);
+ char *ptr = ((char *) out) + VARHDRSZ;
+
+
+ relname_list = stringToQualifiedNameList(relname);
+ relvar = makeRangeVarFromNameList(relname_list);
+ index = gist_index_open(relvar);
+ PG_FREE_IF_COPY(name, 0);
+
+ memset(&info, 0, sizeof(IdxStat));
+
+ gist_stattree(index, 0, GIST_ROOT_BLKNO, 0, &info);
+
+ index_close(index, AccessExclusiveLock);
+ pfree(relname);
+
+ sprintf(ptr,
+ "Number of levels: %d\n"
+ "Number of pages: %d\n"
+ "Number of leaf pages: %d\n"
+ "Number of tuples: %d\n"
+ "Number of invalid tuples: %d\n"
+ "Number of leaf tuples: %d\n"
+ "Total size of tuples: " INT64_FORMAT " bytes\n"
+ "Total size of leaf tuples: " INT64_FORMAT " bytes\n"
+ "Total size of index: " INT64_FORMAT " bytes\n",
+ info.level + 1,
+ info.numpages,
+ info.numleafpages,
+ info.numtuple,
+ info.numinvalidtuple,
+ info.numleaftuple,
+ info.tuplesize,
+ info.leaftuplesize,
+ info.totalsize);
+
+ ptr = strchr(ptr, '\0');
+
+ SET_VARSIZE(out, ptr - ((char *) out));
+ PG_RETURN_POINTER(out);
+}
+
+/*
+ * gist_tree
+ * Show GiST tree.
+ *
+ * Usage:
+ * SELECT gist_tree('gist_idx');
+ */
+Datum
+gist_tree(PG_FUNCTION_ARGS)
+{
+ text *name = PG_GETARG_TEXT_P(0);
+ char *relname = text_to_cstring(name);
+ RangeVar *relvar;
+ Relation index;
+ List *relname_list;
+ IdxInfo info;
+
+ relname_list = stringToQualifiedNameList(relname);
+ relvar = makeRangeVarFromNameList(relname_list);
+ index = gist_index_open(relvar);
+ PG_FREE_IF_COPY(name, 0);
+
+ info.maxlevel = (PG_NARGS() > 1) ? PG_GETARG_INT32(1) : -1;
+ info.len = 1024;
+ info.txt = (text *) palloc(info.len);
+ info.ptr = ((char *) info.txt) + VARHDRSZ;
+
+ gist_dumptree(index, 0, GIST_ROOT_BLKNO, 0, &info);
+
+ index_close(index, AccessExclusiveLock);
+ pfree(relname);
+
+ SET_VARSIZE(info.txt, info.ptr - ((char *) info.txt));
+ PG_RETURN_POINTER(info.txt);
+}
+
+/*
+ * gist_print
+ * Prints objects stored in GiST tree, works only if objects in index have
+ * textual representation (type_out functions should be implemented for
+ * given object type).
+ *
+ * Usage:
+ * SELECT * FROM gist_print('gist_idx') as t(level int, valid bool, a box);
+ */
+Datum
+gist_print(PG_FUNCTION_ARGS)
+{
+ FuncCallContext *funcctx;
+ TypeStorage *st;
+ Datum result = (Datum) 0;
+ ItemId iid;
+ IndexTuple ituple;
+ HeapTuple htuple;
+ int i;
+ bool isnull;
+
+ if (SRF_IS_FIRSTCALL())
+ {
+ text *name = PG_GETARG_TEXT_P(0);
+
+ funcctx = SRF_FIRSTCALL_INIT();
+ setup_firstcall(funcctx, name);
+ PG_FREE_IF_COPY(name, 0);
+ }
+
+ funcctx = SRF_PERCALL_SETUP();
+ st = (TypeStorage *) (funcctx->user_fctx);
+
+ if (!st->item)
+ {
+ close_call(funcctx);
+ SRF_RETURN_DONE(funcctx);
+ }
+
+ while (st->item->offset > PageGetMaxOffsetNumber(st->item->page))
+ {
+ if (!close_gp_page(funcctx))
+ {
+ close_call(funcctx);
+ SRF_RETURN_DONE(funcctx);
+ }
+ }
+
+ iid = PageGetItemId(st->item->page, st->item->offset);
+ ituple = (IndexTuple) PageGetItem(st->item->page, iid);
+
+ st->dvalues[0] = Int32GetDatum(st->item->level);
+ st->nulls[0] = false;
+ st->dvalues[1] = BoolGetDatum((!GistPageIsLeaf(st->item->page) &&
+ GistTupleIsInvalid(ituple)) ? false : true);
+ st->nulls[1] = false;
+ for (i = 2; i < funcctx->attinmeta->tupdesc->natts; i++)
+ {
+ if (!GistPageIsLeaf(st->item->page) && GistTupleIsInvalid(ituple))
+ {
+ st->dvalues[i] = (Datum) 0;
+ st->nulls[i] = true;
+ }
+ else
+ {
+ st->dvalues[i] = index_getattr(ituple, i - 1, st->index->rd_att,
+ &isnull);
+ st->nulls[i] = (isnull) ? true : false;
+ }
+ }
+
+ htuple = heap_form_tuple(funcctx->attinmeta->tupdesc, st->dvalues,
+ st->nulls);
+ result = TupleGetDatum(funcctx->slot, htuple);
+ st->item->offset = OffsetNumberNext(st->item->offset);
+ if (!GistPageIsLeaf(st->item->page))
+ open_gp_page(funcctx, ItemPointerGetBlockNumber(&(ituple->t_tid)));
+
+ SRF_RETURN_NEXT(funcctx, result);
+}
diff --git a/contrib/pageinspect/hashfuncs.c b/contrib/pageinspect/hashfuncs.c
index dbe3b6a..9597631 100644
--- a/contrib/pageinspect/hashfuncs.c
+++ b/contrib/pageinspect/hashfuncs.c
@@ -14,8 +14,8 @@
#include "access/hash.h"
#include "access/htup_details.h"
-#include "catalog/pg_type.h"
#include "catalog/pg_am.h"
+#include "catalog/pg_type.h"
#include "funcapi.h"
#include "miscadmin.h"
#include "utils/builtins.h"
diff --git a/contrib/pageinspect/pageinspect--1.6--1.7.sql b/contrib/pageinspect/pageinspect--1.6--1.7.sql
new file mode 100644
index 0000000..fc9d096
--- /dev/null
+++ b/contrib/pageinspect/pageinspect--1.6--1.7.sql
@@ -0,0 +1,57 @@
+/* contrib/pageinspect/pageinspect--1.6--1.7.sql */
+
+-- complain if script is sourced in psql, rather than via ALTER EXTENSION
+\echo Use "ALTER EXTENSION pageinspect UPDATE TO '1.7'" to load this file. \quit
+
+-- GiST
+CREATE FUNCTION gist_stats(text)
+RETURNS text
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT;
+
+CREATE FUNCTION gist_tree(text)
+RETURNS text
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT;
+
+CREATE FUNCTION gist_tree(text, int4)
+RETURNS text
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT;
+
+CREATE FUNCTION gist_print(text)
+RETURNS SETOF record
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT;
+
+-- SP-GiST
+CREATE FUNCTION spgist_stats(text)
+RETURNS text
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT;
+
+CREATE FUNCTION spgist_print(text)
+RETURNS SETOF record
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT;
+
+-- GIN
+CREATE FUNCTION gin_value_count(text)
+RETURNS SETOF record
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT;
+
+CREATE FUNCTION gin_value_count(text, int)
+RETURNS SETOF record
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT;
+
+CREATE FUNCTION gin_stats(text)
+RETURNS text
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT;
+
+CREATE FUNCTION gin_count_estimate(text, tsquery)
+RETURNS bigint
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT;
diff --git a/contrib/pageinspect/pageinspect.control b/contrib/pageinspect/pageinspect.control
index 1a61c9f..dcfc61f 100644
--- a/contrib/pageinspect/pageinspect.control
+++ b/contrib/pageinspect/pageinspect.control
@@ -1,5 +1,5 @@
# pageinspect extension
comment = 'inspect the contents of database pages at a low level'
-default_version = '1.6'
+default_version = '1.7'
module_pathname = '$libdir/pageinspect'
relocatable = true
diff --git a/contrib/pageinspect/spgistfuncs.c b/contrib/pageinspect/spgistfuncs.c
new file mode 100644
index 0000000..c5da323
--- /dev/null
+++ b/contrib/pageinspect/spgistfuncs.c
@@ -0,0 +1,439 @@
+/*
+ * spgistfuncs.c
+ * Functions to investigate the content of SP-GiST indexes
+ *
+ * Source code is based on Gevel module available at
+ * (http://www.sai.msu.su/~megera/oddmuse/index.cgi/Gevel)
+ * Originally developed by:
+ * - Oleg Bartunov <oleg@sai.msu.su>, Moscow, Moscow University, Russia
+ * - Teodor Sigaev <teodor@sigaev.ru>, Moscow, Moscow University, Russia
+ *
+ * Copyright (c) 2017, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * contrib/pageinspect/spgistfuncs.c
+ */
+
+#include "postgres.h"
+
+#include "access/gist_private.h"
+#include "access/spgist_private.h"
+#include "access/relscan.h"
+#include "catalog/namespace.h"
+#include "catalog/pg_am.h"
+#include "catalog/pg_type.h"
+#include "funcapi.h"
+#include "miscadmin.h"
+#include "utils/builtins.h"
+#include "utils/datum.h"
+#include "utils/varlena.h"
+
+typedef struct SPGistPrintStackElem
+{
+ ItemPointerData iptr;
+ int16 nlabel;
+ int level;
+} SPGistPrintStackElem;
+
+typedef struct SPGistPrint
+{
+ SpGistState state;
+ Relation index;
+ Datum dvalues[8 /* see CreateTemplateTupleDesc call */ ];
+ char nulls[8 /* see CreateTemplateTupleDesc call */ ];
+ List *stack;
+} SPGistPrint;
+
+#define IsIndex(r) ((r)->rd_rel->relkind == RELKIND_INDEX)
+#define IsSpGist(r) ((r)->rd_rel->relam == SPGIST_AM_OID)
+
+static void
+pushSPGistPrint(FuncCallContext *funcctx, SPGistPrint * prst, ItemPointer ip,
+ int level)
+{
+ MemoryContext oldcontext;
+ SPGistPrintStackElem *e;
+
+ oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
+
+ e = palloc(sizeof(*e));
+ e->iptr = *ip;
+ e->nlabel = 0;
+ e->level = level;
+ prst->stack = lcons(e, prst->stack);
+
+ MemoryContextSwitchTo(oldcontext);
+}
+
+static void
+close_spgist_print(SPGistPrint * prst)
+{
+ index_close(prst->index, AccessExclusiveLock);
+}
+
+PG_FUNCTION_INFO_V1(spgist_stats);
+PG_FUNCTION_INFO_V1(spgist_print);
+
+/*
+ * spgist_stats
+ * Show statistics about SP-GiST tree.
+ *
+ * Usage:
+ * SELECT spgist_stats('spgist_idx');
+ */
+Datum
+spgist_stats(PG_FUNCTION_ARGS)
+{
+ text *name = PG_GETARG_TEXT_P(0);
+ RangeVar *relvar;
+ Relation index;
+ BlockNumber blkno;
+ BlockNumber totalPages = 0,
+ innerPages = 0,
+ leafPages = 0,
+ emptyPages = 0,
+ deletedPages = 0;
+ double usedSpace = 0.0,
+ usedLeafSpace = 0.0,
+ usedInnerSpace = 0.0;
+ char res[1024];
+ int bufferSize = -1;
+ int64 innerTuples = 0,
+ leafTuples = 0,
+ nAllTheSame = 0,
+ nLeafPlaceholder = 0,
+ nInnerPlaceholder = 0,
+ nLeafRedirect = 0,
+ nInnerRedirect = 0;
+
+ relvar = makeRangeVarFromNameList(textToQualifiedNameList(name));
+ index = relation_openrv(relvar, AccessExclusiveLock);
+
+ if (!IsIndex(index) || !IsSpGist(index))
+ elog(ERROR, "relation \"%s\" is not an SPGiST index",
+ RelationGetRelationName(index));
+
+ totalPages = RelationGetNumberOfBlocks(index);
+
+ for (blkno = SPGIST_ROOT_BLKNO; blkno < totalPages; blkno++)
+ {
+ Buffer buffer;
+ Page page;
+ int pageFree;
+
+ buffer = ReadBuffer(index, blkno);
+ LockBuffer(buffer, BUFFER_LOCK_SHARE);
+
+ page = BufferGetPage(buffer);
+
+ if (PageIsNew(page) || SpGistPageIsDeleted(page))
+ {
+ deletedPages++;
+ UnlockReleaseBuffer(buffer);
+ continue;
+ }
+
+ if (SpGistPageIsLeaf(page))
+ {
+ leafPages++;
+ leafTuples += PageGetMaxOffsetNumber(page);
+ nLeafPlaceholder += SpGistPageGetOpaque(page)->nPlaceholder;
+ nLeafRedirect += SpGistPageGetOpaque(page)->nRedirection;
+ }
+ else
+ {
+ int i,
+ max;
+
+ innerPages++;
+ max = PageGetMaxOffsetNumber(page);
+ innerTuples += max;
+ nInnerPlaceholder += SpGistPageGetOpaque(page)->nPlaceholder;
+ nInnerRedirect += SpGistPageGetOpaque(page)->nRedirection;
+ for (i = FirstOffsetNumber; i <= max; i++)
+ {
+ SpGistInnerTuple it;
+
+ it = (SpGistInnerTuple) PageGetItem(page,
+ PageGetItemId(page, i));
+ if (it->allTheSame)
+ nAllTheSame++;
+ }
+ }
+
+ if (bufferSize < 0)
+ bufferSize = BufferGetPageSize(buffer)
+ - MAXALIGN(sizeof(SpGistPageOpaqueData))
+ - SizeOfPageHeaderData;
+
+ pageFree = PageGetExactFreeSpace(page);
+
+ usedSpace += bufferSize - pageFree;
+ if (SpGistPageIsLeaf(page))
+ usedLeafSpace += bufferSize - pageFree;
+ else
+ usedInnerSpace += bufferSize - pageFree;
+
+ if (pageFree == bufferSize)
+ emptyPages++;
+
+ UnlockReleaseBuffer(buffer);
+ }
+
+ index_close(index, AccessExclusiveLock);
+
+ totalPages--; /* discount metapage */
+
+ snprintf(res, sizeof(res),
+ "totalPages: %u\n"
+ "deletedPages: %u\n"
+ "innerPages: %u\n"
+ "leafPages: %u\n"
+ "emptyPages: %u\n"
+ "usedSpace: %.2f kbytes\n"
+ "usedInnerSpace: %.2f kbytes\n"
+ "usedLeafSpace: %.2f kbytes\n"
+ "freeSpace: %.2f kbytes\n"
+ "fillRatio: %.2f%%\n"
+ "leafTuples: " INT64_FORMAT "\n"
+ "innerTuples: " INT64_FORMAT "\n"
+ "innerAllTheSame: " INT64_FORMAT "\n"
+ "leafPlaceholders: " INT64_FORMAT "\n"
+ "innerPlaceholders: " INT64_FORMAT "\n"
+ "leafRedirects: " INT64_FORMAT "\n"
+ "innerRedirects: " INT64_FORMAT,
+ totalPages, deletedPages, innerPages, leafPages, emptyPages,
+ usedSpace / 1024.0,
+ usedInnerSpace / 1024.0,
+ usedLeafSpace / 1024.0,
+ (((double) bufferSize) * ((double) totalPages) - usedSpace) / 1024,
+ 100.0 * (usedSpace / (((double) bufferSize) * ((double) totalPages))),
+ leafTuples, innerTuples, nAllTheSame,
+ nLeafPlaceholder, nInnerPlaceholder,
+ nLeafRedirect, nInnerRedirect);
+
+ PG_RETURN_TEXT_P(CStringGetTextDatum(res));
+}
+
+/*
+ * spgist_print
+ * Prints objects stored in GiST tree, works only if objects in index have
+ * textual representation (type_out functions should be implemented for given
+ * object type).
+ */
+Datum
+spgist_print(PG_FUNCTION_ARGS)
+{
+ FuncCallContext *funcctx;
+ SPGistPrint *prst;
+ SPGistPrintStackElem *s;
+ HeapTuple htuple;
+ Datum result;
+ MemoryContext oldcontext;
+
+ if (SRF_IS_FIRSTCALL())
+ {
+ text *name = PG_GETARG_TEXT_P(0);
+ RangeVar *relvar;
+ Relation index;
+ ItemPointerData ipd;
+ TupleDesc tupdesc;
+
+ funcctx = SRF_FIRSTCALL_INIT();
+ relvar = makeRangeVarFromNameList(textToQualifiedNameList(name));
+ index = relation_openrv(relvar, AccessExclusiveLock);
+
+ if (!IsIndex(index) || !IsSpGist(index))
+ elog(ERROR, "relation \"%s\" is not an SPGiST index",
+ RelationGetRelationName(index));
+
+ oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
+
+ prst = palloc(sizeof(*prst));
+
+ prst->index = index;
+ initSpGistState(&prst->state, index);
+
+ tupdesc = CreateTemplateTupleDesc(3 /* types */ + 1 /* level */ +
+ 1 /* nlabel */ + 2 /* tids */ +
+ 1, false);
+ TupleDescInitEntry(tupdesc, 1, "tid", TIDOID, -1, 0);
+ TupleDescInitEntry(tupdesc, 2, "allthesame", BOOLOID, -1, 0);
+ TupleDescInitEntry(tupdesc, 3, "node", INT4OID, -1, 0);
+ TupleDescInitEntry(tupdesc, 4, "level", INT4OID, -1, 0);
+ TupleDescInitEntry(tupdesc, 5, "tid_pointer", TIDOID, -1, 0);
+ TupleDescInitEntry(tupdesc, 6, "prefix",
+ (prst->state.attPrefixType.type == VOIDOID) ? INT4OID
+ : prst->state.attPrefixType.type,
+ -1, 0);
+ TupleDescInitEntry(tupdesc, 7, "label",
+ (prst->state.attLabelType.type == VOIDOID) ? INT4OID
+ : prst->state.attLabelType.type,
+ -1, 0);
+ TupleDescInitEntry(tupdesc, 8, "leaf",
+ (prst->state.attType.type == VOIDOID) ? INT4OID
+ : prst->state.attType.type,
+ -1, 0);
+
+ funcctx->slot = TupleDescGetSlot(tupdesc);
+ funcctx->attinmeta = TupleDescGetAttInMetadata(tupdesc);
+
+ funcctx->user_fctx = (void *) prst;
+
+ MemoryContextSwitchTo(oldcontext);
+
+ ItemPointerSet(&ipd, SPGIST_ROOT_BLKNO, FirstOffsetNumber);
+ prst->stack = NIL;
+ pushSPGistPrint(funcctx, prst, &ipd, 1);
+
+ PG_FREE_IF_COPY(name, 0);
+ }
+
+ funcctx = SRF_PERCALL_SETUP();
+ prst = (SPGistPrint *) (funcctx->user_fctx);
+
+next:
+ for (;;)
+ {
+ if (prst->stack == NIL)
+ {
+ close_spgist_print(prst);
+ SRF_RETURN_DONE(funcctx);
+ }
+
+ CHECK_FOR_INTERRUPTS();
+
+ s = (SPGistPrintStackElem *) linitial(prst->stack);
+ prst->stack = list_delete_first(prst->stack);
+
+ if (ItemPointerIsValid(&s->iptr))
+ break;
+ free(s);
+ }
+
+ do
+ {
+ Buffer buffer;
+ Page page;
+ SpGistDeadTuple dtuple;
+ ItemPointer tid;
+
+ buffer = ReadBuffer(prst->index, ItemPointerGetBlockNumber(&s->iptr));
+ LockBuffer(buffer, BUFFER_LOCK_SHARE);
+
+ page = BufferGetPage(buffer);
+ if (ItemPointerGetOffsetNumber(&s->iptr) > PageGetMaxOffsetNumber(page))
+ {
+ UnlockReleaseBuffer(buffer);
+ pfree(s);
+ goto next;
+ }
+
+ dtuple = (SpGistDeadTuple) PageGetItem(page,
+ PageGetItemId(page,
+ ItemPointerGetOffsetNumber(&s->iptr)));
+
+ if (dtuple->tupstate != SPGIST_LIVE)
+ {
+ UnlockReleaseBuffer(buffer);
+ pfree(s);
+ goto next;
+ }
+
+ if (SpGistPageIsLeaf(page))
+ {
+ SpGistLeafTuple leafTuple = (SpGistLeafTuple) dtuple;
+
+ tid = palloc(sizeof(ItemPointerData));
+ *tid = s->iptr;
+ prst->dvalues[0] = PointerGetDatum(tid);
+ prst->nulls[0] = false;
+ prst->nulls[1] = true;
+ prst->nulls[2] = true;
+ prst->dvalues[3] = s->level;
+ prst->nulls[3] = false;
+ prst->nulls[4] = true;
+ prst->nulls[5] = true;
+ prst->nulls[6] = true;
+ prst->dvalues[7] = datumCopy(SGLTDATUM(leafTuple, &prst->state),
+ prst->state.attType.attbyval,
+ prst->state.attType.attlen);
+ prst->nulls[7] = false;
+ }
+ else
+ {
+ SpGistInnerTuple innerTuple = (SpGistInnerTuple) dtuple;
+ int i;
+ SpGistNodeTuple node;
+
+ SGITITERATE(innerTuple, i, node)
+ {
+ if (ItemPointerIsValid(&node->t_tid))
+ {
+ if (i >= s->nlabel)
+ break;
+ }
+ }
+
+ if (i >= innerTuple->nNodes)
+ {
+ UnlockReleaseBuffer(buffer);
+ pfree(s);
+ goto next;
+
+ }
+
+ tid = palloc(sizeof(ItemPointerData));
+ *tid = s->iptr;
+ prst->dvalues[0] = PointerGetDatum(tid);
+ prst->nulls[0] = false;
+ prst->dvalues[1] = innerTuple->allTheSame;
+ prst->nulls[1] = false;
+ prst->dvalues[2] = Int32GetDatum(s->nlabel);
+ prst->nulls[2] = false;
+ prst->dvalues[3] = s->level;
+ prst->nulls[3] = false;
+ tid = palloc(sizeof(ItemPointerData));
+ *tid = node->t_tid;
+ prst->dvalues[4] = PointerGetDatum(tid);
+ prst->nulls[4] = false;
+ if (innerTuple->prefixSize > 0)
+ {
+ prst->dvalues[5] = datumCopy(SGITDATUM(innerTuple, &prst->state),
+ prst->state.attPrefixType.attbyval,
+ prst->state.attPrefixType.attlen);
+ prst->nulls[5] = false;
+ }
+ else
+ prst->nulls[5] = true;
+ if (!IndexTupleHasNulls(node))
+ {
+ prst->dvalues[6] = datumCopy(SGNTDATUM(node, &prst->state),
+ prst->state.attLabelType.attbyval,
+ prst->state.attLabelType.attlen);
+ prst->nulls[6] = false;
+ }
+ else
+ prst->nulls[6] = true;
+ prst->nulls[7] = true;
+
+ pushSPGistPrint(funcctx, prst, &node->t_tid, s->level + 1);
+ s->nlabel = i + 1;
+ oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
+ prst->stack = lcons(s, prst->stack);
+ MemoryContextSwitchTo(oldcontext);
+ s = NULL;
+ }
+
+ UnlockReleaseBuffer(buffer);
+ if (s)
+ pfree(s);
+ } while (0);
+
+ htuple = heap_form_tuple(funcctx->attinmeta->tupdesc,
+ prst->dvalues,
+ prst->nulls);
+ result = TupleGetDatum(funcctx->slot, htuple);
+
+ SRF_RETURN_NEXT(funcctx, result);
+}
diff --git a/contrib/pageinspect/sql/gin.sql b/contrib/pageinspect/sql/gin.sql
index d516ed3..45a136f 100644
--- a/contrib/pageinspect/sql/gin.sql
+++ b/contrib/pageinspect/sql/gin.sql
@@ -17,3 +17,15 @@ SELECT COUNT(*) > 0
FROM gin_leafpage_items(get_raw_page('test1_y_idx',
(pg_relation_size('test1_y_idx') /
current_setting('block_size')::bigint)::int - 1));
+
+\x
+
+CREATE TABLE test__int(a int[]);
+\copy test__int from 'data/test__int.data'
+
+CREATE INDEX gin_idx ON test__int USING gin ( a );
+
+INSERT INTO test__int ( SELECT ARRAY[t] || '{1000}'::_int4 FROM generate_series (1,300) as t );
+INSERT INTO test__int ( SELECT ARRAY[t] || '{1001}'::_int4 FROM generate_series (1,300) as t, generate_series(1,12) );
+VACUUM ANALYZE test__int;
+SELECT * FROM gin_value_count('gin_idx') as t(value int, nrow int);
diff --git a/contrib/pageinspect/sql/gist.sql b/contrib/pageinspect/sql/gist.sql
new file mode 100644
index 0000000..04e7daf
--- /dev/null
+++ b/contrib/pageinspect/sql/gist.sql
@@ -0,0 +1,6 @@
+CREATE TABLE gist_table (t box);
+\copy gist_table from 'data/rect.data'
+
+CREATE INDEX gist_idx ON gist_table USING gist (t);
+
+SELECT gist_stats('gist_idx');
diff --git a/contrib/pageinspect/sql/spgist.sql b/contrib/pageinspect/sql/spgist.sql
new file mode 100644
index 0000000..2bb6ac5
--- /dev/null
+++ b/contrib/pageinspect/sql/spgist.sql
@@ -0,0 +1,11 @@
+CREATE TABLE spgist_table (t box);
+\copy spgist_table from 'data/rect.data'
+
+SELECT center(t) AS p INTO spgist_table_p FROM spgist_table;
+
+CREATE INDEX spgist_idx ON spgist_table_p USING spgist (p);
+CREATE INDEX kdspgist_idx ON spgist_table_p USING spgist (p kd_point_ops);
+
+SELECT spgist_stats('spgist_idx');
+SELECT * FROM spgist_print('kdspgist_idx') as t(tid tid, allthesame bool, node_n int, level int, tid_pointer tid, prefix float8, node_label int, leaf_value point);
+SELECT * FROM spgist_print('spgist_idx') as t(tid tid, allthesame bool, node_n int, level int, tid_pointer tid, prefix point, node_label int, leaf_value point) WHERE level = 1;
diff --git a/doc/src/sgml/pageinspect.sgml b/doc/src/sgml/pageinspect.sgml
index ccdaf3e..b5d7d85 100644
--- a/doc/src/sgml/pageinspect.sgml
+++ b/doc/src/sgml/pageinspect.sgml
@@ -484,6 +484,119 @@ test=# SELECT * FROM brin_page_items(get_raw_page('brinidx', 5),
<variablelist>
<varlistentry>
<term>
+ <function>gin_value_count(gin_index text) returns setof record</function>
+ <indexterm>
+ <primary>gin_value_count</primary>
+ </indexterm>
+ </term>
+
+ <listitem>
+ <para>
+ <function>gin_value_count</function> prints estimated counts for each
+ indexed values, single-argument function will return result for a first
+ column of index. For example:
+<screen>
+test=# SELECT * FROM gin_value_count('gin_idx') as t(value int, nrow int) where nrow > 250;
+ value | nrow
+ -------+------
+ 31 | 254
+ 47 | 251
+ 52 | 257
+ 59 | 259
+</screen>
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>
+ <function>gin_value_count(gin_index text, colnumber int) returns setof record</function>
+ <indexterm>
+ <primary>gin_value_count</primary>
+ </indexterm>
+ </term>
+
+ <listitem>
+ <para>
+ <function>gin_value_count</function> prints estimated counts for each
+ indexed value for a given column. For example:
+<screen>
+test=# SELECT * FROM gin_value_count('gin_idx', 0) as t(value int, nrow int) where nrow > 250;
+ value | nrow
+ -------+------
+ 31 | 254
+ 47 | 251
+ 52 | 257
+ 59 | 259
+</screen>
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>
+ <function>gin_count_estimate(gin_index text, query tsquery) returns bigint</function>
+ <indexterm>
+ <primary>gin_count_estimate</primary>
+ </indexterm>
+ </term>
+
+ <listitem>
+ <para>
+ <function>gin_count_estimate</function> outputs number of indexed
+ rows matched query. It doesn't touch heap at all. For example:
+<screen>
+test=# select gin_count_estimate('qq', 'star');
+ gin_count_estimate
+--------------------
+ 790
+</screen>
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ <varlistentry>
+ <term>
+ <function>gin_stats(gin_index text) returns text</function>
+ <indexterm>
+ <primary>gin_stats</primary>
+ </indexterm>
+ </term>
+
+ <listitem>
+ <para>
+ <function>gin_stats</function> Prints various statistics about index
+ internals. For example:
+<screen>
+test=# SELECT gin_stats('gin_idx');
+ gin_stats
+------------------------------
+ totalPages: 32 +
+ dataPages: 1 +
+ dataInnerPages: 0 +
+ dataLeafPages: 1 +
+ dataInnerFreeSpace: 0 +
+ dataLeafFreeSpace: 4454 +
+ dataInnerTuplesCount: 0 +
+ dataLeafIptrsCount: 3600 +
+ entryPages: 31 +
+ entryInnerPages: 21 +
+ entryLeafPages: 10 +
+ entryInnerFreeSpace: 15160+
+ entryLeafFreeSpace: 32788+
+ entryInnerTuplesCount: 7810 +
+ entryLeafTuplesCount: 305 +
+ entryPostingSize: 42122+
+ entryPostingCount: 96759+
+ entryAttrSize: 64924+
+</screen>
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>
<function>gin_metapage_info(page bytea) returns record</function>
<indexterm>
<primary>gin_metapage_info</primary>
@@ -712,4 +825,281 @@ mapp | {65,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
</variablelist>
</sect2>
+ <sect2>
+ <title>GiST Functions</title>
+
+ <variablelist>
+ <varlistentry>
+ <term>
+ <function>gist_stats(indexname text) returns text</function>
+ <indexterm>
+ <primary>gist_stats</primary>
+ </indexterm>
+ </term>
+
+ <listitem>
+ <para>
+ <function>gist_stats</function> returns information about
+ a <acronym>GiST</acronym> index. For example:
+<screen>
+test=# SELECT gist_stats('gist_index');
+ gist_stats
+-----------------------------------------
+ Number of levels: 2 +
+ Number of pages: 29 +
+ Number of leaf pages: 28 +
+ Number of tuples: 3406 +
+ Number of invalid tuples: 0 +
+ Number of leaf tuples: 3378 +
+ Total size of tuples: 143516 bytes+
+ Total size of leaf tuples: 142296 bytes+
+ Total size of index: 237568 bytes+
+</screen>
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>
+ <function>gist_tree(indexname text, maxlevel int4) returns text</function>
+ <indexterm>
+ <primary>gist_tree</primary>
+ </indexterm>
+ </term>
+ <listitem>
+ <para>
+ <function>gist_tree</function> shows <acronym>GiST</acronym> tree up to
+ <parameter>maxlevel</parameter>. For example:
+<screen>
+test=# SELECT gist_tree('gist_index', 0);
+ 0(l:0) blk: 0 numTuple: 29 free: 6888b(15.63%)
+</screen>
+ Designation (from left to right):
+ <itemizedlist>
+ <listitem>
+ <para>0 - page number</para>
+ </listitem>
+ <listitem>
+ <para>(l:0) - tree level</para>
+ </listitem>
+ <listitem>
+ <para>blk: 0 - block number</para>
+ </listitem>
+ <listitem>
+ <para>numTuple: 29 - the number of tuples</para>
+ </listitem>
+ <listitem>
+ <para>free: 6888b - free space in bytes</para>
+ </listitem>
+ <listitem>
+ <para>(15.63%) - occupied space in percents</para>
+ </listitem>
+ </itemizedlist>
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>
+ <function>gist_tree(indexname text) returns text</function>
+ <indexterm>
+ <primary>gist_tree</primary>
+ </indexterm>
+ </term>
+ <listitem>
+ <para>
+ <function>gist_tree</function> shows full <acronym>GiST</acronym> tree.
+ For example:
+<screen>
+test=# SELECT gist_tree('gist_index');
+ 0(l:0) blk: 0 numTuple: 29 free: 6888b(15.63%)
+ 1(l:1) blk: 13 numTuple: 180 free: 244b(97.01%)
+ 2(l:1) blk: 11 numTuple: 175 free: 464b(94.32%)
+ 3(l:1) blk: 2 numTuple: 101 free: 3720b(54.43%)
+ 4(l:1) blk: 17 numTuple: 111 free: 3280b(59.82%)
+ 5(l:1) blk: 18 numTuple: 101 free: 3720b(54.43%)
+ 6(l:1) blk: 10 numTuple: 98 free: 3852b(52.82%)
+ 7(l:1) blk: 19 numTuple: 111 free: 3280b(59.82%)
+ 8(l:1) blk: 9 numTuple: 97 free: 3896b(52.28%)
+ 9(l:1) blk: 20 numTuple: 104 free: 3588b(56.05%)
+ 10(l:1) blk: 14 numTuple: 96 free: 3940b(51.74%)
+ 11(l:1) blk: 21 numTuple: 106 free: 3500b(57.13%)
+ 12(l:1) blk: 7 numTuple: 103 free: 3632b(55.51%)
+ 13(l:1) blk: 1 numTuple: 101 free: 3720b(54.43%)
+ 14(l:1) blk: 16 numTuple: 97 free: 3896b(52.28%)
+ 15(l:1) blk: 24 numTuple: 103 free: 3632b(55.51%)
+ 16(l:1) blk: 4 numTuple: 98 free: 3852b(52.82%)
+ 17(l:1) blk: 25 numTuple: 98 free: 3852b(52.82%)
+ 18(l:1) blk: 3 numTuple: 97 free: 3896b(52.28%)
+ 19(l:1) blk: 26 numTuple: 96 free: 3940b(51.74%)
+ 20(l:1) blk: 6 numTuple: 103 free: 3632b(55.51%)
+ 21(l:1) blk: 8 numTuple: 162 free: 1036b(87.31%)
+ 22(l:1) blk: 23 numTuple: 94 free: 4028b(50.66%)
+ 23(l:1) blk: 12 numTuple: 82 free: 4556b(44.19%)
+ 24(l:1) blk: 27 numTuple: 105 free: 3544b(56.59%)
+ 25(l:1) blk: 5 numTuple: 90 free: 4204b(48.51%)
+ 26(l:1) blk: 28 numTuple: 100 free: 3764b(53.90%)
+ 27(l:1) blk: 22 numTuple: 101 free: 3720b(54.43%)
+ 28(l:1) blk: 15 numTuple: 95 free: 3984b(51.20%)
+ 29(l:1) blk: 29 numTuple: 95 free: 3984b(51.20%)
+</screen>
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>
+ <function>gist_print(indexname text) returns setof record</function>
+ <indexterm>
+ <primary>gist_print</primary>
+ </indexterm>
+ </term>
+ <listitem>
+ <para>
+ <function>gist_print</function> prints objects stored in
+ <acronym>GiST</acronym> tree, works only if objects in index have
+ textual representation (<function>type_out</function> functions should be
+ implemented for the given object type). It's known to work with R-tree
+ <acronym>GiST</acronym> based index. Note, in example below, objects are
+ of type box. For example:
+<screen>
+test=# SELECT * FROM gist_print('gist_index') AS t(level int, valid bool, a box) WHERE level = 1;
+ level | valid | a
+-------+-------+-----------------------------
+ 1 | t | (37357,50073),(34242,357)
+ 1 | t | (43499,49770),(40358,43)
+ 1 | t | (31193,24679),(25047,12410)
+ 1 | t | (31018,12142),(25083,6)
+ 1 | t | (49944,25174),(43471,12802)
+ 1 | t | (12577,49757),(6302,37534)
+ 1 | t | (12528,37333),(6171,24861)
+ 1 | t | (50027,49751),(46817,25462)
+ 1 | t | (46870,49912),(43664,25722)
+ 1 | t | (24855,25574),(12447,19263)
+ 1 | t | (25054,19126),(12403,12796)
+ 1 | t | (32737,49923),(31178,1038)
+ 1 | t | (3184,24465),(15,81)
+ 1 | t | (24951,49983),(12740,44000)
+ 1 | t | (24919,43956),(12617,37901)
+ 1 | t | (40387,49852),(37338,25217)
+ 1 | t | (40325,24963),(37375,491)
+ 1 | t | (24919,12698),(12654,6518)
+ 1 | t | (25002,6338),(12350,51)
+ 1 | t | (49985,12554),(43447,222)
+ 1 | t | (25003,37769),(12552,25573)
+ 1 | t | (34270,49382),(32763,594)
+ 1 | t | (6205,50012),(3,37527)
+ 1 | t | (6163,37358),(120,25034)
+ 1 | t | (12343,24542),(9295,294)
+ 1 | t | (9308,24151),(6234,620)
+ 1 | t | (6230,24629),(3169,108)
+ 1 | t | (31179,50040),(28113,25556)
+ 1 | t | (28048,49694),(25000,25000)
+</screen>
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </sect2>
+
+ <sect2>
+ <title>SP-GiST Functions</title>
+
+ <variablelist>
+ <varlistentry>
+ <term>
+ <function>spgist_stats(indexname text) returns text</function>
+ <indexterm>
+ <primary>spgist_stats</primary>
+ </indexterm>
+ </term>
+
+ <listitem>
+ <para>
+ <function>spgist_stats</function> returns information about
+ a <acronym>SP-GiST</acronym> index. For example:
+<screen>
+test=# SELECT spgist_stats('spgist_idx');
+ spgist_stats
+----------------------------------
+ totalPages: 21 +
+ deletedPages: 0 +
+ innerPages: 3 +
+ leafPages: 18 +
+ emptyPages: 1 +
+ usedSpace: 121.27 kbytes+
+ freeSpace: 46.07 kbytes +
+ fillRatio: 72.47% +
+ leafTuples: 3669 +
+ innerTuples: 20 +
+ innerAllTheSame: 0 +
+ leafPlaceholders: 569 +
+ innerPlaceholders: 0 +
+ leafRedirects: 0 +
+ innerRedirects: 0 +
+</screen>
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>
+ <function>spgist_print(indexname text) returns setof record</function>
+ <indexterm>
+ <primary>spgist_print</primary>
+ </indexterm>
+ </term>
+
+ <listitem>
+ <para>
+ <function>spgist_print</function> prints objects stored in
+ <acronym>SP-GiST</acronym> tree, works only if objects in index have
+ textual representation (<function>type_out</function> functions should
+ be implemented for the given object type).
+ <itemizedlist>
+ <listitem>
+ <para>
+ Note 1. in example below we used quad_point_ops which uses point
+ for leaf and prefix value, but doesn't use node_label at all.
+ Use type 'int' as dummy type for prefix or/and node_label.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Note 2.
+<screen>
+ quad_point_ops: prefix point, node_label int, leaf_value point
+ kd_point_ops: prefix float, node_label int, leaf_value point
+ text_ops: prefix text, node_label char, leaf_value text
+</screen>
+ </para>
+ </listitem>
+ </itemizedlist>
+ For example:
+<screen>
+test=# SELECT * FROM spgist_print('spgist_idx') as t
+ (
+ tid tid,
+ allthesame bool,
+ node_n int,
+ level int,
+ tid_pointer tid,
+ prefix point,
+ node_label int,
+ leaf_value point
+ ) where level = 1;
+ tid | allthesame | node_n | level | tid_pointer | prefix | node_label | leaf_value
+-------+------------+--------+-------+-------------+-------------------------------------+------------+------------
+ (1,1) | f | 0 | 1 | (5,4) | (24530.2070484581,23595.7092511013) | |
+ (1,1) | f | 1 | 1 | (5,3) | (24530.2070484581,23595.7092511013) | |
+ (1,1) | f | 2 | 1 | (5,2) | (24530.2070484581,23595.7092511013) | |
+ (1,1) | f | 3 | 1 | (5,1) | (24530.2070484581,23595.7092511013) | |
+
+</screen>
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </sect2>
+
</sect1>
--
2.7.4
Hi, Alexey!
On Fri, Jul 21, 2017 at 3:05 PM, Alexey Chernyshov <
a.chernyshov@postgrespro.ru> wrote:
the following patch transfers functionality from gevel module
(http://www.sai.msu.su/~megera/wiki/Gevel) which provides functions for
analyzing GIN and GiST indexes to pageinspect. Gevel was originally
designed by Oleg Bartunov, and Teodor Sigaev for developers of GiST and
GIN indexes.
It's very good that you've picked up this work! pageinspect is lacking of
this functionality.
Functions added:
- gist_stat(text) - shows statistics on GiST Tree
- gist_tree(text) - shows GiST tree
- gist_tree(text, int4) - shows GiST tree up to MAXLEVEL
- gist_print(text) - prints objects stored in GiST tree
- spgist_stat(text) - shows statistics on SP-GiST
- spgist_print(text) - prints objects stored in index
- gin_value_count() - originally gin_stat(text) - prints estimated counts
for index values
- gin_stats() - originally gin_statpage(text) - shows statistics
- gin_count_estimate(text, tsquery) - shows number of indexed rows matched
queryTests also transferred, docs for new functions are added. I run pgindent
over the code, but the result is different from those I expected, so I
leave
pgindented one.
The patch is applicable to the commit 866f4a7c210857aa342bf901558d17
0325094dde.
As we can see, gevel contains functions which analyze the whole index.
pageinspect is written in another manner: it gives you functionality to
analyze individual pages, tuples and so on.
Thus, we probably shouldn't try to move gevel functions to pageinspect "as
is". They should be rewritten in more granular manner as well as other
pageinspact functions are. Any other opinions?
------
Alexander Korotkov
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company
On Fri, Jul 21, 2017 at 8:05 AM, Alexey Chernyshov
<a.chernyshov@postgrespro.ru> wrote:
the following patch transfers functionality from gevel module
(http://www.sai.msu.su/~megera/wiki/Gevel) which provides functions for
analyzing GIN and GiST indexes to pageinspect. Gevel was originally
designed by Oleg Bartunov, and Teodor Sigaev for developers of GiST and
GIN indexes.
It's not clear from the web site in question that the relevant code is
released under the PostgreSQL license.
--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
On Mon, Jul 24, 2017 at 11:38 PM, Robert Haas <robertmhaas@gmail.com> wrote:
On Fri, Jul 21, 2017 at 8:05 AM, Alexey Chernyshov
<a.chernyshov@postgrespro.ru> wrote:the following patch transfers functionality from gevel module
(http://www.sai.msu.su/~megera/wiki/Gevel) which provides functions for
analyzing GIN and GiST indexes to pageinspect. Gevel was originally
designed by Oleg Bartunov, and Teodor Sigaev for developers of GiST and
GIN indexes.It's not clear from the web site in question that the relevant code is
released under the PostgreSQL license.
git clone git://sigaev.ru/gevel
from README.gevel
License
Stable version, included into PostgreSQL distribution, released under
BSD license. Development version, available from this site, released under
the GNU General Public License, version 2 (June 1991)
We would be happy to write anything community likes :)
--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
It's not clear from the web site in question that the relevant code is
released under the PostgreSQL license.
As author I allow to use this code in PostgreSQL and under its license.
--
Teodor Sigaev E-mail: teodor@sigaev.ru
WWW: http://www.sigaev.ru/
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
On Tue, Jul 25, 2017 at 5:57 AM, Teodor Sigaev <teodor@sigaev.ru> wrote:
It's not clear from the web site in question that the relevant code is
released under the PostgreSQL license.As author I allow to use this code in PostgreSQL and under its license.
Great. As long as all authors feel that way, we're fine.
--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
On Sat, Jul 22, 2017 at 12:05 AM, Alexey Chernyshov
<a.chernyshov@postgrespro.ru> wrote:
the following patch transfers functionality from gevel module
(http://www.sai.msu.su/~megera/wiki/Gevel) which provides functions for
analyzing GIN and GiST indexes to pageinspect. Gevel was originally
designed by Oleg Bartunov, and Teodor Sigaev for developers of GiST and
GIN indexes.Functions added:
- gist_stat(text) - shows statistics on GiST Tree
- gist_tree(text) - shows GiST tree
- gist_tree(text, int4) - shows GiST tree up to MAXLEVEL
- gist_print(text) - prints objects stored in GiST tree
- spgist_stat(text) - shows statistics on SP-GiST
- spgist_print(text) - prints objects stored in index
- gin_value_count() - originally gin_stat(text) - prints estimated counts
for index values
- gin_stats() - originally gin_statpage(text) - shows statistics
- gin_count_estimate(text, tsquery) - shows number of indexed rows matched
queryTests also transferred, docs for new functions are added. I run pgindent
over the code, but the result is different from those I expected, so I leave
pgindented one.
The patch is applicable to the commit
866f4a7c210857aa342bf901558d170325094dde.
Hi Alexey,
This patch still applies but doesn't build after commits 2cd70845 and c6293249.
ginfuncs.c:91:47: error: invalid type argument of ‘->’ (have
‘FormData_pg_attribute’)
st->index->rd_att->attrs[st->attnum]->attbyval,
...several similar errors...
For example, that expression needs to be changed to:
TupleDescAttr(st->index->rd_att, attnum)->attbyval
Here is some superficial review since I'm here:
+/*
+ * process_tuples
+ * Retrieves the number of TIDs in a tuple.
+ */
+static void
+process_tuple(FuncCallContext *funcctx, GinStatState * st, IndexTuple itup)
"process_tuples" vs "process_tuple"
+ /* do no distiguish various null category */
"do not distinguish various null categories"
+ st->nulls[0] = (st->category == GIN_CAT_NORM_KEY) ? false : true;
That's a long way to write (st->category != GIN_CAT_NORM_KEY)!
+ * We scaned the whole page, so we should take right page
"scanned"
+/*
+ * refind_position
+ * Refinds a previois position, at returns it has correctly
+ * set offset and buffer is locked.
+ */
"previous", s/, at returns/. On return/
+ memset(st->nulls, false, 2 * sizeof(*st->nulls));
"false" looks strange here where an int is expected. The size
expression is weird. I think you should just write:
st->nulls[0] = false;
st->nulls[1] = false;
Investigating the types more closely, I see that 'nulls' is declared
like this (in struct GinStatState):
+ char nulls[2];
Then later you do this:
+ htuple = heap_form_tuple(funcctx->attinmeta->tupdesc,
+ st->dvalues,
+ st->nulls);
But that's not OK, heap_form_tuple takes bool *. bool and char are
not interchangeable (they may have different sizes on some platforms,
among other problems, even though usually they are both 1 byte). So I
think you should declare it as "bool nulls[2]".
Meanwhile in TypeStorage you have a member "bool *nulls", which you
then initialise like so:
+ st->nulls = (char *) palloc((tupdesc->natts + 2) * sizeof(*st->nulls));
That cast is wrong.
+/*
+ * gin_count_estimate
+ * Outputs number of indexed rows matched query. It doesn't touch heap at
+ * all.
Maybe "... number of indexed rows matching query."?
+ if (attnum < 0 || attnum >= st->index->rd_att->natts)
+ elog(ERROR, "Wrong column's number");
+ st->attnum = attnum;
Maybe "invalid column number" or "invalid attribute number"?
+ elog(ERROR, "Column type is not a tsvector");
s/C/c/ (according to convention).
+ * Prints various stat about index internals.
s/stat/stats/
+ elog(ERROR, "Relation %s.%s is not an index",
s/R/r/
+ elog(ERROR, "Index %s.%s has wrong type",
s/I/i/
+ <function>gin_value_count</function> prints estimated counts for each
+ indexed values, single-argument function will return result for a first
+ column of index. For example:
"... for each indexed value. The single argument version will return
results for the first column of an index. For example:"
+ <function>gin_count_estimate</function> outputs number of indexed
+ rows matched query. It doesn't touch heap at all. For example:
"... outputs the number of indexed rows matched by a query. ..."
+ <function>gist_print</function> prints objects stored in
+ <acronym>GiST</acronym> tree, works only if objects in index have
+ textual representation (<function>type_out</function> functions should be
+ implemented for the given object type). It's known to work with R-tree
+ <acronym>GiST</acronym> based index. Note, in example below, objects are
+ of type box. For example:
"... prints objects stored in a GiST tree. it works only if the
objects in the index have textual representation (type_out functions
should be implemented for the given object type). It's known to work
with R-tree GiST-based indexes. Note: in the example below, objects
are of type box. For example:"
+ <function>gin_value_count</function> prints estimated counts for each
+ indexed value for a given column. For example:
Maybe "for a given column (starting from zero)"?
+ <function>spgist_print</function> prints objects stored in
+ <acronym>SP-GiST</acronym> tree, works only if objects in index have
+ textual representation (<function>type_out</function> functions should
+ be implemented for the given object type).
"... tree. It works only if ..."
+ Note 1. in example below we used quad_point_ops which uses point
+ for leaf and prefix value, but doesn't use node_label at all.
+ Use type 'int' as dummy type for prefix or/and node_label.
"... in the example ..."
A few random whitespace changes:
- (errmsg("must be superuser to use raw page functions"))));
+ (errmsg("must be superuser to use raw page functions")))
+ );
- opaq->flags, GIN_META)));
+ opaq->flags, GIN_META))
+ );
- flags[nflags++] = DirectFunctionCall1(to_hex32, Int32GetDatum(flagbits));
+ flags[nflags++] = DirectFunctionCall1(to_hex32,
+ Int32GetDatum(flagbits));
- (GIN_DATA | GIN_LEAF | GIN_COMPRESSED))));
+ (GIN_DATA | GIN_LEAF | GIN_COMPRESSED)))
+ );
--
Thomas Munro
http://www.enterprisedb.com
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
On Wed, 6 Sep 2017 22:56:45 +1200
Thomas Munro <thomas.munro@enterprisedb.com> wrote:
Hi Thomas,
Thanks a lot for your careful review.
This patch still applies but doesn't build after commits 2cd70845 and
c6293249.
Updated patch is attached.
Here is some superficial review since I'm here:
Thank you very much, I hope I corrected the most part of mistakes.
--
Alexey Chernyshov
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company
Attachments:
0001-gevel_to_pageinspect-v2.patchtext/x-patchDownload
diff --git a/contrib/pageinspect/Makefile b/contrib/pageinspect/Makefile
index 0a3cbee..f468d14 100644
--- a/contrib/pageinspect/Makefile
+++ b/contrib/pageinspect/Makefile
@@ -1,17 +1,18 @@
# contrib/pageinspect/Makefile
MODULE_big = pageinspect
-OBJS = rawpage.o heapfuncs.o btreefuncs.o fsmfuncs.o \
- brinfuncs.o ginfuncs.o hashfuncs.o $(WIN32RES)
+OBJS = rawpage.o heapfuncs.o btreefuncs.o fsmfuncs.o brinfuncs.o \
+ ginfuncs.o hashfuncs.o gistfuncs.o spgistfuncs.o $(WIN32RES)
EXTENSION = pageinspect
-DATA = pageinspect--1.5.sql pageinspect--1.5--1.6.sql \
- pageinspect--1.4--1.5.sql pageinspect--1.3--1.4.sql \
- pageinspect--1.2--1.3.sql pageinspect--1.1--1.2.sql \
- pageinspect--1.0--1.1.sql pageinspect--unpackaged--1.0.sql
+DATA = pageinspect--1.5.sql pageinspect--1.6--1.7.sql \
+ pageinspect--1.5--1.6.sql pageinspect--1.4--1.5.sql \
+ pageinspect--1.3--1.4.sql pageinspect--1.2--1.3.sql \
+ pageinspect--1.1--1.2.sql pageinspect--1.0--1.1.sql \
+ pageinspect--unpackaged--1.0.sql
PGFILEDESC = "pageinspect - functions to inspect contents of database pages"
-REGRESS = page btree brin gin hash
+REGRESS = page btree brin gin hash gist spgist
ifdef USE_PGXS
PG_CONFIG = pg_config
diff --git a/contrib/pageinspect/brinfuncs.c b/contrib/pageinspect/brinfuncs.c
index 13da761..5eb4b25 100644
--- a/contrib/pageinspect/brinfuncs.c
+++ b/contrib/pageinspect/brinfuncs.c
@@ -11,21 +11,21 @@
#include "pageinspect.h"
-#include "access/htup_details.h"
#include "access/brin.h"
#include "access/brin_internal.h"
#include "access/brin_page.h"
#include "access/brin_revmap.h"
#include "access/brin_tuple.h"
+#include "access/htup_details.h"
#include "catalog/index.h"
#include "catalog/pg_type.h"
#include "funcapi.h"
#include "lib/stringinfo.h"
+#include "miscadmin.h"
#include "utils/array.h"
#include "utils/builtins.h"
#include "utils/lsyscache.h"
#include "utils/rel.h"
-#include "miscadmin.h"
PG_FUNCTION_INFO_V1(brin_page_type);
diff --git a/contrib/pageinspect/data/rect.data b/contrib/pageinspect/data/rect.data
new file mode 100644
index 0000000..e32b6fe
--- /dev/null
+++ b/contrib/pageinspect/data/rect.data
@@ -0,0 +1,3378 @@
+(12699,9028,12654,8987)
+(22689,4680,22614,4626)
+(43263,47296,43217,47217)
+(6184,8397,6182,8379)
+(863,28537,788,28456)
+(33783,4733,33746,4693)
+(40456,47134,40426,47087)
+(45950,8153,45887,8060)
+(33433,36474,33399,36460)
+(41106,22017,41086,21962)
+(19214,36781,19179,36767)
+(11582,40823,11498,40737)
+(35565,5404,35546,5360)
+(26489,17387,26405,17356)
+(30874,13849,30796,13814)
+(38255,1619,38227,1593)
+(4445,32006,4405,31914)
+(3923,32921,3876,32913)
+(36054,39464,36032,39434)
+(46540,6780,46524,6758)
+(12184,45811,12118,45787)
+(13198,17090,13143,17051)
+(30939,44578,30865,44486)
+(12502,4939,12431,4902)
+(3250,1108,3169,1063)
+(34029,41240,33976,41180)
+(47057,44018,46967,43927)
+(699,10114,686,10058)
+(5925,26020,5845,25979)
+(9462,39388,9382,39388)
+(270,32616,226,32607)
+(3959,49145,3861,49115)
+(207,40886,179,40879)
+(48480,43312,48412,43233)
+(37183,37209,37161,37110)
+(13576,13505,13521,13487)
+(5877,1037,5818,1036)
+(6777,16694,6776,16692)
+(49362,13905,49299,13845)
+(29356,14606,29313,14562)
+(5492,6976,5441,6971)
+(288,49588,204,49571)
+(36698,37213,36682,37158)
+(718,41336,645,41272)
+(8725,23369,8660,23333)
+(40115,9894,40025,9818)
+(40051,41181,40015,41153)
+(5739,1740,5715,1731)
+(25120,27935,25054,27876)
+(27475,46084,27447,46003)
+\N
+(33197,3252,33161,3245)
+(10892,15691,10869,15662)
+(39012,44712,38995,44640)
+(4506,6484,4458,6459)
+(13970,26316,13964,26236)
+(28009,28104,27968,28030)
+(5991,27613,5906,27607)
+(23649,6338,23610,6314)
+(25942,10008,25911,9928)
+(25651,29943,25590,29906)
+\N
+(24555,40334,24546,40330)
+(46870,43762,46789,43709)
+\N
+(20030,2752,19945,2687)
+(30758,26754,30718,26678)
+\N
+(4320,44673,4286,44625)
+\N
+(1011,15576,939,15574)
+(41936,40699,41854,40655)
+(20594,19002,20561,18995)
+(9388,41056,9325,41042)
+(34771,46693,34751,46645)
+(49398,46359,49332,46357)
+\N
+(23115,35380,23036,35306)
+(46305,34840,46283,34765)
+(16768,21692,16691,21647)
+(28695,3128,28654,3112)
+(22182,7107,22107,7074)
+(14567,1210,14468,1139)
+(14156,37139,14136,37119)
+(33500,38351,33477,38286)
+(39983,41981,39944,41954)
+(26773,20824,26719,20813)
+(42516,22947,42460,22932)
+(26127,10701,26044,10650)
+(17808,13803,17724,13710)
+(14913,49873,14849,49836)
+(37013,820,36955,736)
+(39071,1399,39022,1381)
+\N
+(9785,42546,9687,42540)
+(13423,14066,13354,14052)
+(3417,14558,3336,14478)
+(25212,46368,25128,46316)
+(10124,39848,10027,39820)
+(39722,39226,39656,39162)
+(6298,28101,6250,28076)
+(45852,5846,45809,5750)
+(48292,4885,48290,4841)
+(18905,4454,18894,4424)
+(18965,43474,18902,43444)
+(39843,28239,39761,28199)
+(18087,44660,18019,44632)
+(33886,10382,33794,10286)
+(38383,13163,38362,13092)
+(18861,25050,18842,24965)
+(29887,14326,29806,14274)
+(18733,11644,18698,11644)
+(5119,37952,5089,37950)
+(16191,34884,16149,34864)
+(29544,1104,29496,1062)
+(27740,41555,27701,41540)
+(4672,4087,4633,4060)
+(45441,38994,45377,38958)
+(3272,1176,3232,1146)
+(12820,26606,12790,26575)
+(30910,7590,30877,7512)
+(42476,39152,42377,39127)
+(6562,38490,6542,38447)
+(30046,20332,29988,20259)
+(40723,15950,40671,15949)
+(4945,46857,4908,46817)
+(47986,16882,47963,16877)
+(9842,22339,9805,22305)
+(29831,23169,29818,23122)
+(12322,34404,12250,34312)
+(22846,11091,22759,10992)
+(47627,2424,47603,2397)
+(18375,43632,18347,43577)
+(40441,974,40394,965)
+(34260,10573,34194,10522)
+(32914,9549,32828,9503)
+(49023,37827,48978,37799)
+(22183,10691,22111,10669)
+\N
+(38036,15828,38014,15759)
+(34604,16801,34508,16746)
+(26737,29997,26675,29976)
+(47375,40298,47293,40210)
+(771,2661,732,2649)
+(28514,25659,28504,25577)
+(13438,46494,13376,46455)
+(7187,17877,7125,17786)
+(49957,43390,49897,43384)
+(26543,20067,26482,20057)
+(16416,29803,16385,29724)
+(36353,7484,36286,7414)
+(26498,3377,26415,3358)
+(28990,32205,28936,32193)
+(45005,3842,45001,3816)
+(21672,23566,21603,23566)
+(33360,43465,33302,43429)
+\N
+(29884,9544,29838,9520)
+\N
+(5599,15012,5596,14930)
+(22396,21481,22344,21422)
+(24810,14955,24780,14887)
+(47114,18866,47081,18784)
+(39013,39245,38953,39237)
+(12863,40534,12803,40529)
+(351,37068,310,37019)
+\N
+(12916,34327,12891,34240)
+\N
+(49191,2694,49170,2628)
+(24127,38407,24050,38325)
+(3264,23053,3213,23007)
+(8172,30385,8144,30336)
+(19630,35716,19573,35640)
+(42554,5148,42521,5117)
+(42168,33453,42136,33426)
+(17732,32093,17666,32057)
+(1039,16626,1037,16587)
+(21287,7757,21265,7679)
+(47063,8260,47039,8225)
+(38645,16238,38561,16204)
+(18258,25358,18196,25341)
+(30458,1742,30458,1695)
+(35147,9273,35121,9233)
+(7670,16625,7642,16545)
+(49503,23432,49484,23383)
+(31089,23146,31062,23093)
+(47758,2734,47670,2703)
+\N
+(35276,1027,35259,972)
+(26337,17603,26313,17579)
+(35649,16777,35626,16777)
+(42454,5105,42362,5101)
+(21682,24951,21646,24920)
+\N
+(48383,25174,48303,25156)
+(14672,3532,14601,3460)
+(22570,22587,22515,22512)
+(23566,25623,23484,25573)
+(9530,24542,9504,24459)
+(41271,451,41236,401)
+(5556,37528,5502,37527)
+(12479,25042,12447,24991)
+(16568,22916,16499,22864)
+(42700,13084,42676,12992)
+\N
+(35523,40973,35504,40932)
+(32948,16962,32857,16901)
+(7808,13469,7712,13469)
+(13920,35203,13870,35131)
+(22731,31563,22658,31557)
+\N
+(22909,43956,22900,43857)
+(33077,35080,33074,35030)
+(48064,29307,48022,29280)
+(20232,46682,20212,46613)
+(29949,16790,29867,16711)
+(30260,32029,30180,31979)
+(17184,34503,17110,34482)
+(16066,42687,16039,42648)
+(2947,19819,2857,19788)
+(4900,47934,4818,47894)
+(27193,19014,27174,18976)
+\N
+(15597,27948,15590,27939)
+(11090,28623,11002,28589)
+(26956,18651,26920,18620)
+(3107,47753,3103,47711)
+(6745,24151,6711,24083)
+(43923,19213,43871,19124)
+(33451,23578,33370,23534)
+(8944,20605,8862,20601)
+(14905,7536,14892,7441)
+(2412,18357,2383,18354)
+(37060,1443,36974,1366)
+(15501,6230,15429,6190)
+\N
+(30333,50,30273,6)
+(35567,9965,35482,9912)
+(49847,7128,49798,7067)
+\N
+(27685,36396,27668,36384)
+(43832,18491,43825,18431)
+(36849,34600,36785,34589)
+(2348,47938,2307,47902)
+\N
+(20473,22131,20445,22113)
+(38486,4293,38471,4288)
+(30611,30451,30553,30400)
+(3883,21299,3819,21260)
+(7696,37555,7644,37534)
+(22399,7913,22317,7911)
+(42565,38605,42500,38598)
+(36595,12151,36500,12106)
+(587,35217,571,35123)
+(5764,15300,5764,15231)
+(12003,21265,11983,21210)
+(42564,4803,42470,4737)
+(42359,36834,42271,36746)
+(44700,14680,44658,14670)
+(19690,5627,19620,5607)
+(17780,43602,17714,43565)
+(45073,3491,45041,3434)
+(35043,2136,35017,2084)
+\N
+(39653,19215,39646,19198)
+(23970,25560,23935,25502)
+(28698,49233,28600,49223)
+(30266,3605,30245,3540)
+(25538,7857,25500,7791)
+(17711,1757,17708,1756)
+(5248,594,5190,587)
+(2730,32454,2671,32436)
+(1722,49089,1635,49067)
+(40954,5743,40921,5722)
+\N
+(21382,4426,21298,4331)
+(7885,18629,7872,18605)
+(42838,6459,42748,6451)
+(8217,19894,8207,19845)
+(20489,18524,20433,18520)
+(17383,23559,17309,23515)
+(38952,38968,38934,38913)
+(44665,18137,44636,18051)
+(22416,41220,22383,41213)
+(9901,664,9818,646)
+(23475,21981,23449,21973)
+(41875,17991,41818,17988)
+(36517,47731,36509,47713)
+(37595,49849,37581,49834)
+(38771,32720,38748,32684)
+(810,38523,736,38452)
+(29695,14942,29665,14907)
+(31911,15168,31906,15113)
+(3454,36839,3438,36831)
+(4832,47554,4820,47473)
+\N
+(11590,8292,11539,8272)
+(8193,33323,8106,33317)
+(16043,14799,16001,14710)
+(19574,11395,19514,11316)
+(26290,41424,26224,41342)
+(22844,12516,22807,12471)
+\N
+(15709,49580,15655,49553)
+(13387,28084,13379,28066)
+(2780,38807,2690,38711)
+(22031,32458,22028,32377)
+(13511,3351,13440,3297)
+(14648,26473,14614,26383)
+(17798,19885,17726,19852)
+(32355,27940,32324,27861)
+(43773,21031,43767,20985)
+(15419,45759,15403,45666)
+(770,38863,729,38806)
+(21221,35619,21183,35596)
+(38924,31021,38894,30961)
+(7395,32439,7345,32416)
+(2324,25118,2268,25074)
+(2958,15089,2935,15087)
+(2424,160,2424,81)
+(12123,18644,12099,18616)
+(7459,30276,7422,30218)
+(15847,45488,15814,45428)
+(26409,29897,26389,29863)
+(12336,34322,12279,34322)
+(9440,23550,9396,23466)
+(4991,30850,4905,30768)
+(47262,11940,47201,11939)
+(30584,42868,30555,42838)
+(23144,24089,23056,24067)
+\N
+(35930,11609,35847,11573)
+(7812,17271,7789,17203)
+(17946,37554,17878,37480)
+(27356,32869,27298,32813)
+(29971,47783,29933,47697)
+(26075,46494,25988,46451)
+(39314,41366,39289,41269)
+(31708,42900,31688,42865)
+(4510,10231,4439,10203)
+(43806,8482,43758,8446)
+(45990,49694,45927,49617)
+(48815,27640,48782,27573)
+(41675,26733,41622,26723)
+(23229,7709,23175,7693)
+(48976,17733,48962,17731)
+(10686,41470,10597,41434)
+(18053,27059,17989,27012)
+\N
+(35495,25950,35459,25912)
+(41896,45014,41881,44999)
+(22654,41896,22572,41801)
+(18581,7087,18524,6988)
+\N
+(14697,22406,14681,22311)
+(40092,28122,40043,28030)
+(35844,24243,35816,24238)
+(1254,25653,1250,25644)
+(1603,21730,1556,21640)
+(33048,21779,32991,21763)
+(29979,1632,29916,1592)
+(8620,633,8580,620)
+(22992,27035,22932,27008)
+(21409,29315,21390,29309)
+(3610,44748,3547,44699)
+(20402,9318,20343,9267)
+(31001,8709,30908,8658)
+(46840,47640,46773,47551)
+(49173,4705,49143,4630)
+(5339,31657,5251,31622)
+(8644,49668,8630,49648)
+(45387,2893,45309,2885)
+(47641,31020,47584,30941)
+(40238,10636,40208,10568)
+(19247,36924,19227,36924)
+(917,19957,827,19887)
+(40967,17841,40870,17820)
+(15850,4109,15794,4085)
+(20181,30916,20085,30870)
+(161,24465,107,24374)
+(21737,49690,21667,49663)
+(10328,20911,10232,20852)
+(24187,49823,24128,49768)
+(36084,4578,36007,4501)
+(38771,31741,38673,31674)
+(2202,30102,2111,30006)
+(27322,16074,27228,16039)
+(6843,17280,6765,17248)
+(16972,39744,16912,39700)
+(10608,38741,10553,38708)
+\N
+(4917,34801,4828,34766)
+(39281,33659,39268,33618)
+(31706,7119,31645,7063)
+(3427,44006,3422,44004)
+\N
+(10134,42608,10044,42599)
+(26294,32080,26200,32068)
+(21777,34680,21769,34606)
+(23373,25957,23314,25915)
+(10710,8401,10681,8400)
+(42062,19458,42019,19394)
+(26530,43036,26458,43004)
+(3394,46081,3360,46077)
+(38743,33953,38677,33924)
+(32438,8226,32345,8160)
+(9210,27333,9118,27301)
+(19594,1600,19568,1551)
+(10003,12278,9952,12255)
+(31737,7206,31650,7146)
+(16594,15821,16502,15759)
+(28208,30296,28189,30278)
+(30602,46237,30555,46185)
+(20715,5155,20697,5140)
+(48892,35271,48793,35210)
+(3175,5590,3113,5525)
+(34220,27947,34132,27865)
+(35105,39792,35011,39727)
+(21919,27314,21839,27286)
+\N
+(23963,3723,23917,3699)
+(16312,14078,16236,14045)
+(19233,49824,19185,49794)
+(1447,11768,1356,11699)
+(17311,17709,17224,17653)
+(11962,31709,11871,31627)
+(21355,40131,21355,40085)
+(33750,35273,33724,35180)
+(38896,25539,38879,25524)
+(39569,44899,39569,44893)
+(11075,41547,11039,41500)
+(3215,12202,3199,12127)
+(46215,33458,46132,33455)
+(15121,38012,15083,37974)
+(44448,18726,44412,18690)
+(3899,38263,3870,38262)
+(13854,13353,13786,13298)
+(8252,5402,8191,5320)
+(46849,37968,46820,37897)
+(16422,13957,16376,13897)
+(47369,7665,47353,7629)
+(11982,40874,11956,40806)
+\N
+(9552,27580,9496,27562)
+(32247,19399,32176,19337)
+(32704,2169,32635,2091)
+(7471,44213,7411,44130)
+(48433,7096,48379,7089)
+(37357,6543,37338,6452)
+(30460,29624,30433,29535)
+(20350,28794,20341,28705)
+(6326,32360,6267,32317)
+(1711,47519,1654,47430)
+(49540,16510,49521,16426)
+\N
+(26975,618,26908,579)
+(24118,30880,24020,30821)
+(3675,15477,3625,15418)
+(44953,9577,44953,9530)
+(38323,7965,38235,7910)
+(6629,36482,6579,36448)
+(33953,16460,33878,16408)
+(49222,16790,49186,16695)
+(17308,16951,17274,16904)
+(14135,6888,14077,6833)
+(38617,47768,38603,47760)
+(7345,10992,7290,10914)
+(35261,42152,35176,42096)
+(28586,4809,28544,4735)
+(37521,25299,37495,25217)
+(41941,17954,41912,17915)
+(1209,46863,1171,46863)
+(20103,34947,20048,34896)
+(32716,33816,32656,33769)
+(11113,6531,11036,6467)
+(48635,7321,48563,7262)
+(28435,37059,28349,37014)
+(12311,17208,12232,17112)
+(1466,48010,1379,48008)
+(11226,11997,11223,11925)
+(46896,32540,46821,32510)
+(32661,31255,32632,31187)
+(37739,20376,37655,20306)
+(44002,43326,43920,43257)
+(30337,1023,30271,968)
+(34436,23357,34432,23345)
+\N
+(21367,8168,21353,8091)
+(36370,21611,36369,21569)
+(4152,36488,4080,36476)
+(17696,13924,17664,13853)
+(34252,19395,34159,19316)
+(12574,3072,12573,2975)
+(3995,21243,3943,21167)
+(44553,30126,44513,30108)
+\N
+(4599,45275,4552,45254)
+(33191,11404,33176,11348)
+\N
+(14245,18633,14177,18540)
+(32457,20705,32393,20700)
+(40052,10499,40016,10457)
+(29824,44065,29785,44037)
+(31613,12565,31557,12543)
+(42692,29000,42652,28996)
+\N
+(40680,22219,40603,22140)
+\N
+(33575,27661,33488,27644)
+(46194,1385,46184,1355)
+(38442,48501,38407,48426)
+(25305,21544,25236,21523)
+(15562,8226,15561,8208)
+\N
+(20844,43614,20752,43558)
+(22566,30541,22554,30532)
+(2760,47802,2672,47789)
+(25515,30745,25433,30675)
+(48382,45134,48382,45093)
+(9940,27094,9871,27087)
+\N
+(48690,44361,48610,44338)
+(18992,11585,18899,11582)
+(21551,49983,21492,49885)
+(46778,29113,46770,29071)
+(43219,9593,43212,9548)
+(40291,1248,40224,1190)
+(12687,22225,12635,22219)
+(49372,38790,49306,38721)
+(49503,46808,49411,46798)
+(24745,5162,24732,5138)
+(5046,26517,5023,26424)
+(5583,46538,5495,46531)
+(6084,35950,6079,35895)
+(3503,23096,3437,23024)
+\N
+(45275,8420,45244,8418)
+(13514,45251,13491,45249)
+(42112,2748,42047,2668)
+\N
+(7810,21907,7806,21878)
+(48378,36029,48303,35979)
+(32568,48605,32510,48563)
+(859,18915,810,18915)
+(41963,17950,41939,17915)
+\N
+(42723,8031,42685,7955)
+\N
+(19587,5965,19556,5961)
+(8713,33083,8629,32996)
+(21243,7769,21226,7740)
+(43752,43026,43720,42944)
+(7883,41311,7859,41242)
+(10178,47874,10157,47826)
+(32177,48725,32093,48646)
+(22960,2784,22953,2774)
+(25101,49159,25087,49090)
+(32142,48915,32086,48850)
+(6636,44887,6590,44825)
+(37814,11606,37769,11578)
+(2870,23198,2820,23121)
+(21025,16364,20947,16271)
+(31341,36137,31269,36114)
+(38921,7906,38888,7831)
+(6966,17259,6922,17199)
+(32426,13344,32401,13253)
+(8084,30572,8078,30572)
+(42230,47674,42150,47603)
+(20724,44854,20724,44830)
+(27471,38453,27454,38430)
+(24590,37973,24544,37941)
+(45832,26077,45772,26031)
+(9589,24239,9582,24156)
+(37484,49472,37409,49432)
+(30044,19340,30004,19333)
+(16966,14632,16936,14572)
+(9439,40491,9403,40482)
+(28945,5814,28913,5805)
+(43788,41302,43746,41231)
+(33631,43451,33614,43354)
+(17590,49396,17510,49324)
+(15173,32572,15109,32507)
+(1912,23580,1840,23504)
+(38165,16185,38076,16154)
+(6729,1179,6637,1177)
+\N
+(6994,45406,6983,45325)
+(2912,21327,2908,21305)
+(14678,14244,14659,14222)
+(29944,14959,29898,14900)
+(47432,35658,47407,35610)
+(25542,39243,25466,39149)
+(5330,7206,5304,7165)
+(24790,27196,24695,27118)
+(38806,1961,38795,1906)
+(23290,4487,23212,4416)
+\N
+(35035,24337,34990,24297)
+(5549,38948,5549,38891)
+(24558,15492,24501,15425)
+(4636,3011,4574,2933)
+(26522,39986,26451,39940)
+(33486,18424,33410,18366)
+(36638,14324,36625,14287)
+(35115,41236,35055,41191)
+(31927,16896,31841,16806)
+(5796,43937,5697,43886)
+(25681,41645,25663,41608)
+(10962,42777,10894,42732)
+(32715,11026,32672,10991)
+(45803,20406,45710,20371)
+(34730,17672,34658,17606)
+(8809,6323,8798,6232)
+\N
+(39471,23837,39390,23749)
+\N
+(34078,17435,33987,17433)
+(9133,4544,9041,4509)
+(47274,29126,47242,29060)
+(6404,28488,6403,28475)
+(48894,49751,48846,49694)
+(17324,43023,17301,42972)
+(15599,8433,15557,8386)
+(48575,10202,48488,10175)
+(27638,24428,27608,24378)
+(45277,47456,45240,47422)
+(26482,46607,26482,46570)
+(41400,33898,41397,33802)
+\N
+(49853,18504,49848,18503)
+(11528,25165,11476,25080)
+(49902,41752,49818,41746)
+(1956,47506,1922,47424)
+(21834,22058,21802,21964)
+\N
+(19414,21842,19386,21822)
+(34801,13722,34744,13681)
+(13924,29243,13835,29160)
+(47749,21986,47664,21894)
+(47051,39582,46974,39489)
+(31287,49923,31236,49913)
+(47429,8625,47337,8585)
+(46987,44364,46901,44277)
+(16158,27510,16099,27467)
+(41184,6400,41148,6317)
+(1847,42471,1829,42426)
+\N
+(14409,48602,14320,48555)
+\N
+(38137,42951,38045,42918)
+(42875,2312,42832,2243)
+(27242,30617,27181,30535)
+(24882,44559,24812,44548)
+(22021,1596,22015,1581)
+(24300,1523,24250,1443)
+(43946,35909,43869,35868)
+(816,15988,776,15967)
+(25243,9401,25237,9332)
+(27967,25958,27928,25949)
+(6575,33949,6484,33900)
+(44812,35980,44800,35913)
+(37577,13064,37495,13019)
+\N
+(30891,29967,30814,29884)
+(15829,28836,15753,28807)
+(11128,34180,11126,34117)
+(9834,12537,9801,12508)
+(4899,29069,4809,29024)
+(29370,38459,29276,38382)
+(40743,46653,40647,46559)
+(9618,2723,9578,2631)
+(32542,26837,32515,26769)
+(5625,13409,5576,13355)
+(47490,19229,47472,19203)
+(48118,40275,48063,40203)
+(19245,20549,19227,20546)
+(25312,22243,25280,22164)
+(18797,28934,18723,28881)
+(31609,49393,31512,49366)
+(26183,32888,26135,32824)
+(46198,26153,46180,26149)
+\N
+(45383,16904,45353,16888)
+(7132,11408,7091,11338)
+(48262,43227,48236,43159)
+(31722,12861,31675,12810)
+\N
+(41695,48924,41691,48921)
+(48318,12877,48287,12802)
+(12069,32241,11978,32231)
+(8395,2694,8380,2661)
+(19552,34590,19550,34497)
+(12203,26166,12187,26143)
+(35745,9571,35654,9542)
+(22384,22535,22352,22439)
+(21459,28189,21360,28189)
+(7418,7203,7343,7182)
+(39497,48412,39413,48318)
+(1058,11132,979,11051)
+(45623,31417,45548,31381)
+\N
+(23887,31921,23876,31891)
+(7797,1244,7785,1155)
+(23679,43650,23594,43644)
+(21891,30561,21833,30485)
+(4069,6870,4019,6785)
+(5134,25117,5103,25034)
+(36101,41895,36085,41810)
+(39617,39211,39544,39191)
+(37437,6604,37434,6585)
+\N
+(7749,32601,7740,32515)
+(26203,34991,26159,34946)
+(31856,39006,31783,39003)
+(45828,24767,45788,24723)
+\N
+(49836,35965,49757,35871)
+(44113,49024,44033,48995)
+(38237,22326,38187,22253)
+(45235,19087,45190,19005)
+(1588,45285,1520,45254)
+(46628,8701,46552,8665)
+(47707,18258,47668,18250)
+(9377,26162,9325,26079)
+(28331,16766,28302,16731)
+(15792,27875,15727,27809)
+(16454,1972,16415,1967)
+(21012,15828,20972,15784)
+(27465,30603,27390,30560)
+(39256,7697,39225,7604)
+(25908,32801,25854,32770)
+(25215,40109,25201,40106)
+\N
+(23280,4613,23190,4596)
+(32440,30879,32405,30807)
+(49156,4224,49126,4126)
+(20005,40423,19911,40370)
+(20978,8226,20930,8170)
+(32127,22611,32126,22579)
+(21764,26509,21701,26455)
+\N
+(32923,2834,32914,2830)
+(7499,25331,7426,25300)
+(6163,36942,6107,36908)
+(41118,14583,41034,14486)
+(21211,33369,21208,33331)
+(7899,27682,7853,27603)
+(16546,48436,16535,48400)
+(24898,40195,24855,40174)
+(43029,982,43004,952)
+(26266,7962,26252,7950)
+\N
+(11308,44367,11210,44322)
+(8902,28402,8808,28334)
+(11671,19619,11665,19549)
+(47202,23593,47153,23505)
+(21981,40220,21905,40160)
+(46721,2514,46687,2471)
+(3450,33839,3424,33811)
+(41854,45864,41762,45792)
+(40183,47816,40114,47742)
+(26119,33910,26077,33816)
+(3430,16518,3365,16500)
+(40063,32176,40005,32166)
+(38702,15253,38679,15187)
+(17719,12291,17658,12257)
+(46131,30669,46068,30587)
+(42738,10952,42731,10907)
+(8721,45155,8650,45076)
+(45317,26123,45244,26113)
+(42694,11561,42614,11490)
+(10043,12479,10009,12391)
+(27584,2345,27578,2257)
+(30889,8253,30866,8167)
+\N
+(5176,48928,5107,48838)
+(9781,21023,9745,20976)
+(32430,27908,32404,27859)
+(3984,7391,3973,7352)
+(18904,8094,18842,8091)
+(20573,5508,20482,5496)
+(7806,44368,7753,44297)
+(18875,41452,18817,41376)
+(6632,12142,6566,12079)
+(33066,17865,33055,17854)
+(45726,19628,45714,19589)
+(26971,18459,26941,18423)
+(26554,23641,26515,23592)
+(45503,1325,45441,1231)
+(11898,20164,11880,20115)
+(27868,22837,27843,22776)
+(34931,8206,34855,8144)
+(42375,33603,42350,33539)
+(3184,8308,3129,8238)
+(26667,15813,26661,15785)
+\N
+(5760,49617,5730,49546)
+(794,27001,777,26992)
+(13518,45289,13459,45235)
+\N
+(34430,29754,34363,29736)
+(37912,24574,37880,24543)
+(8130,2270,8083,2258)
+\N
+(26930,21516,26848,21455)
+(3634,33511,3592,33489)
+(33080,5036,33035,4972)
+(48389,13942,48316,13915)
+(9231,5298,9150,5232)
+(1357,10601,1321,10548)
+\N
+(35175,15295,35091,15269)
+(33917,36863,33879,36784)
+(8279,12052,8239,12021)
+(11868,19083,11862,19034)
+(24019,30777,24006,30703)
+(44619,6959,44618,6938)
+(28610,2626,28523,2582)
+(29579,41801,29482,41775)
+(23448,37609,23396,37534)
+(40676,11252,40670,11191)
+(39656,14077,39564,13999)
+(33060,31042,33033,30950)
+(11720,6816,11654,6792)
+(13775,28873,13730,28868)
+(47851,39121,47802,39084)
+(30923,40255,30860,40199)
+(44169,15070,44085,15015)
+(42574,28664,42558,28590)
+(8993,43487,8941,43460)
+(40782,11648,40763,11631)
+(18516,10143,18423,10137)
+(39068,551,39005,491)
+\N
+(39672,12000,39575,11913)
+(18508,37761,18464,37712)
+(19083,35318,19079,35280)
+(30286,13736,30222,13672)
+(7223,9164,7132,9069)
+(20764,29286,20700,29210)
+(5733,8063,5699,8058)
+(8566,43873,8549,43797)
+(22126,27444,22062,27366)
+(15105,8717,15078,8660)
+(43987,33145,43940,33083)
+\N
+(46833,38652,46755,38612)
+(47768,27202,47681,27169)
+(22792,1183,22731,1152)
+(25650,43310,25562,43247)
+(37084,20116,37045,20057)
+(47461,32556,47423,32555)
+\N
+(41225,18124,41215,18117)
+(17623,25218,17553,25158)
+(13770,21703,13770,21700)
+(48958,35441,48870,35388)
+(2976,1808,2892,1802)
+(45118,22318,45049,22224)
+(42287,26616,42281,26560)
+(25525,6327,25468,6244)
+\N
+(40756,31634,40713,31568)
+(23105,26565,23078,26565)
+(48268,39862,48265,39827)
+(41656,26254,41567,26243)
+(28062,17920,28045,17825)
+(6443,17321,6402,17238)
+(10191,45466,10151,45447)
+(18097,39706,18043,39649)
+(37592,3244,37569,3197)
+(29809,5978,29762,5950)
+(12145,11251,12130,11202)
+(37507,42999,37446,42956)
+(10820,2866,10782,2830)
+(36440,42904,36421,42832)
+(38370,3386,38279,3311)
+(9345,17279,9313,17197)
+(20477,14864,20395,14807)
+(37147,37769,37110,37729)
+(15325,36135,15284,36053)
+(29034,32897,29009,32854)
+(2116,22274,2037,22216)
+(15078,38330,15048,38251)
+(7968,33600,7914,33573)
+(832,23851,770,23786)
+(38669,4348,38594,4344)
+(8521,48573,8425,48564)
+(1060,43320,969,43289)
+(26170,10150,26144,10069)
+(32324,8539,32285,8506)
+(13121,18044,13109,18021)
+(1597,9383,1594,9367)
+(49539,35164,49505,35065)
+(39464,10295,39409,10261)
+(8921,37898,8825,37803)
+(31171,47076,31093,47039)
+(7178,41397,7108,41304)
+(16240,34832,16162,34761)
+(2829,20119,2782,20091)
+(45854,21265,45810,21250)
+(6382,12106,6315,12030)
+(22301,46291,22291,46274)
+(34142,14181,34078,14158)
+(11258,29748,11198,29742)
+\N
+(37450,6943,37398,6882)
+(41675,27207,41643,27130)
+(13578,49562,13573,49479)
+(37132,37397,37081,37301)
+(49404,37193,49332,37170)
+(33536,31809,33444,31735)
+(45990,42751,45893,42708)
+(38852,20510,38802,20509)
+(27453,15836,27391,15802)
+(9347,29004,9284,28946)
+(44871,27727,44778,27668)
+(14978,19646,14970,19644)
+(23243,47091,23166,47080)
+(45204,21431,45167,21370)
+(14082,22316,14078,22235)
+(42778,22694,42744,22606)
+(4834,25241,4760,25196)
+(20497,18110,20494,18038)
+(45738,35524,45706,35496)
+(21575,5151,21493,5092)
+(2194,10052,2172,9960)
+\N
+(47735,24472,47682,24460)
+(46740,35700,46695,35609)
+(24647,42807,24568,42779)
+(18000,30576,17975,30506)
+(48638,46630,48544,46628)
+(48508,33600,48477,33578)
+(38703,45408,38670,45313)
+(21712,15015,21625,14956)
+(5840,42007,5768,41992)
+(44011,11138,43953,11117)
+(3899,33262,3897,33238)
+(30142,23967,30096,23927)
+(36950,13226,36908,13141)
+(13130,26915,13071,26873)
+(38576,35408,38539,35392)
+(16776,46244,16700,46176)
+(38251,25969,38168,25948)
+\N
+(3512,32256,3417,32242)
+(31923,31225,31832,31197)
+(5144,4969,5124,4937)
+(34499,46164,34430,46162)
+\N
+(39432,31907,39388,31828)
+(17316,24606,17221,24533)
+(20751,49352,20709,49323)
+(41673,30418,41623,30377)
+(29026,24400,28971,24345)
+(21929,30617,21894,30598)
+(35539,12421,35536,12355)
+(24938,45583,24870,45525)
+\N
+(27442,33090,27353,33064)
+(23949,12046,23949,12036)
+(11399,377,11360,294)
+(47099,9989,47023,9942)
+(641,33118,639,33084)
+(13687,41308,13682,41290)
+\N
+(3682,17727,3645,17660)
+(13262,19396,13185,19357)
+(18791,389,18774,366)
+(12489,45384,12403,45369)
+\N
+(12065,6364,12015,6325)
+\N
+(32705,23886,32619,23827)
+\N
+(7004,37333,6911,37240)
+(28594,38078,28530,38050)
+(5805,21797,5710,21701)
+(41145,18905,41058,18873)
+(35599,10002,35591,9956)
+(5387,39087,5326,38994)
+(11703,14003,11671,13912)
+(4093,10472,4091,10470)
+\N
+(14110,49740,14063,49695)
+(4170,470,4097,463)
+(22219,17296,22164,17221)
+(2505,20879,2446,20842)
+\N
+(47235,24744,47151,24667)
+(30035,23234,30013,23197)
+(3489,11659,3461,11607)
+(38435,46322,38429,46230)
+(12315,32880,12277,32854)
+(33350,35297,33317,35263)
+(18845,37671,18836,37589)
+(24855,23554,24783,23520)
+(48251,44461,48188,44408)
+(17695,43353,17605,43286)
+(4964,21292,4893,21270)
+(33919,29907,33852,29878)
+(29139,40010,29084,39957)
+(41611,37750,41572,37741)
+(41773,34717,41682,34700)
+(8225,7424,8221,7363)
+(1785,28248,1771,28219)
+(21553,36307,21505,36257)
+(7552,18199,7527,18119)
+\N
+(14410,30977,14349,30944)
+\N
+(20940,49142,20901,49069)
+(36892,5522,36810,5478)
+(40192,20926,40179,20926)
+(44702,15182,44641,15117)
+(43431,4921,43337,4827)
+(41129,21654,41084,21642)
+(6205,42785,6113,42722)
+(23714,10224,23666,10205)
+(9318,35175,9274,35139)
+(40698,12676,40618,12627)
+(49954,1340,49905,1294)
+(32774,33062,32763,33062)
+(4336,22183,4241,22157)
+(10241,47657,10151,47592)
+(6746,16718,6666,16634)
+(26842,49694,26839,49680)
+(34870,47437,34820,47347)
+(26365,22266,26326,22183)
+(39859,932,39829,840)
+(33995,10888,33902,10793)
+(32972,22342,32951,22340)
+\N
+(19951,10161,19932,10111)
+(26779,45188,26745,45151)
+(11235,13593,11184,13589)
+(27334,20968,27288,20953)
+(9586,43102,9488,43085)
+(43935,49759,43925,49680)
+(10548,37032,10474,36955)
+(9326,14927,9295,14848)
+(41340,11312,41311,11303)
+(6500,44553,6454,44515)
+\N
+(8198,26841,8104,26749)
+(47761,34183,47702,34140)
+(43637,17912,43577,17910)
+(17623,11138,17590,11122)
+(48122,13132,48077,13060)
+(27911,39796,27908,39777)
+(1108,7918,1080,7832)
+(18776,24329,18699,24326)
+(1171,37901,1075,37871)
+(38437,33948,38364,33907)
+(1913,11593,1817,11533)
+(22684,266,22656,181)
+(13299,17075,13241,17074)
+(6924,30196,6851,30113)
+\N
+(4367,13150,4298,13053)
+(37381,6101,37380,6046)
+(10307,28383,10270,28349)
+(12283,8636,12256,8610)
+(20230,32775,20144,32723)
+(32942,12812,32905,12714)
+(46140,7138,46140,7047)
+(37235,29436,37161,29425)
+(42486,25454,42478,25444)
+(47860,46973,47842,46961)
+(41760,21026,41662,20955)
+(29663,20088,29566,20026)
+(19167,33241,19101,33235)
+(12306,37845,12301,37803)
+(11288,873,11203,857)
+(30309,5120,30282,5060)
+(46927,19737,46856,19687)
+(16664,20052,16649,19989)
+(7330,8675,7296,8613)
+(45067,45724,44991,45631)
+(45317,10862,45218,10842)
+(15012,47009,14998,46956)
+(47882,10146,47813,10099)
+(31571,46215,31511,46148)
+(32257,2619,32187,2531)
+(38924,41305,38872,41285)
+(49981,34876,49898,34786)
+(30501,35099,30418,35011)
+\N
+(45862,41438,45854,41434)
+(38448,31878,38391,31822)
+(8278,43463,8274,43378)
+(5883,30629,5878,30564)
+(49501,40346,49447,40275)
+(31651,43116,31560,43106)
+(44244,32940,44244,32926)
+\N
+(17941,18079,17938,18035)
+(9518,32524,9470,32511)
+(30707,43469,30686,43457)
+(3284,46542,3187,46477)
+(43423,29642,43393,29602)
+(19940,16825,19877,16736)
+(26194,47446,26194,47407)
+(30386,24675,30333,24652)
+(42707,44466,42688,44456)
+\N
+(43395,18525,43320,18467)
+(28346,32259,28276,32196)
+(45106,40786,45026,40767)
+(36734,20414,36722,20363)
+(37140,11569,37099,11475)
+(8967,6409,8882,6341)
+(31036,27923,30993,27890)
+(22442,47682,22347,47663)
+(32511,24029,32482,23970)
+(22593,34444,22519,34399)
+(41534,15495,41518,15455)
+\N
+(35862,19997,35818,19928)
+(31419,8323,31404,8285)
+(31036,19023,30978,19000)
+(46900,15192,46891,15102)
+(12774,9651,12765,9604)
+(49985,6436,49927,6338)
+(7184,47344,7089,47285)
+(12792,45021,12740,45011)
+(15019,27192,14940,27096)
+(35415,23106,35381,23095)
+(42129,14283,42095,14245)
+(29375,45807,29347,45743)
+(21763,24916,21700,24889)
+(47656,8794,47579,8774)
+(6139,49571,6059,49472)
+(44492,45607,44483,45532)
+(22699,4301,22628,4240)
+(27407,24241,27335,24158)
+\N
+(38424,34460,38403,34458)
+(46572,48456,46554,48402)
+(39676,29056,39643,28981)
+(4202,33076,4107,33010)
+(32499,10592,32482,10575)
+(22504,45417,22459,45378)
+(49619,40322,49619,40268)
+(14463,9305,14426,9224)
+(10070,20300,10035,20211)
+(35060,28561,34965,28553)
+(23970,47522,23887,47428)
+(46803,19155,46790,19131)
+\N
+(46151,49848,46058,49830)
+(45266,40766,45209,40738)
+(31041,32195,31007,32110)
+(41401,17245,41334,17224)
+(37445,654,37435,602)
+(45568,31904,45508,31857)
+(29326,7923,29285,7896)
+(27078,34643,27027,34606)
+(34492,43443,34437,43345)
+(34109,4307,34083,4265)
+(2755,45325,2727,45312)
+(12571,24218,12536,24195)
+(41224,2454,41149,2445)
+(711,34828,655,34788)
+(9104,18865,9036,18850)
+(3508,26816,3456,26771)
+(20159,16212,20116,16160)
+(36871,7425,36777,7421)
+(2751,45244,2734,45222)
+(35867,28071,35769,28052)
+(46878,35730,46850,35725)
+(20610,35086,20513,35037)
+(3903,32612,3887,32517)
+(9330,40226,9289,40169)
+(6338,28242,6329,28184)
+(35668,18344,35606,18304)
+(29892,48927,29878,48879)
+(26999,646,26932,612)
+(36377,38898,36338,38847)
+(40289,31459,40236,31436)
+(30377,1164,30306,1069)
+(7642,12183,7590,12112)
+(40325,1716,40296,1662)
+(36412,38787,36318,38691)
+(3967,33268,3923,33261)
+(33914,40774,33873,40763)
+(45978,41431,45963,41332)
+(39195,12546,39120,12520)
+(29962,30878,29941,30846)
+(9365,10732,9310,10726)
+(28801,23943,28740,23885)
+(28934,38858,28928,38807)
+(22126,45897,22068,45803)
+(2923,33832,2918,33751)
+(25116,2276,25083,2272)
+(31174,14546,31144,14460)
+(11728,9072,11658,9004)
+(19804,49195,19730,49125)
+(23090,28826,23010,28787)
+(33989,27553,33947,27486)
+(39702,47613,39641,47553)
+(31397,3607,31304,3519)
+(5835,9262,5791,9226)
+(40112,37022,40038,36926)
+(12346,29356,12282,29344)
+(28503,9623,28469,9591)
+(38449,43143,38378,43066)
+(36950,37311,36905,37265)
+(34824,5729,34818,5706)
+(9288,26969,9225,26900)
+(2535,42176,2478,42159)
+(29098,49051,29085,49031)
+(44759,33326,44727,33230)
+(42849,2970,42821,2919)
+(46014,27193,45985,27151)
+(14506,13713,14417,13626)
+(19342,44905,19332,44895)
+(38178,37003,38147,36925)
+(29179,27310,29084,27288)
+(42713,10158,42671,10060)
+(43336,38389,43290,38326)
+(41260,34410,41245,34327)
+(27907,2695,27830,2596)
+(16309,44972,16222,44966)
+(6230,22262,6214,22249)
+\N
+(9266,39458,9175,39447)
+(33120,33548,33087,33538)
+(43659,11416,43599,11375)
+(49707,39258,49702,39159)
+(23520,22140,23486,22072)
+(24736,46502,24668,46412)
+(7826,16851,7730,16807)
+(39114,6048,39056,5965)
+(11859,8753,11764,8701)
+(42254,48367,42240,48328)
+(26136,49185,26056,49175)
+(38395,11209,38334,11137)
+(33249,9425,33209,9348)
+(22131,38502,22112,38460)
+(5306,24344,5267,24268)
+(30292,1198,30233,1149)
+(9903,10896,9850,10806)
+(25568,22911,25487,22868)
+(22048,43391,22043,43362)
+(20852,25827,20851,25766)
+(35204,17119,35114,17093)
+(5575,43431,5554,43410)
+(17727,13623,17678,13560)
+(14721,29520,14709,29461)
+(40317,42220,40267,42166)
+(31435,31012,31386,30931)
+(40655,10103,40645,10006)
+(35783,17802,35773,17763)
+(34874,10210,34856,10200)
+(3694,14279,3610,14239)
+(27854,5493,27799,5433)
+(34913,7234,34894,7220)
+(15758,26445,15738,26421)
+(23710,7272,23705,7270)
+\N
+(33679,13468,33628,13415)
+\N
+(31271,40495,31178,40461)
+(759,187,662,163)
+(14419,40434,14402,40381)
+(45879,42933,45814,42872)
+(167,17214,92,17184)
+(9964,12210,9958,12195)
+(35834,46257,35817,46211)
+(26077,5629,25978,5621)
+(46177,44640,46082,44544)
+(44780,28753,44707,28692)
+(35491,24729,35425,24690)
+(33914,34190,33914,34131)
+(17709,33253,17668,33227)
+(45516,11888,45423,11848)
+(24497,24752,24411,24710)
+(30333,5952,30331,5886)
+(444,12587,430,12497)
+(7592,22353,7541,22287)
+\N
+(13387,37414,13329,37318)
+\N
+(21504,35227,21449,35210)
+(18533,12909,18438,12848)
+(41049,27148,41048,27088)
+(18205,12222,18151,12140)
+(18026,5164,18026,5156)
+(34104,29862,34006,29815)
+(18520,49686,18454,49602)
+(37000,41493,36920,41424)
+(43025,25711,42986,25687)
+(38620,47018,38535,46934)
+(24119,36813,24023,36739)
+(48887,26359,48879,26302)
+(47827,14625,47810,14609)
+(10792,30746,10776,30716)
+(30384,40672,30318,40582)
+(48417,22790,48358,22746)
+(14854,5819,14785,5798)
+(19142,44414,19085,44406)
+(31179,27081,31145,27005)
+\N
+(19692,8711,19659,8642)
+(39689,14082,39603,14051)
+(11181,39091,11119,39002)
+(46015,23374,45936,23328)
+(12517,49702,12427,49690)
+(21926,21137,21841,21111)
+(31956,12509,31870,12494)
+(5895,2030,5851,2020)
+(27094,5447,27014,5377)
+(35781,8717,35780,8618)
+(14012,12023,13972,12015)
+(1702,12442,1696,12419)
+(28549,5251,28462,5248)
+(26441,21007,26360,20925)
+(49820,7990,49771,7967)
+(26424,29698,26339,29693)
+(35146,6820,35071,6817)
+\N
+(15438,18788,15435,18729)
+(47115,5235,47096,5143)
+(33982,9002,33915,8925)
+(14206,37041,14174,36955)
+(24300,36616,24232,36613)
+(44658,1788,44580,1769)
+\N
+(31539,43550,31463,43464)
+\N
+(16722,9673,16633,9652)
+(44813,20573,44733,20544)
+\N
+(42114,32559,42040,32552)
+(41561,36244,41477,36241)
+(39589,33796,39548,33716)
+(20365,26770,20329,26709)
+(28511,208,28479,114)
+(10010,25524,9930,25508)
+\N
+(1549,45666,1512,45621)
+(16193,1927,16166,1869)
+(34486,11500,34421,11401)
+(14048,37944,13994,37901)
+(21692,9594,21617,9496)
+(2568,37899,2557,37811)
+(4360,24503,4278,24443)
+(50027,49230,49951,49214)
+(44849,14867,44836,14813)
+(16695,34896,16683,34840)
+(12600,35217,12593,35129)
+(23113,24009,23030,23962)
+(49907,30225,49810,30158)
+(18026,25208,17970,25208)
+(49711,39844,49651,39790)
+(5427,42682,5357,42637)
+(23901,14221,23802,14184)
+(15470,12185,15376,12163)
+(47302,34023,47292,34001)
+(24336,17418,24315,17393)
+(13948,17043,13903,16970)
+(8555,8986,8530,8953)
+(48830,6038,48743,5986)
+(48720,40687,48623,40610)
+(21161,30970,21146,30896)
+(9507,36316,9411,36261)
+\N
+(36643,18136,36614,18106)
+(1858,7457,1851,7402)
+(24452,44306,24372,44252)
+\N
+(3292,807,3205,806)
+(6845,30694,6792,30627)
+(21333,25786,21237,25751)
+(23008,22574,22999,22511)
+(8790,8893,8772,8806)
+(43333,47968,43264,47900)
+(5377,24103,5302,24076)
+(18410,23993,18329,23907)
+(24752,19126,24713,19069)
+(49772,11378,49696,11293)
+(3468,12920,3396,12873)
+(1746,40342,1736,40333)
+(49187,29737,49139,29681)
+(27657,44952,27581,44917)
+\N
+(35407,30177,35345,30151)
+(4071,40568,4058,40544)
+(25998,30513,25965,30452)
+(8195,45403,8097,45310)
+(8276,41689,8183,41670)
+\N
+(48435,28550,48355,28455)
+\N
+(8139,25449,8136,25380)
+(20302,25574,20297,25531)
+\N
+(22055,46659,22034,46567)
+(3531,49962,3463,49934)
+(46828,46938,46739,46902)
+(42294,786,42212,739)
+(8779,3292,8761,3275)
+(48146,46170,48082,46151)
+(21571,10000,21531,9919)
+(35526,26029,35450,25945)
+(38893,22225,38865,22197)
+(22189,37520,22132,37497)
+(810,43261,751,43198)
+(10352,39144,10290,39093)
+(8740,35435,8720,35432)
+(31657,13551,31583,13484)
+(39803,4019,39755,4014)
+(46353,7853,46312,7824)
+(30078,48975,30021,48970)
+(2847,32036,2819,31966)
+(25250,10147,25165,10140)
+\N
+(15643,38953,15585,38947)
+(40792,29798,40731,29731)
+(43249,26858,43215,26835)
+(47229,2199,47201,2134)
+(10052,23601,9958,23570)
+(38981,21615,38892,21604)
+(3651,45004,3570,44917)
+(21503,8261,21409,8166)
+(13518,34201,13465,34105)
+(13899,25117,13836,25114)
+(18327,17403,18301,17349)
+(19503,13648,19483,13607)
+(3554,19487,3529,19466)
+(41102,43355,41070,43314)
+(4663,45858,4583,45765)
+(3971,3023,3931,2975)
+(37124,7061,37080,6993)
+(48530,47172,48459,47160)
+(14575,29843,14509,29750)
+(43443,23124,43357,23038)
+(8864,48290,8857,48263)
+(41597,39852,41577,39791)
+(35610,33392,35556,33353)
+(36415,17906,36328,17846)
+(24919,43933,24839,43883)
+(7457,14056,7395,14051)
+(43851,4090,43801,4080)
+(43567,18468,43471,18388)
+(16711,6084,16652,6055)
+(45888,45934,45846,45880)
+(45630,9313,45585,9248)
+(27119,25969,27094,25884)
+(36155,11420,36120,11405)
+(41880,47111,41808,47049)
+\N
+(17554,20379,17482,20374)
+(38848,5936,38763,5869)
+(28324,31019,28276,30944)
+(43257,17152,43176,17091)
+(42717,24613,42691,24527)
+(16786,41486,16763,41403)
+(19259,28780,19160,28711)
+(25843,28265,25760,28171)
+(48645,34816,48546,34755)
+(7004,49289,6976,49236)
+(30261,21833,30181,21776)
+(5290,46672,5219,46661)
+(21237,31901,21188,31849)
+(23340,38537,23253,38472)
+(17269,3682,17183,3586)
+\N
+(48200,15377,48110,15369)
+(16546,22195,16477,22142)
+(21436,8460,21378,8449)
+\N
+(46598,17235,46577,17138)
+\N
+(30212,36184,30152,36092)
+(18037,155,17941,109)
+(4945,29201,4933,29184)
+(32835,18782,32770,18750)
+(34160,33104,34120,33007)
+(5151,26989,5149,26909)
+(1801,15549,1710,15461)
+(48988,34819,48951,34764)
+(20904,32547,20856,32497)
+\N
+(32654,35183,32606,35144)
+(14336,11763,14328,11712)
+(30546,23808,30463,23773)
+(6813,21006,6781,20924)
+\N
+(14199,22030,14185,21934)
+(3783,14709,3747,14658)
+(49428,47052,49422,46973)
+(29551,27682,29470,27654)
+(29170,37260,29151,37181)
+(48924,24689,48894,24680)
+(48497,34052,48453,33966)
+\N
+(21263,8203,21242,8176)
+(46537,3797,46462,3735)
+(18406,14579,18393,14563)
+\N
+(11583,16529,11536,16471)
+(10564,46257,10478,46228)
+(49769,34513,49761,34458)
+\N
+(9202,6482,9138,6391)
+(40387,37411,40357,37360)
+(11966,11802,11888,11751)
+(15551,47438,15486,47406)
+(12017,43288,11969,43230)
+(9717,22574,9701,22495)
+\N
+(35083,49443,35075,49355)
+(33857,9320,33813,9269)
+(32106,10581,32012,10560)
+(14345,12485,14273,12424)
+(24187,46416,24175,46402)
+(43854,42159,43808,42129)
+(35399,40707,35359,40646)
+(29585,25576,29493,25556)
+(24919,7829,24911,7753)
+\N
+(17049,48390,17022,48304)
+(25224,35012,25217,34922)
+(47397,20853,47346,20779)
+(17221,16558,17181,16516)
+(8669,16491,8645,16486)
+(23502,44241,23484,44164)
+(36169,37046,36072,37010)
+(44775,32394,44763,32357)
+(30685,36871,30662,36792)
+(21783,47642,21714,47630)
+(34847,27467,34761,27372)
+(43925,49912,43888,49878)
+(16455,27861,16364,27813)
+(38406,18310,38329,18309)
+(5408,9461,5319,9426)
+(41856,36900,41784,36854)
+(23723,4460,23646,4448)
+(18454,40138,18430,40046)
+(17505,36822,17418,36763)
+(36686,33534,36641,33476)
+(11347,9454,11289,9436)
+\N
+(27816,34752,27745,34736)
+(44213,8559,44162,8461)
+(45359,26789,45315,26776)
+(31249,19475,31224,19421)
+(25917,44239,25819,44149)
+(47313,40691,47264,40685)
+(40577,33848,40513,33794)
+(9606,45253,9582,45174)
+(30005,24521,29910,24496)
+(49332,35375,49309,35299)
+\N
+(12164,33871,12075,33820)
+(19598,43327,19593,43314)
+\N
+(3818,28584,3815,28504)
+\N
+(35579,8611,35541,8604)
+(8811,20986,8750,20954)
+(16139,44777,16128,44686)
+(35550,41501,35534,41458)
+(43180,11927,43109,11891)
+(45798,8465,45711,8460)
+(18196,6886,18126,6845)
+(1774,32167,1701,32073)
+(7030,40790,7029,40711)
+(11676,23009,11665,22915)
+(33990,22561,33953,22474)
+\N
+(30366,9447,30284,9353)
+(37626,32913,37596,32853)
+(7730,42561,7665,42470)
+(49347,8403,49315,8387)
+(6874,3499,6812,3458)
+(44189,16999,44169,16964)
+(6312,30167,6231,30083)
+(18932,6611,18909,6518)
+(32262,13076,32223,13057)
+(45989,249,45910,222)
+(42710,855,42692,796)
+(25562,9849,25535,9802)
+(13348,46719,13260,46689)
+(30022,42196,30005,42160)
+\N
+(22263,45954,22243,45950)
+(18918,18890,18820,18795)
+(31918,12003,31852,11989)
+(12252,39453,12211,39398)
+(40208,9789,40194,9759)
+(35943,21767,35914,21693)
+(18439,10706,18383,10618)
+(2803,18999,2778,18925)
+(14953,27444,14875,27397)
+(12587,22025,12545,21928)
+(33930,21090,33918,21009)
+(10444,2606,10407,2553)
+(28700,29782,28665,29703)
+\N
+(1402,13497,1397,13465)
+\N
+(24155,3075,24083,3062)
+(38378,1864,38339,1849)
+(29261,49910,29247,49818)
+(38139,37073,38098,37057)
+\N
+(24468,41130,24418,41053)
+(9989,1015,9959,939)
+(47001,33561,46994,33518)
+(47058,16030,46983,16012)
+(35509,1814,35426,1748)
+(3630,48019,3597,47923)
+(47781,12986,47741,12947)
+(16364,9908,16356,9882)
+(17290,41508,17287,41410)
+(42423,26477,42349,26434)
+(10039,920,9952,833)
+(16851,21338,16846,21314)
+\N
+(23104,7700,23062,7688)
+(5619,2079,5611,2075)
+(31471,49632,31375,49549)
+(25793,12526,25783,12456)
+(3935,29528,3866,29513)
+\N
+(5957,1646,5947,1595)
+(2467,22376,2429,22349)
+(43715,32673,43664,32595)
+(6726,13093,6636,12994)
+(31477,18347,31421,18299)
+(34232,36635,34200,36552)
+(49061,14516,49008,14442)
+(43996,6129,43955,6074)
+(7728,33802,7670,33703)
+\N
+(6131,36766,6053,36749)
+(35791,16361,35696,16329)
+(45759,8935,45675,8886)
+(43634,2029,43537,1940)
+(4916,32233,4844,32181)
+(46701,23508,46623,23477)
+(29590,4893,29552,4871)
+(38647,4423,38574,4396)
+(7593,25845,7497,25751)
+(8510,43552,8432,43492)
+(18791,39181,18730,39162)
+(7462,2956,7454,2858)
+(1394,26795,1392,26780)
+(16707,21993,16609,21932)
+(26838,10866,26803,10836)
+(31642,29842,31585,29760)
+(21891,3502,21863,3406)
+(13258,587,13250,507)
+(6072,47397,6021,47369)
+(16605,49730,16579,49659)
+(42830,40981,42791,40981)
+(12975,3706,12913,3637)
+(30925,21660,30826,21649)
+(1455,14229,1410,14156)
+\N
+(17583,16486,17562,16474)
+(33377,3387,33333,3381)
+(784,6177,750,6095)
+(22111,44110,22106,44013)
+(1444,403,1346,344)
+(4010,46220,3982,46212)
+(17932,8150,17861,8127)
+(38685,31466,38636,31416)
+(14257,11549,14242,11522)
+(14990,15217,14904,15211)
+(21395,21533,21307,21520)
+\N
+(31948,33725,31885,33694)
+(433,49033,390,48961)
+(45205,609,45173,523)
+(25065,35494,25003,35455)
+(33265,6677,33224,6611)
+(18179,22345,18133,22256)
+(3916,13759,3820,13732)
+(1696,13478,1604,13436)
+(47203,25980,47130,25907)
+(24913,13361,24868,13268)
+(13824,40177,13792,40130)
+(25671,13555,25585,13494)
+\N
+(20133,37769,20105,37679)
+\N
+(26368,16734,26288,16726)
+(30545,35438,30458,35376)
+(48816,22926,48812,22831)
+(48807,31389,48739,31330)
+(11003,10859,10950,10765)
+(17288,8570,17247,8485)
+(38377,31415,38331,31379)
+\N
+(19085,23425,19059,23326)
+(40059,17068,40052,17006)
+(18811,13493,18734,13394)
+(36319,17197,36225,17181)
+(14939,38780,14863,38714)
+(49539,17656,49479,17629)
+(42530,45951,42466,45854)
+(27318,26654,27233,26610)
+(49980,35004,49937,34963)
+(18326,32558,18322,32502)
+(45951,28555,45896,28481)
+(12104,33531,12014,33501)
+(22311,41113,22215,41066)
+(25073,18721,25047,18656)
+\N
+(14524,13486,14510,13390)
+(40040,36688,40000,36599)
+(21594,11473,21563,11436)
+(44031,22274,43938,22187)
+(729,30683,668,30601)
+(14114,20873,14102,20803)
+(28239,41377,28222,41308)
+(26404,11922,26317,11843)
+(41660,34586,41585,34501)
+\N
+(21128,2384,21101,2368)
+(30209,16952,30156,16858)
+(39078,24963,39045,24898)
+(5598,1348,5499,1294)
+\N
+(38474,7436,38450,7364)
+(15117,45734,15024,45693)
+\N
+(23909,39853,23888,39780)
+(24292,30183,24282,30148)
+(48871,17661,48868,17637)
+(918,18752,847,18708)
+\N
+(43615,16162,43606,16104)
+(33763,47410,33751,47409)
+(4798,6485,4773,6388)
+\N
+(18524,41539,18433,41518)
+(47745,42449,47651,42364)
+(38936,21237,38864,21204)
+\N
+(5251,3516,5194,3475)
+(22269,36269,22183,36228)
+(18736,40983,18685,40947)
+(38393,15444,38356,15363)
+(38134,29898,38103,29862)
+(37789,39557,37732,39474)
+(31906,23005,31838,23003)
+(10647,40094,10560,40040)
+(9914,41547,9867,41545)
+(44221,443,44125,433)
+(41479,10936,41381,10847)
+(42586,6301,42563,6235)
+(2504,17588,2449,17554)
+(7045,18782,7028,18764)
+(41840,32018,41768,31938)
+(38416,17158,38330,17060)
+\N
+(8605,39015,8605,38933)
+(5764,43548,5719,43496)
+\N
+(20789,29902,20696,29843)
+\N
+(36104,47896,36079,47816)
+(31736,13834,31722,13832)
+(32617,19701,32597,19684)
+(1671,18997,1622,18945)
+(36007,26545,36005,26535)
+(31864,17494,31820,17455)
+(27346,28388,27303,28289)
+(8191,9653,8133,9589)
+(7501,21616,7405,21536)
+(35450,9580,35368,9563)
+(29281,37276,29247,37255)
+(6225,17192,6200,17135)
+\N
+(43689,8119,43670,8028)
+(41917,49601,41835,49563)
+(44295,13116,44205,13078)
+(22721,44772,22667,44748)
+(32640,11107,32636,11050)
+(20639,28851,20613,28839)
+\N
+(32479,10159,32446,10061)
+(27251,16978,27196,16959)
+(41401,33148,41339,33074)
+\N
+(49001,8538,48989,8444)
+(37958,35843,37874,35802)
+(46969,41229,46903,41138)
+(18541,8876,18541,8870)
+(4080,31634,4061,31627)
+(8097,35240,8040,35152)
+(18470,21414,18463,21412)
+(20914,17897,20838,17869)
+(42688,11681,42666,11641)
+(47525,25005,47443,24907)
+(32439,14438,32397,14400)
+\N
+(39667,19626,39622,19542)
+(1212,44525,1169,44516)
+(29766,4433,29668,4401)
+(25847,49657,25813,49605)
+(33859,17356,33827,17263)
+(28989,45953,28904,45854)
+(37211,30830,37113,30819)
+\N
+(45220,26382,45219,26340)
+(12312,43250,12234,43246)
+(37775,41504,37762,41421)
+(45889,33499,45822,33411)
+(49461,22601,49369,22553)
+(39857,33844,39816,33824)
+(46102,15822,46030,15778)
+(46605,31239,46598,31170)
+(23925,5856,23862,5808)
+(15459,4262,15407,4241)
+(12019,4907,12015,4818)
+(38258,17973,38229,17923)
+(40575,29566,40477,29521)
+\N
+(29715,45919,29697,45891)
+(11694,9510,11670,9490)
+(7053,44257,7012,44231)
+(16465,8603,16391,8505)
+(29170,15592,29098,15527)
+(20400,37354,20345,37328)
+(5281,10265,5252,10184)
+(6084,48782,6058,48727)
+(11006,6889,10971,6796)
+(16299,19461,16286,19411)
+(13718,29192,13642,29106)
+(3999,2965,3963,2903)
+(18509,12235,18430,12208)
+(49542,38575,49537,38534)
+(15093,41715,15071,41634)
+(6802,8385,6714,8300)
+(15127,17507,15097,17424)
+(36921,3025,36835,2995)
+(32117,24327,32101,24262)
+(27244,24151,27165,24104)
+(36339,42360,36313,42358)
+(47288,46252,47245,46184)
+(37867,6649,37818,6565)
+(14886,22103,14865,22089)
+(39611,17952,39513,17951)
+(37329,31436,37298,31436)
+(5715,39115,5698,39099)
+(13266,7364,13203,7296)
+(16076,10945,16006,10942)
+(7197,41509,7126,41413)
+(14411,40868,14330,40772)
+(12872,33481,12862,33454)
+(17786,19616,17758,19560)
+(1052,37358,996,37311)
+(42825,12643,42762,12625)
+(20007,49858,19921,49778)
+(27155,6355,27072,6257)
+(14117,40208,14022,40155)
+(47280,34069,47279,34028)
+(17551,15803,17482,15763)
+(1725,6673,1676,6649)
+(43984,31128,43961,31105)
+(43772,47042,43731,47038)
+(46901,47317,46817,47228)
+(19877,14179,19837,14168)
+(20691,19989,20675,19935)
+(4011,18914,3963,18817)
+(1023,23378,933,23317)
+(30051,46118,29966,46039)
+(43499,46488,43496,46409)
+\N
+(43531,2412,43447,2396)
+\N
+(16034,32285,15976,32220)
+(12817,21365,12740,21298)
+(7607,47293,7585,47293)
+(32512,12218,32463,12170)
+(1848,21496,1839,21439)
+(17567,23073,17478,23046)
+(35813,31847,35807,31792)
+\N
+(563,30859,540,30842)
+(13145,15488,13063,15433)
+(36754,37479,36731,37411)
+(1125,26069,1057,25997)
+(4539,20676,4519,20618)
+(8476,34721,8409,34681)
+(7794,25691,7727,25656)
+(23842,514,23800,473)
+(47678,41396,47668,41365)
+(6837,25974,6799,25892)
+(13355,11174,13304,11161)
+\N
+(37243,25548,37158,25471)
+(12528,30208,12441,30205)
+(14929,1672,14886,1607)
+(27263,49026,27263,49010)
+(15892,21645,15835,21642)
+(29446,48978,29360,48967)
+(41304,9892,41211,9825)
+(37418,49393,37338,49296)
+(41146,32178,41120,32165)
+(28738,13326,28722,13266)
+(14899,36595,14873,36559)
+(1973,31435,1921,31426)
+(19485,17742,19421,17661)
+(33072,20995,32980,20903)
+(47091,30055,47080,30037)
+(45753,12998,45686,12992)
+\N
+(11528,7826,11509,7794)
+(21104,13921,21060,13836)
+(16768,15491,16747,15470)
+(13279,20396,13249,20326)
+(4342,49518,4339,49446)
+(20413,15476,20349,15447)
+(45532,5649,45484,5627)
+(18647,27196,18619,27115)
+(1326,17473,1261,17400)
+(47646,19644,47588,19609)
+(35088,1813,35080,1732)
+(38461,34839,38410,34838)
+(34358,11540,34285,11506)
+\N
+(26969,7078,26953,6989)
+(12629,40352,12617,40264)
+(33800,7037,33731,6992)
+(24462,13518,24392,13486)
+(33164,47357,33096,47329)
+(15422,18451,15413,18376)
+(19643,12916,19567,12912)
+(40860,42125,40770,42050)
+(49103,29614,49039,29606)
+(36319,35582,36222,35528)
+(8924,36083,8873,36018)
+(49603,44022,49505,44021)
+(7783,40633,7702,40618)
+(25388,49107,25346,49042)
+(28375,38947,28306,38919)
+(47324,22672,47321,22660)
+(2287,8808,2266,8719)
+(44343,16339,44248,16318)
+(2374,28839,2336,28798)
+(22913,40710,22819,40688)
+\N
+(47747,684,47658,627)
+(16043,46011,16021,45984)
+(34958,32168,34903,32092)
+(4840,49328,4752,49258)
+(24341,2087,24330,2009)
+(18378,19374,18327,19358)
+(48165,7217,48156,7141)
+(14232,6044,14182,6004)
+(23080,4196,22983,4191)
+(259,1850,175,1820)
+(270,29508,264,29440)
+(45088,11375,45050,11295)
+(29666,39386,29656,39302)
+(8712,8782,8660,8713)
+(15900,6650,15855,6561)
+(28946,28348,28917,28347)
+(32544,25845,32538,25779)
+(44047,6957,43951,6942)
+(36465,588,36382,503)
+\N
+(28167,26679,28150,26673)
+(16065,4268,15975,4180)
+(12950,23494,12893,23494)
+(30145,24679,30056,24654)
+(3027,16162,3001,16071)
+(8259,34537,8202,34484)
+(41447,1515,41427,1454)
+(18407,28362,18309,28303)
+(21393,41872,21328,41816)
+(46040,26497,45996,26408)
+\N
+(49944,25163,49902,25153)
+\N
+(16195,11843,16159,11831)
+(44257,15270,44254,15214)
+(49760,4791,49699,4713)
+(22558,33709,22519,33681)
+(28375,10003,28336,9938)
+(18179,24310,18106,24256)
+(707,30688,664,30669)
+(5851,26118,5822,26037)
+(4266,1292,4221,1217)
+(16516,11331,16432,11248)
+(32374,38277,32313,38245)
+(21939,8015,21927,7952)
+(34322,32051,34242,32003)
+(6262,35977,6260,35953)
+(16717,38594,16622,38498)
+(14564,3433,14535,3425)
+(21078,1000,20994,974)
+(28584,956,28575,868)
+(5538,9962,5465,9870)
+(34183,44102,34175,44085)
+\N
+(42507,10289,42441,10288)
+(12671,19936,12594,19920)
+(24835,12179,24770,12173)
+(15664,11538,15598,11494)
+(28892,24446,28821,24350)
+(41654,26720,41570,26632)
+(36583,387,36503,357)
+(10842,34824,10795,34788)
+(11518,42588,11429,42565)
+(12577,40322,12486,40266)
+(2453,4045,2439,3956)
+(31837,33705,31803,33681)
+(24403,27711,24383,27705)
+(4431,2748,4337,2656)
+\N
+(3036,2887,3014,2826)
+(37664,16118,37615,16022)
+(8606,18063,8587,18038)
+(24738,25458,24656,25362)
+(45756,34022,45671,33948)
+(34079,15236,33981,15171)
+(9251,22488,9228,22470)
+(25136,2809,25126,2717)
+(5548,47695,5543,47685)
+(13765,40800,13707,40754)
+(25216,30678,25144,30677)
+(22441,17169,22392,17106)
+(1091,4770,1054,4734)
+(36311,50073,36258,49987)
+(22461,33163,22457,33128)
+(35873,28907,35845,28867)
+(42907,15848,42904,15785)
+(6549,24897,6540,24861)
+(21928,37764,21891,37681)
+(21237,41132,21139,41086)
+(12207,24266,12173,24235)
+(40643,49770,40574,49687)
+(32833,35686,32815,35674)
+\N
+(14545,18143,14541,18098)
+(33892,42783,33884,42707)
+(33933,8381,33921,8369)
+(12450,19044,12403,19002)
+(10176,45158,10088,45145)
+(35828,12080,35732,12022)
+(28102,13694,28061,13666)
+(49432,31744,49340,31711)
+(16192,37743,16162,37697)
+(46830,867,46756,790)
+(9200,28048,9159,27986)
+(13397,19369,13340,19288)
+(30879,43562,30785,43545)
+(21995,48224,21920,48143)
+\N
+(11871,47569,11809,47568)
+(29366,22196,29280,22154)
+(26243,28176,26203,28116)
+(28995,35031,28906,35014)
+(29384,39276,29352,39183)
+(8497,13798,8471,13789)
+(7412,27226,7334,27220)
+(25403,47678,25363,47654)
+(11599,5556,11574,5502)
+(44056,5123,44008,5111)
+(49603,30877,49579,30840)
+(32261,45876,32206,45865)
+(35104,41659,35048,41587)
+\N
+(5457,35844,5376,35782)
+(29423,3977,29354,3959)
+(18059,3001,17965,2961)
+(8509,5691,8463,5620)
+\N
+(27118,5762,27083,5747)
+(2991,48605,2939,48559)
+(44482,3484,44425,3459)
+(45143,16439,45046,16365)
+(2236,37531,2147,37530)
+(41561,3217,41490,3210)
+\N
+(6270,27200,6171,27166)
+(49195,24871,49138,24798)
+\N
+(46985,38881,46897,38845)
+(37486,23522,37404,23441)
+(26907,14490,26900,14391)
+(30829,16111,30756,16056)
+(3644,17291,3587,17262)
+(20508,49775,20472,49680)
+\N
+(43279,8972,43198,8936)
+(33744,7470,33734,7439)
+(46303,20538,46284,20498)
+(10365,48246,10291,48154)
+(12636,24987,12545,24933)
+(40998,46992,40989,46916)
+(30536,6073,30531,6018)
+(22102,9643,22051,9594)
+(18616,34348,18530,34332)
+(8222,8907,8123,8848)
+(45698,28860,45698,28770)
+(26958,1748,26924,1726)
+\N
+(26735,35073,26659,35025)
+(48370,40813,48293,40737)
+(13140,993,13108,934)
+(10588,22893,10528,22883)
+(23645,40789,23567,40698)
+(49548,12374,49546,12329)
+(41135,39626,41100,39602)
+(41374,10856,41328,10769)
+(12234,5765,12146,5674)
+(12832,46941,12764,46917)
+(47886,34532,47851,34500)
+(23777,10549,23735,10495)
+(1291,16913,1194,16873)
+\N
+(29239,30554,29202,30500)
+\N
+(36485,30007,36454,29924)
+(7067,11320,7045,11229)
+(16939,30482,16904,30462)
+(27423,34386,27379,34303)
+(35170,32021,35155,31979)
+(42570,36477,42474,36457)
+(19695,679,19682,594)
+(47537,39450,47446,39450)
+(19410,22942,19375,22922)
+(34216,40166,34152,40158)
+(37000,24351,36972,24299)
+(24989,1681,24954,1672)
+(54,38679,3,38602)
+(41461,40693,41411,40599)
+(7576,46054,7545,45963)
+(35505,28262,35413,28222)
+(1158,16976,1145,16927)
+(23494,42291,23437,42229)
+(32894,32519,32880,32485)
+(604,13413,509,13401)
+(18396,19712,18355,19646)
+\N
+(26657,28234,26597,28191)
+(24240,47211,24154,47191)
+(41778,10741,41766,10730)
+(44022,43776,44010,43677)
+(35967,30055,35906,29969)
+(28878,18042,28806,18027)
+(31507,27302,31428,27267)
+(13267,21935,13265,21872)
+(122,46832,64,46762)
+(10348,45916,10306,45844)
+(22962,12644,22927,12607)
+(6320,22290,6284,22247)
+(2297,11372,2216,11298)
+(29366,36660,29325,36654)
+(13962,39307,13921,39220)
+(11094,19151,11092,19143)
+(32289,23776,32258,23760)
+\N
+(36044,17356,35956,17273)
+(46304,38692,46232,38675)
+(10934,42999,10922,42909)
+(4271,21177,4207,21093)
+(7837,19926,7747,19905)
+(25537,36605,25477,36584)
+(22161,14999,22079,14962)
+(5127,31243,5074,31213)
+\N
+(14904,40664,14838,40593)
+(29308,8480,29268,8438)
+(17731,7410,17699,7352)
+(44840,29293,44797,29248)
+(15523,31519,15505,31485)
+(34429,38479,34421,38478)
+(3530,23456,3440,23390)
+(4699,6889,4603,6796)
+(47405,48524,47389,48514)
+\N
+(23357,43160,23305,43156)
+(16923,1995,16860,1937)
+(47592,33853,47537,33758)
+(31624,37490,31595,37473)
+(42321,13380,42303,13337)
+(3088,16094,3079,16060)
+(22884,2955,22856,2857)
+(17784,23073,17724,23044)
+(32638,45577,32553,45512)
+(13876,44091,13801,44000)
+(27844,24384,27758,24330)
+(28178,10225,28155,10167)
+(39910,14277,39857,14241)
+(30372,19524,30301,19514)
+(38732,43151,38724,43151)
+(32628,2068,32547,2068)
+(13950,28652,13932,28566)
+(38996,41070,38919,40993)
+(31759,45246,31676,45215)
+\N
+(5424,34145,5382,34106)
+(14727,45600,14699,45547)
+\N
+(31429,21537,31414,21499)
+(14740,3420,14650,3323)
+(21793,39498,21743,39471)
+(18102,25924,18037,25868)
+(33299,683,33213,594)
+(45882,48765,45809,48721)
+(49215,4098,49180,4067)
+(49698,33743,49614,33663)
+(21532,5215,21514,5151)
+(24840,26877,24826,26808)
+(32680,28433,32631,28364)
+(20661,27511,20584,27414)
+(28048,30385,28009,30315)
+(45403,42533,45389,42464)
+(46531,36947,46531,36850)
+(36943,32817,36865,32737)
+\N
+(37984,43763,37888,43748)
+(20593,10650,20557,10610)
+(5387,40595,5326,40585)
+(34412,10600,34352,10539)
+(7237,47546,7206,47451)
+(39931,26644,39915,26598)
+(29843,4734,29800,4669)
+(37503,8867,37406,8821)
+(2583,2373,2570,2294)
+(29275,46433,29256,46350)
+(3332,45620,3287,45581)
+(22472,39287,22472,39257)
+(36786,18907,36708,18884)
+(45503,28576,45482,28494)
+(33262,28386,33163,28365)
+(3606,49757,3538,49697)
+(2082,49380,1991,49281)
+(12065,3734,11983,3663)
+(15606,9048,15596,9028)
+(14687,19309,14637,19263)
+(4568,15461,4499,15428)
+\N
+(43938,7429,43923,7391)
+\N
+(2168,50012,2108,49914)
+(16022,8934,15963,8928)
+(24567,39147,24561,39102)
+\N
+(42781,14149,42765,14088)
+(39501,21084,39468,21078)
+(6697,29628,6693,29584)
+(11441,16164,11364,16125)
+(39946,1920,39868,1844)
+\N
+(18138,45512,18111,45438)
+\N
+(20799,41217,20718,41138)
+(30264,16697,30240,16639)
+\N
+(30746,50040,30727,49992)
+(37429,43273,37423,43205)
+(22854,28863,22789,28810)
+(11380,48298,11287,48242)
+(16471,37273,16439,37223)
+(32737,39842,32661,39811)
+(30959,3447,30949,3357)
+(36396,13263,36348,13187)
+(29607,14625,29531,14619)
+(7851,43399,7824,43334)
+(38515,14575,38496,14492)
+(29125,3289,29086,3264)
+(6866,10476,6839,10424)
+(318,31489,235,31404)
+(1140,7007,1113,6945)
+(36574,9291,36484,9275)
+\N
+(40320,40937,40246,40866)
+(588,25849,552,25801)
+(6728,42539,6645,42507)
+(12180,6185,12123,6123)
+(32913,44123,32899,44037)
+(25464,16803,25441,16749)
+(23711,5829,23695,5750)
+(31424,34930,31377,34906)
+(42171,8298,42124,8222)
+(451,31104,375,31083)
+(39996,3278,39943,3260)
+(25816,40396,25735,40362)
+(34471,28587,34399,28547)
+(45344,21540,45297,21496)
+(27269,16787,27246,16763)
+(18070,4469,18022,4423)
+\N
+(12668,16367,12645,16295)
+(13823,17276,13730,17251)
+(20555,45544,20511,45498)
+(35893,42189,35861,42177)
+(37081,45730,37076,45705)
+(17270,15651,17201,15552)
+(48690,46034,48667,45945)
+(456,16088,368,16023)
+(48707,12416,48670,12363)
+(29692,11509,29614,11483)
+(7005,3668,6981,3574)
+(12162,389,12103,309)
+(12371,24983,12366,24964)
+(6886,48414,6868,48327)
+(10653,26234,10624,26142)
+(8526,48205,8517,48117)
+(10521,31892,10480,31798)
+(43353,1086,43281,1071)
+(21007,35650,20998,35649)
+(2343,4396,2310,4320)
+(29379,12895,29284,12891)
+(27662,17407,27570,17313)
+(9845,29346,9807,29321)
+(43855,38669,43790,38599)
+\N
+(20461,44189,20397,44158)
+(11627,17368,11581,17289)
+(2971,38855,2938,38807)
+(43204,47082,43128,47018)
+(9930,46902,9909,46871)
+(30561,48461,30536,48365)
+(44059,7591,44038,7563)
+(46260,16898,46162,16886)
+(27491,2891,27396,2814)
+(36512,26034,36455,25941)
+(31193,20022,31100,19942)
+(17057,13643,16960,13621)
+(26897,3399,26844,3318)
+(1760,5504,1683,5431)
+(29347,5511,29346,5450)
+(38761,42083,38688,41999)
+(11226,4089,11165,4068)
+(46427,42983,46361,42970)
+(12958,30737,12912,30712)
+(44432,46521,44333,46443)
+(16124,2948,16113,2852)
+\N
+(24704,25422,24635,25340)
+(30833,46152,30790,46122)
+(4487,37006,4473,36968)
+(41047,23376,41036,23327)
+(16312,49392,16298,49330)
+(30081,14687,30042,14660)
+(11160,13954,11103,13938)
+(33207,23246,33143,23168)
+(14872,7635,14860,7585)
+(20139,23987,20059,23955)
+(10946,49757,10923,49746)
+(39438,36158,39426,36134)
+(35502,2385,35464,2327)
+(17073,42173,16987,42130)
+(6079,17258,6068,17195)
+(40458,15752,40364,15728)
+(23340,7879,23313,7806)
+\N
+(31819,15096,31762,15059)
+(31159,40864,31158,40780)
+(26975,32144,26915,32113)
+(34530,10378,34440,10298)
+(18855,49577,18780,49528)
+(16787,16625,16723,16586)
+(32330,26538,32314,26458)
+(34270,28674,34265,28595)
+(10022,16026,10006,15962)
+(23143,1479,23095,1469)
+(33676,4483,33583,4408)
+(31066,22074,31059,22035)
+(21603,47121,21563,47082)
+(30051,4244,30021,4157)
+(30634,39478,30615,39446)
+(34404,48724,34393,48724)
+(31103,21414,31039,21380)
+(22945,47397,22849,47313)
+(18133,32025,18073,31941)
+(4053,25759,3977,25667)
+(39185,39091,39102,39068)
+(43287,7407,43225,7314)
+(13137,31188,13112,31182)
+(46264,1438,46258,1389)
+(22804,43892,22769,43822)
+(7542,1044,7487,983)
+(33022,8321,32925,8267)
+(384,39161,286,39073)
+(28205,24401,28142,24382)
+(31708,39086,31696,39026)
+(36626,15708,36560,15690)
+(17099,16924,17079,16924)
+(10817,6989,10747,6955)
+(24338,19293,24291,19277)
+(27566,17576,27544,17545)
+(23041,38384,22970,38320)
+\N
+(12786,8485,12702,8435)
+(13876,49473,13813,49448)
+(31585,46998,31490,46929)
+\N
+(30227,8768,30206,8715)
+(32062,39306,32023,39292)
+(25003,35753,24921,35687)
+(3281,6758,3232,6704)
+\N
+(11395,30299,11376,30220)
+(5088,15275,5007,15203)
+(31100,39538,31003,39444)
+(2741,17877,2726,17793)
+(42897,48620,42860,48537)
+(4230,15778,4181,15776)
+(17835,27530,17815,27431)
+(34189,10933,34135,10921)
+(7537,39974,7494,39973)
+(21554,3507,21528,3476)
+(9350,32326,9273,32275)
+(16455,8874,16420,8793)
+\N
+(7346,34235,7330,34224)
+(16417,48134,16352,48066)
+\N
+(41916,4971,41849,4886)
+(15856,1522,15807,1521)
+(41549,40218,41494,40144)
+\N
+(9978,16226,9972,16181)
+(14856,13312,14808,13283)
+(38490,41641,38428,41583)
+(25828,7438,25807,7378)
+(21876,30633,21796,30587)
+(1908,14279,1825,14247)
+\N
+(32207,10251,32121,10184)
+(370,9493,328,9441)
+(42072,17634,41974,17600)
+\N
+(47298,9910,47235,9846)
+(17856,11266,17782,11225)
+(35009,21400,34956,21396)
+(18337,11145,18335,11133)
+\N
+(25425,9139,25381,9085)
+(35642,27783,35621,27782)
+(3629,33164,3575,33163)
+(17151,41255,17115,41204)
+(17417,5835,17402,5751)
+(33407,14226,33329,14141)
+(1930,29955,1889,29931)
+(41101,10942,41065,10844)
+(36333,27288,36281,27233)
+(21423,36868,21367,36825)
+(36385,19566,36341,19510)
+(27073,38301,27066,38232)
+(43989,34187,43984,34174)
+(48366,7488,48316,7483)
+(37497,36075,37415,36043)
+(46917,9891,46887,9870)
+(37179,657,37103,634)
+(3877,44736,3811,44684)
+(30556,2975,30547,2962)
+(7629,11447,7547,11416)
+(45687,48147,45591,48088)
+(5635,7184,5571,7146)
+(9611,47327,9541,47246)
+(7119,48224,7117,48152)
+(15233,26480,15138,26430)
+(37468,1526,37466,1513)
+\N
+(20855,2786,20828,2711)
+(30538,44084,30480,44061)
+(42231,41527,42149,41454)
+(14963,13239,14952,13146)
+(26819,43996,26745,43934)
+(42172,35953,42086,35928)
+(28785,12611,28710,12534)
+(14089,1704,14047,1629)
+(4343,26242,4341,26169)
+(20327,42244,20231,42212)
+(33671,12700,33666,12630)
+(42144,32642,42128,32569)
+(26590,19483,26503,19442)
+(21741,46259,21723,46226)
+(8822,34700,8760,34693)
+\N
+(2710,33521,2675,33505)
+(26067,19998,26026,19989)
+(12244,34509,12202,34489)
+\N
+(47162,598,47119,499)
+(33093,49382,33068,49359)
+(35170,26340,35153,26264)
+(22552,35785,22490,35735)
+(36791,23032,36781,22976)
+(22857,10857,22833,10797)
+\N
+(47207,37405,47138,37365)
+(21867,2836,21854,2811)
+(3387,31487,3311,31456)
+(47174,48121,47167,48101)
+(24415,22232,24366,22224)
+(7970,29251,7959,29211)
+(18635,31294,18539,31221)
+(8403,13380,8370,13372)
+(738,18097,737,18054)
+(37238,19195,37218,19114)
+(582,47934,570,47897)
+(12359,4635,12350,4619)
+(43272,2013,43195,1958)
+(47568,27149,47521,27088)
+(24695,12827,24661,12796)
+(26259,14077,26168,14019)
+\N
+(48478,36135,48425,36092)
+(5230,39250,5206,39174)
+(3488,18562,3423,18489)
+(39502,16331,39460,16275)
+(18296,1478,18233,1471)
+\N
+(28627,12430,28559,12410)
+(25257,21981,25206,21954)
+\N
+(2410,41192,2325,41142)
+(43681,9631,43587,9538)
+\N
+(15086,45309,15064,45270)
+(13824,40807,13759,40787)
+(7090,2207,7062,2159)
+(3685,2480,3630,2391)
+(14810,38335,14801,38275)
+(26668,38018,26581,38012)
+(45562,1517,45506,1424)
+(11001,32481,10962,32402)
+(27743,25245,27673,25161)
+(15952,10598,15948,10535)
+(12705,13308,12694,13232)
+(31992,21195,31975,21118)
+(25834,16652,25745,16626)
+(21022,43625,20990,43576)
+(45094,27254,45000,27240)
+(9688,42601,9643,42533)
+(17746,24659,17694,24616)
+(1509,38859,1503,38809)
+(2067,20438,2041,20369)
+(7885,44528,7839,44444)
+(27432,33052,27422,32987)
+(26577,17157,26563,17142)
+(10815,35985,10734,35908)
+(44891,24067,44794,23979)
+(48626,1900,48595,1850)
+\N
+(40659,35541,40659,35489)
+(22231,26628,22210,26579)
+(37408,23016,37375,22919)
+(5920,15916,5906,15895)
+\N
+(33125,9952,33037,9880)
+(12142,29705,12141,29670)
+(3672,20995,3649,20899)
+(39147,31967,39101,31907)
+\N
+(33812,48458,33748,48399)
+(25038,14639,24978,14586)
+(3859,16010,3857,15994)
+(31926,39496,31889,39417)
+(49300,28064,49297,28026)
+(24121,38305,24048,38256)
+(9252,4205,9155,4149)
+(36124,30451,36056,30395)
+(28809,49557,28794,49533)
+(30500,44504,30471,44476)
+(26866,42395,26822,42332)
+(48195,1784,48101,1734)
+(46201,14109,46112,14097)
+\N
+(2415,9975,2354,9914)
+(30485,9581,30415,9558)
+(6385,36838,6305,36838)
+(2799,11189,2723,11095)
+(21998,20503,21923,20406)
+(29151,10714,29090,10671)
+(28850,29276,28757,29207)
+(43386,48845,43305,48834)
+(25173,8310,25101,8294)
+(34244,32352,34204,32342)
+(35595,23728,35533,23672)
+(1122,13581,1119,13538)
+\N
+(388,21716,296,21678)
+(48782,11064,48701,11005)
+(40293,12997,40213,12927)
+\N
+(28194,46428,28113,46414)
+(4791,18118,4708,18105)
+(471,29808,448,29775)
+(3536,37803,3447,37737)
+(1336,28416,1275,28392)
+(16484,48478,16422,48454)
+(25846,19320,25811,19296)
+(48669,27703,48575,27615)
+(24032,44217,24029,44127)
+(12236,5019,12233,4986)
+(1179,29838,1113,29778)
+(33893,22049,33867,21955)
+(16718,19462,16700,19440)
+(17992,49438,17894,49433)
+(35163,39941,35081,39885)
+(33897,8362,33853,8328)
+(2480,6640,2456,6599)
+(28011,19729,27937,19679)
+(15819,41516,15809,41440)
+(29818,9136,29747,9089)
+(28551,37016,28529,36941)
+(36406,26879,36374,26872)
+(16821,48925,16758,48914)
+(23692,48163,23595,48160)
+\N
+(4803,10619,4759,10522)
+(46600,33581,46553,33518)
+(41349,11767,41310,11710)
+(20856,29642,20799,29562)
+(16559,46161,16504,46131)
+(23041,1300,23003,1287)
+(16630,44902,16554,44853)
+(43065,14299,43013,14274)
+(24818,22397,24796,22348)
+(22282,24949,22218,24921)
+(36668,28538,36631,28456)
+(8080,1220,8018,1146)
+(47282,34302,47277,34269)
+(35603,33558,35557,33495)
+(44764,32189,44700,32175)
+\N
+(46488,23965,46449,23868)
+(46314,15047,46216,15013)
+(6348,25381,6286,25363)
+(3871,49288,3819,49251)
+(462,38894,398,38867)
+(23196,29214,23136,29169)
+(29024,9775,29016,9759)
+(42016,18555,41934,18472)
+(8772,45981,8692,45973)
+(11028,1351,10986,1278)
+(26684,21668,26641,21656)
+\N
+(37262,26005,37260,25947)
+(14899,44069,14814,44066)
+\N
+(39635,18701,39587,18698)
+(28528,22948,28457,22857)
+(7755,36528,7681,36454)
+(32461,1172,32427,1106)
+\N
+(18775,27359,18736,27329)
+(15379,20031,15337,19934)
+(45888,33592,45881,33544)
+(44013,24694,43962,24645)
+\N
+(43347,10699,43343,10699)
+(49999,27218,49908,27176)
+(13698,17326,13630,17317)
+(34850,44313,34775,44302)
+(38076,49235,37983,49214)
+(35570,40218,35500,40136)
+(40062,28973,40032,28878)
+(3567,39847,3523,39781)
+(498,2442,480,2401)
+(29660,43620,29577,43561)
+(10946,47356,10878,47351)
+(8073,44233,8005,44144)
+(9720,13473,9710,13462)
+(3643,38014,3598,37932)
+(16887,1408,16810,1375)
+(7559,27914,7508,27874)
+(30356,18573,30275,18569)
+(12193,48176,12130,48116)
+(11884,7756,11819,7731)
+(18293,33272,18227,33234)
+(46697,47874,46696,47828)
+(35788,32517,35760,32446)
+(33877,36987,33821,36958)
+(31253,22819,31184,22808)
+(7744,23115,7729,23103)
+(21291,39817,21219,39778)
+(13877,43379,13861,43290)
+(42955,1406,42876,1382)
+(49232,15950,49210,15880)
+(48419,32001,48326,31902)
+(18940,43246,18860,43150)
+(32317,38240,32310,38201)
+(11307,48298,11304,48222)
+(38015,18190,38000,18176)
+(27821,1177,27818,1131)
+(18935,26757,18865,26682)
+(42659,48284,42562,48244)
+(30185,23350,30146,23291)
+\N
+(16496,11970,16441,11919)
+(162,26040,120,25963)
+(24238,47784,24185,47746)
+(32326,8612,32274,8568)
+(26141,13423,26051,13407)
+(40132,22815,40089,22812)
+(21151,48794,21056,48740)
+\N
+(22044,28358,22031,28334)
+(6680,14746,6605,14669)
+(40686,25139,40632,25070)
+(22823,27549,22816,27507)
+(2513,22841,2427,22811)
+(36316,27787,36218,27728)
+(554,35489,540,35441)
+(536,30674,534,30609)
+\N
+(25385,38468,25295,38416)
+(19467,47386,19437,47317)
+(22425,38591,22387,38536)
+(32493,17321,32396,17298)
+(40115,47315,40109,47235)
+(25002,2107,24963,2104)
+(3901,9790,3898,9706)
+\N
+(40316,1721,40315,1658)
+(40089,3454,40074,3443)
+(793,17897,761,17897)
+(6490,43552,6434,43522)
+(10825,487,10820,405)
+(47703,36067,47641,36011)
+\N
+(4480,11671,4468,11653)
+(37713,10642,37711,10615)
+(12315,5302,12273,5203)
+\N
+(8709,6617,8647,6557)
+(24467,30535,24455,30494)
+(40440,32757,40369,32668)
+(49449,42447,49426,42428)
+(44867,11197,44792,11137)
+(39173,33241,39143,33187)
+(43836,2212,43803,2184)
+(23819,47613,23739,47575)
+(20583,2134,20485,2042)
+(48922,6169,48889,6111)
+(5230,44613,5131,44604)
+(37060,8051,37032,7975)
+(19148,36711,19112,36704)
+(36305,4216,36243,4118)
+(6329,39089,6302,39047)
+(36703,26367,36623,26307)
+(44753,19721,44701,19631)
+(42094,43310,42094,43285)
+(4276,22377,4241,22352)
+(30329,18906,30327,18815)
+(21970,19605,21871,19590)
+(23722,41924,23709,41861)
+(30965,39775,30908,39692)
+(32394,37895,32351,37890)
+(23968,42162,23873,42095)
+(1776,2621,1732,2548)
+(24951,47758,24900,47679)
+(32917,35771,32847,35753)
+(5428,27773,5343,27769)
+\N
+(19650,142,19630,51)
+(39769,17276,39743,17229)
+(5171,24562,5119,24470)
+(32976,35249,32917,35199)
+\N
+(4174,24603,4099,24504)
+(38565,36960,38535,36926)
+(39084,4328,39031,4301)
+(32153,38043,32070,37990)
+(38085,30640,38041,30603)
+(14269,18426,14185,18422)
+(42941,30850,42892,30788)
+(32403,25999,32339,25960)
+(16906,191,16816,139)
+(3456,48722,3418,48721)
+(3050,18287,3022,18243)
+(6331,8439,6234,8364)
+(5331,20797,5319,20793)
+(39225,37408,39216,37348)
+(34510,19838,34488,19810)
+(45789,33873,45770,33786)
+(369,1457,278,1409)
+(16531,43785,16482,43729)
+(11974,14789,11973,14730)
+(23128,6811,23094,6798)
+(43962,33659,43944,33599)
+(20967,3115,20947,3079)
+(39257,38606,39241,38595)
+(22431,8246,22381,8235)
+(26007,14672,25996,14593)
+(24762,4261,24675,4261)
+(35402,32077,35343,31988)
+(5141,16476,5139,16393)
+(16439,17564,16344,17472)
+(36983,46663,36903,46567)
+(35170,14144,35162,14048)
+(22290,7841,22283,7810)
+(22414,38398,22404,38319)
+(9011,18177,8932,18150)
+\N
+(154,4019,138,3990)
+(20447,4998,20383,4970)
+(38867,35757,38795,35659)
+(32322,15845,32227,15804)
+\N
+(29889,12142,29852,12055)
+(36235,36918,36217,36897)
+(41620,6581,41568,6581)
+(24758,38504,24731,38483)
+(42524,12904,42473,12895)
+(17954,49975,17865,49915)
+(1938,39019,1927,39013)
+(4864,33279,4817,33258)
+(45373,41967,45313,41885)
+(28786,19028,28782,18978)
+(41913,44950,41911,44908)
+(33408,14698,33392,14681)
+(27602,3460,27576,3419)
+(3336,3728,3334,3715)
+(9099,910,9080,813)
+(34141,6403,34071,6367)
+(48270,17216,48252,17130)
+(2549,16546,2461,16474)
+(27802,33669,27735,33642)
+(48419,1682,48323,1583)
+(5094,41211,5002,41123)
+(11192,6217,11190,6146)
+(6979,18503,6959,18421)
+(41210,48187,41140,48143)
+(15303,29527,15273,29441)
+(12326,45572,12267,45570)
+(29293,5861,29212,5826)
+(23847,37241,23761,37178)
+(44656,23926,44653,23831)
+(30043,16194,29977,16105)
+(902,9358,879,9339)
+(23850,46501,23834,46494)
+(42333,13300,42287,13246)
+(25226,18086,25169,18005)
+(40252,12082,40183,12038)
+(49275,18076,49216,18055)
+(8255,28878,8238,28862)
+(11325,41286,11320,41235)
+(16948,18588,16926,18528)
+(31394,1099,31374,1038)
+(30705,35772,30637,35766)
+(3858,39131,3771,39125)
+(17565,24892,17515,24808)
+(9221,49715,9216,49661)
+(44945,25769,44875,25722)
+(33408,13563,33310,13527)
+(48505,4407,48408,4373)
+(21859,37217,21763,37217)
+(39393,14422,39335,14364)
+\N
+(19905,1154,19841,1098)
+(25946,10388,25906,10366)
+(10104,13748,10027,13746)
+(5822,24629,5820,24599)
+(38194,11287,38127,11252)
+(15694,46757,15625,46716)
+(326,18837,285,18817)
+(49611,47078,49533,47052)
+(48233,18850,48150,18842)
+\N
+(29239,9962,29208,9875)
+(40062,44554,39973,44460)
+(19135,20729,19059,20643)
+(31969,40664,31896,40643)
+\N
+(3725,9191,3711,9095)
+(44280,40158,44264,40108)
+(37236,42756,37160,42694)
+(27958,19055,27888,18959)
+(45270,17661,45187,17601)
+(12115,39546,12061,39525)
+(10227,32295,10168,32231)
+(39264,31123,39226,31085)
+(6566,40000,6532,39904)
+(30058,6975,30012,6903)
+(49631,6909,49597,6823)
+(42168,10926,42134,10905)
+(44892,30042,44858,29970)
+(19540,19803,19495,19788)
+(18403,25454,18371,25404)
+(22929,26795,22841,26722)
+(16648,30213,16626,30174)
+(3440,7495,3429,7468)
+(30708,49028,30643,48998)
+(26258,14164,26255,14151)
+(44206,31653,44121,31637)
+(1510,15179,1426,15130)
+(6986,30496,6887,30416)
+(7192,43403,7138,43339)
+(39921,22071,39866,21976)
+(45870,17011,45796,16919)
+(15939,9563,15917,9539)
+(23728,24737,23691,24725)
+(6444,40416,6363,40375)
+(21899,23861,21857,23765)
+(20610,36765,20533,36742)
+(46520,33082,46433,32983)
+(21406,20902,21311,20895)
+\N
+(37913,42300,37814,42269)
+(18216,8177,18161,8173)
+(32967,8258,32899,8244)
+(14978,40230,14971,40149)
+(30343,39152,30266,39101)
+(25917,5835,25843,5806)
+\N
+(5169,45366,5141,45314)
+\N
+(16221,20898,16209,20875)
+(13151,19869,13145,19811)
+(44399,2801,44337,2713)
+\N
+(10959,48311,10957,48230)
+(4794,11711,4732,11661)
+(764,10149,762,10091)
+(15985,46067,15898,46028)
+(41434,22870,41342,22867)
+(43769,23796,43743,23756)
+(10017,18440,9919,18384)
+(21141,43119,21097,43112)
+(7782,13424,7694,13398)
+(25088,36224,25059,36150)
+(46325,48722,46241,48631)
+\N
+(11042,33125,11011,33071)
+(22347,13460,22290,13375)
+(3508,20538,3483,20536)
+(5331,42945,5272,42875)
+\N
+(2368,15537,2339,15503)
+(45314,31830,45254,31817)
+(34358,2649,34319,2589)
+\N
+(17576,30407,17572,30323)
+(29836,41324,29746,41287)
+(21036,39996,21014,39899)
+(26886,6460,26787,6400)
+(15709,5625,15627,5558)
+(37415,15979,37414,15911)
+(47761,16860,47728,16813)
+(35814,48252,35755,48173)
+\N
+(28559,20810,28496,20715)
+(12034,11921,12002,11905)
+(1818,27450,1805,27406)
+(33810,45499,33806,45413)
+(17376,18175,17323,18138)
+(34106,28135,34049,28106)
+(44947,23165,44919,23091)
+(37670,41904,37616,41840)
+(12614,15027,12555,14969)
+(43301,75,43227,43)
+\N
+(27526,15096,27450,15088)
+(26947,33409,26853,33333)
+(1537,43572,1471,43499)
+\N
+(21607,35452,21605,35375)
+(24869,46565,24818,46531)
+(4774,30335,4723,30257)
+(11615,18316,11579,18310)
+(18444,15819,18354,15763)
+(47267,22574,47203,22518)
+(22287,49538,22203,49511)
+(43010,16270,43010,16202)
+\N
+(1623,8350,1578,8254)
+(21220,43808,21137,43748)
+(40397,16471,40358,16434)
+\N
+(34839,1377,34744,1327)
+(17096,5730,17090,5637)
+\N
+(28156,37782,28155,37723)
+(3672,5686,3586,5638)
+(21856,48656,21840,48638)
+(6907,7791,6892,7761)
+(17952,21370,17862,21350)
+(37793,13461,37784,13381)
+(14740,49655,14709,49604)
+(21690,6337,21593,6289)
+\N
+(10423,33548,10364,33498)
+\N
+(39187,23274,39136,23197)
+\N
+(21882,37247,21835,37167)
+\N
+(11343,16957,11281,16914)
+(38279,43400,38264,43352)
+(23167,30271,23086,30224)
+(46278,6037,46180,5964)
+(28626,31165,28605,31095)
+\N
+(31018,367,30946,333)
+(23541,12541,23530,12523)
+(49741,14535,49691,14511)
+(31444,12702,31425,12612)
+\N
+(22406,26536,22316,26534)
+(6807,9761,6758,9723)
+(15698,1941,15687,1848)
+(49310,4625,49295,4584)
+(21345,18939,21269,18887)
+(31433,30493,31411,30439)
+(44980,12400,44950,12372)
+(25054,13949,24984,13949)
+(40538,7253,40483,7212)
+(16967,8627,16936,8604)
+(26872,3646,26804,3594)
+(24575,42883,24530,42883)
+(11823,5755,11771,5721)
+\N
+(2553,46189,2513,46174)
+(24993,14552,24898,14470)
+(28453,1719,28419,1665)
+(8925,22603,8878,22589)
+(47635,15380,47546,15378)
+(35378,18112,35324,18058)
+(27347,22264,27293,22200)
+\N
+(44323,29044,44273,28958)
+(41538,38324,41484,38290)
+(19128,49932,19112,49849)
+(17904,12548,17867,12503)
+(35103,14426,35092,14336)
+(29807,10142,29714,10052)
+(44507,22903,44462,22847)
+(11419,13324,11399,13251)
+(8573,42221,8562,42123)
+(46798,45843,46765,45765)
+(12028,31783,11967,31749)
+(10635,45300,10604,45251)
+(9626,8248,9587,8194)
+(18290,741,18246,732)
+(39949,44672,39932,44641)
+(7897,11692,7893,11637)
+(20165,42246,20112,42168)
+(4341,48390,4285,48338)
+(30126,28913,30088,28869)
+(40565,1733,40472,1721)
+(9981,30147,9915,30133)
+(47292,25511,47217,25462)
+(20137,24489,20104,24392)
+(2385,28283,2381,28189)
+(20429,10052,20357,10009)
+(8395,38568,8348,38480)
+(17381,36112,17349,36038)
+(37845,30953,37759,30926)
+(27452,12732,27411,12652)
+(38196,32186,38114,32116)
+\N
+(6527,49356,6508,49315)
+(43891,29789,43856,29723)
+(6146,37192,6085,37107)
+\N
+(42012,28897,41939,28808)
+\N
+(14909,13815,14846,13757)
+(11120,24095,11035,24049)
+(3132,41545,3053,41526)
+(40084,40315,39994,40261)
+(39671,17445,39576,17361)
+(47135,35853,47085,35831)
+(39297,1941,39290,1911)
+(47143,35898,47072,35880)
+(16017,6711,15989,6686)
+(47110,30305,47087,30213)
+(38102,27639,38091,27602)
+(17954,22544,17863,22453)
+(39891,11791,39815,11739)
+(13996,20290,13922,20278)
+(22284,23143,22190,23081)
+(25345,24019,25313,24017)
+(47134,44803,47055,44761)
+(41360,16573,41326,16503)
+(10464,1071,10457,998)
+\N
+(23515,47517,23451,47499)
+(9308,8452,9238,8392)
+(28695,5657,28671,5644)
+(45104,9913,45077,9871)
+(337,455,240,359)
+(11562,45479,11472,45428)
+(11952,18466,11931,18425)
+\N
+(35789,5154,35775,5128)
+(19024,18299,18979,18230)
+(43056,38113,42975,38067)
+(10075,26847,10064,26806)
+(3065,8107,3029,8038)
+(24766,19059,24749,18985)
+(14438,24805,14413,24708)
+(9523,3058,9485,2998)
+(24516,31262,24478,31204)
+(49513,26044,49434,26035)
+(14110,38528,14103,38461)
+(31679,35618,31619,35618)
+(10029,20258,10008,20248)
+(39269,37586,39233,37539)
+(12343,8197,12247,8113)
+(11155,44223,11111,44134)
+(25437,20606,25338,20534)
+(46604,16156,46570,16131)
+(4636,14004,4592,13941)
+(15975,29628,15912,29556)
+(49887,24274,49805,24184)
+(11812,13440,11723,13418)
+(21589,38179,21531,38085)
+(32255,44463,32219,44454)
+(15023,12698,14989,12687)
+(28906,48630,28818,48568)
+(28886,38905,28861,38832)
+(34786,22285,34740,22240)
+\N
+(46513,46780,46425,46780)
+\N
+(26626,31759,26551,31677)
+(19792,25967,19763,25933)
+(20432,14394,20388,14365)
+(27092,7301,27052,7278)
+(22283,987,22198,928)
+(6197,24363,6112,24311)
+(46601,49259,46551,49231)
+(12392,48052,12363,48038)
+(46116,31386,46067,31356)
+(7354,16855,7289,16778)
+(47501,42808,47495,42761)
+(16461,25487,16391,25398)
+(42678,18798,42678,18756)
+(9466,18207,9419,18185)
+(17467,14177,17416,14097)
+(28533,31886,28487,31832)
+(13225,38472,13188,38395)
+(5180,40970,5173,40902)
+(83,10271,15,10265)
+(2111,6784,2016,6690)
+(41835,11064,41798,10995)
+(29273,48585,29181,48536)
+(29066,21615,28985,21543)
+(19805,44143,19727,44128)
+(48919,21468,48875,21467)
+(28790,34287,28721,34251)
+(10911,33074,10869,32989)
+(6111,16519,6032,16489)
+(43889,33838,43837,33768)
+(32323,21685,32304,21644)
+(9552,27819,9539,27753)
+(38266,49852,38233,49844)
+(37672,48362,37663,48277)
+(32550,47029,32529,46931)
+(46307,6620,46272,6616)
+(23192,46608,23105,46566)
+(30399,48330,30335,48239)
+(36268,25058,36235,24984)
+(19181,8120,19089,8098)
+(24376,19983,24294,19925)
+(18297,18375,18202,18292)
+\N
+(31608,6215,31575,6168)
+(12788,49510,12784,49468)
+(46071,13013,46035,12991)
+(27647,8218,27582,8201)
+(49580,11076,49537,11050)
+\N
+(35501,33782,35501,33687)
+(19969,3148,19964,3082)
+(37728,49153,37726,49152)
+(5322,48440,5321,48435)
+(48003,10096,47904,10005)
+(39361,22318,39348,22236)
+(30488,7456,30437,7430)
+(18533,39476,18481,39394)
+(39462,23701,39433,23604)
+(26701,18300,26686,18235)
+(17405,35577,17387,35517)
+(33971,29928,33953,29919)
+(6328,10241,6276,10217)
+(32459,44259,32453,44217)
+(1715,42385,1647,42357)
+(48113,6960,48103,6872)
+(30561,4255,30476,4240)
+(38907,43619,38827,43553)
+(29149,20773,29070,20698)
+(17006,1543,16970,1497)
+\N
+(11737,18808,11714,18788)
+(13019,30534,13005,30481)
+(39224,31729,39191,31683)
+(4942,41680,4907,41596)
+(12287,37187,12188,37172)
+(30758,29579,30725,29531)
+\N
+(16604,17963,16581,17912)
+(19459,15888,19409,15812)
+(34696,24783,34600,24725)
+(21621,14159,21558,14110)
+(12193,46149,12145,46096)
+(37781,4715,37692,4635)
+(41854,44125,41807,44040)
+(23604,23585,23571,23533)
+(7853,36967,7797,36908)
+(2755,13279,2720,13206)
+(4314,15424,4283,15383)
+(29584,12685,29493,12594)
+(25138,33726,25042,33691)
+(38393,10270,38326,10185)
+(4247,12615,4225,12567)
+(36100,33156,36100,33107)
+(20024,40796,20016,40708)
+(3927,44892,3914,44843)
+(10317,43168,10226,43096)
+(22057,3419,22042,3334)
+(37097,21814,37025,21811)
+(32084,21564,31996,21491)
+(34079,39921,34058,39911)
+(23078,47459,23018,47373)
+(38109,616,38082,568)
+(11862,40382,11764,40292)
+(33403,33320,33389,33289)
+(36639,24829,36623,24829)
+(12995,45080,12992,45040)
+(16545,19981,16532,19891)
+(26155,10659,26154,10634)
+(24423,255,24360,213)
+(823,22487,781,22442)
+(12823,20064,12735,20040)
+(19688,11710,19681,11654)
+(2892,20452,2836,20424)
+(15533,10807,15464,10711)
+(46994,41143,46955,41082)
+(18155,2421,18069,2392)
+(2628,12688,2605,12602)
+(35128,8396,35044,8365)
+(44765,49615,44758,49524)
+(11226,44529,11178,44515)
+(31334,32463,31291,32456)
+(43224,23387,43168,23364)
+(30882,10414,30798,10395)
+(29139,967,29139,923)
+(29959,45244,29877,45223)
+(19946,217,19941,118)
+(49732,22033,49642,22012)
+(32914,15360,32879,15290)
+(47825,21097,47747,21030)
+(10788,5131,10746,5086)
+\N
+(15497,9698,15481,9678)
+(10617,47195,10601,47117)
+(42392,10583,42340,10550)
+(10753,33520,10669,33509)
+(5553,21580,5521,21527)
+(36840,12336,36817,12320)
+(49785,12554,49702,12553)
+(17737,38349,17639,38277)
+(48000,7823,47956,7814)
+(5019,3184,4931,3160)
+(30120,3524,30063,3492)
+(37044,2016,37001,1942)
+(23496,38566,23469,38528)
+(17255,48957,17200,48903)
+(27815,2138,27808,2090)
+(40440,11129,40368,11105)
+(35305,21772,35272,21717)
+(41308,45065,41229,44973)
+(14893,28807,14817,28789)
+(30776,45824,30731,45772)
+(742,40724,652,40672)
+(5985,41133,5927,41097)
+(9576,10226,9540,10218)
+(21407,23207,21323,23160)
+(44880,34228,44877,34169)
+(29146,49694,29143,49682)
+(28502,34886,28471,34832)
+\N
+(30662,5584,30604,5528)
+(12612,26081,12552,26001)
+(17166,49308,17098,49270)
+(9586,14116,9488,14104)
+(37323,47576,37264,47482)
+(48009,49713,48004,49614)
+(49308,23780,49297,23760)
+(8667,32342,8592,32294)
+(37826,48560,37822,48485)
+\N
+(24493,18653,24486,18616)
+(17914,3850,17887,3775)
+(34270,43873,34231,43826)
+(7753,44715,7660,44651)
+(44328,36364,44265,36350)
+(10146,3030,10111,2975)
+(35273,40106,35269,40062)
+\N
+(38566,43846,38547,43760)
+(12400,41394,12377,41378)
+(45196,38286,45153,38250)
+(48511,14972,48428,14883)
+(25939,36328,25886,36277)
+(38997,11007,38979,10917)
+(30342,518,30244,453)
+(6876,7468,6867,7454)
+(17566,27575,17566,27480)
+(18869,28538,18858,28475)
+(16825,33309,16726,33255)
+(14585,26111,14490,26035)
+(28743,49392,28664,49349)
+(26652,23359,26618,23297)
+\N
+(40129,33653,40102,33584)
+(41074,26393,41038,26389)
+(3869,33564,3869,33536)
+(28455,14205,28364,14163)
+(13866,45603,13770,45543)
+(21666,30586,21578,30544)
+(29978,11931,29893,11868)
+(1594,1043,1517,971)
+(948,1201,907,1156)
+(27547,13692,27545,13677)
+(13661,38184,13566,38154)
+(2389,40026,2317,39938)
+(35481,46379,35481,46320)
+\N
+(26917,45698,26864,45689)
+(23933,41617,23909,41539)
+(8912,8471,8862,8401)
+(9625,4747,9558,4692)
+(34743,35056,34721,34969)
+(39544,21762,39475,21717)
+\N
+(11741,26330,11656,26293)
+(39015,1315,38966,1285)
+(13418,44237,13326,44202)
+(2107,17672,2093,17616)
+(42448,28844,42370,28764)
+(49843,5175,49808,5145)
+(6536,23000,6467,22958)
+(11114,5822,11027,5739)
+(48457,11074,48384,11024)
+(12343,23110,12310,23074)
+(17300,24847,17276,24825)
+(8823,8253,8793,8238)
+(3449,171,3354,108)
+\N
+(21650,23955,21605,23883)
+(13260,3234,13193,3214)
+(25361,10896,25305,10806)
+(25051,25042,25011,25001)
+(25044,25088,25015,25005)
+\N
+(25007,25061,25002,25013)
+(25066,25105,25003,25007)
+(25028,25012,25015,25011)
+(25031,25057,25006,25018)
+(25015,25042,25004,25012)
+(25091,25049,25019,25019)
+(25023,25011,25000,25004)
+\N
+(25053,25104,25010,25012)
+(25058,25001,25018,25000)
+(25059,25051,25008,25016)
+(25043,25069,25007,25004)
+(25006,25101,25002,25002)
+(25095,25012,25014,25007)
+(25054,25052,25019,25013)
+(25108,25077,25009,25018)
+(25007,25023,25003,25002)
+\N
+(25076,25098,25002,25016)
+(25030,25077,25012,25006)
diff --git a/contrib/pageinspect/data/test__int.data b/contrib/pageinspect/data/test__int.data
new file mode 100644
index 0000000..b3903d0
--- /dev/null
+++ b/contrib/pageinspect/data/test__int.data
@@ -0,0 +1,7000 @@
+{18,31,54,95}
+{23,50,13,9,39}
+{99,54,77}
+{79,83,16,63,32}
+{52,41,61,79,94,87}
+{76,59,39,36,21}
+{}
+{41,79,76,96,3}
+{25,59,5,96,32}
+{92,58,12,57}
+{24,48,41,88}
+{39,5,17}
+{10,41,78,25,35}
+{31,89,4}
+{68,74,94}
+{97,78,44,68,81,16}
+{87,76}
+{30,81}
+{72,20,99,26}
+{87,90,98,40,44}
+{24,99,66,61}
+{79,8,48,16}
+{62,99,48,80,75,39}
+{10,60,35,15}
+{45,71,10,97,56}
+{64,79,19,31}
+{30,57,42,31,45}
+{61,42,14,26}
+{12,38,65,36,56,36}
+{17,62,18,56}
+{84,85,90,60,55,17}
+{27,11,82,20,43}
+{14,27,18,48,39,51}
+{53,13,52}
+{56,35,81,60,27}
+{79,89,89,7}
+{65,17,31,17,29,85}
+{21,3}
+{53,55,16,83,4}
+{62,3,63}
+{73,40,99}
+{23,80}
+{2,74,42,37,21}
+{12,16}
+{80,60}
+{19,62,34}
+{38,19,31,6,15,2}
+{63,96,64,4,36,15}
+{9,3}
+{91,87,15,18,7,66}
+{17,10}
+{77,96}
+{11,43,31,2,89}
+{17,77,89,50}
+{24,6,61,88,51}
+{61,50,59,90,5,89}
+{58,1,39,48}
+{78,36,70,92}
+{43,3,22,95,51}
+{}
+{88,64,25,64,86}
+{34,6,49,90,25}
+{86,35,13,22}
+{21,44,83}
+{42,88,72,65,59,96}
+{36,33,1,98}
+{16,54}
+{35,16,44}
+{73,23,20}
+{84,25,1,52,35}
+{27,36,54,87,31}
+{38,47,83,3}
+{64,13}
+{65,84,85,16,22}
+{57,9,39,73}
+{89,11,67,55,73}
+{78,39,84,63,62,45}
+{50,63,8}
+{}
+{96,36,58,65,96}
+{59,86,41,30}
+{90,60,39,47,19}
+{70,100,73,99}
+{}
+{85,14,39}
+{76,53}
+{96,38,52,13,87,85}
+{97,51,15,30,53,87}
+{30,59,9,40,13}
+{31,91,68,79}
+{37,56,39,78,75}
+{82,2,47}
+{33,25,45,40}
+{51,21,92,20,18,76}
+{84,93,36,95,34,69}
+{66,25,5,40}
+{77,6,57,42}
+{}
+{88,81,85,37,12}
+{56,73,38}
+{70,70,6,19}
+{82,54,91}
+{75,8}
+{45,33,64,90,95}
+{8,71,66,12}
+{56,26,68,94}
+{70,77,4,96,62,83}
+{23,87}
+{34,34,4,33}
+{28,84}
+{78,75,77}
+{88,53}
+{27,38}
+{2,2,82}
+{30,52,88,61,33}
+{29,72,94,68}
+{85,72}
+{88,4}
+{63,90,43,66,24,33}
+{88,48,47}
+{3,11,98,37,61}
+{45,65,63,15,38}
+{79,45,56,94}
+{56,74,78,19,76}
+{24,81,64,13,100}
+{93,27,63,71,27,3}
+{74,13,85,86,32,60}
+{98,40,63,13}
+{41,95,19,93,17,84}
+{90,28,100,100,19,2}
+{35,15,54}
+{29,81,77}
+{54,64,63,12,18}
+{38,43,85,21,35}
+{84,28,27,4,80,27}
+{80,77,55,98}
+{13,71,48,55,89,38}
+{58,43,27,5,57}
+{5,33,96,6}
+{73,93,87,69,100,24}
+{58,96,38,85,55,51}
+{37,30,88,4,8,59}
+{24,68,43,48,18,84}
+{23,100,82,30,42}
+{23,36,16,99,27}
+{41,75}
+{66,41,10,37,16,6}
+{54,49,60}
+{4,56,44,72,40}
+{71,96,67,100,59}
+{7,41}
+{8,3,27}
+{38,69,47,68,5,24}
+{43,100,59,62}
+{92,14,34,5,71,48}
+{72,5,91,29,99,36}
+{62,71,37,80,62,50}
+{32,45,17}
+{89,68}
+{52,17,55}
+{21,47,15,92}
+{36,100,5}
+{14,76,59,11,15}
+{59,72}
+{37,55,89,49}
+{87,79,96,20,93}
+{6,44}
+{32,46,25}
+{27,47,76,4,54}
+{2,16}
+{90,36}
+{11,19,27,79}
+{54,4}
+{72,88}
+{14,85,71,69,5,22}
+{31,48}
+{28,35,18}
+{77,55,100,73,57,62}
+{}
+{14,59,53}
+{98,3}
+{13,56}
+{26,61,88,54,88,33}
+{70,12}
+{55,16,15,42,76}
+{13,75}
+{97,38,82,51,86,53}
+{41,76,39,84,32}
+{94,66,47}
+{55,28}
+{}
+{94,65,59,20}
+{55,50,56,14,58}
+{14,94,52,25,69,95}
+{20,96}
+{37,38}
+{26,35,9,98,74}
+{11,9,41,79}
+{36,57,87,69,92,89}
+{11,39,60,4,47,3}
+{97,5}
+{16,58,38,98,42}
+{46,69}
+{35,54}
+{36,79,54}
+{}
+{63,78}
+{12,86,52,29,60,30}
+{29,27,58,86,42,62}
+{42,12,60}
+{90,93,85,29}
+{16,8,45}
+{29,33,85}
+{32,14,6,47,74}
+{14,85,14,26,3}
+{46,71,10,16}
+{30,63}
+{}
+{91,30,56}
+{46,36,68,91,36,88}
+{24,61}
+{66,21,80,14}
+{43,63,50,21,11}
+{38,46,18,51}
+{38,28,70}
+{17,41,76,1,30}
+{47,63}
+{56,80,85,1,7,97}
+{75,5,79,32}
+{5,17,66,51,68}
+{6,83,2}
+{25,40,79,84}
+{58,38,12,68}
+{55,86,20,67,27}
+{58,64}
+{14,51}
+{12,86,57,68}
+{61,91,65,3,83,68}
+{40,31,82,21}
+\N
+{24,64,35,32}
+{32,83,18,27,43,32}
+{50,83}
+{94,84,58,3,25,79}
+{66,2,27,36,24}
+{71,34}
+{17,57}
+{22,40,49,50,10}
+{79,62,94,78}
+{92,79,24,72}
+{23,41}
+{69,60,77,70,18,48}
+{39,45,91,85}
+{27,43,22,21,85}
+{84,51,96,7,18}
+{100,38,69,93,66,39}
+{73,42,35,15,69,98}
+{100,17,37,15,40}
+{1,91,2,17,90,48}
+{18,12,52,24}
+{39,43,89}
+{16,13,88}
+{69,8,75}
+{34,91,54,81}
+{37,68,89,1,56}
+{81,83,39,36,14}
+{12,15,2}
+{14,16,88,43}
+{59,12}
+{1,62,21,94}
+{29,43,70,52,93}
+{29,36,56,78}
+{91,56,86,89,53}
+{14,83,39,94}
+{29,58,72,4,45}
+{76,56,84,28,58}
+{4,52,6,88,43,17}
+{21,1,35,62,77,6}
+{78,74}
+{1,20,93,43}
+\N
+{30,100,35,94,74,64}
+{81,3,21,4}
+{9,19,33}
+{28,62,40,64,26}
+{69,72,26,30,90}
+{52,70,78,43}
+{91,58,33,22,92,26}
+{98,36,96,94,66}
+{86,43,82}
+{93,52,4,58,51}
+\N
+{49,61,80,79,90}
+{50,81,72}
+{57,29}
+{54,31,36}
+{52,31,6,48,2}
+{4,51,37,83,17}
+{60,20,94,82,18}
+{52,64,26,81,69,61}
+{39,8,22,2,8}
+{31,25,95,99}
+{11,72,30,95,20,28}
+{78,87}
+{21,40,98,41,73,33}
+{67,88,42,62,11,47}
+{85,1}
+{4,68,100,72,24}
+{82,43}
+{97,55,47,52}
+{51,52}
+{20,21}
+{69,46,34,59,54,61}
+{9,31,43}
+{68,20}
+{73,63}
+{71,12,93,8,48,10}
+{44,46,42,91,21}
+{98,52}
+{45,60}
+{95,38,30,3}
+{27,77,2,46,53,18}
+{99,5}
+{79,33,34,48,82}
+{3,29,82,72,35}
+{73,75,83}
+{25,43,37,26}
+\N
+{51,95,40}
+{18,23,10,90,15,20}
+{85,66}
+{25,76,22,87,88,18}
+{92,4}
+{27,51}
+{25,77,12,37}
+{44,52,69,39,21,63}
+{94,30,74,36}
+{60,18}
+{62,88,94,93,26}
+{5,72,96,25}
+{99,1,85,98,85,70}
+{33,21,37,19}
+{44,78}
+{47,2,73,32,3}
+{91,35,10,81}
+{80,64,7,45,84}
+{86,16,96,8,88}
+{32,29,84,81,30,8}
+{51,28,6,16}
+{88,51,50,54,56,96}
+{79,19,41,40}
+{40,26,10,26,2}
+{60,34,3,29}
+{68,80,70,56}
+{60,23,39}
+{50,69,6,71,70,25}
+{98,53,94,14,45,11}
+{98,39,64,89,98,32}
+\N
+{45,5,15,23,41,63}
+{54,31,55,58,32}
+{36,56}
+{38,78,65,4,75,38}
+\N
+{40,6,93,40,13,59}
+{42,50,10,65,96}
+{6,94,49}
+{63,44,36,55}
+{40,79}
+{39,75,27}
+{8,31}
+{81,75}
+{99,82,85,34,24,89}
+{86,82,20}
+{63,96}
+{47,83,29}
+{70,46,48}
+{44,11}
+{94,19,84,79,77,22}
+{68,47,100,48,65,77}
+\N
+{76,12,86,58}
+{13,14,79,61,12}
+{68,65,16,93,89}
+{95,18,29,89,92,43}
+{19,12,50,47}
+{82,93,85}
+{71,40,85}
+{95,96,100,86}
+{2,40,71,36,25}
+{11,95,25}
+{79,46,41,35,39}
+\N
+\N
+{88,29}
+{54,14,94,88}
+{59,67,81,41}
+{46,68,78,56,47,30}
+{5,76,87}
+{23,89,47,46}
+{47,98,14,31,1,60}
+{32,14,96,61,37}
+{79,66,93}
+{98,1,77,44}
+{21,68,2,31,17}
+{94,23,15}
+{48,47,57,94,49,71}
+{54,3}
+{99,40,81,86,81}
+{85,12,98,81,5}
+{60,41,21}
+{38,82,55,41,96}
+{11,98,12,69,93}
+{11,70,66,44}
+{23,92,80}
+{10,8,43,97}
+{17,30}
+{78,56,58}
+{84,87,84}
+{12,32,7,58,47,48}
+{29,46}
+{87,34}
+{59,30,72,85,71}
+{67,48,83,98}
+{35,10,73,71,1,77}
+{21,51,16,60,64,12}
+{36,61}
+{54,98}
+{44,74,84}
+{83,14}
+{71,52,48,48,15,92}
+{79,78,98,35}
+{52,29,47,86,96}
+{10,37}
+{21,25}
+{57,22,28,30,97,47}
+{15,28}
+{88,24,98,45,65}
+{78,42}
+{36,70}
+{40,48}
+{72,3,78,69,57,33}
+\N
+{21,96,16,21,75,23}
+{55,5,72,45}
+{99,2,72,29}
+{48,17}
+{84,84,40,1,59}
+{34,11}
+{34,80,45,31}
+{56,82,25,65,22,64}
+{10,4,55}
+{74,67,42,74,80}
+{84,22,42,6,87,30}
+{6,51,89,2,84,78}
+{19,95,93,87,8}
+{45,84,25}
+{7,12,16,92}
+{89,82,16}
+{22,64}
+{16,31,49,48,45,14}
+{69,64,19,14,39,8}
+{40,96,26,48,65}
+{17,45,4,57}
+{73,8}
+{85,89,1,15,74,51}
+\N
+{57,89}
+{25,12,55}
+{39,62,35}
+{85,88,71,98,83}
+{64,63,75,72}
+{100,40,38,1}
+{2,44}
+{13,46,59,43}
+{87,9,93,50}
+{77,7,11,30}
+{61,11,18}
+{19,25,68,83}
+{67,25}
+{54,18,85}
+{96,81,38,11,3}
+{87,32,47,79,62,56}
+{42,49}
+{41,65,24,13,79,75}
+{85,32,96}
+\N
+{3,63,47,84,67,13}
+{53,57,59,61}
+{95,27,8,89,35}
+{76,78,76,76,14,37}
+{31,62,65}
+{97,57,60,80}
+{18,81,93,67}
+{8,10}
+{65,25}
+{68,1,62,63,64,88}
+{27,56,74}
+{29,61,78,40}
+{54,72}
+{96,30,71,21,99}
+{67,11,67}
+{26,65,31}
+{89,90,89,68}
+{56,39,63,39}
+{50,67}
+{72,100,24,84,9}
+{29,57,65,37,3}
+{72,75,79,30}
+{78,44,87,67}
+{100,19}
+{35,60,82}
+{16,83,69,38}
+{29,98,13,60}
+{42,60,87}
+{18,67,60}
+{31,77,50}
+{3,22,40,59,7}
+{82,80}
+\N
+{32,92,70,30,18,35}
+{48,38,92,82}
+{10,92,66,59}
+{4,67,42,21,71}
+{27,88,20,21,9}
+{46,22,27,85,36}
+{42,55,36}
+{24,2,96}
+{96,48,40,48,52}
+{15,5,90,10,68,20}
+{30,2,67,92,96,63}
+{16,82,87,26}
+{88,98,76,29}
+{29,11,94,23}
+{58,20}
+{52,18,55,73}
+{20,81,52,19,37}
+{93,21,97}
+{2,77}
+{46,91,80,48,71,20}
+{87,7,93}
+{68,77,61}
+{59,33,52}
+{67,62,89,2,62,90}
+{30,82,72,44}
+{72,18,60,38}
+{11,14,59}
+{74,65,54,58,67,66}
+{74,56,40,73,50,66}
+{42,17,56,59,53,19}
+{75,25,76,9,72,50}
+{14,57}
+{61,47}
+{90,11,72,13}
+{52,27}
+{80,84,53,55,98}
+{16,26,55,17,79,96}
+{42,73,77}
+{6,84,67,54,96}
+{99,48,99,63,73,77}
+{5,41,72,5,88,81}
+{19,20,20}
+{21,89,55,44}
+{82,67,11,64,61,5}
+{44,34,8,62,53}
+{75,53,66,36,100}
+{46,65,6,70,4}
+{84,10,56,35,18}
+{65,60}
+{88,56,27,11}
+{10,9,97}
+{97,49,100,100,76,32}
+{2,98,57}
+{47,57,84,74,79}
+{80,9,24}
+{96,33,86,28,19}
+{43,76}
+{46,14,55,92}
+{60,69,66,62,22}
+{45,85}
+{45,9,36,13,45,1}
+{24,49,8,37,66,64}
+{98,53,96,47,2}
+{36,44,32,4}
+{77,36,78,51,63}
+{82,36}
+\N
+{54,55,33,45,69,18}
+{82,93}
+{65,59,2,62,10,25}
+{75,70,76,69,7,23}
+{10,34,67,85}
+{94,66,28,40,64,41}
+{35,73,64,28,45,68}
+{75,2}
+{58,49,4,87,19}
+{91,99,11,66,75,70}
+{26,64}
+\N
+{13,51,18}
+{39,33,21,18}
+{27,50,82,2,3,71}
+{51,89,44,53}
+{88,91,34}
+{45,96,27,12,51,52}
+{31,96}
+{2,9,54,89}
+\N
+{57,99}
+{87,84,70,7,98,42}
+{32,80}
+{57,64,28}
+{24,39,76,4,30}
+{59,38,15,45,47,28}
+{71,20,37,1}
+{72,59}
+{7,44}
+{50,37,18,1,58,40}
+{13,18,21,56}
+{72,3,26,74,91}
+{60,22,71,49}
+{55,82,61,8,48,66}
+{28,22,75,41,52}
+{51,63,27,41,16}
+{59,89,40,85,86}
+{12,1}
+{52,11,6}
+{37,10,43,88,15,7}
+{14,94,81}
+{34,56,57,4}
+{81,43,11,88,74,76}
+\N
+{67,10,50,79,70,35}
+{14,51}
+{49,50,23,84}
+{51,41,57,100,19,14}
+{31,55,40,96}
+{8,42,33}
+{83,34,1}
+{56,80,22,93}
+\N
+{8,77,91}
+{58,39}
+{55,30,74}
+{50,22,63,73}
+{80,19,67,70,18}
+{7,99,45,23,59,78}
+{36,97,10,33,22,45}
+{43,78,90}
+\N
+{1,68}
+{63,95,54}
+{5,67,61,37,89}
+{32,97,2,56}
+{83,31,6,80,63}
+\N
+{34,15,30,40,16}
+{13,43,6}
+{35,86,31}
+{45,59,4,95,26}
+{63,48,25}
+{56,97,89,45,87,21}
+{42,81,69}
+{49,99,87}
+{81,21,15,36,70,2}
+{93,41,53}
+{54,71,82}
+{88,90,51}
+{100,35,18}
+{88,81}
+{76,16,87,14}
+{16,83,81,44}
+{16,53,100,91}
+{55,75,92}
+{27,97,76,88,66}
+{14,100,95,95}
+{95,84,93,29,67}
+{32,10}
+{82,12,51}
+{40,6,18,14,29,70}
+{3,100,81}
+{83,69}
+{35,63,31,15}
+{5,100,81,54,37,78}
+{99,76,33}
+{88,85,16}
+{46,20,15,10,6,90}
+{53,15,75,76,94}
+{5,76}
+{16,7,21,70}
+{3,84,15}
+{29,58,73,91}
+{82,39,64}
+{49,66,83,76}
+{79,49,19,67,18,76}
+{9,56,41}
+{12,22,19}
+{62,54}
+{20,73,40}
+{34,53,58,68,96}
+{97,14,61,63}
+{38,55,90,63}
+{83,78,81,29,12,46}
+{96,97,40,89,10}
+{67,33,19,19,74,47}
+{78,31}
+{92,74,93}
+{59,54,90,52,29,87}
+{92,39,55,89,81,21}
+{20,85,64}
+{13,97}
+{88,18,85,24,54,90}
+{67,51,47}
+{27,29,90}
+{48,27,7,92}
+{100,37,24,41,68,66}
+{45,7,100,83,51}
+{34,10}
+{60,36,44}
+{55,46,4}
+{86,64}
+{61,77,98,64}
+{14,82,14,50,1}
+\N
+{53,31}
+{64,43,35,44,98,75}
+{98,15,52,58,76}
+{55,94,92,40,80}
+{1,14,100,42,45,74}
+{13,90,84,97,18,92}
+\N
+{13,91}
+{67,33,15}
+{18,96,38}
+{95,70,34,100}
+{17,29,64,32}
+{19,14,83,69,60,99}
+{69,29,64,61,45,17}
+{78,48,24}
+{40,60,61,93,17}
+{19,89,22,71}
+{48,8,13,11,56}
+{75,18,77,100}
+{29,78}
+{51,92,97,31}
+{83,5,2,97,68,69}
+{39,86,86,94,41}
+{66,21,27}
+{30,84,11,60}
+{50,61,28,46,38,45}
+{12,59,66,80,15,64}
+{69,22}
+{30,54,58,99}
+{14,28,80,22}
+{44,31,14,61,83,72}
+{55,53,78,91,76,55}
+{43,3,90,22,7}
+{51,34,24}
+{3,99,5,72,82}
+{95,38,61}
+{22,8}
+{78,40,93,65,18,26}
+{21,17,19,8,89}
+\N
+\N
+{94,88,27}
+{49,45}
+{67,24,64,86,18,1}
+{5,33,18,84,51}
+{15,71,89,48,94,81}
+{71,69}
+{98,63,73,64}
+{14,75,12}
+{47,42,88,13}
+{35,51,60}
+{63,41}
+{73,11,66,99,8}
+\N
+{2,17,6,44,97}
+{95,24}
+{2,13,35,21}
+{76,29}
+{81,37,21}
+{23,63,27,53}
+{70,66,58,27,4}
+{69,62,22}
+{62,96,44}
+{68,87,99}
+{51,40,81,52,93}
+{81,11,45,92,22,21}
+{5,39,46}
+{44,7}
+{14,63,62,9,12}
+{9,19,90,72,51}
+{70,61,24,36}
+\N
+{29,19,3,30}
+{76,86,28,58,38}
+{59,27}
+{9,65,65,10,37,6}
+{89,51,50,23}
+{65,2}
+{33,51}
+{25,55,69,55,1,78}
+{76,71,93,46,23}
+{70,30,50,11,2,89}
+{74,39}
+{4,29,22,80,15,23}
+{16,30,69,76,61,67}
+{43,34,4,70,36}
+{59,32,25,93,32,98}
+{64,4}
+{52,33,47}
+{31,49,7,62,7,95}
+{44,69,12,45,34,8}
+{81,37,83,35,3}
+{24,74,16,89,94,27}
+{79,71,72,49,88,35}
+{17,96,72,87,48}
+{81,18,50}
+{11,19,70}
+{42,95,42,58,90}
+{27,65,83,86,33}
+{55,7}
+{43,55,92,79}
+{97,55}
+{85,25}
+{93,42,69,44,26,78}
+{2,40,46,19,84}
+{8,42,16,26,87}
+{36,8,42}
+{31,47,61,44,13}
+{85,97,47}
+{27,30,71,88,15,100}
+{69,27,4,19}
+{3,52,31,62,98}
+{64,86}
+{91,6}
+{76,40}
+{57,77,7,40}
+{71,34,48,53,37}
+{36,72}
+{61,99,53,2,31,6}
+{86,15}
+{52,93,59,51}
+{57,27,52}
+{48,67,31,69}
+{34,90,37,73,60,83}
+{71,24,49,59}
+{93,71,90}
+{77,31,77}
+{47,40,32,20}
+{97,40,63,80,44}
+{88,55,10,40}
+{86,36,40,72,38,9}
+{31,97}
+{56,19,55,62,60}
+{53,95}
+{33,36}
+{50,12,55,42,96,100}
+{41,17,100,76}
+{65,1,61,69,64,21}
+{90,92}
+\N
+{74,42,86}
+{2,4}
+{99,78,5,92,1,61}
+{1,69}
+{80,73,60,31}
+\N
+{10,25,13}
+{50,34,75}
+{12,90,6,36,42}
+{23,54,46}
+{67,28,66,87}
+{8,88,88,51,55,32}
+{15,19,24,91,75}
+{80,16,70}
+{41,7,90,37}
+{97,57,32,21}
+{54,74,29,12,55,78}
+{60,76,37,92,44,73}
+{1,56,14}
+{40,79}
+{97,1,30,78,56}
+{36,25,61}
+{33,3,51,30,38}
+{2,94,19,15}
+{7,38,72}
+{96,18,3}
+{18,95,15,62,74,53}
+{59,61}
+{18,66,66,65,4,33}
+{49,83,10}
+{17,52,90,39,61,87}
+{38,92,55,26}
+{8,43}
+{77,51,68,23,47}
+{27,65,24,43,88,73}
+{54,34,30,2,19,62}
+{12,36,81,24,66,8}
+{38,91,90,99,84}
+{51,55,94,97,91,15}
+{50,42,20,22}
+{70,4,22}
+{64,26}
+{56,86,16,21,31,61}
+{7,19,86,49,10,53}
+{81,16,74}
+{95,9,11,46,47}
+{34,23,16}
+{94,38,19,4,4}
+{39,79}
+{41,3,62}
+{84,67,53,90,46}
+{17,46,23}
+{62,1,5,58,52,1}
+{23,83,80,62,19}
+{99,61,77}
+{51,95,48,96,75}
+{39,2,6,95,43,36}
+{69,9,59}
+{62,97,31}
+{75,96}
+{33,29,35,13,94,78}
+{28,71,16,99}
+{72,86,25}
+{5,28,15,33}
+\N
+{13,13,52,20}
+{58,98,83,85,81}
+{13,75,42}
+{7,91,3,83,82,37}
+{72,91}
+{10,67,61}
+\N
+{43,86,76}
+{36,62}
+{64,56}
+{63,13,22,24}
+{76,49,38,23,9,8}
+\N
+{92,58,24,19,96,90}
+{24,37,76,37,1,95}
+{91,9}
+{46,35,48,37,91,76}
+{72,21,6}
+{30,80,39,90,89,18}
+{83,30,67,17}
+{43,36,46,43}
+{4,31,34,36,33,48}
+\N
+{16,49}
+{75,56,8,91,4}
+{92,80}
+{74,72,68,89,7,82}
+{79,17,26}
+{14,15,28,72,58}
+{42,21,9}
+{71,39,98,98,61}
+{68,63,23,74,74,48}
+{91,80,22,100,57,30}
+{63,60}
+{90,9,10,67,89,14}
+{53,93}
+{75,49,34,30,38}
+{2,43}
+{32,4,24,48,23,31}
+{45,24,31,15,51}
+{65,62,21}
+{83,50}
+{10,90,98,86,87,1}
+{63,2,9,17,30}
+\N
+{77,46,60}
+{49,39}
+{37,86,4,63}
+{33,28,37,33}
+{4,88,80,14,47,45}
+{90,64,17,65}
+{60,90,12}
+{7,2,38,33}
+\N
+{39,90,7}
+{89,32}
+{27,47,63,31}
+{54,10,10,73,84,87}
+{55,58,25,87}
+{41,24}
+{71,26,8,31}
+{74,19,33,81,74}
+{47,58}
+{44,16,22,59}
+{2,10,97,16,25}
+{1,98,3,41,6,80}
+{12,13}
+{3,50,61,85}
+{54,5,44,97,71,86}
+{54,72,94}
+{59,13,28,79}
+{73,68,7,13}
+{90,49,63,45}
+{95,47,84}
+{31,79,98,22}
+\N
+{13,15,83,89,87,20}
+{1,58,87}
+{15,21,39}
+{93,27}
+{40,81,13,31}
+{29,52}
+{28,48,36,41}
+\N
+{71,23,89}
+{29,59,31,45,35}
+{49,83,24,19,44,26}
+{41,61,36,34,38,88}
+{66,17,18,9}
+{55,38,93,33}
+{84,42,71,15,12}
+{11,38,78,80,90,92}
+{1,6,28,68,58}
+{96,63,73,22,74,29}
+{65,97,68}
+{92,29,92,36}
+{47,25,30}
+{25,44,67,95,16}
+{7,26,41}
+{79,12,44,69}
+{17,27,4,60}
+{45,30,57}
+{68,24,63}
+{39,64,94,92}
+{27,68,39,68,75,8}
+{88,48,48}
+{86,86,8,54,7,45}
+{93,60,14,90,14}
+{97,42,54,67,38}
+{13,38}
+{84,34,30}
+{34,71,77,71,13}
+{82,18}
+{53,7,79,79}
+{28,65,38,20,93,100}
+{96,10}
+{94,12,93,48,51,20}
+{12,4,41,11,25,59}
+{95,69,23,25,1,19}
+\N
+{44,38}
+{12,4,96,7,48}
+{18,24,52,81,58,77}
+{15,36,1,50,81,23}
+{39,66,74}
+{52,22,99}
+{51,11,77,44,22}
+{51,19,18,91,75}
+{20,17,5,96,63,30}
+{31,56,9,21}
+{45,70,31,62,9}
+{84,22}
+{99,62,97,44,87,90}
+{95,94,95,24,25,47}
+{79,72,57,18,3,26}
+{54,67,37,57}
+{3,90,9,3}
+{95,90,40,7}
+{36,70,76,68,14,71}
+{15,59,7,1,48}
+{91,29,79,62,94}
+{76,36,92,82}
+{50,79,68}
+{55,63,88,87}
+{86,89,49,17}
+{19,74,14,52,8,59}
+{8,58}
+\N
+{77,74,20,39,26,29}
+{38,89}
+{58,21,44,81,17,16}
+{40,72,12,32,90}
+{93,34,92,17,39,85}
+{39,2}
+{43,21,83}
+{81,3,59,28}
+{34,97,52}
+\N
+{84,90,6,74,43,70}
+{41,6,10,98,86,41}
+{13,72,78,11,37,5}
+{100,40,54,75,33}
+{66,31}
+{58,58,75,83}
+{81,90,8,73,87,41}
+{9,63,22}
+{19,66,19,93,52}
+{39,88,13,25,66}
+{80,85,66}
+{66,76,11,71,97,77}
+{70,35,87}
+{36,17,69,2,41}
+{30,85,65,39,38}
+{39,35}
+{64,100}
+{83,53}
+{25,29,29,72}
+{19,63}
+{32,2,82,15}
+{31,31,46,11,2}
+{41,1}
+\N
+{55,41,15}
+{18,61,43,22,100}
+{47,60,16}
+{80,5}
+{52,2,76}
+{40,26}
+{81,12,16,25}
+{31,93,89,20,95,75}
+{26,75,86,1}
+{36,69,70,73,79}
+{38,39}
+{45,49,52}
+{88,53,45,10,49,31}
+{21,14,1,83}
+{7,71}
+{59,38,83,64,44}
+{6,52}
+{99,99,26,54,47,8}
+{13,46,72,5,23}
+{7,86,40,73,55}
+{28,47,50,62,44}
+{32,89}
+{39,48,50,100,62,95}
+{66,56,11,21,58,59}
+{7,44,95,53,95,36}
+{83,33,79}
+{34,65,51,52}
+{67,95,46,45,61}
+{69,84,71,38,46}
+\N
+{24,57,48,27,97}
+{83,91,97,94,37,44}
+{22,31,38,77,21}
+{72,32,53}
+{30,45}
+{93,94,27,95}
+{95,4,79,3}
+{33,90,92,54}
+{55,8,76,39,85,64}
+{82,54,93}
+{31,42,5}
+{38,14,73,12,14}
+{64,13,64,28,32,89}
+{5,28,4,22,72}
+{37,78,94}
+{58,73}
+{24,57,33}
+{48,28}
+{69,42}
+{97,91,75,84}
+{95,69}
+{64,95}
+{1,3}
+{76,38,81,11,90}
+{21,30,54}
+{92,100,97,21}
+{10,76,64}
+{85,79,100,79,76,63}
+{13,96}
+{91,47,84}
+{100,19,45,49}
+{99,71,21,10,69}
+{19,41,7,63,56,85}
+{16,32,6,92}
+\N
+{62,7,22,65}
+{1,86,67,47,83}
+{26,2,100,51,1}
+{20,22,86}
+{74,95,79}
+{8,53}
+{85,59,61,45,83,8}
+{2,76,63,26}
+{40,42,84,55,56,23}
+{37,7,25,14,2,47}
+{86,16,98,41,33}
+{76,30}
+\N
+{16,88,61,4,41,42}
+{59,92,94,76}
+{96,76,57,62,99,61}
+{14,30,23,13,9,32}
+{47,49,86}
+{48,19}
+{73,25,40}
+{29,75,31}
+{53,26}
+{28,95,78,84}
+\N
+{22,77,13,64,68}
+{15,69,82,26}
+{42,37}
+{64,59,95}
+{37,72,86,95}
+{9,59,92,57}
+{65,37,13}
+{93,67,81,54,89}
+{21,52,78,59,30}
+{98,90}
+{17,35,57,4}
+{44,56}
+\N
+\N
+{25,26,13}
+{62,41,60}
+{28,92,16,74,4}
+{92,19,85,77,11}
+{20,67,85,22}
+{75,69,34,29,64,73}
+{70,40,2,29}
+{87,27,70,54,6}
+{10,8,9,62}
+{71,41,14,22,23}
+{83,79,46,37,99}
+{79,42,3,54,20}
+{12,60,42,100,39,33}
+{13,79}
+{95,28,54,52,77,3}
+{55,50,25,41,42,16}
+{96,67,23,54}
+{65,54,32,52,16}
+{100,11,69,96,95}
+{1,18,93}
+{53,78}
+{24,40,47,30,40,11}
+{87,7,12,10,52,90}
+{3,72,95,15,32}
+{60,69,19,8,43,72}
+{88,10,11,55,37}
+{67,48,31,48}
+{98,70,38,97,14}
+\N
+{52,12,94}
+{41,26}
+{81,65}
+{66,74,9,66,12,3}
+{47,6,33,92}
+{95,2,12,90,73,97}
+{23,76,34,23,2,20}
+{7,22,37,83,15}
+{44,61,21,8,36}
+{88,52,8}
+{66,3,67,43,87}
+{16,51,10}
+{66,43,28,69,70}
+{47,2,94}
+{57,67,55}
+{40,59,6}
+{63,19}
+{51,71,68,28}
+{73,97,48,56,70}
+{3,4,28,48,18}
+{31,94,27,70,44}
+{85,18,40,6}
+{78,91,79,88,33}
+{11,90,78,49,97}
+{74,91,27,79,75,53}
+{1,70,3,40,43,99}
+{97,35}
+{58,27,40,6,47,33}
+{43,42,60,94}
+{41,34,23,53}
+{57,44,50}
+{8,10}
+{49,53,22}
+{91,2,90,13}
+{46,80,27,82,42,99}
+{12,96,72,23,83,56}
+{48,82,71,8,35,16}
+{38,69,38,49,47}
+{80,28,13,9}
+\N
+{84,13,12,33}
+{31,57}
+{68,86}
+{4,96,64,19,48,29}
+{66,8}
+{33,86}
+{32,38,86,86,41,84}
+{38,51,31}
+{59,17,76,36}
+{52,87,60,54}
+{7,58}
+{34,52,58,90}
+\N
+{30,67,97,2,1}
+{93,10}
+{47,16,46,8,39,84}
+{90,77,37}
+{92,58}
+{38,94,49,53,11}
+{70,49,35,67,18,28}
+{58,81}
+{79,100,9}
+\N
+{97,13,56}
+{99,40,87,67,58}
+{24,47,19,16}
+{12,27,47,48,3,59}
+{1,58,15}
+{97,28,6}
+{94,50,31}
+{71,34,94,53}
+{26,5}
+{46,66,56,27,37}
+{76,4,1}
+{80,63,40}
+{89,82}
+{39,100,71,82,95,8}
+{81,86,27,83,57,47}
+{30,30,92,8,33}
+{95,20}
+{4,19,8,74}
+{20,32,83,62,19,18}
+{75,29}
+{100,13,6,41,23}
+{63,5,93,72,43}
+{64,13,73}
+{35,91,61,26,41,96}
+{49,56}
+{2,28,80,84}
+{15,48}
+{32,49,96}
+{72,73,57,69,16}
+{95,1,88,64}
+{70,55,88,66}
+{76,66,30,92,1}
+{88,21,74,65,93}
+{72,75,75,3,26}
+{55,32,85,68,84}
+{45,40,93,33,72,20}
+{83,89,6}
+{4,60}
+{72,56}
+{73,7,69,25,96,74}
+{100,72,41,48,63,37}
+{21,72,70,94,67,54}
+{6,9,58,77,35}
+{70,59,35,25}
+{86,96,87,62,13,5}
+{93,52,74,57,58}
+{93,23,88,50,56}
+\N
+{95,72,68}
+{63,52,58,41,54,90}
+{52,23,53,32}
+{93,87,39}
+{23,73,6,46,79,72}
+{44,17,12}
+{79,59}
+{31,62,14,26,75,23}
+{64,72,18,48,63,50}
+{71,40,59,87}
+\N
+{82,17,10}
+{44,29}
+{6,4,39,16,21}
+{94,17}
+{91,61,37,36,9}
+{53,38,7,28,92}
+{95,93,35,18,48}
+{35,77,53,87,97,92}
+{56,28,68,19,28,86}
+\N
+{23,91,56}
+{97,5,89,24}
+{18,81,17,78,63}
+{83,19,46,10,22,66}
+{100,17,45}
+{25,87,61,79}
+{17,57,99,1,39,1}
+\N
+{2,51,26}
+{93,69,84,85,87}
+{40,58,70}
+{86,84,96,41}
+{28,36}
+{39,85}
+{16,84,75,68,87,17}
+{14,84,57}
+{25,85,35,82,56}
+\N
+\N
+{7,30,17,2,66,91}
+{45,17,57,27,98,65}
+{57,86,15,40,68,23}
+{82,32,28,89,41,79}
+{28,3,35,61}
+{76,95,19,81,48,50}
+{34,6,85,47,65,2}
+{70,23,91,33,15}
+{30,24,47,96,61,47}
+{78,88,64,60}
+{87,40,86,97}
+{47,14,54,37,100}
+{48,95,32,77,69}
+{58,12}
+{63,20,49}
+{78,85,41,72,6}
+{39,20,89,21,62,76}
+{71,6,10}
+{63,4,71}
+{51,21,37,63,54}
+{66,6,63,12,58}
+{89,97}
+{64,70}
+{53,1,65}
+{57,73,30,26}
+{15,99,47,89,95,99}
+{12,86,7}
+{50,68,1,31,67}
+{47,86,54,44}
+{78,7,86,76,22}
+{46,71,98,62,67}
+\N
+{64,91,80,63}
+{82,61,17,58}
+{85,64,90}
+{37,26,64,97}
+{68,25,26,61,68}
+{11,21}
+{63,53}
+\N
+{87,88,75,65,10,48}
+{32,7,38,72,44}
+{99,81,59,10}
+{31,58,60,66,41,28}
+{23,27,57,74,4}
+{20,94,28,29}
+{91,5,15,61,50,29}
+{34,58,15,85,65,29}
+{52,50,2,95,87}
+{3,94,54}
+{7,61,96,49}
+{51,70,23}
+{87,49,27,6,7}
+{83,61}
+{36,92,48,57,20,83}
+{53,12,60}
+{60,11}
+{68,43,74,23,66,55}
+{66,8,54,24}
+{48,72,41,74}
+{81,99,50,33,20,13}
+{27,80,60,83,26,74}
+{80,1,59,50,15,99}
+{11,70,20,29}
+{23,84,63}
+{63,24,91,19,28}
+{25,17,95}
+{94,13,81,69,26,89}
+{31,48}
+{45,20,74,51,62,33}
+{77,55,17,63,4,18}
+{89,14}
+{85,85}
+{23,11,85,74}
+{29,76}
+{62,40,96}
+{1,29,25}
+{56,26,12}
+{5,22,6}
+{61,9,6,85}
+\N
+{31,34,49,11,19}
+\N
+{14,20,64,73}
+{63,1,85}
+{2,58,61,100,9}
+{89,92}
+{37,13,81,77}
+{36,26,16,76}
+{78,10,10,92,63}
+{68,6,35,71,92,27}
+{2,88,33,14,85,27}
+{80,95,71,98}
+{8,33,33,55,90}
+{62,74,15,10,64}
+{60,18}
+{6,77}
+{27,38,4,49,27,89}
+{94,84,94,8,98}
+{15,73,47,47,26}
+{73,38,69,90,9,13}
+{17,33,32}
+{51,57,25,40,41,37}
+{77,70}
+{66,10}
+{50,90}
+{96,88,30,65}
+{30,49,100}
+{34,46,19,89,52,24}
+{83,85,62,72,10,64}
+{98,56,23,77,79}
+{97,90,83,85}
+{19,66,70}
+{70,89,59,12,71}
+{24,96,22,4}
+{43,32}
+\N
+{92,85,41}
+{96,90}
+\N
+{4,5,82}
+{58,32,34,86,30}
+{51,8,44}
+{31,96,37,47}
+{51,15,41,97}
+{86,41}
+{41,26,61}
+{62,79,68,73,5}
+{32,9,88,30}
+{89,34,64}
+{70,18}
+{64,31}
+{14,73,1,50,75}
+{57,1}
+{53,92,38,13,56}
+{41,1,87,40,60}
+{83,75,19}
+{69,98,25,64}
+{69,75}
+{84,13,25,8,81}
+{41,52}
+{90,80,17}
+{19,53,72,62,94}
+{29,30,99,32}
+{32,85,73,26,47}
+{6,48,89,93,23}
+{73,47,93,10,48}
+{60,21,26,60,63}
+{85,41}
+{75,61,61,45}
+{51,7,5}
+{9,46}
+{83,36,7,84,96}
+{71,78,55}
+{43,53,88}
+{8,1,80,69}
+{88,86,51,12,37}
+{45,69,40,85}
+\N
+{36,53,60,15,7,7}
+\N
+{92,5}
+\N
+{51,13,34}
+{39,23}
+{16,26,93}
+{91,96,19}
+{89,64,2}
+{8,74,29,24,66}
+{26,19,30,27}
+{81,59,52}
+{99,28}
+{5,12,63,79}
+{14,80,90,83,47,79}
+{67,64,32,58,44,19}
+{27,32,52,79,55}
+{68,87}
+{14,31,20,12}
+{38,99,65,32,15}
+{27,57,35,17,53}
+{63,64,6,60}
+{70,38,47,65}
+{24,87,20,4}
+{86,27,19,56}
+{62,44,1}
+{46,10,26,48}
+{40,57}
+{61,9,59,80,51,20}
+{83,44}
+{77,1}
+{78,63,42}
+{75,93,95,76,9,52}
+{20,58,10,37}
+{72,75,41,73}
+{63,93,5}
+{57,65,47}
+{34,6,51,38,21}
+{54,7,19,9}
+{61,6,47,64,100,86}
+{39,45,55,17}
+{81,53,67,33,70}
+{11,94}
+{57,98}
+{78,81}
+{75,71,20,8,13}
+{3,2,58,95}
+{37,58,5,46,54}
+{40,50,36,27,69}
+{73,42,86}
+{97,73,87,80,38}
+{27,56,94,73}
+{80,81,74}
+{53,79,86}
+{79,4,55,21,34,74}
+{84,63,21,97,92,38}
+{72,38,76,63,97,79}
+\N
+{64,91,100,98}
+{34,10}
+{97,73,7}
+{49,31}
+{87,39,65,96}
+{54,88,60,55,18,4}
+{20,72,96,26}
+{40,51}
+{37,46,89}
+{88,53,3,52,39}
+{10,34,77,95}
+{20,66,84,12}
+{51,19,61}
+{67,35}
+{73,56,89,43,35}
+{94,54,27,63}
+{63,53,21,79,76,49}
+{79,23,28,63,49}
+{47,94,75,11}
+{67,95,56}
+{80,86}
+\N
+{62,73}
+{98,69,11,57,24,90}
+{87,41,77,21,94}
+{21,87}
+{3,40,75}
+{67,53,78,29,16}
+{18,46,70,76,98}
+{14,67,50,63,22}
+{4,2,92,4,8}
+\N
+{41,76,79,95,96,61}
+{35,30,18,57}
+{34,91,89,27}
+{22,25,9,34,85}
+{4,53}
+{23,6,65,86,56,93}
+{54,81,8,59,36,47}
+{90,10,4,25,31,46}
+{91,82,82,80}
+\N
+{64,12,59,21,10}
+{49,93,76,26}
+{22,10,21,15,57}
+{14,29,93,31}
+{68,21}
+{62,95,12}
+{34,74,55,4}
+{26,39,93,31}
+{67,31,63}
+{23,89,98,88}
+{48,93,22,79,28}
+{1,88}
+{95,74,84,18,38}
+\N
+{82,29,22,45,15,81}
+{15,48}
+\N
+{17,36,97,77}
+{93,59,71,15,51,35}
+{67,33,57,11}
+{35,80,72,43}
+{69,89,69,48}
+{52,29,16,52,100,22}
+{60,30,45,19,25}
+{28,3,39,86,13}
+{81,40,25,20,39,5}
+{77,14,93,47,23,6}
+{42,19}
+{52,52,98}
+{9,29}
+{78,77,6,72}
+{2,59,73}
+{13,85,77,26,29}
+{64,63,94}
+{54,76,3}
+{7,1,5,91,100}
+{24,94,57,94,79,55}
+{4,22,1,75}
+{34,53,19,87}
+{69,75}
+{71,47,47,61,42,89}
+{3,32}
+{84,61,4,13,73}
+{74,61}
+{47,65,85}
+{50,84,83,18}
+{51,97,11,3}
+{59,92,4}
+{49,42,65,27,97,52}
+{19,33,40,44,71,100}
+{82,68,99,60,47,59}
+{47,33,82}
+{3,45}
+{47,28,60}
+{3,98,60,30,50}
+\N
+{11,40}
+{33,67,72,43,74}
+{9,49}
+{42,47,48}
+{53,88}
+{17,87,28}
+{20,4,72,62}
+{65,25,22,76,64}
+{9,62,57}
+{59,93,52,93,60}
+{85,85,1,55,50}
+{69,22,57}
+{8,50,81,32,4}
+{80,47}
+{60,88}
+{16,54,80,66}
+{99,87,66,65}
+{60,19,58,18}
+{14,77,66,48,59,41}
+{75,96,82}
+{42,72,93,79}
+{14,23,78,82,40}
+\N
+{29,47,16,41}
+{13,11,45,67,23,92}
+\N
+{8,3,52,41,56}
+{57,41,63}
+{5,50,59,87,50,58}
+{58,99,9}
+{60,99,15,63}
+{59,14,9}
+{68,81,34}
+{83,18,3,94,39}
+{27,52,100,66,48,82}
+{10,23,50,96}
+{72,14,12,68,62}
+\N
+{45,30,55,86,89,48}
+{5,80,97}
+{52,67,86,81}
+{99,4,38,79}
+{21,98,78,71,73}
+{10,23,38,61}
+{12,17,19,70}
+{79,23}
+{55,66,65,60,19}
+{7,34,68,88}
+{37,70,5}
+{41,57,86,31,10,6}
+{70,59,96,78}
+{88,18,32,22,56,21}
+{93,72,81,47,89,72}
+{100,14,49}
+{83,80}
+{73,11,97,14}
+{60,47,32,34,13,29}
+{39,6,88,24,6}
+{54,66,55,52,47}
+{56,89,88,98,94,48}
+{2,37}
+{13,54}
+{68,39,68}
+{60,81,10,85}
+{74,54,14}
+{30,52}
+{41,74,47}
+{77,28,8}
+{90,3,43,89,4}
+{29,46,84,63,79,83}
+{26,15,80,19}
+{76,28,77,6,47,91}
+{51,15}
+{93,15,51}
+{8,68,34,58,15}
+{5,56,57,81}
+{27,87,61,54,41}
+{31,37}
+{68,80,3,98,49,6}
+{96,10,39}
+{25,19,21,72,79}
+{69,1}
+{5,51,61,80}
+{76,25}
+{36,92}
+{54,46,31,87,13,8}
+{25,13,83,57}
+{29,53,73}
+{83,60,26,19}
+{27,89,34,13,20,38}
+{29,74,26,67,65}
+{90,36}
+\N
+{32,15,43,50}
+\N
+{55,86,68,51}
+{91,14,53,70,49,38}
+{75,29,79}
+{19,59,38,44,18,79}
+{43,31,24,20,16}
+{43,83,59,37}
+{61,17,95,61}
+{67,89,1}
+{65,20,46,58,49}
+{72,54,38,52,49}
+{75,12}
+{63,95}
+{99,17,79,11,35}
+{62,60}
+\N
+{69,83,89,73,20}
+{30,60,39,73}
+{78,99,29,45,61,21}
+{38,61}
+{51,15,47,11,4}
+{34,75}
+{57,26,42,42}
+{8,90,4,68}
+{63,70,99,3}
+{74,70,33,50,59}
+{27,18,73,83}
+{36,90}
+{82,77,2,83}
+{90,99}
+{15,25}
+{65,30,39,82,89,34}
+{12,24,64,54,49,83}
+{54,59}
+{63,49,81,36,75,52}
+{6,59,90,55,87}
+\N
+{97,52,54,97,3}
+{8,53,89,42,30}
+{68,42,64}
+{97,42,99,74}
+{19,31,32,52,7}
+{69,83}
+{61,17,35,39}
+{81,47,70,7,63}
+{78,10,63,97,31,48}
+{84,92}
+{64,82,40,39,57,44}
+{39,25,92,33,5}
+{27,74,85}
+{90,67,21,28,84}
+{36,33,62}
+{77,87,98,82,11,88}
+\N
+{11,41,17,91,56}
+{1,1}
+{84,100,8,22,20}
+{57,39,85,5}
+{55,47}
+{13,2,36,59,45}
+{95,66,53,32,29}
+{21,92}
+{35,32,9,58,77}
+{19,71,99,82}
+{19,37,87,43}
+{100,18}
+{67,86,29,40}
+\N
+{66,54,64,55}
+{67,25,18,31}
+{60,26,59,86,26,67}
+{26,21}
+{70,67,30}
+{93,82}
+{89,58,39,91,95}
+{15,86,25,8,12}
+{59,20,41,33,78,87}
+{10,72,89}
+\N
+{52,17,99}
+{77,29,7,7,1}
+{49,96,57,24,66,67}
+{10,26,83,84}
+{82,7,25}
+{66,77,57,25}
+{92,77}
+{24,48}
+{44,26,37,75,11}
+{73,80}
+{51,47,93,21,25,78}
+{76,49,15,98}
+{12,85,63,59,6}
+{25,51,47,58}
+{16,10}
+{17,30}
+{67,5}
+\N
+{54,96,21}
+{12,47}
+{29,90,69,22,89,82}
+{78,93,86,65,66}
+{83,84,58,67,13}
+{85,35,81,27,1,2}
+{76,29}
+{64,82,91}
+{35,89,38,89,10}
+{19,40,96}
+{83,70,85}
+{72,85,70,99}
+{34,1,39,16}
+{84,53,22,86,73}
+{32,23,70,49}
+{15,67,91,11}
+{73,95}
+{71,57,64}
+{88,91,56}
+{12,16}
+\N
+{62,82,26,84}
+{70,51,52,63,96}
+{34,93,49,57}
+{16,5,47}
+{18,59,12,82,83,51}
+{61,93,87,9}
+{46,9,45,38}
+{15,85,28,73}
+{31,99,26,3}
+{66,91,48,73}
+{98,80,9}
+{31,55,42,69,13,58}
+{43,8,70,29,83}
+{39,57,53,70,74}
+{89,13,60,38,89,3}
+{37,28,15}
+{67,77}
+{30,100,89,36,53,75}
+{36,19,48}
+{7,8}
+{12,76,26}
+{14,56,52,47,39,67}
+{87,83,51,2,97,25}
+{51,1}
+{59,69,37}
+{95,93,21}
+{100,92,37}
+{37,23,66,95,7,63}
+{52,56,77,86,46}
+{31,62,17}
+{57,48,79}
+{26,96,40,5,43,54}
+{40,92}
+{75,83,1,73,71}
+{75,61}
+{6,38}
+{35,23,76}
+{52,3,38,25,100,99}
+{45,15,44}
+{96,9,11,35,16,58}
+{9,80,76}
+{22,43,34,43,46}
+{34,68,21}
+{95,70,83}
+{60,7}
+{34,22,68,2}
+{78,30}
+{46,70,90,96}
+{5,24,69,61,32}
+{41,17,79,27}
+{59,88,64}
+{12,48,41,68,15,98}
+{43,84,59,62,36,14}
+{84,8,71,88,4,23}
+{45,67,67,17}
+{14,96,72,66}
+{91,23,4,11,28}
+{18,5}
+{65,51}
+{31,87,33}
+{17,97,76,81,69}
+{56,71}
+{95,23}
+{33,58,66,47}
+{46,99,69}
+{43,87,40}
+{49,1,26}
+{18,36,89,87,25,100}
+{76,37,19}
+{57,91,9,100,23,59}
+{80,60}
+{55,23,32,49}
+{15,73}
+{87,50}
+{43,62,50,54}
+{65,3,89,49,77}
+\N
+{73,12,25,78}
+{79,89,38,59}
+\N
+{44,62,25}
+{96,13,57}
+{35,14,3}
+{90,71}
+{34,8,59,81,63,90}
+{15,90,89,32,69}
+{90,61,54,10,29}
+{22,3,85,41,66}
+{17,4,99,91,45,57}
+{89,32,43,39,61,9}
+{45,40,6}
+{47,100,75,8,85}
+{88,43,89}
+{45,41}
+{54,48,87,66,100,5}
+{58,65,39}
+{17,82}
+{95,14,31,51}
+{30,3,46}
+{8,66,22,52,51,24}
+{61,62,38}
+{4,50,83,32,76}
+{96,36}
+{87,27}
+{82,100,44}
+{30,91,44}
+{29,48,8,38,43,96}
+{56,65}
+{34,36,99,11}
+{11,1,25,65,12,89}
+{17,100,62,53,24}
+{86,81,63}
+{17,63,30,82,87,91}
+{12,63,76,78,85}
+{52,19}
+{21,91,53,86,49,83}
+{67,65,78}
+{8,77}
+{89,1,56,100,72,96}
+{20,51,41,21,30,20}
+{41,73,37,92,9,5}
+{95,34,21,12}
+{28,14,2,62}
+{14,74,33,32}
+{37,82,67}
+{65,99,56,11,21,83}
+{99,51}
+{56,42}
+{59,30,74,40}
+{18,27,63,44,86}
+{48,25,41}
+{5,26,63,88}
+\N
+{24,66,64,1,26}
+{72,74,11,61,70}
+{28,27,90,30}
+{96,35,21}
+{64,100,75,94,88,3}
+{93,79,42}
+\N
+{37,51,4,41}
+{31,68}
+{93,42}
+{76,96,47}
+{8,6,16,57,51,72}
+{67,72}
+{50,36,40}
+{69,28}
+{17,92,40}
+{72,74}
+{76,87,93,22,95,30}
+{14,88}
+{39,56,74,36,25,87}
+{55,68}
+{32,9}
+{35,2,17,86}
+{92,73,82}
+{40,13,95}
+{15,28,95}
+{65,40}
+{47,56}
+{63,72,78,20,22}
+{71,49,4,80}
+{68,16,50,44,29,38}
+{81,96,23}
+{44,73}
+{4,68}
+{30,54,41,66,89}
+{92,33}
+{10,92,49,46,59,42}
+{14,91,18,96,27,37}
+{40,32,12}
+{14,97,15,96,44}
+{75,96,52}
+{50,20,9}
+{39,84,83}
+\N
+{14,48,3}
+{47,85,76,27}
+{5,3,25}
+{55,36,29,76,41,44}
+{34,56}
+{62,29,83,6,58}
+{67,32,85}
+{75,62,4,66,100}
+{47,31,27,43,9,57}
+{92,44,36}
+{31,22}
+{14,88}
+{18,25}
+{82,63}
+{54,67,6,59}
+{90,42,19,91,37,75}
+{70,39,87,52,32}
+{51,20,34}
+{85,62}
+\N
+{95,6,55,93}
+{44,67,15}
+{93,58,20,12}
+{42,6,22,29,36}
+{46,81}
+{57,95,56,52}
+{3,79,69,45,8,74}
+{75,44}
+{4,17,78,96,66,41}
+{27,100}
+{85,76,22,17,45,58}
+{9,12,70,29,96}
+{5,68}
+{54,79,5,19,17,24}
+{99,13,9,52,86}
+{94,6,99,57}
+{71,62}
+{63,50,9}
+{42,42,80}
+{25,96}
+{93,20,10}
+{83,73}
+{14,76,36}
+{57,31,29}
+{17,25,18,18,54,95}
+{34,27,86,37,92,83}
+{57,57,28,32}
+{98,53,60}
+{8,59,41,88,49,46}
+{95,42,30}
+{12,51,98,74,76}
+{6,49,26}
+{21,35,27,32,83,93}
+{16,56,89}
+{85,34,73,74}
+{52,95,22,4,71}
+{96,42,63,88,80,91}
+{78,34,41,99}
+{11,68,27}
+{50,14}
+{78,52,66,15}
+{100,82,1}
+{35,2,93,71,45}
+{4,56,8}
+{83,19,5}
+{82,39,63}
+{50,64,83,87,76}
+{47,59,93,88,22,67}
+{16,6}
+{86,98,88}
+{32,4,52,34,30,71}
+{68,25,97}
+\N
+{19,17,91,84}
+{97,88,89,98,33}
+{37,56,70}
+{27,17}
+{56,58,51}
+{69,80,47,84}
+{89,22,89,88,16,1}
+{95,14}
+{14,95,97}
+{47,15}
+\N
+{19,20,65,74,83,38}
+{57,56}
+{78,67,68,89,1,95}
+{61,84,93}
+{10,56,96,31,56}
+{3,51,90}
+{15,85,42,25,15,41}
+\N
+{50,7,89,89,96}
+{90,10,44}
+{11,43,15,27,30}
+{55,68,48,30,44}
+{38,69,3,95,39,6}
+{57,51,88,94,82,23}
+{69,37,2,67,49}
+{93,94,5,84,39,47}
+{45,47}
+{58,55,79,63,64}
+{63,65,59}
+{42,36,76,75,89,86}
+{41,83,98}
+{13,90,13,46,11,37}
+{76,33,52,65}
+{52,29}
+{20,60,45,23,29}
+{89,6,14,8}
+{91,69,64,72,41}
+{46,91,31,66,83,33}
+{6,58,61,65}
+\N
+\N
+{90,65,16,5}
+{24,46,33,36,47,45}
+{11,62,40,98,21,88}
+{28,95,58,33,27}
+{45,63,99,31,38,90}
+{11,49,41}
+{23,24,82,25,28}
+{42,3,34}
+{52,10,58,88,97,37}
+{20,41,11}
+{86,30}
+{36,92,93,10}
+{5,36,85,50,71}
+{51,75,100,46}
+{55,81,31,45,87,8}
+{83,10,45,81,33}
+{16,94,91,23,76,44}
+{62,73,14,39}
+{16,14,83,100,82,7}
+{25,69,86,12,71}
+{29,86,45}
+{76,62,100,47,57,52}
+{41,21}
+{33,56,58}
+{23,96,44,16,91,86}
+{65,15}
+{3,92,56,4,21}
+{32,39,95}
+{95,87}
+{65,96}
+{16,96,93,100,35,78}
+{64,33,55}
+{96,75,41,40,62}
+{50,50,86,11}
+{93,34,83}
+{19,30,62,67,93,19}
+{53,67}
+{55,46,99}
+{70,32,38,4,84,91}
+{50,36,40}
+{21,93}
+{29,6,10}
+{4,73,45}
+{72,33}
+{36,73,18,55,27,100}
+{65,73,98,90}
+{20,1}
+{59,36,60,87}
+{20,79,63,93,34,31}
+{60,18,92,6}
+{48,34}
+{63,70,78,1,2}
+{15,32}
+{5,15,84,73}
+{32,35,90,11,40,23}
+{91,41,7,52}
+{84,90,88,30}
+{12,10}
+{84,86,36,79}
+{76,45,84,66}
+{41,25,61,96,97}
+{18,100}
+{63,39,17,34,32}
+{22,45,74}
+{83,24,45,48,69,84}
+{43,41,12,44,75,91}
+{69,75,95}
+{100,28,14,66,1,14}
+{94,91,60,36}
+{88,28,54,63}
+{68,78}
+{29,68,6,100}
+{12,84,35,44,59,55}
+{30,59}
+{64,18,40,57}
+{97,97}
+{85,64,73,82,49,88}
+{99,31,24,6,90}
+{23,89,38,20,40,95}
+{84,64}
+{21,3,91,7,7,87}
+{91,74,32,76,43}
+{13,22,96,8,75}
+{59,71}
+\N
+{34,94,45}
+{14,5}
+{95,10,37,74}
+{69,82}
+{6,58,45,49,81}
+{72,72}
+{17,58,10}
+{62,77,9,6,44,62}
+{37,53,49,41}
+{24,11,11}
+{10,57}
+{26,72}
+{18,15,83,60,54,80}
+{88,49,73,92,67}
+{26,88,64,2,59}
+{49,50,3,90,44,49}
+{58,54,43}
+\N
+{86,78,40}
+{42,17,65}
+{1,86,17,6}
+{79,27,37,60,8}
+{46,62,46,22}
+{9,75,17,68,54,35}
+{99,86,64,10,20}
+{3,21,35,6,24,64}
+{25,62,9,50}
+{63,2,79,42,81}
+{44,41,2}
+{99,93,98,78}
+{2,92,9,96}
+{79,82,25,64}
+{47,84,52}
+{97,77}
+\N
+{47,94,38}
+{22,33,76}
+{35,52,11}
+{17,48}
+{1,100,27}
+{87,93,19}
+{72,3,32,78,81}
+{47,28,4,23,79}
+{27,88,7,85}
+{49,40,47}
+\N
+{91,89}
+{80,2}
+{86,78,42,6,81}
+{7,50,25,4,8,22}
+{23,3,64,59,53}
+{1,42,63}
+{95,81,86,31}
+\N
+{81,83,52,47,25,43}
+{17,57,100,49,59,63}
+{44,91,95,72,29,100}
+{80,78,55,41}
+{14,52,20,64,9,87}
+{48,14,82}
+{31,5}
+{64,50,66,38,97}
+{61,2,90,2,64}
+{64,69,26}
+\N
+{64,62,68,89,12}
+{12,10,88,71}
+{41,66}
+\N
+{67,77,25,6}
+{14,75,15,66,19}
+\N
+{88,52}
+{78,56,61}
+{93,88,47,38,52}
+{72,100,54,34,18}
+{77,99,89,53,25}
+{38,51}
+{3,25}
+{83,39,85}
+{60,15,77,59,69}
+{38,64,91,97}
+{65,35,30,8}
+{46,6,48}
+{63,91,29,91,85}
+{43,100,56,60,74,53}
+{95,30}
+{86,63,28,62,37,79}
+{2,48,29}
+{1,44,20,47,56}
+{43,34,86,86,64,14}
+{11,82,99,71,63,41}
+{77,45,74,17,56}
+{18,25}
+{51,82}
+{27,35}
+{1,20,84}
+\N
+{89,37,16,90}
+{58,83,34,88,50,21}
+{61,25,1}
+{41,6}
+{9,100,32,54,38,66}
+{40,53}
+{29,76,16,13,55,31}
+{71,67,54,83,3,82}
+{19,62,18,94,73,38}
+{17,83,8,45,52}
+{80,25,50,59,53}
+{4,2}
+{52,48,6,72}
+{50,32,70}
+{36,97}
+{17,82,36,97,20}
+{22,87}
+{46,29,96,98,14,90}
+{14,92,5}
+{69,9,68}
+{20,86,29,61,54}
+{62,67,87}
+{86,18,31,80,82,45}
+{65,89,67,34,41}
+{44,8,48,38,91}
+{47,32}
+{85,25,56,39}
+{15,54}
+{84,57,44,46}
+{65,61,29,86,77,53}
+\N
+{26,58}
+{76,1,57,93}
+{57,91}
+{13,15,66,11}
+{84,12}
+{43,32}
+{83,24,31}
+{82,9,65,84,27,94}
+{62,93,55,7,39,46}
+{90,100,33,22,61,46}
+{9,51}
+{87,93,82,94}
+{49,45,95,95,66,39}
+{100,56}
+{11,5,78,42,45,37}
+{3,57,80,46,13,34}
+{1,74,53,31,33}
+{11,84,8}
+{27,99,21,31,96,58}
+{99,81,90,17}
+\N
+{66,49,47,55}
+{88,30}
+{76,62,17,88,83}
+{40,7,42,61}
+{17,57,9,64,54,1}
+{9,54,84}
+{50,61}
+{72,15,25,30,6}
+{64,95,69,89,11}
+{64,18,86,25}
+{81,59,70,6,92}
+{78,76}
+{33,40,29}
+{15,63,1,12,14,57}
+{33,81,8,65,26}
+{58,15,56,37,67}
+{2,50,35,92,11,27}
+{17,13}
+{91,100,15,27,39,24}
+{58,48,46}
+{5,95,28}
+{7,21,99}
+{5,15,6,10}
+{82,99}
+{66,22,86,83,76}
+{99,68,39}
+{43,90,22}
+{31,94}
+{21,64,56,26,95,40}
+{7,81,3,53,83}
+{29,42,90,60}
+{53,49}
+\N
+{26,31,14,73,88,51}
+{69,2,100,9,34,16}
+{78,35,97}
+{68,16}
+{34,45,42,73}
+{7,19,55,70,69,11}
+{11,62,61}
+{32,17,51,33,87,6}
+\N
+{54,97,36,13,45,12}
+{46,2,26}
+{14,6,17}
+{99,20,31,61,6,4}
+{60,72,53,31,34,25}
+{88,46,68,78}
+{56,94,49}
+\N
+{33,65}
+{70,51,84}
+{55,91,27,33}
+{22,19}
+{34,78,11,94,3}
+{16,67,91}
+\N
+\N
+{64,5}
+{76,18,83,5}
+{57,13,30,56}
+{60,92,25,31,43}
+{38,17,54,5,2}
+{56,58,39}
+{42,43,5,69,56,89}
+\N
+{50,23,97,85,70,39}
+{97,56,33,90,64,2}
+{9,54,51,26,24,99}
+{18,7,59}
+{44,5,40,69,18}
+{77,96}
+{44,58,47,17,26,45}
+{90,71}
+{88,32,11,96,17,13}
+{42,3}
+{97,28,56,10}
+{38,36}
+{50,52,47,31}
+{64,5,99,77,83}
+{11,56,1}
+{91,92}
+{7,53,35,52}
+{93,65,47,97,44,82}
+\N
+{64,66}
+\N
+{62,4,57,23,34,91}
+{52,55,75,99,27}
+{29,54,44,87,61,96}
+{21,3,66,35,25,80}
+{96,68}
+{3,41,66,81,78}
+{49,98,79,65}
+{71,38}
+{88,79,70,37,3,82}
+{49,74}
+{19,29}
+{57,68,9,8,99}
+{81,88,14}
+{99,29,24,99}
+{55,96,29,89,49}
+\N
+{56,2,84,79,74}
+{30,52,64,74,62,5}
+{88,32,19,25,9}
+{40,11,49}
+{98,52,27}
+{11,86,29,86,6}
+{91,53,63,53,44,28}
+{88,10,30,48}
+{75,64,75}
+{14,92}
+{98,62,35,67,66,35}
+{40,65,11,80,73}
+{1,1,63}
+{85,32,53}
+{91,27,68,50,66,63}
+{66,54,38}
+\N
+{45,43,14,94}
+{62,84}
+{54,24,83,33,46}
+{93,72,2}
+{43,4,14}
+{18,11,5,99,79,94}
+{26,59,9,2}
+{58,69,70,45,14,54}
+{84,5,42,97}
+{7,82,41}
+{69,53,8,55,20}
+{4,13,6,45,83}
+{41,92,41,98,51,85}
+{72,85,74}
+{19,50,79}
+{79,47,47}
+{25,25}
+{17,56,46,30,73,78}
+\N
+{92,42,83,34,92,29}
+{8,52,76,80,9,55}
+{80,100,2,52,24,4}
+{55,15,92,27,86,50}
+{83,79,41,88,86,53}
+\N
+{44,16,90,54}
+{99,20,64}
+{44,30,26,26}
+{35,35,24,74,72}
+{97,24,94,55}
+{78,42,32,76,100,98}
+{31,86,12,87,72,86}
+{87,35,33,88,33}
+{31,83,23}
+{46,51,5,6,71,31}
+{39,97,91,53,39}
+{19,18,25}
+{16,4}
+{65,77,13}
+{61,30,13,26,75}
+{67,9}
+\N
+{31,3}
+{15,19}
+{97,39,71,30}
+{12,96}
+{36,96,82,62,5,74}
+{81,22,46,11,19}
+{97,55}
+{58,67}
+{10,68,79,74,23}
+{29,71}
+{50,59,8,1}
+{12,51,32,7}
+{62,16}
+{48,82}
+{84,21,24,13}
+{46,86}
+{100,96,32,54,13}
+{72,41,3,67}
+{61,9,7,75}
+{39,44,50,30,38,6}
+{63,63,6}
+{69,35,6}
+\N
+{7,91,82,48,55}
+{57,22,31,57}
+{55,72,91}
+\N
+{76,98,43,71,10}
+{100,34}
+{78,53,14,73,23}
+{42,90,28,44,44}
+{90,34,22,81}
+{60,32,56}
+{98,53,58,58,61}
+{61,70,59,78}
+{2,96,27}
+{83,99,25,47,13}
+{17,54,11,47,70}
+{70,43,11,89}
+{93,70,82}
+{72,57}
+{35,95,49,36,19}
+{82,25,16,49,43,93}
+{2,51,96,48,88}
+{20,81}
+{74,4}
+{66,83}
+{90,75,98}
+{25,87,59,92,55,96}
+\N
+{20,80,92,93}
+{59,63,39,3,7,38}
+{64,10,85,22}
+{63,32,18,38,83}
+{49,38,83,54,1}
+{27,97}
+{18,34,84,58,7,86}
+{93,4,67}
+{43,49,32}
+\N
+{29,14,5,50,30}
+{59,15}
+\N
+{76,31,31,47,17,35}
+{95,41,71,27}
+{47,43}
+{75,80,56,78}
+{56,75,43}
+{99,10,100,76,44,1}
+{5,31,72,3,25}
+{21,90,59}
+{59,45,75,93,78,88}
+{76,55,4}
+{20,87,44,94,56,78}
+{38,87,71,13,23}
+{33,6,79,91,92,27}
+{13,15,31,15,11}
+{57,18,57,71,11}
+{67,60,64}
+{66,15}
+{57,45,74}
+{93,91,97,30,12,94}
+{37,83,62,18,28}
+{94,88}
+{12,11,85,10}
+{42,96,89}
+{15,65,5,65}
+{52,58,36,27,10}
+{72,88,76,50,96}
+{40,70,55,93}
+{80,33,24}
+{53,35,50}
+{11,37,55}
+{25,80,32,91,68}
+{11,2,52,39,37}
+{17,51,45,44,85,84}
+{81,21,77,15}
+{67,93,27,70,72,94}
+{86,99,95,98,83,28}
+{9,65}
+{1,26,5,23,5,17}
+{57,82,42,60}
+{46,67,65,98,69,79}
+{41,50,94}
+{77,81}
+{87,82,18,57}
+{88,27}
+\N
+{32,58,81,88,94,90}
+{23,37,65,38,29}
+{61,11,65,77,25}
+{50,53}
+{38,2,11,9,27,94}
+{64,9}
+{1,45,97}
+{61,41,67,46}
+{13,41,90,15,80,82}
+{83,6,9,22,25,37}
+{95,74,22,64}
+{16,17,4,80,66,33}
+{25,42,43,84,96,85}
+{25,93,50,87,6}
+{35,67,90}
+{82,37,59}
+{4,44,83,2,81}
+{78,46}
+{64,79}
+{18,41,3}
+{56,20,51,83}
+{26,77,52,70,93,13}
+{54,53,12,47,57,63}
+{94,48}
+{39,12,41,5,3}
+{28,33,93}
+{20,29,9}
+{75,38,10}
+{96,54,96}
+{47,87}
+{19,35,11,3,80,72}
+{75,56,84,24,55,48}
+{58,5,13,6}
+{10,53,32,6}
+{23,8,59}
+{71,2,35}
+{41,16,99}
+{77,6,16}
+{30,27,56,85,11}
+{47,21,93,82}
+{50,68,85,34,19,57}
+{14,76,58}
+{78,81}
+{68,99}
+{19,79,67}
+{91,73,82,88,44,36}
+{49,18,75,32}
+{54,18,99,74,9}
+{51,58,60,30}
+{99,86,83,22,88}
+{24,42,76,30}
+{86,16,54,69}
+{37,39,72,45}
+{92,62,3,36}
+{31,80}
+{43,22,11,15}
+{38,88,95,25,49}
+{92,21,10,28,47,55}
+{99,18}
+{26,64,72}
+{29,12,17}
+{54,69,49,84}
+{57,42,4,61,10}
+{60,85,74}
+{24,29}
+{91,71}
+{96,49}
+{47,51}
+{88,67,59,18,86}
+{32,18,64,54,41,27}
+{78,100}
+{77,30,85,93,2,20}
+{80,90,68}
+{49,37,5,42}
+{88,12,94,51}
+{85,65,2,41}
+{60,38}
+{87,37,20}
+{27,81,94,37,54,84}
+\N
+\N
+{38,74,78,78,89}
+{3,100}
+{42,80,68}
+{34,17,96,91}
+{7,29,83,71,87,26}
+{28,81,76,8,43,48}
+{74,11}
+{28,85,84,78,59,69}
+{30,22}
+{3,83,75,60,78,11}
+{20,62,18}
+{74,69}
+{91,44,50,62}
+{57,18,9}
+{14,48,21,33}
+{91,1,53,58,92,51}
+{64,41,90,52}
+{81,95,38,78,7,44}
+{65,25,15,90,40,51}
+{66,41,31}
+{5,92}
+{17,98,7,57}
+{97,36,99,77,50,88}
+{96,56}
+{40,62,88,8,53,62}
+{18,91,63,93,94}
+{88,79,43}
+{31,87,98,85}
+{12,88,58,53,77,38}
+{83,10,37,69,1,7}
+{13,47,66}
+{85,33,39,48,6,39}
+{74,87}
+\N
+{26,50,26}
+{48,78,10,39,17}
+{27,43}
+{58,17,18,80}
+{86,43,58,77,67}
+{53,12}
+{9,79,9}
+{85,79,89,88}
+{35,77,22,52}
+{93,64}
+{47,52,90,17}
+{75,15,25,68,28}
+{35,6,68,37,18,53}
+{80,14,2,89,4}
+{52,49,5,66,59,44}
+{5,26,96,1,84}
+{71,8,61,19,72}
+{17,94,84,72,55,83}
+{72,10,16,40,17,75}
+{6,70,15}
+{22,99,7,19}
+{55,19,4}
+{6,47,69,42}
+{17,9,63,44,15}
+{23,20,72}
+{10,80,20,87}
+{99,3,23}
+{11,76,8,77,58,38}
+{45,14}
+{22,89,73,63,54,9}
+{16,19}
+{1,26,29}
+{92,20,65,33,16,40}
+{27,64}
+{22,19,95}
+{36,16,9,30,31,14}
+{40,50,68,52,77,58}
+{35,15,11}
+{67,2}
+\N
+{63,48,76,25}
+{14,65,42,60}
+{61,58,31,51,70,4}
+{35,41,72,29,46,62}
+{98,48}
+{90,23}
+{1,79,80}
+{10,5,54,59,16}
+{15,1,9,75}
+{34,100,90}
+{73,76,25,77}
+{98,82,77,67}
+{79,5,20}
+{9,69,9,52,2}
+{23,22,77,80,79}
+{32,51}
+{23,52,5,33}
+{95,20,96,78,48}
+{100,37,6,15}
+{98,1,53,20,97}
+{5,28,26,78,33}
+{19,75}
+{49,42,30,72}
+{50,98,56,26,87}
+{76,59}
+{51,16,18,48,46,97}
+{80,60,51,43,58,28}
+{23,12,70}
+{40,16,14,18,46,21}
+{72,79,47,57,23}
+{7,17}
+{49,95,6}
+{14,24,29,13,90}
+{82,28,34,55,15,87}
+{31,24,3,50,45}
+{86,95}
+{97,22,17}
+{27,14,27}
+{61,63,31,74}
+{55,81,87,67,90}
+{81,9,79}
+{100,29,43}
+{41,88,37,29}
+{62,57,16,91,60,65}
+{94,90,34,94,27,48}
+{15,36,80,30,23,90}
+{47,91,6,42,93}
+{53,74,5}
+{84,14,56}
+{30,56}
+{10,12,92}
+{33,7,75}
+{96,39,50,77}
+{89,85}
+{20,39,63,22,44,18}
+\N
+{90,23,79,91,85,8}
+\N
+{73,70,52}
+{75,100}
+{27,4,29,96,25}
+{56,31,80,59}
+{1,91}
+{16,67}
+\N
+{17,88,59,41}
+{13,49,29,76,71,9}
+{41,38,16,29,66,40}
+{68,67}
+{39,74,47,71,63,80}
+{4,74,33,92}
+{17,60,82,7,52}
+{62,88,39,19,22}
+{77,21,1,95,42,2}
+{98,62}
+{55,17,81,31,11,88}
+{73,52,18,94}
+{16,64,90,33}
+{87,41,81,95,85}
+{20,55,96,75}
+{71,72,11,11,83}
+{75,94,89,47,41,7}
+{56,48}
+{76,29,74,31,67}
+{47,70,68,36,70}
+{5,69,10,94,54,32}
+{29,96,71}
+{64,28,86,58}
+{82,57}
+{42,2}
+{64,48,59,8,45}
+{61,69,43,40,1}
+{69,84}
+{68,51}
+{32,20}
+{21,7,5,60,35}
+{100,40,18,98,37}
+{50,96}
+{87,10,12,27}
+{47,3,46,43}
+{60,87,10,31}
+{92,87,50,37,72,73}
+{99,61,77,87,29}
+{23,95,31}
+{96,100,43}
+{17,64,84}
+{13,19,57}
+{65,86,4,75,46,69}
+{49,60,99,37,50,11}
+{77,82,88,12}
+{12,95,66,98,63}
+{83,78,68}
+{76,14,87,25,29,14}
+{20,9,99,73,67}
+{42,51}
+{36,22,33,6,63}
+{53,46,22}
+{40,89}
+{37,7,89,17}
+{32,89,16}
+{65,87,4}
+{16,16,57,35}
+{34,90}
+{80,54,1}
+{11,93,34}
+{5,19,31,50,99,33}
+{98,1,33,54,7}
+{45,39,23,78}
+{37,47,98,83,10,5}
+{55,88}
+{42,76,18,99}
+{86,31,25,5,45}
+{67,87,47,1}
+{23,15}
+{78,88,66,96}
+{58,55,41,67,86,41}
+{21,53}
+{90,14,28,38,95,71}
+{20,5,13,52,1,88}
+{29,98,50,75}
+{91,3,24,75,82}
+{62,33}
+{56,69,31,95,66}
+{46,85,40}
+{17,22,67,57,39,16}
+{58,25,92}
+{31,53,82,64,69,40}
+{40,12,30,1,39}
+{78,10,42,40,25}
+{58,27,1,12}
+{28,11,80}
+{36,89,69}
+{50,95}
+{61,63,59,62}
+{51,77}
+{90,24,88,84}
+{61,27,57}
+{51,81,33,75,48}
+{47,30,33,23,44}
+\N
+{79,51}
+{62,44,5}
+{98,83,80}
+{31,33,89,69,19,40}
+{22,38,61}
+\N
+{90,70,10}
+{37,90,49,65,95,52}
+{95,42,4,47}
+{92,100,43,31,27,1}
+{39,17,88,20,2,80}
+{82,64,36,84}
+{31,18,21,18,52,34}
+{3,35,36,33}
+{26,39,69}
+{67,63,66}
+{54,85}
+{65,71}
+{26,14,84}
+{63,82,73,30}
+{66,79,21}
+{71,13}
+{57,25,40,14,22}
+{63,9,91,31}
+{70,63,36,32,93}
+\N
+{11,85,47,31,54}
+{34,47}
+{42,78,92,85}
+{75,64,12,83}
+{33,98,52,91}
+{22,25,91,79,33}
+{33,51,20,77,23,65}
+{83,66,46,24}
+{54,65,31}
+{43,41}
+{52,47,66}
+\N
+{59,85,85,63,83,53}
+{16,76}
+{44,97,48,52}
+{26,36,72}
+{26,55,98,7}
+{70,88,7,87,62,37}
+{11,42}
+{98,38,36,72}
+{51,90,82,33,92}
+{59,80,79}
+{76,77,18,71}
+{34,56,62}
+{85,12,37,66}
+{34,64,74}
+{77,63,28,76,11}
+{2,63,87,50}
+{60,98,60,19,15,57}
+{93,66,33,71,36,3}
+{41,94}
+{62,72,87,19}
+{57,83,36}
+{63,64,21,13,70,32}
+{71,36,9,55,34}
+{92,52,90,45,88}
+{59,54}
+{4,51}
+{55,25,35,90,93,2}
+\N
+{75,15}
+{25,86,43,18,77}
+\N
+{31,40}
+{55,49}
+{67,1,84,20,9}
+{15,1,48,18,100}
+{62,46}
+{4,39,86,55}
+{49,17}
+{65,20,71,49,55,49}
+{40,57,63,14,3}
+{48,68}
+{67,97,58,55,5,34}
+{3,73}
+{79,97}
+{82,63,87,66,32}
+{19,49,96,50,55}
+{32,19,41}
+{17,53}
+{64,81,70}
+{66,75,18,92,54,93}
+{7,94,38,86}
+{16,62,45,19,10,11}
+{18,47}
+{58,96,69}
+{65,25,58,98}
+{29,51,37,40,44}
+{91,78}
+{37,84,85,65}
+{70,61,31,22,32,22}
+{67,12,99,39,78}
+{41,79,46,54,84,22}
+{38,26,43,4,45,75}
+{29,68,35}
+{69,59,69,33}
+{4,46,52,49}
+{1,25,44,12,71,29}
+{38,75,99}
+{83,58,86,6}
+{93,35,35,34}
+{85,26}
+{15,46,95,60}
+{62,63,65,49,10}
+{44,67,19,80,83}
+{63,41,30,43,85}
+{13,46}
+\N
+{13,95,1,34,72,37}
+{4,32,22,47,6}
+{67,65,77,3}
+{40,70,22,44}
+{74,9}
+{44,28,5,32,67,51}
+{55,14}
+{41,3,72,68}
+{64,82,72}
+\N
+{11,88}
+{91,90,92}
+{68,66,95,80,58,54}
+{30,49,11}
+{54,86,59,69,67}
+{56,83,36}
+{15,67,9,47}
+{92,30,78,2,87}
+{12,54,2,1,59,36}
+{84,25,67,38,19,53}
+{28,45}
+{54,84,9,75,59,26}
+{47,35,54,93}
+{36,96,59,75}
+{78,78,52,93}
+{87,96,67}
+{5,61,15,13,27}
+{53,58,6,78,86}
+{43,70}
+{72,38,15,61,58}
+{75,27,30,12,35,71}
+{18,72,35,62,81}
+{45,10}
+{36,91,73,25}
+{81,85,22,34,29}
+\N
+{15,97,82,44,19,83}
+{51,23,18,6,74}
+{53,75}
+{62,9,73,95,37}
+{58,42,33,41,71}
+{5,97}
+{30,2,89,81,93,61}
+{32,3,18,84,24}
+{6,97,20,89,23}
+{27,74}
+{22,86,81}
+{77,19,42}
+{92,9}
+{58,90,59,91,30,54}
+{29,51,92,34}
+{85,68,59}
+{36,83,75}
+{37,50,86,9}
+{79,70}
+{33,46,93}
+{97,17,6,88,10}
+{18,42,88,4}
+{41,95,71,27,95}
+{8,2,81,56}
+{54,94,54,28,70}
+{34,87,20,10,5}
+{36,76,87,5,100}
+{97,91,25,89,89,95}
+{76,26,73}
+{82,23,7,42,58,72}
+{53,16,99}
+{10,34,57,47,2,96}
+{81,93,26,19}
+{8,1}
+{79,55,37,61,62,3}
+{34,16,69,58}
+\N
+{41,7,99,87}
+{70,21,86}
+{59,2,49,45,91,97}
+{37,2,74,2,61,68}
+{97,39,15,4,13,1}
+{67,71,8}
+{51,2,84,38}
+{55,8}
+\N
+{75,27}
+{37,36,49,70,82,41}
+{70,20,85,89,99,90}
+{69,61,100,49,75,35}
+{11,4,67,4,91,17}
+{77,56,65,78,25,8}
+{16,58,6}
+\N
+{88,38,19,88,27,27}
+{12,46}
+{36,67}
+{62,33,96,94,80,96}
+{56,94,12,1,65,54}
+{58,73}
+{19,80,27,72}
+{47,55}
+{14,91}
+{94,75,92,32,19}
+{99,12,91,4,85}
+{56,55}
+{86,83,77,66,66,87}
+{46,68,13,45}
+{49,75,62,35,39}
+{20,25,33}
+\N
+{91,47,56,68,14}
+{88,43,24,42,4}
+{50,24,94,18}
+\N
+{71,54,91,66,97,22}
+{81,16,19,67,6}
+{78,46,81}
+{63,93,71,75,87}
+{90,38,10,85,12}
+{11,24,93,42,25,77}
+{30,14,32,67,70}
+\N
+{86,91,77}
+{73,74,64,66}
+\N
+{7,18}
+{85,94}
+{37,15,55,100,59}
+{55,18,44,79,57}
+\N
+{52,40,97,75}
+{60,53}
+{38,9}
+{27,67,77}
+\N
+{43,83,82,24,35,64}
+{22,75,29}
+{9,19}
+{67,1}
+{15,35,11}
+{65,45,95}
+{65,9}
+{63,84,99,89,6,77}
+{20,44,31}
+{82,50,88}
+{29,12,46,21,98,7}
+{98,71,3,73,6,86}
+{61,44,74,2,45,33}
+{16,56}
+{31,87}
+{72,30,37,94}
+{65,30,82,17,12}
+{86,19}
+{55,76,96,61}
+\N
+{44,92,83}
+{41,22,79,95,20}
+{36,33,86,9,61}
+{22,88,8,57,73,30}
+{63,97}
+{36,53}
+{56,52,48}
+\N
+{35,8,3,93}
+\N
+{53,52}
+{7,48,78,46,70,14}
+{33,92,55,17}
+{39,57}
+{71,43,72,7}
+{92,85,55,38,35}
+{68,30,67,8,18,92}
+{9,85,82,24}
+{46,46,19,14}
+{96,97,31,59}
+{35,99}
+{54,7,20,28,29}
+{20,21,56,82,19,40}
+{2,39}
+{33,49,63,49,93}
+{35,40,26}
+{30,35}
+{94,70,2,23,91,74}
+{34,37,72,19,15}
+{92,21}
+{72,63,64,35,40}
+{59,11,9}
+{24,3}
+{93,75}
+{22,14}
+{63,99}
+{39,47,10,14,3,45}
+{51,74,5,85,70}
+{6,33,15,4,89,20}
+{97,82,29,15,66}
+{47,47}
+{88,79,57,10,68}
+{18,22,13,100,100,67}
+{75,50,9}
+{3,12,34}
+{39,51,20}
+{56,5,63,18}
+{83,44,86,46,37}
+\N
+\N
+{60,16,54,75,62}
+{91,95}
+{39,55,11}
+{37,7}
+{29,49}
+{38,4,52,85,67,38}
+{36,56,2}
+{52,14,92,39,77,16}
+{42,25,49,55}
+{70,10,33}
+{53,46}
+{83,15,28,59}
+{35,69,82,4,58,46}
+{73,55,64,9}
+\N
+\N
+{60,25,8,8,39}
+{50,71,61,64,64}
+\N
+{65,67,67,34}
+{77,59,18,64,16}
+{43,72,32,44,59}
+{55,57}
+{12,47}
+{30,75,89,81}
+{23,92,16,31}
+{64,45,21,74,19}
+{4,47,49,47,96}
+{37,14,20,18,87}
+{61,45,38,39,1,87}
+{4,98,99,52,27}
+\N
+{23,6,50}
+{22,61,46,79}
+{90,54,60,9,49,42}
+{73,27,51,72}
+{73,11,23,60}
+{7,31,52,34}
+{27,68,39}
+{39,8,21,48,64}
+{86,64,92,60}
+{55,36,40,46,23,46}
+{32,79,86,44}
+{72,29}
+{33,87,57}
+{57,87,61,22}
+{67,84}
+{32,99,26,92}
+{22,27,34,82,8}
+{99,25,99}
+\N
+{29,75}
+{39,63,25,45,7}
+{39,67,18,13,18}
+{23,83}
+{77,69,22}
+{60,13,46}
+{2,10,42}
+{37,20,27}
+{30,21}
+{85,15,52}
+{6,89,38}
+{68,22,26,37,96}
+{6,85}
+{93,51,63,46,26,64}
+{79,77,15,26}
+{90,6,39}
+\N
+{50,58,85,27}
+{69,8,72,47}
+{7,59}
+{55,16,54,95}
+{96,5,50}
+\N
+{77,92,13}
+{46,30}
+{43,65}
+{17,65,32}
+{10,6,46,1,47,75}
+{48,82,71}
+{63,12}
+{68,14,10,97,34}
+{15,45,58,100,7,74}
+{9,23,88,1,95}
+{61,60,15,12,58}
+{84,51,46,41,71,26}
+{58,62,39}
+{86,67,31}
+{32,31,89,2,30}
+\N
+{90,74}
+{65,79,76}
+{22,30,77,47,40,23}
+{67,99,56,73}
+{11,24,30,93,89}
+{70,17,65,78}
+{100,6,67,29}
+{39,4,22,59}
+{84,29,70,9}
+{74,43,72,27,55,27}
+{12,39}
+{1,83,100}
+{48,23,9}
+{21,88,21,35,16}
+{92,34,44}
+{91,96,13}
+{93,57,40,79,81}
+{86,3,94,82,43}
+{78,70,19,97,49}
+{47,22,98,36}
+{20,59,65,54,81,27}
+{58,13,73,19,54,96}
+{26,20}
+{70,75,14,70,82}
+{77,67,53,33,83}
+{2,43,36}
+{84,17,28}
+{68,25,95,62,92}
+{47,90,15,69,85,23}
+{92,92,24,37}
+{96,14,14,38,38}
+{80,4}
+{66,86,28,15}
+{18,90,74}
+{93,76}
+{64,96,14}
+{76,41,86,67,64}
+{58,95,2,86}
+{12,60,96,70}
+{22,37,58}
+{1,67}
+{75,23,24,7}
+{3,57,66}
+{57,30,68,100}
+{68,57,33}
+{26,32,65,51,75}
+{40,14,60,97,83}
+{88,96,42}
+{66,21,21,78,34}
+{15,56}
+{86,60,66,66,16}
+{94,6,58}
+{99,63,70,57,10}
+{82,59,62,38,82,51}
+{48,61,9,46,28,57}
+{29,23,61}
+{12,30,42,20}
+{99,65,24,7,97}
+{20,5}
+{6,49,85,56,97,4}
+{62,93,88,86,75,29}
+{46,2,94}
+{57,71,45}
+{38,60,21,78}
+{95,53,92}
+{61,1,88}
+{67,80,49}
+{59,82,1,48}
+{19,94}
+{25,64,16}
+{96,73,50,85}
+{28,17,46}
+{81,51,50,18}
+{57,99,66,93}
+\N
+{23,62,57,94,40}
+{21,6,83}
+{4,11}
+{83,16,50}
+{46,41,23,1}
+{4,15,8}
+{86,51,29,80}
+{48,34,55,81,89}
+{5,2,43,67,66}
+{42,59,37,91,1}
+{14,98,27,80,33}
+{18,58}
+{49,93,60,91,94,88}
+{32,62,64,63,48}
+{51,1,90}
+{56,8,68,49}
+{16,34,79,18,76}
+{66,88,41}
+{31,66,93,44,96,40}
+{100,99,30}
+{37,49,95,91,18,43}
+{95,2,94}
+{84,15,70,31,30,84}
+{31,41,45}
+{9,73,2,7,34}
+{17,35,43,1,25,72}
+{8,70,8}
+{1,93,32,16,71,61}
+{98,51,27,56,46,65}
+{1,11,57,72,33,7}
+{48,96,64,55,75}
+{83,82}
+{7,74,70,29,59,60}
+{29,44,5,77,52}
+{84,58}
+{87,63,62,52,69}
+{29,58,32,11,13,17}
+{35,99,67,67,93}
+{54,31}
+{53,24}
+{58,59,32,22}
+{8,76,23,63,94,54}
+{3,88,75,17,64,91}
+{29,30}
+{3,81,39,9,77,82}
+{77,85,59,56,8}
+{47,12,63,13,40}
+{66,81}
+{67,33}
+{39,46,28,79,95,67}
+{49,13,98,63,10,58}
+{14,42}
+{80,70,60,92}
+{63,54}
+{30,70}
+{60,89,14,62}
+{56,40,94,55}
+{70,31,46,20,95}
+{18,65,89,7,75}
+{60,33,80,43,37,4}
+{85,19,98,79,36,84}
+{69,1,48}
+\N
+{30,87,9,22,99,60}
+\N
+{23,96,9,85}
+{22,94,39,58}
+{30,38,4,97}
+{16,70,62,5}
+{35,52}
+{32,10,72}
+{35,34,40,31,66,80}
+{7,77,14,48,97}
+{67,64,37,22,69}
+{51,53}
+{67,71,90}
+{87,71,45}
+{44,84}
+{19,58,11,34,45,85}
+{68,19,55}
+{27,16}
+{7,14,92,22,33,46}
+{47,2,49,53,63,32}
+{15,39}
+{13,47,84}
+{29,74,97}
+{51,74}
+{70,26,46,33,51}
+{31,86,14,23,61}
+{20,85}
+{21,10,57}
+{90,94,59,72,97}
+{97,30,74,84}
+{15,89,69}
+{11,40,2}
+{68,19,47,28}
+{47,65}
+{2,7,52,53,44}
+{40,74,34,36,78,71}
+{22,60}
+\N
+{37,75,47}
+{53,78,2}
+{4,32,42}
+{35,76,69,88}
+{95,13,3,38,3}
+{74,74,62,90}
+{8,72,42,2}
+{11,43,5,43,70,16}
+{69,19}
+{61,37,26,49}
+{16,100,69,32,35}
+{58,77,26,76}
+{74,87,37,47,84}
+{8,82,29,93,15}
+{74,88,93,85,97,95}
+\N
+{29,23,99,98,36,93}
+{8,36,87,64}
+{71,90,43}
+{7,28,78,46,52}
+{62,25}
+{33,90,7}
+{60,72,39,18,86}
+{98,59,73,24}
+{17,69,2}
+{49,16,63,56}
+{13,37,62,1,95}
+{98,89,69,92}
+{50,26,34}
+{90,16}
+\N
+{40,54,3,79,51,19}
+{29,24}
+{6,12,82,24}
+{92,52}
+{89,2}
+{64,25,68,55,81,2}
+{64,77}
+{71,46,58,50,56,34}
+{94,17,35,30,60,33}
+{37,30,2,40}
+{98,15,16,92,2,50}
+{44,19,82,57}
+{37,34,6}
+{59,43,1,53,79}
+{7,37,14,14,92}
+{80,78,49,81,23,17}
+\N
+{91,51,12,35,79}
+{9,14,2,84}
+{62,3,77}
+{25,5,40,12,40,79}
+{65,88,82,94,89,90}
+{20,35}
+{80,71,83}
+{6,9,83}
+{94,58}
+{2,76,55,61,42,53}
+{60,53,45,82,3}
+{1,37,75,96}
+{82,61,81,10}
+{36,46,1,31,90,45}
+{22,55,11,25,21}
+{69,13,29,20}
+{95,54}
+{16,79,82,67}
+{4,58,84,84}
+{52,7}
+{25,14,94}
+{69,8,67,54}
+{30,71,36}
+{81,78,23,38,76,58}
+{86,59,61}
+{11,42,63,74,99}
+{66,4,55,34,16}
+{39,57}
+{10,81,9,8,21,10}
+{75,55,64,97,7,45}
+{8,46,86}
+{39,100,52}
+{30,51,7,13,54}
+{72,85}
+{10,52}
+\N
+{61,7}
+{93,1}
+\N
+{74,31,3}
+{90,96,26,84}
+{88,58,74}
+{28,45,74,24,74}
+{95,88}
+{42,70,43,64,22}
+{46,83,48,36}
+{81,99,100,43,11}
+{47,24}
+{46,67,63}
+{26,15,36,89}
+{90,11,78,70,81,87}
+{65,90}
+{89,99,21,81,47,38}
+{37,42}
+\N
+{94,51}
+{12,57,95,63,29}
+\N
+{68,99}
+{27,8}
+{16,52,11}
+{72,5,85,44,57,51}
+{11,6,91,7}
+{87,80}
+{94,61,1,38,77,89}
+{93,60,6,98,46}
+{52,47,44}
+{93,66,61,22}
+{7,61}
+{15,83,93,91,12,40}
+{66,3,5,72,72,36}
+{67,72,68}
+{42,42}
+{38,17}
+{75,60,47,39}
+{58,28,51}
+{61,8,61,81,65}
+{46,52,97,84,27,47}
+{97,53,47}
+{64,93,83,72,27}
+{34,79,34,36}
+{25,5,92,37}
+{12,20,55,94}
+{17,43}
+{39,37,16,70}
+{79,62,15,16,64,28}
+{80,87,96,41}
+{51,55,1,94,72}
+{75,22,56}
+{2,55,7,20,39}
+{8,91}
+{73,8,42,73,31}
+{90,90,23}
+{82,68}
+{63,64,68,12,59,19}
+{100,80,23,24,17}
+{23,46}
+{25,13,31}
+{43,95,54,85}
+{40,62,21,21,82}
+{70,20,16}
+{90,11,23,18}
+{16,9}
+{51,57,30,27,21}
+{50,55,75,77,53,33}
+{84,92}
+{14,66,32}
+{44,100,16,30,82}
+{41,48,58,60,7,44}
+{81,76,13}
+{18,26,82}
+{84,35,15,98}
+{52,84}
+{13,80,36,35,28}
+{91,16,71,55}
+{87,89,6,20,28}
+{12,75,92}
+{48,41,55}
+{59,75,26}
+{48,19,48,72}
+{91,4,100,25,17}
+{46,52,97,78,94}
+{7,81,76}
+{54,54,49}
+{89,37}
+{78,22,57}
+{75,25,83}
+{25,89,10,38,96}
+{52,12,1,74,35}
+{13,48,88,7}
+{6,97,20,19,91}
+{53,2,99,76}
+{4,58,46}
+{30,30,89}
+{97,2,87,47,55}
+{14,11,72,83,97,74}
+{44,69,11,51}
+{47,17,86,27}
+{15,19,56,96,24,94}
+{81,67}
+{11,11}
+{20,94,49,36,39}
+{39,78,40,46}
+{33,87}
+{76,89,58}
+{94,74,25}
+{33,77,5,47,55}
+{28,67,99,81,93,83}
+{31,10,19,65,60}
+{53,25,74,24,48}
+{73,69,23,45,88}
+{70,56,41}
+{21,73,72,28,99,5}
+{75,69}
+{78,99}
+{66,49,89,86,2}
+{30,53,18,21}
+{67,69}
+{1,98,38}
+{91,25,16,39}
+\N
+{75,54,93,39,18}
+{96,84}
+\N
+{64,71}
+{6,15,78,50}
+{8,45,26,15,25}
+{8,90,94}
+{52,66,13,98,86,69}
+{3,25,28,56,88}
+{84,72,89}
+{10,33,46,6,57,100}
+{13,91,99,2,49}
+{83,59}
+{88,64,42,50,77,16}
+{81,12,27,45}
+{12,17,31,93,22,53}
+\N
+{28,84,85,35,3}
+\N
+{42,12,86,76,37,63}
+{46,23,18}
+{45,80,76}
+{94,18,100}
+{17,80,84,80}
+{84,88,29,16,10}
+{7,42,90,51,33,40}
+{79,51,22,2}
+{31,30,72,24,23,84}
+\N
+{55,50}
+{69,47,82,29,83}
+{94,56,69,18}
+{7,81,71}
+{95,13,32}
+{66,59,68,62}
+{52,19,62,51,80,32}
+{38,18}
+{73,24,81,58,22}
+{11,59,41,19,96}
+{61,11,56,89,89}
+{61,72,9}
+{63,12,8}
+{76,54,75,84,6,44}
+{74,3,11,62,30,74}
+{46,60,71,55}
+{28,47,52,71,33,33}
+{35,51,37}
+{38,89,40,29,30}
+{18,26,99,89}
+{36,44,8,100,72}
+{1,23,6,5,23}
+\N
+{84,17,16,44,81}
+{29,70,24,85}
+{23,57}
+{20,98,30,23,1,66}
+{82,3}
+{70,7}
+{15,49,58}
+{19,40,70,88,35}
+{45,10}
+{62,89,47,71,55}
+{34,100,88,44,3,91}
+{92,65,16,24,7,9}
+{20,12,61,95,7}
+\N
+{57,49,42,87,88,14}
+{89,99,86,31}
+{32,55,51,78}
+{55,66,78,10,12}
+{37,19}
+{13,5,36,66}
+{89,7,40,45}
+{41,58,41,24,11}
+{98,8,9,27,40}
+{49,83,89}
+{91,36,78,44,100,62}
+{76,78,9,52,57,27}
+{100,59,37}
+{51,1}
+{92,83}
+{45,1,85}
+{8,81,45,94,32}
+{52,26,9,98,7}
+{97,52,4,85,13,11}
+{94,38,58,4,72,91}
+{5,39,26,14,74,51}
+{31,44,37,24,89}
+{8,74}
+{56,93,36,3}
+{23,46,25,90,42}
+{4,98}
+{31,95,27,26,20}
+{3,7,79,9,90}
+{29,22}
+\N
+{35,34}
+{80,28,12,21}
+\N
+\N
+\N
+{36,49,94,83,25,9}
+{6,62,89,93,59}
+{67,75,3,93}
+\N
+{94,62,3}
+{97,36}
+{43,89,26,94}
+{46,56,22}
+{50,15}
+{45,47,39,61}
+{23,32,24,45,43,11}
+{97,66,29,8,52,67}
+{37,1,48}
+{30,84,86,91}
+{4,46,59,35}
+{76,37,41,90}
+{26,28,92,27,88,17}
+{76,37,27,41}
+{74,51,31}
+{16,33}
+{66,85,68}
+{4,81,72,62}
+{65,14}
+\N
+{11,43,28,14,9,43}
+{60,88,95,1}
+{52,92,69,48}
+{37,81,85}
+{57,73,8,79}
+{50,26}
+{52,41,99,6,33}
+{9,34,58,22,9}
+{56,37,19,77,50}
+{93,21,18,90,41,40}
+{28,89,76}
+{4,36}
+{89,54}
+{70,28}
+{66,11,3,47,30,43}
+{69,54,86}
+{45,41,57,34,18}
+{91,46,32,68,42,68}
+{25,87}
+{75,57,12}
+{55,15,68}
+{6,63}
+{22,39,88}
+{77,39,10}
+{39,49,69,61,66,77}
+{78,25,42,73,89}
+{17,47,36,27,79}
+{33,83,44}
+{27,75,12,96,94,87}
+{50,17,95,42,25}
+{67,13,22}
+{59,85,95,2}
+{81,57,83}
+{25,11,72}
+{32,84,97,6,65,52}
+{62,25,24,27,50}
+{80,64,23,74,54,75}
+{97,17,15,100}
+{50,11,41}
+{57,82,40}
+{10,90,41,52,39}
+{4,11,86}
+{79,17,51}
+{48,100,92,77,58}
+{88,67,19}
+{40,96,52,35,16}
+{89,63,32,81,28,63}
+{44,56,66,50,55}
+{28,73,46}
+{32,40}
+{52,65,85}
+\N
+{51,34,18,82,83}
+{49,49,90,71}
+{84,16,74,78,86,10}
+\N
+{73,9,47}
+{51,59,49,90}
+{85,13,78}
+{98,77,18,15,92,85}
+{40,94,66,94}
+{89,51,80,12}
+{23,26,75,17}
+{96,2,51}
+{88,62,90,32}
+{85,19,87,89,30,15}
+{33,38,9,46,19,87}
+{27,45,15}
+{39,79,82,88}
+{31,33}
+{41,64,10,1}
+{35,61,22,76,74}
+{75,11,90,16}
+{71,23,43}
+{35,3,97}
+{88,4,97}
+{100,61,28}
+\N
+{64,74}
+{9,44,81,98,55}
+\N
+\N
+{76,89}
+{18,34,80}
+{77,83,91,50,20,41}
+{65,50,26,65}
+{79,18,90}
+{5,60}
+{42,21}
+{31,70,80}
+{20,98,15,14}
+{58,65,45,6,64}
+\N
+\N
+{88,82,98}
+{75,81,32,34,59}
+{37,14}
+{30,36,55,70,65}
+{84,55,26}
+{56,64,1}
+{31,41,89}
+{46,43,43,90,34,100}
+{78,36,21,14,69}
+{100,10,45}
+{73,69}
+{60,86,5,70,78,99}
+{6,89,92,8}
+{86,68}
+{44,4,71}
+{41,36}
+{95,80,42,94,34}
+{73,29,50,49}
+{61,20,57,17,36}
+{37,58,67}
+{56,83,77,37}
+{98,67,40,10,35,76}
+{54,84,6}
+{7,71}
+{65,74,43,6}
+{62,98,74}
+{81,26,17,22,47}
+{49,32,59,35,11,94}
+{80,50}
+{91,1,50,97}
+{71,35,84}
+{97,4,46,45,8,36}
+\N
+{81,62,76}
+{69,78}
+{89,3,16,64,17,17}
+{78,72,26,88,81}
+{25,34,9}
+{50,27,34}
+\N
+{55,44}
+{61,51,39,53,44,46}
+{23,94,32,92,90}
+{91,47,67}
+{1,13,76,57,63}
+{77,19,73,18,95}
+{100,82,87,6,83,23}
+{69,58,48,97,60,50}
+{4,83,85,6}
+{3,5,91,37,94}
+{91,72,31,32,80}
+{57,23,39,46,50,20}
+{92,28,53}
+{71,27,46}
+\N
+{59,73,29,21,89,30}
+{1,83,96}
+{34,41,65,35}
+{52,89}
+{62,68,80,7}
+{82,82}
+\N
+{11,2,62,46,28,9}
+{9,16}
+\N
+{22,44,73,82,39,86}
+{97,52}
+{46,36,76,56}
+{17,97,26,72}
+{16,78,9,70}
+{65,55,30,91,16}
+{27,45,76}
+{17,5,90}
+{86,52,93,89,42,27}
+{51,70,41,35,1}
+{91,57,66}
+{53,59,62,57,52,56}
+{100,100}
+{32,78,87}
+{61,57,74}
+{86,79}
+{55,94,64}
+{81,20,26,22,23}
+{9,96}
+{86,65,35,19,88}
+{1,37,90,51}
+{79,47}
+{93,93}
+{32,85,69}
+{49,12,6,69}
+{6,44,92,37}
+{28,42,57,28,2,69}
+\N
+{63,90,25}
+{53,28,74,42}
+{83,79,94,37,64,69}
+{93,100,57,84,80}
+{39,93,80}
+{97,92,55}
+{27,6}
+{20,100}
+{19,66,3,66}
+{7,76,15}
+{7,56,92,11}
+{61,76,6,98,52}
+{20,46,51}
+{12,77,45,67}
+{78,79,32,22,21,47}
+{62,35,1}
+{86,66,57,10,47,43}
+{43,24,76,18,87,68}
+{39,52,71,35,87}
+{81,78,8,10}
+{33,70,53,54}
+{25,77,27,68,95}
+{29,53,89,62,51}
+{21,76,33,72,39}
+{13,22}
+{1,1,51,73,20}
+{26,97}
+{64,75,23,94,62,68}
+{25,20,84,57,27}
+{26,7}
+{92,80,17,48,72,73}
+{73,49,88}
+{24,36,70,53}
+{7,79}
+{80,58,33,25,91}
+{19,43,61}
+{54,49,73}
+{51,88,4}
+{9,32,5,83}
+{17,68,90,15,30}
+{98,50,42}
+{29,52}
+{32,41,4}
+{33,97,69,34}
+{94,2,60,5,83}
+{23,86,43,74,35}
+{63,37,38,58,39,14}
+{56,7,82}
+{88,81}
+{50,75}
+{78,49,67,68}
+{10,61,58}
+{84,35,20,30}
+{36,34,48,31,16}
+{35,7,47,22}
+{98,40,56,43}
+{16,4,7,9,44,55}
+{86,90,30,80,47,91}
+{34,91}
+\N
+{12,67,77,23,11}
+{94,8}
+{5,68,31,82}
+{26,65}
+{51,19,86}
+{55,83,39,39,96,51}
+{31,22,70}
+{20,50,15,93}
+{1,55,64}
+{8,2,14,3,40}
+{2,71,25,41,5,5}
+{98,61}
+{21,64}
+{100,76,99,18,78}
+{17,4,69,97,61}
+{52,79,97}
+{52,26}
+\N
+{90,54,2,62,11,51}
+{33,12,34,45,2}
+{91,63,51,42,82}
+{100,79,73,70,54,14}
+{57,94,81,55}
+{13,18,94,17,16,34}
+{58,79}
+{90,64,68,46,95}
+\N
+{37,46}
+{91,94,10,85,100,24}
+{65,86}
+{94,89,7}
+{72,79,77,53,95}
+{65,19,92}
+{41,79,53,8,63}
+{28,60,50,42,9,32}
+\N
+{6,23,97,23,10}
+{12,28,16,39,70,50}
+{26,97,61,48,79,23}
+{38,98,21,34,65,89}
+{29,13,36,19,13,45}
+{72,65,58,81}
+{43,98,84,5}
+{79,41,100}
+{35,30,69,42}
+{59,13}
+{65,90}
+{40,38,21,23}
+{2,19,26,38,66}
+{5,16}
+{84,85,97,84}
+{34,26}
+{87,17,21,32,29,25}
+{75,66,87,90,18}
+{84,32,29,51,71,68}
+{57,25,73,24,53,2}
+{74,16,92}
+{99,60,19}
+{98,14,70,72}
+{24,34}
+{37,34,81,100}
+{67,10,17,60,16,55}
+{39,58,5,23,85,95}
+{75,93,19,31,47}
+{13,27}
+{42,14,32,90}
+{59,79,70}
+{48,96,45,38,58}
+{96,87,84}
+{23,70}
+{25,31,81,36,75,32}
+{64,49}
+{30,18,38}
+{69,27}
+{76,82,43,96,73,17}
+{84,95,97,12,20}
+{57,69,36}
+{60,79,19,67,9,12}
+{32,39,3,21}
+{55,83,51,48}
+\N
+{37,11,98,53,11}
+{2,73,24,18,77,74}
+{69,96,17,49}
+{53,2}
+{1,76,72}
+{35,93}
+{35,36,36,25}
+{59,77,30,13}
+{35,69,36,31}
+\N
+{20,23,51}
+{81,83,57}
+{87,43,40,56,81,64}
+{24,63}
+{29,51,45,93}
+{73,85}
+{59,1}
+\N
+{13,57,14,11,34,91}
+{69,1,4,28,77}
+{63,68,41,53,64,43}
+{11,1,46,40,6,88}
+{51,19,77,10,86,66}
+{74,40}
+{25,54,46,62}
+{94,17,64,15,20,36}
+{100,71}
+{63,66}
+{33,88,5,92}
+{92,86}
+{91,69,75,13,20}
+{57,22,32,33}
+{72,87,44,64,46,6}
+{50,56}
+{36,23,7}
+{74,63,3,6,14,29}
+{91,42,8,11,49}
+{32,64,94,88}
+{91,78,55,27,59}
+{2,20}
+{52,95}
+{57,59,35}
+{51,15,52,24,14,13}
+{64,16,18}
+{50,98,71,10}
+{92,99,92,80,77,73}
+{96,12,70,85,54,73}
+{10,44,30,77}
+{29,47}
+{40,55,62,58,30}
+{59,93,7,21,6,20}
+{58,91}
+{5,70}
+{36,23,58,80}
+{16,93,54}
+{20,8,97}
+{78,32}
+{10,31}
+{24,10}
+{56,14,28,10,45}
+{1,79,53}
+{56,58,86}
+{93,83,17,89,93}
+{12,4,26,45,97,17}
+{42,67,17,13}
+{31,90,59,38,4,20}
+{86,52,67,10}
+\N
+{49,59,10,25}
+{69,88,31,38,7,36}
+{84,21,57}
+\N
+{60,8,19}
+{35,81,66,96}
+{13,95,54,38,31}
+{27,25,34,11,65,64}
+{54,43,20,20,65,95}
+\N
+{19,27,100,69,43}
+{91,8}
+{30,65,98,87,84}
+{83,85,100,16,20,18}
+{80,48,56}
+{61,5,92}
+{14,94,43,91}
+{35,52,60,43}
+{73,25,26,61}
+{66,41,39,16}
+{2,96,90,37,99,92}
+{25,31}
+{72,57,50,82}
+{40,69,5}
+{98,34,66}
+{90,44}
+{34,78,93,15,65,71}
+{98,1,28,36}
+{16,59,79}
+{88,1,14,45}
+{41,91,87,20,72}
+{46,9,81,90,63,32}
+{2,84,29,56}
+{2,57,92,69,63,46}
+{3,32,76,62,36}
+{11,81,3,81,90,16}
+{36,1,42,51}
+{29,86,53,51,85}
+{17,66,16}
+{4,21,25,17,65,92}
+{13,26,33}
+{74,6,46}
+{69,19}
+{47,78,85,46,41}
+{41,62,100,85}
+{22,71,66}
+{28,15,58,84,22,92}
+{68,82,82,85,15,54}
+{34,58,72,35,99}
+{51,100,40,13,61}
+{80,89,94,31,96}
+{48,29,33}
+{32,85,75}
+{76,43,17}
+{79,70,3,64}
+{76,64,85}
+{94,90,3,85}
+{86,21,1,8,54}
+{87,92,30,36,59}
+{20,51,62,17}
+{81,61,86,96,47,67}
+{5,75,97}
+{60,24,79,3}
+{85,49,49,48,61}
+{66,60,58,92,88,90}
+{2,18}
+{42,54}
+{42,83,68}
+{98,76,42,25,90,32}
+{64,36,39,45,34,95}
+{56,43,78,10,63,18}
+{51,40,98}
+{85,11,74,41,14,25}
+{37,12}
+{76,32}
+{6,77,16,86,36,25}
+{23,93,18}
+{75,51,67,29}
+{22,9}
+{18,58,25,88}
+{95,31,12,20,62,54}
+{23,97,89,63,73}
+{77,41,11,27}
+{91,86,97,98}
+{84,6}
+{74,69,55}
+{58,42,92,65,52}
+{77,31}
+{8,91}
+{5,83}
+{64,48}
+{1,37}
+{51,4,49,97,64}
+{29,70,3,62,57,1}
+{91,8,31}
+{86,71}
+\N
+{61,50,8,6,59,76}
+{83,8,54}
+{50,45,66,86,52}
+{75,48,18,88,82}
+{1,52,60,78,45}
+{46,65}
+{53,2,63}
+\N
+{89,97}
+\N
+{75,23}
+{30,58,13,50,2}
+{59,73,52,8,70,39}
+{20,35,77,34,10}
+{55,86,14,74,14}
+{67,46,48}
+{20,9}
+{20,92,62,75,34,98}
+\N
+{72,14,18,46}
+{48,71,92,17,31,13}
+{47,46,42}
+{42,75,14,86}
+{97,55,97,78,72}
+{8,4,96}
+{44,13,13,18,15}
+{16,40,87}
+{87,66,79}
+{14,44}
+{35,79,25,57,99,96}
+{23,66}
+{90,49,24,11,8}
+{50,3,24,55}
+{60,94,68,36}
+{11,20,83}
+{66,100,47,4,56,38}
+{36,34,69}
+{41,57,15,32,84}
+{32,25,100,45,44,44}
+{70,32}
+{15,37,67,63,71,34}
+\N
+{81,62,20,91}
+{32,62,1,68,86,54}
+{20,91,40}
+{79,69,22,98,14}
+{45,42,24,2}
+{30,53,15,62}
+{81,100,42,20,96,42}
+{93,19,7,59,100,49}
+{25,7,18,64}
+{11,27,1}
+{89,67,65}
+{39,97}
+{47,62,30,61,58}
+{4,11,83,18}
+{38,30,95,58,13,81}
+{83,6,33,73,64}
+{89,51,77,45,58,16}
+{13,11,88}
+{96,79,71}
+\N
+{18,66,83,52,84,76}
+{52,17}
+{74,95,16,5,16,51}
+{21,20,16,39,84,71}
+\N
+{75,47,36}
+{65,45,12,5,100}
+{41,74,84,21,73}
+\N
+{8,90,46,39,30}
+{47,84,42,49,17}
+{76,100,35,89,17}
+{61,53,50,31,8}
+{94,53,20,33,15}
+{97,46,62,85,74}
+{8,59,40}
+{95,71,21,41,85,81}
+{55,71,20,74}
+{70,95}
+{61,42}
+{83,74,25,84,18}
+{56,43,46,40}
+{42,78}
+{95,48,98,93,35,98}
+{77,34}
+{4,54,58}
+\N
+{13,54}
+{87,66}
+{12,88,90,95,6,95}
+{65,20,10}
+{62,74,59}
+{49,17,51}
+{14,17,65,3,27,41}
+{43,42,43,46,79}
+{88,75}
+{21,46,84,95,31}
+{17,17,28}
+{32,73,29,11,46,94}
+{3,34,81}
+{80,83,1,92,69,100}
+{9,24,56,17}
+{3,80,57,36,14,94}
+{39,89,54,17,31}
+{70,19,67,21,31,72}
+{82,48,68,52}
+{96,81}
+{92,18,39,50,18}
+{6,54,27,52,28,100}
+{23,40,7,74,93,50}
+{87,51,38,88}
+{98,42,43,30,8,71}
+{33,26}
+{20,21,83,35,99,100}
+{28,77,94,32,1,13}
+{17,15}
+{35,100,9}
+{42,6}
+{16,28,55}
+{7,94,81,60,91}
+{100,63,21,28}
+{65,20,35,16,76}
+{95,3,88,62,1}
+{73,44,46,13,55,69}
+\N
+{60,49,71,77}
+{93,39,75,63,69}
+{97,36}
+\N
+{77,16}
+\N
+{57,30}
+{39,31,56,51}
+{62,78,62,38,54}
+{69,86,99,10,12}
+{11,43}
+{60,70,83}
+{83,82,3,1,60}
+{24,55,61,85}
+{65,72,13,77,79,100}
+\N
+\N
+{28,97,71,78,68,95}
+{34,1,72,79,84}
+{10,49,91,44,27,51}
+{15,48,80,37,69}
+{42,46,32,34,86}
+{80,21,26,50,5,8}
+{61,71,100,78,54,50}
+{36,20,80}
+{67,40,47,68}
+{60,7,36,36,55,2}
+{32,91,13,98,88}
+{15,56,65,23,13}
+{20,66,81}
+{19,36,99,54,86,92}
+{82,28}
+{43,32,91,37,70,68}
+{71,78,82,50}
+{1,31,23,48,10,12}
+{88,96,1,44}
+{27,49,97,29,89,35}
+{63,72,58}
+{79,9,32,64}
+{75,67}
+{46,31,83,54}
+{66,24,6,89}
+{82,10,64}
+\N
+{19,31,52,34,89}
+{16,36,11,12,23}
+{55,50,6,20}
+{81,72}
+{71,74,8,6,31}
+{6,20,96,80}
+{95,85,56,91}
+{36,33,88,12,50}
+{77,44,52,50,50}
+{94,12,7}
+{97,44,40,43,8,21}
+\N
+{61,14,40,75,87}
+{43,21,67,66}
+{46,19,80,12,46,28}
+{56,11,14,59}
+{31,94,50}
+{45,26,61,15}
+{84,45,44,82}
+{9,16,86,54,93,30}
+{50,39,37}
+{35,60,64,55,73,90}
+{61,65,87,20,30}
+{12,59,44}
+{23,8,97}
+{30,59,7}
+{85,32,14,95,38}
+{18,91}
+{10,40,20,8,58}
+{5,58,4,94}
+{100,11,96,70}
+{66,72,7}
+{5,31,89,89,4}
+{81,68,44,37}
+{22,22,76,67,72}
+{22,26,30}
+{73,47,27,18,54,30}
+{44,13,73,95,83}
+{18,93,72}
+{30,22,73,13,16}
+{14,11,66}
+{45,33,59,72,92,81}
+{97,82}
+{30,4}
+{1,9,46,70}
+{47,50,20,71,48,60}
+{26,62,53,70,63,49}
+{39,26}
+{47,94,9}
+{55,3,18,1,75,22}
+{42,87,74,57,60,55}
+{95,46,21,38,27}
+\N
+{13,35,48}
+{24,39,24,67}
+{44,83,49,72}
+{22,8}
+{77,39,87}
+{37,41,44}
+{100,57}
+{48,54,58,79}
+{14,84,40}
+{11,51}
+{23,80}
+{80,82,43,59,2}
+{92,53,56,44,90,66}
+{44,67,78,9}
+{43,91}
+{70,74,100,69}
+{12,5,75}
+{65,51,22,65,56,36}
+{52,54}
+{38,78}
+{30,45,38,99}
+{18,88,88,63,51}
+{61,24,53}
+{72,24,77}
+{61,46}
+{11,83,49,86,27,60}
+{86,60,83,34,33,28}
+{65,15,10,51}
+{98,92}
+{49,49,60,3}
+{58,56,43}
+{19,25,15}
+{24,40,36,49,61}
+{5,62,9}
+{72,8,71}
+{64,85}
+{72,84,67}
+\N
+\N
+{80,87,30,70,21}
+{30,86,95,19,21}
+{17,90,15,89,81}
+{40,51}
+{77,88}
+{14,89,82,62}
+{40,66,93,16,55,45}
+{22,46,31,17,4,71}
+{8,41,88,94,25,61}
+{80,8,23,71,59,53}
+{61,70,23}
+{2,4,79,6,67}
+{27,70,42,68,33}
+{46,27,10}
+{1,93,42,12,8}
+{31,9,19,32,62,15}
+{16,42,81}
+{56,29,12,17,61}
+{52,100,98,42}
+\N
+{29,38}
+{49,40,47,63,22,4}
+{99,70,13}
+{70,28,67,100}
+{37,75,65,63,35}
+{45,67,37,28}
+{42,78,71,39}
+{33,35,76,69}
+{65,84,57,63}
+{17,12,86,23}
+{31,62,79}
+{3,22}
+{85,81,59}
+{38,5,15,100,1,27}
+{36,96,93,46,75}
+{44,61,85,70,71}
+{79,72,86,71,77,9}
+{23,51,47}
+{4,59,48,38,44}
+{93,54,86,98}
+{60,29}
+{49,38}
+{54,84}
+{72,25}
+{51,40,25,27,68}
+{24,17}
+{95,3,82,31,95}
+{56,37,57}
+{15,84,98,16,53}
+{47,36,15}
+{27,36,76}
+{38,82,26}
+{47,70}
+{60,89}
+{59,73,99,7,28,89}
+{87,49,70,76}
+{71,93,76,81,11,46}
+{74,87,92,24,43,22}
+\N
+{26,1,85}
+{18,73,43,94}
+{92,2,73}
+{5,58,85}
+{20,7,39,18,59,90}
+{11,16,19,77,60,56}
+{77,1,95}
+{4,4,11}
+{48,40,56,74,96,29}
+{71,1,62,69}
+\N
+{34,61,26}
+{86,75,13,73,28}
+{17,35}
+{100,29,37,26,47}
+{69,36,52,61}
+\N
+{81,51,54}
+{54,78,46}
+{1,78,96}
+{33,54}
+{72,9,37,30,100}
+{67,10,52}
+{77,19,74}
+{52,27,41,37,98,73}
+{8,74,86}
+{4,40,99,6,59}
+\N
+{98,43}
+{74,91}
+{69,45,73,59,19}
+{87,43,31,85}
+{2,51,54,3}
+{45,73,8,86,4,40}
+{2,51,96}
+{74,5,8,64,1,46}
+{5,64,86,63,12,75}
+{6,62,71,24}
+{56,84,54}
+{61,37,79,63}
+{81,39,78,23,86,74}
+{50,79,34,23}
+{85,36,78,80,19}
+{34,94,1,46}
+{5,23,38,4,78,2}
+{85,100,80,13,73}
+{48,86,9}
+{47,22,65}
+{49,81,18,52,36}
+{84,85}
+{89,15,71,88,44}
+{1,21,81,52,2}
+{53,18,7,53,50,11}
+{91,89}
+\N
+{20,6,20,70,12,32}
+{98,94,70,52,41,35}
+{43,25,2,63}
+{95,86,6,82,2,41}
+{79,24,63}
+{12,96,7,18,48,67}
+{55,35,4,75,28,39}
+{48,46,33,75}
+{10,99,5,5,98,25}
+{43,87,5,53,76,64}
+\N
+{100,13,9,4}
+{4,35,65,56}
+{27,74,88}
+{59,66,10}
+\N
+{59,85,39,48,17,29}
+{59,42,17}
+{27,99,12,21}
+{9,10}
+{15,4,80,25,67,59}
+{12,89,96}
+{50,32,92,49}
+{40,74,10,6,26,43}
+{80,71,29,54}
+{74,82}
+{22,25,27,65,12}
+{84,88,53,43,75}
+{84,16,51,84,46}
+{10,9,44,95}
+{87,19,22,10,44,80}
+{18,20,87,41,86}
+\N
+{9,64,4,33}
+{65,87,23,65,32,92}
+{50,2,23,68}
+{29,8,82,28}
+{54,92,6,2,28,70}
+{23,11,65,78,34}
+{77,85}
+{30,49,59,8,60}
+{77,30,34}
+{55,73}
+{89,68,55,81,8,81}
+{54,28}
+{35,22,67,63,48}
+{43,37,46,56,81}
+{16,78,32,81,77,37}
+{35,80,41,76}
+{4,93}
+{3,32,23}
+{43,18,50}
+{87,5}
+{30,40,91}
+{36,69,17,82,70,57}
+{73,71,47,63,58}
+{24,11,36}
+{2,72,61,76,9}
+{61,97,10,85,92,56}
+{5,44,47}
+{24,57,79}
+{69,39,97,8}
+{78,16}
+{62,52,17,35,28}
+{48,79,66,64,36}
+{14,72,75,30}
+{17,21,41,25}
+{28,100,66,56,15}
+{89,3,32,86,6}
+{67,34,16}
+\N
+{48,27,70,60,1,40}
+{69,34,36,46,95}
+{59,24,84}
+{44,21,90}
+{22,30,5,62,13,58}
+{79,67,44,10,1}
+{67,8}
+{40,48}
+{64,5,65,35}
+{74,45,75,15,31,69}
+{42,3,49,33,52,97}
+{86,59,69,84,53}
+{64,64,41,64,99}
+{47,95,16,78,73,68}
+{54,11,52,90}
+{54,62,79,58,96,59}
+{28,34}
+{52,94,17,42,9}
+{94,22,77,7,56}
+{72,24,47}
+{6,11,3,23}
+{9,6,97,82,40,39}
+{73,47,57,8,7,97}
+{27,26,1,2}
+{64,45,38}
+{71,6,6,83,33}
+{78,28,40}
+{25,8,17,15}
+{24,67,53}
+{72,42}
+{66,25,56,36,32,93}
+{18,11,22}
+{88,9,75,23}
+{20,32,24,44,51,34}
+{76,86,11,7,1,61}
+{11,77,41,55,87,59}
+{62,53,94,46}
+{77,20}
+{74,97,59,78,9}
+{7,94,26,18,77}
+\N
+{49,59}
+{72,22,42,89,14,80}
+{49,14,38,19}
+{43,88,25,58,39,24}
+{21,34,37,65}
+{85,3,46}
+\N
+{11,60,86,65,49,83}
+{51,98,7,28}
+{85,17,34,59,14,86}
+{89,81,48}
+{67,40,11,60,75}
+{13,45,42,22,82,82}
+{98,21,89}
+{30,63}
+{35,45,68}
+{9,29}
+{43,71}
+{82,44,59,72,48}
+{1,48,29,44,14,11}
+{75,33,85}
+{7,32,92}
+{62,14}
+{29,31,1,36,51}
+{92,12,28,20}
+{13,67}
+{88,72,14,22,61,42}
+{15,98,49}
+{65,27,9,76}
+\N
+{15,95,26,12,52,40}
+{17,20,74}
+{57,63,15,22,38}
+{93,71,8}
+{26,84,82}
+{20,52,3,3}
+{72,95}
+{10,9,80}
+{9,9,18,51}
+{74,24,63,63,57,89}
+{64,91,95,18,15}
+{64,37,20,36,74}
+{52,9,53,6}
+{17,31,42}
+{3,73,92,13,62}
+{57,81,58,49}
+{52,56,2,26,18}
+\N
+\N
+{90,90}
+{16,92}
+{66,51,7,19,10}
+{100,81,69,86,95}
+{48,64,81}
+{87,54,73}
+{6,80,100,24,26,8}
+{44,67}
+{27,94,2,25,34}
+{80,25}
+{12,2,77,75,15}
+{63,14,30}
+{85,75,59}
+{72,73,54,44,25,76}
+{95,44,69,91,62}
+{94,73,78,5}
+{28,52}
+{86,31}
+{69,90,95,66}
+{6,10}
+{68,72,112}
+{9,165}
+{91,132,164}
+{57,82,144,167,184}
+{3,6,101,118}
+{111,158}
+{22,29,30,174}
+{41,66}
+{39,76,189}
+{7,20,21,196}
+{52,126,169,171,184}
+{21,77,91,176,196}
+{16,97,121}
+{83,135,137}
+{8,140,160,164,165,195}
+{38,65,185}
+{112,152}
+{111,129,134,148}
+{47,80,114,135,147,165}
+{24,98,119,123}
+{43,48,60,147,154}
+{19,54,138,171,186}
+{156,175}
+{20,51,123,193,193}
+{37,41,136,173,192}
+{14,22,111,125}
+{44,125,160,184}
+{19,75,99,103,107,164}
+{24,113,145}
+{27,157}
+{12,107,133,134}
+{72,94,102,158,194}
+{104,157}
+{122,171}
+{28,47,89,104,112}
+{25,35,82,105,155}
+{106,107,139,181}
+{50,110,132,136}
+{90,110,166}
+{1,1,55,60,85,108}
+{8,22,31,106,172,196}
+{24,69,109,121,154}
+{0,26,44,59,132,175}
+{103,125,172,188,190}
+{11,23,78,109,131}
+{81,146,169,181,196}
+{2,84,113,189}
+{8,46,126,131}
+{13,73,73,125,127}
+{67,117,139,184}
+{29,65,77,120,182}
+{0,87,100,102,135}
+{111,146,156}
+{13,87,123,137,182,197}
+{60,61,164}
+{7,20,186}
+{0,24,53,135,147}
+{94,136}
+{47,168}
+{70,80}
+{43,148}
+{3,81,104,191}
+{104,171,189}
+{9,14,117,160,180}
+{67,158}
+{50,57,66,78,170,197}
+{31,60,73,101,193,197}
+{37,89,92,96,127}
+{29,179}
+{17,47,137,155,157,187}
+{33,77,154}
+{48,63,85,150,184}
+{32,53,61,95,172}
+{20,35,47,171,179,196}
+{2,17,40,169,184}
+{116,127,131,142}
+{16,26,27,87,164,198}
+{58,129}
+{67,98,108,132,157,197}
+{145,157}
+{13,49,56}
+{59,103,180,196}
+{35,65,104,106,120,126}
+{18,96,115,133}
+{27,61}
+{61,194,197}
+{11,27,36,94}
+{15,36,101,128,197}
+{51,62,115,149}
+{83,198}
+{30,120,127,145,184}
+{50,149}
+{13,35,87,117,135,158}
+{57,60,74,113,128,178}
+{11,90,123,163,170}
+{39,121,148,171,198,199}
+{30,77,78,137,140,162}
+{52,69,120,141}
+{9,100,137}
+{56,161}
+{44,57,75,110,154}
+{98,123,155,167}
+{10,60,85,105,164,168}
+{13,92,179,186}
+{13,171,173,176,178}
+{33,53,88,123,144,172}
+{21,57,70,131,151}
+{13,51,63,169,169}
+{36,104,119,166}
+{54,59,84,166,172}
+{7,87,100,102,142,187}
+{2,5,6,43,174}
+{4,26,29,59,77}
+{10,82,98,103,104}
+{104,147}
+{47,55,99}
+{102,154,165}
+{0,96,107,139,157,159}
+{66,167,174}
+{92,97,117}
+{21,75,180,185}
+{54,64,139,180}
+{23,141,189}
+{32,38,147}
+{82,87}
+{6,34,34,161,183}
+{25,64,69,97,122}
+{80,152,170,189}
+{44,78,143,162}
+{52,53,64,69,112,158}
+{77,80,123,150,175}
+{110,121,125,125,128,198}
+{0,8,57,104,127,188}
+{17,46,48,93,129,150}
+{135,193}
+{89,111,135,166,184}
+{132,181}
+{47,54,101,108,125}
+{18,55,103,142}
+{11,125}
+{18,49,58,68,122,153}
+{37,47,137,179,185}
+{57,78,167,187,192}
+{28,32,38,67,77,184}
+{67,83}
+{43,104,191}
+{22,40,118,194}
+{24,53,66,195}
+{27,87,89,101,130,191}
+{71,86,157,167,183}
+{31,87,102}
+{48,53,70,101,149,174}
+{21,33,59,129,195}
+{144,160}
+{4,8,174,194}
+{69,103,127,127,160}
+{6,29,62,77,132}
+{61,69,108,144,174}
+{51,55,109,128,153}
+{10,30}
+{2,5,6,70,146,183}
+{0,1,75,97,166,180}
+{53,78,104}
+{31,45,68,108,161}
+{3,40,78,103,109,130}
+{33,44,159}
+{28,82,93,136,148,157}
+{31,32,76,143,157}
+{2,55,106}
+{21,66,80,129,129,152}
+{1,34,59,128,154,195}
+{10,154,172,177}
+{2,7,31,47,82,125}
+{60,131,149,156}
+{20,141}
+{23,38,43,100}
+{51,70}
+{3,41,164}
+{126,160,165,169}
+{61,71,143}
+{65,70,81,100,146}
+{40,48,57,75,85,85}
+{116,153}
+{31,42,49,103,183}
+{28,44,62,85,133,177}
+{50,68,164,170}
+{4,26,60,87,119,141}
+{5,102,160}
+{20,129,177}
+{98,120,135,157,164,168}
+{66,150}
+{101,101}
+{164,187}
+{43,65,96,166,189}
+{18,36,58,109,118}
+{25,32,135,161,170}
+{55,104,183}
+{69,139,144,181,182}
+{84,131,155}
+{6,18,63,156,159}
+{7,66,67,88}
+{8,46,52,95,178}
+{58,58,83,119,119,163}
+{27,143}
+{78,80,122,149,164,176}
+{6,83,107,183,198}
+{86,199}
+{22,74}
+{28,62,64,114}
+{15,56}
+{41,97,139,152,161,161}
+{48,192}
+{16,62,99,138,155}
+{32,84,145}
+{108,137}
+{93,112,120,155}
+{73,117}
+{20,26,197}
+{4,141}
+{110,132}
+{95,133,142,152,183,193}
+{85,141}
+{53,76,86,131}
+{5,59,73,74,101,130}
+{0,1,64,151,188}
+{15,131,131,174}
+{80,98,106,187}
+{41,102,167,173}
+{9,42,133}
+{103,110,110,134,175,185}
+{168,187}
+{42,47,108,121,165,198}
+{81,171}
+{38,122,123,149}
+{16,79}
+{45,64,131,176,182,197}
+{35,82,87,100,123,196}
+{41,52}
+{33,68}
+{60,140}
+{12,41,152}
+{54,71}
+{88,95,95,146,148,180}
+{47,66,89,121,168,182}
+{15,70,94,122,137,154}
+{42,48,129,162}
+{70,151}
+{11,55,89,118}
+{36,74,121,130,152}
+{46,48,52,120,179}
+{70,81}
+{96,146,183}
+{76,78,108,153}
+{71,168}
+{66,106,108,167}
+{22,44,49,85,87,195}
+{17,52,143,175}
+{86,103}
+{16,46,176}
+{95,111,162,173,198}
+{44,191}
+{7,48,107,115,116}
+{12,120,141,179,184}
+{83,188}
+{83,85,86,139,154}
+{50,74,89,154,179}
+{79,87,120,128,183}
+{13,121}
+{16,52,62,86,168,199}
+{7,16,29,35,157,181}
+{23,48,65,119,180}
+{10,173}
+{7,98,128,143,145,162}
+{23,27,88,91,127}
+{35,53,56,56,118}
+{7,161}
+{0,42,67,174}
+{44,161}
+{75,80,110,170}
+{17,93,117,140,168,196}
+{18,100,150,184}
+{108,132}
+{54,90,97,103,149}
+{9,12,30,43,82,95}
+{131,163}
+{67,99,168}
+{91,150,172}
+{47,164,195}
+{72,90,98}
+{24,78,130,172}
+{1,27,32,64,66,156}
+{7,26,72,88,130,140}
+{56,126,130}
+{1,76,81,122,169,188}
+{60,154}
+{101,103,135,150}
+{22,25,33}
+{99,117}
+{24,95,122,186}
+{48,95,102,108,125,170}
+{13,113,154}
+{155,177}
+{37,73,106}
+{7,64,124,195}
+{101,124,133,157,166,188}
+{27,34,60,100}
+{26,104,163}
+{34,43,108,133,165}
+{64,79,89,122,132}
+{10,96,168}
+{2,22,89,118,122,198}
+{122,192}
+{42,101,104,135,168,181}
+{7,38,63,86,101,152}
+{29,84,89,114,123,184}
+{33,46,59,137,153,175}
+{3,54,66,92}
+{31,34,148,159,185}
+{3,52,97,99}
+{3,26}
+{42,57,62,148,199}
+{15,26,198}
+{14,34,109,111,128,193}
+{107,197}
+{16,107}
+{9,21,136,169}
+{67,97,99,153,165,173}
+{46,76,89,100,164}
+{96,102,150,167,180}
+{31,103,137,146,180}
+{21,40,157,163,170,183}
+{139,170}
+{1,75,82,148,169,198}
+{13,39,107}
+{13,50,97,101,106}
+{52,176}
+{18,169}
+{129,140,146,183,189}
+{95,122,145}
+{5,6,102,130,151}
+{5,118,140,153}
+{27,78,140,164,182}
+{36,140,148}
+{58,100,127}
+{9,16}
+{26,33,119}
+{1,17,18,165}
+{14,182}
+{11,13,48,89,140,165}
+{9,19,78,113}
+{121,171}
+{18,23,46,113,159,162}
+{17,104}
+{50,104,132,167,179}
+{55,89,102,132,176}
+{19,109}
+{60,70,73,153,163}
+{18,127,145}
+{80,106,146,170}
+{10,39,72,74,84,150}
+{3,71}
+{1,10,64}
+{82,95,127,132,141,152}
+{43,55,57,89,120,197}
+{155,182}
+{23,34,57,111,153}
+{99,188}
+{86,114,124}
+{113,191}
+{31,129,184}
+{125,159,159}
+{22,27,81,156}
+{3,54,80,122,128,168}
+{76,112}
+{152,174}
+{22,27,70,172}
+{26,86}
+{49,59,102,186}
+{53,55,75,125}
+{152,199}
+{11,15,46,102,105,168}
+{132,148,154}
+{24,114,121,126,138,165}
+{82,107}
+{36,93,122,184,194}
+{1,59,76,146}
+{73,165}
+{38,98,176}
+{53,72,121,153}
+{127,147}
+{31,77,128,177}
+{107,186,189}
+{119,126,127,160}
+{24,74,148,197}
+{85,126,134,146}
+{76,77,81,134}
+{67,112,159,174,183}
+{22,169,170}
+{79,112,177,199}
+{1,56}
+{21,42,50,172}
+{6,63,105,166,189}
+{31,95,106,152,171,177}
+{21,49,99,101,122,187}
+{63,104,113,161,186}
+{37,126,144,166,173}
+{32,53,147}
+{123,123,130}
+{78,85,177}
+{2,69,95,146,187}
+{6,11,14,43,121}
+{76,105,184}
+{63,96,114,122,195}
+{11,22,34,45,120,156}
+{22,83,119,131,138,167}
+{9,56,96,106,114}
+{92,132,162}
+{25,45,83,119,139,150}
+{19,21,56,59,141}
+{14,26,62,119,180,190}
+{6,34,49,99,139,170}
+{10,56,150,166,166}
+{14,57,119,153,167,198}
+{26,41,150,158,169}
+{152,167}
+{1,61,93,180}
+{46,110,138,199}
+{4,56,81,110,173}
+{28,32,148,185}
+{8,9,28,29,39,195}
+{14,39,68,144}
+{26,37,79,81,110}
+{115,158,161}
+{6,39,145,191}
+{67,118,125,142,184,198}
+{127,163}
+{52,118}
+{22,78,131,156}
+{46,68,86,142,145,197}
+{85,188}
+{37,54,64,147,158}
+{31,134,141,183,185}
+{10,33,135,198}
+{41,124,173,180}
+{0,14,92,129,154,198}
+{39,73,128,154,182,196}
+{40,83,94,168}
+{106,142}
+{76,99}
+{19,62,77,108,165,186}
+{68,90,97,119,176}
+{44,108,193}
+{2,124}
+{137,174,175,176,180}
+{28,62,81,132,165,186}
+{98,112,148,181}
+{86,125}
+{70,161}
+{5,13,188}
+{136,168}
+{82,87}
+{30,42,57}
+{132,136,152}
+{20,59,87,98,195}
+{6,53,112,113,183,195}
+{64,147,157}
+{61,140,192}
+{44,59,88,123,161}
+{90,175}
+{38,46,105,121,159}
+{35,62,66,90,155}
+{2,2,21,38}
+{123,144}
+{117,155}
+{60,86}
+{4,39,129,146,179}
+{66,71,87,135,148,157}
+{29,67,108,196}
+{30,64,76,124,172}
+{36,39,79,130,140,149}
+{30,44,136,196}
+{5,15,20,117,198}
+{20,87,87,121}
+{42,136,142,148}
+{0,56}
+{16,38,56,57}
+{52,138}
+{103,115}
+{10,29,43,93,120,134}
+{44,140,150,180}
+{74,98,132,160}
+{2,62,98,160}
+{14,32,43,63,92}
+{23,87,128,152,177,197}
+{30,86,111,178,180}
+{49,61,114,195,196}
+{133,158,195}
+{18,105,165,190}
+{77,83,175}
+{29,33,51,166,188}
+{37,51,96,103,127}
+{119,125,128,140}
+{8,80,93,189}
+{76,96,110,131,170}
+{81,90}
+{13,25,28,41,128,142}
+{56,62,73,110}
+{60,62,128,136,166,193}
+{34,34,61,74}
+{32,84,87,92,112,181}
+{10,66,93,153}
+{23,77,182}
+{2,7,156}
+{5,13,49,61,103,179}
+{67,136,136,163,181,196}
+{26,60,74,100,160}
+{39,59,69,93,111}
+{9,77,90}
+{1,20,52,75,156,169}
+{25,95,103,157,163,193}
+{95,136}
+{47,108,137,157,164}
+{37,99,151,153,169,189}
+{112,126,139,171,184,195}
+{39,188}
+{4,20,71,80,136,156}
+{24,33,77,82}
+{103,188}
+{74,116}
+{82,90,110,154,194,195}
+{25,149,180}
+{120,123,130,171}
+{20,38,104,126,175,176}
+{14,62,97,130,135,193}
+{35,118}
+{20,42,64,73,76,120}
+{11,40,60,74,144,148}
+{13,26,46,63,76}
+{24,29,98,106}
+{6,139,171,186}
+{5,109,197}
+{20,45,84,125}
+{1,137,150,195}
+{1,8,80,111}
+{57,90,102,167}
+{53,186}
+{8,31,115,145,156,165}
+{10,18,31,116,164}
+{43,47}
+{33,143,154}
+{106,153,174,190}
+{73,106,158}
+{18,137,158,173}
+{73,80,107,123,141,199}
+{17,43,123,130,130,155}
+{15,31,37,91,164,181}
+{38,86}
+{49,105,142,145,173,190}
+{18,107,108,135,138}
+{43,65,107,112,193}
+{8,68,68,74}
+{54,106,108,109,164}
+{53,153}
+{59,134,154,173,180}
+{34,93}
+{11,33,124}
+{8,104}
+{27,37,46,65,125,174}
+{0,122,189}
+{15,74,107,147,188}
+{35,63,78}
+{28,49,123,129,177,193}
+{11,89,104}
+{117,171,197}
+{11,15,62,136,145,145}
+{2,127,193}
+{17,28,42,113,145}
+{31,44,118,148}
+{52,103,128,161,182}
+{45,47,70,102,161,184}
+{15,52,82,86}
+{60,87,102,108,127,170}
+{24,57,102,145,181}
+{12,53}
+{5,52,92,129,164}
+{87,128}
+{80,143,170}
+{59,85,134,139}
+{61,67,110,117,156,157}
+{6,8,60,112,154,170}
+{92,122,133}
+{121,148,161}
+{9,22,61,187}
+{12,40,78,107,176}
+{30,45,58,189,198}
+{83,107,123,148}
+{3,66,98,124,126,150}
+{13,34}
+{16,41,132}
+{16,85}
+{3,25}
+{30,58,138,167}
+{24,36,87,151,159,186}
+{2,4,121,196}
+{79,95,99,107}
+{11,49,146,169}
+{51,90}
+{76,155}
+{26,26,116,120,146,182}
+{44,66,72,117,132,174}
+{7,161,179,197}
+{2,81,158}
+{4,22,59,107,146,170}
+{0,0,133,192}
+{57,82}
+{17,61}
+{28,29,42,77,89,124}
+{53,78,127,188}
+{31,57,103,104,162}
+{9,84,100}
+{3,52,114,133,161,188}
+{8,37,97,158,189}
+{0,13,88}
+{29,79,92,158,160,171}
+{59,63,77,139,165}
+{25,77,116,169}
+{50,88,151,166}
+{52,162,167}
+{32,149,191,194,194}
+{47,57,74,95,97}
+{30,65,96,153,184}
+{80,130,150,172}
+{79,91,141,153,157}
+{93,110,114,194}
+{62,66,156,175}
+{55,56,97,117}
+{74,152,171,186}
+{13,24,50,50,131}
+{0,16,95,141,146,161}
+{1,51,158}
+{37,71,96,122}
+{71,104,145}
+{47,52,124,131,169}
+{111,188}
+{59,61,95,152,156,157}
+{5,31,106,164,176}
+{44,82,113,134,188}
+{13,55,65,99,150}
+{25,73,130,192}
+{88,120,193}
+{79,123,153,175}
+{24,158,162}
+{52,53,81}
+{5,32,78,102}
+{73,97,111,151}
+{71,72,102,151}
+{5,61,73,85,129,151}
+{66,177}
+{26,77,139,152}
+{46,117}
+{55,72,122,148,157,174}
+{3,53,76,184,196}
+{34,36,41,61,194}
+{8,153,163,182}
+{51,59}
+{113,115,149}
+{54,57,78}
+{39,137}
+{75,81,93}
+{5,30,44,80,86,126}
+{68,107,128,160,179}
+{98,108,162}
+{55,126}
+{24,54,121,122}
+{75,90}
+{10,83,139}
+{16,120,148}
+{97,175}
+{53,70,71,120,135,189}
+{9,110,123,150}
+{24,42,44,96,138,170}
+{17,61}
+{23,65,110,135,155,157}
+{19,59,139}
+{50,65,127,179}
+{15,138,152,162}
+{15,34}
+{25,29,63,135,161}
+{47,113,123,129,163}
+{25,138,157,184}
+{50,92,199}
+{110,116}
+{15,36,134,145,165,182}
+{4,75,82,175}
+{24,49,63,89,128}
+{174,182}
+{103,116,119}
+{101,125,180,192}
+{47,66,113,127,148}
+{15,60,118}
+{20,51,90,91,117}
+{25,72,146,199}
+{34,93,199}
+{31,71,106,115,186}
+{1,10,119,144,188,197}
+{49,80,185}
+{134,178,188}
+{42,67,170,172}
+{13,43,91,91}
+{13,31,48,98,155,158}
+{37,44,70,76,141,160}
+{50,60,72}
+{51,65,166,188}
+{11,103,129,144}
+{136,167,181}
+{165,178}
+{34,107}
+{54,120}
+{33,132,136,165,178}
+{60,79,119,127,187,197}
+{27,31,130,132}
+{125,129}
+{97,111}
+{71,171,187,191}
+{68,91,94}
+{94,119,159,178}
+{2,29,51,173}
+{37,61,97,113,147}
+{11,35,79,91}
+{67,71}
+{4,20,103,107,169,179}
+{35,77}
+{71,94}
+{29,31,67,101,172,174}
+{52,122}
+{87,125}
+{129,142,164}
+{13,30,85,139}
+{17,57,65,170,179}
+{46,65,151,167,192,197}
+{31,78,132,136,158}
+{38,161}
+{15,101,111,134}
+{42,118,139,142,178}
+{57,95,132,134}
+{5,42,116,152,173,192}
+{144,199}
+{38,70,77,143,175,188}
+{38,84,93,149}
+{56,98,153,165,170,191}
+{1,52,112,112,131,145}
+{16,132,150,184}
+{14,60,111,153}
+{49,109,112,165}
+{69,136,152}
+{59,90,94,158,168}
+{42,47}
+{18,194}
+{33,70,94,167,175,177}
+{40,57,125,138,159}
+{3,10,31}
+{2,5,8,26,141,181}
+{27,29,142,175,186,195}
+{31,49,99,120}
+{109,123}
+{21,76,112,119,124}
+{41,49,146,173}
+{101,173}
+{49,73,85,89,179}
+{22,36,154,192}
+{136,163}
+{111,165}
+{94,128}
+{81,167}
+{35,165}
+{41,109,119}
+{13,74,80,114}
+{72,106,189}
+{65,172}
+{30,31,35,52,63}
+{80,116}
+{0,149}
+{139,189}
+{0,65,107,153,179}
+{15,40,46,51,75,160}
+{12,28,48,79,105}
+{76,98,146,157,180}
+{45,62,79,83,113,155}
+{130,162,184}
+{78,140,145,181,196,198}
+{108,168}
+{3,13,14,15,77}
+{22,29,68,117,142,143}
+{67,110,122,167,183}
+{22,25,58,93,143,151}
+{53,82,170}
+{1,18,50,98,108,174}
+{58,140}
+{49,179,196}
+{109,171}
+{38,82,132,183}
+{32,151,175}
+{53,90,106,169,187}
+{99,136,141,146,171}
+{27,108,111,155,192}
+{28,77,86}
+{11,109,118,149,154,183}
+{7,74,122,137,185}
+{70,110,151,154,175}
+{7,48,88,181,181,182}
+{97,101,105,123,139,156}
+{19,139}
+{17,107,134}
+{63,64,178}
+{100,133,143}
+{64,173}
+{1,88,109,120,145,160}
+{113,198}
+{84,112,121,184}
+{90,185,193}
+{91,135,155,185}
+{56,191}
+{14,15,48,61,92,171}
+{18,139,152,199}
+{16,80,107,125,144,166}
+{8,92,112,173,176}
+{27,196}
+{9,169,183,190}
+{20,29,40,98,106,182}
+{77,115,149,181}
+{31,65}
+{7,29,62,90,157,178}
+{10,33,79,186}
+{42,74,113,178,192}
+{17,86,88,118}
+{27,58,104,122,166}
+{16,97,102,105,192}
+{16,59,115,127}
+{27,56,60}
+{104,175}
+{52,84}
+{127,137}
+{7,13,18,81,139,140}
+{11,31,81,150,189}
+{44,55,107}
+{45,58,127,137}
+{70,76,80,93,145}
+{27,60}
+{40,76,172}
+{7,123,192}
+{55,170}
+{61,137,137,184,187}
+{49,50,190}
+{99,126,152,164}
+{56,79,88,98,132}
+{45,74,119,123,158,175}
+{66,96}
+{100,114}
+{62,84,111,122}
+{8,22,141,172,181}
+{70,141}
+{3,48,106,193}
+{33,114,168,174,183}
+{46,186,194}
+{58,71,82,122,190}
+{60,67}
+{14,30,132,144,174}
+{9,113,124}
+{11,14,29,63,110,182}
+{4,64,102,168,178}
+{90,108,110,160,165,199}
+{44,86,191}
+{6,19,84,125,125,156}
+{53,105,122,154,175,190}
+{83,177,183}
+{96,103,181}
+{38,156}
+{2,6,60,116,131}
+{12,144}
+{13,73,93,132}
+{142,167}
+{37,61,71,75,121,144}
+{32,43,146}
+{41,59,144,176}
+{11,14,44,54,92,177}
+{37,198}
+{39,80,81,104,138,193}
+{13,73,92,127,149,194}
+{34,57,69,104,118,186}
+{7,48,84,96,108}
+{32,41,64,111}
+{108,131,150,174,195}
+{50,53,184,191}
+{8,32}
+{26,76,88}
+{4,50,100,134,134}
+{36,40,148,158,177}
+{7,16,57,59}
+{35,96,113,129,167}
+{46,63,128,163}
+{8,46,94,97,105,178}
+{12,70}
+{45,93,134,135,188,195}
+{11,52,76,103,131,192}
+{19,45,57,119,123,136}
+{19,62}
+{1,49,64,197}
+{0,42,60,102,134,147}
+{102,152,156,160}
+{51,54,129}
+{50,68,71,72,170}
+{0,11,184}
+{19,105}
+{144,185,191}
+{17,51,76,98,118,135}
+{52,64,143,171}
+{1,46,62,74,81}
+{8,36,129}
+{5,25,96,113,146,152}
+{19,28,59,110,131,142}
+{7,18,176,179}
+{17,21,48,63,121}
+{34,79,81,85,152,155}
+{8,82,104,122,139,193}
+{34,50,128,140,175}
+{51,173}
+{48,128,138}
+{126,129,178}
+{42,51,61,141,170,180}
+{59,91,144}
+{64,74,118,170,191}
+{12,55,116,157,159}
+{97,157}
+{32,34,102,105,178}
+{36,103,125}
+{15,36,184}
+{6,13}
+{0,100,144,185,198}
+{32,47,64,66,118,143}
+{23,112,117}
+{34,44,47,81,124,135}
+{21,49,115}
+{29,158}
+{34,114,127,151}
+{111,199}
+{23,53,76,113,122,123}
+{89,113,117,137}
+{52,76,126,155,164}
+{4,48,78,114,147,179}
+{27,56,151,191}
+{3,183}
+{30,41,72,145}
+{15,41,152,177,196}
+{44,58,124,164,177}
+{9,51,70,174}
+{13,18,81,136,178}
+{85,139,142}
+{12,62,118,156}
+{50,142,149,175}
+{35,38,99,100,128}
+{53,54,92,123,153,160}
+{121,133}
+{12,63,117,148,149,187}
+{88,153,170,192,195}
+{22,51,67,104,141}
+{186,198}
+{39,40,82,159,189}
+{59,74,149}
+{88,99,136,145,191}
+{5,48,90,120,138,193}
+{22,76,155,180}
+{118,122,141,176}
+{87,104,116,159,172,191}
+{63,104,155}
+{8,153,168}
+{119,141,178,179}
+{100,110}
+{14,65,164}
+{2,92,97,117,188}
+{47,59,64,141,148,187}
+{109,137,139,151,169}
+{68,78,156}
+{37,39,103,183,190,194}
+{50,58,74,180}
+{12,121,155,175}
+{26,43,97}
+{102,159,161}
+{3,138,163,179}
+{55,69,78,164}
+{67,87,136}
+{67,150}
+{74,113,199}
+{103,126,187}
+{39,141,155}
+{6,19,25,75,157}
+{10,49,71,105,114,154}
+{3,24,35,54,88}
+{16,25,73,114,181,191}
+{2,2,63,154}
+{68,74,107,187,199}
+{13,235}
+{40,122,203,232,233,235}
+{115,152,193,202,242}
+{3,50,86,111,248}
+{25,66,181,188,279}
+{80,116}
+{38,83,106,119,134}
+{29,63,203}
+{7,27,186,200,201}
+{88,92,94,272,295}
+{35,68,136,158}
+{148,225,293}
+{1,87,195}
+{48,100,203}
+{0,35,61,91,280}
+{130,160,168,216}
+{4,104,148,164}
+{35,40,91,145,155,214}
+{46,107}
+{21,276}
+{42,143,150,238,291}
+{64,70,140,165,228,257}
+{0,148,197}
+{72,131,195,202,251,270}
+{99,195,224,264,292}
+{5,184,186,243}
+{93,132,137,148,228,251}
+{66,125,198,211,285}
+{29,79,180}
+{41,60,65,66,254}
+{4,69,79,207}
+{113,182,203,252,259,298}
+{10,20}
+{99,200,276}
+{109,262}
+{4,87,193,207,220,273}
+{30,183,215}
+{7,138,202,215,217}
+{25,79,194,203,260}
+{128,178}
+{62,152,211,279}
+{57,99,204,280}
+{41,59}
+{18,52,200}
+{81,132,190,275}
+{89,158}
+{32,72,122,228,245,249}
+{24,72,196,233,299}
+{0,5,46,122,213}
+{197,242}
+{43,105,241,272}
+{74,118,158,173,208,288}
+{145,149,197,238,252,297}
+{32,39,189}
+{98,240}
+{65,140,149,197,203,204}
+{103,225,266}
+{84,277,283}
+{35,246}
+{10,101,239}
+{40,75,192,253}
+{106,152,247,272,287}
+{50,293}
+{85,134}
+{59,204}
+{54,64,88,269,286}
+{4,92,111,121,154,182}
+{80,163,202,234,277,298}
+{129,147,158,196,283,290}
+{49,144,232,293}
+{20,29,226,244,274}
+{64,101,185,189,234,268}
+{23,157}
+{56,93,133}
+{9,57,241,289}
+{50,124,181,194,238}
+{11,38,67,69,213}
+{149,220}
+{168,189,267}
+{34,133,235,264,284}
+{81,239,241,260}
+{35,78,80,201,262,297}
+{0,196,285}
+{71,108,239,258,277,278}
+{4,94}
+{77,132,140,251}
+{11,78,132}
+{43,145,188}
+{97,144,148,161,254}
+{109,132}
+{48,83,189,242}
+{115,176,276}
+{162,210}
+{88,109,136,153,154,159}
+{265,280}
+{74,86,195}
+{17,112,188,213,231,266}
+{36,136,160,218,239}
+{179,273}
+{79,118,136,154,200,259}
+{161,212}
+{24,98,178}
+{161,187}
+{45,169,227,236}
+{218,253}
+{10,18,74,258}
+{70,199,210,213,285,291}
+{12,50,69,92,184,186}
+{130,131,163,295}
+{198,239,297}
+{49,86,125,176,234,282}
+{7,129,146,223,269}
+{144,173}
+{30,52,133,228}
+{21,88,176}
+{5,70,299}
+{37,69,285}
+{14,17,45,72,99,197}
+{125,196}
+{30,220}
+{55,103,127,251}
+{108,114,156,200,207,217}
+{7,195,250}
+{64,111,193,202,236}
+{92,115,232,233,240}
+{22,232,260}
+{18,44,191,253,294}
+{40,158}
+{86,92,103,154,207,294}
+{33,177,191,223,235}
+{65,116,158,253}
+{49,125,152,194}
+{100,149,191,266,288}
+{13,64,103,254,283}
+{42,75,80,103,155}
+{77,128,198,280}
+{118,218,287}
+{0,36,52,101,148}
+{1,64,181,201,221}
+{6,44,47,71,150,225}
+{13,85,88,167}
+{31,40,69,91,99,281}
+{60,115,157,224,252,273}
+{30,87,200,270,285}
+{171,293}
+{24,33}
+{59,69,74,118,190,216}
+{147,258,288}
+{62,73,219,232,266}
+{50,74,225,238,271}
+{6,88,115,185,205,262}
+{97,230}
+{76,76,150,211,228,262}
+{134,195}
+{104,235}
+{38,41,204}
+{64,71,124}
+{44,63,111,231}
+{186,188}
+{5,132,225}
+{113,286}
+{43,161,276}
+{8,294}
+{18,90,105,169}
+{213,213}
+{29,45,161,289}
+{79,152}
+{10,110,162,177,217,238}
+{63,98,192,244}
+{118,147,187,281}
+{5,15,36,94,263}
+{40,81,220}
+{29,74,76,157,162,206}
+{11,28,53,68,126,222}
+{73,73,181,239}
+{36,60,164}
+{16,47,82,152,167,289}
+{149,149,219,268,294}
+{97,169}
+{32,160,210,257}
+{32,69}
+{7,63,73,195}
+{54,110}
+{61,75,135,270}
+{22,43,127,174,184,208}
+{106,113,174}
+{0,70,90,239}
+{191,260}
+{43,80,168}
+{25,54,257,263}
+{118,213}
+{110,207,220,251,287}
+{126,139,161,248,252}
+{51,79,116,132,190,291}
+{183,199,200,254}
+{86,233}
+{105,109,176,211}
+{12,109}
+{3,65,158}
+{21,86}
+{12,15,191}
+{181,223,224,256,259,276}
+{112,191,219,232,239}
+{51,215}
+{36,46,278}
+{68,75,169,228,244,270}
+{10,16,52,172,189,274}
+{177,191,197,209,222,282}
+{41,119,190,202}
+{128,277,292,298}
+{34,38}
+{22,36,81,117}
+{81,161,248,279}
+{75,85,103,149,190,211}
+{127,279}
+{50,74,152}
+{122,168,209,240,276,282}
+{66,102,208,239,291}
+{9,113}
+{72,199,237}
+{110,112,135,141,270}
+{26,109,130,159,291}
+{108,206}
+{2,289}
+{63,238}
+{4,57,104,119,142,214}
+{46,97,239}
+{210,297}
+{207,268}
+{13,64,80}
+{62,109,171,195,232}
+{11,260,262,276,292}
+{21,75,78,80,140,226}
+{38,56}
+{122,251,297}
+{108,180,213}
+{57,58,135,231,233}
+{75,136,185,211}
+{52,109,122,174,178,255}
+{65,91,234,249}
+{5,24,53,218}
+{90,211,246}
+{106,242,260}
+{61,136}
+{49,87,177,280}
+{38,89,104,189,297}
+{43,76,293,298}
+{182,255,289}
+{25,57,64,272}
+{23,122,149}
+{49,50,129,153}
+{183,188,204}
+{27,164,226,230}
+{0,13,67,145,160,259}
+{22,32,43,85,105,124}
+{20,199}
+{31,119}
+{14,16,152,158,196}
+{5,59,91,202,217,280}
+{100,128,187}
+{20,193,214,258,272}
+{17,27,55,151,177,219}
+{53,55,63,208,213,230}
+{15,160,258,260}
+{71,147,235,258}
+{26,49,173,234,271}
+{50,52,58,167,257}
+{15,154,213,232}
+{6,35,86,94,286}
+{0,4,83,262,281}
+{93,148,284}
+{28,165,262,290}
+{18,99,160,266}
+{63,223,291,295}
+{103,154,180}
+{12,110,144,221}
+{9,158,203}
+{20,207,275}
+{9,20,48,88,120,289}
+{67,110,133,151,225,297}
+{71,102}
+{168,208}
+{48,137,163,164,280,287}
+{90,209}
+{28,244}
+{107,224,293}
+{86,206}
+{8,113,147,165,285,286}
+{7,159,160,237}
+{0,66,87,146,225,294}
+{58,100,112,124,189}
+{13,108}
+{121,168,216,253}
+{147,242,282}
+{236,240}
+{21,28,83,103,166}
+{30,88,108,280,295}
+{23,136,298}
+{125,290}
+{140,249,276,277}
+{49,81,135,147,164,267}
+{28,63,198,297}
+{30,101,216,232,267,287}
+{54,195,204,223,236,251}
+{27,176,179,204,264,291}
+{136,164,172,273}
+{43,67,81,121,277}
+{128,131,256,269}
+{176,219,289}
+{127,175,259}
+{35,94,153,177,222,253}
+{29,154,178,240,260}
+{165,176,201,243,259}
+{17,298}
+{29,203,232,241,289}
+{107,136,153,238}
+{49,198}
+{68,179,202,253}
+{157,178}
+{23,199,287}
+{131,228}
+{19,19,39,111,138,277}
+{49,86,178,194,223,226}
+{114,201}
+{149,282}
+{109,147,150,176,209,229}
+{122,131,167,228,258}
+{5,40,120,154,266}
+{135,207,238,263}
+{75,128}
+{80,117,296}
+{60,82,122,131,138}
+{57,146,159,233,244,278}
+{15,80,157,182,244,272}
+{114,116,160,176,287}
+{10,133,279}
+{27,115,126,293}
+{89,161}
+{95,120,218}
+{26,269}
+{109,281}
+{53,62,103,107,118,239}
+{185,186,227,252}
+{3,125,146,161,288}
+{171,245,256,283}
+{23,153,201,238}
+{0,82,93,218,242}
+{101,124,137,150,194}
+{21,96,104,201,244,266}
+{88,121,147,155,173,225}
+{24,106,112,193}
+{26,67,115,212,283}
+{23,120,280}
+{45,99}
+{30,66,136,199}
+{17,213}
+{14,37,55,103,265}
+{52,258,284}
+{119,213,272,274,285}
+{43,45,105,254,288}
+{64,81,123,126,164,292}
+{88,229,260}
+{25,117}
+{7,149,197,227,258}
+{74,83,240,246,284,292}
+{2,4,63,103,115,289}
+{92,239}
+{12,26,130,228,265}
+{53,99,131,142,164,291}
+{63,248,259,283}
+{186,215,282}
+{67,110,160}
+{166,191}
+{33,156,224}
+{152,166,190,250,297}
+{123,126,153,199,204}
+{49,70,199,238,238,289}
+{14,18,65,74,146,235}
+{63,77,172,180,186,225}
+{1,48,105,170}
+{37,56,113,133,196}
+{193,261,266}
+{190,273}
+{38,129,261}
+{251,252,253,254,275,296}
+{249,275}
+{167,205,266}
+{27,152,256}
+{19,72,248}
+{40,73,141,249}
+{105,197}
+{156,243,277,282}
+{165,168,227,298}
+{8,31,202,271}
+{10,101,109,167,236,277}
+{33,91,165,192,206,211}
+{102,122,232}
+{190,239,283}
+{160,185}
+{2,13,65,70}
+{11,68,170,192,229,284}
+{66,90,228,237}
+{1,6,92,99,222,242}
+{42,128,133,207,289}
+{12,100,164,191}
+{26,31,120,176,204,220}
+{13,39,95,105,120,182}
+{114,120,295}
+{31,34,55,181,197,235}
+{24,52,64,80,142}
+{3,49,148,255,268}
+{132,175,254}
+{32,71,141}
+{112,116,186,270,271}
+{64,106,209,228,297}
+{128,268}
+{107,208,299}
+{151,173,187,192,213}
+{3,296}
+{20,31,135,153,289}
+{138,193,212,269,277,288}
+{73,92,130,295}
+{73,80,105}
+{50,96,138,199,265}
+{4,7,8,183,260,267}
+{66,71,118,145}
+{15,63,116,160,175,181}
+{88,217}
+{56,69,106,106,127,274}
+{84,205}
+{83,101,241,269}
+{21,254}
+{22,32,83,150,293}
+{198,221}
+{30,46,95,179,197}
+{46,85,208}
+{56,112,236}
+{71,217}
+{31,57,145,253}
+{34,133,170}
+{48,53,119,187,268,287}
+{111,203,229,239}
+{62,136}
+{49,54,187,254,298}
+{20,26,148,159,190,286}
+{3,13,193,252,284}
+{40,137,154,167,248,259}
+{3,47,242,278}
+{77,100,143,232}
+{51,130}
+{66,90,148,220,242,273}
+{143,151,211}
+{10,23}
+{21,30,179}
+{17,47,105,156,193,213}
+{0,23,25,125,144,146}
+{179,209}
+{79,113,117,192}
+{5,53,216,275,285}
+{187,197}
+{22,68,218,221}
+{0,71,78,110,120,173}
+{46,97,117,149,253,286}
+{10,20,129,162,171,195}
+{60,97,130,163,190}
+{57,145,179,283}
+{99,274}
+{151,161,228,251}
+{3,177,192,286}
+{21,81,142}
+{180,283}
+{13,102,131,149,246}
+{19,99,132,162,167,257}
+{15,86,188,260}
+{203,251,281}
+{5,45,138,155,157}
+{1,2,4,213,278}
+{21,123,208,219,263,267}
+{36,106,181,231,238}
+{103,120,168,184,224,287}
+{53,104,139,251}
+{1,91,141,202,268}
+{75,115,216,253}
+{56,167,268,296}
+{66,158,235,249}
+{82,124,198}
+{56,67,112,140,170,176}
+{16,75,266}
+{38,165,200,219,291,297}
+{86,151,229,241,275}
+{0,57,141,176,229,258}
+{18,72,164,195,235}
+{94,282}
+{83,139,242,269,294}
+{9,44,145,251,272}
+{132,203,249,282}
+{7,41,170,254}
+{6,153,193,291}
+{18,134,137,227,261}
+{14,36,115,124,172,229}
+{54,206}
+{49,91,131,185,204}
+{7,242}
+{41,57,161}
+{93,224,241,288}
+{119,288}
+{90,99,117,196,296}
+{67,85,154}
+{147,169,216,264}
+{79,92,164}
+{19,120,132,197,267}
+{76,264}
+{30,133}
+{27,37,93,138,218}
+{152,155,244}
+{41,149,182,259}
+{29,178,224}
+{115,201,268}
+{141,166,253,282}
+{3,65,125,245,264}
+{6,150,159,202,206,277}
+{217,276}
+{28,96,144,193}
+{7,59,190}
+{144,217}
+{10,79,96,100,126,222}
+{7,61,253}
+{14,69,263}
+{3,30,63,125,186,277}
+{2,10,79,100,223}
+{131,131,239}
+{116,195,199,240}
+{87,99,158}
+{52,180}
+{7,12,140,208,275}
+{65,67,83,280}
+{4,52,125,126,137,176}
+{9,48,79,203,217,243}
+{43,206,251}
+{19,112,196,263,266}
+{29,70,256}
+{161,236,258}
+{8,25,42,97,291}
+{63,144,242,271}
+{7,17}
+{1,85,250}
+{104,244,250}
+{18,22,31,99,266,281}
+{51,138,237,268,288}
+{8,40,91,221,273}
+{0,176,230,249,254,255}
+{44,140,176,194,197}
+{56,197,264}
+{229,246,283}
+{53,128,173,233,282}
+{45,193,221}
+{21,80,286}
+{4,18,267}
+{15,97,220}
+{62,70,83,147,149,244}
+{120,134,159,174,250}
+{116,269}
+{23,108}
+{10,91,239}
+{7,128,142,243,286}
+{134,201,245,275,278}
+{13,208,227,288}
+{30,78,85}
+{107,179}
+{31,59,153,217,240,298}
+{27,130,233,282,286}
+{15,59,136,262}
+{85,186,233}
+{10,152,165,181,181}
+{137,183}
+{40,56,125,256,265,280}
+{12,22,120,183}
+{62,229}
+{38,59,81,113,261}
+{67,194,229}
+{7,173}
+{37,43,296}
+{59,162,285}
+{171,200,213,213}
+{116,123,209,234,277}
+{52,175}
+{189,213}
+{30,94,99,228,238}
+{46,101,154,260,272,274}
+{30,32,59}
+{65,172,292}
+{18,22,131,170,271}
+{2,53,88,104,264,265}
+{60,194,288}
+{15,108,121,161,201}
+{40,85,173,195,201,221}
+{54,86,107,174,287}
+{20,71,190,227}
+{16,46,66,175,197,252}
+{130,243,252,282}
+{142,219,266,272}
+{14,202,204,231,241,276}
+{161,172,212,222}
+{15,183,275}
+{83,270}
+{67,204}
+{65,184,264}
+{73,119,183,190,242}
+{53,287}
+{24,171}
+{72,220,220}
+{101,136,176,204,224,280}
+{39,47,282}
+{106,162,238,252}
+{23,242,247,265}
+{98,108,189,209,273}
+{122,245,270}
+{109,127,128,244,299}
+{41,162,186,191}
+{60,196}
+{0,123,129,213,248}
+{29,79,89,91}
+{172,298}
+{122,140,162,228,263,268}
+{2,116,247,294}
+{6,138}
+{17,98,287}
+{53,166,187,219,248,296}
+{15,26,90,175,196}
+{184,193,198}
+{17,69,76,105,183,264}
+{56,101,110}
+{15,108,139,168,272}
+{5,71,104,141}
+{136,179}
+{72,189}
+{54,79,208}
+{98,113,150,184,190,246}
+{37,69,132,210,285}
+{1,29,45,74,109,145}
+{11,72,133,149,216}
+{34,57,84,212,280}
+{131,211,294}
+{70,84,173}
+{193,213,230,266,285,299}
+{57,94,163,182,227}
+{44,133,143}
+{31,32,211}
+{130,142,165,188,194,231}
+{52,61,139,226,239,287}
+{7,103,157}
+{155,224,230}
+{127,135,139}
+{77,237,294}
+{10,213,278}
+{28,90,185,274}
+{59,105,282,297}
+{39,128,174,268}
+{32,158,215}
+{24,145,189,213,278}
+{78,148,230,263}
+{42,68,93,160,287,299}
+{4,12,70,91,191,237}
+{20,294}
+{45,53,77,113,211,240}
+{232,237}
+{125,152,284}
+{58,81,155,215,296}
+{4,8,44}
+{1,52,102,128,184,218}
+{185,199,226,299}
+{10,178,262,285}
+{80,95,230,240,266}
+{4,5,213}
+{156,187,271,298}
+{88,298}
+{109,233,290}
+{47,65,91,105,249,269}
+{97,129}
+{46,92,207}
+{2,163,249,259,291}
+{89,102,140,158,231}
+{162,184,283}
+{36,213}
+{163,259}
+{47,220,250}
+{37,89,105,124,143,198}
+{3,71}
+{142,165,190,256,269,269}
+{152,256}
+{27,49,191,198,220,285}
+{71,73,87,189,260}
+{11,54,90,106,130,216}
+{193,245,252}
+{2,8,57,91,163,184}
+{18,171,283}
+{28,41,110,112}
+{5,57}
+{137,262,285}
+{19,57,156,229,269}
+{138,179,190,199,281}
+{35,98,196,242}
+{122,152}
+{83,132,181,212,280,288}
+{219,298}
+{57,88,103}
+{5,203}
+{98,156,266}
+{10,45,72,169,211}
+{45,101,156,214,269}
+{68,73,81}
+{16,127,259}
+{9,32,246}
+{66,173,261,261,274}
+{17,115,157,169,251}
+{49,158}
+{25,37}
+{2,73,103,178,194,236}
+{238,269,273}
+{162,178,276}
+{48,52,160,237,288}
+{54,82,130,135,169,275}
+{29,142}
+{205,249,253,275,291}
+{60,76,84,115,126}
+{48,108,153,213,231}
+{23,124,175,210,226,293}
+{9,181}
+{20,99,112,166,201,242}
+{102,150,201}
+{41,98,240,244,260}
+{7,44,98,293}
+{0,125,177,283}
+{28,118,124,148,241,290}
+{73,91,122}
+{9,72,109,130,202,290}
+{70,111,120,160,216,262}
+{59,175,296}
+{2,201}
+{83,297}
+{76,293}
+{83,127,136,242,275,285}
+{169,190,195}
+{83,122,186,189,217,229}
+{98,210,229}
+{117,133}
+{74,294}
+{6,31,59,143,156,273}
+{98,180,241}
+{26,52,114,243}
+{112,240}
+{104,217}
+{148,162,259,279}
+{92,101,150,226,272,295}
+{55,86,118,202,237,275}
+{81,203}
+{79,126,177,265}
+{57,193}
+{169,240,244}
+{21,171,190,250,263}
+{23,37,215,235}
+{40,54,240,286}
+{105,177,190,276,285}
+{44,45,122,151}
+{28,31,187}
+{127,135,211}
+{5,13,150,194,259}
+{136,181,280}
+{20,147,158,189,200}
+{15,83,88,128,169}
+{10,14,25,26,150,158}
+{42,101,172,205}
+{85,185,226,236,271}
+{34,127,188,250,268}
+{27,143}
+{26,48,99,110,117,207}
+{22,56,190,269,287}
+{200,278}
+{70,134,138,204,216,298}
+{175,219,297}
+{99,273}
+{206,216}
+{23,214}
+{131,140}
+{11,140,240}
+{73,148}
+{7,66,125,210}
+{2,61,92}
+{0,137}
+{143,188,265}
+{177,238}
+{0,93,163,229}
+{35,49}
+{8,8,111,144,165}
+{99,278}
+{21,44,71,224,252,270}
+{119,150,175,233,245,294}
+{15,87}
+{84,211,217,225}
+{20,41,87,123,124,299}
+{62,120,169}
+{37,43,92,175,206,222}
+{95,168,180,250,269,296}
+{60,228,278,285}
+{173,195,232,276}
+{1,2,139,256,278}
+{51,119}
+{212,238,291}
+{120,172,292}
+{138,279}
+{251,261}
+{151,181,278,296}
+{163,207,220,289,295}
+{89,278,290}
+{24,137,157,206,271,278}
+{7,63,83,89,155,189}
+{2,5,172,195,215,260}
+{243,281}
+{60,125}
+{74,87,222,236}
+{45,70,159,194}
+{69,159,250}
+{150,214,296}
+{101,158,250}
+{56,134}
+{57,87,160,167,247,285}
+{123,269}
+{235,242}
+{79,95,115,167,287}
+{31,56,132,244,276}
+{25,218,241,241}
+{57,82,151,170,204}
+{69,103,288}
+{88,138,154,292}
+{14,98,138,227,245,249}
+{175,222,274}
+{38,139,193,208,277}
+{79,141}
+{5,77,197,209}
+{15,37,77,110,116}
+{26,226}
+{68,93,101,140,233}
+{53,96,170,192,290}
+{29,89,102,216,220}
+{11,85,136,239}
+{158,180,195,200,226}
+{10,49,118,137,172}
+{144,172,183}
+{14,176,188,215,272}
+{42,97,125}
+{114,166}
+{52,61,162,171,249}
+{140,195,242}
+{59,99,233}
+{31,76,136,181,187}
+{81,112,157,168,271,294}
+{8,35,44,48,190,297}
+{145,195,201}
+{160,248,291}
+{94,270,285}
+{116,139,225}
+{111,131,140}
+{158,277}
+{59,229,257}
+{25,47,99,123,239}
+{8,36,205,274,295}
+{132,152,178,192,235}
+{19,40,96,204}
+{7,77}
+{211,282}
+{26,100,180,244,281,296}
+{200,212,286}
+{5,94,151,290}
+{75,80,128,179,269,269}
+{7,111}
+{7,26,69,158,269,276}
+{7,36,74,94,171,215}
+{2,62,65,93,124,271}
+{78,96,109,189}
+{182,197,280,298}
+{17,78,82,85,85,208}
+{6,122,155}
+{14,33,130}
+{1,21,167,169}
+{49,85,158,175,213}
+{59,194}
+{125,132,259,285}
+{20,38,81,89,234,274}
+{106,140,156,287}
+{57,125}
+{53,103,158,204,234,267}
+{0,49,160,189,235}
+{34,115,142,207}
+{162,173,181,190,298}
+{11,76,116,166,191}
+{2,87,99,236,279}
+{40,203}
+{2,33,39,215,254}
+{53,69,83,224,228}
+{79,136,183,216,226,227}
+{10,109,137,163,240}
+{24,126,141}
+{69,255}
+{103,138,230,246,259,283}
+{136,290}
+{13,34,78,145,166,242}
+{38,74,83,242,294}
+{54,248,273}
+{107,162}
+{50,170,176,191,207,275}
+{32,134,166,288,292}
+{163,167,186,274,291,296}
+{31,86,123,156,160}
+{114,133,136,176,281,290}
+{105,147,211}
+{124,151,179,222,299}
+{87,101}
+{145,169,181,205,247}
+{6,266}
+{26,33,52,56,106,116}
+{19,21,65,89,104,168}
+{164,181,208}
+{36,67,92,116,248}
+{145,200,247}
+{155,215}
+{49,212}
+{29,57,105,117,131}
+{2,13,68,128,139,140}
+{193,273,273}
+{3,78,105,111,297}
+{49,142,244}
+{32,259}
+{161,205}
+{96,146,179,259}
+{44,45,211,233}
+{56,91,146,166,285}
+{87,107,120,262,299}
+{76,160,276,297}
+{248,266}
+{5,12,188,240,247}
+{164,206,293}
+{15,18,60,163}
+{53,134,172,230,287,290}
+{117,137,146,153,155}
+{72,270}
+{171,251}
+{80,125,137,141,169}
+{52,108,200,219,225,271}
+{29,78,106,221}
+{21,74,110,273}
+{28,88,98,170}
+{83,104}
+{12,152}
+{7,69,143,246,265,269}
+{62,106,157,200}
+{113,260,272,272,294}
+{16,35,80,121,165,176}
+{96,154,172,198,263}
+{29,53,109,128,129,195}
+{131,230,271,273,295,299}
+{53,160,208,231}
+{23,180,208,249,272}
+{45,208,264}
+{14,29,169}
+{116,147,272}
+{7,193,237,271}
+{158,198,253}
+{41,60,71}
+{110,133,200,249}
+{24,159,255}
+{26,39,61,114,218,229}
+{141,286,299}
+{74,278}
+{67,71,155}
+{151,257,284}
+{13,28,72,131,206}
+{60,152,275,295}
+{88,105,184,185}
+{85,190,205,256,283,285}
+{202,285}
+{14,92,160,200,246,279}
+{42,95,157,195}
+{50,99,224,276}
+{32,97,101,122}
+{66,85}
+{19,146,180,242,269,286}
+{24,86,247,274}
+{54,264,270,284}
+{72,77,85,124,127,285}
+{47,249}
+{25,73,102,237}
+{33,68,84,117,120}
+{29,62,172,240,242,273}
+{42,140,182,248,261,282}
+{118,228,284}
+{1,89,158,294}
+{29,89,122,155,208,283}
+{173,208,229}
+{6,22,142,267,299}
+{22,122,173,245,293}
diff --git a/contrib/pageinspect/expected/gin.out b/contrib/pageinspect/expected/gin.out
index 82f63b2..c4d0ef1 100644
--- a/contrib/pageinspect/expected/gin.out
+++ b/contrib/pageinspect/expected/gin.out
@@ -35,3 +35,320 @@ FROM gin_leafpage_items(get_raw_page('test1_y_idx',
-[ RECORD 1 ]
?column? | t
+\x
+CREATE TABLE test__int(a int[]);
+\copy test__int from 'data/test__int.data'
+CREATE INDEX gin_idx ON test__int USING gin ( a );
+INSERT INTO test__int ( SELECT ARRAY[t] || '{1000}'::_int4 FROM generate_series (1,300) as t );
+INSERT INTO test__int ( SELECT ARRAY[t] || '{1001}'::_int4 FROM generate_series (1,300) as t, generate_series(1,12) );
+VACUUM ANALYZE test__int;
+SELECT * FROM gin_value_count('gin_idx') as t(value int, nrow int);
+ value | nrow
+-------+------
+ 0 | 38
+ 1 | 257
+ 2 | 244
+ 3 | 222
+ 4 | 228
+ 5 | 227
+ 6 | 243
+ 7 | 238
+ 8 | 236
+ 9 | 224
+ 10 | 236
+ 11 | 248
+ 12 | 224
+ 13 | 235
+ 14 | 237
+ 15 | 253
+ 16 | 234
+ 17 | 245
+ 18 | 246
+ 19 | 234
+ 20 | 236
+ 21 | 213
+ 22 | 235
+ 23 | 222
+ 24 | 197
+ 25 | 253
+ 26 | 218
+ 27 | 239
+ 28 | 198
+ 29 | 244
+ 30 | 247
+ 31 | 267
+ 32 | 234
+ 33 | 209
+ 34 | 231
+ 35 | 218
+ 36 | 242
+ 37 | 232
+ 38 | 221
+ 39 | 232
+ 40 | 241
+ 41 | 239
+ 42 | 221
+ 43 | 211
+ 44 | 231
+ 45 | 213
+ 46 | 236
+ 47 | 264
+ 48 | 221
+ 49 | 235
+ 50 | 219
+ 51 | 250
+ 52 | 270
+ 53 | 222
+ 54 | 242
+ 55 | 237
+ 56 | 237
+ 57 | 251
+ 58 | 231
+ 59 | 272
+ 60 | 219
+ 61 | 233
+ 62 | 235
+ 63 | 260
+ 64 | 252
+ 65 | 221
+ 66 | 228
+ 67 | 253
+ 68 | 196
+ 69 | 232
+ 70 | 232
+ 71 | 223
+ 72 | 247
+ 73 | 214
+ 74 | 232
+ 75 | 229
+ 76 | 233
+ 77 | 221
+ 78 | 227
+ 79 | 233
+ 80 | 216
+ 81 | 244
+ 82 | 223
+ 83 | 254
+ 84 | 227
+ 85 | 247
+ 86 | 255
+ 87 | 239
+ 88 | 258
+ 89 | 249
+ 90 | 244
+ 91 | 226
+ 92 | 225
+ 93 | 230
+ 94 | 218
+ 95 | 232
+ 96 | 239
+ 97 | 226
+ 98 | 209
+ 99 | 211
+ 100 | 216
+ 101 | 49
+ 102 | 47
+ 103 | 59
+ 104 | 55
+ 105 | 48
+ 106 | 49
+ 107 | 49
+ 108 | 51
+ 109 | 47
+ 110 | 51
+ 111 | 45
+ 112 | 46
+ 113 | 48
+ 114 | 38
+ 115 | 39
+ 116 | 43
+ 117 | 44
+ 118 | 46
+ 119 | 45
+ 120 | 52
+ 121 | 41
+ 122 | 64
+ 123 | 50
+ 124 | 41
+ 125 | 55
+ 126 | 41
+ 127 | 50
+ 128 | 54
+ 129 | 43
+ 130 | 44
+ 131 | 50
+ 132 | 57
+ 133 | 40
+ 134 | 41
+ 135 | 44
+ 136 | 58
+ 137 | 48
+ 138 | 44
+ 139 | 50
+ 140 | 49
+ 141 | 48
+ 142 | 43
+ 143 | 36
+ 144 | 43
+ 145 | 49
+ 146 | 46
+ 147 | 40
+ 148 | 52
+ 149 | 46
+ 150 | 49
+ 151 | 42
+ 152 | 58
+ 153 | 49
+ 154 | 51
+ 155 | 49
+ 156 | 45
+ 157 | 53
+ 158 | 59
+ 159 | 38
+ 160 | 53
+ 161 | 48
+ 162 | 41
+ 163 | 40
+ 164 | 52
+ 165 | 50
+ 166 | 40
+ 167 | 48
+ 168 | 45
+ 169 | 49
+ 170 | 50
+ 171 | 45
+ 172 | 46
+ 173 | 47
+ 174 | 41
+ 175 | 51
+ 176 | 50
+ 177 | 41
+ 178 | 42
+ 179 | 48
+ 180 | 47
+ 181 | 49
+ 182 | 40
+ 183 | 46
+ 184 | 52
+ 185 | 36
+ 186 | 45
+ 187 | 41
+ 188 | 47
+ 189 | 49
+ 190 | 46
+ 191 | 45
+ 192 | 39
+ 193 | 50
+ 194 | 39
+ 195 | 54
+ 196 | 43
+ 197 | 50
+ 198 | 46
+ 199 | 42
+ 200 | 31
+ 201 | 28
+ 202 | 28
+ 203 | 28
+ 204 | 30
+ 205 | 22
+ 206 | 25
+ 207 | 27
+ 208 | 32
+ 209 | 22
+ 210 | 21
+ 211 | 31
+ 212 | 22
+ 213 | 37
+ 214 | 19
+ 215 | 25
+ 216 | 27
+ 217 | 26
+ 218 | 24
+ 219 | 25
+ 220 | 26
+ 221 | 21
+ 222 | 23
+ 223 | 20
+ 224 | 26
+ 225 | 25
+ 226 | 25
+ 227 | 23
+ 228 | 30
+ 229 | 30
+ 230 | 24
+ 231 | 22
+ 232 | 27
+ 233 | 27
+ 234 | 21
+ 235 | 27
+ 236 | 24
+ 237 | 24
+ 238 | 29
+ 239 | 32
+ 240 | 31
+ 241 | 24
+ 242 | 36
+ 243 | 21
+ 244 | 29
+ 245 | 22
+ 246 | 23
+ 247 | 21
+ 248 | 26
+ 249 | 29
+ 250 | 24
+ 251 | 29
+ 252 | 25
+ 253 | 28
+ 254 | 25
+ 255 | 19
+ 256 | 23
+ 257 | 20
+ 258 | 24
+ 259 | 31
+ 260 | 29
+ 261 | 20
+ 262 | 25
+ 263 | 23
+ 264 | 25
+ 265 | 23
+ 266 | 31
+ 267 | 22
+ 268 | 26
+ 269 | 33
+ 270 | 25
+ 271 | 27
+ 272 | 29
+ 273 | 29
+ 274 | 26
+ 275 | 28
+ 276 | 30
+ 277 | 28
+ 278 | 29
+ 279 | 22
+ 280 | 29
+ 281 | 23
+ 282 | 30
+ 283 | 29
+ 284 | 23
+ 285 | 37
+ 286 | 27
+ 287 | 31
+ 288 | 28
+ 289 | 26
+ 290 | 25
+ 291 | 29
+ 292 | 22
+ 293 | 26
+ 294 | 29
+ 295 | 24
+ 296 | 27
+ 297 | 30
+ 298 | 29
+ 299 | 26
+ 300 | 13
+ 1000 | 300
+ 1001 | 3600
+ | 9
+ | 244
+(305 rows)
+
diff --git a/contrib/pageinspect/expected/gist.out b/contrib/pageinspect/expected/gist.out
new file mode 100644
index 0000000..46e55f4
--- /dev/null
+++ b/contrib/pageinspect/expected/gist.out
@@ -0,0 +1,18 @@
+CREATE TABLE gist_table (t box);
+\copy gist_table from 'data/rect.data'
+CREATE INDEX gist_idx ON gist_table USING gist (t);
+SELECT gist_stats('gist_idx');
+ gist_stats
+-----------------------------------------
+ Number of levels: 2 +
+ Number of pages: 29 +
+ Number of leaf pages: 28 +
+ Number of tuples: 3406 +
+ Number of invalid tuples: 0 +
+ Number of leaf tuples: 3378 +
+ Total size of tuples: 143516 bytes+
+ Total size of leaf tuples: 142296 bytes+
+ Total size of index: 237568 bytes+
+
+(1 row)
+
diff --git a/contrib/pageinspect/expected/spgist.out b/contrib/pageinspect/expected/spgist.out
new file mode 100644
index 0000000..5bab22e
--- /dev/null
+++ b/contrib/pageinspect/expected/spgist.out
@@ -0,0 +1,120 @@
+CREATE TABLE spgist_table (t box);
+\copy spgist_table from 'data/rect.data'
+SELECT center(t) AS p INTO spgist_table_p FROM spgist_table;
+CREATE INDEX spgist_idx ON spgist_table_p USING spgist (p);
+CREATE INDEX kdspgist_idx ON spgist_table_p USING spgist (p kd_point_ops);
+SELECT spgist_stats('spgist_idx');
+ spgist_stats
+----------------------------------
+ totalPages: 21 +
+ deletedPages: 0 +
+ innerPages: 2 +
+ leafPages: 19 +
+ emptyPages: 0 +
+ usedSpace: 126.70 kbytes+
+ usedInnerSpace: 1.17 kbytes +
+ usedLeafSpace: 125.53 kbytes+
+ freeSpace: 40.64 kbytes +
+ fillRatio: 75.71% +
+ leafTuples: 3947 +
+ innerTuples: 20 +
+ innerAllTheSame: 0 +
+ leafPlaceholders: 569 +
+ innerPlaceholders: 0 +
+ leafRedirects: 0 +
+ innerRedirects: 0
+(1 row)
+
+SELECT * FROM spgist_print('kdspgist_idx') as t(tid tid, allthesame bool, node_n int, level int, tid_pointer tid, prefix float8, node_label int, leaf_value point);
+ tid | allthesame | node_n | level | tid_pointer | prefix | node_label | leaf_value
+----------+------------+--------+-------+-------------+---------+------------+-------------------
+ (1,1) | f | 0 | 1 | (5,1) | 23030 | |
+ (1,1) | f | 1 | 1 | (5,2) | 23030 | |
+ (5,2) | f | 0 | 2 | (5,6) | 21664 | |
+ (5,2) | f | 1 | 2 | (5,3) | 21664 | |
+ (5,3) | f | 0 | 3 | (5,5) | 37159.5 | |
+ (5,3) | f | 1 | 3 | (5,12) | 37159.5 | |
+ (5,12) | f | 0 | 4 | (5,13) | 36357.5 | |
+ (5,12) | f | 1 | 4 | (14,226) | 36357.5 | |
+ (14,226) | | | 5 | | | | (43240,47256.5)
+ (5,13) | f | 0 | 5 | (3,112) | 43507 | |
+ (5,13) | f | 1 | 5 | (5,25) | 43507 | |
+ (5,25) | f | 0 | 6 | (22,116) | 28862 | |
+ (5,25) | f | 1 | 6 | (22,115) | 28862 | |
+ (22,115) | | | 7 | | | | (30902,44532)
+ (22,116) | | | 7 | | | | (23048,47416)
+ (3,112) | | | 6 | | | | (35218.5,42124)
+ (5,5) | f | 0 | 4 | (5,11) | 33416 | |
+ (5,5) | f | 1 | 4 | (5,22) | 33416 | |
+ (5,22) | f | 0 | 5 | (20,225) | 30991 | |
+ (5,22) | f | 1 | 5 | (5,23) | 30991 | |
+ (5,23) | f | 0 | 6 | (9,112) | 41820 | |
+ (5,23) | f | 1 | 6 | (9,114) | 41820 | |
+ (9,114) | | | 7 | | | | (44732,32182)
+ (9,112) | | | 7 | | | | (35580,33526.5)
+ (20,225) | | | 6 | | | | (47724.5,27185.5)
+ (5,11) | f | 0 | 5 | (13,101) | 29986.5 | |
+ (5,11) | f | 1 | 5 | (13,100) | 29986.5 | |
+ (13,100) | | | 6 | | | | (24069,30850.5)
+ (13,101) | | | 6 | | | | (29539,25566)
+ (5,6) | f | 0 | 3 | (5,7) | 36774 | |
+ (5,6) | f | 1 | 3 | (5,19) | 36774 | |
+ (5,19) | f | 0 | 4 | (5,20) | 10075.5 | |
+ (5,19) | f | 1 | 4 | (18,225) | 10075.5 | |
+ (18,225) | | | 5 | | | | (20920.5,49105.5)
+ (5,20) | f | 0 | 5 | (10,110) | 44171.5 | |
+ (5,20) | f | 1 | 5 | (10,113) | 44171.5 | |
+ (10,113) | | | 6 | | | | (93,46797)
+ (10,110) | | | 6 | | | | (28.5,38640.5)
+ (5,7) | f | 0 | 4 | (7,113) | 9517 | |
+ (5,7) | f | 1 | 4 | (5,21) | 9517 | |
+ (5,21) | f | 0 | 5 | (19,115) | 28907.5 | |
+ (5,21) | f | 1 | 5 | (19,112) | 28907.5 | |
+ (19,112) | | | 6 | | | | (11916.5,31668)
+ (19,115) | | | 6 | | | | (20622.5,27462.5)
+ (7,113) | | | 5 | | | | (9296,35157)
+ (5,1) | f | 0 | 2 | (5,8) | 26938 | |
+ (5,1) | f | 1 | 2 | (5,4) | 26938 | |
+ (5,4) | f | 0 | 3 | (5,10) | 9532 | |
+ (5,4) | f | 1 | 3 | (5,14) | 9532 | |
+ (5,14) | f | 0 | 4 | (5,15) | 38603 | |
+ (5,14) | f | 1 | 4 | (15,222) | 38603 | |
+ (15,222) | | | 5 | | | | (41926.5,17934.5)
+ (5,15) | f | 0 | 5 | (8,113) | 16345 | |
+ (5,15) | f | 1 | 5 | (8,112) | 16345 | |
+ (8,112) | | | 6 | | | | (32425,20702.5)
+ (8,113) | | | 6 | | | | (29134,15559.5)
+ (5,10) | f | 0 | 4 | (12,94) | 38800.5 | |
+ (5,10) | f | 1 | 4 | (5,24) | 38800.5 | |
+ (5,24) | f | 0 | 5 | (21,108) | 4752 | |
+ (5,24) | f | 1 | 5 | (21,107) | 4752 | |
+ (21,107) | | | 6 | | | | (49822.5,7097.5)
+ (21,108) | | | 6 | | | | (40315.5,1689.5)
+ (12,94) | | | 5 | | | | (30295.5,5090)
+ (5,8) | f | 0 | 3 | (5,17) | 11733.5 | |
+ (5,8) | f | 1 | 3 | (5,9) | 11733.5 | |
+ (5,9) | f | 0 | 4 | (6,114) | 11993 | |
+ (5,9) | f | 1 | 4 | (5,16) | 11993 | |
+ (5,16) | f | 0 | 5 | (16,123) | 17591 | |
+ (5,16) | f | 1 | 5 | (16,127) | 17591 | |
+ (16,127) | | | 6 | | | | (18352.5,19366)
+ (16,123) | | | 6 | | | | (24795,14921)
+ (6,114) | | | 5 | | | | (6706,16676)
+ (5,17) | f | 0 | 4 | (5,18) | 13329.5 | |
+ (5,17) | f | 1 | 4 | (17,226) | 13329.5 | |
+ (17,226) | | | 5 | | | | (23690,10214.5)
+ (5,18) | f | 0 | 5 | (11,113) | 6375 | |
+ (5,18) | f | 1 | 5 | (11,109) | 6375 | |
+ (11,109) | | | 6 | | | | (5501.5,9916)
+ (11,113) | | | 6 | | | | (1072.5,4752)
+(79 rows)
+
+SELECT * FROM spgist_print('spgist_idx') as t(tid tid, allthesame bool, node_n int, level int, tid_pointer tid, prefix point, node_label int, leaf_value point) WHERE level = 1;
+ tid | allthesame | node_n | level | tid_pointer | prefix | node_label | leaf_value
+-------+------------+--------+-------+-------------+-------------------------------------+------------+------------
+ (1,1) | f | 0 | 1 | (5,4) | (24530.2070484581,23595.7092511013) | |
+ (1,1) | f | 1 | 1 | (5,3) | (24530.2070484581,23595.7092511013) | |
+ (1,1) | f | 2 | 1 | (5,2) | (24530.2070484581,23595.7092511013) | |
+ (1,1) | f | 3 | 1 | (5,1) | (24530.2070484581,23595.7092511013) | |
+(4 rows)
+
diff --git a/contrib/pageinspect/ginfuncs.c b/contrib/pageinspect/ginfuncs.c
index f774495..401d4cf 100644
--- a/contrib/pageinspect/ginfuncs.c
+++ b/contrib/pageinspect/ginfuncs.c
@@ -2,11 +2,18 @@
* ginfuncs.c
* Functions to investigate the content of GIN indexes
*
+ * Source code is based on Gevel module available at
+ * (http://www.sai.msu.su/~megera/oddmuse/index.cgi/Gevel)
+ * Originally developed by:
+ * - Oleg Bartunov <oleg@sai.msu.su>, Moscow, Moscow University, Russia
+ * - Teodor Sigaev <teodor@sigaev.ru>, Moscow, Moscow University, Russia
+ *
* Copyright (c) 2014-2017, PostgreSQL Global Development Group
*
* IDENTIFICATION
* contrib/pageinspect/ginfuncs.c
*/
+
#include "postgres.h"
#include "pageinspect.h"
@@ -15,22 +22,263 @@
#include "access/gin_private.h"
#include "access/htup_details.h"
#include "catalog/namespace.h"
+#include "catalog/pg_am.h"
#include "catalog/pg_type.h"
#include "funcapi.h"
#include "miscadmin.h"
+#include "tsearch/ts_utils.h"
#include "utils/array.h"
#include "utils/builtins.h"
+#include "utils/datum.h"
+#include "utils/fmgroids.h"
#include "utils/rel.h"
+#include "utils/regproc.h"
+#include "utils/lsyscache.h"
+#include "utils/varlena.h"
+
#define DatumGetItemPointer(X) ((ItemPointer) DatumGetPointer(X))
#define ItemPointerGetDatum(X) PointerGetDatum(X)
+typedef struct GinStatState
+{
+ Relation index;
+ GinState ginstate;
+ OffsetNumber attnum;
+
+ Buffer buffer;
+ OffsetNumber offset;
+ Datum curval; /* Key */
+ GinNullCategory category;
+ Datum dvalues[2]; /* Represents tuple 0 - key; 1 - # of TIDs */
+ bool nulls[2];
+} GinStatState;
+
+typedef struct gin_leafpage_items_state
+{
+ TupleDesc tupd;
+ GinPostingList *seg;
+ GinPostingList *lastseg;
+} gin_leafpage_items_state;
+
PG_FUNCTION_INFO_V1(gin_metapage_info);
PG_FUNCTION_INFO_V1(gin_page_opaque_info);
PG_FUNCTION_INFO_V1(gin_leafpage_items);
+PG_FUNCTION_INFO_V1(gin_value_count);
+PG_FUNCTION_INFO_V1(gin_count_estimate);
+PG_FUNCTION_INFO_V1(gin_stats);
+/*
+ * process_tuple
+ * Retrieves the number of TIDs in a tuple.
+ */
+static void
+process_tuple(FuncCallContext *funcctx, GinStatState *st, IndexTuple itup)
+{
+ MemoryContext oldcontext;
+ Datum key;
+
+ oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
+
+ key = gintuple_get_key(&st->ginstate, itup, &st->category);
+
+ if (st->category != GIN_CAT_NORM_KEY)
+ st->curval = (Datum) 0;
+ else
+ st->curval = datumCopy(
+ key,
+ TupleDescAttr(st->index->rd_att, st->attnum)->attbyval,
+ TupleDescAttr(st->index->rd_att, st->attnum)->attlen);
+ MemoryContextSwitchTo(oldcontext);
+ st->dvalues[0] = st->curval;
+
+ /* do not distinguish various null categories */
+ st->nulls[0] = (st->category != GIN_CAT_NORM_KEY);
+
+ if (GinIsPostingTree(itup))
+ {
+ BlockNumber rootblkno = GinGetPostingTree(itup);
+ GinBtreeData btree;
+ GinBtreeStack *stack;
+ ItemPointerData minItem;
+ int nlist;
+ ItemPointer list;
+ Page page;
+ uint32 predictNumber;
+
+ LockBuffer(st->buffer, GIN_UNLOCK);
+ stack = ginScanBeginPostingTree(&btree, st->index, rootblkno, NULL);
+ page = BufferGetPage(stack->buffer);
+ ItemPointerSetMin(&minItem);
+ list = GinDataLeafPageGetItems(page, &nlist, minItem);
+ pfree(list);
+ predictNumber = stack->predictNumber;
+ st->dvalues[1] = Int32GetDatum(predictNumber * nlist);
+
+ LockBuffer(stack->buffer, GIN_UNLOCK);
+ freeGinBtreeStack(stack);
+ }
+ else
+ {
+ st->dvalues[1] = Int32GetDatum(GinGetNPosting(itup));
+ LockBuffer(st->buffer, GIN_UNLOCK);
+ }
+}
+
+static bool
+move_right_if_needed(GinStatState *st)
+{
+ Page page = BufferGetPage(st->buffer);
+
+ if (st->offset > PageGetMaxOffsetNumber(page))
+ {
+ /*
+ * We scanned the whole page, so we should take right page
+ */
+ BlockNumber blkno = GinPageGetOpaque(page)->rightlink;
+
+ if (GinPageRightMost(page))
+ return false; /* no more page */
+
+ LockBuffer(st->buffer, GIN_UNLOCK);
+ st->buffer = ReleaseAndReadBuffer(st->buffer, st->index, blkno);
+ LockBuffer(st->buffer, GIN_SHARE);
+ st->offset = FirstOffsetNumber;
+ }
+
+ return true;
+}
+
+/*
+ * refind_position
+ * Refinds a previous position, on return it has correctly
+ * set offset and buffer is locked.
+ */
+static bool
+refind_position(GinStatState *st)
+{
+ Page page;
+
+ /* find left if needed (it causes only for first search) */
+ for (;;)
+ {
+ IndexTuple itup;
+ BlockNumber blkno;
+
+ LockBuffer(st->buffer, GIN_SHARE);
+
+ page = BufferGetPage(st->buffer);
+ if (GinPageIsLeaf(page))
+ break;
+
+ itup = (IndexTuple) PageGetItem(page,
+ PageGetItemId(page, FirstOffsetNumber));
+ blkno = GinItemPointerGetBlockNumber(&(itup)->t_tid);
+
+ LockBuffer(st->buffer, GIN_UNLOCK);
+ st->buffer = ReleaseAndReadBuffer(st->buffer, st->index, blkno);
+ }
+
+ if (st->offset == InvalidOffsetNumber)
+ {
+ return (PageGetMaxOffsetNumber(page) >= FirstOffsetNumber);
+ }
+
+ for (;;)
+ {
+ int cmp;
+ GinNullCategory category;
+ Datum datum;
+ IndexTuple itup;
+
+ if (move_right_if_needed(st) == false)
+ return false;
+
+ itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, st->offset));
+ datum = gintuple_get_key(&st->ginstate, itup, &category);
+ cmp = ginCompareAttEntries(&st->ginstate,
+ st->attnum + 1, st->curval, st->category,
+ gintuple_get_attrnum(&st->ginstate, itup),
+ datum, category);
+ if (cmp == 0)
+ {
+ if (st->curval && !TupleDescAttr(st->index->rd_att, st->attnum)->attbyval)
+ pfree((void *) st->curval);
+ return true;
+ }
+
+ st->offset++;
+ }
+
+ return false;
+}
+
+static Relation
+gin_index_open(RangeVar *relvar)
+{
+ Oid relOid = RangeVarGetRelid(relvar, NoLock, false);
+ Relation rel = index_open(relOid, AccessShareLock);
+
+ if (rel->rd_index == NULL)
+ elog(ERROR, "relation %s.%s is not an index",
+ get_namespace_name(RelationGetNamespace(rel)),
+ RelationGetRelationName(rel)
+ );
+
+ if (rel->rd_rel->relam != GIN_AM_OID)
+ elog(ERROR, "index %s.%s has wrong type",
+ get_namespace_name(RelationGetNamespace(rel)),
+ RelationGetRelationName(rel)
+ );
+ return rel;
+}
+
+static void
+gin_setup_firstcall(FuncCallContext *funcctx, text *name, int attnum)
+{
+ MemoryContext oldcontext;
+ GinStatState *st;
+ char *relname = text_to_cstring(name);
+ TupleDesc tupdesc;
+
+ oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
+
+ st = (GinStatState *) palloc(sizeof(GinStatState));
+ memset(st, 0, sizeof(GinStatState));
+ st->index = gin_index_open(makeRangeVarFromNameList(stringToQualifiedNameList(relname)));
+ initGinState(&st->ginstate, st->index);
+
+ if (attnum < 0 || attnum >= st->index->rd_att->natts)
+ elog(ERROR, "invalid attribute number");
+ st->attnum = attnum;
+
+ funcctx->user_fctx = (void *) st;
+
+ tupdesc = CreateTemplateTupleDesc(2, false);
+ TupleDescInitEntry(tupdesc, 1, "value",
+ TupleDescAttr(st->index->rd_att, st->attnum)->atttypid,
+ TupleDescAttr(st->index->rd_att, st->attnum)->atttypmod,
+ TupleDescAttr(st->index->rd_att, st->attnum)->attndims);
+ TupleDescInitEntry(tupdesc, 2, "nrow", INT4OID, -1, 0);
+
+ st->nulls[0] = false;
+ st->nulls[1] = false;
+
+ funcctx->slot = TupleDescGetSlot(tupdesc);
+ funcctx->attinmeta = TupleDescGetAttInMetadata(tupdesc);
+
+ MemoryContextSwitchTo(oldcontext);
+ pfree(relname);
+
+ st->offset = InvalidOffsetNumber;
+ st->buffer = ReadBuffer(st->index, GIN_ROOT_BLKNO);
+}
+
+/*
+ * gin_metapage_info
+ */
Datum
gin_metapage_info(PG_FUNCTION_ARGS)
{
@@ -86,7 +334,9 @@ gin_metapage_info(PG_FUNCTION_ARGS)
return HeapTupleGetDatum(resultTuple);
}
-
+/*
+ * gin_page_opaque_info
+ */
Datum
gin_page_opaque_info(PG_FUNCTION_ARGS)
{
@@ -110,7 +360,7 @@ gin_page_opaque_info(PG_FUNCTION_ARGS)
opaq = (GinPageOpaque) PageGetSpecialPointer(page);
- /* Build a tuple descriptor for our result type */
+ /* Build a tuple descriptor for the result type */
if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE)
elog(ERROR, "return type must be a row type");
@@ -137,7 +387,8 @@ gin_page_opaque_info(PG_FUNCTION_ARGS)
if (flagbits)
{
/* any flags we don't recognize are printed in hex */
- flags[nflags++] = DirectFunctionCall1(to_hex32, Int32GetDatum(flagbits));
+ flags[nflags++] = DirectFunctionCall1(to_hex32,
+ Int32GetDatum(flagbits));
}
memset(nulls, 0, sizeof(nulls));
@@ -153,13 +404,9 @@ gin_page_opaque_info(PG_FUNCTION_ARGS)
return HeapTupleGetDatum(resultTuple);
}
-typedef struct gin_leafpage_items_state
-{
- TupleDesc tupd;
- GinPostingList *seg;
- GinPostingList *lastseg;
-} gin_leafpage_items_state;
-
+/*
+ * gin_leafpage_items
+ */
Datum
gin_leafpage_items(PG_FUNCTION_ARGS)
{
@@ -252,7 +499,7 @@ gin_leafpage_items(PG_FUNCTION_ARGS)
pfree(tids_datum);
pfree(tids);
- /* Build and return the result tuple. */
+ /* build and return the result tuple */
resultTuple = heap_form_tuple(inter_call_data->tupd, values, nulls);
result = HeapTupleGetDatum(resultTuple);
@@ -261,5 +508,311 @@ gin_leafpage_items(PG_FUNCTION_ARGS)
SRF_RETURN_NEXT(fctx, result);
}
else
+ {
SRF_RETURN_DONE(fctx);
+ }
+}
+
+/*
+ * gin_value_count
+ * Prints estimated counts for each indexed value.
+ */
+Datum
+gin_value_count(PG_FUNCTION_ARGS)
+{
+ FuncCallContext *funcctx;
+ GinStatState *st;
+ Datum result = (Datum) 0;
+ IndexTuple ituple;
+ HeapTuple htuple;
+ Page page;
+
+ if (SRF_IS_FIRSTCALL())
+ {
+ text *name = PG_GETARG_TEXT_P(0);
+
+ funcctx = SRF_FIRSTCALL_INIT();
+ gin_setup_firstcall(funcctx, name, (PG_NARGS() == 2) ?
+ PG_GETARG_INT32(1) : 0);
+ PG_FREE_IF_COPY(name, 0);
+ }
+
+ funcctx = SRF_PERCALL_SETUP();
+ st = (GinStatState *) (funcctx->user_fctx);
+
+ if (refind_position(st) == false)
+ {
+ UnlockReleaseBuffer(st->buffer);
+ index_close(st->index, AccessShareLock);
+
+ SRF_RETURN_DONE(funcctx);
+ }
+
+ for (;;)
+ {
+ st->offset++;
+
+ if (move_right_if_needed(st) == false)
+ {
+ UnlockReleaseBuffer(st->buffer);
+ index_close(st->index, AccessShareLock);
+
+ SRF_RETURN_DONE(funcctx);
+ }
+
+ page = BufferGetPage(st->buffer);
+ ituple = (IndexTuple) PageGetItem(page,
+ PageGetItemId(page, st->offset));
+
+ if (st->attnum + 1 == gintuple_get_attrnum(&st->ginstate, ituple))
+ break;
+ }
+
+ process_tuple(funcctx, st, ituple);
+
+ htuple = heap_form_tuple(funcctx->attinmeta->tupdesc,
+ st->dvalues,
+ st->nulls);
+ result = TupleGetDatum(funcctx->slot, htuple);
+
+ SRF_RETURN_NEXT(funcctx, result);
+}
+
+/*
+ * gin_count_estimate
+ * Outputs number of indexed rows matching query. It doesn't touch heap at
+ * all.
+ *
+ * Usage:
+ * SELECT gin_count_estimate('index_name', 'query');
+ */
+Datum
+gin_count_estimate(PG_FUNCTION_ARGS)
+{
+ text *name = PG_GETARG_TEXT_P(0);
+ Relation index;
+ IndexScanDesc scan;
+ int64 count = 0;
+ char *relname = text_to_cstring(name);
+ ScanKeyData key;
+ TIDBitmap *bitmap = tbm_create(work_mem * 1024L, NULL);
+
+ index = gin_index_open(makeRangeVarFromNameList(stringToQualifiedNameList(relname)));
+
+ if (index->rd_opcintype[0] != TSVECTOROID)
+ {
+ index_close(index, AccessShareLock);
+ elog(ERROR, "column type is not a tsvector");
+ }
+
+ key.sk_flags = 0;
+ key.sk_attno = 1;
+ key.sk_strategy = TSearchStrategyNumber;
+ key.sk_subtype = 0;
+ key.sk_argument = PG_GETARG_DATUM(1);
+
+ fmgr_info(F_TS_MATCH_VQ, &key.sk_func);
+
+ scan = index_beginscan_bitmap(index, SnapshotSelf, 1);
+ index_rescan(scan, &key, 1, NULL, 0);
+
+ count = index_getbitmap(scan, bitmap);
+ tbm_free(bitmap);
+
+ pfree(relname);
+
+ index_endscan(scan);
+ index_close(index, AccessShareLock);
+
+ PG_RETURN_INT64(count);
+}
+
+/*
+ * gin_stat
+ * Prints various stats about index internals.
+ *
+ * Usage:
+ * SELECT * FROM gin_stat('gin_idx') as t(value int, nrow int);
+ */
+Datum
+gin_stats(PG_FUNCTION_ARGS)
+{
+ text *name = PG_GETARG_TEXT_P(0);
+ RangeVar *relvar;
+ Relation index;
+ BlockNumber blkno;
+ char res[1024];
+ uint32 totalPages,
+ deletedPages = 0,
+ emptyDataPages = 0,
+ entryPages = 0,
+ dataPages = 0,
+ dataInnerPages = 0,
+ dataLeafPages = 0,
+ entryInnerPages = 0,
+ entryLeafPages = 0;
+
+ uint64 dataInnerFreeSpace = 0,
+ dataLeafFreeSpace = 0,
+ dataInnerTuplesCount = 0,
+ dataLeafIptrsCount = 0,
+ entryInnerFreeSpace = 0,
+ entryLeafFreeSpace = 0,
+ entryInnerTuplesCount = 0,
+ entryLeafTuplesCount = 0,
+ entryPostingSize = 0,
+ entryPostingCount = 0,
+ entryAttrSize = 0;
+
+ relvar = makeRangeVarFromNameList(textToQualifiedNameList(name));
+ index = relation_openrv(relvar, AccessExclusiveLock);
+
+ if (index->rd_rel->relkind != RELKIND_INDEX ||
+ index->rd_rel->relam != GIN_AM_OID)
+ elog(ERROR, "relation \"%s\" is not a GIN index",
+ RelationGetRelationName(index));
+
+ totalPages = RelationGetNumberOfBlocks(index);
+
+ for (blkno = GIN_ROOT_BLKNO; blkno < totalPages; blkno++)
+ {
+ Buffer buffer;
+ Page page;
+ PageHeader header;
+
+ buffer = ReadBuffer(index, blkno);
+ LockBuffer(buffer, BUFFER_LOCK_SHARE);
+
+ page = BufferGetPage(buffer);
+ header = (PageHeader) page;
+
+ if (GinPageIsDeleted(page))
+ {
+ deletedPages++;
+ }
+ else if (GinPageIsData(page))
+ {
+ dataPages++;
+ if (GinPageIsLeaf(page))
+ {
+ ItemPointerData minItem,
+ *ptr;
+ int nlist;
+
+
+ dataLeafPages++;
+ dataLeafFreeSpace += header->pd_upper - header->pd_lower;
+ ItemPointerSetMin(&minItem);
+
+ ptr = GinDataLeafPageGetItems(page, &nlist, minItem);
+
+ if (ptr)
+ {
+ pfree(ptr);
+ dataLeafIptrsCount += nlist;
+ }
+ else
+ emptyDataPages++;
+ }
+ else
+ {
+ dataInnerPages++;
+ dataInnerFreeSpace += header->pd_upper - header->pd_lower;
+ dataInnerTuplesCount += GinPageGetOpaque(page)->maxoff;
+ }
+ }
+ else
+ {
+ IndexTuple itup;
+ OffsetNumber i,
+ maxoff;
+
+ maxoff = PageGetMaxOffsetNumber(page);
+
+ entryPages++;
+ if (GinPageIsLeaf(page))
+ {
+ entryLeafPages++;
+ entryLeafFreeSpace += header->pd_upper - header->pd_lower;
+ entryLeafTuplesCount += maxoff;
+ }
+ else
+ {
+ entryInnerPages++;
+ entryInnerFreeSpace += header->pd_upper - header->pd_lower;
+ entryInnerTuplesCount += maxoff;
+ }
+
+ for (i = 1; i <= maxoff; i++)
+ {
+ itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, i));
+
+ if (GinPageIsLeaf(page))
+ {
+ GinPostingList *list = (GinPostingList *) GinGetPosting(itup);
+
+ entryPostingCount += GinGetNPosting(itup);
+ entryPostingSize += SizeOfGinPostingList(list);
+ entryAttrSize += GinGetPostingOffset(itup) -
+ IndexInfoFindDataOffset((itup)->t_info);
+ }
+ else
+ {
+ entryAttrSize += IndexTupleSize(itup) -
+ IndexInfoFindDataOffset((itup)->t_info);
+ }
+ }
+ }
+
+ UnlockReleaseBuffer(buffer);
+ }
+
+ index_close(index, AccessExclusiveLock);
+ totalPages--;
+
+ snprintf(res, sizeof(res),
+ "totalPages: %u\n"
+ "deletedPages: %u\n"
+ "emptyDataPages: %u\n"
+ "dataPages: %u\n"
+ "dataInnerPages: %u\n"
+ "dataLeafPages: %u\n"
+ "dataInnerFreeSpace: " INT64_FORMAT "\n"
+ "dataLeafFreeSpace: " INT64_FORMAT "\n"
+ "dataInnerTuplesCount: " INT64_FORMAT "\n"
+ "dataLeafIptrsCount: " INT64_FORMAT "\n"
+ "entryPages: %u\n"
+ "entryInnerPages: %u\n"
+ "entryLeafPages: %u\n"
+ "entryInnerFreeSpace: " INT64_FORMAT "\n"
+ "entryLeafFreeSpace: " INT64_FORMAT "\n"
+ "entryInnerTuplesCount: " INT64_FORMAT "\n"
+ "entryLeafTuplesCount: " INT64_FORMAT "\n"
+ "entryPostingSize: " INT64_FORMAT "\n"
+ "entryPostingCount: " INT64_FORMAT "\n"
+ "entryAttrSize: " INT64_FORMAT "\n"
+ ,
+ totalPages,
+ deletedPages,
+ emptyDataPages,
+ dataPages,
+ dataInnerPages,
+ dataLeafPages,
+ dataInnerFreeSpace,
+ dataLeafFreeSpace,
+ dataInnerTuplesCount,
+ dataLeafIptrsCount,
+ entryPages,
+ entryInnerPages,
+ entryLeafPages,
+ entryInnerFreeSpace,
+ entryLeafFreeSpace,
+ entryInnerTuplesCount,
+ entryLeafTuplesCount,
+ entryPostingSize,
+ entryPostingCount,
+ entryAttrSize
+ );
+
+ PG_RETURN_TEXT_P(CStringGetTextDatum(res));
}
diff --git a/contrib/pageinspect/gistfuncs.c b/contrib/pageinspect/gistfuncs.c
new file mode 100644
index 0000000..4cb7af5
--- /dev/null
+++ b/contrib/pageinspect/gistfuncs.c
@@ -0,0 +1,509 @@
+/*
+ * gistfuncs.c
+ * Functions to investigate the content of GiST indexes
+ *
+ * Source code is based on Gevel module available at
+ * (http://www.sai.msu.su/~megera/oddmuse/index.cgi/Gevel)
+ * Originally developed by:
+ * - Oleg Bartunov <oleg@sai.msu.su>, Moscow, Moscow University, Russia
+ * - Teodor Sigaev <teodor@sigaev.ru>, Moscow, Moscow University, Russia
+ *
+ * Copyright (c) 2017, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * contrib/pageinspect/gistfuncs.c
+ */
+
+#include "postgres.h"
+
+#include "access/gist_private.h"
+#include "access/relscan.h"
+#include "catalog/namespace.h"
+#include "catalog/pg_am.h"
+#include "catalog/pg_type.h"
+#include "funcapi.h"
+#include "utils/builtins.h"
+#include "utils/lsyscache.h"
+#include "utils/regproc.h"
+
+#define PAGESIZE (BLCKSZ - MAXALIGN(sizeof(PageHeaderData) + \
+ sizeof(ItemIdData)))
+
+/*
+ * For GiST tree dumping.
+ */
+typedef struct
+{
+ int maxlevel; /* Max level of tree to look through. */
+ text *txt;
+ char *ptr;
+ int len;
+} IdxInfo;
+
+/*
+ * For GiST tree traversal and statistics collection.
+ */
+typedef struct
+{
+ int level;
+ int numpages;
+ int numleafpages;
+ int numtuple;
+ int numinvalidtuple;
+ int numleaftuple;
+ uint64 tuplesize;
+ uint64 leaftuplesize;
+ uint64 totalsize;
+} IdxStat;
+
+/*
+ * GiST page.
+ */
+typedef struct GPItem
+{
+ Buffer buffer;
+ Page page;
+ OffsetNumber offset;
+ int level;
+ struct GPItem *next;
+} GPItem;
+
+typedef struct
+{
+ List *relname_list;
+ RangeVar *relvar;
+ Relation index;
+ Datum *dvalues;
+ bool *nulls;
+ GPItem *item;
+} TypeStorage;
+
+
+PG_FUNCTION_INFO_V1(gist_stats);
+PG_FUNCTION_INFO_V1(gist_tree);
+PG_FUNCTION_INFO_V1(gist_print);
+
+
+static Relation
+gist_index_open(RangeVar *relvar)
+{
+ Oid relOid = RangeVarGetRelid(relvar, NoLock, false);
+ Relation r = index_open(relOid, AccessExclusiveLock);
+
+ if (r->rd_index == NULL)
+ elog(ERROR, "relation %s.%s is not an index",
+ get_namespace_name(RelationGetNamespace(r)),
+ RelationGetRelationName(r)
+ );
+
+ if (r->rd_rel->relam != GIST_AM_OID)
+ elog(ERROR, "index %s.%s has wrong type",
+ get_namespace_name(RelationGetNamespace(r)),
+ RelationGetRelationName(r)
+ );
+
+ return r;
+}
+
+/* open_gp_page
+ * Opens GiST page.
+ */
+static GPItem *
+open_gp_page(FuncCallContext *funcctx, BlockNumber blk)
+{
+ GPItem *nitem;
+ MemoryContext oldcontext;
+ Relation index = ((TypeStorage *) (funcctx->user_fctx))->index;
+
+ oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
+ nitem = (GPItem *) palloc(sizeof(GPItem));
+ memset(nitem, 0, sizeof(GPItem));
+
+ nitem->buffer = ReadBuffer(index, blk);
+ nitem->page = (Page) BufferGetPage(nitem->buffer);
+ nitem->offset = FirstOffsetNumber;
+ nitem->next = ((TypeStorage *) (funcctx->user_fctx))->item;
+ nitem->level = (nitem->next) ? nitem->next->level + 1 : 1;
+ ((TypeStorage *) (funcctx->user_fctx))->item = nitem;
+
+ MemoryContextSwitchTo(oldcontext);
+ return nitem;
+}
+
+/*
+ * close_gp_page
+ * Close GiST page.
+ */
+static GPItem *
+close_gp_page(FuncCallContext *funcctx)
+{
+ GPItem *oitem = ((TypeStorage *) (funcctx->user_fctx))->item;
+
+ ((TypeStorage *) (funcctx->user_fctx))->item = oitem->next;
+
+ ReleaseBuffer(oitem->buffer);
+ pfree(oitem);
+ return ((TypeStorage *) (funcctx->user_fctx))->item;
+}
+
+/*
+ * gist_stattree
+ * Traverses GiST tree and collects statistics.
+ */
+static void
+gist_stattree(Relation r, int level, BlockNumber blk, OffsetNumber coff,
+ IdxStat * info)
+{
+ Buffer buffer;
+ Page page;
+ IndexTuple which;
+ ItemId iid;
+ OffsetNumber i,
+ maxoff;
+ BlockNumber cblk;
+ char *pred;
+
+ pred = (char *) palloc(sizeof(char) * level * 4 + 1);
+ MemSet(pred, ' ', level * 4);
+ pred[level * 4] = '\0';
+
+ buffer = ReadBuffer(r, blk);
+ page = (Page) BufferGetPage(buffer);
+
+ maxoff = PageGetMaxOffsetNumber(page);
+
+ info->numpages++;
+ info->tuplesize += PAGESIZE - PageGetFreeSpace(page);
+ info->totalsize += BLCKSZ;
+ info->numtuple += maxoff;
+ if (info->level < level)
+ info->level = level;
+
+ if (GistPageIsLeaf(page))
+ {
+ info->numleafpages++;
+ info->leaftuplesize += PAGESIZE - PageGetFreeSpace(page);
+ info->numleaftuple += maxoff;
+ }
+ else
+ {
+ for (i = FirstOffsetNumber; i <= maxoff; i = OffsetNumberNext(i))
+ {
+ iid = PageGetItemId(page, i);
+ which = (IndexTuple) PageGetItem(page, iid);
+ if (GistTupleIsInvalid(which))
+ info->numinvalidtuple++;
+ cblk = ItemPointerGetBlockNumber(&(which->t_tid));
+ gist_stattree(r, level + 1, cblk, i, info);
+ }
+ }
+
+ ReleaseBuffer(buffer);
+ pfree(pred);
+}
+
+/*
+ * gist_dumptree
+ * Recursively prints GiST tree.
+ */
+static void
+gist_dumptree(Relation r, int level, BlockNumber blk, OffsetNumber coff,
+ IdxInfo *info)
+{
+ Buffer buffer;
+ Page page;
+ IndexTuple which;
+ ItemId iid;
+ OffsetNumber i,
+ maxoff;
+ BlockNumber cblk;
+ char *pred;
+
+ pred = (char *) palloc(sizeof(char) * level * 4 + 1);
+ MemSet(pred, ' ', level * 4);
+ pred[level * 4] = '\0';
+
+ buffer = ReadBuffer(r, blk);
+ page = (Page) BufferGetPage(buffer);
+
+ maxoff = PageGetMaxOffsetNumber(page);
+
+
+ while ((info->ptr - ((char *) info->txt)) + level * 4 + 128 >= info->len)
+ {
+ int dist = info->ptr - ((char *) info->txt);
+
+ info->len *= 2;
+ info->txt = (text *) repalloc(info->txt, info->len);
+ info->ptr = ((char *) info->txt) + dist;
+ }
+
+ sprintf(info->ptr,
+ "%s%d(l:%d) blk: %u numTuple: %d free: %db(%.2f%%) rightlink:%u (%s)\n",
+ pred,
+ coff,
+ level,
+ blk,
+ (int) maxoff,
+ (int) PageGetFreeSpace(page),
+ 100.0 * (((float) PAGESIZE) - (float) PageGetFreeSpace(page)) /
+ ((float) PAGESIZE),
+ GistPageGetOpaque(page)->rightlink,
+ (GistPageGetOpaque(page)->rightlink == InvalidBlockNumber) ?
+ "InvalidBlockNumber" : "OK");
+ info->ptr = strchr(info->ptr, '\0');
+
+ if (!GistPageIsLeaf(page) && (info->maxlevel < 0 || level < info->maxlevel))
+ for (i = FirstOffsetNumber; i <= maxoff; i = OffsetNumberNext(i))
+ {
+ iid = PageGetItemId(page, i);
+ which = (IndexTuple) PageGetItem(page, iid);
+ cblk = ItemPointerGetBlockNumber(&(which->t_tid));
+ gist_dumptree(r, level + 1, cblk, i, info);
+ }
+ ReleaseBuffer(buffer);
+ pfree(pred);
+}
+
+/*
+ * setup_firstcall
+ * Initialization for first call of SRF.
+ */
+static void
+setup_firstcall(FuncCallContext *funcctx, text *name)
+{
+ MemoryContext oldcontext;
+ TypeStorage *st;
+ char *relname = text_to_cstring(name);
+ TupleDesc tupdesc;
+ char attname[NAMEDATALEN];
+ int i;
+
+ oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
+
+ st = (TypeStorage *) palloc(sizeof(TypeStorage));
+ memset(st, 0, sizeof(TypeStorage));
+ st->relname_list = stringToQualifiedNameList(relname);
+ st->relvar = makeRangeVarFromNameList(st->relname_list);
+ st->index = gist_index_open(st->relvar);
+ funcctx->user_fctx = (void *) st;
+
+ tupdesc = CreateTemplateTupleDesc(st->index->rd_att->natts + 2, false);
+ TupleDescInitEntry(tupdesc, 1, "level", INT4OID, -1, 0);
+ TupleDescInitEntry(tupdesc, 2, "valid", BOOLOID, -1, 0);
+ for (i = 0; i < st->index->rd_att->natts; i++)
+ {
+ sprintf(attname, "z%d", i + 2);
+ TupleDescInitEntry(
+ tupdesc,
+ i + 3,
+ attname,
+ TupleDescAttr(st->index->rd_att, i)->atttypid,
+ TupleDescAttr(st->index->rd_att, i)->atttypmod,
+ TupleDescAttr(st->index->rd_att, i)->attndims
+ );
+ }
+
+ st->dvalues = (Datum *) palloc((tupdesc->natts + 2) * sizeof(Datum));
+ st->nulls = (bool *) palloc((tupdesc->natts + 2) * sizeof(*st->nulls));
+
+ funcctx->slot = TupleDescGetSlot(tupdesc);
+ funcctx->attinmeta = TupleDescGetAttInMetadata(tupdesc);
+
+ MemoryContextSwitchTo(oldcontext);
+ pfree(relname);
+
+ st->item = open_gp_page(funcctx, GIST_ROOT_BLKNO);
+}
+
+/*
+ * close_call
+ * Clean up before SRF returns.
+ */
+static void
+close_call(FuncCallContext *funcctx)
+{
+ TypeStorage *st = (TypeStorage *) (funcctx->user_fctx);
+
+ while (st->item && close_gp_page(funcctx));
+
+ pfree(st->dvalues);
+ pfree(st->nulls);
+
+ index_close(st->index, AccessExclusiveLock);
+}
+
+/*
+ * gist_stats
+ * Returns statistics about GiST tree.
+ *
+ * Usage:
+ * select gist_stats('pix');
+ */
+Datum
+gist_stats(PG_FUNCTION_ARGS)
+{
+ text *name = PG_GETARG_TEXT_P(0);
+ char *relname = text_to_cstring(name);
+ RangeVar *relvar;
+ Relation index;
+ List *relname_list;
+ IdxStat info;
+ text *out = (text *) palloc(1024);
+ char *ptr = ((char *) out) + VARHDRSZ;
+
+
+ relname_list = stringToQualifiedNameList(relname);
+ relvar = makeRangeVarFromNameList(relname_list);
+ index = gist_index_open(relvar);
+ PG_FREE_IF_COPY(name, 0);
+
+ memset(&info, 0, sizeof(IdxStat));
+
+ gist_stattree(index, 0, GIST_ROOT_BLKNO, 0, &info);
+
+ index_close(index, AccessExclusiveLock);
+ pfree(relname);
+
+ sprintf(ptr,
+ "Number of levels: %d\n"
+ "Number of pages: %d\n"
+ "Number of leaf pages: %d\n"
+ "Number of tuples: %d\n"
+ "Number of invalid tuples: %d\n"
+ "Number of leaf tuples: %d\n"
+ "Total size of tuples: " INT64_FORMAT " bytes\n"
+ "Total size of leaf tuples: " INT64_FORMAT " bytes\n"
+ "Total size of index: " INT64_FORMAT " bytes\n",
+ info.level + 1,
+ info.numpages,
+ info.numleafpages,
+ info.numtuple,
+ info.numinvalidtuple,
+ info.numleaftuple,
+ info.tuplesize,
+ info.leaftuplesize,
+ info.totalsize);
+
+ ptr = strchr(ptr, '\0');
+
+ SET_VARSIZE(out, ptr - ((char *) out));
+ PG_RETURN_POINTER(out);
+}
+
+/*
+ * gist_tree
+ * Show GiST tree.
+ *
+ * Usage:
+ * SELECT gist_tree('gist_idx');
+ */
+Datum
+gist_tree(PG_FUNCTION_ARGS)
+{
+ text *name = PG_GETARG_TEXT_P(0);
+ char *relname = text_to_cstring(name);
+ RangeVar *relvar;
+ Relation index;
+ List *relname_list;
+ IdxInfo info;
+
+ relname_list = stringToQualifiedNameList(relname);
+ relvar = makeRangeVarFromNameList(relname_list);
+ index = gist_index_open(relvar);
+ PG_FREE_IF_COPY(name, 0);
+
+ info.maxlevel = (PG_NARGS() > 1) ? PG_GETARG_INT32(1) : -1;
+ info.len = 1024;
+ info.txt = (text *) palloc(info.len);
+ info.ptr = ((char *) info.txt) + VARHDRSZ;
+
+ gist_dumptree(index, 0, GIST_ROOT_BLKNO, 0, &info);
+
+ index_close(index, AccessExclusiveLock);
+ pfree(relname);
+
+ SET_VARSIZE(info.txt, info.ptr - ((char *) info.txt));
+ PG_RETURN_POINTER(info.txt);
+}
+
+/*
+ * gist_print
+ * Prints objects stored in GiST tree, works only if objects in index have
+ * textual representation (type_out functions should be implemented for
+ * given object type).
+ *
+ * Usage:
+ * SELECT * FROM gist_print('gist_idx') as t(level int, valid bool, a box);
+ */
+Datum
+gist_print(PG_FUNCTION_ARGS)
+{
+ FuncCallContext *funcctx;
+ TypeStorage *st;
+ Datum result = (Datum) 0;
+ ItemId iid;
+ IndexTuple ituple;
+ HeapTuple htuple;
+ int i;
+ bool isnull;
+
+ if (SRF_IS_FIRSTCALL())
+ {
+ text *name = PG_GETARG_TEXT_P(0);
+
+ funcctx = SRF_FIRSTCALL_INIT();
+ setup_firstcall(funcctx, name);
+ PG_FREE_IF_COPY(name, 0);
+ }
+
+ funcctx = SRF_PERCALL_SETUP();
+ st = (TypeStorage *) (funcctx->user_fctx);
+
+ if (!st->item)
+ {
+ close_call(funcctx);
+ SRF_RETURN_DONE(funcctx);
+ }
+
+ while (st->item->offset > PageGetMaxOffsetNumber(st->item->page))
+ {
+ if (!close_gp_page(funcctx))
+ {
+ close_call(funcctx);
+ SRF_RETURN_DONE(funcctx);
+ }
+ }
+
+ iid = PageGetItemId(st->item->page, st->item->offset);
+ ituple = (IndexTuple) PageGetItem(st->item->page, iid);
+
+ st->dvalues[0] = Int32GetDatum(st->item->level);
+ st->nulls[0] = false;
+ st->dvalues[1] = BoolGetDatum(GistPageIsLeaf(st->item->page) ||
+ !GistTupleIsInvalid(ituple));
+ st->nulls[1] = false;
+ for (i = 2; i < funcctx->attinmeta->tupdesc->natts; i++)
+ {
+ if (!GistPageIsLeaf(st->item->page) && GistTupleIsInvalid(ituple))
+ {
+ st->dvalues[i] = (Datum) 0;
+ st->nulls[i] = true;
+ }
+ else
+ {
+ st->dvalues[i] = index_getattr(ituple, i - 1, st->index->rd_att,
+ &isnull);
+ st->nulls[i] = isnull;
+ }
+ }
+
+ htuple = heap_form_tuple(funcctx->attinmeta->tupdesc, st->dvalues,
+ st->nulls);
+ result = TupleGetDatum(funcctx->slot, htuple);
+ st->item->offset = OffsetNumberNext(st->item->offset);
+ if (!GistPageIsLeaf(st->item->page))
+ open_gp_page(funcctx, ItemPointerGetBlockNumber(&(ituple->t_tid)));
+
+ SRF_RETURN_NEXT(funcctx, result);
+}
diff --git a/contrib/pageinspect/hashfuncs.c b/contrib/pageinspect/hashfuncs.c
index dbe3b6a..9597631 100644
--- a/contrib/pageinspect/hashfuncs.c
+++ b/contrib/pageinspect/hashfuncs.c
@@ -14,8 +14,8 @@
#include "access/hash.h"
#include "access/htup_details.h"
-#include "catalog/pg_type.h"
#include "catalog/pg_am.h"
+#include "catalog/pg_type.h"
#include "funcapi.h"
#include "miscadmin.h"
#include "utils/builtins.h"
diff --git a/contrib/pageinspect/pageinspect--1.6--1.7.sql b/contrib/pageinspect/pageinspect--1.6--1.7.sql
new file mode 100644
index 0000000..fc9d096
--- /dev/null
+++ b/contrib/pageinspect/pageinspect--1.6--1.7.sql
@@ -0,0 +1,57 @@
+/* contrib/pageinspect/pageinspect--1.6--1.7.sql */
+
+-- complain if script is sourced in psql, rather than via ALTER EXTENSION
+\echo Use "ALTER EXTENSION pageinspect UPDATE TO '1.7'" to load this file. \quit
+
+-- GiST
+CREATE FUNCTION gist_stats(text)
+RETURNS text
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT;
+
+CREATE FUNCTION gist_tree(text)
+RETURNS text
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT;
+
+CREATE FUNCTION gist_tree(text, int4)
+RETURNS text
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT;
+
+CREATE FUNCTION gist_print(text)
+RETURNS SETOF record
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT;
+
+-- SP-GiST
+CREATE FUNCTION spgist_stats(text)
+RETURNS text
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT;
+
+CREATE FUNCTION spgist_print(text)
+RETURNS SETOF record
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT;
+
+-- GIN
+CREATE FUNCTION gin_value_count(text)
+RETURNS SETOF record
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT;
+
+CREATE FUNCTION gin_value_count(text, int)
+RETURNS SETOF record
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT;
+
+CREATE FUNCTION gin_stats(text)
+RETURNS text
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT;
+
+CREATE FUNCTION gin_count_estimate(text, tsquery)
+RETURNS bigint
+AS 'MODULE_PATHNAME'
+LANGUAGE C STRICT;
diff --git a/contrib/pageinspect/pageinspect.control b/contrib/pageinspect/pageinspect.control
index 1a61c9f..dcfc61f 100644
--- a/contrib/pageinspect/pageinspect.control
+++ b/contrib/pageinspect/pageinspect.control
@@ -1,5 +1,5 @@
# pageinspect extension
comment = 'inspect the contents of database pages at a low level'
-default_version = '1.6'
+default_version = '1.7'
module_pathname = '$libdir/pageinspect'
relocatable = true
diff --git a/contrib/pageinspect/spgistfuncs.c b/contrib/pageinspect/spgistfuncs.c
new file mode 100644
index 0000000..02ebde3
--- /dev/null
+++ b/contrib/pageinspect/spgistfuncs.c
@@ -0,0 +1,439 @@
+/*
+ * spgistfuncs.c
+ * Functions to investigate the content of SP-GiST indexes
+ *
+ * Source code is based on Gevel module available at
+ * (http://www.sai.msu.su/~megera/oddmuse/index.cgi/Gevel)
+ * Originally developed by:
+ * - Oleg Bartunov <oleg@sai.msu.su>, Moscow, Moscow University, Russia
+ * - Teodor Sigaev <teodor@sigaev.ru>, Moscow, Moscow University, Russia
+ *
+ * Copyright (c) 2017, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * contrib/pageinspect/spgistfuncs.c
+ */
+
+#include "postgres.h"
+
+#include "access/gist_private.h"
+#include "access/spgist_private.h"
+#include "access/relscan.h"
+#include "catalog/namespace.h"
+#include "catalog/pg_am.h"
+#include "catalog/pg_type.h"
+#include "funcapi.h"
+#include "miscadmin.h"
+#include "utils/builtins.h"
+#include "utils/datum.h"
+#include "utils/varlena.h"
+
+typedef struct SPGistPrintStackElem
+{
+ ItemPointerData iptr;
+ int16 nlabel;
+ int level;
+} SPGistPrintStackElem;
+
+typedef struct SPGistPrint
+{
+ SpGistState state;
+ Relation index;
+ Datum dvalues[8 /* see CreateTemplateTupleDesc call */ ];
+ bool nulls[8 /* see CreateTemplateTupleDesc call */ ];
+ List *stack;
+} SPGistPrint;
+
+#define IsIndex(r) ((r)->rd_rel->relkind == RELKIND_INDEX)
+#define IsSpGist(r) ((r)->rd_rel->relam == SPGIST_AM_OID)
+
+static void
+pushSPGistPrint(FuncCallContext *funcctx, SPGistPrint * prst, ItemPointer ip,
+ int level)
+{
+ MemoryContext oldcontext;
+ SPGistPrintStackElem *e;
+
+ oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
+
+ e = palloc(sizeof(*e));
+ e->iptr = *ip;
+ e->nlabel = 0;
+ e->level = level;
+ prst->stack = lcons(e, prst->stack);
+
+ MemoryContextSwitchTo(oldcontext);
+}
+
+static void
+close_spgist_print(SPGistPrint * prst)
+{
+ index_close(prst->index, AccessExclusiveLock);
+}
+
+PG_FUNCTION_INFO_V1(spgist_stats);
+PG_FUNCTION_INFO_V1(spgist_print);
+
+/*
+ * spgist_stats
+ * Show statistics about SP-GiST tree.
+ *
+ * Usage:
+ * SELECT spgist_stats('spgist_idx');
+ */
+Datum
+spgist_stats(PG_FUNCTION_ARGS)
+{
+ text *name = PG_GETARG_TEXT_P(0);
+ RangeVar *relvar;
+ Relation index;
+ BlockNumber blkno;
+ BlockNumber totalPages = 0,
+ innerPages = 0,
+ leafPages = 0,
+ emptyPages = 0,
+ deletedPages = 0;
+ double usedSpace = 0.0,
+ usedLeafSpace = 0.0,
+ usedInnerSpace = 0.0;
+ char res[1024];
+ int bufferSize = -1;
+ int64 innerTuples = 0,
+ leafTuples = 0,
+ nAllTheSame = 0,
+ nLeafPlaceholder = 0,
+ nInnerPlaceholder = 0,
+ nLeafRedirect = 0,
+ nInnerRedirect = 0;
+
+ relvar = makeRangeVarFromNameList(textToQualifiedNameList(name));
+ index = relation_openrv(relvar, AccessExclusiveLock);
+
+ if (!IsIndex(index) || !IsSpGist(index))
+ elog(ERROR, "relation \"%s\" is not an SPGiST index",
+ RelationGetRelationName(index));
+
+ totalPages = RelationGetNumberOfBlocks(index);
+
+ for (blkno = SPGIST_ROOT_BLKNO; blkno < totalPages; blkno++)
+ {
+ Buffer buffer;
+ Page page;
+ int pageFree;
+
+ buffer = ReadBuffer(index, blkno);
+ LockBuffer(buffer, BUFFER_LOCK_SHARE);
+
+ page = BufferGetPage(buffer);
+
+ if (PageIsNew(page) || SpGistPageIsDeleted(page))
+ {
+ deletedPages++;
+ UnlockReleaseBuffer(buffer);
+ continue;
+ }
+
+ if (SpGistPageIsLeaf(page))
+ {
+ leafPages++;
+ leafTuples += PageGetMaxOffsetNumber(page);
+ nLeafPlaceholder += SpGistPageGetOpaque(page)->nPlaceholder;
+ nLeafRedirect += SpGistPageGetOpaque(page)->nRedirection;
+ }
+ else
+ {
+ int i,
+ max;
+
+ innerPages++;
+ max = PageGetMaxOffsetNumber(page);
+ innerTuples += max;
+ nInnerPlaceholder += SpGistPageGetOpaque(page)->nPlaceholder;
+ nInnerRedirect += SpGistPageGetOpaque(page)->nRedirection;
+ for (i = FirstOffsetNumber; i <= max; i++)
+ {
+ SpGistInnerTuple it;
+
+ it = (SpGistInnerTuple) PageGetItem(page,
+ PageGetItemId(page, i));
+ if (it->allTheSame)
+ nAllTheSame++;
+ }
+ }
+
+ if (bufferSize < 0)
+ bufferSize = BufferGetPageSize(buffer)
+ - MAXALIGN(sizeof(SpGistPageOpaqueData))
+ - SizeOfPageHeaderData;
+
+ pageFree = PageGetExactFreeSpace(page);
+
+ usedSpace += bufferSize - pageFree;
+ if (SpGistPageIsLeaf(page))
+ usedLeafSpace += bufferSize - pageFree;
+ else
+ usedInnerSpace += bufferSize - pageFree;
+
+ if (pageFree == bufferSize)
+ emptyPages++;
+
+ UnlockReleaseBuffer(buffer);
+ }
+
+ index_close(index, AccessExclusiveLock);
+
+ totalPages--; /* discount metapage */
+
+ snprintf(res, sizeof(res),
+ "totalPages: %u\n"
+ "deletedPages: %u\n"
+ "innerPages: %u\n"
+ "leafPages: %u\n"
+ "emptyPages: %u\n"
+ "usedSpace: %.2f kbytes\n"
+ "usedInnerSpace: %.2f kbytes\n"
+ "usedLeafSpace: %.2f kbytes\n"
+ "freeSpace: %.2f kbytes\n"
+ "fillRatio: %.2f%%\n"
+ "leafTuples: " INT64_FORMAT "\n"
+ "innerTuples: " INT64_FORMAT "\n"
+ "innerAllTheSame: " INT64_FORMAT "\n"
+ "leafPlaceholders: " INT64_FORMAT "\n"
+ "innerPlaceholders: " INT64_FORMAT "\n"
+ "leafRedirects: " INT64_FORMAT "\n"
+ "innerRedirects: " INT64_FORMAT,
+ totalPages, deletedPages, innerPages, leafPages, emptyPages,
+ usedSpace / 1024.0,
+ usedInnerSpace / 1024.0,
+ usedLeafSpace / 1024.0,
+ (((double) bufferSize) * ((double) totalPages) - usedSpace) / 1024,
+ 100.0 * (usedSpace / (((double) bufferSize) * ((double) totalPages))),
+ leafTuples, innerTuples, nAllTheSame,
+ nLeafPlaceholder, nInnerPlaceholder,
+ nLeafRedirect, nInnerRedirect);
+
+ PG_RETURN_TEXT_P(CStringGetTextDatum(res));
+}
+
+/*
+ * spgist_print
+ * Prints objects stored in GiST tree, works only if objects in index have
+ * textual representation (type_out functions should be implemented for the
+ * given object type).
+ */
+Datum
+spgist_print(PG_FUNCTION_ARGS)
+{
+ FuncCallContext *funcctx;
+ SPGistPrint *prst;
+ SPGistPrintStackElem *s;
+ HeapTuple htuple;
+ Datum result;
+ MemoryContext oldcontext;
+
+ if (SRF_IS_FIRSTCALL())
+ {
+ text *name = PG_GETARG_TEXT_P(0);
+ RangeVar *relvar;
+ Relation index;
+ ItemPointerData ipd;
+ TupleDesc tupdesc;
+
+ funcctx = SRF_FIRSTCALL_INIT();
+ relvar = makeRangeVarFromNameList(textToQualifiedNameList(name));
+ index = relation_openrv(relvar, AccessExclusiveLock);
+
+ if (!IsIndex(index) || !IsSpGist(index))
+ elog(ERROR, "relation \"%s\" is not an SPGiST index",
+ RelationGetRelationName(index));
+
+ oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
+
+ prst = palloc(sizeof(*prst));
+
+ prst->index = index;
+ initSpGistState(&prst->state, index);
+
+ tupdesc = CreateTemplateTupleDesc(3 /* types */ + 1 /* level */ +
+ 1 /* nlabel */ + 2 /* tids */ +
+ 1, false);
+ TupleDescInitEntry(tupdesc, 1, "tid", TIDOID, -1, 0);
+ TupleDescInitEntry(tupdesc, 2, "allthesame", BOOLOID, -1, 0);
+ TupleDescInitEntry(tupdesc, 3, "node", INT4OID, -1, 0);
+ TupleDescInitEntry(tupdesc, 4, "level", INT4OID, -1, 0);
+ TupleDescInitEntry(tupdesc, 5, "tid_pointer", TIDOID, -1, 0);
+ TupleDescInitEntry(tupdesc, 6, "prefix",
+ (prst->state.attPrefixType.type == VOIDOID) ? INT4OID
+ : prst->state.attPrefixType.type,
+ -1, 0);
+ TupleDescInitEntry(tupdesc, 7, "label",
+ (prst->state.attLabelType.type == VOIDOID) ? INT4OID
+ : prst->state.attLabelType.type,
+ -1, 0);
+ TupleDescInitEntry(tupdesc, 8, "leaf",
+ (prst->state.attType.type == VOIDOID) ? INT4OID
+ : prst->state.attType.type,
+ -1, 0);
+
+ funcctx->slot = TupleDescGetSlot(tupdesc);
+ funcctx->attinmeta = TupleDescGetAttInMetadata(tupdesc);
+
+ funcctx->user_fctx = (void *) prst;
+
+ MemoryContextSwitchTo(oldcontext);
+
+ ItemPointerSet(&ipd, SPGIST_ROOT_BLKNO, FirstOffsetNumber);
+ prst->stack = NIL;
+ pushSPGistPrint(funcctx, prst, &ipd, 1);
+
+ PG_FREE_IF_COPY(name, 0);
+ }
+
+ funcctx = SRF_PERCALL_SETUP();
+ prst = (SPGistPrint *) (funcctx->user_fctx);
+
+next:
+ for (;;)
+ {
+ if (prst->stack == NIL)
+ {
+ close_spgist_print(prst);
+ SRF_RETURN_DONE(funcctx);
+ }
+
+ CHECK_FOR_INTERRUPTS();
+
+ s = (SPGistPrintStackElem *) linitial(prst->stack);
+ prst->stack = list_delete_first(prst->stack);
+
+ if (ItemPointerIsValid(&s->iptr))
+ break;
+ free(s);
+ }
+
+ do
+ {
+ Buffer buffer;
+ Page page;
+ SpGistDeadTuple dtuple;
+ ItemPointer tid;
+
+ buffer = ReadBuffer(prst->index, ItemPointerGetBlockNumber(&s->iptr));
+ LockBuffer(buffer, BUFFER_LOCK_SHARE);
+
+ page = BufferGetPage(buffer);
+ if (ItemPointerGetOffsetNumber(&s->iptr) > PageGetMaxOffsetNumber(page))
+ {
+ UnlockReleaseBuffer(buffer);
+ pfree(s);
+ goto next;
+ }
+
+ dtuple = (SpGistDeadTuple) PageGetItem(page,
+ PageGetItemId(page,
+ ItemPointerGetOffsetNumber(&s->iptr)));
+
+ if (dtuple->tupstate != SPGIST_LIVE)
+ {
+ UnlockReleaseBuffer(buffer);
+ pfree(s);
+ goto next;
+ }
+
+ if (SpGistPageIsLeaf(page))
+ {
+ SpGistLeafTuple leafTuple = (SpGistLeafTuple) dtuple;
+
+ tid = palloc(sizeof(ItemPointerData));
+ *tid = s->iptr;
+ prst->dvalues[0] = PointerGetDatum(tid);
+ prst->nulls[0] = false;
+ prst->nulls[1] = true;
+ prst->nulls[2] = true;
+ prst->dvalues[3] = s->level;
+ prst->nulls[3] = false;
+ prst->nulls[4] = true;
+ prst->nulls[5] = true;
+ prst->nulls[6] = true;
+ prst->dvalues[7] = datumCopy(SGLTDATUM(leafTuple, &prst->state),
+ prst->state.attType.attbyval,
+ prst->state.attType.attlen);
+ prst->nulls[7] = false;
+ }
+ else
+ {
+ SpGistInnerTuple innerTuple = (SpGistInnerTuple) dtuple;
+ int i;
+ SpGistNodeTuple node;
+
+ SGITITERATE(innerTuple, i, node)
+ {
+ if (ItemPointerIsValid(&node->t_tid))
+ {
+ if (i >= s->nlabel)
+ break;
+ }
+ }
+
+ if (i >= innerTuple->nNodes)
+ {
+ UnlockReleaseBuffer(buffer);
+ pfree(s);
+ goto next;
+
+ }
+
+ tid = palloc(sizeof(ItemPointerData));
+ *tid = s->iptr;
+ prst->dvalues[0] = PointerGetDatum(tid);
+ prst->nulls[0] = false;
+ prst->dvalues[1] = innerTuple->allTheSame;
+ prst->nulls[1] = false;
+ prst->dvalues[2] = Int32GetDatum(s->nlabel);
+ prst->nulls[2] = false;
+ prst->dvalues[3] = s->level;
+ prst->nulls[3] = false;
+ tid = palloc(sizeof(ItemPointerData));
+ *tid = node->t_tid;
+ prst->dvalues[4] = PointerGetDatum(tid);
+ prst->nulls[4] = false;
+ if (innerTuple->prefixSize > 0)
+ {
+ prst->dvalues[5] = datumCopy(SGITDATUM(innerTuple, &prst->state),
+ prst->state.attPrefixType.attbyval,
+ prst->state.attPrefixType.attlen);
+ prst->nulls[5] = false;
+ }
+ else
+ prst->nulls[5] = true;
+ if (!IndexTupleHasNulls(node))
+ {
+ prst->dvalues[6] = datumCopy(SGNTDATUM(node, &prst->state),
+ prst->state.attLabelType.attbyval,
+ prst->state.attLabelType.attlen);
+ prst->nulls[6] = false;
+ }
+ else
+ prst->nulls[6] = true;
+ prst->nulls[7] = true;
+
+ pushSPGistPrint(funcctx, prst, &node->t_tid, s->level + 1);
+ s->nlabel = i + 1;
+ oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
+ prst->stack = lcons(s, prst->stack);
+ MemoryContextSwitchTo(oldcontext);
+ s = NULL;
+ }
+
+ UnlockReleaseBuffer(buffer);
+ if (s)
+ pfree(s);
+ } while (0);
+
+ htuple = heap_form_tuple(funcctx->attinmeta->tupdesc,
+ prst->dvalues,
+ prst->nulls);
+ result = TupleGetDatum(funcctx->slot, htuple);
+
+ SRF_RETURN_NEXT(funcctx, result);
+}
diff --git a/contrib/pageinspect/sql/gin.sql b/contrib/pageinspect/sql/gin.sql
index d516ed3..45a136f 100644
--- a/contrib/pageinspect/sql/gin.sql
+++ b/contrib/pageinspect/sql/gin.sql
@@ -17,3 +17,15 @@ SELECT COUNT(*) > 0
FROM gin_leafpage_items(get_raw_page('test1_y_idx',
(pg_relation_size('test1_y_idx') /
current_setting('block_size')::bigint)::int - 1));
+
+\x
+
+CREATE TABLE test__int(a int[]);
+\copy test__int from 'data/test__int.data'
+
+CREATE INDEX gin_idx ON test__int USING gin ( a );
+
+INSERT INTO test__int ( SELECT ARRAY[t] || '{1000}'::_int4 FROM generate_series (1,300) as t );
+INSERT INTO test__int ( SELECT ARRAY[t] || '{1001}'::_int4 FROM generate_series (1,300) as t, generate_series(1,12) );
+VACUUM ANALYZE test__int;
+SELECT * FROM gin_value_count('gin_idx') as t(value int, nrow int);
diff --git a/contrib/pageinspect/sql/gist.sql b/contrib/pageinspect/sql/gist.sql
new file mode 100644
index 0000000..04e7daf
--- /dev/null
+++ b/contrib/pageinspect/sql/gist.sql
@@ -0,0 +1,6 @@
+CREATE TABLE gist_table (t box);
+\copy gist_table from 'data/rect.data'
+
+CREATE INDEX gist_idx ON gist_table USING gist (t);
+
+SELECT gist_stats('gist_idx');
diff --git a/contrib/pageinspect/sql/spgist.sql b/contrib/pageinspect/sql/spgist.sql
new file mode 100644
index 0000000..2bb6ac5
--- /dev/null
+++ b/contrib/pageinspect/sql/spgist.sql
@@ -0,0 +1,11 @@
+CREATE TABLE spgist_table (t box);
+\copy spgist_table from 'data/rect.data'
+
+SELECT center(t) AS p INTO spgist_table_p FROM spgist_table;
+
+CREATE INDEX spgist_idx ON spgist_table_p USING spgist (p);
+CREATE INDEX kdspgist_idx ON spgist_table_p USING spgist (p kd_point_ops);
+
+SELECT spgist_stats('spgist_idx');
+SELECT * FROM spgist_print('kdspgist_idx') as t(tid tid, allthesame bool, node_n int, level int, tid_pointer tid, prefix float8, node_label int, leaf_value point);
+SELECT * FROM spgist_print('spgist_idx') as t(tid tid, allthesame bool, node_n int, level int, tid_pointer tid, prefix point, node_label int, leaf_value point) WHERE level = 1;
diff --git a/doc/src/sgml/pageinspect.sgml b/doc/src/sgml/pageinspect.sgml
index e46f5ca..029832d 100644
--- a/doc/src/sgml/pageinspect.sgml
+++ b/doc/src/sgml/pageinspect.sgml
@@ -484,6 +484,119 @@ test=# SELECT * FROM brin_page_items(get_raw_page('brinidx', 5),
<variablelist>
<varlistentry>
<term>
+ <function>gin_value_count(gin_index text) returns setof record</function>
+ <indexterm>
+ <primary>gin_value_count</primary>
+ </indexterm>
+ </term>
+
+ <listitem>
+ <para>
+ <function>gin_value_count</function> prints estimated counts for each
+ indexed value. The single argument version will return results for the first
+ column of an index. For example:
+<screen>
+test=# SELECT * FROM gin_value_count('gin_idx') as t(value int, nrow int) where nrow > 250;
+ value | nrow
+ -------+------
+ 31 | 254
+ 47 | 251
+ 52 | 257
+ 59 | 259
+</screen>
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>
+ <function>gin_value_count(gin_index text, colnumber int) returns setof record</function>
+ <indexterm>
+ <primary>gin_value_count</primary>
+ </indexterm>
+ </term>
+
+ <listitem>
+ <para>
+ <function>gin_value_count</function> prints estimated counts for each
+ indexed value for a given column (starting form zero). For example:
+<screen>
+test=# SELECT * FROM gin_value_count('gin_idx', 0) as t(value int, nrow int) where nrow > 250;
+ value | nrow
+ -------+------
+ 31 | 254
+ 47 | 251
+ 52 | 257
+ 59 | 259
+</screen>
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>
+ <function>gin_count_estimate(gin_index text, query tsquery) returns bigint</function>
+ <indexterm>
+ <primary>gin_count_estimate</primary>
+ </indexterm>
+ </term>
+
+ <listitem>
+ <para>
+ <function>gin_count_estimate</function> outputs the number of indexed
+ rows matched by a query. It doesn't touch heap at all. For example:
+<screen>
+test=# select gin_count_estimate('qq', 'star');
+ gin_count_estimate
+--------------------
+ 790
+</screen>
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ <varlistentry>
+ <term>
+ <function>gin_stats(gin_index text) returns text</function>
+ <indexterm>
+ <primary>gin_stats</primary>
+ </indexterm>
+ </term>
+
+ <listitem>
+ <para>
+ <function>gin_stats</function> Prints various statistics about index
+ internals. For example:
+<screen>
+test=# SELECT gin_stats('gin_idx');
+ gin_stats
+------------------------------
+ totalPages: 32 +
+ dataPages: 1 +
+ dataInnerPages: 0 +
+ dataLeafPages: 1 +
+ dataInnerFreeSpace: 0 +
+ dataLeafFreeSpace: 4454 +
+ dataInnerTuplesCount: 0 +
+ dataLeafIptrsCount: 3600 +
+ entryPages: 31 +
+ entryInnerPages: 21 +
+ entryLeafPages: 10 +
+ entryInnerFreeSpace: 15160+
+ entryLeafFreeSpace: 32788+
+ entryInnerTuplesCount: 7810 +
+ entryLeafTuplesCount: 305 +
+ entryPostingSize: 42122+
+ entryPostingCount: 96759+
+ entryAttrSize: 64924+
+</screen>
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>
<function>gin_metapage_info(page bytea) returns record</function>
<indexterm>
<primary>gin_metapage_info</primary>
@@ -717,4 +830,281 @@ mapp | {65}
</variablelist>
</sect2>
+ <sect2>
+ <title>GiST Functions</title>
+
+ <variablelist>
+ <varlistentry>
+ <term>
+ <function>gist_stats(indexname text) returns text</function>
+ <indexterm>
+ <primary>gist_stats</primary>
+ </indexterm>
+ </term>
+
+ <listitem>
+ <para>
+ <function>gist_stats</function> returns information about
+ a <acronym>GiST</acronym> index. For example:
+<screen>
+test=# SELECT gist_stats('gist_index');
+ gist_stats
+-----------------------------------------
+ Number of levels: 2 +
+ Number of pages: 29 +
+ Number of leaf pages: 28 +
+ Number of tuples: 3406 +
+ Number of invalid tuples: 0 +
+ Number of leaf tuples: 3378 +
+ Total size of tuples: 143516 bytes+
+ Total size of leaf tuples: 142296 bytes+
+ Total size of index: 237568 bytes+
+</screen>
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>
+ <function>gist_tree(indexname text, maxlevel int4) returns text</function>
+ <indexterm>
+ <primary>gist_tree</primary>
+ </indexterm>
+ </term>
+ <listitem>
+ <para>
+ <function>gist_tree</function> shows <acronym>GiST</acronym> tree up to
+ <parameter>maxlevel</parameter>. For example:
+<screen>
+test=# SELECT gist_tree('gist_index', 0);
+ 0(l:0) blk: 0 numTuple: 29 free: 6888b(15.63%)
+</screen>
+ Designation (from left to right):
+ <itemizedlist>
+ <listitem>
+ <para>0 - page number</para>
+ </listitem>
+ <listitem>
+ <para>(l:0) - tree level</para>
+ </listitem>
+ <listitem>
+ <para>blk: 0 - block number</para>
+ </listitem>
+ <listitem>
+ <para>numTuple: 29 - the number of tuples</para>
+ </listitem>
+ <listitem>
+ <para>free: 6888b - free space in bytes</para>
+ </listitem>
+ <listitem>
+ <para>(15.63%) - occupied space in percents</para>
+ </listitem>
+ </itemizedlist>
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>
+ <function>gist_tree(indexname text) returns text</function>
+ <indexterm>
+ <primary>gist_tree</primary>
+ </indexterm>
+ </term>
+ <listitem>
+ <para>
+ <function>gist_tree</function> shows full <acronym>GiST</acronym> tree.
+ For example:
+<screen>
+test=# SELECT gist_tree('gist_index');
+ 0(l:0) blk: 0 numTuple: 29 free: 6888b(15.63%)
+ 1(l:1) blk: 13 numTuple: 180 free: 244b(97.01%)
+ 2(l:1) blk: 11 numTuple: 175 free: 464b(94.32%)
+ 3(l:1) blk: 2 numTuple: 101 free: 3720b(54.43%)
+ 4(l:1) blk: 17 numTuple: 111 free: 3280b(59.82%)
+ 5(l:1) blk: 18 numTuple: 101 free: 3720b(54.43%)
+ 6(l:1) blk: 10 numTuple: 98 free: 3852b(52.82%)
+ 7(l:1) blk: 19 numTuple: 111 free: 3280b(59.82%)
+ 8(l:1) blk: 9 numTuple: 97 free: 3896b(52.28%)
+ 9(l:1) blk: 20 numTuple: 104 free: 3588b(56.05%)
+ 10(l:1) blk: 14 numTuple: 96 free: 3940b(51.74%)
+ 11(l:1) blk: 21 numTuple: 106 free: 3500b(57.13%)
+ 12(l:1) blk: 7 numTuple: 103 free: 3632b(55.51%)
+ 13(l:1) blk: 1 numTuple: 101 free: 3720b(54.43%)
+ 14(l:1) blk: 16 numTuple: 97 free: 3896b(52.28%)
+ 15(l:1) blk: 24 numTuple: 103 free: 3632b(55.51%)
+ 16(l:1) blk: 4 numTuple: 98 free: 3852b(52.82%)
+ 17(l:1) blk: 25 numTuple: 98 free: 3852b(52.82%)
+ 18(l:1) blk: 3 numTuple: 97 free: 3896b(52.28%)
+ 19(l:1) blk: 26 numTuple: 96 free: 3940b(51.74%)
+ 20(l:1) blk: 6 numTuple: 103 free: 3632b(55.51%)
+ 21(l:1) blk: 8 numTuple: 162 free: 1036b(87.31%)
+ 22(l:1) blk: 23 numTuple: 94 free: 4028b(50.66%)
+ 23(l:1) blk: 12 numTuple: 82 free: 4556b(44.19%)
+ 24(l:1) blk: 27 numTuple: 105 free: 3544b(56.59%)
+ 25(l:1) blk: 5 numTuple: 90 free: 4204b(48.51%)
+ 26(l:1) blk: 28 numTuple: 100 free: 3764b(53.90%)
+ 27(l:1) blk: 22 numTuple: 101 free: 3720b(54.43%)
+ 28(l:1) blk: 15 numTuple: 95 free: 3984b(51.20%)
+ 29(l:1) blk: 29 numTuple: 95 free: 3984b(51.20%)
+</screen>
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>
+ <function>gist_print(indexname text) returns setof record</function>
+ <indexterm>
+ <primary>gist_print</primary>
+ </indexterm>
+ </term>
+ <listitem>
+ <para>
+ <function>gist_print</function> prints objects stored in a
+ <acronym>GiST</acronym> tree. It works only if the objects in the index have
+ textual representation (<function>type_out</function> functions should be
+ implemented for the given object type). It's known to work with R-tree
+ <acronym>GiST</acronym> based indexes. Note: in example below, objects are
+ of type box. For example:
+<screen>
+test=# SELECT * FROM gist_print('gist_index') AS t(level int, valid bool, a box) WHERE level = 1;
+ level | valid | a
+-------+-------+-----------------------------
+ 1 | t | (37357,50073),(34242,357)
+ 1 | t | (43499,49770),(40358,43)
+ 1 | t | (31193,24679),(25047,12410)
+ 1 | t | (31018,12142),(25083,6)
+ 1 | t | (49944,25174),(43471,12802)
+ 1 | t | (12577,49757),(6302,37534)
+ 1 | t | (12528,37333),(6171,24861)
+ 1 | t | (50027,49751),(46817,25462)
+ 1 | t | (46870,49912),(43664,25722)
+ 1 | t | (24855,25574),(12447,19263)
+ 1 | t | (25054,19126),(12403,12796)
+ 1 | t | (32737,49923),(31178,1038)
+ 1 | t | (3184,24465),(15,81)
+ 1 | t | (24951,49983),(12740,44000)
+ 1 | t | (24919,43956),(12617,37901)
+ 1 | t | (40387,49852),(37338,25217)
+ 1 | t | (40325,24963),(37375,491)
+ 1 | t | (24919,12698),(12654,6518)
+ 1 | t | (25002,6338),(12350,51)
+ 1 | t | (49985,12554),(43447,222)
+ 1 | t | (25003,37769),(12552,25573)
+ 1 | t | (34270,49382),(32763,594)
+ 1 | t | (6205,50012),(3,37527)
+ 1 | t | (6163,37358),(120,25034)
+ 1 | t | (12343,24542),(9295,294)
+ 1 | t | (9308,24151),(6234,620)
+ 1 | t | (6230,24629),(3169,108)
+ 1 | t | (31179,50040),(28113,25556)
+ 1 | t | (28048,49694),(25000,25000)
+</screen>
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </sect2>
+
+ <sect2>
+ <title>SP-GiST Functions</title>
+
+ <variablelist>
+ <varlistentry>
+ <term>
+ <function>spgist_stats(indexname text) returns text</function>
+ <indexterm>
+ <primary>spgist_stats</primary>
+ </indexterm>
+ </term>
+
+ <listitem>
+ <para>
+ <function>spgist_stats</function> returns information about
+ a <acronym>SP-GiST</acronym> index. For example:
+<screen>
+test=# SELECT spgist_stats('spgist_idx');
+ spgist_stats
+----------------------------------
+ totalPages: 21 +
+ deletedPages: 0 +
+ innerPages: 3 +
+ leafPages: 18 +
+ emptyPages: 1 +
+ usedSpace: 121.27 kbytes+
+ freeSpace: 46.07 kbytes +
+ fillRatio: 72.47% +
+ leafTuples: 3669 +
+ innerTuples: 20 +
+ innerAllTheSame: 0 +
+ leafPlaceholders: 569 +
+ innerPlaceholders: 0 +
+ leafRedirects: 0 +
+ innerRedirects: 0 +
+</screen>
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>
+ <function>spgist_print(indexname text) returns setof record</function>
+ <indexterm>
+ <primary>spgist_print</primary>
+ </indexterm>
+ </term>
+
+ <listitem>
+ <para>
+ <function>spgist_print</function> prints objects stored in a
+ <acronym>SP-GiST</acronym> tree. It works only if the objects in the index have
+ textual representation (<function>type_out</function> functions should
+ be implemented for the given object type).
+ <itemizedlist>
+ <listitem>
+ <para>
+ Note 1. in the example below we used quad_point_ops which uses point
+ for leaf and prefix value, but doesn't use node_label at all.
+ Use type 'int' as dummy type for prefix or/and node_label.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Note 2.
+<screen>
+ quad_point_ops: prefix point, node_label int, leaf_value point
+ kd_point_ops: prefix float, node_label int, leaf_value point
+ text_ops: prefix text, node_label char, leaf_value text
+</screen>
+ </para>
+ </listitem>
+ </itemizedlist>
+ For example:
+<screen>
+test=# SELECT * FROM spgist_print('spgist_idx') as t
+ (
+ tid tid,
+ allthesame bool,
+ node_n int,
+ level int,
+ tid_pointer tid,
+ prefix point,
+ node_label int,
+ leaf_value point
+ ) where level = 1;
+ tid | allthesame | node_n | level | tid_pointer | prefix | node_label | leaf_value
+-------+------------+--------+-------+-------------+-------------------------------------+------------+------------
+ (1,1) | f | 0 | 1 | (5,4) | (24530.2070484581,23595.7092511013) | |
+ (1,1) | f | 1 | 1 | (5,3) | (24530.2070484581,23595.7092511013) | |
+ (1,1) | f | 2 | 1 | (5,2) | (24530.2070484581,23595.7092511013) | |
+ (1,1) | f | 3 | 1 | (5,1) | (24530.2070484581,23595.7092511013) | |
+
+</screen>
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </sect2>
+
</sect1>
Hi,
On 07/21/2017 03:40 PM, Alexander Korotkov wrote:
Hi, Alexey!
On Fri, Jul 21, 2017 at 3:05 PM, Alexey Chernyshov
<a.chernyshov@postgrespro.ru <mailto:a.chernyshov@postgrespro.ru>> wrote:the following patch transfers functionality from gevel module
(http://www.sai.msu.su/~megera/wiki/Gevel
<http://www.sai.msu.su/~megera/wiki/Gevel>) which provides functions for
analyzing GIN and GiST indexes to pageinspect. Gevel was originally
designed by Oleg Bartunov, and Teodor Sigaev for developers of GiST and
GIN indexes.It's very good that you've picked up this work! pageinspect is lacking
of this functionality.Functions added:
- gist_stat(text) - shows statistics on GiST Tree
- gist_tree(text) - shows GiST tree
- gist_tree(text, int4) - shows GiST tree up to MAXLEVEL
- gist_print(text) - prints objects stored in GiST tree
- spgist_stat(text) - shows statistics on SP-GiST
- spgist_print(text) - prints objects stored in index
- gin_value_count() - originally gin_stat(text) - prints estimated
counts
for index values
- gin_stats() - originally gin_statpage(text) - shows statistics
- gin_count_estimate(text, tsquery) - shows number of indexed rows
matched
queryTests also transferred, docs for new functions are added. I run pgindent
over the code, but the result is different from those I expected, so
I leave
pgindented one.
The patch is applicable to the commit
866f4a7c210857aa342bf901558d170325094dde.As we can see, gevel contains functions which analyze the whole index.
pageinspect is written in another manner: it gives you functionality to
analyze individual pages, tuples and so on.
Thus, we probably shouldn't try to move gevel functions to pageinspect
"as is". They should be rewritten in more granular manner as well as
other pageinspact functions are. Any other opinions?
I agree with Alexander that pageinspect is written in a very different
way - as the extension name suggests, it's used to inspect pages. The
proposed patch uses a very different approach, reading the whole index,
not individual pages. Why should it be part of pageinspect?
For example we have pgstattuple extension, which seems like a better
match. Or just create a new extension - if the code is valuable, surely
we can live one more extension instead of smuggling it in inside
pageinspect.
regards
--
Tomas Vondra http://www.2ndQuadrant.com
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
On Fri, Sep 8, 2017 at 3:38 AM, Tomas Vondra
<tomas.vondra@2ndquadrant.com> wrote:
Hi,
On 07/21/2017 03:40 PM, Alexander Korotkov wrote:
Hi, Alexey!
On Fri, Jul 21, 2017 at 3:05 PM, Alexey Chernyshov
<a.chernyshov@postgrespro.ru <mailto:a.chernyshov@postgrespro.ru>> wrote:the following patch transfers functionality from gevel module
(http://www.sai.msu.su/~megera/wiki/Gevel
<http://www.sai.msu.su/~megera/wiki/Gevel>) which provides functions for
analyzing GIN and GiST indexes to pageinspect. Gevel was originally
designed by Oleg Bartunov, and Teodor Sigaev for developers of GiST and
GIN indexes.It's very good that you've picked up this work! pageinspect is lacking
of this functionality.Functions added:
- gist_stat(text) - shows statistics on GiST Tree
- gist_tree(text) - shows GiST tree
- gist_tree(text, int4) - shows GiST tree up to MAXLEVEL
- gist_print(text) - prints objects stored in GiST tree
- spgist_stat(text) - shows statistics on SP-GiST
- spgist_print(text) - prints objects stored in index
- gin_value_count() - originally gin_stat(text) - prints estimated
counts
for index values
- gin_stats() - originally gin_statpage(text) - shows statistics
- gin_count_estimate(text, tsquery) - shows number of indexed rows
matched
queryTests also transferred, docs for new functions are added. I run pgindent
over the code, but the result is different from those I expected, so
I leave
pgindented one.
The patch is applicable to the commit
866f4a7c210857aa342bf901558d170325094dde.As we can see, gevel contains functions which analyze the whole index.
pageinspect is written in another manner: it gives you functionality to
analyze individual pages, tuples and so on.
Thus, we probably shouldn't try to move gevel functions to pageinspect
"as is". They should be rewritten in more granular manner as well as
other pageinspact functions are. Any other opinions?I agree with Alexander that pageinspect is written in a very different
way - as the extension name suggests, it's used to inspect pages. The
proposed patch uses a very different approach, reading the whole index,
not individual pages. Why should it be part of pageinspect?For example we have pgstattuple extension, which seems like a better
match. Or just create a new extension - if the code is valuable, surely
we can live one more extension instead of smuggling it in inside
pageinspect.
Finally, i got some time to look into this patch and surprisingly I
didn't find any function returning information at page level instead
all the SQL functions are returning information at index level.
Therefore, i too feel that it should be either integrated with
pgstattuple which could a better match as Tomas also mentioned or may
be add a new contrib module itself. I think, adding a new contrib
module looks like a better option. The reason being, it doesn't simply
include the function for showing index level statistics (for e.g..
index size, no of rows, values..e.t.c) like pgstattuple does but,
also, displays information contained in a page for e.g. the object
stored in the page, it's tid e.t.c. So, more or less, I would say
that, it's the mixture of pageinspect and pgstattuple module and
therefore, i feel, adding it as a new extension would be a better
choice. Thought?
--
With Regards,
Ashutosh Sharma
EnterpriseDB:http://www.enterprisedb.com
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
On Sat, 9 Sep 2017 13:53:35 +0530
Ashutosh Sharma <ashu.coek88@gmail.com> wrote:
Finally, i got some time to look into this patch and surprisingly I
didn't find any function returning information at page level instead
all the SQL functions are returning information at index level.
Therefore, i too feel that it should be either integrated with
pgstattuple which could a better match as Tomas also mentioned or may
be add a new contrib module itself. I think, adding a new contrib
module looks like a better option. The reason being, it doesn't simply
include the function for showing index level statistics (for e.g..
index size, no of rows, values..e.t.c) like pgstattuple does but,
also, displays information contained in a page for e.g. the object
stored in the page, it's tid e.t.c. So, more or less, I would say
that, it's the mixture of pageinspect and pgstattuple module and
therefore, i feel, adding it as a new extension would be a better
choice. Thought?
Thank you for your interest, I will add a new contrib module named,
say, indexstat. I think we can add statistics on other indexes in the
future.
--
Alexey Chernyshov
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
On Wed, Sep 13, 2017 at 1:15 PM, Alexey Chernyshov
<a.chernyshov@postgrespro.ru> wrote:
On Sat, 9 Sep 2017 13:53:35 +0530
Ashutosh Sharma <ashu.coek88@gmail.com> wrote:Finally, i got some time to look into this patch and surprisingly I
didn't find any function returning information at page level instead
all the SQL functions are returning information at index level.
Therefore, i too feel that it should be either integrated with
pgstattuple which could a better match as Tomas also mentioned or may
be add a new contrib module itself. I think, adding a new contrib
module looks like a better option. The reason being, it doesn't simply
include the function for showing index level statistics (for e.g..
index size, no of rows, values..e.t.c) like pgstattuple does but,
also, displays information contained in a page for e.g. the object
stored in the page, it's tid e.t.c. So, more or less, I would say
that, it's the mixture of pageinspect and pgstattuple module and
therefore, i feel, adding it as a new extension would be a better
choice. Thought?Thank you for your interest, I will add a new contrib module named,
say, indexstat. I think we can add statistics on other indexes in the
future.
I think we should wait for experts opinion and then take a call. I am
not expert. I just gave my opinion as i have worked in this area
earlier when working for hash index. Thanks.
--
With Regards,
Ashutosh Sharma
EnterpriseDB:http://www.enterprisedb.com
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
On Wed, Sep 13, 2017 at 10:57 AM, Ashutosh Sharma <ashu.coek88@gmail.com>
wrote:
On Wed, Sep 13, 2017 at 1:15 PM, Alexey Chernyshov
<a.chernyshov@postgrespro.ru> wrote:On Sat, 9 Sep 2017 13:53:35 +0530
Ashutosh Sharma <ashu.coek88@gmail.com> wrote:Finally, i got some time to look into this patch and surprisingly I
didn't find any function returning information at page level instead
all the SQL functions are returning information at index level.
Therefore, i too feel that it should be either integrated with
pgstattuple which could a better match as Tomas also mentioned or may
be add a new contrib module itself. I think, adding a new contrib
module looks like a better option. The reason being, it doesn't simply
include the function for showing index level statistics (for e.g..
index size, no of rows, values..e.t.c) like pgstattuple does but,
also, displays information contained in a page for e.g. the object
stored in the page, it's tid e.t.c. So, more or less, I would say
that, it's the mixture of pageinspect and pgstattuple module and
therefore, i feel, adding it as a new extension would be a better
choice. Thought?Thank you for your interest, I will add a new contrib module named,
say, indexstat. I think we can add statistics on other indexes in the
future.I think we should wait for experts opinion and then take a call. I am
not expert. I just gave my opinion as i have worked in this area
earlier when working for hash index. Thanks.
I'm not sure that we should port these functions from gevel directly. We
could try to re-implement similar functionality which fits pageinspect
approach better. In particular, we can implement some low-level functions
whose show detailed information at page level. And on top of them we can
implement analogues of gevel functions in SQL or PL/pgSQL. Is it feasible?
------
Alexander Korotkov
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company
On 9/13/17 03:45, Alexey Chernyshov wrote:
On Sat, 9 Sep 2017 13:53:35 +0530
Ashutosh Sharma <ashu.coek88@gmail.com> wrote:Finally, i got some time to look into this patch and surprisingly I
didn't find any function returning information at page level instead
all the SQL functions are returning information at index level.
Therefore, i too feel that it should be either integrated with
pgstattuple which could a better match as Tomas also mentioned or may
be add a new contrib module itself. I think, adding a new contrib
module looks like a better option. The reason being, it doesn't simply
include the function for showing index level statistics (for e.g..
index size, no of rows, values..e.t.c) like pgstattuple does but,
also, displays information contained in a page for e.g. the object
stored in the page, it's tid e.t.c. So, more or less, I would say
that, it's the mixture of pageinspect and pgstattuple module and
therefore, i feel, adding it as a new extension would be a better
choice. Thought?Thank you for your interest, I will add a new contrib module named,
say, indexstat. I think we can add statistics on other indexes in the
future.
A few thoughts on this current patch:
The patch no longer compiles, because of changes in the way the tuple
descriptors are accessed (I think).
I agree with the conclusion so far that this should be a new extension,
not being a good fit for an existing extension.
This kind of thing doesn't look like good design:
+<screen>
+test=# SELECT spgist_stats('spgist_idx');
+ spgist_stats
+----------------------------------
+ totalPages: 21 +
+ deletedPages: 0 +
+ innerPages: 3 +
+ leafPages: 18 +
+ emptyPages: 1 +
+ usedSpace: 121.27 kbytes+
+ freeSpace: 46.07 kbytes +
+ fillRatio: 72.47% +
+ leafTuples: 3669 +
+ innerTuples: 20 +
+ innerAllTheSame: 0 +
+ leafPlaceholders: 569 +
+ innerPlaceholders: 0 +
+ leafRedirects: 0 +
+ innerRedirects: 0 +
+</screen>
This function should return a row with columns for each of these pieces
of information.
So to summarize, I think there is interest in this functionality, but
the patch needs some work.
--
Peter Eisentraut http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
On Thu, Nov 2, 2017 at 3:47 AM, Peter Eisentraut
<peter.eisentraut@2ndquadrant.com> wrote:
So to summarize, I think there is interest in this functionality, but
the patch needs some work.
This patch has been waiting for input from its author for three weeks,
so I am marking it as returned with feedback.
--
Michael