Instantly share code, notes, and snippets.

# hwayne/explanation.md

Last active April 9, 2024 21:37
Show Gist options
• Save hwayne/44a6fc708198e5d0cbcd0b4de98131ed to your computer and use it in GitHub Desktop.
Sudoku DIMACS format

# How the J Script Works

Going line by line:

`b =: >: i. 9 9 9`

This generates a 9 by 9 by 9 array with all values from `1` to `729`. We can choose what each axis represents: I decided that each table is all of the boolean variables for one number, and the rows and columns map to sudoku rows and columns. For example:

```   (<0 3 1) { b
29```

`29` represents the boolean variable "1 is in the 4th row and 2nd column". Remember that sudoku boards are 1-indexed, while programming languages are 0-indexed, so `0 3 1` is "really" `1 4 2`.

What's nice about this representation is that every line in the `b`-cube corresponds to a set of constraints. Here's the first matrix of `b`:

```   0 { b
1  2  3  4  5  6  7  8  9
10 11 12 13 14 15 16 17 18
19 20 21 22 23 24 25 26 27
28 29 30 31 32 33 34 35 36
37 38 39 40 41 42 43 44 45
46 47 48 49 50 51 52 53 54
55 56 57 58 59 60 61 62 63
64 65 66 67 68 69 70 71 72
73 74 75 76 77 78 79 80 81```

The first row of this table is all of the boolean variables corresponding to "where in row 1 is the number 1". If we take the cartesian product of the row, we get all pairs of numbers in that row— exactly what we need for our row constraints.

```   cp 1 2 3
1 1
1 2
1 3

2 1
2 2
2 3

3 1
3 2
3 3```

Two small problems: this generates both `1 2` and `2 1`, which are redundant. Also, we generate `3 3`, which would correspond to the clause `(!3 | !3)`, which we don't want. So we need to deduplicate and also filter out rows where the same number appears both times:

```ns =: (~:/"1) # ] NB. no self
dd =: ~.@:(_2 ]\ ,)@:(/:"1~) NB. dedup
uniq =: ns@:dd@:(cp"1)
uniq 1 2 3
2 1
3 1
3 2```

That's better. As for how all this works:

• `cp` box-joins (`;`) the array with itself (`;~`), then generates a list of all possible ways of pulling one element from each list (`{`). Since it's the same list twice, this is the cartesian product of a list with itself. This gives us a list of boxes, which we unbox (`>`) to get a list of pairs.
• `dd` is a bit of a mess right now. First it sorts each row individually (`:/~`), so that they're all in ascending order. Then it collapses a higher-dimensional matrix into a 2xN table of pairs. Then it uniques the list (`~.`).
• `ns` is a standard filter of form `(f # ])`, as discussed here. `~:/"1` takes a list of twoples and inserts (`/`) a "not equals" (`~:`) between them, so gives `1` if the numbers are different and `0` if they're the same.

Because J's an array-based language, we can apply this operation to every row simultaneously. If I write

`rowc =: uniq b`

It gives me all 2916 uniqueness pair-constraints for all 81 rows in my array. To get the column and cell constraints, I can just reorient `b` across the axes. The `|:` dyad pulls an axis to the end: `0 |: b` transforms `b` from number-row-column to row-column-number, and `1 |: b` transforms it to number-column-row. This makes getting the extra constraints trivial.

```colc =: uniq 1 |: b
celc =: uniq 0 |: b```

That just leaves boxes. Each number array breaks down into a 3x3 grid of boxes, each themselves 3x3 in size. If we look at `b` as a single `9x9x9` cube, each constraint box is a `3x3x1` subarray. Fortunately J has a primitive, `x u;.3 y`, to apply a verb `u` to x-dimension subarrays of y.

```box =: (,:~ 1 3 3)&(];.3)
boxc =: uniq 81 9 \$, box b
NB. f is necessary here```
show J stuff The tiling gives us a 6-dimensional output, we need to massage it back into a list of rows for `uniq`. That's what the `81 9 \$,` is for: convert the output into an 81x9 2d array.

That gives us all the uniqueness constraints: the intermediate arrays are the existence constraints, so that covers the entire sudoku schema. That just leaves clues and output formatting.

You could manually figure out what clues map to variables, but that's annoying as heck. Instead, we encode the puzzle as a 2D array, where 0 represents "empty square". I use the `".;._2` idiom, described here:

```NB. from https://dingo.sbs.arizona.edu/~sandiway/sudoku/examples.html

puzzle =: 0&".;._2 (0 : 0)
0 0 0 2 6 0 7 0 1
6 8 0 0 7 0 0 9 0
1 9 0 0 0 4 5 0 0
8 2 0 1 0 0 0 4 0
0 0 4 6 0 2 9 0 0
0 5 0 0 0 3 0 2 8
0 0 9 3 0 0 0 7 4
0 4 0 0 5 0 0 3 6
7 0 3 0 1 8 0 0 0
)```

To extract the clue coordinates, I first convert the puzzle to a sparse array (`\$.`), so values are in a `row column | number` format:

```   2 3 \$ 1 0 2 0 4
1 0 2
0 4 1
\$. 2 3 \$ 1 0 2 0 4
0 0 │ 1
0 2 │ 2
1 1 │ 4
1 2 │ 1```

`4&\$.` gives us the axes while `5&\$.` gives us the values. We do a bit of data massage to get a set of coordinates in `b`. For example, since there's a `2` in the 1st row and 4th column, one of the rows of `(4&\$. ,.~ 5&\$.) <: puzzle` will be `1 0 3`. We could directly index b, but it's simpler in this case to read it as a 3-digit nonary number: `1*9² + 0*9¹ + 3*9⁰ = 84`. Then we increment because DIMACS is 1-based, and we get our final clue of `85`.

`clues =:  >: 9 9 9&#. (5&\$. ,. 4&\$.) <: \$. puzzle`

After that, it's just a matter of glomming all of our constraints together, appending a ` 0` to the end of each, converting them to strings, and writing them all to a file. Note this doesn't create the header file, which is unnecessary for some reason???

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
 NB. START HERE cp =: >@{@;~@, NB. Cartesian Product ns =: (~:/"1) # ] NB. no self dd =: ~.@:(_2 ]\ ,)@:(/:"1~) NB. dedup f =: (81 9 \$ ,) NB. flatten antis =: ns@:dd@:(cp"1) b =: >: i. 9 9 9 rows =: f b cols =: f 1 |: b cels =: f 0 |: b NB. box =: (2 2 \$ 3)&(<;.3) box =: (,:~ 1 3 3)&(];.3) boxs =: f box b NB. f is necessary here 'rowc colc celc boxc' =: antis&.> rows;cols;cels;boxs uniqc =: - rowc , colc , celc , boxc exist =: cols, cels, rows , boxs NB. from https://dingo.sbs.arizona.edu/~sandiway/sudoku/examples.html puzzle =: 0&".;._2 (0 : 0) 0 0 0 2 6 0 7 0 1 6 8 0 0 7 0 0 9 0 1 9 0 0 0 4 5 0 0 8 2 0 1 0 0 0 4 0 0 0 4 6 0 2 9 0 0 0 5 0 0 0 3 0 2 8 0 0 9 3 0 0 0 7 4 0 4 0 0 5 0 0 3 6 7 0 3 0 1 8 0 0 0 ) clues =: >: 9 9 9 #. (5&\$. ,. 4&\$.) <: \$. puzzle NB. This is just me fighting with the scripts NB. BEGIN FITE {{ strbox =: {{('_-' charsub ":)&.> <"1 y ,. 0 }} s1 =: strbox exist s2 =: strbox uniqc s3 =: strbox clues (> s1 , s2 , s3) fwrites 'out.txt' NB. }}
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
 -1 -2 0 -1 -3 0 -1 -4 0 -1 -5 0 -1 -6 0 -1 -7 0 -1 -8 0 -1 -9 0 -2 -3 0 -2 -4 0 -2 -5 0 -2 -6 0 -2 -7 0 -2 -8 0 -2 -9 0 -3 -4 0 -3 -5 0 -3 -6 0 -3 -7 0 -3 -8 0 -3 -9 0 -4 -5 0 -4 -6 0 -4 -7 0 -4 -8 0 -4 -9 0 -5 -6 0 -5 -7 0 -5 -8 0 -5 -9 0 -6 -7 0 -6 -8 0 -6 -9 0 -7 -8 0 -7 -9 0 -8 -9 0 -10 -11 0 -10 -12 0 -10 -13 0 -10 -14 0 -10 -15 0 -10 -16 0 -10 -17 0 -10 -18 0 -11 -12 0 -11 -13 0 -11 -14 0 -11 -15 0 -11 -16 0 -11 -17 0 -11 -18 0 -12 -13 0 -12 -14 0 -12 -15 0 -12 -16 0 -12 -17 0 -12 -18 0 -13 -14 0 -13 -15 0 -13 -16 0 -13 -17 0 -13 -18 0 -14 -15 0 -14 -16 0 -14 -17 0 -14 -18 0 -15 -16 0 -15 -17 0 -15 -18 0 -16 -17 0 -16 -18 0 -17 -18 0 -19 -20 0 -19 -21 0 -19 -22 0 -19 -23 0 -19 -24 0 -19 -25 0 -19 -26 0 -19 -27 0 -20 -21 0 -20 -22 0 -20 -23 0 -20 -24 0 -20 -25 0 -20 -26 0 -20 -27 0 -21 -22 0 -21 -23 0 -21 -24 0 -21 -25 0 -21 -26 0 -21 -27 0 -22 -23 0 -22 -24 0 -22 -25 0 -22 -26 0 -22 -27 0 -23 -24 0 -23 -25 0 -23 -26 0 -23 -27 0 -24 -25 0 -24 -26 0 -24 -27 0 -25 -26 0 -25 -27 0 -26 -27 0 -28 -29 0 -28 -30 0 -28 -31 0 -28 -32 0 -28 -33 0 -28 -34 0 -28 -35 0 -28 -36 0 -29 -30 0 -29 -31 0 -29 -32 0 -29 -33 0 -29 -34 0 -29 -35 0 -29 -36 0 -30 -31 0 -30 -32 0 -30 -33 0 -30 -34 0 -30 -35 0 -30 -36 0 -31 -32 0 -31 -33 0 -31 -34 0 -31 -35 0 -31 -36 0 -32 -33 0 -32 -34 0 -32 -35 0 -32 -36 0 -33 -34 0 -33 -35 0 -33 -36 0 -34 -35 0 -34 -36 0 -35 -36 0 -37 -38 0 -37 -39 0 -37 -40 0 -37 -41 0 -37 -42 0 -37 -43 0 -37 -44 0 -37 -45 0 -38 -39 0 -38 -40 0 -38 -41 0 -38 -42 0 -38 -43 0 -38 -44 0 -38 -45 0 -39 -40 0 -39 -41 0 -39 -42 0 -39 -43 0 -39 -44 0 -39 -45 0 -40 -41 0 -40 -42 0 -40 -43 0 -40 -44 0 -40 -45 0 -41 -42 0 -41 -43 0 -41 -44 0 -41 -45 0 -42 -43 0 -42 -44 0 -42 -45 0 -43 -44 0 -43 -45 0 -44 -45 0 -46 -47 0 -46 -48 0 -46 -49 0 -46 -50 0 -46 -51 0 -46 -52 0 -46 -53 0 -46 -54 0 -47 -48 0 -47 -49 0 -47 -50 0 -47 -51 0 -47 -52 0 -47 -53 0 -47 -54 0 -48 -49 0 -48 -50 0 -48 -51 0 -48 -52 0 -48 -53 0 -48 -54 0 -49 -50 0 -49 -51 0 -49 -52 0 -49 -53 0 -49 -54 0 -50 -51 0 -50 -52 0 -50 -53 0 -50 -54 0 -51 -52 0 -51 -53 0 -51 -54 0 -52 -53 0 -52 -54 0 -53 -54 0 -55 -56 0 -55 -57 0 -55 -58 0 -55 -59 0 -55 -60 0 -55 -61 0 -55 -62 0 -55 -63 0 -56 -57 0 -56 -58 0 -56 -59 0 -56 -60 0 -56 -61 0 -56 -62 0 -56 -63 0 -57 -58 0 -57 -59 0 -57 -60 0 -57 -61 0 -57 -62 0 -57 -63 0 -58 -59 0 -58 -60 0 -58 -61 0 -58 -62 0 -58 -63 0 -59 -60 0 -59 -61 0 -59 -62 0 -59 -63 0 -60 -61 0 -60 -62 0 -60 -63 0 -61 -62 0 -61 -63 0 -62 -63 0 -64 -65 0 -64 -66 0 -64 -67 0 -64 -68 0 -64 -69 0 -64 -70 0 -64 -71 0 -64 -72 0 -65 -66 0 -65 -67 0 -65 -68 0 -65 -69 0 -65 -70 0 -65 -71 0 -65 -72 0 -66 -67 0 -66 -68 0 -66 -69 0 -66 -70 0 -66 -71 0 -66 -72 0 -67 -68 0 -67 -69 0 -67 -70 0 -67 -71 0 -67 -72 0 -68 -69 0 -68 -70 0 -68 -71 0 -68 -72 0 -69 -70 0 -69 -71 0 -69 -72 0 -70 -71 0 -70 -72 0 -71 -72 0 -73 -74 0 -73 -75 0 -73 -76 0 -73 -77 0 -73 -78 0 -73 -79 0 -73 -80 0 -73 -81 0 -74 -75 0 -74 -76 0 -74 -77 0 -74 -78 0 -74 -79 0 -74 -80 0 -74 -81 0 -75 -76 0 -75 -77 0 -75 -78 0 -75 -79 0 -75 -80 0 -75 -81 0 -76 -77 0 -76 -78 0 -76 -79 0 -76 -80 0 -76 -81 0 -77 -78 0 -77 -79 0 -77 -80 0 -77 -81 0 -78 -79 0 -78 -80 0 -78 -81 0 -79 -80 0 -79 -81 0 -80 -81 0 -82 -83 0 -82 -84 0 -82 -85 0 -82 -86 0 -82 -87 0 -82 -88 0 -82 -89 0 -82 -90 0 -83 -84 0 -83 -85 0 -83 -86 0 -83 -87 0 -83 -88 0 -83 -89 0 -83 -90 0 -84 -85 0 -84 -86 0 -84 -87 0 -84 -88 0 -84 -89 0 -84 -90 0 -85 -86 0 -85 -87 0 -85 -88 0 -85 -89 0 -85 -90 0 -86 -87 0 -86 -88 0 -86 -89 0 -86 -90 0 -87 -88 0 -87 -89 0 -87 -90 0 -88 -89 0 -88 -90 0 -89 -90 0 -91 -92 0 -91 -93 0 -91 -94 0 -91 -95 0 -91 -96 0 -91 -97 0 -91 -98 0 -91 -99 0 -92 -93 0 -92 -94 0 -92 -95 0 -92 -96 0 -92 -97 0 -92 -98 0 -92 -99 0 -93 -94 0 -93 -95 0 -93 -96 0 -93 -97 0 -93 -98 0 -93 -99 0 -94 -95 0 -94 -96 0 -94 -97 0 -94 -98 0 -94 -99 0 -95 -96 0 -95 -97 0 -95 -98 0 -95 -99 0 -96 -97 0 -96 -98 0 -96 -99 0 -97 -98 0 -97 -99 0 -98 -99 0 -100 -101 0 -100 -102 0 -100 -103 0 -100 -104 0 -100 -105 0 -100 -106 0 -100 -107 0 -100 -108 0 -101 -102 0 -101 -103 0 -101 -104 0 -101 -105 0 -101 -106 0 -101 -107 0 -101 -108 0 -102 -103 0 -102 -104 0 -102 -105 0 -102 -106 0 -102 -107 0 -102 -108 0 -103 -104 0 -103 -105 0 -103 -106 0 -103 -107 0 -103 -108 0 -104 -105 0 -104 -106 0 -104 -107 0 -104 -108 0 -105 -106 0 -105 -107 0 -105 -108 0 -106 -107 0 -106 -108 0 -107 -108 0 -109 -110 0 -109 -111 0 -109 -112 0 -109 -113 0 -109 -114 0 -109 -115 0 -109 -116 0 -109 -117 0 -110 -111 0 -110 -112 0 -110 -113 0 -110 -114 0 -110 -115 0 -110 -116 0 -110 -117 0 -111 -112 0 -111 -113 0 -111 -114 0 -111 -115 0 -111 -116 0 -111 -117 0 -112 -113 0 -112 -114 0 -112 -115 0 -112 -116 0 -112 -117 0 -113 -114 0 -113 -115 0 -113 -116 0 -113 -117 0 -114 -115 0 -114 -116 0 -114 -117 0 -115 -116 0 -115 -117 0 -116 -117 0 -118 -119 0 -118 -120 0 -118 -121 0 -118 -122 0 -118 -123 0 -118 -124 0 -118 -125 0 -118 -126 0 -119 -120 0 -119 -121 0 -119 -122 0 -119 -123 0 -119 -124 0 -119 -125 0 -119 -126 0 -120 -121 0 -120 -122 0 -120 -123 0 -120 -124 0 -120 -125 0 -120 -126 0 -121 -122 0 -121 -123 0 -121 -124 0 -121 -125 0 -121 -126 0 -122 -123 0 -122 -124 0 -122 -125 0 -122 -126 0 -123 -124 0 -123 -125 0 -123 -126 0 -124 -125 0 -124 -126 0 -125 -126 0 -127 -128 0 -127 -129 0 -127 -130 0 -127 -131 0 -127 -132 0 -127 -133 0 -127 -134 0 -127 -135 0 -128 -129 0 -128 -130 0 -128 -131 0 -128 -132 0 -128 -133 0 -128 -134 0 -128 -135 0 -129 -130 0 -129 -131 0 -129 -132 0 -129 -133 0 -129 -134 0 -129 -135 0 -130 -131 0 -130 -132 0 -130 -133 0 -130 -134 0 -130 -135 0 -131 -132 0 -131 -133 0 -131 -134 0 -131 -135 0 -132 -133 0 -132 -134 0 -132 -135 0 -133 -134 0 -133 -135 0 -134 -135 0 -136 -137 0 -136 -138 0 -136 -139 0 -136 -140 0 -136 -141 0 -136 -142 0 -136 -143 0 -136 -144 0 -137 -138 0 -137 -139 0 -137 -140 0 -137 -141 0 -137 -142 0 -137 -143 0 -137 -144 0 -138 -139 0 -138 -140 0 -138 -141 0 -138 -142 0 -138 -143 0 -138 -144 0 -139 -140 0 -139 -141 0 -139 -142 0 -139 -143 0 -139 -144 0 -140 -141 0 -140 -142 0 -140 -143 0 -140 -144 0 -141 -142 0 -141 -143 0 -141 -144 0 -142 -143 0 -142 -144 0 -143 -144 0 -145 -146 0 -145 -147 0 -145 -148 0 -145 -149 0 -145 -150 0 -145 -151 0 -145 -152 0 -145 -153 0 -146 -147 0 -146 -148 0 -146 -149 0 -146 -150 0 -146 -151 0 -146 -152 0 -146 -153 0 -147 -148 0 -147 -149 0 -147 -150 0 -147 -151 0 -147 -152 0 -147 -153 0 -148 -149 0 -148 -150 0 -148 -151 0 -148 -152 0 -148 -153 0 -149 -150 0 -149 -151 0 -149 -152 0 -149 -153 0 -150 -151 0 -150 -152 0 -150 -153 0 -151 -152 0 -151 -153 0 -152 -153 0 -154 -155 0 -154 -156 0 -154 -157 0 -154 -158 0 -154 -159 0 -154 -160 0 -154 -161 0 -154 -162 0 -155 -156 0 -155 -157 0 -155 -158 0 -155 -159 0 -155 -160 0 -155 -161 0 -155 -162 0 -156 -157 0 -156 -158 0 -156 -159 0 -156 -160 0 -156 -161 0 -156 -162 0 -157 -158 0 -157 -159 0 -157 -160 0 -157 -161 0 -157 -162 0 -158 -159 0 -158 -160 0 -158 -161 0 -158 -162 0 -159 -160 0 -159 -161 0 -159 -162 0 -160 -161 0 -160 -162 0 -161 -162 0 -163 -164 0 -163 -165 0 -163 -166 0 -163 -167 0 -163 -168 0 -163 -169 0 -163 -170 0 -163 -171 0 -164 -165 0 -164 -166 0 -164 -167 0 -164 -168 0 -164 -169 0 -164 -170 0 -164 -171 0 -165 -166 0 -165 -167 0 -165 -168 0 -165 -169 0 -165 -170 0 -165 -171 0 -166 -167 0 -166 -168 0 -166 -169 0 -166 -170 0 -166 -171 0 -167 -168 0 -167 -169 0 -167 -170 0 -167 -171 0 -168 -169 0 -168 -170 0 -168 -171 0 -169 -170 0 -169 -171 0 -170 -171 0 -172 -173 0 -172 -174 0 -172 -175 0 -172 -176 0 -172 -177 0 -172 -178 0 -172 -179 0 -172 -180 0 -173 -174 0 -173 -175 0 -173 -176 0 -173 -177 0 -173 -178 0 -173 -179 0 -173 -180 0 -174 -175 0 -174 -176 0 -174 -177 0 -174 -178 0 -174 -179 0 -174 -180 0 -175 -176 0 -175 -177 0 -175 -178 0 -175 -179 0 -175 -180 0 -176 -177 0 -176 -178 0 -176 -179 0 -176 -180 0 -177 -178 0 -177 -179 0 -177 -180 0 -178 -179 0 -178 -180 0 -179 -180 0 -181 -182 0 -181 -183 0 -181 -184 0 -181 -185 0 -181 -186 0 -181 -187 0 -181 -188 0 -181 -189 0 -182 -183 0 -182 -184 0 -182 -185 0 -182 -186 0 -182 -187 0 -182 -188 0 -182 -189 0 -183 -184 0 -183 -185 0 -183 -186 0 -183 -187 0 -183 -188 0 -183 -189 0 -184 -185 0 -184 -186 0 -184 -187 0 -184 -188 0 -184 -189 0 -185 -186 0 -185 -187 0 -185 -188 0 -185 -189 0 -186 -187 0 -186 -188 0 -186 -189 0 -187 -188 0 -187 -189 0 -188 -189 0 -190 -191 0 -190 -192 0 -190 -193 0 -190 -194 0 -190 -195 0 -190 -196 0 -190 -197 0 -190 -198 0 -191 -192 0 -191 -193 0 -191 -194 0 -191 -195 0 -191 -196 0 -191 -197 0 -191 -198 0 -192 -193 0 -192 -194 0 -192 -195 0 -192 -196 0 -192 -197 0 -192 -198 0 -193 -194 0 -193 -195 0 -193 -196 0 -193 -197 0 -193 -198 0 -194 -195 0 -194 -196 0 -194 -197 0 -194 -198 0 -195 -196 0 -195 -197 0 -195 -198 0 -196 -197 0 -196 -198 0 -197 -198 0 -199 -200 0 -199 -201 0 -199 -202 0 -199 -203 0 -199 -204 0 -199 -205 0 -199 -206 0 -199 -207 0 -200 -201 0 -200 -202 0 -200 -203 0 -200 -204 0 -200 -205 0 -200 -206 0 -200 -207 0 -201 -202 0 -201 -203 0 -201 -204 0 -201 -205 0 -201 -206 0 -201 -207 0 -202 -203 0 -202 -204 0 -202 -205 0 -202 -206 0 -202 -207 0 -203 -204 0 -203 -205 0 -203 -206 0 -203 -207 0 -204 -205 0 -204 -206 0 -204 -207 0 -205 -206 0 -205 -207 0 -206 -207 0 -208 -209 0 -208 -210 0 -208 -211 0 -208 -212 0 -208 -213 0 -208 -214 0 -208 -215 0 -208 -216 0 -209 -210 0 -209 -211 0 -209 -212 0 -209 -213 0 -209 -214 0 -209 -215 0 -209 -216 0 -210 -211 0 -210 -212 0 -210 -213 0 -210 -214 0 -210 -215 0 -210 -216 0 -211 -212 0 -211 -213 0 -211 -214 0 -211 -215 0 -211 -216 0 -212 -213 0 -212 -214 0 -212 -215 0 -212 -216 0 -213 -214 0 -213 -215 0 -213 -216 0 -214 -215 0 -214 -216 0 -215 -216 0 -217 -218 0 -217 -219 0 -217 -220 0 -217 -221 0 -217 -222 0 -217 -223 0 -217 -224 0 -217 -225 0 -218 -219 0 -218 -220 0 -218 -221 0 -218 -222 0 -218 -223 0 -218 -224 0 -218 -225 0 -219 -220 0 -219 -221 0 -219 -222 0 -219 -223 0 -219 -224 0 -219 -225 0 -220 -221 0 -220 -222 0 -220 -223 0 -220 -224 0 -220 -225 0 -221 -222 0 -221 -223 0 -221 -224 0 -221 -225 0 -222 -223 0 -222 -224 0 -222 -225 0 -223 -224 0 -223 -225 0 -224 -225 0 -226 -227 0 -226 -228 0 -226 -229 0 -226 -230 0 -226 -231 0 -226 -232 0 -226 -233 0 -226 -234 0 -227 -228 0 -227 -229 0 -227 -230 0 -227 -231 0 -227 -232 0 -227 -233 0 -227 -234 0 -228 -229 0 -228 -230 0 -228 -231 0 -228 -232 0 -228 -233 0 -228 -234 0 -229 -230 0 -229 -231 0 -229 -232 0 -229 -233 0 -229 -234 0 -230 -231 0 -230 -232 0 -230 -233 0 -230 -234 0 -231 -232 0 -231 -233 0 -231 -234 0 -232 -233 0 -232 -234 0 -233 -234 0 -235 -236 0 -235 -237 0 -235 -238 0 -235 -239 0 -235 -240 0 -235 -241 0 -235 -242 0 -235 -243 0 -236 -237 0 -236 -238 0 -236 -239 0 -236 -240 0 -236 -241 0 -236 -242 0 -236 -243 0 -237 -238 0 -237 -239 0 -237 -240 0 -237 -241 0 -237 -242 0 -237 -243 0 -238 -239 0 -238 -240 0 -238 -241 0 -238 -242 0 -238 -243 0 -239 -240 0 -239 -241 0 -239 -242 0 -239 -243 0 -240 -241 0 -240 -242 0 -240 -243 0 -241 -242 0 -241 -243 0 -242 -243 0 -244 -245 0 -244 -246 0 -244 -247 0 -244 -248 0 -244 -249 0 -244 -250 0 -244 -251 0 -244 -252 0 -245 -246 0 -245 -247 0 -245 -248 0 -245 -249 0 -245 -250 0 -245 -251 0 -245 -252 0 -246 -247 0 -246 -248 0 -246 -249 0 -246 -250 0 -246 -251 0 -246 -252 0 -247 -248 0 -247 -249 0 -247 -250 0 -247 -251 0 -247 -252 0 -248 -249 0 -248 -250 0 -248 -251 0 -248 -252 0 -249 -250 0 -249 -251 0 -249 -252 0 -250 -251 0 -250 -252 0 -251 -252 0 -253 -254 0 -253 -255 0 -253 -256 0 -253 -257 0 -253 -258 0 -253 -259 0 -253 -260 0 -253 -261 0 -254 -255 0 -254 -256 0 -254 -257 0 -254 -258 0 -254 -259 0 -254 -260 0 -254 -261 0 -255 -256 0 -255 -257 0 -255 -258 0 -255 -259 0 -255 -260 0 -255 -261 0 -256 -257 0 -256 -258 0 -256 -259 0 -256 -260 0 -256 -261 0 -257 -258 0 -257 -259 0 -257 -260 0 -257 -261 0 -258 -259 0 -258 -260 0 -258 -261 0 -259 -260 0 -259 -261 0 -260 -261 0 -262 -263 0 -262 -264 0 -262 -265 0 -262 -266 0 -262 -267 0 -262 -268 0 -262 -269 0 -262 -270 0 -263 -264 0 -263 -265 0 -263 -266 0 -263 -267 0 -263 -268 0 -263 -269 0 -263 -270 0 -264 -265 0 -264 -266 0 -264 -267 0 -264 -268 0 -264 -269 0 -264 -270 0 -265 -266 0 -265 -267 0 -265 -268 0 -265 -269 0 -265 -270 0 -266 -267 0 -266 -268 0 -266 -269 0 -266 -270 0 -267 -268 0 -267 -269 0 -267 -270 0 -268 -269 0 -268 -270 0 -269 -270 0 -271 -272 0 -271 -273 0 -271 -274 0 -271 -275 0 -271 -276 0 -271 -277 0 -271 -278 0 -271 -279 0 -272 -273 0 -272 -274 0 -272 -275 0 -272 -276 0 -272 -277 0 -272 -278 0 -272 -279 0 -273 -274 0 -273 -275 0 -273 -276 0 -273 -277 0 -273 -278 0 -273 -279 0 -274 -275 0 -274 -276 0 -274 -277 0 -274 -278 0 -274 -279 0 -275 -276 0 -275 -277 0 -275 -278 0 -275 -279 0 -276 -277 0 -276 -278 0 -276 -279 0 -277 -278 0 -277 -279 0 -278 -279 0 -280 -281 0 -280 -282 0 -280 -283 0 -280 -284 0 -280 -285 0 -280 -286 0 -280 -287 0 -280 -288 0 -281 -282 0 -281 -283 0 -281 -284 0 -281 -285 0 -281 -286 0 -281 -287 0 -281 -288 0 -282 -283 0 -282 -284 0 -282 -285 0 -282 -286 0 -282 -287 0 -282 -288 0 -283 -284 0 -283 -285 0 -283 -286 0 -283 -287 0 -283 -288 0 -284 -285 0 -284 -286 0 -284 -287 0 -284 -288 0 -285 -286 0 -285 -287 0 -285 -288 0 -286 -287 0 -286 -288 0 -287 -288 0 -289 -290 0 -289 -291 0 -289 -292 0 -289 -293 0 -289 -294 0 -289 -295 0 -289 -296 0 -289 -297 0 -290 -291 0 -290 -292 0 -290 -293 0 -290 -294 0 -290 -295 0 -290 -296 0 -290 -297 0 -291 -292 0 -291 -293 0 -291 -294 0 -291 -295 0 -291 -296 0 -291 -297 0 -292 -293 0 -292 -294 0 -292 -295 0 -292 -296 0 -292 -297 0 -293 -294 0 -293 -295 0 -293 -296 0 -293 -297 0 -294 -295 0 -294 -296 0 -294 -297 0 -295 -296 0 -295 -297 0 -296 -297 0 -298 -299 0 -298 -300 0 -298 -301 0 -298 -302 0 -298 -303 0 -298 -304 0 -298 -305 0 -298 -306 0 -299 -300 0 -299 -301 0 -299 -302 0 -299 -303 0 -299 -304 0 -299 -305 0 -299 -306 0 -300 -301 0 -300 -302 0 -300 -303 0 -300 -304 0 -300 -305 0 -300 -306 0 -301 -302 0 -301 -303 0 -301 -304 0 -301 -305 0 -301 -306 0 -302 -303 0 -302 -304 0 -302 -305 0 -302 -306 0 -303 -304 0 -303 -305 0 -303 -306 0 -304 -305 0 -304 -306 0 -305 -306 0 -307 -308 0 -307 -309 0 -307 -310 0 -307 -311 0 -307 -312 0 -307 -313 0 -307 -314 0 -307 -315 0 -308 -309 0 -308 -310 0 -308 -311 0 -308 -312 0 -308 -313 0 -308 -314 0 -308 -315 0 -309 -310 0 -309 -311 0 -309 -312 0 -309 -313 0 -309 -314 0 -309 -315 0 -310 -311 0 -310 -312 0 -310 -313 0 -310 -314 0 -310 -315 0 -311 -312 0 -311 -313 0 -311 -314 0 -311 -315 0 -312 -313 0 -312 -314 0 -312 -315 0 -313 -314 0 -313 -315 0 -314 -315 0 -316 -317 0 -316 -318 0 -316 -319 0 -316 -320 0 -316 -321 0 -316 -322 0 -316 -323 0 -316 -324 0 -317 -318 0 -317 -319 0 -317 -320 0 -317 -321 0 -317 -322 0 -317 -323 0 -317 -324 0 -318 -319 0 -318 -320 0 -318 -321 0 -318 -322 0 -318 -323 0 -318 -324 0 -319 -320 0 -319 -321 0 -319 -322 0 -319 -323 0 -319 -324 0 -320 -321 0 -320 -322 0 -320 -323 0 -320 -324 0 -321 -322 0 -321 -323 0 -321 -324 0 -322 -323 0 -322 -324 0 -323 -324 0 -325 -326 0 -325 -327 0 -325 -328 0 -325 -329 0 -325 -330 0 -325 -331 0 -325 -332 0 -325 -333 0 -326 -327 0 -326 -328 0 -326 -329 0 -326 -330 0 -326 -331 0 -326 -332 0 -326 -333 0 -327 -328 0 -327 -329 0 -327 -330 0 -327 -331 0 -327 -332 0 -327 -333 0 -328 -329 0 -328 -330 0 -328 -331 0 -328 -332 0 -328 -333 0 -329 -330 0 -329 -331 0 -329 -332 0 -329 -333 0 -330 -331 0 -330 -332 0 -330 -333 0 -331 -332 0 -331 -333 0 -332 -333 0 -334 -335 0 -334 -336 0 -334 -337 0 -334 -338 0 -334 -339 0 -334 -340 0 -334 -341 0 -334 -342 0 -335 -336 0 -335 -337 0 -335 -338 0 -335 -339 0 -335 -340 0 -335 -341 0 -335 -342 0 -336 -337 0 -336 -338 0 -336 -339 0 -336 -340 0 -336 -341 0 -336 -342 0 -337 -338 0 -337 -339 0 -337 -340 0 -337 -341 0 -337 -342 0 -338 -339 0 -338 -340 0 -338 -341 0 -338 -342 0 -339 -340 0 -339 -341 0 -339 -342 0 -340 -341 0 -340 -342 0 -341 -342 0 -343 -344 0 -343 -345 0 -343 -346 0 -343 -347 0 -343 -348 0 -343 -349 0 -343 -350 0 -343 -351 0 -344 -345 0 -344 -346 0 -344 -347 0 -344 -348 0 -344 -349 0 -344 -350 0 -344 -351 0 -345 -346 0 -345 -347 0 -345 -348 0 -345 -349 0 -345 -350 0 -345 -351 0 -346 -347 0 -346 -348 0 -346 -349 0 -346 -350 0 -346 -351 0 -347 -348 0 -347 -349 0 -347 -350 0 -347 -351 0 -348 -349 0 -348 -350 0 -348 -351 0 -349 -350 0 -349 -351 0 -350 -351 0 -352 -353 0 -352 -354 0 -352 -355 0 -352 -356 0 -352 -357 0 -352 -358 0 -352 -359 0 -352 -360 0 -353 -354 0 -353 -355 0 -353 -356 0 -353 -357 0 -353 -358 0 -353 -359 0 -353 -360 0 -354 -355 0 -354 -356 0 -354 -357 0 -354 -358 0 -354 -359 0 -354 -360 0 -355 -356 0 -355 -357 0 -355 -358 0 -355 -359 0 -355 -360 0 -356 -357 0 -356 -358 0 -356 -359 0 -356 -360 0 -357 -358 0 -357 -359 0 -357 -360 0 -358 -359 0 -358 -360 0 -359 -360 0 -361 -362 0 -361 -363 0 -361 -364 0 -361 -365 0 -361 -366 0 -361 -367 0 -361 -368 0 -361 -369 0 -362 -363 0 -362 -364 0 -362 -365 0 -362 -366 0 -362 -367 0 -362 -368 0 -362 -369 0 -363 -364 0 -363 -365 0 -363 -366 0 -363 -367 0 -363 -368 0 -363 -369 0 -364 -365 0 -364 -366 0 -364 -367 0 -364 -368 0 -364 -369 0 -365 -366 0 -365 -367 0 -365 -368 0 -365 -369 0 -366 -367 0 -366 -368 0 -366 -369 0 -367 -368 0 -367 -369 0 -368 -369 0 -370 -371 0 -370 -372 0 -370 -373 0 -370 -374 0 -370 -375 0 -370 -376 0 -370 -377 0 -370 -378 0 -371 -372 0 -371 -373 0 -371 -374 0 -371 -375 0 -371 -376 0 -371 -377 0 -371 -378 0 -372 -373 0 -372 -374 0 -372 -375 0 -372 -376 0 -372 -377 0 -372 -378 0 -373 -374 0 -373 -375 0 -373 -376 0 -373 -377 0 -373 -378 0 -374 -375 0 -374 -376 0 -374 -377 0 -374 -378 0 -375 -376 0 -375 -377 0 -375 -378 0 -376 -377 0 -376 -378 0 -377 -378 0 -379 -380 0 -379 -381 0 -379 -382 0 -379 -383 0 -379 -384 0 -379 -385 0 -379 -386 0 -379 -387 0 -380 -381 0 -380 -382 0 -380 -383 0 -380 -384 0 -380 -385 0 -380 -386 0 -380 -387 0 -381 -382 0 -381 -383 0 -381 -384 0 -381 -385 0 -381 -386 0 -381 -387 0 -382 -383 0 -382 -384 0 -382 -385 0 -382 -386 0 -382 -387 0 -383 -384 0 -383 -385 0 -383 -386 0 -383 -387 0 -384 -385 0 -384 -386 0 -384 -387 0 -385 -386 0 -385 -387 0 -386 -387 0 -388 -389 0 -388 -390 0 -388 -391 0 -388 -392 0 -388 -393 0 -388 -394 0 -388 -395 0 -388 -396 0 -389 -390 0 -389 -391 0 -389 -392 0 -389 -393 0 -389 -394 0 -389 -395 0 -389 -396 0 -390 -391 0 -390 -392 0 -390 -393 0 -390 -394 0 -390 -395 0 -390 -396 0 -391 -392 0 -391 -393 0 -391 -394 0 -391 -395 0 -391 -396 0 -392 -393 0 -392 -394 0 -392 -395 0 -392 -396 0 -393 -394 0 -393 -395 0 -393 -396 0 -394 -395 0 -394 -396 0 -395 -396 0 -397 -398 0 -397 -399 0 -397 -400 0 -397 -401 0 -397 -402 0 -397 -403 0 -397 -404 0 -397 -405 0 -398 -399 0 -398 -400 0 -398 -401 0 -398 -402 0 -398 -403 0 -398 -404 0 -398 -405 0 -399 -400 0 -399 -401 0 -399 -402 0 -399 -403 0 -399 -404 0 -399 -405 0 -400 -401 0 -400 -402 0 -400 -403 0 -400 -404 0 -400 -405 0 -401 -402 0 -401 -403 0 -401 -404 0 -401 -405 0 -402 -403 0 -402 -404 0 -402 -405 0 -403 -404 0 -403 -405 0 -404 -405 0 -406 -407 0 -406 -408 0 -406 -409 0 -406 -410 0 -406 -411 0 -406 -412 0 -406 -413 0 -406 -414 0 -407 -408 0 -407 -409 0 -407 -410 0 -407 -411 0 -407 -412 0 -407 -413 0 -407 -414 0 -408 -409 0 -408 -410 0 -408 -411 0 -408 -412 0 -408 -413 0 -408 -414 0 -409 -410 0 -409 -411 0 -409 -412 0 -409 -413 0 -409 -414 0 -410 -411 0 -410 -412 0 -410 -413 0 -410 -414 0 -411 -412 0 -411 -413 0 -411 -414 0 -412 -413 0 -412 -414 0 -413 -414 0 -415 -416 0 -415 -417 0 -415 -418 0 -415 -419 0 -415 -420 0 -415 -421 0 -415 -422 0 -415 -423 0 -416 -417 0 -416 -418 0 -416 -419 0 -416 -420 0 -416 -421 0 -416 -422 0 -416 -423 0 -417 -418 0 -417 -419 0 -417 -420 0 -417 -421 0 -417 -422 0 -417 -423 0 -418 -419 0 -418 -420 0 -418 -421 0 -418 -422 0 -418 -423 0 -419 -420 0 -419 -421 0 -419 -422 0 -419 -423 0 -420 -421 0 -420 -422 0 -420 -423 0 -421 -422 0 -421 -423 0 -422 -423 0 -424 -425 0 -424 -426 0 -424 -427 0 -424 -428 0 -424 -429 0 -424 -430 0 -424 -431 0 -424 -432 0 -425 -426 0 -425 -427 0 -425 -428 0 -425 -429 0 -425 -430 0 -425 -431 0 -425 -432 0 -426 -427 0 -426 -428 0 -426 -429 0 -426 -430 0 -426 -431 0 -426 -432 0 -427 -428 0 -427 -429 0 -427 -430 0 -427 -431 0 -427 -432 0 -428 -429 0 -428 -430 0 -428 -431 0 -428 -432 0 -429 -430 0 -429 -431 0 -429 -432 0 -430 -431 0 -430 -432 0 -431 -432 0 -433 -434 0 -433 -435 0 -433 -436 0 -433 -437 0 -433 -438 0 -433 -439 0 -433 -440 0 -433 -441 0 -434 -435 0 -434 -436 0 -434 -437 0 -434 -438 0 -434 -439 0 -434 -440 0 -434 -441 0 -435 -436 0 -435 -437 0 -435 -438 0 -435 -439 0 -435 -440 0 -435 -441 0 -436 -437 0 -436 -438 0 -436 -439 0 -436 -440 0 -436 -441 0 -437 -438 0 -437 -439 0 -437 -440 0 -437 -441 0 -438 -439 0 -438 -440 0 -438 -441 0 -439 -440 0 -439 -441 0 -440 -441 0 -442 -443 0 -442 -444 0 -442 -445 0 -442 -446 0 -442 -447 0 -442 -448 0 -442 -449 0 -442 -450 0 -443 -444 0 -443 -445 0 -443 -446 0 -443 -447 0 -443 -448 0 -443 -449 0 -443 -450 0 -444 -445 0 -444 -446 0 -444 -447 0 -444 -448 0 -444 -449 0 -444 -450 0 -445 -446 0 -445 -447 0 -445 -448 0 -445 -449 0 -445 -450 0 -446 -447 0 -446 -448 0 -446 -449 0 -446 -450 0 -447 -448 0 -447 -449 0 -447 -450 0 -448 -449 0 -448 -450 0 -449 -450 0 -451 -452 0 -451 -453 0 -451 -454 0 -451 -455 0 -451 -456 0 -451 -457 0 -451 -458 0 -451 -459 0 -452 -453 0 -452 -454 0 -452 -455 0 -452 -456 0 -452 -457 0 -452 -458 0 -452 -459 0 -453 -454 0 -453 -455 0 -453 -456 0 -453 -457 0 -453 -458 0 -453 -459 0 -454 -455 0 -454 -456 0 -454 -457 0 -454 -458 0 -454 -459 0 -455 -456 0 -455 -457 0 -455 -458 0 -455 -459 0 -456 -457 0 -456 -458 0 -456 -459 0 -457 -458 0 -457 -459 0 -458 -459 0 -460 -461 0 -460 -462 0 -460 -463 0 -460 -464 0 -460 -465 0 -460 -466 0 -460 -467 0 -460 -468 0 -461 -462 0 -461 -463 0 -461 -464 0 -461 -465 0 -461 -466 0 -461 -467 0 -461 -468 0 -462 -463 0 -462 -464 0 -462 -465 0 -462 -466 0 -462 -467 0 -462 -468 0 -463 -464 0 -463 -465 0 -463 -466 0 -463 -467 0 -463 -468 0 -464 -465 0 -464 -466 0 -464 -467 0 -464 -468 0 -465 -466 0 -465 -467 0 -465 -468 0 -466 -467 0 -466 -468 0 -467 -468 0 -469 -470 0 -469 -471 0 -469 -472 0 -469 -473 0 -469 -474 0 -469 -475 0 -469 -476 0 -469 -477 0 -470 -471 0 -470 -472 0 -470 -473 0 -470 -474 0 -470 -475 0 -470 -476 0 -470 -477 0 -471 -472 0 -471 -473 0 -471 -474 0 -471 -475 0 -471 -476 0 -471 -477 0 -472 -473 0 -472 -474 0 -472 -475 0 -472 -476 0 -472 -477 0 -473 -474 0 -473 -475 0 -473 -476 0 -473 -477 0 -474 -475 0 -474 -476 0 -474 -477 0 -475 -476 0 -475 -477 0 -476 -477 0 -478 -479 0 -478 -480 0 -478 -481 0 -478 -482 0 -478 -483 0 -478 -484 0 -478 -485 0 -478 -486 0 -479 -480 0 -479 -481 0 -479 -482 0 -479 -483 0 -479 -484 0 -479 -485 0 -479 -486 0 -480 -481 0 -480 -482 0 -480 -483 0 -480 -484 0 -480 -485 0 -480 -486 0 -481 -482 0 -481 -483 0 -481 -484 0 -481 -485 0 -481 -486 0 -482 -483 0 -482 -484 0 -482 -485 0 -482 -486 0 -483 -484 0 -483 -485 0 -483 -486 0 -484 -485 0 -484 -486 0 -485 -486 0 -487 -488 0 -487 -489 0 -487 -490 0 -487 -491 0 -487 -492 0 -487 -493 0 -487 -494 0 -487 -495 0 -488 -489 0 -488 -490 0 -488 -491 0 -488 -492 0 -488 -493 0 -488 -494 0 -488 -495 0 -489 -490 0 -489 -491 0 -489 -492 0 -489 -493 0 -489 -494 0 -489 -495 0 -490 -491 0 -490 -492 0 -490 -493 0 -490 -494 0 -490 -495 0 -491 -492 0 -491 -493 0 -491 -494 0 -491 -495 0 -492 -493 0 -492 -494 0 -492 -495 0 -493 -494 0 -493 -495 0 -494 -495 0 -496 -497 0 -496 -498 0 -496 -499 0 -496 -500 0 -496 -501 0 -496 -502 0 -496 -503 0 -496 -504 0 -497 -498 0 -497 -499 0 -497 -500 0 -497 -501 0 -497 -502 0 -497 -503 0 -497 -504 0 -498 -499 0 -498 -500 0 -498 -501 0 -498 -502 0 -498 -503 0 -498 -504 0 -499 -500 0 -499 -501 0 -499 -502 0 -499 -503 0 -499 -504 0 -500 -501 0 -500 -502 0 -500 -503 0 -500 -504 0 -501 -502 0 -501 -503 0 -501 -504 0 -502 -503 0 -502 -504 0 -503 -504 0 -505 -506 0 -505 -507 0 -505 -508 0 -505 -509 0 -505 -510 0 -505 -511 0 -505 -512 0 -505 -513 0 -506 -507 0 -506 -508 0 -506 -509 0 -506 -510 0 -506 -511 0 -506 -512 0 -506 -513 0 -507 -508 0 -507 -509 0 -507 -510 0 -507 -511 0 -507 -512 0 -507 -513 0 -508 -509 0 -508 -510 0 -508 -511 0 -508 -512 0 -508 -513 0 -509 -510 0 -509 -511 0 -509 -512 0 -509 -513 0 -510 -511 0 -510 -512 0 -510 -513 0 -511 -512 0 -511 -513 0 -512 -513 0 -514 -515 0 -514 -516 0 -514 -517 0 -514 -518 0 -514 -519 0 -514 -520 0 -514 -521 0 -514 -522 0 -515 -516 0 -515 -517 0 -515 -518 0 -515 -519 0 -515 -520 0 -515 -521 0 -515 -522 0 -516 -517 0 -516 -518 0 -516 -519 0 -516 -520 0 -516 -521 0 -516 -522 0 -517 -518 0 -517 -519 0 -517 -520 0 -517 -521 0 -517 -522 0 -518 -519 0 -518 -520 0 -518 -521 0 -518 -522 0 -519 -520 0 -519 -521 0 -519 -522 0 -520 -521 0 -520 -522 0 -521 -522 0 -523 -524 0 -523 -525 0 -523 -526 0 -523 -527 0 -523 -528 0 -523 -529 0 -523 -530 0 -523 -531 0 -524 -525 0 -524 -526 0 -524 -527 0 -524 -528 0 -524 -529 0 -524 -530 0 -524 -531 0 -525 -526 0 -525 -527 0 -525 -528 0 -525 -529 0 -525 -530 0 -525 -531 0 -526 -527 0 -526 -528 0 -526 -529 0 -526 -530 0 -526 -531 0 -527 -528 0 -527 -529 0 -527 -530 0 -527 -531 0 -528 -529 0 -528 -530 0 -528 -531 0 -529 -530 0 -529 -531 0 -530 -531 0 -532 -533 0 -532 -534 0 -532 -535 0 -532 -536 0 -532 -537 0 -532 -538 0 -532 -539 0 -532 -540 0 -533 -534 0 -533 -535 0 -533 -536 0 -533 -537 0 -533 -538 0 -533 -539 0 -533 -540 0 -534 -535 0 -534 -536 0 -534 -537 0 -534 -538 0 -534 -539 0 -534 -540 0 -535 -536 0 -535 -537 0 -535 -538 0 -535 -539 0 -535 -540 0 -536 -537 0 -536 -538 0 -536 -539 0 -536 -540 0 -537 -538 0 -537 -539 0 -537 -540 0 -538 -539 0 -538 -540 0 -539 -540 0 -541 -542 0 -541 -543 0 -541 -544 0 -541 -545 0 -541 -546 0 -541 -547 0 -541 -548 0 -541 -549 0 -542 -543 0 -542 -544 0 -542 -545 0 -542 -546 0 -542 -547 0 -542 -548 0 -542 -549 0 -543 -544 0 -543 -545 0 -543 -546 0 -543 -547 0 -543 -548 0 -543 -549 0 -544 -545 0 -544 -546 0 -544 -547 0 -544 -548 0 -544 -549 0 -545 -546 0 -545 -547 0 -545 -548 0 -545 -549 0 -546 -547 0 -546 -548 0 -546 -549 0 -547 -548 0 -547 -549 0 -548 -549 0 -550 -551 0 -550 -552 0 -550 -553 0 -550 -554 0 -550 -555 0 -550 -556 0 -550 -557 0 -550 -558 0 -551 -552 0 -551 -553 0 -551 -554 0 -551 -555 0 -551 -556 0 -551 -557 0 -551 -558 0 -552 -553 0 -552 -554 0 -552 -555 0 -552 -556 0 -552 -557 0 -552 -558 0 -553 -554 0 -553 -555 0 -553 -556 0 -553 -557 0 -553 -558 0 -554 -555 0 -554 -556 0 -554 -557 0 -554 -558 0 -555 -556 0 -555 -557 0 -555 -558 0 -556 -557 0 -556 -558 0 -557 -558 0 -559 -560 0 -559 -561 0 -559 -562 0 -559 -563 0 -559 -564 0 -559 -565 0 -559 -566 0 -559 -567 0 -560 -561 0 -560 -562 0 -560 -563 0 -560 -564 0 -560 -565 0 -560 -566 0 -560 -567 0 -561 -562 0 -561 -563 0 -561 -564 0 -561 -565 0 -561 -566 0 -561 -567 0 -562 -563 0 -562 -564 0 -562 -565 0 -562 -566 0 -562 -567 0 -563 -564 0 -563 -565 0 -563 -566 0 -563 -567 0 -564 -565 0 -564 -566 0 -564 -567 0 -565 -566 0 -565 -567 0 -566 -567 0 -568 -569 0 -568 -570 0 -568 -571 0 -568 -572 0 -568 -573 0 -568 -574 0 -568 -575 0 -568 -576 0 -569 -570 0 -569 -571 0 -569 -572 0 -569 -573 0 -569 -574 0 -569 -575 0 -569 -576 0 -570 -571 0 -570 -572 0 -570 -573 0 -570 -574 0 -570 -575 0 -570 -576 0 -571 -572 0 -571 -573 0 -571 -574 0 -571 -575 0 -571 -576 0 -572 -573 0 -572 -574 0 -572 -575 0 -572 -576 0 -573 -574 0 -573 -575 0 -573 -576 0 -574 -575 0 -574 -576 0 -575 -576 0 -577 -578 0 -577 -579 0 -577 -580 0 -577 -581 0 -577 -582 0 -577 -583 0 -577 -584 0 -577 -585 0 -578 -579 0 -578 -580 0 -578 -581 0 -578 -582 0 -578 -583 0 -578 -584 0 -578 -585 0 -579 -580 0 -579 -581 0 -579 -582 0 -579 -583 0 -579 -584 0 -579 -585 0 -580 -581 0 -580 -582 0 -580 -583 0 -580 -584 0 -580 -585 0 -581 -582 0 -581 -583 0 -581 -584 0 -581 -585 0 -582 -583 0 -582 -584 0 -582 -585 0 -583 -584 0 -583 -585 0 -584 -585 0 -586 -587 0 -586 -588 0 -586 -589 0 -586 -590 0 -586 -591 0 -586 -592 0 -586 -593 0 -586 -594 0 -587 -588 0 -587 -589 0 -587 -590 0 -587 -591 0 -587 -592 0 -587 -593 0 -587 -594 0 -588 -589 0 -588 -590 0 -588 -591 0 -588 -592 0 -588 -593 0 -588 -594 0 -589 -590 0 -589 -591 0 -589 -592 0 -589 -593 0 -589 -594 0 -590 -591 0 -590 -592 0 -590 -593 0 -590 -594 0 -591 -592 0 -591 -593 0 -591 -594 0 -592 -593 0 -592 -594 0 -593 -594 0 -595 -596 0 -595 -597 0 -595 -598 0 -595 -599 0 -595 -600 0 -595 -601 0 -595 -602 0 -595 -603 0 -596 -597 0 -596 -598 0 -596 -599 0 -596 -600 0 -596 -601 0 -596 -602 0 -596 -603 0 -597 -598 0 -597 -599 0 -597 -600 0 -597 -601 0 -597 -602 0 -597 -603 0 -598 -599 0 -598 -600 0 -598 -601 0 -598 -602 0 -598 -603 0 -599 -600 0 -599 -601 0 -599 -602 0 -599 -603 0 -600 -601 0 -600 -602 0 -600 -603 0 -601 -602 0 -601 -603 0 -602 -603 0 -604 -605 0 -604 -606 0 -604 -607 0 -604 -608 0 -604 -609 0 -604 -610 0 -604 -611 0 -604 -612 0 -605 -606 0 -605 -607 0 -605 -608 0 -605 -609 0 -605 -610 0 -605 -611 0 -605 -612 0 -606 -607 0 -606 -608 0 -606 -609 0 -606 -610 0 -606 -611 0 -606 -612 0 -607 -608 0 -607 -609 0 -607 -610 0 -607 -611 0 -607 -612 0 -608 -609 0 -608 -610 0 -608 -611 0 -608 -612 0 -609 -610 0 -609 -611 0 -609 -612 0 -610 -611 0 -610 -612 0 -611 -612 0 -613 -614 0 -613 -615 0 -613 -616 0 -613 -617 0 -613 -618 0 -613 -619 0 -613 -620 0 -613 -621 0 -614 -615 0 -614 -616 0 -614 -617 0 -614 -618 0 -614 -619 0 -614 -620 0 -614 -621 0 -615 -616 0 -615 -617 0 -615 -618 0 -615 -619 0 -615 -620 0 -615 -621 0 -616 -617 0 -616 -618 0 -616 -619 0 -616 -620 0 -616 -621 0 -617 -618 0 -617 -619 0 -617 -620 0 -617 -621 0 -618 -619 0 -618 -620 0 -618 -621 0 -619 -620 0 -619 -621 0 -620 -621 0 -622 -623 0 -622 -624 0 -622 -625 0 -622 -626 0 -622 -627 0 -622 -628 0 -622 -629 0 -622 -630 0 -623 -624 0 -623 -625 0 -623 -626 0 -623 -627 0 -623 -628 0 -623 -629 0 -623 -630 0 -624 -625 0 -624 -626 0 -624 -627 0 -624 -628 0 -624 -629 0 -624 -630 0 -625 -626 0 -625 -627 0 -625 -628 0 -625 -629 0 -625 -630 0 -626 -627 0 -626 -628 0 -626 -629 0 -626 -630 0 -627 -628 0 -627 -629 0 -627 -630 0 -628 -629 0 -628 -630 0 -629 -630 0 -631 -632 0 -631 -633 0 -631 -634 0 -631 -635 0 -631 -636 0 -631 -637 0 -631 -638 0 -631 -639 0 -632 -633 0 -632 -634 0 -632 -635 0 -632 -636 0 -632 -637 0 -632 -638 0 -632 -639 0 -633 -634 0 -633 -635 0 -633 -636 0 -633 -637 0 -633 -638 0 -633 -639 0 -634 -635 0 -634 -636 0 -634 -637 0 -634 -638 0 -634 -639 0 -635 -636 0 -635 -637 0 -635 -638 0 -635 -639 0 -636 -637 0 -636 -638 0 -636 -639 0 -637 -638 0 -637 -639 0 -638 -639 0 -640 -641 0 -640 -642 0 -640 -643 0 -640 -644 0 -640 -645 0 -640 -646 0 -640 -647 0 -640 -648 0 -641 -642 0 -641 -643 0 -641 -644 0 -641 -645 0 -641 -646 0 -641 -647 0 -641 -648 0 -642 -643 0 -642 -644 0 -642 -645 0 -642 -646 0 -642 -647 0 -642 -648 0 -643 -644 0 -643 -645 0 -643 -646 0 -643 -647 0 -643 -648 0 -644 -645 0 -644 -646 0 -644 -647 0 -644 -648 0 -645 -646 0 -645 -647 0 -645 -648 0 -646 -647 0 -646 -648 0 -647 -648 0 -649 -650 0 -649 -651 0 -649 -652 0 -649 -653 0 -649 -654 0 -649 -655 0 -649 -656 0 -649 -657 0 -650 -651 0 -650 -652 0 -650 -653 0 -650 -654 0 -650 -655 0 -650 -656 0 -650 -657 0 -651 -652 0 -651 -653 0 -651 -654 0 -651 -655 0 -651 -656 0 -651 -657 0 -652 -653 0 -652 -654 0 -652 -655 0 -652 -656 0 -652 -657 0 -653 -654 0 -653 -655 0 -653 -656 0 -653 -657 0 -654 -655 0 -654 -656 0 -654 -657 0 -655 -656 0 -655 -657 0 -656 -657 0 -658 -659 0 -658 -660 0 -658 -661 0 -658 -662 0 -658 -663 0 -658 -664 0 -658 -665 0 -658 -666 0 -659 -660 0 -659 -661 0 -659 -662 0 -659 -663 0 -659 -664 0 -659 -665 0 -659 -666 0 -660 -661 0 -660 -662 0 -660 -663 0 -660 -664 0 -660 -665 0 -660 -666 0 -661 -662 0 -661 -663 0 -661 -664 0 -661 -665 0 -661 -666 0 -662 -663 0 -662 -664 0 -662 -665 0 -662 -666 0 -663 -664 0 -663 -665 0 -663 -666 0 -664 -665 0 -664 -666 0 -665 -666 0 -667 -668 0 -667 -669 0 -667 -670 0 -667 -671 0 -667 -672 0 -667 -673 0 -667 -674 0 -667 -675 0 -668 -669 0 -668 -670 0 -668 -671 0 -668 -672 0 -668 -673 0 -668 -674 0 -668 -675 0 -669 -670 0 -669 -671 0 -669 -672 0 -669 -673 0 -669 -674 0 -669 -675 0 -670 -671 0 -670 -672 0 -670 -673 0 -670 -674 0 -670 -675 0 -671 -672 0 -671 -673 0 -671 -674 0 -671 -675 0 -672 -673 0 -672 -674 0 -672 -675 0 -673 -674 0 -673 -675 0 -674 -675 0 -676 -677 0 -676 -678 0 -676 -679 0 -676 -680 0 -676 -681 0 -676 -682 0 -676 -683 0 -676 -684 0 -677 -678 0 -677 -679 0 -677 -680 0 -677 -681 0 -677 -682 0 -677 -683 0 -677 -684 0 -678 -679 0 -678 -680 0 -678 -681 0 -678 -682 0 -678 -683 0 -678 -684 0 -679 -680 0 -679 -681 0 -679 -682 0 -679 -683 0 -679 -684 0 -680 -681 0 -680 -682 0 -680 -683 0 -680 -684 0 -681 -682 0 -681 -683 0 -681 -684 0 -682 -683 0 -682 -684 0 -683 -684 0 -685 -686 0 -685 -687 0 -685 -688 0 -685 -689 0 -685 -690 0 -685 -691 0 -685 -692 0 -685 -693 0 -686 -687 0 -686 -688 0 -686 -689 0 -686 -690 0 -686 -691 0 -686 -692 0 -686 -693 0 -687 -688 0 -687 -689 0 -687 -690 0 -687 -691 0 -687 -692 0 -687 -693 0 -688 -689 0 -688 -690 0 -688 -691 0 -688 -692 0 -688 -693 0 -689 -690 0 -689 -691 0 -689 -692 0 -689 -693 0 -690 -691 0 -690 -692 0 -690 -693 0 -691 -692 0 -691 -693 0 -692 -693 0 -694 -695 0 -694 -696 0 -694 -697 0 -694 -698 0 -694 -699 0 -694 -700 0 -694 -701 0 -694 -702 0 -695 -696 0 -695 -697 0 -695 -698 0 -695 -699 0 -695 -700 0 -695 -701 0 -695 -702 0 -696 -697 0 -696 -698 0 -696 -699 0 -696 -700 0 -696 -701 0 -696 -702 0 -697 -698 0 -697 -699 0 -697 -700 0 -697 -701 0 -697 -702 0 -698 -699 0 -698 -700 0 -698 -701 0 -698 -702 0 -699 -700 0 -699 -701 0 -699 -702 0 -700 -701 0 -700 -702 0 -701 -702 0 -703 -704 0 -703 -705 0 -703 -706 0 -703 -707 0 -703 -708 0 -703 -709 0 -703 -710 0 -703 -711 0 -704 -705 0 -704 -706 0 -704 -707 0 -704 -708 0 -704 -709 0 -704 -710 0 -704 -711 0 -705 -706 0 -705 -707 0 -705 -708 0 -705 -709 0 -705 -710 0 -705 -711 0 -706 -707 0 -706 -708 0 -706 -709 0 -706 -710 0 -706 -711 0 -707 -708 0 -707 -709 0 -707 -710 0 -707 -711 0 -708 -709 0 -708 -710 0 -708 -711 0 -709 -710 0 -709 -711 0 -710 -711 0 -712 -713 0 -712 -714 0 -712 -715 0 -712 -716 0 -712 -717 0 -712 -718 0 -712 -719 0 -712 -720 0 -713 -714 0 -713 -715 0 -713 -716 0 -713 -717 0 -713 -718 0 -713 -719 0 -713 -720 0 -714 -715 0 -714 -716 0 -714 -717 0 -714 -718 0 -714 -719 0 -714 -720 0 -715 -716 0 -715 -717 0 -715 -718 0 -715 -719 0 -715 -720 0 -716 -717 0 -716 -718 0 -716 -719 0 -716 -720 0 -717 -718 0 -717 -719 0 -717 -720 0 -718 -719 0 -718 -720 0 -719 -720 0 -721 -722 0 -721 -723 0 -721 -724 0 -721 -725 0 -721 -726 0 -721 -727 0 -721 -728 0 -721 -729 0 -722 -723 0 -722 -724 0 -722 -725 0 -722 -726 0 -722 -727 0 -722 -728 0 -722 -729 0 -723 -724 0 -723 -725 0 -723 -726 0 -723 -727 0 -723 -728 0 -723 -729 0 -724 -725 0 -724 -726 0 -724 -727 0 -724 -728 0 -724 -729 0 -725 -726 0 -725 -727 0 -725 -728 0 -725 -729 0 -726 -727 0 -726 -728 0 -726 -729 0 -727 -728 0 -727 -729 0 -728 -729 0 -1 -10 0 -1 -19 0 -1 -28 0 -1 -37 0 -1 -46 0 -1 -55 0 -1 -64 0 -1 -73 0 -10 -19 0 -10 -28 0 -10 -37 0 -10 -46 0 -10 -55 0 -10 -64 0 -10 -73 0 -19 -28 0 -19 -37 0 -19 -46 0 -19 -55 0 -19 -64 0 -19 -73 0 -28 -37 0 -28 -46 0 -28 -55 0 -28 -64 0 -28 -73 0 -37 -46 0 -37 -55 0 -37 -64 0 -37 -73 0 -46 -55 0 -46 -64 0 -46 -73 0 -55 -64 0 -55 -73 0 -64 -73 0 -2 -11 0 -2 -20 0 -2 -29 0 -2 -38 0 -2 -47 0 -2 -56 0 -2 -65 0 -2 -74 0 -11 -20 0 -11 -29 0 -11 -38 0 -11 -47 0 -11 -56 0 -11 -65 0 -11 -74 0 -20 -29 0 -20 -38 0 -20 -47 0 -20 -56 0 -20 -65 0 -20 -74 0 -29 -38 0 -29 -47 0 -29 -56 0 -29 -65 0 -29 -74 0 -38 -47 0 -38 -56 0 -38 -65 0 -38 -74 0 -47 -56 0 -47 -65 0 -47 -74 0 -56 -65 0 -56 -74 0 -65 -74 0 -3 -12 0 -3 -21 0 -3 -30 0 -3 -39 0 -3 -48 0 -3 -57 0 -3 -66 0 -3 -75 0 -12 -21 0 -12 -30 0 -12 -39 0 -12 -48 0 -12 -57 0 -12 -66 0 -12 -75 0 -21 -30 0 -21 -39 0 -21 -48 0 -21 -57 0 -21 -66 0 -21 -75 0 -30 -39 0 -30 -48 0 -30 -57 0 -30 -66 0 -30 -75 0 -39 -48 0 -39 -57 0 -39 -66 0 -39 -75 0 -48 -57 0 -48 -66 0 -48 -75 0 -57 -66 0 -57 -75 0 -66 -75 0 -4 -13 0 -4 -22 0 -4 -31 0 -4 -40 0 -4 -49 0 -4 -58 0 -4 -67 0 -4 -76 0 -13 -22 0 -13 -31 0 -13 -40 0 -13 -49 0 -13 -58 0 -13 -67 0 -13 -76 0 -22 -31 0 -22 -40 0 -22 -49 0 -22 -58 0 -22 -67 0 -22 -76 0 -31 -40 0 -31 -49 0 -31 -58 0 -31 -67 0 -31 -76 0 -40 -49 0 -40 -58 0 -40 -67 0 -40 -76 0 -49 -58 0 -49 -67 0 -49 -76 0 -58 -67 0 -58 -76 0 -67 -76 0 -5 -14 0 -5 -23 0 -5 -32 0 -5 -41 0 -5 -50 0 -5 -59 0 -5 -68 0 -5 -77 0 -14 -23 0 -14 -32 0 -14 -41 0 -14 -50 0 -14 -59 0 -14 -68 0 -14 -77 0 -23 -32 0 -23 -41 0 -23 -50 0 -23 -59 0 -23 -68 0 -23 -77 0 -32 -41 0 -32 -50 0 -32 -59 0 -32 -68 0 -32 -77 0 -41 -50 0 -41 -59 0 -41 -68 0 -41 -77 0 -50 -59 0 -50 -68 0 -50 -77 0 -59 -68 0 -59 -77 0 -68 -77 0 -6 -15 0 -6 -24 0 -6 -33 0 -6 -42 0 -6 -51 0 -6 -60 0 -6 -69 0 -6 -78 0 -15 -24 0 -15 -33 0 -15 -42 0 -15 -51 0 -15 -60 0 -15 -69 0 -15 -78 0 -24 -33 0 -24 -42 0 -24 -51 0 -24 -60 0 -24 -69 0 -24 -78 0 -33 -42 0 -33 -51 0 -33 -60 0 -33 -69 0 -33 -78 0 -42 -51 0 -42 -60 0 -42 -69 0 -42 -78 0 -51 -60 0 -51 -69 0 -51 -78 0 -60 -69 0 -60 -78 0 -69 -78 0 -7 -16 0 -7 -25 0 -7 -34 0 -7 -43 0 -7 -52 0 -7 -61 0 -7 -70 0 -7 -79 0 -16 -25 0 -16 -34 0 -16 -43 0 -16 -52 0 -16 -61 0 -16 -70 0 -16 -79 0 -25 -34 0 -25 -43 0 -25 -52 0 -25 -61 0 -25 -70 0 -25 -79 0 -34 -43 0 -34 -52 0 -34 -61 0 -34 -70 0 -34 -79 0 -43 -52 0 -43 -61 0 -43 -70 0 -43 -79 0 -52 -61 0 -52 -70 0 -52 -79 0 -61 -70 0 -61 -79 0 -70 -79 0 -8 -17 0 -8 -26 0 -8 -35 0 -8 -44 0 -8 -53 0 -8 -62 0 -8 -71 0 -8 -80 0 -17 -26 0