diff --git a/base/maps/game/mars_city1/textures/objective1.tga b/base/maps/game/mars_city1/textures/objective1.tga
index b607d917..cc177961 100644
Binary files a/base/maps/game/mars_city1/textures/objective1.tga and b/base/maps/game/mars_city1/textures/objective1.tga differ
diff --git a/base/maps/game/mars_city1/textures/objective2.tga b/base/maps/game/mars_city1/textures/objective2.tga
index 94cc2fb0..fd9d7504 100644
Binary files a/base/maps/game/mars_city1/textures/objective2.tga and b/base/maps/game/mars_city1/textures/objective2.tga differ
diff --git a/base/maps/testmaps/test_city.cm b/base/maps/testmaps/test_city.cm
index 78806cb1..ac706960 100644
--- a/base/maps/testmaps/test_city.cm
+++ b/base/maps/testmaps/test_city.cm
@@ -3,7 +3,7 @@ CM "1.00"
3241721896
collisionModel "worldMap" {
- vertices { /* numVertices = */ 1322
+ vertices { /* numVertices = */ 5337
/* 0 */ ( 4932 3252.7998046875 0 )
/* 1 */ ( 3319.2001953125 3252.7998046875 0 )
/* 2 */ ( 3319.2001953125 4776 0 )
@@ -1326,8 +1326,4023 @@ collisionModel "worldMap" {
/* 1319 */ ( -3007.1999511719 -2916.8000488281 8 )
/* 1320 */ ( -2607.1999511719 -4440 0 )
/* 1321 */ ( -2991.1999511719 -4440 0 )
+ /* 1322 */ ( -20936 -19008 0 )
+ /* 1323 */ ( -20424 -19008 0 )
+ /* 1324 */ ( -20424 -18496 0 )
+ /* 1325 */ ( -20936 -18496 0 )
+ /* 1326 */ ( -19912 -19008 0 )
+ /* 1327 */ ( -19912 -18496 0 )
+ /* 1328 */ ( -19400 -19008 0 )
+ /* 1329 */ ( -19400 -18496 0 )
+ /* 1330 */ ( -18888 -19008 0 )
+ /* 1331 */ ( -18888 -18496 0 )
+ /* 1332 */ ( -18376 -19008 0 )
+ /* 1333 */ ( -18376 -18496 0 )
+ /* 1334 */ ( -17864 -19008 0 )
+ /* 1335 */ ( -17864 -18496 0 )
+ /* 1336 */ ( -17352 -19008 0 )
+ /* 1337 */ ( -17352 -18496 0 )
+ /* 1338 */ ( -16840 -19008 0 )
+ /* 1339 */ ( -16840 -18496 0 )
+ /* 1340 */ ( -16328 -19008 0 )
+ /* 1341 */ ( -16328 -18496 0 )
+ /* 1342 */ ( -15816 -19008 0 )
+ /* 1343 */ ( -15816 -18496 0 )
+ /* 1344 */ ( -15304 -19008 0 )
+ /* 1345 */ ( -15304 -18496 0 )
+ /* 1346 */ ( -14792 -19008 0 )
+ /* 1347 */ ( -14792 -18496 0 )
+ /* 1348 */ ( -14280 -19008 0 )
+ /* 1349 */ ( -14280 -18496 0 )
+ /* 1350 */ ( -13768 -19008 0 )
+ /* 1351 */ ( -13768 -18496 0 )
+ /* 1352 */ ( -13256 -19008 0 )
+ /* 1353 */ ( -13256 -18496 0 )
+ /* 1354 */ ( -12744 -19008 0 )
+ /* 1355 */ ( -12744 -18496 0 )
+ /* 1356 */ ( -12232 -19008 0 )
+ /* 1357 */ ( -12232 -18496 0 )
+ /* 1358 */ ( -11720 -19008 0 )
+ /* 1359 */ ( -11720 -18496 0 )
+ /* 1360 */ ( -11208 -19008 0 )
+ /* 1361 */ ( -11208 -18496 0 )
+ /* 1362 */ ( -10696 -19008 0 )
+ /* 1363 */ ( -10696 -18496 0 )
+ /* 1364 */ ( -10184 -19008 0 )
+ /* 1365 */ ( -10184 -18496 0 )
+ /* 1366 */ ( -9672 -19008 0 )
+ /* 1367 */ ( -9672 -18496 0 )
+ /* 1368 */ ( -9160 -19008 0 )
+ /* 1369 */ ( -9160 -18496 0 )
+ /* 1370 */ ( -8648 -19008 0 )
+ /* 1371 */ ( -8648 -18496 0 )
+ /* 1372 */ ( -8136 -19008 0 )
+ /* 1373 */ ( -8136 -18496 0 )
+ /* 1374 */ ( -7624 -19008 0 )
+ /* 1375 */ ( -7624 -18496 0 )
+ /* 1376 */ ( -7112 -19008 0 )
+ /* 1377 */ ( -7112 -18496 0 )
+ /* 1378 */ ( -6600 -19008 0 )
+ /* 1379 */ ( -6600 -18496 0 )
+ /* 1380 */ ( -6088 -19008 0 )
+ /* 1381 */ ( -6088 -18496 0 )
+ /* 1382 */ ( -5576 -19008 0 )
+ /* 1383 */ ( -5576 -18496 0 )
+ /* 1384 */ ( -5064 -19008 0 )
+ /* 1385 */ ( -5064 -18496 0 )
+ /* 1386 */ ( -4552 -19008 0 )
+ /* 1387 */ ( -4552 -18496 0 )
+ /* 1388 */ ( -4040 -19008 0 )
+ /* 1389 */ ( -4040 -18496 0 )
+ /* 1390 */ ( -3528 -19008 0 )
+ /* 1391 */ ( -3528 -18496 0 )
+ /* 1392 */ ( -3016 -19008 0 )
+ /* 1393 */ ( -3016 -18496 0 )
+ /* 1394 */ ( -2504 -19008 0 )
+ /* 1395 */ ( -2504 -18496 0 )
+ /* 1396 */ ( -1992 -19008 0 )
+ /* 1397 */ ( -1992 -18496 0 )
+ /* 1398 */ ( -1480 -19008 0 )
+ /* 1399 */ ( -1480 -18496 0 )
+ /* 1400 */ ( -968 -19008 0 )
+ /* 1401 */ ( -968 -18496 0 )
+ /* 1402 */ ( -456 -19008 0 )
+ /* 1403 */ ( -456 -18496 0 )
+ /* 1404 */ ( 56 -19008 0 )
+ /* 1405 */ ( 56 -18496 0 )
+ /* 1406 */ ( 568 -19008 0 )
+ /* 1407 */ ( 568 -18496 0 )
+ /* 1408 */ ( 1080 -19008 0 )
+ /* 1409 */ ( 1080 -18496 0 )
+ /* 1410 */ ( 1592 -19008 0 )
+ /* 1411 */ ( 1592 -18496 0 )
+ /* 1412 */ ( 2104 -19008 0 )
+ /* 1413 */ ( 2104 -18496 0 )
+ /* 1414 */ ( 2616 -19008 0 )
+ /* 1415 */ ( 2616 -18496 0 )
+ /* 1416 */ ( 3128 -19008 0 )
+ /* 1417 */ ( 3128 -18496 0 )
+ /* 1418 */ ( 3640 -19008 0 )
+ /* 1419 */ ( 3640 -18496 0 )
+ /* 1420 */ ( 4152 -19008 0 )
+ /* 1421 */ ( 4152 -18496 0 )
+ /* 1422 */ ( 4664 -19008 0 )
+ /* 1423 */ ( 4664 -18496 0 )
+ /* 1424 */ ( 5176 -19008 0 )
+ /* 1425 */ ( 5176 -18496 0 )
+ /* 1426 */ ( 5688 -19008 0 )
+ /* 1427 */ ( 5688 -18496 0 )
+ /* 1428 */ ( 6200 -19008 0 )
+ /* 1429 */ ( 6200 -18496 0 )
+ /* 1430 */ ( 6712 -19008 0 )
+ /* 1431 */ ( 6712 -18496 0 )
+ /* 1432 */ ( 7224 -19008 0 )
+ /* 1433 */ ( 7224 -18496 0 )
+ /* 1434 */ ( 7736 -19008 0 )
+ /* 1435 */ ( 7736 -18496 0 )
+ /* 1436 */ ( 8248 -19008 0 )
+ /* 1437 */ ( 8248 -18496 0 )
+ /* 1438 */ ( 8760 -19008 0 )
+ /* 1439 */ ( 8760 -18496 0 )
+ /* 1440 */ ( 9272 -19008 0 )
+ /* 1441 */ ( 9272 -18496 0 )
+ /* 1442 */ ( 9784 -19008 0 )
+ /* 1443 */ ( 9784 -18496 0 )
+ /* 1444 */ ( 10296 -19008 0 )
+ /* 1445 */ ( 10296 -18496 0 )
+ /* 1446 */ ( 10808 -19008 0 )
+ /* 1447 */ ( 10808 -18496 0 )
+ /* 1448 */ ( 11320 -19008 0 )
+ /* 1449 */ ( 11320 -18496 0 )
+ /* 1450 */ ( 11832 -19008 0 )
+ /* 1451 */ ( 11832 -18496 0 )
+ /* 1452 */ ( -20424 -17984 0 )
+ /* 1453 */ ( -20936 -17984 0 )
+ /* 1454 */ ( -19912 -17984 0 )
+ /* 1455 */ ( -19400 -17984 0 )
+ /* 1456 */ ( -18888 -17984 0 )
+ /* 1457 */ ( -18376 -17984 0 )
+ /* 1458 */ ( -17864 -17984 0 )
+ /* 1459 */ ( -17352 -17984 0 )
+ /* 1460 */ ( -16840 -17984 0 )
+ /* 1461 */ ( -16328 -17984 0 )
+ /* 1462 */ ( -15816 -17984 0 )
+ /* 1463 */ ( -15304 -17984 0 )
+ /* 1464 */ ( -14792 -17984 0 )
+ /* 1465 */ ( -14280 -17984 0 )
+ /* 1466 */ ( -13768 -17984 0 )
+ /* 1467 */ ( -13256 -17984 0 )
+ /* 1468 */ ( -12744 -17984 0 )
+ /* 1469 */ ( -12232 -17984 0 )
+ /* 1470 */ ( -11720 -17984 0 )
+ /* 1471 */ ( -11208 -17984 0 )
+ /* 1472 */ ( -10696 -17984 0 )
+ /* 1473 */ ( -10184 -17984 0 )
+ /* 1474 */ ( -9672 -17984 0 )
+ /* 1475 */ ( -9160 -17984 0 )
+ /* 1476 */ ( -8648 -17984 0 )
+ /* 1477 */ ( -8136 -17984 0 )
+ /* 1478 */ ( -7624 -17984 0 )
+ /* 1479 */ ( -7112 -17984 0 )
+ /* 1480 */ ( -6600 -17984 0 )
+ /* 1481 */ ( -6088 -17984 0 )
+ /* 1482 */ ( -5576 -17984 0 )
+ /* 1483 */ ( -5064 -17984 0 )
+ /* 1484 */ ( -4552 -17984 0 )
+ /* 1485 */ ( -4040 -17984 0 )
+ /* 1486 */ ( -3528 -17984 0 )
+ /* 1487 */ ( -3016 -17984 0 )
+ /* 1488 */ ( -2504 -17984 0 )
+ /* 1489 */ ( -1992 -17984 0 )
+ /* 1490 */ ( -1480 -17984 0 )
+ /* 1491 */ ( -968 -17984 0 )
+ /* 1492 */ ( -456 -17984 0 )
+ /* 1493 */ ( 56 -17984 0 )
+ /* 1494 */ ( 568 -17984 0 )
+ /* 1495 */ ( 1080 -17984 0 )
+ /* 1496 */ ( 1592 -17984 0 )
+ /* 1497 */ ( 2104 -17984 0 )
+ /* 1498 */ ( 2616 -17984 0 )
+ /* 1499 */ ( 3128 -17984 0 )
+ /* 1500 */ ( 3640 -17984 0 )
+ /* 1501 */ ( 4152 -17984 0 )
+ /* 1502 */ ( 4664 -17984 0 )
+ /* 1503 */ ( 5176 -17984 0 )
+ /* 1504 */ ( 5688 -17984 0 )
+ /* 1505 */ ( 6200 -17984 0 )
+ /* 1506 */ ( 6712 -17984 0 )
+ /* 1507 */ ( 7224 -17984 0 )
+ /* 1508 */ ( 7736 -17984 0 )
+ /* 1509 */ ( 8248 -17984 0 )
+ /* 1510 */ ( 8760 -17984 0 )
+ /* 1511 */ ( 9272 -17984 0 )
+ /* 1512 */ ( 9784 -17984 0 )
+ /* 1513 */ ( 10296 -17984 0 )
+ /* 1514 */ ( 10808 -17984 0 )
+ /* 1515 */ ( 11320 -17984 0 )
+ /* 1516 */ ( 11832 -17984 0 )
+ /* 1517 */ ( -20424 -17472 0 )
+ /* 1518 */ ( -20936 -17472 0 )
+ /* 1519 */ ( -19912 -17472 0 )
+ /* 1520 */ ( -19400 -17472 0 )
+ /* 1521 */ ( -18888 -17472 0 )
+ /* 1522 */ ( -18376 -17472 0 )
+ /* 1523 */ ( -17864 -17472 0 )
+ /* 1524 */ ( -17352 -17472 0 )
+ /* 1525 */ ( -16840 -17472 0 )
+ /* 1526 */ ( -16328 -17472 0 )
+ /* 1527 */ ( -15816 -17472 0 )
+ /* 1528 */ ( -15304 -17472 0 )
+ /* 1529 */ ( -14792 -17472 0 )
+ /* 1530 */ ( -14280 -17472 0 )
+ /* 1531 */ ( -13768 -17472 0 )
+ /* 1532 */ ( -13256 -17472 0 )
+ /* 1533 */ ( -12744 -17472 0 )
+ /* 1534 */ ( -12232 -17472 0 )
+ /* 1535 */ ( -11720 -17472 0 )
+ /* 1536 */ ( -11208 -17472 0 )
+ /* 1537 */ ( -10696 -17472 0 )
+ /* 1538 */ ( -10184 -17472 0 )
+ /* 1539 */ ( -9672 -17472 0 )
+ /* 1540 */ ( -9160 -17472 0 )
+ /* 1541 */ ( -8648 -17472 0 )
+ /* 1542 */ ( -8136 -17472 0 )
+ /* 1543 */ ( -7624 -17472 0 )
+ /* 1544 */ ( -7112 -17472 0 )
+ /* 1545 */ ( -6600 -17472 0 )
+ /* 1546 */ ( -6088 -17472 0 )
+ /* 1547 */ ( -5576 -17472 0 )
+ /* 1548 */ ( -5064 -17472 0 )
+ /* 1549 */ ( -4552 -17472 0 )
+ /* 1550 */ ( -4040 -17472 0 )
+ /* 1551 */ ( -3528 -17472 0 )
+ /* 1552 */ ( -3016 -17472 0 )
+ /* 1553 */ ( -2504 -17472 0 )
+ /* 1554 */ ( -1992 -17472 0 )
+ /* 1555 */ ( -1480 -17472 0 )
+ /* 1556 */ ( -968 -17472 0 )
+ /* 1557 */ ( -456 -17472 0 )
+ /* 1558 */ ( 56 -17472 0 )
+ /* 1559 */ ( 568 -17472 0 )
+ /* 1560 */ ( 1080 -17472 0 )
+ /* 1561 */ ( 1592 -17472 0 )
+ /* 1562 */ ( 2104 -17472 0 )
+ /* 1563 */ ( 2616 -17472 0 )
+ /* 1564 */ ( 3128 -17472 0 )
+ /* 1565 */ ( 3640 -17472 0 )
+ /* 1566 */ ( 4152 -17472 0 )
+ /* 1567 */ ( 4664 -17472 0 )
+ /* 1568 */ ( 5176 -17472 0 )
+ /* 1569 */ ( 5688 -17472 0 )
+ /* 1570 */ ( 6200 -17472 0 )
+ /* 1571 */ ( 6712 -17472 0 )
+ /* 1572 */ ( 7224 -17472 0 )
+ /* 1573 */ ( 7736 -17472 0 )
+ /* 1574 */ ( 8248 -17472 0 )
+ /* 1575 */ ( 8760 -17472 0 )
+ /* 1576 */ ( 9272 -17472 0 )
+ /* 1577 */ ( 9784 -17472 0 )
+ /* 1578 */ ( 10296 -17472 0 )
+ /* 1579 */ ( 10808 -17472 0 )
+ /* 1580 */ ( 11320 -17472 0 )
+ /* 1581 */ ( 11832 -17472 0 )
+ /* 1582 */ ( -20424 -16960 0 )
+ /* 1583 */ ( -20936 -16960 0 )
+ /* 1584 */ ( -19912 -16960 0 )
+ /* 1585 */ ( -19400 -16960 0 )
+ /* 1586 */ ( -18888 -16960 0 )
+ /* 1587 */ ( -18376 -16960 0 )
+ /* 1588 */ ( -17864 -16960 0 )
+ /* 1589 */ ( -17352 -16960 0 )
+ /* 1590 */ ( -16840 -16960 0 )
+ /* 1591 */ ( -16328 -16960 0 )
+ /* 1592 */ ( -15816 -16960 0 )
+ /* 1593 */ ( -15304 -16960 0 )
+ /* 1594 */ ( -14792 -16960 0 )
+ /* 1595 */ ( -14280 -16960 0 )
+ /* 1596 */ ( -13768 -16960 0 )
+ /* 1597 */ ( -13256 -16960 0 )
+ /* 1598 */ ( -12744 -16960 0 )
+ /* 1599 */ ( -12232 -16960 0 )
+ /* 1600 */ ( -11720 -16960 0 )
+ /* 1601 */ ( -11208 -16960 0 )
+ /* 1602 */ ( -10696 -16960 0 )
+ /* 1603 */ ( -10184 -16960 0 )
+ /* 1604 */ ( -9672 -16960 0 )
+ /* 1605 */ ( -9160 -16960 0 )
+ /* 1606 */ ( -8648 -16960 0 )
+ /* 1607 */ ( -8136 -16960 0 )
+ /* 1608 */ ( -7624 -16960 0 )
+ /* 1609 */ ( -7112 -16960 0 )
+ /* 1610 */ ( -6600 -16960 0 )
+ /* 1611 */ ( -6088 -16960 0 )
+ /* 1612 */ ( -5576 -16960 0 )
+ /* 1613 */ ( -5064 -16960 0 )
+ /* 1614 */ ( -4552 -16960 0 )
+ /* 1615 */ ( -4040 -16960 0 )
+ /* 1616 */ ( -3528 -16960 0 )
+ /* 1617 */ ( -3016 -16960 0 )
+ /* 1618 */ ( -2504 -16960 0 )
+ /* 1619 */ ( -1992 -16960 0 )
+ /* 1620 */ ( -1480 -16960 0 )
+ /* 1621 */ ( -968 -16960 0 )
+ /* 1622 */ ( -456 -16960 0 )
+ /* 1623 */ ( 56 -16960 0 )
+ /* 1624 */ ( 568 -16960 0 )
+ /* 1625 */ ( 1080 -16960 0 )
+ /* 1626 */ ( 1592 -16960 0 )
+ /* 1627 */ ( 2104 -16960 0 )
+ /* 1628 */ ( 2616 -16960 0 )
+ /* 1629 */ ( 3128 -16960 0 )
+ /* 1630 */ ( 3640 -16960 0 )
+ /* 1631 */ ( 4152 -16960 0 )
+ /* 1632 */ ( 4664 -16960 0 )
+ /* 1633 */ ( 5176 -16960 0 )
+ /* 1634 */ ( 5688 -16960 0 )
+ /* 1635 */ ( 6200 -16960 0 )
+ /* 1636 */ ( 6712 -16960 0 )
+ /* 1637 */ ( 7224 -16960 0 )
+ /* 1638 */ ( 7736 -16960 0 )
+ /* 1639 */ ( 8248 -16960 0 )
+ /* 1640 */ ( 8760 -16960 0 )
+ /* 1641 */ ( 9272 -16960 0 )
+ /* 1642 */ ( 9784 -16960 0 )
+ /* 1643 */ ( 10296 -16960 0 )
+ /* 1644 */ ( 10808 -16960 0 )
+ /* 1645 */ ( 11320 -16960 0 )
+ /* 1646 */ ( 11832 -16960 0 )
+ /* 1647 */ ( -20424 -16448 0 )
+ /* 1648 */ ( -20936 -16448 0 )
+ /* 1649 */ ( -19912 -16448 0 )
+ /* 1650 */ ( -19400 -16448 0 )
+ /* 1651 */ ( -18888 -16448 0 )
+ /* 1652 */ ( -18376 -16448 0 )
+ /* 1653 */ ( -17864 -16448 0 )
+ /* 1654 */ ( -17352 -16448 0 )
+ /* 1655 */ ( -16840 -16448 0 )
+ /* 1656 */ ( -16328 -16448 0 )
+ /* 1657 */ ( -15816 -16448 0 )
+ /* 1658 */ ( -15304 -16448 0 )
+ /* 1659 */ ( -14792 -16448 0 )
+ /* 1660 */ ( -14280 -16448 0 )
+ /* 1661 */ ( -13768 -16448 0 )
+ /* 1662 */ ( -13256 -16448 0 )
+ /* 1663 */ ( -12744 -16448 0 )
+ /* 1664 */ ( -12232 -16448 0 )
+ /* 1665 */ ( -11720 -16448 0 )
+ /* 1666 */ ( -11208 -16448 0 )
+ /* 1667 */ ( -10696 -16448 0 )
+ /* 1668 */ ( -10184 -16448 0 )
+ /* 1669 */ ( -9672 -16448 0 )
+ /* 1670 */ ( -9160 -16448 0 )
+ /* 1671 */ ( -8648 -16448 0 )
+ /* 1672 */ ( -8136 -16448 0 )
+ /* 1673 */ ( -7624 -16448 0 )
+ /* 1674 */ ( -7112 -16448 0 )
+ /* 1675 */ ( -6600 -16448 0 )
+ /* 1676 */ ( -6088 -16448 0 )
+ /* 1677 */ ( -5576 -16448 0 )
+ /* 1678 */ ( -5064 -16448 0 )
+ /* 1679 */ ( -4552 -16448 0 )
+ /* 1680 */ ( -4040 -16448 0 )
+ /* 1681 */ ( -3528 -16448 0 )
+ /* 1682 */ ( -3016 -16448 0 )
+ /* 1683 */ ( -2504 -16448 0 )
+ /* 1684 */ ( -1992 -16448 0 )
+ /* 1685 */ ( -1480 -16448 0 )
+ /* 1686 */ ( -968 -16448 0 )
+ /* 1687 */ ( -456 -16448 0 )
+ /* 1688 */ ( 56 -16448 0 )
+ /* 1689 */ ( 568 -16448 0 )
+ /* 1690 */ ( 1080 -16448 0 )
+ /* 1691 */ ( 1592 -16448 0 )
+ /* 1692 */ ( 2104 -16448 0 )
+ /* 1693 */ ( 2616 -16448 0 )
+ /* 1694 */ ( 3128 -16448 0 )
+ /* 1695 */ ( 3640 -16448 0 )
+ /* 1696 */ ( 4152 -16448 0 )
+ /* 1697 */ ( 4664 -16448 0 )
+ /* 1698 */ ( 5176 -16448 0 )
+ /* 1699 */ ( 5688 -16448 0 )
+ /* 1700 */ ( 6200 -16448 0 )
+ /* 1701 */ ( 6712 -16448 0 )
+ /* 1702 */ ( 7224 -16448 0 )
+ /* 1703 */ ( 7736 -16448 0 )
+ /* 1704 */ ( 8248 -16448 0 )
+ /* 1705 */ ( 8760 -16448 0 )
+ /* 1706 */ ( 9272 -16448 0 )
+ /* 1707 */ ( 9784 -16448 0 )
+ /* 1708 */ ( 10296 -16448 0 )
+ /* 1709 */ ( 10808 -16448 0 )
+ /* 1710 */ ( 11320 -16448 0 )
+ /* 1711 */ ( 11832 -16448 0 )
+ /* 1712 */ ( -20424 -15936 0 )
+ /* 1713 */ ( -20936 -15936 0 )
+ /* 1714 */ ( -19912 -15936 0 )
+ /* 1715 */ ( -19400 -15936 0 )
+ /* 1716 */ ( -18888 -15936 0 )
+ /* 1717 */ ( -18376 -15936 0 )
+ /* 1718 */ ( -17864 -15936 0 )
+ /* 1719 */ ( -17352 -15936 0 )
+ /* 1720 */ ( -16840 -15936 0 )
+ /* 1721 */ ( -16328 -15936 0 )
+ /* 1722 */ ( -15816 -15936 0 )
+ /* 1723 */ ( -15304 -15936 0 )
+ /* 1724 */ ( -14792 -15936 0 )
+ /* 1725 */ ( -14280 -15936 0 )
+ /* 1726 */ ( -13768 -15936 0 )
+ /* 1727 */ ( -13256 -15936 0 )
+ /* 1728 */ ( -12744 -15936 0 )
+ /* 1729 */ ( -12232 -15936 0 )
+ /* 1730 */ ( -11720 -15936 0 )
+ /* 1731 */ ( -11208 -15936 0 )
+ /* 1732 */ ( -10696 -15936 0 )
+ /* 1733 */ ( -10184 -15936 0 )
+ /* 1734 */ ( -9672 -15936 0 )
+ /* 1735 */ ( -9160 -15936 0 )
+ /* 1736 */ ( -8648 -15936 0 )
+ /* 1737 */ ( -8136 -15936 0 )
+ /* 1738 */ ( -7624 -15936 0 )
+ /* 1739 */ ( -7112 -15936 0 )
+ /* 1740 */ ( -6600 -15936 0 )
+ /* 1741 */ ( -6088 -15936 0 )
+ /* 1742 */ ( -5576 -15936 0 )
+ /* 1743 */ ( -5064 -15936 0 )
+ /* 1744 */ ( -4552 -15936 0 )
+ /* 1745 */ ( -4040 -15936 0 )
+ /* 1746 */ ( -3528 -15936 0 )
+ /* 1747 */ ( -3016 -15936 0 )
+ /* 1748 */ ( -2504 -15936 0 )
+ /* 1749 */ ( -1992 -15936 0 )
+ /* 1750 */ ( -1480 -15936 0 )
+ /* 1751 */ ( -968 -15936 0 )
+ /* 1752 */ ( -456 -15936 0 )
+ /* 1753 */ ( 56 -15936 0 )
+ /* 1754 */ ( 568 -15936 0 )
+ /* 1755 */ ( 1080 -15936 0 )
+ /* 1756 */ ( 1592 -15936 0 )
+ /* 1757 */ ( 2104 -15936 0 )
+ /* 1758 */ ( 2616 -15936 0 )
+ /* 1759 */ ( 3128 -15936 0 )
+ /* 1760 */ ( 3640 -15936 0 )
+ /* 1761 */ ( 4152 -15936 0 )
+ /* 1762 */ ( 4664 -15936 0 )
+ /* 1763 */ ( 5176 -15936 0 )
+ /* 1764 */ ( 5688 -15936 0 )
+ /* 1765 */ ( 6200 -15936 0 )
+ /* 1766 */ ( 6712 -15936 0 )
+ /* 1767 */ ( 7224 -15936 0 )
+ /* 1768 */ ( 7736 -15936 0 )
+ /* 1769 */ ( 8248 -15936 0 )
+ /* 1770 */ ( 8760 -15936 0 )
+ /* 1771 */ ( 9272 -15936 0 )
+ /* 1772 */ ( 9784 -15936 0 )
+ /* 1773 */ ( 10296 -15936 0 )
+ /* 1774 */ ( 10808 -15936 0 )
+ /* 1775 */ ( 11320 -15936 0 )
+ /* 1776 */ ( 11832 -15936 0 )
+ /* 1777 */ ( -20424 -15424 0 )
+ /* 1778 */ ( -20936 -15424 0 )
+ /* 1779 */ ( -19912 -15424 0 )
+ /* 1780 */ ( -19400 -15424 0 )
+ /* 1781 */ ( -18888 -15424 0 )
+ /* 1782 */ ( -18376 -15424 0 )
+ /* 1783 */ ( -17864 -15424 0 )
+ /* 1784 */ ( -17352 -15424 0 )
+ /* 1785 */ ( -16840 -15424 0 )
+ /* 1786 */ ( -16328 -15424 0 )
+ /* 1787 */ ( -15816 -15424 0 )
+ /* 1788 */ ( -15304 -15424 0 )
+ /* 1789 */ ( -14792 -15424 0 )
+ /* 1790 */ ( -14280 -15424 0 )
+ /* 1791 */ ( -13768 -15424 0 )
+ /* 1792 */ ( -13256 -15424 0 )
+ /* 1793 */ ( -12744 -15424 0 )
+ /* 1794 */ ( -12232 -15424 0 )
+ /* 1795 */ ( -11720 -15424 0 )
+ /* 1796 */ ( -11208 -15424 0 )
+ /* 1797 */ ( -10696 -15424 0 )
+ /* 1798 */ ( -10184 -15424 0 )
+ /* 1799 */ ( -9672 -15424 0 )
+ /* 1800 */ ( -9160 -15424 0 )
+ /* 1801 */ ( -8648 -15424 0 )
+ /* 1802 */ ( -8136 -15424 0 )
+ /* 1803 */ ( -7624 -15424 0 )
+ /* 1804 */ ( -7112 -15424 0 )
+ /* 1805 */ ( -6600 -15424 0 )
+ /* 1806 */ ( -6088 -15424 0 )
+ /* 1807 */ ( -5576 -15424 0 )
+ /* 1808 */ ( -5064 -15424 0 )
+ /* 1809 */ ( -4552 -15424 0 )
+ /* 1810 */ ( -4040 -15424 0 )
+ /* 1811 */ ( -3528 -15424 0 )
+ /* 1812 */ ( -3016 -15424 0 )
+ /* 1813 */ ( -2504 -15424 0 )
+ /* 1814 */ ( -1992 -15424 0 )
+ /* 1815 */ ( -1480 -15424 0 )
+ /* 1816 */ ( -968 -15424 0 )
+ /* 1817 */ ( -456 -15424 0 )
+ /* 1818 */ ( 56 -15424 0 )
+ /* 1819 */ ( 568 -15424 0 )
+ /* 1820 */ ( 1080 -15424 0 )
+ /* 1821 */ ( 1592 -15424 0 )
+ /* 1822 */ ( 2104 -15424 0 )
+ /* 1823 */ ( 2616 -15424 0 )
+ /* 1824 */ ( 3128 -15424 0 )
+ /* 1825 */ ( 3640 -15424 0 )
+ /* 1826 */ ( 4152 -15424 0 )
+ /* 1827 */ ( 4664 -15424 0 )
+ /* 1828 */ ( 5176 -15424 0 )
+ /* 1829 */ ( 5688 -15424 0 )
+ /* 1830 */ ( 6200 -15424 0 )
+ /* 1831 */ ( 6712 -15424 0 )
+ /* 1832 */ ( 7224 -15424 0 )
+ /* 1833 */ ( 7736 -15424 0 )
+ /* 1834 */ ( 8248 -15424 0 )
+ /* 1835 */ ( 8760 -15424 0 )
+ /* 1836 */ ( 9272 -15424 0 )
+ /* 1837 */ ( 9784 -15424 0 )
+ /* 1838 */ ( 10296 -15424 0 )
+ /* 1839 */ ( 10808 -15424 0 )
+ /* 1840 */ ( 11320 -15424 0 )
+ /* 1841 */ ( 11832 -15424 0 )
+ /* 1842 */ ( -20424 -14912 0 )
+ /* 1843 */ ( -20936 -14912 0 )
+ /* 1844 */ ( -19912 -14912 0 )
+ /* 1845 */ ( -19400 -14912 0 )
+ /* 1846 */ ( -18888 -14912 0 )
+ /* 1847 */ ( -18376 -14912 0 )
+ /* 1848 */ ( -17864 -14912 0 )
+ /* 1849 */ ( -17352 -14912 0 )
+ /* 1850 */ ( -16840 -14912 0 )
+ /* 1851 */ ( -16328 -14912 0 )
+ /* 1852 */ ( -15816 -14912 0 )
+ /* 1853 */ ( -15304 -14912 0 )
+ /* 1854 */ ( -14792 -14912 0 )
+ /* 1855 */ ( -14280 -14912 0 )
+ /* 1856 */ ( -13768 -14912 0 )
+ /* 1857 */ ( -13256 -14912 0 )
+ /* 1858 */ ( -12744 -14912 0 )
+ /* 1859 */ ( -12232 -14912 0 )
+ /* 1860 */ ( -11720 -14912 0 )
+ /* 1861 */ ( -11208 -14912 0 )
+ /* 1862 */ ( -10696 -14912 0 )
+ /* 1863 */ ( -10184 -14912 0 )
+ /* 1864 */ ( -9672 -14912 0 )
+ /* 1865 */ ( -9160 -14912 0 )
+ /* 1866 */ ( -8648 -14912 0 )
+ /* 1867 */ ( -8136 -14912 0 )
+ /* 1868 */ ( -7624 -14912 0 )
+ /* 1869 */ ( -7112 -14912 0 )
+ /* 1870 */ ( -6600 -14912 0 )
+ /* 1871 */ ( -6088 -14912 0 )
+ /* 1872 */ ( -5576 -14912 0 )
+ /* 1873 */ ( -5064 -14912 0 )
+ /* 1874 */ ( -4552 -14912 0 )
+ /* 1875 */ ( -4040 -14912 0 )
+ /* 1876 */ ( -3528 -14912 0 )
+ /* 1877 */ ( -3016 -14912 0 )
+ /* 1878 */ ( -2504 -14912 0 )
+ /* 1879 */ ( -1992 -14912 0 )
+ /* 1880 */ ( -1480 -14912 0 )
+ /* 1881 */ ( -968 -14912 0 )
+ /* 1882 */ ( -456 -14912 0 )
+ /* 1883 */ ( 56 -14912 0 )
+ /* 1884 */ ( 568 -14912 0 )
+ /* 1885 */ ( 1080 -14912 0 )
+ /* 1886 */ ( 1592 -14912 0 )
+ /* 1887 */ ( 2104 -14912 0 )
+ /* 1888 */ ( 2616 -14912 0 )
+ /* 1889 */ ( 3128 -14912 0 )
+ /* 1890 */ ( 3640 -14912 0 )
+ /* 1891 */ ( 4152 -14912 0 )
+ /* 1892 */ ( 4664 -14912 0 )
+ /* 1893 */ ( 5176 -14912 0 )
+ /* 1894 */ ( 5688 -14912 0 )
+ /* 1895 */ ( 6200 -14912 0 )
+ /* 1896 */ ( 6712 -14912 0 )
+ /* 1897 */ ( 7224 -14912 0 )
+ /* 1898 */ ( 7736 -14912 0 )
+ /* 1899 */ ( 8248 -14912 0 )
+ /* 1900 */ ( 8760 -14912 0 )
+ /* 1901 */ ( 9272 -14912 0 )
+ /* 1902 */ ( 9784 -14912 0 )
+ /* 1903 */ ( 10296 -14912 0 )
+ /* 1904 */ ( 10808 -14912 0 )
+ /* 1905 */ ( 11320 -14912 0 )
+ /* 1906 */ ( 11832 -14912 0 )
+ /* 1907 */ ( -20424 -14400 0 )
+ /* 1908 */ ( -20936 -14400 0 )
+ /* 1909 */ ( -19912 -14400 0 )
+ /* 1910 */ ( -19400 -14400 0 )
+ /* 1911 */ ( -18888 -14400 0 )
+ /* 1912 */ ( -18376 -14400 0 )
+ /* 1913 */ ( -17864 -14400 0 )
+ /* 1914 */ ( -17352 -14400 0 )
+ /* 1915 */ ( -16840 -14400 0 )
+ /* 1916 */ ( -16328 -14400 0 )
+ /* 1917 */ ( -15816 -14400 0 )
+ /* 1918 */ ( -15304 -14400 0 )
+ /* 1919 */ ( -14792 -14400 0 )
+ /* 1920 */ ( -14280 -14400 0 )
+ /* 1921 */ ( -13768 -14400 0 )
+ /* 1922 */ ( -13256 -14400 0 )
+ /* 1923 */ ( -12744 -14400 0 )
+ /* 1924 */ ( -12232 -14400 0 )
+ /* 1925 */ ( -11720 -14400 0 )
+ /* 1926 */ ( -11208 -14400 0 )
+ /* 1927 */ ( -10696 -14400 0 )
+ /* 1928 */ ( -10184 -14400 0 )
+ /* 1929 */ ( -9672 -14400 0 )
+ /* 1930 */ ( -9160 -14400 0 )
+ /* 1931 */ ( -8648 -14400 0 )
+ /* 1932 */ ( -8136 -14400 0 )
+ /* 1933 */ ( -7624 -14400 0 )
+ /* 1934 */ ( -7112 -14400 0 )
+ /* 1935 */ ( -6600 -14400 0 )
+ /* 1936 */ ( -6088 -14400 0 )
+ /* 1937 */ ( -5576 -14400 0 )
+ /* 1938 */ ( -5064 -14400 0 )
+ /* 1939 */ ( -4552 -14400 0 )
+ /* 1940 */ ( -4040 -14400 0 )
+ /* 1941 */ ( -3528 -14400 0 )
+ /* 1942 */ ( -3016 -14400 0 )
+ /* 1943 */ ( -2504 -14400 0 )
+ /* 1944 */ ( -1992 -14400 0 )
+ /* 1945 */ ( -1480 -14400 0 )
+ /* 1946 */ ( -968 -14400 0 )
+ /* 1947 */ ( -456 -14400 0 )
+ /* 1948 */ ( 56 -14400 0 )
+ /* 1949 */ ( 568 -14400 0 )
+ /* 1950 */ ( 1080 -14400 0 )
+ /* 1951 */ ( 1592 -14400 0 )
+ /* 1952 */ ( 2104 -14400 0 )
+ /* 1953 */ ( 2616 -14400 0 )
+ /* 1954 */ ( 3128 -14400 0 )
+ /* 1955 */ ( 3640 -14400 0 )
+ /* 1956 */ ( 4152 -14400 0 )
+ /* 1957 */ ( 4664 -14400 0 )
+ /* 1958 */ ( 5176 -14400 0 )
+ /* 1959 */ ( 5688 -14400 0 )
+ /* 1960 */ ( 6200 -14400 0 )
+ /* 1961 */ ( 6712 -14400 0 )
+ /* 1962 */ ( 7224 -14400 0 )
+ /* 1963 */ ( 7736 -14400 0 )
+ /* 1964 */ ( 8248 -14400 0 )
+ /* 1965 */ ( 8760 -14400 0 )
+ /* 1966 */ ( 9272 -14400 0 )
+ /* 1967 */ ( 9784 -14400 0 )
+ /* 1968 */ ( 10296 -14400 0 )
+ /* 1969 */ ( 10808 -14400 0 )
+ /* 1970 */ ( 11320 -14400 0 )
+ /* 1971 */ ( 11832 -14400 0 )
+ /* 1972 */ ( -20424 -13888 0 )
+ /* 1973 */ ( -20936 -13888 0 )
+ /* 1974 */ ( -19912 -13888 0 )
+ /* 1975 */ ( -19400 -13888 0 )
+ /* 1976 */ ( -18888 -13888 0 )
+ /* 1977 */ ( -18376 -13888 0 )
+ /* 1978 */ ( -17864 -13888 0 )
+ /* 1979 */ ( -17352 -13888 0 )
+ /* 1980 */ ( -16840 -13888 0 )
+ /* 1981 */ ( -16328 -13888 0 )
+ /* 1982 */ ( -15816 -13888 0 )
+ /* 1983 */ ( -15304 -13888 0 )
+ /* 1984 */ ( -14792 -13888 0 )
+ /* 1985 */ ( -14280 -13888 0 )
+ /* 1986 */ ( -13768 -13888 0 )
+ /* 1987 */ ( -13256 -13888 0 )
+ /* 1988 */ ( -12744 -13888 0 )
+ /* 1989 */ ( -12232 -13888 0 )
+ /* 1990 */ ( -11720 -13888 0 )
+ /* 1991 */ ( -11208 -13888 0 )
+ /* 1992 */ ( -10696 -13888 0 )
+ /* 1993 */ ( -10184 -13888 0 )
+ /* 1994 */ ( -9672 -13888 0 )
+ /* 1995 */ ( -9160 -13888 0 )
+ /* 1996 */ ( -8648 -13888 0 )
+ /* 1997 */ ( -8136 -13888 0 )
+ /* 1998 */ ( -7624 -13888 0 )
+ /* 1999 */ ( -7112 -13888 0 )
+ /* 2000 */ ( -6600 -13888 0 )
+ /* 2001 */ ( -6088 -13888 0 )
+ /* 2002 */ ( -5576 -13888 0 )
+ /* 2003 */ ( -5064 -13888 0 )
+ /* 2004 */ ( -4552 -13888 0 )
+ /* 2005 */ ( -4040 -13888 0 )
+ /* 2006 */ ( -3528 -13888 0 )
+ /* 2007 */ ( -3016 -13888 0 )
+ /* 2008 */ ( -2504 -13888 0 )
+ /* 2009 */ ( -1992 -13888 0 )
+ /* 2010 */ ( -1480 -13888 0 )
+ /* 2011 */ ( -968 -13888 0 )
+ /* 2012 */ ( -456 -13888 0 )
+ /* 2013 */ ( 56 -13888 0 )
+ /* 2014 */ ( 568 -13888 0 )
+ /* 2015 */ ( 1080 -13888 0 )
+ /* 2016 */ ( 1592 -13888 0 )
+ /* 2017 */ ( 2104 -13888 0 )
+ /* 2018 */ ( 2616 -13888 0 )
+ /* 2019 */ ( 3128 -13888 0 )
+ /* 2020 */ ( 3640 -13888 0 )
+ /* 2021 */ ( 4152 -13888 0 )
+ /* 2022 */ ( 4664 -13888 0 )
+ /* 2023 */ ( 5176 -13888 0 )
+ /* 2024 */ ( 5688 -13888 0 )
+ /* 2025 */ ( 6200 -13888 0 )
+ /* 2026 */ ( 6712 -13888 0 )
+ /* 2027 */ ( 7224 -13888 0 )
+ /* 2028 */ ( 7736 -13888 0 )
+ /* 2029 */ ( 8248 -13888 0 )
+ /* 2030 */ ( 8760 -13888 0 )
+ /* 2031 */ ( 9272 -13888 0 )
+ /* 2032 */ ( 9784 -13888 0 )
+ /* 2033 */ ( 10296 -13888 0 )
+ /* 2034 */ ( 10808 -13888 0 )
+ /* 2035 */ ( 11320 -13888 0 )
+ /* 2036 */ ( 11832 -13888 0 )
+ /* 2037 */ ( -20424 -13376 0 )
+ /* 2038 */ ( -20936 -13376 0 )
+ /* 2039 */ ( -19912 -13376 0 )
+ /* 2040 */ ( -19400 -13376 0 )
+ /* 2041 */ ( -18888 -13376 0 )
+ /* 2042 */ ( -18376 -13376 0 )
+ /* 2043 */ ( -17864 -13376 0 )
+ /* 2044 */ ( -17352 -13376 0 )
+ /* 2045 */ ( -16840 -13376 0 )
+ /* 2046 */ ( -16328 -13376 0 )
+ /* 2047 */ ( -15816 -13376 0 )
+ /* 2048 */ ( -15304 -13376 0 )
+ /* 2049 */ ( -14792 -13376 0 )
+ /* 2050 */ ( -14280 -13376 0 )
+ /* 2051 */ ( -13768 -13376 0 )
+ /* 2052 */ ( -13256 -13376 0 )
+ /* 2053 */ ( -12744 -13376 0 )
+ /* 2054 */ ( -12232 -13376 0 )
+ /* 2055 */ ( -11720 -13376 0 )
+ /* 2056 */ ( -11208 -13376 0 )
+ /* 2057 */ ( -10696 -13376 0 )
+ /* 2058 */ ( -10184 -13376 0 )
+ /* 2059 */ ( -9672 -13376 0 )
+ /* 2060 */ ( -9160 -13376 0 )
+ /* 2061 */ ( -8648 -13376 0 )
+ /* 2062 */ ( -8136 -13376 0 )
+ /* 2063 */ ( -7624 -13376 0 )
+ /* 2064 */ ( -7112 -13376 0 )
+ /* 2065 */ ( -6600 -13376 0 )
+ /* 2066 */ ( -6088 -13376 0 )
+ /* 2067 */ ( -5576 -13376 0 )
+ /* 2068 */ ( -5064 -13376 0 )
+ /* 2069 */ ( -4552 -13376 0 )
+ /* 2070 */ ( -4040 -13376 0 )
+ /* 2071 */ ( -3528 -13376 0 )
+ /* 2072 */ ( -3016 -13376 0 )
+ /* 2073 */ ( -2504 -13376 0 )
+ /* 2074 */ ( -1992 -13376 0 )
+ /* 2075 */ ( -1480 -13376 0 )
+ /* 2076 */ ( -968 -13376 0 )
+ /* 2077 */ ( -456 -13376 0 )
+ /* 2078 */ ( 56 -13376 0 )
+ /* 2079 */ ( 568 -13376 0 )
+ /* 2080 */ ( 1080 -13376 0 )
+ /* 2081 */ ( 1592 -13376 0 )
+ /* 2082 */ ( 2104 -13376 0 )
+ /* 2083 */ ( 2616 -13376 0 )
+ /* 2084 */ ( 3128 -13376 0 )
+ /* 2085 */ ( 3640 -13376 0 )
+ /* 2086 */ ( 4152 -13376 0 )
+ /* 2087 */ ( 4664 -13376 0 )
+ /* 2088 */ ( 5176 -13376 0 )
+ /* 2089 */ ( 5688 -13376 0 )
+ /* 2090 */ ( 6200 -13376 0 )
+ /* 2091 */ ( 6712 -13376 0 )
+ /* 2092 */ ( 7224 -13376 0 )
+ /* 2093 */ ( 7736 -13376 0 )
+ /* 2094 */ ( 8248 -13376 0 )
+ /* 2095 */ ( 8760 -13376 0 )
+ /* 2096 */ ( 9272 -13376 0 )
+ /* 2097 */ ( 9784 -13376 0 )
+ /* 2098 */ ( 10296 -13376 0 )
+ /* 2099 */ ( 10808 -13376 0 )
+ /* 2100 */ ( 11320 -13376 0 )
+ /* 2101 */ ( 11832 -13376 0 )
+ /* 2102 */ ( -20424 -12864 0 )
+ /* 2103 */ ( -20936 -12864 0 )
+ /* 2104 */ ( -19912 -12864 0 )
+ /* 2105 */ ( -19400 -12864 0 )
+ /* 2106 */ ( -18888 -12864 0 )
+ /* 2107 */ ( -18376 -12864 0 )
+ /* 2108 */ ( -17864 -12864 0 )
+ /* 2109 */ ( -17352 -12864 0 )
+ /* 2110 */ ( -16840 -12864 0 )
+ /* 2111 */ ( -16328 -12864 0 )
+ /* 2112 */ ( -15816 -12864 0 )
+ /* 2113 */ ( -15304 -12864 0 )
+ /* 2114 */ ( -14792 -12864 0 )
+ /* 2115 */ ( -14280 -12864 0 )
+ /* 2116 */ ( -13768 -12864 0 )
+ /* 2117 */ ( -13256 -12864 0 )
+ /* 2118 */ ( -12744 -12864 0 )
+ /* 2119 */ ( -12232 -12864 0 )
+ /* 2120 */ ( -11720 -12864 0 )
+ /* 2121 */ ( -11208 -12864 0 )
+ /* 2122 */ ( -10696 -12864 0 )
+ /* 2123 */ ( -10184 -12864 0 )
+ /* 2124 */ ( -9672 -12864 0 )
+ /* 2125 */ ( -9160 -12864 0 )
+ /* 2126 */ ( -8648 -12864 0 )
+ /* 2127 */ ( -8136 -12864 0 )
+ /* 2128 */ ( -7624 -12864 0 )
+ /* 2129 */ ( -7112 -12864 0 )
+ /* 2130 */ ( -6600 -12864 0 )
+ /* 2131 */ ( -6088 -12864 0 )
+ /* 2132 */ ( -5576 -12864 0 )
+ /* 2133 */ ( -5064 -12864 0 )
+ /* 2134 */ ( -4552 -12864 0 )
+ /* 2135 */ ( -4040 -12864 0 )
+ /* 2136 */ ( -3528 -12864 0 )
+ /* 2137 */ ( -3016 -12864 0 )
+ /* 2138 */ ( -2504 -12864 0 )
+ /* 2139 */ ( -1992 -12864 0 )
+ /* 2140 */ ( -1480 -12864 0 )
+ /* 2141 */ ( -968 -12864 0 )
+ /* 2142 */ ( -456 -12864 0 )
+ /* 2143 */ ( 56 -12864 0 )
+ /* 2144 */ ( 568 -12864 0 )
+ /* 2145 */ ( 1080 -12864 0 )
+ /* 2146 */ ( 1592 -12864 0 )
+ /* 2147 */ ( 2104 -12864 0 )
+ /* 2148 */ ( 2616 -12864 0 )
+ /* 2149 */ ( 3128 -12864 0 )
+ /* 2150 */ ( 3640 -12864 0 )
+ /* 2151 */ ( 4152 -12864 0 )
+ /* 2152 */ ( 4664 -12864 0 )
+ /* 2153 */ ( 5176 -12864 0 )
+ /* 2154 */ ( 5688 -12864 0 )
+ /* 2155 */ ( 6200 -12864 0 )
+ /* 2156 */ ( 6712 -12864 0 )
+ /* 2157 */ ( 7224 -12864 0 )
+ /* 2158 */ ( 7736 -12864 0 )
+ /* 2159 */ ( 8248 -12864 0 )
+ /* 2160 */ ( 8760 -12864 0 )
+ /* 2161 */ ( 9272 -12864 0 )
+ /* 2162 */ ( 9784 -12864 0 )
+ /* 2163 */ ( 10296 -12864 0 )
+ /* 2164 */ ( 10808 -12864 0 )
+ /* 2165 */ ( 11320 -12864 0 )
+ /* 2166 */ ( 11832 -12864 0 )
+ /* 2167 */ ( -20424 -12352 0 )
+ /* 2168 */ ( -20936 -12352 0 )
+ /* 2169 */ ( -19912 -12352 0 )
+ /* 2170 */ ( -19400 -12352 0 )
+ /* 2171 */ ( -18888 -12352 0 )
+ /* 2172 */ ( -18376 -12352 0 )
+ /* 2173 */ ( -17864 -12352 0 )
+ /* 2174 */ ( -17352 -12352 0 )
+ /* 2175 */ ( -16840 -12352 0 )
+ /* 2176 */ ( -16328 -12352 0 )
+ /* 2177 */ ( -15816 -12352 0 )
+ /* 2178 */ ( -15304 -12352 0 )
+ /* 2179 */ ( -14792 -12352 0 )
+ /* 2180 */ ( -14280 -12352 0 )
+ /* 2181 */ ( -13768 -12352 0 )
+ /* 2182 */ ( -13256 -12352 0 )
+ /* 2183 */ ( -12744 -12352 0 )
+ /* 2184 */ ( -12232 -12352 0 )
+ /* 2185 */ ( -11720 -12352 0 )
+ /* 2186 */ ( -11208 -12352 0 )
+ /* 2187 */ ( -10696 -12352 0 )
+ /* 2188 */ ( -10184 -12352 0 )
+ /* 2189 */ ( -9672 -12352 0 )
+ /* 2190 */ ( -9160 -12352 0 )
+ /* 2191 */ ( -8648 -12352 0 )
+ /* 2192 */ ( -8136 -12352 0 )
+ /* 2193 */ ( -7624 -12352 0 )
+ /* 2194 */ ( -7112 -12352 0 )
+ /* 2195 */ ( -6600 -12352 0 )
+ /* 2196 */ ( -6088 -12352 0 )
+ /* 2197 */ ( -5576 -12352 0 )
+ /* 2198 */ ( -5064 -12352 0 )
+ /* 2199 */ ( -4552 -12352 0 )
+ /* 2200 */ ( -4040 -12352 0 )
+ /* 2201 */ ( -3528 -12352 0 )
+ /* 2202 */ ( -3016 -12352 0 )
+ /* 2203 */ ( -2504 -12352 0 )
+ /* 2204 */ ( -1992 -12352 0 )
+ /* 2205 */ ( -1480 -12352 0 )
+ /* 2206 */ ( -968 -12352 0 )
+ /* 2207 */ ( -456 -12352 0 )
+ /* 2208 */ ( 56 -12352 0 )
+ /* 2209 */ ( 568 -12352 0 )
+ /* 2210 */ ( 1080 -12352 0 )
+ /* 2211 */ ( 1592 -12352 0 )
+ /* 2212 */ ( 2104 -12352 0 )
+ /* 2213 */ ( 2616 -12352 0 )
+ /* 2214 */ ( 3128 -12352 0 )
+ /* 2215 */ ( 3640 -12352 0 )
+ /* 2216 */ ( 4152 -12352 0 )
+ /* 2217 */ ( 4664 -12352 0 )
+ /* 2218 */ ( 5176 -12352 0 )
+ /* 2219 */ ( 5688 -12352 0 )
+ /* 2220 */ ( 6200 -12352 0 )
+ /* 2221 */ ( 6712 -12352 0 )
+ /* 2222 */ ( 7224 -12352 0 )
+ /* 2223 */ ( 7736 -12352 0 )
+ /* 2224 */ ( 8248 -12352 0 )
+ /* 2225 */ ( 8760 -12352 0 )
+ /* 2226 */ ( 9272 -12352 0 )
+ /* 2227 */ ( 9784 -12352 0 )
+ /* 2228 */ ( 10296 -12352 0 )
+ /* 2229 */ ( 10808 -12352 0 )
+ /* 2230 */ ( 11320 -12352 0 )
+ /* 2231 */ ( 11832 -12352 0 )
+ /* 2232 */ ( -20424 -11840 0 )
+ /* 2233 */ ( -20936 -11840 0 )
+ /* 2234 */ ( -19912 -11840 0 )
+ /* 2235 */ ( -19400 -11840 0 )
+ /* 2236 */ ( -18888 -11840 0 )
+ /* 2237 */ ( -18376 -11840 0 )
+ /* 2238 */ ( -17864 -11840 0 )
+ /* 2239 */ ( -17352 -11840 0 )
+ /* 2240 */ ( -16840 -11840 0 )
+ /* 2241 */ ( -16328 -11840 0 )
+ /* 2242 */ ( -15816 -11840 0 )
+ /* 2243 */ ( -15304 -11840 0 )
+ /* 2244 */ ( -14792 -11840 0 )
+ /* 2245 */ ( -14280 -11840 0 )
+ /* 2246 */ ( -13768 -11840 0 )
+ /* 2247 */ ( -13256 -11840 0 )
+ /* 2248 */ ( -12744 -11840 0 )
+ /* 2249 */ ( -12232 -11840 0 )
+ /* 2250 */ ( -11720 -11840 0 )
+ /* 2251 */ ( -11208 -11840 0 )
+ /* 2252 */ ( -10696 -11840 0 )
+ /* 2253 */ ( -10184 -11840 0 )
+ /* 2254 */ ( -9672 -11840 0 )
+ /* 2255 */ ( -9160 -11840 0 )
+ /* 2256 */ ( -8648 -11840 0 )
+ /* 2257 */ ( -8136 -11840 0 )
+ /* 2258 */ ( -7624 -11840 0 )
+ /* 2259 */ ( -7112 -11840 0 )
+ /* 2260 */ ( -6600 -11840 0 )
+ /* 2261 */ ( -6088 -11840 0 )
+ /* 2262 */ ( -5576 -11840 0 )
+ /* 2263 */ ( -5064 -11840 0 )
+ /* 2264 */ ( -4552 -11840 0 )
+ /* 2265 */ ( -4040 -11840 0 )
+ /* 2266 */ ( -3528 -11840 0 )
+ /* 2267 */ ( -3016 -11840 0 )
+ /* 2268 */ ( -2504 -11840 0 )
+ /* 2269 */ ( -1992 -11840 0 )
+ /* 2270 */ ( -1480 -11840 0 )
+ /* 2271 */ ( -968 -11840 0 )
+ /* 2272 */ ( -456 -11840 0 )
+ /* 2273 */ ( 56 -11840 0 )
+ /* 2274 */ ( 568 -11840 0 )
+ /* 2275 */ ( 1080 -11840 0 )
+ /* 2276 */ ( 1592 -11840 0 )
+ /* 2277 */ ( 2104 -11840 0 )
+ /* 2278 */ ( 2616 -11840 0 )
+ /* 2279 */ ( 3128 -11840 0 )
+ /* 2280 */ ( 3640 -11840 0 )
+ /* 2281 */ ( 4152 -11840 0 )
+ /* 2282 */ ( 4664 -11840 0 )
+ /* 2283 */ ( 5176 -11840 0 )
+ /* 2284 */ ( 5688 -11840 0 )
+ /* 2285 */ ( 6200 -11840 0 )
+ /* 2286 */ ( 6712 -11840 0 )
+ /* 2287 */ ( 7224 -11840 0 )
+ /* 2288 */ ( 7736 -11840 0 )
+ /* 2289 */ ( 8248 -11840 0 )
+ /* 2290 */ ( 8760 -11840 0 )
+ /* 2291 */ ( 9272 -11840 0 )
+ /* 2292 */ ( 9784 -11840 0 )
+ /* 2293 */ ( 10296 -11840 0 )
+ /* 2294 */ ( 10808 -11840 0 )
+ /* 2295 */ ( 11320 -11840 0 )
+ /* 2296 */ ( 11832 -11840 0 )
+ /* 2297 */ ( -20424 -11328 0 )
+ /* 2298 */ ( -20936 -11328 0 )
+ /* 2299 */ ( -19912 -11328 0 )
+ /* 2300 */ ( -19400 -11328 0 )
+ /* 2301 */ ( -18888 -11328 0 )
+ /* 2302 */ ( -18376 -11328 0 )
+ /* 2303 */ ( -17864 -11328 0 )
+ /* 2304 */ ( -17352 -11328 0 )
+ /* 2305 */ ( -16840 -11328 0 )
+ /* 2306 */ ( -16328 -11328 0 )
+ /* 2307 */ ( -15816 -11328 0 )
+ /* 2308 */ ( -15304 -11328 0 )
+ /* 2309 */ ( -14792 -11328 0 )
+ /* 2310 */ ( -14280 -11328 0 )
+ /* 2311 */ ( -13768 -11328 0 )
+ /* 2312 */ ( -13256 -11328 0 )
+ /* 2313 */ ( -12744 -11328 0 )
+ /* 2314 */ ( -12232 -11328 0 )
+ /* 2315 */ ( -11720 -11328 0 )
+ /* 2316 */ ( -11208 -11328 0 )
+ /* 2317 */ ( -10696 -11328 0 )
+ /* 2318 */ ( -10184 -11328 0 )
+ /* 2319 */ ( -9672 -11328 0 )
+ /* 2320 */ ( -9160 -11328 0 )
+ /* 2321 */ ( -8648 -11328 0 )
+ /* 2322 */ ( -8136 -11328 0 )
+ /* 2323 */ ( -7624 -11328 0 )
+ /* 2324 */ ( -7112 -11328 0 )
+ /* 2325 */ ( -6600 -11328 0 )
+ /* 2326 */ ( -6088 -11328 0 )
+ /* 2327 */ ( -5576 -11328 0 )
+ /* 2328 */ ( -5064 -11328 0 )
+ /* 2329 */ ( -4552 -11328 0 )
+ /* 2330 */ ( -4040 -11328 0 )
+ /* 2331 */ ( -3528 -11328 0 )
+ /* 2332 */ ( -3016 -11328 0 )
+ /* 2333 */ ( -2504 -11328 0 )
+ /* 2334 */ ( -1992 -11328 0 )
+ /* 2335 */ ( -1480 -11328 0 )
+ /* 2336 */ ( -968 -11328 0 )
+ /* 2337 */ ( -456 -11328 0 )
+ /* 2338 */ ( 56 -11328 0 )
+ /* 2339 */ ( 568 -11328 0 )
+ /* 2340 */ ( 1080 -11328 0 )
+ /* 2341 */ ( 1592 -11328 0 )
+ /* 2342 */ ( 2104 -11328 0 )
+ /* 2343 */ ( 2616 -11328 0 )
+ /* 2344 */ ( 3128 -11328 0 )
+ /* 2345 */ ( 3640 -11328 0 )
+ /* 2346 */ ( 4152 -11328 0 )
+ /* 2347 */ ( 4664 -11328 0 )
+ /* 2348 */ ( 5176 -11328 0 )
+ /* 2349 */ ( 5688 -11328 0 )
+ /* 2350 */ ( 6200 -11328 0 )
+ /* 2351 */ ( 6712 -11328 0 )
+ /* 2352 */ ( 7224 -11328 0 )
+ /* 2353 */ ( 7736 -11328 0 )
+ /* 2354 */ ( 8248 -11328 0 )
+ /* 2355 */ ( 8760 -11328 0 )
+ /* 2356 */ ( 9272 -11328 0 )
+ /* 2357 */ ( 9784 -11328 0 )
+ /* 2358 */ ( 10296 -11328 0 )
+ /* 2359 */ ( 10808 -11328 0 )
+ /* 2360 */ ( 11320 -11328 0 )
+ /* 2361 */ ( 11832 -11328 0 )
+ /* 2362 */ ( -20424 -10816 0 )
+ /* 2363 */ ( -20936 -10816 0 )
+ /* 2364 */ ( -19912 -10816 0 )
+ /* 2365 */ ( -19400 -10816 0 )
+ /* 2366 */ ( -18888 -10816 0 )
+ /* 2367 */ ( -18376 -10816 0 )
+ /* 2368 */ ( -17864 -10816 0 )
+ /* 2369 */ ( -17352 -10816 0 )
+ /* 2370 */ ( -16840 -10816 0 )
+ /* 2371 */ ( -16328 -10816 0 )
+ /* 2372 */ ( -15816 -10816 0 )
+ /* 2373 */ ( -15304 -10816 0 )
+ /* 2374 */ ( -14792 -10816 0 )
+ /* 2375 */ ( -14280 -10816 0 )
+ /* 2376 */ ( -13768 -10816 0 )
+ /* 2377 */ ( -13256 -10816 0 )
+ /* 2378 */ ( -12744 -10816 0 )
+ /* 2379 */ ( -12232 -10816 0 )
+ /* 2380 */ ( -11720 -10816 0 )
+ /* 2381 */ ( -11208 -10816 0 )
+ /* 2382 */ ( -10696 -10816 0 )
+ /* 2383 */ ( -10184 -10816 0 )
+ /* 2384 */ ( -9672 -10816 0 )
+ /* 2385 */ ( -9160 -10816 0 )
+ /* 2386 */ ( -8648 -10816 0 )
+ /* 2387 */ ( -8136 -10816 0 )
+ /* 2388 */ ( -7624 -10816 0 )
+ /* 2389 */ ( -7112 -10816 0 )
+ /* 2390 */ ( -6600 -10816 0 )
+ /* 2391 */ ( -6088 -10816 0 )
+ /* 2392 */ ( -5576 -10816 0 )
+ /* 2393 */ ( -5064 -10816 0 )
+ /* 2394 */ ( -4552 -10816 0 )
+ /* 2395 */ ( -4040 -10816 0 )
+ /* 2396 */ ( -3528 -10816 0 )
+ /* 2397 */ ( -3016 -10816 0 )
+ /* 2398 */ ( -2504 -10816 0 )
+ /* 2399 */ ( -1992 -10816 0 )
+ /* 2400 */ ( -1480 -10816 0 )
+ /* 2401 */ ( -968 -10816 0 )
+ /* 2402 */ ( -456 -10816 0 )
+ /* 2403 */ ( 56 -10816 0 )
+ /* 2404 */ ( 568 -10816 0 )
+ /* 2405 */ ( 1080 -10816 0 )
+ /* 2406 */ ( 1592 -10816 0 )
+ /* 2407 */ ( 2104 -10816 0 )
+ /* 2408 */ ( 2616 -10816 0 )
+ /* 2409 */ ( 3128 -10816 0 )
+ /* 2410 */ ( 3640 -10816 0 )
+ /* 2411 */ ( 4152 -10816 0 )
+ /* 2412 */ ( 4664 -10816 0 )
+ /* 2413 */ ( 5176 -10816 0 )
+ /* 2414 */ ( 5688 -10816 0 )
+ /* 2415 */ ( 6200 -10816 0 )
+ /* 2416 */ ( 6712 -10816 0 )
+ /* 2417 */ ( 7224 -10816 0 )
+ /* 2418 */ ( 7736 -10816 0 )
+ /* 2419 */ ( 8248 -10816 0 )
+ /* 2420 */ ( 8760 -10816 0 )
+ /* 2421 */ ( 9272 -10816 0 )
+ /* 2422 */ ( 9784 -10816 0 )
+ /* 2423 */ ( 10296 -10816 0 )
+ /* 2424 */ ( 10808 -10816 0 )
+ /* 2425 */ ( 11320 -10816 0 )
+ /* 2426 */ ( 11832 -10816 0 )
+ /* 2427 */ ( -20424 -10304 0 )
+ /* 2428 */ ( -20936 -10304 0 )
+ /* 2429 */ ( -19912 -10304 0 )
+ /* 2430 */ ( -19400 -10304 0 )
+ /* 2431 */ ( -18888 -10304 0 )
+ /* 2432 */ ( -18376 -10304 0 )
+ /* 2433 */ ( -17864 -10304 0 )
+ /* 2434 */ ( -17352 -10304 0 )
+ /* 2435 */ ( -16840 -10304 0 )
+ /* 2436 */ ( -16328 -10304 0 )
+ /* 2437 */ ( -15816 -10304 0 )
+ /* 2438 */ ( -15304 -10304 0 )
+ /* 2439 */ ( -14792 -10304 0 )
+ /* 2440 */ ( -14280 -10304 0 )
+ /* 2441 */ ( -13768 -10304 0 )
+ /* 2442 */ ( -13256 -10304 0 )
+ /* 2443 */ ( -12744 -10304 0 )
+ /* 2444 */ ( -12232 -10304 0 )
+ /* 2445 */ ( -11720 -10304 0 )
+ /* 2446 */ ( -11208 -10304 0 )
+ /* 2447 */ ( -10696 -10304 0 )
+ /* 2448 */ ( -10184 -10304 0 )
+ /* 2449 */ ( -9672 -10304 0 )
+ /* 2450 */ ( -9160 -10304 0 )
+ /* 2451 */ ( -8648 -10304 0 )
+ /* 2452 */ ( -8136 -10304 0 )
+ /* 2453 */ ( -7624 -10304 0 )
+ /* 2454 */ ( -7112 -10304 0 )
+ /* 2455 */ ( -6600 -10304 0 )
+ /* 2456 */ ( -6088 -10304 0 )
+ /* 2457 */ ( -5576 -10304 0 )
+ /* 2458 */ ( -5064 -10304 0 )
+ /* 2459 */ ( -4552 -10304 0 )
+ /* 2460 */ ( -4040 -10304 0 )
+ /* 2461 */ ( -3528 -10304 0 )
+ /* 2462 */ ( -3016 -10304 0 )
+ /* 2463 */ ( -2504 -10304 0 )
+ /* 2464 */ ( -1992 -10304 0 )
+ /* 2465 */ ( -1480 -10304 0 )
+ /* 2466 */ ( -968 -10304 0 )
+ /* 2467 */ ( -456 -10304 0 )
+ /* 2468 */ ( 56 -10304 0 )
+ /* 2469 */ ( 568 -10304 0 )
+ /* 2470 */ ( 1080 -10304 0 )
+ /* 2471 */ ( 1592 -10304 0 )
+ /* 2472 */ ( 2104 -10304 0 )
+ /* 2473 */ ( 2616 -10304 0 )
+ /* 2474 */ ( 3128 -10304 0 )
+ /* 2475 */ ( 3640 -10304 0 )
+ /* 2476 */ ( 4152 -10304 0 )
+ /* 2477 */ ( 4664 -10304 0 )
+ /* 2478 */ ( 5176 -10304 0 )
+ /* 2479 */ ( 5688 -10304 0 )
+ /* 2480 */ ( 6200 -10304 0 )
+ /* 2481 */ ( 6712 -10304 0 )
+ /* 2482 */ ( 7224 -10304 0 )
+ /* 2483 */ ( 7736 -10304 0 )
+ /* 2484 */ ( 8248 -10304 0 )
+ /* 2485 */ ( 8760 -10304 0 )
+ /* 2486 */ ( 9272 -10304 0 )
+ /* 2487 */ ( 9784 -10304 0 )
+ /* 2488 */ ( 10296 -10304 0 )
+ /* 2489 */ ( 10808 -10304 0 )
+ /* 2490 */ ( 11320 -10304 0 )
+ /* 2491 */ ( 11832 -10304 0 )
+ /* 2492 */ ( -20424 -9792 0 )
+ /* 2493 */ ( -20936 -9792 0 )
+ /* 2494 */ ( -19912 -9792 0 )
+ /* 2495 */ ( -19400 -9792 0 )
+ /* 2496 */ ( -18888 -9792 0 )
+ /* 2497 */ ( -18376 -9792 0 )
+ /* 2498 */ ( -17864 -9792 0 )
+ /* 2499 */ ( -17352 -9792 0 )
+ /* 2500 */ ( -16840 -9792 0 )
+ /* 2501 */ ( -16328 -9792 0 )
+ /* 2502 */ ( -15816 -9792 0 )
+ /* 2503 */ ( -15304 -9792 0 )
+ /* 2504 */ ( -14792 -9792 0 )
+ /* 2505 */ ( -14280 -9792 0 )
+ /* 2506 */ ( -13768 -9792 0 )
+ /* 2507 */ ( -13256 -9792 0 )
+ /* 2508 */ ( -12744 -9792 0 )
+ /* 2509 */ ( -12232 -9792 0 )
+ /* 2510 */ ( -11720 -9792 0 )
+ /* 2511 */ ( -11208 -9792 0 )
+ /* 2512 */ ( -10696 -9792 0 )
+ /* 2513 */ ( -10184 -9792 0 )
+ /* 2514 */ ( -9672 -9792 0 )
+ /* 2515 */ ( -9160 -9792 0 )
+ /* 2516 */ ( -8648 -9792 0 )
+ /* 2517 */ ( -8136 -9792 0 )
+ /* 2518 */ ( -7624 -9792 0 )
+ /* 2519 */ ( -7112 -9792 0 )
+ /* 2520 */ ( -6600 -9792 0 )
+ /* 2521 */ ( -6088 -9792 0 )
+ /* 2522 */ ( -5576 -9792 0 )
+ /* 2523 */ ( -5064 -9792 0 )
+ /* 2524 */ ( -4552 -9792 0 )
+ /* 2525 */ ( -4040 -9792 0 )
+ /* 2526 */ ( -3528 -9792 0 )
+ /* 2527 */ ( -3016 -9792 0 )
+ /* 2528 */ ( -2504 -9792 0 )
+ /* 2529 */ ( -1992 -9792 0 )
+ /* 2530 */ ( -1480 -9792 0 )
+ /* 2531 */ ( -968 -9792 0 )
+ /* 2532 */ ( -456 -9792 0 )
+ /* 2533 */ ( 56 -9792 0 )
+ /* 2534 */ ( 568 -9792 0 )
+ /* 2535 */ ( 1080 -9792 0 )
+ /* 2536 */ ( 1592 -9792 0 )
+ /* 2537 */ ( 2104 -9792 0 )
+ /* 2538 */ ( 2616 -9792 0 )
+ /* 2539 */ ( 3128 -9792 0 )
+ /* 2540 */ ( 3640 -9792 0 )
+ /* 2541 */ ( 4152 -9792 0 )
+ /* 2542 */ ( 4664 -9792 0 )
+ /* 2543 */ ( 5176 -9792 0 )
+ /* 2544 */ ( 5688 -9792 0 )
+ /* 2545 */ ( 6200 -9792 0 )
+ /* 2546 */ ( 6712 -9792 0 )
+ /* 2547 */ ( 7224 -9792 0 )
+ /* 2548 */ ( 7736 -9792 0 )
+ /* 2549 */ ( 8248 -9792 0 )
+ /* 2550 */ ( 8760 -9792 0 )
+ /* 2551 */ ( 9272 -9792 0 )
+ /* 2552 */ ( 9784 -9792 0 )
+ /* 2553 */ ( 10296 -9792 0 )
+ /* 2554 */ ( 10808 -9792 0 )
+ /* 2555 */ ( 11320 -9792 0 )
+ /* 2556 */ ( 11832 -9792 0 )
+ /* 2557 */ ( -20424 -9280 0 )
+ /* 2558 */ ( -20936 -9280 0 )
+ /* 2559 */ ( -19912 -9280 0 )
+ /* 2560 */ ( -19400 -9280 0 )
+ /* 2561 */ ( -18888 -9280 0 )
+ /* 2562 */ ( -18376 -9280 0 )
+ /* 2563 */ ( -17864 -9280 0 )
+ /* 2564 */ ( -17352 -9280 0 )
+ /* 2565 */ ( -16840 -9280 0 )
+ /* 2566 */ ( -16328 -9280 0 )
+ /* 2567 */ ( -15816 -9280 0 )
+ /* 2568 */ ( -15304 -9280 0 )
+ /* 2569 */ ( -14792 -9280 0 )
+ /* 2570 */ ( -14280 -9280 0 )
+ /* 2571 */ ( -13768 -9280 0 )
+ /* 2572 */ ( -13256 -9280 0 )
+ /* 2573 */ ( -12744 -9280 0 )
+ /* 2574 */ ( -12232 -9280 0 )
+ /* 2575 */ ( -11720 -9280 0 )
+ /* 2576 */ ( -11208 -9280 0 )
+ /* 2577 */ ( -10696 -9280 0 )
+ /* 2578 */ ( -10184 -9280 0 )
+ /* 2579 */ ( -9672 -9280 0 )
+ /* 2580 */ ( -9160 -9280 0 )
+ /* 2581 */ ( -8648 -9280 0 )
+ /* 2582 */ ( -8136 -9280 0 )
+ /* 2583 */ ( -7624 -9280 0 )
+ /* 2584 */ ( -7112 -9280 0 )
+ /* 2585 */ ( -6600 -9280 0 )
+ /* 2586 */ ( -6088 -9280 0 )
+ /* 2587 */ ( -5576 -9280 0 )
+ /* 2588 */ ( -5064 -9280 0 )
+ /* 2589 */ ( -4552 -9280 0 )
+ /* 2590 */ ( -4040 -9280 0 )
+ /* 2591 */ ( -3528 -9280 0 )
+ /* 2592 */ ( -3016 -9280 0 )
+ /* 2593 */ ( -2504 -9280 0 )
+ /* 2594 */ ( -1992 -9280 0 )
+ /* 2595 */ ( -1480 -9280 0 )
+ /* 2596 */ ( -968 -9280 0 )
+ /* 2597 */ ( -456 -9280 0 )
+ /* 2598 */ ( 56 -9280 0 )
+ /* 2599 */ ( 568 -9280 0 )
+ /* 2600 */ ( 1080 -9280 0 )
+ /* 2601 */ ( 1592 -9280 0 )
+ /* 2602 */ ( 2104 -9280 0 )
+ /* 2603 */ ( 2616 -9280 0 )
+ /* 2604 */ ( 3128 -9280 0 )
+ /* 2605 */ ( 3640 -9280 0 )
+ /* 2606 */ ( 4152 -9280 0 )
+ /* 2607 */ ( 4664 -9280 0 )
+ /* 2608 */ ( 5176 -9280 0 )
+ /* 2609 */ ( 5688 -9280 0 )
+ /* 2610 */ ( 6200 -9280 0 )
+ /* 2611 */ ( 6712 -9280 0 )
+ /* 2612 */ ( 7224 -9280 0 )
+ /* 2613 */ ( 7736 -9280 0 )
+ /* 2614 */ ( 8248 -9280 0 )
+ /* 2615 */ ( 8760 -9280 0 )
+ /* 2616 */ ( 9272 -9280 0 )
+ /* 2617 */ ( 9784 -9280 0 )
+ /* 2618 */ ( 10296 -9280 0 )
+ /* 2619 */ ( 10808 -9280 0 )
+ /* 2620 */ ( 11320 -9280 0 )
+ /* 2621 */ ( 11832 -9280 0 )
+ /* 2622 */ ( -20424 -8768 0 )
+ /* 2623 */ ( -20936 -8768 0 )
+ /* 2624 */ ( -19912 -8768 0 )
+ /* 2625 */ ( -19400 -8768 0 )
+ /* 2626 */ ( -18888 -8768 0 )
+ /* 2627 */ ( -18376 -8768 0 )
+ /* 2628 */ ( -17864 -8768 0 )
+ /* 2629 */ ( -17352 -8768 0 )
+ /* 2630 */ ( -16840 -8768 0 )
+ /* 2631 */ ( -16328 -8768 0 )
+ /* 2632 */ ( -15816 -8768 0 )
+ /* 2633 */ ( -15304 -8768 0 )
+ /* 2634 */ ( -14792 -8768 0 )
+ /* 2635 */ ( -14280 -8768 0 )
+ /* 2636 */ ( -13768 -8768 0 )
+ /* 2637 */ ( -13256 -8768 0 )
+ /* 2638 */ ( -12744 -8768 0 )
+ /* 2639 */ ( -12232 -8768 0 )
+ /* 2640 */ ( -11720 -8768 0 )
+ /* 2641 */ ( -11208 -8768 0 )
+ /* 2642 */ ( -10696 -8768 0 )
+ /* 2643 */ ( -10184 -8768 0 )
+ /* 2644 */ ( -9672 -8768 0 )
+ /* 2645 */ ( -9160 -8768 0 )
+ /* 2646 */ ( -8648 -8768 0 )
+ /* 2647 */ ( -8136 -8768 0 )
+ /* 2648 */ ( -7624 -8768 0 )
+ /* 2649 */ ( -7112 -8768 0 )
+ /* 2650 */ ( -6600 -8768 0 )
+ /* 2651 */ ( -6088 -8768 0 )
+ /* 2652 */ ( -5576 -8768 0 )
+ /* 2653 */ ( -5064 -8768 0 )
+ /* 2654 */ ( -4552 -8768 0 )
+ /* 2655 */ ( -4040 -8768 0 )
+ /* 2656 */ ( -3528 -8768 0 )
+ /* 2657 */ ( -3016 -8768 0 )
+ /* 2658 */ ( -2504 -8768 0 )
+ /* 2659 */ ( -1992 -8768 0 )
+ /* 2660 */ ( -1480 -8768 0 )
+ /* 2661 */ ( -968 -8768 0 )
+ /* 2662 */ ( -456 -8768 0 )
+ /* 2663 */ ( 56 -8768 0 )
+ /* 2664 */ ( 568 -8768 0 )
+ /* 2665 */ ( 1080 -8768 0 )
+ /* 2666 */ ( 1592 -8768 0 )
+ /* 2667 */ ( 2104 -8768 0 )
+ /* 2668 */ ( 2616 -8768 0 )
+ /* 2669 */ ( 3128 -8768 0 )
+ /* 2670 */ ( 3640 -8768 0 )
+ /* 2671 */ ( 4152 -8768 0 )
+ /* 2672 */ ( 4664 -8768 0 )
+ /* 2673 */ ( 5176 -8768 0 )
+ /* 2674 */ ( 5688 -8768 0 )
+ /* 2675 */ ( 6200 -8768 0 )
+ /* 2676 */ ( 6712 -8768 0 )
+ /* 2677 */ ( 7224 -8768 0 )
+ /* 2678 */ ( 7736 -8768 0 )
+ /* 2679 */ ( 8248 -8768 0 )
+ /* 2680 */ ( 8760 -8768 0 )
+ /* 2681 */ ( 9272 -8768 0 )
+ /* 2682 */ ( 9784 -8768 0 )
+ /* 2683 */ ( 10296 -8768 0 )
+ /* 2684 */ ( 10808 -8768 0 )
+ /* 2685 */ ( 11320 -8768 0 )
+ /* 2686 */ ( 11832 -8768 0 )
+ /* 2687 */ ( -20424 -8256 0 )
+ /* 2688 */ ( -20936 -8256 0 )
+ /* 2689 */ ( -19912 -8256 0 )
+ /* 2690 */ ( -19400 -8256 0 )
+ /* 2691 */ ( -18888 -8256 0 )
+ /* 2692 */ ( -18376 -8256 0 )
+ /* 2693 */ ( -17864 -8256 0 )
+ /* 2694 */ ( -17352 -8256 0 )
+ /* 2695 */ ( -16840 -8256 0 )
+ /* 2696 */ ( -16328 -8256 0 )
+ /* 2697 */ ( -15816 -8256 0 )
+ /* 2698 */ ( -15304 -8256 0 )
+ /* 2699 */ ( -14792 -8256 0 )
+ /* 2700 */ ( -14280 -8256 0 )
+ /* 2701 */ ( -13768 -8256 0 )
+ /* 2702 */ ( -13256 -8256 0 )
+ /* 2703 */ ( -12744 -8256 0 )
+ /* 2704 */ ( -12232 -8256 0 )
+ /* 2705 */ ( -11720 -8256 0 )
+ /* 2706 */ ( -11208 -8256 0 )
+ /* 2707 */ ( -10696 -8256 0 )
+ /* 2708 */ ( -10184 -8256 0 )
+ /* 2709 */ ( -9672 -8256 0 )
+ /* 2710 */ ( -9160 -8256 0 )
+ /* 2711 */ ( -8648 -8256 0 )
+ /* 2712 */ ( -8136 -8256 0 )
+ /* 2713 */ ( -7624 -8256 0 )
+ /* 2714 */ ( -7112 -8256 0 )
+ /* 2715 */ ( -6600 -8256 0 )
+ /* 2716 */ ( -6088 -8256 0 )
+ /* 2717 */ ( -5576 -8256 0 )
+ /* 2718 */ ( -5064 -8256 0 )
+ /* 2719 */ ( -4552 -8256 0 )
+ /* 2720 */ ( -4040 -8256 0 )
+ /* 2721 */ ( -3528 -8256 0 )
+ /* 2722 */ ( -3016 -8256 0 )
+ /* 2723 */ ( -2504 -8256 0 )
+ /* 2724 */ ( -1992 -8256 0 )
+ /* 2725 */ ( -1480 -8256 0 )
+ /* 2726 */ ( -968 -8256 0 )
+ /* 2727 */ ( -456 -8256 0 )
+ /* 2728 */ ( 56 -8256 0 )
+ /* 2729 */ ( 568 -8256 0 )
+ /* 2730 */ ( 1080 -8256 0 )
+ /* 2731 */ ( 1592 -8256 0 )
+ /* 2732 */ ( 2104 -8256 0 )
+ /* 2733 */ ( 2616 -8256 0 )
+ /* 2734 */ ( 3128 -8256 0 )
+ /* 2735 */ ( 3640 -8256 0 )
+ /* 2736 */ ( 4152 -8256 0 )
+ /* 2737 */ ( 4664 -8256 0 )
+ /* 2738 */ ( 5176 -8256 0 )
+ /* 2739 */ ( 5688 -8256 0 )
+ /* 2740 */ ( 6200 -8256 0 )
+ /* 2741 */ ( 6712 -8256 0 )
+ /* 2742 */ ( 7224 -8256 0 )
+ /* 2743 */ ( 7736 -8256 0 )
+ /* 2744 */ ( 8248 -8256 0 )
+ /* 2745 */ ( 8760 -8256 0 )
+ /* 2746 */ ( 9272 -8256 0 )
+ /* 2747 */ ( 9784 -8256 0 )
+ /* 2748 */ ( 10296 -8256 0 )
+ /* 2749 */ ( 10808 -8256 0 )
+ /* 2750 */ ( 11320 -8256 0 )
+ /* 2751 */ ( 11832 -8256 0 )
+ /* 2752 */ ( -20424 -7744 0 )
+ /* 2753 */ ( -20936 -7744 0 )
+ /* 2754 */ ( -19912 -7744 0 )
+ /* 2755 */ ( -19400 -7744 0 )
+ /* 2756 */ ( -18888 -7744 0 )
+ /* 2757 */ ( -18376 -7744 0 )
+ /* 2758 */ ( -17864 -7744 0 )
+ /* 2759 */ ( -17352 -7744 0 )
+ /* 2760 */ ( -16840 -7744 0 )
+ /* 2761 */ ( -16328 -7744 0 )
+ /* 2762 */ ( -15816 -7744 0 )
+ /* 2763 */ ( -15304 -7744 0 )
+ /* 2764 */ ( -14792 -7744 0 )
+ /* 2765 */ ( -14280 -7744 0 )
+ /* 2766 */ ( -13768 -7744 0 )
+ /* 2767 */ ( -13256 -7744 0 )
+ /* 2768 */ ( -12744 -7744 0 )
+ /* 2769 */ ( -12232 -7744 0 )
+ /* 2770 */ ( -11720 -7744 0 )
+ /* 2771 */ ( -11208 -7744 0 )
+ /* 2772 */ ( -10696 -7744 0 )
+ /* 2773 */ ( -10184 -7744 0 )
+ /* 2774 */ ( -9672 -7744 0 )
+ /* 2775 */ ( -9160 -7744 0 )
+ /* 2776 */ ( -8648 -7744 0 )
+ /* 2777 */ ( -8136 -7744 0 )
+ /* 2778 */ ( -7624 -7744 0 )
+ /* 2779 */ ( -7112 -7744 0 )
+ /* 2780 */ ( -6600 -7744 0 )
+ /* 2781 */ ( -6088 -7744 0 )
+ /* 2782 */ ( -5576 -7744 0 )
+ /* 2783 */ ( -5064 -7744 0 )
+ /* 2784 */ ( -4552 -7744 0 )
+ /* 2785 */ ( -4040 -7744 0 )
+ /* 2786 */ ( -3528 -7744 0 )
+ /* 2787 */ ( -3016 -7744 0 )
+ /* 2788 */ ( -2504 -7744 0 )
+ /* 2789 */ ( -1992 -7744 0 )
+ /* 2790 */ ( -1480 -7744 0 )
+ /* 2791 */ ( -968 -7744 0 )
+ /* 2792 */ ( -456 -7744 0 )
+ /* 2793 */ ( 56 -7744 0 )
+ /* 2794 */ ( 568 -7744 0 )
+ /* 2795 */ ( 1080 -7744 0 )
+ /* 2796 */ ( 1592 -7744 0 )
+ /* 2797 */ ( 2104 -7744 0 )
+ /* 2798 */ ( 2616 -7744 0 )
+ /* 2799 */ ( 3128 -7744 0 )
+ /* 2800 */ ( 3640 -7744 0 )
+ /* 2801 */ ( 4152 -7744 0 )
+ /* 2802 */ ( 4664 -7744 0 )
+ /* 2803 */ ( 5176 -7744 0 )
+ /* 2804 */ ( 5688 -7744 0 )
+ /* 2805 */ ( 6200 -7744 0 )
+ /* 2806 */ ( 6712 -7744 0 )
+ /* 2807 */ ( 7224 -7744 0 )
+ /* 2808 */ ( 7736 -7744 0 )
+ /* 2809 */ ( 8248 -7744 0 )
+ /* 2810 */ ( 8760 -7744 0 )
+ /* 2811 */ ( 9272 -7744 0 )
+ /* 2812 */ ( 9784 -7744 0 )
+ /* 2813 */ ( 10296 -7744 0 )
+ /* 2814 */ ( 10808 -7744 0 )
+ /* 2815 */ ( 11320 -7744 0 )
+ /* 2816 */ ( 11832 -7744 0 )
+ /* 2817 */ ( -20424 -7232 0 )
+ /* 2818 */ ( -20936 -7232 0 )
+ /* 2819 */ ( -19912 -7232 0 )
+ /* 2820 */ ( -19400 -7232 0 )
+ /* 2821 */ ( -18888 -7232 0 )
+ /* 2822 */ ( -18376 -7232 0 )
+ /* 2823 */ ( -17864 -7232 0 )
+ /* 2824 */ ( -17352 -7232 0 )
+ /* 2825 */ ( -16840 -7232 0 )
+ /* 2826 */ ( -16328 -7232 0 )
+ /* 2827 */ ( -15816 -7232 0 )
+ /* 2828 */ ( -15304 -7232 0 )
+ /* 2829 */ ( -14792 -7232 0 )
+ /* 2830 */ ( -14280 -7232 0 )
+ /* 2831 */ ( -13768 -7232 0 )
+ /* 2832 */ ( -13256 -7232 0 )
+ /* 2833 */ ( -12744 -7232 0 )
+ /* 2834 */ ( -12232 -7232 0 )
+ /* 2835 */ ( -11720 -7232 0 )
+ /* 2836 */ ( -11208 -7232 0 )
+ /* 2837 */ ( -10696 -7232 0 )
+ /* 2838 */ ( -10184 -7232 0 )
+ /* 2839 */ ( -9672 -7232 0 )
+ /* 2840 */ ( -9160 -7232 0 )
+ /* 2841 */ ( -8648 -7232 0 )
+ /* 2842 */ ( -8136 -7232 0 )
+ /* 2843 */ ( -7624 -7232 0 )
+ /* 2844 */ ( -7112 -7232 0 )
+ /* 2845 */ ( -6600 -7232 0 )
+ /* 2846 */ ( -6088 -7232 0 )
+ /* 2847 */ ( -5576 -7232 0 )
+ /* 2848 */ ( -5064 -7232 0 )
+ /* 2849 */ ( -4552 -7232 0 )
+ /* 2850 */ ( -4040 -7232 0 )
+ /* 2851 */ ( -3528 -7232 0 )
+ /* 2852 */ ( -3016 -7232 0 )
+ /* 2853 */ ( -2504 -7232 0 )
+ /* 2854 */ ( -1992 -7232 0 )
+ /* 2855 */ ( -1480 -7232 0 )
+ /* 2856 */ ( -968 -7232 0 )
+ /* 2857 */ ( -456 -7232 0 )
+ /* 2858 */ ( 56 -7232 0 )
+ /* 2859 */ ( 568 -7232 0 )
+ /* 2860 */ ( 1080 -7232 0 )
+ /* 2861 */ ( 1592 -7232 0 )
+ /* 2862 */ ( 2104 -7232 0 )
+ /* 2863 */ ( 2616 -7232 0 )
+ /* 2864 */ ( 3128 -7232 0 )
+ /* 2865 */ ( 3640 -7232 0 )
+ /* 2866 */ ( 4152 -7232 0 )
+ /* 2867 */ ( 4664 -7232 0 )
+ /* 2868 */ ( 5176 -7232 0 )
+ /* 2869 */ ( 5688 -7232 0 )
+ /* 2870 */ ( 6200 -7232 0 )
+ /* 2871 */ ( 6712 -7232 0 )
+ /* 2872 */ ( 7224 -7232 0 )
+ /* 2873 */ ( 7736 -7232 0 )
+ /* 2874 */ ( 8248 -7232 0 )
+ /* 2875 */ ( 8760 -7232 0 )
+ /* 2876 */ ( 9272 -7232 0 )
+ /* 2877 */ ( 9784 -7232 0 )
+ /* 2878 */ ( 10296 -7232 0 )
+ /* 2879 */ ( 10808 -7232 0 )
+ /* 2880 */ ( 11320 -7232 0 )
+ /* 2881 */ ( 11832 -7232 0 )
+ /* 2882 */ ( -20424 -6720 0 )
+ /* 2883 */ ( -20936 -6720 0 )
+ /* 2884 */ ( -19912 -6720 0 )
+ /* 2885 */ ( -19400 -6720 0 )
+ /* 2886 */ ( -18888 -6720 0 )
+ /* 2887 */ ( -18376 -6720 0 )
+ /* 2888 */ ( -17864 -6720 0 )
+ /* 2889 */ ( -17352 -6720 0 )
+ /* 2890 */ ( -16840 -6720 0 )
+ /* 2891 */ ( -16328 -6720 0 )
+ /* 2892 */ ( -15816 -6720 0 )
+ /* 2893 */ ( -15304 -6720 0 )
+ /* 2894 */ ( -14792 -6720 0 )
+ /* 2895 */ ( -14280 -6720 0 )
+ /* 2896 */ ( -13768 -6720 0 )
+ /* 2897 */ ( -13256 -6720 0 )
+ /* 2898 */ ( -12744 -6720 0 )
+ /* 2899 */ ( -12232 -6720 0 )
+ /* 2900 */ ( -11720 -6720 0 )
+ /* 2901 */ ( -11208 -6720 0 )
+ /* 2902 */ ( -10696 -6720 0 )
+ /* 2903 */ ( -10184 -6720 0 )
+ /* 2904 */ ( -9672 -6720 0 )
+ /* 2905 */ ( -9160 -6720 0 )
+ /* 2906 */ ( -8648 -6720 0 )
+ /* 2907 */ ( -8136 -6720 0 )
+ /* 2908 */ ( -7624 -6720 0 )
+ /* 2909 */ ( -7112 -6720 0 )
+ /* 2910 */ ( -6600 -6720 0 )
+ /* 2911 */ ( -6088 -6720 0 )
+ /* 2912 */ ( -5576 -6720 0 )
+ /* 2913 */ ( -5064 -6720 0 )
+ /* 2914 */ ( -4552 -6720 0 )
+ /* 2915 */ ( -4040 -6720 0 )
+ /* 2916 */ ( -3528 -6720 0 )
+ /* 2917 */ ( -3016 -6720 0 )
+ /* 2918 */ ( -2504 -6720 0 )
+ /* 2919 */ ( -1992 -6720 0 )
+ /* 2920 */ ( -1480 -6720 0 )
+ /* 2921 */ ( -968 -6720 0 )
+ /* 2922 */ ( -456 -6720 0 )
+ /* 2923 */ ( 56 -6720 0 )
+ /* 2924 */ ( 568 -6720 0 )
+ /* 2925 */ ( 1080 -6720 0 )
+ /* 2926 */ ( 1592 -6720 0 )
+ /* 2927 */ ( 2104 -6720 0 )
+ /* 2928 */ ( 2616 -6720 0 )
+ /* 2929 */ ( 3128 -6720 0 )
+ /* 2930 */ ( 3640 -6720 0 )
+ /* 2931 */ ( 4152 -6720 0 )
+ /* 2932 */ ( 4664 -6720 0 )
+ /* 2933 */ ( 5176 -6720 0 )
+ /* 2934 */ ( 5688 -6720 0 )
+ /* 2935 */ ( 6200 -6720 0 )
+ /* 2936 */ ( 6712 -6720 0 )
+ /* 2937 */ ( 7224 -6720 0 )
+ /* 2938 */ ( 7736 -6720 0 )
+ /* 2939 */ ( 8248 -6720 0 )
+ /* 2940 */ ( 8760 -6720 0 )
+ /* 2941 */ ( 9272 -6720 0 )
+ /* 2942 */ ( 9784 -6720 0 )
+ /* 2943 */ ( 10296 -6720 0 )
+ /* 2944 */ ( 10808 -6720 0 )
+ /* 2945 */ ( 11320 -6720 0 )
+ /* 2946 */ ( 11832 -6720 0 )
+ /* 2947 */ ( -20424 -6208 0 )
+ /* 2948 */ ( -20936 -6208 0 )
+ /* 2949 */ ( -19912 -6208 0 )
+ /* 2950 */ ( -19400 -6208 0 )
+ /* 2951 */ ( -18888 -6208 0 )
+ /* 2952 */ ( -18376 -6208 0 )
+ /* 2953 */ ( -17864 -6208 0 )
+ /* 2954 */ ( -17352 -6208 0 )
+ /* 2955 */ ( -16840 -6208 0 )
+ /* 2956 */ ( -16328 -6208 0 )
+ /* 2957 */ ( -15816 -6208 0 )
+ /* 2958 */ ( -15304 -6208 0 )
+ /* 2959 */ ( -14792 -6208 0 )
+ /* 2960 */ ( -14280 -6208 0 )
+ /* 2961 */ ( -13768 -6208 0 )
+ /* 2962 */ ( -13256 -6208 0 )
+ /* 2963 */ ( -12744 -6208 0 )
+ /* 2964 */ ( -12232 -6208 0 )
+ /* 2965 */ ( -11720 -6208 0 )
+ /* 2966 */ ( -11208 -6208 0 )
+ /* 2967 */ ( -10696 -6208 0 )
+ /* 2968 */ ( -10184 -6208 0 )
+ /* 2969 */ ( -9672 -6208 0 )
+ /* 2970 */ ( -9160 -6208 0 )
+ /* 2971 */ ( -8648 -6208 0 )
+ /* 2972 */ ( -8136 -6208 0 )
+ /* 2973 */ ( -7624 -6208 0 )
+ /* 2974 */ ( -7112 -6208 0 )
+ /* 2975 */ ( -6600 -6208 0 )
+ /* 2976 */ ( -6088 -6208 0 )
+ /* 2977 */ ( -5576 -6208 0 )
+ /* 2978 */ ( -5064 -6208 0 )
+ /* 2979 */ ( -4552 -6208 0 )
+ /* 2980 */ ( -4040 -6208 0 )
+ /* 2981 */ ( -3528 -6208 0 )
+ /* 2982 */ ( -3016 -6208 0 )
+ /* 2983 */ ( -2504 -6208 0 )
+ /* 2984 */ ( -1992 -6208 0 )
+ /* 2985 */ ( -1480 -6208 0 )
+ /* 2986 */ ( -968 -6208 0 )
+ /* 2987 */ ( -456 -6208 0 )
+ /* 2988 */ ( 56 -6208 0 )
+ /* 2989 */ ( 568 -6208 0 )
+ /* 2990 */ ( 1080 -6208 0 )
+ /* 2991 */ ( 1592 -6208 0 )
+ /* 2992 */ ( 2104 -6208 0 )
+ /* 2993 */ ( 2616 -6208 0 )
+ /* 2994 */ ( 3128 -6208 0 )
+ /* 2995 */ ( 3640 -6208 0 )
+ /* 2996 */ ( 4152 -6208 0 )
+ /* 2997 */ ( 4664 -6208 0 )
+ /* 2998 */ ( 5176 -6208 0 )
+ /* 2999 */ ( 5688 -6208 0 )
+ /* 3000 */ ( 6200 -6208 0 )
+ /* 3001 */ ( 6712 -6208 0 )
+ /* 3002 */ ( 7224 -6208 0 )
+ /* 3003 */ ( 7736 -6208 0 )
+ /* 3004 */ ( 8248 -6208 0 )
+ /* 3005 */ ( 8760 -6208 0 )
+ /* 3006 */ ( 9272 -6208 0 )
+ /* 3007 */ ( 9784 -6208 0 )
+ /* 3008 */ ( 10296 -6208 0 )
+ /* 3009 */ ( 10808 -6208 0 )
+ /* 3010 */ ( 11320 -6208 0 )
+ /* 3011 */ ( 11832 -6208 0 )
+ /* 3012 */ ( -20424 -5696 0 )
+ /* 3013 */ ( -20936 -5696 0 )
+ /* 3014 */ ( -19912 -5696 0 )
+ /* 3015 */ ( -19400 -5696 0 )
+ /* 3016 */ ( -18888 -5696 0 )
+ /* 3017 */ ( -18376 -5696 0 )
+ /* 3018 */ ( -17864 -5696 0 )
+ /* 3019 */ ( -17352 -5696 0 )
+ /* 3020 */ ( -16840 -5696 0 )
+ /* 3021 */ ( -16328 -5696 0 )
+ /* 3022 */ ( -15816 -5696 0 )
+ /* 3023 */ ( -15304 -5696 0 )
+ /* 3024 */ ( -14792 -5696 0 )
+ /* 3025 */ ( -14280 -5696 0 )
+ /* 3026 */ ( -13768 -5696 0 )
+ /* 3027 */ ( -13256 -5696 0 )
+ /* 3028 */ ( -12744 -5696 0 )
+ /* 3029 */ ( -12232 -5696 0 )
+ /* 3030 */ ( -11720 -5696 0 )
+ /* 3031 */ ( -11208 -5696 0 )
+ /* 3032 */ ( -10696 -5696 0 )
+ /* 3033 */ ( -10184 -5696 0 )
+ /* 3034 */ ( -9672 -5696 0 )
+ /* 3035 */ ( -9160 -5696 0 )
+ /* 3036 */ ( -8648 -5696 0 )
+ /* 3037 */ ( -8136 -5696 0 )
+ /* 3038 */ ( -7624 -5696 0 )
+ /* 3039 */ ( -7112 -5696 0 )
+ /* 3040 */ ( -6600 -5696 0 )
+ /* 3041 */ ( -6088 -5696 0 )
+ /* 3042 */ ( -5576 -5696 0 )
+ /* 3043 */ ( -5064 -5696 0 )
+ /* 3044 */ ( -4552 -5696 0 )
+ /* 3045 */ ( -4040 -5696 0 )
+ /* 3046 */ ( -3528 -5696 0 )
+ /* 3047 */ ( -3016 -5696 0 )
+ /* 3048 */ ( -2504 -5696 0 )
+ /* 3049 */ ( -1992 -5696 0 )
+ /* 3050 */ ( -1480 -5696 0 )
+ /* 3051 */ ( -968 -5696 0 )
+ /* 3052 */ ( -456 -5696 0 )
+ /* 3053 */ ( 56 -5696 0 )
+ /* 3054 */ ( 568 -5696 0 )
+ /* 3055 */ ( 1080 -5696 0 )
+ /* 3056 */ ( 1592 -5696 0 )
+ /* 3057 */ ( 2104 -5696 0 )
+ /* 3058 */ ( 2616 -5696 0 )
+ /* 3059 */ ( 3128 -5696 0 )
+ /* 3060 */ ( 3640 -5696 0 )
+ /* 3061 */ ( 4152 -5696 0 )
+ /* 3062 */ ( 4664 -5696 0 )
+ /* 3063 */ ( 5176 -5696 0 )
+ /* 3064 */ ( 5688 -5696 0 )
+ /* 3065 */ ( 6200 -5696 0 )
+ /* 3066 */ ( 6712 -5696 0 )
+ /* 3067 */ ( 7224 -5696 0 )
+ /* 3068 */ ( 7736 -5696 0 )
+ /* 3069 */ ( 8248 -5696 0 )
+ /* 3070 */ ( 8760 -5696 0 )
+ /* 3071 */ ( 9272 -5696 0 )
+ /* 3072 */ ( 9784 -5696 0 )
+ /* 3073 */ ( 10296 -5696 0 )
+ /* 3074 */ ( 10808 -5696 0 )
+ /* 3075 */ ( 11320 -5696 0 )
+ /* 3076 */ ( 11832 -5696 0 )
+ /* 3077 */ ( -20424 -5184 0 )
+ /* 3078 */ ( -20936 -5184 0 )
+ /* 3079 */ ( -19912 -5184 0 )
+ /* 3080 */ ( -19400 -5184 0 )
+ /* 3081 */ ( -18888 -5184 0 )
+ /* 3082 */ ( -18376 -5184 0 )
+ /* 3083 */ ( -17864 -5184 0 )
+ /* 3084 */ ( -17352 -5184 0 )
+ /* 3085 */ ( -16840 -5184 0 )
+ /* 3086 */ ( -16328 -5184 0 )
+ /* 3087 */ ( -15816 -5184 0 )
+ /* 3088 */ ( -15304 -5184 0 )
+ /* 3089 */ ( -14792 -5184 0 )
+ /* 3090 */ ( -14280 -5184 0 )
+ /* 3091 */ ( -13768 -5184 0 )
+ /* 3092 */ ( -13256 -5184 0 )
+ /* 3093 */ ( -12744 -5184 0 )
+ /* 3094 */ ( -12232 -5184 0 )
+ /* 3095 */ ( -11720 -5184 0 )
+ /* 3096 */ ( -11208 -5184 0 )
+ /* 3097 */ ( -10696 -5184 0 )
+ /* 3098 */ ( -10184 -5184 0 )
+ /* 3099 */ ( -9672 -5184 0 )
+ /* 3100 */ ( -9160 -5184 0 )
+ /* 3101 */ ( -8648 -5184 0 )
+ /* 3102 */ ( -8136 -5184 0 )
+ /* 3103 */ ( -7624 -5184 0 )
+ /* 3104 */ ( -7112 -5184 0 )
+ /* 3105 */ ( -6600 -5184 0 )
+ /* 3106 */ ( -6088 -5184 0 )
+ /* 3107 */ ( -5576 -5184 0 )
+ /* 3108 */ ( -5064 -5184 0 )
+ /* 3109 */ ( -4552 -5184 0 )
+ /* 3110 */ ( -4040 -5184 0 )
+ /* 3111 */ ( -3528 -5184 0 )
+ /* 3112 */ ( -3016 -5184 0 )
+ /* 3113 */ ( -2504 -5184 0 )
+ /* 3114 */ ( -1992 -5184 0 )
+ /* 3115 */ ( -1480 -5184 0 )
+ /* 3116 */ ( -968 -5184 0 )
+ /* 3117 */ ( -456 -5184 0 )
+ /* 3118 */ ( 56 -5184 0 )
+ /* 3119 */ ( 568 -5184 0 )
+ /* 3120 */ ( 1080 -5184 0 )
+ /* 3121 */ ( 1592 -5184 0 )
+ /* 3122 */ ( 2104 -5184 0 )
+ /* 3123 */ ( 2616 -5184 0 )
+ /* 3124 */ ( 3128 -5184 0 )
+ /* 3125 */ ( 3640 -5184 0 )
+ /* 3126 */ ( 4152 -5184 0 )
+ /* 3127 */ ( 4664 -5184 0 )
+ /* 3128 */ ( 5176 -5184 0 )
+ /* 3129 */ ( 5688 -5184 0 )
+ /* 3130 */ ( 6200 -5184 0 )
+ /* 3131 */ ( 6712 -5184 0 )
+ /* 3132 */ ( 7224 -5184 0 )
+ /* 3133 */ ( 7736 -5184 0 )
+ /* 3134 */ ( 8248 -5184 0 )
+ /* 3135 */ ( 8760 -5184 0 )
+ /* 3136 */ ( 9272 -5184 0 )
+ /* 3137 */ ( 9784 -5184 0 )
+ /* 3138 */ ( 10296 -5184 0 )
+ /* 3139 */ ( 10808 -5184 0 )
+ /* 3140 */ ( 11320 -5184 0 )
+ /* 3141 */ ( 11832 -5184 0 )
+ /* 3142 */ ( -20424 -4672 0 )
+ /* 3143 */ ( -20936 -4672 0 )
+ /* 3144 */ ( -19912 -4672 0 )
+ /* 3145 */ ( -19400 -4672 0 )
+ /* 3146 */ ( -18888 -4672 0 )
+ /* 3147 */ ( -18376 -4672 0 )
+ /* 3148 */ ( -17864 -4672 0 )
+ /* 3149 */ ( -17352 -4672 0 )
+ /* 3150 */ ( -16840 -4672 0 )
+ /* 3151 */ ( -16328 -4672 0 )
+ /* 3152 */ ( -15816 -4672 0 )
+ /* 3153 */ ( -15304 -4672 0 )
+ /* 3154 */ ( -14792 -4672 0 )
+ /* 3155 */ ( -14280 -4672 0 )
+ /* 3156 */ ( -13768 -4672 0 )
+ /* 3157 */ ( -13256 -4672 0 )
+ /* 3158 */ ( -12744 -4672 0 )
+ /* 3159 */ ( -12232 -4672 0 )
+ /* 3160 */ ( -11720 -4672 0 )
+ /* 3161 */ ( -11208 -4672 0 )
+ /* 3162 */ ( -10696 -4672 0 )
+ /* 3163 */ ( -10184 -4672 0 )
+ /* 3164 */ ( -9672 -4672 0 )
+ /* 3165 */ ( -9160 -4672 0 )
+ /* 3166 */ ( -8648 -4672 0 )
+ /* 3167 */ ( -8136 -4672 0 )
+ /* 3168 */ ( -7624 -4672 0 )
+ /* 3169 */ ( -7112 -4672 0 )
+ /* 3170 */ ( -6600 -4672 0 )
+ /* 3171 */ ( -6088 -4672 0 )
+ /* 3172 */ ( -5576 -4672 0 )
+ /* 3173 */ ( -5064 -4672 5.1760582924 )
+ /* 3174 */ ( -4552 -4672 16.1019306183 )
+ /* 3175 */ ( -4040 -4672 0 )
+ /* 3176 */ ( -3528 -4672 0 )
+ /* 3177 */ ( -3016 -4672 0 )
+ /* 3178 */ ( -2504 -4672 0 )
+ /* 3179 */ ( -1992 -4672 0 )
+ /* 3180 */ ( -1480 -4672 0 )
+ /* 3181 */ ( -968 -4672 0 )
+ /* 3182 */ ( -456 -4672 0 )
+ /* 3183 */ ( 56 -4672 0 )
+ /* 3184 */ ( 568 -4672 0 )
+ /* 3185 */ ( 1080 -4672 0 )
+ /* 3186 */ ( 1592 -4672 0 )
+ /* 3187 */ ( 2104 -4672 0 )
+ /* 3188 */ ( 2616 -4672 0 )
+ /* 3189 */ ( 3128 -4672 0 )
+ /* 3190 */ ( 3640 -4672 0 )
+ /* 3191 */ ( 4152 -4672 0 )
+ /* 3192 */ ( 4664 -4672 0 )
+ /* 3193 */ ( 5176 -4672 0 )
+ /* 3194 */ ( 5688 -4672 0 )
+ /* 3195 */ ( 6200 -4672 0 )
+ /* 3196 */ ( 6712 -4672 0 )
+ /* 3197 */ ( 7224 -4672 0 )
+ /* 3198 */ ( 7736 -4672 0 )
+ /* 3199 */ ( 8248 -4672 0 )
+ /* 3200 */ ( 8760 -4672 0 )
+ /* 3201 */ ( 9272 -4672 0 )
+ /* 3202 */ ( 9784 -4672 0 )
+ /* 3203 */ ( 10296 -4672 0 )
+ /* 3204 */ ( 10808 -4672 0 )
+ /* 3205 */ ( 11320 -4672 0 )
+ /* 3206 */ ( 11832 -4672 0 )
+ /* 3207 */ ( -20424 -4160 0 )
+ /* 3208 */ ( -20936 -4160 0 )
+ /* 3209 */ ( -19912 -4160 0 )
+ /* 3210 */ ( -19400 -4160 0 )
+ /* 3211 */ ( -18888 -4160 0 )
+ /* 3212 */ ( -18376 -4160 0 )
+ /* 3213 */ ( -17864 -4160 0 )
+ /* 3214 */ ( -17352 -4160 0 )
+ /* 3215 */ ( -16840 -4160 0 )
+ /* 3216 */ ( -16328 -4160 0 )
+ /* 3217 */ ( -15816 -4160 0 )
+ /* 3218 */ ( -15304 -4160 0 )
+ /* 3219 */ ( -14792 -4160 0 )
+ /* 3220 */ ( -14280 -4160 0 )
+ /* 3221 */ ( -13768 -4160 0 )
+ /* 3222 */ ( -13256 -4160 0 )
+ /* 3223 */ ( -12744 -4160 0 )
+ /* 3224 */ ( -12232 -4160 0 )
+ /* 3225 */ ( -11720 -4160 0 )
+ /* 3226 */ ( -11208 -4160 0 )
+ /* 3227 */ ( -10696 -4160 0 )
+ /* 3228 */ ( -10184 -4160 0 )
+ /* 3229 */ ( -9672 -4160 0 )
+ /* 3230 */ ( -9160 -4160 0 )
+ /* 3231 */ ( -8648 -4160 0 )
+ /* 3232 */ ( -8136 -4160 0 )
+ /* 3233 */ ( -7624 -4160 0 )
+ /* 3234 */ ( -7112 -4160 0 )
+ /* 3235 */ ( -6600 -4160 0 )
+ /* 3236 */ ( -6088 -4160 0 )
+ /* 3237 */ ( -5576 -4160 0 )
+ /* 3238 */ ( -5064 -4160 15.0956544876 )
+ /* 3239 */ ( -4552 -4160 35.12890625 )
+ /* 3240 */ ( -4040 -4160 0 )
+ /* 3241 */ ( -4294.3793945312 -4414.3793945312 8 )
+ /* 3242 */ ( -4156.5991210938 -4160 8 )
+ /* 3243 */ ( -3528 -4440 0 )
+ /* 3244 */ ( -4040 -4440 0 )
+ /* 3245 */ ( -3016 -4440 0 )
+ /* 3246 */ ( -2504 -4440 0 )
+ /* 3247 */ ( -1992 -4440 0 )
+ /* 3248 */ ( -1480 -4440 0 )
+ /* 3249 */ ( -968 -4440 0 )
+ /* 3250 */ ( -456 -4440 0 )
+ /* 3251 */ ( 56 -4440 0 )
+ /* 3252 */ ( 568 -4440 0 )
+ /* 3253 */ ( 1080 -4440 0 )
+ /* 3254 */ ( 1592 -4440 0 )
+ /* 3255 */ ( 2104 -4440 0 )
+ /* 3256 */ ( 2616 -4440 0 )
+ /* 3257 */ ( 3128 -4440 0 )
+ /* 3258 */ ( 3640 -4160 0 )
+ /* 3259 */ ( 3128 -4160 0 )
+ /* 3260 */ ( 4152 -4424 0 )
+ /* 3261 */ ( 3640 -4424 0 )
+ /* 3262 */ ( 4664 -4424 0 )
+ /* 3263 */ ( 5176 -4160 0 )
+ /* 3264 */ ( 4664 -4160 0 )
+ /* 3265 */ ( 5688 -4160 0 )
+ /* 3266 */ ( 6200 -4160 0 )
+ /* 3267 */ ( 6712 -4160 0 )
+ /* 3268 */ ( 7224 -4160 0 )
+ /* 3269 */ ( 7736 -4160 0 )
+ /* 3270 */ ( 8248 -4160 0 )
+ /* 3271 */ ( 8760 -4160 0 )
+ /* 3272 */ ( 9272 -4160 0 )
+ /* 3273 */ ( 9784 -4160 0 )
+ /* 3274 */ ( 10296 -4160 0 )
+ /* 3275 */ ( 10808 -4160 0 )
+ /* 3276 */ ( 11320 -4160 0 )
+ /* 3277 */ ( 11832 -4160 0 )
+ /* 3278 */ ( -20424 -3648 0 )
+ /* 3279 */ ( -20936 -3648 0 )
+ /* 3280 */ ( -19912 -3648 0 )
+ /* 3281 */ ( -19400 -3648 0 )
+ /* 3282 */ ( -18888 -3648 0 )
+ /* 3283 */ ( -18376 -3648 0 )
+ /* 3284 */ ( -17864 -3648 0 )
+ /* 3285 */ ( -17352 -3648 0 )
+ /* 3286 */ ( -16840 -3648 0 )
+ /* 3287 */ ( -16328 -3648 0 )
+ /* 3288 */ ( -15816 -3648 0 )
+ /* 3289 */ ( -15304 -3648 0 )
+ /* 3290 */ ( -14792 -3648 0 )
+ /* 3291 */ ( -14280 -3648 0 )
+ /* 3292 */ ( -13768 -3648 0 )
+ /* 3293 */ ( -13256 -3648 0 )
+ /* 3294 */ ( -12744 -3648 0 )
+ /* 3295 */ ( -12232 -3648 0 )
+ /* 3296 */ ( -11720 -3648 0 )
+ /* 3297 */ ( -11208 -3648 0 )
+ /* 3298 */ ( -10696 -3648 0 )
+ /* 3299 */ ( -10184 -3648 0 )
+ /* 3300 */ ( -9672 -3648 0 )
+ /* 3301 */ ( -9160 -3648 0 )
+ /* 3302 */ ( -8648 -3648 0 )
+ /* 3303 */ ( -8136 -3648 0 )
+ /* 3304 */ ( -7624 -3648 0 )
+ /* 3305 */ ( -7112 -3648 0 )
+ /* 3306 */ ( -6600 -3648 0 )
+ /* 3307 */ ( -6088 -3648 0 )
+ /* 3308 */ ( -5576 -3648 0 )
+ /* 3309 */ ( -5064 -3648 19.3479270935 )
+ /* 3310 */ ( -4552 -3648 32 )
+ /* 3311 */ ( -4156.5991210938 -3764.5991210938 8 )
+ /* 3312 */ ( -4168 -3648 8 )
+ /* 3313 */ ( 4932 -4160 0 )
+ /* 3314 */ ( 5176 -3648 0 )
+ /* 3315 */ ( 4932 -3648 0 )
+ /* 3316 */ ( 5688 -3648 0 )
+ /* 3317 */ ( 6200 -3648 0 )
+ /* 3318 */ ( 6712 -3648 0 )
+ /* 3319 */ ( 7224 -3648 0 )
+ /* 3320 */ ( 7736 -3648 0 )
+ /* 3321 */ ( 8248 -3648 0 )
+ /* 3322 */ ( 8760 -3648 0 )
+ /* 3323 */ ( 9272 -3648 0 )
+ /* 3324 */ ( 9784 -3648 0 )
+ /* 3325 */ ( 10296 -3648 0 )
+ /* 3326 */ ( 10808 -3648 0 )
+ /* 3327 */ ( 11320 -3648 0 )
+ /* 3328 */ ( 11832 -3648 0 )
+ /* 3329 */ ( -20424 -3136 0 )
+ /* 3330 */ ( -20936 -3136 0 )
+ /* 3331 */ ( -19912 -3136 0 )
+ /* 3332 */ ( -19400 -3136 0 )
+ /* 3333 */ ( -18888 -3136 0 )
+ /* 3334 */ ( -18376 -3136 0 )
+ /* 3335 */ ( -17864 -3136 0 )
+ /* 3336 */ ( -17352 -3136 0 )
+ /* 3337 */ ( -16840 -3136 0 )
+ /* 3338 */ ( -16328 -3136 0 )
+ /* 3339 */ ( -15816 -3136 0 )
+ /* 3340 */ ( -15304 -3136 0 )
+ /* 3341 */ ( -14792 -3136 0 )
+ /* 3342 */ ( -14280 -3136 0 )
+ /* 3343 */ ( -13768 -3136 0 )
+ /* 3344 */ ( -13256 -3136 0 )
+ /* 3345 */ ( -12744 -3136 0 )
+ /* 3346 */ ( -12232 -3136 0 )
+ /* 3347 */ ( -11720 -3136 0 )
+ /* 3348 */ ( -11208 -3136 0 )
+ /* 3349 */ ( -10696 -3136 0 )
+ /* 3350 */ ( -10184 -3136 0 )
+ /* 3351 */ ( -9672 -3136 0 )
+ /* 3352 */ ( -9160 -3136 0 )
+ /* 3353 */ ( -8648 -3136 0 )
+ /* 3354 */ ( -8136 -3136 0 )
+ /* 3355 */ ( -7624 -3136 0 )
+ /* 3356 */ ( -7112 -3136 0 )
+ /* 3357 */ ( -6600 -3136 0 )
+ /* 3358 */ ( -6088 -3136 0 )
+ /* 3359 */ ( -5576 -3136 0 )
+ /* 3360 */ ( -5064 -3136 21.1000480652 )
+ /* 3361 */ ( -4552 -3136 20.1135520935 )
+ /* 3362 */ ( -4168 -3264 8 )
+ /* 3363 */ ( -4243.6435546875 -3136 8 )
+ /* 3364 */ ( 5176 -3136 0 )
+ /* 3365 */ ( 4932 -3136 0 )
+ /* 3366 */ ( 5688 -3136 0 )
+ /* 3367 */ ( 6200 -3136 0 )
+ /* 3368 */ ( 6712 -3136 0 )
+ /* 3369 */ ( 7224 -3136 0 )
+ /* 3370 */ ( 7736 -3136 0 )
+ /* 3371 */ ( 8248 -3136 0 )
+ /* 3372 */ ( 8760 -3136 0 )
+ /* 3373 */ ( 9272 -3136 0 )
+ /* 3374 */ ( 9784 -3136 0 )
+ /* 3375 */ ( 10296 -3136 0 )
+ /* 3376 */ ( 10808 -3136 0 )
+ /* 3377 */ ( 11320 -3136 0 )
+ /* 3378 */ ( 11832 -3136 0 )
+ /* 3379 */ ( -20424 -2624 0 )
+ /* 3380 */ ( -20936 -2624 0 )
+ /* 3381 */ ( -19912 -2624 0 )
+ /* 3382 */ ( -19400 -2624 0 )
+ /* 3383 */ ( -18888 -2624 0 )
+ /* 3384 */ ( -18376 -2624 0 )
+ /* 3385 */ ( -17864 -2624 0 )
+ /* 3386 */ ( -17352 -2624 0 )
+ /* 3387 */ ( -16840 -2624 0 )
+ /* 3388 */ ( -16328 -2624 0 )
+ /* 3389 */ ( -15816 -2624 0 )
+ /* 3390 */ ( -15304 -2624 0 )
+ /* 3391 */ ( -14792 -2624 0 )
+ /* 3392 */ ( -14280 -2624 0 )
+ /* 3393 */ ( -13768 -2624 0 )
+ /* 3394 */ ( -13256 -2624 0 )
+ /* 3395 */ ( -12744 -2624 0 )
+ /* 3396 */ ( -12232 -2624 0 )
+ /* 3397 */ ( -11720 -2624 0 )
+ /* 3398 */ ( -11208 -2624 0 )
+ /* 3399 */ ( -10696 -2624 0 )
+ /* 3400 */ ( -10184 -2624 0 )
+ /* 3401 */ ( -9672 -2624 0 )
+ /* 3402 */ ( -9160 -2624 0 )
+ /* 3403 */ ( -8648 -2624 0 )
+ /* 3404 */ ( -8136 -2624 0 )
+ /* 3405 */ ( -7624 -2624 0 )
+ /* 3406 */ ( -7112 -2624 0 )
+ /* 3407 */ ( -6600 -2624 0 )
+ /* 3408 */ ( -6088 -2624 0 )
+ /* 3409 */ ( -5576 -2624 0 )
+ /* 3410 */ ( -5064 -2624 38.7700653076 )
+ /* 3411 */ ( -4552 -2624 39.0458755493 )
+ /* 3412 */ ( -4243.6435546875 -2827.6437988281 8 )
+ /* 3413 */ ( -4040 -2624 0 )
+ /* 3414 */ ( 5176 -2624 0 )
+ /* 3415 */ ( 4932 -2624 0 )
+ /* 3416 */ ( 5688 -2624 0 )
+ /* 3417 */ ( 6200 -2624 0 )
+ /* 3418 */ ( 6712 -2624 0 )
+ /* 3419 */ ( 7224 -2624 0 )
+ /* 3420 */ ( 7736 -2624 0 )
+ /* 3421 */ ( 8248 -2624 0 )
+ /* 3422 */ ( 8760 -2624 0 )
+ /* 3423 */ ( 9272 -2624 0 )
+ /* 3424 */ ( 9784 -2624 0 )
+ /* 3425 */ ( 10296 -2624 0 )
+ /* 3426 */ ( 10808 -2624 0 )
+ /* 3427 */ ( 11320 -2624 0 )
+ /* 3428 */ ( 11832 -2624 0 )
+ /* 3429 */ ( -20424 -2112 0 )
+ /* 3430 */ ( -20936 -2112 0 )
+ /* 3431 */ ( -19912 -2112 0 )
+ /* 3432 */ ( -19400 -2112 0 )
+ /* 3433 */ ( -18888 -2112 0 )
+ /* 3434 */ ( -18376 -2112 0 )
+ /* 3435 */ ( -17864 -2112 0 )
+ /* 3436 */ ( -17352 -2112 0 )
+ /* 3437 */ ( -16840 -2112 0 )
+ /* 3438 */ ( -16328 -2112 0 )
+ /* 3439 */ ( -15816 -2112 0 )
+ /* 3440 */ ( -15304 -2112 0 )
+ /* 3441 */ ( -14792 -2112 0 )
+ /* 3442 */ ( -14280 -2112 0 )
+ /* 3443 */ ( -13768 -2112 0 )
+ /* 3444 */ ( -13256 -2112 0 )
+ /* 3445 */ ( -12744 -2112 0 )
+ /* 3446 */ ( -12232 -2112 0 )
+ /* 3447 */ ( -11720 -2112 0 )
+ /* 3448 */ ( -11208 -2112 0 )
+ /* 3449 */ ( -10696 -2112 0 )
+ /* 3450 */ ( -10184 -2112 0 )
+ /* 3451 */ ( -9672 -2112 0 )
+ /* 3452 */ ( -9160 -2112 0 )
+ /* 3453 */ ( -8648 -2112 0 )
+ /* 3454 */ ( -8136 -2112 0 )
+ /* 3455 */ ( -7624 -2112 0 )
+ /* 3456 */ ( -7112 -2112 0.6356186867 )
+ /* 3457 */ ( -6600 -2112 0.4697090983 )
+ /* 3458 */ ( -6088 -2112 0 )
+ /* 3459 */ ( -5576 -2112 0 )
+ /* 3460 */ ( -5064 -2112 43.7743606567 )
+ /* 3461 */ ( -4552 -2112 45.7897262573 )
+ /* 3462 */ ( -4040 -2112 0 )
+ /* 3463 */ ( -4144.90234375 -2216.90234375 8 )
+ /* 3464 */ ( -4129.4521484375 -2112 8 )
+ /* 3465 */ ( 5176 -2112 0 )
+ /* 3466 */ ( 4932 -2112 0 )
+ /* 3467 */ ( 5688 -2112 0 )
+ /* 3468 */ ( 6200 -2112 0 )
+ /* 3469 */ ( 6712 -2112 0 )
+ /* 3470 */ ( 7224 -2112 0 )
+ /* 3471 */ ( 7736 -2112 0 )
+ /* 3472 */ ( 8248 -2112 0 )
+ /* 3473 */ ( 8760 -2112 0 )
+ /* 3474 */ ( 9272 -2112 0 )
+ /* 3475 */ ( 9784 -2112 0 )
+ /* 3476 */ ( 10296 -2112 0 )
+ /* 3477 */ ( 10808 -2112 0 )
+ /* 3478 */ ( 11320 -2112 0 )
+ /* 3479 */ ( 11832 -2112 0 )
+ /* 3480 */ ( -20424 -1600 0 )
+ /* 3481 */ ( -20936 -1600 0 )
+ /* 3482 */ ( -19912 -1600 0 )
+ /* 3483 */ ( -19400 -1600 0 )
+ /* 3484 */ ( -18888 -1600 0 )
+ /* 3485 */ ( -18376 -1600 0 )
+ /* 3486 */ ( -17864 -1600 0 )
+ /* 3487 */ ( -17352 -1600 0 )
+ /* 3488 */ ( -16840 -1600 0 )
+ /* 3489 */ ( -16328 -1600 0 )
+ /* 3490 */ ( -15816 -1600 0 )
+ /* 3491 */ ( -15304 -1600 0 )
+ /* 3492 */ ( -14792 -1600 0 )
+ /* 3493 */ ( -14280 -1600 0 )
+ /* 3494 */ ( -13768 -1600 0 )
+ /* 3495 */ ( -13256 -1600 0 )
+ /* 3496 */ ( -12744 -1600 0 )
+ /* 3497 */ ( -12232 -1600 0 )
+ /* 3498 */ ( -11720 -1600 0 )
+ /* 3499 */ ( -11208 -1600 0 )
+ /* 3500 */ ( -10696 -1600 0 )
+ /* 3501 */ ( -10184 -1600 0 )
+ /* 3502 */ ( -9672 -1600 0 )
+ /* 3503 */ ( -9160 -1600 0 )
+ /* 3504 */ ( -8648 -1600 0 )
+ /* 3505 */ ( -8136 -1600 0 )
+ /* 3506 */ ( -7624 -1600 0.4178406 )
+ /* 3507 */ ( -7112 -1600 29.4534320831 )
+ /* 3508 */ ( -6600 -1600 27.8703784943 )
+ /* 3509 */ ( -6088 -1600 0.7092252374 )
+ /* 3510 */ ( -5576 -1600 0 )
+ /* 3511 */ ( -5064 -1600 13.4286193848 )
+ /* 3512 */ ( -4552 -1600 14.4101161957 )
+ /* 3513 */ ( -4129.4521484375 -1689.4523925781 8 )
+ /* 3514 */ ( -4324.2446289062 -1600 8 )
+ /* 3515 */ ( 5176 -1600 0 )
+ /* 3516 */ ( 4932 -1600 0 )
+ /* 3517 */ ( 5688 -1600 0 )
+ /* 3518 */ ( 6200 -1600 0 )
+ /* 3519 */ ( 6712 -1600 0 )
+ /* 3520 */ ( 7224 -1600 0 )
+ /* 3521 */ ( 7736 -1600 0 )
+ /* 3522 */ ( 8248 -1600 0 )
+ /* 3523 */ ( 8760 -1600 0 )
+ /* 3524 */ ( 9272 -1600 0 )
+ /* 3525 */ ( 9784 -1600 0 )
+ /* 3526 */ ( 10296 -1600 0 )
+ /* 3527 */ ( 10808 -1600 0 )
+ /* 3528 */ ( 11320 -1600 0 )
+ /* 3529 */ ( 11832 -1600 0 )
+ /* 3530 */ ( -20424 -1088 0 )
+ /* 3531 */ ( -20936 -1088 0 )
+ /* 3532 */ ( -19912 -1088 0 )
+ /* 3533 */ ( -19400 -1088 0 )
+ /* 3534 */ ( -18888 -1088 0 )
+ /* 3535 */ ( -18376 -1088 0 )
+ /* 3536 */ ( -17864 -1088 0 )
+ /* 3537 */ ( -17352 -1088 0 )
+ /* 3538 */ ( -16840 -1088 0 )
+ /* 3539 */ ( -16328 -1088 0 )
+ /* 3540 */ ( -15816 -1088 0 )
+ /* 3541 */ ( -15304 -1088 0 )
+ /* 3542 */ ( -14792 -1088 0 )
+ /* 3543 */ ( -14280 -1088 0 )
+ /* 3544 */ ( -13768 -1088 0 )
+ /* 3545 */ ( -13256 -1088 0 )
+ /* 3546 */ ( -12744 -1088 0 )
+ /* 3547 */ ( -12232 -1088 0 )
+ /* 3548 */ ( -11720 -1088 0 )
+ /* 3549 */ ( -11208 -1088 0 )
+ /* 3550 */ ( -10696 -1088 0 )
+ /* 3551 */ ( -10184 -1088 0 )
+ /* 3552 */ ( -9672 -1088 0 )
+ /* 3553 */ ( -9160 -1088 0 )
+ /* 3554 */ ( -8648 -1088 0 )
+ /* 3555 */ ( -8136 -1088 0 )
+ /* 3556 */ ( -7624 -1088 1.9043617249 )
+ /* 3557 */ ( -7112 -1088 118.067817688 )
+ /* 3558 */ ( -6600 -1088 195.6887207031 )
+ /* 3559 */ ( -6088 -1088 32.2069969177 )
+ /* 3560 */ ( -5576 -1088 0 )
+ /* 3561 */ ( -5064 -1088 45.2943687439 )
+ /* 3562 */ ( -4552 -1088 27.7318248749 )
+ /* 3563 */ ( -4324.2446289062 -1372.2447509766 8 )
+ /* 3564 */ ( -4187.7001953125 -1088 8 )
+ /* 3565 */ ( 5176 -1088 0 )
+ /* 3566 */ ( 4932 -1088 0 )
+ /* 3567 */ ( 5688 -1088 0 )
+ /* 3568 */ ( 6200 -1088 0 )
+ /* 3569 */ ( 6712 -1088 0 )
+ /* 3570 */ ( 7224 -1088 0 )
+ /* 3571 */ ( 7736 -1088 0 )
+ /* 3572 */ ( 8248 -1088 0 )
+ /* 3573 */ ( 8760 -1088 0 )
+ /* 3574 */ ( 9272 -1088 0 )
+ /* 3575 */ ( 9784 -1088 0 )
+ /* 3576 */ ( 10296 -1088 0 )
+ /* 3577 */ ( 10808 -1088 0 )
+ /* 3578 */ ( 11320 -1088 0 )
+ /* 3579 */ ( 11832 -1088 0 )
+ /* 3580 */ ( -20424 -576 0 )
+ /* 3581 */ ( -20936 -576 0 )
+ /* 3582 */ ( -19912 -576 0 )
+ /* 3583 */ ( -19400 -576 0 )
+ /* 3584 */ ( -18888 -576 0 )
+ /* 3585 */ ( -18376 -576 0 )
+ /* 3586 */ ( -17864 -576 0 )
+ /* 3587 */ ( -17352 -576 0 )
+ /* 3588 */ ( -16840 -576 0 )
+ /* 3589 */ ( -16328 -576 0 )
+ /* 3590 */ ( -15816 -576 0 )
+ /* 3591 */ ( -15304 -576 0 )
+ /* 3592 */ ( -14792 -576 0 )
+ /* 3593 */ ( -14280 -576 0 )
+ /* 3594 */ ( -13768 -576 0 )
+ /* 3595 */ ( -13256 -576 0 )
+ /* 3596 */ ( -12744 -576 0 )
+ /* 3597 */ ( -12232 -576 0 )
+ /* 3598 */ ( -11720 -576 0 )
+ /* 3599 */ ( -11208 -576 0 )
+ /* 3600 */ ( -10696 -576 0 )
+ /* 3601 */ ( -10184 -576 0 )
+ /* 3602 */ ( -9672 -576 0 )
+ /* 3603 */ ( -9160 -576 0 )
+ /* 3604 */ ( -8648 -576 0 )
+ /* 3605 */ ( -8136 -576 0 )
+ /* 3606 */ ( -7624 -576 0 )
+ /* 3607 */ ( -7112 -576 49.0809822083 )
+ /* 3608 */ ( -6600 -576 202.1785888672 )
+ /* 3609 */ ( -6088 -576 137.9188842773 )
+ /* 3610 */ ( -5576 -576 5.2682919502 )
+ /* 3611 */ ( -5064 -576 70.7193908691 )
+ /* 3612 */ ( -4552 -576 22.4631118774 )
+ /* 3613 */ ( -4040 -1088 0 )
+ /* 3614 */ ( -4040 -576 0 )
+ /* 3615 */ ( -4187.7001953125 -723.7003173828 8 )
+ /* 3616 */ ( -4222.3432617188 -576 8 )
+ /* 3617 */ ( 5176 -576 0 )
+ /* 3618 */ ( 4932 -576 0 )
+ /* 3619 */ ( 5688 -576 0 )
+ /* 3620 */ ( 6200 -576 0 )
+ /* 3621 */ ( 6712 -576 0 )
+ /* 3622 */ ( 7224 -576 0 )
+ /* 3623 */ ( 7736 -576 0 )
+ /* 3624 */ ( 8248 -576 0 )
+ /* 3625 */ ( 8760 -576 0 )
+ /* 3626 */ ( 9272 -576 0 )
+ /* 3627 */ ( 9784 -576 0 )
+ /* 3628 */ ( 10296 -576 0 )
+ /* 3629 */ ( 10808 -576 0 )
+ /* 3630 */ ( 11320 -576 0 )
+ /* 3631 */ ( 11832 -576 0 )
+ /* 3632 */ ( -20424 -64 0 )
+ /* 3633 */ ( -20936 -64 0 )
+ /* 3634 */ ( -19912 -64 0 )
+ /* 3635 */ ( -19400 -64 0 )
+ /* 3636 */ ( -18888 -64 0 )
+ /* 3637 */ ( -18376 -64 0 )
+ /* 3638 */ ( -17864 -64 0 )
+ /* 3639 */ ( -17352 -64 0 )
+ /* 3640 */ ( -16840 -64 0 )
+ /* 3641 */ ( -16328 -64 0 )
+ /* 3642 */ ( -15816 -64 0 )
+ /* 3643 */ ( -15304 -64 0 )
+ /* 3644 */ ( -14792 -64 0 )
+ /* 3645 */ ( -14280 -64 0 )
+ /* 3646 */ ( -13768 -64 0 )
+ /* 3647 */ ( -13256 -64 0 )
+ /* 3648 */ ( -12744 -64 0 )
+ /* 3649 */ ( -12232 -64 0 )
+ /* 3650 */ ( -11720 -64 0 )
+ /* 3651 */ ( -11208 -64 0 )
+ /* 3652 */ ( -10696 -64 0 )
+ /* 3653 */ ( -10184 -64 0 )
+ /* 3654 */ ( -9672 -64 0 )
+ /* 3655 */ ( -9160 -64 0 )
+ /* 3656 */ ( -8648 -64 0 )
+ /* 3657 */ ( -8136 -64 0 )
+ /* 3658 */ ( -7624 -64 0 )
+ /* 3659 */ ( -7112 -64 1.807929635 )
+ /* 3660 */ ( -6600 -64 19.7915916443 )
+ /* 3661 */ ( -6088 -64 32.5582046509 )
+ /* 3662 */ ( -5576 -64 29.6017360687 )
+ /* 3663 */ ( -5064 -64 62.4751625061 )
+ /* 3664 */ ( -4552 -64 20.8483467102 )
+ /* 3665 */ ( -4040 -64 2.0560541153 )
+ /* 3666 */ ( -4189.1298828125 -213.1298217773 8 )
+ /* 3667 */ ( -4201.9438476562 -64 8 )
+ /* 3668 */ ( 5176 -64 0 )
+ /* 3669 */ ( 4932 -64 0 )
+ /* 3670 */ ( 5688 -64 0 )
+ /* 3671 */ ( 6200 -64 0 )
+ /* 3672 */ ( 6712 -64 0 )
+ /* 3673 */ ( 7224 -64 0 )
+ /* 3674 */ ( 7736 -64 0 )
+ /* 3675 */ ( 8248 -64 0 )
+ /* 3676 */ ( 8760 -64 0 )
+ /* 3677 */ ( 9272 -64 0 )
+ /* 3678 */ ( 9784 -64 0 )
+ /* 3679 */ ( 10296 -64 0 )
+ /* 3680 */ ( 10808 -64 0 )
+ /* 3681 */ ( 11320 -64 0 )
+ /* 3682 */ ( 11832 -64 0 )
+ /* 3683 */ ( -20424 448 0 )
+ /* 3684 */ ( -20936 448 0 )
+ /* 3685 */ ( -19912 448 0 )
+ /* 3686 */ ( -19400 448 0 )
+ /* 3687 */ ( -18888 448 0 )
+ /* 3688 */ ( -18376 448 0 )
+ /* 3689 */ ( -17864 448 0 )
+ /* 3690 */ ( -17352 448 0 )
+ /* 3691 */ ( -16840 448 0 )
+ /* 3692 */ ( -16328 448 0 )
+ /* 3693 */ ( -15816 448 0 )
+ /* 3694 */ ( -15304 448 0 )
+ /* 3695 */ ( -14792 448 0 )
+ /* 3696 */ ( -14280 448 0 )
+ /* 3697 */ ( -13768 448 0 )
+ /* 3698 */ ( -13256 448 0 )
+ /* 3699 */ ( -12744 448 0 )
+ /* 3700 */ ( -12232 448 0 )
+ /* 3701 */ ( -11720 448 0 )
+ /* 3702 */ ( -11208 448 0 )
+ /* 3703 */ ( -10696 448 0 )
+ /* 3704 */ ( -10184 448 0 )
+ /* 3705 */ ( -9672 448 0 )
+ /* 3706 */ ( -9160 448 0 )
+ /* 3707 */ ( -8648 448 0 )
+ /* 3708 */ ( -8136 448 0 )
+ /* 3709 */ ( -7624 448 0 )
+ /* 3710 */ ( -7112 448 0 )
+ /* 3711 */ ( -6600 448 0 )
+ /* 3712 */ ( -6088 448 0 )
+ /* 3713 */ ( -5576 448 69.4083938599 )
+ /* 3714 */ ( -5064 448 92.1939315796 )
+ /* 3715 */ ( -4552 448 33.0715675354 )
+ /* 3716 */ ( -4088.8139648438 399.1860351562 8 )
+ /* 3717 */ ( -4066.2348632812 448 8 )
+ /* 3718 */ ( 5176 448 0 )
+ /* 3719 */ ( 4932 448 0 )
+ /* 3720 */ ( 5688 448 0 )
+ /* 3721 */ ( 6200 448 0 )
+ /* 3722 */ ( 6712 448 0 )
+ /* 3723 */ ( 7224 448 0 )
+ /* 3724 */ ( 7736 448 0 )
+ /* 3725 */ ( 8248 448 0 )
+ /* 3726 */ ( 8760 448 0 )
+ /* 3727 */ ( 9272 448 0 )
+ /* 3728 */ ( 9784 448 0 )
+ /* 3729 */ ( 10296 448 0 )
+ /* 3730 */ ( 10808 448 0 )
+ /* 3731 */ ( 11320 448 0 )
+ /* 3732 */ ( 11832 448 0 )
+ /* 3733 */ ( -20424 960 0 )
+ /* 3734 */ ( -20936 960 0 )
+ /* 3735 */ ( -19912 960 0 )
+ /* 3736 */ ( -19400 960 0 )
+ /* 3737 */ ( -18888 960 0 )
+ /* 3738 */ ( -18376 960 0 )
+ /* 3739 */ ( -17864 960 0 )
+ /* 3740 */ ( -17352 960 0 )
+ /* 3741 */ ( -16840 960 0 )
+ /* 3742 */ ( -16328 960 0 )
+ /* 3743 */ ( -15816 960 0 )
+ /* 3744 */ ( -15304 960 0 )
+ /* 3745 */ ( -14792 960 0 )
+ /* 3746 */ ( -14280 960 0 )
+ /* 3747 */ ( -13768 960 0 )
+ /* 3748 */ ( -13256 960 0 )
+ /* 3749 */ ( -12744 960 0 )
+ /* 3750 */ ( -12232 960 0 )
+ /* 3751 */ ( -11720 960 0 )
+ /* 3752 */ ( -11208 960 0 )
+ /* 3753 */ ( -10696 960 0 )
+ /* 3754 */ ( -10184 960 0 )
+ /* 3755 */ ( -9672 960 0 )
+ /* 3756 */ ( -9160 960 0 )
+ /* 3757 */ ( -8648 960 0 )
+ /* 3758 */ ( -8136 960 0 )
+ /* 3759 */ ( -7624 960 0 )
+ /* 3760 */ ( -7112 960 0 )
+ /* 3761 */ ( -6600 960 0 )
+ /* 3762 */ ( -6088 960 0 )
+ /* 3763 */ ( -5576 960 43.9302520752 )
+ /* 3764 */ ( -5064 960 80.7944030762 )
+ /* 3765 */ ( -4552 960 44.0608673096 )
+ /* 3766 */ ( -4040 514.0521850586 8 )
+ /* 3767 */ ( -4040 960 17.1418228149 )
+ /* 3768 */ ( -4040 448 6.6459465027 )
+ /* 3769 */ ( -3528 960 0 )
+ /* 3770 */ ( 5176 960 0 )
+ /* 3771 */ ( 4932 960 0 )
+ /* 3772 */ ( 5688 960 0 )
+ /* 3773 */ ( 6200 960 0 )
+ /* 3774 */ ( 6712 960 0 )
+ /* 3775 */ ( 7224 960 0 )
+ /* 3776 */ ( 7736 960 0 )
+ /* 3777 */ ( 8248 960 0 )
+ /* 3778 */ ( 8760 960 0 )
+ /* 3779 */ ( 9272 960 0 )
+ /* 3780 */ ( 9784 960 0 )
+ /* 3781 */ ( 10296 960 0 )
+ /* 3782 */ ( 10808 960 0 )
+ /* 3783 */ ( 11320 960 0 )
+ /* 3784 */ ( 11832 960 0 )
+ /* 3785 */ ( -20424 1472 0 )
+ /* 3786 */ ( -20936 1472 0 )
+ /* 3787 */ ( -19912 1472 0 )
+ /* 3788 */ ( -19400 1472 0 )
+ /* 3789 */ ( -18888 1472 0 )
+ /* 3790 */ ( -18376 1472 0 )
+ /* 3791 */ ( -17864 1472 0 )
+ /* 3792 */ ( -17352 1472 0 )
+ /* 3793 */ ( -16840 1472 0 )
+ /* 3794 */ ( -16328 1472 0 )
+ /* 3795 */ ( -15816 1472 0 )
+ /* 3796 */ ( -15304 1472 0 )
+ /* 3797 */ ( -14792 1472 0 )
+ /* 3798 */ ( -14280 1472 0 )
+ /* 3799 */ ( -13768 1472 0 )
+ /* 3800 */ ( -13256 1472 0 )
+ /* 3801 */ ( -12744 1472 0 )
+ /* 3802 */ ( -12232 1472 0 )
+ /* 3803 */ ( -11720 1472 0 )
+ /* 3804 */ ( -11208 1472 0 )
+ /* 3805 */ ( -10696 1472 0 )
+ /* 3806 */ ( -10184 1472 0 )
+ /* 3807 */ ( -9672 1472 0 )
+ /* 3808 */ ( -9160 1472 0 )
+ /* 3809 */ ( -8648 1472 0 )
+ /* 3810 */ ( -8136 1472 0 )
+ /* 3811 */ ( -7624 1472 0 )
+ /* 3812 */ ( -7112 1472 0 )
+ /* 3813 */ ( -6600 1472 0 )
+ /* 3814 */ ( -6088 1472 0 )
+ /* 3815 */ ( -5576 1472 23.5744171143 )
+ /* 3816 */ ( -5064 1472 63.9339828491 )
+ /* 3817 */ ( -4552 1472 36.272277832 )
+ /* 3818 */ ( -4040 1472 15.9160680771 )
+ /* 3819 */ ( -3766.9477539062 960 8 )
+ /* 3820 */ ( -3766.9477539062 1233.0522460938 8 )
+ /* 3821 */ ( -3528 1472 0 )
+ /* 3822 */ ( 5176 1472 0 )
+ /* 3823 */ ( 4932 1472 0 )
+ /* 3824 */ ( 5688 1472 0 )
+ /* 3825 */ ( 6200 1472 0 )
+ /* 3826 */ ( 6712 1472 0 )
+ /* 3827 */ ( 7224 1472 0 )
+ /* 3828 */ ( 7736 1472 0 )
+ /* 3829 */ ( 8248 1472 0 )
+ /* 3830 */ ( 8760 1472 0 )
+ /* 3831 */ ( 9272 1472 0 )
+ /* 3832 */ ( 9784 1472 0 )
+ /* 3833 */ ( 10296 1472 0 )
+ /* 3834 */ ( 10808 1472 0 )
+ /* 3835 */ ( 11320 1472 0 )
+ /* 3836 */ ( 11832 1472 0 )
+ /* 3837 */ ( -20424 1984 0 )
+ /* 3838 */ ( -20936 1984 0 )
+ /* 3839 */ ( -19912 1984 0 )
+ /* 3840 */ ( -19400 1984 0 )
+ /* 3841 */ ( -18888 1984 0 )
+ /* 3842 */ ( -18376 1984 0 )
+ /* 3843 */ ( -17864 1984 0 )
+ /* 3844 */ ( -17352 1984 0 )
+ /* 3845 */ ( -16840 1984 0 )
+ /* 3846 */ ( -16328 1984 0 )
+ /* 3847 */ ( -15816 1984 0 )
+ /* 3848 */ ( -15304 1984 0 )
+ /* 3849 */ ( -14792 1984 0 )
+ /* 3850 */ ( -14280 1984 0 )
+ /* 3851 */ ( -13768 1984 0 )
+ /* 3852 */ ( -13256 1984 0 )
+ /* 3853 */ ( -12744 1984 0 )
+ /* 3854 */ ( -12232 1984 0 )
+ /* 3855 */ ( -11720 1984 0 )
+ /* 3856 */ ( -11208 1984 0 )
+ /* 3857 */ ( -10696 1984 0 )
+ /* 3858 */ ( -10184 1984 0 )
+ /* 3859 */ ( -9672 1984 0 )
+ /* 3860 */ ( -9160 1984 0 )
+ /* 3861 */ ( -8648 1984 0 )
+ /* 3862 */ ( -8136 1984 0 )
+ /* 3863 */ ( -7624 1984 0 )
+ /* 3864 */ ( -7112 1984 0 )
+ /* 3865 */ ( -6600 1984 0 )
+ /* 3866 */ ( -6088 1984 0 )
+ /* 3867 */ ( -5576 1984 28.1980285645 )
+ /* 3868 */ ( -5064 1984 68.4480209351 )
+ /* 3869 */ ( -4552 1954.6882324219 8 )
+ /* 3870 */ ( -4567.2475585938 1968.7524414062 8 )
+ /* 3871 */ ( -4566.140625 1984 8 )
+ /* 3872 */ ( -4040 1739.5062255859 8 )
+ /* 3873 */ ( -4144.3266601562 1879.6734619141 8 )
+ /* 3874 */ ( -3785.3500976562 1472 8 )
+ /* 3875 */ ( -3785.3500976562 1726.6500244141 8 )
+ /* 3876 */ ( 5176 1984 0 )
+ /* 3877 */ ( 4932 1984 0 )
+ /* 3878 */ ( 5688 1984 0 )
+ /* 3879 */ ( 6200 1984 0 )
+ /* 3880 */ ( 6712 1984 0 )
+ /* 3881 */ ( 7224 1984 0 )
+ /* 3882 */ ( 7736 1984 0 )
+ /* 3883 */ ( 8248 1984 0 )
+ /* 3884 */ ( 8760 1984 0 )
+ /* 3885 */ ( 9272 1984 0 )
+ /* 3886 */ ( 9784 1984 0 )
+ /* 3887 */ ( 10296 1984 0 )
+ /* 3888 */ ( 10808 1984 0 )
+ /* 3889 */ ( 11320 1984 0 )
+ /* 3890 */ ( 11832 1984 0 )
+ /* 3891 */ ( -20424 2496 0 )
+ /* 3892 */ ( -20936 2496 0 )
+ /* 3893 */ ( -19912 2496 0 )
+ /* 3894 */ ( -19400 2496 0 )
+ /* 3895 */ ( -18888 2496 0 )
+ /* 3896 */ ( -18376 2496 0 )
+ /* 3897 */ ( -17864 2496 0 )
+ /* 3898 */ ( -17352 2496 0 )
+ /* 3899 */ ( -16840 2496 0 )
+ /* 3900 */ ( -16328 2496 0 )
+ /* 3901 */ ( -15816 2496 0 )
+ /* 3902 */ ( -15304 2496 0 )
+ /* 3903 */ ( -14792 2496 0 )
+ /* 3904 */ ( -14280 2496 0 )
+ /* 3905 */ ( -13768 2496 0 )
+ /* 3906 */ ( -13256 2496 0 )
+ /* 3907 */ ( -12744 2496 0 )
+ /* 3908 */ ( -12232 2496 0 )
+ /* 3909 */ ( -11720 2496 0 )
+ /* 3910 */ ( -11208 2496 0 )
+ /* 3911 */ ( -10696 2496 0 )
+ /* 3912 */ ( -10184 2496 0 )
+ /* 3913 */ ( -9672 2496 0 )
+ /* 3914 */ ( -9160 2496 0 )
+ /* 3915 */ ( -8648 2496 0 )
+ /* 3916 */ ( -8136 2496 0 )
+ /* 3917 */ ( -7624 2496 0 )
+ /* 3918 */ ( -7112 2496 0 )
+ /* 3919 */ ( -6600 2496 0 )
+ /* 3920 */ ( -6088 2496 0.165472731 )
+ /* 3921 */ ( -5576 2496 22.6221370697 )
+ /* 3922 */ ( -5064 2496 91.9518814087 )
+ /* 3923 */ ( -4576.1791992188 2471.8205566406 8 )
+ /* 3924 */ ( -4569.6430664062 2496 8 )
+ /* 3925 */ ( 5176 2496 0 )
+ /* 3926 */ ( 4932 2496 0 )
+ /* 3927 */ ( 5688 2496 0 )
+ /* 3928 */ ( 6200 2496 0 )
+ /* 3929 */ ( 6712 2496 0 )
+ /* 3930 */ ( 7224 2496 0 )
+ /* 3931 */ ( 7736 2496 0 )
+ /* 3932 */ ( 8248 2496 0 )
+ /* 3933 */ ( 8760 2496 0 )
+ /* 3934 */ ( 9272 2496 0 )
+ /* 3935 */ ( 9784 2496 0 )
+ /* 3936 */ ( 10296 2496 0 )
+ /* 3937 */ ( 10808 2496 0 )
+ /* 3938 */ ( 11320 2496 0 )
+ /* 3939 */ ( 11832 2496 0 )
+ /* 3940 */ ( -20424 3008 0 )
+ /* 3941 */ ( -20936 3008 0 )
+ /* 3942 */ ( -19912 3008 0 )
+ /* 3943 */ ( -19400 3008 0 )
+ /* 3944 */ ( -18888 3008 0 )
+ /* 3945 */ ( -18376 3008 0 )
+ /* 3946 */ ( -17864 3008 0 )
+ /* 3947 */ ( -17352 3008 0 )
+ /* 3948 */ ( -16840 3008 0 )
+ /* 3949 */ ( -16328 3008 0 )
+ /* 3950 */ ( -15816 3008 0 )
+ /* 3951 */ ( -15304 3008 0 )
+ /* 3952 */ ( -14792 3008 0 )
+ /* 3953 */ ( -14280 3008 0 )
+ /* 3954 */ ( -13768 3008 0 )
+ /* 3955 */ ( -13256 3008 0 )
+ /* 3956 */ ( -12744 3008 0 )
+ /* 3957 */ ( -12232 3008 0 )
+ /* 3958 */ ( -11720 3008 0 )
+ /* 3959 */ ( -11208 3008 0 )
+ /* 3960 */ ( -10696 3008 0 )
+ /* 3961 */ ( -10184 3008 0 )
+ /* 3962 */ ( -9672 3008 0 )
+ /* 3963 */ ( -9160 3008 0 )
+ /* 3964 */ ( -8648 3008 0 )
+ /* 3965 */ ( -8136 3008 0 )
+ /* 3966 */ ( -7624 3008 0 )
+ /* 3967 */ ( -7112 3008 0 )
+ /* 3968 */ ( -6600 3008 0 )
+ /* 3969 */ ( -6088 3008 0 )
+ /* 3970 */ ( -5576 3008 4.1980147362 )
+ /* 3971 */ ( -5064 3008 65.9719314575 )
+ /* 3972 */ ( -4552 2496 5 )
+ /* 3973 */ ( -4552 3008 5.0353164673 )
+ /* 3974 */ ( -4569.4638671875 2990.5358886719 8 )
+ /* 3975 */ ( -4576.9096679688 3008 8 )
+ /* 3976 */ ( 5176 3008 0 )
+ /* 3977 */ ( 4932 3008 0 )
+ /* 3978 */ ( 5688 3008 0 )
+ /* 3979 */ ( 6200 3008 0 )
+ /* 3980 */ ( 6712 3008 0 )
+ /* 3981 */ ( 7224 3008 0 )
+ /* 3982 */ ( 7736 3008 0 )
+ /* 3983 */ ( 8248 3008 0 )
+ /* 3984 */ ( 8760 3008 0 )
+ /* 3985 */ ( 9272 3008 0 )
+ /* 3986 */ ( 9784 3008 0 )
+ /* 3987 */ ( 10296 3008 0 )
+ /* 3988 */ ( 10808 3008 0 )
+ /* 3989 */ ( 11320 3008 0 )
+ /* 3990 */ ( 11832 3008 0 )
+ /* 3991 */ ( -20424 3520 0 )
+ /* 3992 */ ( -20936 3520 0 )
+ /* 3993 */ ( -19912 3520 0 )
+ /* 3994 */ ( -19400 3520 0 )
+ /* 3995 */ ( -18888 3520 0 )
+ /* 3996 */ ( -18376 3520 0 )
+ /* 3997 */ ( -17864 3520 0 )
+ /* 3998 */ ( -17352 3520 0 )
+ /* 3999 */ ( -16840 3520 0 )
+ /* 4000 */ ( -16328 3520 0 )
+ /* 4001 */ ( -15816 3520 0 )
+ /* 4002 */ ( -15304 3520 0 )
+ /* 4003 */ ( -14792 3520 0 )
+ /* 4004 */ ( -14280 3520 0 )
+ /* 4005 */ ( -13768 3520 0 )
+ /* 4006 */ ( -13256 3520 0 )
+ /* 4007 */ ( -12744 3520 0 )
+ /* 4008 */ ( -12232 3520 0 )
+ /* 4009 */ ( -11720 3520 0 )
+ /* 4010 */ ( -11208 3520 0 )
+ /* 4011 */ ( -10696 3520 0 )
+ /* 4012 */ ( -10184 3520 0 )
+ /* 4013 */ ( -9672 3520 0 )
+ /* 4014 */ ( -9160 3520 0 )
+ /* 4015 */ ( -8648 3520 0 )
+ /* 4016 */ ( -8136 3520 0 )
+ /* 4017 */ ( -7624 3520 0 )
+ /* 4018 */ ( -7112 3520 0 )
+ /* 4019 */ ( -6600 3520 0 )
+ /* 4020 */ ( -6088 3520 0 )
+ /* 4021 */ ( -5576 3520 2.6456999779 )
+ /* 4022 */ ( -5064 3520 72.9151153564 )
+ /* 4023 */ ( -4552 3520 6.9387888908 )
+ /* 4024 */ ( -4561.2041015625 3510.7958984375 8 )
+ /* 4025 */ ( -4560.2353515625 3520 8 )
+ /* 4026 */ ( 5176 3520 0 )
+ /* 4027 */ ( 4932 3520 0 )
+ /* 4028 */ ( 5688 3520 0 )
+ /* 4029 */ ( 6200 3520 0 )
+ /* 4030 */ ( 6712 3520 0 )
+ /* 4031 */ ( 7224 3520 0 )
+ /* 4032 */ ( 7736 3520 0 )
+ /* 4033 */ ( 8248 3520 0 )
+ /* 4034 */ ( 8760 3520 0 )
+ /* 4035 */ ( 9272 3520 0 )
+ /* 4036 */ ( 9784 3520 0 )
+ /* 4037 */ ( 10296 3520 0 )
+ /* 4038 */ ( 10808 3520 0 )
+ /* 4039 */ ( 11320 3520 0 )
+ /* 4040 */ ( 11832 3520 0 )
+ /* 4041 */ ( -20424 4032 0 )
+ /* 4042 */ ( -20936 4032 0 )
+ /* 4043 */ ( -19912 4032 0 )
+ /* 4044 */ ( -19400 4032 0 )
+ /* 4045 */ ( -18888 4032 0 )
+ /* 4046 */ ( -18376 4032 0 )
+ /* 4047 */ ( -17864 4032 0 )
+ /* 4048 */ ( -17352 4032 0 )
+ /* 4049 */ ( -16840 4032 0 )
+ /* 4050 */ ( -16328 4032 0 )
+ /* 4051 */ ( -15816 4032 0 )
+ /* 4052 */ ( -15304 4032 0 )
+ /* 4053 */ ( -14792 4032 0 )
+ /* 4054 */ ( -14280 4032 0 )
+ /* 4055 */ ( -13768 4032 0 )
+ /* 4056 */ ( -13256 4032 0 )
+ /* 4057 */ ( -12744 4032 0 )
+ /* 4058 */ ( -12232 4032 0 )
+ /* 4059 */ ( -11720 4032 0 )
+ /* 4060 */ ( -11208 4032 0 )
+ /* 4061 */ ( -10696 4032 0 )
+ /* 4062 */ ( -10184 4032 0 )
+ /* 4063 */ ( -9672 4032 0 )
+ /* 4064 */ ( -9160 4032 0 )
+ /* 4065 */ ( -8648 4032 0 )
+ /* 4066 */ ( -8136 4032 0 )
+ /* 4067 */ ( -7624 4032 0 )
+ /* 4068 */ ( -7112 4032 0 )
+ /* 4069 */ ( -6600 4032 0 )
+ /* 4070 */ ( -6088 4032 0 )
+ /* 4071 */ ( -5576 4032 5.3477921486 )
+ /* 4072 */ ( -5064 4032 83.6150512695 )
+ /* 4073 */ ( -4554.7158203125 4029.2841796875 8 )
+ /* 4074 */ ( -4554.3330078125 4032 8 )
+ /* 4075 */ ( 5176 4032 0 )
+ /* 4076 */ ( 4932 4032 0 )
+ /* 4077 */ ( 5688 4032 0 )
+ /* 4078 */ ( 6200 4032 0 )
+ /* 4079 */ ( 6712 4032 0 )
+ /* 4080 */ ( 7224 4032 0 )
+ /* 4081 */ ( 7736 4032 0 )
+ /* 4082 */ ( 8248 4032 0 )
+ /* 4083 */ ( 8760 4032 0 )
+ /* 4084 */ ( 9272 4032 0 )
+ /* 4085 */ ( 9784 4032 0 )
+ /* 4086 */ ( 10296 4032 0 )
+ /* 4087 */ ( 10808 4032 0 )
+ /* 4088 */ ( 11320 4032 0 )
+ /* 4089 */ ( 11832 4032 0 )
+ /* 4090 */ ( -20424 4544 0 )
+ /* 4091 */ ( -20936 4544 0 )
+ /* 4092 */ ( -19912 4544 0 )
+ /* 4093 */ ( -19400 4544 0 )
+ /* 4094 */ ( -18888 4544 0 )
+ /* 4095 */ ( -18376 4544 0 )
+ /* 4096 */ ( -17864 4544 0 )
+ /* 4097 */ ( -17352 4544 0 )
+ /* 4098 */ ( -16840 4544 0 )
+ /* 4099 */ ( -16328 4544 0 )
+ /* 4100 */ ( -15816 4544 0 )
+ /* 4101 */ ( -15304 4544 0 )
+ /* 4102 */ ( -14792 4544 0 )
+ /* 4103 */ ( -14280 4544 0 )
+ /* 4104 */ ( -13768 4544 0 )
+ /* 4105 */ ( -13256 4544 0 )
+ /* 4106 */ ( -12744 4544 0 )
+ /* 4107 */ ( -12232 4544 0 )
+ /* 4108 */ ( -11720 4544 0 )
+ /* 4109 */ ( -11208 4544 0 )
+ /* 4110 */ ( -10696 4544 0 )
+ /* 4111 */ ( -10184 4544 0 )
+ /* 4112 */ ( -9672 4544 0 )
+ /* 4113 */ ( -9160 4544 0 )
+ /* 4114 */ ( -8648 4544 0 )
+ /* 4115 */ ( -8136 4544 0 )
+ /* 4116 */ ( -7624 4544 0 )
+ /* 4117 */ ( -7112 4544 0 )
+ /* 4118 */ ( -6600 4544 0 )
+ /* 4119 */ ( -6088 4544 0 )
+ /* 4120 */ ( -5576 4544 2.1525537968 )
+ /* 4121 */ ( -5064 4544 20.7843894958 )
+ /* 4122 */ ( -4600.4775390625 4495.5224609375 8 )
+ /* 4123 */ ( -4552 4544 0.0918251723 )
+ /* 4124 */ ( 5176 4544 0 )
+ /* 4125 */ ( 4932 4544 0 )
+ /* 4126 */ ( 5688 4544 0 )
+ /* 4127 */ ( 6200 4544 0 )
+ /* 4128 */ ( 6712 4544 0 )
+ /* 4129 */ ( 7224 4544 0 )
+ /* 4130 */ ( 7736 4544 0 )
+ /* 4131 */ ( 8248 4544 0 )
+ /* 4132 */ ( 8760 4544 0 )
+ /* 4133 */ ( 9272 4544 0 )
+ /* 4134 */ ( 9784 4544 0 )
+ /* 4135 */ ( 10296 4544 0 )
+ /* 4136 */ ( 10808 4544 0 )
+ /* 4137 */ ( 11320 4544 0 )
+ /* 4138 */ ( 11832 4544 0 )
+ /* 4139 */ ( -20424 5056 0 )
+ /* 4140 */ ( -20936 5056 0 )
+ /* 4141 */ ( -19912 5056 0 )
+ /* 4142 */ ( -19400 5056 0 )
+ /* 4143 */ ( -18888 5056 0 )
+ /* 4144 */ ( -18376 5056 0 )
+ /* 4145 */ ( -17864 5056 0 )
+ /* 4146 */ ( -17352 5056 0 )
+ /* 4147 */ ( -16840 5056 0 )
+ /* 4148 */ ( -16328 5056 0 )
+ /* 4149 */ ( -15816 5056 0 )
+ /* 4150 */ ( -15304 5056 0 )
+ /* 4151 */ ( -14792 5056 0 )
+ /* 4152 */ ( -14280 5056 0 )
+ /* 4153 */ ( -13768 5056 0 )
+ /* 4154 */ ( -13256 5056 0 )
+ /* 4155 */ ( -12744 5056 0 )
+ /* 4156 */ ( -12232 5056 0 )
+ /* 4157 */ ( -11720 5056 0 )
+ /* 4158 */ ( -11208 5056 0 )
+ /* 4159 */ ( -10696 5056 0 )
+ /* 4160 */ ( -10184 5056 0 )
+ /* 4161 */ ( -9672 5056 0 )
+ /* 4162 */ ( -9160 5056 0 )
+ /* 4163 */ ( -8648 5056 0 )
+ /* 4164 */ ( -8136 5056 0 )
+ /* 4165 */ ( -7624 5056 0 )
+ /* 4166 */ ( -7112 5056 0 )
+ /* 4167 */ ( -6600 5056 0 )
+ /* 4168 */ ( -6088 5056 0 )
+ /* 4169 */ ( -5576 5056 0 )
+ /* 4170 */ ( -5064 5056 0 )
+ /* 4171 */ ( -4552 5056 0 )
+ /* 4172 */ ( -4040 4776 0 )
+ /* 4173 */ ( -4040 5056 0 )
+ /* 4174 */ ( -4552 4776 0.0502168909 )
+ /* 4175 */ ( -3528 4776 0 )
+ /* 4176 */ ( -3528 5056 0 )
+ /* 4177 */ ( -3528 4544 0 )
+ /* 4178 */ ( -3016 4544 0 )
+ /* 4179 */ ( -3016 5056 0 )
+ /* 4180 */ ( -2504 4544 0 )
+ /* 4181 */ ( -2504 5056 0 )
+ /* 4182 */ ( -1992 4544 0 )
+ /* 4183 */ ( -1992 5056 0 )
+ /* 4184 */ ( -1480 4776 0 )
+ /* 4185 */ ( -1480 5056 0 )
+ /* 4186 */ ( -1992 4776 0 )
+ /* 4187 */ ( -1480 4544 0 )
+ /* 4188 */ ( -968 4544 0 )
+ /* 4189 */ ( -968 5056 0 )
+ /* 4190 */ ( -456 4544 0 )
+ /* 4191 */ ( -456 5056 0 )
+ /* 4192 */ ( 56 4776 0 )
+ /* 4193 */ ( 56 5056 0 )
+ /* 4194 */ ( -456 4776 0 )
+ /* 4195 */ ( 568 4776 0 )
+ /* 4196 */ ( 568 5056 0 )
+ /* 4197 */ ( 568 4544 0 )
+ /* 4198 */ ( 1080 4544 0 )
+ /* 4199 */ ( 1080 5056 0 )
+ /* 4200 */ ( 1592 4544 0 )
+ /* 4201 */ ( 1592 5056 0 )
+ /* 4202 */ ( 2104 4776 0 )
+ /* 4203 */ ( 2104 5056 0 )
+ /* 4204 */ ( 1592 4776 0 )
+ /* 4205 */ ( 2616 4776 0 )
+ /* 4206 */ ( 2616 5056 0 )
+ /* 4207 */ ( 2616 4544 0 )
+ /* 4208 */ ( 3128 4544 0 )
+ /* 4209 */ ( 3128 5056 0 )
+ /* 4210 */ ( 3640 4544 0 )
+ /* 4211 */ ( 3640 5056 0 )
+ /* 4212 */ ( 4152 4776 0 )
+ /* 4213 */ ( 4152 5056 0 )
+ /* 4214 */ ( 3640 4776 0 )
+ /* 4215 */ ( 4664 4776 0 )
+ /* 4216 */ ( 4664 5056 0 )
+ /* 4217 */ ( 4664 4544 0 )
+ /* 4218 */ ( 5176 5056 0 )
+ /* 4219 */ ( 5688 5056 0 )
+ /* 4220 */ ( 6200 5056 0 )
+ /* 4221 */ ( 6712 5056 0 )
+ /* 4222 */ ( 7224 5056 0 )
+ /* 4223 */ ( 7736 5056 0 )
+ /* 4224 */ ( 8248 5056 0 )
+ /* 4225 */ ( 8760 5056 0 )
+ /* 4226 */ ( 9272 5056 0 )
+ /* 4227 */ ( 9784 5056 0 )
+ /* 4228 */ ( 10296 5056 0 )
+ /* 4229 */ ( 10808 5056 0 )
+ /* 4230 */ ( 11320 5056 0 )
+ /* 4231 */ ( 11832 5056 0 )
+ /* 4232 */ ( -20424 5568 0 )
+ /* 4233 */ ( -20936 5568 0 )
+ /* 4234 */ ( -19912 5568 0 )
+ /* 4235 */ ( -19400 5568 0 )
+ /* 4236 */ ( -18888 5568 0 )
+ /* 4237 */ ( -18376 5568 0 )
+ /* 4238 */ ( -17864 5568 0 )
+ /* 4239 */ ( -17352 5568 0 )
+ /* 4240 */ ( -16840 5568 0 )
+ /* 4241 */ ( -16328 5568 0 )
+ /* 4242 */ ( -15816 5568 0 )
+ /* 4243 */ ( -15304 5568 0 )
+ /* 4244 */ ( -14792 5568 0 )
+ /* 4245 */ ( -14280 5568 0 )
+ /* 4246 */ ( -13768 5568 0 )
+ /* 4247 */ ( -13256 5568 0 )
+ /* 4248 */ ( -12744 5568 0 )
+ /* 4249 */ ( -12232 5568 0 )
+ /* 4250 */ ( -11720 5568 0 )
+ /* 4251 */ ( -11208 5568 0 )
+ /* 4252 */ ( -10696 5568 0 )
+ /* 4253 */ ( -10184 5568 0 )
+ /* 4254 */ ( -9672 5568 0 )
+ /* 4255 */ ( -9160 5568 0 )
+ /* 4256 */ ( -8648 5568 0 )
+ /* 4257 */ ( -8136 5568 0 )
+ /* 4258 */ ( -7624 5568 0 )
+ /* 4259 */ ( -7112 5568 0 )
+ /* 4260 */ ( -6600 5568 0 )
+ /* 4261 */ ( -6088 5568 0 )
+ /* 4262 */ ( -5576 5568 0 )
+ /* 4263 */ ( -5064 5568 0 )
+ /* 4264 */ ( -4552 5568 0 )
+ /* 4265 */ ( -4040 5568 0 )
+ /* 4266 */ ( -3528 5568 0 )
+ /* 4267 */ ( -3016 5568 0 )
+ /* 4268 */ ( -2504 5568 0 )
+ /* 4269 */ ( -1992 5568 0 )
+ /* 4270 */ ( -1480 5568 0 )
+ /* 4271 */ ( -968 5568 0 )
+ /* 4272 */ ( -456 5568 0 )
+ /* 4273 */ ( 56 5568 0 )
+ /* 4274 */ ( 568 5568 0 )
+ /* 4275 */ ( 1080 5568 0 )
+ /* 4276 */ ( 1592 5568 0 )
+ /* 4277 */ ( 2104 5568 0 )
+ /* 4278 */ ( 2616 5568 0 )
+ /* 4279 */ ( 3128 5568 0 )
+ /* 4280 */ ( 3640 5568 0 )
+ /* 4281 */ ( 4152 5568 0 )
+ /* 4282 */ ( 4664 5568 0 )
+ /* 4283 */ ( 5176 5568 0 )
+ /* 4284 */ ( 5688 5568 0 )
+ /* 4285 */ ( 6200 5568 0 )
+ /* 4286 */ ( 6712 5568 0 )
+ /* 4287 */ ( 7224 5568 0 )
+ /* 4288 */ ( 7736 5568 0 )
+ /* 4289 */ ( 8248 5568 0 )
+ /* 4290 */ ( 8760 5568 0 )
+ /* 4291 */ ( 9272 5568 0 )
+ /* 4292 */ ( 9784 5568 0 )
+ /* 4293 */ ( 10296 5568 0 )
+ /* 4294 */ ( 10808 5568 0 )
+ /* 4295 */ ( 11320 5568 0 )
+ /* 4296 */ ( 11832 5568 0 )
+ /* 4297 */ ( -20424 6080 0 )
+ /* 4298 */ ( -20936 6080 0 )
+ /* 4299 */ ( -19912 6080 0 )
+ /* 4300 */ ( -19400 6080 0 )
+ /* 4301 */ ( -18888 6080 0 )
+ /* 4302 */ ( -18376 6080 0 )
+ /* 4303 */ ( -17864 6080 0 )
+ /* 4304 */ ( -17352 6080 0 )
+ /* 4305 */ ( -16840 6080 0 )
+ /* 4306 */ ( -16328 6080 0 )
+ /* 4307 */ ( -15816 6080 0 )
+ /* 4308 */ ( -15304 6080 0 )
+ /* 4309 */ ( -14792 6080 0 )
+ /* 4310 */ ( -14280 6080 0 )
+ /* 4311 */ ( -13768 6080 0 )
+ /* 4312 */ ( -13256 6080 0 )
+ /* 4313 */ ( -12744 6080 0 )
+ /* 4314 */ ( -12232 6080 0 )
+ /* 4315 */ ( -11720 6080 0 )
+ /* 4316 */ ( -11208 6080 0 )
+ /* 4317 */ ( -10696 6080 0 )
+ /* 4318 */ ( -10184 6080 0 )
+ /* 4319 */ ( -9672 6080 0 )
+ /* 4320 */ ( -9160 6080 0 )
+ /* 4321 */ ( -8648 6080 0 )
+ /* 4322 */ ( -8136 6080 0 )
+ /* 4323 */ ( -7624 6080 0 )
+ /* 4324 */ ( -7112 6080 0 )
+ /* 4325 */ ( -6600 6080 0 )
+ /* 4326 */ ( -6088 6080 0 )
+ /* 4327 */ ( -5576 6080 0 )
+ /* 4328 */ ( -5064 6080 0 )
+ /* 4329 */ ( -4552 6080 0 )
+ /* 4330 */ ( -4040 6080 0 )
+ /* 4331 */ ( -3528 6080 0 )
+ /* 4332 */ ( -3016 6080 0 )
+ /* 4333 */ ( -2504 6080 0 )
+ /* 4334 */ ( -1992 6080 0 )
+ /* 4335 */ ( -1480 6080 0 )
+ /* 4336 */ ( -968 6080 0 )
+ /* 4337 */ ( -456 6080 0 )
+ /* 4338 */ ( 56 6080 0 )
+ /* 4339 */ ( 568 6080 0 )
+ /* 4340 */ ( 1080 6080 0 )
+ /* 4341 */ ( 1592 6080 0 )
+ /* 4342 */ ( 2104 6080 0 )
+ /* 4343 */ ( 2616 6080 0 )
+ /* 4344 */ ( 3128 6080 0 )
+ /* 4345 */ ( 3640 6080 0 )
+ /* 4346 */ ( 4152 6080 0 )
+ /* 4347 */ ( 4664 6080 0 )
+ /* 4348 */ ( 5176 6080 0 )
+ /* 4349 */ ( 5688 6080 0 )
+ /* 4350 */ ( 6200 6080 0 )
+ /* 4351 */ ( 6712 6080 0 )
+ /* 4352 */ ( 7224 6080 0 )
+ /* 4353 */ ( 7736 6080 0 )
+ /* 4354 */ ( 8248 6080 0 )
+ /* 4355 */ ( 8760 6080 0 )
+ /* 4356 */ ( 9272 6080 0 )
+ /* 4357 */ ( 9784 6080 0 )
+ /* 4358 */ ( 10296 6080 0 )
+ /* 4359 */ ( 10808 6080 0 )
+ /* 4360 */ ( 11320 6080 0 )
+ /* 4361 */ ( 11832 6080 0 )
+ /* 4362 */ ( -20424 6592 0 )
+ /* 4363 */ ( -20936 6592 0 )
+ /* 4364 */ ( -19912 6592 0 )
+ /* 4365 */ ( -19400 6592 0 )
+ /* 4366 */ ( -18888 6592 0 )
+ /* 4367 */ ( -18376 6592 0 )
+ /* 4368 */ ( -17864 6592 0 )
+ /* 4369 */ ( -17352 6592 0 )
+ /* 4370 */ ( -16840 6592 0 )
+ /* 4371 */ ( -16328 6592 0 )
+ /* 4372 */ ( -15816 6592 0 )
+ /* 4373 */ ( -15304 6592 0 )
+ /* 4374 */ ( -14792 6592 0 )
+ /* 4375 */ ( -14280 6592 0 )
+ /* 4376 */ ( -13768 6592 0 )
+ /* 4377 */ ( -13256 6592 0 )
+ /* 4378 */ ( -12744 6592 0 )
+ /* 4379 */ ( -12232 6592 0 )
+ /* 4380 */ ( -11720 6592 0 )
+ /* 4381 */ ( -11208 6592 0 )
+ /* 4382 */ ( -10696 6592 0 )
+ /* 4383 */ ( -10184 6592 0 )
+ /* 4384 */ ( -9672 6592 0 )
+ /* 4385 */ ( -9160 6592 0 )
+ /* 4386 */ ( -8648 6592 0 )
+ /* 4387 */ ( -8136 6592 0 )
+ /* 4388 */ ( -7624 6592 0 )
+ /* 4389 */ ( -7112 6592 0 )
+ /* 4390 */ ( -6600 6592 0 )
+ /* 4391 */ ( -6088 6592 0 )
+ /* 4392 */ ( -5576 6592 0 )
+ /* 4393 */ ( -5064 6592 0 )
+ /* 4394 */ ( -4552 6592 0 )
+ /* 4395 */ ( -4040 6592 0 )
+ /* 4396 */ ( -3528 6592 0 )
+ /* 4397 */ ( -3016 6592 0 )
+ /* 4398 */ ( -2504 6592 0 )
+ /* 4399 */ ( -1992 6592 0 )
+ /* 4400 */ ( -1480 6592 0 )
+ /* 4401 */ ( -968 6592 0 )
+ /* 4402 */ ( -456 6592 0 )
+ /* 4403 */ ( 56 6592 0 )
+ /* 4404 */ ( 568 6592 0 )
+ /* 4405 */ ( 1080 6592 0 )
+ /* 4406 */ ( 1592 6592 0 )
+ /* 4407 */ ( 2104 6592 0 )
+ /* 4408 */ ( 2616 6592 0 )
+ /* 4409 */ ( 3128 6592 0 )
+ /* 4410 */ ( 3640 6592 0 )
+ /* 4411 */ ( 4152 6592 0 )
+ /* 4412 */ ( 4664 6592 0 )
+ /* 4413 */ ( 5176 6592 0 )
+ /* 4414 */ ( 5688 6592 0 )
+ /* 4415 */ ( 6200 6592 0 )
+ /* 4416 */ ( 6712 6592 0 )
+ /* 4417 */ ( 7224 6592 0 )
+ /* 4418 */ ( 7736 6592 0 )
+ /* 4419 */ ( 8248 6592 0 )
+ /* 4420 */ ( 8760 6592 0 )
+ /* 4421 */ ( 9272 6592 0 )
+ /* 4422 */ ( 9784 6592 0 )
+ /* 4423 */ ( 10296 6592 0 )
+ /* 4424 */ ( 10808 6592 0 )
+ /* 4425 */ ( 11320 6592 0 )
+ /* 4426 */ ( 11832 6592 0 )
+ /* 4427 */ ( -20424 7104 0 )
+ /* 4428 */ ( -20936 7104 0 )
+ /* 4429 */ ( -19912 7104 0 )
+ /* 4430 */ ( -19400 7104 0 )
+ /* 4431 */ ( -18888 7104 0 )
+ /* 4432 */ ( -18376 7104 0 )
+ /* 4433 */ ( -17864 7104 0 )
+ /* 4434 */ ( -17352 7104 0 )
+ /* 4435 */ ( -16840 7104 0 )
+ /* 4436 */ ( -16328 7104 0 )
+ /* 4437 */ ( -15816 7104 0 )
+ /* 4438 */ ( -15304 7104 0 )
+ /* 4439 */ ( -14792 7104 0 )
+ /* 4440 */ ( -14280 7104 0 )
+ /* 4441 */ ( -13768 7104 0 )
+ /* 4442 */ ( -13256 7104 0 )
+ /* 4443 */ ( -12744 7104 0 )
+ /* 4444 */ ( -12232 7104 0 )
+ /* 4445 */ ( -11720 7104 0 )
+ /* 4446 */ ( -11208 7104 0 )
+ /* 4447 */ ( -10696 7104 0 )
+ /* 4448 */ ( -10184 7104 0 )
+ /* 4449 */ ( -9672 7104 0 )
+ /* 4450 */ ( -9160 7104 0 )
+ /* 4451 */ ( -8648 7104 0 )
+ /* 4452 */ ( -8136 7104 0 )
+ /* 4453 */ ( -7624 7104 0 )
+ /* 4454 */ ( -7112 7104 0 )
+ /* 4455 */ ( -6600 7104 0 )
+ /* 4456 */ ( -6088 7104 0 )
+ /* 4457 */ ( -5576 7104 0 )
+ /* 4458 */ ( -5064 7104 0 )
+ /* 4459 */ ( -4552 7104 0 )
+ /* 4460 */ ( -4040 7104 0 )
+ /* 4461 */ ( -3528 7104 0 )
+ /* 4462 */ ( -3016 7104 0 )
+ /* 4463 */ ( -2504 7104 0 )
+ /* 4464 */ ( -1992 7104 0 )
+ /* 4465 */ ( -1480 7104 0 )
+ /* 4466 */ ( -968 7104 0 )
+ /* 4467 */ ( -456 7104 0 )
+ /* 4468 */ ( 56 7104 0 )
+ /* 4469 */ ( 568 7104 0 )
+ /* 4470 */ ( 1080 7104 0 )
+ /* 4471 */ ( 1592 7104 0 )
+ /* 4472 */ ( 2104 7104 0 )
+ /* 4473 */ ( 2616 7104 0 )
+ /* 4474 */ ( 3128 7104 0 )
+ /* 4475 */ ( 3640 7104 0 )
+ /* 4476 */ ( 4152 7104 0 )
+ /* 4477 */ ( 4664 7104 0 )
+ /* 4478 */ ( 5176 7104 0 )
+ /* 4479 */ ( 5688 7104 0 )
+ /* 4480 */ ( 6200 7104 0 )
+ /* 4481 */ ( 6712 7104 0 )
+ /* 4482 */ ( 7224 7104 0 )
+ /* 4483 */ ( 7736 7104 0 )
+ /* 4484 */ ( 8248 7104 0 )
+ /* 4485 */ ( 8760 7104 0 )
+ /* 4486 */ ( 9272 7104 0 )
+ /* 4487 */ ( 9784 7104 0 )
+ /* 4488 */ ( 10296 7104 0 )
+ /* 4489 */ ( 10808 7104 0 )
+ /* 4490 */ ( 11320 7104 0 )
+ /* 4491 */ ( 11832 7104 0 )
+ /* 4492 */ ( -20424 7616 0 )
+ /* 4493 */ ( -20936 7616 0 )
+ /* 4494 */ ( -19912 7616 0 )
+ /* 4495 */ ( -19400 7616 0 )
+ /* 4496 */ ( -18888 7616 0 )
+ /* 4497 */ ( -18376 7616 0 )
+ /* 4498 */ ( -17864 7616 0 )
+ /* 4499 */ ( -17352 7616 0 )
+ /* 4500 */ ( -16840 7616 0 )
+ /* 4501 */ ( -16328 7616 0 )
+ /* 4502 */ ( -15816 7616 0 )
+ /* 4503 */ ( -15304 7616 0 )
+ /* 4504 */ ( -14792 7616 0 )
+ /* 4505 */ ( -14280 7616 0 )
+ /* 4506 */ ( -13768 7616 0 )
+ /* 4507 */ ( -13256 7616 0 )
+ /* 4508 */ ( -12744 7616 0 )
+ /* 4509 */ ( -12232 7616 0 )
+ /* 4510 */ ( -11720 7616 0 )
+ /* 4511 */ ( -11208 7616 0 )
+ /* 4512 */ ( -10696 7616 0 )
+ /* 4513 */ ( -10184 7616 0 )
+ /* 4514 */ ( -9672 7616 0 )
+ /* 4515 */ ( -9160 7616 0 )
+ /* 4516 */ ( -8648 7616 0 )
+ /* 4517 */ ( -8136 7616 0 )
+ /* 4518 */ ( -7624 7616 0 )
+ /* 4519 */ ( -7112 7616 0 )
+ /* 4520 */ ( -6600 7616 0 )
+ /* 4521 */ ( -6088 7616 0 )
+ /* 4522 */ ( -5576 7616 0 )
+ /* 4523 */ ( -5064 7616 0 )
+ /* 4524 */ ( -4552 7616 0 )
+ /* 4525 */ ( -4040 7616 0 )
+ /* 4526 */ ( -3528 7616 0 )
+ /* 4527 */ ( -3016 7616 0 )
+ /* 4528 */ ( -2504 7616 0 )
+ /* 4529 */ ( -1992 7616 0 )
+ /* 4530 */ ( -1480 7616 0 )
+ /* 4531 */ ( -968 7616 0 )
+ /* 4532 */ ( -456 7616 0 )
+ /* 4533 */ ( 56 7616 0 )
+ /* 4534 */ ( 568 7616 0 )
+ /* 4535 */ ( 1080 7616 0 )
+ /* 4536 */ ( 1592 7616 0 )
+ /* 4537 */ ( 2104 7616 0 )
+ /* 4538 */ ( 2616 7616 0 )
+ /* 4539 */ ( 3128 7616 0 )
+ /* 4540 */ ( 3640 7616 0 )
+ /* 4541 */ ( 4152 7616 0 )
+ /* 4542 */ ( 4664 7616 0 )
+ /* 4543 */ ( 5176 7616 0 )
+ /* 4544 */ ( 5688 7616 0 )
+ /* 4545 */ ( 6200 7616 0 )
+ /* 4546 */ ( 6712 7616 0 )
+ /* 4547 */ ( 7224 7616 0 )
+ /* 4548 */ ( 7736 7616 0 )
+ /* 4549 */ ( 8248 7616 0 )
+ /* 4550 */ ( 8760 7616 0 )
+ /* 4551 */ ( 9272 7616 0 )
+ /* 4552 */ ( 9784 7616 0 )
+ /* 4553 */ ( 10296 7616 0 )
+ /* 4554 */ ( 10808 7616 0 )
+ /* 4555 */ ( 11320 7616 0 )
+ /* 4556 */ ( 11832 7616 0 )
+ /* 4557 */ ( -20424 8128 0 )
+ /* 4558 */ ( -20936 8128 0 )
+ /* 4559 */ ( -19912 8128 0 )
+ /* 4560 */ ( -19400 8128 0 )
+ /* 4561 */ ( -18888 8128 0 )
+ /* 4562 */ ( -18376 8128 0 )
+ /* 4563 */ ( -17864 8128 0 )
+ /* 4564 */ ( -17352 8128 0 )
+ /* 4565 */ ( -16840 8128 0 )
+ /* 4566 */ ( -16328 8128 0 )
+ /* 4567 */ ( -15816 8128 0 )
+ /* 4568 */ ( -15304 8128 0 )
+ /* 4569 */ ( -14792 8128 0 )
+ /* 4570 */ ( -14280 8128 0 )
+ /* 4571 */ ( -13768 8128 0 )
+ /* 4572 */ ( -13256 8128 0 )
+ /* 4573 */ ( -12744 8128 0 )
+ /* 4574 */ ( -12232 8128 0 )
+ /* 4575 */ ( -11720 8128 0 )
+ /* 4576 */ ( -11208 8128 0 )
+ /* 4577 */ ( -10696 8128 0 )
+ /* 4578 */ ( -10184 8128 0 )
+ /* 4579 */ ( -9672 8128 0 )
+ /* 4580 */ ( -9160 8128 0 )
+ /* 4581 */ ( -8648 8128 0 )
+ /* 4582 */ ( -8136 8128 0 )
+ /* 4583 */ ( -7624 8128 0 )
+ /* 4584 */ ( -7112 8128 0 )
+ /* 4585 */ ( -6600 8128 0 )
+ /* 4586 */ ( -6088 8128 0 )
+ /* 4587 */ ( -5576 8128 0 )
+ /* 4588 */ ( -5064 8128 0 )
+ /* 4589 */ ( -4552 8128 0 )
+ /* 4590 */ ( -4040 8128 0 )
+ /* 4591 */ ( -3528 8128 0 )
+ /* 4592 */ ( -3016 8128 0 )
+ /* 4593 */ ( -2504 8128 0 )
+ /* 4594 */ ( -1992 8128 0 )
+ /* 4595 */ ( -1480 8128 0 )
+ /* 4596 */ ( -968 8128 0 )
+ /* 4597 */ ( -456 8128 0 )
+ /* 4598 */ ( 56 8128 0 )
+ /* 4599 */ ( 568 8128 0 )
+ /* 4600 */ ( 1080 8128 0 )
+ /* 4601 */ ( 1592 8128 0 )
+ /* 4602 */ ( 2104 8128 0 )
+ /* 4603 */ ( 2616 8128 0 )
+ /* 4604 */ ( 3128 8128 0 )
+ /* 4605 */ ( 3640 8128 0 )
+ /* 4606 */ ( 4152 8128 0 )
+ /* 4607 */ ( 4664 8128 0 )
+ /* 4608 */ ( 5176 8128 0 )
+ /* 4609 */ ( 5688 8128 0 )
+ /* 4610 */ ( 6200 8128 0 )
+ /* 4611 */ ( 6712 8128 0 )
+ /* 4612 */ ( 7224 8128 0 )
+ /* 4613 */ ( 7736 8128 0 )
+ /* 4614 */ ( 8248 8128 0 )
+ /* 4615 */ ( 8760 8128 0 )
+ /* 4616 */ ( 9272 8128 0 )
+ /* 4617 */ ( 9784 8128 0 )
+ /* 4618 */ ( 10296 8128 0 )
+ /* 4619 */ ( 10808 8128 0 )
+ /* 4620 */ ( 11320 8128 0 )
+ /* 4621 */ ( 11832 8128 0 )
+ /* 4622 */ ( -20424 8640 0 )
+ /* 4623 */ ( -20936 8640 0 )
+ /* 4624 */ ( -19912 8640 0 )
+ /* 4625 */ ( -19400 8640 0 )
+ /* 4626 */ ( -18888 8640 0 )
+ /* 4627 */ ( -18376 8640 0 )
+ /* 4628 */ ( -17864 8640 0 )
+ /* 4629 */ ( -17352 8640 0 )
+ /* 4630 */ ( -16840 8640 0 )
+ /* 4631 */ ( -16328 8640 0 )
+ /* 4632 */ ( -15816 8640 0 )
+ /* 4633 */ ( -15304 8640 0 )
+ /* 4634 */ ( -14792 8640 0 )
+ /* 4635 */ ( -14280 8640 0 )
+ /* 4636 */ ( -13768 8640 0 )
+ /* 4637 */ ( -13256 8640 0 )
+ /* 4638 */ ( -12744 8640 0 )
+ /* 4639 */ ( -12232 8640 0 )
+ /* 4640 */ ( -11720 8640 0 )
+ /* 4641 */ ( -11208 8640 0 )
+ /* 4642 */ ( -10696 8640 0 )
+ /* 4643 */ ( -10184 8640 0 )
+ /* 4644 */ ( -9672 8640 0 )
+ /* 4645 */ ( -9160 8640 0 )
+ /* 4646 */ ( -8648 8640 0 )
+ /* 4647 */ ( -8136 8640 0 )
+ /* 4648 */ ( -7624 8640 0 )
+ /* 4649 */ ( -7112 8640 0 )
+ /* 4650 */ ( -6600 8640 0 )
+ /* 4651 */ ( -6088 8640 0 )
+ /* 4652 */ ( -5576 8640 0 )
+ /* 4653 */ ( -5064 8640 0 )
+ /* 4654 */ ( -4552 8640 0 )
+ /* 4655 */ ( -4040 8640 0 )
+ /* 4656 */ ( -3528 8640 0 )
+ /* 4657 */ ( -3016 8640 0 )
+ /* 4658 */ ( -2504 8640 0 )
+ /* 4659 */ ( -1992 8640 0 )
+ /* 4660 */ ( -1480 8640 0 )
+ /* 4661 */ ( -968 8640 0 )
+ /* 4662 */ ( -456 8640 0 )
+ /* 4663 */ ( 56 8640 0 )
+ /* 4664 */ ( 568 8640 0 )
+ /* 4665 */ ( 1080 8640 0 )
+ /* 4666 */ ( 1592 8640 0 )
+ /* 4667 */ ( 2104 8640 0 )
+ /* 4668 */ ( 2616 8640 0 )
+ /* 4669 */ ( 3128 8640 0 )
+ /* 4670 */ ( 3640 8640 0 )
+ /* 4671 */ ( 4152 8640 0 )
+ /* 4672 */ ( 4664 8640 0 )
+ /* 4673 */ ( 5176 8640 0 )
+ /* 4674 */ ( 5688 8640 0 )
+ /* 4675 */ ( 6200 8640 0 )
+ /* 4676 */ ( 6712 8640 0 )
+ /* 4677 */ ( 7224 8640 0 )
+ /* 4678 */ ( 7736 8640 0 )
+ /* 4679 */ ( 8248 8640 0 )
+ /* 4680 */ ( 8760 8640 0 )
+ /* 4681 */ ( 9272 8640 0 )
+ /* 4682 */ ( 9784 8640 0 )
+ /* 4683 */ ( 10296 8640 0 )
+ /* 4684 */ ( 10808 8640 0 )
+ /* 4685 */ ( 11320 8640 0 )
+ /* 4686 */ ( 11832 8640 0 )
+ /* 4687 */ ( -20424 9152 0 )
+ /* 4688 */ ( -20936 9152 0 )
+ /* 4689 */ ( -19912 9152 0 )
+ /* 4690 */ ( -19400 9152 0 )
+ /* 4691 */ ( -18888 9152 0 )
+ /* 4692 */ ( -18376 9152 0 )
+ /* 4693 */ ( -17864 9152 0 )
+ /* 4694 */ ( -17352 9152 0 )
+ /* 4695 */ ( -16840 9152 0 )
+ /* 4696 */ ( -16328 9152 0 )
+ /* 4697 */ ( -15816 9152 0 )
+ /* 4698 */ ( -15304 9152 0 )
+ /* 4699 */ ( -14792 9152 0 )
+ /* 4700 */ ( -14280 9152 0 )
+ /* 4701 */ ( -13768 9152 0 )
+ /* 4702 */ ( -13256 9152 0 )
+ /* 4703 */ ( -12744 9152 0 )
+ /* 4704 */ ( -12232 9152 0 )
+ /* 4705 */ ( -11720 9152 0 )
+ /* 4706 */ ( -11208 9152 0 )
+ /* 4707 */ ( -10696 9152 0 )
+ /* 4708 */ ( -10184 9152 0 )
+ /* 4709 */ ( -9672 9152 0 )
+ /* 4710 */ ( -9160 9152 0 )
+ /* 4711 */ ( -8648 9152 0 )
+ /* 4712 */ ( -8136 9152 0 )
+ /* 4713 */ ( -7624 9152 0 )
+ /* 4714 */ ( -7112 9152 0 )
+ /* 4715 */ ( -6600 9152 0 )
+ /* 4716 */ ( -6088 9152 0 )
+ /* 4717 */ ( -5576 9152 0 )
+ /* 4718 */ ( -5064 9152 0 )
+ /* 4719 */ ( -4552 9152 0 )
+ /* 4720 */ ( -4040 9152 0 )
+ /* 4721 */ ( -3528 9152 0 )
+ /* 4722 */ ( -3016 9152 0 )
+ /* 4723 */ ( -2504 9152 0 )
+ /* 4724 */ ( -1992 9152 0 )
+ /* 4725 */ ( -1480 9152 0 )
+ /* 4726 */ ( -968 9152 0 )
+ /* 4727 */ ( -456 9152 0 )
+ /* 4728 */ ( 56 9152 0 )
+ /* 4729 */ ( 568 9152 0 )
+ /* 4730 */ ( 1080 9152 0 )
+ /* 4731 */ ( 1592 9152 0 )
+ /* 4732 */ ( 2104 9152 0 )
+ /* 4733 */ ( 2616 9152 0 )
+ /* 4734 */ ( 3128 9152 0 )
+ /* 4735 */ ( 3640 9152 0 )
+ /* 4736 */ ( 4152 9152 0 )
+ /* 4737 */ ( 4664 9152 0 )
+ /* 4738 */ ( 5176 9152 0 )
+ /* 4739 */ ( 5688 9152 0 )
+ /* 4740 */ ( 6200 9152 0 )
+ /* 4741 */ ( 6712 9152 0 )
+ /* 4742 */ ( 7224 9152 0 )
+ /* 4743 */ ( 7736 9152 0 )
+ /* 4744 */ ( 8248 9152 0 )
+ /* 4745 */ ( 8760 9152 0 )
+ /* 4746 */ ( 9272 9152 0 )
+ /* 4747 */ ( 9784 9152 0 )
+ /* 4748 */ ( 10296 9152 0 )
+ /* 4749 */ ( 10808 9152 0 )
+ /* 4750 */ ( 11320 9152 0 )
+ /* 4751 */ ( 11832 9152 0 )
+ /* 4752 */ ( -20424 9664 0 )
+ /* 4753 */ ( -20936 9664 0 )
+ /* 4754 */ ( -19912 9664 0 )
+ /* 4755 */ ( -19400 9664 0 )
+ /* 4756 */ ( -18888 9664 0 )
+ /* 4757 */ ( -18376 9664 0 )
+ /* 4758 */ ( -17864 9664 0 )
+ /* 4759 */ ( -17352 9664 0 )
+ /* 4760 */ ( -16840 9664 0 )
+ /* 4761 */ ( -16328 9664 0 )
+ /* 4762 */ ( -15816 9664 0 )
+ /* 4763 */ ( -15304 9664 0 )
+ /* 4764 */ ( -14792 9664 0 )
+ /* 4765 */ ( -14280 9664 0 )
+ /* 4766 */ ( -13768 9664 0 )
+ /* 4767 */ ( -13256 9664 0 )
+ /* 4768 */ ( -12744 9664 0 )
+ /* 4769 */ ( -12232 9664 0 )
+ /* 4770 */ ( -11720 9664 0 )
+ /* 4771 */ ( -11208 9664 0 )
+ /* 4772 */ ( -10696 9664 0 )
+ /* 4773 */ ( -10184 9664 0 )
+ /* 4774 */ ( -9672 9664 0 )
+ /* 4775 */ ( -9160 9664 0 )
+ /* 4776 */ ( -8648 9664 0 )
+ /* 4777 */ ( -8136 9664 0 )
+ /* 4778 */ ( -7624 9664 0 )
+ /* 4779 */ ( -7112 9664 0 )
+ /* 4780 */ ( -6600 9664 0 )
+ /* 4781 */ ( -6088 9664 0 )
+ /* 4782 */ ( -5576 9664 0 )
+ /* 4783 */ ( -5064 9664 0 )
+ /* 4784 */ ( -4552 9664 0 )
+ /* 4785 */ ( -4040 9664 0 )
+ /* 4786 */ ( -3528 9664 0 )
+ /* 4787 */ ( -3016 9664 0 )
+ /* 4788 */ ( -2504 9664 0 )
+ /* 4789 */ ( -1992 9664 0 )
+ /* 4790 */ ( -1480 9664 0 )
+ /* 4791 */ ( -968 9664 0 )
+ /* 4792 */ ( -456 9664 0 )
+ /* 4793 */ ( 56 9664 0 )
+ /* 4794 */ ( 568 9664 0 )
+ /* 4795 */ ( 1080 9664 0 )
+ /* 4796 */ ( 1592 9664 0 )
+ /* 4797 */ ( 2104 9664 0 )
+ /* 4798 */ ( 2616 9664 0 )
+ /* 4799 */ ( 3128 9664 0 )
+ /* 4800 */ ( 3640 9664 0 )
+ /* 4801 */ ( 4152 9664 0 )
+ /* 4802 */ ( 4664 9664 0 )
+ /* 4803 */ ( 5176 9664 0 )
+ /* 4804 */ ( 5688 9664 0 )
+ /* 4805 */ ( 6200 9664 0 )
+ /* 4806 */ ( 6712 9664 0 )
+ /* 4807 */ ( 7224 9664 0 )
+ /* 4808 */ ( 7736 9664 0 )
+ /* 4809 */ ( 8248 9664 0 )
+ /* 4810 */ ( 8760 9664 0 )
+ /* 4811 */ ( 9272 9664 0 )
+ /* 4812 */ ( 9784 9664 0 )
+ /* 4813 */ ( 10296 9664 0 )
+ /* 4814 */ ( 10808 9664 0 )
+ /* 4815 */ ( 11320 9664 0 )
+ /* 4816 */ ( 11832 9664 0 )
+ /* 4817 */ ( -20424 10176 0 )
+ /* 4818 */ ( -20936 10176 0 )
+ /* 4819 */ ( -19912 10176 0 )
+ /* 4820 */ ( -19400 10176 0 )
+ /* 4821 */ ( -18888 10176 0 )
+ /* 4822 */ ( -18376 10176 0 )
+ /* 4823 */ ( -17864 10176 0 )
+ /* 4824 */ ( -17352 10176 0 )
+ /* 4825 */ ( -16840 10176 0 )
+ /* 4826 */ ( -16328 10176 0 )
+ /* 4827 */ ( -15816 10176 0 )
+ /* 4828 */ ( -15304 10176 0 )
+ /* 4829 */ ( -14792 10176 0 )
+ /* 4830 */ ( -14280 10176 0 )
+ /* 4831 */ ( -13768 10176 0 )
+ /* 4832 */ ( -13256 10176 0 )
+ /* 4833 */ ( -12744 10176 0 )
+ /* 4834 */ ( -12232 10176 0 )
+ /* 4835 */ ( -11720 10176 0 )
+ /* 4836 */ ( -11208 10176 0 )
+ /* 4837 */ ( -10696 10176 0 )
+ /* 4838 */ ( -10184 10176 0 )
+ /* 4839 */ ( -9672 10176 0 )
+ /* 4840 */ ( -9160 10176 0 )
+ /* 4841 */ ( -8648 10176 0 )
+ /* 4842 */ ( -8136 10176 0 )
+ /* 4843 */ ( -7624 10176 0 )
+ /* 4844 */ ( -7112 10176 0 )
+ /* 4845 */ ( -6600 10176 0 )
+ /* 4846 */ ( -6088 10176 0 )
+ /* 4847 */ ( -5576 10176 0 )
+ /* 4848 */ ( -5064 10176 0 )
+ /* 4849 */ ( -4552 10176 0 )
+ /* 4850 */ ( -4040 10176 0 )
+ /* 4851 */ ( -3528 10176 0 )
+ /* 4852 */ ( -3016 10176 0 )
+ /* 4853 */ ( -2504 10176 0 )
+ /* 4854 */ ( -1992 10176 0 )
+ /* 4855 */ ( -1480 10176 0 )
+ /* 4856 */ ( -968 10176 0 )
+ /* 4857 */ ( -456 10176 0 )
+ /* 4858 */ ( 56 10176 0 )
+ /* 4859 */ ( 568 10176 0 )
+ /* 4860 */ ( 1080 10176 0 )
+ /* 4861 */ ( 1592 10176 0 )
+ /* 4862 */ ( 2104 10176 0 )
+ /* 4863 */ ( 2616 10176 0 )
+ /* 4864 */ ( 3128 10176 0 )
+ /* 4865 */ ( 3640 10176 0 )
+ /* 4866 */ ( 4152 10176 0 )
+ /* 4867 */ ( 4664 10176 0 )
+ /* 4868 */ ( 5176 10176 0 )
+ /* 4869 */ ( 5688 10176 0 )
+ /* 4870 */ ( 6200 10176 0 )
+ /* 4871 */ ( 6712 10176 0 )
+ /* 4872 */ ( 7224 10176 0 )
+ /* 4873 */ ( 7736 10176 0 )
+ /* 4874 */ ( 8248 10176 0 )
+ /* 4875 */ ( 8760 10176 0 )
+ /* 4876 */ ( 9272 10176 0 )
+ /* 4877 */ ( 9784 10176 0 )
+ /* 4878 */ ( 10296 10176 0 )
+ /* 4879 */ ( 10808 10176 0 )
+ /* 4880 */ ( 11320 10176 0 )
+ /* 4881 */ ( 11832 10176 0 )
+ /* 4882 */ ( -20424 10688 0 )
+ /* 4883 */ ( -20936 10688 0 )
+ /* 4884 */ ( -19912 10688 0 )
+ /* 4885 */ ( -19400 10688 0 )
+ /* 4886 */ ( -18888 10688 0 )
+ /* 4887 */ ( -18376 10688 0 )
+ /* 4888 */ ( -17864 10688 0 )
+ /* 4889 */ ( -17352 10688 0 )
+ /* 4890 */ ( -16840 10688 0 )
+ /* 4891 */ ( -16328 10688 0 )
+ /* 4892 */ ( -15816 10688 0 )
+ /* 4893 */ ( -15304 10688 0 )
+ /* 4894 */ ( -14792 10688 0 )
+ /* 4895 */ ( -14280 10688 0 )
+ /* 4896 */ ( -13768 10688 0 )
+ /* 4897 */ ( -13256 10688 0 )
+ /* 4898 */ ( -12744 10688 0 )
+ /* 4899 */ ( -12232 10688 0 )
+ /* 4900 */ ( -11720 10688 0 )
+ /* 4901 */ ( -11208 10688 0 )
+ /* 4902 */ ( -10696 10688 0 )
+ /* 4903 */ ( -10184 10688 0 )
+ /* 4904 */ ( -9672 10688 0 )
+ /* 4905 */ ( -9160 10688 0 )
+ /* 4906 */ ( -8648 10688 0 )
+ /* 4907 */ ( -8136 10688 0 )
+ /* 4908 */ ( -7624 10688 0 )
+ /* 4909 */ ( -7112 10688 0 )
+ /* 4910 */ ( -6600 10688 0 )
+ /* 4911 */ ( -6088 10688 0 )
+ /* 4912 */ ( -5576 10688 0 )
+ /* 4913 */ ( -5064 10688 0 )
+ /* 4914 */ ( -4552 10688 0 )
+ /* 4915 */ ( -4040 10688 0 )
+ /* 4916 */ ( -3528 10688 0 )
+ /* 4917 */ ( -3016 10688 0 )
+ /* 4918 */ ( -2504 10688 0 )
+ /* 4919 */ ( -1992 10688 0 )
+ /* 4920 */ ( -1480 10688 0 )
+ /* 4921 */ ( -968 10688 0 )
+ /* 4922 */ ( -456 10688 0 )
+ /* 4923 */ ( 56 10688 0 )
+ /* 4924 */ ( 568 10688 0 )
+ /* 4925 */ ( 1080 10688 0 )
+ /* 4926 */ ( 1592 10688 0 )
+ /* 4927 */ ( 2104 10688 0 )
+ /* 4928 */ ( 2616 10688 0 )
+ /* 4929 */ ( 3128 10688 0 )
+ /* 4930 */ ( 3640 10688 0 )
+ /* 4931 */ ( 4152 10688 0 )
+ /* 4932 */ ( 4664 10688 0 )
+ /* 4933 */ ( 5176 10688 0 )
+ /* 4934 */ ( 5688 10688 0 )
+ /* 4935 */ ( 6200 10688 0 )
+ /* 4936 */ ( 6712 10688 0 )
+ /* 4937 */ ( 7224 10688 0 )
+ /* 4938 */ ( 7736 10688 0 )
+ /* 4939 */ ( 8248 10688 0 )
+ /* 4940 */ ( 8760 10688 0 )
+ /* 4941 */ ( 9272 10688 0 )
+ /* 4942 */ ( 9784 10688 0 )
+ /* 4943 */ ( 10296 10688 0 )
+ /* 4944 */ ( 10808 10688 0 )
+ /* 4945 */ ( 11320 10688 0 )
+ /* 4946 */ ( 11832 10688 0 )
+ /* 4947 */ ( -20424 11200 0 )
+ /* 4948 */ ( -20936 11200 0 )
+ /* 4949 */ ( -19912 11200 0 )
+ /* 4950 */ ( -19400 11200 0 )
+ /* 4951 */ ( -18888 11200 0 )
+ /* 4952 */ ( -18376 11200 0 )
+ /* 4953 */ ( -17864 11200 0 )
+ /* 4954 */ ( -17352 11200 0 )
+ /* 4955 */ ( -16840 11200 0 )
+ /* 4956 */ ( -16328 11200 0 )
+ /* 4957 */ ( -15816 11200 0 )
+ /* 4958 */ ( -15304 11200 0 )
+ /* 4959 */ ( -14792 11200 0 )
+ /* 4960 */ ( -14280 11200 0 )
+ /* 4961 */ ( -13768 11200 0 )
+ /* 4962 */ ( -13256 11200 0 )
+ /* 4963 */ ( -12744 11200 0 )
+ /* 4964 */ ( -12232 11200 0 )
+ /* 4965 */ ( -11720 11200 0 )
+ /* 4966 */ ( -11208 11200 0 )
+ /* 4967 */ ( -10696 11200 0 )
+ /* 4968 */ ( -10184 11200 0 )
+ /* 4969 */ ( -9672 11200 0 )
+ /* 4970 */ ( -9160 11200 0 )
+ /* 4971 */ ( -8648 11200 0 )
+ /* 4972 */ ( -8136 11200 0 )
+ /* 4973 */ ( -7624 11200 0 )
+ /* 4974 */ ( -7112 11200 0 )
+ /* 4975 */ ( -6600 11200 0 )
+ /* 4976 */ ( -6088 11200 0 )
+ /* 4977 */ ( -5576 11200 0 )
+ /* 4978 */ ( -5064 11200 0 )
+ /* 4979 */ ( -4552 11200 0 )
+ /* 4980 */ ( -4040 11200 0 )
+ /* 4981 */ ( -3528 11200 0 )
+ /* 4982 */ ( -3016 11200 0 )
+ /* 4983 */ ( -2504 11200 0 )
+ /* 4984 */ ( -1992 11200 0 )
+ /* 4985 */ ( -1480 11200 0 )
+ /* 4986 */ ( -968 11200 0 )
+ /* 4987 */ ( -456 11200 0 )
+ /* 4988 */ ( 56 11200 0 )
+ /* 4989 */ ( 568 11200 0 )
+ /* 4990 */ ( 1080 11200 0 )
+ /* 4991 */ ( 1592 11200 0 )
+ /* 4992 */ ( 2104 11200 0 )
+ /* 4993 */ ( 2616 11200 0 )
+ /* 4994 */ ( 3128 11200 0 )
+ /* 4995 */ ( 3640 11200 0 )
+ /* 4996 */ ( 4152 11200 0 )
+ /* 4997 */ ( 4664 11200 0 )
+ /* 4998 */ ( 5176 11200 0 )
+ /* 4999 */ ( 5688 11200 0 )
+ /* 5000 */ ( 6200 11200 0 )
+ /* 5001 */ ( 6712 11200 0 )
+ /* 5002 */ ( 7224 11200 0 )
+ /* 5003 */ ( 7736 11200 0 )
+ /* 5004 */ ( 8248 11200 0 )
+ /* 5005 */ ( 8760 11200 0 )
+ /* 5006 */ ( 9272 11200 0 )
+ /* 5007 */ ( 9784 11200 0 )
+ /* 5008 */ ( 10296 11200 0 )
+ /* 5009 */ ( 10808 11200 0 )
+ /* 5010 */ ( 11320 11200 0 )
+ /* 5011 */ ( 11832 11200 0 )
+ /* 5012 */ ( -20424 11712 0 )
+ /* 5013 */ ( -20936 11712 0 )
+ /* 5014 */ ( -19912 11712 0 )
+ /* 5015 */ ( -19400 11712 0 )
+ /* 5016 */ ( -18888 11712 0 )
+ /* 5017 */ ( -18376 11712 0 )
+ /* 5018 */ ( -17864 11712 0 )
+ /* 5019 */ ( -17352 11712 0 )
+ /* 5020 */ ( -16840 11712 0 )
+ /* 5021 */ ( -16328 11712 0 )
+ /* 5022 */ ( -15816 11712 0 )
+ /* 5023 */ ( -15304 11712 0 )
+ /* 5024 */ ( -14792 11712 0 )
+ /* 5025 */ ( -14280 11712 0 )
+ /* 5026 */ ( -13768 11712 0 )
+ /* 5027 */ ( -13256 11712 0 )
+ /* 5028 */ ( -12744 11712 0 )
+ /* 5029 */ ( -12232 11712 0 )
+ /* 5030 */ ( -11720 11712 0 )
+ /* 5031 */ ( -11208 11712 0 )
+ /* 5032 */ ( -10696 11712 0 )
+ /* 5033 */ ( -10184 11712 0 )
+ /* 5034 */ ( -9672 11712 0 )
+ /* 5035 */ ( -9160 11712 0 )
+ /* 5036 */ ( -8648 11712 0 )
+ /* 5037 */ ( -8136 11712 0 )
+ /* 5038 */ ( -7624 11712 0 )
+ /* 5039 */ ( -7112 11712 0 )
+ /* 5040 */ ( -6600 11712 0 )
+ /* 5041 */ ( -6088 11712 0 )
+ /* 5042 */ ( -5576 11712 0 )
+ /* 5043 */ ( -5064 11712 0 )
+ /* 5044 */ ( -4552 11712 0 )
+ /* 5045 */ ( -4040 11712 0 )
+ /* 5046 */ ( -3528 11712 0 )
+ /* 5047 */ ( -3016 11712 0 )
+ /* 5048 */ ( -2504 11712 0 )
+ /* 5049 */ ( -1992 11712 0 )
+ /* 5050 */ ( -1480 11712 0 )
+ /* 5051 */ ( -968 11712 0 )
+ /* 5052 */ ( -456 11712 0 )
+ /* 5053 */ ( 56 11712 0 )
+ /* 5054 */ ( 568 11712 0 )
+ /* 5055 */ ( 1080 11712 0 )
+ /* 5056 */ ( 1592 11712 0 )
+ /* 5057 */ ( 2104 11712 0 )
+ /* 5058 */ ( 2616 11712 0 )
+ /* 5059 */ ( 3128 11712 0 )
+ /* 5060 */ ( 3640 11712 0 )
+ /* 5061 */ ( 4152 11712 0 )
+ /* 5062 */ ( 4664 11712 0 )
+ /* 5063 */ ( 5176 11712 0 )
+ /* 5064 */ ( 5688 11712 0 )
+ /* 5065 */ ( 6200 11712 0 )
+ /* 5066 */ ( 6712 11712 0 )
+ /* 5067 */ ( 7224 11712 0 )
+ /* 5068 */ ( 7736 11712 0 )
+ /* 5069 */ ( 8248 11712 0 )
+ /* 5070 */ ( 8760 11712 0 )
+ /* 5071 */ ( 9272 11712 0 )
+ /* 5072 */ ( 9784 11712 0 )
+ /* 5073 */ ( 10296 11712 0 )
+ /* 5074 */ ( 10808 11712 0 )
+ /* 5075 */ ( 11320 11712 0 )
+ /* 5076 */ ( 11832 11712 0 )
+ /* 5077 */ ( -20424 12224 0 )
+ /* 5078 */ ( -20936 12224 0 )
+ /* 5079 */ ( -19912 12224 0 )
+ /* 5080 */ ( -19400 12224 0 )
+ /* 5081 */ ( -18888 12224 0 )
+ /* 5082 */ ( -18376 12224 0 )
+ /* 5083 */ ( -17864 12224 0 )
+ /* 5084 */ ( -17352 12224 0 )
+ /* 5085 */ ( -16840 12224 0 )
+ /* 5086 */ ( -16328 12224 0 )
+ /* 5087 */ ( -15816 12224 0 )
+ /* 5088 */ ( -15304 12224 0 )
+ /* 5089 */ ( -14792 12224 0 )
+ /* 5090 */ ( -14280 12224 0 )
+ /* 5091 */ ( -13768 12224 0 )
+ /* 5092 */ ( -13256 12224 0 )
+ /* 5093 */ ( -12744 12224 0 )
+ /* 5094 */ ( -12232 12224 0 )
+ /* 5095 */ ( -11720 12224 0 )
+ /* 5096 */ ( -11208 12224 0 )
+ /* 5097 */ ( -10696 12224 0 )
+ /* 5098 */ ( -10184 12224 0 )
+ /* 5099 */ ( -9672 12224 0 )
+ /* 5100 */ ( -9160 12224 0 )
+ /* 5101 */ ( -8648 12224 0 )
+ /* 5102 */ ( -8136 12224 0 )
+ /* 5103 */ ( -7624 12224 0 )
+ /* 5104 */ ( -7112 12224 0 )
+ /* 5105 */ ( -6600 12224 0 )
+ /* 5106 */ ( -6088 12224 0 )
+ /* 5107 */ ( -5576 12224 0 )
+ /* 5108 */ ( -5064 12224 0 )
+ /* 5109 */ ( -4552 12224 0 )
+ /* 5110 */ ( -4040 12224 0 )
+ /* 5111 */ ( -3528 12224 0 )
+ /* 5112 */ ( -3016 12224 0 )
+ /* 5113 */ ( -2504 12224 0 )
+ /* 5114 */ ( -1992 12224 0 )
+ /* 5115 */ ( -1480 12224 0 )
+ /* 5116 */ ( -968 12224 0 )
+ /* 5117 */ ( -456 12224 0 )
+ /* 5118 */ ( 56 12224 0 )
+ /* 5119 */ ( 568 12224 0 )
+ /* 5120 */ ( 1080 12224 0 )
+ /* 5121 */ ( 1592 12224 0 )
+ /* 5122 */ ( 2104 12224 0 )
+ /* 5123 */ ( 2616 12224 0 )
+ /* 5124 */ ( 3128 12224 0 )
+ /* 5125 */ ( 3640 12224 0 )
+ /* 5126 */ ( 4152 12224 0 )
+ /* 5127 */ ( 4664 12224 0 )
+ /* 5128 */ ( 5176 12224 0 )
+ /* 5129 */ ( 5688 12224 0 )
+ /* 5130 */ ( 6200 12224 0 )
+ /* 5131 */ ( 6712 12224 0 )
+ /* 5132 */ ( 7224 12224 0 )
+ /* 5133 */ ( 7736 12224 0 )
+ /* 5134 */ ( 8248 12224 0 )
+ /* 5135 */ ( 8760 12224 0 )
+ /* 5136 */ ( 9272 12224 0 )
+ /* 5137 */ ( 9784 12224 0 )
+ /* 5138 */ ( 10296 12224 0 )
+ /* 5139 */ ( 10808 12224 0 )
+ /* 5140 */ ( 11320 12224 0 )
+ /* 5141 */ ( 11832 12224 0 )
+ /* 5142 */ ( -20424 12736 0 )
+ /* 5143 */ ( -20936 12736 0 )
+ /* 5144 */ ( -19912 12736 0 )
+ /* 5145 */ ( -19400 12736 0 )
+ /* 5146 */ ( -18888 12736 0 )
+ /* 5147 */ ( -18376 12736 0 )
+ /* 5148 */ ( -17864 12736 0 )
+ /* 5149 */ ( -17352 12736 0 )
+ /* 5150 */ ( -16840 12736 0 )
+ /* 5151 */ ( -16328 12736 0 )
+ /* 5152 */ ( -15816 12736 0 )
+ /* 5153 */ ( -15304 12736 0 )
+ /* 5154 */ ( -14792 12736 0 )
+ /* 5155 */ ( -14280 12736 0 )
+ /* 5156 */ ( -13768 12736 0 )
+ /* 5157 */ ( -13256 12736 0 )
+ /* 5158 */ ( -12744 12736 0 )
+ /* 5159 */ ( -12232 12736 0 )
+ /* 5160 */ ( -11720 12736 0 )
+ /* 5161 */ ( -11208 12736 0 )
+ /* 5162 */ ( -10696 12736 0 )
+ /* 5163 */ ( -10184 12736 0 )
+ /* 5164 */ ( -9672 12736 0 )
+ /* 5165 */ ( -9160 12736 0 )
+ /* 5166 */ ( -8648 12736 0 )
+ /* 5167 */ ( -8136 12736 0 )
+ /* 5168 */ ( -7624 12736 0 )
+ /* 5169 */ ( -7112 12736 0 )
+ /* 5170 */ ( -6600 12736 0 )
+ /* 5171 */ ( -6088 12736 0 )
+ /* 5172 */ ( -5576 12736 0 )
+ /* 5173 */ ( -5064 12736 0 )
+ /* 5174 */ ( -4552 12736 0 )
+ /* 5175 */ ( -4040 12736 0 )
+ /* 5176 */ ( -3528 12736 0 )
+ /* 5177 */ ( -3016 12736 0 )
+ /* 5178 */ ( -2504 12736 0 )
+ /* 5179 */ ( -1992 12736 0 )
+ /* 5180 */ ( -1480 12736 0 )
+ /* 5181 */ ( -968 12736 0 )
+ /* 5182 */ ( -456 12736 0 )
+ /* 5183 */ ( 56 12736 0 )
+ /* 5184 */ ( 568 12736 0 )
+ /* 5185 */ ( 1080 12736 0 )
+ /* 5186 */ ( 1592 12736 0 )
+ /* 5187 */ ( 2104 12736 0 )
+ /* 5188 */ ( 2616 12736 0 )
+ /* 5189 */ ( 3128 12736 0 )
+ /* 5190 */ ( 3640 12736 0 )
+ /* 5191 */ ( 4152 12736 0 )
+ /* 5192 */ ( 4664 12736 0 )
+ /* 5193 */ ( 5176 12736 0 )
+ /* 5194 */ ( 5688 12736 0 )
+ /* 5195 */ ( 6200 12736 0 )
+ /* 5196 */ ( 6712 12736 0 )
+ /* 5197 */ ( 7224 12736 0 )
+ /* 5198 */ ( 7736 12736 0 )
+ /* 5199 */ ( 8248 12736 0 )
+ /* 5200 */ ( 8760 12736 0 )
+ /* 5201 */ ( 9272 12736 0 )
+ /* 5202 */ ( 9784 12736 0 )
+ /* 5203 */ ( 10296 12736 0 )
+ /* 5204 */ ( 10808 12736 0 )
+ /* 5205 */ ( 11320 12736 0 )
+ /* 5206 */ ( 11832 12736 0 )
+ /* 5207 */ ( -20424 13248 0 )
+ /* 5208 */ ( -20936 13248 0 )
+ /* 5209 */ ( -19912 13248 0 )
+ /* 5210 */ ( -19400 13248 0 )
+ /* 5211 */ ( -18888 13248 0 )
+ /* 5212 */ ( -18376 13248 0 )
+ /* 5213 */ ( -17864 13248 0 )
+ /* 5214 */ ( -17352 13248 0 )
+ /* 5215 */ ( -16840 13248 0 )
+ /* 5216 */ ( -16328 13248 0 )
+ /* 5217 */ ( -15816 13248 0 )
+ /* 5218 */ ( -15304 13248 0 )
+ /* 5219 */ ( -14792 13248 0 )
+ /* 5220 */ ( -14280 13248 0 )
+ /* 5221 */ ( -13768 13248 0 )
+ /* 5222 */ ( -13256 13248 0 )
+ /* 5223 */ ( -12744 13248 0 )
+ /* 5224 */ ( -12232 13248 0 )
+ /* 5225 */ ( -11720 13248 0 )
+ /* 5226 */ ( -11208 13248 0 )
+ /* 5227 */ ( -10696 13248 0 )
+ /* 5228 */ ( -10184 13248 0 )
+ /* 5229 */ ( -9672 13248 0 )
+ /* 5230 */ ( -9160 13248 0 )
+ /* 5231 */ ( -8648 13248 0 )
+ /* 5232 */ ( -8136 13248 0 )
+ /* 5233 */ ( -7624 13248 0 )
+ /* 5234 */ ( -7112 13248 0 )
+ /* 5235 */ ( -6600 13248 0 )
+ /* 5236 */ ( -6088 13248 0 )
+ /* 5237 */ ( -5576 13248 0 )
+ /* 5238 */ ( -5064 13248 0 )
+ /* 5239 */ ( -4552 13248 0 )
+ /* 5240 */ ( -4040 13248 0 )
+ /* 5241 */ ( -3528 13248 0 )
+ /* 5242 */ ( -3016 13248 0 )
+ /* 5243 */ ( -2504 13248 0 )
+ /* 5244 */ ( -1992 13248 0 )
+ /* 5245 */ ( -1480 13248 0 )
+ /* 5246 */ ( -968 13248 0 )
+ /* 5247 */ ( -456 13248 0 )
+ /* 5248 */ ( 56 13248 0 )
+ /* 5249 */ ( 568 13248 0 )
+ /* 5250 */ ( 1080 13248 0 )
+ /* 5251 */ ( 1592 13248 0 )
+ /* 5252 */ ( 2104 13248 0 )
+ /* 5253 */ ( 2616 13248 0 )
+ /* 5254 */ ( 3128 13248 0 )
+ /* 5255 */ ( 3640 13248 0 )
+ /* 5256 */ ( 4152 13248 0 )
+ /* 5257 */ ( 4664 13248 0 )
+ /* 5258 */ ( 5176 13248 0 )
+ /* 5259 */ ( 5688 13248 0 )
+ /* 5260 */ ( 6200 13248 0 )
+ /* 5261 */ ( 6712 13248 0 )
+ /* 5262 */ ( 7224 13248 0 )
+ /* 5263 */ ( 7736 13248 0 )
+ /* 5264 */ ( 8248 13248 0 )
+ /* 5265 */ ( 8760 13248 0 )
+ /* 5266 */ ( 9272 13248 0 )
+ /* 5267 */ ( 9784 13248 0 )
+ /* 5268 */ ( 10296 13248 0 )
+ /* 5269 */ ( 10808 13248 0 )
+ /* 5270 */ ( 11320 13248 0 )
+ /* 5271 */ ( 11832 13248 0 )
+ /* 5272 */ ( -20424 13760 0 )
+ /* 5273 */ ( -20936 13760 0 )
+ /* 5274 */ ( -19912 13760 0 )
+ /* 5275 */ ( -19400 13760 0 )
+ /* 5276 */ ( -18888 13760 0 )
+ /* 5277 */ ( -18376 13760 0 )
+ /* 5278 */ ( -17864 13760 0 )
+ /* 5279 */ ( -17352 13760 0 )
+ /* 5280 */ ( -16840 13760 0 )
+ /* 5281 */ ( -16328 13760 0 )
+ /* 5282 */ ( -15816 13760 0 )
+ /* 5283 */ ( -15304 13760 0 )
+ /* 5284 */ ( -14792 13760 0 )
+ /* 5285 */ ( -14280 13760 0 )
+ /* 5286 */ ( -13768 13760 0 )
+ /* 5287 */ ( -13256 13760 0 )
+ /* 5288 */ ( -12744 13760 0 )
+ /* 5289 */ ( -12232 13760 0 )
+ /* 5290 */ ( -11720 13760 0 )
+ /* 5291 */ ( -11208 13760 0 )
+ /* 5292 */ ( -10696 13760 0 )
+ /* 5293 */ ( -10184 13760 0 )
+ /* 5294 */ ( -9672 13760 0 )
+ /* 5295 */ ( -9160 13760 0 )
+ /* 5296 */ ( -8648 13760 0 )
+ /* 5297 */ ( -8136 13760 0 )
+ /* 5298 */ ( -7624 13760 0 )
+ /* 5299 */ ( -7112 13760 0 )
+ /* 5300 */ ( -6600 13760 0 )
+ /* 5301 */ ( -6088 13760 0 )
+ /* 5302 */ ( -5576 13760 0 )
+ /* 5303 */ ( -5064 13760 0 )
+ /* 5304 */ ( -4552 13760 0 )
+ /* 5305 */ ( -4040 13760 0 )
+ /* 5306 */ ( -3528 13760 0 )
+ /* 5307 */ ( -3016 13760 0 )
+ /* 5308 */ ( -2504 13760 0 )
+ /* 5309 */ ( -1992 13760 0 )
+ /* 5310 */ ( -1480 13760 0 )
+ /* 5311 */ ( -968 13760 0 )
+ /* 5312 */ ( -456 13760 0 )
+ /* 5313 */ ( 56 13760 0 )
+ /* 5314 */ ( 568 13760 0 )
+ /* 5315 */ ( 1080 13760 0 )
+ /* 5316 */ ( 1592 13760 0 )
+ /* 5317 */ ( 2104 13760 0 )
+ /* 5318 */ ( 2616 13760 0 )
+ /* 5319 */ ( 3128 13760 0 )
+ /* 5320 */ ( 3640 13760 0 )
+ /* 5321 */ ( 4152 13760 0 )
+ /* 5322 */ ( 4664 13760 0 )
+ /* 5323 */ ( 5176 13760 0 )
+ /* 5324 */ ( 5688 13760 0 )
+ /* 5325 */ ( 6200 13760 0 )
+ /* 5326 */ ( 6712 13760 0 )
+ /* 5327 */ ( 7224 13760 0 )
+ /* 5328 */ ( 7736 13760 0 )
+ /* 5329 */ ( 8248 13760 0 )
+ /* 5330 */ ( 8760 13760 0 )
+ /* 5331 */ ( 9272 13760 0 )
+ /* 5332 */ ( 9784 13760 0 )
+ /* 5333 */ ( 10296 13760 0 )
+ /* 5334 */ ( 10808 13760 0 )
+ /* 5335 */ ( 11320 13760 0 )
+ /* 5336 */ ( 11832 13760 0 )
}
- edges { /* numEdges = */ 2552
+ edges { /* numEdges = */ 2987
/* 0 */ ( 0 0 ) 0 0
/* 1 */ ( 0 1 ) 1 2
/* 2 */ ( 1 2 ) 1 1
@@ -1384,7 +5399,7 @@ collisionModel "worldMap" {
/* 53 */ ( 40 41 ) 1 2
/* 54 */ ( 41 42 ) 1 1
/* 55 */ ( 42 43 ) 1 2
- /* 56 */ ( 43 40 ) 0 2
+ /* 56 */ ( 43 40 ) 1 2
/* 57 */ ( 44 45 ) 1 2
/* 58 */ ( 45 46 ) 0 2
/* 59 */ ( 46 47 ) 1 2
@@ -1428,7 +5443,7 @@ collisionModel "worldMap" {
/* 97 */ ( 80 81 ) 1 2
/* 98 */ ( 81 82 ) 1 1
/* 99 */ ( 82 83 ) 1 2
- /* 100 */ ( 83 80 ) 0 2
+ /* 100 */ ( 83 80 ) 1 2
/* 101 */ ( 84 85 ) 1 2
/* 102 */ ( 85 86 ) 0 2
/* 103 */ ( 86 87 ) 1 2
@@ -1472,7 +5487,7 @@ collisionModel "worldMap" {
/* 141 */ ( 120 121 ) 1 1
/* 142 */ ( 121 122 ) 1 1
/* 143 */ ( 122 123 ) 1 2
- /* 144 */ ( 123 120 ) 0 2
+ /* 144 */ ( 123 120 ) 1 2
/* 145 */ ( 124 125 ) 1 2
/* 146 */ ( 125 126 ) 0 2
/* 147 */ ( 126 127 ) 1 2
@@ -1524,7 +5539,7 @@ collisionModel "worldMap" {
/* 193 */ ( 160 165 ) 0 2
/* 194 */ ( 164 161 ) 1 2
/* 195 */ ( 163 166 ) 1 2
- /* 196 */ ( 168 169 ) 0 2
+ /* 196 */ ( 168 169 ) 1 2
/* 197 */ ( 169 170 ) 1 1
/* 198 */ ( 170 171 ) 1 1
/* 199 */ ( 171 168 ) 1 2
@@ -1534,7 +5549,7 @@ collisionModel "worldMap" {
/* 203 */ ( 175 172 ) 1 2
/* 204 */ ( 168 173 ) 1 2
/* 205 */ ( 172 169 ) 1 2
- /* 206 */ ( 176 177 ) 0 2
+ /* 206 */ ( 176 177 ) 1 2
/* 207 */ ( 177 178 ) 1 1
/* 208 */ ( 178 179 ) 1 2
/* 209 */ ( 179 176 ) 1 1
@@ -1544,7 +5559,7 @@ collisionModel "worldMap" {
/* 213 */ ( 183 180 ) 1 2
/* 214 */ ( 176 181 ) 1 2
/* 215 */ ( 180 177 ) 1 2
- /* 216 */ ( 184 185 ) 0 2
+ /* 216 */ ( 184 185 ) 1 2
/* 217 */ ( 185 186 ) 1 1
/* 218 */ ( 186 187 ) 1 2
/* 219 */ ( 187 184 ) 1 1
@@ -2390,13 +6405,13 @@ collisionModel "worldMap" {
/* 1059 */ ( 240 786 ) 0 2
/* 1060 */ ( 240 787 ) 1 1
/* 1061 */ ( 790 224 ) 1 1
- /* 1062 */ ( 0 790 ) 0 2
+ /* 1062 */ ( 0 790 ) 1 2
/* 1063 */ ( 781 5 ) 0 1
/* 1064 */ ( 4 782 ) 1 1
/* 1065 */ ( 5 780 ) 0 1
/* 1066 */ ( 780 790 ) 1 2
/* 1067 */ ( 238 791 ) 1 1
- /* 1068 */ ( 791 43 ) 0 2
+ /* 1068 */ ( 791 43 ) 1 2
/* 1069 */ ( 46 788 ) 0 1
/* 1070 */ ( 787 47 ) 1 1
/* 1071 */ ( 791 789 ) 1 2
@@ -2521,7 +6536,7 @@ collisionModel "worldMap" {
/* 1190 */ ( 841 843 ) 1 2
/* 1191 */ ( 791 237 ) 0 1
/* 1192 */ ( 225 790 ) 0 1
- /* 1193 */ ( 790 791 ) 0 2
+ /* 1193 */ ( 790 791 ) 1 2
/* 1194 */ ( 241 789 ) 0 1
/* 1195 */ ( 789 780 ) 0 2
/* 1196 */ ( 780 227 ) 0 1
@@ -2568,13 +6583,13 @@ collisionModel "worldMap" {
/* 1237 */ ( 264 854 ) 0 2
/* 1238 */ ( 264 855 ) 1 1
/* 1239 */ ( 858 248 ) 1 1
- /* 1240 */ ( 40 858 ) 0 2
+ /* 1240 */ ( 40 858 ) 1 2
/* 1241 */ ( 849 45 ) 0 1
/* 1242 */ ( 44 850 ) 1 1
/* 1243 */ ( 45 848 ) 0 1
/* 1244 */ ( 848 858 ) 1 2
/* 1245 */ ( 262 859 ) 1 1
- /* 1246 */ ( 859 83 ) 0 2
+ /* 1246 */ ( 859 83 ) 1 2
/* 1247 */ ( 86 856 ) 0 1
/* 1248 */ ( 855 87 ) 1 1
/* 1249 */ ( 859 857 ) 1 2
@@ -2703,7 +6718,7 @@ collisionModel "worldMap" {
/* 1372 */ ( 909 911 ) 1 2
/* 1373 */ ( 859 261 ) 0 1
/* 1374 */ ( 249 858 ) 0 1
- /* 1375 */ ( 858 859 ) 0 2
+ /* 1375 */ ( 858 859 ) 1 2
/* 1376 */ ( 265 857 ) 0 1
/* 1377 */ ( 857 848 ) 0 2
/* 1378 */ ( 848 251 ) 0 1
@@ -2750,13 +6765,13 @@ collisionModel "worldMap" {
/* 1419 */ ( 312 922 ) 0 2
/* 1420 */ ( 312 923 ) 1 1
/* 1421 */ ( 926 296 ) 1 1
- /* 1422 */ ( 80 926 ) 0 2
+ /* 1422 */ ( 80 926 ) 1 2
/* 1423 */ ( 917 85 ) 0 1
/* 1424 */ ( 84 918 ) 1 1
/* 1425 */ ( 85 916 ) 0 1
/* 1426 */ ( 916 926 ) 1 2
/* 1427 */ ( 310 927 ) 1 1
- /* 1428 */ ( 927 123 ) 0 2
+ /* 1428 */ ( 927 123 ) 1 2
/* 1429 */ ( 126 924 ) 0 1
/* 1430 */ ( 923 127 ) 1 1
/* 1431 */ ( 927 925 ) 1 2
@@ -2883,7 +6898,7 @@ collisionModel "worldMap" {
/* 1552 */ ( 977 979 ) 0 2
/* 1553 */ ( 927 309 ) 0 1
/* 1554 */ ( 297 926 ) 0 1
- /* 1555 */ ( 926 927 ) 0 2
+ /* 1555 */ ( 926 927 ) 1 2
/* 1556 */ ( 313 925 ) 0 1
/* 1557 */ ( 925 916 ) 0 2
/* 1558 */ ( 916 299 ) 0 1
@@ -2929,13 +6944,13 @@ collisionModel "worldMap" {
/* 1598 */ ( 993 336 ) 1 1
/* 1599 */ ( 336 990 ) 0 2
/* 1600 */ ( 336 991 ) 1 1
- /* 1601 */ ( 120 994 ) 0 2
+ /* 1601 */ ( 120 994 ) 1 2
/* 1602 */ ( 985 125 ) 0 1
/* 1603 */ ( 124 986 ) 1 1
/* 1604 */ ( 125 984 ) 0 1
/* 1605 */ ( 984 994 ) 1 2
/* 1606 */ ( 334 995 ) 1 1
- /* 1607 */ ( 995 163 ) 0 2
+ /* 1607 */ ( 995 163 ) 1 2
/* 1608 */ ( 166 992 ) 0 1
/* 1609 */ ( 991 167 ) 1 1
/* 1610 */ ( 995 993 ) 1 2
@@ -3063,7 +7078,7 @@ collisionModel "worldMap" {
/* 1732 */ ( 1045 1047 ) 0 2
/* 1733 */ ( 995 333 ) 0 1
/* 1734 */ ( 321 994 ) 1 2
- /* 1735 */ ( 994 995 ) 0 2
+ /* 1735 */ ( 994 995 ) 1 2
/* 1736 */ ( 337 993 ) 0 1
/* 1737 */ ( 993 984 ) 0 2
/* 1738 */ ( 984 323 ) 0 1
@@ -3109,12 +7124,12 @@ collisionModel "worldMap" {
/* 1778 */ ( 1060 1061 ) 1 1
/* 1779 */ ( 1061 1058 ) 0 2
/* 1780 */ ( 1061 1059 ) 1 2
- /* 1781 */ ( 1062 2 ) 0 2
+ /* 1781 */ ( 1062 2 ) 1 2
/* 1782 */ ( 1052 4 ) 1 1
/* 1783 */ ( 7 1053 ) 0 1
/* 1784 */ ( 1062 1054 ) 1 2
/* 1785 */ ( 1054 7 ) 0 1
- /* 1786 */ ( 11 1063 ) 0 2
+ /* 1786 */ ( 11 1063 ) 1 2
/* 1787 */ ( 1063 232 ) 1 1
/* 1788 */ ( 13 1059 ) 1 1
/* 1789 */ ( 1061 14 ) 0 1
@@ -3230,23 +7245,23 @@ collisionModel "worldMap" {
/* 1899 */ ( 341 1113 ) 1 1
/* 1900 */ ( 1113 1110 ) 0 2
/* 1901 */ ( 1113 1111 ) 1 2
- /* 1902 */ ( 1114 1115 ) 0 2
+ /* 1902 */ ( 1114 1115 ) 1 2
/* 1903 */ ( 1105 1116 ) 0 1
/* 1904 */ ( 1116 167 ) 0 1
/* 1905 */ ( 167 1106 ) 1 1
/* 1906 */ ( 1114 1116 ) 0 2
/* 1907 */ ( 1116 1104 ) 0 1
/* 1908 */ ( 1104 1115 ) 0 2
- /* 1909 */ ( 1114 161 ) 0 1
+ /* 1909 */ ( 1114 161 ) 1 1
/* 1910 */ ( 164 1116 ) 0 1
- /* 1911 */ ( 1117 168 ) 0 2
+ /* 1911 */ ( 1117 168 ) 1 2
/* 1912 */ ( 338 1117 ) 1 1
/* 1913 */ ( 173 1111 ) 0 1
/* 1914 */ ( 1113 174 ) 1 1
/* 1915 */ ( 1117 1112 ) 1 2
/* 1916 */ ( 1112 173 ) 0 1
/* 1917 */ ( 230 1063 ) 0 1
- /* 1918 */ ( 1063 1062 ) 0 2
+ /* 1918 */ ( 1063 1062 ) 1 2
/* 1919 */ ( 1062 225 ) 1 2
/* 1920 */ ( 227 1054 ) 0 1
/* 1921 */ ( 1054 1060 ) 0 2
@@ -3294,12 +7309,12 @@ collisionModel "worldMap" {
/* 1963 */ ( 1131 1128 ) 0 2
/* 1964 */ ( 1131 1129 ) 1 2
/* 1965 */ ( 346 1132 ) 1 1
- /* 1966 */ ( 1132 10 ) 0 2
+ /* 1966 */ ( 1132 10 ) 1 2
/* 1967 */ ( 1122 12 ) 1 1
/* 1968 */ ( 15 1123 ) 0 1
/* 1969 */ ( 1132 1124 ) 1 2
/* 1970 */ ( 1124 15 ) 0 1
- /* 1971 */ ( 19 1133 ) 0 2
+ /* 1971 */ ( 19 1133 ) 1 2
/* 1972 */ ( 1133 352 ) 1 1
/* 1973 */ ( 21 1129 ) 1 1
/* 1974 */ ( 1131 22 ) 0 1
@@ -3415,18 +7430,18 @@ collisionModel "worldMap" {
/* 2084 */ ( 485 1183 ) 1 1
/* 2085 */ ( 1183 1180 ) 0 2
/* 2086 */ ( 1183 1181 ) 1 2
- /* 2087 */ ( 169 1184 ) 0 2
+ /* 2087 */ ( 169 1184 ) 1 2
/* 2088 */ ( 1175 172 ) 0 1
/* 2089 */ ( 175 1176 ) 1 1
/* 2090 */ ( 172 1174 ) 0 1
/* 2091 */ ( 1174 1184 ) 0 2
- /* 2092 */ ( 1185 176 ) 0 2
+ /* 2092 */ ( 1185 176 ) 1 2
/* 2093 */ ( 181 1181 ) 0 1
/* 2094 */ ( 1183 182 ) 1 1
/* 2095 */ ( 1185 1182 ) 1 2
/* 2096 */ ( 1182 181 ) 0 1
/* 2097 */ ( 350 1133 ) 0 1
- /* 2098 */ ( 1133 1132 ) 0 2
+ /* 2098 */ ( 1133 1132 ) 1 2
/* 2099 */ ( 1132 345 ) 0 1
/* 2100 */ ( 347 1124 ) 0 1
/* 2101 */ ( 1124 1130 ) 0 2
@@ -3443,7 +7458,7 @@ collisionModel "worldMap" {
/* 2112 */ ( 429 465 ) 0 1
/* 2113 */ ( 467 433 ) 0 1
/* 2114 */ ( 438 474 ) 0 1
- /* 2115 */ ( 1184 1185 ) 0 2
+ /* 2115 */ ( 1184 1185 ) 1 2
/* 2116 */ ( 1185 484 ) 1 2
/* 2117 */ ( 477 1184 ) 0 2
/* 2118 */ ( 1182 1174 ) 0 2
@@ -3473,12 +7488,12 @@ collisionModel "worldMap" {
/* 2142 */ ( 1198 1199 ) 1 1
/* 2143 */ ( 1199 1196 ) 0 2
/* 2144 */ ( 1199 1197 ) 1 2
- /* 2145 */ ( 1200 18 ) 0 2
+ /* 2145 */ ( 1200 18 ) 1 2
/* 2146 */ ( 1190 20 ) 1 1
/* 2147 */ ( 23 1191 ) 0 1
/* 2148 */ ( 1200 1192 ) 1 2
/* 2149 */ ( 1192 23 ) 0 1
- /* 2150 */ ( 27 1201 ) 0 2
+ /* 2150 */ ( 27 1201 ) 1 2
/* 2151 */ ( 1201 520 ) 1 1
/* 2152 */ ( 29 1197 ) 1 1
/* 2153 */ ( 1199 30 ) 0 1
@@ -3593,18 +7608,18 @@ collisionModel "worldMap" {
/* 2262 */ ( 629 1251 ) 1 1
/* 2263 */ ( 1251 1248 ) 0 2
/* 2264 */ ( 1251 1249 ) 1 2
- /* 2265 */ ( 177 1252 ) 0 2
+ /* 2265 */ ( 177 1252 ) 1 2
/* 2266 */ ( 1243 180 ) 0 1
/* 2267 */ ( 183 1244 ) 1 1
/* 2268 */ ( 180 1242 ) 0 1
/* 2269 */ ( 1242 1252 ) 1 2
- /* 2270 */ ( 1253 184 ) 0 2
+ /* 2270 */ ( 1253 184 ) 1 2
/* 2271 */ ( 189 1249 ) 0 1
/* 2272 */ ( 1251 190 ) 1 1
/* 2273 */ ( 1253 1250 ) 0 2
/* 2274 */ ( 1250 189 ) 0 1
/* 2275 */ ( 518 1201 ) 0 1
- /* 2276 */ ( 1201 1200 ) 0 2
+ /* 2276 */ ( 1201 1200 ) 1 2
/* 2277 */ ( 1200 513 ) 1 2
/* 2278 */ ( 515 1192 ) 0 1
/* 2279 */ ( 1192 1198 ) 0 2
@@ -3621,7 +7636,7 @@ collisionModel "worldMap" {
/* 2290 */ ( 597 609 ) 1 2
/* 2291 */ ( 611 601 ) 0 1
/* 2292 */ ( 606 618 ) 0 1
- /* 2293 */ ( 1252 1253 ) 0 2
+ /* 2293 */ ( 1252 1253 ) 1 2
/* 2294 */ ( 1253 628 ) 0 2
/* 2295 */ ( 621 1252 ) 1 2
/* 2296 */ ( 1250 1242 ) 0 2
@@ -3652,12 +7667,12 @@ collisionModel "worldMap" {
/* 2321 */ ( 1267 1264 ) 0 2
/* 2322 */ ( 1267 1265 ) 1 2
/* 2323 */ ( 634 1268 ) 1 1
- /* 2324 */ ( 1268 26 ) 0 2
+ /* 2324 */ ( 1268 26 ) 1 2
/* 2325 */ ( 1258 28 ) 1 1
/* 2326 */ ( 31 1259 ) 0 1
/* 2327 */ ( 1268 1260 ) 1 2
/* 2328 */ ( 1260 31 ) 0 1
- /* 2329 */ ( 35 1269 ) 0 2
+ /* 2329 */ ( 35 1269 ) 1 2
/* 2330 */ ( 1269 640 ) 1 1
/* 2331 */ ( 37 1265 ) 1 1
/* 2332 */ ( 1267 38 ) 0 1
@@ -3772,18 +7787,18 @@ collisionModel "worldMap" {
/* 2441 */ ( 773 1319 ) 1 1
/* 2442 */ ( 1319 1316 ) 0 2
/* 2443 */ ( 1319 1317 ) 1 2
- /* 2444 */ ( 185 1320 ) 0 2
+ /* 2444 */ ( 185 1320 ) 1 2
/* 2445 */ ( 1311 188 ) 0 1
/* 2446 */ ( 191 1312 ) 1 1
/* 2447 */ ( 188 1310 ) 0 1
/* 2448 */ ( 1310 1320 ) 1 2
- /* 2449 */ ( 1321 192 ) 0 2
+ /* 2449 */ ( 1321 192 ) 1 2
/* 2450 */ ( 197 1317 ) 0 1
/* 2451 */ ( 1319 198 ) 1 1
/* 2452 */ ( 1321 1318 ) 0 2
/* 2453 */ ( 1318 197 ) 0 1
/* 2454 */ ( 638 1269 ) 0 1
- /* 2455 */ ( 1269 1268 ) 0 2
+ /* 2455 */ ( 1269 1268 ) 1 2
/* 2456 */ ( 1268 633 ) 0 1
/* 2457 */ ( 635 1260 ) 0 1
/* 2458 */ ( 1260 1266 ) 0 2
@@ -3800,86 +7815,521 @@ collisionModel "worldMap" {
/* 2469 */ ( 717 753 ) 1 2
/* 2470 */ ( 755 721 ) 0 1
/* 2471 */ ( 726 762 ) 0 1
- /* 2472 */ ( 1320 1321 ) 0 2
+ /* 2472 */ ( 1320 1321 ) 1 2
/* 2473 */ ( 1321 772 ) 0 2
/* 2474 */ ( 765 1320 ) 1 2
/* 2475 */ ( 1318 1310 ) 0 2
/* 2476 */ ( 1310 769 ) 0 1
/* 2477 */ ( 774 1318 ) 0 1
- /* 2478 */ ( 192 771 ) 0 1
- /* 2479 */ ( 153 760 ) 0 1
- /* 2480 */ ( 152 723 ) 0 1
- /* 2481 */ ( 724 760 ) 1 1
- /* 2482 */ ( 766 185 ) 0 1
- /* 2483 */ ( 184 627 ) 0 1
- /* 2484 */ ( 622 177 ) 0 1
- /* 2485 */ ( 718 752 ) 0 1
- /* 2486 */ ( 145 616 ) 0 1
- /* 2487 */ ( 614 752 ) 1 1
- /* 2488 */ ( 144 603 ) 0 1
- /* 2489 */ ( 604 616 ) 1 1
- /* 2490 */ ( 598 608 ) 0 1
- /* 2491 */ ( 113 712 ) 0 1
- /* 2492 */ ( 112 699 ) 0 1
- /* 2493 */ ( 700 712 ) 1 1
- /* 2494 */ ( 694 704 ) 0 1
- /* 2495 */ ( 105 592 ) 0 1
- /* 2496 */ ( 590 704 ) 1 1
- /* 2497 */ ( 550 584 ) 0 1
- /* 2498 */ ( 104 555 ) 0 1
- /* 2499 */ ( 556 592 ) 1 1
- /* 2500 */ ( 73 688 ) 0 1
- /* 2501 */ ( 650 74 ) 0 1
- /* 2502 */ ( 33 640 ) 0 1
- /* 2503 */ ( 682 544 ) 0 1
- /* 2504 */ ( 682 645 ) 1 1
- /* 2505 */ ( 646 65 ) 0 1
- /* 2506 */ ( 646 532 ) 1 1
- /* 2507 */ ( 530 66 ) 0 1
- /* 2508 */ ( 526 536 ) 0 1
- /* 2509 */ ( 634 520 ) 0 1
- /* 2510 */ ( 18 512 ) 0 1
- /* 2511 */ ( 176 483 ) 0 1
- /* 2512 */ ( 137 472 ) 0 1
- /* 2513 */ ( 470 608 ) 1 1
- /* 2514 */ ( 478 169 ) 0 1
- /* 2515 */ ( 466 328 ) 0 1
- /* 2516 */ ( 478 340 ) 1 1
- /* 2517 */ ( 338 170 ) 0 1
- /* 2518 */ ( 598 436 ) 1 1
- /* 2519 */ ( 434 138 ) 0 1
- /* 2520 */ ( 97 424 ) 0 1
- /* 2521 */ ( 422 584 ) 1 1
- /* 2522 */ ( 96 411 ) 0 1
- /* 2523 */ ( 412 424 ) 1 1
- /* 2524 */ ( 466 429 ) 1 1
- /* 2525 */ ( 430 129 ) 0 1
- /* 2526 */ ( 430 316 ) 1 1
- /* 2527 */ ( 314 130 ) 0 1
- /* 2528 */ ( 406 416 ) 0 1
- /* 2529 */ ( 89 304 ) 0 1
- /* 2530 */ ( 302 416 ) 1 1
- /* 2531 */ ( 334 1114 ) 0 1
- /* 2532 */ ( 322 120 ) 0 1
- /* 2533 */ ( 322 309 ) 1 1
- /* 2534 */ ( 310 121 ) 0 1
- /* 2535 */ ( 262 296 ) 0 1
- /* 2536 */ ( 88 267 ) 0 1
- /* 2537 */ ( 268 304 ) 1 1
- /* 2538 */ ( 57 400 ) 0 1
- /* 2539 */ ( 398 536 ) 1 1
- /* 2540 */ ( 526 364 ) 1 1
- /* 2541 */ ( 362 58 ) 0 1
- /* 2542 */ ( 394 256 ) 0 1
- /* 2543 */ ( 394 357 ) 1 1
- /* 2544 */ ( 358 49 ) 0 1
- /* 2545 */ ( 358 244 ) 1 1
- /* 2546 */ ( 242 50 ) 0 1
- /* 2547 */ ( 17 352 ) 0 1
- /* 2548 */ ( 350 512 ) 1 1
- /* 2549 */ ( 346 232 ) 0 1
- /* 2550 */ ( 238 248 ) 0 1
- /* 2551 */ ( 2 224 ) 0 1
+ /* 2478 */ ( 3108 3107 ) 1 1
+ /* 2479 */ ( 3109 3108 ) 1 1
+ /* 2480 */ ( 3107 3172 ) 1 1
+ /* 2481 */ ( 3108 3173 ) 1 2
+ /* 2482 */ ( 3173 3107 ) 0 2
+ /* 2483 */ ( 3173 3172 ) 1 2
+ /* 2484 */ ( 3109 3174 ) 0 2
+ /* 2485 */ ( 3174 3108 ) 0 2
+ /* 2486 */ ( 3174 3173 ) 1 2
+ /* 2487 */ ( 3175 3109 ) 1 2
+ /* 2488 */ ( 3175 3174 ) 0 2
+ /* 2489 */ ( 3190 3189 ) 1 1
+ /* 2490 */ ( 3141 3206 ) 0 1
+ /* 2491 */ ( 3172 3237 ) 1 1
+ /* 2492 */ ( 3173 3238 ) 1 2
+ /* 2493 */ ( 3238 3172 ) 0 2
+ /* 2494 */ ( 3238 3237 ) 1 2
+ /* 2495 */ ( 3174 3239 ) 0 2
+ /* 2496 */ ( 3239 3173 ) 0 2
+ /* 2497 */ ( 3239 3238 ) 0 2
+ /* 2498 */ ( 3175 3240 ) 0 1
+ /* 2499 */ ( 3240 3174 ) 0 1
+ /* 2500 */ ( 3174 3241 ) 1 1
+ /* 2501 */ ( 3241 3242 ) 1 1
+ /* 2502 */ ( 3242 3239 ) 0 2
+ /* 2503 */ ( 3244 3175 ) 1 1
+ /* 2504 */ ( 3189 3257 ) 1 1
+ /* 2505 */ ( 3190 3258 ) 0 1
+ /* 2506 */ ( 3258 3259 ) 0 1
+ /* 2507 */ ( 3259 3189 ) 0 1
+ /* 2508 */ ( 3261 3190 ) 1 1
+ /* 2509 */ ( 3192 3262 ) 1 1
+ /* 2510 */ ( 3264 3192 ) 0 1
+ /* 2511 */ ( 3206 3277 ) 0 1
+ /* 2512 */ ( 3237 3308 ) 1 1
+ /* 2513 */ ( 3238 3309 ) 0 2
+ /* 2514 */ ( 3309 3237 ) 0 2
+ /* 2515 */ ( 3309 3308 ) 1 2
+ /* 2516 */ ( 3239 3310 ) 0 2
+ /* 2517 */ ( 3310 3238 ) 1 2
+ /* 2518 */ ( 3310 3309 ) 0 2
+ /* 2519 */ ( 3242 3311 ) 1 1
+ /* 2520 */ ( 3311 3239 ) 0 2
+ /* 2521 */ ( 3311 3312 ) 1 1
+ /* 2522 */ ( 3312 3310 ) 1 2
+ /* 2523 */ ( 3308 3359 ) 1 1
+ /* 2524 */ ( 3309 3360 ) 0 2
+ /* 2525 */ ( 3360 3308 ) 0 2
+ /* 2526 */ ( 3360 3359 ) 1 2
+ /* 2527 */ ( 3310 3361 ) 0 2
+ /* 2528 */ ( 3361 3309 ) 1 2
+ /* 2529 */ ( 3361 3360 ) 1 2
+ /* 2530 */ ( 3312 3362 ) 1 1
+ /* 2531 */ ( 3362 3310 ) 0 2
+ /* 2532 */ ( 3362 3363 ) 1 1
+ /* 2533 */ ( 3363 3361 ) 1 2
+ /* 2534 */ ( 3406 3405 ) 1 1
+ /* 2535 */ ( 3407 3406 ) 1 1
+ /* 2536 */ ( 3359 3409 ) 1 1
+ /* 2537 */ ( 3360 3410 ) 0 2
+ /* 2538 */ ( 3410 3359 ) 0 2
+ /* 2539 */ ( 3410 3409 ) 1 2
+ /* 2540 */ ( 3361 3411 ) 0 2
+ /* 2541 */ ( 3411 3360 ) 0 2
+ /* 2542 */ ( 3411 3410 ) 0 2
+ /* 2543 */ ( 3363 3412 ) 0 1
+ /* 2544 */ ( 3412 3361 ) 0 1
+ /* 2545 */ ( 3361 3413 ) 0 1
+ /* 2546 */ ( 3413 3411 ) 0 2
+ /* 2547 */ ( 3430 3380 ) 0 1
+ /* 2548 */ ( 3405 3455 ) 1 2
+ /* 2549 */ ( 3455 3454 ) 1 1
+ /* 2550 */ ( 3406 3456 ) 0 2
+ /* 2551 */ ( 3456 3405 ) 0 2
+ /* 2552 */ ( 3456 3455 ) 1 2
+ /* 2553 */ ( 3407 3457 ) 0 2
+ /* 2554 */ ( 3457 3406 ) 1 2
+ /* 2555 */ ( 3457 3456 ) 1 2
+ /* 2556 */ ( 3458 3407 ) 1 1
+ /* 2557 */ ( 3458 3457 ) 1 2
+ /* 2558 */ ( 3409 3459 ) 1 1
+ /* 2559 */ ( 3410 3460 ) 0 2
+ /* 2560 */ ( 3460 3409 ) 0 2
+ /* 2561 */ ( 3460 3459 ) 0 2
+ /* 2562 */ ( 3411 3461 ) 0 2
+ /* 2563 */ ( 3461 3410 ) 0 2
+ /* 2564 */ ( 3461 3460 ) 0 2
+ /* 2565 */ ( 3413 3462 ) 0 1
+ /* 2566 */ ( 3462 3411 ) 0 1
+ /* 2567 */ ( 3411 3463 ) 1 1
+ /* 2568 */ ( 3463 3464 ) 1 1
+ /* 2569 */ ( 3464 3461 ) 0 2
+ /* 2570 */ ( 3454 3505 ) 1 1
+ /* 2571 */ ( 3455 3506 ) 1 2
+ /* 2572 */ ( 3506 3454 ) 0 2
+ /* 2573 */ ( 3506 3505 ) 1 2
+ /* 2574 */ ( 3456 3507 ) 0 2
+ /* 2575 */ ( 3507 3455 ) 0 2
+ /* 2576 */ ( 3507 3506 ) 1 2
+ /* 2577 */ ( 3457 3508 ) 0 2
+ /* 2578 */ ( 3508 3456 ) 1 2
+ /* 2579 */ ( 3508 3507 ) 1 2
+ /* 2580 */ ( 3458 3509 ) 0 2
+ /* 2581 */ ( 3509 3457 ) 1 2
+ /* 2582 */ ( 3509 3508 ) 1 2
+ /* 2583 */ ( 3459 3510 ) 1 1
+ /* 2584 */ ( 3510 3458 ) 1 1
+ /* 2585 */ ( 3510 3509 ) 0 2
+ /* 2586 */ ( 3460 3511 ) 0 2
+ /* 2587 */ ( 3511 3459 ) 1 2
+ /* 2588 */ ( 3511 3510 ) 1 2
+ /* 2589 */ ( 3461 3512 ) 0 2
+ /* 2590 */ ( 3512 3460 ) 1 2
+ /* 2591 */ ( 3512 3511 ) 1 2
+ /* 2592 */ ( 3464 3513 ) 1 1
+ /* 2593 */ ( 3513 3461 ) 0 2
+ /* 2594 */ ( 3513 3514 ) 1 1
+ /* 2595 */ ( 3514 3512 ) 1 2
+ /* 2596 */ ( 3505 3555 ) 1 1
+ /* 2597 */ ( 3506 3556 ) 1 2
+ /* 2598 */ ( 3556 3505 ) 0 2
+ /* 2599 */ ( 3556 3555 ) 0 2
+ /* 2600 */ ( 3507 3557 ) 1 2
+ /* 2601 */ ( 3557 3506 ) 0 2
+ /* 2602 */ ( 3557 3556 ) 0 2
+ /* 2603 */ ( 3508 3558 ) 0 2
+ /* 2604 */ ( 3558 3507 ) 0 2
+ /* 2605 */ ( 3558 3557 ) 0 2
+ /* 2606 */ ( 3509 3559 ) 0 2
+ /* 2607 */ ( 3559 3508 ) 1 2
+ /* 2608 */ ( 3559 3558 ) 0 2
+ /* 2609 */ ( 3510 3560 ) 1 2
+ /* 2610 */ ( 3560 3509 ) 1 2
+ /* 2611 */ ( 3560 3559 ) 0 2
+ /* 2612 */ ( 3511 3561 ) 0 2
+ /* 2613 */ ( 3561 3510 ) 0 2
+ /* 2614 */ ( 3561 3560 ) 1 2
+ /* 2615 */ ( 3512 3562 ) 0 2
+ /* 2616 */ ( 3562 3511 ) 1 2
+ /* 2617 */ ( 3562 3561 ) 0 2
+ /* 2618 */ ( 3514 3563 ) 1 1
+ /* 2619 */ ( 3563 3512 ) 1 2
+ /* 2620 */ ( 3563 3564 ) 1 1
+ /* 2621 */ ( 3564 3562 ) 0 1
+ /* 2622 */ ( 3556 3606 ) 1 2
+ /* 2623 */ ( 3606 3555 ) 1 2
+ /* 2624 */ ( 3557 3607 ) 1 2
+ /* 2625 */ ( 3607 3556 ) 1 2
+ /* 2626 */ ( 3607 3606 ) 0 2
+ /* 2627 */ ( 3558 3608 ) 0 2
+ /* 2628 */ ( 3608 3557 ) 0 2
+ /* 2629 */ ( 3608 3607 ) 0 2
+ /* 2630 */ ( 3559 3609 ) 1 2
+ /* 2631 */ ( 3609 3558 ) 0 2
+ /* 2632 */ ( 3609 3608 ) 0 2
+ /* 2633 */ ( 3560 3610 ) 1 2
+ /* 2634 */ ( 3610 3559 ) 1 2
+ /* 2635 */ ( 3610 3609 ) 0 2
+ /* 2636 */ ( 3561 3611 ) 0 2
+ /* 2637 */ ( 3611 3560 ) 0 2
+ /* 2638 */ ( 3611 3610 ) 0 2
+ /* 2639 */ ( 3562 3612 ) 0 2
+ /* 2640 */ ( 3612 3561 ) 1 2
+ /* 2641 */ ( 3612 3611 ) 0 2
+ /* 2642 */ ( 3562 3613 ) 0 1
+ /* 2643 */ ( 3613 3614 ) 0 1
+ /* 2644 */ ( 3614 3562 ) 0 1
+ /* 2645 */ ( 3562 3615 ) 0 1
+ /* 2646 */ ( 3615 3616 ) 1 1
+ /* 2647 */ ( 3616 3612 ) 1 1
+ /* 2648 */ ( 3606 3658 ) 1 2
+ /* 2649 */ ( 3607 3659 ) 0 2
+ /* 2650 */ ( 3659 3606 ) 1 2
+ /* 2651 */ ( 3659 3658 ) 0 2
+ /* 2652 */ ( 3608 3660 ) 0 2
+ /* 2653 */ ( 3660 3607 ) 1 2
+ /* 2654 */ ( 3660 3659 ) 1 2
+ /* 2655 */ ( 3609 3661 ) 1 2
+ /* 2656 */ ( 3661 3608 ) 0 2
+ /* 2657 */ ( 3661 3660 ) 1 2
+ /* 2658 */ ( 3610 3662 ) 1 2
+ /* 2659 */ ( 3662 3609 ) 0 2
+ /* 2660 */ ( 3662 3661 ) 1 2
+ /* 2661 */ ( 3611 3663 ) 0 2
+ /* 2662 */ ( 3663 3610 ) 1 2
+ /* 2663 */ ( 3663 3662 ) 1 2
+ /* 2664 */ ( 3612 3664 ) 1 2
+ /* 2665 */ ( 3664 3611 ) 0 2
+ /* 2666 */ ( 3664 3663 ) 1 2
+ /* 2667 */ ( 3612 3614 ) 0 1
+ /* 2668 */ ( 3614 3665 ) 0 1
+ /* 2669 */ ( 3665 3612 ) 0 1
+ /* 2670 */ ( 3612 3666 ) 0 1
+ /* 2671 */ ( 3666 3667 ) 1 1
+ /* 2672 */ ( 3667 3664 ) 1 2
+ /* 2673 */ ( 3684 3633 ) 0 1
+ /* 2674 */ ( 3659 3710 ) 0 2
+ /* 2675 */ ( 3710 3658 ) 1 2
+ /* 2676 */ ( 3660 3711 ) 0 2
+ /* 2677 */ ( 3711 3659 ) 1 2
+ /* 2678 */ ( 3711 3710 ) 1 1
+ /* 2679 */ ( 3661 3712 ) 1 2
+ /* 2680 */ ( 3712 3660 ) 1 2
+ /* 2681 */ ( 3712 3711 ) 1 1
+ /* 2682 */ ( 3662 3713 ) 1 2
+ /* 2683 */ ( 3713 3661 ) 0 2
+ /* 2684 */ ( 3713 3712 ) 1 2
+ /* 2685 */ ( 3663 3714 ) 0 2
+ /* 2686 */ ( 3714 3662 ) 1 2
+ /* 2687 */ ( 3714 3713 ) 0 2
+ /* 2688 */ ( 3664 3715 ) 1 2
+ /* 2689 */ ( 3715 3663 ) 1 2
+ /* 2690 */ ( 3715 3714 ) 0 2
+ /* 2691 */ ( 3667 3716 ) 1 1
+ /* 2692 */ ( 3716 3664 ) 1 2
+ /* 2693 */ ( 3716 3717 ) 1 1
+ /* 2694 */ ( 3717 3715 ) 0 2
+ /* 2695 */ ( 3712 3762 ) 1 1
+ /* 2696 */ ( 3713 3763 ) 0 2
+ /* 2697 */ ( 3763 3712 ) 1 2
+ /* 2698 */ ( 3763 3762 ) 0 2
+ /* 2699 */ ( 3714 3764 ) 0 2
+ /* 2700 */ ( 3764 3713 ) 0 2
+ /* 2701 */ ( 3764 3763 ) 1 2
+ /* 2702 */ ( 3715 3765 ) 1 2
+ /* 2703 */ ( 3765 3714 ) 0 2
+ /* 2704 */ ( 3765 3764 ) 1 2
+ /* 2705 */ ( 3717 3766 ) 1 1
+ /* 2706 */ ( 3766 3767 ) 1 1
+ /* 2707 */ ( 3767 3715 ) 1 2
+ /* 2708 */ ( 3767 3765 ) 0 2
+ /* 2709 */ ( 3768 3769 ) 0 1
+ /* 2710 */ ( 3769 3767 ) 0 1
+ /* 2711 */ ( 3767 3768 ) 0 1
+ /* 2712 */ ( 3762 3814 ) 1 1
+ /* 2713 */ ( 3763 3815 ) 0 2
+ /* 2714 */ ( 3815 3762 ) 1 2
+ /* 2715 */ ( 3815 3814 ) 1 2
+ /* 2716 */ ( 3764 3816 ) 0 2
+ /* 2717 */ ( 3816 3763 ) 0 2
+ /* 2718 */ ( 3816 3815 ) 1 2
+ /* 2719 */ ( 3765 3817 ) 1 2
+ /* 2720 */ ( 3817 3764 ) 0 2
+ /* 2721 */ ( 3817 3816 ) 0 2
+ /* 2722 */ ( 3767 3818 ) 1 2
+ /* 2723 */ ( 3818 3765 ) 0 2
+ /* 2724 */ ( 3818 3817 ) 0 2
+ /* 2725 */ ( 3767 3819 ) 0 1
+ /* 2726 */ ( 3819 3820 ) 1 1
+ /* 2727 */ ( 3820 3767 ) 0 1
+ /* 2728 */ ( 3767 3821 ) 0 1
+ /* 2729 */ ( 3821 3818 ) 0 1
+ /* 2730 */ ( 3814 3866 ) 1 1
+ /* 2731 */ ( 3866 3865 ) 1 1
+ /* 2732 */ ( 3815 3867 ) 1 2
+ /* 2733 */ ( 3867 3814 ) 0 2
+ /* 2734 */ ( 3867 3866 ) 0 2
+ /* 2735 */ ( 3816 3868 ) 0 2
+ /* 2736 */ ( 3868 3815 ) 1 2
+ /* 2737 */ ( 3868 3867 ) 1 2
+ /* 2738 */ ( 3817 3869 ) 1 2
+ /* 2739 */ ( 3869 3870 ) 1 1
+ /* 2740 */ ( 3870 3816 ) 1 2
+ /* 2741 */ ( 3870 3871 ) 1 1
+ /* 2742 */ ( 3871 3868 ) 0 2
+ /* 2743 */ ( 3818 3872 ) 1 2
+ /* 2744 */ ( 3872 3873 ) 1 1
+ /* 2745 */ ( 3873 3817 ) 0 2
+ /* 2746 */ ( 3873 3869 ) 1 1
+ /* 2747 */ ( 3818 3874 ) 1 1
+ /* 2748 */ ( 3874 3875 ) 1 1
+ /* 2749 */ ( 3875 3818 ) 0 2
+ /* 2750 */ ( 3875 3872 ) 1 1
+ /* 2751 */ ( 3892 3838 ) 0 1
+ /* 2752 */ ( 3865 3919 ) 1 2
+ /* 2753 */ ( 3866 3920 ) 1 2
+ /* 2754 */ ( 3920 3865 ) 0 2
+ /* 2755 */ ( 3920 3919 ) 0 2
+ /* 2756 */ ( 3867 3921 ) 1 2
+ /* 2757 */ ( 3921 3866 ) 1 2
+ /* 2758 */ ( 3921 3920 ) 0 2
+ /* 2759 */ ( 3868 3922 ) 0 2
+ /* 2760 */ ( 3922 3867 ) 0 2
+ /* 2761 */ ( 3922 3921 ) 0 2
+ /* 2762 */ ( 3871 3923 ) 1 1
+ /* 2763 */ ( 3923 3868 ) 1 2
+ /* 2764 */ ( 3923 3924 ) 1 1
+ /* 2765 */ ( 3924 3922 ) 0 1
+ /* 2766 */ ( 3920 3969 ) 1 2
+ /* 2767 */ ( 3969 3919 ) 1 2
+ /* 2768 */ ( 3921 3970 ) 1 2
+ /* 2769 */ ( 3970 3920 ) 1 2
+ /* 2770 */ ( 3970 3969 ) 0 2
+ /* 2771 */ ( 3922 3971 ) 0 2
+ /* 2772 */ ( 3971 3921 ) 1 2
+ /* 2773 */ ( 3971 3970 ) 1 2
+ /* 2774 */ ( 3922 3972 ) 0 1
+ /* 2775 */ ( 3972 3973 ) 0 1
+ /* 2776 */ ( 3973 3922 ) 0 1
+ /* 2777 */ ( 3922 3974 ) 0 1
+ /* 2778 */ ( 3974 3975 ) 1 1
+ /* 2779 */ ( 3975 3971 ) 1 1
+ /* 2780 */ ( 3969 4020 ) 1 1
+ /* 2781 */ ( 3970 4021 ) 1 2
+ /* 2782 */ ( 4021 3969 ) 1 2
+ /* 2783 */ ( 4021 4020 ) 1 2
+ /* 2784 */ ( 3971 4022 ) 0 2
+ /* 2785 */ ( 4022 3970 ) 0 2
+ /* 2786 */ ( 4022 4021 ) 1 2
+ /* 2787 */ ( 3971 3973 ) 0 1
+ /* 2788 */ ( 3973 4023 ) 0 1
+ /* 2789 */ ( 4023 3971 ) 0 1
+ /* 2790 */ ( 3971 4024 ) 1 1
+ /* 2791 */ ( 4024 4025 ) 1 1
+ /* 2792 */ ( 4025 4022 ) 0 2
+ /* 2793 */ ( 4020 4070 ) 1 1
+ /* 2794 */ ( 4021 4071 ) 1 2
+ /* 2795 */ ( 4071 4020 ) 0 2
+ /* 2796 */ ( 4071 4070 ) 0 2
+ /* 2797 */ ( 4022 4072 ) 0 2
+ /* 2798 */ ( 4072 4021 ) 0 2
+ /* 2799 */ ( 4072 4071 ) 0 2
+ /* 2800 */ ( 4025 4073 ) 1 1
+ /* 2801 */ ( 4073 4022 ) 1 2
+ /* 2802 */ ( 4073 4074 ) 1 1
+ /* 2803 */ ( 4074 4072 ) 0 2
+ /* 2804 */ ( 4070 4119 ) 1 1
+ /* 2805 */ ( 4071 4120 ) 1 2
+ /* 2806 */ ( 4120 4070 ) 1 2
+ /* 2807 */ ( 4120 4119 ) 0 2
+ /* 2808 */ ( 4072 4121 ) 0 2
+ /* 2809 */ ( 4121 4071 ) 1 2
+ /* 2810 */ ( 4121 4120 ) 0 2
+ /* 2811 */ ( 4074 4122 ) 1 1
+ /* 2812 */ ( 4122 4072 ) 0 1
+ /* 2813 */ ( 4072 4123 ) 0 1
+ /* 2814 */ ( 4123 4121 ) 1 2
+ /* 2815 */ ( 4140 4091 ) 0 1
+ /* 2816 */ ( 4120 4169 ) 0 2
+ /* 2817 */ ( 4169 4119 ) 1 2
+ /* 2818 */ ( 4121 4170 ) 0 2
+ /* 2819 */ ( 4170 4120 ) 1 2
+ /* 2820 */ ( 4170 4169 ) 1 1
+ /* 2821 */ ( 4123 4171 ) 0 1
+ /* 2822 */ ( 4171 4121 ) 0 2
+ /* 2823 */ ( 4171 4170 ) 1 1
+ /* 2824 */ ( 4172 4173 ) 1 2
+ /* 2825 */ ( 4173 4171 ) 1 1
+ /* 2826 */ ( 4171 4174 ) 1 1
+ /* 2827 */ ( 4174 4172 ) 1 1
+ /* 2828 */ ( 4175 4176 ) 1 1
+ /* 2829 */ ( 4176 4173 ) 1 1
+ /* 2830 */ ( 4172 4175 ) 1 1
+ /* 2831 */ ( 4176 4177 ) 0 1
+ /* 2832 */ ( 4182 4183 ) 0 1
+ /* 2833 */ ( 4184 4185 ) 1 1
+ /* 2834 */ ( 4185 4183 ) 1 1
+ /* 2835 */ ( 4183 4186 ) 1 1
+ /* 2836 */ ( 4186 4184 ) 1 1
+ /* 2837 */ ( 4185 4187 ) 0 1
+ /* 2838 */ ( 4190 4191 ) 0 1
+ /* 2839 */ ( 4191 4194 ) 1 1
+ /* 2840 */ ( 4195 4196 ) 1 1
+ /* 2841 */ ( 4196 4197 ) 0 1
+ /* 2842 */ ( 4200 4201 ) 0 1
+ /* 2843 */ ( 4201 4204 ) 1 1
+ /* 2844 */ ( 4205 4206 ) 1 1
+ /* 2845 */ ( 4206 4207 ) 0 1
+ /* 2846 */ ( 4210 4211 ) 0 1
+ /* 2847 */ ( 4211 4214 ) 1 1
+ /* 2848 */ ( 4215 4216 ) 1 1
+ /* 2849 */ ( 4216 4217 ) 0 1
+ /* 2850 */ ( 4138 4231 ) 0 1
+ /* 2851 */ ( 3409 3380 ) 0 1
+ /* 2852 */ ( 3175 3189 ) 1 1
+ /* 2853 */ ( 3257 3244 ) 0 1
+ /* 2854 */ ( 3109 3141 ) 1 1
+ /* 2855 */ ( 3206 3175 ) 0 1
+ /* 2856 */ ( 3078 3107 ) 1 1
+ /* 2857 */ ( 3107 3409 ) 0 1
+ /* 2858 */ ( 3380 3078 ) 0 1
+ /* 2859 */ ( 3141 3078 ) 0 1
+ /* 2860 */ ( 1322 1450 ) 0 1
+ /* 2861 */ ( 1450 3141 ) 0 1
+ /* 2862 */ ( 3078 1322 ) 0 1
+ /* 2863 */ ( 192 771 ) 0 1
+ /* 2864 */ ( 3407 3409 ) 1 1
+ /* 2865 */ ( 3409 3510 ) 0 1
+ /* 2866 */ ( 3510 3407 ) 0 1
+ /* 2867 */ ( 3455 3430 ) 0 1
+ /* 2868 */ ( 3380 3405 ) 1 1
+ /* 2869 */ ( 153 760 ) 0 1
+ /* 2870 */ ( 152 723 ) 0 1
+ /* 2871 */ ( 724 760 ) 1 1
+ /* 2872 */ ( 766 185 ) 0 1
+ /* 2873 */ ( 184 627 ) 0 1
+ /* 2874 */ ( 622 177 ) 0 1
+ /* 2875 */ ( 718 752 ) 0 1
+ /* 2876 */ ( 145 616 ) 0 1
+ /* 2877 */ ( 614 752 ) 1 1
+ /* 2878 */ ( 144 603 ) 0 1
+ /* 2879 */ ( 604 616 ) 1 1
+ /* 2880 */ ( 598 608 ) 0 1
+ /* 2881 */ ( 3531 3555 ) 1 2
+ /* 2882 */ ( 3430 3454 ) 1 1
+ /* 2883 */ ( 3454 3555 ) 0 1
+ /* 2884 */ ( 3531 3430 ) 0 1
+ /* 2885 */ ( 3658 3633 ) 1 2
+ /* 2886 */ ( 3633 3531 ) 0 1
+ /* 2887 */ ( 113 712 ) 0 1
+ /* 2888 */ ( 3684 3712 ) 0 1
+ /* 2889 */ ( 3710 3684 ) 1 1
+ /* 2890 */ ( 112 699 ) 0 1
+ /* 2891 */ ( 700 712 ) 1 1
+ /* 2892 */ ( 694 704 ) 0 1
+ /* 2893 */ ( 105 592 ) 0 1
+ /* 2894 */ ( 590 704 ) 1 1
+ /* 2895 */ ( 550 584 ) 0 1
+ /* 2896 */ ( 104 555 ) 0 1
+ /* 2897 */ ( 556 592 ) 1 1
+ /* 2898 */ ( 73 688 ) 0 1
+ /* 2899 */ ( 3892 3919 ) 1 2
+ /* 2900 */ ( 3838 3865 ) 1 1
+ /* 2901 */ ( 3866 3838 ) 0 1
+ /* 2902 */ ( 3838 3684 ) 0 1
+ /* 2903 */ ( 3712 3866 ) 0 1
+ /* 2904 */ ( 650 74 ) 0 1
+ /* 2905 */ ( 33 640 ) 0 1
+ /* 2906 */ ( 5336 5273 ) 0 1
+ /* 2907 */ ( 4140 4231 ) 0 1
+ /* 2908 */ ( 4231 5336 ) 0 1
+ /* 2909 */ ( 5273 4140 ) 0 1
+ /* 2910 */ ( 4177 4182 ) 0 1
+ /* 2911 */ ( 4183 4176 ) 1 1
+ /* 2912 */ ( 4169 4140 ) 1 1
+ /* 2913 */ ( 4091 4119 ) 1 2
+ /* 2914 */ ( 3969 4119 ) 0 1
+ /* 2915 */ ( 4091 3892 ) 0 1
+ /* 2916 */ ( 682 544 ) 0 1
+ /* 2917 */ ( 682 645 ) 1 1
+ /* 2918 */ ( 646 65 ) 0 1
+ /* 2919 */ ( 646 532 ) 1 1
+ /* 2920 */ ( 530 66 ) 0 1
+ /* 2921 */ ( 526 536 ) 0 1
+ /* 2922 */ ( 634 520 ) 0 1
+ /* 2923 */ ( 4187 4190 ) 0 1
+ /* 2924 */ ( 4191 4185 ) 1 1
+ /* 2925 */ ( 18 512 ) 0 1
+ /* 2926 */ ( 176 483 ) 0 1
+ /* 2927 */ ( 137 472 ) 0 1
+ /* 2928 */ ( 470 608 ) 1 1
+ /* 2929 */ ( 478 169 ) 0 1
+ /* 2930 */ ( 466 328 ) 0 1
+ /* 2931 */ ( 478 340 ) 1 1
+ /* 2932 */ ( 338 170 ) 0 1
+ /* 2933 */ ( 598 436 ) 1 1
+ /* 2934 */ ( 434 138 ) 0 1
+ /* 2935 */ ( 97 424 ) 0 1
+ /* 2936 */ ( 422 584 ) 1 1
+ /* 2937 */ ( 96 411 ) 0 1
+ /* 2938 */ ( 412 424 ) 1 1
+ /* 2939 */ ( 466 429 ) 1 1
+ /* 2940 */ ( 430 129 ) 0 1
+ /* 2941 */ ( 430 316 ) 1 1
+ /* 2942 */ ( 314 130 ) 0 1
+ /* 2943 */ ( 406 416 ) 0 1
+ /* 2944 */ ( 89 304 ) 0 1
+ /* 2945 */ ( 302 416 ) 1 1
+ /* 2946 */ ( 334 1114 ) 0 1
+ /* 2947 */ ( 322 120 ) 0 1
+ /* 2948 */ ( 3313 3277 ) 1 1
+ /* 2949 */ ( 3277 3264 ) 0 1
+ /* 2950 */ ( 3192 3206 ) 1 1
+ /* 2951 */ ( 3262 3261 ) 1 1
+ /* 2952 */ ( 3190 3192 ) 1 1
+ /* 2953 */ ( 322 309 ) 1 1
+ /* 2954 */ ( 310 121 ) 0 1
+ /* 2955 */ ( 262 296 ) 0 1
+ /* 2956 */ ( 88 267 ) 0 1
+ /* 2957 */ ( 268 304 ) 1 1
+ /* 2958 */ ( 57 400 ) 0 1
+ /* 2959 */ ( 398 536 ) 1 1
+ /* 2960 */ ( 526 364 ) 1 1
+ /* 2961 */ ( 362 58 ) 0 1
+ /* 2962 */ ( 394 256 ) 0 1
+ /* 2963 */ ( 394 357 ) 1 1
+ /* 2964 */ ( 358 49 ) 0 1
+ /* 2965 */ ( 358 244 ) 1 1
+ /* 2966 */ ( 242 50 ) 0 1
+ /* 2967 */ ( 17 352 ) 0 1
+ /* 2968 */ ( 350 512 ) 1 1
+ /* 2969 */ ( 4197 4200 ) 0 1
+ /* 2970 */ ( 4201 4196 ) 1 1
+ /* 2971 */ ( 4196 4191 ) 1 1
+ /* 2972 */ ( 4194 4195 ) 1 1
+ /* 2973 */ ( 346 232 ) 0 1
+ /* 2974 */ ( 4207 4210 ) 0 1
+ /* 2975 */ ( 4211 4206 ) 1 1
+ /* 2976 */ ( 4206 4201 ) 1 1
+ /* 2977 */ ( 4204 4205 ) 1 1
+ /* 2978 */ ( 238 248 ) 0 1
+ /* 2979 */ ( 2 224 ) 0 1
+ /* 2980 */ ( 4231 4216 ) 1 1
+ /* 2981 */ ( 4217 4138 ) 0 1
+ /* 2982 */ ( 4216 4211 ) 1 1
+ /* 2983 */ ( 4214 4215 ) 1 1
+ /* 2984 */ ( 4138 4125 ) 1 1
+ /* 2985 */ ( 3277 4138 ) 0 1
+ /* 2986 */ ( 4125 3313 ) 0 1
}
nodes {
( 0 -546.3999023438 )
@@ -4556,7 +9006,12 @@ collisionModel "worldMap" {
( -1 0 )
( -1 0 )
}
- polygons /* polygonMemory = */ 74708 {
+ polygons /* polygonMemory = */ 89944 {
+ 4 ( 2986 2948 2985 2984 ) ( 0 0 1 ) 0 ( 4932 -4160 0 ) ( 11832 4544 0 ) "textures/common/caulk"
+ 4 ( 2909 2907 2908 2906 ) ( 0 0 1 ) 0 ( -20936 5056 0 ) ( 11832 13760 0 ) "textures/common/caulk"
+ 4 ( 2981 2850 2980 2849 ) ( 0 0 1 ) 0 ( 4664 4544 0 ) ( 11832 5056 0 ) "textures/common/caulk"
+ 4 ( 2983 2848 2982 2847 ) ( 0 0 1 ) 0 ( 3640 4776 0 ) ( 4664 5056 0 ) "textures/common/caulk"
+ 4 ( 2975 2845 2974 2846 ) ( 0 0 1 ) 0 ( 2616 4544 0 ) ( 3640 5056 0 ) "textures/common/caulk"
4 ( -3 11 -7 -9 ) ( -0 1 0 ) 4776 ( 3319.2001953125 4776 0 ) ( 4932 4776 8 ) "textures/mars_citybuilder/mars_dirt"
4 ( -4 9 -6 10 ) ( 1 0 0 ) 4932 ( 4932 3252.7998046875 0 ) ( 4932 4776 8 ) "textures/mars_citybuilder/mars_dirt"
4 ( 5 6 7 8 ) ( -0 0 1 ) 8 ( 3319.2001953125 3252.7998046875 8 ) ( 4932 4776 8 ) "textures/mars_citybuilder/mars_dirt"
@@ -4574,7 +9029,7 @@ collisionModel "worldMap" {
4 ( 1191 -300 1192 1193 ) ( 0 0 -1 ) 0 ( 3191.2001953125 2740.7998046875 0 ) ( 4932 3124.7998046875 0 ) "textures/mars_citybuilder/mars_road_dusty_center"
4 ( -1781 1784 1785 -11 ) ( -0 1 0 ) 4776 ( 3191.2001953125 4776 0 ) ( 3319.2001953125 4776 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( 1782 -8 1783 -1764 ) ( -0 0 1 ) 8 ( 3207.2001953125 3252.7998046875 8 ) ( 3319.2001953125 4776 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
- 4 ( 2551 273 -1919 1781 ) ( 0 0 -1 ) 0 ( 3191.2001953125 3124.7998046875 0 ) ( 3319.2001953125 4776 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
+ 4 ( 2979 273 -1919 1781 ) ( 0 0 -1 ) 0 ( 3191.2001953125 3124.7998046875 0 ) ( 3319.2001953125 4776 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( 1768 -1763 -1760 -1767 ) ( -1 0 0 ) -3191.2001953125 ( 3191.2001953125 3252.7998046875 8 ) ( 3191.2001953125 4776 14 ) "textures/base_wall/steel"
4 ( 1766 1767 -1759 -1765 ) ( -0 1 0 ) 4776 ( 3191.2001953125 4776 8 ) ( 3207.2001953125 4776 14 ) "textures/base_wall/steel"
4 ( 1764 1765 -1758 -1762 ) ( 1 0 0 ) 3207.2001953125 ( 3207.2001953125 3252.7998046875 8 ) ( 3207.2001953125 4776 14 ) "textures/base_wall/steel"
@@ -4597,7 +9052,7 @@ collisionModel "worldMap" {
4 ( 297 298 299 300 ) ( 0 0 -1 ) 0 ( 2807.2001953125 2740.7998046875 0 ) ( 3191.2001953125 3124.7998046875 0 ) "textures/mars_citybuilder/mars_road_dusty_intersection"
4 ( 1080 1081 -1074 -1078 ) ( 1 0 0 ) 2679.2001953125 ( 2679.2001953125 3124.7995605469 8 ) ( 2679.2001953125 3140.7995605469 14 ) "textures/base_wall/steel"
4 ( 281 282 283 284 ) ( -0 0 1 ) 8 ( 2679.2001953125 3124.7998046875 8 ) ( 2807.2001953125 3252.7998046875 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
- 4 ( -1198 437 2549 280 ) ( 0 0 -1 ) 0 ( 1258.400390625 3124.7998046875 0 ) ( 2807.2001953125 3252.7998046875 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
+ 4 ( -1198 437 2973 280 ) ( 0 0 -1 ) 0 ( 1258.400390625 3124.7998046875 0 ) ( 2807.2001953125 3252.7998046875 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( 1199 -304 1200 -466 ) ( -0 0 1 ) 8 ( 1258.400390625 2740.7998046875 8 ) ( 2807.2001953125 3124.7998046875 8 ) "textures/mars_citybuilder/mars_road_dusty_center"
4 ( 1197 -464 1198 -298 ) ( 0 0 -1 ) 0 ( 1258.400390625 2740.7998046875 0 ) ( 2807.2001953125 3124.7998046875 0 ) "textures/mars_citybuilder/mars_road_dusty_center"
4 ( -1068 1071 1072 -61 ) ( 1 0 0 ) 4932 ( 4932 2612.7998046875 0 ) ( 4932 2740.7998046875 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
@@ -4642,7 +9097,7 @@ collisionModel "worldMap" {
4 ( -250 -258 -256 -260 ) ( -1 0 0 ) -3179.2001953125 ( 3179.2001953125 2691.7998046875 112 ) ( 3179.2001953125 2701.7998046875 136 ) "textures/base_wall/greenpanel1"
4 ( -237 245 -241 246 ) ( -0 -1 -0 ) -2640.7998046875 ( 3230.2001953125 2640.7998046875 140 ) ( 3240.2001953125 2640.7998046875 164 ) "textures/base_wall/greenpanel1"
4 ( 287 288 289 290 ) ( -0 0 1 ) 8 ( 3191.2001953125 2612.7998046875 8 ) ( 3319.2001953125 2740.7998046875 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
- 4 ( 2550 305 -1924 285 ) ( 0 0 -1 ) 0 ( 3191.2001953125 1281.599609375 0 ) ( 3319.2001953125 2740.7998046875 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
+ 4 ( 2978 305 -1924 285 ) ( 0 0 -1 ) 0 ( 3191.2001953125 1281.599609375 0 ) ( 3319.2001953125 2740.7998046875 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( 265 266 267 -262 ) ( 1 0 0 ) 3239.2001953125 ( 3239.2001953125 2692.7998046875 8 ) ( 3239.2001953125 2700.7998046875 112 ) "textures/base_wall/steel"
4 ( -335 1925 -301 1926 ) ( -0 0 1 ) 8 ( 2807.2001953125 1281.599609375 8 ) ( 3191.2001953125 2740.7998046875 8 ) "textures/mars_citybuilder/mars_road_dusty_center_east_west"
4 ( -331 1923 -297 1924 ) ( 0 0 -1 ) 0 ( 2807.2001953125 1281.599609375 0 ) ( 3191.2001953125 2740.7998046875 0 ) "textures/mars_citybuilder/mars_road_dusty_center_east_west"
@@ -4653,7 +9108,7 @@ collisionModel "worldMap" {
4 ( 1813 1814 -1806 -1812 ) ( -0 1 0 ) 2612.7998046875 ( 2791.2001953125 2612.7998046875 8 ) ( 2807.2001953125 2612.7998046875 14 ) "textures/base_wall/steel"
4 ( 1092 1093 -1086 -1090 ) ( 1 0 0 ) 2679.2001953125 ( 2679.2001953125 2724.7995605469 8 ) ( 2679.2001953125 2740.7995605469 14 ) "textures/base_wall/steel"
4 ( 293 294 295 296 ) ( -0 0 1 ) 8 ( 2679.2001953125 2612.7998046875 8 ) ( 2807.2001953125 2740.7998046875 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
- 4 ( 2546 -450 2545 292 ) ( 0 0 -1 ) 0 ( 1386.400390625 2612.7998046875 0 ) ( 2807.2001953125 2740.7998046875 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
+ 4 ( 2966 -450 2965 292 ) ( 0 0 -1 ) 0 ( 1386.400390625 2612.7998046875 0 ) ( 2807.2001953125 2740.7998046875 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( 1816 -60 1817 -1799 ) ( -0 0 1 ) 8 ( 3207.2001953125 1409.599609375 8 ) ( 3319.2001953125 2612.7998046875 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( 1803 -1798 -1795 -1802 ) ( -1 0 0 ) -3191.2001953125 ( 3191.2001953125 1409.599609375 8 ) ( 3191.2001953125 2612.7998046875 14 ) "textures/base_wall/steel"
4 ( 1799 1800 -1793 -1797 ) ( 1 0 0 ) 3207.2001953125 ( 3207.2001953125 1409.599609375 8 ) ( 3207.2001953125 2612.7998046875 14 ) "textures/base_wall/steel"
@@ -4670,18 +9125,20 @@ collisionModel "worldMap" {
4 ( 329 330 331 332 ) ( 0 0 -1 ) 0 ( 2807.2001953125 897.599609375 0 ) ( 3191.2001953125 1281.599609375 0 ) "textures/mars_citybuilder/mars_road_dusty_intersection"
4 ( 1830 1831 -1823 -1829 ) ( -0 1 0 ) 769.599609375 ( 3191.2001953125 769.599609375 8 ) ( 3207.2001953125 769.599609375 14 ) "textures/base_wall/steel"
4 ( 319 320 321 322 ) ( -0 0 1 ) 8 ( 3191.2001953125 769.599609375 8 ) ( 3319.2001953125 897.599609375 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
- 4 ( 2535 373 -1928 317 ) ( 0 0 -1 ) 0 ( 3191.2001953125 -561.6000976562 0 ) ( 3319.2001953125 897.599609375 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
+ 4 ( 2955 373 -1928 317 ) ( 0 0 -1 ) 0 ( 3191.2001953125 -561.6000976562 0 ) ( 3319.2001953125 897.599609375 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( -403 1929 -333 1930 ) ( -0 0 1 ) 8 ( 2807.2001953125 -561.6000976562 8 ) ( 3191.2001953125 897.599609375 8 ) "textures/mars_citybuilder/mars_road_dusty_center_east_west"
4 ( -399 1927 -329 1928 ) ( 0 0 -1 ) 0 ( 2807.2001953125 -561.6000976562 0 ) ( 3191.2001953125 897.599609375 0 ) "textures/mars_citybuilder/mars_road_dusty_center_east_west"
4 ( 1258 1259 -1252 -1256 ) ( 1 0 0 ) 2679.2001953125 ( 2679.2001953125 1281.5994873047 8 ) ( 2679.2001953125 1297.5994873047 14 ) "textures/base_wall/steel"
4 ( 313 314 315 316 ) ( -0 0 1 ) 8 ( 2679.2001953125 1281.599609375 8 ) ( 2807.2001953125 1409.599609375 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
- 4 ( -1380 505 2542 312 ) ( 0 0 -1 ) 0 ( 1258.400390625 1281.599609375 0 ) ( 2807.2001953125 1409.599609375 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
+ 4 ( -1380 505 2962 312 ) ( 0 0 -1 ) 0 ( 1258.400390625 1281.599609375 0 ) ( 2807.2001953125 1409.599609375 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( 1381 -336 1382 -534 ) ( -0 0 1 ) 8 ( 1258.400390625 897.599609375 8 ) ( 2807.2001953125 1281.599609375 8 ) "textures/mars_citybuilder/mars_road_dusty_center"
4 ( 1379 -532 1380 -330 ) ( 0 0 -1 ) 0 ( 1258.400390625 897.599609375 0 ) ( 2807.2001953125 1281.599609375 0 ) "textures/mars_citybuilder/mars_road_dusty_center"
4 ( 1842 1843 -1835 -1841 ) ( -0 1 0 ) 769.599609375 ( 2791.2001953125 769.599609375 8 ) ( 2807.2001953125 769.599609375 14 ) "textures/base_wall/steel"
4 ( 1270 1271 -1264 -1268 ) ( 1 0 0 ) 2679.2001953125 ( 2679.2001953125 881.5995483398 8 ) ( 2679.2001953125 897.5995483398 14 ) "textures/base_wall/steel"
4 ( 325 326 327 328 ) ( -0 0 1 ) 8 ( 2679.2001953125 769.599609375 8 ) ( 2807.2001953125 897.599609375 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
- 4 ( 2537 -379 2536 324 ) ( 0 0 -1 ) 0 ( 2679.2001953125 -433.6000976562 0 ) ( 2807.2001953125 897.599609375 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
+ 4 ( 2957 -379 2956 324 ) ( 0 0 -1 ) 0 ( 2679.2001953125 -433.6000976562 0 ) ( 2807.2001953125 897.599609375 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
+ 4 ( 2970 2841 2969 2842 ) ( 0 0 1 ) 0 ( 568 4544 0 ) ( 1592 5056 0 ) "textures/common/caulk"
+ 4 ( 2977 2844 2976 2843 ) ( 0 0 1 ) 0 ( 1592 4776 0 ) ( 2616 5056 0 ) "textures/common/caulk"
4 ( -14 20 -18 21 ) ( -0 1 0 ) 4776 ( 1386.400390625 4776 0 ) ( 2679.2001953125 4776 8 ) "textures/mars_citybuilder/mars_dirt"
4 ( 16 17 18 19 ) ( -0 0 1 ) 8 ( 1386.400390625 3252.7998046875 8 ) ( 2679.2001953125 4776 8 ) "textures/mars_citybuilder/mars_dirt"
4 ( 12 13 14 15 ) ( 0 0 -1 ) 0 ( 1386.400390625 3252.7998046875 0 ) ( 2679.2001953125 4776 0 ) "textures/mars_citybuilder/mars_dirt"
@@ -4712,12 +9169,14 @@ collisionModel "worldMap" {
4 ( 1962 1963 -1955 -1961 ) ( -0 1 0 ) 4776 ( 858.400390625 4776 8 ) ( 874.400390625 4776 14 ) "textures/base_wall/steel"
4 ( 1957 1958 -1953 1959 ) ( -0 -1 -0 ) -3252.7998046875 ( 858.400390625 3252.7998046875 8 ) ( 874.400390625 3252.7998046875 14 ) "textures/base_wall/steel"
4 ( 1953 1954 1955 1956 ) ( -0 0 1 ) 14 ( 858.400390625 3252.7998046875 14 ) ( 874.400390625 4776 14 ) "textures/base_wall/steel"
+ 4 ( 2972 2840 2971 2839 ) ( 0 0 1 ) 0 ( -456 4776 0 ) ( 568 5056 0 ) "textures/common/caulk"
+ 4 ( 2924 2837 2923 2838 ) ( 0 0 1 ) 0 ( -1480 4544 0 ) ( -456 5056 0 ) "textures/common/caulk"
4 ( -24 30 -28 31 ) ( -0 1 0 ) 4776 ( -546.3999023438 4776 0 ) ( 746.400390625 4776 8 ) "textures/mars_citybuilder/mars_dirt"
4 ( 26 27 28 29 ) ( -0 0 1 ) 8 ( -546.3999023438 3252.7998046875 8 ) ( 746.400390625 4776 8 ) "textures/mars_citybuilder/mars_dirt"
4 ( 22 23 24 25 ) ( 0 0 -1 ) 0 ( -546.3999023438 3252.7998046875 0 ) ( 746.400390625 4776 0 ) "textures/mars_citybuilder/mars_dirt"
4 ( 1108 1109 -1102 -1106 ) ( 1 0 0 ) 746.400390625 ( 746.400390625 3124.7998046875 8 ) ( 746.400390625 3140.7998046875 14 ) "textures/base_wall/steel"
4 ( 445 446 447 448 ) ( -0 0 1 ) 8 ( 746.400390625 3124.7998046875 8 ) ( 874.400390625 3252.7998046875 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
- 4 ( 2548 -674 2547 444 ) ( 0 0 -1 ) 0 ( -546.3999023438 3124.7998046875 0 ) ( 874.400390625 3252.7998046875 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
+ 4 ( 2968 -674 2967 444 ) ( 0 0 -1 ) 0 ( -546.3999023438 3124.7998046875 0 ) ( 874.400390625 3252.7998046875 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( 1203 -468 1204 -702 ) ( -0 0 1 ) 8 ( -674.3999023438 2740.7998046875 8 ) ( 874.400390625 3124.7998046875 8 ) "textures/mars_citybuilder/mars_road_dusty_center"
4 ( 1201 -700 1202 -462 ) ( 0 0 -1 ) -0 ( -674.3999023438 2740.7998046875 0 ) ( 874.400390625 3124.7998046875 0 ) "textures/mars_citybuilder/mars_road_dusty_center"
4 ( 1125 -26 1126 -1110 ) ( -0 0 1 ) 8 ( -546.3999023438 3140.7998046875 8 ) ( 746.400390625 3252.7998046875 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
@@ -4737,7 +9196,7 @@ collisionModel "worldMap" {
4 ( -531 2103 -461 2104 ) ( 0 0 -1 ) 0 ( 874.400390625 1281.599609375 0 ) ( 1258.400390625 2740.7998046875 0 ) "textures/mars_citybuilder/mars_road_dusty_center_east_west"
4 ( 1986 1987 -1979 -1985 ) ( -0 1 0 ) 2612.7998046875 ( 1258.400390625 2612.7998046875 8 ) ( 1274.400390625 2612.7998046875 14 ) "textures/base_wall/steel"
4 ( 451 452 453 454 ) ( -0 0 1 ) 8 ( 1258.400390625 2612.7998046875 8 ) ( 1386.400390625 2740.7998046875 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
- 4 ( 2544 -506 2543 449 ) ( 0 0 -1 ) 0 ( 1258.400390625 1409.599609375 0 ) ( 1386.400390625 2740.7998046875 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
+ 4 ( 2964 -506 2963 449 ) ( 0 0 -1 ) 0 ( 1258.400390625 1409.599609375 0 ) ( 1386.400390625 2740.7998046875 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( 2001 -70 2002 -1984 ) ( -0 0 1 ) 8 ( 1274.400390625 1409.599609375 8 ) ( 1386.400390625 2612.7998046875 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( 1988 -1983 -1980 -1987 ) ( -1 0 0 ) -1258.400390625 ( 1258.400390625 1409.599609375 8 ) ( 1258.400390625 2612.7998046875 14 ) "textures/base_wall/steel"
4 ( 1984 1985 -1978 -1982 ) ( 1 0 0 ) 1274.400390625 ( 1274.400390625 1409.599609375 8 ) ( 1274.400390625 2612.7998046875 14 ) "textures/base_wall/steel"
@@ -4770,7 +9229,7 @@ collisionModel "worldMap" {
4 ( -482 -490 -488 -492 ) ( -1 0 0 ) -1246.400390625 ( 1246.400390625 848.599609375 112 ) ( 1246.400390625 858.599609375 136 ) "textures/base_wall/greenpanel1"
4 ( -469 477 -473 478 ) ( -0 -1 -0 ) -797.599609375 ( 1297.400390625 797.599609375 140 ) ( 1307.400390625 797.599609375 164 ) "textures/base_wall/greenpanel1"
4 ( 519 520 521 522 ) ( -0 0 1 ) 8 ( 1258.400390625 769.599609375 8 ) ( 1386.400390625 897.599609375 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
- 4 ( 2528 537 -2108 517 ) ( 0 0 -1 ) 0 ( 1258.400390625 -561.6000976562 0 ) ( 1386.400390625 897.599609375 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
+ 4 ( 2943 537 -2108 517 ) ( 0 0 -1 ) 0 ( 1258.400390625 -561.6000976562 0 ) ( 1386.400390625 897.599609375 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( 497 498 499 -494 ) ( 1 0 0 ) 1306.400390625 ( 1306.400390625 849.599609375 8 ) ( 1306.400390625 857.599609375 112 ) "textures/base_wall/steel"
4 ( -567 2109 -533 2110 ) ( -0 0 1 ) 8 ( 874.400390625 -561.6000976562 8 ) ( 1258.400390625 897.599609375 8 ) "textures/mars_citybuilder/mars_road_dusty_center_east_west"
4 ( -563 2107 -529 2108 ) ( 0 0 -1 ) 0 ( 874.400390625 -561.6000976562 0 ) ( 1258.400390625 897.599609375 0 ) "textures/mars_citybuilder/mars_road_dusty_center_east_west"
@@ -4781,7 +9240,7 @@ collisionModel "worldMap" {
4 ( 1998 1999 -1991 -1997 ) ( -0 1 0 ) 2612.7998046875 ( 858.400390625 2612.7998046875 8 ) ( 874.400390625 2612.7998046875 14 ) "textures/base_wall/steel"
4 ( 1120 1121 -1114 -1118 ) ( 1 0 0 ) 746.400390625 ( 746.400390625 2724.7998046875 8 ) ( 746.400390625 2740.7998046875 14 ) "textures/base_wall/steel"
4 ( 457 458 459 460 ) ( -0 0 1 ) 8 ( 746.400390625 2612.7998046875 8 ) ( 874.400390625 2740.7998046875 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
- 4 ( 2541 -686 2540 456 ) ( 0 0 -1 ) 0 ( -546.3999023438 2612.7998046875 0 ) ( 874.400390625 2740.7998046875 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
+ 4 ( 2961 -686 2960 456 ) ( 0 0 -1 ) 0 ( -546.3999023438 2612.7998046875 0 ) ( 874.400390625 2740.7998046875 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( 1996 1997 -1990 -1994 ) ( 1 0 0 ) 874.400390625 ( 874.400390625 1409.599609375 8 ) ( 874.400390625 2612.7998046875 14 ) "textures/base_wall/steel"
4 ( 2004 -2000 2005 -76 ) ( -0 0 1 ) 8 ( 746.400390625 1409.599609375 8 ) ( 858.400390625 2612.7998046875 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( -511 -74 -455 2003 ) ( 0 0 -1 ) 0 ( 746.400390625 1409.599609375 0 ) ( 874.400390625 2612.7998046875 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
@@ -4796,13 +9255,13 @@ collisionModel "worldMap" {
4 ( 71 72 73 74 ) ( 0 0 -1 ) 0 ( -546.3999023438 1409.599609375 0 ) ( 746.400390625 2612.7998046875 0 ) "textures/mars_citybuilder/mars_dirt"
4 ( 1287 1288 -1281 -1285 ) ( 1 0 0 ) 746.400390625 ( 746.400390625 1281.599609375 8 ) ( 746.400390625 1297.599609375 14 ) "textures/base_wall/steel"
4 ( 513 514 515 516 ) ( -0 0 1 ) 8 ( 746.400390625 1281.599609375 8 ) ( 874.400390625 1409.599609375 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
- 4 ( 2539 -706 2538 512 ) ( 0 0 -1 ) 0 ( -546.3999023438 1281.599609375 0 ) ( 874.400390625 1409.599609375 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
+ 4 ( 2959 -706 2958 512 ) ( 0 0 -1 ) 0 ( -546.3999023438 1281.599609375 0 ) ( 874.400390625 1409.599609375 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( 1385 -536 1386 -734 ) ( -0 0 1 ) 8 ( -674.3999023438 897.599609375 8 ) ( 874.400390625 1281.599609375 8 ) "textures/mars_citybuilder/mars_road_dusty_center"
4 ( 1383 -732 1384 -530 ) ( 0 0 -1 ) -0 ( -674.3999023438 897.599609375 0 ) ( 874.400390625 1281.599609375 0 ) "textures/mars_citybuilder/mars_road_dusty_center"
4 ( 2027 2028 -2020 -2026 ) ( -0 1 0 ) 769.599609375 ( 858.400390625 769.599609375 8 ) ( 874.400390625 769.599609375 14 ) "textures/base_wall/steel"
4 ( 1299 1300 -1293 -1297 ) ( 1 0 0 ) 746.400390625 ( 746.400390625 881.599609375 8 ) ( 746.400390625 897.599609375 14 ) "textures/base_wall/steel"
4 ( 525 526 527 528 ) ( -0 0 1 ) 8 ( 746.400390625 769.599609375 8 ) ( 874.400390625 897.599609375 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
- 4 ( 2523 -543 2522 524 ) ( 0 0 -1 ) 0 ( 746.400390625 -433.6000976562 0 ) ( 874.400390625 897.599609375 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
+ 4 ( 2938 -543 2937 524 ) ( 0 0 -1 ) 0 ( 746.400390625 -433.6000976562 0 ) ( 874.400390625 897.599609375 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( 1304 -75 1305 -1289 ) ( -0 0 1 ) 8 ( -546.3999023438 1297.599609375 8 ) ( 746.400390625 1409.599609375 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( 1291 -1286 -1283 -1290 ) ( -1 0 0 ) 546.3999023438 ( -546.3999023438 1281.599609375 8 ) ( -546.3999023438 1297.599609375 14 ) "textures/base_wall/steel"
4 ( 1289 1290 -1282 -1288 ) ( -0 1 0 ) 1297.599609375 ( -546.3999023438 1297.599609375 8 ) ( 746.400390625 1297.599609375 14 ) "textures/base_wall/steel"
@@ -4844,7 +9303,7 @@ collisionModel "worldMap" {
4 ( 397 398 399 400 ) ( 0 0 -1 ) 0 ( 2807.2001953125 -945.6000976562 0 ) ( 3191.2001953125 -561.6000976562 0 ) "textures/mars_citybuilder/mars_road_dusty_intersection"
4 ( 1440 1441 -1434 -1438 ) ( 1 0 0 ) 2679.2001953125 ( 2679.2001953125 -561.6000366211 8 ) ( 2679.2001953125 -545.6000366211 14 ) "textures/base_wall/steel"
4 ( 381 382 383 384 ) ( -0 0 1 ) 8 ( 2679.2001953125 -561.6000976562 8 ) ( 2807.2001953125 -433.6000976562 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
- 4 ( 2530 -538 2529 380 ) ( 0 0 -1 ) 0 ( 1386.400390625 -561.6000976562 0 ) ( 2807.2001953125 -433.6000976562 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
+ 4 ( 2945 -538 2944 380 ) ( 0 0 -1 ) 0 ( 1386.400390625 -561.6000976562 0 ) ( 2807.2001953125 -433.6000976562 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( 1561 -404 1562 -566 ) ( -0 0 1 ) 8 ( 1258.400390625 -945.6000976562 8 ) ( 2807.2001953125 -561.6000976562 8 ) "textures/mars_citybuilder/mars_road_dusty_center"
4 ( 1559 -564 1560 -398 ) ( 0 0 -1 ) 0 ( 1258.400390625 -945.6000976562 0 ) ( 2807.2001953125 -561.6000976562 0 ) "textures/mars_citybuilder/mars_road_dusty_center"
4 ( -1428 1431 1432 -149 ) ( 1 0 0 ) 4932 ( 4932 -1073.6000976562 0 ) ( 4932 -945.6000976562 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
@@ -4870,7 +9329,7 @@ collisionModel "worldMap" {
4 ( -350 -358 -356 -360 ) ( -1 0 0 ) -3179.2001953125 ( 3179.2001953125 -994.6000976562 112 ) ( 3179.2001953125 -984.6000976562 136 ) "textures/base_wall/greenpanel1"
4 ( -337 345 -341 346 ) ( -0 -1 -0 ) 1045.6000976562 ( 3230.2001953125 -1045.6000976562 140 ) ( 3240.2001953125 -1045.6000976562 164 ) "textures/base_wall/greenpanel1"
4 ( 387 388 389 390 ) ( -0 0 1 ) 8 ( 3191.2001953125 -1073.6000976562 8 ) ( 3319.2001953125 -945.6000976562 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
- 4 ( 2534 -406 2533 385 ) ( 0 0 -1 ) 0 ( 3191.2001953125 -2276.8000488281 0 ) ( 3319.2001953125 -945.6000976562 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
+ 4 ( 2954 -406 2953 385 ) ( 0 0 -1 ) 0 ( 3191.2001953125 -2276.8000488281 0 ) ( 3319.2001953125 -945.6000976562 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( 365 366 367 -362 ) ( 1 0 0 ) 3239.2001953125 ( 3239.2001953125 -993.6000976562 8 ) ( 3239.2001953125 -985.6000976562 112 ) "textures/base_wall/steel"
4 ( -435 1933 -401 1934 ) ( -0 0 1 ) 8 ( 2807.2001953125 -2404.8000488281 8 ) ( 3191.2001953125 -945.6000976562 8 ) "textures/mars_citybuilder/mars_road_dusty_center_east_west"
4 ( -431 1931 -397 1932 ) ( 0 0 -1 ) 0 ( 2807.2001953125 -2404.8000488281 0 ) ( 3191.2001953125 -945.6000976562 0 ) "textures/mars_citybuilder/mars_road_dusty_center_east_west"
@@ -4881,7 +9340,7 @@ collisionModel "worldMap" {
4 ( 1870 1871 -1863 -1869 ) ( -0 1 0 ) -1073.6000976562 ( 2791.2001953125 -1073.6000976562 8 ) ( 2807.2001953125 -1073.6000976562 14 ) "textures/base_wall/steel"
4 ( 1452 1453 -1446 -1450 ) ( 1 0 0 ) 2679.2001953125 ( 2679.2001953125 -961.6000366211 8 ) ( 2679.2001953125 -945.6000366211 14 ) "textures/base_wall/steel"
4 ( 393 394 395 396 ) ( -0 0 1 ) 8 ( 2679.2001953125 -1073.6000976562 8 ) ( 2807.2001953125 -945.6000976562 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
- 4 ( 2527 -550 2526 392 ) ( 0 0 -1 ) 0 ( 1386.400390625 -1073.6000976562 0 ) ( 2807.2001953125 -945.6000976562 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
+ 4 ( 2942 -550 2941 392 ) ( 0 0 -1 ) 0 ( 1386.400390625 -1073.6000976562 0 ) ( 2807.2001953125 -945.6000976562 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( 1873 -148 1874 -1856 ) ( -0 0 1 ) 8 ( 3207.2001953125 -2276.8000488281 8 ) ( 3319.2001953125 -1073.6000976562 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( 1860 -1855 -1852 -1859 ) ( -1 0 0 ) -3191.2001953125 ( 3191.2001953125 -2276.8000488281 8 ) ( 3191.2001953125 -1073.6000976562 14 ) "textures/base_wall/steel"
4 ( 1856 1857 -1850 -1854 ) ( 1 0 0 ) 3207.2001953125 ( 3207.2001953125 -2276.8000488281 8 ) ( 3207.2001953125 -1073.6000976562 14 ) "textures/base_wall/steel"
@@ -4895,7 +9354,7 @@ collisionModel "worldMap" {
4 ( 1861 1862 1863 1864 ) ( -0 0 1 ) 14 ( 2791.2001953125 -2276.8000488281 14 ) ( 2807.2001953125 -1073.6000976562 14 ) "textures/base_wall/steel"
4 ( -1601 -150 1604 1605 ) ( 1 0 0 ) 4932 ( 4932 -2404.8000488281 0 ) ( 4932 -2276.8000488281 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( 1602 -145 1603 -1586 ) ( -0 0 1 ) 8 ( 3319.2001953125 -2388.8000488281 8 ) ( 4932 -2276.8000488281 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
- 4 ( -1734 405 2532 1601 ) ( 0 0 -1 ) 0 ( 3191.2001953125 -2404.8000488281 0 ) ( 4932 -2276.8000488281 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
+ 4 ( -1734 405 2947 1601 ) ( 0 0 -1 ) 0 ( 3191.2001953125 -2404.8000488281 0 ) ( 4932 -2276.8000488281 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( 1588 -1583 -1580 -1587 ) ( -1 0 0 ) -3319.2001953125 ( 3319.2001953125 -2404.8000488281 8 ) ( 3319.2001953125 -2388.8000488281 14 ) "textures/base_wall/steel"
4 ( 1586 1587 -1579 -1585 ) ( -0 1 0 ) -2388.8000488281 ( 3319.2001953125 -2388.8000488281 8 ) ( 4932 -2388.8000488281 14 ) "textures/base_wall/steel"
4 ( 1584 1585 -1578 -1582 ) ( 1 0 0 ) 4932 ( 4932 -2404.8000488281 8 ) ( 4932 -2388.8000488281 14 ) "textures/base_wall/steel"
@@ -4912,6 +9371,11 @@ collisionModel "worldMap" {
4 ( 1596 1597 -1590 -1594 ) ( 1 0 0 ) 4932 ( 4932 -2804.8000488281 8 ) ( 4932 -2788.8000488281 14 ) "textures/base_wall/steel"
4 ( 1593 1594 -1589 1595 ) ( -0 -1 -0 ) 2804.8000488281 ( 3319.2001953125 -2804.8000488281 8 ) ( 4932 -2804.8000488281 14 ) "textures/base_wall/steel"
4 ( 1589 1590 1591 1592 ) ( -0 0 1 ) 14 ( 3319.2001953125 -2804.8000488281 14 ) ( 4932 -2788.8000488281 14 ) "textures/base_wall/steel"
+ 4 ( 2950 2511 2949 2510 ) ( 0 0 1 ) 0 ( 4664 -4672 0 ) ( 11832 -4160 0 ) "textures/common/caulk"
+ 4 ( 2952 2509 2951 2508 ) ( 0 0 1 ) 0 ( 3640 -4672 0 ) ( 4664 -4424 0 ) "textures/common/caulk"
+ 4 ( -2489 2505 2506 2507 ) ( 0 0 1 ) 0 ( 3128 -4672 0 ) ( 3640 -4160 0 ) "textures/common/caulk"
+ 4 ( 2855 2487 2854 2490 ) ( 0 0 1 ) 0 ( -4552 -5184 0 ) ( 11832 -4672 0 ) "textures/common/caulk"
+ 4 ( 2862 2860 2861 2859 ) ( 0 0 1 ) 0 ( -20936 -19008 0 ) ( 11832 -5184 0 ) "textures/common/caulk"
4 ( 1909 -194 1910 -1906 ) ( 1 0 0 ) 3319.2001953125 ( 3319.2001953125 -4440 0 ) ( 3319.2001953125 -4424 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( -188 195 -190 -193 ) ( 1 0 0 ) 4932 ( 4932 -4424 0 ) ( 4932 -2916.8000488281 8 ) "textures/mars_citybuilder/mars_dirt"
4 ( -185 193 -189 194 ) ( -0 -1 -0 ) 4424 ( 3319.2001953125 -4424 0 ) ( 4932 -4424 8 ) "textures/mars_citybuilder/mars_dirt"
@@ -4922,10 +9386,10 @@ collisionModel "worldMap" {
4 ( 429 430 431 432 ) ( 0 0 -1 ) 0 ( 2807.2001953125 -2788.8000488281 0 ) ( 3191.2001953125 -2404.8000488281 0 ) "textures/mars_citybuilder/mars_road_dusty_intersection"
4 ( 1887 1888 -1880 -1886 ) ( -0 1 0 ) -2916.8000488281 ( 3191.2001953125 -2916.8000488281 8 ) ( 3207.2001953125 -2916.8000488281 14 ) "textures/base_wall/steel"
4 ( 419 420 421 422 ) ( -0 0 1 ) 8 ( 3191.2001953125 -2916.8000488281 8 ) ( 3319.2001953125 -2788.8000488281 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
- 4 ( 2531 1902 -1937 417 ) ( 0 0 -1 ) 0 ( 3191.2001953125 -4440 0 ) ( 3319.2001953125 -2788.8000488281 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
+ 4 ( 2946 1902 -1937 417 ) ( 0 0 -1 ) 0 ( 3191.2001953125 -4440 0 ) ( 3319.2001953125 -2788.8000488281 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( 1619 1620 -1613 -1617 ) ( 1 0 0 ) 2679.2001953125 ( 2679.2001953125 -2404.7998046875 8 ) ( 2679.2001953125 -2388.7998046875 14 ) "textures/base_wall/steel"
4 ( 413 414 415 416 ) ( -0 0 1 ) 8 ( 2679.2001953125 -2404.8000488281 8 ) ( 2807.2001953125 -2276.8000488281 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
- 4 ( -1740 605 2515 412 ) ( 0 0 -1 ) 0 ( 1258.400390625 -2404.8000488281 0 ) ( 2807.2001953125 -2276.8000488281 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
+ 4 ( -1740 605 2930 412 ) ( 0 0 -1 ) 0 ( 1258.400390625 -2404.8000488281 0 ) ( 2807.2001953125 -2276.8000488281 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( 1741 -436 1742 -634 ) ( -0 0 1 ) 8 ( 1258.400390625 -2788.8000488281 8 ) ( 2807.2001953125 -2404.8000488281 8 ) "textures/mars_citybuilder/mars_road_dusty_center"
4 ( 1739 -632 1740 -430 ) ( 0 0 -1 ) 0 ( 1258.400390625 -2788.8000488281 0 ) ( 2807.2001953125 -2404.8000488281 0 ) "textures/mars_citybuilder/mars_road_dusty_center"
4 ( 1631 1632 -1625 -1629 ) ( 1 0 0 ) 2679.2001953125 ( 2679.2001953125 -2804.7998046875 8 ) ( 2679.2001953125 -2788.7998046875 14 ) "textures/base_wall/steel"
@@ -4933,13 +9397,14 @@ collisionModel "worldMap" {
4 ( 1935 1936 -429 1937 ) ( 0 0 -1 ) -0 ( 2807.1999511719 -4440 0 ) ( 3191.1999511719 -2788.8000488281 0 ) "textures/mars_citybuilder/mars_road_dusty_center_east_west"
4 ( 1899 1900 -1892 -1898 ) ( -0 1 0 ) -2916.8000488281 ( 2791.2001953125 -2916.8000488281 8 ) ( 2807.2001953125 -2916.8000488281 14 ) "textures/base_wall/steel"
4 ( 425 426 427 428 ) ( -0 0 1 ) 8 ( 2679.2001953125 -2916.8000488281 8 ) ( 2807.2001953125 -2788.8000488281 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
- 4 ( 2517 -618 2516 424 ) ( 0 0 -1 ) 0 ( 1386.400390625 -2916.8000488281 0 ) ( 2807.2001953125 -2788.8000488281 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
+ 4 ( 2932 -618 2931 424 ) ( 0 0 -1 ) 0 ( 1386.400390625 -2916.8000488281 0 ) ( 2807.2001953125 -2788.8000488281 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( -1902 1906 1907 1908 ) ( -0 -1 -0 ) 4440 ( 3191.2001953125 -4440 0 ) ( 3319.2001953125 -4440 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( 1903 1904 1905 -1885 ) ( -0 0 1 ) 8 ( 3207.2001953125 -4440 8 ) ( 3319.2001953125 -2916.8000488281 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( 1889 -1884 -1881 -1888 ) ( -1 0 0 ) -3191.2001953125 ( 3191.2001953125 -4440 8 ) ( 3191.2001953125 -2916.8000488281 14 ) "textures/base_wall/steel"
4 ( 1885 1886 -1879 -1883 ) ( 1 0 0 ) 3207.2001953125 ( 3207.2001953125 -4440 8 ) ( 3207.2001953125 -2916.8000488281 14 ) "textures/base_wall/steel"
4 ( 1882 1883 -1878 1884 ) ( -0 -1 -0 ) 4440 ( 3191.2001953125 -4440 8 ) ( 3207.2001953125 -4440 14 ) "textures/base_wall/steel"
4 ( 1878 1879 1880 1881 ) ( -0 0 1 ) 14 ( 3191.2001953125 -4440 14 ) ( 3207.2001953125 -2916.8000488281 14 ) "textures/base_wall/steel"
+ 4 ( 2853 2503 2852 2504 ) ( 0 0 1 ) 0 ( -4040 -4672 0 ) ( 3128 -4439.9995117188 0 ) "textures/common/caulk"
4 ( -1935 -1908 -1938 -1915 ) ( -0 -1 -0 ) 4440 ( 2807.1999511719 -4440 0 ) ( 3191.1999511719 -4440 8 ) "textures/mars_citybuilder/mars_road_dusty_center_east_west"
4 ( 1897 1898 -1891 -1895 ) ( 1 0 0 ) 2807.2001953125 ( 2807.2001953125 -4440 8 ) ( 2807.2001953125 -2916.8000488281 14 ) "textures/base_wall/steel"
4 ( -1911 1915 1916 -204 ) ( -0 -1 -0 ) 4440 ( 2679.2001953125 -4440 0 ) ( 2807.2001953125 -4440 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
@@ -4973,7 +9438,7 @@ collisionModel "worldMap" {
4 ( 151 152 153 154 ) ( 0 0 -1 ) 0 ( 1386.400390625 -2276.8000488281 0 ) ( 2679.2001953125 -1073.6000976562 0 ) "textures/mars_citybuilder/mars_dirt"
4 ( 2043 2044 -2036 -2042 ) ( -0 1 0 ) -1073.6000976562 ( 1258.400390625 -1073.6000976562 8 ) ( 1274.400390625 -1073.6000976562 14 ) "textures/base_wall/steel"
4 ( 551 552 553 554 ) ( -0 0 1 ) 8 ( 1258.400390625 -1073.6000976562 8 ) ( 1386.400390625 -945.6000976562 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
- 4 ( 2525 -606 2524 549 ) ( 0 0 -1 ) 0 ( 1258.400390625 -2276.8000488281 0 ) ( 1386.400390625 -945.6000976562 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
+ 4 ( 2940 -606 2939 549 ) ( 0 0 -1 ) 0 ( 1258.400390625 -2276.8000488281 0 ) ( 1386.400390625 -945.6000976562 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( -635 2113 -565 2114 ) ( -0 0 1 ) 8 ( 874.400390625 -2404.8000488281 8 ) ( 1258.400390625 -945.6000976562 8 ) "textures/mars_citybuilder/mars_road_dusty_center_east_west"
4 ( -631 2111 -561 2112 ) ( 0 0 -1 ) 0 ( 874.400390625 -2404.8000488281 0 ) ( 1258.400390625 -945.6000976562 0 ) "textures/mars_citybuilder/mars_road_dusty_center_east_west"
4 ( 2058 -158 2059 -2041 ) ( -0 0 1 ) 8 ( 1274.400390625 -2276.8000488281 8 ) ( 1386.400390625 -1073.6000976562 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
@@ -4990,7 +9455,7 @@ collisionModel "worldMap" {
4 ( 115 116 117 118 ) ( 0 0 -1 ) 0 ( -546.3999023438 -433.6000976562 0 ) ( 746.400390625 769.599609375 0 ) "textures/mars_citybuilder/mars_dirt"
4 ( 1468 1469 -1462 -1466 ) ( 1 0 0 ) 746.400390625 ( 746.400390625 -561.6000976562 8 ) ( 746.400390625 -545.6000976562 14 ) "textures/base_wall/steel"
4 ( 545 546 547 548 ) ( -0 0 1 ) 8 ( 746.400390625 -561.6000976562 8 ) ( 874.400390625 -433.6000976562 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
- 4 ( 2521 -774 2520 544 ) ( 0 0 -1 ) -0 ( -546.3999023438 -561.6000976562 0 ) ( 874.400390625 -433.6000976562 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
+ 4 ( 2936 -774 2935 544 ) ( 0 0 -1 ) -0 ( -546.3999023438 -561.6000976562 0 ) ( 874.400390625 -433.6000976562 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( 1565 -568 1566 -802 ) ( -0 0 1 ) 8 ( -674.3999023438 -945.6000976562 8 ) ( 874.400390625 -561.6000976562 8 ) "textures/mars_citybuilder/mars_road_dusty_center"
4 ( 1563 -800 1564 -562 ) ( 0 0 -1 ) -0 ( -674.3999023438 -945.6000976562 0 ) ( 874.400390625 -561.6000976562 0 ) "textures/mars_citybuilder/mars_road_dusty_center"
4 ( 1485 -119 1486 -1470 ) ( -0 0 1 ) 8 ( -546.3999023438 -545.6000976562 8 ) ( 746.400390625 -433.6000976562 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
@@ -5002,7 +9467,7 @@ collisionModel "worldMap" {
4 ( 2055 2056 -2048 -2054 ) ( -0 1 0 ) -1073.6000976562 ( 858.400390625 -1073.6000976562 8 ) ( 874.400390625 -1073.6000976562 14 ) "textures/base_wall/steel"
4 ( 1480 1481 -1474 -1478 ) ( 1 0 0 ) 746.400390625 ( 746.400390625 -961.6000976562 8 ) ( 746.400390625 -945.6000976562 14 ) "textures/base_wall/steel"
4 ( 557 558 559 560 ) ( -0 0 1 ) 8 ( 746.400390625 -1073.6000976562 8 ) ( 874.400390625 -945.6000976562 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
- 4 ( 2519 -786 2518 556 ) ( 0 0 -1 ) -0 ( -546.3999023438 -1073.6000976562 0 ) ( 874.400390625 -945.6000976562 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
+ 4 ( 2934 -786 2933 556 ) ( 0 0 -1 ) -0 ( -546.3999023438 -1073.6000976562 0 ) ( 874.400390625 -945.6000976562 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( 2061 -2057 2062 -164 ) ( -0 0 1 ) 8 ( 746.400390625 -2276.8000488281 8 ) ( 858.400390625 -1073.6000976562 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( -611 -162 -555 2060 ) ( 0 0 -1 ) 0 ( 746.400390625 -2276.8000488281 0 ) ( 874.400390625 -1073.6000976562 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( 2057 -2052 -2049 -2056 ) ( -1 0 0 ) -858.400390625 ( 858.400390625 -2276.8000488281 8 ) ( 858.400390625 -1073.6000976562 14 ) "textures/base_wall/steel"
@@ -5040,7 +9505,7 @@ collisionModel "worldMap" {
4 ( -582 -590 -588 -592 ) ( -1 0 0 ) -1246.400390625 ( 1246.400390625 -2837.8000488281 112 ) ( 1246.400390625 -2827.8000488281 136 ) "textures/base_wall/greenpanel1"
4 ( -569 577 -573 578 ) ( -0 -1 -0 ) 2888.8000488281 ( 1297.400390625 -2888.8000488281 140 ) ( 1307.400390625 -2888.8000488281 164 ) "textures/base_wall/greenpanel1"
4 ( 619 620 621 622 ) ( -0 0 1 ) 8 ( 1258.400390625 -2916.8000488281 8 ) ( 1386.400390625 -2788.8000488281 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
- 4 ( 2514 2087 -2117 617 ) ( 0 0 -1 ) 0 ( 1258.400390625 -4440 0 ) ( 1386.400390625 -2788.8000488281 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
+ 4 ( 2929 2087 -2117 617 ) ( 0 0 -1 ) 0 ( 1258.400390625 -4440 0 ) ( 1386.400390625 -2788.8000488281 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( 597 598 599 -594 ) ( 1 0 0 ) 1306.400390625 ( 1306.400390625 -2836.8000488281 8 ) ( 1306.400390625 -2828.8000488281 112 ) "textures/base_wall/steel"
4 ( 2118 2119 -633 2120 ) ( -0 0 1 ) 8 ( 874.4003295898 -4440 8 ) ( 1258.4002685547 -2788.8000488281 8 ) "textures/mars_citybuilder/mars_road_dusty_center_east_west"
4 ( 2115 2116 -629 2117 ) ( 0 0 -1 ) -0 ( 874.4003295898 -4440 0 ) ( 1258.4002685547 -2788.8000488281 0 ) "textures/mars_citybuilder/mars_road_dusty_center_east_west"
@@ -5060,13 +9525,13 @@ collisionModel "worldMap" {
4 ( 2063 2064 2065 2066 ) ( -0 0 1 ) 14 ( 1258.400390625 -4440 14 ) ( 1274.400390625 -2916.8000488281 14 ) "textures/base_wall/steel"
4 ( 1647 1648 -1641 -1645 ) ( 1 0 0 ) 746.400390625 ( 746.400390625 -2404.8000488281 8 ) ( 746.400390625 -2388.8000488281 14 ) "textures/base_wall/steel"
4 ( 613 614 615 616 ) ( -0 0 1 ) 8 ( 746.400390625 -2404.8000488281 8 ) ( 874.400390625 -2276.8000488281 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
- 4 ( 2513 -806 2512 612 ) ( 0 0 -1 ) -0 ( -546.3999023438 -2404.8000488281 0 ) ( 874.400390625 -2276.8000488281 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
+ 4 ( 2928 -806 2927 612 ) ( 0 0 -1 ) -0 ( -546.3999023438 -2404.8000488281 0 ) ( 874.400390625 -2276.8000488281 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( 1745 -636 1746 -834 ) ( -0 0 1 ) 8 ( -674.3999023438 -2788.8000488281 8 ) ( 874.400390625 -2404.8000488281 8 ) "textures/mars_citybuilder/mars_road_dusty_center"
4 ( 1743 -832 1744 -630 ) ( 0 0 -1 ) -0 ( -674.3999023438 -2788.8000488281 0 ) ( 874.400390625 -2404.8000488281 0 ) "textures/mars_citybuilder/mars_road_dusty_center"
4 ( 2084 2085 -2077 -2083 ) ( -0 1 0 ) -2916.8000488281 ( 858.400390625 -2916.8000488281 8 ) ( 874.400390625 -2916.8000488281 14 ) "textures/base_wall/steel"
4 ( 1659 1660 -1653 -1657 ) ( 1 0 0 ) 746.400390625 ( 746.400390625 -2804.8000488281 8 ) ( 746.400390625 -2788.8000488281 14 ) "textures/base_wall/steel"
4 ( 625 626 627 628 ) ( -0 0 1 ) 8 ( 746.400390625 -2916.8000488281 8 ) ( 874.400390625 -2788.8000488281 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
- 4 ( -2116 2092 2511 624 ) ( 0 0 -1 ) 0 ( 746.400390625 -4440 0 ) ( 874.400390625 -2788.8000488281 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
+ 4 ( -2116 2092 2926 624 ) ( 0 0 -1 ) 0 ( 746.400390625 -4440 0 ) ( 874.400390625 -2788.8000488281 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( 1664 -163 1665 -1649 ) ( -0 0 1 ) 8 ( -546.3999023438 -2388.8000488281 8 ) ( 746.400390625 -2276.8000488281 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( 1651 -1646 -1643 -1650 ) ( -1 0 0 ) 546.3999023438 ( -546.3999023438 -2404.8000488281 8 ) ( -546.3999023438 -2388.8000488281 14 ) "textures/base_wall/steel"
4 ( 1649 1650 -1642 -1648 ) ( -0 1 0 ) -2388.8000488281 ( -546.3999023438 -2388.8000488281 8 ) ( 746.400390625 -2388.8000488281 14 ) "textures/base_wall/steel"
@@ -5089,7 +9554,7 @@ collisionModel "worldMap" {
4 ( 206 207 208 209 ) ( 0 0 -1 ) -0 ( -546.3999023438 -4440 0 ) ( 746.400390625 -2916.8000488281 0 ) "textures/mars_citybuilder/mars_dirt"
4 ( -2145 2148 2149 -30 ) ( -0 1 0 ) 4776 ( -674.3999023438 4776 0 ) ( -546.3999023438 4776 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( 2146 -29 2147 -2128 ) ( -0 0 1 ) 8 ( -658.3999023438 3252.7998046875 8 ) ( -546.3999023438 4776 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
- 4 ( 2510 673 -2277 2145 ) ( 0 0 -1 ) 0 ( -674.3999023438 3124.7998046875 0 ) ( -546.3999023438 4776 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
+ 4 ( 2925 673 -2277 2145 ) ( 0 0 -1 ) 0 ( -674.3999023438 3124.7998046875 0 ) ( -546.3999023438 4776 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( 2132 -2127 -2124 -2131 ) ( -1 0 0 ) 674.3999023438 ( -674.3999023438 3252.7998046875 8 ) ( -674.3999023438 4776 14 ) "textures/base_wall/steel"
4 ( 2130 2131 -2123 -2129 ) ( -0 1 0 ) 4776 ( -674.3999023438 4776 8 ) ( -658.3999023438 4776 14 ) "textures/base_wall/steel"
4 ( 2128 2129 -2122 -2126 ) ( 1 0 0 ) -658.3999023438 ( -658.3999023438 3252.7998046875 8 ) ( -658.3999023438 4776 14 ) "textures/base_wall/steel"
@@ -5112,9 +9577,11 @@ collisionModel "worldMap" {
4 ( 697 698 699 700 ) ( 0 0 -1 ) 0 ( -1058.3999023438 2740.7998046875 0 ) ( -674.3999023438 3124.7998046875 0 ) "textures/mars_citybuilder/mars_road_dusty_intersection"
4 ( 1136 1137 -1130 -1134 ) ( 1 0 0 ) -1186.3999023438 ( -1186.3999023438 3124.7998046875 8 ) ( -1186.3999023438 3140.7998046875 14 ) "textures/base_wall/steel"
4 ( 681 682 683 684 ) ( -0 0 1 ) 8 ( -1186.3999023438 3124.7998046875 8 ) ( -1058.3999023438 3252.7998046875 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
- 4 ( -1206 837 2509 680 ) ( 0 0 -1 ) 0 ( -2607.1999511719 3124.7995605469 0 ) ( -1058.3999023438 3252.7998046875 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
+ 4 ( -1206 837 2922 680 ) ( 0 0 -1 ) 0 ( -2607.1999511719 3124.7995605469 0 ) ( -1058.3999023438 3252.7998046875 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( 1207 -704 1208 -866 ) ( -0 0 1 ) 8 ( -2607.1999511719 2740.7998046875 8 ) ( -1058.3999023438 3124.7998046875 8 ) "textures/mars_citybuilder/mars_road_dusty_center"
4 ( 1205 -864 1206 -698 ) ( 0 0 -1 ) 0 ( -2607.1999511719 2740.7998046875 0 ) ( -1058.3999023438 3124.7998046875 0 ) "textures/mars_citybuilder/mars_road_dusty_center"
+ 4 ( 2911 2831 2910 2832 ) ( 0 0 1 ) 0 ( -3528 4544 0 ) ( -1992 5056 0 ) "textures/common/caulk"
+ 4 ( 2833 2834 2835 2836 ) ( 0 0 1 ) 0 ( -1992 4775.9995117188 0 ) ( -1480 5056 0 ) "textures/common/caulk"
4 ( -34 40 -38 41 ) ( -0 1 0 ) 4775.9995117188 ( -2479.1999511719 4775.9995117188 0 ) ( -1186.3999023438 4775.9995117188 8 ) "textures/mars_citybuilder/mars_dirt"
4 ( 36 37 38 39 ) ( -0 0 1 ) 8 ( -2479.1999511719 3252.7995605469 8 ) ( -1186.3999023438 4775.9995117188 8 ) "textures/mars_citybuilder/mars_dirt"
4 ( 32 33 34 35 ) ( 0 0 -1 ) 0 ( -2479.1999511719 3252.7995605469 0 ) ( -1186.3999023438 4775.9995117188 0 ) "textures/mars_citybuilder/mars_dirt"
@@ -5149,7 +9616,7 @@ collisionModel "worldMap" {
4 ( -650 -658 -656 -660 ) ( -1 0 0 ) 686.3999023438 ( -686.3999023438 2691.7998046875 112 ) ( -686.3999023438 2701.7998046875 136 ) "textures/base_wall/greenpanel1"
4 ( -637 645 -641 646 ) ( -0 -1 -0 ) -2640.7998046875 ( -635.3999023438 2640.7998046875 140 ) ( -625.3999023438 2640.7998046875 164 ) "textures/base_wall/greenpanel1"
4 ( 687 688 689 690 ) ( -0 0 1 ) 8 ( -674.3999023438 2612.7998046875 8 ) ( -546.3999023438 2740.7998046875 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
- 4 ( 2508 705 -2282 685 ) ( 0 0 -1 ) 0 ( -674.3999023438 1281.599609375 0 ) ( -546.3999023438 2740.7998046875 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
+ 4 ( 2921 705 -2282 685 ) ( 0 0 -1 ) 0 ( -674.3999023438 1281.599609375 0 ) ( -546.3999023438 2740.7998046875 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( 665 666 667 -662 ) ( 1 0 0 ) -626.3999023438 ( -626.3999023438 2692.7998046875 8 ) ( -626.3999023438 2700.7998046875 112 ) "textures/base_wall/steel"
4 ( -735 2283 -701 2284 ) ( -0 0 1 ) 8 ( -1058.3999023438 1281.599609375 8 ) ( -674.3999023438 2740.7998046875 8 ) "textures/mars_citybuilder/mars_road_dusty_center_east_west"
4 ( -731 2281 -697 2282 ) ( 0 0 -1 ) 0 ( -1058.3999023438 1281.599609375 0 ) ( -674.3999023438 2740.7998046875 0 ) "textures/mars_citybuilder/mars_road_dusty_center_east_west"
@@ -5160,7 +9627,7 @@ collisionModel "worldMap" {
4 ( 2177 2178 -2170 -2176 ) ( -0 1 0 ) 2612.7998046875 ( -1074.3999023438 2612.7998046875 8 ) ( -1058.3999023438 2612.7998046875 14 ) "textures/base_wall/steel"
4 ( 1148 1149 -1142 -1146 ) ( 1 0 0 ) -1186.3999023438 ( -1186.3999023438 2724.7998046875 8 ) ( -1186.3999023438 2740.7998046875 14 ) "textures/base_wall/steel"
4 ( 693 694 695 696 ) ( -0 0 1 ) 8 ( -1186.3999023438 2612.7998046875 8 ) ( -1058.3999023438 2740.7998046875 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
- 4 ( 2507 -850 2506 692 ) ( 0 0 -1 ) -0 ( -2479.1999511719 2612.7995605469 0 ) ( -1058.3999023438 2740.7998046875 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
+ 4 ( 2920 -850 2919 692 ) ( 0 0 -1 ) -0 ( -2479.1999511719 2612.7995605469 0 ) ( -1058.3999023438 2740.7998046875 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( 2180 -78 2181 -2163 ) ( -0 0 1 ) 8 ( -658.3999023438 1409.599609375 8 ) ( -546.3999023438 2612.7998046875 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( 2167 -2162 -2159 -2166 ) ( -1 0 0 ) 674.3999023438 ( -674.3999023438 1409.599609375 8 ) ( -674.3999023438 2612.7998046875 14 ) "textures/base_wall/steel"
4 ( 2163 2164 -2157 -2161 ) ( 1 0 0 ) -658.3999023438 ( -658.3999023438 1409.599609375 8 ) ( -658.3999023438 2612.7998046875 14 ) "textures/base_wall/steel"
@@ -5177,11 +9644,11 @@ collisionModel "worldMap" {
4 ( 729 730 731 732 ) ( 0 0 -1 ) 0 ( -1058.3999023438 897.599609375 0 ) ( -674.3999023438 1281.599609375 0 ) "textures/mars_citybuilder/mars_road_dusty_intersection"
4 ( 1316 1317 -1310 -1314 ) ( 1 0 0 ) -1186.3999023438 ( -1186.3999023438 1281.599609375 8 ) ( -1186.3999023438 1297.599609375 14 ) "textures/base_wall/steel"
4 ( 713 714 715 716 ) ( -0 0 1 ) 8 ( -1186.3999023438 1281.599609375 8 ) ( -1058.3999023438 1409.599609375 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
- 4 ( -1388 905 2503 712 ) ( 0 0 -1 ) 0 ( -2607.1999511719 1281.5994873047 0 ) ( -1058.3999023438 1409.599609375 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
+ 4 ( -1388 905 2916 712 ) ( 0 0 -1 ) 0 ( -2607.1999511719 1281.5994873047 0 ) ( -1058.3999023438 1409.599609375 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( 1389 -736 1390 -934 ) ( -0 0 1 ) 8 ( -2607.1999511719 897.599609375 8 ) ( -1058.3999023438 1281.599609375 8 ) "textures/mars_citybuilder/mars_road_dusty_center"
4 ( 1387 -932 1388 -730 ) ( 0 0 -1 ) 0 ( -2607.1999511719 897.599609375 0 ) ( -1058.3999023438 1281.599609375 0 ) "textures/mars_citybuilder/mars_road_dusty_center"
4 ( 2209 -122 2210 -2192 ) ( -0 0 1 ) 8 ( -658.3999023438 -433.6000976562 8 ) ( -546.3999023438 769.599609375 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
- 4 ( 2497 773 -2286 717 ) ( 0 0 -1 ) -0 ( -674.3999023438 -561.6000976562 0 ) ( -546.3999023438 897.599609375 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
+ 4 ( 2895 773 -2286 717 ) ( 0 0 -1 ) -0 ( -674.3999023438 -561.6000976562 0 ) ( -546.3999023438 897.599609375 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( 2196 -2191 -2188 -2195 ) ( -1 0 0 ) 674.3999023438 ( -674.3999023438 -433.6000976562 8 ) ( -674.3999023438 769.599609375 14 ) "textures/base_wall/steel"
4 ( 2194 2195 -2187 -2193 ) ( -0 1 0 ) 769.599609375 ( -674.3999023438 769.599609375 8 ) ( -658.3999023438 769.599609375 14 ) "textures/base_wall/steel"
4 ( 2192 2193 -2186 -2190 ) ( 1 0 0 ) -658.3999023438 ( -658.3999023438 -433.6000976562 8 ) ( -658.3999023438 769.599609375 14 ) "textures/base_wall/steel"
@@ -5191,7 +9658,7 @@ collisionModel "worldMap" {
4 ( -799 2285 -729 2286 ) ( 0 0 -1 ) 0 ( -1058.3999023438 -561.6000976562 0 ) ( -674.3999023438 897.599609375 0 ) "textures/mars_citybuilder/mars_road_dusty_center_east_west"
4 ( 2204 2205 -2198 -2202 ) ( 1 0 0 ) -1058.3999023438 ( -1058.3999023438 -433.6000976562 8 ) ( -1058.3999023438 769.599609375 14 ) "textures/base_wall/steel"
4 ( 2211 -2208 2212 -128 ) ( -0 0 1 ) 8 ( -1186.3999023438 -433.6000976562 8 ) ( -1074.3999023438 769.599609375 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
- 4 ( 2499 -779 2498 724 ) ( 0 0 -1 ) 0 ( -1186.3999023438 -433.6000976562 0 ) ( -1058.3999023438 897.599609375 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
+ 4 ( 2897 -779 2896 724 ) ( 0 0 -1 ) 0 ( -1186.3999023438 -433.6000976562 0 ) ( -1058.3999023438 897.599609375 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( 2208 -2203 -2200 -2207 ) ( -1 0 0 ) 1074.3999023438 ( -1074.3999023438 -433.6000976562 8 ) ( -1074.3999023438 769.599609375 14 ) "textures/base_wall/steel"
4 ( 2206 2207 -2199 -2205 ) ( -0 1 0 ) 769.599609375 ( -1074.3999023438 769.599609375 8 ) ( -1058.3999023438 769.599609375 14 ) "textures/base_wall/steel"
4 ( 2197 2198 2199 2200 ) ( -0 0 1 ) 14 ( -1074.3999023438 -433.6000976562 14 ) ( -1058.3999023438 769.599609375 14 ) "textures/base_wall/steel"
@@ -5208,7 +9675,7 @@ collisionModel "worldMap" {
4 ( -931 2460 -861 2461 ) ( 0 0 -1 ) 0 ( -2991.1999511719 1281.599609375 0 ) ( -2607.1999511719 2740.7998046875 0 ) "textures/mars_citybuilder/mars_road_dusty_center_east_west"
4 ( 2344 2345 -2337 -2343 ) ( -0 1 0 ) 2612.7998046875 ( -2607.1999511719 2612.7998046875 8 ) ( -2591.1999511719 2612.7998046875 14 ) "textures/base_wall/steel"
4 ( 851 852 853 854 ) ( -0 0 1 ) 8 ( -2607.1999511719 2612.7998046875 8 ) ( -2479.1999511719 2740.7998046875 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
- 4 ( 2505 -906 2504 849 ) ( 0 0 -1 ) 0 ( -2607.1999511719 1409.599609375 0 ) ( -2479.1999511719 2740.7998046875 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
+ 4 ( 2918 -906 2917 849 ) ( 0 0 -1 ) 0 ( -2607.1999511719 1409.599609375 0 ) ( -2479.1999511719 2740.7998046875 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( 2359 -86 2360 -2342 ) ( -0 0 1 ) 8 ( -2591.1999511719 1409.599609375 8 ) ( -2479.1999511719 2612.7998046875 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( 2346 -2341 -2338 -2345 ) ( -1 0 0 ) 2607.1999511719 ( -2607.1999511719 1409.599609375 8 ) ( -2607.1999511719 2612.7998046875 14 ) "textures/base_wall/steel"
4 ( 2342 2343 -2336 -2340 ) ( 1 0 0 ) -2591.1999511719 ( -2591.1999511719 1409.599609375 8 ) ( -2591.1999511719 2612.7998046875 14 ) "textures/base_wall/steel"
@@ -5241,7 +9708,7 @@ collisionModel "worldMap" {
4 ( 869 870 871 872 ) ( 0 0 -1 ) -140 ( -2568.1999511719 797.599609375 140 ) ( -2558.1999511719 909.599609375 140 ) "textures/base_wall/greenpanel1"
4 ( -869 877 -873 878 ) ( -0 -1 -0 ) -797.599609375 ( -2568.1999511719 797.599609375 140 ) ( -2558.1999511719 797.599609375 164 ) "textures/base_wall/greenpanel1"
4 ( 919 920 921 922 ) ( -0 0 1 ) 8 ( -2607.1999511719 769.599609375 8 ) ( -2479.1999511719 897.599609375 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
- 4 ( 2494 937 -2465 917 ) ( 0 0 -1 ) 0 ( -2607.1999511719 -561.6000976562 0 ) ( -2479.1999511719 897.599609375 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
+ 4 ( 2892 937 -2465 917 ) ( 0 0 -1 ) 0 ( -2607.1999511719 -561.6000976562 0 ) ( -2479.1999511719 897.599609375 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( 897 898 899 -894 ) ( 1 0 0 ) -2559.1999511719 ( -2559.1999511719 849.599609375 8 ) ( -2559.1999511719 857.599609375 112 ) "textures/base_wall/steel"
4 ( -967 2466 -933 2467 ) ( -0 0 1 ) 8 ( -2991.1999511719 -561.6000976562 8 ) ( -2607.1999511719 897.599609375 8 ) "textures/mars_citybuilder/mars_road_dusty_center_east_west"
4 ( -963 2464 -929 2465 ) ( 0 0 -1 ) 0 ( -2991.1999511719 -561.6000976562 0 ) ( -2607.1999511719 897.599609375 0 ) "textures/mars_citybuilder/mars_road_dusty_center_east_west"
@@ -5263,9 +9730,36 @@ collisionModel "worldMap" {
4 ( 2311 2312 2313 2314 ) ( -0 0 1 ) 14 ( -3007.1999511719 3252.7998046875 14 ) ( -2991.1999511719 4776 14 ) "textures/base_wall/steel"
4 ( 1164 1165 -1158 -1162 ) ( 1 0 0 ) -3119.1999511719 ( -3119.1999511719 3124.7998046875 8 ) ( -3119.1999511719 3140.7998046875 14 ) "textures/base_wall/steel"
4 ( 845 846 847 848 ) ( -0 0 1 ) 8 ( -3119.1999511719 3124.7998046875 8 ) ( -2991.1999511719 3252.7998046875 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
- 4 ( -1211 1181 2502 844 ) ( 0 0 -1 ) 0 ( -4732 3124.7998046875 0 ) ( -2991.1999511719 3252.7998046875 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
+ 4 ( -1211 1181 2905 844 ) ( 0 0 -1 ) 0 ( -4732 3124.7998046875 0 ) ( -2991.1999511719 3252.7998046875 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( 1212 -868 1213 1214 ) ( -0 0 1 ) 8 ( -4732 2740.7995605469 8 ) ( -2991.1999511719 3124.7995605469 8 ) "textures/mars_citybuilder/mars_road_dusty_center"
4 ( 1209 1210 1211 -862 ) ( 0 0 -1 ) 0 ( -4732 2740.7995605469 0 ) ( -2991.1999511719 3124.7995605469 0 ) "textures/mars_citybuilder/mars_road_dusty_center"
+ 4 ( 2790 2791 2792 -2784 ) ( 0.1277917475 -0.0134484842 0.9917098284 ) -622.1654663086 ( -5064 3008 8 ) ( -4560.2353515625 3520 72.9151153564 ) "textures/common/caulk"
+ 3 ( 2787 2788 2789 ) ( 0.118181929 -0.0036916409 0.9929850698 ) -544.0685424805 ( -5064 3008 5.0353164673 ) ( -4552 3520 65.9719314575 ) "textures/common/caulk"
+ 3 ( -2785 2786 -2781 ) ( -0.1359697431 0.0030036941 0.9907084703 ) 771.3613891602 ( -5576 3008 2.6456999779 ) ( -5064 3520 72.9151153564 ) "textures/common/caulk"
+ 3 ( -2773 2784 2785 ) ( -0.1197726429 -0.013462049 0.9927101135 ) 631.5258178711 ( -5576 3008 4.1980147362 ) ( -5064 3520 72.9151153564 ) "textures/common/caulk"
+ 3 ( -2782 2783 -2780 ) ( -0.0051673139 0 0.9999866486 ) 31.45860672 ( -6088 3008 0 ) ( -5576 3520 2.6456999779 ) "textures/common/caulk"
+ 3 ( -2770 2781 2782 ) ( -0.0081989346 0.0030317488 0.9999617934 ) 59.034614563 ( -6088 3008 0 ) ( -5576 3520 4.1980147362 ) "textures/common/caulk"
+ 5 ( 2915 2899 -2767 2914 -2913 ) ( 0 0 1 ) 0 ( -20936 2496 0 ) ( -6088 4544 0 ) "textures/common/caulk"
+ 4 ( 2828 2829 -2824 2830 ) ( 0 0 1 ) 0 ( -4040 4776 0 ) ( -3528 5056 0 ) "textures/common/caulk"
+ 4 ( 2824 2825 2826 2827 ) ( 0 0 1 ) 0.0918251723 ( -4552 4776 0 ) ( -4040 5056 0.0502168909 ) "textures/common/caulk"
+ 3 ( -2822 2823 -2818 ) ( 0 0.0405611023 0.9991770387 ) 205.0769348145 ( -5064 4544 0 ) ( -4552 5056 20.7843894958 ) "textures/common/caulk"
+ 3 ( -2814 2821 2822 ) ( 0.040382199 0.0001792004 0.9991843104 ) -182.9137268066 ( -5064 4544 0 ) ( -4552 5056 20.7843894958 ) "textures/common/caulk"
+ 3 ( -2819 2820 -2816 ) ( 0 0.0042041694 0.9999911785 ) 21.256280899 ( -5576 4544 0 ) ( -5064 5056 2.1525537968 ) "textures/common/caulk"
+ 3 ( -2810 2818 2819 ) ( -0.0363363437 0.0405343175 0.9985172153 ) 388.9487304688 ( -5576 4544 0 ) ( -5064 5056 20.7843894958 ) "textures/common/caulk"
+ 4 ( 2913 -2817 2912 2815 ) ( 0 0 1 ) 0 ( -20936 4544 0 ) ( -5576 5056 0 ) "textures/common/caulk"
+ 3 ( -2807 2816 2817 ) ( -0.0042041321 0.0042041321 0.9999822974 ) 44.6983337402 ( -6088 4544 0 ) ( -5576 5056 2.1525537968 ) "textures/common/caulk"
+ 3 ( 2813 2814 -2808 ) ( 0.0400820076 0.121704556 0.9917567372 ) 370.663269043 ( -5064 4032 0.0918251723 ) ( -4552 4544 83.6150512695 ) "textures/common/caulk"
+ 3 ( -2803 2811 2812 ) ( 0.1467397362 0.0146080824 0.9890672565 ) -601.4893188477 ( -5064 4032 8 ) ( -4554.3330078125 4495.5224609375 83.6150512695 ) "textures/common/caulk"
+ 3 ( -2809 2810 -2805 ) ( -0.0363655277 0.0062364507 0.9993191361 ) 233.2637023926 ( -5576 4032 2.1525537968 ) ( -5064 4544 20.7843894958 ) "textures/common/caulk"
+ 3 ( -2799 2808 2809 ) ( -0.1500106603 0.1204241514 0.9813229442 ) 1327.2574462891 ( -5576 4032 5.3477921486 ) ( -5064 4544 83.6150512695 ) "textures/common/caulk"
+ 3 ( -2806 2807 -2804 ) ( -0.0042041694 0 0.9999911785 ) 25.5949840546 ( -6088 4032 0 ) ( -5576 4544 2.1525537968 ) "textures/common/caulk"
+ 3 ( -2796 2805 2806 ) ( -0.0104441335 0.006240238 0.999925971 ) 88.7445220947 ( -6088 4032 0 ) ( -5576 4544 5.3477921486 ) "textures/common/caulk"
+ 4 ( -2801 2802 2803 -2797 ) ( 0.1467240602 -0.0206676275 0.9889615178 ) -743.6504516602 ( -5064 3520 8 ) ( -4554.3330078125 4032 83.6150512695 ) "textures/common/caulk"
+ 3 ( -2792 2800 2801 ) ( 0.1278031766 -0.0013851275 0.9917985797 ) -579.75390625 ( -5064 3520 8 ) ( -4554.7158203125 4029.2841796875 72.9151153564 ) "textures/common/caulk"
+ 3 ( -2798 2799 -2794 ) ( -0.1511083096 -0.0052168504 0.9885034561 ) 826.8319091797 ( -5576 3520 2.6456999779 ) ( -5064 4032 83.6150512695 ) "textures/common/caulk"
+ 3 ( -2786 2797 2798 ) ( -0.1359412074 -0.0206997916 0.9905006289 ) 687.7654418945 ( -5576 3520 2.6456999779 ) ( -5064 4032 83.6150512695 ) "textures/common/caulk"
+ 3 ( -2795 2796 -2793 ) ( -0.0104443366 0 0.9999454618 ) 63.5851211548 ( -6088 3520 0 ) ( -5576 4032 5.3477921486 ) "textures/common/caulk"
+ 3 ( -2783 2794 2795 ) ( -0.0051672417 -0.0052773799 0.9999727011 ) 12.8817901611 ( -6088 3520 0 ) ( -5576 4032 5.3477921486 ) "textures/common/caulk"
4 ( -43 52 -49 -50 ) ( -1 0 0 ) 4732 ( -4732 3252.7998046875 0 ) ( -4732 4776 8 ) "textures/mars_citybuilder/mars_dirt"
4 ( -44 50 -48 51 ) ( -0 1 0 ) 4776 ( -4732 4776 0 ) ( -3119.1999511719 4776 8 ) "textures/mars_citybuilder/mars_dirt"
4 ( 46 47 48 49 ) ( -0 0 1 ) 8 ( -4732 3252.7998046875 8 ) ( -3119.1999511719 4776 8 ) "textures/mars_citybuilder/mars_dirt"
@@ -5276,12 +9770,19 @@ collisionModel "worldMap" {
4 ( 1166 1167 -1159 -1165 ) ( -0 1 0 ) 3140.7998046875 ( -4732 3140.7998046875 8 ) ( -3119.1999511719 3140.7998046875 14 ) "textures/base_wall/steel"
4 ( 1161 1162 -1157 1163 ) ( -0 -1 -0 ) -3124.7998046875 ( -4732 3124.7998046875 8 ) ( -3119.1999511719 3124.7998046875 14 ) "textures/base_wall/steel"
4 ( 1157 1158 1159 1160 ) ( -0 0 1 ) 14 ( -4732 3124.7998046875 14 ) ( -3119.1999511719 3140.7998046875 14 ) "textures/base_wall/steel"
+ 4 ( 2777 2778 2779 -2771 ) ( 0.1180330068 0.0503226444 0.9917337894 ) -380.9219970703 ( -5064 2496 8 ) ( -4569.4638671875 3008 91.9518814087 ) "textures/common/caulk"
+ 3 ( 2774 2775 2776 ) ( 0.1674234271 -0.0000606438 0.9858850837 ) -757.3295898438 ( -5064 2496 5.0038194656 ) ( -4552 3008 91.9518814087 ) "textures/common/caulk"
+ 3 ( -2772 2773 -2768 ) ( -0.119707115 0.0357027464 0.9921670556 ) 779.0458984375 ( -5576 2496 4.1980147362 ) ( -5064 3008 65.9719314575 ) "textures/common/caulk"
+ 3 ( -2761 2771 2772 ) ( -0.134015739 0.0502197482 0.9897059202 ) 895.0095825195 ( -5576 2496 22.6221370697 ) ( -5064 3008 91.9518814087 ) "textures/common/caulk"
+ 3 ( -2769 2770 -2766 ) ( -0.0081989719 0.000323178 0.9999663234 ) 50.8874588013 ( -6088 2496 0 ) ( -5576 3008 4.1980147362 ) "textures/common/caulk"
+ 3 ( -2758 2768 2769 ) ( -0.0437902585 0.0359268412 0.9983945489 ) 356.4337158203 ( -6088 2496 0.165472731 ) ( -5576 3008 22.6221370697 ) "textures/common/caulk"
+ 3 ( -2755 2766 2767 ) ( -0.0003231889 0.0003231889 0.9999998808 ) 2.9397261143 ( -6600 2496 0 ) ( -6088 3008 0.165472731 ) "textures/common/caulk"
4 ( -1210 -1190 -1214 -1184 ) ( -1 0 0 ) 4732 ( -4732 2740.7995605469 0 ) ( -4732 3124.7995605469 8 ) "textures/mars_citybuilder/mars_road_dusty_center"
4 ( 1178 1179 -1171 -1177 ) ( -0 1 0 ) 2740.7998046875 ( -4732 2740.7998046875 8 ) ( -3119.1999511719 2740.7998046875 14 ) "textures/base_wall/steel"
4 ( 2356 2357 -2349 -2355 ) ( -0 1 0 ) 2612.7998046875 ( -3007.1999511719 2612.7998046875 8 ) ( -2991.1999511719 2612.7998046875 14 ) "textures/base_wall/steel"
4 ( 1176 1177 -1170 -1174 ) ( 1 0 0 ) -3119.1999511719 ( -3119.1999511719 2724.7998046875 8 ) ( -3119.1999511719 2740.7998046875 14 ) "textures/base_wall/steel"
4 ( 857 858 859 860 ) ( -0 0 1 ) 8 ( -3119.1999511719 2612.7998046875 8 ) ( -2991.1999511719 2740.7998046875 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
- 4 ( 2501 1186 -1209 856 ) ( 0 0 -1 ) 0 ( -4732 2612.7998046875 0 ) ( -2991.1999511719 2740.7998046875 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
+ 4 ( 2904 1186 -1209 856 ) ( 0 0 -1 ) 0 ( -4732 2612.7998046875 0 ) ( -2991.1999511719 2740.7998046875 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( 2354 2355 -2348 -2352 ) ( 1 0 0 ) -2991.1999511719 ( -2991.1999511719 1409.599609375 8 ) ( -2991.1999511719 2612.7998046875 14 ) "textures/base_wall/steel"
4 ( 2362 -2358 2363 -92 ) ( -0 0 1 ) 8 ( -3119.1999511719 1409.599609375 8 ) ( -3007.1999511719 2612.7998046875 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( -911 -90 -855 2361 ) ( 0 0 -1 ) 0 ( -3119.1999511719 1409.599609375 0 ) ( -2991.1999511719 2612.7998046875 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
@@ -5290,12 +9791,12 @@ collisionModel "worldMap" {
4 ( 2347 2348 2349 2350 ) ( -0 0 1 ) 14 ( -3007.1999511719 1409.599609375 14 ) ( -2991.1999511719 2612.7998046875 14 ) "textures/base_wall/steel"
4 ( 1345 1346 -1339 -1343 ) ( 1 0 0 ) -3119.1999511719 ( -3119.1999511719 1281.599609375 8 ) ( -3119.1999511719 1297.599609375 14 ) "textures/base_wall/steel"
4 ( 913 914 915 916 ) ( -0 0 1 ) 8 ( -3119.1999511719 1281.599609375 8 ) ( -2991.1999511719 1409.599609375 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
- 4 ( -1393 1362 2500 912 ) ( 0 0 -1 ) 0 ( -4732 1281.599609375 0 ) ( -2991.1999511719 1409.599609375 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
+ 4 ( -1393 1362 2898 912 ) ( 0 0 -1 ) 0 ( -4732 1281.599609375 0 ) ( -2991.1999511719 1409.599609375 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( 1394 -936 1395 1396 ) ( -0 0 1 ) 8 ( -4732 897.5995483398 8 ) ( -2991.1999511719 1281.5994873047 8 ) "textures/mars_citybuilder/mars_road_dusty_center"
4 ( 1391 1392 1393 -930 ) ( 0 0 -1 ) 0 ( -4732 897.5995483398 0 ) ( -2991.1999511719 1281.5994873047 0 ) "textures/mars_citybuilder/mars_road_dusty_center"
4 ( 2383 2384 -2377 -2381 ) ( 1 0 0 ) -2991.1999511719 ( -2991.1999511719 -433.6000976562 8 ) ( -2991.1999511719 769.599609375 14 ) "textures/base_wall/steel"
4 ( 2390 -2387 2391 -136 ) ( -0 0 1 ) 8 ( -3119.1999511719 -433.6000976562 8 ) ( -3007.1999511719 769.599609375 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
- 4 ( 2493 -943 2492 924 ) ( 0 0 -1 ) 0 ( -3119.1999511719 -433.6000976562 0 ) ( -2991.1999511719 897.599609375 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
+ 4 ( 2891 -943 2890 924 ) ( 0 0 -1 ) 0 ( -3119.1999511719 -433.6000976562 0 ) ( -2991.1999511719 897.599609375 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( 2387 -2382 -2379 -2386 ) ( -1 0 0 ) 3007.1999511719 ( -3007.1999511719 -433.6000976562 8 ) ( -3007.1999511719 769.599609375 14 ) "textures/base_wall/steel"
4 ( 2385 2386 -2378 -2384 ) ( -0 1 0 ) 769.599609375 ( -3007.1999511719 769.599609375 8 ) ( -2991.1999511719 769.599609375 14 ) "textures/base_wall/steel"
4 ( 2376 2377 2378 2379 ) ( -0 0 1 ) 14 ( -3007.1999511719 -433.6000976562 14 ) ( -2991.1999511719 769.599609375 14 ) "textures/base_wall/steel"
@@ -5306,6 +9807,35 @@ collisionModel "worldMap" {
4 ( 1180 -1175 -1172 -1179 ) ( -1 0 0 ) 4732 ( -4732 2724.7998046875 8 ) ( -4732 2740.7998046875 14 ) "textures/base_wall/steel"
4 ( 1173 1174 -1169 1175 ) ( -0 -1 -0 ) -2724.7998046875 ( -4732 2724.7998046875 8 ) ( -3119.1999511719 2724.7998046875 14 ) "textures/base_wall/steel"
4 ( 1169 1170 1171 1172 ) ( -0 0 1 ) 14 ( -4732 2724.7998046875 14 ) ( -3119.1999511719 2740.7998046875 14 ) "textures/base_wall/steel"
+ 4 ( -2763 2764 2765 -2759 ) ( 0.1672522277 -0.0452117398 0.9848769307 ) -869.2524414062 ( -5064 1984 8 ) ( -4569.6430664062 2496 91.9518814087 ) "textures/common/caulk"
+ 3 ( -2742 2762 2763 ) ( 0.1205302551 0.0024804401 0.9927065372 ) -537.4952392578 ( -5064 1984 8 ) ( -4566.140625 2471.8205566406 68.4480209351 ) "textures/common/caulk"
+ 3 ( -2760 2761 -2756 ) ( -0.1341772228 0.0107912943 0.9908985496 ) 797.5234985352 ( -5576 1984 22.6221370697 ) ( -5064 2496 91.9518814087 ) "textures/common/caulk"
+ 3 ( -2737 2759 2760 ) ( -0.0782895237 -0.0457169302 0.9958818555 ) 373.9219055176 ( -5576 1984 28.1980285645 ) ( -5064 2496 91.9518814087 ) "textures/common/caulk"
+ 3 ( -2757 2758 -2753 ) ( -0.0438185409 -0.0003224238 0.9990394115 ) 266.1278381348 ( -6088 1984 0.0002330346 ) ( -5576 2496 22.6221370697 ) "textures/common/caulk"
+ 3 ( -2734 2756 2757 ) ( -0.0549872331 0.0108732916 0.9984278083 ) 356.3351135254 ( -6088 1984 0.0002330346 ) ( -5576 2496 28.1980285645 ) "textures/common/caulk"
+ 3 ( -2754 2755 -2752 ) ( -0.0003231889 0 0.9999999404 ) 2.133046627 ( -6600 1984 0 ) ( -6088 2496 0.165472731 ) "textures/common/caulk"
+ 3 ( -2731 2753 2754 ) ( -0.0000004551 -0.0003227337 0.9999999404 ) -0.6372997761 ( -6600 1984 0 ) ( -6088 2496 0.165472731 ) "textures/common/caulk"
+ 4 ( 2900 2752 -2899 2751 ) ( 0 0 1 ) 0 ( -20936 1984 0 ) ( -6600 2496 0 ) "textures/common/caulk"
+ 3 ( -2749 2750 -2743 ) ( 0.0014933294 0.029579103 0.9995613098 ) 53.4164733887 ( -4040 1472 8 ) ( -3785.3500976562 1739.5062255859 15.9160680771 ) "textures/common/caulk"
+ 3 ( 2747 2748 2749 ) ( 0.0310710613 0 0.9995172024 ) -109.6186981201 ( -4040 1472 8 ) ( -3785.3500976562 1726.6500244141 15.9160680771 ) "textures/common/caulk"
+ 3 ( -2745 2746 -2738 ) ( 0.0107587008 0.0584689453 0.9982312322 ) 73.3007965088 ( -4552 1472 8 ) ( -4144.3266601562 1954.6882324219 36.272277832 ) "textures/common/caulk"
+ 4 ( -2724 2743 2744 2745 ) ( 0.0397094786 0.0295558106 0.9987740517 ) -101.0235900879 ( -4552 1472 8 ) ( -4040 1879.6734619141 36.272277832 ) "textures/common/caulk"
+ 4 ( -2740 2741 2742 -2735 ) ( 0.1205260083 -0.0087518701 0.9926716089 ) -559.7609863281 ( -5064 1472 8 ) ( -4566.140625 1984 68.4480209351 ) "textures/common/caulk"
+ 4 ( -2721 2738 2739 2740 ) ( 0.0538560525 0.0583874658 0.996840179 ) -123.0487365723 ( -5064 1472 8 ) ( -4552 1968.7524414062 63.9339828491 ) "textures/common/caulk"
+ 3 ( -2736 2737 -2732 ) ( -0.0783682913 -0.0090023503 0.9968838096 ) 447.2310791016 ( -5576 1472 23.5744171143 ) ( -5064 1984 68.4480209351 ) "textures/common/caulk"
+ 3 ( -2718 2735 2736 ) ( -0.0785804689 -0.0087888762 0.9968690276 ) 448.7280883789 ( -5576 1472 23.5744171143 ) ( -5064 1984 68.4480209351 ) "textures/common/caulk"
+ 3 ( -2733 2734 -2730 ) ( -0.0549904853 -0.0000004545 0.9984868765 ) 334.7814025879 ( -6088 1472 0 ) ( -5576 1984 28.1980285645 ) "textures/common/caulk"
+ 3 ( -2715 2732 2733 ) ( -0.0459931828 -0.0090205669 0.9989010096 ) 266.7282104492 ( -6088 1472 0 ) ( -5576 1984 28.1980285645 ) "textures/common/caulk"
+ 4 ( 2903 2901 2902 2888 ) ( 0 0 1 ) 0 ( -20936 448 0 ) ( -6088 1984 0.0002330346 ) "textures/common/caulk"
+ 3 ( 2728 2729 -2722 ) ( 0.0310709737 0.0023928895 0.9995143414 ) -106.0960617065 ( -4040 960 0 ) ( -3528 1472 17.1418228149 ) "textures/common/caulk"
+ 3 ( -2723 2724 -2719 ) ( 0.0397222489 0.0151983248 0.9990952015 ) -122.204284668 ( -4552 960 15.9160680771 ) ( -4040 1472 44.0608673096 ) "textures/common/caulk"
+ 3 ( -2708 2722 2723 ) ( 0.0525035933 0.0023907416 0.9986178875 ) -192.7012786865 ( -4552 960 15.9160680771 ) ( -4040 1472 44.0608673096 ) "textures/common/caulk"
+ 3 ( -2720 2721 -2716 ) ( 0.0539189465 0.0328647904 0.9980043173 ) -160.8621673584 ( -5064 960 36.272277832 ) ( -4552 1472 80.7944030762 ) "textures/common/caulk"
+ 3 ( -2704 2719 2720 ) ( 0.0715530142 0.0151713425 0.9973214269 ) -267.201965332 ( -5064 960 36.272277832 ) ( -4552 1472 80.7944030762 ) "textures/common/caulk"
+ 3 ( -2717 2718 -2713 ) ( -0.0785218552 0.0396034494 0.9961254597 ) 519.6172485352 ( -5576 960 23.5744171143 ) ( -5064 1472 63.9339828491 ) "textures/common/caulk"
+ 3 ( -2701 2716 2717 ) ( -0.0717756823 0.0328277797 0.9968804121 ) 475.529083252 ( -5576 960 43.9302520752 ) ( -5064 1472 80.7944030762 ) "textures/common/caulk"
+ 3 ( -2714 2715 -2712 ) ( -0.0459950529 0 0.9989416599 ) 280.0178833008 ( -6088 960 0 ) ( -5576 1472 23.5744171143 ) "textures/common/caulk"
+ 3 ( -2698 2713 2714 ) ( -0.0854201838 0.0395809077 0.9955585003 ) 558.0357666016 ( -6088 960 0 ) ( -5576 1472 43.9302520752 ) "textures/common/caulk"
4 ( -88 95 -94 96 ) ( -1 0 0 ) 4732 ( -4732 1409.599609375 0 ) ( -4732 2612.7998046875 8 ) "textures/mars_citybuilder/mars_dirt"
4 ( 91 92 93 94 ) ( -0 0 1 ) 8 ( -4732 1409.599609375 8 ) ( -3119.1999511719 2612.7998046875 8 ) "textures/mars_citybuilder/mars_dirt"
4 ( 87 88 89 90 ) ( 0 0 -1 ) 0 ( -4732 1409.599609375 0 ) ( -3119.1999511719 2612.7998046875 0 ) "textures/mars_citybuilder/mars_dirt"
@@ -5315,7 +9845,17 @@ collisionModel "worldMap" {
4 ( 1347 1348 -1340 -1346 ) ( -0 1 0 ) 1297.599609375 ( -4732 1297.599609375 8 ) ( -3119.1999511719 1297.599609375 14 ) "textures/base_wall/steel"
4 ( 1342 1343 -1338 1344 ) ( -0 -1 -0 ) -1281.599609375 ( -4732 1281.599609375 8 ) ( -3119.1999511719 1281.599609375 14 ) "textures/base_wall/steel"
4 ( 1338 1339 1340 1341 ) ( -0 0 1 ) 14 ( -4732 1281.599609375 14 ) ( -3119.1999511719 1297.599609375 14 ) "textures/base_wall/steel"
+ 3 ( 2709 2710 2711 ) ( 0.0334543549 -0.02048398 0.9992303252 ) -137.6915740967 ( -4040 448 0 ) ( -3528 960 17.1418228149 ) "textures/common/caulk"
+ 3 ( -2707 2708 -2702 ) ( 0.0524916835 -0.0214289501 0.9983913898 ) -215.52394104 ( -4552 448 17.1418228149 ) ( -4040 960 44.0608673096 ) "textures/common/caulk"
+ 4 ( -2694 2705 2706 2707 ) ( 0.0515331365 -0.0204682201 0.9984615445 ) -210.7279205322 ( -4552 448 8 ) ( -4040 960 33.0715675354 ) "textures/common/caulk"
+ 3 ( -2703 2704 -2699 ) ( 0.0715436041 0.0222021472 0.9971902966 ) -260.4153442383 ( -5064 448 44.0608673096 ) ( -4552 960 92.1939315796 ) "textures/common/caulk"
+ 3 ( -2690 2702 2703 ) ( 0.1146850511 -0.0213169493 0.993173182 ) -498.7505187988 ( -5064 448 33.0715675354 ) ( -4552 960 92.1939315796 ) "textures/common/caulk"
+ 3 ( -2700 2701 -2696 ) ( -0.0717260987 0.0495724902 0.99619174 ) 491.2972717285 ( -5576 448 43.9302520752 ) ( -5064 960 80.7944030762 ) "textures/common/caulk"
+ 3 ( -2687 2699 2700 ) ( -0.0444480032 0.0222371891 0.9987641573 ) 327.126953125 ( -5576 448 69.4083938599 ) ( -5064 960 92.1939315796 ) "textures/common/caulk"
+ 3 ( -2697 2698 -2695 ) ( -0.0854871795 0 0.9963392615 ) 520.4459228516 ( -6088 448 0 ) ( -5576 960 43.9302520752 ) "textures/common/caulk"
+ 3 ( -2684 2696 2697 ) ( -0.1341715008 0.0492511131 0.9897334576 ) 838.9006347656 ( -6088 448 0 ) ( -5576 960 69.4083938599 ) "textures/common/caulk"
4 ( -1392 -1372 -1396 -1365 ) ( -1 0 0 ) 4732 ( -4732 897.5995483398 0 ) ( -4732 1281.5994873047 8 ) "textures/mars_citybuilder/mars_road_dusty_center"
+ 3 ( 2725 2726 2727 ) ( 0.0334613733 0 0.9994400144 ) -118.0517196655 ( -4040 960 8 ) ( -3766.9477539062 1233.0522460938 17.1418228149 ) "textures/common/caulk"
4 ( 1359 1360 -1352 -1358 ) ( -0 1 0 ) 897.599609375 ( -4732 897.599609375 8 ) ( -3119.1999511719 897.599609375 14 ) "textures/base_wall/steel"
4 ( -1367 -140 1371 1372 ) ( -1 0 0 ) 4732 ( -4732 769.599609375 0 ) ( -4732 897.599609375 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( -137 1369 -1354 1370 ) ( -0 0 1 ) 8 ( -4732 769.599609375 8 ) ( -3119.1999511719 881.599609375 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
@@ -5334,7 +9874,7 @@ collisionModel "worldMap" {
4 ( 797 798 799 800 ) ( 0 0 -1 ) -0 ( -1058.3999023438 -945.6000976562 0 ) ( -674.3999023438 -561.6000976562 0 ) "textures/mars_citybuilder/mars_road_dusty_intersection"
4 ( 1496 1497 -1490 -1494 ) ( 1 0 0 ) -1186.3999023438 ( -1186.3999023438 -561.6000976562 8 ) ( -1186.3999023438 -545.6000976562 14 ) "textures/base_wall/steel"
4 ( 781 782 783 784 ) ( -0 0 1 ) 8 ( -1186.3999023438 -561.6000976562 8 ) ( -1058.3999023438 -433.6000976562 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
- 4 ( 2496 -938 2495 780 ) ( 0 0 -1 ) -0 ( -2479.1999511719 -561.6000976562 0 ) ( -1058.3999023438 -433.6000671387 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
+ 4 ( 2894 -938 2893 780 ) ( 0 0 -1 ) -0 ( -2479.1999511719 -561.6000976562 0 ) ( -1058.3999023438 -433.6000671387 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( 1569 -804 1570 -966 ) ( -0 0 1 ) 8 ( -2607.1999511719 -945.6000976562 8 ) ( -1058.3999023438 -561.6000976562 8 ) "textures/mars_citybuilder/mars_road_dusty_center"
4 ( 1567 -964 1568 -798 ) ( 0 0 -1 ) -0 ( -2607.1999511719 -945.6000976562 0 ) ( -1058.3999023438 -561.6000976562 0 ) "textures/mars_citybuilder/mars_road_dusty_center"
4 ( 127 128 129 130 ) ( -0 0 1 ) 8 ( -2479.1999511719 -433.6000671387 8 ) ( -1186.3999023438 769.5995483398 8 ) "textures/mars_citybuilder/mars_dirt"
@@ -5358,7 +9898,7 @@ collisionModel "worldMap" {
4 ( -750 -758 -756 -760 ) ( -1 0 0 ) 686.3999023438 ( -686.3999023438 -994.6000976562 112 ) ( -686.3999023438 -984.6000976562 136 ) "textures/base_wall/greenpanel1"
4 ( -737 745 -741 746 ) ( -0 -1 -0 ) 1045.6000976562 ( -635.3999023438 -1045.6000976562 140 ) ( -625.3999023438 -1045.6000976562 164 ) "textures/base_wall/greenpanel1"
4 ( 787 788 789 790 ) ( -0 0 1 ) 8 ( -674.3999023438 -1073.6000976562 8 ) ( -546.3999023438 -945.6000976562 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
- 4 ( 2490 805 -2290 785 ) ( 0 0 -1 ) -0 ( -674.3999023438 -2404.8000488281 0 ) ( -546.3999023438 -945.6000976562 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
+ 4 ( 2880 805 -2290 785 ) ( 0 0 -1 ) -0 ( -674.3999023438 -2404.8000488281 0 ) ( -546.3999023438 -945.6000976562 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( 765 766 767 -762 ) ( 1 0 0 ) -626.3999023438 ( -626.3999023438 -993.6000976562 8 ) ( -626.3999023438 -985.6000976562 112 ) "textures/base_wall/steel"
4 ( -835 2291 -801 2292 ) ( -0 0 1 ) 8 ( -1058.3999023438 -2404.8000488281 8 ) ( -674.3999023438 -945.6000976562 8 ) "textures/mars_citybuilder/mars_road_dusty_center_east_west"
4 ( -831 2289 -797 2290 ) ( 0 0 -1 ) -0 ( -1058.3999023438 -2404.8000488281 0 ) ( -674.3999023438 -945.6000976562 0 ) "textures/mars_citybuilder/mars_road_dusty_center_east_west"
@@ -5369,7 +9909,7 @@ collisionModel "worldMap" {
4 ( 2234 2235 -2227 -2233 ) ( -0 1 0 ) -1073.6000976562 ( -1074.3999023438 -1073.6000976562 8 ) ( -1058.3999023438 -1073.6000976562 14 ) "textures/base_wall/steel"
4 ( 1508 1509 -1502 -1506 ) ( 1 0 0 ) -1186.3999023438 ( -1186.3999023438 -961.6000976562 8 ) ( -1186.3999023438 -945.6000976562 14 ) "textures/base_wall/steel"
4 ( 793 794 795 796 ) ( -0 0 1 ) 8 ( -1186.3999023438 -1073.6000976562 8 ) ( -1058.3999023438 -945.6000976562 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
- 4 ( 2489 -811 2488 792 ) ( 0 0 -1 ) -0 ( -1186.3999023438 -2276.8000488281 0 ) ( -1058.3999023438 -945.6000976562 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
+ 4 ( 2879 -811 2878 792 ) ( 0 0 -1 ) -0 ( -1186.3999023438 -2276.8000488281 0 ) ( -1058.3999023438 -945.6000976562 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( 2237 -166 2238 -2220 ) ( -0 0 1 ) 8 ( -658.3999023438 -2276.8000488281 8 ) ( -546.3999023438 -1073.6000976562 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( 2224 -2219 -2216 -2223 ) ( -1 0 0 ) 674.3999023438 ( -674.3999023438 -2276.8000488281 8 ) ( -674.3999023438 -1073.6000976562 14 ) "textures/base_wall/steel"
4 ( 2220 2221 -2214 -2218 ) ( 1 0 0 ) -658.3999023438 ( -658.3999023438 -2276.8000488281 8 ) ( -658.3999023438 -1073.6000976562 14 ) "textures/base_wall/steel"
@@ -5388,7 +9928,7 @@ collisionModel "worldMap" {
4 ( 167 168 169 170 ) ( 0 0 -1 ) -0 ( -2479.1999511719 -2276.7998046875 0 ) ( -1186.3999023438 -1073.5999755859 0 ) "textures/mars_citybuilder/mars_dirt"
4 ( 2401 2402 -2394 -2400 ) ( -0 1 0 ) -1073.6000976562 ( -2607.1999511719 -1073.6000976562 8 ) ( -2591.1999511719 -1073.6000976562 14 ) "textures/base_wall/steel"
4 ( 951 952 953 954 ) ( -0 0 1 ) 8 ( -2607.1999511719 -1073.6000976562 8 ) ( -2479.1999511719 -945.6000976562 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
- 4 ( 2485 1005 -2469 949 ) ( 0 0 -1 ) -0 ( -2607.1999511719 -2404.8000488281 0 ) ( -2479.1999511719 -945.6000976562 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
+ 4 ( 2875 1005 -2469 949 ) ( 0 0 -1 ) -0 ( -2607.1999511719 -2404.8000488281 0 ) ( -2479.1999511719 -945.6000976562 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( 2416 -174 2417 -2399 ) ( -0 0 1 ) 8 ( -2591.1999511719 -2276.8000488281 8 ) ( -2479.1999511719 -1073.6000976562 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( 2403 -2398 -2395 -2402 ) ( -1 0 0 ) 2607.1999511719 ( -2607.1999511719 -2276.8000488281 8 ) ( -2607.1999511719 -1073.6000976562 14 ) "textures/base_wall/steel"
4 ( 2399 2400 -2393 -2397 ) ( 1 0 0 ) -2591.1999511719 ( -2591.1999511719 -2276.8000488281 8 ) ( -2591.1999511719 -1073.6000976562 14 ) "textures/base_wall/steel"
@@ -5400,7 +9940,36 @@ collisionModel "worldMap" {
4 ( 1571 1572 1573 -962 ) ( 0 0 -1 ) -0 ( -4732 -945.6000366211 0 ) ( -2991.1999511719 -561.6000366211 0 ) "textures/mars_citybuilder/mars_road_dusty_center"
4 ( 1525 1526 -1519 -1523 ) ( 1 0 0 ) -3119.1999511719 ( -3119.1999511719 -561.6000976562 8 ) ( -3119.1999511719 -545.6000976562 14 ) "textures/base_wall/steel"
4 ( 945 946 947 948 ) ( -0 0 1 ) 8 ( -3119.1999511719 -561.6000976562 8 ) ( -2991.1999511719 -433.6000976562 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
- 4 ( -1573 1542 2491 944 ) ( 0 0 -1 ) -0 ( -4732 -561.6000976562 0 ) ( -2991.1999511719 -433.6000976562 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
+ 4 ( -1573 1542 2887 944 ) ( 0 0 -1 ) -0 ( -4732 -561.6000976562 0 ) ( -2991.1999511719 -433.6000976562 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
+ 4 ( 2670 2671 2672 -2664 ) ( 0.0366788208 0.0031517004 0.999322176 ) -146.3294830322 ( -4552 -576 8 ) ( -4189.1298828125 -64 22.4631118774 ) "textures/common/caulk"
+ 3 ( 2667 2668 2669 ) ( 0.0438307486 -0.0040118373 0.9990309477 ) -174.7653961182 ( -4552 -576 0 ) ( -4040 -64 22.4631118774 ) "textures/common/caulk"
+ 3 ( -2665 2666 -2661 ) ( 0.0810245574 0.016046986 0.9965829253 ) -349.0736694336 ( -5064 -576 20.8483467102 ) ( -4552 -64 70.7193908691 ) "textures/common/caulk"
+ 3 ( -2641 2664 2665 ) ( 0.0938342288 0.0031399073 0.9955828786 ) -406.578125 ( -5064 -576 20.8483467102 ) ( -4552 -64 70.7193908691 ) "textures/common/caulk"
+ 3 ( -2662 2663 -2658 ) ( -0.064002037 -0.0473753437 0.9968246222 ) 389.4151306152 ( -5576 -576 5.2682919502 ) ( -5064 -64 62.4751625061 ) "textures/common/caulk"
+ 3 ( -2638 2661 2662 ) ( -0.1267861277 0.015969988 0.9918015003 ) 702.9858398438 ( -5576 -576 5.2682919502 ) ( -5064 -64 70.7193908691 ) "textures/common/caulk"
+ 3 ( -2659 2660 -2655 ) ( 0.0056557478 0.2015559375 0.9794606566 ) -15.4422912598 ( -6088 -576 29.6017360687 ) ( -5576 -64 137.9188842773 ) "textures/common/caulk"
+ 3 ( -2635 2658 2659 ) ( 0.2505374253 -0.0459586196 0.9670153856 ) -1365.4299316406 ( -6088 -576 5.2682919502 ) ( -5576 -64 137.9188842773 ) "textures/common/caulk"
+ 3 ( -2656 2657 -2652 ) ( -0.0234824643 0.3354765773 0.9417558312 ) 152.1526184082 ( -6600 -576 19.7915916443 ) ( -6088 -64 202.1785888672 ) "textures/common/caulk"
+ 3 ( -2632 2655 2656 ) ( 0.1220128909 0.2000532299 0.9721581936 ) -723.9661865234 ( -6600 -576 32.5582046509 ) ( -6088 -64 202.1785888672 ) "textures/common/caulk"
+ 3 ( -2653 2654 -2649 ) ( -0.0349542014 0.0918829441 0.9951561093 ) 244.5129394531 ( -7112 -576 1.807929635 ) ( -6600 -64 49.0809822083 ) "textures/common/caulk"
+ 3 ( -2629 2652 2653 ) ( -0.2711293995 0.322999686 0.9067304134 ) 1786.7276611328 ( -7112 -576 19.7915916443 ) ( -6600 -64 202.1785888672 ) "textures/common/caulk"
+ 3 ( -2650 2651 -2648 ) ( -0.0035310904 0 0.9999937415 ) 26.9210338593 ( -7624 -576 0 ) ( -7112 -64 1.807929635 ) "textures/common/caulk"
+ 3 ( -2626 2649 2650 ) ( -0.0950233564 0.0915231109 0.9912588596 ) 671.7407836914 ( -7624 -576 0 ) ( -7112 -64 49.0809822083 ) "textures/common/caulk"
+ 5 ( 2648 2885 2886 2881 -2623 ) ( 0 0 1 ) 0 ( -20936 -1088 0 ) ( -7624 -64 0 ) "textures/common/caulk"
+ 4 ( -2692 2693 2694 -2688 ) ( 0.051529292 -0.0238349717 0.9983870387 ) -212.2211914062 ( -4552 -64 8 ) ( -4066.2348632812 448 33.0715675354 ) "textures/common/caulk"
+ 3 ( -2672 2691 2692 ) ( 0.0366775282 -0.0089582438 0.9992870092 ) -145.5493011475 ( -4552 -64 8 ) ( -4088.8139648438 399.1860351562 20.8483467102 ) "textures/common/caulk"
+ 3 ( -2689 2690 -2685 ) ( 0.1145208925 -0.0575656928 0.9917515516 ) -514.2897338867 ( -5064 -64 33.0715675354 ) ( -4552 448 92.1939315796 ) "textures/common/caulk"
+ 3 ( -2666 2688 2689 ) ( 0.0810120627 -0.0237882305 0.9964292049 ) -346.4705505371 ( -5064 -64 20.8483467102 ) ( -4552 448 62.4751625061 ) "textures/common/caulk"
+ 3 ( -2686 2687 -2682 ) ( -0.044325497 -0.0774372667 0.9960113764 ) 281.5986022949 ( -5576 -64 29.6017360687 ) ( -5064 448 92.1939315796 ) "textures/common/caulk"
+ 3 ( -2663 2685 2686 ) ( -0.0639667585 -0.057828255 0.9962751269 ) 389.8711547852 ( -5576 -64 29.6017360687 ) ( -5064 448 92.1939315796 ) "textures/common/caulk"
+ 3 ( -2683 2684 -2679 ) ( -0.1340686232 0.0628891289 0.9889745116 ) 844.3840942383 ( -6088 -64 0 ) ( -5576 448 69.4083938599 ) "textures/common/caulk"
+ 3 ( -2660 2682 2683 ) ( 0.0057568839 -0.0775121674 0.9969747663 ) 2.3725795746 ( -6088 -64 29.6017360687 ) ( -5576 448 69.4083938599 ) "textures/common/caulk"
+ 3 ( -2680 2681 -2676 ) ( 0 0.0386266038 0.9992536902 ) 17.3047180176 ( -6600 -64 0 ) ( -6088 448 19.7915916443 ) "textures/common/caulk"
+ 3 ( -2657 2679 2680 ) ( -0.0248768274 0.0634424165 0.9976753592 ) 179.8723144531 ( -6600 -64 0 ) ( -6088 448 32.5582046509 ) "textures/common/caulk"
+ 3 ( -2677 2678 -2674 ) ( 0 0.0035310904 0.9999937415 ) 1.5819284916 ( -7112 -64 0 ) ( -6600 448 1.807929635 ) "textures/common/caulk"
+ 3 ( -2654 2676 2677 ) ( -0.0350765288 0.0386028364 0.9986388087 ) 248.7991638184 ( -7112 -64 0 ) ( -6600 448 19.7915916443 ) "textures/common/caulk"
+ 4 ( -2885 -2675 2889 2673 ) ( 0 0 1 ) 0 ( -20936 -64 0 ) ( -7112 448 0 ) "textures/common/caulk"
+ 3 ( -2651 2674 2675 ) ( -0.0035310686 0.0035310686 0.9999875426 ) 26.6948776245 ( -7624 -64 0 ) ( -7112 448 1.807929635 ) "textures/common/caulk"
4 ( -1572 -1552 -1576 -1545 ) ( -1 0 0 ) 4732 ( -4732 -945.6000366211 0 ) ( -4732 -561.6000366211 8 ) "textures/mars_citybuilder/mars_road_dusty_center"
4 ( -1542 1545 1546 -139 ) ( -1 0 0 ) 4732 ( -4732 -561.6000976562 0 ) ( -4732 -433.6000976562 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( 1543 -135 1544 -1527 ) ( -0 0 1 ) 8 ( -4732 -545.6000976562 8 ) ( -3119.1999511719 -433.6000976562 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
@@ -5408,12 +9977,27 @@ collisionModel "worldMap" {
4 ( 1527 1528 -1520 -1526 ) ( -0 1 0 ) -545.6000976562 ( -4732 -545.6000976562 8 ) ( -3119.1999511719 -545.6000976562 14 ) "textures/base_wall/steel"
4 ( 1522 1523 -1518 1524 ) ( -0 -1 -0 ) 561.6000976562 ( -4732 -561.6000976562 8 ) ( -3119.1999511719 -561.6000976562 14 ) "textures/base_wall/steel"
4 ( 1518 1519 1520 1521 ) ( -0 0 1 ) 14 ( -4732 -561.6000976562 14 ) ( -3119.1999511719 -545.6000976562 14 ) "textures/base_wall/steel"
+ 4 ( 2645 2646 2647 -2639 ) ( 0.0438287854 0.0102800224 0.9989861846 ) -182.9895935059 ( -4552 -1088 8 ) ( -4187.7001953125 -576 27.7318248749 ) "textures/common/caulk"
+ 3 ( 2642 2643 2644 ) ( 0.0540844426 0 0.9985363483 ) -218.5011444092 ( -4552 -1088 0 ) ( -4040 -576 27.7318248749 ) "textures/common/caulk"
+ 3 ( -2640 2641 -2636 ) ( 0.0937202275 -0.0493788347 0.9943733215 ) -375.8355407715 ( -5064 -1088 22.4631118774 ) ( -4552 -576 70.7193908691 ) "textures/common/caulk"
+ 3 ( -2617 2639 2640 ) ( 0.034279868 0.0102838622 0.9993593693 ) -139.5167388916 ( -5064 -1088 22.4631118774 ) ( -4552 -576 45.2943687439 ) "textures/common/caulk"
+ 3 ( -2637 2638 -2633 ) ( -0.1267956942 -0.0102060437 0.9918763638 ) 718.1170043945 ( -5576 -1088 0 ) ( -5064 -576 70.7193908691 ) "textures/common/caulk"
+ 3 ( -2614 2636 2637 ) ( -0.0880138054 -0.0494046584 0.9948933721 ) 544.5172729492 ( -5576 -1088 0 ) ( -5064 -576 70.7193908691 ) "textures/common/caulk"
+ 3 ( -2634 2635 -2630 ) ( 0.2459381968 -0.1959930211 0.9492634535 ) -1253.4584960938 ( -6088 -1088 5.2682919502 ) ( -5576 -576 137.9188842773 ) "textures/common/caulk"
+ 3 ( -2611 2633 2634 ) ( 0.0627768934 -0.0102687925 0.9979747534 ) -338.8715209961 ( -6088 -1088 0 ) ( -5576 -576 32.2069969177 ) "textures/common/caulk"
+ 3 ( -2631 2632 -2627 ) ( 0.1245204136 -0.0125758601 0.9921373129 ) -614.0020751953 ( -6600 -1088 137.9188842773 ) ( -6088 -576 202.1785888672 ) "textures/common/caulk"
+ 3 ( -2608 2630 2631 ) ( 0.2984529138 -0.192988053 0.9347093105 ) -1576.9060058594 ( -6600 -1088 32.2069969177 ) ( -6088 -576 195.6887207031 ) "textures/common/caulk"
+ 3 ( -2628 2629 -2624 ) ( -0.2841275632 0.1280298382 0.9501999021 ) 1993.6066894531 ( -7112 -1088 49.0809822083 ) ( -6600 -576 202.1785888672 ) "textures/common/caulk"
+ 3 ( -2605 2627 2628 ) ( -0.1498788297 -0.0125313392 0.9886249304 ) 1196.2971191406 ( -7112 -1088 118.067817688 ) ( -6600 -576 202.1785888672 ) "textures/common/caulk"
+ 3 ( -2625 2626 -2622 ) ( -0.0954231992 0.0037024582 0.9954299331 ) 725.373840332 ( -7624 -1088 0 ) ( -7112 -576 49.0809822083 ) "textures/common/caulk"
+ 3 ( -2602 2624 2625 ) ( -0.2193727791 0.1302805096 0.9669036269 ) 1532.5941162109 ( -7624 -1088 1.9043617249 ) ( -7112 -576 118.067817688 ) "textures/common/caulk"
+ 3 ( -2599 2622 2623 ) ( -0.003719405 0.003719405 0.9999861717 ) 26.2143669128 ( -8136 -1088 0 ) ( -7624 -576 1.9043617249 ) "textures/common/caulk"
4 ( -1035 2470 -965 2471 ) ( -0 0 1 ) 8 ( -2991.1999511719 -2404.8000488281 8 ) ( -2607.1999511719 -945.6000976562 8 ) "textures/mars_citybuilder/mars_road_dusty_center_east_west"
4 ( -1031 2468 -961 2469 ) ( 0 0 -1 ) -0 ( -2991.1999511719 -2404.8000488281 0 ) ( -2607.1999511719 -945.6000976562 0 ) "textures/mars_citybuilder/mars_road_dusty_center_east_west"
4 ( 2413 2414 -2406 -2412 ) ( -0 1 0 ) -1073.6000976562 ( -3007.1999511719 -1073.6000976562 8 ) ( -2991.1999511719 -1073.6000976562 14 ) "textures/base_wall/steel"
4 ( 1537 1538 -1531 -1535 ) ( 1 0 0 ) -3119.1999511719 ( -3119.1999511719 -961.6000976562 8 ) ( -3119.1999511719 -945.6000976562 14 ) "textures/base_wall/steel"
4 ( 957 958 959 960 ) ( -0 0 1 ) 8 ( -3119.1999511719 -1073.6000976562 8 ) ( -2991.1999511719 -945.6000976562 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
- 4 ( 2481 -1011 2480 956 ) ( 0 0 -1 ) -0 ( -3119.1999511719 -2276.8000488281 0 ) ( -2991.1999511719 -945.6000976562 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
+ 4 ( 2871 -1011 2870 956 ) ( 0 0 -1 ) -0 ( -3119.1999511719 -2276.8000488281 0 ) ( -2991.1999511719 -945.6000976562 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( 2411 2412 -2405 -2409 ) ( 1 0 0 ) -2991.1999511719 ( -2991.1999511719 -2276.8000488281 8 ) ( -2991.1999511719 -1073.6000976562 14 ) "textures/base_wall/steel"
4 ( 2418 -2415 2419 -180 ) ( -0 0 1 ) 8 ( -3119.1999511719 -2276.8000488281 8 ) ( -3007.1999511719 -1073.6000976562 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( 2415 -2410 -2407 -2414 ) ( -1 0 0 ) 3007.1999511719 ( -3007.1999511719 -2276.8000488281 8 ) ( -3007.1999511719 -1073.6000976562 14 ) "textures/base_wall/steel"
@@ -5425,6 +10009,51 @@ collisionModel "worldMap" {
4 ( 1539 1540 -1532 -1538 ) ( -0 1 0 ) -945.6000976562 ( -4732 -945.6000976562 8 ) ( -3119.1999511719 -945.6000976562 14 ) "textures/base_wall/steel"
4 ( 1534 1535 -1530 1536 ) ( -0 -1 -0 ) 961.6000976562 ( -4732 -961.6000976562 8 ) ( -3119.1999511719 -961.6000976562 14 ) "textures/base_wall/steel"
4 ( 1530 1531 1532 1533 ) ( -0 0 1 ) 14 ( -4732 -961.6000976562 14 ) ( -3119.1999511719 -945.6000976562 14 ) "textures/base_wall/steel"
+ 4 ( -2619 2620 2621 -2615 ) ( 0.0540661998 -0.0259721149 0.9981995225 ) -190.1697845459 ( -4552 -1600 8 ) ( -4187.7001953125 -1088 27.7318248749 ) "textures/common/caulk"
+ 3 ( -2595 2618 2619 ) ( 0.0281336177 0 0.9996041656 ) -113.6598129272 ( -4552 -1600 8 ) ( -4324.2446289062 -1372.2447509766 14.4101161957 ) "textures/common/caulk"
+ 3 ( -2616 2617 -2612 ) ( 0.0342155546 -0.0620812289 0.9974844456 ) -60.5427589417 ( -5064 -1600 13.4286193848 ) ( -4552 -1088 45.2943687439 ) "textures/common/caulk"
+ 3 ( -2591 2615 2616 ) ( -0.0019163339 -0.026010111 0.9996598363 ) 64.7445449829 ( -5064 -1600 13.4286193848 ) ( -4552 -1088 27.7318248749 ) "textures/common/caulk"
+ 3 ( -2613 2614 -2609 ) ( -0.0881214067 0 0.996109724 ) 491.3649597168 ( -5576 -1600 0 ) ( -5064 -1088 45.2943687439 ) "textures/common/caulk"
+ 3 ( -2588 2612 2613 ) ( -0.0261681583 -0.0620963275 0.9977270365 ) 245.2677764893 ( -5576 -1600 0 ) ( -5064 -1088 45.2943687439 ) "textures/common/caulk"
+ 3 ( -2610 2611 -2606 ) ( 0.0626622066 -0.061282333 0.9961515665 ) -282.729309082 ( -6088 -1600 0 ) ( -5576 -1088 32.2069969177 ) "textures/common/caulk"
+ 3 ( -2585 2609 2610 ) ( 0.0013852043 0 0.9999990463 ) -7.7238988876 ( -6088 -1600 0 ) ( -5576 -1088 0.7092252374 ) "textures/common/caulk"
+ 3 ( -2607 2608 -2603 ) ( 0.2903466225 -0.2980485559 0.9093216658 ) -1414.0668945312 ( -6600 -1600 27.8703784943 ) ( -6088 -1088 195.6887207031 ) "textures/common/caulk"
+ 3 ( -2582 2606 2607 ) ( 0.0528749563 -0.0613171086 0.9967167974 ) -223.0884552002 ( -6600 -1600 0.7092252374 ) ( -6088 -1088 32.2069969177 ) "textures/common/caulk"
+ 3 ( -2604 2605 -2600 ) ( -0.1477431059 -0.1686680317 0.9745373726 ) 1349.3214111328 ( -7112 -1600 29.4534320831 ) ( -6600 -1088 195.6887207031 ) "textures/common/caulk"
+ 3 ( -2579 2603 2604 ) ( 0.0029380892 -0.3114646673 0.9502531886 ) 505.4360046387 ( -7112 -1600 27.8703784943 ) ( -6600 -1088 195.6887207031 ) "textures/common/caulk"
+ 3 ( -2601 2602 -2597 ) ( -0.2212576419 -0.0028313908 0.9752112627 ) 1691.8060302734 ( -7624 -1600 0.4178406 ) ( -7112 -1088 118.067817688 ) "textures/common/caulk"
+ 3 ( -2576 2600 2601 ) ( -0.0557923466 -0.1702739447 0.9838160872 ) 698.2102661133 ( -7624 -1600 0.4178406 ) ( -7112 -1088 118.067817688 ) "textures/common/caulk"
+ 3 ( -2598 2599 -2596 ) ( -0.0037194309 0 0.9999930859 ) 30.2612895966 ( -8136 -1600 0 ) ( -7624 -1088 1.9043617249 ) "textures/common/caulk"
+ 3 ( -2573 2597 2598 ) ( -0.0008160912 -0.0029033485 0.99999547 ) 11.2850761414 ( -8136 -1600 0 ) ( -7624 -1088 1.9043617249 ) "textures/common/caulk"
+ 4 ( 2884 2882 2883 -2881 ) ( 0 0 1 ) 0 ( -20936 -2112 0 ) ( -8136 -1088 0 ) "textures/common/caulk"
+ 4 ( -2593 2594 2595 -2589 ) ( 0.0280809682 0.0611493923 0.9977335334 ) -211.2861633301 ( -4552 -2112 8 ) ( -4129.4521484375 -1600 45.7897262573 ) "textures/common/caulk"
+ 3 ( -2569 2592 2593 ) ( 0.0890775397 0 0.9960247278 ) -359.873260498 ( -4552 -2112 8 ) ( -4129.4521484375 -1689.4523925781 45.7897262573 ) "textures/common/caulk"
+ 3 ( -2590 2591 -2586 ) ( -0.0019136243 0.059165094 0.9982464314 ) -71.5684814453 ( -5064 -2112 13.4286193848 ) ( -4552 -1600 43.7743606567 ) "textures/common/caulk"
+ 3 ( -2564 2589 2590 ) ( -0.0039288583 0.0611730441 0.9981194139 ) -65.6096878052 ( -5064 -2112 14.4101161957 ) ( -4552 -1600 45.7897262573 ) "textures/common/caulk"
+ 3 ( -2587 2588 -2583 ) ( -0.026218757 0 0.99965626 ) 146.1957855225 ( -5576 -2112 0 ) ( -5064 -1600 13.4286193848 ) "textures/common/caulk"
+ 3 ( -2561 2586 2587 ) ( -0.0850378722 0.0589508824 0.9946322441 ) 349.6669006348 ( -5576 -2112 0 ) ( -5064 -1600 43.7743606567 ) "textures/common/caulk"
+ 3 ( -2584 2585 -2580 ) ( 0.0013852029 -0.0013852029 0.9999980927 ) -5.507566452 ( -6088 -2112 0 ) ( -5576 -1600 0.7092252374 ) "textures/common/caulk"
+ 3 ( 2866 2864 2865 ) ( 0 0 1 ) 0 ( -6600 -2624 0 ) ( -5576 -1600 0 ) "textures/common/caulk"
+ 3 ( -2581 2582 -2577 ) ( 0.052899152 -0.0533656329 0.9971728921 ) -235.9577941895 ( -6600 -2112 0.4697090983 ) ( -6088 -1600 27.8703784943 ) "textures/common/caulk"
+ 3 ( -2557 2580 2581 ) ( 0.0009173993 -0.0013852037 0.9999986291 ) -2.6595766544 ( -6600 -2112 0 ) ( -6088 -1600 0.7092252374 ) "textures/common/caulk"
+ 3 ( -2578 2579 -2574 ) ( 0.0030870009 -0.0561955795 0.9984149933 ) 97.3649291992 ( -7112 -2112 0.6356186867 ) ( -6600 -1600 29.4534320831 ) "textures/common/caulk"
+ 3 ( -2555 2577 2578 ) ( 0.0003235791 -0.0534404553 0.9985709786 ) 111.1996612549 ( -7112 -2112 0.4697090983 ) ( -6600 -1600 27.8703784943 ) "textures/common/caulk"
+ 3 ( -2575 2576 -2571 ) ( -0.0566191487 -0.0008147855 0.9983955026 ) 433.3852233887 ( -7624 -2112 0 ) ( -7112 -1600 29.4534320831 ) "textures/common/caulk"
+ 3 ( -2552 2574 2575 ) ( -0.00123948 -0.0561958067 0.9984189868 ) 128.135345459 ( -7624 -2112 0 ) ( -7112 -1600 29.4534320831 ) "textures/common/caulk"
+ 3 ( -2572 2573 -2570 ) ( -0.0008160946 0 0.9999996424 ) 6.6397457123 ( -8136 -2112 0 ) ( -7624 -1600 0.4178406 ) "textures/common/caulk"
+ 3 ( -2549 2571 2572 ) ( 0 -0.0008160946 0.9999996424 ) 1.7235918045 ( -8136 -2112 0 ) ( -7624 -1600 0.4178406 ) "textures/common/caulk"
+ 4 ( 2567 2568 2569 -2562 ) ( 0.0890698656 -0.0131180929 0.9959389567 ) -332.1368408203 ( -4552 -2624 8 ) ( -4129.4521484375 -2112 45.7897262573 ) "textures/common/caulk"
+ 3 ( -2546 2565 2566 ) ( 0.0760406777 0 0.9971047044 ) -307.2043457031 ( -4552 -2624 0 ) ( -4040 -2112 39.0458755493 ) "textures/common/caulk"
+ 3 ( -2563 2564 -2559 ) ( -0.0039360425 -0.0097734723 0.9999445081 ) 84.3456268311 ( -5064 -2624 38.7700653076 ) ( -4552 -2112 45.7897262573 ) "textures/common/caulk"
+ 3 ( -2542 2562 2563 ) ( -0.0005386451 -0.0131704388 0.9999130964 ) 76.0536270142 ( -5064 -2624 38.7700653076 ) ( -4552 -2112 45.7897262573 ) "textures/common/caulk"
+ 3 ( -2560 2561 -2558 ) ( -0.085186027 0 0.9963650703 ) 474.9972839355 ( -5576 -2624 0 ) ( -5064 -2112 43.7743606567 ) "textures/common/caulk"
+ 3 ( -2539 2559 2560 ) ( -0.0755030364 -0.00974565 0.9970979691 ) 446.5775146484 ( -5576 -2624 0 ) ( -5064 -2112 43.7743606567 ) "textures/common/caulk"
+ 3 ( -2556 2557 -2553 ) ( 0.0009173998 -0.0009173998 0.9999991655 ) -3.6475815773 ( -6600 -2624 0 ) ( -6088 -2112 0.4697090983 ) "textures/common/caulk"
+ 3 ( -2554 2555 -2550 ) ( 0.0003240419 -0.0012414417 0.9999991655 ) 0.9529571533 ( -7112 -2624 0 ) ( -6600 -2112 0.6356186867 ) "textures/common/caulk"
+ 3 ( -2535 2553 2554 ) ( 0 -0.0009174002 0.9999995828 ) 2.4072580338 ( -7112 -2624 0 ) ( -6600 -2112 0.4697090983 ) "textures/common/caulk"
+ 3 ( -2551 2552 -2548 ) ( -0.0012414418 0 0.9999992251 ) 9.4647521973 ( -7624 -2624 0 ) ( -7112 -2112 0.6356186867 ) "textures/common/caulk"
+ 3 ( -2534 2550 2551 ) ( 0 -0.0012414418 0.9999992251 ) 3.2575433254 ( -7624 -2624 0 ) ( -7112 -2112 0.6356186867 ) "textures/common/caulk"
+ 4 ( 2868 2548 2867 2547 ) ( 0 0 1 ) 0 ( -20936 -2624 0 ) ( -7624 -2112 0 ) "textures/common/caulk"
4 ( -176 183 -182 184 ) ( -1 0 0 ) 4732 ( -4732 -2276.8000488281 0 ) ( -4732 -1073.6000976562 8 ) "textures/mars_citybuilder/mars_dirt"
4 ( 179 180 181 182 ) ( -0 0 1 ) 8 ( -4732 -2276.8000488281 8 ) ( -3119.1999511719 -1073.6000976562 8 ) "textures/mars_citybuilder/mars_dirt"
4 ( 175 176 177 178 ) ( 0 0 -1 ) -0 ( -4732 -2276.8000488281 0 ) ( -3119.1999511719 -1073.6000976562 0 ) "textures/mars_citybuilder/mars_dirt"
@@ -5433,20 +10062,20 @@ collisionModel "worldMap" {
4 ( 2229 2230 -2225 2231 ) ( -0 -1 -0 ) 2276.8000488281 ( -1074.3999023438 -2276.8000488281 8 ) ( -1058.3999023438 -2276.8000488281 14 ) "textures/base_wall/steel"
4 ( 1676 1677 -1670 -1674 ) ( 1 0 0 ) -1186.3999023438 ( -1186.3999023438 -2404.8000488281 8 ) ( -1186.3999023438 -2388.8000488281 14 ) "textures/base_wall/steel"
4 ( 813 814 815 816 ) ( -0 0 1 ) 8 ( -1186.3999023438 -2404.8000488281 8 ) ( -1058.3999023438 -2276.8000488281 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
- 4 ( 2487 -1006 2486 812 ) ( 0 0 -1 ) -0 ( -2479.1999511719 -2404.8000488281 0 ) ( -1058.3999023438 -2276.7998046875 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
+ 4 ( 2877 -1006 2876 812 ) ( 0 0 -1 ) -0 ( -2479.1999511719 -2404.8000488281 0 ) ( -1058.3999023438 -2276.7998046875 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( 833 834 835 836 ) ( -0 0 1 ) 8 ( -1058.3999023438 -2788.8000488281 8 ) ( -674.3999023438 -2404.8000488281 8 ) "textures/mars_citybuilder/mars_road_dusty_intersection"
4 ( 829 830 831 832 ) ( 0 0 -1 ) -0 ( -1058.3999023438 -2788.8000488281 0 ) ( -674.3999023438 -2404.8000488281 0 ) "textures/mars_citybuilder/mars_road_dusty_intersection"
4 ( 2296 2297 -833 2298 ) ( -0 0 1 ) 8 ( -1058.3997802734 -4440 8 ) ( -674.3998413086 -2788.8000488281 8 ) "textures/mars_citybuilder/mars_road_dusty_center_east_west"
4 ( 2293 2294 -829 2295 ) ( 0 0 -1 ) -0 ( -1058.3997802734 -4440 0 ) ( -674.3998413086 -2788.8000488281 0 ) "textures/mars_citybuilder/mars_road_dusty_center_east_west"
4 ( 2250 2251 -2243 -2249 ) ( -0 1 0 ) -2916.8000488281 ( -674.3999023438 -2916.8000488281 8 ) ( -658.3999023438 -2916.8000488281 14 ) "textures/base_wall/steel"
4 ( 819 820 821 822 ) ( -0 0 1 ) 8 ( -674.3999023438 -2916.8000488281 8 ) ( -546.3999023438 -2788.8000488281 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
- 4 ( 2484 2265 -2295 817 ) ( 0 0 -1 ) -0 ( -674.3999023438 -4440 0 ) ( -546.3999023438 -2788.8000488281 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
+ 4 ( 2874 2265 -2295 817 ) ( 0 0 -1 ) -0 ( -674.3999023438 -4440 0 ) ( -546.3999023438 -2788.8000488281 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( 1749 -836 1750 -1034 ) ( -0 0 1 ) 8 ( -2607.1999511719 -2788.8000488281 8 ) ( -1058.3999023438 -2404.8000488281 8 ) "textures/mars_citybuilder/mars_road_dusty_center"
4 ( 1747 -1032 1748 -830 ) ( 0 0 -1 ) -0 ( -2607.1999511719 -2788.8000488281 0 ) ( -1058.3999023438 -2404.8000488281 0 ) "textures/mars_citybuilder/mars_road_dusty_center"
4 ( 2262 2263 -2255 -2261 ) ( -0 1 0 ) -2916.8000488281 ( -1074.3999023438 -2916.8000488281 8 ) ( -1058.3999023438 -2916.8000488281 14 ) "textures/base_wall/steel"
4 ( 1688 1689 -1682 -1686 ) ( 1 0 0 ) -1186.3999023438 ( -1186.3999023438 -2804.8000488281 8 ) ( -1186.3999023438 -2788.8000488281 14 ) "textures/base_wall/steel"
4 ( 825 826 827 828 ) ( -0 0 1 ) 8 ( -1186.3999023438 -2916.8000488281 8 ) ( -1058.3999023438 -2788.8000488281 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
- 4 ( -2294 2270 2483 824 ) ( 0 0 -1 ) -0 ( -1186.3999023438 -4440 0 ) ( -1058.3999023438 -2788.8000488281 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
+ 4 ( -2294 2270 2873 824 ) ( 0 0 -1 ) -0 ( -1186.3999023438 -4440 0 ) ( -1058.3999023438 -2788.8000488281 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( 1693 -171 1694 -1678 ) ( -0 0 1 ) 8 ( -2479.1999511719 -2388.8000488281 8 ) ( -1186.3999023438 -2276.7998046875 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( 1680 -1675 -1672 -1679 ) ( -1 0 0 ) 2479.1999511719 ( -2479.1999511719 -2404.8000488281 8 ) ( -2479.1999511719 -2388.8000488281 14 ) "textures/base_wall/steel"
4 ( 1678 1679 -1671 -1677 ) ( -0 1 0 ) -2388.8000488281 ( -2479.1999511719 -2388.8000488281 8 ) ( -1186.3999023438 -2388.8000488281 14 ) "textures/base_wall/steel"
@@ -5477,7 +10106,7 @@ collisionModel "worldMap" {
4 ( -982 -990 -988 -992 ) ( -1 0 0 ) 2619.1999511719 ( -2619.1999511719 -2837.8000488281 112 ) ( -2619.1999511719 -2827.8000488281 136 ) "textures/base_wall/greenpanel1"
4 ( -969 977 -973 978 ) ( -0 -1 -0 ) 2888.8000488281 ( -2568.1999511719 -2888.8000488281 140 ) ( -2558.1999511719 -2888.8000488281 164 ) "textures/base_wall/greenpanel1"
4 ( 1019 1020 1021 1022 ) ( -0 0 1 ) 8 ( -2607.1999511719 -2916.8000488281 8 ) ( -2479.1999511719 -2788.8000488281 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
- 4 ( 2482 2444 -2474 1017 ) ( 0 0 -1 ) -0 ( -2607.1999511719 -4440 0 ) ( -2479.1999511719 -2788.8000488281 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
+ 4 ( 2872 2444 -2474 1017 ) ( 0 0 -1 ) -0 ( -2607.1999511719 -4440 0 ) ( -2479.1999511719 -2788.8000488281 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( 997 998 999 -994 ) ( 1 0 0 ) -2559.1999511719 ( -2559.1999511719 -2836.8000488281 8 ) ( -2559.1999511719 -2828.8000488281 112 ) "textures/base_wall/steel"
4 ( 2475 2476 -1033 2477 ) ( -0 0 1 ) 8 ( -2991.1997070312 -4440 8 ) ( -2607.1997070312 -2788.8000488281 8 ) "textures/mars_citybuilder/mars_road_dusty_center_east_west"
4 ( 2472 2473 -1029 2474 ) ( 0 0 -1 ) -0 ( -2991.1997070312 -4440 0 ) ( -2607.1997070312 -2788.8000488281 0 ) "textures/mars_citybuilder/mars_road_dusty_center_east_west"
@@ -5511,11 +10140,11 @@ collisionModel "worldMap" {
4 ( 1751 1752 1753 -1030 ) ( 0 0 -1 ) -0 ( -4732 -2788.7998046875 0 ) ( -2991.1999511719 -2404.7998046875 0 ) "textures/mars_citybuilder/mars_road_dusty_center"
4 ( 1705 1706 -1699 -1703 ) ( 1 0 0 ) -3119.1999511719 ( -3119.1999511719 -2404.8000488281 8 ) ( -3119.1999511719 -2388.8000488281 14 ) "textures/base_wall/steel"
4 ( 1013 1014 1015 1016 ) ( -0 0 1 ) 8 ( -3119.1999511719 -2404.8000488281 8 ) ( -2991.1999511719 -2276.8000488281 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
- 4 ( -1753 1722 2479 1012 ) ( 0 0 -1 ) -0 ( -4732 -2404.8000488281 0 ) ( -2991.1999511719 -2276.8000488281 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
+ 4 ( -1753 1722 2869 1012 ) ( 0 0 -1 ) -0 ( -4732 -2404.8000488281 0 ) ( -2991.1999511719 -2276.8000488281 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( 2441 2442 -2434 -2440 ) ( -0 1 0 ) -2916.8000488281 ( -3007.1999511719 -2916.8000488281 8 ) ( -2991.1999511719 -2916.8000488281 14 ) "textures/base_wall/steel"
4 ( 1717 1718 -1711 -1715 ) ( 1 0 0 ) -3119.1999511719 ( -3119.1999511719 -2804.8000488281 8 ) ( -3119.1999511719 -2788.8000488281 14 ) "textures/base_wall/steel"
4 ( 1025 1026 1027 1028 ) ( -0 0 1 ) 8 ( -3119.1999511719 -2916.8000488281 8 ) ( -2991.1999511719 -2788.8000488281 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
- 4 ( -2473 2449 2478 1024 ) ( 0 0 -1 ) -0 ( -3119.1999511719 -4440 0 ) ( -2991.1999511719 -2788.8000488281 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
+ 4 ( -2473 2449 2863 1024 ) ( 0 0 -1 ) -0 ( -3119.1999511719 -4440 0 ) ( -2991.1999511719 -2788.8000488281 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( -1752 -1732 -1756 -1725 ) ( -1 0 0 ) 4732 ( -4732 -2788.7998046875 0 ) ( -4732 -2404.7998046875 8 ) "textures/mars_citybuilder/mars_road_dusty_center"
4 ( -1722 1725 1726 -183 ) ( -1 0 0 ) 4732 ( -4732 -2404.8000488281 0 ) ( -4732 -2276.8000488281 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( 1723 -179 1724 -1707 ) ( -0 0 1 ) 8 ( -4732 -2388.8000488281 8 ) ( -3119.1999511719 -2276.8000488281 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
@@ -5523,6 +10152,13 @@ collisionModel "worldMap" {
4 ( 1707 1708 -1700 -1706 ) ( -0 1 0 ) -2388.8000488281 ( -4732 -2388.8000488281 8 ) ( -3119.1999511719 -2388.8000488281 14 ) "textures/base_wall/steel"
4 ( 1702 1703 -1698 1704 ) ( -0 -1 -0 ) 2404.8000488281 ( -4732 -2404.8000488281 8 ) ( -3119.1999511719 -2404.8000488281 14 ) "textures/base_wall/steel"
4 ( 1698 1699 1700 1701 ) ( -0 0 1 ) 14 ( -4732 -2404.8000488281 14 ) ( -3119.1999511719 -2388.8000488281 14 ) "textures/base_wall/steel"
+ 3 ( 2545 2546 -2540 ) ( 0.0759890452 -0.0368451029 0.9964277148 ) -210.3141937256 ( -4552 -3136 0 ) ( -4040 -2624 39.0458755493 ) "textures/common/caulk"
+ 3 ( -2541 2542 -2537 ) ( -0.0005383713 -0.0344912112 0.9994048476 ) 131.9782409668 ( -5064 -3136 21.1000480652 ) ( -4552 -2624 39.0458755493 ) "textures/common/caulk"
+ 3 ( -2529 2540 2541 ) ( 0.0019254305 -0.0369518735 0.9993152022 ) 127.216293335 ( -5064 -3136 20.1135520935 ) ( -4552 -2624 39.0458755493 ) "textures/common/caulk"
+ 3 ( -2538 2539 -2536 ) ( -0.0755066201 0 0.9971452951 ) 421.0249023438 ( -5576 -3136 0 ) ( -5064 -2624 38.7700653076 ) "textures/common/caulk"
+ 3 ( -2526 2537 2538 ) ( -0.0411516204 -0.0344620012 0.9985584021 ) 337.5342712402 ( -5576 -3136 0 ) ( -5064 -2624 38.7700653076 ) "textures/common/caulk"
+ 4 ( 2858 2856 2857 2851 ) ( 0 0 1 ) 0 ( -20936 -5184 0 ) ( -5576 -2624 0 ) "textures/common/caulk"
+ 3 ( -2533 2543 2544 ) ( 0.0392540023 0 0.9992292523 ) -158.5861663818 ( -4552 -3136 8 ) ( -4243.6435546875 -2827.6437988281 20.1135520935 ) "textures/common/caulk"
4 ( -1727 -236 1731 1732 ) ( -1 0 0 ) 4732 ( -4732 -2916.8000488281 0 ) ( -4732 -2788.8000488281 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( -232 1729 -1714 1730 ) ( -0 0 1 ) 8 ( -4732 -2916.8000488281 8 ) ( -3119.1999511719 -2804.8000488281 8 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
4 ( -228 1727 1728 -1023 ) ( 0 0 -1 ) -0 ( -4732 -2916.8000488281 0 ) ( -3119.1999511719 -2788.8000488281 0 ) "textures/mars_citybuilder/mars_sidewalk_dusty"
@@ -5536,6 +10172,29 @@ collisionModel "worldMap" {
4 ( 2439 2440 -2433 -2437 ) ( 1 0 0 ) -2991.1999511719 ( -2991.1999511719 -4440 8 ) ( -2991.1999511719 -2916.8000488281 14 ) "textures/base_wall/steel"
4 ( 2436 2437 -2432 2438 ) ( -0 -1 -0 ) 4440 ( -3007.1999511719 -4440 8 ) ( -2991.1999511719 -4440 14 ) "textures/base_wall/steel"
4 ( 2432 2433 2434 2435 ) ( -0 0 1 ) 14 ( -3007.1999511719 -4440 14 ) ( -2991.1999511719 -2916.8000488281 14 ) "textures/base_wall/steel"
+ 4 ( -2531 2532 2533 -2527 ) ( 0.0392434448 0.023190625 0.998960495 ) -231.269317627 ( -4552 -3648 8 ) ( -4168.001953125 -3136 31.9995079041 ) "textures/common/caulk"
+ 3 ( -2522 2530 2531 ) ( 0.0623773336 0 0.9980526567 ) -252.0044250488 ( -4552 -3648 8 ) ( -4168.001953125 -3264.001953125 31.9995079041 ) "textures/common/caulk"
+ 3 ( -2528 2529 -2524 ) ( 0.0019267352 -0.003422085 0.999992311 ) 22.0745582581 ( -5064 -3648 19.3479270935 ) ( -4552 -3136 21.1000480652 ) "textures/common/caulk"
+ 3 ( -2518 2527 2528 ) ( -0.0246959273 0.0232014246 0.9994257092 ) 59.7581939697 ( -5064 -3648 19.3479270935 ) ( -4552 -3136 31.9995079041 ) "textures/common/caulk"
+ 3 ( -2525 2526 -2523 ) ( -0.0411760807 0 0.9991518855 ) 229.5978240967 ( -5576 -3648 0 ) ( -5064 -3136 21.1000480652 ) "textures/common/caulk"
+ 3 ( -2515 2524 2525 ) ( -0.0377617478 -0.0034196505 0.9992809296 ) 223.0343933105 ( -5576 -3648 0 ) ( -5064 -3136 21.1000480652 ) "textures/common/caulk"
+ 4 ( -2520 2521 2522 -2516 ) ( 0.0623761751 0.0061000907 0.9980341196 ) -274.2528686523 ( -4552 -4160 8 ) ( -4156.5991210938 -3648 35.12890625 ) "textures/common/caulk"
+ 3 ( -2502 2519 2520 ) ( 0.0684502199 0 0.9976545572 ) -276.5388793945 ( -4552 -4160 8 ) ( -4156.5991210938 -3764.5991210938 35.12890625 ) "textures/common/caulk"
+ 3 ( -2517 2518 -2513 ) ( -0.0247017276 -0.008302399 0.9996603727 ) 174.7180633545 ( -5064 -4160 15.0956544876 ) ( -4552 -3648 31.9995079041 ) "textures/common/caulk"
+ 3 ( -2497 2516 2517 ) ( -0.0390967987 0.0061073187 0.9992167354 ) 187.6635742188 ( -5064 -4160 15.0956544876 ) ( -4552 -3648 35.12890625 ) "textures/common/caulk"
+ 3 ( -2514 2515 -2512 ) ( -0.0377619676 0 0.9992867708 ) 210.5607299805 ( -5576 -4160 0 ) ( -5064 -3648 19.3479270935 ) "textures/common/caulk"
+ 3 ( -2494 2513 2514 ) ( -0.0294698793 -0.0083013261 0.9995312095 ) 198.8575744629 ( -5576 -4160 0 ) ( -5064 -3648 19.3479270935 ) "textures/common/caulk"
+ 4 ( 2500 2501 2502 -2495 ) ( 0.0684032217 -0.0370494463 0.9969695807 ) -122.2233123779 ( -4552 -4672 8 ) ( -4156.5991210938 -4160 35.12890625 ) "textures/common/caulk"
+ 3 ( -2488 2498 2499 ) ( 0.0314335413 0 0.9995058179 ) -126.9915084839 ( -4552 -4672 0 ) ( -4040 -4160 16.1019306183 ) "textures/common/caulk"
+ 3 ( -2496 2497 -2492 ) ( -0.039090205 -0.0193557702 0.999048233 ) 293.554107666 ( -5064 -4672 5.1760582924 ) ( -4552 -4160 35.12890625 ) "textures/common/caulk"
+ 3 ( -2486 2495 2496 ) ( -0.0213200282 -0.0371279866 0.9990830421 ) 286.5979003906 ( -5064 -4672 5.1760582924 ) ( -4552 -4160 35.12890625 ) "textures/common/caulk"
+ 3 ( -2493 2494 -2491 ) ( -0.0294708945 0 0.999565661 ) 164.3297119141 ( -5576 -4672 0 ) ( -5064 -4160 15.0956544876 ) "textures/common/caulk"
+ 3 ( -2483 2492 2493 ) ( -0.0101070758 -0.0193695854 0.9997612834 ) 146.8517608643 ( -5576 -4672 0 ) ( -5064 -4160 15.0956544876 ) "textures/common/caulk"
+ 3 ( -2487 2488 -2484 ) ( 0.0314180255 -0.0314180255 0.9990124702 ) 19.8562011719 ( -4552 -5184 0 ) ( -4040 -4672 16.1019306183 ) "textures/common/caulk"
+ 3 ( -2485 2486 -2481 ) ( -0.0213336498 -0.0101066716 0.9997213483 ) 160.4265899658 ( -5064 -5184 0 ) ( -4552 -4672 16.1019306183 ) "textures/common/caulk"
+ 3 ( -2479 2484 2485 ) ( 0 -0.0314335413 0.9995058179 ) 162.9514770508 ( -5064 -5184 0 ) ( -4552 -4672 16.1019306183 ) "textures/common/caulk"
+ 3 ( -2482 2483 -2480 ) ( -0.0101089729 0 0.9999489188 ) 56.3676338196 ( -5576 -5184 0 ) ( -5064 -4672 5.1760582924 ) "textures/common/caulk"
+ 3 ( -2478 2481 2482 ) ( 0 -0.0101089729 0.9999489188 ) 52.404914856 ( -5576 -5184 0 ) ( -5064 -4672 5.1760582924 ) "textures/common/caulk"
4 ( -227 -235 -233 236 ) ( -1 0 0 ) 4732 ( -4732 -4440 0 ) ( -4732 -2916.8000488281 8 ) "textures/mars_citybuilder/mars_dirt"
4 ( -226 234 -230 235 ) ( -0 -1 -0 ) 4440 ( -4732 -4440 0 ) ( -3119.1999511719 -4440 8 ) "textures/mars_citybuilder/mars_dirt"
4 ( 230 231 232 233 ) ( -0 0 1 ) 8 ( -4732 -4440 8 ) ( -3119.1999511719 -2916.8000488281 8 ) "textures/mars_citybuilder/mars_dirt"
diff --git a/base/maps/testmaps/test_city.iceproc b/base/maps/testmaps/test_city.iceproc
index 836296c8..fb61a5d9 100644
--- a/base/maps/testmaps/test_city.iceproc
+++ b/base/maps/testmaps/test_city.iceproc
@@ -304,7 +304,7 @@ raytraceSurface { flags 0 area 0 averageColor ( 0.598469913 0.2692296207 0.14538
398 392 395 398 397 399 400 401 402 400 402 403 404 403 402 404 405 406
404 402 405 407 404 406 407 406 401 407 401 400 408 409 410 411 409 408
412 411 408 413 408 410 413 410 414 415 413 414 415 414 411 415 411 412
-raytraceSurface { flags 0 area 0 averageColor ( 0.0069852942 0.0334087573 0.0969551355 0.0984445289 ) emissive ( 0 0 0 0 ) bounds ( -2619.1875 -2888.8125 112 3291.1875 2752.8125 164 ) }
+raytraceSurface { flags 0 area 0 averageColor ( 0.8039238453 0.8039238453 0.8039238453 0.8039238453 ) emissive ( 0 0 0 0 ) bounds ( -2619.1875 -2888.8125 112 3291.1875 2752.8125 164 ) }
}
/* surface 2 */ { "textures/base_wall/steel" /* numVerts = */ 1728 /* numIndexes = */ 2592
diff --git a/base/maps/testmaps/test_city.map b/base/maps/testmaps/test_city.map
index 4adb4ec2..dee7fbf8 100644
--- a/base/maps/testmaps/test_city.map
+++ b/base/maps/testmaps/test_city.map
@@ -3956,13 +3956,13 @@ Version 2
"classname" "light"
"origin" "-3200 3336 3360"
"name" "light_1"
-"_color" "0.949 0.627 0.510"
+"_color" "0.949 0.627 0.51"
"light_radius" "300000 300000 300000"
}
// entity 2
{
"classname" "info_player_start"
-"origin" "-4548 -2616 8"
+"origin" "-3764 -2592 64"
"name" "info_player_start_1"
}
// entity 3
diff --git a/base/maps/testmaps/test_city.terrain b/base/maps/testmaps/test_city.terrain
new file mode 100644
index 00000000..b78f4c12
--- /dev/null
+++ b/base/maps/testmaps/test_city.terrain
@@ -0,0 +1,338 @@
+terrainAuthoring 3 {
+ terrain {
+ name "terrain_1"
+ material "textures/common/caulk"
+ layer 0 "textures/common/caulk"
+ layer 1 "textures/rock/skysand1"
+ origin ( -20936 -19008 0 )
+ size 65 65
+ cellSize 512
+ paintSize 257 257
+ heights {
+ 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 5.1760582924 16.1019306183 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
+ 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 15.0956544876 35.12890625 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
+ 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 19.3479270935 31.9995079041 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
+ 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 21.1000480652 20.1135520935 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
+ 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 38.7700653076 39.0458755493 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
+ 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.6356186867 0.4697090983 0 0 43.7743606567 45.7897262573 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
+ 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.4178406 29.4534320831 27.8703784943 0.7092252374 0 13.4286193848 14.4101161957 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
+ 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 1.9043617249 118.067817688 195.6887207031 32.2069969177 0 45.2943687439 27.7318248749 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
+ 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 49.0809822083 202.1785888672 137.9188842773 5.2682919502 70.7193908691 22.4631118774 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
+ 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 1.807929635 19.7915916443 32.5582046509 29.6017360687 62.4751625061 20.8483467102 2.0560541153 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 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 69.4083938599 92.1939315796 33.0715675354 6.6459465027 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 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 43.9302520752 80.7944030762 44.0608673096 17.1418228149 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 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 23.5744171143 63.9339828491 36.272277832 15.9160680771 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 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.0002330346 28.1980285645 68.4480209351 6.2831344604 0.7649202347 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 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.165472731 22.6221370697 91.9518814087 5.0038194656 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
+ 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 4.1980147362 65.9719314575 5.0353164673 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
+ 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 2.6456999779 72.9151153564 6.9387888908 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
+ 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 5.3477921486 83.6150512695 7.6538357735 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
+ 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 2.1525537968 20.7843894958 0.0918251723 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
+ 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ }
+ paintWeights {
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0.9964755774 0.003524475 0 0 0.9913631678 0.0086368155 0 0 0.9890046716 0.0109953629 0 0 0.9911091924 0.0088908365 0 0 0.99590832 0.0040917229 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0.9992915988 0.0007083683 0 0 0.9869318008 0.0130682401 0 0 0.9661011696 0.0338988118 0 0 0.9433094263 0.0566905253 0 0 0.9314032197 0.0685968474 0 0 0.9306311011 0.0693689138 0 0 0.9453780651 0.0546219274 0 0 0.9719129205 0.0280871373 0 0 0.9951846004 0.0048154644 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0.9849574566 0.0150426235 0 0 0.9465026259 0.0534974448 0 0 0.8915321827 0.1084677652 0 0 0.8374513388 0.1625486314 0 0 0.7887127995 0.2112872005 0 0 0.7691084146 0.230891645 0 0 0.7912533283 0.2087467015 0 0 0.851416111 0.1485839486 0 0 0.928517282 0.0714826956 0 0 0.9858362675 0.0141638014 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0.9943147302 0.0056853052 0 0 0.9564142823 0.0435857698 0 0 0.8799185157 0.1200815514 0 0 0.7856331468 0.2143669277 0 0 0.683331728 0.3166682422 0 0 0.6003471613 0.3996528387 0 0 0.5636019111 0.4363981485 0 0 0.5853832364 0.4146167636 0 0 0.6657760143 0.3342239857 0 0 0.7888400555 0.2111600339 0 0 0.9189229012 0.0810770541 0 0 0.9917474985 0.0082525788 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0.9940423369 0.0059577026 0 0 0.9822387099 0.017761318 0 0 0.9790565372 0.0209434517 0 0 0.972984314 0.0270157512 0 0 0.9610539079 0.0389460549 0 0 0.9543311596 0.0456689 0 0 0.9614967108 0.0385032855 0 0 0.9520637989 0.0479362421 0 0 0.8825443983 0.1174556166 0 0 0.7662887573 0.233711347 0 0 0.6431311369 0.3568688631 0 0 0.5140981674 0.4859018326 0 0 0.423443526 0.5765564442 0 0 0.3875994086 0.612400651 0 0 0.4041774869 0.5958225727 0 0 0.4760764241 0.5239235759 0 0 0.6082386374 0.3917614222 0 0 0.7862746119 0.2137254328 0 0 0.9407334328 0.0592665374 0 0 0.9894313216 0.0105686998 0 0 0.9996003509 0.0003996305 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0.999453187 0.0005468791 0 0 0.9705085158 0.0294915251 0 0 0.9158815742 0.0841183886 0 0 0.8689073324 0.1310926378 0 0 0.8262032866 0.1737967581 0 0 0.8021312952 0.1978687346 0 0 0.8009847403 0.1990153342 0 0 0.8060339093 0.1939660907 0 0 0.7972021103 0.2027978897 0 0 0.7878059745 0.2121939659 0 0 0.7195147872 0.2804852128 0 0 0.613337636 0.3866624236 0 0 0.4997214675 0.5002785325 0 0 0.3840343356 0.6159656644 0 0 0.3010227084 0.6989772916 0 0 0.2561405599 0.7438594699 0 0 0.2583263814 0.7416736484 0 0 0.3171484768 0.6828514934 0 0 0.4375191629 0.5624808669 0 0 0.6290751696 0.3709248304 0 0 0.8384120464 0.1615879238 0 0 0.9574382305 0.0425617546 0 0 0.9873144627 0.0126855476 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0.9746363163 0.0253637731 0 0 0.8899838924 0.1100161299 0 0 0.793135941 0.2068640888 0 0 0.7016914487 0.2983085811 0 0 0.6281240582 0.371875912 0 0 0.5899591446 0.4100408554 0 0 0.5846355557 0.4153644741 0 0 0.5841683149 0.4158316851 0 0 0.5706703067 0.4293296635 0 0 0.5427726507 0.4572273791 0 0 0.4964052141 0.5035948157 0 0 0.4431886375 0.5568113327 0 0 0.3822384775 0.6177614927 0 0 0.3001271784 0.6998727918 0 0 0.2228807509 0.7771192193 0 0 0.1759623587 0.8240376711 0 0 0.169282794 0.8307172656 0 0 0.2101136446 0.789886415 0 0 0.3045066297 0.6954933405 0 0 0.4770540595 0.5229460001 0 0 0.7085682154 0.2914317846 0 0 0.8856853247 0.1143146604 0 0 0.9547991157 0.0452008396 0 0 0.9929882884 0.0070116809 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0.997918725 0.0020813085 0 0 0.9325408936 0.0674591437 0 0 0.8073169589 0.1926831007 0 0 0.6746154428 0.3253846169 0 0 0.5513429046 0.4486570656 0 0 0.4658678472 0.534132123 0 0 0.4234004617 0.5765995979 0 0 0.4067393541 0.5932606459 0 0 0.3902731836 0.6097267866 0 0 0.3728854954 0.6271145344 0 0 0.3319014609 0.6680985689 0 0 0.2905066013 0.7094933987 0 0 0.2702139914 0.7297859788 0 0 0.2560289502 0.7439710498 0 0 0.2219897658 0.7780103087 0 0 0.1753084958 0.824691534 0 0 0.1381217241 0.8618782759 0 0 0.1263260841 0.8736739755 0 0 0.1515420973 0.8484579325 0 0 0.2183330208 0.7816669941 0 0 0.3592322171 0.6407677531 0 0 0.5805565715 0.4194433987 0 0 0.7896665335 0.2103335708 0 0 0.9120429754 0.0879570842 0 0 0.9718366265 0.0281634573 0 0 0.9968994856 0.0031005798 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0.9930405617 0.0069594877 0 0 0.8967879415 0.103212133 0 0 0.736913383 0.2630866468 0 0 0.5789955854 0.4210044742 0 0 0.4435122907 0.5564877391 0 0 0.3598152697 0.6401847005 0 0 0.3211417794 0.6788582206 0 0 0.2994780242 0.7005220056 0 0 0.2722342908 0.7277656794 0 0 0.2397222519 0.7602777481 0 0 0.193223834 0.8067762256 0 0 0.1635224223 0.8364775777 0 0 0.1593611836 0.840638876 0 0 0.1638413966 0.8361585736 0 0 0.1622375995 0.837762475 0 0 0.1475804299 0.8524195552 0 0 0.125066787 0.8749333024 0 0 0.1137592718 0.8862407804 0 0 0.1285525411 0.8714475036 0 0 0.179512307 0.8204877377 0 0 0.2944597304 0.7055402994 0 0 0.4896126091 0.5103874207 0 0 0.6958516836 0.3041483164 0 0 0.8562458754 0.1437540948 0 0 0.9347805977 0.0652194396 0 0 0.9754783511 0.0245217066 0 0 0.9960514307 0.0039485632 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0.998316288 0.0016837924 0 0 0.9906660318 0.0093339449 0 0 0.9533782601 0.0466217659 0 0 0.8213302493 0.178669706 0 0 0.6429079771 0.3570920825 0 0 0.4874807 0.5125193 0 0 0.368996948 0.6310030222 0 0 0.2991150618 0.7008849978 0 0 0.26848194 0.7315180898 0 0 0.2449703515 0.7550296187 0 0 0.211177811 0.7888222933 0 0 0.168960765 0.8310392499 0 0 0.1278286278 0.872171402 0 0 0.1062514558 0.8937485218 0 0 0.1053802893 0.8946197629 0 0 0.1145454571 0.8854545951 0 0 0.1274077445 0.8725922108 0 0 0.1300881654 0.8699117899 0 0 0.1219759062 0.8780241013 0 0 0.1183628812 0.881637156 0 0 0.1303452253 0.8696547747 0 0 0.1695282459 0.8304717541 0 0 0.2652341723 0.7347658277 0 0 0.4285098314 0.5714901686 0 0 0.6157324314 0.3842675984 0 0 0.7742282748 0.2257716507 0 0 0.8650391698 0.13496086 0 0 0.9188178778 0.0811821967 0 0 0.9635005593 0.0364994965 0 0 0.9903088808 0.0096910596 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0.994379282 0.0056207525 0 0 0.9668464661 0.0331535973 0 0 0.9282593131 0.0717407167 0 0 0.872148633 0.127851367 0 0 0.7901132107 0.2098867446 0 0 0.6651459932 0.334853977 0 0 0.5132809281 0.4867190421 0 0 0.3924395144 0.6075604558 0 0 0.3144272268 0.685572803 0 0 0.2700760365 0.7299239635 0 0 0.2484332323 0.7515668273 0 0 0.2286512107 0.7713487744 0 0 0.1955065429 0.8044934869 0 0 0.1485858411 0.851414144 0 0 0.1098922789 0.8901078105 0 0 0.0916560218 0.9083439708 0 0 0.0882686898 0.9117313623 0 0 0.0942963511 0.9057037234 0 0 0.1081024259 0.8918976188 0 0 0.119540818 0.8804591298 0 0 0.1204498634 0.879550159 0 0 0.1207568869 0.8792431355 0 0 0.1288901567 0.8711098433 0 0 0.1651104838 0.8348895311 0 0 0.2434201092 0.7565798163 0 0 0.3727756739 0.6272243261 0 0 0.5332396626 0.466760397 0 0 0.681701839 0.3182981312 0 0 0.77784729 0.2221527398 0 0 0.8424382806 0.1575617194 0 0 0.909558773 0.0904412195 0 0 0.9625843763 0.0374156311 0 0 0.9954671264 0.004532882 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0.9948610067 0.0051390356 0 0 0.9513816237 0.0486183874 0 0 0.8768388033 0.1231612042 0 0 0.7795662284 0.2204337269 0 0 0.6548620462 0.3451379836 0 0 0.5375996232 0.462400347 0 0 0.4510339797 0.5489660501 0 0 0.3686845601 0.6313154101 0 0 0.2980420589 0.7019580007 0 0 0.2563386559 0.7436613441 0 0 0.2410956472 0.7589043975 0 0 0.2378102988 0.7621897459 0 0 0.2314936221 0.7685063481 0 0 0.2074633688 0.7925367355 0 0 0.1605086923 0.8394913077 0 0 0.1242724136 0.8757276535 0 0 0.1077327728 0.8922671676 0 0 0.0996807963 0.9003192782 0 0 0.1010494232 0.8989505768 0 0 0.1109031439 0.8890967965 0 0 0.1174822003 0.8825178146 0 0 0.1149590984 0.8850408792 0 0 0.1129494011 0.8870506287 0 0 0.1181936413 0.881806314 0 0 0.1495147049 0.8504853249 0 0 0.2092838585 0.7907162309 0 0 0.3015802801 0.6984196901 0 0 0.4327893555 0.5672106147 0 0 0.5754686594 0.4245313406 0 0 0.684892714 0.315107286 0 0 0.7690131068 0.2309869528 0 0 0.8529584408 0.1470414996 0 0 0.9305400252 0.0694599897 0 0 0.9854771495 0.0145228738 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0.9726062417 0.0273937583 0 0 0.8884411454 0.1115588918 0 0 0.7583224773 0.2416775823 0 0 0.5776370764 0.4223629534 0 0 0.4074148536 0.5925851464 0 0 0.2979620993 0.7020379305 0 0 0.2435077876 0.7564922571 0 0 0.2214834094 0.7785165906 0 0 0.2109681517 0.7890318036 0 0 0.1997834742 0.800216496 0 0 0.2015415877 0.7984583974 0 0 0.2114823908 0.7885177135 0 0 0.2193344682 0.7806654572 0 0 0.2115278989 0.788472116 0 0 0.1900982857 0.8099017143 0 0 0.1657336354 0.8342664242 0 0 0.1536802948 0.8463196754 0 0 0.1414957941 0.8585041761 0 0 0.1347814798 0.8652184606 0 0 0.1315518618 0.8684480786 0 0 0.1234271228 0.876572907 0 0 0.1114922985 0.8885077834 0 0 0.1019790545 0.8980209231 0 0 0.1030606478 0.8969393373 0 0 0.1234992743 0.8765007854 0 0 0.1636094749 0.8363904953 0 0 0.2209852487 0.7790147662 0 0 0.3245281577 0.6754719019 0 0 0.4664465487 0.5335534215 0 0 0.5978441238 0.402155906 0 0 0.709499836 0.290500164 0 0 0.813533783 0.1864662319 0 0 0.9091340899 0.0908659101 0 0 0.9791829586 0.0208170302 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0.9988821745 0.0011178127 0 0 0.9514884949 0.0485115908 0 0 0.8341121078 0.1658878326 0 0 0.6282176971 0.3717822731 0 0 0.397941798 0.6020581722 0 0 0.2391129732 0.7608870268 0 0 0.1600527167 0.8399473429 0 0 0.1303535998 0.8696464896 0 0 0.1288981438 0.8711018562 0 0 0.1440450847 0.8559549451 0 0 0.1581352502 0.8418647051 0 0 0.1645356864 0.8354643583 0 0 0.1731646955 0.8268353343 0 0 0.1855374277 0.8144626021 0 0 0.2040705383 0.7959294319 0 0 0.2066344172 0.7933655381 0 0 0.2038182914 0.7961817384 0 0 0.205088228 0.7949117422 0 0 0.193547681 0.8064523339 0 0 0.1760572493 0.8239428401 0 0 0.158927694 0.8410723209 0 0 0.1334871054 0.8665128946 0 0 0.1122341231 0.8877658844 0 0 0.0916240811 0.9083759189 0 0 0.0845134109 0.9154865742 0 0 0.0920878351 0.9079122543 0 0 0.1138897389 0.8861103058 0 0 0.1555166692 0.8444833159 0 0 0.248778522 0.7512214184 0 0 0.3918463588 0.6081537008 0 0 0.543143332 0.4568566382 0 0 0.6774356365 0.3225643635 0 0 0.7989400029 0.2010600567 0 0 0.9089821577 0.0910178795 0 0 0.9817702174 0.0182298385 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0.9986495376 0.0013504485 0 0 0.9478067756 0.052193176 0 0 0.7997278571 0.200272128 0 0 0.5350576043 0.4649423659 0 0 0.2912638783 0.7087361813 0 0 0.1539530158 0.8460470438 0 0 0.0968285054 0.9031715393 0 0 0.0805923417 0.9194076657 0 0 0.0877885446 0.9122114778 0 0 0.1086986512 0.8913013339 0 0 0.1265939772 0.8734061122 0 0 0.1336059123 0.866394043 0 0 0.1411547363 0.8588453531 0 0 0.1546647102 0.8453353047 0 0 0.1702047437 0.8297952414 0 0 0.1937593669 0.8062406778 0 0 0.2123855054 0.7876145244 0 0 0.2235798836 0.776420176 0 0 0.2221992612 0.7778007388 0 0 0.2080792785 0.7919207215 0 0 0.1765773147 0.82342273 0 0 0.1374396086 0.8625603318 0 0 0.1026748791 0.8973251581 0 0 0.0766424239 0.9233576655 0 0 0.0637767166 0.9362232685 0 0 0.0658172369 0.9341827631 0 0 0.081944868 0.9180551767 0 0 0.1205714792 0.8794285655 0 0 0.2080182284 0.7919818759 0 0 0.3521488309 0.6478511691 0 0 0.5270073414 0.4729926586 0 0 0.6811203957 0.3188796341 0 0 0.8159872293 0.1840127409 0 0 0.9300636649 0.0699363649 0 0 0.9912932515 0.008706769 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0.9645976424 0.0354023874 0 0 0.7982320786 0.2017678916 0 0 0.4905121922 0.5094878674 0 0 0.2435782999 0.7564217448 0 0 0.1202757657 0.8797242641 0 0 0.072814256 0.9271857142 0 0 0.0622081757 0.9377918243 0 0 0.0721750855 0.9278248549 0 0 0.0940719917 0.9059280753 0 0 0.1130595952 0.8869404197 0 0 0.1221083328 0.8778916001 0 0 0.1282712072 0.8717287779 0 0 0.1347648799 0.8652351499 0 0 0.1434905231 0.8565094471 0 0 0.1572383642 0.8427616358 0 0 0.1741903424 0.8258096576 0 0 0.189909324 0.8100907207 0 0 0.2040115595 0.7959885001 0 0 0.1993243545 0.8006756306 0 0 0.1666894555 0.8333106041 0 0 0.1238411739 0.8761587739 0 0 0.0865188614 0.9134811163 0 0 0.0627183989 0.9372816086 0 0 0.0497967005 0.9502032995 0 0 0.0487871021 0.9512129426 0 0 0.0610412881 0.9389587641 0 0 0.1006045714 0.8993954062 0 0 0.1880922616 0.8119077682 0 0 0.3411499858 0.6588500142 0 0 0.5365108252 0.4634892046 0 0 0.7079331279 0.2920668721 0 0 0.8500016332 0.1499984115 0 0 0.9592118263 0.0407881513 0 0 0.9964109063 0.0035891286 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0.9901975989 0.0098024076 0 0 0.8206805587 0.1793193966 0 0 0.4851681888 0.514831841 0 0 0.2348410785 0.7651588917 0 0 0.1161728203 0.8838272095 0 0 0.0705415681 0.929458499 0 0 0.0613247827 0.9386752248 0 0 0.072951138 0.927048862 0 0 0.094358705 0.905641377 0 0 0.113414064 0.8865859509 0 0 0.1192904711 0.8807095289 0 0 0.1209502369 0.8790497184 0 0 0.1230476275 0.8769524097 0 0 0.1235257834 0.8764742613 0 0 0.1285575777 0.8714424372 0 0 0.132862702 0.8671373129 0 0 0.1410594732 0.8589404821 0 0 0.1574207395 0.8425792456 0 0 0.1565876454 0.8434123397 0 0 0.1393918544 0.8606082201 0 0 0.1082402542 0.8917597532 0 0 0.0759378597 0.9240621924 0 0 0.0545628145 0.9454371929 0 0 0.0423617586 0.9576382637 0 0 0.0388282761 0.9611718059 0 0 0.0503817201 0.9496183395 0 0 0.0894137546 0.9105862379 0 0 0.179220587 0.8207794428 0 0 0.3401728272 0.6598272324 0 0 0.5538439751 0.4461560845 0 0 0.7416577339 0.2583422959 0 0 0.8768818378 0.1231180951 0 0 0.9634997845 0.0365002714 0 0 0.9942094684 0.0057905251 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0.9927573204 0.007242708 0 0 0.8342175484 0.1657824665 0 0 0.4914910197 0.5085089803 0 0 0.2426282167 0.7573717833 0 0 0.126821965 0.8731780648 0 0 0.0815807357 0.9184193015 0 0 0.0746871084 0.9253129363 0 0 0.086420238 0.9135797024 0 0 0.1058730781 0.8941269517 0 0 0.1210098267 0.8789901733 0 0 0.1186651066 0.8813348413 0 0 0.1131716892 0.8868283033 0 0 0.107241191 0.8927587867 0 0 0.1020461172 0.8979538679 0 0 0.1031573936 0.8968425393 0 0 0.1057248563 0.8942751288 0 0 0.1089013517 0.8910986781 0 0 0.1209256649 0.8790743947 0 0 0.1316736192 0.8683264256 0 0 0.1260402054 0.8739597797 0 0 0.1017280445 0.8982719183 0 0 0.0738465786 0.9261534214 0 0 0.0518232733 0.9481767416 0 0 0.0377441458 0.9622558951 0 0 0.0338415056 0.9661585093 0 0 0.0443318002 0.955668211 0 0 0.077883251 0.9221167564 0 0 0.1566326022 0.8433673978 0 0 0.3232017457 0.6767982841 0 0 0.5581926703 0.4418073595 0 0 0.7558518648 0.2441481799 0 0 0.8747841716 0.1252158731 0 0 0.9435927272 0.0564072467 0 0 0.9864048362 0.0135951769 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0.9693422318 0.0306577329 0 0 0.7647036314 0.2352964133 0 0 0.459888041 0.5401120186 0 0 0.2426565886 0.7573433518 0 0 0.1347022653 0.8652977943 0 0 0.091899462 0.9081005454 0 0 0.0875940174 0.9124060273 0 0 0.106643185 0.8933568001 0 0 0.1275045574 0.8724954724 0 0 0.1398167312 0.860183239 0 0 0.1295292675 0.8704707026 0 0 0.114382498 0.8856174946 0 0 0.1000154614 0.8999845982 0 0 0.0855407268 0.9144592285 0 0 0.082374081 0.9176259637 0 0 0.0866633877 0.9133366942 0 0 0.0945736766 0.9054263234 0 0 0.1071257517 0.8928741813 0 0 0.1206117123 0.8793883324 0 0 0.123777166 0.8762227893 0 0 0.1057286859 0.8942713141 0 0 0.07701388 0.9229861498 0 0 0.0531196296 0.9468803406 0 0 0.0361273475 0.9638726115 0 0 0.0307311155 0.969268918 0 0 0.0355062932 0.9644937515 0 0 0.0578086786 0.9421913624 0 0 0.1206357405 0.8793641925 0 0 0.2727638483 0.7272361517 0 0 0.5182481408 0.4817518294 0 0 0.7455851436 0.2544148862 0 0 0.8580631018 0.1419368833 0 0 0.9264983535 0.0735016167 0 0 0.9794222713 0.0205777809 0 0 0.9998432994 0.0001566914 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0.9989671111 0.0010328658 0 0 0.9154443145 0.0845557228 0 0 0.6594833732 0.3405166566 0 0 0.3960114717 0.6039885879 0 0 0.2235623598 0.7764376402 0 0 0.1342024058 0.8657976389 0 0 0.099507764 0.9004923105 0 0 0.1004358679 0.899564147 0 0 0.1284634769 0.8715365529 0 0 0.1582000107 0.8417999744 0 0 0.1619993746 0.8380005956 0 0 0.146498844 0.8535011411 0 0 0.1195374951 0.8804625273 0 0 0.0899016261 0.9100983739 0 0 0.0683122873 0.9316877723 0 0 0.0621844232 0.9378156066 0 0 0.0659566224 0.9340433478 0 0 0.0781745017 0.9218254685 0 0 0.0968082026 0.9031918049 0 0 0.1229696646 0.8770304322 0 0 0.1380902529 0.8619098067 0 0 0.1168444678 0.8831554651 0 0 0.0868066922 0.9131932855 0 0 0.0580477193 0.9419522882 0 0 0.0356925577 0.964307487 0 0 0.0270678252 0.9729321599 0 0 0.0288596265 0.9711403847 0 0 0.0396908633 0.9603091478 0 0 0.0775054991 0.9224945307 0 0 0.1852029562 0.8147969842 0 0 0.4263592064 0.5736408234 0 0 0.7048713565 0.2951286435 0 0 0.8485290408 0.1514710337 0 0 0.9224165678 0.0775834844 0 0 0.9789361954 0.0210637562 0 0 0.9998543262 0.0001457032 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0.9916194081 0.0083806477 0 0 0.8505408168 0.1494592428 0 0 0.5783843398 0.4216156304 0 0 0.3407177031 0.6592822671 0 0 0.1955116987 0.8044883609 0 0 0.1279381216 0.8720618486 0 0 0.1065770984 0.8934229612 0 0 0.114573665 0.8854264021 0 0 0.1448453516 0.8551546931 0 0 0.1813479513 0.8186520338 0 0 0.1813682169 0.8186318278 0 0 0.1512153 0.8487846851 0 0 0.1067380682 0.8932619691 0 0 0.0688528195 0.9311471581 0 0 0.0488479622 0.9511520863 0 0 0.042084489 0.9579154849 0 0 0.0468817092 0.9531183243 0 0 0.0605609305 0.9394390583 0 0 0.0886810645 0.9113189578 0 0 0.1250648797 0.8749352098 0 0 0.1443904489 0.8556095362 0 0 0.1241988838 0.8758010864 0 0 0.0936835334 0.9063164592 0 0 0.0609563105 0.9390437603 0 0 0.0363181643 0.9636818171 0 0 0.0245522074 0.9754477739 0 0 0.017961638 0.9820384383 0 0 0.0177560784 0.9822438955 0 0 0.0248377919 0.9751622677 0 0 0.0580271818 0.9419727921 0 0 0.2026759237 0.7973240018 0 0 0.5592499971 0.4407500029 0 0 0.851274848 0.1487252414 0 0 0.9342516661 0.0657484233 0 0 0.9860652089 0.0139347799 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0.9799114466 0.0200886056 0 0 0.7989775538 0.2010224611 0 0 0.5314184427 0.4685815573 0 0 0.3115489483 0.6884510517 0 0 0.1801993549 0.8198006153 0 0 0.1249559298 0.8750441074 0 0 0.1114671528 0.8885328174 0 0 0.1241285503 0.8758715391 0 0 0.1585872769 0.8414127827 0 0 0.2046020478 0.7953979373 0 0 0.2009188831 0.7990811467 0 0 0.1591498703 0.8408501148 0 0 0.0992881507 0.9007118344 0 0 0.0566213056 0.9433786869 0 0 0.0355541147 0.9644459486 0 0 0.030536931 0.9694630504 0 0 0.0354630761 0.9645369053 0 0 0.0489115864 0.9510884285 0 0 0.0744167194 0.9255833626 0 0 0.1051032469 0.8948968053 0 0 0.1220079809 0.8779919744 0 0 0.1089394987 0.8910604715 0 0 0.0878499746 0.9121500254 0 0 0.0561048388 0.9438951015 0 0 0.0307949781 0.9692050815 0 0 0.0161147173 0.9838852882 0 0 0.008500237 0.9914997816 0 0 0.0063974466 0.9936026335 0 0 0.0074778679 0.9925221205 0 0 0.0145432921 0.9854567051 0 0 0.0632979721 0.936702013 0 0 0.2951777875 0.7048222423 0 0 0.7781769037 0.2218230665 0 0 0.9580802321 0.041919753 0 0 0.9961681962 0.0038318445 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0.9646027088 0.0353972837 0 0 0.7744212151 0.2255788743 0 0 0.5093580484 0.4906420112 0 0 0.2963705063 0.7036294937 0 0 0.173804462 0.8261955976 0 0 0.1231484339 0.8768515587 0 0 0.1128984243 0.8871015906 0 0 0.1271707118 0.872829318 0 0 0.1672997773 0.8327001929 0 0 0.2113823593 0.7886176705 0 0 0.2057808787 0.7942191362 0 0 0.1627852321 0.8372148275 0 0 0.1002014577 0.8997985721 0 0 0.0513176024 0.948682487 0 0 0.0312842876 0.9687157273 0 0 0.0271201823 0.9728798866 0 0 0.0305380691 0.9694619179 0 0 0.0428099148 0.957190156 0 0 0.0588777401 0.9411222935 0 0 0.0796554089 0.9203445911 0 0 0.0913700685 0.9086300135 0 0 0.082626909 0.9173731804 0 0 0.0700975358 0.9299025536 0 0 0.0443369001 0.955663085 0 0 0.0218961202 0.9781039357 0 0 0.0094301691 0.9905698299 0 0 0.0039721224 0.9960278869 0 0 0.0022257792 0.9977742434 0 0 0.0026015423 0.9973984957 0 0 0.0055585504 0.9944415092 0 0 0.0212774444 0.9787225723 0 0 0.1466150582 0.8533849716 0 0 0.6055931449 0.3944068551 0 0 0.9727717638 0.0272282474 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0.9508931637 0.0491068587 0 0 0.7674885392 0.2325115055 0 0 0.4903524518 0.5096475482 0 0 0.2701101005 0.7298899293 0 0 0.1563916504 0.8436083198 0 0 0.1105821058 0.8894178867 0 0 0.100613974 0.8993860483 0 0 0.116188556 0.8838114738 0 0 0.1579137743 0.8420861959 0 0 0.1962693036 0.8037306666 0 0 0.1999207586 0.8000791669 0 0 0.1646878272 0.8353121281 0 0 0.1002297178 0.8997702599 0 0 0.0556043275 0.9443956614 0 0 0.0357830003 0.9642170072 0 0 0.0296937041 0.9703063369 0 0 0.0312952884 0.9687047601 0 0 0.0446930863 0.9553068876 0 0 0.0548706092 0.9451293349 0 0 0.0659539625 0.9340460896 0 0 0.0725950673 0.9274049401 0 0 0.0692658797 0.9307341576 0 0 0.0543348305 0.9456651211 0 0 0.0334957242 0.9665043354 0 0 0.0153292306 0.9846708179 0 0 0.0071340892 0.9928659201 0 0 0.002668489 0.9973315001 0 0 0.0014767458 0.9985232353 0 0 0.001365764 0.9986342788 0 0 0.0029627506 0.9970372319 0 0 0.0124446526 0.987555325 0 0 0.0957353413 0.9042646885 0 0 0.5069357753 0.4930641949 0 0 0.9676772356 0.0323227644 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0.945394516 0.0546054766 0 0 0.7381519675 0.2618480027 0 0 0.4359068274 0.5640931726 0 0 0.2254305929 0.7745694518 0 0 0.1282207072 0.871779263 0 0 0.0879872814 0.9120126963 0 0 0.0794021264 0.9205979109 0 0 0.0922667831 0.9077332616 0 0 0.1252666563 0.8747333884 0 0 0.1534829438 0.846517086 0 0 0.1777713895 0.8222286105 0 0 0.1670865864 0.8329133987 0 0 0.1153987199 0.884601295 0 0 0.0699483529 0.9300516844 0 0 0.0462522283 0.9537477493 0 0 0.0371415056 0.9628584981 0 0 0.0385493897 0.961450696 0 0 0.0492586233 0.9507413507 0 0 0.0602294058 0.9397705793 0 0 0.068704918 0.9312950969 0 0 0.0700507909 0.929949224 0 0 0.0665946603 0.9334053993 0 0 0.0494950525 0.9505049586 0 0 0.0286654886 0.971334517 0 0 0.014771644 0.9852283597 0 0 0.0075538373 0.9924461246 0 0 0.0028444931 0.9971555471 0 0 0.0014619075 0.9985380769 0 0 0.0014451662 0.9985548258 0 0 0.0032055285 0.9967944622 0 0 0.0134232584 0.9865767956 0 0 0.0983559117 0.9016441703 0 0 0.5177413821 0.4822586179 0 0 0.9676501155 0.0323498733 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0.9459801316 0.0540198907 0 0 0.6675733328 0.3324266672 0 0 0.3727045655 0.6272954345 0 0 0.1881689876 0.8118311167 0 0 0.1040402576 0.8959597945 0 0 0.0692446455 0.9307554364 0 0 0.0608679131 0.9391320944 0 0 0.070124507 0.9298755527 0 0 0.0906595215 0.9093405604 0 0 0.1189038083 0.8810961843 0 0 0.1501983106 0.8498016596 0 0 0.1597724408 0.8402275443 0 0 0.1371717453 0.8628282547 0 0 0.0934467539 0.906553328 0 0 0.0610244125 0.9389756322 0 0 0.048294276 0.9517056942 0 0 0.0464705229 0.9535294175 0 0 0.0539795421 0.9460204244 0 0 0.0682256222 0.9317743778 0 0 0.0776428282 0.922357142 0 0 0.0784357712 0.921564281 0 0 0.0697272643 0.9302726984 0 0 0.048925478 0.9510745406 0 0 0.0289028008 0.9710971713 0 0 0.0178507622 0.9821491838 0 0 0.0108692618 0.989130795 0 0 0.0045829788 0.9954170585 0 0 0.0025597233 0.9974402189 0 0 0.0026984795 0.9973015785 0 0 0.0061892397 0.9938107729 0 0 0.0243816562 0.9756183624 0 0 0.1554467529 0.8445532918 0 0 0.6391565204 0.3608435094 0 0 0.9805495739 0.019450441 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0.9298334122 0.0701665655 0 0 0.6265332103 0.3734667897 0 0 0.3337370157 0.6662630439 0 0 0.1639318168 0.8360681534 0 0 0.0884730816 0.9115268588 0 0 0.058324419 0.9416756034 0 0 0.0505592823 0.9494407177 0 0 0.0592344292 0.9407655597 0 0 0.0746593177 0.9253406525 0 0 0.0992625952 0.9007374048 0 0 0.1323937625 0.8676062822 0 0 0.1550984979 0.8449015021 0 0 0.1521610022 0.8478389978 0 0 0.1167118922 0.8832880855 0 0 0.0775975436 0.9224024415 0 0 0.0587080233 0.9412919283 0 0 0.0563822463 0.9436177015 0 0 0.0632874444 0.9367126226 0 0 0.0756166652 0.9243833423 0 0 0.0795425251 0.9204574823 0 0 0.0806135386 0.9193864465 0 0 0.0680367947 0.9319632649 0 0 0.0473691039 0.9526309371 0 0 0.0299797188 0.9700203538 0 0 0.0209905487 0.9790094495 0 0 0.016307598 0.9836924076 0 0 0.0084028766 0.9915971756 0 0 0.0063198674 0.9936801791 0 0 0.0078559043 0.9921441078 0 0 0.0178966299 0.9821034074 0 0 0.0672907308 0.9327092171 0 0 0.3028749228 0.6971250772 0 0 0.786290586 0.2137093395 0 0 0.9954159856 0.0045840084 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0.9164701104 0.0835298821 0 0 0.628482163 0.3715178668 0 0 0.3418371081 0.6581628919 0 0 0.1741202474 0.825879693 0 0 0.0961704999 0.903829515 0 0 0.06367594 0.9363241196 0 0 0.0542419478 0.9457581043 0 0 0.0582096204 0.9417904615 0 0 0.070555076 0.9294449091 0 0 0.0897130743 0.9102869034 0 0 0.1261840016 0.8738160133 0 0 0.1626933962 0.8373066187 0 0 0.170566991 0.8294330239 0 0 0.133738324 0.8662616611 0 0 0.0924982801 0.9075017571 0 0 0.0667169467 0.9332830906 0 0 0.0577797703 0.9422202706 0 0 0.0597096756 0.9402903318 0 0 0.0698626265 0.9301373959 0 0 0.0690199584 0.9309800863 0 0 0.0640768334 0.9359231591 0 0 0.0546241291 0.9453758597 0 0 0.0399814062 0.9600185752 0 0 0.0263882242 0.9736117721 0 0 0.0201744325 0.9798255563 0 0 0.017949963 0.9820500612 0 0 0.0143105891 0.9856894612 0 0 0.0135590024 0.9864410162 0 0 0.0238486994 0.9761513472 0 0 0.0594351329 0.9405648708 0 0 0.1889285445 0.8110715151 0 0 0.4973715544 0.5026285052 0 0 0.8390458226 0.1609541923 0 0 0.997835815 0.0021641778 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0.9172417521 0.0827582404 0 0 0.6628016829 0.3371983767 0 0 0.3950026929 0.6049972773 0 0 0.2222578377 0.7777421474 0 0 0.1298369467 0.8701630235 0 0 0.0848131403 0.915186882 0 0 0.0679591 0.9320409298 0 0 0.0673543289 0.9326456785 0 0 0.0798375309 0.920162499 0 0 0.0922032967 0.9077966809 0 0 0.1259491742 0.874050796 0 0 0.1712994576 0.8287006021 0 0 0.1879800856 0.8120199442 0 0 0.1514267474 0.8485732675 0 0 0.1051241681 0.8948758841 0 0 0.0717063621 0.928293705 0 0 0.0533421002 0.9466579556 0 0 0.0509962924 0.9490036964 0 0 0.056663461 0.943336606 0 0 0.0551607162 0.9448392391 0 0 0.0466354229 0.9533646107 0 0 0.0347694457 0.9652306437 0 0 0.0281911269 0.9718088508 0 0 0.0184218194 0.9815781713 0 0 0.0153422588 0.984657824 0 0 0.0148512218 0.9851487875 0 0 0.0167495813 0.9832503796 0 0 0.0183397327 0.9816602468 0 0 0.0412816331 0.9587183595 0 0 0.1180886254 0.8819114566 0 0 0.2987987399 0.7012012601 0 0 0.5858772397 0.4141227901 0 0 0.8716781735 0.1283217818 0 0 0.9953400493 0.0046599214 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0.9284342527 0.0715658218 0 0 0.7073048949 0.2926951051 0 0 0.4561809301 0.5438191295 0 0 0.2688853145 0.7311146855 0 0 0.1561750174 0.843824923 0 0 0.1008083001 0.8991917372 0 0 0.0794165581 0.920583427 0 0 0.0780187845 0.9219811559 0 0 0.0897559226 0.9102441072 0 0 0.1029019356 0.897098124 0 0 0.1314768493 0.8685231805 0 0 0.1694276035 0.8305724859 0 0 0.1874088049 0.8125911951 0 0 0.1495272815 0.8504727483 0 0 0.1056023836 0.894397676 0 0 0.0695161968 0.9304838777 0 0 0.0453413427 0.9546586871 0 0 0.0410031006 0.9589969516 0 0 0.0449878611 0.9550121427 0 0 0.0433161147 0.9566838741 0 0 0.0368666127 0.9631333947 0 0 0.0245686583 0.9754313827 0 0 0.019560352 0.9804396629 0 0 0.0144518018 0.9855482578 0 0 0.0134222377 0.9865777493 0 0 0.0120250164 0.9879750013 0 0 0.0127221989 0.9872777462 0 0 0.0199775249 0.9800225496 0 0 0.0465829 0.9534171224 0 0 0.1416515857 0.8583484292 0 0 0.3569698632 0.643030107 0 0 0.6676211357 0.3323788643 0 0 0.9072673321 0.0927326828 0 0 0.9936943054 0.0063057183 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0.9357722402 0.0642278194 0 0 0.72491014 0.27508986 0 0 0.4727261662 0.5272738934 0 0 0.2654591203 0.7345409393 0 0 0.1441694349 0.8558306098 0 0 0.0875285342 0.9124714732 0 0 0.0675281957 0.9324717522 0 0 0.0706060529 0.9293940067 0 0 0.0806499794 0.919350028 0 0 0.0980666354 0.901933372 0 0 0.1352027208 0.8647972941 0 0 0.1620253026 0.8379746675 0 0 0.1682659537 0.8317341208 0 0 0.136269331 0.8637306094 0 0 0.0988410413 0.9011590481 0 0 0.0666441098 0.9333559275 0 0 0.0441713929 0.9558286667 0 0 0.0374214426 0.9625785351 0 0 0.0390342511 0.9609657526 0 0 0.0417124145 0.9582875967 0 0 0.0349875689 0.9650124311 0 0 0.0249392446 0.975060761 0 0 0.0184588917 0.9815411568 0 0 0.0141495774 0.985850513 0 0 0.0107857361 0.9892143011 0 0 0.0084650749 0.9915349483 0 0 0.009074267 0.9909257889 0 0 0.0165494271 0.9834506512 0 0 0.0449338295 0.9550661445 0 0 0.1652527452 0.8347473145 0 0 0.44206357 0.55793643 0 0 0.7582166791 0.2417833358 0 0 0.9376835227 0.0623164885 0 0 0.9929239154 0.0070761228 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0.9242463112 0.0757537037 0 0 0.6996247768 0.3003752828 0 0 0.4369423687 0.5630576015 0 0 0.2202340811 0.7797658443 0 0 0.1036778316 0.8963222504 0 0 0.0563035905 0.9436963797 0 0 0.0425328985 0.9574670792 0 0 0.0463724136 0.953627646 0 0 0.0580947027 0.9419053793 0 0 0.0754743665 0.9245256782 0 0 0.1092143282 0.8907857537 0 0 0.1358636916 0.8641363382 0 0 0.1345511973 0.8654488325 0 0 0.1134155318 0.8865844607 0 0 0.0848335326 0.9151665568 0 0 0.061894197 0.9381058216 0 0 0.0489606597 0.9510393739 0 0 0.0422801338 0.9577199221 0 0 0.0449981838 0.9550018311 0 0 0.0495578721 0.9504421353 0 0 0.0479380935 0.9520618916 0 0 0.0399538875 0.9600461125 0 0 0.0266144089 0.973385632 0 0 0.0163823459 0.9836176634 0 0 0.0106365737 0.9893634319 0 0 0.0072323498 0.9927676916 0 0 0.007850809 0.9921491742 0 0 0.0133130951 0.986686945 0 0 0.0447219498 0.955278039 0 0 0.1860155463 0.8139845133 0 0 0.5303542018 0.469645828 0 0 0.8411960602 0.15880391 0 0 0.9649276733 0.0350723565 0 0 0.9944072962 0.0055927336 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0.9094774127 0.090522632 0 0 0.6741777062 0.325822264 0 0 0.3937588036 0.6062412262 0 0 0.1745663881 0.8254336119 0 0 0.0691590011 0.9308410287 0 0 0.0333619714 0.9666380286 0 0 0.0248601492 0.9751398563 0 0 0.0301731825 0.9698268175 0 0 0.0383804478 0.9616196156 0 0 0.0524597354 0.9475403428 0 0 0.0774823055 0.9225177169 0 0 0.0984118581 0.9015880823 0 0 0.0980102047 0.901989758 0 0 0.0883962661 0.9116037488 0 0 0.0735942647 0.9264057875 0 0 0.0630831122 0.9369168282 0 0 0.0564491525 0.9435508847 0 0 0.0514730811 0.9485268593 0 0 0.0556909107 0.9443091154 0 0 0.0684247836 0.9315752387 0 0 0.0806434751 0.9193565249 0 0 0.0751819834 0.9248180389 0 0 0.0533586442 0.946641326 0 0 0.0289652403 0.9710347056 0 0 0.0139324423 0.9860675931 0 0 0.0084599946 0.9915400147 0 0 0.00884936 0.9911506772 0 0 0.0167684983 0.9832314849 0 0 0.0599230528 0.9400769472 0 0 0.2315436304 0.7684563994 0 0 0.6247414351 0.3752585351 0 0 0.9044771791 0.0955228731 0 0 0.9794228077 0.0205772147 0 0 0.9979273677 0.0020726519 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0.9125537276 0.0874462947 0 0 0.6784252524 0.3215747178 0 0 0.3893439472 0.610656023 0 0 0.157165572 0.8428344131 0 0 0.0557224751 0.9442775846 0 0 0.0256116241 0.974388361 0 0 0.0183261484 0.9816738963 0 0 0.0218942352 0.9781058431 0 0 0.0292181242 0.9707818627 0 0 0.0402363911 0.9597636461 0 0 0.0578729473 0.9421271086 0 0 0.0699239895 0.9300760031 0 0 0.0734837353 0.9265162945 0 0 0.074428089 0.9255719185 0 0 0.0697850659 0.9302148819 0 0 0.0678895116 0.932110548 0 0 0.0668324232 0.9331676364 0 0 0.0650163963 0.9349836111 0 0 0.0700060129 0.9299940467 0 0 0.0854094028 0.9145905972 0 0 0.1039832607 0.896016717 0 0 0.1107132062 0.8892867565 0 0 0.0922465697 0.907753408 0 0 0.0570014082 0.9429985285 0 0 0.0294129029 0.9705871344 0 0 0.0175138973 0.9824861884 0 0 0.0167774819 0.9832226038 0 0 0.0316144675 0.9683855772 0 0 0.0961157009 0.9038842916 0 0 0.3097452819 0.6902547479 0 0 0.6994131207 0.3005869091 0 0 0.9476878047 0.0523122065 0 0 0.99250108 0.0074989269 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0.9406818151 0.0593181513 0 0 0.7241519094 0.2758481503 0 0 0.4246338308 0.575366199 0 0 0.1743983477 0.825601697 0 0 0.0608823486 0.9391176701 0 0 0.0261730142 0.9738270044 0 0 0.0186907835 0.9813091755 0 0 0.0209633913 0.9790366292 0 0 0.0281901602 0.9718099236 0 0 0.0409081727 0.9590919018 0 0 0.0505340956 0.9494658709 0 0 0.0547575355 0.9452425241 0 0 0.053348098 0.9466519952 0 0 0.0613236912 0.9386762977 0 0 0.0718006641 0.9281993508 0 0 0.084638156 0.9153618217 0 0 0.0846423358 0.9153577089 0 0 0.0842308328 0.9157691598 0 0 0.087175943 0.9128240347 0 0 0.0890473202 0.9109526873 0 0 0.0947889686 0.9052110314 0 0 0.0993517488 0.9006482959 0 0 0.0884976983 0.9115023017 0 0 0.0613739528 0.9386260509 0 0 0.0420598276 0.9579401612 0 0 0.0315006934 0.9684993029 0 0 0.0323317945 0.9676681757 0 0 0.0557965674 0.944203496 0 0 0.1482484043 0.8517516851 0 0 0.4010270536 0.5989729166 0 0 0.76651299 0.2334869802 0 0 0.9728809595 0.0271190237 0 0 0.9998706579 0.0001293314 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0.9771472812 0.0228527337 0 0 0.8014686108 0.1985313594 0 0 0.4900385439 0.5099614859 0 0 0.2176220417 0.7823780179 0 0 0.0768756345 0.9231243134 0 0 0.0318514146 0.9681485295 0 0 0.0214109793 0.9785889983 0 0 0.0228139367 0.9771860838 0 0 0.0316470265 0.9683530331 0 0 0.0467834622 0.9532165527 0 0 0.0489962287 0.9510037899 0 0 0.0434182733 0.9565817714 0 0 0.0415604152 0.9584395289 0 0 0.0526673533 0.9473326802 0 0 0.0697430596 0.9302569628 0 0 0.0977554768 0.9022445679 0 0 0.1139844283 0.8860156536 0 0 0.1135950238 0.8864049315 0 0 0.0979651138 0.9020349383 0 0 0.0810167268 0.9189832807 0 0 0.0678784028 0.9321215749 0 0 0.0604779869 0.939522028 0 0 0.053512983 0.9464870095 0 0 0.0452521369 0.9547479153 0 0 0.0377116539 0.9622883797 0 0 0.0338625908 0.9661373496 0 0 0.0422210395 0.9577789307 0 0 0.0770937279 0.9229062796 0 0 0.1906113029 0.8093887568 0 0 0.4563363492 0.5436636209 0 0 0.7852113247 0.21478872 0 0 0.9697520137 0.0302480068 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0.9947943091 0.0052057784 0 0 0.8877362609 0.1122637242 0 0 0.571797967 0.4282020628 0 0 0.2645440102 0.7354559898 0 0 0.0984592587 0.9015407562 0 0 0.0401442945 0.9598556757 0 0 0.0239694249 0.9760305882 0 0 0.0224613417 0.9775386453 0 0 0.0322133079 0.9677867293 0 0 0.0465474539 0.9534525275 0 0 0.0484942012 0.9515057802 0 0 0.041442614 0.9585573673 0 0 0.0424606688 0.95753932 0 0 0.0525120609 0.9474878907 0 0 0.0718327388 0.9281672239 0 0 0.1032615826 0.89673841 0 0 0.1318918914 0.8681080937 0 0 0.1419245601 0.8580754995 0 0 0.1149566248 0.8850434422 0 0 0.0761068016 0.9238932729 0 0 0.0522978678 0.9477021098 0 0 0.0370962061 0.962903738 0 0 0.0291457996 0.9708541632 0 0 0.0272243135 0.9727756977 0 0 0.0266307872 0.9733692408 0 0 0.0265708473 0.9734291434 0 0 0.0398503505 0.9601497054 0 0 0.0790705234 0.9209294319 0 0 0.1952431798 0.8047568202 0 0 0.453135103 0.5468648672 0 0 0.7438262701 0.2561737299 0 0 0.9471789002 0.0528210811 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0.9330298305 0.0669701472 0 0 0.6462826133 0.3537174165 0 0 0.3095801771 0.6904198527 0 0 0.1224332899 0.8775667548 0 0 0.0516452305 0.9483547807 0 0 0.0278959218 0.9721041322 0 0 0.0237062313 0.9762937427 0 0 0.0309102871 0.9690897465 0 0 0.0471345522 0.9528654218 0 0 0.0542626716 0.9457373619 0 0 0.049811665 0.9501883984 0 0 0.0494441167 0.950555861 0 0 0.0571716093 0.9428284764 0 0 0.0693482161 0.9306517839 0 0 0.0948584303 0.905141592 0 0 0.1309271455 0.8690727949 0 0 0.1562146097 0.8437854052 0 0 0.1342579275 0.8657420278 0 0 0.0910045058 0.9089955688 0 0 0.0560957156 0.9439043403 0 0 0.0327223651 0.9672776461 0 0 0.0213701688 0.9786298871 0 0 0.0174177699 0.9825822115 0 0 0.0200679991 0.9799320102 0 0 0.0194078367 0.9805921912 0 0 0.0308599677 0.9691399932 0 0 0.0689027011 0.9310973287 0 0 0.174806118 0.825193882 0 0 0.3996510804 0.6003489494 0 0 0.6867100596 0.3132899106 0 0 0.9253481627 0.0746518448 0 0 0.9980582595 0.0019417532 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0.9603027105 0.039697282 0 0 0.7155752778 0.284424752 0 0 0.3700349331 0.6299651265 0 0 0.1558771282 0.8441228867 0 0 0.0668577924 0.9331422448 0 0 0.0363052525 0.9636947513 0 0 0.0300373975 0.9699626565 0 0 0.0378051288 0.9621949196 0 0 0.0513274781 0.9486724734 0 0 0.0644769967 0.9355230927 0 0 0.0666284114 0.9333716035 0 0 0.0652172267 0.9347828031 0 0 0.0650948659 0.9349051714 0 0 0.0713913441 0.9286085963 0 0 0.0917443708 0.9082556367 0 0 0.1279620677 0.8720380068 0 0 0.1686409563 0.8313590884 0 0 0.1656174809 0.834382534 0 0 0.1213132143 0.8786868453 0 0 0.0752744973 0.9247255325 0 0 0.0440911613 0.9559088349 0 0 0.0230861083 0.9769138694 0 0 0.0173320249 0.9826679826 0 0 0.0188081153 0.9811919332 0 0 0.0185890198 0.9814110398 0 0 0.0247188639 0.9752811193 0 0 0.0556099415 0.9443901181 0 0 0.1486195773 0.8513804078 0 0 0.3626838923 0.6373161077 0 0 0.6539118886 0.3460880816 0 0 0.9073683619 0.0926316157 0 0 0.9958196878 0.0041803475 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0.9814543128 0.0185456984 0 0 0.8063903451 0.1936095804 0 0 0.4776990712 0.5223009586 0 0 0.2280464768 0.7719535232 0 0 0.1051376536 0.8948624134 0 0 0.0576453507 0.9423546195 0 0 0.0462173149 0.9537826777 0 0 0.0549816154 0.9450184107 0 0 0.0739269257 0.9260730743 0 0 0.0915561914 0.908443749 0 0 0.1006028131 0.8993971348 0 0 0.0936708674 0.9063292146 0 0 0.0824279413 0.9175721407 0 0 0.0780748799 0.9219251275 0 0 0.0870119929 0.9129880667 0 0 0.1193494946 0.8806505203 0 0 0.1621619314 0.8378381133 0 0 0.1705369651 0.8294630647 0 0 0.1424497366 0.8575502038 0 0 0.0998745114 0.9001255631 0 0 0.0617187023 0.9382812977 0 0 0.0352038927 0.9647961259 0 0 0.0259700585 0.9740299582 0 0 0.0258660335 0.9741339684 0 0 0.023266444 0.9767335653 0 0 0.0288723689 0.9711276293 0 0 0.0591247305 0.9408753514 0 0 0.1512177289 0.8487822413 0 0 0.3626310825 0.6373689771 0 0 0.6441044807 0.3558955491 0 0 0.8932607174 0.1067392454 0 0 0.9944134951 0.0055864793 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0.9946323633 0.0053677177 0 0 0.9042252898 0.0957746804 0 0 0.6519886851 0.3480112851 0 0 0.3776323199 0.6223677397 0 0 0.1987126917 0.801287353 0 0 0.1094601601 0.890539825 0 0 0.0797565579 0.9202434421 0 0 0.0793923065 0.920607686 0 0 0.101316452 0.898683548 0 0 0.1316853166 0.8683146834 0 0 0.149752304 0.8502477407 0 0 0.1337954849 0.8662045598 0 0 0.1082892418 0.8917107582 0 0 0.0888231993 0.9111768007 0 0 0.0859074593 0.9140924811 0 0 0.1025253609 0.8974746466 0 0 0.1196635216 0.8803364635 0 0 0.1293208003 0.8706792593 0 0 0.1264162362 0.873583734 0 0 0.1015811265 0.8984189034 0 0 0.0686404482 0.9313595295 0 0 0.0495429859 0.9504570365 0 0 0.0419724435 0.9580275416 0 0 0.0391328447 0.9608671069 0 0 0.0387194641 0.9612805247 0 0 0.0488893948 0.9511106014 0 0 0.083912611 0.9160873294 0 0 0.181971997 0.8180279732 0 0 0.389729768 0.6102702618 0 0 0.6523053646 0.3476946354 0 0 0.8890809417 0.1109190583 0 0 0.9950826168 0.0049174237 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0.9751589298 0.0248410124 0 0 0.8315116763 0.1684882641 0 0 0.5874512196 0.4125487506 0 0 0.3510077 0.6489923596 0 0 0.1987458467 0.8012540936 0 0 0.121877417 0.8781226277 0 0 0.099284023 0.9007159472 0 0 0.1111937612 0.8888062835 0 0 0.1462397277 0.8537602425 0 0 0.1749565601 0.8250434399 0 0 0.1684795469 0.8315204382 0 0 0.1294840127 0.8705160022 0 0 0.097712405 0.9022875428 0 0 0.0827752203 0.9172248244 0 0 0.0762059093 0.9237940907 0 0 0.0753138885 0.9246860743 0 0 0.0772177279 0.9227822423 0 0 0.07943625 0.920563817 0 0 0.066922687 0.9330773354 0 0 0.0527904965 0.947209537 0 0 0.0480162725 0.9519837499 0 0 0.0527758189 0.9472241998 0 0 0.0571517274 0.9428482652 0 0 0.0653981492 0.934601903 0 0 0.0857181251 0.9142819643 0 0 0.1348598897 0.8651401401 0 0 0.2403878719 0.759612143 0 0 0.4351362288 0.564863801 0 0 0.6756237745 0.3243762553 0 0 0.9044771194 0.0955229402 0 0 0.9988131523 0.0011868654 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0.9497089982 0.0502909906 0 0 0.7556780577 0.2443219721 0 0 0.4967242777 0.5032757521 0 0 0.2819926739 0.7180073857 0 0 0.1603404731 0.839659512 0 0 0.1109828129 0.8890171647 0 0 0.1012039408 0.8987960219 0 0 0.1117838696 0.8882161379 0 0 0.1355004758 0.8644995689 0 0 0.1381826103 0.8618173599 0 0 0.1028009355 0.8971991539 0 0 0.0776593834 0.9223406315 0 0 0.0628963634 0.9371036291 0 0 0.0572715253 0.9427285194 0 0 0.055146575 0.9448534846 0 0 0.0530269369 0.9469730854 0 0 0.0501172915 0.9498826861 0 0 0.0410778075 0.9589222074 0 0 0.0373218432 0.962678194 0 0 0.0422570817 0.9577429295 0 0 0.0568760708 0.9431239963 0 0 0.0727216005 0.9272784591 0 0 0.0934358761 0.9065641165 0 0 0.1267873794 0.8732126951 0 0 0.1912529916 0.8087469339 0 0 0.3060258329 0.6939741969 0 0 0.487706989 0.5122929811 0 0 0.7196276188 0.2803723514 0 0 0.9373838305 0.0626162067 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0.9665073752 0.0334926657 0 0 0.8211851716 0.1788148731 0 0 0.5611408353 0.4388591647 0 0 0.3137536347 0.6862463355 0 0 0.1631385386 0.8368614316 0 0 0.0967187807 0.9032811522 0 0 0.0742629692 0.9257370234 0 0 0.0735598877 0.9264401197 0 0 0.0785504729 0.9214496017 0 0 0.0713591874 0.9286407828 0 0 0.057989791 0.9420102835 0 0 0.0480985641 0.9519014359 0 0 0.0436808914 0.9563190937 0 0 0.0447023883 0.9552975893 0 0 0.0493181571 0.9506818652 0 0 0.050082732 0.9499173164 0 0 0.0439523533 0.9560477138 0 0 0.0347763449 0.9652237296 0 0 0.0348744132 0.9651255608 0 0 0.0434258543 0.956574142 0 0 0.0596292131 0.9403707981 0 0 0.079778716 0.9202213287 0 0 0.1073814631 0.8926184773 0 0 0.148314029 0.8516859412 0 0 0.2252885401 0.7747114897 0 0 0.347139895 0.6528601646 0 0 0.5254731774 0.4745268822 0 0 0.7712498307 0.2287501693 0 0 0.9659379721 0.0340620615 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0.9706855416 0.0293144044 0 0 0.8308306932 0.1691693068 0 0 0.566912353 0.4330876172 0 0 0.3032643199 0.6967357397 0 0 0.1499950439 0.8500050306 0 0 0.0814963803 0.9185035825 0 0 0.0572523773 0.9427476525 0 0 0.0519718714 0.9480280876 0 0 0.0509340391 0.9490659833 0 0 0.0435623787 0.9564376473 0 0 0.0353314504 0.9646685123 0 0 0.0324467756 0.9675532579 0 0 0.0353021808 0.9646977782 0 0 0.0433155447 0.9566844702 0 0 0.056369748 0.9436302185 0 0 0.0648720413 0.9351279736 0 0 0.0610808134 0.938919127 0 0 0.0518819615 0.948118031 0 0 0.0511460975 0.9488539696 0 0 0.0599461794 0.940053761 0 0 0.0761947781 0.9238051772 0 0 0.0922135338 0.9077864885 0 0 0.1128813177 0.8871186972 0 0 0.1501706541 0.8498294353 0 0 0.2212115079 0.7787884474 0 0 0.3377285898 0.66227144 0 0 0.525890708 0.4741092622 0 0 0.7837534547 0.21624659 0 0 0.9624532461 0.0375467427 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0.9881491065 0.0118508907 0 0 0.8794441223 0.1205559447 0 0 0.5973146558 0.4026853144 0 0 0.3244402707 0.6755597591 0 0 0.1648562402 0.8351437449 0 0 0.0908610225 0.9091389179 0 0 0.0627662838 0.9372336864 0 0 0.0531882606 0.9468117952 0 0 0.0480569005 0.9519431591 0 0 0.0405533426 0.9594466686 0 0 0.032665886 0.9673340917 0 0 0.030969575 0.9690304995 0 0 0.0375855379 0.9624144435 0 0 0.0554588251 0.9445412159 0 0 0.0830206424 0.9169793725 0 0 0.1135153845 0.886484623 0 0 0.1267858297 0.8732141852 0 0 0.1201047897 0.8798952103 0 0 0.111488983 0.8885110021 0 0 0.1145310923 0.8854689002 0 0 0.1180123016 0.8819876909 0 0 0.1175788119 0.8824211955 0 0 0.1224047989 0.8775951862 0 0 0.1458918601 0.8541082144 0 0 0.1993230581 0.8006769419 0 0 0.3016872704 0.6983126998 0 0 0.4852449298 0.5147550702 0 0 0.738625288 0.2613747418 0 0 0.9357450008 0.0642550215 0 0 0.9943515062 0.005648477 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0.9305805564 0.0694194809 0 0 0.6814801097 0.3185198605 0 0 0.4072287381 0.5927712321 0 0 0.2266203761 0.7733795643 0 0 0.1351234764 0.8648765683 0 0 0.0986977145 0.901302278 0 0 0.0828339085 0.9171660542 0 0 0.072055839 0.9279441833 0 0 0.0613535792 0.9386463761 0 0 0.0514944494 0.9485055208 0 0 0.049476523 0.9505234957 0 0 0.0633073151 0.9366927147 0 0 0.0993831828 0.900616765 0 0 0.1623166054 0.8376834393 0 0 0.2401233315 0.7598766685 0 0 0.3017115593 0.6982884407 0 0 0.311442107 0.6885578632 0 0 0.2843464911 0.7156535387 0 0 0.2529682517 0.7470317483 0 0 0.2090564519 0.7909435034 0 0 0.1702131927 0.8297868371 0 0 0.1522496045 0.8477504253 0 0 0.1575285047 0.84247154 0 0 0.1885985732 0.8114014268 0 0 0.2696521878 0.7303478122 0 0 0.428968668 0.5710313916 0 0 0.6601486206 0.339851439 0 0 0.8774199486 0.1225800961 0 0 0.9814739823 0.0185260233 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0.9574964643 0.0425036065 0 0 0.7830722332 0.2169277519 0 0 0.5478200316 0.4521799982 0 0 0.3568731546 0.6431268454 0 0 0.2425704449 0.7574295998 0 0 0.1967719048 0.8032280803 0 0 0.1750206351 0.8249794245 0 0 0.1555665433 0.8444334269 0 0 0.1337940097 0.8662059903 0 0 0.1154093072 0.884590745 0 0 0.1157280058 0.8842719793 0 0 0.1479323655 0.8520675898 0 0 0.2188025862 0.7811974883 0 0 0.3387508094 0.6612492204 0 0 0.4925564229 0.5074436069 0 0 0.6023011208 0.3976988792 0 0 0.6511842608 0.3488157392 0 0 0.6004007459 0.3995992839 0 0 0.4995695353 0.5004304647 0 0 0.3839401007 0.6160598993 0 0 0.2862620056 0.7137380242 0 0 0.2245022058 0.7754977942 0 0 0.1931320727 0.8068679571 0 0 0.2002356946 0.7997643948 0 0 0.261739701 0.7382602692 0 0 0.3956015408 0.604398489 0 0 0.5991365314 0.4008634686 0 0 0.8059673905 0.1940325946 0 0 0.9414880872 0.0585119054 0 0 0.9960426092 0.003957408 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0.9718220234 0.0281780101 0 0 0.8487388492 0.1512611806 0 0 0.6852009892 0.3147990406 0 0 0.540345192 0.4596547782 0 0 0.432294488 0.5677055717 0 0 0.3849176168 0.6150823832 0 0 0.3737568557 0.6262431741 0 0 0.3588551879 0.6411448121 0 0 0.3271555603 0.6728444695 0 0 0.2934851944 0.7065147758 0 0 0.2955742478 0.7044257522 0 0 0.3548083305 0.6451916695 0 0 0.4664362967 0.5335637331 0 0 0.6254983544 0.3745016456 0 0 0.7823143601 0.2176857293 0 0 0.8738544583 0.1261456013 0 0 0.9080291986 0.0919708759 0 0 0.8683497906 0.1316501647 0 0 0.7684598565 0.2315402329 0 0 0.6217549443 0.3782451153 0 0 0.465243727 0.5347562432 0 0 0.3368999064 0.6631001234 0 0 0.261057198 0.738942802 0 0 0.2445028722 0.755497098 0 0 0.2877083719 0.7122916579 0 0 0.3935277462 0.6064723134 0 0 0.5637354851 0.4362645149 0 0 0.7511731982 0.2488267571 0 0 0.9018256068 0.0981743783 0 0 0.9818461537 0.0181539077 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0.9908969998 0.0091030132 0 0 0.9153938293 0.0846061558 0 0 0.7963932753 0.2036066949 0 0 0.691413641 0.308586359 0 0 0.6364172101 0.3635827601 0 0 0.6205173731 0.3794826865 0 0 0.647282362 0.352717638 0 0 0.6834847927 0.3165152073 0 0 0.6819241047 0.3180758655 0 0 0.6382119656 0.3617880344 0 0 0.6312420368 0.368757993 0 0 0.6759160161 0.3240839541 0 0 0.7738416791 0.2261583954 0 0 0.8928024769 0.1071974859 0 0 0.9541648626 0.0458352081 0 0 0.988132596 0.0118674301 0 0 0.9981642962 0.0018357544 0 0 0.9786236286 0.021376377 0 0 0.9148321748 0.0851678103 0 0 0.8127611279 0.1872389019 0 0 0.6550354362 0.3449645638 0 0 0.4925456643 0.5074543953 0 0 0.3783589303 0.6216410995 0 0 0.3323695064 0.6676304936 0 0 0.3480662405 0.6519337893 0 0 0.4209740162 0.5790260434 0 0 0.5535522699 0.4464477599 0 0 0.7268766761 0.2731233239 0 0 0.8826665282 0.117333442 0 0 0.9700888395 0.0299112089 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0.9761584401 0.0238415617 0 0 0.9115957022 0.08840435 0 0 0.8451443911 0.1548555791 0 0 0.8107816577 0.1892183572 0 0 0.8253403902 0.1746595651 0 0 0.8764684796 0.1235315204 0 0 0.9409902096 0.0590098053 0 0 0.9647308588 0.0352692045 0 0 0.944427371 0.05557267 0 0 0.9264026284 0.0735974088 0 0 0.9326147437 0.0673852265 0 0 0.9558444023 0.0441556089 0 0 0.9732847214 0.0267152786 0 0 0.9928561449 0.0071439054 0 0 1 0 0 0 1 0 0 0 0.9996037483 0.000396275 0 0 0.9858319759 0.0141680436 0 0 0.9415541887 0.0584457777 0 0 0.8375195265 0.1624805331 0 0 0.6833436489 0.3166564107 0 0 0.5379252434 0.4620747864 0 0 0.452316761 0.5476832986 0 0 0.4303188622 0.569681108 0 0 0.4755258262 0.5244742036 0 0 0.5871217251 0.4128783345 0 0 0.7441421747 0.2558577955 0 0 0.8885836601 0.1114163846 0 0 0.970991075 0.0290089846 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0.9998795986 0.0001204211 0 0 0.9869334698 0.0130665246 0 0 0.9623038173 0.0376961902 0 0 0.9491190314 0.0508809499 0 0 0.9588011503 0.0411988795 0 0 0.984110713 0.0158892926 0 0 0.9998695254 0.0001304888 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0.9980120063 0.0019880717 0 0 0.9981539249 0.0018460201 0 0 0.9998585582 0.0001414704 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0.9937155247 0.0062845368 0 0 0.9363108277 0.0636891499 0 0 0.8199157715 0.1800842285 0 0 0.6764256358 0.3235743642 0 0 0.571615696 0.4283843637 0 0 0.5351507664 0.4648492038 0 0 0.5694180131 0.4305820465 0 0 0.6647307277 0.3352693021 0 0 0.7970710993 0.2029289603 0 0 0.9188687205 0.0811313018 0 0 0.9834961891 0.0165037978 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0.9997237325 0.0002762436 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0.9978680611 0.0021319599 0 0 0.9589692354 0.0410307944 0 0 0.887729466 0.1122705117 0 0 0.7895208597 0.2104790956 0 0 0.7027037144 0.2972962856 0 0 0.6677188873 0.3322811127 0 0 0.6940965652 0.3059034646 0 0 0.7713406086 0.2286593616 0 0 0.8751327991 0.1248671338 0 0 0.9625555873 0.037444409 0 0 0.9972561598 0.0027438775 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0.9817236662 0.0182762779 0 0 0.9343144894 0.0656856 0 0 0.8804279566 0.1195720285 0 0 0.8292108178 0.1707892269 0 0 0.8075509071 0.1924491525 0 0 0.8290537 0.1709463 0 0 0.8858775496 0.1141224429 0 0 0.9537847042 0.0462152436 0 0 0.9950164557 0.0049835537 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0.9971060157 0.002894063 0 0 0.976318419 0.0236816257 0 0 0.9461340308 0.0538660176 0 0 0.9251683354 0.0748316422 0 0 0.9219132662 0.0780867785 0 0 0.9389240742 0.0610759556 0 0 0.970908165 0.0290917736 0 0 0.9965904951 0.0034095808 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0.9978708029 0.0021292598 0 0 0.988925755 0.0110742478 0 0 0.9806373715 0.0193626322 0 0 0.980368793 0.0196312424 0 0 0.9884620905 0.0115379198 0 0 0.9976231456 0.0023768598 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0.9998381138 0.000161884 0 0 0.9998166561 0.0001833322 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ }
+ }
+}
diff --git a/base/textures/uac_city_buildings/A1_SMALL_OFFICE_albedo.png b/base/textures/uac_city_buildings/A1_SMALL_OFFICE_albedo.png
new file mode 100644
index 00000000..04a35750
Binary files /dev/null and b/base/textures/uac_city_buildings/A1_SMALL_OFFICE_albedo.png differ
diff --git a/base/textures/uac_city_buildings/A1_SMALL_OFFICE_normal.png b/base/textures/uac_city_buildings/A1_SMALL_OFFICE_normal.png
new file mode 100644
index 00000000..cea3c07e
Binary files /dev/null and b/base/textures/uac_city_buildings/A1_SMALL_OFFICE_normal.png differ
diff --git a/base/textures/uac_city_buildings/A1_SMALL_OFFICE_specular.png b/base/textures/uac_city_buildings/A1_SMALL_OFFICE_specular.png
new file mode 100644
index 00000000..3f2c1be7
Binary files /dev/null and b/base/textures/uac_city_buildings/A1_SMALL_OFFICE_specular.png differ
diff --git a/base/textures/uac_city_buildings/A2_MEDIUM_OFFICE_albedo.png b/base/textures/uac_city_buildings/A2_MEDIUM_OFFICE_albedo.png
new file mode 100644
index 00000000..9d199004
Binary files /dev/null and b/base/textures/uac_city_buildings/A2_MEDIUM_OFFICE_albedo.png differ
diff --git a/base/textures/uac_city_buildings/A2_MEDIUM_OFFICE_normal.png b/base/textures/uac_city_buildings/A2_MEDIUM_OFFICE_normal.png
new file mode 100644
index 00000000..c7a16446
Binary files /dev/null and b/base/textures/uac_city_buildings/A2_MEDIUM_OFFICE_normal.png differ
diff --git a/base/textures/uac_city_buildings/A2_MEDIUM_OFFICE_specular.png b/base/textures/uac_city_buildings/A2_MEDIUM_OFFICE_specular.png
new file mode 100644
index 00000000..0ff00a78
Binary files /dev/null and b/base/textures/uac_city_buildings/A2_MEDIUM_OFFICE_specular.png differ
diff --git a/base/textures/uac_city_buildings/A3_LARGE_OFFICE_albedo.png b/base/textures/uac_city_buildings/A3_LARGE_OFFICE_albedo.png
new file mode 100644
index 00000000..1c79fa3a
Binary files /dev/null and b/base/textures/uac_city_buildings/A3_LARGE_OFFICE_albedo.png differ
diff --git a/base/textures/uac_city_buildings/A3_LARGE_OFFICE_normal.png b/base/textures/uac_city_buildings/A3_LARGE_OFFICE_normal.png
new file mode 100644
index 00000000..61abc4e5
Binary files /dev/null and b/base/textures/uac_city_buildings/A3_LARGE_OFFICE_normal.png differ
diff --git a/base/textures/uac_city_buildings/A3_LARGE_OFFICE_specular.png b/base/textures/uac_city_buildings/A3_LARGE_OFFICE_specular.png
new file mode 100644
index 00000000..14d19cd9
Binary files /dev/null and b/base/textures/uac_city_buildings/A3_LARGE_OFFICE_specular.png differ
diff --git a/base/textures/uac_city_buildings/A4_CORNER_BUILDING_albedo.png b/base/textures/uac_city_buildings/A4_CORNER_BUILDING_albedo.png
new file mode 100644
index 00000000..a5071163
Binary files /dev/null and b/base/textures/uac_city_buildings/A4_CORNER_BUILDING_albedo.png differ
diff --git a/base/textures/uac_city_buildings/A4_CORNER_BUILDING_normal.png b/base/textures/uac_city_buildings/A4_CORNER_BUILDING_normal.png
new file mode 100644
index 00000000..627e1437
Binary files /dev/null and b/base/textures/uac_city_buildings/A4_CORNER_BUILDING_normal.png differ
diff --git a/base/textures/uac_city_buildings/A4_CORNER_BUILDING_specular.png b/base/textures/uac_city_buildings/A4_CORNER_BUILDING_specular.png
new file mode 100644
index 00000000..71f6c9ff
Binary files /dev/null and b/base/textures/uac_city_buildings/A4_CORNER_BUILDING_specular.png differ
diff --git a/base/textures/uac_city_buildings/B1_INDUSTRIAL_BUILDING_albedo.png b/base/textures/uac_city_buildings/B1_INDUSTRIAL_BUILDING_albedo.png
new file mode 100644
index 00000000..e5ba0e8a
Binary files /dev/null and b/base/textures/uac_city_buildings/B1_INDUSTRIAL_BUILDING_albedo.png differ
diff --git a/base/textures/uac_city_buildings/B1_INDUSTRIAL_BUILDING_normal.png b/base/textures/uac_city_buildings/B1_INDUSTRIAL_BUILDING_normal.png
new file mode 100644
index 00000000..fdacb54c
Binary files /dev/null and b/base/textures/uac_city_buildings/B1_INDUSTRIAL_BUILDING_normal.png differ
diff --git a/base/textures/uac_city_buildings/B1_INDUSTRIAL_BUILDING_specular.png b/base/textures/uac_city_buildings/B1_INDUSTRIAL_BUILDING_specular.png
new file mode 100644
index 00000000..62e0f5e4
Binary files /dev/null and b/base/textures/uac_city_buildings/B1_INDUSTRIAL_BUILDING_specular.png differ
diff --git a/base/textures/uac_city_buildings/B2_POWER_SUBSTATION_albedo.png b/base/textures/uac_city_buildings/B2_POWER_SUBSTATION_albedo.png
new file mode 100644
index 00000000..095d23c0
Binary files /dev/null and b/base/textures/uac_city_buildings/B2_POWER_SUBSTATION_albedo.png differ
diff --git a/base/textures/uac_city_buildings/B2_POWER_SUBSTATION_normal.png b/base/textures/uac_city_buildings/B2_POWER_SUBSTATION_normal.png
new file mode 100644
index 00000000..578b8562
Binary files /dev/null and b/base/textures/uac_city_buildings/B2_POWER_SUBSTATION_normal.png differ
diff --git a/base/textures/uac_city_buildings/B2_POWER_SUBSTATION_specular.png b/base/textures/uac_city_buildings/B2_POWER_SUBSTATION_specular.png
new file mode 100644
index 00000000..50d05692
Binary files /dev/null and b/base/textures/uac_city_buildings/B2_POWER_SUBSTATION_specular.png differ
diff --git a/base/textures/uac_city_buildings/B3_RESEARCH_FACILITY_albedo.png b/base/textures/uac_city_buildings/B3_RESEARCH_FACILITY_albedo.png
new file mode 100644
index 00000000..b8716ca2
Binary files /dev/null and b/base/textures/uac_city_buildings/B3_RESEARCH_FACILITY_albedo.png differ
diff --git a/base/textures/uac_city_buildings/B3_RESEARCH_FACILITY_normal.png b/base/textures/uac_city_buildings/B3_RESEARCH_FACILITY_normal.png
new file mode 100644
index 00000000..9fa7db96
Binary files /dev/null and b/base/textures/uac_city_buildings/B3_RESEARCH_FACILITY_normal.png differ
diff --git a/base/textures/uac_city_buildings/B3_RESEARCH_FACILITY_specular.png b/base/textures/uac_city_buildings/B3_RESEARCH_FACILITY_specular.png
new file mode 100644
index 00000000..59629abb
Binary files /dev/null and b/base/textures/uac_city_buildings/B3_RESEARCH_FACILITY_specular.png differ
diff --git a/base/textures/uac_city_buildings/B4_COMMUNICATIONS_albedo.png b/base/textures/uac_city_buildings/B4_COMMUNICATIONS_albedo.png
new file mode 100644
index 00000000..c6d338a1
Binary files /dev/null and b/base/textures/uac_city_buildings/B4_COMMUNICATIONS_albedo.png differ
diff --git a/base/textures/uac_city_buildings/B4_COMMUNICATIONS_normal.png b/base/textures/uac_city_buildings/B4_COMMUNICATIONS_normal.png
new file mode 100644
index 00000000..8c951c81
Binary files /dev/null and b/base/textures/uac_city_buildings/B4_COMMUNICATIONS_normal.png differ
diff --git a/base/textures/uac_city_buildings/B4_COMMUNICATIONS_specular.png b/base/textures/uac_city_buildings/B4_COMMUNICATIONS_specular.png
new file mode 100644
index 00000000..ea1b6d04
Binary files /dev/null and b/base/textures/uac_city_buildings/B4_COMMUNICATIONS_specular.png differ
diff --git a/base/textures/uac_city_buildings/C1_APARTMENT_BLOCK_albedo.png b/base/textures/uac_city_buildings/C1_APARTMENT_BLOCK_albedo.png
new file mode 100644
index 00000000..398c4060
Binary files /dev/null and b/base/textures/uac_city_buildings/C1_APARTMENT_BLOCK_albedo.png differ
diff --git a/base/textures/uac_city_buildings/C1_APARTMENT_BLOCK_normal.png b/base/textures/uac_city_buildings/C1_APARTMENT_BLOCK_normal.png
new file mode 100644
index 00000000..7dbdcc06
Binary files /dev/null and b/base/textures/uac_city_buildings/C1_APARTMENT_BLOCK_normal.png differ
diff --git a/base/textures/uac_city_buildings/C1_APARTMENT_BLOCK_specular.png b/base/textures/uac_city_buildings/C1_APARTMENT_BLOCK_specular.png
new file mode 100644
index 00000000..7c868114
Binary files /dev/null and b/base/textures/uac_city_buildings/C1_APARTMENT_BLOCK_specular.png differ
diff --git a/base/textures/uac_city_buildings/C2_SHOPPING_FRONT_albedo.png b/base/textures/uac_city_buildings/C2_SHOPPING_FRONT_albedo.png
new file mode 100644
index 00000000..2e5478a3
Binary files /dev/null and b/base/textures/uac_city_buildings/C2_SHOPPING_FRONT_albedo.png differ
diff --git a/base/textures/uac_city_buildings/C2_SHOPPING_FRONT_normal.png b/base/textures/uac_city_buildings/C2_SHOPPING_FRONT_normal.png
new file mode 100644
index 00000000..4b7a96df
Binary files /dev/null and b/base/textures/uac_city_buildings/C2_SHOPPING_FRONT_normal.png differ
diff --git a/base/textures/uac_city_buildings/C2_SHOPPING_FRONT_specular.png b/base/textures/uac_city_buildings/C2_SHOPPING_FRONT_specular.png
new file mode 100644
index 00000000..b62b0e54
Binary files /dev/null and b/base/textures/uac_city_buildings/C2_SHOPPING_FRONT_specular.png differ
diff --git a/base/textures/uac_city_buildings/C3_HOTEL_albedo.png b/base/textures/uac_city_buildings/C3_HOTEL_albedo.png
new file mode 100644
index 00000000..5c41bef6
Binary files /dev/null and b/base/textures/uac_city_buildings/C3_HOTEL_albedo.png differ
diff --git a/base/textures/uac_city_buildings/C3_HOTEL_normal.png b/base/textures/uac_city_buildings/C3_HOTEL_normal.png
new file mode 100644
index 00000000..3d0d9d0d
Binary files /dev/null and b/base/textures/uac_city_buildings/C3_HOTEL_normal.png differ
diff --git a/base/textures/uac_city_buildings/C3_HOTEL_specular.png b/base/textures/uac_city_buildings/C3_HOTEL_specular.png
new file mode 100644
index 00000000..76569c5a
Binary files /dev/null and b/base/textures/uac_city_buildings/C3_HOTEL_specular.png differ
diff --git a/base/textures/uac_city_buildings/C4_PARKING_STRUCTURE_albedo.png b/base/textures/uac_city_buildings/C4_PARKING_STRUCTURE_albedo.png
new file mode 100644
index 00000000..d4658312
Binary files /dev/null and b/base/textures/uac_city_buildings/C4_PARKING_STRUCTURE_albedo.png differ
diff --git a/base/textures/uac_city_buildings/C4_PARKING_STRUCTURE_normal.png b/base/textures/uac_city_buildings/C4_PARKING_STRUCTURE_normal.png
new file mode 100644
index 00000000..0a25594a
Binary files /dev/null and b/base/textures/uac_city_buildings/C4_PARKING_STRUCTURE_normal.png differ
diff --git a/base/textures/uac_city_buildings/C4_PARKING_STRUCTURE_specular.png b/base/textures/uac_city_buildings/C4_PARKING_STRUCTURE_specular.png
new file mode 100644
index 00000000..2737a414
Binary files /dev/null and b/base/textures/uac_city_buildings/C4_PARKING_STRUCTURE_specular.png differ
diff --git a/neo/engine/cm/CollisionModel.h b/neo/engine/cm/CollisionModel.h
index f1df5d18..864cf172 100644
--- a/neo/engine/cm/CollisionModel.h
+++ b/neo/engine/cm/CollisionModel.h
@@ -89,7 +89,7 @@ public:
virtual ~idCollisionModelManager( void ) {}
// Loads collision models from a map file.
- virtual void LoadMap( const idMapFile *mapFile ) = 0;
+ virtual void LoadMap( const idMapFile *mapFile, bool bakeTerrain = false ) = 0;
// Frees all the collision models.
virtual void FreeMap( void ) = 0;
diff --git a/neo/engine/cm/CollisionModel_load.cpp b/neo/engine/cm/CollisionModel_load.cpp
index 11ecdfdb..680b98f5 100644
--- a/neo/engine/cm/CollisionModel_load.cpp
+++ b/neo/engine/cm/CollisionModel_load.cpp
@@ -49,6 +49,7 @@ If you have questions concerning this license or the applicable additional terms
#pragma hdrstop
#include "CollisionModel_local.h"
+#include "../models/TerrainModel.h"
idCollisionModelManagerLocal collisionModelManagerLocal;
@@ -2577,6 +2578,160 @@ void idCollisionModelManagerLocal::CreatePatchPolygons( cm_model_t *model, idSur
}
}
+/*
+=================
+idCollisionModelManagerLocal::CreateTerrainPolygons
+=================
+*/
+void idCollisionModelManagerLocal::CreateTerrainPolygons( cm_model_t *model, const idTerrainPatch &terrain, const idMaterial *material, int primitiveNum ) {
+ int x, y;
+ float dot;
+ idFixedWinding w;
+ idPlane plane;
+ idVec3 d1, d2;
+ idVec3 v1, v2, v3, v4;
+
+ for ( y = 0; y < terrain.height - 1; y++ ) {
+ for ( x = 0; x < terrain.width - 1; x++ ) {
+ v1 = terrain.Vertex( x, y );
+ v2 = terrain.Vertex( x + 1, y );
+ v3 = terrain.Vertex( x + 1, y + 1 );
+ v4 = terrain.Vertex( x, y + 1 );
+
+ d1 = v2 - v1;
+ d2 = v3 - v1;
+ plane.SetNormal( d1.Cross( d2 ) );
+ if ( plane.Normalize() != 0.0f ) {
+ plane.FitThroughPoint( v1 );
+ dot = plane.Distance( v4 );
+ if ( idMath::Fabs( dot ) < 0.1f ) {
+ w.Clear();
+ w += v1;
+ w += v2;
+ w += v3;
+ w += v4;
+
+ PolygonFromWinding( model, &w, plane, material, -primitiveNum );
+ continue;
+ } else {
+ w.Clear();
+ w += v1;
+ w += v2;
+ w += v3;
+
+ PolygonFromWinding( model, &w, plane, material, -primitiveNum );
+ }
+ }
+
+ d1 = v3 - v1;
+ d2 = v4 - v1;
+ plane.SetNormal( d1.Cross( d2 ) );
+ if ( plane.Normalize() != 0.0f ) {
+ plane.FitThroughPoint( v1 );
+
+ w.Clear();
+ w += v1;
+ w += v3;
+ w += v4;
+
+ PolygonFromWinding( model, &w, plane, material, -primitiveNum );
+ }
+ }
+ }
+}
+
+/*
+=================
+idCollisionModelManagerLocal::LoadTerrainForMap
+=================
+*/
+bool idCollisionModelManagerLocal::LoadTerrainForMap( const idMapFile *mapFile, idTerrainModel &terrainModel ) {
+ if ( !mapFile ) {
+ return false;
+ }
+
+ idStr terrainFile = idTerrainModel::FileNameForMap( mapFile->GetName() );
+ ID_TIME_T terrainTimeStamp;
+ fileSystem->ReadFile( terrainFile, NULL, &terrainTimeStamp );
+ if ( terrainTimeStamp == FILE_NOT_FOUND_TIMESTAMP ) {
+ return false;
+ }
+
+ if ( !terrainModel.LoadFile( terrainFile.c_str(), "textures/common/caulk" ) ) {
+ common->Warning( "idCollisionModelManagerLocal::LoadTerrainForMap: failed to load %s", terrainFile.c_str() );
+ return false;
+ }
+
+ for ( int i = 0; i < terrainModel.NumTerrains(); i++ ) {
+ idTerrainPatch *terrain = terrainModel.Terrain( i );
+ if ( !terrain ) {
+ continue;
+ }
+ terrain->EnsureLayerData( "textures/common/caulk" );
+ terrain->UpdateBounds();
+ }
+ return terrainModel.NumTerrains() > 0;
+}
+
+/*
+=================
+CM_EstimateTerrainVertsAndEdges
+=================
+*/
+static void CM_EstimateTerrainVertsAndEdges( const idTerrainModel &terrainModel, int *numVerts, int *numEdges ) {
+ for ( int i = 0; i < terrainModel.NumTerrains(); i++ ) {
+ const idTerrainPatch *terrain = terrainModel.Terrain( i );
+ if ( !terrain || terrain->width < 2 || terrain->height < 2 ) {
+ continue;
+ }
+ *numVerts += terrain->width * terrain->height;
+ *numEdges += ( terrain->width - 1 ) * terrain->height + terrain->width * ( terrain->height - 1 ) + ( terrain->width - 1 ) * ( terrain->height - 1 );
+ }
+}
+
+/*
+=================
+CM_AddTerrainBounds
+=================
+*/
+static void CM_AddTerrainBounds( idBounds &bounds, const idTerrainModel &terrainModel ) {
+ for ( int i = 0; i < terrainModel.NumTerrains(); i++ ) {
+ const idTerrainPatch *terrain = terrainModel.Terrain( i );
+ if ( !terrain ) {
+ continue;
+ }
+ bounds.AddPoint( terrain->bounds[0] );
+ bounds.AddPoint( terrain->bounds[1] );
+ }
+}
+
+/*
+=================
+idCollisionModelManagerLocal::AddTerrainToModel
+=================
+*/
+int idCollisionModelManagerLocal::AddTerrainToModel( cm_model_t *model, idTerrainModel &terrainModel ) {
+ static const int TERRAIN_COLLISION_PRIMITIVE_BASE = 1000000;
+ const idMaterial *solidMaterial = declManager->FindMaterial( "textures/common/caulk" );
+ const int startPolygons = model->numPolygons;
+
+ for ( int i = 0; i < terrainModel.NumTerrains(); i++ ) {
+ idTerrainPatch *terrain = terrainModel.Terrain( i );
+ if ( !terrain ) {
+ continue;
+ }
+
+ terrain->EnsureLayerData( "textures/common/caulk" );
+ const idMaterial *material = declManager->FindMaterial( terrain->material.c_str() );
+ if ( !( material->GetContentFlags() & CONTENTS_REMOVE_UTIL ) ) {
+ material = solidMaterial;
+ }
+ CreateTerrainPolygons( model, *terrain, material, TERRAIN_COLLISION_PRIMITIVE_BASE + i );
+ }
+
+ return model->numPolygons - startPolygons;
+}
+
/*
=================
CM_EstimateVertsAndEdges
@@ -3077,14 +3232,16 @@ cm_model_t *idCollisionModelManagerLocal::LoadRenderModel( const char *fileName
idCollisionModelManagerLocal::CollisionModelForMapEntity
================
*/
-cm_model_t *idCollisionModelManagerLocal::CollisionModelForMapEntity( const idMapEntity *mapEnt ) {
+cm_model_t *idCollisionModelManagerLocal::CollisionModelForMapEntity( const idMapEntity *mapEnt, const idMapFile *mapFile, bool bakeTerrain ) {
cm_model_t *model;
idBounds bounds;
const char *name;
int i, brushCount;
+ idTerrainModel terrainModel;
+ const bool addTerrain = bakeTerrain && LoadTerrainForMap( mapFile, terrainModel );
// if the entity has no primitives
- if ( mapEnt->GetNumPrimitives() < 1 ) {
+ if ( mapEnt->GetNumPrimitives() < 1 && !addTerrain ) {
return NULL;
}
@@ -3107,6 +3264,15 @@ cm_model_t *idCollisionModelManagerLocal::CollisionModelForMapEntity( const idMa
model->node = AllocNode( model, NODE_BLOCK_SIZE_SMALL );
CM_EstimateVertsAndEdges( mapEnt, &model->maxVertices, &model->maxEdges );
+ if ( addTerrain ) {
+ CM_EstimateTerrainVertsAndEdges( terrainModel, &model->maxVertices, &model->maxEdges );
+ }
+ if ( model->maxVertices < 1 ) {
+ model->maxVertices = 1;
+ }
+ if ( model->maxEdges < 2 ) {
+ model->maxEdges = 2;
+ }
model->numVertices = 0;
model->numEdges = 0;
model->vertices = (cm_vertex_t *) Mem_ClearedAlloc( model->maxVertices * sizeof(cm_vertex_t) );
@@ -3141,6 +3307,12 @@ cm_model_t *idCollisionModelManagerLocal::CollisionModelForMapEntity( const idMa
if ( brushCount ) {
CM_GetNodeBounds( &bounds, model->node );
} else {
+ bounds.Clear();
+ }
+ if ( addTerrain ) {
+ CM_AddTerrainBounds( bounds, terrainModel );
+ }
+ if ( bounds.IsCleared() ) {
bounds[0].Set( -256, -256, -256 );
bounds[1].Set( 256, 256, 256 );
}
@@ -3162,6 +3334,10 @@ cm_model_t *idCollisionModelManagerLocal::CollisionModelForMapEntity( const idMa
continue;
}
}
+ if ( addTerrain ) {
+ const int addedPolygons = AddTerrainToModel( model, terrainModel );
+ common->Printf( "baked %i terrain collision polygons into %s\n", addedPolygons, model->name.c_str() );
+ }
FinishModel( model );
@@ -3283,14 +3459,14 @@ void idCollisionModelManagerLocal::ListModels( void ) {
idCollisionModelManagerLocal::BuildModels
================
*/
-void idCollisionModelManagerLocal::BuildModels( const idMapFile *mapFile ) {
+void idCollisionModelManagerLocal::BuildModels( const idMapFile *mapFile, bool bakeTerrain ) {
int i;
const idMapEntity *mapEnt;
idTimer timer;
timer.Start();
- if ( !LoadCollisionModelFile( mapFile->GetName(), mapFile->GetGeometryCRC() ) ) {
+ if ( bakeTerrain || !LoadCollisionModelFile( mapFile->GetName(), mapFile->GetGeometryCRC() ) ) {
if ( !mapFile->GetNumEntities() ) {
return;
@@ -3307,7 +3483,7 @@ void idCollisionModelManagerLocal::BuildModels( const idMapFile *mapFile ) {
common->Error( "idCollisionModelManagerLocal::BuildModels: more than %d collision models", MAX_SUBMODELS );
break;
}
- models[numModels] = CollisionModelForMapEntity( mapEnt );
+ models[numModels] = CollisionModelForMapEntity( mapEnt, mapFile, bakeTerrain && numModels == 0 );
if ( models[ numModels] ) {
numModels++;
}
@@ -3338,7 +3514,7 @@ void idCollisionModelManagerLocal::BuildModels( const idMapFile *mapFile ) {
idCollisionModelManagerLocal::LoadMap
================
*/
-void idCollisionModelManagerLocal::LoadMap( const idMapFile *mapFile ) {
+void idCollisionModelManagerLocal::LoadMap( const idMapFile *mapFile, bool bakeTerrain ) {
if ( mapFile == NULL ) {
common->Error( "idCollisionModelManagerLocal::LoadMap: NULL mapFile" );
@@ -3347,7 +3523,7 @@ void idCollisionModelManagerLocal::LoadMap( const idMapFile *mapFile ) {
// check whether we can keep the current collision map based on the mapName and mapFileTime
if ( loaded ) {
if ( mapName.Icmp( mapFile->GetName() ) == 0 ) {
- if ( mapFile->GetFileTime() == mapFileTime ) {
+ if ( !bakeTerrain && mapFile->GetFileTime() == mapFileTime ) {
common->DPrintf( "Using loaded version\n" );
return;
}
@@ -3371,7 +3547,7 @@ void idCollisionModelManagerLocal::LoadMap( const idMapFile *mapFile ) {
SetupTrmModelStructure();
// build collision models
- BuildModels( mapFile );
+ BuildModels( mapFile, bakeTerrain );
// save name and time stamp
mapName = mapFile->GetName();
diff --git a/neo/engine/cm/CollisionModel_local.h b/neo/engine/cm/CollisionModel_local.h
index f77d34b7..8d984f94 100644
--- a/neo/engine/cm/CollisionModel_local.h
+++ b/neo/engine/cm/CollisionModel_local.h
@@ -36,6 +36,9 @@ If you have questions concerning this license or the applicable additional terms
#include "CollisionModel.h"
+class idTerrainModel;
+class idTerrainPatch;
+
#define MIN_NODE_SIZE 64.0f
#define MAX_NODE_POLYGONS 128
#define CM_MAX_POLYGON_EDGES 64
@@ -293,7 +296,7 @@ typedef struct cm_procNode_s {
class idCollisionModelManagerLocal : public idCollisionModelManager {
public:
// load collision models from a map file
- void LoadMap( const idMapFile *mapFile );
+ void LoadMap( const idMapFile *mapFile, bool bakeTerrain = false );
// frees all the collision models
void FreeMap( void );
@@ -458,6 +461,9 @@ private: // CollisionMap_load.cpp
void PolygonFromWinding( cm_model_t *model, idFixedWinding *w, const idPlane &plane, const idMaterial *material, int primitiveNum );
void CalculateEdgeNormals( cm_model_t *model, cm_node_t *node );
void CreatePatchPolygons( cm_model_t *model, idSurface_Patch &mesh, const idMaterial *material, int primitiveNum );
+ void CreateTerrainPolygons( cm_model_t *model, const idTerrainPatch &terrain, const idMaterial *material, int primitiveNum );
+ bool LoadTerrainForMap( const idMapFile *mapFile, idTerrainModel &terrainModel );
+ int AddTerrainToModel( cm_model_t *model, idTerrainModel &terrainModel );
void ConvertPatch( cm_model_t *model, const idMapPatch *patch, int primitiveNum );
void ConvertBrushSides( cm_model_t *model, const idMapBrush *mapBrush, int primitiveNum );
void ConvertBrush( cm_model_t *model, const idMapBrush *mapBrush, int primitiveNum );
@@ -466,9 +472,9 @@ private: // CollisionMap_load.cpp
void RemapEdges( cm_node_t *node, int *edgeRemap );
void OptimizeArrays( cm_model_t *model );
void FinishModel( cm_model_t *model );
- void BuildModels( const idMapFile *mapFile );
+ void BuildModels( const idMapFile *mapFile, bool bakeTerrain );
cmHandle_t FindModel( const char *name );
- cm_model_t * CollisionModelForMapEntity( const idMapEntity *mapEnt ); // brush/patch model from .map
+ cm_model_t * CollisionModelForMapEntity( const idMapEntity *mapEnt, const idMapFile *mapFile = NULL, bool bakeTerrain = false ); // brush/patch model from .map
cm_model_t * LoadRenderModel( const char *fileName ); // ASE/LWO models
bool TrmFromModel_r( idTraceModel &trm, cm_node_t *node );
bool TrmFromModel( const cm_model_t *model, idTraceModel &trm );
diff --git a/neo/engine/doomdll.vcxproj b/neo/engine/doomdll.vcxproj
index e941d0fb..05466f4c 100644
--- a/neo/engine/doomdll.vcxproj
+++ b/neo/engine/doomdll.vcxproj
@@ -402,6 +402,7 @@
+
@@ -1326,6 +1327,11 @@
true
true
+
+ true
+ true
+ true
+
true
true
@@ -1584,6 +1590,7 @@
+
@@ -1604,6 +1611,7 @@
+
@@ -1611,6 +1619,7 @@
+
@@ -2884,6 +2893,11 @@
true
true
+
+ true
+ true
+ true
+
true
true
diff --git a/neo/engine/doomdll.vcxproj.filters b/neo/engine/doomdll.vcxproj.filters
index 679bd778..1d1be098 100644
--- a/neo/engine/doomdll.vcxproj.filters
+++ b/neo/engine/doomdll.vcxproj.filters
@@ -606,6 +606,9 @@
Models
+
+ Models
+
Renderer
@@ -755,6 +758,9 @@
Renderer
+
+ Renderer
+
Renderer
@@ -1550,6 +1556,9 @@
Tools\Radiant
+
+ Tools\Radiant
+
Tools\Radiant
@@ -1640,6 +1649,9 @@
Renderer
+
+ Renderer
+
Tools\Radiant
@@ -1682,6 +1694,9 @@
Models
+
+ Models
+
CM\PreyCM
@@ -2510,6 +2525,9 @@
Tools\Radiant
+
+ Tools\Radiant
+
Tools\Radiant
diff --git a/neo/engine/idlib/TextCompiler.cpp b/neo/engine/idlib/TextCompiler.cpp
new file mode 100644
index 00000000..f8934c63
--- /dev/null
+++ b/neo/engine/idlib/TextCompiler.cpp
@@ -0,0 +1,2 @@
+#include "precompiled.h"
+#pragma hdrstop
diff --git a/neo/engine/idlib/TextCompiler.h b/neo/engine/idlib/TextCompiler.h
new file mode 100644
index 00000000..1af305ce
--- /dev/null
+++ b/neo/engine/idlib/TextCompiler.h
@@ -0,0 +1,140 @@
+#ifndef __TEXTCOMPILER_H__
+#define __TEXTCOMPILER_H__
+
+#include "../framework/File.h"
+
+namespace TextCompiler
+{
+ // Write an indirect value
+ template inline void WriteValue(type const * const ptr, idFile *out, bool byteSwap=false)
+ {
+ if(out != NULL)
+ {
+ if(!byteSwap)
+ {
+ out->Write(ptr, sizeof(type));
+ }
+ else
+ {
+ byte const * const p = (byte *)ptr;
+
+ for(int i=sizeof(type)-1;i>=0;i--)
+ {
+ out->Write(&(p[i]), 1);
+ }
+ }
+
+ }
+ }
+
+ // Write a direct value
+ template inline void WriteValue(type const val, idFile *out, bool byteSwap=false)
+ {
+ if(out != NULL)
+ {
+ if(!byteSwap)
+ {
+ out->Write(&val, sizeof(type));
+ }
+ else
+ {
+ byte const * const p = (byte *)&val;
+
+ for(int i=sizeof(type)-1;i>=0;i--)
+ {
+ out->Write(&(p[i]), 1);
+ }
+ }
+ }
+ }
+
+ template inline type ReadValue(idFile *in)
+ {
+ type ret;
+
+ in->Read(&ret, sizeof(type));
+ return ret;
+ }
+
+ // specialization write for idStr's
+ template <> inline void WriteValue(idStr const * const ptr, idFile *out, bool byteSwap)
+ {
+ if(out != NULL)
+ {
+ // if less than 32, then we don't need a trailing null
+ // this is because 5 bits can be used to represent string length in the token header
+ // zero length strings end up needing to be null terminated
+ if((ptr->Length() < 32) && (ptr->Length() != 0))
+ {
+ out->Write(ptr->c_str(), ptr->Length());
+ }
+ else
+ {
+ out->Write(ptr->c_str(), ptr->Length()+1);
+ }
+ }
+ }
+
+ // specialization read for idStr's
+ template <> inline idStr ReadValue(idFile *in)
+ {
+ char c;
+ idStr str;
+
+ in->Read(&c, 1);
+ while(c != '\0')
+ {
+ str.Append(c);
+ in->Read(&c, 1);
+ }
+
+ str.Append(c);
+
+ return str;
+ }
+
+ template inline void WriteArray(type const * const ptr, unsigned int count, idFile *out)
+ {
+ WriteValue(&count, out);
+ for(unsigned int i=0;i(&(ptr[i]), out);
+ }
+ }
+
+ template inline type *ReadArray(idFile *in, unsigned int *count=NULL)
+ {
+ unsigned int len;
+ len = ReadValue(in);
+ type *buffer = (type *)malloc(len*sizeof(type));
+ type *ptr = buffer;
+ for(unsigned int i=0;i(in);
+ ptr++;
+ }
+ if(count != NULL)
+ *count = len;
+ return buffer;
+ }
+
+ template inline void WriteIdList(idList const * const ptr, idFile *out)
+ {
+ WriteArray(ptr->Ptr(), ptr->Num(), out);
+ }
+
+ template inline idList ReadIdList(idFile *in)
+ {
+ idList ret;
+ ret.Clear();
+ unsigned int count;
+ idAutoPtr array(ReadArray(in, &count));
+
+ for(unsigned int i=0;i
+
+/*
+=================
+rvAngles::NormalizeFull
+
+returns angles normalized to the range [0 <= angle < TWO_PI]
+=================
+*/
+rvAngles &rvAngles::NormalizeFull( void )
+{
+ // Get to -TWO_PI < a < TWO_PI
+ pitch = fmodf( pitch, idMath::TWO_PI );
+ yaw = fmodf( yaw, idMath::TWO_PI );
+ roll = fmodf( roll, idMath::TWO_PI );
+
+ // Fix any negatives
+ if( pitch < 0.0f )
+ {
+ pitch += idMath::TWO_PI;
+ }
+
+ if( yaw < 0.0f )
+ {
+ yaw += idMath::TWO_PI;
+ }
+
+ if( roll < 0.0f )
+ {
+ roll += idMath::TWO_PI;
+ }
+
+ return( *this );
+}
+
+/*
+=================
+rvAngles::NormalizeHalf
+
+returns angles normalized to the range [-PI < angle <= PI]
+=================
+*/
+rvAngles &rvAngles::NormalizeHalf( void )
+{
+ int i;
+
+ // Get to -TWO_PI < a < TWO_PI
+ pitch = fmodf( pitch, idMath::TWO_PI );
+ yaw = fmodf( yaw, idMath::TWO_PI );
+ roll = fmodf( roll, idMath::TWO_PI );
+
+ for( i = 0; i < 3; i++ )
+ {
+ if( ( *this )[i] < -idMath::PI )
+ {
+ ( *this )[i] += idMath::TWO_PI;
+ }
+
+ if( ( *this )[i] > idMath::PI )
+ {
+ ( *this )[i] -= idMath::TWO_PI;
+ }
+ }
+
+ return( *this );
+}
+
+/*
+=================
+rvAngles::ToVectors
+=================
+*/
+void rvAngles::ToVectors( idVec3 *forward, idVec3 *right, idVec3 *up ) const
+{
+ float sr, sp, sy, cr, cp, cy;
+
+ idMath::SinCos( yaw, sy, cy );
+ idMath::SinCos( pitch, sp, cp );
+ idMath::SinCos( roll, sr, cr );
+
+ if( forward )
+ {
+ forward->Set( cp * cy, cp * sy, -sp );
+ }
+
+ if( right )
+ {
+ right->Set( -sr * sp * cy + cr * sy, -sr * sp * sy + -cr * cy, -sr * cp );
+ }
+
+ if( up )
+ {
+ up->Set( cr * sp * cy + -sr * -sy, cr * sp * sy + -sr * cy, cr * cp );
+ }
+}
+
+/*
+=================
+rvAngles::ToForward
+=================
+*/
+idVec3 rvAngles::ToForward( void ) const
+{
+ float sp, sy, cp, cy;
+
+ idMath::SinCos( yaw, sy, cy );
+ idMath::SinCos( pitch, sp, cp );
+
+ return( idVec3( cp * cy, cp * sy, -sp ) );
+}
+
+/*
+=================
+rvAngles::ToMat3
+=================
+*/
+idMat3 &rvAngles::ToMat3( idMat3 &mat ) const
+{
+ float sr, sp, sy, cr, cp, cy;
+
+ idMath::SinCos( yaw, sy, cy );
+ idMath::SinCos( pitch, sp, cp );
+ idMath::SinCos( roll, sr, cr );
+
+ mat[0].Set( cp * cy, cp * sy, -sp );
+ mat[1].Set( sr * sp * cy + cr * -sy, sr * sp * sy + cr * cy, sr * cp );
+ mat[2].Set( cr * sp * cy + -sr * -sy, cr * sp * sy + -sr * cy, cr * cp );
+
+ return( mat );
+}
+
+// end
diff --git a/neo/engine/idlib/math/Radians.h b/neo/engine/idlib/math/Radians.h
new file mode 100644
index 00000000..2e260350
--- /dev/null
+++ b/neo/engine/idlib/math/Radians.h
@@ -0,0 +1,252 @@
+#ifndef _MATH_RADIANS_H_INC_
+#define _MATH_RADIANS_H_INC_
+
+/*
+===============================================================================
+ Euler angles
+
+ This is basically a duplicate of idAngles, but used radians rather than
+ degrees (to avoid the conversion before trig calls)
+
+ All trig calls use float precision
+
+ ToMat3 passes in workspace to avoid a memcpy
+
+===============================================================================
+*/
+
+#ifndef M_PI
+# define M_PI (3.1415926536f)
+#endif
+
+class idVec3;
+class idMat3;
+
+class rvAngles
+{
+public:
+ float pitch;
+ float yaw;
+ float roll;
+
+ rvAngles( void ) {}
+ rvAngles( float pitch, float yaw, float roll );
+ explicit rvAngles( const idVec3 &v );
+
+ void Set( float pitch, float yaw, float roll );
+ rvAngles & Zero( void );
+
+ float operator[]( int index ) const;
+ float & operator[]( int index );
+ rvAngles operator-() const;
+ rvAngles & operator=( const rvAngles &a );
+ rvAngles & operator=( const idVec3 &a );
+ rvAngles operator+( const rvAngles &a ) const;
+ rvAngles operator+( const idVec3 &a ) const;
+ rvAngles & operator+=( const rvAngles &a );
+ rvAngles & operator+=( const idVec3 &a );
+ rvAngles operator-( const rvAngles &a ) const;
+ rvAngles operator-( const idVec3 &a ) const;
+ rvAngles & operator-=( const rvAngles &a );
+ rvAngles & operator-=( const idVec3 &a );
+ rvAngles operator*( const float a ) const;
+ rvAngles & operator*=( const float a );
+
+ friend rvAngles operator+( const idVec3 &a, const rvAngles &b );
+ friend rvAngles operator-( const idVec3 &a, const rvAngles &b );
+ friend rvAngles operator*( const float a, const rvAngles &b );
+
+ bool Compare( const rvAngles &a ) const; // exact compare, no epsilon
+ bool Compare( const rvAngles &a, const float epsilon ) const; // compare with epsilon
+ bool operator==( const rvAngles &a ) const; // exact compare, no epsilon
+ bool operator!=( const rvAngles &a ) const; // exact compare, no epsilon
+
+ rvAngles & NormalizeFull( void ); // normalizes 'this'
+ rvAngles & NormalizeHalf( void ); // normalizes 'this'
+
+ void ToVectors( idVec3 *forward, idVec3 *right = NULL, idVec3 *up = NULL ) const;
+ idVec3 ToForward( void ) const;
+ idMat3 &ToMat3( idMat3 &mat ) const;
+
+ const float * ToFloatPtr( void ) const { return( &pitch ); }
+ float * ToFloatPtr( void ) { return( &pitch ); }
+};
+
+ID_INLINE rvAngles::rvAngles( float pitch, float yaw, float roll )
+{
+ this->pitch = pitch;
+ this->yaw = yaw;
+ this->roll = roll;
+}
+
+ID_INLINE rvAngles::rvAngles( const idVec3 &v )
+{
+ this->pitch = v[0];
+ this->yaw = v[1];
+ this->roll = v[2];
+}
+
+ID_INLINE void rvAngles::Set( float pitch, float yaw, float roll )
+{
+ this->pitch = pitch;
+ this->yaw = yaw;
+ this->roll = roll;
+}
+
+ID_INLINE rvAngles &rvAngles::Zero( void )
+{
+ pitch = 0.0f;
+ yaw = 0.0f;
+ roll = 0.0f;
+ return( *this );
+}
+
+ID_INLINE float rvAngles::operator[]( int index ) const
+{
+ assert( ( index >= 0 ) && ( index < 3 ) );
+ return( ( &pitch )[ index ] );
+}
+
+ID_INLINE float &rvAngles::operator[]( int index )
+{
+ assert( ( index >= 0 ) && ( index < 3 ) );
+ return( ( &pitch )[ index ] );
+}
+
+ID_INLINE rvAngles rvAngles::operator-( void ) const
+{
+ return( rvAngles( -pitch, -yaw, -roll ) );
+}
+
+ID_INLINE rvAngles &rvAngles::operator=( const rvAngles &a )
+{
+ pitch = a.pitch;
+ yaw = a.yaw;
+ roll = a.roll;
+ return( *this );
+}
+
+ID_INLINE rvAngles &rvAngles::operator=( const idVec3 &a )
+{
+ pitch = a.x;
+ yaw = a.y;
+ roll = a.z;
+ return( *this );
+}
+
+ID_INLINE rvAngles rvAngles::operator+( const rvAngles &a ) const
+{
+ return( rvAngles( pitch + a.pitch, yaw + a.yaw, roll + a.roll ) );
+}
+
+ID_INLINE rvAngles rvAngles::operator+( const idVec3 &a ) const
+{
+ return( rvAngles( pitch + a.x, yaw + a.y, roll + a.z ) );
+}
+
+ID_INLINE rvAngles& rvAngles::operator+=( const rvAngles &a )
+{
+ pitch += a.pitch;
+ yaw += a.yaw;
+ roll += a.roll;
+ return( *this );
+}
+
+ID_INLINE rvAngles& rvAngles::operator+=( const idVec3 &a )
+{
+ pitch += a.x;
+ yaw += a.y;
+ roll += a.z;
+ return( *this );
+}
+
+ID_INLINE rvAngles rvAngles::operator-( const rvAngles &a ) const
+{
+ return( rvAngles( pitch - a.pitch, yaw - a.yaw, roll - a.roll ) );
+}
+
+ID_INLINE rvAngles rvAngles::operator-( const idVec3 &a ) const
+{
+ return( rvAngles( pitch - a.x, yaw - a.y, roll - a.z ) );
+}
+
+ID_INLINE rvAngles& rvAngles::operator-=( const rvAngles &a )
+{
+ pitch -= a.pitch;
+ yaw -= a.yaw;
+ roll -= a.roll;
+ return( *this );
+}
+
+ID_INLINE rvAngles& rvAngles::operator-=( const idVec3 &a )
+{
+ pitch -= a.x;
+ yaw -= a.y;
+ roll -= a.z;
+ return( *this );
+}
+
+ID_INLINE rvAngles rvAngles::operator*( const float a ) const
+{
+ return( rvAngles( pitch * a, yaw * a, roll * a ) );
+}
+
+ID_INLINE rvAngles& rvAngles::operator*=( float a )
+{
+ pitch *= a;
+ yaw *= a;
+ roll *= a;
+ return( *this );
+}
+
+ID_INLINE rvAngles operator+( const idVec3 &a, const rvAngles &b )
+{
+ return( rvAngles( a.x + b.pitch, a.y + b.yaw, a.z + b.roll ) );
+}
+
+ID_INLINE rvAngles operator-( const idVec3 &a, const rvAngles &b )
+{
+ return( rvAngles( a.x - b.pitch, a.y - b.yaw, a.z - b.roll ) );
+}
+
+ID_INLINE rvAngles operator*( const float a, const rvAngles &b )
+{
+ return( rvAngles( a * b.pitch, a * b.yaw, a * b.roll ) );
+}
+
+ID_INLINE bool rvAngles::Compare( const rvAngles &a ) const
+{
+ return( ( a.pitch == pitch ) && ( a.yaw == yaw ) && ( a.roll == roll ) );
+}
+
+ID_INLINE bool rvAngles::Compare( const rvAngles &a, const float epsilon ) const
+{
+ if( idMath::Fabs( pitch - a.pitch ) > epsilon )
+ {
+ return( false );
+ }
+
+ if( idMath::Fabs( yaw - a.yaw ) > epsilon )
+ {
+ return( false );
+ }
+
+ if( idMath::Fabs( roll - a.roll ) > epsilon )
+ {
+ return( false );
+ }
+
+ return( true );
+}
+
+ID_INLINE bool rvAngles::operator==( const rvAngles &a ) const
+{
+ return( Compare( a ) );
+}
+
+ID_INLINE bool rvAngles::operator!=( const rvAngles &a ) const
+{
+ return( !Compare( a ) );
+}
+
+#endif // _MATH_RADIANS_H_INC_
diff --git a/neo/engine/models/TerrainModel.cpp b/neo/engine/models/TerrainModel.cpp
new file mode 100644
index 00000000..b5d5abd4
--- /dev/null
+++ b/neo/engine/models/TerrainModel.cpp
@@ -0,0 +1,578 @@
+/*
+===========================================================================
+
+Shared terrain source model
+
+===========================================================================
+*/
+
+#include "precompiled.h"
+#pragma hdrstop
+
+#include "TerrainModel.h"
+
+idTerrainPatch::idTerrainPatch() {
+ name.Clear();
+ material.Clear();
+ origin.Zero();
+ width = TERRAIN_DEFAULT_VERTS;
+ height = TERRAIN_DEFAULT_VERTS;
+ cellSize = TERRAIN_DEFAULT_CELL_SIZE;
+ paintWidth = TERRAIN_DEFAULT_PAINT_SIZE;
+ paintHeight = TERRAIN_DEFAULT_PAINT_SIZE;
+ paintTexture = 0;
+ paintTextureDirty = true;
+ paintDirtyMinX = 0;
+ paintDirtyMinY = 0;
+ paintDirtyMaxX = paintWidth - 1;
+ paintDirtyMaxY = paintHeight - 1;
+ bounds.Clear();
+}
+
+int idTerrainPatch::SampleIndex( int x, int y ) const {
+ return y * width + x;
+}
+
+int idTerrainPatch::PaintIndex( int x, int y ) const {
+ return y * paintWidth + x;
+}
+
+float idTerrainPatch::SampleHeight( int x, int y ) const {
+ return heights[SampleIndex( x, y )];
+}
+
+void idTerrainPatch::SetHeight( int x, int y, float height ) {
+ heights[SampleIndex( x, y )] = height;
+}
+
+bool idTerrainPatch::SetHeightBySample( int sample, float height ) {
+ if ( sample < 0 || sample >= heights.Num() ) {
+ return false;
+ }
+ heights[sample] = height;
+ return true;
+}
+
+idVec4 idTerrainPatch::SamplePaintWeight( int x, int y ) const {
+ return paintWeights[PaintIndex( x, y )];
+}
+
+void idTerrainPatch::SetPaintWeight( int x, int y, const idVec4 &weight ) {
+ paintWeights[PaintIndex( x, y )] = NormalizeLayerWeight( weight );
+ MarkPaintTextureDirtyRect( x, y, x, y );
+}
+
+bool idTerrainPatch::SetPaintWeightBySample( int sample, const idVec4 &weight ) {
+ if ( sample < 0 || sample >= paintWeights.Num() || paintWidth <= 0 ) {
+ return false;
+ }
+ paintWeights[sample] = NormalizeLayerWeight( weight );
+ MarkPaintTextureDirtyRect( sample % paintWidth, sample / paintWidth, sample % paintWidth, sample / paintWidth );
+ return true;
+}
+
+idVec4 idTerrainPatch::BaseLayerWeight() {
+ return idVec4( 1.0f, 0.0f, 0.0f, 0.0f );
+}
+
+idVec4 idTerrainPatch::NormalizeLayerWeight( const idVec4 &weight ) {
+ idVec4 normalized;
+ normalized.x = weight.x > 0.0f ? weight.x : 0.0f;
+ normalized.y = weight.y > 0.0f ? weight.y : 0.0f;
+ normalized.z = weight.z > 0.0f ? weight.z : 0.0f;
+ normalized.w = weight.w > 0.0f ? weight.w : 0.0f;
+
+ const float total = normalized.x + normalized.y + normalized.z + normalized.w;
+ if ( total <= 0.0001f ) {
+ return BaseLayerWeight();
+ }
+
+ const float invTotal = 1.0f / total;
+ normalized.x *= invTotal;
+ normalized.y *= invTotal;
+ normalized.z *= invTotal;
+ normalized.w *= invTotal;
+ return normalized;
+}
+
+float idTerrainPatch::WorldWidth() const {
+ return ( width - 1 ) * cellSize;
+}
+
+float idTerrainPatch::WorldHeight() const {
+ return ( height - 1 ) * cellSize;
+}
+
+float idTerrainPatch::BilinearHeight( float u, float v ) const {
+ u = idMath::ClampFloat( 0.0f, 1.0f, u );
+ v = idMath::ClampFloat( 0.0f, 1.0f, v );
+
+ const float fx = u * ( width - 1 );
+ const float fy = v * ( height - 1 );
+ const int x0 = idMath::ClampInt( 0, width - 1, (int)floorf( fx ) );
+ const int y0 = idMath::ClampInt( 0, height - 1, (int)floorf( fy ) );
+ const int x1 = idMath::ClampInt( 0, width - 1, x0 + 1 );
+ const int y1 = idMath::ClampInt( 0, height - 1, y0 + 1 );
+ const float tx = fx - (float)x0;
+ const float ty = fy - (float)y0;
+
+ const float h00 = SampleHeight( x0, y0 );
+ const float h10 = SampleHeight( x1, y0 );
+ const float h01 = SampleHeight( x0, y1 );
+ const float h11 = SampleHeight( x1, y1 );
+ const float h0 = h00 + ( h10 - h00 ) * tx;
+ const float h1 = h01 + ( h11 - h01 ) * tx;
+ return h0 + ( h1 - h0 ) * ty;
+}
+
+idVec3 idTerrainPatch::VertexUV( float u, float v ) const {
+ idVec3 p;
+ p.x = origin.x + WorldWidth() * u;
+ p.y = origin.y + WorldHeight() * v;
+ p.z = origin.z + BilinearHeight( u, v );
+ return p;
+}
+
+idVec3 idTerrainPatch::Vertex( int x, int y ) const {
+ idVec3 v;
+ v.x = origin.x + x * cellSize;
+ v.y = origin.y + y * cellSize;
+ v.z = origin.z + SampleHeight( x, y );
+ return v;
+}
+
+idVec3 idTerrainPatch::VertexNormal( int x, int y ) const {
+ const int x0 = idMath::ClampInt( 0, width - 1, x - 1 );
+ const int x1 = idMath::ClampInt( 0, width - 1, x + 1 );
+ const int y0 = idMath::ClampInt( 0, height - 1, y - 1 );
+ const int y1 = idMath::ClampInt( 0, height - 1, y + 1 );
+ const idVec3 sx = Vertex( x1, y ) - Vertex( x0, y );
+ const idVec3 sy = Vertex( x, y1 ) - Vertex( x, y0 );
+ idVec3 normal = sx.Cross( sy );
+ if ( normal.LengthSqr() <= 0.0001f ) {
+ normal.Set( 0.0f, 0.0f, 1.0f );
+ } else {
+ normal.Normalize();
+ }
+ return normal;
+}
+
+void idTerrainPatch::UpdateBounds() {
+ bounds.Clear();
+ if ( width <= 0 || height <= 0 ) {
+ bounds.AddPoint( origin );
+ return;
+ }
+ for ( int y = 0; y < height; y++ ) {
+ for ( int x = 0; x < width; x++ ) {
+ bounds.AddPoint( Vertex( x, y ) );
+ }
+ }
+}
+
+void idTerrainPatch::EnsureLayerData( const char *defaultMaterial ) {
+ if ( material.IsEmpty() ) {
+ material = defaultMaterial && defaultMaterial[0] ? defaultMaterial : "textures/common/caulk";
+ }
+ if ( layerMaterials[0].IsEmpty() ) {
+ layerMaterials[0] = material;
+ }
+ material = layerMaterials[0];
+
+ if ( width < 2 ) {
+ width = 2;
+ }
+ if ( height < 2 ) {
+ height = 2;
+ }
+ const int heightSampleCount = width * height;
+ const int oldHeightCount = heights.Num();
+ heights.SetNum( heightSampleCount );
+ for ( int i = oldHeightCount; i < heightSampleCount; i++ ) {
+ heights[i] = 0.0f;
+ }
+
+ if ( paintWidth < 2 ) {
+ paintWidth = TERRAIN_DEFAULT_PAINT_SIZE;
+ }
+ if ( paintHeight < 2 ) {
+ paintHeight = TERRAIN_DEFAULT_PAINT_SIZE;
+ }
+
+ const int paintSampleCount = paintWidth * paintHeight;
+ if ( paintSampleCount <= 0 ) {
+ paintWeights.Clear();
+ return;
+ }
+
+ const int oldCount = paintWeights.Num();
+ paintWeights.SetNum( paintSampleCount );
+ if ( oldCount != paintSampleCount ) {
+ MarkPaintTextureDirty();
+ }
+ for ( int i = 0; i < paintSampleCount; i++ ) {
+ if ( i >= oldCount ) {
+ paintWeights[i] = BaseLayerWeight();
+ } else {
+ paintWeights[i] = NormalizeLayerWeight( paintWeights[i] );
+ }
+ }
+ UpdateBounds();
+}
+
+void idTerrainPatch::ClearLayerWeight( int layer ) {
+ if ( layer < 0 || layer >= TERRAIN_MAX_LAYERS ) {
+ return;
+ }
+ for ( int i = 0; i < paintWeights.Num(); i++ ) {
+ idVec4 weight = paintWeights[i];
+ weight[layer] = 0.0f;
+ paintWeights[i] = NormalizeLayerWeight( weight );
+ }
+ MarkPaintTextureDirty();
+}
+
+bool idTerrainPatch::SetLayerMaterials( const idStr newLayerMaterials[TERRAIN_MAX_LAYERS], const char *defaultMaterial ) {
+ bool changed = false;
+ for ( int layer = 0; layer < TERRAIN_MAX_LAYERS; layer++ ) {
+ idStr materialName = newLayerMaterials[layer];
+ materialName.StripLeading( ' ' );
+ materialName.StripTrailing( ' ' );
+ if ( layer == 0 && materialName.IsEmpty() ) {
+ materialName = defaultMaterial && defaultMaterial[0] ? defaultMaterial : "textures/common/caulk";
+ }
+ if ( layerMaterials[layer].Icmp( materialName.c_str() ) == 0 ) {
+ continue;
+ }
+ layerMaterials[layer] = materialName;
+ if ( layer > 0 && materialName.IsEmpty() ) {
+ ClearLayerWeight( layer );
+ }
+ changed = true;
+ }
+ material = layerMaterials[0];
+ return changed;
+}
+
+void idTerrainPatch::MarkPaintTextureDirty() {
+ paintTextureDirty = true;
+ paintDirtyMinX = 0;
+ paintDirtyMinY = 0;
+ paintDirtyMaxX = paintWidth > 0 ? paintWidth - 1 : 0;
+ paintDirtyMaxY = paintHeight > 0 ? paintHeight - 1 : 0;
+}
+
+void idTerrainPatch::ClearPaintTextureDirtyRect() {
+ paintTextureDirty = false;
+ paintDirtyMinX = paintWidth;
+ paintDirtyMinY = paintHeight;
+ paintDirtyMaxX = -1;
+ paintDirtyMaxY = -1;
+}
+
+void idTerrainPatch::MarkPaintTextureDirtyRect( int minX, int minY, int maxX, int maxY ) {
+ if ( paintWidth <= 0 || paintHeight <= 0 ) {
+ return;
+ }
+
+ minX = idMath::ClampInt( 0, paintWidth - 1, minX );
+ maxX = idMath::ClampInt( 0, paintWidth - 1, maxX );
+ minY = idMath::ClampInt( 0, paintHeight - 1, minY );
+ maxY = idMath::ClampInt( 0, paintHeight - 1, maxY );
+ if ( maxX < minX || maxY < minY ) {
+ return;
+ }
+
+ if ( !paintTextureDirty || paintDirtyMaxX < paintDirtyMinX || paintDirtyMaxY < paintDirtyMinY ) {
+ paintDirtyMinX = minX;
+ paintDirtyMinY = minY;
+ paintDirtyMaxX = maxX;
+ paintDirtyMaxY = maxY;
+ } else {
+ if ( minX < paintDirtyMinX ) {
+ paintDirtyMinX = minX;
+ }
+ if ( minY < paintDirtyMinY ) {
+ paintDirtyMinY = minY;
+ }
+ if ( maxX > paintDirtyMaxX ) {
+ paintDirtyMaxX = maxX;
+ }
+ if ( maxY > paintDirtyMaxY ) {
+ paintDirtyMaxY = maxY;
+ }
+ }
+ paintTextureDirty = true;
+}
+
+idTerrainModel::idTerrainModel() {
+}
+
+idTerrainModel::~idTerrainModel() {
+ Clear();
+}
+
+void idTerrainModel::Clear() {
+ terrains.DeleteContents( true );
+}
+
+int idTerrainModel::NumTerrains() const {
+ return terrains.Num();
+}
+
+idTerrainPatch *idTerrainModel::Terrain( int index ) {
+ if ( index < 0 || index >= terrains.Num() ) {
+ return NULL;
+ }
+ return terrains[index];
+}
+
+const idTerrainPatch *idTerrainModel::Terrain( int index ) const {
+ if ( index < 0 || index >= terrains.Num() ) {
+ return NULL;
+ }
+ return terrains[index];
+}
+
+idList &idTerrainModel::Terrains() {
+ return terrains;
+}
+
+const idList &idTerrainModel::Terrains() const {
+ return terrains;
+}
+
+static float TerrainModel_SnapToGrid( float value, float gridSize ) {
+ if ( gridSize <= 0.0f ) {
+ gridSize = 1.0f;
+ }
+ return floorf( value / gridSize + ( value >= 0.0f ? 0.5f : -0.5f ) ) * gridSize;
+}
+
+idTerrainPatch *idTerrainModel::AllocDefaultTerrain( const idVec3 ¢er, const char *defaultMaterial, float gridSize ) {
+ idTerrainPatch *terrain = new idTerrainPatch;
+ terrain->name = va( "terrain_%i", terrains.Num() + 1 );
+ terrain->material = defaultMaterial && defaultMaterial[0] ? defaultMaterial : "textures/common/caulk";
+ terrain->layerMaterials[0] = terrain->material;
+ const float worldSize = ( terrain->width - 1 ) * terrain->cellSize;
+ terrain->origin.x = TerrainModel_SnapToGrid( center.x - worldSize * 0.5f, gridSize );
+ terrain->origin.y = TerrainModel_SnapToGrid( center.y - worldSize * 0.5f, gridSize );
+ terrain->origin.z = TerrainModel_SnapToGrid( center.z, gridSize );
+ terrain->heights.SetNum( terrain->width * terrain->height );
+ for ( int i = 0; i < terrain->heights.Num(); i++ ) {
+ terrain->heights[i] = 0.0f;
+ }
+ terrain->EnsureLayerData( defaultMaterial );
+ return terrain;
+}
+
+void idTerrainModel::AddTerrain( idTerrainPatch *terrain ) {
+ if ( terrain ) {
+ terrains.Append( terrain );
+ }
+}
+
+idStr idTerrainModel::FileNameForMap( const char *mapFileName ) {
+ idStr fileName = mapFileName ? mapFileName : "";
+ fileName.StripFileExtension();
+ fileName.SetFileExtension( ".terrain" );
+ return fileName;
+}
+
+bool idTerrainModel::SaveFile( const char *filename ) {
+ if ( !filename || !filename[0] ) {
+ return false;
+ }
+
+ const bool osPath = strstr( filename, ":" ) != NULL;
+ idFile *file = osPath ? fileSystem->OpenExplicitFileWrite( filename ) : fileSystem->OpenFileWrite( filename );
+ if ( !file ) {
+ common->Warning( "idTerrainModel::SaveFile: couldn't write %s", filename );
+ return false;
+ }
+
+ file->WriteFloatString( "terrainAuthoring 3 {\n" );
+ for ( int i = 0; i < terrains.Num(); i++ ) {
+ idTerrainPatch *terrain = terrains[i];
+ if ( !terrain ) {
+ continue;
+ }
+ terrain->EnsureLayerData( "textures/common/caulk" );
+
+ file->WriteFloatString( "\tterrain {\n" );
+ file->WriteFloatString( "\t\tname \"%s\"\n", terrain->name.c_str() );
+ file->WriteFloatString( "\t\tmaterial \"%s\"\n", terrain->material.c_str() );
+ for ( int layer = 0; layer < TERRAIN_MAX_LAYERS; layer++ ) {
+ if ( layer == 0 || !terrain->layerMaterials[layer].IsEmpty() ) {
+ file->WriteFloatString( "\t\tlayer %i \"%s\"\n", layer, terrain->layerMaterials[layer].c_str() );
+ }
+ }
+ file->WriteFloatString( "\t\torigin ( %f %f %f )\n", terrain->origin.x, terrain->origin.y, terrain->origin.z );
+ file->WriteFloatString( "\t\tsize %i %i\n", terrain->width, terrain->height );
+ file->WriteFloatString( "\t\tcellSize %f\n", terrain->cellSize );
+ file->WriteFloatString( "\t\tpaintSize %i %i\n", terrain->paintWidth, terrain->paintHeight );
+ file->WriteFloatString( "\t\theights {\n" );
+ for ( int y = 0; y < terrain->height; y++ ) {
+ file->WriteFloatString( "\t\t\t" );
+ for ( int x = 0; x < terrain->width; x++ ) {
+ file->WriteFloatString( "%f ", terrain->SampleHeight( x, y ) );
+ }
+ file->WriteFloatString( "\n" );
+ }
+ file->WriteFloatString( "\t\t}\n" );
+ file->WriteFloatString( "\t\tpaintWeights {\n" );
+ for ( int y = 0; y < terrain->paintHeight; y++ ) {
+ file->WriteFloatString( "\t\t\t" );
+ for ( int x = 0; x < terrain->paintWidth; x++ ) {
+ const idVec4 weights = terrain->SamplePaintWeight( x, y );
+ file->WriteFloatString( "%f %f %f %f ", weights.x, weights.y, weights.z, weights.w );
+ }
+ file->WriteFloatString( "\n" );
+ }
+ file->WriteFloatString( "\t\t}\n" );
+ file->WriteFloatString( "\t}\n" );
+ }
+ file->WriteFloatString( "}\n" );
+ fileSystem->CloseFile( file );
+ return true;
+}
+
+bool idTerrainModel::LoadFile( const char *filename, const char *defaultMaterial ) {
+ Clear();
+ if ( !filename || !filename[0] ) {
+ return false;
+ }
+
+ const char *fallbackMaterial = defaultMaterial && defaultMaterial[0] ? defaultMaterial : "textures/common/caulk";
+ const bool osPath = strstr( filename, ":" ) != NULL;
+ idLexer src( LEXFL_NOSTRINGCONCAT | LEXFL_NODOLLARPRECOMPILE | LEXFL_ALLOWPATHNAMES );
+ src.LoadFile( filename, osPath );
+ if ( !src.IsLoaded() ) {
+ return false;
+ }
+
+ idToken token;
+ if ( !src.ReadToken( &token ) || token.Icmp( "terrainAuthoring" ) ) {
+ return false;
+ }
+ src.ReadToken( &token );
+ if ( token != "{" ) {
+ src.ExpectTokenString( "{" );
+ }
+
+ while ( src.ReadToken( &token ) ) {
+ if ( token == "}" ) {
+ break;
+ }
+ if ( token.Icmp( "terrain" ) ) {
+ break;
+ }
+
+ idTerrainPatch *terrain = new idTerrainPatch;
+ terrain->name = va( "terrain_%i", terrains.Num() + 1 );
+ terrain->material = fallbackMaterial;
+ terrain->layerMaterials[0] = terrain->material;
+ terrain->MarkPaintTextureDirty();
+
+ src.ExpectTokenString( "{" );
+ while ( src.ReadToken( &token ) ) {
+ if ( token == "}" ) {
+ break;
+ }
+ if ( !token.Icmp( "name" ) ) {
+ src.ExpectAnyToken( &token );
+ terrain->name = token;
+ } else if ( !token.Icmp( "material" ) ) {
+ src.ExpectAnyToken( &token );
+ terrain->material = token;
+ terrain->layerMaterials[0] = token;
+ } else if ( !token.Icmp( "layer" ) ) {
+ const int layer = src.ParseInt();
+ src.ExpectAnyToken( &token );
+ if ( layer >= 0 && layer < TERRAIN_MAX_LAYERS ) {
+ terrain->layerMaterials[layer] = token;
+ if ( layer == 0 ) {
+ terrain->material = token;
+ }
+ }
+ } else if ( !token.Icmp( "origin" ) ) {
+ src.Parse1DMatrix( 3, terrain->origin.ToFloatPtr() );
+ } else if ( !token.Icmp( "size" ) ) {
+ terrain->width = src.ParseInt();
+ terrain->height = src.ParseInt();
+ if ( terrain->width < 2 ) {
+ terrain->width = 2;
+ }
+ if ( terrain->height < 2 ) {
+ terrain->height = 2;
+ }
+ } else if ( !token.Icmp( "cellSize" ) ) {
+ terrain->cellSize = src.ParseFloat();
+ if ( terrain->cellSize <= 0.0f ) {
+ terrain->cellSize = TERRAIN_DEFAULT_CELL_SIZE;
+ }
+ } else if ( !token.Icmp( "paintSize" ) ) {
+ terrain->paintWidth = src.ParseInt();
+ terrain->paintHeight = src.ParseInt();
+ if ( terrain->paintWidth < 2 ) {
+ terrain->paintWidth = 2;
+ }
+ if ( terrain->paintHeight < 2 ) {
+ terrain->paintHeight = 2;
+ }
+ } else if ( !token.Icmp( "heights" ) ) {
+ src.ExpectTokenString( "{" );
+ terrain->heights.SetNum( terrain->width * terrain->height );
+ for ( int i = 0; i < terrain->heights.Num(); i++ ) {
+ terrain->heights[i] = 0.0f;
+ }
+ int sample = 0;
+ while ( src.ReadToken( &token ) ) {
+ if ( token == "}" ) {
+ break;
+ }
+ if ( sample < terrain->heights.Num() ) {
+ terrain->heights[sample++] = (float)atof( token.c_str() );
+ }
+ }
+ } else if ( !token.Icmp( "weights" ) || !token.Icmp( "paintWeights" ) ) {
+ const bool legacyWeights = !token.Icmp( "weights" );
+ src.ExpectTokenString( "{" );
+ if ( legacyWeights && terrain->paintWidth == TERRAIN_DEFAULT_PAINT_SIZE && terrain->paintHeight == TERRAIN_DEFAULT_PAINT_SIZE ) {
+ terrain->paintWidth = terrain->width;
+ terrain->paintHeight = terrain->height;
+ }
+ terrain->paintWeights.SetNum( terrain->paintWidth * terrain->paintHeight );
+ for ( int i = 0; i < terrain->paintWeights.Num(); i++ ) {
+ terrain->paintWeights[i] = idTerrainPatch::BaseLayerWeight();
+ }
+
+ int sample = 0;
+ int component = 0;
+ idVec4 weight;
+ weight.Zero();
+ while ( src.ReadToken( &token ) ) {
+ if ( token == "}" ) {
+ break;
+ }
+ weight[component++] = (float)atof( token.c_str() );
+ if ( component == 4 ) {
+ if ( sample < terrain->paintWeights.Num() ) {
+ terrain->paintWeights[sample] = idTerrainPatch::NormalizeLayerWeight( weight );
+ }
+ sample++;
+ component = 0;
+ weight.Zero();
+ }
+ }
+ }
+ }
+
+ terrain->EnsureLayerData( fallbackMaterial );
+ terrain->MarkPaintTextureDirty();
+ terrain->UpdateBounds();
+ terrains.Append( terrain );
+ }
+
+ return true;
+}
diff --git a/neo/engine/models/TerrainModel.h b/neo/engine/models/TerrainModel.h
new file mode 100644
index 00000000..120d669c
--- /dev/null
+++ b/neo/engine/models/TerrainModel.h
@@ -0,0 +1,93 @@
+/*
+===========================================================================
+
+Shared terrain source model
+
+===========================================================================
+*/
+#ifndef __MODEL_TERRAIN_H__
+#define __MODEL_TERRAIN_H__
+
+#define TERRAIN_DEFAULT_VERTS 65
+#define TERRAIN_DEFAULT_CELL_SIZE 512.0f
+#define TERRAIN_DEFAULT_PAINT_SIZE 257
+#define TERRAIN_MAX_LAYERS 4
+
+class idTerrainPatch {
+public:
+ idTerrainPatch();
+
+ idStr name;
+ idStr material;
+ idStr layerMaterials[TERRAIN_MAX_LAYERS];
+ idVec3 origin;
+ int width;
+ int height;
+ float cellSize;
+ idList heights;
+ int paintWidth;
+ int paintHeight;
+ idList paintWeights;
+
+ // Editor preview cache state. Runtime code ignores this, but keeping it on the
+ // source object lets Radiant edit the exact model data that gets parsed/written.
+ unsigned int paintTexture;
+ bool paintTextureDirty;
+ int paintDirtyMinX;
+ int paintDirtyMinY;
+ int paintDirtyMaxX;
+ int paintDirtyMaxY;
+
+ idBounds bounds;
+
+ int SampleIndex( int x, int y ) const;
+ int PaintIndex( int x, int y ) const;
+ float SampleHeight( int x, int y ) const;
+ void SetHeight( int x, int y, float height );
+ bool SetHeightBySample( int sample, float height );
+ idVec4 SamplePaintWeight( int x, int y ) const;
+ void SetPaintWeight( int x, int y, const idVec4 &weight );
+ bool SetPaintWeightBySample( int sample, const idVec4 &weight );
+ float WorldWidth() const;
+ float WorldHeight() const;
+ float BilinearHeight( float u, float v ) const;
+ idVec3 VertexUV( float u, float v ) const;
+ idVec3 Vertex( int x, int y ) const;
+ idVec3 VertexNormal( int x, int y ) const;
+ void UpdateBounds();
+ void EnsureLayerData( const char *defaultMaterial );
+ void ClearLayerWeight( int layer );
+ bool SetLayerMaterials( const idStr layerMaterials[TERRAIN_MAX_LAYERS], const char *defaultMaterial );
+ void MarkPaintTextureDirty();
+ void ClearPaintTextureDirtyRect();
+ void MarkPaintTextureDirtyRect( int minX, int minY, int maxX, int maxY );
+
+ static idVec4 BaseLayerWeight();
+ static idVec4 NormalizeLayerWeight( const idVec4 &weight );
+};
+
+class idTerrainModel {
+public:
+ idTerrainModel();
+ ~idTerrainModel();
+
+ void Clear();
+ int NumTerrains() const;
+ idTerrainPatch * Terrain( int index );
+ const idTerrainPatch * Terrain( int index ) const;
+ idList &Terrains();
+ const idList &Terrains() const;
+
+ idTerrainPatch * AllocDefaultTerrain( const idVec3 ¢er, const char *defaultMaterial, float gridSize );
+ void AddTerrain( idTerrainPatch *terrain );
+
+ bool LoadFile( const char *filename, const char *defaultMaterial );
+ bool SaveFile( const char *filename );
+
+ static idStr FileNameForMap( const char *mapFileName );
+
+private:
+ idList terrains;
+};
+
+#endif
diff --git a/neo/engine/opengl/gl_d3d12shim.cpp b/neo/engine/opengl/gl_d3d12shim.cpp
index 14d6b3bb..eaae25c9 100644
--- a/neo/engine/opengl/gl_d3d12shim.cpp
+++ b/neo/engine/opengl/gl_d3d12shim.cpp
@@ -204,6 +204,9 @@ using Microsoft::WRL::ComPtr;
#ifndef GL_QD3D12_FRAME_GENERATION
#define GL_QD3D12_FRAME_GENERATION 0x600E
#endif
+#ifndef GL_QD3D12_TERRAIN_BLEND
+#define GL_QD3D12_TERRAIN_BLEND 0x600F
+#endif
#ifndef GL_QD3D12_TAA
#define GL_QD3D12_TAA GL_QD3D12_TAA_ENABLED
#endif
@@ -290,6 +293,12 @@ void APIENTRY glBindSpecularMapTexture(GLuint texture);
void APIENTRY glSpecularMapTexture(GLuint texture);
void APIENTRY glSpecularMapStrengthf(GLfloat strength);
void APIENTRY glTextureAverageColorQD3D12(GLuint texture, GLfloat r, GLfloat g, GLfloat b, GLfloat a);
+void APIENTRY glTerrainBlendEnableQD3D12(GLboolean enable);
+void APIENTRY glEnableTerrainBlendQD3D12(GLboolean enable);
+void APIENTRY glTerrainLayerTextureQD3D12(GLuint layer, GLuint texture);
+void APIENTRY glTerrainLayerNormalTextureQD3D12(GLuint layer, GLuint texture);
+void APIENTRY glTerrainWeightTextureQD3D12(GLuint texture);
+void APIENTRY glTerrainBlendOpacityQD3D12(GLfloat opacity);
void APIENTRY glRaytracingMaterialFlagsQD3D12(GLuint flags);
void APIENTRY glRaytracingMaterialFlagQD3D12(GLuint flag, GLboolean enable);
@@ -533,7 +542,7 @@ static const UINT QD3D12_MaxQueries = 2048;
// SECTION 3: D3D12 renderer structs
// ============================================================
-static const UINT QD3D12_MaxTextureUnits = 8;
+static const UINT QD3D12_MaxTextureUnits = 11;
static const UINT QD3D12_FrameCount = 2;
static const UINT QD3D12_MaxTextures = 4096;
static const UINT QD3D12_UploadBufferSize = 128 * 1024 * 1024;
@@ -841,7 +850,7 @@ struct GLBufferObject
const char* vendor = "Justin Marshall";
const char* renderer = "Quake D3D12 Wrapper";
const char* version = "1.1-quake-d3d12";
-const char* extensions = "GL_SGIS_multitexture GL_ARB_multitexture GL_EXT_texture_env_add GL_ARB_texture_env_combine GL_ARB_texture_compression GL_EXT_texture_compression_s3tc GL_ARB_vertex_program GL_ARB_fragment_program GL_EXT_texture_cube_map GL_EXT_depth_bounds_test GL_EXT_stencil_two_side GL_ATI_separate_stencil GL_QD3D12_normal_map GL_QD3D12_glow_map GL_QD3D12_specular_map GL_QD3D12_glass_material GL_QD3D12_volumetric_light GL_QD3D12_dlaa GL_QD3D12_taa GL_QD3D12_tonemap_brightness GL_QD3D12_neural_pom";
+const char* extensions = "GL_SGIS_multitexture GL_ARB_multitexture GL_EXT_texture_env_add GL_ARB_texture_env_combine GL_ARB_texture_compression GL_EXT_texture_compression_s3tc GL_ARB_vertex_program GL_ARB_fragment_program GL_EXT_texture_cube_map GL_EXT_depth_bounds_test GL_EXT_stencil_two_side GL_ATI_separate_stencil GL_QD3D12_normal_map GL_QD3D12_glow_map GL_QD3D12_specular_map GL_QD3D12_terrain_blend GL_QD3D12_glass_material GL_QD3D12_volumetric_light GL_QD3D12_dlaa GL_QD3D12_taa GL_QD3D12_tonemap_brightness GL_QD3D12_neural_pom";
enum TexEnvModeShader
{
@@ -885,6 +894,13 @@ struct BatchKey
UINT tex0SrvIndex = 0;
UINT tex1SrvIndex = 0;
UINT textureSrvIndex[QD3D12_MaxTextureUnits] = {};
+ UINT terrainLayerSrvIndex[4] = {};
+ UINT terrainLayerNormalSrvIndex[4] = {};
+ float terrainLayerNormalMask[4] = {};
+ UINT terrainWeightSrvIndex = 0;
+ float useTerrainBlend = 0.0f;
+ float useTerrainWeightTexture = 0.0f;
+ float terrainBlendOpacity = 1.0f;
UINT normalMapSrvIndex = 0;
float useNormalMap = 0.0f;
float normalMapStrength = 1.0f;
@@ -1039,6 +1055,13 @@ static uint64_t QD3D12_HashBatchKey(const BatchKey& key)
QD3D12_MixHash(h, key.tex0SrvIndex);
QD3D12_MixHash(h, key.tex1SrvIndex);
QD3D12_MixHashBytes(h, key.textureSrvIndex, sizeof(key.textureSrvIndex));
+ QD3D12_MixHashBytes(h, key.terrainLayerSrvIndex, sizeof(key.terrainLayerSrvIndex));
+ QD3D12_MixHashBytes(h, key.terrainLayerNormalSrvIndex, sizeof(key.terrainLayerNormalSrvIndex));
+ QD3D12_MixHashBytes(h, key.terrainLayerNormalMask, sizeof(key.terrainLayerNormalMask));
+ QD3D12_MixHash(h, key.terrainWeightSrvIndex);
+ QD3D12_MixHashFloat(h, key.useTerrainBlend);
+ QD3D12_MixHashFloat(h, key.useTerrainWeightTexture);
+ QD3D12_MixHashFloat(h, key.terrainBlendOpacity);
QD3D12_MixHash(h, key.normalMapSrvIndex);
QD3D12_MixHashFloat(h, key.useNormalMap);
QD3D12_MixHashFloat(h, key.normalMapStrength);
@@ -1167,6 +1190,13 @@ static bool BatchKeyDeepEquals(const BatchKey& a, const BatchKey& b)
memcmp(a.currentColor, b.currentColor, sizeof(a.currentColor)) == 0 &&
a.useVertexColor == b.useVertexColor &&
a.colorWriteMask == b.colorWriteMask &&
+ memcmp(a.terrainLayerSrvIndex, b.terrainLayerSrvIndex, sizeof(a.terrainLayerSrvIndex)) == 0 &&
+ memcmp(a.terrainLayerNormalSrvIndex, b.terrainLayerNormalSrvIndex, sizeof(a.terrainLayerNormalSrvIndex)) == 0 &&
+ memcmp(a.terrainLayerNormalMask, b.terrainLayerNormalMask, sizeof(a.terrainLayerNormalMask)) == 0 &&
+ a.terrainWeightSrvIndex == b.terrainWeightSrvIndex &&
+ a.useTerrainBlend == b.useTerrainBlend &&
+ a.useTerrainWeightTexture == b.useTerrainWeightTexture &&
+ a.terrainBlendOpacity == b.terrainBlendOpacity &&
a.cullFaceEnabled == b.cullFaceEnabled &&
a.cullMode == b.cullMode &&
a.frontFace == b.frontFace &&
@@ -1749,6 +1779,11 @@ struct GLState
float currentGlowMapStrength = 1.0f;
GLuint currentSpecularMapTexture = 0;
float currentSpecularMapStrength = 1.0f;
+ bool terrainBlendEnabled = false;
+ GLuint terrainLayerTextures[4] = {};
+ GLuint terrainLayerNormalTextures[4] = {};
+ GLuint terrainWeightTexture = 0;
+ float terrainBlendOpacity = 1.0f;
ImmediateVertexBuffer immediateVerts;
BatchKey cachedImmediateBatchKey{};
uint64_t cachedImmediateBatchStamp = 0;
@@ -3078,6 +3113,10 @@ cbuffer DrawCB : register(b0)
#define gUseNeuralPOM gNeuralPomPad.x
#define gNeuralPOMDebug gNeuralPomPad.y
#define gUseVertexColor gVertexColorPad.x
+#define gUseTerrainBlend gVertexColorPad.y
+#define gTerrainBlendOpacity gVertexColorPad.z
+#define gUseTerrainWeightTexture gVertexColorPad.w
+#define gTerrainNormalMask gCurrentColor
// Runtime Neural POM relief controls. x/y keep the existing enable/debug ABI;
// z deepens the learned UV ray offset and w deepens the learned normal slope.
// The CPU fills these from glNormalMapStrengthf() so existing material calls
@@ -3114,6 +3153,10 @@ Texture2D gGlowMap : register(t3);
Texture2D gSpecularMap : register(t4);
ByteAddressBuffer gNeuralPomWeights : register(t5);
ByteAddressBuffer gNeuralPomLatent : register(t6);
+Texture2D gTerrainNormal0 : register(t7);
+Texture2D gTerrainNormal1 : register(t8);
+Texture2D gTerrainNormal2 : register(t9);
+Texture2D gTerrainNormal3 : register(t10);
SamplerState gSamp0 : register(s0);
SamplerState gSamp1 : register(s1);
SamplerState gSamp2 : register(s2);
@@ -4122,8 +4165,13 @@ QD3D12MaterialEval QD3D12_BuildMaterialEval(VSOut i)
return m;
}
+float4 BuildTerrainColor(VSOut i);
+
float4 BuildTexturedColorCached(VSOut i, QD3D12MaterialEval m)
{
+ if (gUseTerrainBlend > 0.5)
+ return BuildTerrainColor(i);
+
float4 primary = i.col;
float4 outColor = primary;
@@ -4187,8 +4235,80 @@ float4 BuildGlowEmission(VSOut i)
}
)HLSL"
R"HLSL(
+float4 QD3D12_NormalizeTerrainWeights(float4 weights)
+{
+ weights = max(weights, 0.0);
+ float sum = weights.x + weights.y + weights.z + weights.w;
+ if (sum <= 0.0001)
+ return float4(1.0, 0.0, 0.0, 0.0);
+ return weights / sum;
+}
+
+float4 QD3D12_GetTerrainWeights(VSOut i)
+{
+ float4 weights = (gUseTerrainWeightTexture > 0.5)
+ ? gSpecularMap.Sample(gSamp4, i.uv1)
+ : i.col;
+ return QD3D12_NormalizeTerrainWeights(weights);
+}
+
+float4 BuildTerrainColor(VSOut i)
+{
+ float4 weights = QD3D12_GetTerrainWeights(i);
+ float4 layer0 = gTex0.Sample(gSamp0, i.uv0);
+ float4 layer1 = gTex1.Sample(gSamp1, i.uv0);
+ float4 layer2 = gNormalMap.Sample(gSamp2, i.uv0);
+ float4 layer3 = gGlowMap.Sample(gSamp3, i.uv0);
+
+ float4 color =
+ layer0 * weights.x +
+ layer1 * weights.y +
+ layer2 * weights.z +
+ layer3 * weights.w;
+
+ color.a *= saturate(gTerrainBlendOpacity);
+ return ApplyFog(color, i.fogCoord);
+}
+
+float3 QD3D12_BuildTerrainGBufferNormal(VSOut i)
+{
+ float4 weights = QD3D12_GetTerrainWeights(i);
+ float3 baseNormal = QD3D12_SafeNormalize(i.normal, float3(0.0, 0.0, 1.0));
+ float3 tangent, binormal;
+ QD3D12_BuildPixelTBN(i, baseNormal, tangent, binormal);
+
+ float3 n0 = (gTerrainNormalMask.x > 0.5)
+ ? QD3D12_DecodeTangentSpaceNormal(gTerrainNormal0.Sample(gSamp2, i.uv0).xyz)
+ : float3(0.0, 0.0, 1.0);
+ float3 n1 = (gTerrainNormalMask.y > 0.5)
+ ? QD3D12_DecodeTangentSpaceNormal(gTerrainNormal1.Sample(gSamp2, i.uv0).xyz)
+ : float3(0.0, 0.0, 1.0);
+ float3 n2 = (gTerrainNormalMask.z > 0.5)
+ ? QD3D12_DecodeTangentSpaceNormal(gTerrainNormal2.Sample(gSamp2, i.uv0).xyz)
+ : float3(0.0, 0.0, 1.0);
+ float3 n3 = (gTerrainNormalMask.w > 0.5)
+ ? QD3D12_DecodeTangentSpaceNormal(gTerrainNormal3.Sample(gSamp2, i.uv0).xyz)
+ : float3(0.0, 0.0, 1.0);
+
+ float3 tangentNormal = QD3D12_SafeNormalize(
+ n0 * weights.x +
+ n1 * weights.y +
+ n2 * weights.z +
+ n3 * weights.w,
+ float3(0.0, 0.0, 1.0));
+
+ return QD3D12_SafeNormalize(
+ tangentNormal.x * tangent +
+ tangentNormal.y * binormal +
+ tangentNormal.z * baseNormal,
+ baseNormal);
+}
+
float4 BuildSpecularAlbedoCached(VSOut i, QD3D12MaterialEval m)
{
+ if (gUseTerrainBlend > 0.5)
+ return float4(0.0, 0.0, 0.0, 0.0);
+
if (gUseSpecularMap > 0.0)
{
float2 specUv = m.uv0;
@@ -4228,6 +4348,9 @@ float3 BuildGBufferNormalCached(VSOut i, QD3D12MaterialEval m)
{
float3 n = QD3D12_SafeNormalize(i.normal, float3(0.0, 0.0, 1.0));
+ if (gUseTerrainBlend > 0.5)
+ return QD3D12_BuildTerrainGBufferNormal(i);
+
if (gUseNormalMap < 0.5 && (gUseNeuralPOM < 0.5 || m.neural.active <= 0.5))
return n;
@@ -6062,6 +6185,11 @@ static BatchKey BuildCurrentBatchKey(GLenum originalMode, const TextureResource*
key.tex1SrvIndex = (useTex1 && tex1 && tex1->srvIndex != UINT_MAX) ? tex1->srvIndex : g_gl.whiteTexture.srvIndex;
for (UINT i = 0; i < QD3D12_MaxTextureUnits; ++i)
key.textureSrvIndex[i] = (allTextures && allTextures[i]) ? allTextures[i]->srvIndex : 0;
+ for (UINT layer = 0; layer < 4; ++layer)
+ {
+ key.terrainLayerNormalSrvIndex[layer] = g_gl.whiteTexture.srvIndex;
+ key.terrainLayerNormalMask[layer] = 0.0f;
+ }
TextureResource* normalMap = selectedMapsValid ? selectedNormalMap : QD3D12_SelectNormalMapTexture(allTextures);
if (normalMap && normalMap->texture && normalMap->srvIndex != UINT_MAX && normalMap->gpuValid)
@@ -6144,7 +6272,53 @@ static BatchKey BuildCurrentBatchKey(GLenum originalMode, const TextureResource*
key.useNeuralPOM = 0.0f;
}
- key.useARBPrograms = QD3D12ARB_IsActive();
+ if (g_gl.terrainBlendEnabled)
+ {
+ key.useTerrainBlend = 1.0f;
+ key.terrainBlendOpacity = ClampValue(g_gl.terrainBlendOpacity, 0.0f, 1.0f);
+ for (UINT layer = 0; layer < 4; ++layer)
+ {
+ TextureResource* terrainTex = QD3D12_FindTextureResource(g_gl.terrainLayerTextures[layer]);
+ if (terrainTex && terrainTex->texture && terrainTex->srvIndex != UINT_MAX && terrainTex->gpuValid)
+ key.terrainLayerSrvIndex[layer] = terrainTex->srvIndex;
+ else
+ key.terrainLayerSrvIndex[layer] = g_gl.whiteTexture.srvIndex;
+
+ TextureResource* terrainNormalTex = QD3D12_FindTextureResource(g_gl.terrainLayerNormalTextures[layer]);
+ if (terrainNormalTex && terrainNormalTex->texture && terrainNormalTex->srvIndex != UINT_MAX && terrainNormalTex->gpuValid)
+ {
+ key.terrainLayerNormalSrvIndex[layer] = terrainNormalTex->srvIndex;
+ key.terrainLayerNormalMask[layer] = 1.0f;
+ }
+ }
+
+ TextureResource* terrainWeightTex = QD3D12_FindTextureResource(g_gl.terrainWeightTexture);
+ if (terrainWeightTex && terrainWeightTex->texture && terrainWeightTex->srvIndex != UINT_MAX && terrainWeightTex->gpuValid)
+ {
+ key.terrainWeightSrvIndex = terrainWeightTex->srvIndex;
+ key.useTerrainWeightTexture = 1.0f;
+ }
+ else
+ {
+ key.terrainWeightSrvIndex = g_gl.whiteTexture.srvIndex;
+ key.useTerrainWeightTexture = 0.0f;
+ }
+
+ key.tex0SrvIndex = key.terrainLayerSrvIndex[0];
+ key.tex1SrvIndex = key.terrainLayerSrvIndex[1];
+ key.normalMapSrvIndex = key.terrainLayerSrvIndex[2];
+ key.glowMapSrvIndex = key.terrainLayerSrvIndex[3];
+ key.specularMapSrvIndex = key.terrainWeightSrvIndex;
+ key.useNormalMap = 0.0f;
+ key.useGlowMap = 0.0f;
+ key.useSpecularMap = 0.0f;
+ key.useNeuralPOM = 0.0f;
+ key.useTessellation = false;
+ key.useVertexColor = 1.0f;
+ key.pipeline = PickPipeline(true, false);
+ }
+
+ key.useARBPrograms = !g_gl.terrainBlendEnabled && QD3D12ARB_IsActive();
if (key.useARBPrograms)
{
key.arbVertexProgram = QD3D12ARB_GetBoundVertexProgram();
@@ -6191,6 +6365,14 @@ static BatchKey BuildCurrentBatchKey(GLenum originalMode, const TextureResource*
key.currentColor[2] = g_gl.curColor[2];
key.currentColor[3] = g_gl.curColor[3];
key.useVertexColor = g_gl.colorArray.enabled ? 1.0f : 0.0f;
+ if (key.useTerrainBlend > 0.5f)
+ {
+ key.useTex0 = 1.0f;
+ key.useTex1 = 0.0f;
+ key.tex1IsLightmap = 0.0f;
+ key.useVertexColor = 1.0f;
+ key.pipeline = PickPipeline(true, false);
+ }
QD3D12_FillTexCombineKey(key, 0);
QD3D12_FillTexCombineKey(key, 1);
key.colorWriteMask = QD3D12_CurrentColorWriteMask();
@@ -6238,6 +6420,8 @@ static BatchKey BuildCurrentBatchKey(GLenum originalMode, const TextureResource*
key.useTessellation = QD3D12_ShouldEnableNormalMapTessellation(originalMode, key);
if (key.useNeuralPOM > 0.5f)
key.useTessellation = false;
+ if (key.useTerrainBlend > 0.5f)
+ key.useTessellation = false;
if (key.useARBPrograms)
key.useTessellation = false;
g_gl.currObjectMVPs[key.motionObjectId] = key.mvp;
@@ -6381,6 +6565,17 @@ static uint64_t QD3D12_CurrentImmediateBatchStateStamp(
QD3D12_MixHashFloat(h, g_gl.currentGlowMapStrength);
QD3D12_MixHash(h, g_gl.currentSpecularMapTexture);
QD3D12_MixHashFloat(h, g_gl.currentSpecularMapStrength);
+ QD3D12_MixHash(h, g_gl.terrainBlendEnabled ? 1ull : 0ull);
+ for (UINT i = 0; i < 4; ++i)
+ {
+ QD3D12_MixHash(h, g_gl.terrainLayerTextures[i]);
+ QD3D12_MixTextureStamp(h, QD3D12_FindTextureResource(g_gl.terrainLayerTextures[i]));
+ QD3D12_MixHash(h, g_gl.terrainLayerNormalTextures[i]);
+ QD3D12_MixTextureStamp(h, QD3D12_FindTextureResource(g_gl.terrainLayerNormalTextures[i]));
+ }
+ QD3D12_MixHash(h, g_gl.terrainWeightTexture);
+ QD3D12_MixTextureStamp(h, QD3D12_FindTextureResource(g_gl.terrainWeightTexture));
+ QD3D12_MixHashFloat(h, g_gl.terrainBlendOpacity);
return h ? h : 1ull;
}
@@ -6443,6 +6638,17 @@ static uint64_t QD3D12_GatherImmediateTextureCandidates(bool arbProgramsActive,
QD3D12_MixHash(h, g_gl.currentSpecularMapTexture);
QD3D12_MixHash(h, g_gl.currentNeuralPOMTexture);
QD3D12_MixHash(h, g_gl.neuralPOMEnabled ? 1ull : 0ull);
+ QD3D12_MixHash(h, g_gl.terrainBlendEnabled ? 1ull : 0ull);
+ for (UINT layer = 0; layer < 4; ++layer)
+ {
+ QD3D12_MixHash(h, g_gl.terrainLayerTextures[layer]);
+ QD3D12_MixTextureStamp(h, QD3D12_FindTextureResource(g_gl.terrainLayerTextures[layer]));
+ QD3D12_MixHash(h, g_gl.terrainLayerNormalTextures[layer]);
+ QD3D12_MixTextureStamp(h, QD3D12_FindTextureResource(g_gl.terrainLayerNormalTextures[layer]));
+ }
+ QD3D12_MixHash(h, g_gl.terrainWeightTexture);
+ QD3D12_MixTextureStamp(h, QD3D12_FindTextureResource(g_gl.terrainWeightTexture));
+ QD3D12_MixHashFloat(h, g_gl.terrainBlendOpacity);
for (UINT unit = 0; unit < QD3D12_MaxTextureUnits; ++unit)
{
@@ -6472,6 +6678,12 @@ static uint64_t QD3D12_GatherImmediateTextureCandidates(bool arbProgramsActive,
QD3D12_MixTextureStamp(h, g_gl.currentGlowMapTexture != 0 ? QD3D12_FindTextureResource(g_gl.currentGlowMapTexture) : nullptr);
QD3D12_MixTextureStamp(h, g_gl.currentSpecularMapTexture != 0 ? QD3D12_FindTextureResource(g_gl.currentSpecularMapTexture) : nullptr);
QD3D12_MixTextureStamp(h, g_gl.currentNeuralPOMTexture != 0 ? QD3D12_FindTextureResource(g_gl.currentNeuralPOMTexture) : nullptr);
+ for (UINT layer = 0; layer < 4; ++layer)
+ {
+ QD3D12_MixTextureStamp(h, g_gl.terrainLayerTextures[layer] != 0 ? QD3D12_FindTextureResource(g_gl.terrainLayerTextures[layer]) : nullptr);
+ QD3D12_MixTextureStamp(h, g_gl.terrainLayerNormalTextures[layer] != 0 ? QD3D12_FindTextureResource(g_gl.terrainLayerNormalTextures[layer]) : nullptr);
+ }
+ QD3D12_MixTextureStamp(h, g_gl.terrainWeightTexture != 0 ? QD3D12_FindTextureResource(g_gl.terrainWeightTexture) : nullptr);
return h ? h : 1ull;
}
@@ -6497,6 +6709,31 @@ static QD3D12PreparedImmediateTextures QD3D12_PrepareImmediateTextures(bool arbP
}
}
+ if (g_gl.terrainBlendEnabled)
+ {
+ for (UINT layer = 0; layer < 4; ++layer)
+ {
+ TextureResource* tex = QD3D12_FindTextureResource(g_gl.terrainLayerTextures[layer]);
+ if (tex && tex != &g_gl.whiteTexture && !tex->gpuValid)
+ {
+ EnsureTextureResource(*tex);
+ UploadTexture(*tex);
+ }
+ TextureResource* normalTex = QD3D12_FindTextureResource(g_gl.terrainLayerNormalTextures[layer]);
+ if (normalTex && normalTex != &g_gl.whiteTexture && !normalTex->gpuValid)
+ {
+ EnsureTextureResource(*normalTex);
+ UploadTexture(*normalTex);
+ }
+ }
+ TextureResource* weightTex = QD3D12_FindTextureResource(g_gl.terrainWeightTexture);
+ if (weightTex && weightTex != &g_gl.whiteTexture && !weightTex->gpuValid)
+ {
+ EnsureTextureResource(*weightTex);
+ UploadTexture(*weightTex);
+ }
+ }
+
prepared.normalMapTex = QD3D12_SelectNormalMapTexture(prepared.boundTextures);
if (prepared.normalMapTex && prepared.normalMapTex != &g_gl.whiteTexture && !prepared.normalMapTex->gpuValid)
{
@@ -13376,6 +13613,70 @@ static void QD3D12_CopyRGBARegionIntoTexture(TextureResource& tex, GLint xoffset
QD3D12_InvalidateTextureMipChain(tex, true);
}
+static bool QD3D12_UploadRGBA8RegionToTexture(TextureResource& tex, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, const uint8_t* rgbaBytes)
+{
+ if (!g_currentWindow || !g_gl.cmdList || !g_gl.frameOpen || !tex.texture || !tex.gpuValid || !rgbaBytes)
+ return false;
+ if (tex.compressed || tex.dxgiFormat != DXGI_FORMAT_R8G8B8A8_UNORM)
+ return false;
+ if (xoffset < 0 || yoffset < 0 || width <= 0 || height <= 0 || xoffset + width > tex.width || yoffset + height > tex.height)
+ return false;
+
+ ID3D12GraphicsCommandList* cl = g_gl.cmdList.Get();
+ if (tex.state != D3D12_RESOURCE_STATE_COPY_DEST)
+ {
+ D3D12_RESOURCE_BARRIER toCopy{};
+ toCopy.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION;
+ toCopy.Transition.pResource = tex.texture.Get();
+ toCopy.Transition.StateBefore = tex.state;
+ toCopy.Transition.StateAfter = D3D12_RESOURCE_STATE_COPY_DEST;
+ toCopy.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES;
+ cl->ResourceBarrier(1, &toCopy);
+ tex.state = D3D12_RESOURCE_STATE_COPY_DEST;
+ }
+
+ const UINT srcRowBytes = (UINT)width * 4u;
+ const UINT rowPitch = (srcRowBytes + 255u) & ~255u;
+ const UINT uploadSize = rowPitch * (UINT)height;
+ UploadAlloc alloc = QD3D12_AllocUpload(uploadSize, D3D12_TEXTURE_DATA_PLACEMENT_ALIGNMENT);
+ uint8_t* dstBase = (uint8_t*)alloc.cpu;
+ memset(dstBase, 0, uploadSize);
+ for (UINT row = 0; row < (UINT)height; ++row)
+ {
+ memcpy(dstBase + (size_t)row * rowPitch,
+ rgbaBytes + (size_t)row * srcRowBytes,
+ srcRowBytes);
+ }
+
+ D3D12_TEXTURE_COPY_LOCATION srcLoc{};
+ srcLoc.pResource = g_currentWindow->upload.resource[g_currentWindow->frameIndex].Get();
+ srcLoc.Type = D3D12_TEXTURE_COPY_TYPE_PLACED_FOOTPRINT;
+ srcLoc.PlacedFootprint.Offset = alloc.offset;
+ srcLoc.PlacedFootprint.Footprint.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
+ srcLoc.PlacedFootprint.Footprint.Width = (UINT)width;
+ srcLoc.PlacedFootprint.Footprint.Height = (UINT)height;
+ srcLoc.PlacedFootprint.Footprint.Depth = 1;
+ srcLoc.PlacedFootprint.Footprint.RowPitch = rowPitch;
+
+ D3D12_TEXTURE_COPY_LOCATION dstLoc{};
+ dstLoc.pResource = tex.texture.Get();
+ dstLoc.Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX;
+ dstLoc.SubresourceIndex = 0;
+ cl->CopyTextureRegion(&dstLoc, (UINT)xoffset, (UINT)yoffset, 0, &srcLoc, nullptr);
+
+ D3D12_RESOURCE_BARRIER toSrv{};
+ toSrv.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION;
+ toSrv.Transition.pResource = tex.texture.Get();
+ toSrv.Transition.StateBefore = D3D12_RESOURCE_STATE_COPY_DEST;
+ toSrv.Transition.StateAfter = D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE | D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE;
+ toSrv.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES;
+ cl->ResourceBarrier(1, &toSrv);
+
+ tex.state = D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE | D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE;
+ tex.gpuValid = true;
+ return true;
+}
+
static PipelineMode PickPipeline(bool useTex0, bool useTex1)
{
const bool textured = useTex0 || useTex1;
@@ -13793,6 +14094,7 @@ static void QD3D12_FlushQueuedBatches()
D3D12_GPU_DESCRIPTOR_HANDLE lastSpecularMap{};
D3D12_GPU_DESCRIPTOR_HANDLE lastNeuralWeights{};
D3D12_GPU_DESCRIPTOR_HANDLE lastNeuralLatent{};
+ D3D12_GPU_DESCRIPTOR_HANDLE lastTerrainNormal[4]{};
bool haveLastTex0 = false;
bool haveLastTex1 = false;
bool haveLastNormalMap = false;
@@ -13800,6 +14102,7 @@ static void QD3D12_FlushQueuedBatches()
bool haveLastSpecularMap = false;
bool haveLastNeuralWeights = false;
bool haveLastNeuralLatent = false;
+ bool haveLastTerrainNormal[4] = {};
D3D12_PRIMITIVE_TOPOLOGY lastTopo = D3D_PRIMITIVE_TOPOLOGY_UNDEFINED;
for (size_t i = 0; i < g_gl.queuedBatches.size(); ++i)
@@ -13940,10 +14243,12 @@ static void QD3D12_FlushQueuedBatches()
dc->neuralPomPad[2] = ClampValue(1.0f + (neuralStrength - 1.0f) * 0.65f, 1.0f, 3.0f);
dc->neuralPomPad[3] = ClampValue(1.0f + (neuralStrength - 1.0f) * 0.45f, 1.0f, 2.5f);
memcpy(dc->currentColor, batch.key.currentColor, sizeof(dc->currentColor));
+ if (batch.key.useTerrainBlend > 0.5f)
+ memcpy(dc->currentColor, batch.key.terrainLayerNormalMask, sizeof(dc->currentColor));
dc->vertexColorPad[0] = batch.key.useVertexColor;
- dc->vertexColorPad[1] = 0.0f;
- dc->vertexColorPad[2] = 0.0f;
- dc->vertexColorPad[3] = 0.0f;
+ dc->vertexColorPad[1] = batch.key.useTerrainBlend;
+ dc->vertexColorPad[2] = batch.key.terrainBlendOpacity;
+ dc->vertexColorPad[3] = batch.key.useTerrainWeightTexture;
if (batch.key.useARBPrograms && batch.key.arbConstants)
{
@@ -14010,6 +14315,8 @@ static void QD3D12_FlushQueuedBatches()
haveLastSpecularMap = false;
haveLastNeuralWeights = false;
haveLastNeuralLatent = false;
+ for (UINT layer = 0; layer < 4; ++layer)
+ haveLastTerrainNormal[layer] = false;
}
else
{
@@ -14092,6 +14399,21 @@ static void QD3D12_FlushQueuedBatches()
lastNeuralLatent = neuralLatentGpu;
haveLastNeuralLatent = true;
}
+
+ for (UINT layer = 0; layer < 4; ++layer)
+ {
+ UINT terrainNormalSrvIndex = batch.key.terrainLayerNormalSrvIndex[layer];
+ if (terrainNormalSrvIndex == UINT_MAX)
+ terrainNormalSrvIndex = g_gl.whiteTexture.srvIndex;
+
+ D3D12_GPU_DESCRIPTOR_HANDLE terrainNormalGpu = QD3D12_SrvGpu(terrainNormalSrvIndex);
+ if (!haveLastTerrainNormal[layer] || terrainNormalGpu.ptr != lastTerrainNormal[layer].ptr)
+ {
+ g_gl.cmdList->SetGraphicsRootDescriptorTable(8 + layer, terrainNormalGpu);
+ lastTerrainNormal[layer] = terrainNormalGpu;
+ haveLastTerrainNormal[layer] = true;
+ }
+ }
}
g_gl.cmdList->SetGraphicsRootConstantBufferView(0, cbAlloc.gpu);
@@ -15002,6 +15324,57 @@ void APIENTRY glTextureAverageColorQD3D12(GLuint texture, GLfloat r, GLfloat g,
tex.cpuGeneration++;
}
+void APIENTRY glTerrainBlendEnableQD3D12(GLboolean enable)
+{
+ g_gl.terrainBlendEnabled = (enable != GL_FALSE);
+}
+
+void APIENTRY glEnableTerrainBlendQD3D12(GLboolean enable)
+{
+ glTerrainBlendEnableQD3D12(enable);
+}
+
+void APIENTRY glTerrainLayerTextureQD3D12(GLuint layer, GLuint texture)
+{
+ if (layer >= 4)
+ {
+ g_gl.lastError = GL_INVALID_VALUE;
+ return;
+ }
+
+ if (texture != 0)
+ (void)QD3D12_EnsureTextureName(texture);
+
+ g_gl.terrainLayerTextures[layer] = texture;
+}
+
+void APIENTRY glTerrainLayerNormalTextureQD3D12(GLuint layer, GLuint texture)
+{
+ if (layer >= 4)
+ {
+ g_gl.lastError = GL_INVALID_VALUE;
+ return;
+ }
+
+ if (texture != 0)
+ (void)QD3D12_EnsureTextureName(texture);
+
+ g_gl.terrainLayerNormalTextures[layer] = texture;
+}
+
+void APIENTRY glTerrainWeightTextureQD3D12(GLuint texture)
+{
+ if (texture != 0)
+ (void)QD3D12_EnsureTextureName(texture);
+
+ g_gl.terrainWeightTexture = texture;
+}
+
+void APIENTRY glTerrainBlendOpacityQD3D12(GLfloat opacity)
+{
+ g_gl.terrainBlendOpacity = ClampValue(opacity, 0.0f, 1.0f);
+}
+
void APIENTRY glRaytracingMaterialFlagsQD3D12(GLuint flags)
{
g_gl.currentRayMaterialFlags = QD3D12_ClampRayMaterialFlags((uint32_t)flags);
@@ -15975,6 +16348,9 @@ void APIENTRY glTexSubImage2D(GLenum, GLint level, GLint xoffset, GLint yoffset,
}
const int bpp = BytesPerPixel(format, type);
+ if (bpp <= 0 || xoffset < 0 || yoffset < 0 || width <= 0 || height <= 0 || xoffset + width > tex.width || yoffset + height > tex.height)
+ return;
+
if (tex.sysmem.empty())
tex.sysmem.resize((size_t)tex.width * (size_t)tex.height * (size_t)bpp);
@@ -15986,7 +16362,21 @@ void APIENTRY glTexSubImage2D(GLenum, GLint level, GLint xoffset, GLint yoffset,
memcpy(tex.sysmem.data() + dstOff, src + srcOff, (size_t)width * (size_t)bpp);
}
- QD3D12_InvalidateTextureMipChain(tex, true);
+ const bool canUploadRegion =
+ format == GL_RGBA &&
+ type == GL_UNSIGNED_BYTE &&
+ bpp == 4 &&
+ tex.dxgiFormat == DXGI_FORMAT_R8G8B8A8_UNORM;
+
+ QD3D12_InvalidateTextureMipChain(tex, !canUploadRegion);
+ EnsureTextureResource(tex);
+ if (canUploadRegion && QD3D12_UploadRGBA8RegionToTexture(tex, xoffset, yoffset, width, height, src))
+ {
+ EnsureTextureResource(tex);
+ return;
+ }
+
+ tex.gpuValid = false;
EnsureTextureResource(tex);
}
@@ -18125,6 +18515,12 @@ PROC WINAPI qd3d12_wglGetProcAddress(LPCSTR name) {
{ "glBindSpecularMapTexture", (PROC)glBindSpecularMapTexture },
{ "glSpecularMapTexture", (PROC)glSpecularMapTexture },
{ "glSpecularMapStrengthf", (PROC)glSpecularMapStrengthf },
+ { "glTerrainBlendEnableQD3D12", (PROC)glTerrainBlendEnableQD3D12 },
+ { "glEnableTerrainBlendQD3D12", (PROC)glEnableTerrainBlendQD3D12 },
+ { "glTerrainLayerTextureQD3D12", (PROC)glTerrainLayerTextureQD3D12 },
+ { "glTerrainLayerNormalTextureQD3D12", (PROC)glTerrainLayerNormalTextureQD3D12 },
+ { "glTerrainWeightTextureQD3D12", (PROC)glTerrainWeightTextureQD3D12 },
+ { "glTerrainBlendOpacityQD3D12", (PROC)glTerrainBlendOpacityQD3D12 },
{ "glGlassMaterialQD3D12", (PROC)glGlassMaterialQD3D12 },
{ "glMaterialGlassQD3D12", (PROC)glMaterialGlassQD3D12 },
{ "glRaytracingMaterialFlagsQD3D12", (PROC)glRaytracingMaterialFlagsQD3D12 },
diff --git a/neo/engine/opengl/gl_raytracing.cpp b/neo/engine/opengl/gl_raytracing.cpp
new file mode 100644
index 00000000..b933d228
--- /dev/null
+++ b/neo/engine/opengl/gl_raytracing.cpp
@@ -0,0 +1,7230 @@
+/*
+===========================================================================
+
+IceTech GPL Source Code
+Copyright (C) 2026 Justin Marshall
+
+This file is part of the IceTech GPL Source Code (?IceTech Source Code?).
+
+IceTech Source Code is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+IceTech Source Code is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with IceTech Source Code. If not, see .
+
+If you have questions concerning this license or the applicable additional terms, you may contact in writing Justin Marshall, justinmarshall20@gmail.com
+
+===========================================================================
+*/
+
+#include "opengl.h"
+
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#pragma comment(lib, "dxcompiler.lib")
+#pragma comment(lib, "d3dcompiler.lib")
+
+using Microsoft::WRL::ComPtr;
+
+extern float com_pathTracingGpuMsec;
+
+// ============================================================
+// Logging / checks
+// ============================================================
+
+static void glRaytracingLog(const char* fmt, ...)
+{
+ char buffer[4096];
+ va_list args;
+ va_start(args, fmt);
+ vsnprintf(buffer, sizeof(buffer), fmt, args);
+ va_end(args);
+ OutputDebugStringA(buffer);
+ OutputDebugStringA("\n");
+}
+
+static void glRaytracingFatal(const char* fmt, ...)
+{
+ char buffer[4096];
+ va_list args;
+ va_start(args, fmt);
+ vsnprintf(buffer, sizeof(buffer), fmt, args);
+ va_end(args);
+ OutputDebugStringA(buffer);
+ OutputDebugStringA("\n");
+ MessageBoxA(nullptr, buffer, "glRaytracing Fatal", MB_OK | MB_ICONERROR);
+ DebugBreak();
+}
+
+#define GLR_CHECK(x) \
+ do { HRESULT _hr = (x); if (FAILED(_hr)) { glRaytracingFatal("HRESULT 0x%08X failed at %s:%d", (unsigned)_hr, __FILE__, __LINE__); return 0; } } while (0)
+
+#define GLR_CHECKV(x) \
+ do { HRESULT _hr = (x); if (FAILED(_hr)) { glRaytracingFatal("HRESULT 0x%08X failed at %s:%d", (unsigned)_hr, __FILE__, __LINE__); return; } } while (0)
+
+// ============================================================
+// Helpers
+// ============================================================
+
+static UINT64 glRaytracingAlignUp(UINT64 v, UINT64 a)
+{
+ return (v + (a - 1)) & ~(a - 1);
+}
+
+template
+static T glRaytracingClamp(T v, T lo, T hi)
+{
+ return (v < lo) ? lo : ((v > hi) ? hi : v);
+}
+
+static void glRaytracingSetIdentity4x4(float* m)
+{
+ if (!m)
+ return;
+
+ memset(m, 0, sizeof(float) * 16);
+ m[0] = 1.0f;
+ m[5] = 1.0f;
+ m[10] = 1.0f;
+ m[15] = 1.0f;
+}
+
+static int glRaytracingInvertMatrix4x4(const float* m, float* out)
+{
+ if (!m || !out)
+ return 0;
+
+ float a[4][8];
+
+ for (int r = 0; r < 4; ++r)
+ {
+ for (int c = 0; c < 4; ++c)
+ a[r][c] = m[r * 4 + c];
+
+ for (int c = 0; c < 4; ++c)
+ a[r][4 + c] = (r == c) ? 1.0f : 0.0f;
+ }
+
+ for (int col = 0; col < 4; ++col)
+ {
+ int pivot = col;
+ float best = a[col][col] < 0.0f ? -a[col][col] : a[col][col];
+
+ for (int r = col + 1; r < 4; ++r)
+ {
+ const float v = a[r][col] < 0.0f ? -a[r][col] : a[r][col];
+ if (v > best)
+ {
+ best = v;
+ pivot = r;
+ }
+ }
+
+ if (best <= 1.0e-8f)
+ return 0;
+
+ if (pivot != col)
+ {
+ for (int c = 0; c < 8; ++c)
+ {
+ const float tmp = a[col][c];
+ a[col][c] = a[pivot][c];
+ a[pivot][c] = tmp;
+ }
+ }
+
+ const float invPivot = 1.0f / a[col][col];
+ for (int c = 0; c < 8; ++c)
+ a[col][c] *= invPivot;
+
+ for (int r = 0; r < 4; ++r)
+ {
+ if (r == col)
+ continue;
+
+ const float f = a[r][col];
+ if (f == 0.0f)
+ continue;
+
+ for (int c = 0; c < 8; ++c)
+ a[r][c] -= f * a[col][c];
+ }
+ }
+
+ for (int r = 0; r < 4; ++r)
+ {
+ for (int c = 0; c < 4; ++c)
+ out[r * 4 + c] = a[r][4 + c];
+ }
+
+ return 1;
+}
+
+
+static DXGI_FORMAT glRaytracingGetSrvFormatForDepth(DXGI_FORMAT fmt)
+{
+ switch (fmt)
+ {
+ case DXGI_FORMAT_D32_FLOAT: return DXGI_FORMAT_R32_FLOAT;
+ case DXGI_FORMAT_D24_UNORM_S8_UINT: return DXGI_FORMAT_R24_UNORM_X8_TYPELESS;
+ case DXGI_FORMAT_D16_UNORM: return DXGI_FORMAT_R16_UNORM;
+ default: return fmt;
+ }
+}
+
+struct glRaytracingBuffer_t
+{
+ ComPtr resource;
+ UINT64 size;
+ D3D12_GPU_VIRTUAL_ADDRESS gpuVA;
+
+ glRaytracingBuffer_t()
+ {
+ size = 0;
+ gpuVA = 0;
+ }
+};
+
+static glRaytracingBuffer_t glRaytracingCreateBuffer(
+ ID3D12Device* device,
+ UINT64 size,
+ D3D12_HEAP_TYPE heapType,
+ D3D12_RESOURCE_STATES initialState,
+ D3D12_RESOURCE_FLAGS flags)
+{
+ glRaytracingBuffer_t out;
+
+ D3D12_HEAP_PROPERTIES hp = {};
+ hp.Type = heapType;
+
+ D3D12_RESOURCE_DESC rd = {};
+ rd.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER;
+ rd.Width = size;
+ rd.Height = 1;
+ rd.DepthOrArraySize = 1;
+ rd.MipLevels = 1;
+ rd.Format = DXGI_FORMAT_UNKNOWN;
+ rd.SampleDesc.Count = 1;
+ rd.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR;
+ rd.Flags = flags;
+
+ HRESULT hr = device->CreateCommittedResource(
+ &hp,
+ D3D12_HEAP_FLAG_NONE,
+ &rd,
+ initialState,
+ nullptr,
+ IID_PPV_ARGS(&out.resource));
+
+ if (FAILED(hr))
+ {
+ glRaytracingFatal("CreateCommittedResource failed 0x%08X", (unsigned)hr);
+ return out;
+ }
+
+ out.size = size;
+ out.gpuVA = out.resource->GetGPUVirtualAddress();
+ return out;
+}
+
+struct glRaytracingTexture_t
+{
+ ComPtr resource;
+ UINT width;
+ UINT height;
+ DXGI_FORMAT format;
+ D3D12_RESOURCE_STATES state;
+
+ glRaytracingTexture_t()
+ {
+ width = 0;
+ height = 0;
+ format = DXGI_FORMAT_UNKNOWN;
+ state = D3D12_RESOURCE_STATE_COMMON;
+ }
+};
+
+static glRaytracingTexture_t glRaytracingCreateTexture2D(
+ ID3D12Device* device,
+ UINT width,
+ UINT height,
+ DXGI_FORMAT format,
+ D3D12_RESOURCE_STATES initialState,
+ D3D12_RESOURCE_FLAGS flags)
+{
+ glRaytracingTexture_t out;
+
+ D3D12_HEAP_PROPERTIES hp = {};
+ hp.Type = D3D12_HEAP_TYPE_DEFAULT;
+
+ D3D12_RESOURCE_DESC rd = {};
+ rd.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D;
+ rd.Width = width;
+ rd.Height = height;
+ rd.DepthOrArraySize = 1;
+ rd.MipLevels = 1;
+ rd.Format = format;
+ rd.SampleDesc.Count = 1;
+ rd.Layout = D3D12_TEXTURE_LAYOUT_UNKNOWN;
+ rd.Flags = flags;
+
+ HRESULT hr = device->CreateCommittedResource(
+ &hp,
+ D3D12_HEAP_FLAG_NONE,
+ &rd,
+ initialState,
+ nullptr,
+ IID_PPV_ARGS(&out.resource));
+
+ if (FAILED(hr))
+ {
+ glRaytracingFatal("CreateCommittedResource texture failed 0x%08X", (unsigned)hr);
+ return out;
+ }
+
+ out.width = width;
+ out.height = height;
+ out.format = format;
+ out.state = initialState;
+ return out;
+}
+
+static void glRaytracingMapCopy(ID3D12Resource* res, const void* src, size_t bytes)
+{
+ void* dst = nullptr;
+ HRESULT hr = res->Map(0, nullptr, &dst);
+ if (FAILED(hr))
+ {
+ glRaytracingFatal("Map failed 0x%08X", (unsigned)hr);
+ return;
+ }
+
+ memcpy(dst, src, bytes);
+ res->Unmap(0, nullptr);
+}
+
+static void glRaytracingTransition(
+ ID3D12GraphicsCommandList* cmd,
+ ID3D12Resource* res,
+ D3D12_RESOURCE_STATES before,
+ D3D12_RESOURCE_STATES after)
+{
+ if (!res || before == after)
+ return;
+
+ D3D12_RESOURCE_BARRIER b = {};
+ b.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION;
+ b.Transition.pResource = res;
+ b.Transition.StateBefore = before;
+ b.Transition.StateAfter = after;
+ b.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES;
+ cmd->ResourceBarrier(1, &b);
+}
+
+static D3D12_CPU_DESCRIPTOR_HANDLE glRaytracingOffsetCpu(D3D12_CPU_DESCRIPTOR_HANDLE h, UINT stride, UINT idx)
+{
+ h.ptr += UINT64(stride) * UINT64(idx);
+ return h;
+}
+
+static D3D12_GPU_DESCRIPTOR_HANDLE glRaytracingOffsetGpu(D3D12_GPU_DESCRIPTOR_HANDLE h, UINT stride, UINT idx)
+{
+ h.ptr += UINT64(stride) * UINT64(idx);
+ return h;
+}
+
+// ============================================================
+// Shared command context
+// ============================================================
+
+#ifndef GL_RAYTRACING_CMD_RING_SIZE
+#define GL_RAYTRACING_CMD_RING_SIZE 4
+#endif
+
+#if GL_RAYTRACING_CMD_RING_SIZE < 2
+#error GL_RAYTRACING_CMD_RING_SIZE must be at least 2
+#endif
+
+#ifndef GL_RAYTRACING_FORCE_CPU_SYNC
+#define GL_RAYTRACING_FORCE_CPU_SYNC 0
+#endif
+
+struct glRaytracingCmdContext_t
+{
+ ComPtr device;
+ ComPtr queue;
+
+ // Active command allocator/list for the command currently being recorded.
+ // The ring below avoids the old every-frame CPU/GPU fence wait.
+ ComPtr cmdAlloc;
+ ComPtr cmdList;
+ UINT64 cmdLastFenceValue;
+ ComPtr cmdAllocRing[GL_RAYTRACING_CMD_RING_SIZE];
+ ComPtr cmdListRing[GL_RAYTRACING_CMD_RING_SIZE];
+ UINT64 cmdFenceValueRing[GL_RAYTRACING_CMD_RING_SIZE];
+ UINT cmdRingIndex;
+ UINT cmdCurrentSlot;
+
+ ComPtr blasCmdAlloc;
+ ComPtr blasCmdList;
+ UINT64 blasLastFenceValue;
+ ComPtr blasCmdAllocRing[GL_RAYTRACING_CMD_RING_SIZE];
+ ComPtr blasCmdListRing[GL_RAYTRACING_CMD_RING_SIZE];
+ UINT64 blasFenceValueRing[GL_RAYTRACING_CMD_RING_SIZE];
+ UINT blasRingIndex;
+ UINT blasCurrentSlot;
+
+ ComPtr tlasCmdAlloc;
+ ComPtr tlasCmdList;
+ UINT64 tlasLastFenceValue;
+ ComPtr tlasCmdAllocRing[GL_RAYTRACING_CMD_RING_SIZE];
+ ComPtr tlasCmdListRing[GL_RAYTRACING_CMD_RING_SIZE];
+ UINT64 tlasFenceValueRing[GL_RAYTRACING_CMD_RING_SIZE];
+ UINT tlasRingIndex;
+ UINT tlasCurrentSlot;
+
+ ComPtr fence;
+ HANDLE fenceEvent;
+ UINT64 nextFenceValue;
+ ComPtr pathTracingTimestampHeap;
+ glRaytracingBuffer_t pathTracingTimestampReadback;
+ UINT64 pathTracingTimestampFrequency;
+ UINT64 pathTracingTimestampFenceRing[GL_RAYTRACING_CMD_RING_SIZE];
+ bool initialized;
+
+ glRaytracingCmdContext_t()
+ {
+ cmdLastFenceValue = 0;
+ blasLastFenceValue = 0;
+ tlasLastFenceValue = 0;
+ cmdRingIndex = GL_RAYTRACING_CMD_RING_SIZE - 1;
+ blasRingIndex = GL_RAYTRACING_CMD_RING_SIZE - 1;
+ tlasRingIndex = GL_RAYTRACING_CMD_RING_SIZE - 1;
+ cmdCurrentSlot = 0;
+ blasCurrentSlot = 0;
+ tlasCurrentSlot = 0;
+ for (UINT i = 0; i < GL_RAYTRACING_CMD_RING_SIZE; ++i)
+ {
+ cmdFenceValueRing[i] = 0;
+ blasFenceValueRing[i] = 0;
+ tlasFenceValueRing[i] = 0;
+ pathTracingTimestampFenceRing[i] = 0;
+ }
+ fenceEvent = nullptr;
+ nextFenceValue = 0;
+ pathTracingTimestampFrequency = 0;
+ initialized = false;
+ }
+};
+
+static glRaytracingCmdContext_t g_glRaytracingCmd;
+static std::mutex g_glRaytracingMutex;
+
+static void glRaytracingWaitFenceValue(UINT64 value)
+{
+ if (!value || !g_glRaytracingCmd.fence)
+ return;
+
+ if (g_glRaytracingCmd.fence->GetCompletedValue() >= value)
+ return;
+
+ g_glRaytracingCmd.fence->SetEventOnCompletion(value, g_glRaytracingCmd.fenceEvent);
+ WaitForSingleObject(g_glRaytracingCmd.fenceEvent, INFINITE);
+}
+
+static UINT64 glRaytracingSignalQueue(void)
+{
+ if (!g_glRaytracingCmd.queue || !g_glRaytracingCmd.fence)
+ return 0;
+
+ const UINT64 value = ++g_glRaytracingCmd.nextFenceValue;
+ g_glRaytracingCmd.queue->Signal(g_glRaytracingCmd.fence.Get(), value);
+ return value;
+}
+
+static void glRaytracingWaitIdle(void)
+{
+ const UINT64 value = glRaytracingSignalQueue();
+ glRaytracingWaitFenceValue(value);
+}
+
+static void glRaytracingPollPathTracingTimestamp(UINT slot)
+{
+ if (!g_glRaytracingCmd.pathTracingTimestampReadback.resource ||
+ !g_glRaytracingCmd.pathTracingTimestampFrequency ||
+ slot >= GL_RAYTRACING_CMD_RING_SIZE)
+ {
+ return;
+ }
+
+ const UINT64 fenceValue = g_glRaytracingCmd.pathTracingTimestampFenceRing[slot];
+ if (!fenceValue || !g_glRaytracingCmd.fence || g_glRaytracingCmd.fence->GetCompletedValue() < fenceValue)
+ return;
+
+ const UINT64 offset = sizeof(UINT64) * 2ull * slot;
+ D3D12_RANGE readRange = { offset, offset + sizeof(UINT64) * 2ull };
+ UINT64* timestamps = nullptr;
+ if (SUCCEEDED(g_glRaytracingCmd.pathTracingTimestampReadback.resource->Map(0, &readRange, reinterpret_cast(×tamps))) && timestamps != nullptr)
+ {
+ const UINT64 begin = timestamps[slot * 2 + 0];
+ const UINT64 end = timestamps[slot * 2 + 1];
+ if (end >= begin)
+ {
+ com_pathTracingGpuMsec = (float)((double)(end - begin) * 1000.0 / (double)g_glRaytracingCmd.pathTracingTimestampFrequency);
+ }
+
+ D3D12_RANGE writeRange = { 0, 0 };
+ g_glRaytracingCmd.pathTracingTimestampReadback.resource->Unmap(0, &writeRange);
+ }
+ g_glRaytracingCmd.pathTracingTimestampFenceRing[slot] = 0;
+}
+
+static int glRaytracingCreatePathTracingTimestamps(void)
+{
+ D3D12_QUERY_HEAP_DESC qh = {};
+ qh.Type = D3D12_QUERY_HEAP_TYPE_TIMESTAMP;
+ qh.NumDescriptors = GL_RAYTRACING_CMD_RING_SIZE * 2;
+ if (FAILED(g_glRaytracingCmd.device->CreateQueryHeap(&qh, IID_PPV_ARGS(&g_glRaytracingCmd.pathTracingTimestampHeap))))
+ return 0;
+
+ g_glRaytracingCmd.pathTracingTimestampReadback = glRaytracingCreateBuffer(
+ g_glRaytracingCmd.device.Get(),
+ sizeof(UINT64) * GL_RAYTRACING_CMD_RING_SIZE * 2ull,
+ D3D12_HEAP_TYPE_READBACK,
+ D3D12_RESOURCE_STATE_COPY_DEST,
+ D3D12_RESOURCE_FLAG_NONE);
+ if (!g_glRaytracingCmd.pathTracingTimestampReadback.resource)
+ return 0;
+
+ g_glRaytracingCmd.pathTracingTimestampFrequency = 0;
+ if (FAILED(g_glRaytracingCmd.queue->GetTimestampFrequency(&g_glRaytracingCmd.pathTracingTimestampFrequency)) ||
+ g_glRaytracingCmd.pathTracingTimestampFrequency == 0)
+ {
+ g_glRaytracingCmd.pathTracingTimestampHeap.Reset();
+ g_glRaytracingCmd.pathTracingTimestampReadback = glRaytracingBuffer_t();
+ return 0;
+ }
+
+ return 1;
+}
+
+static int glRaytracingCreateDirectCommandListPair(
+ ID3D12Device5* device,
+ ComPtr& allocator,
+ ComPtr& list)
+{
+ GLR_CHECK(device->CreateCommandAllocator(
+ D3D12_COMMAND_LIST_TYPE_DIRECT,
+ IID_PPV_ARGS(&allocator)));
+
+ GLR_CHECK(device->CreateCommandList(
+ 0,
+ D3D12_COMMAND_LIST_TYPE_DIRECT,
+ allocator.Get(),
+ nullptr,
+ IID_PPV_ARGS(&list)));
+
+ GLR_CHECK(list->Close());
+ return 1;
+}
+
+static int glRaytracingInitCmdContext(void)
+{
+ ID3D12Device* baseDevice = QD3D12_GetDevice();
+ ID3D12CommandQueue* baseQueue = QD3D12_GetQueue();
+
+ if (g_glRaytracingCmd.initialized)
+ {
+ if (!baseDevice || !baseQueue)
+ {
+ glRaytracingFatal("glRaytracingInitCmdContext: missing device or queue");
+ return 0;
+ }
+
+ ComPtr currentDevice;
+ HRESULT hr = baseDevice->QueryInterface(IID_PPV_ARGS(¤tDevice));
+ if (FAILED(hr) || currentDevice.Get() != g_glRaytracingCmd.device.Get() || baseQueue != g_glRaytracingCmd.queue.Get())
+ {
+ glRaytracingFatal("glRaytracingInitCmdContext: D3D12 device/queue changed. DXR state is device-local; create/use all windows with the same D3D12 device and queue, or fully shut down raytracing before switching devices.");
+ return 0;
+ }
+
+ return 1;
+ }
+
+ if (!baseDevice || !baseQueue)
+ {
+ glRaytracingFatal("glRaytracingInitCmdContext: missing device or queue");
+ return 0;
+ }
+
+ GLR_CHECK(baseDevice->QueryInterface(IID_PPV_ARGS(&g_glRaytracingCmd.device)));
+ g_glRaytracingCmd.queue = baseQueue;
+
+ for (UINT i = 0; i < GL_RAYTRACING_CMD_RING_SIZE; ++i)
+ {
+ if (!glRaytracingCreateDirectCommandListPair(
+ g_glRaytracingCmd.device.Get(),
+ g_glRaytracingCmd.cmdAllocRing[i],
+ g_glRaytracingCmd.cmdListRing[i]))
+ {
+ return 0;
+ }
+
+ if (!glRaytracingCreateDirectCommandListPair(
+ g_glRaytracingCmd.device.Get(),
+ g_glRaytracingCmd.blasCmdAllocRing[i],
+ g_glRaytracingCmd.blasCmdListRing[i]))
+ {
+ return 0;
+ }
+
+ if (!glRaytracingCreateDirectCommandListPair(
+ g_glRaytracingCmd.device.Get(),
+ g_glRaytracingCmd.tlasCmdAllocRing[i],
+ g_glRaytracingCmd.tlasCmdListRing[i]))
+ {
+ return 0;
+ }
+ }
+
+ g_glRaytracingCmd.cmdAlloc = g_glRaytracingCmd.cmdAllocRing[0];
+ g_glRaytracingCmd.cmdList = g_glRaytracingCmd.cmdListRing[0];
+ g_glRaytracingCmd.blasCmdAlloc = g_glRaytracingCmd.blasCmdAllocRing[0];
+ g_glRaytracingCmd.blasCmdList = g_glRaytracingCmd.blasCmdListRing[0];
+ g_glRaytracingCmd.tlasCmdAlloc = g_glRaytracingCmd.tlasCmdAllocRing[0];
+ g_glRaytracingCmd.tlasCmdList = g_glRaytracingCmd.tlasCmdListRing[0];
+
+ GLR_CHECK(g_glRaytracingCmd.device->CreateFence(
+ 0,
+ D3D12_FENCE_FLAG_NONE,
+ IID_PPV_ARGS(&g_glRaytracingCmd.fence)));
+
+ g_glRaytracingCmd.fenceEvent = CreateEventA(nullptr, FALSE, FALSE, nullptr);
+ if (!g_glRaytracingCmd.fenceEvent)
+ {
+ glRaytracingFatal("CreateEventA failed");
+ return 0;
+ }
+
+ if (!glRaytracingCreatePathTracingTimestamps())
+ {
+ glRaytracingLog("path tracing timestamp queries unavailable");
+ }
+
+ g_glRaytracingCmd.initialized = true;
+ return 1;
+}
+
+static void glRaytracingShutdownCmdContext(void)
+{
+ if (!g_glRaytracingCmd.initialized)
+ return;
+
+ glRaytracingWaitIdle();
+
+ if (g_glRaytracingCmd.fenceEvent)
+ {
+ CloseHandle(g_glRaytracingCmd.fenceEvent);
+ g_glRaytracingCmd.fenceEvent = nullptr;
+ }
+
+ g_glRaytracingCmd = glRaytracingCmdContext_t();
+}
+
+static int glRaytracingBeginCmd(void)
+{
+ const UINT slot = (g_glRaytracingCmd.cmdRingIndex + 1u) % GL_RAYTRACING_CMD_RING_SIZE;
+ glRaytracingWaitFenceValue(g_glRaytracingCmd.cmdFenceValueRing[slot]);
+ glRaytracingPollPathTracingTimestamp(slot);
+
+ g_glRaytracingCmd.cmdRingIndex = slot;
+ g_glRaytracingCmd.cmdCurrentSlot = slot;
+ g_glRaytracingCmd.cmdAlloc = g_glRaytracingCmd.cmdAllocRing[slot];
+ g_glRaytracingCmd.cmdList = g_glRaytracingCmd.cmdListRing[slot];
+
+ GLR_CHECK(g_glRaytracingCmd.cmdAlloc->Reset());
+ GLR_CHECK(g_glRaytracingCmd.cmdList->Reset(g_glRaytracingCmd.cmdAlloc.Get(), nullptr));
+ return 1;
+}
+
+static int glRaytracingEndCmd(void)
+{
+ GLR_CHECK(g_glRaytracingCmd.cmdList->Close());
+
+ ID3D12CommandList* lists[] = { g_glRaytracingCmd.cmdList.Get() };
+ g_glRaytracingCmd.queue->ExecuteCommandLists(1, lists);
+
+ g_glRaytracingCmd.cmdLastFenceValue = glRaytracingSignalQueue();
+ g_glRaytracingCmd.cmdFenceValueRing[g_glRaytracingCmd.cmdCurrentSlot] = g_glRaytracingCmd.cmdLastFenceValue;
+
+#if GL_RAYTRACING_FORCE_CPU_SYNC
+ glRaytracingWaitFenceValue(g_glRaytracingCmd.cmdLastFenceValue);
+#endif
+
+ return 1;
+}
+
+static int glRaytracingBeginBlasCmd(void)
+{
+ const UINT slot = (g_glRaytracingCmd.blasRingIndex + 1u) % GL_RAYTRACING_CMD_RING_SIZE;
+ glRaytracingWaitFenceValue(g_glRaytracingCmd.blasFenceValueRing[slot]);
+
+ g_glRaytracingCmd.blasRingIndex = slot;
+ g_glRaytracingCmd.blasCurrentSlot = slot;
+ g_glRaytracingCmd.blasCmdAlloc = g_glRaytracingCmd.blasCmdAllocRing[slot];
+ g_glRaytracingCmd.blasCmdList = g_glRaytracingCmd.blasCmdListRing[slot];
+
+ GLR_CHECK(g_glRaytracingCmd.blasCmdAlloc->Reset());
+ GLR_CHECK(g_glRaytracingCmd.blasCmdList->Reset(g_glRaytracingCmd.blasCmdAlloc.Get(), nullptr));
+ return 1;
+}
+
+static UINT64 glRaytracingEndBlasCmd(void)
+{
+ GLR_CHECK(g_glRaytracingCmd.blasCmdList->Close());
+
+ ID3D12CommandList* lists[] = { g_glRaytracingCmd.blasCmdList.Get() };
+ g_glRaytracingCmd.queue->ExecuteCommandLists(1, lists);
+
+ g_glRaytracingCmd.blasLastFenceValue = glRaytracingSignalQueue();
+ g_glRaytracingCmd.blasFenceValueRing[g_glRaytracingCmd.blasCurrentSlot] = g_glRaytracingCmd.blasLastFenceValue;
+
+#if GL_RAYTRACING_FORCE_CPU_SYNC
+ glRaytracingWaitFenceValue(g_glRaytracingCmd.blasLastFenceValue);
+#endif
+
+ return g_glRaytracingCmd.blasLastFenceValue;
+}
+
+static int glRaytracingBeginTlasCmd(void)
+{
+ const UINT slot = (g_glRaytracingCmd.tlasRingIndex + 1u) % GL_RAYTRACING_CMD_RING_SIZE;
+ glRaytracingWaitFenceValue(g_glRaytracingCmd.tlasFenceValueRing[slot]);
+
+ g_glRaytracingCmd.tlasRingIndex = slot;
+ g_glRaytracingCmd.tlasCurrentSlot = slot;
+ g_glRaytracingCmd.tlasCmdAlloc = g_glRaytracingCmd.tlasCmdAllocRing[slot];
+ g_glRaytracingCmd.tlasCmdList = g_glRaytracingCmd.tlasCmdListRing[slot];
+
+ GLR_CHECK(g_glRaytracingCmd.tlasCmdAlloc->Reset());
+ GLR_CHECK(g_glRaytracingCmd.tlasCmdList->Reset(g_glRaytracingCmd.tlasCmdAlloc.Get(), nullptr));
+ return 1;
+}
+
+static UINT64 glRaytracingEndTlasCmd(void)
+{
+ GLR_CHECK(g_glRaytracingCmd.tlasCmdList->Close());
+
+ ID3D12CommandList* lists[] = { g_glRaytracingCmd.tlasCmdList.Get() };
+ g_glRaytracingCmd.queue->ExecuteCommandLists(1, lists);
+
+ g_glRaytracingCmd.tlasLastFenceValue = glRaytracingSignalQueue();
+ g_glRaytracingCmd.tlasFenceValueRing[g_glRaytracingCmd.tlasCurrentSlot] = g_glRaytracingCmd.tlasLastFenceValue;
+
+#if GL_RAYTRACING_FORCE_CPU_SYNC
+ glRaytracingWaitFenceValue(g_glRaytracingCmd.tlasLastFenceValue);
+#endif
+
+ return g_glRaytracingCmd.tlasLastFenceValue;
+}
+
+
+// ============================================================
+// Scene builder state
+// ============================================================
+
+#ifndef GL_RAYTRACING_MAX_RENDER_WORLDS
+#define GL_RAYTRACING_MAX_RENDER_WORLDS 24
+#endif
+
+#ifndef GL_RAYTRACING_SCENE_HANDLE_T_DEFINED
+typedef uint32_t glRaytracingSceneHandle_t;
+#define GL_RAYTRACING_SCENE_HANDLE_T_DEFINED
+#endif
+
+// Internal material metadata encoded into D3D12's 24-bit shader-visible
+// InstanceID. Lower 16 bits remain caller/user ID; bits 16-23 are material flags.
+static const uint32_t GL_RAYTRACING_INSTANCE_USER_ID_MASK = 0x0000FFFFu;
+static const uint32_t GL_RAYTRACING_INSTANCE_MATERIAL_SHIFT = 16u;
+static const uint32_t GL_RAYTRACING_INSTANCE_MATERIAL_MASK = 0x000000FFu;
+
+struct glRaytracingMeshRecord_t
+{
+ uint32_t handle;
+ int alive;
+
+ glRaytracingMeshDesc_t descCpu;
+
+ std::vector verticesCpu;
+ std::vector indicesCpu;
+
+ glRaytracingBuffer_t vertexBuffer;
+ glRaytracingBuffer_t indexBuffer;
+
+ glRaytracingBuffer_t blasScratch;
+ glRaytracingBuffer_t blasResult[2];
+
+ UINT64 blasScratchSize;
+ UINT64 blasResultSize;
+
+ int blasBuilt;
+ int dirty;
+ UINT64 blasBuildFenceValue;
+ int currentBlasIndex;
+ uint32_t materialFlags;
+
+ glRaytracingMeshRecord_t()
+ {
+ handle = 0;
+ alive = 0;
+ memset(&descCpu, 0, sizeof(descCpu));
+ blasScratchSize = 0;
+ blasResultSize = 0;
+ blasBuilt = 0;
+ dirty = 0;
+ blasBuildFenceValue = 0;
+ currentBlasIndex = 0;
+ materialFlags = 0;
+ }
+};
+
+struct glRaytracingInstanceRecord_t
+{
+ uint32_t handle;
+ int alive;
+ glRaytracingInstanceDesc_t descCpu;
+ int dirty;
+ int cachedActive;
+ D3D12_GPU_VIRTUAL_ADDRESS cachedBlasGpuVA;
+ D3D12_RAYTRACING_INSTANCE_DESC cachedDescCpu;
+
+ glRaytracingInstanceRecord_t()
+ {
+ handle = 0;
+ alive = 0;
+ memset(&descCpu, 0, sizeof(descCpu));
+ dirty = 0;
+ cachedActive = 0;
+ cachedBlasGpuVA = 0;
+ memset(&cachedDescCpu, 0, sizeof(cachedDescCpu));
+ }
+};
+
+struct glRaytracingSceneUploadBuffer_t
+{
+ glRaytracingBuffer_t buffer;
+ UINT64 capacityBytes;
+ D3D12_RAYTRACING_INSTANCE_DESC* mapped;
+
+ glRaytracingSceneUploadBuffer_t()
+ {
+ capacityBytes = 0;
+ mapped = nullptr;
+ }
+};
+
+// One render world owns exactly one TLAS pair and its own list of geometry
+// instances. Mesh/BLAS resources stay shared across all worlds.
+struct glRaytracingRenderWorld_t
+{
+ uint32_t handle;
+ int alive;
+
+ std::vector instances;
+ std::vector activeInstanceIndices;
+ std::vector cpuInstanceDescs;
+ std::vector instanceHandleToIndex;
+
+ uint32_t nextInstanceHandle;
+
+ glRaytracingSceneUploadBuffer_t instanceDescUpload[2];
+ UINT64 instanceDescUploadFenceValue[2];
+ glRaytracingBuffer_t tlasScratch;
+ glRaytracingBuffer_t tlasResult[2];
+
+ UINT64 tlasScratchSize;
+ UINT64 tlasResultSize;
+
+ UINT activeInstanceCount;
+ UINT builtInstanceCount;
+
+ int tlasBuilt;
+ int tlasNeedsRebuild;
+ int tlasNeedsUpdate;
+ int currentTLASIndex;
+
+ glRaytracingRenderWorld_t()
+ {
+ handle = 0;
+ alive = 0;
+ nextInstanceHandle = 1;
+ instanceDescUploadFenceValue[0] = 0;
+ instanceDescUploadFenceValue[1] = 0;
+ tlasScratchSize = 0;
+ tlasResultSize = 0;
+ activeInstanceCount = 0;
+ builtInstanceCount = 0;
+ tlasBuilt = 0;
+ tlasNeedsRebuild = 1;
+ tlasNeedsUpdate = 1;
+ currentTLASIndex = 0;
+ }
+};
+
+struct glRaytracingSceneState_t
+{
+ std::vector meshes;
+ std::vector meshHandleToIndex;
+
+ uint32_t nextMeshHandle;
+
+ glRaytracingRenderWorld_t worlds[GL_RAYTRACING_MAX_RENDER_WORLDS];
+
+ int initialized;
+
+ glRaytracingSceneState_t()
+ {
+ nextMeshHandle = 1;
+ initialized = 0;
+ }
+};
+
+static glRaytracingSceneState_t g_glRaytracingScene;
+
+void glRaytracingClear(void);
+static void glRaytracingLightingResetDenoiseHistory(void);
+
+static void glRaytracingReleaseWorldResources(glRaytracingRenderWorld_t* world)
+{
+ if (!world)
+ return;
+
+ for (int i = 0; i < 2; ++i)
+ {
+ if (world->instanceDescUpload[i].buffer.resource && world->instanceDescUpload[i].mapped)
+ world->instanceDescUpload[i].buffer.resource->Unmap(0, nullptr);
+
+ world->instanceDescUpload[i] = glRaytracingSceneUploadBuffer_t();
+ world->tlasResult[i].resource.Reset();
+ }
+
+ world->instanceDescUploadFenceValue[0] = 0;
+ world->instanceDescUploadFenceValue[1] = 0;
+ world->tlasScratch.resource.Reset();
+ world->tlasScratchSize = 0;
+ world->tlasResultSize = 0;
+}
+
+static void glRaytracingResetWorldSlot(glRaytracingRenderWorld_t* world, uint32_t handle, int alive)
+{
+ if (!world)
+ return;
+
+ glRaytracingReleaseWorldResources(world);
+ *world = glRaytracingRenderWorld_t();
+ world->handle = handle;
+ world->alive = alive ? 1 : 0;
+ world->nextInstanceHandle = 1;
+}
+
+static int glRaytracingWorldHandleToSlot(glRaytracingSceneHandle_t worldHandle)
+{
+ if (worldHandle == 0 || worldHandle > GL_RAYTRACING_MAX_RENDER_WORLDS)
+ return -1;
+ return (int)(worldHandle - 1);
+}
+
+static glRaytracingRenderWorld_t* glRaytracingFindWorld(glRaytracingSceneHandle_t worldHandle)
+{
+ const int slot = glRaytracingWorldHandleToSlot(worldHandle);
+ if (slot < 0)
+ return nullptr;
+
+ glRaytracingRenderWorld_t& world = g_glRaytracingScene.worlds[slot];
+ if (!world.alive || world.handle != worldHandle)
+ return nullptr;
+
+ return &world;
+}
+
+static const glRaytracingRenderWorld_t* glRaytracingFindWorldConst(glRaytracingSceneHandle_t worldHandle)
+{
+ const int slot = glRaytracingWorldHandleToSlot(worldHandle);
+ if (slot < 0)
+ return nullptr;
+
+ const glRaytracingRenderWorld_t& world = g_glRaytracingScene.worlds[slot];
+ if (!world.alive || world.handle != worldHandle)
+ return nullptr;
+
+ return &world;
+}
+
+static void glRaytracingClearWorldContents(glRaytracingRenderWorld_t* world)
+{
+ if (!world)
+ return;
+
+ const uint32_t handle = world->handle;
+ const int alive = world->alive;
+
+ glRaytracingReleaseWorldResources(world);
+
+ world->instances.clear();
+ world->activeInstanceIndices.clear();
+ world->cpuInstanceDescs.clear();
+ world->instanceHandleToIndex.clear();
+
+ world->handle = handle;
+ world->alive = alive;
+ world->nextInstanceHandle = 1;
+ world->instanceDescUploadFenceValue[0] = 0;
+ world->instanceDescUploadFenceValue[1] = 0;
+ world->tlasScratchSize = 0;
+ world->tlasResultSize = 0;
+ world->activeInstanceCount = 0;
+ world->builtInstanceCount = 0;
+ world->tlasBuilt = 0;
+ world->tlasNeedsRebuild = 1;
+ world->tlasNeedsUpdate = 1;
+ world->currentTLASIndex = 0;
+}
+
+static void glRaytracingClearAllSceneStateInternal(void)
+{
+ for (int i = 0; i < GL_RAYTRACING_MAX_RENDER_WORLDS; ++i)
+ glRaytracingReleaseWorldResources(&g_glRaytracingScene.worlds[i]);
+
+ const int wasInitialized = g_glRaytracingScene.initialized;
+ g_glRaytracingScene = glRaytracingSceneState_t();
+ g_glRaytracingScene.initialized = wasInitialized;
+}
+
+static void glRaytracingMarkWorldNeedsRebuild(glRaytracingRenderWorld_t* world)
+{
+ if (!world || !world->alive)
+ return;
+
+ world->tlasNeedsRebuild = 1;
+ world->tlasNeedsUpdate = 0;
+ glRaytracingLightingResetDenoiseHistory();
+}
+
+static void glRaytracingMarkWorldNeedsUpdate(glRaytracingRenderWorld_t* world)
+{
+ if (!world || !world->alive)
+ return;
+
+ if (!world->tlasNeedsRebuild)
+ world->tlasNeedsUpdate = 1;
+ glRaytracingLightingResetDenoiseHistory();
+}
+
+static void glRaytracingMarkAllWorldsNeedRebuild(void)
+{
+ for (int i = 0; i < GL_RAYTRACING_MAX_RENDER_WORLDS; ++i)
+ {
+ if (g_glRaytracingScene.worlds[i].alive)
+ glRaytracingMarkWorldNeedsRebuild(&g_glRaytracingScene.worlds[i]);
+ }
+
+ glRaytracingLightingResetDenoiseHistory();
+}
+
+static uint32_t glRaytracingCountAliveInstances(const glRaytracingRenderWorld_t* world)
+{
+ if (!world)
+ return 0;
+
+ uint32_t count = 0;
+ for (size_t i = 0; i < world->instances.size(); ++i)
+ {
+ if (world->instances[i].alive)
+ ++count;
+ }
+ return count;
+}
+
+static void glRaytracingEnsureMeshHandleTable(uint32_t handle)
+{
+ if (handle >= g_glRaytracingScene.meshHandleToIndex.size())
+ g_glRaytracingScene.meshHandleToIndex.resize((size_t)handle + 1, -1);
+}
+
+static void glRaytracingEnsureInstanceHandleTable(glRaytracingRenderWorld_t* world, uint32_t handle)
+{
+ if (!world)
+ return;
+
+ if (handle >= world->instanceHandleToIndex.size())
+ world->instanceHandleToIndex.resize((size_t)handle + 1, -1);
+}
+
+static glRaytracingBuffer_t* glRaytracingGetMeshCurrentBLAS(glRaytracingMeshRecord_t* mesh)
+{
+ if (!mesh)
+ return nullptr;
+ return &mesh->blasResult[mesh->currentBlasIndex & 1];
+}
+
+static const glRaytracingBuffer_t* glRaytracingGetMeshCurrentBLASConst(const glRaytracingMeshRecord_t* mesh)
+{
+ if (!mesh)
+ return nullptr;
+ return &mesh->blasResult[mesh->currentBlasIndex & 1];
+}
+
+static int glRaytracingGetInactiveTLASIndex(const glRaytracingRenderWorld_t* world)
+{
+ if (!world)
+ return 0;
+ return world->currentTLASIndex ^ 1;
+}
+
+static glRaytracingSceneUploadBuffer_t* glRaytracingGetBuildInstanceUpload(glRaytracingRenderWorld_t* world)
+{
+ return &world->instanceDescUpload[glRaytracingGetInactiveTLASIndex(world)];
+}
+
+static glRaytracingBuffer_t* glRaytracingGetCurrentTLASBuffer(glRaytracingRenderWorld_t* world)
+{
+ return &world->tlasResult[world->currentTLASIndex & 1];
+}
+
+static const glRaytracingBuffer_t* glRaytracingGetCurrentTLASBufferConst(const glRaytracingRenderWorld_t* world)
+{
+ return &world->tlasResult[world->currentTLASIndex & 1];
+}
+
+static glRaytracingBuffer_t* glRaytracingGetBuildTLASBuffer(glRaytracingRenderWorld_t* world)
+{
+ return &world->tlasResult[glRaytracingGetInactiveTLASIndex(world)];
+}
+
+static int glRaytracingEnsureTLASBuffers(
+ glRaytracingRenderWorld_t* world,
+ const D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_INPUTS* inputs)
+{
+ if (!world)
+ return 0;
+
+ D3D12_RAYTRACING_ACCELERATION_STRUCTURE_PREBUILD_INFO prebuild = {};
+ g_glRaytracingCmd.device->GetRaytracingAccelerationStructurePrebuildInfo(inputs, &prebuild);
+
+ if (prebuild.ResultDataMaxSizeInBytes == 0)
+ {
+ glRaytracingFatal("TLAS prebuild size is zero");
+ return 0;
+ }
+
+ const UINT64 requiredScratch = glRaytracingAlignUp(
+ prebuild.ScratchDataSizeInBytes,
+ D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BYTE_ALIGNMENT);
+
+ const UINT64 requiredResult = glRaytracingAlignUp(
+ prebuild.ResultDataMaxSizeInBytes,
+ D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BYTE_ALIGNMENT);
+
+ const bool resizingScratch = world->tlasScratch.resource &&
+ world->tlasScratchSize < requiredScratch;
+ const bool resizingResult = (world->tlasResult[0].resource || world->tlasResult[1].resource) &&
+ world->tlasResultSize < requiredResult;
+ if (resizingScratch || resizingResult)
+ {
+ // Releasing/reallocating a TLAS resource can invalidate an in-flight ray
+ // dispatch that still references the old resource. This resize path is rare,
+ // so prefer correctness over complex deferred destruction.
+ glRaytracingWaitIdle();
+ }
+
+ if (!world->tlasScratch.resource ||
+ world->tlasScratchSize < requiredScratch)
+ {
+ world->tlasScratch.resource.Reset();
+ world->tlasScratch = glRaytracingCreateBuffer(
+ g_glRaytracingCmd.device.Get(),
+ requiredScratch,
+ D3D12_HEAP_TYPE_DEFAULT,
+ D3D12_RESOURCE_STATE_COMMON,
+ D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS);
+
+ if (!world->tlasScratch.resource)
+ return 0;
+
+ world->tlasScratchSize = requiredScratch;
+ }
+
+ for (int i = 0; i < 2; ++i)
+ {
+ if (!world->tlasResult[i].resource ||
+ world->tlasResultSize < requiredResult)
+ {
+ world->tlasResult[i].resource.Reset();
+ world->tlasResult[i] = glRaytracingCreateBuffer(
+ g_glRaytracingCmd.device.Get(),
+ requiredResult,
+ D3D12_HEAP_TYPE_DEFAULT,
+ D3D12_RESOURCE_STATE_RAYTRACING_ACCELERATION_STRUCTURE,
+ D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS);
+
+ if (!world->tlasResult[i].resource)
+ return 0;
+ }
+ }
+
+ world->tlasResultSize = requiredResult;
+ return 1;
+}
+
+static glRaytracingMeshRecord_t* glRaytracingFindMesh(uint32_t handle)
+{
+ if (handle == 0 || handle >= g_glRaytracingScene.meshHandleToIndex.size())
+ return nullptr;
+
+ const int index = g_glRaytracingScene.meshHandleToIndex[handle];
+ if (index < 0 || (size_t)index >= g_glRaytracingScene.meshes.size())
+ return nullptr;
+
+ glRaytracingMeshRecord_t& mesh = g_glRaytracingScene.meshes[(size_t)index];
+ if (!mesh.alive || mesh.handle != handle)
+ return nullptr;
+
+ return &mesh;
+}
+
+static const glRaytracingMeshRecord_t* glRaytracingFindMeshConst(uint32_t handle)
+{
+ if (handle == 0 || handle >= g_glRaytracingScene.meshHandleToIndex.size())
+ return nullptr;
+
+ const int index = g_glRaytracingScene.meshHandleToIndex[handle];
+ if (index < 0 || (size_t)index >= g_glRaytracingScene.meshes.size())
+ return nullptr;
+
+ const glRaytracingMeshRecord_t& mesh = g_glRaytracingScene.meshes[(size_t)index];
+ if (!mesh.alive || mesh.handle != handle)
+ return nullptr;
+
+ return &mesh;
+}
+
+static glRaytracingInstanceRecord_t* glRaytracingFindInstance(glRaytracingRenderWorld_t* world, uint32_t handle)
+{
+ if (!world || handle == 0 || handle >= world->instanceHandleToIndex.size())
+ return nullptr;
+
+ const int index = world->instanceHandleToIndex[handle];
+ if (index < 0 || (size_t)index >= world->instances.size())
+ return nullptr;
+
+ glRaytracingInstanceRecord_t& inst = world->instances[(size_t)index];
+ if (!inst.alive || inst.handle != handle)
+ return nullptr;
+
+ return &inst;
+}
+
+static const glRaytracingInstanceRecord_t* glRaytracingFindInstanceConst(const glRaytracingRenderWorld_t* world, uint32_t handle)
+{
+ if (!world || handle == 0 || handle >= world->instanceHandleToIndex.size())
+ return nullptr;
+
+ const int index = world->instanceHandleToIndex[handle];
+ if (index < 0 || (size_t)index >= world->instances.size())
+ return nullptr;
+
+ const glRaytracingInstanceRecord_t& inst = world->instances[(size_t)index];
+ if (!inst.alive || inst.handle != handle)
+ return nullptr;
+
+ return &inst;
+}
+
+static int glRaytracingEnsureMeshScratch(glRaytracingMeshRecord_t* mesh, UINT64 requiredScratch)
+{
+ if (!mesh)
+ return 0;
+
+ requiredScratch = glRaytracingAlignUp(requiredScratch, D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BYTE_ALIGNMENT);
+
+ if (!mesh->blasScratch.resource || mesh->blasScratchSize < requiredScratch)
+ {
+ glRaytracingWaitFenceValue(mesh->blasBuildFenceValue);
+ mesh->blasScratch.resource.Reset();
+ mesh->blasScratch = glRaytracingCreateBuffer(
+ g_glRaytracingCmd.device.Get(),
+ requiredScratch,
+ D3D12_HEAP_TYPE_DEFAULT,
+ D3D12_RESOURCE_STATE_COMMON,
+ D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS);
+
+ if (!mesh->blasScratch.resource)
+ return 0;
+
+ mesh->blasScratchSize = requiredScratch;
+ }
+
+ return 1;
+}
+
+static int glRaytracingEnsureMeshResultBuffers(glRaytracingMeshRecord_t* mesh, UINT64 requiredResult)
+{
+ if (!mesh)
+ return 0;
+
+ requiredResult = glRaytracingAlignUp(requiredResult, D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BYTE_ALIGNMENT);
+
+ const int resultCount = mesh->descCpu.allowUpdate ? 2 : 1;
+ for (int i = 0; i < resultCount; ++i)
+ {
+ if (!mesh->blasResult[i].resource || mesh->blasResultSize < requiredResult)
+ {
+ glRaytracingWaitFenceValue(mesh->blasBuildFenceValue);
+ mesh->blasResult[i].resource.Reset();
+ mesh->blasResult[i] = glRaytracingCreateBuffer(
+ g_glRaytracingCmd.device.Get(),
+ requiredResult,
+ D3D12_HEAP_TYPE_DEFAULT,
+ D3D12_RESOURCE_STATE_RAYTRACING_ACCELERATION_STRUCTURE,
+ D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS);
+
+ if (!mesh->blasResult[i].resource)
+ return 0;
+ }
+ }
+
+ if (!mesh->descCpu.allowUpdate && mesh->blasResult[1].resource)
+ {
+ glRaytracingWaitFenceValue(mesh->blasBuildFenceValue);
+ mesh->blasResult[1].resource.Reset();
+ }
+
+ mesh->blasResultSize = requiredResult;
+ return 1;
+}
+
+static inline void glRaytracingBuildInstanceDesc(
+ D3D12_RAYTRACING_INSTANCE_DESC* outDesc,
+ const glRaytracingInstanceRecord_t& inst,
+ uint32_t meshMaterialFlags,
+ D3D12_GPU_VIRTUAL_ADDRESS blasGpuVA)
+{
+ memcpy(outDesc->Transform, inst.descCpu.transform, sizeof(float) * 12);
+
+ // InstanceID is 24-bit in D3D12_RAYTRACING_INSTANCE_DESC. Preserve the
+ // caller's lower 16 bits, then pack material flags into bits 16-23 so the
+ // any-hit shader can decide whether visibility rays pass through the hit.
+ //
+ // Accept both sources:
+ // - meshMaterialFlags set by glRaytracingSetMeshMaterialFlags()/shim mesh tags
+ // - already-encoded high InstanceID bits for direct low-level callers
+ const uint32_t userInstanceId = inst.descCpu.instanceID & GL_RAYTRACING_INSTANCE_USER_ID_MASK;
+ const uint32_t instanceMaterialFlags =
+ (inst.descCpu.instanceID >> GL_RAYTRACING_INSTANCE_MATERIAL_SHIFT) & GL_RAYTRACING_INSTANCE_MATERIAL_MASK;
+ const uint32_t combinedMaterialFlags =
+ (meshMaterialFlags | instanceMaterialFlags) & GL_RAYTRACING_INSTANCE_MATERIAL_MASK;
+ const uint32_t materialBits = combinedMaterialFlags << GL_RAYTRACING_INSTANCE_MATERIAL_SHIFT;
+ outDesc->InstanceID = userInstanceId | materialBits;
+ outDesc->InstanceMask = (UINT8)(inst.descCpu.mask & 0xFFu);
+ outDesc->InstanceContributionToHitGroupIndex = 0;
+ outDesc->Flags = D3D12_RAYTRACING_INSTANCE_FLAG_NONE;
+ outDesc->AccelerationStructure = blasGpuVA;
+}
+
+static void glRaytracingInvalidateInstanceCache(glRaytracingInstanceRecord_t* inst)
+{
+ if (!inst)
+ return;
+
+ inst->cachedActive = 0;
+ inst->cachedBlasGpuVA = 0;
+ memset(&inst->cachedDescCpu, 0, sizeof(inst->cachedDescCpu));
+}
+
+static int glRaytracingResolveInstanceDesc(
+ glRaytracingInstanceRecord_t* inst,
+ D3D12_RAYTRACING_INSTANCE_DESC* outDesc,
+ D3D12_GPU_VIRTUAL_ADDRESS* outBlasGpuVA)
+{
+ if (!inst || !inst->alive)
+ return 0;
+
+ const glRaytracingMeshRecord_t* mesh = glRaytracingFindMeshConst(inst->descCpu.meshHandle);
+ if (!mesh || !mesh->blasBuilt)
+ return 0;
+
+ const glRaytracingBuffer_t* blas = glRaytracingGetMeshCurrentBLASConst(mesh);
+ if (!blas || !blas->resource || blas->gpuVA == 0)
+ return 0;
+
+ if (outDesc)
+ glRaytracingBuildInstanceDesc(outDesc, *inst, mesh->materialFlags, blas->gpuVA);
+ if (outBlasGpuVA)
+ *outBlasGpuVA = blas->gpuVA;
+ return 1;
+}
+
+static int glRaytracingRebuildActiveInstanceCache(glRaytracingRenderWorld_t* world)
+{
+ if (!world)
+ return 0;
+
+ world->activeInstanceIndices.clear();
+ world->cpuInstanceDescs.clear();
+ world->activeInstanceIndices.reserve(world->instances.size());
+ world->cpuInstanceDescs.reserve(world->instances.size());
+
+ for (size_t i = 0; i < world->instances.size(); ++i)
+ {
+ glRaytracingInstanceRecord_t& inst = world->instances[i];
+ glRaytracingInvalidateInstanceCache(&inst);
+
+ if (!inst.alive)
+ continue;
+
+ D3D12_RAYTRACING_INSTANCE_DESC desc = {};
+ D3D12_GPU_VIRTUAL_ADDRESS blasGpuVA = 0;
+ if (!glRaytracingResolveInstanceDesc(&inst, &desc, &blasGpuVA))
+ continue;
+
+ inst.cachedActive = 1;
+ inst.cachedBlasGpuVA = blasGpuVA;
+ inst.cachedDescCpu = desc;
+ inst.dirty = 0;
+
+ world->activeInstanceIndices.push_back((int)i);
+ world->cpuInstanceDescs.push_back(desc);
+ }
+
+ world->activeInstanceCount = (UINT)world->cpuInstanceDescs.size();
+ return 1;
+}
+
+static int glRaytracingRefreshDirtyInstanceCache(glRaytracingRenderWorld_t* world)
+{
+ if (!world)
+ return 0;
+
+ for (size_t listIndex = 0; listIndex < world->activeInstanceIndices.size(); ++listIndex)
+ {
+ const int instIndex = world->activeInstanceIndices[listIndex];
+ if (instIndex < 0 || (size_t)instIndex >= world->instances.size())
+ return 0;
+
+ glRaytracingInstanceRecord_t& inst = world->instances[(size_t)instIndex];
+ if (!inst.alive)
+ return 0;
+
+ D3D12_RAYTRACING_INSTANCE_DESC desc = {};
+ D3D12_GPU_VIRTUAL_ADDRESS blasGpuVA = 0;
+ if (!glRaytracingResolveInstanceDesc(&inst, &desc, &blasGpuVA))
+ return 0;
+
+ if (inst.dirty || !inst.cachedActive || inst.cachedBlasGpuVA != blasGpuVA)
+ {
+ inst.cachedActive = 1;
+ inst.cachedBlasGpuVA = blasGpuVA;
+ inst.cachedDescCpu = desc;
+ world->cpuInstanceDescs[listIndex] = desc;
+ }
+
+ inst.dirty = 0;
+ }
+
+ world->activeInstanceCount = (UINT)world->cpuInstanceDescs.size();
+ return 1;
+}
+
+static int glRaytracingEnsureSceneUploadBuffer(glRaytracingRenderWorld_t* world, UINT64 requiredBytes);
+
+static int glRaytracingUploadCachedInstanceDescs(glRaytracingRenderWorld_t* world)
+{
+ if (!world)
+ return 0;
+
+ const UINT activeCount = (UINT)world->cpuInstanceDescs.size();
+ const UINT64 instBytes = glRaytracingAlignUp(
+ (UINT64)activeCount * (UINT64)sizeof(D3D12_RAYTRACING_INSTANCE_DESC),
+ D3D12_RAYTRACING_INSTANCE_DESCS_BYTE_ALIGNMENT);
+
+ const int uploadIndex = glRaytracingGetInactiveTLASIndex(world);
+ glRaytracingWaitFenceValue(world->instanceDescUploadFenceValue[uploadIndex]);
+
+ if (!glRaytracingEnsureSceneUploadBuffer(world, instBytes))
+ return 0;
+
+ glRaytracingSceneUploadBuffer_t* upload = glRaytracingGetBuildInstanceUpload(world);
+ if (!upload->mapped)
+ return 0;
+
+ if (activeCount > 0)
+ memcpy(upload->mapped, world->cpuInstanceDescs.data(), (size_t)activeCount * sizeof(D3D12_RAYTRACING_INSTANCE_DESC));
+
+ return 1;
+}
+
+static int glRaytracingUploadMeshBuffers(glRaytracingMeshRecord_t* mesh);
+
+static int glRaytracingBuildDirtyMeshesInternal(void)
+{
+ std::vector dirtyMeshes;
+ dirtyMeshes.reserve(g_glRaytracingScene.meshes.size());
+
+ for (size_t i = 0; i < g_glRaytracingScene.meshes.size(); ++i)
+ {
+ glRaytracingMeshRecord_t& mesh = g_glRaytracingScene.meshes[i];
+ if (!mesh.alive)
+ continue;
+
+ if (!mesh.blasBuilt || mesh.dirty)
+ dirtyMeshes.push_back(&mesh);
+ }
+
+ if (dirtyMeshes.empty())
+ return 1;
+
+ struct glRaytracingMeshBuildInfo_t
+ {
+ glRaytracingMeshRecord_t* mesh;
+ D3D12_RAYTRACING_GEOMETRY_DESC geomDesc;
+ D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_INPUTS inputs;
+ D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_DESC buildDesc;
+ ID3D12Resource* barrierResource;
+ int newBlasIndex;
+ };
+
+ std::vector builds;
+ builds.resize(dirtyMeshes.size());
+
+ for (size_t i = 0; i < dirtyMeshes.size(); ++i)
+ {
+ glRaytracingMeshRecord_t* mesh = dirtyMeshes[i];
+ if (!mesh->vertexBuffer.resource || !mesh->indexBuffer.resource)
+ {
+ if (!glRaytracingUploadMeshBuffers(mesh))
+ return 0;
+ }
+
+ glRaytracingMeshBuildInfo_t& info = builds[i];
+ memset(&info, 0, sizeof(info));
+ info.mesh = mesh;
+
+ info.geomDesc.Type = D3D12_RAYTRACING_GEOMETRY_TYPE_TRIANGLES;
+ const bool meshIsGlass = (mesh->materialFlags & GL_RAYTRACING_MATERIAL_FLAG_GLASS) != 0u;
+ info.geomDesc.Flags = (mesh->descCpu.opaque && !meshIsGlass)
+ ? D3D12_RAYTRACING_GEOMETRY_FLAG_OPAQUE
+ : D3D12_RAYTRACING_GEOMETRY_FLAG_NONE;
+ info.geomDesc.Triangles.Transform3x4 = 0;
+ info.geomDesc.Triangles.IndexFormat = DXGI_FORMAT_R32_UINT;
+ info.geomDesc.Triangles.VertexFormat = DXGI_FORMAT_R32G32B32_FLOAT;
+ info.geomDesc.Triangles.IndexCount = (UINT)mesh->indicesCpu.size();
+ info.geomDesc.Triangles.VertexCount = (UINT)mesh->verticesCpu.size();
+ info.geomDesc.Triangles.IndexBuffer = mesh->indexBuffer.gpuVA;
+ info.geomDesc.Triangles.VertexBuffer.StartAddress = mesh->vertexBuffer.gpuVA;
+ info.geomDesc.Triangles.VertexBuffer.StrideInBytes = sizeof(glRaytracingVertex_t);
+
+ info.inputs.Type = D3D12_RAYTRACING_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL;
+ info.inputs.DescsLayout = D3D12_ELEMENTS_LAYOUT_ARRAY;
+ info.inputs.NumDescs = 1;
+ info.inputs.pGeometryDescs = &info.geomDesc;
+ info.inputs.Flags = mesh->descCpu.allowUpdate
+ ? (D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BUILD_FLAG_PREFER_FAST_TRACE |
+ D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BUILD_FLAG_ALLOW_UPDATE)
+ : D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BUILD_FLAG_PREFER_FAST_TRACE;
+
+ const bool canUpdateInPlace = (mesh->blasBuilt != 0) && (mesh->descCpu.allowUpdate != 0);
+ if (canUpdateInPlace)
+ info.inputs.Flags |= D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BUILD_FLAG_PERFORM_UPDATE;
+
+ D3D12_RAYTRACING_ACCELERATION_STRUCTURE_PREBUILD_INFO prebuild = {};
+ g_glRaytracingCmd.device->GetRaytracingAccelerationStructurePrebuildInfo(&info.inputs, &prebuild);
+ if (prebuild.ResultDataMaxSizeInBytes == 0)
+ {
+ glRaytracingFatal("BLAS prebuild size is zero");
+ return 0;
+ }
+
+ if (!glRaytracingEnsureMeshScratch(mesh, prebuild.ScratchDataSizeInBytes))
+ return 0;
+ if (!glRaytracingEnsureMeshResultBuffers(mesh, prebuild.ResultDataMaxSizeInBytes))
+ return 0;
+
+ const int oldIndex = mesh->currentBlasIndex & 1;
+ info.newBlasIndex = (mesh->descCpu.allowUpdate && mesh->blasBuilt) ? (oldIndex ^ 1) : oldIndex;
+
+ info.buildDesc.Inputs = info.inputs;
+ info.buildDesc.ScratchAccelerationStructureData = mesh->blasScratch.gpuVA;
+ info.buildDesc.DestAccelerationStructureData = mesh->blasResult[info.newBlasIndex].gpuVA;
+ info.buildDesc.SourceAccelerationStructureData = 0;
+
+ if (canUpdateInPlace)
+ info.buildDesc.SourceAccelerationStructureData = mesh->blasResult[oldIndex].gpuVA;
+
+ info.barrierResource = mesh->blasResult[info.newBlasIndex].resource.Get();
+ }
+
+ if (!glRaytracingBeginBlasCmd())
+ return 0;
+
+ for (size_t i = 0; i < builds.size(); ++i)
+ {
+ g_glRaytracingCmd.blasCmdList->BuildRaytracingAccelerationStructure(&builds[i].buildDesc, 0, nullptr);
+
+ D3D12_RESOURCE_BARRIER uav = {};
+ uav.Type = D3D12_RESOURCE_BARRIER_TYPE_UAV;
+ uav.UAV.pResource = builds[i].barrierResource;
+ g_glRaytracingCmd.blasCmdList->ResourceBarrier(1, &uav);
+ }
+
+ const UINT64 blasFenceValue = glRaytracingEndBlasCmd();
+ if (!blasFenceValue)
+ return 0;
+
+ // Do not block the CPU here. The BLAS build was submitted before any TLAS
+ // build/lighting work that consumes it, and the shared D3D12 queue preserves
+ // that order. Command allocator reuse is protected by the ring fence in
+ // glRaytracingBeginBlasCmd().
+ for (size_t i = 0; i < builds.size(); ++i)
+ {
+ glRaytracingMeshRecord_t* mesh = builds[i].mesh;
+ mesh->currentBlasIndex = builds[i].newBlasIndex;
+ mesh->blasBuildFenceValue = blasFenceValue;
+ mesh->blasBuilt = 1;
+ mesh->dirty = 0;
+ }
+
+ glRaytracingMarkAllWorldsNeedRebuild();
+ return 1;
+}
+
+static int glRaytracingUploadMeshBuffers(glRaytracingMeshRecord_t* mesh)
+{
+ if (!mesh)
+ return 0;
+
+ if (mesh->verticesCpu.empty() || mesh->indicesCpu.empty())
+ return 0;
+
+ const UINT64 vbBytes = UINT64(mesh->verticesCpu.size()) * sizeof(glRaytracingVertex_t);
+ const UINT64 ibBytes = UINT64(mesh->indicesCpu.size()) * sizeof(uint32_t);
+
+ mesh->vertexBuffer = glRaytracingCreateBuffer(
+ g_glRaytracingCmd.device.Get(),
+ vbBytes,
+ D3D12_HEAP_TYPE_UPLOAD,
+ D3D12_RESOURCE_STATE_GENERIC_READ,
+ D3D12_RESOURCE_FLAG_NONE);
+
+ mesh->indexBuffer = glRaytracingCreateBuffer(
+ g_glRaytracingCmd.device.Get(),
+ ibBytes,
+ D3D12_HEAP_TYPE_UPLOAD,
+ D3D12_RESOURCE_STATE_GENERIC_READ,
+ D3D12_RESOURCE_FLAG_NONE);
+
+ if (!mesh->vertexBuffer.resource || !mesh->indexBuffer.resource)
+ return 0;
+
+ glRaytracingMapCopy(mesh->vertexBuffer.resource.Get(), mesh->verticesCpu.data(), (size_t)vbBytes);
+ glRaytracingMapCopy(mesh->indexBuffer.resource.Get(), mesh->indicesCpu.data(), (size_t)ibBytes);
+
+ return 1;
+}
+
+static int glRaytracingBuildMeshInternal(glRaytracingMeshRecord_t* mesh)
+{
+ if (!mesh)
+ return 0;
+
+ const int oldDirty = mesh->dirty;
+ mesh->dirty = 1;
+ const int ok = glRaytracingBuildDirtyMeshesInternal();
+ if (!ok)
+ mesh->dirty = oldDirty;
+ return ok;
+}
+
+static int glRaytracingEnsureSceneUploadBuffer(glRaytracingRenderWorld_t* world, UINT64 requiredBytes)
+{
+ if (!world)
+ return 0;
+
+ glRaytracingSceneUploadBuffer_t* upload = glRaytracingGetBuildInstanceUpload(world);
+
+ if (requiredBytes == 0)
+ requiredBytes = D3D12_RAYTRACING_INSTANCE_DESCS_BYTE_ALIGNMENT;
+
+ requiredBytes = glRaytracingAlignUp(
+ requiredBytes,
+ D3D12_RAYTRACING_INSTANCE_DESCS_BYTE_ALIGNMENT);
+
+ if (upload->buffer.resource &&
+ upload->capacityBytes >= requiredBytes &&
+ upload->mapped)
+ {
+ return 1;
+ }
+
+ if (upload->buffer.resource && upload->mapped)
+ upload->buffer.resource->Unmap(0, nullptr);
+
+ upload->mapped = nullptr;
+ upload->buffer.resource.Reset();
+ upload->capacityBytes = 0;
+
+ upload->buffer = glRaytracingCreateBuffer(
+ g_glRaytracingCmd.device.Get(),
+ requiredBytes,
+ D3D12_HEAP_TYPE_UPLOAD,
+ D3D12_RESOURCE_STATE_GENERIC_READ,
+ D3D12_RESOURCE_FLAG_NONE);
+
+ if (!upload->buffer.resource)
+ return 0;
+
+ void* mapped = nullptr;
+ D3D12_RANGE readRange = {};
+ if (FAILED(upload->buffer.resource->Map(0, &readRange, &mapped)) || !mapped)
+ {
+ upload->buffer.resource.Reset();
+ return 0;
+ }
+
+ upload->mapped = (D3D12_RAYTRACING_INSTANCE_DESC*)mapped;
+ upload->capacityBytes = requiredBytes;
+ return 1;
+}
+
+static int glRaytracingBuildSceneInternal(glRaytracingRenderWorld_t* world)
+{
+ if (!world || !world->alive)
+ return 0;
+
+ UINT aliveCount = 0;
+ int anyDirty = 0;
+ int needsRebuild = world->tlasNeedsRebuild;
+ int needsUpdate = world->tlasNeedsUpdate;
+
+ for (size_t i = 0; i < world->instances.size(); ++i)
+ {
+ const glRaytracingInstanceRecord_t& inst = world->instances[i];
+ if (!inst.alive)
+ continue;
+
+ ++aliveCount;
+ if (inst.dirty)
+ anyDirty = 1;
+ }
+
+ if (aliveCount == 0)
+ {
+ world->activeInstanceIndices.clear();
+ world->cpuInstanceDescs.clear();
+ world->activeInstanceCount = 0;
+ world->builtInstanceCount = 0;
+ world->tlasBuilt = 0;
+ world->tlasNeedsRebuild = 0;
+ world->tlasNeedsUpdate = 0;
+ return 1;
+ }
+
+ if (!world->tlasBuilt)
+ needsRebuild = 1;
+
+ if ((UINT)world->activeInstanceIndices.size() != world->builtInstanceCount)
+ needsRebuild = 1;
+
+ if (needsRebuild)
+ {
+ if (!glRaytracingRebuildActiveInstanceCache(world))
+ return 0;
+ }
+ else
+ {
+ if (!needsUpdate && !anyDirty)
+ {
+ world->activeInstanceCount = (UINT)world->cpuInstanceDescs.size();
+ return 1;
+ }
+
+ if (!glRaytracingRefreshDirtyInstanceCache(world))
+ {
+ world->tlasNeedsRebuild = 1;
+ if (!glRaytracingRebuildActiveInstanceCache(world))
+ return 0;
+ needsRebuild = 1;
+ }
+ }
+
+ const UINT activeCount = (UINT)world->cpuInstanceDescs.size();
+ if (activeCount == 0)
+ {
+ world->activeInstanceCount = 0;
+ world->builtInstanceCount = 0;
+ world->tlasBuilt = 0;
+ world->tlasNeedsRebuild = 0;
+ world->tlasNeedsUpdate = 0;
+ return 1;
+ }
+
+ if (!world->tlasBuilt || activeCount != world->builtInstanceCount)
+ needsRebuild = 1;
+
+ if (!glRaytracingUploadCachedInstanceDescs(world))
+ return 0;
+
+ glRaytracingSceneUploadBuffer_t* upload = glRaytracingGetBuildInstanceUpload(world);
+
+ D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_INPUTS inputs = {};
+ inputs.Type = D3D12_RAYTRACING_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL;
+ inputs.DescsLayout = D3D12_ELEMENTS_LAYOUT_ARRAY;
+ inputs.NumDescs = activeCount;
+ inputs.InstanceDescs = upload->buffer.gpuVA;
+ inputs.Flags =
+ D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BUILD_FLAG_PREFER_FAST_TRACE |
+ D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BUILD_FLAG_ALLOW_UPDATE;
+
+ if (!glRaytracingEnsureTLASBuffers(world, &inputs))
+ return 0;
+
+ const int buildTLASIndex = glRaytracingGetInactiveTLASIndex(world);
+ glRaytracingBuffer_t* dstTLAS = glRaytracingGetBuildTLASBuffer(world);
+ const glRaytracingBuffer_t* srcTLAS = glRaytracingGetCurrentTLASBufferConst(world);
+
+ // The TLAS build is queued after any pending BLAS builds on the same D3D12
+ // queue, so GPU ordering is sufficient and a CPU wait would stall the frame.
+ if (!glRaytracingBeginTlasCmd())
+ return 0;
+
+ D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_DESC buildDesc = {};
+ buildDesc.Inputs = inputs;
+ buildDesc.ScratchAccelerationStructureData = world->tlasScratch.gpuVA;
+ buildDesc.DestAccelerationStructureData = dstTLAS->gpuVA;
+ buildDesc.SourceAccelerationStructureData = 0;
+
+ if (!needsRebuild && world->tlasBuilt)
+ {
+ buildDesc.Inputs.Flags |= D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BUILD_FLAG_PERFORM_UPDATE;
+ buildDesc.SourceAccelerationStructureData = srcTLAS->gpuVA;
+ }
+
+ g_glRaytracingCmd.tlasCmdList->BuildRaytracingAccelerationStructure(&buildDesc, 0, nullptr);
+
+ D3D12_RESOURCE_BARRIER uav = {};
+ uav.Type = D3D12_RESOURCE_BARRIER_TYPE_UAV;
+ uav.UAV.pResource = dstTLAS->resource.Get();
+ g_glRaytracingCmd.tlasCmdList->ResourceBarrier(1, &uav);
+
+ const UINT64 tlasFenceValue = glRaytracingEndTlasCmd();
+ if (!tlasFenceValue)
+ return 0;
+
+ // Keep TLAS builds asynchronous. Later ray dispatches are submitted to the
+ // same queue after this command list, so the GPU sees a complete TLAS before
+ // tracing without forcing the CPU to wait every update. The upload buffer is
+ // fence-tagged so the CPU does not overwrite instance descriptors still being
+ // consumed by an in-flight TLAS build.
+ world->instanceDescUploadFenceValue[buildTLASIndex] = tlasFenceValue;
+ world->currentTLASIndex = buildTLASIndex;
+ world->activeInstanceCount = activeCount;
+ world->builtInstanceCount = activeCount;
+ world->tlasBuilt = 1;
+ world->tlasNeedsRebuild = 0;
+ world->tlasNeedsUpdate = 0;
+
+ for (size_t i = 0; i < world->instances.size(); ++i)
+ {
+ if (world->instances[i].alive)
+ world->instances[i].dirty = 0;
+ }
+
+ return 1;
+}
+
+static void glRaytracingInvalidateInstancesForMesh(uint32_t meshHandle, int deleteInstances)
+{
+ for (int w = 0; w < GL_RAYTRACING_MAX_RENDER_WORLDS; ++w)
+ {
+ glRaytracingRenderWorld_t& world = g_glRaytracingScene.worlds[w];
+ if (!world.alive)
+ continue;
+
+ int touched = 0;
+ for (size_t i = 0; i < world.instances.size(); ++i)
+ {
+ glRaytracingInstanceRecord_t& inst = world.instances[i];
+ if (inst.alive && inst.descCpu.meshHandle == meshHandle)
+ {
+ glRaytracingInvalidateInstanceCache(&inst);
+ inst.dirty = 1;
+ touched = 1;
+
+ if (deleteInstances)
+ {
+ inst.alive = 0;
+ if (inst.handle < world.instanceHandleToIndex.size())
+ world.instanceHandleToIndex[inst.handle] = -1;
+ }
+ }
+ }
+
+ if (touched)
+ glRaytracingMarkWorldNeedsRebuild(&world);
+ }
+}
+
+// ============================================================
+// Scene public API
+// ============================================================
+
+int glRaytracingInit(void)
+{
+ std::lock_guard lock(g_glRaytracingMutex);
+
+ if (g_glRaytracingScene.initialized)
+ return 1;
+
+ if (!glRaytracingInitCmdContext())
+ return 0;
+
+ g_glRaytracingScene.initialized = 1;
+
+ glRaytracingLog("glRaytracingInit ok");
+ return 1;
+}
+
+void glRaytracingShutdown(void)
+{
+ std::lock_guard lock(g_glRaytracingMutex);
+
+ if (!g_glRaytracingScene.initialized)
+ return;
+
+ glRaytracingWaitIdle();
+ glRaytracingClearAllSceneStateInternal();
+ g_glRaytracingScene = glRaytracingSceneState_t();
+ glRaytracingShutdownCmdContext();
+}
+
+void glRaytracingClear(void)
+{
+ std::lock_guard lock(g_glRaytracingMutex);
+
+ glRaytracingWaitIdle();
+ glRaytracingClearAllSceneStateInternal();
+}
+
+glRaytracingSceneHandle_t glRaytracingCreateScene(void)
+{
+ std::lock_guard lock(g_glRaytracingMutex);
+
+ if (!g_glRaytracingScene.initialized)
+ return 0;
+
+ for (uint32_t i = 0; i < GL_RAYTRACING_MAX_RENDER_WORLDS; ++i)
+ {
+ glRaytracingRenderWorld_t& world = g_glRaytracingScene.worlds[i];
+ if (!world.alive)
+ {
+ const uint32_t handle = i + 1;
+ glRaytracingResetWorldSlot(&world, handle, 1);
+ return handle;
+ }
+ }
+
+ return 0;
+}
+
+void glRaytracingClearScene(glRaytracingSceneHandle_t worldHandle)
+{
+ std::lock_guard lock(g_glRaytracingMutex);
+
+ glRaytracingRenderWorld_t* world = glRaytracingFindWorld(worldHandle);
+ if (!world)
+ return;
+
+ glRaytracingWaitIdle();
+ glRaytracingClearWorldContents(world);
+}
+
+void glRaytracingDeleteScene(glRaytracingSceneHandle_t worldHandle)
+{
+ std::lock_guard lock(g_glRaytracingMutex);
+
+ glRaytracingRenderWorld_t* world = glRaytracingFindWorld(worldHandle);
+ if (!world)
+ return;
+
+ glRaytracingWaitIdle();
+ glRaytracingReleaseWorldResources(world);
+ *world = glRaytracingRenderWorld_t();
+}
+
+uint32_t glRaytracingGetSceneCount(void)
+{
+ std::lock_guard lock(g_glRaytracingMutex);
+
+ uint32_t count = 0;
+ for (int i = 0; i < GL_RAYTRACING_MAX_RENDER_WORLDS; ++i)
+ {
+ if (g_glRaytracingScene.worlds[i].alive)
+ ++count;
+ }
+ return count;
+}
+
+glRaytracingMeshHandle_t glRaytracingCreateMesh(const glRaytracingMeshDesc_t* desc)
+{
+ std::lock_guard lock(g_glRaytracingMutex);
+
+ if (!g_glRaytracingScene.initialized || !desc)
+ return 0;
+
+ if (!desc->vertices || !desc->indices || desc->vertexCount == 0 || desc->indexCount == 0)
+ return 0;
+
+ glRaytracingMeshRecord_t mesh;
+ mesh.handle = g_glRaytracingScene.nextMeshHandle++;
+ mesh.alive = 1;
+ mesh.descCpu = *desc;
+ mesh.verticesCpu.assign(desc->vertices, desc->vertices + desc->vertexCount);
+ mesh.indicesCpu.assign(desc->indices, desc->indices + desc->indexCount);
+ mesh.descCpu.vertices = nullptr;
+ mesh.descCpu.indices = nullptr;
+ mesh.dirty = 1;
+
+ g_glRaytracingScene.meshes.push_back(mesh);
+ const size_t newIndex = g_glRaytracingScene.meshes.size() - 1;
+ glRaytracingEnsureMeshHandleTable(mesh.handle);
+ g_glRaytracingScene.meshHandleToIndex[mesh.handle] = (int)newIndex;
+
+ return mesh.handle;
+}
+
+int glRaytracingUpdateMesh(glRaytracingMeshHandle_t meshHandle, const glRaytracingMeshDesc_t* desc)
+{
+ std::lock_guard lock(g_glRaytracingMutex);
+
+ if (!g_glRaytracingScene.initialized || !desc)
+ return 0;
+
+ glRaytracingMeshRecord_t* mesh = glRaytracingFindMesh(meshHandle);
+ if (!mesh)
+ return 0;
+
+ if (!desc->vertices || !desc->indices || desc->vertexCount == 0 || desc->indexCount == 0)
+ return 0;
+
+ mesh->descCpu = *desc;
+ mesh->verticesCpu.assign(desc->vertices, desc->vertices + desc->vertexCount);
+ mesh->indicesCpu.assign(desc->indices, desc->indices + desc->indexCount);
+ mesh->descCpu.vertices = nullptr;
+ mesh->descCpu.indices = nullptr;
+
+ // Updating a mesh destroys/replaces resources that an already submitted frame
+ // may still reference. Wait only for this destructive path; steady-state
+ // rendering remains asynchronous.
+ glRaytracingWaitIdle();
+
+ mesh->vertexBuffer.resource.Reset();
+ mesh->indexBuffer.resource.Reset();
+ mesh->blasScratch.resource.Reset();
+ mesh->blasResult[0].resource.Reset();
+ mesh->blasResult[1].resource.Reset();
+ mesh->blasScratchSize = 0;
+ mesh->blasResultSize = 0;
+ mesh->blasBuildFenceValue = 0;
+ mesh->blasBuilt = 0;
+ mesh->dirty = 1;
+ mesh->currentBlasIndex = 0;
+
+ glRaytracingInvalidateInstancesForMesh(meshHandle, 0);
+ glRaytracingMarkAllWorldsNeedRebuild();
+
+ return 1;
+}
+
+uint32_t glRaytracingGetMeshMaterialFlags(glRaytracingMeshHandle_t meshHandle)
+{
+ std::lock_guard lock(g_glRaytracingMutex);
+
+ const glRaytracingMeshRecord_t* mesh = glRaytracingFindMeshConst(meshHandle);
+ if (!mesh)
+ return 0;
+
+ return mesh->materialFlags;
+}
+
+void glRaytracingSetMeshMaterialFlags(glRaytracingMeshHandle_t meshHandle, uint32_t materialFlags)
+{
+ std::lock_guard lock(g_glRaytracingMutex);
+
+ glRaytracingMeshRecord_t* mesh = glRaytracingFindMesh(meshHandle);
+ if (!mesh)
+ return;
+
+ materialFlags &= GL_RAYTRACING_INSTANCE_MATERIAL_MASK;
+ if (mesh->materialFlags == materialFlags)
+ return;
+
+ mesh->materialFlags = materialFlags;
+
+ // The glass bit also represents shim-auto-tagged alpha-blended surfaces.
+ // It changes whether BLAS geometry is opaque, so force a full BLAS rebuild.
+ // The TLAS is also rebuilt so InstanceID carries the material bit.
+ mesh->blasBuilt = 0;
+ mesh->dirty = 1;
+ glRaytracingInvalidateInstancesForMesh(meshHandle, 0);
+ glRaytracingMarkAllWorldsNeedRebuild();
+}
+
+void glRaytracingSetMeshGlass(glRaytracingMeshHandle_t meshHandle, int isGlass)
+{
+ uint32_t flags = glRaytracingGetMeshMaterialFlags(meshHandle);
+ if (isGlass)
+ flags |= GL_RAYTRACING_MATERIAL_FLAG_GLASS;
+ else
+ flags &= ~GL_RAYTRACING_MATERIAL_FLAG_GLASS;
+ glRaytracingSetMeshMaterialFlags(meshHandle, flags);
+}
+
+void glRaytracingDeleteMesh(glRaytracingMeshHandle_t meshHandle)
+{
+ std::lock_guard lock(g_glRaytracingMutex);
+
+ glRaytracingMeshRecord_t* mesh = glRaytracingFindMesh(meshHandle);
+ if (!mesh)
+ return;
+
+ glRaytracingWaitIdle();
+ glRaytracingInvalidateInstancesForMesh(meshHandle, 1);
+
+ mesh->alive = 0;
+ mesh->vertexBuffer.resource.Reset();
+ mesh->indexBuffer.resource.Reset();
+ mesh->blasScratch.resource.Reset();
+ mesh->blasResult[0].resource.Reset();
+ mesh->blasResult[1].resource.Reset();
+ mesh->blasScratchSize = 0;
+ mesh->blasResultSize = 0;
+ mesh->blasBuildFenceValue = 0;
+ mesh->blasBuilt = 0;
+ mesh->dirty = 0;
+
+ if (meshHandle < g_glRaytracingScene.meshHandleToIndex.size())
+ g_glRaytracingScene.meshHandleToIndex[meshHandle] = -1;
+
+ glRaytracingMarkAllWorldsNeedRebuild();
+}
+
+static inline uint32_t glRaytracingNormalizeVisibleInstanceMask(uint32_t mask)
+{
+ mask &= 0xFFu;
+ return mask ? mask : 0xFFu;
+}
+
+glRaytracingInstanceHandle_t glRaytracingCreateInstanceInScene(glRaytracingSceneHandle_t worldHandle, const glRaytracingInstanceDesc_t* desc)
+{
+ std::lock_guard lock(g_glRaytracingMutex);
+
+ if (!g_glRaytracingScene.initialized || !desc)
+ return 0;
+
+ glRaytracingRenderWorld_t* world = glRaytracingFindWorld(worldHandle);
+ if (!world)
+ return 0;
+
+ if (!glRaytracingFindMeshConst(desc->meshHandle))
+ return 0;
+
+ glRaytracingInstanceRecord_t inst;
+ inst.handle = world->nextInstanceHandle++;
+ inst.alive = 1;
+ inst.descCpu = *desc;
+ inst.descCpu.mask = glRaytracingNormalizeVisibleInstanceMask(inst.descCpu.mask);
+ inst.dirty = 1;
+
+ world->instances.push_back(inst);
+ const size_t newIndex = world->instances.size() - 1;
+ glRaytracingEnsureInstanceHandleTable(world, inst.handle);
+ world->instanceHandleToIndex[inst.handle] = (int)newIndex;
+ glRaytracingMarkWorldNeedsRebuild(world);
+ return inst.handle;
+}
+
+int glRaytracingUpdateInstanceInScene(glRaytracingSceneHandle_t worldHandle, glRaytracingInstanceHandle_t instanceHandle, const glRaytracingInstanceDesc_t* desc)
+{
+ std::lock_guard lock(g_glRaytracingMutex);
+
+ if (!g_glRaytracingScene.initialized || !desc)
+ return 0;
+
+ glRaytracingRenderWorld_t* world = glRaytracingFindWorld(worldHandle);
+ if (!world)
+ return 0;
+
+ if (!glRaytracingFindMeshConst(desc->meshHandle))
+ return 0;
+
+ glRaytracingInstanceRecord_t* inst = glRaytracingFindInstance(world, instanceHandle);
+ if (!inst)
+ return 0;
+
+ const uint32_t oldMeshHandle = inst->descCpu.meshHandle;
+ const uint32_t oldMask = ((uint32_t)inst->descCpu.mask) & 0xFFu;
+ const int wasHidden = (oldMask == 0u);
+
+ glRaytracingInstanceDesc_t newDesc = *desc;
+
+ // If this instance is hidden, keep it hidden even if the caller's
+ // transform-update helper sends mask = 0xFF again.
+ newDesc.mask = wasHidden
+ ? 0u
+ : glRaytracingNormalizeVisibleInstanceMask(newDesc.mask);
+
+ inst->descCpu = newDesc;
+ inst->dirty = 1;
+
+ if (oldMeshHandle != desc->meshHandle)
+ {
+ glRaytracingInvalidateInstanceCache(inst);
+ glRaytracingMarkWorldNeedsRebuild(world);
+ }
+ else
+ {
+ glRaytracingMarkWorldNeedsUpdate(world);
+ }
+
+ return 1;
+}
+
+void glRaytracingDeleteInstanceInScene(glRaytracingSceneHandle_t worldHandle, glRaytracingInstanceHandle_t instanceHandle)
+{
+ std::lock_guard lock(g_glRaytracingMutex);
+
+ glRaytracingRenderWorld_t* world = glRaytracingFindWorld(worldHandle);
+ if (!world)
+ return;
+
+ glRaytracingInstanceRecord_t* inst = glRaytracingFindInstance(world, instanceHandle);
+ if (!inst)
+ return;
+
+ glRaytracingInvalidateInstanceCache(inst);
+ inst->alive = 0;
+ if (instanceHandle < world->instanceHandleToIndex.size())
+ world->instanceHandleToIndex[instanceHandle] = -1;
+ glRaytracingMarkWorldNeedsRebuild(world);
+}
+
+int glRaytracingBuildMesh(glRaytracingMeshHandle_t meshHandle)
+{
+ std::lock_guard lock(g_glRaytracingMutex);
+
+ if (!g_glRaytracingScene.initialized)
+ return 0;
+
+ glRaytracingMeshRecord_t* mesh = glRaytracingFindMesh(meshHandle);
+ if (!mesh)
+ return 0;
+
+ return glRaytracingBuildMeshInternal(mesh);
+}
+
+int glRaytracingBuildAllMeshes(void)
+{
+ std::lock_guard lock(g_glRaytracingMutex);
+
+ if (!g_glRaytracingScene.initialized)
+ return 0;
+
+ return glRaytracingBuildDirtyMeshesInternal();
+}
+
+int glRaytracingBuildSceneForHandle(glRaytracingSceneHandle_t worldHandle)
+{
+ std::lock_guard lock(g_glRaytracingMutex);
+
+ if (!g_glRaytracingScene.initialized)
+ return 0;
+
+ glRaytracingRenderWorld_t* world = glRaytracingFindWorld(worldHandle);
+ if (!world)
+ return 0;
+
+ if (!glRaytracingBuildDirtyMeshesInternal())
+ return 0;
+
+ return glRaytracingBuildSceneInternal(world);
+}
+
+ID3D12Resource* glRaytracingGetTopLevelASForScene(glRaytracingSceneHandle_t worldHandle)
+{
+ std::lock_guard lock(g_glRaytracingMutex);
+
+ if (!g_glRaytracingScene.initialized)
+ return nullptr;
+
+ glRaytracingRenderWorld_t* world = glRaytracingFindWorld(worldHandle);
+ if (!world)
+ return nullptr;
+
+ if (!glRaytracingBuildDirtyMeshesInternal())
+ return nullptr;
+
+ if (!glRaytracingBuildSceneInternal(world))
+ return nullptr;
+
+ if (!world->tlasBuilt)
+ return nullptr;
+
+ return glRaytracingGetCurrentTLASBuffer(world)->resource.Get();
+}
+
+uint32_t glRaytracingGetMeshCount(void)
+{
+ std::lock_guard lock(g_glRaytracingMutex);
+
+ uint32_t count = 0;
+ for (size_t i = 0; i < g_glRaytracingScene.meshes.size(); ++i)
+ {
+ if (g_glRaytracingScene.meshes[i].alive)
+ ++count;
+ }
+ return count;
+}
+
+uint32_t glRaytracingGetInstanceCountForScene(glRaytracingSceneHandle_t worldHandle)
+{
+ std::lock_guard lock(g_glRaytracingMutex);
+
+ const glRaytracingRenderWorld_t* world = glRaytracingFindWorldConst(worldHandle);
+ return glRaytracingCountAliveInstances(world);
+}
+
+// ============================================================
+// Lighting state
+// ============================================================
+
+struct glRaytracingLightingConstants_t
+{
+ float invViewProj[16];
+ float invViewMatrix[16];
+ float viewProj[16];
+ float cameraPos[4];
+ float ambientColor[4];
+ float screenSize[4];
+
+ // Keep this CPU layout 16-byte aligned with the HLSL cbuffer.
+ float normalReconstructZ;
+ uint32_t lightCount;
+ uint32_t enableSpecular;
+ uint32_t enableHalfLambert;
+
+ float shadowBias;
+ uint32_t frameIndex;
+ uint32_t samplesPerPixel;
+ uint32_t maxBounces;
+
+ uint32_t enableDenoiser;
+ uint32_t denoisePassIndex;
+ float denoiseStepWidth;
+ float denoiseStrength;
+
+ float denoisePhiColor;
+ float denoisePhiNormal;
+ float denoisePhiPosition;
+ float bumpStrength;
+};
+
+struct glRaytracingLightingState_t
+{
+ std::vector cpuLights;
+ // CPU-only metadata parallel to cpuLights. 0 = caller-managed light.
+ // Non-zero keys are used by the renderer bridge for persistent geometry emitters
+ // so they can be updated instead of cleared/re-added every frame.
+ std::vector cpuLightKeys;
+ glRaytracingLightingConstants_t constants;
+
+ ComPtr descriptorHeap;
+ ComPtr descriptorHeapRing[GL_RAYTRACING_CMD_RING_SIZE];
+ UINT descriptorStride;
+
+ glRaytracingBuffer_t constantBuffer;
+ glRaytracingBuffer_t lightBuffer;
+ void* constantBufferMapped;
+ void* lightBufferMapped;
+ glRaytracingBuffer_t constantBufferRing[GL_RAYTRACING_CMD_RING_SIZE];
+ glRaytracingBuffer_t lightBufferRing[GL_RAYTRACING_CMD_RING_SIZE];
+ void* constantBufferMappedRing[GL_RAYTRACING_CMD_RING_SIZE];
+ void* lightBufferMappedRing[GL_RAYTRACING_CMD_RING_SIZE];
+
+ ComPtr globalRootSig;
+ ComPtr localRootSig;
+
+ ComPtr rtStateObject;
+ ComPtr rtStateProps;
+
+ glRaytracingBuffer_t raygenTable;
+ glRaytracingBuffer_t missTable;
+ glRaytracingBuffer_t hitTable;
+
+ ComPtr denoisePSO;
+ ComPtr temporalPSO;
+ glRaytracingTexture_t pathTraceTexture;
+ glRaytracingTexture_t temporalTexture;
+ glRaytracingTexture_t historyTexture[2];
+ glRaytracingTexture_t denoiseTemp[2];
+ uint32_t currentHistoryIndex;
+ glRaytracingBuffer_t denoiseConstantBuffer[3];
+ glRaytracingBuffer_t denoiseConstantBufferRing[GL_RAYTRACING_CMD_RING_SIZE][3];
+ void* denoiseConstantBufferMapped[3];
+ void* denoiseConstantBufferMappedRing[GL_RAYTRACING_CMD_RING_SIZE][3];
+ UINT denoiseWidth;
+ UINT denoiseHeight;
+ DXGI_FORMAT denoiseFormat;
+ uint32_t frameCounter;
+ bool externalDenoiser;
+ ID3D12Resource* emissiveTexture;
+ DXGI_FORMAT emissiveFormat;
+ ID3D12Resource* specularTexture;
+ DXGI_FORMAT specularFormat;
+ bool uploadToCurrentFrameResource;
+ bool initialized;
+
+ glRaytracingLightingState_t()
+ {
+ memset(&constants, 0, sizeof(constants));
+ descriptorStride = 0;
+ constantBufferMapped = nullptr;
+ lightBufferMapped = nullptr;
+ for (UINT frame = 0; frame < GL_RAYTRACING_CMD_RING_SIZE; ++frame)
+ {
+ constantBufferMappedRing[frame] = nullptr;
+ lightBufferMappedRing[frame] = nullptr;
+ for (int i = 0; i < 3; ++i)
+ denoiseConstantBufferMappedRing[frame][i] = nullptr;
+ }
+ for (int i = 0; i < 3; ++i)
+ denoiseConstantBufferMapped[i] = nullptr;
+ denoiseWidth = 0;
+ denoiseHeight = 0;
+ denoiseFormat = DXGI_FORMAT_UNKNOWN;
+ currentHistoryIndex = 0;
+ frameCounter = 0;
+ externalDenoiser = false;
+ emissiveTexture = nullptr;
+ emissiveFormat = DXGI_FORMAT_R16G16B16A16_FLOAT;
+ specularTexture = nullptr;
+ specularFormat = DXGI_FORMAT_R8G8B8A8_UNORM;
+ uploadToCurrentFrameResource = false;
+ initialized = false;
+ }
+};
+
+static glRaytracingLightingState_t g_glRaytracingLighting;
+
+static const DXGI_FORMAT GL_RAYTRACING_DENOISE_FORMAT = DXGI_FORMAT_R16G16B16A16_FLOAT;
+// CPU-only light metadata keys. These do not change the GPU Light layout.
+// The high bit marks renderer-generated geometry emitters. They are kept across
+// ordinary transient-light clears and upserted by key so moving the camera does
+// not make an off-screen emissive card stop lighting the scene.
+static const uint32_t GL_RAYTRACING_LIGHT_KEY_NONE = 0u;
+static const uint32_t GL_RAYTRACING_LIGHT_KEY_GEOMETRY_EMISSIVE_BIT = 0x80000000u;
+static const float GL_RAYTRACING_LIGHT_PERSISTANT_GEOMETRY_EMISSIVE = -2.0f;
+
+static inline uint32_t glRaytracingMakeGeometryEmissiveLightKey(uint32_t key)
+{
+ key &= ~GL_RAYTRACING_LIGHT_KEY_GEOMETRY_EMISSIVE_BIT;
+ if (key == GL_RAYTRACING_LIGHT_KEY_NONE)
+ key = 1u;
+ return key | GL_RAYTRACING_LIGHT_KEY_GEOMETRY_EMISSIVE_BIT;
+}
+
+static inline bool glRaytracingLightKeyIsGeometryEmissive(uint32_t key)
+{
+ return (key & GL_RAYTRACING_LIGHT_KEY_GEOMETRY_EMISSIVE_BIT) != 0u;
+}
+
+static inline void glRaytracingLightingEnsureLightKeyCount()
+{
+ if (g_glRaytracingLighting.cpuLightKeys.size() != g_glRaytracingLighting.cpuLights.size())
+ g_glRaytracingLighting.cpuLightKeys.resize(g_glRaytracingLighting.cpuLights.size(), GL_RAYTRACING_LIGHT_KEY_NONE);
+}
+
+enum glRaytracingLightingDescriptorIndex_t
+{
+ GLR_DESC_LIGHTS_SRV = 0,
+ GLR_DESC_ALBEDO_SRV = 1,
+ GLR_DESC_DEPTH_SRV = 2,
+ GLR_DESC_NORMAL_SRV = 3,
+ GLR_DESC_POSITION_SRV = 4,
+ GLR_DESC_TLAS_SRV = 5,
+ GLR_DESC_PATHTRACE_SRV = 6,
+ GLR_DESC_DENOISE_A_SRV = 7,
+ GLR_DESC_DENOISE_B_SRV = 8,
+ GLR_DESC_HISTORY_SRV = 9,
+ GLR_DESC_TEMPORAL_SRV = 10,
+ GLR_DESC_EMISSIVE_SRV = 11,
+ GLR_DESC_SPECULAR_SRV = 12,
+ GLR_DESC_PATHTRACE_UAV = 13,
+ GLR_DESC_DENOISE_A_UAV = 14,
+ GLR_DESC_DENOISE_B_UAV = 15,
+ GLR_DESC_OUTPUT_UAV = 16,
+ GLR_DESC_TEMPORAL_UAV = 17,
+ GLR_DESC_HISTORY_UAV = 18,
+ GLR_DESC_COUNT = 19,
+ GLR_DESC_SRV_COUNT = 13,
+ GLR_DESC_UAV_COUNT = 6
+};
+
+static void glRaytracingLightingResetDenoiseHistory(void)
+{
+ // Kept under the old name so existing call sites keep compiling. This now
+ // invalidates the temporal GI accumulator as well as restarting stochastic
+ // sample indexing after material/camera/light/scene changes.
+ g_glRaytracingLighting.frameCounter = 0;
+ g_glRaytracingLighting.constants.frameIndex = 0;
+ g_glRaytracingLighting.currentHistoryIndex = 0;
+}
+
+static const char* g_glRaytracingLightingHlsl = R"(
+struct Light
+{
+ float3 position;
+ float radius;
+
+ float3 color;
+ float intensity;
+
+ float3 normal;
+ uint type;
+
+ float3 axisU;
+ float halfWidth;
+
+ float3 axisV;
+ float halfHeight;
+
+ uint samples;
+ uint twoSided;
+ float persistant;
+
+ // Reuses the old pad1 slot in glRaytracingLight_t. Keeping this in the
+ // same 16-byte lane preserves the CPU StructuredBuffer stride while giving
+ // point/spot lights an explicit volumetric scattering control.
+ // <= 0 disables the effect. Values around 0.25-1.0 are useful in Doom 3 units.
+ float volumetricScattering;
+
+ // For point lights, this is the axis-aligned XYZ attenuation radius.
+ // For spot lights, pointRadius.x stores the near clip plane.
+ // The scalar radius above is still kept as a max/fallback range for point lights,
+ // as the influence range for rect lights, and as the far clip distance for spot lights.
+ float3 pointRadius;
+ float pointRadiusPad; // non-zero disables specular for this light
+ float falloffPower;
+ float3 falloffPad;
+};
+
+struct ShadowPayload
+{
+ uint hit;
+};
+
+struct BouncePayload
+{
+ uint hit;
+ float hitT;
+ uint materialFlags;
+ uint pad0;
+};
+
+cbuffer LightingCB : register(b0)
+{
+ float4x4 gInvViewProj;
+ float4x4 gInvViewMatrix;
+ float4x4 gViewProj;
+ float4 gCameraPos;
+ float4 gAmbientColor;
+ float4 gScreenSize;
+ float gNormalReconstructZ;
+ uint gLightCount;
+ uint gEnableSpecular;
+ uint gEnableHalfLambert;
+ float gShadowBias;
+ uint gFrameIndex;
+ uint gSamplesPerPixel;
+ uint gMaxBounces;
+ uint gEnableDenoiser;
+ uint gDenoisePassIndex;
+ float gDenoiseStepWidth;
+ float gDenoiseStrength;
+ float gDenoisePhiColor;
+ float gDenoisePhiNormal;
+ float gDenoisePhiPosition;
+ float gBumpStrength;
+};
+
+StructuredBuffer gLights : register(t0);
+Texture2D gAlbedoTex : register(t1);
+Texture2D gDepthTex : register(t2);
+Texture2D gNormalTex : register(t3);
+Texture2D gPositionTex : register(t4);
+RaytracingAccelerationStructure gSceneBVH : register(t5);
+Texture2D gEmissiveTex : register(t11);
+Texture2D gSpecularTex : register(t12);
+RWTexture2D gOutputTex : register(u0);
+
+static const uint GL_RAYTRACING_LIGHT_TYPE_POINT = 0;
+static const uint GL_RAYTRACING_LIGHT_TYPE_RECT = 1;
+static const uint GL_RAYTRACING_LIGHT_TYPE_SPOT = 2;
+
+static const uint GEOMETRY_FLAG_NONE = 0;
+static const uint GEOMETRY_FLAG_SKELETAL = 1;
+static const uint GEOMETRY_FLAG_UNLIT = 2;
+static const uint GEOMETRY_FLAG_GLASS = 4;
+
+// The shim encodes per-instance material flags into the upper bits of
+// D3D12_RAYTRACING_INSTANCE_DESC::InstanceID so any-hit shaders can make
+// visibility decisions without binding a separate material table.
+static const uint GL_RAYTRACING_INSTANCE_USER_ID_MASK = 0x0000FFFFu;
+static const uint GL_RAYTRACING_INSTANCE_MATERIAL_SHIFT = 16u;
+static const uint GL_RAYTRACING_INSTANCE_MATERIAL_MASK = 0x000000FFu;
+static const uint GL_RAYTRACING_MATERIAL_FLAG_GLASS = 0x00000001u;
+
+float3 SafeNormalizeOr(float3 v, float3 fallbackDir);
+
+uint DecodeInstanceMaterialFlags()
+{
+ return (InstanceID() >> GL_RAYTRACING_INSTANCE_MATERIAL_SHIFT) &
+ GL_RAYTRACING_INSTANCE_MATERIAL_MASK;
+}
+
+bool CurrentRayHitIsGlass()
+{
+ return (DecodeInstanceMaterialFlags() & GL_RAYTRACING_MATERIAL_FLAG_GLASS) != 0u;
+}
+
+uint DecodeGeometryFlag(float geoFlag)
+{
+ // position.w comes from a render target / buffer path, so do not require exact
+ // float equality. Values like 0.999, 1.001, 1.99, 2.02 should decode correctly.
+ //
+ // Clamp negative garbage to 0, then round to nearest integer flag.
+ float f = max(geoFlag, 0.0);
+ return (uint)floor(f + 0.5);
+}
+
+bool GeometryFlagEquals(float geoFlag, uint expectedFlag)
+{
+ return DecodeGeometryFlag(geoFlag) == expectedFlag;
+}
+
+bool GeometryFlagHas(float geoFlag, uint expectedFlag)
+{
+ // Supports both current single-value usage and future bitmask usage.
+ uint decoded = DecodeGeometryFlag(geoFlag);
+ return (decoded & expectedFlag) != 0u;
+}
+
+float3 LoadScenePosition(uint2 pixel)
+{
+ float4 p = gPositionTex.Load(int3(pixel, 0));
+ return p.xyz;
+}
+
+float4 LoadSceneNormal(uint2 pixel)
+{
+ float4 nSample = gNormalTex.Load(int3(pixel, 0));
+ return nSample;
+}
+
+float SafeLengthSq(float3 v)
+{
+ return max(dot(v, v), 1e-8);
+}
+
+float3 SafeNormalizeLocal(float3 v, float3 fallback)
+{
+ float lenSq = dot(v, v);
+ return (lenSq > 1e-8) ? (v * rsqrt(lenSq)) : fallback;
+}
+
+float BumpLuminance(float3 c)
+{
+ return dot(c, float3(0.299, 0.587, 0.114));
+}
+
+float3 EnhanceBumpNormal(uint2 pixel, float3 worldPos, float3 baseAlbedo, bool isSkeletal)
+{
+ float3 N = SafeNormalizeLocal(LoadSceneNormal(pixel).xyz, float3(0.0, 0.0, 1.0));
+
+ // Character albedo has skin, cloth, and painted detail that should not be
+ // interpreted as height. The synthetic bump pass looks good on old walls,
+ // but it makes animated models crawl and self-shadow like noisy relief maps.
+ if (isSkeletal)
+ return N;
+
+ float strength = max(gBumpStrength, 0.0);
+ if (strength <= 0.001)
+ return N;
+
+ int2 p = int2(pixel);
+ int2 maxP = int2((int)gScreenSize.x - 1, (int)gScreenSize.y - 1);
+
+ int2 pxm = clamp(p + int2(-1, 0), int2(0, 0), maxP);
+ int2 pxp = clamp(p + int2( 1, 0), int2(0, 0), maxP);
+ int2 pym = clamp(p + int2( 0, -1), int2(0, 0), maxP);
+ int2 pyp = clamp(p + int2( 0, 1), int2(0, 0), maxP);
+
+ float3 posL = gPositionTex.Load(int3(pxm, 0)).xyz;
+ float3 posR = gPositionTex.Load(int3(pxp, 0)).xyz;
+ float3 posU = gPositionTex.Load(int3(pym, 0)).xyz;
+ float3 posD = gPositionTex.Load(int3(pyp, 0)).xyz;
+
+ float3 T = posR - posL;
+ float3 B = posD - posU;
+
+ // Fall back to a stable tangent basis when the position buffer is flat or invalid.
+ if (dot(T, T) <= 1e-8 || dot(B, B) <= 1e-8)
+ {
+ float3 up = (abs(N.z) < 0.999) ? float3(0.0, 0.0, 1.0) : float3(0.0, 1.0, 0.0);
+ T = SafeNormalizeLocal(cross(up, N), float3(1.0, 0.0, 0.0));
+ B = cross(N, T);
+ }
+ else
+ {
+ T = SafeNormalizeLocal(T - N * dot(N, T), float3(1.0, 0.0, 0.0));
+ B = SafeNormalizeLocal(B - N * dot(N, B), float3(0.0, 1.0, 0.0));
+ }
+
+ float hL = BumpLuminance(saturate(gAlbedoTex.Load(int3(pxm, 0)).rgb));
+ float hR = BumpLuminance(saturate(gAlbedoTex.Load(int3(pxp, 0)).rgb));
+ float hU = BumpLuminance(saturate(gAlbedoTex.Load(int3(pym, 0)).rgb));
+ float hD = BumpLuminance(saturate(gAlbedoTex.Load(int3(pyp, 0)).rgb));
+
+ // Height-gradient bump from the diffuse texture. The scale is intentionally
+ // aggressive because the current renderer has no dedicated height/normal map
+ // slot here, and old idTech/Build textures need the fake relief to read.
+ float dhdx = (hR - hL);
+ float dhdy = (hD - hU);
+ float3 heightNormal = SafeNormalizeLocal(N - (T * dhdx + B * dhdy) * (strength * 4.25), N);
+
+ float3 nL = SafeNormalizeLocal(gNormalTex.Load(int3(pxm, 0)).xyz, N);
+ float3 nR = SafeNormalizeLocal(gNormalTex.Load(int3(pxp, 0)).xyz, N);
+ float3 nU = SafeNormalizeLocal(gNormalTex.Load(int3(pym, 0)).xyz, N);
+ float3 nD = SafeNormalizeLocal(gNormalTex.Load(int3(pyp, 0)).xyz, N);
+ float3 avgN = SafeNormalizeLocal((nL + nR + nU + nD) * 0.25, N);
+
+ // Amplify real G-buffer normal-map variation as well.
+ float3 detailN = SafeNormalizeLocal(N + (N - avgN) * (strength * 1.75), N);
+
+ float3 outN = SafeNormalizeLocal(lerp(detailN, heightNormal, 0.65), N);
+
+ // Avoid flipping normals so far that shadows/specular explode.
+ if (dot(outN, N) < 0.25)
+ outN = SafeNormalizeLocal(lerp(N, outN, 0.45), N);
+
+ return outN;
+}
+
+[shader("miss")]
+void ShadowMiss(inout ShadowPayload payload)
+{
+ payload.hit = 0;
+}
+
+[shader("anyhit")]
+void ShadowAnyHit(inout ShadowPayload payload, in BuiltInTriangleIntersectionAttributes attr)
+{
+ // Glass/alpha-blended surfaces should participate in the primary/raster image,
+ // but visibility rays must continue through them. Mark the BLAS geometry
+ // non-opaque on the CPU side so this any-hit shader runs, then IgnoreHit()
+ // lets the ray keep going to whatever is behind the pane/sprite.
+ if (CurrentRayHitIsGlass())
+ {
+ IgnoreHit();
+ return;
+ }
+}
+
+[shader("closesthit")]
+void ShadowClosestHit(inout ShadowPayload payload, in BuiltInTriangleIntersectionAttributes attr)
+{
+ // Safety fallback for incorrectly-built glass geometry. Correct glass meshes
+ // are non-opaque and are ignored by ShadowAnyHit() above.
+ if (CurrentRayHitIsGlass())
+ {
+ payload.hit = 0;
+ return;
+ }
+
+ payload.hit = 1;
+}
+
+[shader("miss")]
+void BounceMiss(inout BouncePayload payload)
+{
+ payload.hit = 0;
+ payload.hitT = 0.0;
+ payload.materialFlags = 0;
+ payload.pad0 = 0;
+}
+
+[shader("anyhit")]
+void BounceAnyHit(inout BouncePayload payload, in BuiltInTriangleIntersectionAttributes attr)
+{
+ // Secondary diffuse rays should see through the same transparent surfaces that
+ // shadow rays see through. This keeps a pane/sprite from killing all bounced
+ // light behind it.
+ if (CurrentRayHitIsGlass())
+ {
+ IgnoreHit();
+ return;
+ }
+}
+
+[shader("closesthit")]
+void BounceClosestHit(inout BouncePayload payload, in BuiltInTriangleIntersectionAttributes attr)
+{
+ // Fallback for transparent geometry that was accidentally built opaque.
+ // Correctly tagged transparent surfaces are ignored in BounceAnyHit() above.
+ if (CurrentRayHitIsGlass())
+ {
+ payload.hit = 0;
+ payload.hitT = 0.0;
+ payload.materialFlags = DecodeInstanceMaterialFlags();
+ payload.pad0 = 0;
+ return;
+ }
+
+ payload.hit = 1;
+ payload.hitT = RayTCurrent();
+ payload.materialFlags = DecodeInstanceMaterialFlags();
+ payload.pad0 = 0;
+}
+
+[shader("closesthit")]
+void ReflectionClosestHit(inout BouncePayload payload, in BuiltInTriangleIntersectionAttributes attr)
+{
+ // Specular rays are view rays, not diffuse/visibility rays. They should
+ // report the first reflected surface even when that surface was tagged as
+ // glass/alpha, otherwise glass panes/sprites vanish from mirror-like hits.
+ payload.hit = 1;
+ payload.hitT = RayTCurrent();
+ payload.materialFlags = DecodeInstanceMaterialFlags();
+ payload.pad0 = 0;
+}
+
+float TraceShadow(float3 origin, float3 dir, float maxT)
+{
+ RayDesc ray;
+ ray.Origin = origin;
+ ray.Direction = dir;
+ ray.TMin = 5.0;
+ ray.TMax = maxT;
+
+ ShadowPayload payload;
+ payload.hit = 0;
+
+ TraceRay(
+ gSceneBVH,
+ RAY_FLAG_ACCEPT_FIRST_HIT_AND_END_SEARCH,
+ 0xFF,
+ 0,
+ 0,
+ 0,
+ ray,
+ payload);
+
+ return (payload.hit != 0) ? 0.0 : 1.0;
+}
+
+bool TraceBounce(float3 origin, float3 dir, float maxT, out float hitT, out uint materialFlags)
+{
+ RayDesc ray;
+ ray.Origin = origin;
+ ray.Direction = dir;
+ ray.TMin = 0.001;
+ ray.TMax = maxT;
+
+ BouncePayload payload;
+ payload.hit = 0;
+ payload.hitT = 0.0;
+ payload.materialFlags = 0;
+ payload.pad0 = 0;
+
+ TraceRay(
+ gSceneBVH,
+ RAY_FLAG_ACCEPT_FIRST_HIT_AND_END_SEARCH,
+ 0xFF,
+ 1,
+ 0,
+ 1,
+ ray,
+ payload);
+
+ hitT = payload.hitT;
+ materialFlags = payload.materialFlags;
+ return payload.hit != 0;
+}
+
+bool TraceSpecularReflection(float3 origin, float3 dir, float maxT, out float hitT, out uint materialFlags)
+{
+ RayDesc ray;
+ ray.Origin = origin;
+ ray.Direction = dir;
+ ray.TMin = 0.001;
+ ray.TMax = maxT;
+
+ BouncePayload payload;
+ payload.hit = 0;
+ payload.hitT = 0.0;
+ payload.materialFlags = 0;
+ payload.pad0 = 0;
+
+ TraceRay(
+ gSceneBVH,
+ RAY_FLAG_NONE,
+ 0xFF,
+ 2,
+ 0,
+ 1,
+ ray,
+ payload);
+
+ hitT = payload.hitT;
+ materialFlags = payload.materialFlags;
+ return payload.hit != 0;
+}
+
+float Hash12(float2 p)
+{
+ float3 p3 = frac(float3(p.xyx) * 0.1031);
+ p3 += dot(p3, p3.yzx + 33.33);
+ return frac((p3.x + p3.y) * p3.z);
+}
+
+float2 Hammersley2D(uint i, uint N, float rand)
+{
+ float e1 = frac((float)i / (float)N + rand);
+
+ uint bits = i;
+ bits = (bits << 16) | (bits >> 16);
+ bits = ((bits & 0x55555555u) << 1) | ((bits & 0xAAAAAAAAu) >> 1);
+ bits = ((bits & 0x33333333u) << 2) | ((bits & 0xCCCCCCCCu) >> 2);
+ bits = ((bits & 0x0F0F0F0Fu) << 4) | ((bits & 0xF0F0F0F0u) >> 4);
+ bits = ((bits & 0x00FF00FFu) << 8) | ((bits & 0xFF00FF00u) >> 8);
+
+ float e2 = (float)bits * 2.3283064365386963e-10;
+ return float2(e1, e2);
+}
+
+float2 ConcentricSampleDisk(float2 u)
+{
+ float2 uOffset = 2.0 * u - 1.0;
+
+ if (uOffset.x == 0.0 && uOffset.y == 0.0)
+ return float2(0.0, 0.0);
+
+ float r, theta;
+ if (abs(uOffset.x) > abs(uOffset.y))
+ {
+ r = uOffset.x;
+ theta = (3.14159265 / 4.0) * (uOffset.y / uOffset.x);
+ }
+ else
+ {
+ r = uOffset.y;
+ theta = (3.14159265 / 2.0) - (3.14159265 / 4.0) * (uOffset.x / uOffset.y);
+ }
+
+ return r * float2(cos(theta), sin(theta));
+}
+
+void BuildOrthonormalBasis(float3 n, out float3 t, out float3 b)
+{
+ float3 up = (abs(n.z) < 0.999) ? float3(0.0, 0.0, 1.0) : float3(0.0, 1.0, 0.0);
+ t = normalize(cross(up, n));
+ b = cross(n, t);
+}
+
+float3 CosineSampleHemisphere(float2 u)
+{
+ float2 d = ConcentricSampleDisk(u);
+ float z = sqrt(saturate(1.0 - dot(d, d)));
+ return float3(d.x, d.y, z);
+}
+
+float3 GetPointLightRadius(Light Lgt)
+{
+ float scalarRadius = max(abs(Lgt.radius), 1e-4);
+ float3 r = abs(Lgt.pointRadius);
+
+ // Allow older/zero-initialized light records to behave like the old scalar radius.
+ if (max(max(r.x, r.y), r.z) <= 1e-4)
+ {
+ r = float3(scalarRadius, scalarRadius, scalarRadius);
+ }
+
+ return max(r, float3(1e-4, 1e-4, 1e-4));
+}
+
+float GetPointLightMaxRadius(Light Lgt)
+{
+ float3 r = GetPointLightRadius(Lgt);
+ return max(max(r.x, r.y), r.z);
+}
+
+float3 Doom3SafeNormalizeOr(float3 v, float3 fallbackDir)
+{
+ float lenSq = dot(v, v);
+ return (lenSq > 1e-8) ? (v * rsqrt(lenSq)) : fallbackDir;
+}
+
+float Doom3QuadraticFalloffImage(float texCoord)
+{
+ // Math version of Doom 3 BFG's built-in _quadratic lookup table.
+ // The source table is 32 texels wide, brightest at the center and clamped
+ // to black outside the light volume.
+ if (texCoord <= 0.0 || texCoord >= 1.0)
+ return 0.0;
+
+ const float QUADRATIC_WIDTH = 32.0;
+
+ // Convert a normalized lookup coordinate to the source generator's texel-space
+ // x value, then apply the same centered squared ramp used by R_QuadraticImage().
+ float x = texCoord * QUADRATIC_WIDTH - 0.5;
+ float d = x - (QUADRATIC_WIDTH * 0.5 - 0.5);
+ d = abs(d);
+ d -= 0.5;
+ d /= (QUADRATIC_WIDTH * 0.5);
+ d = 1.0 - d;
+ d = saturate(d);
+ return d * d;
+}
+
+float Doom3QuadraticCentered(float centeredCoord)
+{
+ // centeredCoord is -1 at one side of the light volume, 0 at the light center,
+ // and +1 at the opposite side.
+ return Doom3QuadraticFalloffImage(centeredCoord * 0.5 + 0.5);
+}
+
+float Doom3ProjectionTexture2D(float2 centeredCoord)
+{
+ // Doom 3 multiplies a projected light image by a separate falloff image. This
+ // renderer does not bind Doom light materials/cookies, so use the same built-in
+ // quadratic shape on S/T as a neutral default projection texture approximation.
+ if (abs(centeredCoord.x) >= 1.0 || abs(centeredCoord.y) >= 1.0)
+ return 0.0;
+
+ return Doom3QuadraticCentered(centeredCoord.x) * Doom3QuadraticCentered(centeredCoord.y);
+}
+
+float Doom3ProjectedCookieDefault(float2 centeredCoord)
+{
+ // Without the actual light stage image, keep default projected lights neutral
+ // inside their S/T clip planes. The default Doom 3 projected falloff is
+ // _noFalloff, and using the point-light quadratic here makes spotlights much
+ // darker than the engine's fixed-function interaction path.
+ return (abs(centeredCoord.x) < 1.0 && abs(centeredCoord.y) < 1.0) ? 1.0 : 0.0;
+}
+)"
+R"(
+float Doom3ProjectedDepthFalloff(float depth, float nearClip, float farClip)
+{
+ // Doom 3's default projected light uses _noFalloff: it is clipped by the
+ // start/end planes but does not distance-fade through the frustum.
+ return (depth > nearClip && depth < farClip) ? 1.0 : 0.0;
+}
+
+float AttenuationBasic(float lightDist, float maxLightDist, float falloffPower)
+{
+ float attenuation = 1.0 - saturate(lightDist / max(maxLightDist, 1e-4));
+ falloffPower = (falloffPower > 0.0) ? falloffPower : 0.25;
+ return pow(attenuation, falloffPower);
+}
+
+float Spotify(float3 lightVector, float3 spotDir, float outerAngle, float innerAngle)
+{
+ return smoothstep(outerAngle, innerAngle, saturate(dot(lightVector, spotDir)));
+}
+
+float ComputePointLightAttenuation(float3 worldPos, Light Lgt)
+{
+ float3 radii = GetPointLightRadius(Lgt);
+ float3 offset = worldPos - Lgt.position;
+
+ // Rage/Tango-style point attenuation from the provided shader:
+ // perAxis = 1 - saturate(abs(fragment - lightPos) / extents)
+ // attenuation = pow(perAxis.x * perAxis.y * perAxis.z, falloffPower)
+ float3 axisU = Doom3SafeNormalizeOr(Lgt.axisU, float3(1.0, 0.0, 0.0));
+ float3 axisV = Doom3SafeNormalizeOr(Lgt.axisV, float3(0.0, 1.0, 0.0));
+ float3 axisW = Doom3SafeNormalizeOr(Lgt.normal, float3(0.0, 0.0, 1.0));
+
+ float3 perAxis;
+ perAxis.x = 1.0 - saturate(abs(dot(offset, axisU)) / radii.x);
+ perAxis.y = 1.0 - saturate(abs(dot(offset, axisV)) / radii.y);
+ perAxis.z = 1.0 - saturate(abs(dot(offset, axisW)) / radii.z);
+
+ float falloffPower = (Lgt.falloffPower > 0.0) ? Lgt.falloffPower : 0.25;
+ return pow(perAxis.x * perAxis.y * perAxis.z, falloffPower);
+}
+)"
+R"(
+float ComputeSpotLightAttenuation(float3 worldPos, Light Lgt)
+{
+ float3 lightToSurface = worldPos - Lgt.position;
+
+ float nearClip = max(Lgt.pointRadius.x, 0.0);
+ float farClip = max(Lgt.radius, nearClip + 1e-4);
+
+ float3 spotDir = Doom3SafeNormalizeOr(Lgt.normal, float3(0.0, 0.0, 1.0));
+
+ float depth = dot(lightToSurface, spotDir);
+
+ if (depth <= nearClip || depth >= farClip)
+ return 0.0;
+
+ float3 axisU = Doom3SafeNormalizeOr(Lgt.axisU, float3(1.0, 0.0, 0.0));
+ float3 axisV = Doom3SafeNormalizeOr(Lgt.axisV, float3(0.0, 1.0, 0.0));
+
+ float invDepth = 1.0 / max(depth, 1e-4);
+
+ float halfU = max(abs(Lgt.halfWidth), 1e-4);
+ float halfV = max(abs(Lgt.halfHeight), 1e-4);
+
+ float signedU = (dot(lightToSurface, axisU) * invDepth) / halfU;
+ float signedV = (dot(lightToSurface, axisV) * invDepth) / halfV;
+
+ if (abs(signedU) >= 1.0 || abs(signedV) >= 1.0)
+ return 0.0;
+
+ float3 lightVector = normalize(lightToSurface);
+ float maxSlope = max(halfU, halfV);
+ float outerAngle = rsqrt(1.0 + maxSlope * maxSlope);
+ float innerSlope = maxSlope * 0.65;
+ float innerAngle = rsqrt(1.0 + innerSlope * innerSlope);
+
+ float spotCookie = Spotify(lightVector, spotDir, outerAngle, innerAngle);
+ float distFalloff = AttenuationBasic(depth - nearClip, farClip - nearClip, Lgt.falloffPower);
+
+ return spotCookie * distFalloff;
+}
+
+float TraceSpotShadow(float3 worldPos, float3 N, float3 toLight, float dist)
+{
+ float3 L = toLight / max(dist, 1e-6);
+
+ float NdotLRaw = saturate(dot(N, L));
+ float normalBias = lerp(gShadowBias * 3.0, gShadowBias * 0.75, NdotLRaw);
+
+ float3 shadowOrigin = worldPos + N * normalBias + L * (gShadowBias * 0.5);
+ float shadowTMax = max(dist - gShadowBias * 0.5, 0.001);
+
+ return TraceShadow(shadowOrigin, L, shadowTMax);
+}
+
+float TraceSoftShadow(float3 worldPos, float3 N, Light Lgt, float3 toLight, float dist)
+{
+ const uint SHADOW_SAMPLES = 4;
+
+ float3 L = toLight / max(dist, 1e-6);
+
+ float3 tangent, bitangent;
+ BuildOrthonormalBasis(L, tangent, bitangent);
+
+ float areaRadius = max(GetPointLightMaxRadius(Lgt) * 0.03, 0.12);
+
+ float shadowAccum = 0.0;
+ float rand = Hash12(worldPos.xy + float2(worldPos.z, dist));
+
+ [unroll]
+ for (uint s = 0; s < SHADOW_SAMPLES; ++s)
+ {
+ float2 xi = Hammersley2D(s, SHADOW_SAMPLES, rand);
+ float2 d = ConcentricSampleDisk(xi) * areaRadius;
+
+ float3 sampleLightPos = Lgt.position + tangent * d.x + bitangent * d.y;
+ float3 sampleVec = sampleLightPos - worldPos;
+ float sampleDist = length(sampleVec);
+
+ if (sampleDist <= 1e-4)
+ {
+ shadowAccum += 1.0;
+ continue;
+ }
+
+ float3 sampleDir = sampleVec / sampleDist;
+
+ float NdotLRaw = saturate(dot(N, sampleDir));
+ float normalBias = lerp(gShadowBias * 3.0, gShadowBias * 0.75, NdotLRaw);
+
+ float3 shadowOrigin = worldPos + N * normalBias + sampleDir * (gShadowBias * 0.5);
+ float shadowTMax = max(sampleDist - gShadowBias * 0.5, 0.001);
+
+ shadowAccum += TraceShadow(shadowOrigin, sampleDir, shadowTMax);
+ }
+
+ return shadowAccum / (float)SHADOW_SAMPLES;
+}
+)"
+R"(
+static const uint QD3D12_MAX_RECT_LIGHT_SAMPLES = 4u;
+
+uint ClampRectLightSampleCount(uint requestedSamples)
+{
+ return min(max(requestedSamples, 1u), QD3D12_MAX_RECT_LIGHT_SAMPLES);
+}
+
+float2 StableRectLightSampleUV(uint sampleIndex, uint sampleCount)
+{
+ if (sampleCount <= 1u)
+ return float2(0.0, 0.0);
+
+ // Deterministic, symmetric positions. Do not rotate/jitter these per pixel
+ // or per frame; changing the sample pattern was the visible sparkle source
+ // for geometry emitter cards. Larger emitters can request up to 16 stable
+ // taps, which is still cheap enough for a small number of tagged emitters.
+ uint s = sampleIndex & 15u;
+
+ if (sampleCount <= 4u)
+ {
+ // Center-first pattern: fast, stable, and less likely to make a large
+ // visible emitter go black just because every corner tap was occluded.
+ if (s == 0u) return float2( 0.00, 0.00);
+ if (s == 1u) return float2(-0.60, -0.60);
+ if (s == 2u) return float2( 0.60, -0.60);
+ return float2( 0.00, 0.60);
+ }
+
+ if (sampleCount <= 8u)
+ {
+ if (s == 0u) return float2( 0.00, 0.00);
+ if (s == 1u) return float2(-0.65, -0.65);
+ if (s == 2u) return float2( 0.65, -0.65);
+ if (s == 3u) return float2(-0.65, 0.65);
+ if (s == 4u) return float2( 0.65, 0.65);
+ if (s == 5u) return float2(-0.25, 0.00);
+ if (s == 6u) return float2( 0.25, 0.00);
+ return float2( 0.00, 0.25);
+ }
+
+ // 4x4 stratified grid in [-0.875, +0.875].
+ float x = (((float)(s & 3u) + 0.5) * 0.5) - 1.0;
+ float y = (((float)(s >> 2u) + 0.5) * 0.5) - 1.0;
+ return float2(x, y) * 0.875;
+}
+
+float RectLightShadow(float3 worldPos, float3 N, Light Lgt, uint2 pixel)
+{
+ uint sampleCount = ClampRectLightSampleCount(Lgt.samples);
+
+ float visibility = 0.0;
+
+ float NoL_center = saturate(dot(N, normalize(Lgt.position - worldPos)));
+ float normalBias = lerp(gShadowBias * 4.0, gShadowBias * 0.75, NoL_center);
+ float3 baseOrigin = worldPos + N * normalBias;
+
+ [loop]
+ for (uint s = 0; s < sampleCount; ++s)
+ {
+ float2 uv = StableRectLightSampleUV(s, sampleCount);
+
+ float3 sampleLightPos =
+ Lgt.position +
+ Lgt.axisU * (uv.x * Lgt.halfWidth) +
+ Lgt.axisV * (uv.y * Lgt.halfHeight);
+
+ float3 toLight = sampleLightPos - baseOrigin;
+ float distToLight = length(toLight);
+
+ if (distToLight <= 1e-4)
+ {
+ visibility += 1.0;
+ continue;
+ }
+
+ float3 L = toLight / distToLight;
+
+ float NdotL = dot(N, L);
+ if (NdotL <= 0.0)
+ {
+ continue;
+ }
+
+ float emitTerm = (Lgt.twoSided != 0)
+ ? abs(dot(Lgt.normal, -L))
+ : dot(Lgt.normal, -L);
+
+ if (emitTerm <= 0.0)
+ {
+ continue;
+ }
+
+ float3 shadowOrigin = baseOrigin + L * (gShadowBias * 0.5);
+ float shadowTMax = max(distToLight - gShadowBias, 0.001);
+
+ visibility += TraceShadow(shadowOrigin, L, shadowTMax);
+ }
+
+ return visibility / (float)sampleCount;
+}
+
+float ComputeAmbientOcclusion(float3 worldPos, float3 N, uint2 pixel, bool isSkeletal)
+{
+ const uint AO_SAMPLES = 8;
+ float aoRadius = isSkeletal ? 18.0 : 32.0;
+
+ float3 tangent, bitangent;
+ BuildOrthonormalBasis(N, tangent, bitangent);
+
+ float rand = Hash12((float2)pixel + worldPos.xy + worldPos.zz);
+
+ float visibility = 0.0;
+
+ [unroll]
+ for (uint i = 0; i < AO_SAMPLES; ++i)
+ {
+ float2 xi = Hammersley2D(i, AO_SAMPLES, rand);
+ float3 h = CosineSampleHemisphere(xi);
+
+ float3 aoDir =
+ tangent * h.x +
+ bitangent * h.y +
+ N * h.z;
+
+ aoDir = normalize(aoDir);
+
+ float3 aoOrigin = worldPos + N * (gShadowBias * (isSkeletal ? 0.75 : 0.15));
+
+ visibility += TraceShadow(aoOrigin, aoDir, aoRadius);
+ }
+
+ visibility /= (float)AO_SAMPLES;
+ visibility = saturate(pow(visibility, 1.5));
+
+ if (isSkeletal)
+ visibility = lerp(visibility, 1.0, 0.45);
+
+ return visibility;
+}
+
+float3 GetSkyLightDirection10AM()
+{
+ // Direction from the shaded point TO the sky/sun.
+ // 10:00 AM style: angled, not straight vertical.
+ //
+ // Flip X/Y signs if you want the shadows cast the opposite horizontal way.
+ return normalize(float3(-0.55, -0.25, 0.80));
+}
+)"
+R"(
+float ComputeSkyVisibility(float3 worldPos, float3 N, uint2 pixel)
+{
+ const uint SKY_SAMPLES = 4;
+ const float SKY_TMAX = 1000000.0;
+
+ // Soft angular size of the sky/sun shadow cone.
+ // Larger = softer shadows, but more chance of light leaking.
+ const float SKY_SOFTNESS = 0.085;
+
+ float3 skyCenterDir = GetSkyLightDirection10AM();
+
+ float NoSky = dot(N, skyCenterDir);
+
+ // Mostly back-facing relative to the sky direction.
+ // Return black visibility instead of casting unstable grazing rays.
+ if (NoSky <= -0.35)
+ {
+ return 0.0;
+ }
+
+ float3 tangent, bitangent;
+ BuildOrthonormalBasis(skyCenterDir, tangent, bitangent);
+
+ float normalBias = lerp(gShadowBias * 4.0, gShadowBias * 1.0, saturate(NoSky));
+
+ float3 baseOrigin =
+ worldPos +
+ N * normalBias +
+ skyCenterDir * (gShadowBias * 2.0);
+
+ float visibility = 0.0;
+
+ // IMPORTANT:
+ // No per-pixel random rotation here.
+ // The old noise came from random hemisphere sky sampling.
+ // This keeps the soft shadow sampling pattern stable per pixel/frame.
+ [unroll]
+ for (uint i = 0; i < SKY_SAMPLES; ++i)
+ {
+ float2 xi = Hammersley2D(i, SKY_SAMPLES, 0.0);
+ float2 d = ConcentricSampleDisk(xi) * SKY_SOFTNESS;
+
+ float3 skyDir = normalize(
+ skyCenterDir +
+ tangent * d.x +
+ bitangent * d.y);
+
+ // Do not shoot rays below the world horizon.
+ if (skyDir.z <= 0.02)
+ {
+ visibility += 0.0;
+ continue;
+ }
+
+ float sampleFacing = dot(N, skyDir);
+
+ // Avoid very noisy grazing rays on back-facing surfaces.
+ if (sampleFacing <= -0.35)
+ {
+ visibility += 0.0;
+ continue;
+ }
+
+ float3 skyOrigin =
+ worldPos +
+ N * normalBias +
+ skyDir * (gShadowBias * 2.0);
+
+ visibility += TraceShadow(skyOrigin, skyDir, SKY_TMAX);
+ }
+
+ visibility /= (float)SKY_SAMPLES;
+
+ // Slightly smooth the binary ray result so it does not look harsh.
+ return saturate(visibility);
+}
+
+float ComputeCavity(uint2 pixel, float3 worldPos, float3 N)
+{
+ static const int2 taps[12] =
+ {
+ int2(-2, 0), int2( 2, 0),
+ int2( 0, -2), int2( 0, 2),
+ int2(-2, -2), int2( 2, -2),
+ int2(-2, 2), int2( 2, 2),
+ int2(-4, 0), int2( 4, 0),
+ int2( 0, -4), int2( 0, 4)
+ };
+
+ float accum = 0.0;
+ float weightSum = 0.0;
+
+ [unroll]
+ for (int i = 0; i < 12; ++i)
+ {
+ int2 sp = int2(pixel) + taps[i];
+
+ if (sp.x < 0 || sp.y < 0 || sp.x >= (int)gScreenSize.x || sp.y >= (int)gScreenSize.y)
+ continue;
+
+ float3 samplePos = gPositionTex.Load(int3(sp, 0)).xyz;
+ float3 sampleN = normalize(gNormalTex.Load(int3(sp, 0)).xyz);
+
+ float3 d = samplePos - worldPos;
+ float distSq = dot(d, d);
+
+ if (distSq > (24.0 * 24.0))
+ continue;
+
+ float nd = dot(N, sampleN);
+ if (nd < 0.65)
+ continue;
+
+ float curvature = 1.0 - saturate(nd);
+ float w = 1.0 / (1.0 + distSq * 0.02);
+
+ accum += curvature * w;
+ weightSum += w;
+ }
+
+ float cavity = (weightSum > 0.0) ? (accum / weightSum) : 0.0;
+ cavity = saturate(cavity * 2.0);
+
+ return 1.0 - cavity * 0.18;
+}
+
+float Doom3SpecularLookup(float x)
+{
+ // Doom 3 used a lookup table for specular falloff. A single high-power
+ // lobe is too binary with this G-buffer path: small normal-map/grazing
+ // differences make some materials lose specular completely. Use a broad
+ // plastic lobe plus a tighter hot spot so highlights stay readable without
+ // turning into a flat additive wash.
+ x = saturate(x);
+
+ float broad = pow(x, 12.0);
+ float tight = pow(x, 48.0);
+
+ return saturate(broad * 0.55 + tight * 0.85);
+}
+
+float SpecularPeak3(float3 c)
+{
+ return max(max(c.r, c.g), c.b);
+}
+
+bool LooksLikeAuthoredSpecularSample(float4 specSample, float3 baseAlbedo)
+{
+ // Normal path: alpha is the raster G-buffer validity bit.
+ if (specSample.a > 0.5)
+ return true;
+
+ // Tolerant path: some raster paths/specular inputs write RGB but leave the
+ // validity alpha at zero. Do not treat the fallback albedo descriptor as a
+ // spec map; when no specular texture is bound, specSample.rgb == baseAlbedo.
+ float3 specRgb = saturate(specSample.rgb);
+ float3 baseRgb = saturate(baseAlbedo);
+ float rgbPeak = SpecularPeak3(specRgb);
+ float rgbDiff = length(specRgb - baseRgb);
+
+ return rgbPeak > 0.025 && rgbDiff > 0.035;
+}
+
+float3 Doom3PseudoSpecularMask(float3 baseAlbedo)
+{
+ // Doom 3 normally uses a dedicated specular map.
+ // This fallback is only used for pixels whose specular G-buffer says no
+ // specular map was written by the raster pass.
+ float lum = dot(saturate(baseAlbedo), float3(0.299, 0.587, 0.114));
+
+ float specStrength = lerp(0.22, 0.72, saturate(lum * 1.35));
+
+ // Slight warm/colored contribution from the diffuse texture, but mostly neutral
+ // like a missing/default specular map.
+ float3 neutralSpec = float3(specStrength, specStrength, specStrength);
+ float3 tintedSpec = saturate(baseAlbedo) * 0.35 + neutralSpec * 0.65;
+
+ return max(tintedSpec, float3(0.18, 0.18, 0.18));
+}
+
+float3 LoadSceneSpecularAlbedo(uint2 pixel, float3 baseAlbedo)
+{
+ float4 specSample = gSpecularTex.Load(int3(pixel, 0));
+
+ // The raster G-buffer writer stores alpha as a validity bit. This matters
+ // for black specular maps: black should mean zero specular, not "missing map".
+ // Also accept RGB-only specular inputs when they are clearly not the fallback
+ // albedo descriptor, which fixes materials whose specular buffer forgot to
+ // set the alpha-valid bit.
+ if (LooksLikeAuthoredSpecularSample(specSample, baseAlbedo))
+ return saturate(specSample.rgb);
+
+ return Doom3PseudoSpecularMask(baseAlbedo);
+}
+
+
+float ComputeDiffuseLightingTerm(float3 N, float3 L)
+{
+ // Keep the original light volume/range attenuation exactly where it is, but
+ // make the surface response less gamey. The old 0.28-0.32 Half-Lambert wrap
+ // pushed too much light around silhouettes and into back-facing normal-map
+ // detail. This smaller squared wrap keeps Doom/idTech readability while
+ // giving a more Lambert-like, physically plausible rolloff.
+ float rawNoL = dot(normalize(N), normalize(L));
+
+ if (gEnableHalfLambert != 0u)
+ {
+ const float REALISTIC_WRAP = 0.12;
+ float wrapped = saturate((rawNoL + REALISTIC_WRAP) / (1.0 + REALISTIC_WRAP));
+ return wrapped * wrapped;
+ }
+
+ return saturate(rawNoL);
+}
+
+float EstimateSpecularRoughness(float3 specularAlbedo)
+{
+ // No roughness map is available in this G-buffer path, so infer a stable
+ // perceptual roughness from the specular map strength. Brighter spec maps
+ // get tighter highlights; dark/missing maps stay broad and subdued.
+ float peak = SpecularPeak3(saturate(specularAlbedo));
+ return clamp(lerp(0.68, 0.34, peak), 0.28, 0.72);
+}
+
+float3 ComputeSpecular(
+ float3 N,
+ float3 V,
+ float3 L,
+ float3 lightColor,
+ float lightIntensity,
+ float atten,
+ float shadow,
+ float3 specularAlbedo)
+{
+ if (gEnableSpecular == 0)
+ return 0.0;
+
+ if (atten <= 0.0 || shadow <= 0.0)
+ return 0.0;
+
+ N = normalize(N);
+ V = normalize(V);
+ L = normalize(L);
+
+ float NoL = saturate(dot(N, L));
+ float NoV = saturate(dot(N, V));
+
+ if (NoL <= 1.0e-4 || NoV <= 1.0e-4)
+ return 0.0;
+
+ float3 H = Doom3SafeNormalizeOr(L + V, N);
+ float NoH = saturate(dot(N, H));
+ float VoH = saturate(dot(V, H));
+
+ if (NoH <= 1.0e-4 || VoH <= 1.0e-4)
+ return 0.0;
+
+ float3 specMask = saturate(specularAlbedo);
+ float specPeak = SpecularPeak3(specMask);
+ if (specPeak <= 0.001)
+ return 0.0;
+
+ float roughness = EstimateSpecularRoughness(specMask);
+ float a = roughness * roughness;
+ float a2 = max(a * a, 1.0e-4);
+
+ const float PI = 3.14159265;
+
+ // GGX/Trowbridge-Reitz distribution with Smith masking and Schlick Fresnel.
+ // This is still intentionally stylized for the existing idTech-style assets,
+ // but it produces more believable view-dependent highlights than the previous
+ // additive lookup lobe and does not alter light attenuation distance.
+ float dDenom = NoH * NoH * (a2 - 1.0) + 1.0;
+ float D = a2 / max(PI * dDenom * dDenom, 1.0e-4);
+
+ float k = ((roughness + 1.0) * (roughness + 1.0)) * 0.125;
+ float Gv = NoV / max(NoV * (1.0 - k) + k, 1.0e-4);
+ float Gl = NoL / max(NoL * (1.0 - k) + k, 1.0e-4);
+ float G = Gv * Gl;
+
+ float3 F0 = saturate(lerp(float3(0.025, 0.025, 0.025), specMask, 0.58));
+ float3 F = F0 + (1.0 - F0) * pow(1.0 - VoH, 5.0);
+
+ float specTerm = (D * G) / max(4.0 * NoL * NoV, 1.0e-4);
+ specTerm = min(specTerm, 5.0);
+
+ const float SPECULAR_ENERGY_SCALE = 2.35;
+
+ float3 specular =
+ lightColor *
+ lightIntensity *
+ atten *
+ shadow *
+ NoL *
+ F *
+ specTerm *
+ SPECULAR_ENERGY_SCALE;
+
+ return clamp(specular, 0.0, 8.0);
+}
+)"
+R"(
+float TraceStraightUpToSky(float3 worldPos, float3 N)
+{
+ const float SKY_TMAX = 1000000.0;
+ float3 skyDir = float3(0.0, 0.0, 1.0);
+ float NoSky = dot(N, skyDir);
+ float normalBias = lerp(gShadowBias * 4.0, gShadowBias * 1.0, saturate(NoSky));
+
+ float3 skyOrigin =
+ worldPos +
+ N * normalBias +
+ skyDir * (gShadowBias * 2.0);
+
+ return TraceShadow(skyOrigin, skyDir, SKY_TMAX);
+}
+
+uint PcgHash(uint input)
+{
+ uint state = input * 747796405u + 2891336453u;
+ uint word = ((state >> ((state >> 28u) + 4u)) ^ state) * 277803737u;
+ return (word >> 22u) ^ word;
+}
+
+uint InitRng(uint2 pixel, uint frameIndex, uint sampleIndex)
+{
+ uint seed = pixel.x * 1973u;
+ seed ^= pixel.y * 9277u;
+ seed ^= frameIndex * 26699u;
+ seed ^= sampleIndex * 374761393u;
+ return PcgHash(seed) | 1u;
+}
+
+float Rand(inout uint rng)
+{
+ rng = PcgHash(rng);
+ return (float)rng * 2.3283064365386963e-10;
+}
+
+float2 Rand2(inout uint rng)
+{
+ return float2(Rand(rng), Rand(rng));
+}
+
+float3 SampleCosineWorld(float3 N, inout uint rng)
+{
+ float3 tangent, bitangent;
+ BuildOrthonormalBasis(N, tangent, bitangent);
+
+ float3 localDir = CosineSampleHemisphere(Rand2(rng));
+ return normalize(
+ tangent * localDir.x +
+ bitangent * localDir.y +
+ N * localDir.z);
+}
+
+float3 SampleConeWorld(float3 centerDir, float coneRadius, inout uint rng)
+{
+ float3 tangent, bitangent;
+ BuildOrthonormalBasis(centerDir, tangent, bitangent);
+
+ float2 d = ConcentricSampleDisk(Rand2(rng)) * coneRadius;
+ return normalize(centerDir + tangent * d.x + bitangent * d.y);
+}
+
+float3 GetSkyRadiance(float3 dir)
+{
+ float upness = saturate(dir.z * 0.5 + 0.5);
+
+ float3 warmSky = float3(0.98, 0.55, 0.35);
+ float3 coolSky = float3(0.30, 0.40, 0.62);
+ float3 sky = lerp(warmSky * 0.22, coolSky * 0.55, upness);
+
+ float sunAmount = pow(saturate(dot(dir, GetSkyLightDirection10AM())), 96.0);
+ sky += warmSky * (sunAmount * 2.25);
+
+ return sky;
+}
+
+float TraceVisibilityBiased(float3 worldPos, float3 N, float3 dir, float maxT)
+{
+ float NoD = saturate(dot(N, dir));
+ float normalBias = lerp(gShadowBias * 3.0, gShadowBias * 0.75, NoD);
+ float3 origin = worldPos + N * normalBias + dir * (gShadowBias * 0.5);
+ return TraceShadow(origin, dir, max(maxT - gShadowBias * 0.5, 0.001));
+}
+
+
+float3 CompressEmissiveRadiance(float3 e, float peakLimit)
+{
+ e = max(e, 0.0);
+ float peak = max(max(e.r, e.g), e.b);
+ if (peak > peakLimit && peak > 1e-5)
+ e *= peakLimit / peak;
+ return e;
+}
+
+float3 LoadEmissiveRadianceClamped(int2 p)
+{
+ int2 maxPixel = int2((int)gScreenSize.x - 1, (int)gScreenSize.y - 1);
+ p = clamp(p, int2(0, 0), maxPixel);
+ float3 radiance = CompressEmissiveRadiance(gEmissiveTex.Load(int3(p, 0)).rgb, 18.0);
+ return min(radiance + sqrt(max(radiance, 0.0)) * 0.35, 22.0);
+}
+
+float3 EstimateEmissiveBloomAtPixel(uint2 pixel)
+{
+ int2 p = int2(pixel);
+
+ // Strong threshold-free bloom in the ray output. Particle emissive lighting
+ // is injected separately below; this is the visible camera halo.
+ float3 bloom = 0.0;
+ bloom += LoadEmissiveRadianceClamped(p) * 0.320;
+
+ bloom += LoadEmissiveRadianceClamped(p + int2( 1, 0)) * 0.420;
+ bloom += LoadEmissiveRadianceClamped(p + int2(-1, 0)) * 0.420;
+ bloom += LoadEmissiveRadianceClamped(p + int2( 0, 1)) * 0.420;
+ bloom += LoadEmissiveRadianceClamped(p + int2( 0, -1)) * 0.420;
+
+ bloom += LoadEmissiveRadianceClamped(p + int2( 2, 2)) * 0.260;
+ bloom += LoadEmissiveRadianceClamped(p + int2(-2, 2)) * 0.260;
+ bloom += LoadEmissiveRadianceClamped(p + int2( 2, -2)) * 0.260;
+ bloom += LoadEmissiveRadianceClamped(p + int2(-2, -2)) * 0.260;
+
+ bloom += LoadEmissiveRadianceClamped(p + int2( 4, 0)) * 0.180;
+ bloom += LoadEmissiveRadianceClamped(p + int2(-4, 0)) * 0.180;
+ bloom += LoadEmissiveRadianceClamped(p + int2( 0, 4)) * 0.180;
+ bloom += LoadEmissiveRadianceClamped(p + int2( 0, -4)) * 0.180;
+
+ bloom += LoadEmissiveRadianceClamped(p + int2( 8, 0)) * 0.120;
+ bloom += LoadEmissiveRadianceClamped(p + int2(-8, 0)) * 0.120;
+ bloom += LoadEmissiveRadianceClamped(p + int2( 0, 8)) * 0.120;
+ bloom += LoadEmissiveRadianceClamped(p + int2( 0, -8)) * 0.120;
+
+ bloom += LoadEmissiveRadianceClamped(p + int2( 14, 0)) * 0.075;
+ bloom += LoadEmissiveRadianceClamped(p + int2(-14, 0)) * 0.075;
+ bloom += LoadEmissiveRadianceClamped(p + int2( 0, 14)) * 0.075;
+ bloom += LoadEmissiveRadianceClamped(p + int2( 0, -14)) * 0.075;
+
+ bloom += LoadEmissiveRadianceClamped(p + int2( 24, 0)) * 0.045;
+ bloom += LoadEmissiveRadianceClamped(p + int2(-24, 0)) * 0.045;
+ bloom += LoadEmissiveRadianceClamped(p + int2( 0, 24)) * 0.045;
+ bloom += LoadEmissiveRadianceClamped(p + int2( 0, -24)) * 0.045;
+
+ bloom += LoadEmissiveRadianceClamped(p + int2( 42, 0)) * 0.025;
+ bloom += LoadEmissiveRadianceClamped(p + int2(-42, 0)) * 0.025;
+ bloom += LoadEmissiveRadianceClamped(p + int2( 0, 42)) * 0.025;
+ bloom += LoadEmissiveRadianceClamped(p + int2( 0, -42)) * 0.025;
+
+ return min(bloom * 1.45, 28.0);
+}
+
+float3 SafeNormalizeOr(float3 v, float3 fallback)
+{
+ float lenSq = dot(v, v);
+ if (lenSq <= 1e-8)
+ return fallback;
+ return v * rsqrt(lenSq);
+}
+
+bool TryScreenParticleWorldCandidate(float4 clip, float3 receiverPos, inout float bestDistSq, inout float3 bestWorld)
+{
+ float4 worldA = mul(clip, gInvViewProj);
+ if (abs(worldA.w) > 1e-6)
+ {
+ float3 candidate = worldA.xyz / worldA.w;
+ float distSq = dot(candidate - receiverPos, candidate - receiverPos);
+ if (distSq < bestDistSq && distSq > 1e-4 && distSq < 147456.0)
+ {
+ bestDistSq = distSq;
+ bestWorld = candidate;
+ }
+ }
+
+ float4 worldB = mul(gInvViewProj, clip);
+ if (abs(worldB.w) > 1e-6)
+ {
+ float3 candidate = worldB.xyz / worldB.w;
+ float distSq = dot(candidate - receiverPos, candidate - receiverPos);
+ if (distSq < bestDistSq && distSq > 1e-4 && distSq < 147456.0)
+ {
+ bestDistSq = distSq;
+ bestWorld = candidate;
+ }
+ }
+
+ return bestDistSq < 147456.0;
+}
+
+bool TryReconstructScreenParticleWorld(uint2 particlePixel, float particleDepth, float3 receiverPos, out float3 particleWorld)
+{
+ float2 uv = ((float2)particlePixel + 0.5) / max(gScreenSize.xy, float2(1.0, 1.0));
+ float x = uv.x * 2.0 - 1.0;
+ float yUp = 1.0 - uv.y * 2.0;
+ float yDown = uv.y * 2.0 - 1.0;
+
+ float bestDistSq = 1.0e30;
+ particleWorld = receiverPos;
+ TryScreenParticleWorldCandidate(float4(x, yUp, particleDepth, 1.0), receiverPos, bestDistSq, particleWorld);
+ TryScreenParticleWorldCandidate(float4(x, yDown, particleDepth, 1.0), receiverPos, bestDistSq, particleWorld);
+ return bestDistSq < 147456.0;
+}
+
+float3 EstimateScreenSpaceEmissiveParticleLighting(uint2 pixel, float3 worldPos, float3 N)
+{
+ static const int2 kParticleLightTaps[17] =
+ {
+ int2( 0, 0),
+ int2( 7, 0), int2( -7, 0), int2( 0, 7), int2( 0, -7),
+ int2( 10, 10), int2(-10, 10), int2( 10, -10), int2(-10, -10),
+ int2( 18, 4), int2(-18, -4), int2( 4, 18), int2( -4, -18),
+ int2( 30, 0), int2(-30, 0), int2( 0, 30), int2( 0, -30)
+ };
+
+ int2 maxPixel = int2((int)gScreenSize.x - 1, (int)gScreenSize.y - 1);
+ float pixelScale = max(1.0, round(min(gScreenSize.x, gScreenSize.y) / 720.0));
+ float3 lighting = 0.0;
+
+ [unroll]
+ for (uint i = 0u; i < 17u; ++i)
+ {
+ int2 sp = int2(pixel) + int2(round((float2)kParticleLightTaps[i] * pixelScale));
+ sp = clamp(sp, int2(0, 0), maxPixel);
+
+ float4 particleEmission = gEmissiveTex.Load(int3(sp, 0));
+ if (particleEmission.a <= 1.5)
+ continue;
+
+ float particleDepth = saturate(particleEmission.a - 2.0);
+ float3 particleWorld;
+ if (!TryReconstructScreenParticleWorld(uint2(sp), particleDepth, worldPos, particleWorld))
+ continue;
+
+ float3 toParticle = particleWorld - worldPos;
+ float distSq = dot(toParticle, toParticle);
+ if (distSq <= 1e-4 || distSq >= 147456.0)
+ continue;
+
+ float dist = sqrt(distSq);
+ float3 L = toParticle / dist;
+ float NoL = saturate(dot(N, L));
+ if (NoL <= 0.01)
+ continue;
+
+ float visibility = TraceVisibilityBiased(worldPos, N, L, dist);
+ if (visibility <= 0.0)
+ continue;
+
+ float distanceFade = saturate(1.0 - dist / 640.0);
+ distanceFade *= distanceFade;
+ float attenuation = distanceFade / (1.0 + distSq * 0.000075);
+ lighting += CompressEmissiveRadiance(particleEmission.rgb, 24.0) * (NoL * visibility * attenuation);
+ }
+
+ return lighting * 9.0;
+}
+
+// Screen-space material projection removed. Secondary/reflection paths no longer
+// project DXR hits back into the camera G-buffer.
+float3 EstimatePathTracedSky(float3 worldPos, float3 N, inout uint rng)
+{
+ const float SKY_TMAX = 1000000.0;
+
+ uint bounceSamples = max(gMaxBounces, 1u);
+ bounceSamples = min(bounceSamples, 4u);
+
+ float3 accum = 0.0;
+
+ [loop]
+ for (uint b = 0; b < bounceSamples; ++b)
+ {
+ float3 dir = SampleCosineWorld(N, rng);
+ float NoD = saturate(dot(N, dir));
+ float visibility = TraceVisibilityBiased(worldPos, N, dir, SKY_TMAX);
+
+ // This is a G-buffer path-traced approximation: secondary hits are used as
+ // occluders because this pass does not bind per-triangle material data yet.
+ accum += GetSkyRadiance(dir) * visibility * NoD;
+ }
+
+ accum /= (float)bounceSamples;
+ return accum * 0.55;
+}
+
+float3 PathTraceDirectPointLight(uint2 pixel, float3 worldPos, float3 N, float3 V, float3 baseAlbedo, float3 specularAlbedo, Light Lgt, inout uint rng, out float3 specularOut)
+{
+ specularOut = 0.0;
+
+ float3 toCenter = Lgt.position - worldPos;
+ float centerDist = length(toCenter);
+ if (centerDist <= 0.01)
+ return 0.0;
+
+ float3 centerDir = toCenter / centerDist;
+ float3 tangent, bitangent;
+ BuildOrthonormalBasis(centerDir, tangent, bitangent);
+
+ float atten = ComputePointLightAttenuation(worldPos, Lgt);
+ if (atten <= 0.0)
+ return 0.0;
+
+ uint sampleCount = max(Lgt.samples, 1u);
+ sampleCount = (gEnableDenoiser == 0u) ? 1u : min(sampleCount, 4u);
+
+ // One random area-light sample per frame was one of the visible noise sources.
+ // Use a deterministic low-discrepancy pattern instead. With a single sample,
+ // use the light center so default point lights are hard-shadowed and stable.
+ float areaRadius = (sampleCount > 1u && Lgt.samples > 1u) ? max(GetPointLightMaxRadius(Lgt) * 0.03, 0.12) : 0.0;
+ float rand = Hash12((float2)pixel + worldPos.xy + float2(worldPos.z, centerDist));
+
+ float3 diffuseAccum = 0.0;
+ float3 specAccum = 0.0;
+
+ [loop]
+ for (uint s = 0u; s < sampleCount; ++s)
+ {
+ float2 disk = float2(0.0, 0.0);
+ if (areaRadius > 0.0)
+ disk = ConcentricSampleDisk(Hammersley2D(s, sampleCount, rand)) * areaRadius;
+
+ float3 sampleLightPos = Lgt.position + tangent * disk.x + bitangent * disk.y;
+ float3 toLight = sampleLightPos - worldPos;
+ float dist = length(toLight);
+ if (dist <= 0.01)
+ continue;
+
+ float3 L = toLight / dist;
+
+ float diffuseNoL = ComputeDiffuseLightingTerm(N, L);
+
+ float shadow = 1.0;
+ if (Lgt.samples != 0u && diffuseNoL > 0.0001)
+ shadow = TraceVisibilityBiased(worldPos, N, L, dist);
+
+ if (Lgt.pointRadiusPad <= 0.5)
+ specAccum += ComputeSpecular(N, V, L, Lgt.color, Lgt.intensity, atten, shadow, specularAlbedo);
+
+ diffuseAccum += Lgt.color * (Lgt.intensity * atten * diffuseNoL * shadow);
+ }
+
+ float invSamples = 1.0 / (float)sampleCount;
+ specularOut = specAccum * invSamples;
+ return diffuseAccum * invSamples;
+}
+
+float3 PathTraceDirectSpotLight(float3 worldPos, float3 N, float3 V, float3 baseAlbedo, float3 specularAlbedo, Light Lgt, inout uint rng, out float3 specularOut)
+{
+ specularOut = 0.0;
+
+ float3 toLight = Lgt.position - worldPos;
+ float dist = length(toLight);
+ if (dist <= 0.01)
+ return 0.0;
+
+ float3 L = toLight / dist;
+ float atten = ComputeSpotLightAttenuation(worldPos, Lgt);
+
+ float diffuseNoL = ComputeDiffuseLightingTerm(N, L);
+
+ float shadow = 1.0;
+ if (Lgt.samples != 0u && diffuseNoL > 0.0001 && atten > 0.0)
+ shadow = TraceVisibilityBiased(worldPos, N, L, dist);
+
+ if (Lgt.pointRadiusPad <= 0.5)
+ specularOut = ComputeSpecular(N, V, L, Lgt.color, Lgt.intensity, atten, shadow, specularAlbedo);
+
+ return Lgt.color * (Lgt.intensity * atten * diffuseNoL * shadow);
+}
+
+float3 PathTraceDirectRectLight(uint2 pixel, float3 worldPos, float3 N, float3 V, float3 baseAlbedo, float3 specularAlbedo, Light Lgt, inout uint rng, out float3 specularOut)
+{
+ specularOut = 0.0;
+
+ float3 toCenter = Lgt.position - worldPos;
+ float centerDist = length(toCenter);
+ if (centerDist <= 0.01)
+ return 0.0;
+
+ float attenRadius = max(Lgt.radius, 1e-4);
+ float atten = saturate((attenRadius - centerDist) / attenRadius);
+ atten = atten * atten * atten * atten;
+
+ if (atten <= 0.0)
+ return 0.0;
+
+ uint sampleCount = ClampRectLightSampleCount(Lgt.samples);
+
+ float3 diffuseAccum = 0.0;
+ float3 specAccum = 0.0;
+
+ [loop]
+ for (uint s = 0u; s < sampleCount; ++s)
+ {
+ float2 uv = StableRectLightSampleUV(s, sampleCount);
+
+ float3 sampleLightPos =
+ Lgt.position +
+ Lgt.axisU * (uv.x * Lgt.halfWidth) +
+ Lgt.axisV * (uv.y * Lgt.halfHeight);
+
+ float3 sampleVec = sampleLightPos - worldPos;
+ float sampleDist = length(sampleVec);
+ if (sampleDist <= 0.01)
+ continue;
+
+ float3 L = sampleVec / sampleDist;
+ float NdotL = ComputeDiffuseLightingTerm(N, L);
+ if (NdotL <= 0.0)
+ continue;
+
+ float faceTerm = (Lgt.twoSided != 0)
+ ? abs(dot(-L, Lgt.normal))
+ : saturate(dot(-L, Lgt.normal));
+
+ if (faceTerm <= 0.0)
+ continue;
+
+ float shadow = 1.0;
+ if (Lgt.samples != 0u)
+ shadow = TraceVisibilityBiased(worldPos, N, L, sampleDist);
+
+ if (Lgt.pointRadiusPad <= 0.5)
+ {
+ specAccum += ComputeSpecular(
+ N,
+ V,
+ L,
+ Lgt.color,
+ Lgt.intensity * faceTerm,
+ 1.0,
+ shadow,
+ specularAlbedo) * atten;
+ }
+
+ diffuseAccum += clamp(Lgt.color * (Lgt.intensity * NdotL * faceTerm * atten * shadow), 0.0, 4.0);
+ }
+
+ float invSamples = 1.0 / (float)sampleCount;
+ specularOut = specAccum * invSamples;
+ return diffuseAccum * invSamples;
+}
+
+float HenyeyGreensteinPhase(float cosTheta, float g)
+{
+ g = clamp(g, -0.85, 0.85);
+ float g2 = g * g;
+ float denom = max(1.0 + g2 - 2.0 * g * cosTheta, 1e-3);
+ return (1.0 - g2) / max(4.0 * 3.14159265 * pow(denom, 1.5), 1e-3);
+}
+
+bool IsPointInsideLightVolume(float3 samplePos, Light Lgt)
+{
+ if (Lgt.type == GL_RAYTRACING_LIGHT_TYPE_POINT)
+ {
+ float3 radii = GetPointLightRadius(Lgt);
+ float3 offset = samplePos - Lgt.position;
+
+ float3 axisU = Doom3SafeNormalizeOr(Lgt.axisU, float3(1.0, 0.0, 0.0));
+ float3 axisV = Doom3SafeNormalizeOr(Lgt.axisV, float3(0.0, 1.0, 0.0));
+ float3 axisW = Doom3SafeNormalizeOr(Lgt.normal, float3(0.0, 0.0, 1.0));
+
+ return abs(dot(offset, axisU)) < radii.x &&
+ abs(dot(offset, axisV)) < radii.y &&
+ abs(dot(offset, axisW)) < radii.z;
+ }
+
+ if (Lgt.type == GL_RAYTRACING_LIGHT_TYPE_SPOT)
+ {
+ float3 lightToSample = samplePos - Lgt.position;
+
+ float nearClip = max(Lgt.pointRadius.x, 0.0);
+ float farClip = max(Lgt.radius, nearClip + 1e-4);
+ float3 spotDir = Doom3SafeNormalizeOr(Lgt.normal, float3(0.0, 0.0, 1.0));
+ float depth = dot(lightToSample, spotDir);
+
+ if (depth <= nearClip || depth >= farClip)
+ return false;
+
+ float3 axisU = Doom3SafeNormalizeOr(Lgt.axisU, float3(1.0, 0.0, 0.0));
+ float3 axisV = Doom3SafeNormalizeOr(Lgt.axisV, float3(0.0, 1.0, 0.0));
+ float invDepth = 1.0 / max(depth, 1e-4);
+
+ float signedU = (dot(lightToSample, axisU) * invDepth) / max(abs(Lgt.halfWidth), 1e-4);
+ float signedV = (dot(lightToSample, axisV) * invDepth) / max(abs(Lgt.halfHeight), 1e-4);
+
+ return abs(signedU) < 1.0 && abs(signedV) < 1.0;
+ }
+
+ return false;
+}
+
+float ComputeLightVolumeAttenuation(float3 samplePos, Light Lgt)
+{
+ if (Lgt.type == GL_RAYTRACING_LIGHT_TYPE_POINT)
+ return ComputePointLightAttenuation(samplePos, Lgt);
+
+ if (Lgt.type == GL_RAYTRACING_LIGHT_TYPE_SPOT)
+ return ComputeSpotLightAttenuation(samplePos, Lgt);
+
+ return 0.0;
+}
+
+float EstimateVolumeDensityFromLight(Light Lgt)
+{
+ // Doom 3 world units are large. Tie the default participating-medium density
+ // to light range so the caller only needs one artist-facing attribute.
+ float range = (Lgt.type == GL_RAYTRACING_LIGHT_TYPE_POINT)
+ ? GetPointLightMaxRadius(Lgt)
+ : max(Lgt.radius, 1.0);
+
+ return clamp(2.25 / max(range, 32.0), 0.0015, 0.035);
+}
+)"
+R"(
+float3 EstimateSingleLightVolumetricScattering(uint2 pixel, float3 cameraPos, float3 worldPos, Light Lgt, inout uint rng)
+{
+ if (Lgt.volumetricScattering <= 0.0)
+ return 0.0;
+
+ if (Lgt.type != GL_RAYTRACING_LIGHT_TYPE_POINT && Lgt.type != GL_RAYTRACING_LIGHT_TYPE_SPOT)
+ return 0.0;
+
+ float3 cameraToSurface = worldPos - cameraPos;
+ float viewDist = length(cameraToSurface);
+ if (viewDist <= 0.01)
+ return 0.0;
+
+ float3 viewDir = cameraToSurface / viewDist;
+
+ uint stepCount = (uint)ceil(viewDist / 64.0);
+ stepCount = min(max(stepCount, 8u), 32u);
+ float stepLen = viewDist / (float)stepCount;
+
+ // Do not frame-jitter the march. This renderer has no temporal GI history,
+ // so varying the volume sample positions every frame creates visible sparkle.
+ // A centered deterministic slice is stable and the spatial denoiser can smooth it.
+ float jitter = 0.5;
+
+ float density = EstimateVolumeDensityFromLight(Lgt);
+ float anisotropy = (Lgt.type == GL_RAYTRACING_LIGHT_TYPE_SPOT) ? 0.55 : 0.35;
+
+ float3 accum = 0.0;
+
+ [loop]
+ for (uint s = 0u; s < stepCount; ++s)
+ {
+ float t = ((float)s + jitter) * stepLen;
+ t = min(t, viewDist - 0.001);
+
+ float3 samplePos = cameraPos + viewDir * t;
+ if (!IsPointInsideLightVolume(samplePos, Lgt))
+ continue;
+
+ float3 toLight = Lgt.position - samplePos;
+ float lightDist = length(toLight);
+ if (lightDist <= 0.01)
+ continue;
+
+ float3 L = toLight / lightDist;
+
+ float visibility = 1.0;
+ if (Lgt.samples != 0u)
+ {
+ float3 shadowOrigin = samplePos + L * (gShadowBias * 0.75) + viewDir * (gShadowBias * 0.15);
+ visibility = TraceShadow(shadowOrigin, L, max(lightDist - gShadowBias, 0.001));
+ }
+ if (visibility <= 0.0)
+ continue;
+
+ float atten = ComputeLightVolumeAttenuation(samplePos, Lgt);
+ if (atten <= 0.0)
+ continue;
+
+ float phase = HenyeyGreensteinPhase(dot(L, viewDir), anisotropy);
+ float transmittance = exp(-density * t);
+ float slice = density * stepLen;
+
+ accum += Lgt.color * (Lgt.intensity * atten * visibility * phase * transmittance * slice);
+ }
+
+ // Scale from normalized phase-function energy into a game-facing glow term.
+ // The user-facing light attribute still controls the final strength.
+ const float DOOM3_VOLUME_SCALE = 7.5;
+ return clamp(accum * max(Lgt.volumetricScattering, 0.0) * DOOM3_VOLUME_SCALE, 0.0, 12.0);
+}
+
+float3 EstimatePathTracedVolumetricScattering(uint2 pixel, float3 worldPos, inout uint rng)
+{
+ float3 volume = 0.0;
+
+ [loop]
+ for (uint i = 0; i < gLightCount; ++i)
+ {
+ Light Lgt = gLights[i];
+ if (Lgt.volumetricScattering <= 0.0)
+ continue;
+
+ if (Lgt.type == GL_RAYTRACING_LIGHT_TYPE_POINT || Lgt.type == GL_RAYTRACING_LIGHT_TYPE_SPOT)
+ volume += EstimateSingleLightVolumetricScattering(pixel, gCameraPos.xyz, worldPos, Lgt, rng);
+ }
+
+ return volume;
+}
+)"
+R"(
+float3 EstimateFastBounceLight(float3 hitPos, float3 hitN, Light Lgt)
+{
+ // Cheap unshadowed estimate used as the all-lights baseline for secondary
+ // GI. A small shadowed subset below corrects this baseline so every light
+ // still bounces, but important occlusion is no longer missing from GI.
+ if (Lgt.type == GL_RAYTRACING_LIGHT_TYPE_POINT)
+ {
+ float3 toLight = Lgt.position - hitPos;
+ float dist = length(toLight);
+ if (dist <= 0.01)
+ return 0.0;
+
+ float3 L = toLight / dist;
+ float atten = ComputePointLightAttenuation(hitPos, Lgt);
+ if (atten <= 0.0)
+ return 0.0;
+
+ float nDotL = ComputeDiffuseLightingTerm(hitN, L);
+ return clamp(Lgt.color * (Lgt.intensity * atten * nDotL), 0.0, 8.0);
+ }
+ else if (Lgt.type == GL_RAYTRACING_LIGHT_TYPE_SPOT)
+ {
+ float3 toLight = Lgt.position - hitPos;
+ float dist = length(toLight);
+ if (dist <= 0.01)
+ return 0.0;
+
+ float3 L = toLight / dist;
+ float atten = ComputeSpotLightAttenuation(hitPos, Lgt);
+ if (atten <= 0.0)
+ return 0.0;
+
+ float nDotL = ComputeDiffuseLightingTerm(hitN, L);
+ return clamp(Lgt.color * (Lgt.intensity * atten * nDotL), 0.0, 8.0);
+ }
+ else if (Lgt.type == GL_RAYTRACING_LIGHT_TYPE_RECT)
+ {
+ float3 toCenter = Lgt.position - hitPos;
+ float centerDist = length(toCenter);
+ if (centerDist <= 0.01)
+ return 0.0;
+
+ float attenRadius = max(Lgt.radius, 1e-4);
+ float atten = saturate((attenRadius - centerDist) / attenRadius);
+ atten = atten * atten;
+ if (atten <= 0.0)
+ return 0.0;
+
+ float3 L = toCenter / centerDist;
+ float nDotL = ComputeDiffuseLightingTerm(hitN, L);
+ if (nDotL <= 0.0)
+ return 0.0;
+
+ float faceTerm = (Lgt.twoSided != 0)
+ ? abs(dot(-L, Lgt.normal))
+ : saturate(dot(-L, Lgt.normal));
+
+ if (faceTerm <= 0.0)
+ return 0.0;
+
+ return clamp(Lgt.color * (Lgt.intensity * nDotL * faceTerm * atten), 0.0, 8.0);
+ }
+
+ return 0.0;
+}
+
+float3 EstimateShadowedBounceLight(uint2 hitPixel, float3 hitPos, float3 hitN, float3 hitV, float3 hitAlbedo, Light Lgt, inout uint rng)
+{
+ float3 spec = 0.0;
+ float3 diffuse = 0.0;
+ float3 hitSpecularAlbedo = LoadSceneSpecularAlbedo(hitPixel, hitAlbedo);
+
+ // Use the same visibility-capable direct-light samplers as the primary hit.
+ // This supplies proper next-event estimation at secondary hits instead of the
+ // old unoccluded light-list approximation.
+ if (Lgt.type == GL_RAYTRACING_LIGHT_TYPE_POINT)
+ {
+ diffuse = PathTraceDirectPointLight(hitPixel, hitPos, hitN, hitV, hitAlbedo, hitSpecularAlbedo, Lgt, rng, spec);
+ }
+ else if (Lgt.type == GL_RAYTRACING_LIGHT_TYPE_SPOT)
+ {
+ diffuse = PathTraceDirectSpotLight(hitPos, hitN, hitV, hitAlbedo, hitSpecularAlbedo, Lgt, rng, spec);
+ }
+ else if (Lgt.type == GL_RAYTRACING_LIGHT_TYPE_RECT)
+ {
+ diffuse = PathTraceDirectRectLight(hitPixel, hitPos, hitN, hitV, hitAlbedo, hitSpecularAlbedo, Lgt, rng, spec);
+ }
+
+ return clamp(diffuse, 0.0, 12.0);
+}
+
+float3 EstimateBounceSkyLighting(float3 hitPos, float3 hitN, inout uint rng)
+{
+ const float SKY_TMAX = 1000000.0;
+
+ uint skySamples = (gSamplesPerPixel >= 4u) ? 2u : 1u;
+ float3 accum = 0.0;
+
+ [loop]
+ for (uint i = 0u; i < skySamples; ++i)
+ {
+ float3 skyDir = (i == 0u)
+ ? SampleConeWorld(GetSkyLightDirection10AM(), 0.18, rng)
+ : SampleCosineWorld(hitN, rng);
+
+ float NoSky = saturate(dot(hitN, skyDir));
+ if (NoSky <= 0.0)
+ continue;
+
+ float visibility = TraceVisibilityBiased(hitPos, hitN, skyDir, SKY_TMAX);
+ accum += GetSkyRadiance(skyDir) * visibility * NoSky;
+ }
+
+ return accum / (float)skySamples;
+}
+
+float3 EstimateDirectLightingForBounceHit(uint2 hitPixel, float3 hitPos, float3 hitN, float3 hitV, float3 hitAlbedo, uint hitGeoFlag, inout uint rng)
+{
+ bool hitIsSkeletal = (hitGeoFlag & GEOMETRY_FLAG_SKELETAL) != 0u;
+ bool hitIsUnlit = (hitGeoFlag & GEOMETRY_FLAG_UNLIT) != 0u;
+
+ hitN = SafeNormalizeOr(hitN, float3(0.0, 0.0, 1.0));
+ hitV = SafeNormalizeOr(hitV, -hitN);
+ hitAlbedo = saturate(hitAlbedo);
+
+ // Treat unlit G-buffer surfaces as simple bounce cards. Glow-map emissive is
+ // intentionally excluded here so visible emissive no longer casts GI/light.
+ if (hitIsUnlit)
+ return clamp(hitAlbedo * 2.0 + GetSkyRadiance(hitN) * 0.04, 0.0, 6.0);
+
+ float upness = saturate(hitN.z * 0.5 + 0.5);
+ float3 lighting = gAmbientColor.rgb * (gAmbientColor.a * 0.035);
+
+ // Real occluded sky contribution at the secondary hit. The previous GI path
+ // used a fixed sky term, so corners/cavities received too much indirect light.
+ lighting += EstimateBounceSkyLighting(hitPos, hitN, rng) * (0.14 + 0.10 * upness);
+
+ // Glow-map emissive no longer participates in secondary GI. It remains a
+ // direct visible/bloom-only effect until real material-space emissive lighting
+ // is implemented.
+
+ // Baseline: every light contributes to bounced radiance, so small dynamic
+ // lights do not vanish just because they were not chosen by the stochastic
+ // next-event-estimation budget.
+ float3 fastAllLights = 0.0;
+ [loop]
+ for (uint i = 0; i < gLightCount; ++i)
+ {
+ fastAllLights += EstimateFastBounceLight(hitPos, hitN, gLights[i]);
+ }
+ lighting += fastAllLights;
+
+ // Keep secondary light response deterministic. A rotating shadowed-light
+ // correction looked good in stills but caused bright Doom lights to sparkle
+ // badly in GI because only a few lights were corrected each frame.
+
+ //if (hitIsSkeletal)
+ // lighting *= 1.10;
+
+ // Outgoing diffuse radiance from the bounce surface. The primary surface's
+ // albedo is applied later in RayGen, so only the secondary hit albedo belongs
+ // here.
+ return clamp(hitAlbedo * max(lighting, 0.0), 0.0, 16.0);
+}
+
+)"
+R"(
+float3 EstimateReactiveScreenSpaceFinalGather(uint2 pixel, float3 worldPos, float3 N, float3 V, float3 baseAlbedo, inout uint rng)
+{
+ // Disabled on purpose. This used to sample nearby camera G-buffer pixels and
+ // was therefore screen-space lighting. Geometry emitters now light the scene
+ // only through the DXR light list and TraceShadow() visibility rays.
+ return 0.0;
+}
+)"
+R"(
+float3 TraceOneIndirectBouncePath(uint2 pixel, float3 worldPos, float3 N, float3 V, float3 baseAlbedo, inout uint rng)
+{
+ // Disabled until this renderer has real per-hit material/emissive buffers in
+ // the SBT. The old implementation traced a ray, then projected the hit back
+ // into the current camera G-buffer with the current camera G-buffer, which made
+ // indirect light depend on what was visible on screen. Direct area lighting
+ // below is still fully ray traced through the TLAS.
+ return 0.0;
+}
+
+float3 EstimatePathTracedIndirectBounce(uint2 pixel, float3 worldPos, float3 N, float3 V, float3 baseAlbedo, inout uint rng)
+{
+ // No screen-space material fallback and no stochastic diffuse GI in the fast
+ // geometry-emitter path. Area lights are evaluated by PathTraceDirect* with
+ // DXR visibility rays.
+ return 0.0;
+}
+
+float3 ApplyPrimaryDiffusePost(float3 lightingAccum, float ao, float microShadow, bool isSkeletal)
+{
+ if (isSkeletal)
+ {
+ ao = lerp(ao, 1.0, 0.35);
+ microShadow = lerp(microShadow, 1.0, 0.65);
+ }
+
+ lightingAccum *= ao;
+ lightingAccum *= microShadow;
+
+ //if (isSkeletal)
+ // lightingAccum *= 1.2;
+
+ return max(lightingAccum, 0.0);
+}
+
+float3 ApplyPrimarySpecularPost(float3 specularAccum, float ao, bool isSkeletal)
+{
+ // AO is a diffuse/ambient visibility term here. Multiplying specular by AO
+ // directly made highlights disappear on creases, props, and normal-mapped
+ // surfaces. Keep a mild occlusion tint, but let direct-light specular read.
+ float specAo = lerp(0.58, 1.0, saturate(ao));
+ if (isSkeletal)
+ specAo = lerp(specAo, 1.0, 0.50);
+ specularAccum *= specAo;
+
+ //if (isSkeletal)
+ // specularAccum *= 1.15;
+
+ return max(specularAccum, 0.0);
+}
+
+float3 PathTraceDeterministicLighting(
+ uint2 pixel,
+ float3 worldPos,
+ float3 N,
+ float3 V,
+ float3 baseAlbedo,
+ float3 specularAlbedo,
+ bool isSkeletal,
+ float cavity,
+ float ao,
+ float skyVis,
+ float ambientSkyVis,
+ out float3 specularAccum)
+{
+ specularAccum = 0.0;
+
+ float microShadow = 1.0;
+
+ // These environment and direct-light terms are deterministic for a given
+ // pixel. The old RayGen evaluated them once for every SPP, which multiplied
+ // the AO/sky/direct shadow ray budget without adding new samples.
+ float upness = saturate(N.z * 0.5 + 0.5);
+ float3 skyColorRGB = float3(0.98, 0.55, 0.35);
+ float3 skyColor = skyColorRGB * (0.35 + 0.65 * upness);
+
+ float3 lightingAccum = gAmbientColor.rgb * (gAmbientColor.a * 0.04);
+ lightingAccum += skyColor * (0.42 * skyVis);
+ lightingAccum += ambientSkyVis * (skyColorRGB * 0.12);
+
+ // Glow-map emissive is direct/bloom-only for now. It is added after lighting
+ // in RayGen and is intentionally not injected into lightingAccum.
+
+ //if (isSkeletal)
+ // lightingAccum += 0.1;
+
+ // The current direct-light evaluators are deterministic. Keep the inout RNG
+ // argument only because the functions share the same signature as stochastic
+ // helpers; it is not consumed by PathTraceDirect* in the current shader.
+ uint directRng = InitRng(pixel, 0u, 0xD17EC7u);
+
+ [loop]
+ for (uint i = 0; i < gLightCount; ++i)
+ {
+ Light Lgt = gLights[i];
+ float3 spec = 0.0;
+ float3 diffuse = 0.0;
+
+ if (Lgt.type == GL_RAYTRACING_LIGHT_TYPE_POINT)
+ {
+ diffuse = PathTraceDirectPointLight(pixel, worldPos, N, V, baseAlbedo, specularAlbedo, Lgt, directRng, spec);
+ }
+ else if (Lgt.type == GL_RAYTRACING_LIGHT_TYPE_SPOT)
+ {
+ diffuse = PathTraceDirectSpotLight(worldPos, N, V, baseAlbedo, specularAlbedo, Lgt, directRng, spec);
+ }
+ else if (Lgt.type == GL_RAYTRACING_LIGHT_TYPE_RECT)
+ {
+ diffuse = PathTraceDirectRectLight(pixel, worldPos, N, V, baseAlbedo, specularAlbedo, Lgt, directRng, spec);
+ }
+
+ lightingAccum += diffuse;
+ specularAccum += spec;
+ }
+
+ specularAccum = ApplyPrimarySpecularPost(specularAccum, ao, isSkeletal);
+ return ApplyPrimaryDiffusePost(lightingAccum, ao, microShadow, isSkeletal);
+}
+
+
+float3 EstimateFallbackReflectionHitRadiance(float3 hitPos, float3 hitNormal, float3 incomingViewDir)
+{
+ // Reflection rays can hit off-screen or camera-hidden TLAS geometry. In that
+ // case this pass has no per-triangle material/normal table, so use a neutral
+ // lit card instead of returning black. This keeps reflected objects visible
+ // without pretending every unknown hit is a perfect emissive surface.
+ incomingViewDir = SafeNormalizeOr(incomingViewDir, -hitNormal);
+ hitNormal = SafeNormalizeOr(hitNormal, incomingViewDir);
+
+ if (dot(hitNormal, incomingViewDir) < 0.0)
+ hitNormal = -hitNormal;
+
+ float upness = saturate(hitNormal.z * 0.5 + 0.5);
+ float3 lighting = gAmbientColor.rgb * (gAmbientColor.a * 0.035);
+ lighting += GetSkyRadiance(hitNormal) * (0.12 + 0.08 * upness);
+ lighting += GetSkyRadiance(SafeNormalizeOr(reflect(-incomingViewDir, hitNormal), hitNormal)) * 0.055;
+
+ [loop]
+ for (uint i = 0; i < gLightCount; ++i)
+ {
+ lighting += EstimateFastBounceLight(hitPos, hitNormal, gLights[i]) * 0.78;
+ }
+
+ const float3 NEUTRAL_UNKNOWN_ALBEDO = float3(0.58, 0.58, 0.58);
+ return clamp(NEUTRAL_UNKNOWN_ALBEDO * max(lighting, 0.0), 0.0, 10.0);
+}
+
+
+float ComputeSpecularReflectionLocalEnergy(float3 worldPos, float3 N)
+{
+ float energy = 0.0;
+
+ [loop]
+ for (uint i = 0; i < gLightCount; ++i)
+ {
+ Light Lgt = gLights[i];
+
+ float atten = 0.0;
+
+ if (Lgt.type == GL_RAYTRACING_LIGHT_TYPE_POINT)
+ {
+ atten = ComputePointLightAttenuation(worldPos, Lgt);
+ }
+ else if (Lgt.type == GL_RAYTRACING_LIGHT_TYPE_SPOT)
+ {
+ atten = ComputeSpotLightAttenuation(worldPos, Lgt);
+ }
+ else if (Lgt.type == GL_RAYTRACING_LIGHT_TYPE_RECT)
+ {
+ float dist = length(Lgt.position - worldPos);
+ float range = max(Lgt.radius, 1.0);
+ atten = saturate((range - dist) / range);
+ atten = atten * atten;
+ }
+
+ if (atten <= 0.0)
+ continue;
+
+ float3 toLight = SafeNormalizeOr(Lgt.position - worldPos, N);
+ float facing = saturate(dot(N, toLight));
+ float lightPeak = max(max(Lgt.color.r, Lgt.color.g), Lgt.color.b);
+
+ energy += atten * facing * Lgt.intensity * lightPeak;
+ }
+
+ // Keep reflections tied to nearby light contribution instead of becoming
+ // a global mirror pass.
+ return saturate(energy * 0.08);
+}
+
+float ComputeSpecularReflectionMaxDistance(float3 worldPos)
+{
+ float maxDistance = 0.0;
+
+ [loop]
+ for (uint i = 0; i < gLightCount; ++i)
+ {
+ Light Lgt = gLights[i];
+
+ float atten = 0.0;
+ float range = 0.0;
+
+ if (Lgt.type == GL_RAYTRACING_LIGHT_TYPE_POINT)
+ {
+ atten = ComputePointLightAttenuation(worldPos, Lgt);
+ range = GetPointLightMaxRadius(Lgt);
+ }
+ else if (Lgt.type == GL_RAYTRACING_LIGHT_TYPE_SPOT)
+ {
+ atten = ComputeSpotLightAttenuation(worldPos, Lgt);
+ range = max(Lgt.radius, 1.0);
+ }
+ else if (Lgt.type == GL_RAYTRACING_LIGHT_TYPE_RECT)
+ {
+ float dist = length(Lgt.position - worldPos);
+ range = max(Lgt.radius, 1.0);
+ atten = saturate((range - dist) / range);
+ atten = atten * atten;
+ }
+
+ if (atten <= 0.0)
+ continue;
+
+ // Reflections should not reach the full light range like a mirror.
+ // This makes the reflection proportional to local light influence.
+ maxDistance = max(maxDistance, range * lerp(0.18, 0.55, saturate(atten)));
+ }
+
+ return clamp(maxDistance, 24.0, 768.0);
+}
+
+float ComputeSpecularReflectionDistanceFade(float hitT, float maxT)
+{
+ float t = saturate(hitT / max(maxT, 1.0));
+
+ // Strong near reflection, smooth fade before the end of the local volume.
+ float fade = 1.0 - smoothstep(0.35, 1.0, t);
+
+ return fade * fade;
+}
+
+float3 EstimateRayTracedSpecularReflection(
+ uint2 pixel,
+ float3 worldPos,
+ float3 N,
+ float3 V,
+ float3 baseAlbedo,
+ float3 specularAlbedo,
+ float cavity,
+ inout uint rng)
+{
+ // Disabled for now. The previous reflection path traced TLAS hits but then
+ // used the camera G-buffer to fetch off-screen material data, which is a
+ // screen-space approximation and very expensive. Direct specular from real
+ // lights is still computed in PathTraceDeterministicLighting().
+ return 0.0;
+}
+)"
+R"(
+float3 ApplyRealisticOutputCurve(float3 color)
+{
+ // Final photographic shoulder only: it does not change light radius or
+ // attenuation, but it prevents intense local lights/specular/bloom from
+ // clipping into a flat white patch. Values below 1.0 are left untouched.
+ color = max(color, 0.0);
+
+ float peak = max(max(color.r, color.g), color.b);
+ if (peak > 1.0)
+ {
+ float over = peak - 1.0;
+ float shoulderPeak = 1.0 + over / (1.0 + over * 0.38);
+ color *= shoulderPeak / max(peak, 1.0e-5);
+ }
+
+ return max(color, 0.0);
+}
+
+[shader("raygeneration")]
+void RayGen()
+{
+ uint2 pixel = DispatchRaysIndex().xy;
+
+ if (pixel.x >= (uint)gScreenSize.x || pixel.y >= (uint)gScreenSize.y)
+ return;
+
+ float4 albedoSample = gAlbedoTex.Load(int3(pixel, 0));
+ float4 emissiveSample = gEmissiveTex.Load(int3(pixel, 0));
+ float3 emissiveSurface = CompressEmissiveRadiance(emissiveSample.rgb, 6.50);
+ float depthSample = gDepthTex.Load(int3(pixel, 0));
+
+ float3 emissiveBloom = EstimateEmissiveBloomAtPixel(pixel);
+
+ if (depthSample <= 0.0 || depthSample >= 1.0)
+ {
+ gOutputTex[pixel] = float4(ApplyRealisticOutputCurve(albedoSample.rgb + emissiveSurface + emissiveBloom), albedoSample.a);
+ return;
+ }
+
+ float3 baseAlbedo = albedoSample.rgb;
+ float3 specularAlbedo = LoadSceneSpecularAlbedo(pixel, baseAlbedo);
+ float4 positionSample = gPositionTex.Load(int3(pixel, 0));
+ float3 worldPos = positionSample.xyz;
+ uint geoFlag = DecodeGeometryFlag(positionSample.w);
+ bool isSkeletal = (geoFlag & GEOMETRY_FLAG_SKELETAL) != 0u;
+ bool isUnlit = (geoFlag & GEOMETRY_FLAG_UNLIT) != 0u;
+ float4 normalSample = LoadSceneNormal(pixel);
+ float3 N = EnhanceBumpNormal(pixel, worldPos, baseAlbedo, isSkeletal);
+ float3 V = normalize(gCameraPos.xyz - worldPos);
+
+ if (isUnlit)
+ {
+ gOutputTex[pixel] = float4(ApplyRealisticOutputCurve(baseAlbedo + emissiveSurface + emissiveBloom), albedoSample.a);
+ return;
+ }
+
+ uint spp = max(gSamplesPerPixel, 1u);
+ spp = min(spp, 8u);
+
+ // All four of these are deterministic for this pixel. Compute them once,
+ // then reuse them for every stochastic GI sample.
+ float cavity = 1.0; // screen-space cavity disabled for ray-traced-only lighting
+ float ao = 1.0; // expensive ray AO disabled in the fast area-light path
+ float skyVis = 0; //ComputeSkyVisibility(worldPos, N, pixel);
+ float ambientSkyVis = 0; //TraceStraightUpToSky(worldPos, N);
+ float microShadow = 1.0;
+ // Screen-space final gather is disabled. Geometry emitters illuminate only
+ // through the DXR rect-light path below.
+ float3 reactiveFinalGather = 0.0;
+ float3 specularAccum = 0.0;
+ float3 lightingAccum = PathTraceDeterministicLighting(
+ pixel,
+ worldPos,
+ N,
+ V,
+ baseAlbedo,
+ specularAlbedo,
+ isSkeletal,
+ cavity,
+ ao,
+ skyVis,
+ ambientSkyVis,
+ specularAccum);
+ lightingAccum += EstimateScreenSpaceEmissiveParticleLighting(pixel, worldPos, N);
+ // No stochastic indirect bounce in this fast path. The area emitters are
+ // sampled as true rect lights with DXR shadow rays in the direct-light loop.
+ float3 reflectedSpecular = 0.0;
+ float3 albedo = baseAlbedo * cavity;
+ float3 finalColor = (albedo * lightingAccum) + specularAccum + reflectedSpecular;
+ finalColor += reactiveFinalGather;
+ float outputAo = isSkeletal ? lerp(ao, 1.0, 0.55) : ao;
+ finalColor *= clamp(outputAo + 0.6, 0.0, 1.0);
+
+ // Volumetric light scattering is radiance in the camera ray, not surface
+ // reflectance, so add it after surface albedo/specular composition. Because
+ // it is written into the same path-trace target, the internal a-trous pass
+ // denoises the stochastic volume/GI signal together with the rest of the ray result.
+ uint volumeRng = InitRng(pixel, 0u, 0x51u);
+ finalColor += EstimatePathTracedVolumetricScattering(pixel, worldPos, volumeRng);
+
+ // Visible self-emission from the primary surface. Screen-space particle
+ // emissive lighting was already injected into lightingAccum above.
+ finalColor += emissiveSurface + emissiveBloom;
+
+ gOutputTex[pixel] = float4(ApplyRealisticOutputCurve(finalColor), albedoSample.a);
+}
+)";
+
+static const char* g_glRaytracingDenoiseHlsl = R"(
+cbuffer LightingCB : register(b0)
+{
+ float4x4 gInvViewProj;
+ float4x4 gInvViewMatrix;
+ float4x4 gViewProj;
+ float4 gCameraPos;
+ float4 gAmbientColor;
+ float4 gScreenSize;
+ float gNormalReconstructZ;
+ uint gLightCount;
+ uint gEnableSpecular;
+ uint gEnableHalfLambert;
+ float gShadowBias;
+ uint gFrameIndex;
+ uint gSamplesPerPixel;
+ uint gMaxBounces;
+ uint gEnableDenoiser;
+ uint gDenoisePassIndex;
+ float gDenoiseStepWidth;
+ float gDenoiseStrength;
+ float gDenoisePhiColor;
+ float gDenoisePhiNormal;
+ float gDenoisePhiPosition;
+ float gBumpStrength;
+};
+
+Texture2D gAlbedoTex : register(t1);
+Texture2D gDepthTex : register(t2);
+Texture2D gNormalTex : register(t3);
+Texture2D gPositionTex : register(t4);
+Texture2D gPathTraceTex : register(t6);
+Texture2D gDenoiseATex : register(t7);
+Texture2D gDenoiseBTex : register(t8);
+Texture2D gTemporalTex : register(t10);
+
+RWTexture2D gRayOutputTex : register(u0);
+RWTexture2D gDenoiseAOutTex : register(u1);
+RWTexture2D gDenoiseBOutTex : register(u2);
+RWTexture2D gDenoisedOutputTex : register(u3);
+
+static const float kKernel[5] = { 0.0625, 0.25, 0.375, 0.25, 0.0625 };
+
+float3 SafeNormal(float3 n)
+{
+ float lenSq = max(dot(n, n), 1e-8);
+ return n * rsqrt(lenSq);
+}
+
+float Luminance(float3 c)
+{
+ return dot(c, float3(0.2126, 0.7152, 0.0722));
+}
+
+static const uint GEOMETRY_FLAG_GLASS = 4u;
+
+uint DecodeGeometryFlag(float geoFlag)
+{
+ return (uint)floor(max(geoFlag, 0.0) + 0.5);
+}
+
+float3 SafeAlbedoDivisor(float3 albedo)
+{
+ // Do not let black/dark textures explode when demodulating noisy lighting.
+ return max(abs(albedo), float3(0.06, 0.06, 0.06));
+}
+
+float3 DemodulateLighting(float3 radiance, float3 albedo)
+{
+ return radiance / SafeAlbedoDivisor(albedo);
+}
+
+float3 RemodulateLighting(float3 lighting, float3 albedo)
+{
+ return lighting * SafeAlbedoDivisor(albedo);
+}
+
+float4 LoadDenoiseSource(int2 p)
+{
+ if (gDenoisePassIndex == 0u)
+ return gTemporalTex.Load(int3(p, 0));
+ if (gDenoisePassIndex == 1u)
+ return gDenoiseATex.Load(int3(p, 0));
+ return gDenoiseBTex.Load(int3(p, 0));
+}
+
+void StoreDenoiseOutput(uint2 p, float4 v)
+{
+ if (gDenoisePassIndex == 0u)
+ gDenoiseAOutTex[p] = v;
+ else if (gDenoisePassIndex == 1u)
+ gDenoiseBOutTex[p] = v;
+ else
+ gDenoisedOutputTex[p] = v;
+}
+
+float GeometryAwareWeight(
+ float3 centerRadiance,
+ float3 sampleRadiance,
+ float3 centerAlbedo,
+ float3 sampleAlbedo,
+ float3 centerNormal,
+ float3 sampleNormal,
+ float3 centerPos,
+ float3 samplePos,
+ float centerDepth,
+ float sampleDepth,
+ uint centerGeoFlag,
+ uint sampleGeoFlag,
+ float kernelWeight)
+{
+ if (sampleDepth <= 0.0 || sampleDepth >= 1.0)
+ return 0.0;
+
+ // Do not smear lighting across material-class boundaries. This is
+ // particularly important for glass, because the primary G-buffer sample can
+ // be glass while the ray visibility must continue through it.
+ if (((centerGeoFlag ^ sampleGeoFlag) & GEOMETRY_FLAG_GLASS) != 0u)
+ return 0.0;
+
+ float3 centerLighting = DemodulateLighting(centerRadiance, centerAlbedo);
+ float3 sampleLighting = DemodulateLighting(sampleRadiance, sampleAlbedo);
+
+ // Use albedo, not noisy lit radiance, as the main color edge guide. The
+ // previous filter used the shadowed/noisy signal itself as the guide, which
+ // rejected neighbors across shadow variation and left shadow noise intact.
+ float albedoDiff = length(centerAlbedo - sampleAlbedo);
+ float albedoWeight = exp(-albedoDiff * max(gDenoisePhiColor, 0.001));
+
+ // A deliberately soft lighting-domain gate keeps hard contact-shadow edges
+ // from being over-blurred, but still lets noisy penumbra/visibility samples
+ // converge across the same surface.
+ float centerLum = Luminance(centerLighting);
+ float sampleLum = Luminance(sampleLighting);
+ float illumDiff = abs(sampleLum - centerLum);
+ float relativeIllumDiff = illumDiff / max(max(abs(centerLum), abs(sampleLum)), 0.05);
+
+ // Keep this gate conservative. The noise fix is to stabilize and stratify the
+ // ray samples; over-loosening this filter smears direct lighting and makes the
+ // scene look noisier/blotchier.
+ float illuminationWeight = exp(-relativeIllumDiff * max(gDenoisePhiColor * 0.035, 0.10));
+
+ float normalWeight = pow(saturate(dot(centerNormal, sampleNormal)), max(gDenoisePhiNormal, 1.0));
+ float positionDiff = length(samplePos - centerPos);
+ float positionWeight = exp(-positionDiff * max(gDenoisePhiPosition, 0.001));
+ float depthDiff = abs(sampleDepth - centerDepth);
+ float depthWeight = exp(-depthDiff * 300.0);
+
+ return kernelWeight * albedoWeight * illuminationWeight * normalWeight * positionWeight * depthWeight;
+}
+
+[numthreads(8, 8, 1)]
+void DenoiseCS(uint3 dispatchThreadId : SV_DispatchThreadID)
+{
+ uint2 pixel = dispatchThreadId.xy;
+
+ if (pixel.x >= (uint)gScreenSize.x || pixel.y >= (uint)gScreenSize.y)
+ return;
+
+ float4 albedoSample = gAlbedoTex.Load(int3(pixel, 0));
+ float depthSample = gDepthTex.Load(int3(pixel, 0));
+ float4 centerSource = LoadDenoiseSource(int2(pixel));
+
+ if (depthSample <= 0.0 || depthSample >= 1.0)
+ {
+ // Preserve raygen's emissive bloom on background/no-depth pixels.
+ // Returning albedo here would erase the halo whenever the internal
+ // temporal/a-trous denoiser is active.
+ StoreDenoiseOutput(pixel, centerSource);
+ return;
+ }
+
+ if (gEnableDenoiser == 0u)
+ {
+ StoreDenoiseOutput(pixel, centerSource);
+ return;
+ }
+
+ float3 centerAlbedo = saturate(albedoSample.rgb);
+ float3 centerNormal = SafeNormal(gNormalTex.Load(int3(pixel, 0)).xyz);
+ float4 centerPos4 = gPositionTex.Load(int3(pixel, 0));
+ float3 centerPos = centerPos4.xyz;
+ uint centerGeoFlag = DecodeGeometryFlag(centerPos4.w);
+
+ int stepI = max((int)round(max(gDenoiseStepWidth, 1.0)), 1);
+ float3 accumLighting = 0.0;
+ float weightSum = 0.0;
+
+ // Three-pass a-trous wavelet filter. The CPU dispatches this with step
+ // widths 1, 2, and 4. It is geometry-aware; temporal GI accumulation happens
+ // before this pass.
+ [unroll]
+ for (int ky = 0; ky < 5; ++ky)
+ {
+ [unroll]
+ for (int kx = 0; kx < 5; ++kx)
+ {
+ int2 sp = int2(pixel) + int2(kx - 2, ky - 2) * stepI;
+
+ if (sp.x < 0 || sp.y < 0 || sp.x >= (int)gScreenSize.x || sp.y >= (int)gScreenSize.y)
+ continue;
+
+ float sampleDepth = gDepthTex.Load(int3(sp, 0));
+ float4 sampleColor4 = LoadDenoiseSource(sp);
+ float3 sampleAlbedo = saturate(gAlbedoTex.Load(int3(sp, 0)).rgb);
+ float3 sampleNormal = SafeNormal(gNormalTex.Load(int3(sp, 0)).xyz);
+ float4 samplePos4 = gPositionTex.Load(int3(sp, 0));
+ float3 samplePos = samplePos4.xyz;
+ uint sampleGeoFlag = DecodeGeometryFlag(samplePos4.w);
+ float kernelWeight = kKernel[kx] * kKernel[ky];
+
+ float w = GeometryAwareWeight(
+ centerSource.rgb,
+ sampleColor4.rgb,
+ centerAlbedo,
+ sampleAlbedo,
+ centerNormal,
+ sampleNormal,
+ centerPos,
+ samplePos,
+ depthSample,
+ sampleDepth,
+ centerGeoFlag,
+ sampleGeoFlag,
+ kernelWeight);
+
+ accumLighting += DemodulateLighting(sampleColor4.rgb, sampleAlbedo) * w;
+ weightSum += w;
+ }
+ }
+
+ float3 filteredLighting = (weightSum > 1e-6)
+ ? (accumLighting / weightSum)
+ : DemodulateLighting(centerSource.rgb, centerAlbedo);
+
+ float3 filtered = RemodulateLighting(filteredLighting, centerAlbedo);
+
+ // Final-pass firefly clamp against the raw neighborhood.
+ if (gDenoisePassIndex >= 2u)
+ {
+ float3 minRaw = gPathTraceTex.Load(int3(pixel, 0)).rgb;
+ float3 maxRaw = minRaw;
+
+ [unroll]
+ for (int y = -1; y <= 1; ++y)
+ {
+ [unroll]
+ for (int x = -1; x <= 1; ++x)
+ {
+ int2 sp = int2(pixel) + int2(x, y);
+ if (sp.x < 0 || sp.y < 0 || sp.x >= (int)gScreenSize.x || sp.y >= (int)gScreenSize.y)
+ continue;
+ float3 raw = gPathTraceTex.Load(int3(sp, 0)).rgb;
+ minRaw = min(minRaw, raw);
+ maxRaw = max(maxRaw, raw);
+ }
+ }
+
+ // Keep the clamp tight. A wide clamp lets bright stochastic GI/volume
+ // outliers survive and was the main reason the previous patch looked worse.
+ filtered = clamp(filtered, minRaw - 0.15, maxRaw + 0.15);
+ }
+
+ float3 outColor = lerp(centerSource.rgb, filtered, saturate(gDenoiseStrength));
+ StoreDenoiseOutput(pixel, float4(max(outColor, 0.0), centerSource.a));
+}
+)";
+
+
+static const char* g_glRaytracingTemporalHlsl = R"(
+cbuffer LightingCB : register(b0)
+{
+ float4x4 gInvViewProj;
+ float4x4 gInvViewMatrix;
+ float4x4 gViewProj;
+ float4 gCameraPos;
+ float4 gAmbientColor;
+ float4 gScreenSize;
+ float gNormalReconstructZ;
+ uint gLightCount;
+ uint gEnableSpecular;
+ uint gEnableHalfLambert;
+ float gShadowBias;
+ uint gFrameIndex;
+ uint gSamplesPerPixel;
+ uint gMaxBounces;
+ uint gEnableDenoiser;
+ uint gDenoisePassIndex;
+ float gDenoiseStepWidth;
+ float gDenoiseStrength;
+ float gDenoisePhiColor;
+ float gDenoisePhiNormal;
+ float gDenoisePhiPosition;
+ float gBumpStrength;
+};
+
+Texture2D gAlbedoTex : register(t1);
+Texture2D gDepthTex : register(t2);
+Texture2D gNormalTex : register(t3);
+Texture2D gPositionTex : register(t4);
+Texture2D gPathTraceTex : register(t6);
+Texture2D gHistoryTex : register(t9);
+
+RWTexture2D gTemporalOutTex : register(u4);
+RWTexture2D gHistoryOutTex : register(u5);
+
+float LuminanceTemporal(float3 c)
+{
+ return dot(c, float3(0.2126, 0.7152, 0.0722));
+}
+
+float3 SafeNormalTemporal(float3 n)
+{
+ float lenSq = max(dot(n, n), 1e-8);
+ return n * rsqrt(lenSq);
+}
+
+float3 ClampHistoryToCurrent(float3 history, float3 current)
+{
+ // Loose temporal clamp: it removes GI fireflies and old lighting while still
+ // allowing bright muzzle-flash/door-light changes to appear in a few frames.
+ float3 radius = 0.20 + abs(current) * 0.55;
+ return clamp(history, current - radius, current + radius);
+}
+
+[numthreads(8, 8, 1)]
+void TemporalAccumCS(uint3 dispatchThreadId : SV_DispatchThreadID)
+{
+ uint2 pixel = dispatchThreadId.xy;
+
+ if (pixel.x >= (uint)gScreenSize.x || pixel.y >= (uint)gScreenSize.y)
+ return;
+
+ float4 raw = gPathTraceTex.Load(int3(pixel, 0));
+ float depth = gDepthTex.Load(int3(pixel, 0));
+
+ if (depth <= 0.0 || depth >= 1.0 || gMaxBounces <= 1u)
+ {
+ gTemporalOutTex[pixel] = raw;
+ gHistoryOutTex[pixel] = float4(raw.rgb, 0.0);
+ return;
+ }
+
+ float4 history = gHistoryTex.Load(int3(pixel, 0));
+ float historyCount = (gFrameIndex == 0u) ? 0.0 : clamp(history.a, 0.0, 31.0);
+
+ if (historyCount <= 0.0)
+ {
+ gTemporalOutTex[pixel] = raw;
+ gHistoryOutTex[pixel] = float4(raw.rgb, 1.0);
+ return;
+ }
+
+ float3 historyColor = ClampHistoryToCurrent(max(history.rgb, 0.0), max(raw.rgb, 0.0));
+
+ float rawLum = LuminanceTemporal(max(raw.rgb, 0.0));
+ float histLum = LuminanceTemporal(historyColor);
+ float relChange = abs(rawLum - histLum) / max(max(rawLum, histLum), 0.08);
+
+ // Base accumulation approaches 32 frames, but large lighting changes raise
+ // current-frame weight so the accumulator does not leave obvious trails.
+ float currentWeight = max(1.0 / (historyCount + 1.0), 0.055);
+ currentWeight = max(currentWeight, saturate(relChange * 0.28));
+ currentWeight = saturate(currentWeight);
+
+ float3 resolved = lerp(historyColor, max(raw.rgb, 0.0), currentWeight);
+ float nextCount = min(historyCount + 1.0, 31.0);
+
+ gTemporalOutTex[pixel] = float4(resolved, raw.a);
+ gHistoryOutTex[pixel] = float4(resolved, nextCount);
+}
+)";
+
+static ComPtr glRaytracingLightingCompileLibrary(const char* src)
+{
+ ComPtr utils;
+ ComPtr compiler;
+ ComPtr includeHandler;
+
+ HRESULT hr = DxcCreateInstance(CLSID_DxcUtils, IID_PPV_ARGS(&utils));
+ if (FAILED(hr))
+ {
+ glRaytracingFatal("DxcCreateInstance utils failed 0x%08X", (unsigned)hr);
+ return nullptr;
+ }
+
+ hr = DxcCreateInstance(CLSID_DxcCompiler, IID_PPV_ARGS(&compiler));
+ if (FAILED(hr))
+ {
+ glRaytracingFatal("DxcCreateInstance compiler failed 0x%08X", (unsigned)hr);
+ return nullptr;
+ }
+
+ hr = utils->CreateDefaultIncludeHandler(&includeHandler);
+ if (FAILED(hr))
+ {
+ glRaytracingFatal("CreateDefaultIncludeHandler failed 0x%08X", (unsigned)hr);
+ return nullptr;
+ }
+
+ DxcBuffer source = {};
+ source.Ptr = src;
+ source.Size = strlen(src);
+ source.Encoding = DXC_CP_UTF8;
+
+ const wchar_t* args[] =
+ {
+ L"-T", L"lib_6_3",
+#if defined(_DEBUG)
+ L"-Zi",
+ L"-Qembed_debug",
+#endif
+ // Keep the DXR library smaller to avoid long driver-side linking during
+ // CreateStateObject(). Compute/post shaders below still compile with O3.
+ L"-O1",
+ L"-all_resources_bound"
+ };
+
+ ComPtr result;
+ hr = compiler->Compile(&source, args, _countof(args), includeHandler.Get(), IID_PPV_ARGS(&result));
+ if (FAILED(hr))
+ {
+ glRaytracingFatal("DXC compile failed 0x%08X", (unsigned)hr);
+ return nullptr;
+ }
+
+ ComPtr errors;
+ result->GetOutput(DXC_OUT_ERRORS, IID_PPV_ARGS(&errors), nullptr);
+ if (errors && errors->GetStringLength() > 0)
+ {
+ OutputDebugStringA(errors->GetStringPointer());
+ OutputDebugStringA("\n");
+ }
+
+ HRESULT status = S_OK;
+ result->GetStatus(&status);
+ if (FAILED(status))
+ {
+ glRaytracingFatal("DXIL compile status failed 0x%08X", (unsigned)status);
+ return nullptr;
+ }
+
+ ComPtr dxil;
+ result->GetOutput(DXC_OUT_OBJECT, IID_PPV_ARGS(&dxil), nullptr);
+ return dxil;
+}
+
+static ComPtr glRaytracingLightingCompileCompute(const char* src, const wchar_t* entryPoint)
+{
+ ComPtr utils;
+ ComPtr compiler;
+ ComPtr includeHandler;
+
+ HRESULT hr = DxcCreateInstance(CLSID_DxcUtils, IID_PPV_ARGS(&utils));
+ if (FAILED(hr))
+ {
+ glRaytracingFatal("DxcCreateInstance utils failed 0x%08X", (unsigned)hr);
+ return nullptr;
+ }
+
+ hr = DxcCreateInstance(CLSID_DxcCompiler, IID_PPV_ARGS(&compiler));
+ if (FAILED(hr))
+ {
+ glRaytracingFatal("DxcCreateInstance compiler failed 0x%08X", (unsigned)hr);
+ return nullptr;
+ }
+
+ hr = utils->CreateDefaultIncludeHandler(&includeHandler);
+ if (FAILED(hr))
+ {
+ glRaytracingFatal("CreateDefaultIncludeHandler failed 0x%08X", (unsigned)hr);
+ return nullptr;
+ }
+
+ DxcBuffer source = {};
+ source.Ptr = src;
+ source.Size = strlen(src);
+ source.Encoding = DXC_CP_UTF8;
+
+ const wchar_t* args[] =
+ {
+ L"-E", entryPoint,
+ L"-T", L"cs_6_0",
+#if defined(_DEBUG)
+ L"-Zi",
+ L"-Qembed_debug",
+#endif
+ L"-O3",
+ L"-all_resources_bound"
+ };
+
+ ComPtr result;
+ hr = compiler->Compile(&source, args, _countof(args), includeHandler.Get(), IID_PPV_ARGS(&result));
+ if (FAILED(hr))
+ {
+ glRaytracingFatal("DXC compute compile failed 0x%08X", (unsigned)hr);
+ return nullptr;
+ }
+
+ ComPtr errors;
+ result->GetOutput(DXC_OUT_ERRORS, IID_PPV_ARGS(&errors), nullptr);
+ if (errors && errors->GetStringLength() > 0)
+ {
+ OutputDebugStringA(errors->GetStringPointer());
+ OutputDebugStringA("\n");
+ }
+
+ HRESULT status = S_OK;
+ result->GetStatus(&status);
+ if (FAILED(status))
+ {
+ glRaytracingFatal("DXIL compute compile status failed 0x%08X", (unsigned)status);
+ return nullptr;
+ }
+
+ ComPtr dxil;
+ result->GetOutput(DXC_OUT_OBJECT, IID_PPV_ARGS(&dxil), nullptr);
+ return dxil;
+}
+
+static int glRaytracingLightingCreateDescriptorHeap(void)
+{
+ D3D12_DESCRIPTOR_HEAP_DESC hd = {};
+ hd.NumDescriptors = GLR_DESC_COUNT;
+ hd.Type = D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV;
+ hd.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE;
+
+ for (UINT frame = 0; frame < GL_RAYTRACING_CMD_RING_SIZE; ++frame)
+ {
+ GLR_CHECK(g_glRaytracingCmd.device->CreateDescriptorHeap(
+ &hd,
+ IID_PPV_ARGS(&g_glRaytracingLighting.descriptorHeapRing[frame])));
+ }
+
+ g_glRaytracingLighting.descriptorHeap = g_glRaytracingLighting.descriptorHeapRing[0];
+ g_glRaytracingLighting.descriptorStride =
+ g_glRaytracingCmd.device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV);
+
+ return 1;
+}
+
+static int glRaytracingLightingCreateRootSignatures(void)
+{
+ {
+ D3D12_DESCRIPTOR_RANGE ranges[2] = {};
+
+ ranges[0].RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SRV;
+ ranges[0].NumDescriptors = GLR_DESC_SRV_COUNT;
+ ranges[0].BaseShaderRegister = 0;
+ ranges[0].RegisterSpace = 0;
+ ranges[0].OffsetInDescriptorsFromTableStart = 0;
+
+ ranges[1].RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_UAV;
+ ranges[1].NumDescriptors = GLR_DESC_UAV_COUNT;
+ ranges[1].BaseShaderRegister = 0;
+ ranges[1].RegisterSpace = 0;
+ ranges[1].OffsetInDescriptorsFromTableStart = 0;
+
+ D3D12_ROOT_PARAMETER params[3] = {};
+
+ params[0].ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
+ params[0].DescriptorTable.NumDescriptorRanges = 1;
+ params[0].DescriptorTable.pDescriptorRanges = &ranges[0];
+ params[0].ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;
+
+ params[1].ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
+ params[1].DescriptorTable.NumDescriptorRanges = 1;
+ params[1].DescriptorTable.pDescriptorRanges = &ranges[1];
+ params[1].ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;
+
+ params[2].ParameterType = D3D12_ROOT_PARAMETER_TYPE_CBV;
+ params[2].Descriptor.ShaderRegister = 0;
+ params[2].Descriptor.RegisterSpace = 0;
+ params[2].ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;
+
+ D3D12_ROOT_SIGNATURE_DESC rsd = {};
+ rsd.NumParameters = _countof(params);
+ rsd.pParameters = params;
+ rsd.Flags = D3D12_ROOT_SIGNATURE_FLAG_NONE;
+
+ ComPtr sig;
+ ComPtr err;
+ GLR_CHECK(D3D12SerializeRootSignature(&rsd, D3D_ROOT_SIGNATURE_VERSION_1, &sig, &err));
+ GLR_CHECK(g_glRaytracingCmd.device->CreateRootSignature(
+ 0, sig->GetBufferPointer(), sig->GetBufferSize(),
+ IID_PPV_ARGS(&g_glRaytracingLighting.globalRootSig)));
+ }
+
+ {
+ D3D12_ROOT_SIGNATURE_DESC rsd = {};
+ rsd.Flags = D3D12_ROOT_SIGNATURE_FLAG_LOCAL_ROOT_SIGNATURE;
+
+ ComPtr sig;
+ ComPtr err;
+ GLR_CHECK(D3D12SerializeRootSignature(&rsd, D3D_ROOT_SIGNATURE_VERSION_1, &sig, &err));
+ GLR_CHECK(g_glRaytracingCmd.device->CreateRootSignature(
+ 0, sig->GetBufferPointer(), sig->GetBufferSize(),
+ IID_PPV_ARGS(&g_glRaytracingLighting.localRootSig)));
+ }
+
+ return 1;
+}
+
+static int glRaytracingMapUploadBufferPersistent(const glRaytracingBuffer_t& buffer, void** mapped)
+{
+ if (!buffer.resource || !mapped)
+ return 0;
+
+ *mapped = nullptr;
+ D3D12_RANGE readRange = {};
+ HRESULT hr = buffer.resource->Map(0, &readRange, mapped);
+ if (FAILED(hr) || !*mapped)
+ {
+ glRaytracingFatal("Persistent upload Map failed 0x%08X", (unsigned)hr);
+ return 0;
+ }
+
+ return 1;
+}
+
+static void glRaytracingLightingSelectFrameResources(UINT frameSlot)
+{
+ frameSlot %= GL_RAYTRACING_CMD_RING_SIZE;
+
+ g_glRaytracingLighting.descriptorHeap = g_glRaytracingLighting.descriptorHeapRing[frameSlot];
+ g_glRaytracingLighting.constantBuffer = g_glRaytracingLighting.constantBufferRing[frameSlot];
+ g_glRaytracingLighting.lightBuffer = g_glRaytracingLighting.lightBufferRing[frameSlot];
+ g_glRaytracingLighting.constantBufferMapped = g_glRaytracingLighting.constantBufferMappedRing[frameSlot];
+ g_glRaytracingLighting.lightBufferMapped = g_glRaytracingLighting.lightBufferMappedRing[frameSlot];
+
+ for (int i = 0; i < 3; ++i)
+ {
+ g_glRaytracingLighting.denoiseConstantBuffer[i] = g_glRaytracingLighting.denoiseConstantBufferRing[frameSlot][i];
+ g_glRaytracingLighting.denoiseConstantBufferMapped[i] = g_glRaytracingLighting.denoiseConstantBufferMappedRing[frameSlot][i];
+ }
+}
+
+static int glRaytracingLightingCreateBuffers(void)
+{
+ const UINT64 constantsBytes = glRaytracingAlignUp(sizeof(glRaytracingLightingConstants_t), 256);
+
+ for (UINT frame = 0; frame < GL_RAYTRACING_CMD_RING_SIZE; ++frame)
+ {
+ g_glRaytracingLighting.constantBufferRing[frame] = glRaytracingCreateBuffer(
+ g_glRaytracingCmd.device.Get(),
+ constantsBytes,
+ D3D12_HEAP_TYPE_UPLOAD,
+ D3D12_RESOURCE_STATE_GENERIC_READ,
+ D3D12_RESOURCE_FLAG_NONE);
+
+ g_glRaytracingLighting.lightBufferRing[frame] = glRaytracingCreateBuffer(
+ g_glRaytracingCmd.device.Get(),
+ sizeof(glRaytracingLight_t) * GL_RAYTRACING_MAX_LIGHTS,
+ D3D12_HEAP_TYPE_UPLOAD,
+ D3D12_RESOURCE_STATE_GENERIC_READ,
+ D3D12_RESOURCE_FLAG_NONE);
+
+ if (!g_glRaytracingLighting.constantBufferRing[frame].resource ||
+ !g_glRaytracingLighting.lightBufferRing[frame].resource)
+ {
+ return 0;
+ }
+
+ for (int i = 0; i < 3; ++i)
+ {
+ g_glRaytracingLighting.denoiseConstantBufferRing[frame][i] = glRaytracingCreateBuffer(
+ g_glRaytracingCmd.device.Get(),
+ constantsBytes,
+ D3D12_HEAP_TYPE_UPLOAD,
+ D3D12_RESOURCE_STATE_GENERIC_READ,
+ D3D12_RESOURCE_FLAG_NONE);
+
+ if (!g_glRaytracingLighting.denoiseConstantBufferRing[frame][i].resource)
+ return 0;
+ }
+
+ // These are small UPLOAD-heap buffers updated every pass. Keeping every
+ // per-frame copy persistently mapped avoids Map/Unmap overhead and makes
+ // the async command-ring safe: the CPU never overwrites constants that an
+ // older in-flight command list still reads.
+ if (!glRaytracingMapUploadBufferPersistent(
+ g_glRaytracingLighting.constantBufferRing[frame],
+ &g_glRaytracingLighting.constantBufferMappedRing[frame]))
+ {
+ return 0;
+ }
+
+ if (!glRaytracingMapUploadBufferPersistent(
+ g_glRaytracingLighting.lightBufferRing[frame],
+ &g_glRaytracingLighting.lightBufferMappedRing[frame]))
+ {
+ return 0;
+ }
+
+ for (int i = 0; i < 3; ++i)
+ {
+ if (!glRaytracingMapUploadBufferPersistent(
+ g_glRaytracingLighting.denoiseConstantBufferRing[frame][i],
+ &g_glRaytracingLighting.denoiseConstantBufferMappedRing[frame][i]))
+ {
+ return 0;
+ }
+ }
+ }
+
+ glRaytracingLightingSelectFrameResources(0);
+ return 1;
+}
+
+static void glRaytracingLightingUploadConstantsTo(
+ const glRaytracingBuffer_t& dst,
+ const glRaytracingLightingConstants_t& constants)
+{
+ if (!dst.resource)
+ return;
+
+ void* mapped = nullptr;
+ if (dst.resource.Get() == g_glRaytracingLighting.constantBuffer.resource.Get())
+ {
+ mapped = g_glRaytracingLighting.constantBufferMapped;
+ }
+ else
+ {
+ for (int i = 0; i < 3; ++i)
+ {
+ if (dst.resource.Get() == g_glRaytracingLighting.denoiseConstantBuffer[i].resource.Get())
+ {
+ mapped = g_glRaytracingLighting.denoiseConstantBufferMapped[i];
+ break;
+ }
+ }
+ }
+
+ if (mapped)
+ {
+ memcpy(mapped, &constants, sizeof(constants));
+ return;
+ }
+
+ glRaytracingMapCopy(dst.resource.Get(), &constants, sizeof(constants));
+}
+
+static void glRaytracingLightingUpdateConstants(void)
+{
+ if (!g_glRaytracingLighting.uploadToCurrentFrameResource)
+ return;
+
+ glRaytracingLightingUploadConstantsTo(
+ g_glRaytracingLighting.constantBuffer,
+ g_glRaytracingLighting.constants);
+}
+
+static void glRaytracingLightingUpdateLights(void)
+{
+ if (!g_glRaytracingLighting.uploadToCurrentFrameResource)
+ return;
+
+ if (!g_glRaytracingLighting.lightBuffer.resource)
+ return;
+
+ if (g_glRaytracingLighting.cpuLights.empty())
+ return;
+
+ const size_t bytes = g_glRaytracingLighting.cpuLights.size() * sizeof(glRaytracingLight_t);
+ if (g_glRaytracingLighting.lightBufferMapped)
+ {
+ memcpy(g_glRaytracingLighting.lightBufferMapped, g_glRaytracingLighting.cpuLights.data(), bytes);
+ return;
+ }
+
+ glRaytracingMapCopy(
+ g_glRaytracingLighting.lightBuffer.resource.Get(),
+ g_glRaytracingLighting.cpuLights.data(),
+ bytes);
+}
+
+static void glRaytracingLightingUnmapUploadBuffers(void)
+{
+ for (UINT frame = 0; frame < GL_RAYTRACING_CMD_RING_SIZE; ++frame)
+ {
+ if (g_glRaytracingLighting.constantBufferRing[frame].resource &&
+ g_glRaytracingLighting.constantBufferMappedRing[frame])
+ {
+ g_glRaytracingLighting.constantBufferRing[frame].resource->Unmap(0, nullptr);
+ g_glRaytracingLighting.constantBufferMappedRing[frame] = nullptr;
+ }
+
+ if (g_glRaytracingLighting.lightBufferRing[frame].resource &&
+ g_glRaytracingLighting.lightBufferMappedRing[frame])
+ {
+ g_glRaytracingLighting.lightBufferRing[frame].resource->Unmap(0, nullptr);
+ g_glRaytracingLighting.lightBufferMappedRing[frame] = nullptr;
+ }
+
+ for (int i = 0; i < 3; ++i)
+ {
+ if (g_glRaytracingLighting.denoiseConstantBufferRing[frame][i].resource &&
+ g_glRaytracingLighting.denoiseConstantBufferMappedRing[frame][i])
+ {
+ g_glRaytracingLighting.denoiseConstantBufferRing[frame][i].resource->Unmap(0, nullptr);
+ g_glRaytracingLighting.denoiseConstantBufferMappedRing[frame][i] = nullptr;
+ }
+ }
+ }
+
+ g_glRaytracingLighting.constantBufferMapped = nullptr;
+ g_glRaytracingLighting.lightBufferMapped = nullptr;
+ for (int i = 0; i < 3; ++i)
+ g_glRaytracingLighting.denoiseConstantBufferMapped[i] = nullptr;
+}
+
+static void glRaytracingLightingCreatePersistentLightSRV(void)
+{
+ D3D12_SHADER_RESOURCE_VIEW_DESC srv = {};
+ srv.ViewDimension = D3D12_SRV_DIMENSION_BUFFER;
+ srv.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
+ srv.Format = DXGI_FORMAT_UNKNOWN;
+ srv.Buffer.FirstElement = 0;
+ srv.Buffer.NumElements = GL_RAYTRACING_MAX_LIGHTS;
+ srv.Buffer.StructureByteStride = sizeof(glRaytracingLight_t);
+ srv.Buffer.Flags = D3D12_BUFFER_SRV_FLAG_NONE;
+
+ for (UINT frame = 0; frame < GL_RAYTRACING_CMD_RING_SIZE; ++frame)
+ {
+ if (!g_glRaytracingLighting.descriptorHeapRing[frame] ||
+ !g_glRaytracingLighting.lightBufferRing[frame].resource)
+ {
+ continue;
+ }
+
+ D3D12_CPU_DESCRIPTOR_HANDLE base =
+ g_glRaytracingLighting.descriptorHeapRing[frame]->GetCPUDescriptorHandleForHeapStart();
+ g_glRaytracingCmd.device->CreateShaderResourceView(
+ g_glRaytracingLighting.lightBufferRing[frame].resource.Get(),
+ &srv,
+ glRaytracingOffsetCpu(base, g_glRaytracingLighting.descriptorStride, GLR_DESC_LIGHTS_SRV));
+ }
+}
+
+static int glRaytracingLightingCreateStateObject(void)
+{
+ ComPtr dxil = glRaytracingLightingCompileLibrary(g_glRaytracingLightingHlsl);
+ if (!dxil)
+ return 0;
+
+ D3D12_EXPORT_DESC exports[8] = {};
+ exports[0].Name = L"RayGen";
+ exports[1].Name = L"ShadowMiss";
+ exports[2].Name = L"ShadowAnyHit";
+ exports[3].Name = L"ShadowClosestHit";
+ exports[4].Name = L"BounceMiss";
+ exports[5].Name = L"BounceAnyHit";
+ exports[6].Name = L"BounceClosestHit";
+ exports[7].Name = L"ReflectionClosestHit";
+
+ D3D12_DXIL_LIBRARY_DESC libDesc = {};
+ D3D12_SHADER_BYTECODE libBytecode = {};
+ libBytecode.pShaderBytecode = dxil->GetBufferPointer();
+ libBytecode.BytecodeLength = dxil->GetBufferSize();
+ libDesc.DXILLibrary = libBytecode;
+ libDesc.NumExports = _countof(exports);
+ libDesc.pExports = exports;
+
+ D3D12_HIT_GROUP_DESC hitGroups[3] = {};
+ hitGroups[0].HitGroupExport = L"ShadowHitGroup";
+ hitGroups[0].AnyHitShaderImport = L"ShadowAnyHit";
+ hitGroups[0].ClosestHitShaderImport = L"ShadowClosestHit";
+ hitGroups[0].Type = D3D12_HIT_GROUP_TYPE_TRIANGLES;
+
+ hitGroups[1].HitGroupExport = L"BounceHitGroup";
+ hitGroups[1].AnyHitShaderImport = L"BounceAnyHit";
+ hitGroups[1].ClosestHitShaderImport = L"BounceClosestHit";
+ hitGroups[1].Type = D3D12_HIT_GROUP_TYPE_TRIANGLES;
+
+ hitGroups[2].HitGroupExport = L"ReflectionHitGroup";
+ hitGroups[2].ClosestHitShaderImport = L"ReflectionClosestHit";
+ hitGroups[2].Type = D3D12_HIT_GROUP_TYPE_TRIANGLES;
+
+ D3D12_RAYTRACING_SHADER_CONFIG shaderConfig = {};
+ shaderConfig.MaxPayloadSizeInBytes = 16; // BouncePayload: uint + float + uint + uint.
+ shaderConfig.MaxAttributeSizeInBytes = 8;
+
+ D3D12_GLOBAL_ROOT_SIGNATURE globalRS = {};
+ globalRS.pGlobalRootSignature = g_glRaytracingLighting.globalRootSig.Get();
+
+ D3D12_LOCAL_ROOT_SIGNATURE localRS = {};
+ localRS.pLocalRootSignature = g_glRaytracingLighting.localRootSig.Get();
+
+ D3D12_STATE_SUBOBJECT subobjects[9] = {};
+ UINT sub = 0;
+
+ subobjects[sub].Type = D3D12_STATE_SUBOBJECT_TYPE_DXIL_LIBRARY;
+ subobjects[sub].pDesc = &libDesc;
+ ++sub;
+
+ subobjects[sub].Type = D3D12_STATE_SUBOBJECT_TYPE_HIT_GROUP;
+ subobjects[sub].pDesc = &hitGroups[0];
+ ++sub;
+
+ subobjects[sub].Type = D3D12_STATE_SUBOBJECT_TYPE_HIT_GROUP;
+ subobjects[sub].pDesc = &hitGroups[1];
+ ++sub;
+
+ subobjects[sub].Type = D3D12_STATE_SUBOBJECT_TYPE_HIT_GROUP;
+ subobjects[sub].pDesc = &hitGroups[2];
+ ++sub;
+
+ subobjects[sub].Type = D3D12_STATE_SUBOBJECT_TYPE_RAYTRACING_SHADER_CONFIG;
+ subobjects[sub].pDesc = &shaderConfig;
+ ++sub;
+
+ subobjects[sub].Type = D3D12_STATE_SUBOBJECT_TYPE_GLOBAL_ROOT_SIGNATURE;
+ subobjects[sub].pDesc = &globalRS;
+ ++sub;
+
+ subobjects[sub].Type = D3D12_STATE_SUBOBJECT_TYPE_LOCAL_ROOT_SIGNATURE;
+ subobjects[sub].pDesc = &localRS;
+ ++sub;
+
+ LPCWSTR localExports[] =
+ {
+ L"RayGen",
+ L"ShadowMiss",
+ L"ShadowHitGroup",
+ L"BounceMiss",
+ L"BounceHitGroup",
+ L"ReflectionHitGroup"
+ };
+
+ D3D12_SUBOBJECT_TO_EXPORTS_ASSOCIATION assoc = {};
+ assoc.pSubobjectToAssociate = &subobjects[6];
+ assoc.NumExports = _countof(localExports);
+ assoc.pExports = localExports;
+
+ subobjects[sub].Type = D3D12_STATE_SUBOBJECT_TYPE_SUBOBJECT_TO_EXPORTS_ASSOCIATION;
+ subobjects[sub].pDesc = &assoc;
+ ++sub;
+
+ D3D12_RAYTRACING_PIPELINE_CONFIG pipeConfig = {};
+ pipeConfig.MaxTraceRecursionDepth = 1;
+
+ subobjects[sub].Type = D3D12_STATE_SUBOBJECT_TYPE_RAYTRACING_PIPELINE_CONFIG;
+ subobjects[sub].pDesc = &pipeConfig;
+ ++sub;
+
+ D3D12_STATE_OBJECT_DESC soDesc = {};
+ soDesc.Type = D3D12_STATE_OBJECT_TYPE_RAYTRACING_PIPELINE;
+ soDesc.NumSubobjects = sub;
+ soDesc.pSubobjects = subobjects;
+
+ GLR_CHECK(g_glRaytracingCmd.device->CreateStateObject(&soDesc, IID_PPV_ARGS(&g_glRaytracingLighting.rtStateObject)));
+ GLR_CHECK(g_glRaytracingLighting.rtStateObject.As(&g_glRaytracingLighting.rtStateProps));
+ return 1;
+}
+
+static int glRaytracingLightingCreateShaderTables(void)
+{
+ void* raygenId = g_glRaytracingLighting.rtStateProps->GetShaderIdentifier(L"RayGen");
+ void* shadowMissId = g_glRaytracingLighting.rtStateProps->GetShaderIdentifier(L"ShadowMiss");
+ void* bounceMissId = g_glRaytracingLighting.rtStateProps->GetShaderIdentifier(L"BounceMiss");
+ void* shadowHitId = g_glRaytracingLighting.rtStateProps->GetShaderIdentifier(L"ShadowHitGroup");
+ void* bounceHitId = g_glRaytracingLighting.rtStateProps->GetShaderIdentifier(L"BounceHitGroup");
+ void* reflectionHitId = g_glRaytracingLighting.rtStateProps->GetShaderIdentifier(L"ReflectionHitGroup");
+
+ if (!raygenId || !shadowMissId || !bounceMissId || !shadowHitId || !bounceHitId || !reflectionHitId)
+ {
+ glRaytracingFatal("Failed to fetch shader identifiers");
+ return 0;
+ }
+
+ const UINT shaderIdSize = D3D12_SHADER_IDENTIFIER_SIZE_IN_BYTES;
+ const UINT recordSize = (UINT)glRaytracingAlignUp(shaderIdSize, D3D12_RAYTRACING_SHADER_RECORD_BYTE_ALIGNMENT);
+ const UINT missTableSize = recordSize * 2u;
+ const UINT hitTableSize = recordSize * 3u;
+
+ g_glRaytracingLighting.raygenTable = glRaytracingCreateBuffer(
+ g_glRaytracingCmd.device.Get(),
+ recordSize,
+ D3D12_HEAP_TYPE_UPLOAD,
+ D3D12_RESOURCE_STATE_GENERIC_READ,
+ D3D12_RESOURCE_FLAG_NONE);
+
+ g_glRaytracingLighting.missTable = glRaytracingCreateBuffer(
+ g_glRaytracingCmd.device.Get(),
+ missTableSize,
+ D3D12_HEAP_TYPE_UPLOAD,
+ D3D12_RESOURCE_STATE_GENERIC_READ,
+ D3D12_RESOURCE_FLAG_NONE);
+
+ g_glRaytracingLighting.hitTable = glRaytracingCreateBuffer(
+ g_glRaytracingCmd.device.Get(),
+ hitTableSize,
+ D3D12_HEAP_TYPE_UPLOAD,
+ D3D12_RESOURCE_STATE_GENERIC_READ,
+ D3D12_RESOURCE_FLAG_NONE);
+
+ if (!g_glRaytracingLighting.raygenTable.resource ||
+ !g_glRaytracingLighting.missTable.resource ||
+ !g_glRaytracingLighting.hitTable.resource)
+ {
+ return 0;
+ }
+
+ std::vector temp;
+ temp.resize((size_t)max(recordSize, max(missTableSize, hitTableSize)), 0);
+
+ memset(temp.data(), 0, temp.size());
+ memcpy(temp.data(), raygenId, shaderIdSize);
+ glRaytracingMapCopy(g_glRaytracingLighting.raygenTable.resource.Get(), temp.data(), recordSize);
+
+ memset(temp.data(), 0, temp.size());
+ memcpy(temp.data(), shadowMissId, shaderIdSize);
+ memcpy(temp.data() + recordSize, bounceMissId, shaderIdSize);
+ glRaytracingMapCopy(g_glRaytracingLighting.missTable.resource.Get(), temp.data(), missTableSize);
+
+ memset(temp.data(), 0, temp.size());
+ memcpy(temp.data(), shadowHitId, shaderIdSize);
+ memcpy(temp.data() + recordSize, bounceHitId, shaderIdSize);
+ memcpy(temp.data() + recordSize * 2u, reflectionHitId, shaderIdSize);
+ glRaytracingMapCopy(g_glRaytracingLighting.hitTable.resource.Get(), temp.data(), hitTableSize);
+
+ return 1;
+}
+
+static int glRaytracingLightingCreateDenoisePipeline(void)
+{
+ ComPtr dxil = glRaytracingLightingCompileCompute(g_glRaytracingDenoiseHlsl, L"DenoiseCS");
+ if (!dxil)
+ return 0;
+
+ D3D12_COMPUTE_PIPELINE_STATE_DESC pso = {};
+ pso.pRootSignature = g_glRaytracingLighting.globalRootSig.Get();
+ pso.CS.pShaderBytecode = dxil->GetBufferPointer();
+ pso.CS.BytecodeLength = dxil->GetBufferSize();
+
+ GLR_CHECK(g_glRaytracingCmd.device->CreateComputePipelineState(
+ &pso,
+ IID_PPV_ARGS(&g_glRaytracingLighting.denoisePSO)));
+
+ return 1;
+}
+
+
+static int glRaytracingLightingCreateTemporalPipeline(void)
+{
+ ComPtr dxil = glRaytracingLightingCompileCompute(g_glRaytracingTemporalHlsl, L"TemporalAccumCS");
+ if (!dxil)
+ return 0;
+
+ D3D12_COMPUTE_PIPELINE_STATE_DESC pso = {};
+ pso.pRootSignature = g_glRaytracingLighting.globalRootSig.Get();
+ pso.CS.pShaderBytecode = dxil->GetBufferPointer();
+ pso.CS.BytecodeLength = dxil->GetBufferSize();
+
+ GLR_CHECK(g_glRaytracingCmd.device->CreateComputePipelineState(
+ &pso,
+ IID_PPV_ARGS(&g_glRaytracingLighting.temporalPSO)));
+
+ return 1;
+}
+
+static int glRaytracingLightingEnsureDenoiseResources(UINT width, UINT height)
+{
+ if (width == 0 || height == 0)
+ return 0;
+
+ if (g_glRaytracingLighting.pathTraceTexture.resource &&
+ g_glRaytracingLighting.temporalTexture.resource &&
+ g_glRaytracingLighting.historyTexture[0].resource &&
+ g_glRaytracingLighting.historyTexture[1].resource &&
+ g_glRaytracingLighting.denoiseTemp[0].resource &&
+ g_glRaytracingLighting.denoiseTemp[1].resource &&
+ g_glRaytracingLighting.denoiseWidth == width &&
+ g_glRaytracingLighting.denoiseHeight == height &&
+ g_glRaytracingLighting.denoiseFormat == GL_RAYTRACING_DENOISE_FORMAT)
+ {
+ return 1;
+ }
+
+ if (g_glRaytracingLighting.pathTraceTexture.resource ||
+ g_glRaytracingLighting.temporalTexture.resource ||
+ g_glRaytracingLighting.historyTexture[0].resource ||
+ g_glRaytracingLighting.historyTexture[1].resource ||
+ g_glRaytracingLighting.denoiseTemp[0].resource ||
+ g_glRaytracingLighting.denoiseTemp[1].resource)
+ {
+ glRaytracingWaitIdle();
+ }
+
+ g_glRaytracingLighting.pathTraceTexture = glRaytracingTexture_t();
+ g_glRaytracingLighting.temporalTexture = glRaytracingTexture_t();
+ g_glRaytracingLighting.historyTexture[0] = glRaytracingTexture_t();
+ g_glRaytracingLighting.historyTexture[1] = glRaytracingTexture_t();
+ g_glRaytracingLighting.denoiseTemp[0] = glRaytracingTexture_t();
+ g_glRaytracingLighting.denoiseTemp[1] = glRaytracingTexture_t();
+
+ g_glRaytracingLighting.pathTraceTexture = glRaytracingCreateTexture2D(
+ g_glRaytracingCmd.device.Get(),
+ width,
+ height,
+ GL_RAYTRACING_DENOISE_FORMAT,
+ D3D12_RESOURCE_STATE_UNORDERED_ACCESS,
+ D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS);
+
+ g_glRaytracingLighting.temporalTexture = glRaytracingCreateTexture2D(
+ g_glRaytracingCmd.device.Get(),
+ width,
+ height,
+ GL_RAYTRACING_DENOISE_FORMAT,
+ D3D12_RESOURCE_STATE_UNORDERED_ACCESS,
+ D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS);
+
+ for (int i = 0; i < 2; ++i)
+ {
+ g_glRaytracingLighting.historyTexture[i] = glRaytracingCreateTexture2D(
+ g_glRaytracingCmd.device.Get(),
+ width,
+ height,
+ GL_RAYTRACING_DENOISE_FORMAT,
+ D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE,
+ D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS);
+ }
+
+ for (int i = 0; i < 2; ++i)
+ {
+ g_glRaytracingLighting.denoiseTemp[i] = glRaytracingCreateTexture2D(
+ g_glRaytracingCmd.device.Get(),
+ width,
+ height,
+ GL_RAYTRACING_DENOISE_FORMAT,
+ D3D12_RESOURCE_STATE_UNORDERED_ACCESS,
+ D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS);
+ }
+
+ if (!g_glRaytracingLighting.pathTraceTexture.resource ||
+ !g_glRaytracingLighting.temporalTexture.resource ||
+ !g_glRaytracingLighting.historyTexture[0].resource ||
+ !g_glRaytracingLighting.historyTexture[1].resource ||
+ !g_glRaytracingLighting.denoiseTemp[0].resource ||
+ !g_glRaytracingLighting.denoiseTemp[1].resource)
+ {
+ return 0;
+ }
+
+ g_glRaytracingLighting.currentHistoryIndex = 0;
+ g_glRaytracingLighting.denoiseWidth = width;
+ g_glRaytracingLighting.denoiseHeight = height;
+ g_glRaytracingLighting.denoiseFormat = GL_RAYTRACING_DENOISE_FORMAT;
+ glRaytracingLightingResetDenoiseHistory();
+ return 1;
+}
+
+static void glRaytracingLightingCreatePerPassDescriptors(
+ const glRaytracingLightingPassDesc_t* pass,
+ ID3D12Resource* topLevelAS,
+ ID3D12Resource* rayOutputTexture,
+ ID3D12Resource* pathTraceTexture,
+ ID3D12Resource* denoiseATexture,
+ ID3D12Resource* denoiseBTexture,
+ ID3D12Resource* historyReadTexture,
+ ID3D12Resource* historyWriteTexture,
+ ID3D12Resource* temporalTexture)
+{
+ D3D12_CPU_DESCRIPTOR_HANDLE base = g_glRaytracingLighting.descriptorHeap->GetCPUDescriptorHandleForHeapStart();
+
+ D3D12_SHADER_RESOURCE_VIEW_DESC albedoSrv = {};
+ albedoSrv.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
+ albedoSrv.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D;
+ albedoSrv.Format = pass->albedoFormat;
+ albedoSrv.Texture2D.MipLevels = 1;
+ g_glRaytracingCmd.device->CreateShaderResourceView(pass->albedoTexture, &albedoSrv,
+ glRaytracingOffsetCpu(base, g_glRaytracingLighting.descriptorStride, GLR_DESC_ALBEDO_SRV));
+
+ D3D12_SHADER_RESOURCE_VIEW_DESC depthSrv = {};
+ depthSrv.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
+ depthSrv.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D;
+ depthSrv.Format = glRaytracingGetSrvFormatForDepth(pass->depthFormat);
+ depthSrv.Texture2D.MipLevels = 1;
+ g_glRaytracingCmd.device->CreateShaderResourceView(pass->depthTexture, &depthSrv,
+ glRaytracingOffsetCpu(base, g_glRaytracingLighting.descriptorStride, GLR_DESC_DEPTH_SRV));
+
+ D3D12_SHADER_RESOURCE_VIEW_DESC normalSrv = {};
+ normalSrv.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
+ normalSrv.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D;
+ normalSrv.Format = pass->normalFormat;
+ normalSrv.Texture2D.MipLevels = 1;
+ g_glRaytracingCmd.device->CreateShaderResourceView(pass->normalTexture, &normalSrv,
+ glRaytracingOffsetCpu(base, g_glRaytracingLighting.descriptorStride, GLR_DESC_NORMAL_SRV));
+
+ D3D12_SHADER_RESOURCE_VIEW_DESC positionSrv = {};
+ positionSrv.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
+ positionSrv.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D;
+ positionSrv.Format = pass->positionFormat;
+ positionSrv.Texture2D.MipLevels = 1;
+ g_glRaytracingCmd.device->CreateShaderResourceView(pass->positionTexture, &positionSrv,
+ glRaytracingOffsetCpu(base, g_glRaytracingLighting.descriptorStride, GLR_DESC_POSITION_SRV));
+
+ D3D12_SHADER_RESOURCE_VIEW_DESC tlasSrv = {};
+ tlasSrv.ViewDimension = D3D12_SRV_DIMENSION_RAYTRACING_ACCELERATION_STRUCTURE;
+ tlasSrv.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
+ tlasSrv.RaytracingAccelerationStructure.Location = topLevelAS->GetGPUVirtualAddress();
+ g_glRaytracingCmd.device->CreateShaderResourceView(nullptr, &tlasSrv,
+ glRaytracingOffsetCpu(base, g_glRaytracingLighting.descriptorStride, GLR_DESC_TLAS_SRV));
+
+ D3D12_SHADER_RESOURCE_VIEW_DESC denoiseSrv = {};
+ denoiseSrv.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
+ denoiseSrv.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D;
+ denoiseSrv.Format = GL_RAYTRACING_DENOISE_FORMAT;
+ denoiseSrv.Texture2D.MipLevels = 1;
+
+ g_glRaytracingCmd.device->CreateShaderResourceView(pathTraceTexture, &denoiseSrv,
+ glRaytracingOffsetCpu(base, g_glRaytracingLighting.descriptorStride, GLR_DESC_PATHTRACE_SRV));
+ g_glRaytracingCmd.device->CreateShaderResourceView(denoiseATexture, &denoiseSrv,
+ glRaytracingOffsetCpu(base, g_glRaytracingLighting.descriptorStride, GLR_DESC_DENOISE_A_SRV));
+ g_glRaytracingCmd.device->CreateShaderResourceView(denoiseBTexture, &denoiseSrv,
+ glRaytracingOffsetCpu(base, g_glRaytracingLighting.descriptorStride, GLR_DESC_DENOISE_B_SRV));
+ g_glRaytracingCmd.device->CreateShaderResourceView(historyReadTexture, &denoiseSrv,
+ glRaytracingOffsetCpu(base, g_glRaytracingLighting.descriptorStride, GLR_DESC_HISTORY_SRV));
+ g_glRaytracingCmd.device->CreateShaderResourceView(temporalTexture, &denoiseSrv,
+ glRaytracingOffsetCpu(base, g_glRaytracingLighting.descriptorStride, GLR_DESC_TEMPORAL_SRV));
+
+ D3D12_SHADER_RESOURCE_VIEW_DESC emissiveSrv = {};
+ emissiveSrv.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
+ emissiveSrv.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D;
+ emissiveSrv.Format = g_glRaytracingLighting.emissiveFormat;
+ emissiveSrv.Texture2D.MipLevels = 1;
+ g_glRaytracingCmd.device->CreateShaderResourceView(g_glRaytracingLighting.emissiveTexture, &emissiveSrv,
+ glRaytracingOffsetCpu(base, g_glRaytracingLighting.descriptorStride, GLR_DESC_EMISSIVE_SRV));
+
+ D3D12_SHADER_RESOURCE_VIEW_DESC specularSrv = {};
+ specularSrv.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D;
+ specularSrv.Texture2D.MipLevels = 1;
+ ID3D12Resource* specularResource = g_glRaytracingLighting.specularTexture;
+ if (specularResource)
+ {
+ specularSrv.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
+ specularSrv.Format = g_glRaytracingLighting.specularFormat;
+ }
+ else
+ {
+ // Bind a harmless fallback descriptor when the shim has not provided a
+ // specular G-buffer. The shader sees alpha zero and uses the legacy fallback.
+ specularResource = pass->albedoTexture;
+ specularSrv.Shader4ComponentMapping = D3D12_ENCODE_SHADER_4_COMPONENT_MAPPING(
+ D3D12_SHADER_COMPONENT_MAPPING_FROM_MEMORY_COMPONENT_0,
+ D3D12_SHADER_COMPONENT_MAPPING_FROM_MEMORY_COMPONENT_1,
+ D3D12_SHADER_COMPONENT_MAPPING_FROM_MEMORY_COMPONENT_2,
+ D3D12_SHADER_COMPONENT_MAPPING_FORCE_VALUE_0);
+ specularSrv.Format = pass->albedoFormat;
+ }
+ g_glRaytracingCmd.device->CreateShaderResourceView(specularResource, &specularSrv,
+ glRaytracingOffsetCpu(base, g_glRaytracingLighting.descriptorStride, GLR_DESC_SPECULAR_SRV));
+
+ D3D12_UNORDERED_ACCESS_VIEW_DESC rayOutputUav = {};
+ rayOutputUav.ViewDimension = D3D12_UAV_DIMENSION_TEXTURE2D;
+ rayOutputUav.Format = GL_RAYTRACING_DENOISE_FORMAT;
+ g_glRaytracingCmd.device->CreateUnorderedAccessView(rayOutputTexture, nullptr, &rayOutputUav,
+ glRaytracingOffsetCpu(base, g_glRaytracingLighting.descriptorStride, GLR_DESC_PATHTRACE_UAV));
+
+ D3D12_UNORDERED_ACCESS_VIEW_DESC denoiseUav = {};
+ denoiseUav.ViewDimension = D3D12_UAV_DIMENSION_TEXTURE2D;
+ denoiseUav.Format = GL_RAYTRACING_DENOISE_FORMAT;
+ g_glRaytracingCmd.device->CreateUnorderedAccessView(denoiseATexture, nullptr, &denoiseUav,
+ glRaytracingOffsetCpu(base, g_glRaytracingLighting.descriptorStride, GLR_DESC_DENOISE_A_UAV));
+ g_glRaytracingCmd.device->CreateUnorderedAccessView(denoiseBTexture, nullptr, &denoiseUav,
+ glRaytracingOffsetCpu(base, g_glRaytracingLighting.descriptorStride, GLR_DESC_DENOISE_B_UAV));
+
+ D3D12_UNORDERED_ACCESS_VIEW_DESC outputUav = {};
+ outputUav.ViewDimension = D3D12_UAV_DIMENSION_TEXTURE2D;
+ outputUav.Format = pass->outputFormat;
+ g_glRaytracingCmd.device->CreateUnorderedAccessView(pass->outputTexture, nullptr, &outputUav,
+ glRaytracingOffsetCpu(base, g_glRaytracingLighting.descriptorStride, GLR_DESC_OUTPUT_UAV));
+
+ D3D12_UNORDERED_ACCESS_VIEW_DESC temporalUav = {};
+ temporalUav.ViewDimension = D3D12_UAV_DIMENSION_TEXTURE2D;
+ temporalUav.Format = GL_RAYTRACING_DENOISE_FORMAT;
+ g_glRaytracingCmd.device->CreateUnorderedAccessView(temporalTexture, nullptr, &temporalUav,
+ glRaytracingOffsetCpu(base, g_glRaytracingLighting.descriptorStride, GLR_DESC_TEMPORAL_UAV));
+ g_glRaytracingCmd.device->CreateUnorderedAccessView(historyWriteTexture, nullptr, &temporalUav,
+ glRaytracingOffsetCpu(base, g_glRaytracingLighting.descriptorStride, GLR_DESC_HISTORY_UAV));
+}
+
+
+
+// ============================================================
+// Lighting public API
+// ============================================================
+
+static bool glRaytracingLightingExecuteInternal(
+ const glRaytracingLightingPassDesc_t* pass,
+ ID3D12Resource* topLevelAS)
+{
+ if (!g_glRaytracingLighting.initialized || !pass || !topLevelAS)
+ return false;
+
+ if (!pass->albedoTexture || !pass->depthTexture || !pass->normalTexture || !pass->positionTexture || !pass->outputTexture)
+ return false;
+
+ if (pass->width == 0 || pass->height == 0)
+ return false;
+
+ if (!glRaytracingLightingEnsureDenoiseResources(pass->width, pass->height))
+ return false;
+
+ const bool useInternalDenoiser =
+ (g_glRaytracingLighting.constants.enableDenoiser != 0u) &&
+ !g_glRaytracingLighting.externalDenoiser;
+
+ ID3D12Resource* rayOutputTexture = useInternalDenoiser
+ ? g_glRaytracingLighting.pathTraceTexture.resource.Get()
+ : pass->outputTexture;
+
+ if (!glRaytracingBeginCmd())
+ return false;
+
+ glRaytracingLightingSelectFrameResources(g_glRaytracingCmd.cmdCurrentSlot);
+
+ g_glRaytracingLighting.constants.screenSize[0] = (float)pass->width;
+ g_glRaytracingLighting.constants.screenSize[1] = (float)pass->height;
+ g_glRaytracingLighting.constants.screenSize[2] = 1.0f / (float)pass->width;
+ g_glRaytracingLighting.constants.screenSize[3] = 1.0f / (float)pass->height;
+ g_glRaytracingLighting.constants.frameIndex = g_glRaytracingLighting.frameCounter;
+ g_glRaytracingLighting.constants.lightCount =
+ (uint32_t)glRaytracingClamp(g_glRaytracingLighting.cpuLights.size(), 0, GL_RAYTRACING_MAX_LIGHTS);
+
+ g_glRaytracingLighting.uploadToCurrentFrameResource = true;
+ glRaytracingLightingUpdateLights();
+ glRaytracingLightingUpdateConstants();
+
+ for (uint32_t passIndex = 0; passIndex < 3u; ++passIndex)
+ {
+ glRaytracingLightingConstants_t denoiseConstants = g_glRaytracingLighting.constants;
+ denoiseConstants.denoisePassIndex = passIndex;
+ denoiseConstants.denoiseStepWidth = (float)(1u << passIndex);
+ glRaytracingLightingUploadConstantsTo(g_glRaytracingLighting.denoiseConstantBuffer[passIndex], denoiseConstants);
+ }
+ g_glRaytracingLighting.uploadToCurrentFrameResource = false;
+
+ const uint32_t historyReadIndex = g_glRaytracingLighting.currentHistoryIndex & 1u;
+ const uint32_t historyWriteIndex = (g_glRaytracingLighting.currentHistoryIndex ^ 1u) & 1u;
+
+ glRaytracingLightingCreatePerPassDescriptors(
+ pass,
+ topLevelAS,
+ rayOutputTexture,
+ g_glRaytracingLighting.pathTraceTexture.resource.Get(),
+ g_glRaytracingLighting.denoiseTemp[0].resource.Get(),
+ g_glRaytracingLighting.denoiseTemp[1].resource.Get(),
+ g_glRaytracingLighting.historyTexture[historyReadIndex].resource.Get(),
+ g_glRaytracingLighting.historyTexture[historyWriteIndex].resource.Get(),
+ g_glRaytracingLighting.temporalTexture.resource.Get());
+
+ if (useInternalDenoiser)
+ {
+ glRaytracingTransition(g_glRaytracingCmd.cmdList.Get(),
+ g_glRaytracingLighting.pathTraceTexture.resource.Get(),
+ g_glRaytracingLighting.pathTraceTexture.state,
+ D3D12_RESOURCE_STATE_UNORDERED_ACCESS);
+ g_glRaytracingLighting.pathTraceTexture.state = D3D12_RESOURCE_STATE_UNORDERED_ACCESS;
+ }
+ else
+ {
+ glRaytracingTransition(g_glRaytracingCmd.cmdList.Get(),
+ pass->outputTexture,
+ D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE,
+ D3D12_RESOURCE_STATE_UNORDERED_ACCESS);
+ }
+
+ ID3D12DescriptorHeap* heaps[] = { g_glRaytracingLighting.descriptorHeap.Get() };
+ g_glRaytracingCmd.cmdList->SetDescriptorHeaps(_countof(heaps), heaps);
+ g_glRaytracingCmd.cmdList->SetComputeRootSignature(g_glRaytracingLighting.globalRootSig.Get());
+
+ D3D12_GPU_DESCRIPTOR_HANDLE gpuBase = g_glRaytracingLighting.descriptorHeap->GetGPUDescriptorHandleForHeapStart();
+ g_glRaytracingCmd.cmdList->SetComputeRootDescriptorTable(0,
+ glRaytracingOffsetGpu(gpuBase, g_glRaytracingLighting.descriptorStride, GLR_DESC_LIGHTS_SRV));
+ g_glRaytracingCmd.cmdList->SetComputeRootDescriptorTable(1,
+ glRaytracingOffsetGpu(gpuBase, g_glRaytracingLighting.descriptorStride, GLR_DESC_PATHTRACE_UAV));
+ g_glRaytracingCmd.cmdList->SetComputeRootConstantBufferView(2, g_glRaytracingLighting.constantBuffer.gpuVA);
+ g_glRaytracingCmd.cmdList->SetPipelineState1(g_glRaytracingLighting.rtStateObject.Get());
+
+ const UINT timestampBase = g_glRaytracingCmd.cmdCurrentSlot * 2u;
+ const bool writeTimestamp =
+ g_glRaytracingCmd.pathTracingTimestampHeap.Get() != nullptr &&
+ g_glRaytracingCmd.pathTracingTimestampReadback.resource.Get() != nullptr;
+ if (writeTimestamp)
+ {
+ g_glRaytracingCmd.cmdList->EndQuery(
+ g_glRaytracingCmd.pathTracingTimestampHeap.Get(),
+ D3D12_QUERY_TYPE_TIMESTAMP,
+ timestampBase + 0u);
+ }
+
+ const UINT shaderRecordSize = (UINT)glRaytracingAlignUp(
+ D3D12_SHADER_IDENTIFIER_SIZE_IN_BYTES,
+ D3D12_RAYTRACING_SHADER_RECORD_BYTE_ALIGNMENT);
+
+ D3D12_DISPATCH_RAYS_DESC rays = {};
+ rays.RayGenerationShaderRecord.StartAddress = g_glRaytracingLighting.raygenTable.gpuVA;
+ rays.RayGenerationShaderRecord.SizeInBytes = shaderRecordSize;
+ rays.MissShaderTable.StartAddress = g_glRaytracingLighting.missTable.gpuVA;
+ rays.MissShaderTable.SizeInBytes = shaderRecordSize * 2u;
+ rays.MissShaderTable.StrideInBytes = shaderRecordSize;
+ rays.HitGroupTable.StartAddress = g_glRaytracingLighting.hitTable.gpuVA;
+ rays.HitGroupTable.SizeInBytes = shaderRecordSize * 3u;
+ rays.HitGroupTable.StrideInBytes = shaderRecordSize;
+ rays.Width = pass->width;
+ rays.Height = pass->height;
+ rays.Depth = 1;
+ g_glRaytracingCmd.cmdList->DispatchRays(&rays);
+
+ D3D12_RESOURCE_BARRIER rawUav = {};
+ rawUav.Type = D3D12_RESOURCE_BARRIER_TYPE_UAV;
+ rawUav.UAV.pResource = rayOutputTexture;
+ g_glRaytracingCmd.cmdList->ResourceBarrier(1, &rawUav);
+
+ if (useInternalDenoiser)
+ {
+ const UINT groupsX = (pass->width + 7u) / 8u;
+ const UINT groupsY = (pass->height + 7u) / 8u;
+
+ glRaytracingTransition(g_glRaytracingCmd.cmdList.Get(),
+ g_glRaytracingLighting.pathTraceTexture.resource.Get(),
+ g_glRaytracingLighting.pathTraceTexture.state,
+ D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE);
+ g_glRaytracingLighting.pathTraceTexture.state = D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE;
+
+ glRaytracingTransition(g_glRaytracingCmd.cmdList.Get(),
+ g_glRaytracingLighting.temporalTexture.resource.Get(),
+ g_glRaytracingLighting.temporalTexture.state,
+ D3D12_RESOURCE_STATE_UNORDERED_ACCESS);
+ g_glRaytracingLighting.temporalTexture.state = D3D12_RESOURCE_STATE_UNORDERED_ACCESS;
+
+ glRaytracingTransition(g_glRaytracingCmd.cmdList.Get(),
+ g_glRaytracingLighting.historyTexture[historyReadIndex].resource.Get(),
+ g_glRaytracingLighting.historyTexture[historyReadIndex].state,
+ D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE);
+ g_glRaytracingLighting.historyTexture[historyReadIndex].state = D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE;
+
+ glRaytracingTransition(g_glRaytracingCmd.cmdList.Get(),
+ g_glRaytracingLighting.historyTexture[historyWriteIndex].resource.Get(),
+ g_glRaytracingLighting.historyTexture[historyWriteIndex].state,
+ D3D12_RESOURCE_STATE_UNORDERED_ACCESS);
+ g_glRaytracingLighting.historyTexture[historyWriteIndex].state = D3D12_RESOURCE_STATE_UNORDERED_ACCESS;
+
+ g_glRaytracingCmd.cmdList->SetComputeRootSignature(g_glRaytracingLighting.globalRootSig.Get());
+ g_glRaytracingCmd.cmdList->SetComputeRootDescriptorTable(0,
+ glRaytracingOffsetGpu(gpuBase, g_glRaytracingLighting.descriptorStride, GLR_DESC_LIGHTS_SRV));
+ g_glRaytracingCmd.cmdList->SetComputeRootDescriptorTable(1,
+ glRaytracingOffsetGpu(gpuBase, g_glRaytracingLighting.descriptorStride, GLR_DESC_PATHTRACE_UAV));
+ g_glRaytracingCmd.cmdList->SetComputeRootConstantBufferView(2, g_glRaytracingLighting.constantBuffer.gpuVA);
+ g_glRaytracingCmd.cmdList->SetPipelineState(g_glRaytracingLighting.temporalPSO.Get());
+ g_glRaytracingCmd.cmdList->Dispatch(groupsX, groupsY, 1);
+
+ D3D12_RESOURCE_BARRIER temporalUavs[2] = {};
+ temporalUavs[0].Type = D3D12_RESOURCE_BARRIER_TYPE_UAV;
+ temporalUavs[0].UAV.pResource = g_glRaytracingLighting.temporalTexture.resource.Get();
+ temporalUavs[1].Type = D3D12_RESOURCE_BARRIER_TYPE_UAV;
+ temporalUavs[1].UAV.pResource = g_glRaytracingLighting.historyTexture[historyWriteIndex].resource.Get();
+ g_glRaytracingCmd.cmdList->ResourceBarrier(2, temporalUavs);
+
+ glRaytracingTransition(g_glRaytracingCmd.cmdList.Get(),
+ g_glRaytracingLighting.temporalTexture.resource.Get(),
+ g_glRaytracingLighting.temporalTexture.state,
+ D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE);
+ g_glRaytracingLighting.temporalTexture.state = D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE;
+
+ glRaytracingTransition(g_glRaytracingCmd.cmdList.Get(),
+ g_glRaytracingLighting.historyTexture[historyWriteIndex].resource.Get(),
+ g_glRaytracingLighting.historyTexture[historyWriteIndex].state,
+ D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE);
+ g_glRaytracingLighting.historyTexture[historyWriteIndex].state = D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE;
+
+ for (int i = 0; i < 2; ++i)
+ {
+ glRaytracingTransition(g_glRaytracingCmd.cmdList.Get(),
+ g_glRaytracingLighting.denoiseTemp[i].resource.Get(),
+ g_glRaytracingLighting.denoiseTemp[i].state,
+ D3D12_RESOURCE_STATE_UNORDERED_ACCESS);
+ g_glRaytracingLighting.denoiseTemp[i].state = D3D12_RESOURCE_STATE_UNORDERED_ACCESS;
+ }
+
+ glRaytracingTransition(g_glRaytracingCmd.cmdList.Get(),
+ pass->outputTexture,
+ D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE,
+ D3D12_RESOURCE_STATE_UNORDERED_ACCESS);
+
+ g_glRaytracingCmd.cmdList->SetComputeRootSignature(g_glRaytracingLighting.globalRootSig.Get());
+ g_glRaytracingCmd.cmdList->SetComputeRootDescriptorTable(0,
+ glRaytracingOffsetGpu(gpuBase, g_glRaytracingLighting.descriptorStride, GLR_DESC_LIGHTS_SRV));
+ g_glRaytracingCmd.cmdList->SetComputeRootDescriptorTable(1,
+ glRaytracingOffsetGpu(gpuBase, g_glRaytracingLighting.descriptorStride, GLR_DESC_PATHTRACE_UAV));
+ g_glRaytracingCmd.cmdList->SetPipelineState(g_glRaytracingLighting.denoisePSO.Get());
+
+ // Pass 0: temporally accumulated path trace -> temp A.
+ g_glRaytracingCmd.cmdList->SetComputeRootConstantBufferView(2, g_glRaytracingLighting.denoiseConstantBuffer[0].gpuVA);
+ g_glRaytracingCmd.cmdList->Dispatch(groupsX, groupsY, 1);
+
+ D3D12_RESOURCE_BARRIER uavA = {};
+ uavA.Type = D3D12_RESOURCE_BARRIER_TYPE_UAV;
+ uavA.UAV.pResource = g_glRaytracingLighting.denoiseTemp[0].resource.Get();
+ g_glRaytracingCmd.cmdList->ResourceBarrier(1, &uavA);
+
+ glRaytracingTransition(g_glRaytracingCmd.cmdList.Get(),
+ g_glRaytracingLighting.denoiseTemp[0].resource.Get(),
+ g_glRaytracingLighting.denoiseTemp[0].state,
+ D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE);
+ g_glRaytracingLighting.denoiseTemp[0].state = D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE;
+
+ // Pass 1: temp A -> temp B.
+ g_glRaytracingCmd.cmdList->SetComputeRootConstantBufferView(2, g_glRaytracingLighting.denoiseConstantBuffer[1].gpuVA);
+ g_glRaytracingCmd.cmdList->Dispatch(groupsX, groupsY, 1);
+
+ D3D12_RESOURCE_BARRIER uavB = {};
+ uavB.Type = D3D12_RESOURCE_BARRIER_TYPE_UAV;
+ uavB.UAV.pResource = g_glRaytracingLighting.denoiseTemp[1].resource.Get();
+ g_glRaytracingCmd.cmdList->ResourceBarrier(1, &uavB);
+
+ glRaytracingTransition(g_glRaytracingCmd.cmdList.Get(),
+ g_glRaytracingLighting.denoiseTemp[1].resource.Get(),
+ g_glRaytracingLighting.denoiseTemp[1].state,
+ D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE);
+ g_glRaytracingLighting.denoiseTemp[1].state = D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE;
+
+ // Pass 2: temp B -> final output.
+ g_glRaytracingCmd.cmdList->SetComputeRootConstantBufferView(2, g_glRaytracingLighting.denoiseConstantBuffer[2].gpuVA);
+ g_glRaytracingCmd.cmdList->Dispatch(groupsX, groupsY, 1);
+
+ D3D12_RESOURCE_BARRIER outputUav = {};
+ outputUav.Type = D3D12_RESOURCE_BARRIER_TYPE_UAV;
+ outputUav.UAV.pResource = pass->outputTexture;
+ g_glRaytracingCmd.cmdList->ResourceBarrier(1, &outputUav);
+ }
+
+ glRaytracingTransition(g_glRaytracingCmd.cmdList.Get(),
+ pass->outputTexture,
+ D3D12_RESOURCE_STATE_UNORDERED_ACCESS,
+ D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE);
+
+ if (writeTimestamp)
+ {
+ g_glRaytracingCmd.cmdList->EndQuery(
+ g_glRaytracingCmd.pathTracingTimestampHeap.Get(),
+ D3D12_QUERY_TYPE_TIMESTAMP,
+ timestampBase + 1u);
+ g_glRaytracingCmd.cmdList->ResolveQueryData(
+ g_glRaytracingCmd.pathTracingTimestampHeap.Get(),
+ D3D12_QUERY_TYPE_TIMESTAMP,
+ timestampBase,
+ 2,
+ g_glRaytracingCmd.pathTracingTimestampReadback.resource.Get(),
+ sizeof(UINT64) * timestampBase);
+ }
+
+ if (!glRaytracingEndCmd())
+ return false;
+
+ if (writeTimestamp)
+ g_glRaytracingCmd.pathTracingTimestampFenceRing[g_glRaytracingCmd.cmdCurrentSlot] = g_glRaytracingCmd.cmdLastFenceValue;
+
+ if (useInternalDenoiser)
+ g_glRaytracingLighting.currentHistoryIndex = historyWriteIndex;
+
+ ++g_glRaytracingLighting.frameCounter;
+ return true;
+}
+
+static ID3D12Resource* glRaytracingResolveTLASForWorld(glRaytracingSceneHandle_t worldHandle)
+{
+ glRaytracingRenderWorld_t* world = glRaytracingFindWorld(worldHandle);
+ if (!world)
+ return nullptr;
+
+ if (!glRaytracingBuildDirtyMeshesInternal())
+ return nullptr;
+
+ if (!glRaytracingBuildSceneInternal(world))
+ return nullptr;
+
+ if (!world->tlasBuilt)
+ return nullptr;
+
+ return glRaytracingGetCurrentTLASBuffer(world)->resource.Get();
+}
+
+bool glRaytracingLightingInit(void)
+{
+ std::lock_guard lock(g_glRaytracingMutex);
+
+ if (g_glRaytracingLighting.initialized)
+ return true;
+
+ if (!glRaytracingInitCmdContext())
+ return false;
+
+ if (!glRaytracingLightingCreateDescriptorHeap())
+ return false;
+
+ if (!glRaytracingLightingCreateRootSignatures())
+ return false;
+
+ if (!glRaytracingLightingCreateBuffers())
+ return false;
+
+ glRaytracingLightingCreatePersistentLightSRV();
+
+ if (!glRaytracingLightingCreateStateObject())
+ return false;
+
+ if (!glRaytracingLightingCreateShaderTables())
+ return false;
+
+ if (!glRaytracingLightingCreateDenoisePipeline())
+ return false;
+
+ if (!glRaytracingLightingCreateTemporalPipeline())
+ return false;
+
+ memset(&g_glRaytracingLighting.constants, 0, sizeof(g_glRaytracingLighting.constants));
+ glRaytracingSetIdentity4x4(g_glRaytracingLighting.constants.invViewProj);
+ glRaytracingSetIdentity4x4(g_glRaytracingLighting.constants.invViewMatrix);
+ glRaytracingSetIdentity4x4(g_glRaytracingLighting.constants.viewProj);
+ g_glRaytracingLighting.constants.ambientColor[0] = 0.08f;
+ g_glRaytracingLighting.constants.ambientColor[1] = 0.08f;
+ g_glRaytracingLighting.constants.ambientColor[2] = 0.09f;
+ g_glRaytracingLighting.constants.ambientColor[3] = 1.0f;
+ g_glRaytracingLighting.constants.enableSpecular = 1;
+ g_glRaytracingLighting.constants.enableHalfLambert = 1;
+ g_glRaytracingLighting.constants.normalReconstructZ = 1.0f;
+ g_glRaytracingLighting.constants.shadowBias = 1.5f;
+ g_glRaytracingLighting.constants.frameIndex = 0;
+ g_glRaytracingLighting.constants.samplesPerPixel = 1;
+ g_glRaytracingLighting.constants.maxBounces = 2;
+ g_glRaytracingLighting.constants.enableDenoiser = 1;
+ g_glRaytracingLighting.constants.denoisePassIndex = 0;
+ g_glRaytracingLighting.constants.denoiseStepWidth = 1.0f;
+ g_glRaytracingLighting.constants.denoiseStrength = 1.0f;
+ g_glRaytracingLighting.constants.denoisePhiColor = 8.0f;
+ g_glRaytracingLighting.constants.denoisePhiNormal = 64.0f;
+ g_glRaytracingLighting.constants.denoisePhiPosition = 0.045f;
+ g_glRaytracingLighting.constants.bumpStrength = 2.35f;
+ glRaytracingLightingResetDenoiseHistory();
+
+ glRaytracingLightingUpdateConstants();
+
+ g_glRaytracingLighting.initialized = true;
+ glRaytracingLog("glRaytracingLightingInit ok");
+ return true;
+}
+
+void glRaytracingLightingShutdown(void)
+{
+ std::lock_guard lock(g_glRaytracingMutex);
+
+ if (!g_glRaytracingLighting.initialized)
+ return;
+
+ glRaytracingWaitIdle();
+ glRaytracingLightingUnmapUploadBuffers();
+ g_glRaytracingLighting = glRaytracingLightingState_t();
+}
+
+bool glRaytracingLightingIsInitialized(void)
+{
+ std::lock_guard lock(g_glRaytracingMutex);
+ return g_glRaytracingLighting.initialized;
+}
+
+void glRaytracingLightingClearLights(bool clearPersistant)
+{
+ std::lock_guard lock(g_glRaytracingMutex);
+ glRaytracingLightingEnsureLightKeyCount();
+
+ if (clearPersistant)
+ {
+ g_glRaytracingLighting.cpuLights.clear();
+ g_glRaytracingLighting.cpuLightKeys.clear();
+ }
+ else
+ {
+ size_t writeIndex = 0;
+
+ for (size_t i = 0; i < g_glRaytracingLighting.cpuLights.size(); ++i)
+ {
+ const uint32_t lightKey = g_glRaytracingLighting.cpuLightKeys[i];
+
+ // Preserve normal persistent lights and renderer-managed geometry emitters.
+ // This prevents the depth-fill emissive bridge from deleting ordinary
+ // non-persistent point/spot lights by accident, and it keeps discovered
+ // geometry emitters alive when their source surface is off-screen.
+ if (g_glRaytracingLighting.cpuLights[i].persistant != 0.0f ||
+ glRaytracingLightKeyIsGeometryEmissive(lightKey))
+ {
+ if (writeIndex != i)
+ {
+ g_glRaytracingLighting.cpuLights[writeIndex] = g_glRaytracingLighting.cpuLights[i];
+ g_glRaytracingLighting.cpuLightKeys[writeIndex] = lightKey;
+ }
+ ++writeIndex;
+ }
+ }
+
+ g_glRaytracingLighting.cpuLights.resize(writeIndex);
+ g_glRaytracingLighting.cpuLightKeys.resize(writeIndex);
+ }
+
+ g_glRaytracingLighting.constants.lightCount =
+ (uint32_t)g_glRaytracingLighting.cpuLights.size();
+
+ if (clearPersistant)
+ glRaytracingLightingResetDenoiseHistory();
+
+ glRaytracingLightingUpdateLights();
+ glRaytracingLightingUpdateConstants();
+}
+
+bool glRaytracingLightingAddLight(const glRaytracingLight_t* light)
+{
+ std::lock_guard lock(g_glRaytracingMutex);
+
+ if (!g_glRaytracingLighting.initialized || !light)
+ return false;
+
+ glRaytracingLightingEnsureLightKeyCount();
+
+ if (g_glRaytracingLighting.cpuLights.size() >= GL_RAYTRACING_MAX_LIGHTS)
+ return false;
+
+ const bool persistentLight = (light->persistant > 0.0f);
+
+ g_glRaytracingLighting.cpuLights.push_back(*light);
+ g_glRaytracingLighting.cpuLightKeys.push_back(GL_RAYTRACING_LIGHT_KEY_NONE);
+ g_glRaytracingLighting.constants.lightCount = (uint32_t)g_glRaytracingLighting.cpuLights.size();
+
+ // Positive persistent/static lights invalidate accumulation. Negative
+ // persist tags are renderer-managed metadata and must not reset every frame.
+ if (persistentLight)
+ glRaytracingLightingResetDenoiseHistory();
+
+ glRaytracingLightingUpdateLights();
+ glRaytracingLightingUpdateConstants();
+ return true;
+}
+
+bool glRaytracingLightingAddOrUpdateGeometryEmissiveLight(uint32_t key, const glRaytracingLight_t* light)
+{
+ std::lock_guard lock(g_glRaytracingMutex);
+
+ if (!g_glRaytracingLighting.initialized || !light)
+ return false;
+
+ glRaytracingLightingEnsureLightKeyCount();
+
+ const uint32_t geometryKey = glRaytracingMakeGeometryEmissiveLightKey(key);
+ glRaytracingLight_t taggedLight = *light;
+ taggedLight.persistant = GL_RAYTRACING_LIGHT_PERSISTANT_GEOMETRY_EMISSIVE;
+
+ for (size_t i = 0; i < g_glRaytracingLighting.cpuLightKeys.size(); ++i)
+ {
+ if (g_glRaytracingLighting.cpuLightKeys[i] != geometryKey)
+ continue;
+
+ if (memcmp(&g_glRaytracingLighting.cpuLights[i], &taggedLight, sizeof(taggedLight)) != 0)
+ {
+ g_glRaytracingLighting.cpuLights[i] = taggedLight;
+ glRaytracingLightingUpdateLights();
+ glRaytracingLightingUpdateConstants();
+ }
+ return true;
+ }
+
+ if (g_glRaytracingLighting.cpuLights.size() >= GL_RAYTRACING_MAX_LIGHTS)
+ return false;
+
+ g_glRaytracingLighting.cpuLights.push_back(taggedLight);
+ g_glRaytracingLighting.cpuLightKeys.push_back(geometryKey);
+ g_glRaytracingLighting.constants.lightCount = (uint32_t)g_glRaytracingLighting.cpuLights.size();
+
+ // Geometry emitters are discovered from draw surfaces. Do not reset denoise
+ // history when they are first seen or re-seen; otherwise camera movement and
+ // PVS changes keep the path tracer permanently noisy.
+ glRaytracingLightingUpdateLights();
+ glRaytracingLightingUpdateConstants();
+ return true;
+}
+
+void glRaytracingLightingClearGeometryEmissiveLights(void)
+{
+ std::lock_guard lock(g_glRaytracingMutex);
+ glRaytracingLightingEnsureLightKeyCount();
+
+ size_t writeIndex = 0;
+ for (size_t i = 0; i < g_glRaytracingLighting.cpuLights.size(); ++i)
+ {
+ const uint32_t lightKey = g_glRaytracingLighting.cpuLightKeys[i];
+ if (glRaytracingLightKeyIsGeometryEmissive(lightKey))
+ continue;
+
+ if (writeIndex != i)
+ {
+ g_glRaytracingLighting.cpuLights[writeIndex] = g_glRaytracingLighting.cpuLights[i];
+ g_glRaytracingLighting.cpuLightKeys[writeIndex] = lightKey;
+ }
+ ++writeIndex;
+ }
+
+ g_glRaytracingLighting.cpuLights.resize(writeIndex);
+ g_glRaytracingLighting.cpuLightKeys.resize(writeIndex);
+ g_glRaytracingLighting.constants.lightCount = (uint32_t)g_glRaytracingLighting.cpuLights.size();
+ glRaytracingLightingUpdateLights();
+ glRaytracingLightingUpdateConstants();
+}
+
+void glRaytracingLightingSetAmbient(float r, float g, float b, float intensity)
+{
+ std::lock_guard lock(g_glRaytracingMutex);
+
+ if (g_glRaytracingLighting.constants.ambientColor[0] != r ||
+ g_glRaytracingLighting.constants.ambientColor[1] != g ||
+ g_glRaytracingLighting.constants.ambientColor[2] != b ||
+ g_glRaytracingLighting.constants.ambientColor[3] != intensity)
+ {
+ glRaytracingLightingResetDenoiseHistory();
+ }
+
+ g_glRaytracingLighting.constants.ambientColor[0] = r;
+ g_glRaytracingLighting.constants.ambientColor[1] = g;
+ g_glRaytracingLighting.constants.ambientColor[2] = b;
+ g_glRaytracingLighting.constants.ambientColor[3] = intensity;
+ glRaytracingLightingUpdateConstants();
+}
+
+void glRaytracingLightingSetCameraPosition(float x, float y, float z)
+{
+ std::lock_guard lock(g_glRaytracingMutex);
+
+ // Camera position changes every frame while the player moves. Treat it as a
+ // normal frame constant, not a light/material change, or the temporal GI
+ // accumulator is reset exactly when the image needs it most.
+ g_glRaytracingLighting.constants.cameraPos[0] = x;
+ g_glRaytracingLighting.constants.cameraPos[1] = y;
+ g_glRaytracingLighting.constants.cameraPos[2] = z;
+ g_glRaytracingLighting.constants.cameraPos[3] = 1.0f;
+ glRaytracingLightingUpdateConstants();
+}
+
+void glRaytracingLightingSetInvViewProjMatrix(const float* m16)
+{
+ std::lock_guard lock(g_glRaytracingMutex);
+
+ if (!m16)
+ return;
+
+ memcpy(g_glRaytracingLighting.constants.invViewProj, m16, sizeof(float) * 16);
+
+ if (!glRaytracingInvertMatrix4x4(m16, g_glRaytracingLighting.constants.viewProj))
+ glRaytracingSetIdentity4x4(g_glRaytracingLighting.constants.viewProj);
+
+ glRaytracingLightingUpdateConstants();
+}
+
+void glRaytracingLightingSetInvViewMatrix(const float* m16)
+{
+ std::lock_guard lock(g_glRaytracingMutex);
+
+ if (!m16)
+ return;
+
+ memcpy(g_glRaytracingLighting.constants.invViewMatrix, m16, sizeof(float) * 16);
+ glRaytracingLightingUpdateConstants();
+}
+
+void glRaytracingLightingSetNormalReconstructSign(float signValue)
+{
+ std::lock_guard lock(g_glRaytracingMutex);
+
+ if (g_glRaytracingLighting.constants.normalReconstructZ != signValue)
+ glRaytracingLightingResetDenoiseHistory();
+
+ g_glRaytracingLighting.constants.normalReconstructZ = signValue;
+ glRaytracingLightingUpdateConstants();
+}
+
+void glRaytracingLightingSetBumpStrength(float strength)
+{
+ std::lock_guard lock(g_glRaytracingMutex);
+
+ strength = glRaytracingClamp(strength, 0.0f, 8.0f);
+ if (g_glRaytracingLighting.constants.bumpStrength != strength)
+ glRaytracingLightingResetDenoiseHistory();
+
+ g_glRaytracingLighting.constants.bumpStrength = strength;
+ glRaytracingLightingUpdateConstants();
+}
+
+void glRaytracingLightingEnableSpecular(int enable)
+{
+ std::lock_guard lock(g_glRaytracingMutex);
+
+ uint32_t value = enable ? 1u : 0u;
+ if (g_glRaytracingLighting.constants.enableSpecular != value)
+ glRaytracingLightingResetDenoiseHistory();
+
+ g_glRaytracingLighting.constants.enableSpecular = value;
+ glRaytracingLightingUpdateConstants();
+}
+
+void glRaytracingLightingEnableHalfLambert(int enable)
+{
+ std::lock_guard lock(g_glRaytracingMutex);
+
+ uint32_t value = enable ? 1u : 0u;
+ if (g_glRaytracingLighting.constants.enableHalfLambert != value)
+ glRaytracingLightingResetDenoiseHistory();
+
+ g_glRaytracingLighting.constants.enableHalfLambert = value;
+ glRaytracingLightingUpdateConstants();
+}
+
+void glRaytracingLightingSetShadowBias(float bias)
+{
+ std::lock_guard lock(g_glRaytracingMutex);
+
+ if (g_glRaytracingLighting.constants.shadowBias != bias)
+ glRaytracingLightingResetDenoiseHistory();
+
+ g_glRaytracingLighting.constants.shadowBias = bias;
+ glRaytracingLightingUpdateConstants();
+}
+
+void glRaytracingLightingSetPathTracingOptions(uint32_t samplesPerPixel, uint32_t maxBounces, int enableDenoiser, float denoiseStrength)
+{
+ std::lock_guard lock(g_glRaytracingMutex);
+
+ samplesPerPixel = glRaytracingClamp(samplesPerPixel ? samplesPerPixel : 1u, 1u, 8u);
+ maxBounces = glRaytracingClamp(maxBounces ? maxBounces : 1u, 1u, 4u);
+ uint32_t denoiser = enableDenoiser ? 1u : 0u;
+ denoiseStrength = glRaytracingClamp(denoiseStrength, 0.0f, 1.0f);
+
+ if (g_glRaytracingLighting.constants.samplesPerPixel != samplesPerPixel ||
+ g_glRaytracingLighting.constants.maxBounces != maxBounces ||
+ g_glRaytracingLighting.constants.enableDenoiser != denoiser ||
+ g_glRaytracingLighting.constants.denoiseStrength != denoiseStrength)
+ {
+ glRaytracingLightingResetDenoiseHistory();
+ }
+
+ g_glRaytracingLighting.constants.samplesPerPixel = samplesPerPixel;
+ g_glRaytracingLighting.constants.maxBounces = maxBounces;
+ g_glRaytracingLighting.constants.enableDenoiser = denoiser;
+ g_glRaytracingLighting.constants.denoiseStrength = denoiseStrength;
+ glRaytracingLightingUpdateConstants();
+}
+
+void glRaytracingLightingSetDenoiseTuning(float phiColor, float phiNormal, float phiPosition)
+{
+ std::lock_guard lock(g_glRaytracingMutex);
+
+ phiColor = glRaytracingClamp(phiColor, 0.001f, 64.0f);
+ phiNormal = glRaytracingClamp(phiNormal, 1.0f, 128.0f);
+ phiPosition = glRaytracingClamp(phiPosition, 0.001f, 4.0f);
+
+ if (g_glRaytracingLighting.constants.denoisePhiColor != phiColor ||
+ g_glRaytracingLighting.constants.denoisePhiNormal != phiNormal ||
+ g_glRaytracingLighting.constants.denoisePhiPosition != phiPosition)
+ {
+ glRaytracingLightingResetDenoiseHistory();
+ }
+
+ g_glRaytracingLighting.constants.denoisePhiColor = phiColor;
+ g_glRaytracingLighting.constants.denoisePhiNormal = phiNormal;
+ g_glRaytracingLighting.constants.denoisePhiPosition = phiPosition;
+ glRaytracingLightingUpdateConstants();
+}
+
+void glRaytracingLightingSetVolumetricScattering(glRaytracingLight_t* light, float strength)
+{
+ if (!light)
+ return;
+
+ // This uses glRaytracingLight_t::pad1, which is renamed to
+ // Light::volumetricScattering in HLSL. Keeping the existing pad slot avoids
+ // changing the StructuredBuffer stride for already-integrated callers.
+ light->pad1 = glRaytracingClamp(strength, 0.0f, 16.0f);
+}
+
+void glRaytracingLightingSetExternalDenoiser(int enabled)
+{
+ std::lock_guard lock(g_glRaytracingMutex);
+
+ const bool newValue = enabled ? true : false;
+ if (g_glRaytracingLighting.externalDenoiser != newValue)
+ glRaytracingLightingResetDenoiseHistory();
+
+ g_glRaytracingLighting.externalDenoiser = newValue;
+}
+
+void glRaytracingLightingResetTemporalHistory(void)
+{
+ std::lock_guard lock(g_glRaytracingMutex);
+
+ glRaytracingLightingResetDenoiseHistory();
+ glRaytracingLightingUpdateConstants();
+}
+
+void glRaytracingLightingUseExternalDenoiser(int enabled)
+{
+ glRaytracingLightingSetExternalDenoiser(enabled);
+}
+
+
+void glRaytracingLightingSetEmissiveInput(ID3D12Resource* texture, DXGI_FORMAT format)
+{
+ std::lock_guard lock(g_glRaytracingMutex);
+
+ g_glRaytracingLighting.emissiveTexture = texture;
+ g_glRaytracingLighting.emissiveFormat = (format == DXGI_FORMAT_UNKNOWN)
+ ? DXGI_FORMAT_R16G16B16A16_FLOAT
+ : format;
+}
+
+void glRaytracingLightingSetSpecularInput(ID3D12Resource* texture, DXGI_FORMAT format)
+{
+ std::lock_guard lock(g_glRaytracingMutex);
+
+ DXGI_FORMAT newFormat = (format == DXGI_FORMAT_UNKNOWN)
+ ? DXGI_FORMAT_R8G8B8A8_UNORM
+ : format;
+
+ // The G-buffer specular resource is normally double-buffered, so the texture
+ // pointer can change every frame even when the material data is stable. Do not
+ // reset temporal GI just because the current frame resource rotated; only a
+ // real format change invalidates the accumulator.
+ if (g_glRaytracingLighting.specularFormat != newFormat)
+ {
+ glRaytracingLightingResetDenoiseHistory();
+ }
+
+ g_glRaytracingLighting.specularTexture = texture;
+ g_glRaytracingLighting.specularFormat = newFormat;
+}
+
+bool glRaytracingLightingExecuteForScene(const glRaytracingLightingPassDesc_t* pass, glRaytracingSceneHandle_t worldHandle)
+{
+ std::lock_guard lock(g_glRaytracingMutex);
+
+ ID3D12Resource* topLevelAS = glRaytracingResolveTLASForWorld(worldHandle);
+ if (!topLevelAS)
+ return false;
+
+ return glRaytracingLightingExecuteInternal(pass, topLevelAS);
+}
+
+glRaytracingLight_t glRaytracingLightingMakePointLight(
+ float px, float py, float pz,
+ float radiusX, float radiusY, float radiusZ,
+ float r, float g, float b,
+ float intensity)
+{
+ glRaytracingLight_t l = {};
+ float ax = (radiusX < 0.0f) ? -radiusX : radiusX;
+ float ay = (radiusY < 0.0f) ? -radiusY : radiusY;
+ float az = (radiusZ < 0.0f) ? -radiusZ : radiusZ;
+ float maxRadius = ax;
+ if (ay > maxRadius) maxRadius = ay;
+ if (az > maxRadius) maxRadius = az;
+ if (maxRadius <= 0.0f) maxRadius = 1e-4f;
+
+ if (ax <= 0.0f) ax = maxRadius;
+ if (ay <= 0.0f) ay = maxRadius;
+ if (az <= 0.0f) az = maxRadius;
+
+ l.position.x = px;
+ l.position.y = py;
+ l.position.z = pz;
+
+ // Keep radius populated as a scalar fallback/max range, but point lights now
+ // attenuate using pointRadius.x/y/z in the ray generation shader.
+ l.radius = maxRadius;
+ l.pointRadius.x = ax;
+ l.pointRadius.y = ay;
+ l.pointRadius.z = az;
+ l.pointRadiusPad = 0.0f;
+ l.falloffPower = 1.0f;
+
+ l.color.x = r;
+ l.color.y = g;
+ l.color.z = b;
+ l.intensity = intensity;
+
+ l.normal.x = 0.0f;
+ l.normal.y = 0.0f;
+ l.normal.z = 1.0f;
+ l.type = GL_RAYTRACING_LIGHT_TYPE_POINT;
+
+ l.axisU.x = 1.0f;
+ l.axisU.y = 0.0f;
+ l.axisU.z = 0.0f;
+ l.halfWidth = 0.0f;
+
+ l.axisV.x = 0.0f;
+ l.axisV.y = 1.0f;
+ l.axisV.z = 0.0f;
+ l.halfHeight = 0.0f;
+
+ l.samples = 1;
+ l.twoSided = 0;
+ l.persistant = 0.0f;
+ l.pad1 = 0.0f; // volumetric scattering disabled by default.
+ return l;
+}
+
+
+glRaytracingLight_t glRaytracingLightingMakeSpotLight(
+ float px, float py, float pz,
+ float dx, float dy, float dz,
+ float ux, float uy, float uz,
+ float vx, float vy, float vz,
+ float nearPlane,
+ float farPlane,
+ float tanHalfWidth,
+ float tanHalfHeight,
+ float r, float g, float b,
+ float intensity,
+ uint32_t samples)
+{
+ glRaytracingLight_t l = {};
+
+ glRaytracingNormalize3(dx, dy, dz);
+
+ // Make U perpendicular to D.
+ {
+ const float du = dx * ux + dy * uy + dz * uz;
+ ux -= dx * du;
+ uy -= dy * du;
+ uz -= dz * du;
+
+ const float uLenSq = ux * ux + uy * uy + uz * uz;
+ if (uLenSq <= 1e-20f)
+ {
+ const float absDz = (dz < 0.0f) ? -dz : dz;
+ if (absDz < 0.999f)
+ {
+ glRaytracingCross3(0.0f, 0.0f, 1.0f, dx, dy, dz, ux, uy, uz);
+ }
+ else
+ {
+ glRaytracingCross3(0.0f, 1.0f, 0.0f, dx, dy, dz, ux, uy, uz);
+ }
+ }
+ glRaytracingNormalize3(ux, uy, uz);
+ }
+
+ // Rebuild V from D x U so the basis is orthonormal, while preserving the
+ // sign of the caller-provided V whenever possible.
+ {
+ float builtVx, builtVy, builtVz;
+ glRaytracingCross3(dx, dy, dz, ux, uy, uz, builtVx, builtVy, builtVz);
+ glRaytracingNormalize3(builtVx, builtVy, builtVz);
+
+ const float sign = builtVx * vx + builtVy * vy + builtVz * vz;
+ if (sign < 0.0f)
+ {
+ builtVx = -builtVx;
+ builtVy = -builtVy;
+ builtVz = -builtVz;
+ }
+
+ vx = builtVx;
+ vy = builtVy;
+ vz = builtVz;
+ }
+
+ if (nearPlane < 0.0f)
+ nearPlane = 0.0f;
+ if (farPlane <= nearPlane)
+ farPlane = nearPlane + 1e-3f;
+
+ if (tanHalfWidth < 0.0f) tanHalfWidth = -tanHalfWidth;
+ if (tanHalfHeight < 0.0f) tanHalfHeight = -tanHalfHeight;
+
+ if (tanHalfWidth <= 1e-4f)
+ tanHalfWidth = 1e-4f;
+ if (tanHalfHeight <= 1e-4f)
+ tanHalfHeight = 1e-4f;
+
+ l.position.x = px;
+ l.position.y = py;
+ l.position.z = pz;
+
+ // For spot lights, radius stores the far clip distance while pointRadius.x
+ // stores the near clip distance.
+ l.radius = farPlane;
+ l.pointRadius.x = nearPlane;
+ l.pointRadius.y = 0.0f;
+ l.pointRadius.z = 0.0f;
+ l.pointRadiusPad = 0.0f;
+ l.falloffPower = 1.0f;
+
+ l.color.x = r;
+ l.color.y = g;
+ l.color.z = b;
+ l.intensity = intensity;
+
+ l.normal.x = dx;
+ l.normal.y = dy;
+ l.normal.z = dz;
+ l.type = GL_RAYTRACING_LIGHT_TYPE_SPOT;
+
+ l.axisU.x = ux;
+ l.axisU.y = uy;
+ l.axisU.z = uz;
+ l.halfWidth = tanHalfWidth;
+
+ l.axisV.x = vx;
+ l.axisV.y = vy;
+ l.axisV.z = vz;
+ l.halfHeight = tanHalfHeight;
+
+ l.samples = samples ? samples : 1u;
+ l.twoSided = 0;
+ l.persistant = 0.0f;
+ l.pad1 = 0.0f; // volumetric scattering disabled by default.
+
+ return l;
+}
+
+glRaytracingLight_t glRaytracingLightingMakeRectLight(
+ float px, float py, float pz,
+ float nx, float ny, float nz,
+ float ux, float uy, float uz,
+ float vx, float vy, float vz,
+ float halfWidth, float halfHeight,
+ float r, float g, float b,
+ float intensity,
+ uint32_t samples,
+ uint32_t twoSided)
+{
+ glRaytracingLight_t l = {};
+
+ glRaytracingNormalize3(nx, ny, nz);
+ glRaytracingNormalize3(ux, uy, uz);
+ glRaytracingNormalize3(vx, vy, vz);
+
+ if ((nx == 0.0f && ny == 0.0f && nz == 0.0f) &&
+ !((ux == 0.0f && uy == 0.0f && uz == 0.0f) ||
+ (vx == 0.0f && vy == 0.0f && vz == 0.0f)))
+ {
+ glRaytracingCross3(ux, uy, uz, vx, vy, vz, nx, ny, nz);
+ glRaytracingNormalize3(nx, ny, nz);
+ }
+
+ l.position.x = px;
+ l.position.y = py;
+ l.position.z = pz;
+
+ // Reuse radius as influence/falloff range for the rect light.
+ l.radius = (halfWidth > halfHeight ? halfWidth : halfHeight) * 6.0f;
+ l.pointRadius.x = l.radius;
+ l.pointRadius.y = l.radius;
+ l.pointRadius.z = l.radius;
+ l.pointRadiusPad = 0.0f;
+ l.falloffPower = 1.0f;
+
+ l.color.x = r;
+ l.color.y = g;
+ l.color.z = b;
+ l.intensity = intensity;
+
+ l.normal.x = nx;
+ l.normal.y = ny;
+ l.normal.z = nz;
+ l.type = GL_RAYTRACING_LIGHT_TYPE_RECT;
+
+ l.axisU.x = ux;
+ l.axisU.y = uy;
+ l.axisU.z = uz;
+ l.halfWidth = halfWidth;
+
+ l.axisV.x = vx;
+ l.axisV.y = vy;
+ l.axisV.z = vz;
+ l.halfHeight = halfHeight;
+
+ l.samples = samples ? samples : 16u;
+ if (l.samples > 16u) l.samples = 16u;
+ l.twoSided = twoSided ? 1u : 0u;
+ l.persistant = 0.0f;
+ l.pad1 = 0.0f; // volumetric scattering disabled by default.
+
+ return l;
+}
+
+uint32_t glRaytracingLightingGetLightCount(void)
+{
+ return (uint32_t)g_glRaytracingLighting.cpuLights.size();
+}
+
+int glRaytracingSetInstanceVisibilityUnlocked(
+ glRaytracingRenderWorld_t* world,
+ glRaytracingInstanceHandle_t instanceHandle,
+ int visible)
+{
+ if (!world || !world->alive)
+ return 0;
+
+ glRaytracingInstanceRecord_t* inst =
+ glRaytracingFindInstance(world, instanceHandle);
+
+ if (!inst || !inst->alive)
+ return 0;
+
+ const uint32_t newMask = visible ? 0xFFu : 0u;
+
+ if ((((uint32_t)inst->descCpu.mask) & 0xFFu) == newMask)
+ return 1;
+
+ inst->descCpu.mask = newMask;
+ inst->dirty = 1;
+
+ glRaytracingMarkWorldNeedsUpdate(world);
+ return 1;
+}
+
+static void glRaytracingSetAllInstancesVisibleUnlocked(
+ glRaytracingRenderWorld_t* world,
+ int visible)
+{
+ if (!world || !world->alive)
+ return;
+
+ const uint32_t newMask = visible ? 0xFFu : 0u;
+ int changed = 0;
+
+ for (size_t i = 0; i < world->instances.size(); ++i)
+ {
+ glRaytracingInstanceRecord_t& inst = world->instances[i];
+
+ if (!inst.alive)
+ continue;
+
+ const int wasVisible = inst.descCpu.mask != 0;
+ if (wasVisible == (visible != 0))
+ continue;
+
+ inst.descCpu.mask = newMask;
+ inst.dirty = 1;
+ changed = 1;
+ }
+
+ if (changed)
+ glRaytracingMarkWorldNeedsUpdate(world);
+}
+
+int glRaytracingSetInstanceVisibilityInScene(
+ glRaytracingSceneHandle_t sceneHandle,
+ glRaytracingInstanceHandle_t instanceHandle,
+ int visible)
+{
+ std::lock_guard lock(g_glRaytracingMutex);
+
+ if (!g_glRaytracingScene.initialized)
+ return 0;
+
+ glRaytracingRenderWorld_t* world = glRaytracingFindWorld(sceneHandle);
+ return glRaytracingSetInstanceVisibilityUnlocked(
+ world,
+ instanceHandle,
+ visible ? 1 : 0);
+}
+
+int glRaytracingGetInstanceVisibilityInScene(
+ glRaytracingSceneHandle_t sceneHandle,
+ glRaytracingInstanceHandle_t instanceHandle)
+{
+ std::lock_guard lock(g_glRaytracingMutex);
+
+ if (!g_glRaytracingScene.initialized)
+ return 0;
+
+ glRaytracingRenderWorld_t* world = glRaytracingFindWorld(sceneHandle);
+ if (!world)
+ return 0;
+
+ glRaytracingInstanceRecord_t* inst =
+ glRaytracingFindInstance(world, instanceHandle);
+
+ if (!inst || !inst->alive)
+ return 0;
+
+ return inst->descCpu.mask != 0 ? 1 : 0;
+}
+
+void glRaytracingHideAllInstancesInScene(glRaytracingSceneHandle_t sceneHandle)
+{
+ std::lock_guard lock(g_glRaytracingMutex);
+
+ if (!g_glRaytracingScene.initialized)
+ return;
+
+ glRaytracingRenderWorld_t* world = glRaytracingFindWorld(sceneHandle);
+ glRaytracingSetAllInstancesVisibleUnlocked(world, 0);
+}
+
+void glRaytracingShowAllInstancesInScene(glRaytracingSceneHandle_t sceneHandle)
+{
+ std::lock_guard lock(g_glRaytracingMutex);
+
+ if (!g_glRaytracingScene.initialized)
+ return;
+
+ glRaytracingRenderWorld_t* world = glRaytracingFindWorld(sceneHandle);
+ glRaytracingSetAllInstancesVisibleUnlocked(world, 1);
+}
+
+void glRaytracingHideAllInstances(void)
+{
+ std::lock_guard lock(g_glRaytracingMutex);
+
+ if (!g_glRaytracingScene.initialized)
+ return;
+
+ for (int i = 0; i < GL_RAYTRACING_MAX_RENDER_WORLDS; ++i)
+ glRaytracingSetAllInstancesVisibleUnlocked(&g_glRaytracingScene.worlds[i], 0);
+}
+
+void glRaytracingShowAllInstances(void)
+{
+ std::lock_guard lock(g_glRaytracingMutex);
+
+ if (!g_glRaytracingScene.initialized)
+ return;
+
+ for (int i = 0; i < GL_RAYTRACING_MAX_RENDER_WORLDS; ++i)
+ glRaytracingSetAllInstancesVisibleUnlocked(&g_glRaytracingScene.worlds[i], 1);
+}
diff --git a/neo/engine/opengl/opengl.h b/neo/engine/opengl/opengl.h
index 91b9e973..4f6449e5 100644
--- a/neo/engine/opengl/opengl.h
+++ b/neo/engine/opengl/opengl.h
@@ -2392,6 +2392,9 @@ void glRaytracingLightingSetVolumetricScattering(glRaytracingLight_t* light, flo
#ifndef GL_GLOW_MAP_BINDING_QD3D12
#define GL_GLOW_MAP_BINDING_QD3D12 0x6005
#endif
+#ifndef GL_QD3D12_TERRAIN_BLEND
+#define GL_QD3D12_TERRAIN_BLEND 0x600F
+#endif
// Glow-map material tagging / binding. Tagging is optional but lets the shim
// auto-discover a glow map from bound texture units. Explicit binding wins.
@@ -2401,6 +2404,15 @@ void APIENTRY glBindGlowMapTexture(GLuint texture); // 0 disabl
void APIENTRY glGlowMapTexture(GLuint texture); // alias
void APIENTRY glGlowMapStrengthf(GLfloat strength); // default 1.0; >1 allows overbright emission
+// Single-pass terrain splat preview/runtime path. The shader samples up to four
+// layer textures and blends them with RGBA vertex colors as normalized weights.
+void APIENTRY glTerrainBlendEnableQD3D12(GLboolean enable);
+void APIENTRY glEnableTerrainBlendQD3D12(GLboolean enable);
+void APIENTRY glTerrainLayerTextureQD3D12(GLuint layer, GLuint texture);
+void APIENTRY glTerrainLayerNormalTextureQD3D12(GLuint layer, GLuint texture);
+void APIENTRY glTerrainWeightTextureQD3D12(GLuint texture);
+void APIENTRY glTerrainBlendOpacityQD3D12(GLfloat opacity);
+
int APIENTRY glSetTopLevelAccelStructureVisible(
glRaytracingSceneHandle_t scene,
uint32_t topLevelHandle,
diff --git a/neo/engine/opengl/thirdparty/MaskedOcclusionCulling/CullingThreadpool.cpp b/neo/engine/opengl/thirdparty/MaskedOcclusionCulling/CullingThreadpool.cpp
new file mode 100644
index 00000000..2a584473
--- /dev/null
+++ b/neo/engine/opengl/thirdparty/MaskedOcclusionCulling/CullingThreadpool.cpp
@@ -0,0 +1,472 @@
+////////////////////////////////////////////////////////////////////////////////
+// Copyright 2017 Intel Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not
+// use this file except in compliance with the License. You may obtain a copy
+// of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations
+// under the License.
+////////////////////////////////////////////////////////////////////////////////
+#include
+#include "CullingThreadpool.h"
+
+#define SAFE_DELETE(X) {if (X != nullptr) delete X; X = nullptr;}
+#define SAFE_DELETE_ARRAY(X) {if (X != nullptr) delete[] X; X = nullptr;}
+
+template CullingThreadpool::StateData::StateData(unsigned int maxJobs) :
+ mMaxJobs(maxJobs),
+ mCurrentIdx(~0)
+{
+ mData = new T[mMaxJobs];
+}
+
+template CullingThreadpool::StateData::~StateData()
+{
+ SAFE_DELETE_ARRAY(mData);
+}
+
+template void CullingThreadpool::StateData::AddData(const T &data)
+{
+ mCurrentIdx++; mData[mCurrentIdx % mMaxJobs] = data;
+}
+
+template const T *CullingThreadpool::StateData::GetData() const
+{
+ return &mData[mCurrentIdx % mMaxJobs];
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+// Helper class: Mostly lockless queue for render jobs
+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+CullingThreadpool::RenderJobQueue::RenderJobQueue(unsigned int nBins, unsigned int maxJobs) :
+ mNumBins(nBins),
+ mMaxJobs(maxJobs)
+{
+ mRenderPtrs = new std::atomic_uint[mNumBins];
+ mBinMutexes = new std::atomic_uint[mNumBins];
+ for (unsigned int i = 0; i < mNumBins; ++i)
+ mBinMutexes[i] = 0;
+
+ mJobs = new Job[mMaxJobs];
+ for (unsigned int i = 0; i < mMaxJobs; ++i)
+ mJobs[i].mRenderJobs = new TriList[mNumBins];
+
+ // Compute worst case job size (we allocate memory for the worst case)
+ const unsigned int TriSize = 3 * 3;
+ const unsigned int MaxTrisPerJob = TRIS_PER_JOB * 6;
+ const unsigned int MaxJobSize = MaxTrisPerJob * TriSize;
+ mTrilistData = new float[MaxJobSize * mMaxJobs * mNumBins];
+
+ // Setup trilist objects used for binning
+ for (unsigned int i = 0; i < mMaxJobs; ++i)
+ {
+ for (unsigned int j = 0; j < mNumBins; ++j)
+ {
+ int idx = i*mNumBins + j;
+ TriList &tList = mJobs[i].mRenderJobs[j];
+ tList.mNumTriangles = MaxTrisPerJob;
+ tList.mTriIdx = 0;
+ tList.mPtr = mTrilistData + idx*MaxJobSize;
+ }
+ }
+
+ // Clear render queue
+ Reset();
+}
+
+CullingThreadpool::RenderJobQueue::~RenderJobQueue()
+{
+ SAFE_DELETE_ARRAY(mRenderPtrs);
+ SAFE_DELETE_ARRAY(mBinMutexes);
+ for (unsigned int i = 0; i < mMaxJobs; ++i)
+ SAFE_DELETE_ARRAY(mJobs[i].mRenderJobs);
+ SAFE_DELETE_ARRAY(mJobs);
+ SAFE_DELETE_ARRAY(mTrilistData);
+}
+
+inline unsigned int CullingThreadpool::RenderJobQueue::GetMinRenderPtr() const
+{
+ unsigned int minRenderPtr = mRenderPtrs[0];
+ for (unsigned int i = 1; i < mNumBins; ++i)
+ {
+ unsigned int renderPtr = mRenderPtrs[i];
+ minRenderPtr = renderPtr < minRenderPtr ? renderPtr : minRenderPtr;
+ }
+ return minRenderPtr;
+}
+
+inline void CullingThreadpool::RenderJobQueue::AdvanceRenderJob(int binIdx)
+{
+ mRenderPtrs[binIdx]++;
+ mBinMutexes[binIdx] = 0;
+}
+
+inline unsigned int CullingThreadpool::RenderJobQueue::GetBestGlobalQueue() const
+{
+ // Find least advanced queue
+ unsigned int bestBin = ~0, bestPtr = mWritePtr;
+ for (unsigned int i = 0; i < mNumBins; ++i)
+ {
+ if (mRenderPtrs[i] < bestPtr && mBinMutexes[i] == 0)
+ {
+ bestBin = i;
+ bestPtr = mRenderPtrs[i];
+ }
+ }
+ return bestBin;
+}
+
+inline bool CullingThreadpool::RenderJobQueue::IsPipelineEmpty() const
+{
+ return GetMinRenderPtr() == mWritePtr;
+}
+
+inline bool CullingThreadpool::RenderJobQueue::CanWrite() const
+{
+ return mWritePtr - GetMinRenderPtr() < mMaxJobs;
+}
+
+inline bool CullingThreadpool::RenderJobQueue::CanBin() const
+{
+ return mBinningPtr < mWritePtr && mBinningPtr - GetMinRenderPtr() < mMaxJobs;
+}
+
+inline CullingThreadpool::RenderJobQueue::Job *CullingThreadpool::RenderJobQueue::GetWriteJob()
+{
+ return &mJobs[mWritePtr % mMaxJobs];
+}
+
+inline void CullingThreadpool::RenderJobQueue::AdvanceWriteJob()
+{
+ mWritePtr++;
+}
+
+inline CullingThreadpool::RenderJobQueue::Job *CullingThreadpool::RenderJobQueue::GetBinningJob()
+{
+ unsigned int binningPtr = mBinningPtr;
+ if (binningPtr < mWritePtr && binningPtr - GetMinRenderPtr() < mMaxJobs)
+ {
+ if (mBinningPtr.compare_exchange_strong(binningPtr, binningPtr + 1))
+ {
+ mJobs[binningPtr % mMaxJobs].mBinningJobStartedIdx = binningPtr;
+ return &mJobs[binningPtr % mMaxJobs];
+ }
+ }
+ return nullptr;
+}
+
+inline void CullingThreadpool::RenderJobQueue::FinishedBinningJob(Job *job)
+{
+ job->mBinningJobCompletedIdx = job->mBinningJobStartedIdx;
+}
+
+inline CullingThreadpool::RenderJobQueue::Job *CullingThreadpool::RenderJobQueue::GetRenderJob(int binIdx)
+{
+ // Attempt to lock bin mutex
+ unsigned int expected = 0;
+ if (!mBinMutexes[binIdx].compare_exchange_strong(expected, 1))
+ return nullptr;
+
+ // Check any items in the queue, and bail if empty
+ if (mRenderPtrs[binIdx] != mJobs[mRenderPtrs[binIdx] % mMaxJobs].mBinningJobCompletedIdx)
+ {
+ mBinMutexes[binIdx] = 0;
+ return nullptr;
+ }
+
+ return &mJobs[mRenderPtrs[binIdx] % mMaxJobs];
+}
+
+void CullingThreadpool::RenderJobQueue::Reset()
+{
+ mWritePtr = 0;
+ mBinningPtr = 0;
+
+ for (unsigned int i = 0; i < mNumBins; ++i)
+ mRenderPtrs[i] = 0;
+
+ for (unsigned int i = 0; i < mMaxJobs; ++i)
+ {
+ mJobs[i].mBinningJobCompletedIdx = -1;
+ mJobs[i].mBinningJobStartedIdx = -1;
+ }
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+// Culling threadpool private helper functions
+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+void CullingThreadpool::SetupScissors()
+{
+ unsigned int width, height;
+ mMOC->GetResolution(width, height);
+
+ unsigned int binWidth;
+ unsigned int binHeight;
+ mMOC->ComputeBinWidthHeight(mBinsW, mBinsH, binWidth, binHeight);
+
+ for (unsigned int ty = 0; ty < mBinsH; ++ty)
+ {
+ for (unsigned int tx = 0; tx < mBinsW; ++tx)
+ {
+ unsigned int threadIdx = tx + ty*mBinsW;
+
+ // Adjust rects on final row / col to match resolution
+ mRects[threadIdx].mMinX = tx*binWidth;
+ mRects[threadIdx].mMaxX = tx + 1 == mBinsW ? width : (tx + 1) * binWidth;
+ mRects[threadIdx].mMinY = ty * binHeight;
+ mRects[threadIdx].mMaxY = ty + 1 == mBinsH ? height : (ty + 1) * binHeight;
+ }
+ }
+}
+
+void CullingThreadpool::ThreadRun(CullingThreadpool *threadPool, unsigned int threadId)
+{
+ threadPool->ThreadMain(threadId);
+}
+
+void CullingThreadpool::ThreadMain(unsigned int threadIdx)
+{
+ while (true)
+ {
+ bool threadIsIdle = true;
+ unsigned int threadBinIdx = threadIdx;
+
+ // Wait for threads to be woken up (low CPU load sleep)
+ std::unique_lock lock(mSuspendedMutex);
+ mNumSuspendedThreads++;
+ mSuspendedCV.wait(lock, [&] {return !mSuspendThreads; });
+ mNumSuspendedThreads--;
+ lock.unlock();
+
+ // Loop until suspended again
+ while (!mSuspendThreads || !threadIsIdle)
+ {
+ if (mKillThreads)
+ return;
+
+ threadIsIdle = false;
+
+ // Prio 1: Process any render jobs local to this thread
+ unsigned int binIdx = threadBinIdx;
+ threadBinIdx = threadBinIdx + mNumThreads < mNumBins ? threadBinIdx + mNumThreads : threadIdx;
+ RenderJobQueue::Job *job = mRenderQueue->GetRenderJob(binIdx);
+ if (job != nullptr)
+ {
+ if (job->mRenderJobs[binIdx].mTriIdx > 0)
+ mMOC->RenderTrilist(job->mRenderJobs[binIdx], &mRects[binIdx]);
+
+ mRenderQueue->AdvanceRenderJob(binIdx);
+ continue;
+ }
+
+ // Prio 2: Process any outstanding setup/binning jobs
+ if (mRenderQueue->CanBin())
+ {
+ // If no more rasterization jobs, get next binning job
+ RenderJobQueue::Job *job = mRenderQueue->GetBinningJob();
+ if (job != nullptr)
+ {
+ RenderJobQueue::BinningJob &sjob = job->mBinningJob;
+ for (unsigned int i = 0; i < mNumBins; ++i)
+ job->mRenderJobs[i].mTriIdx = 0;
+ mMOC->BinTriangles(sjob.mVerts, sjob.mTris, sjob.nTris, job->mRenderJobs, mBinsW, mBinsH, sjob.mMatrix, sjob.mBfWinding, sjob.mClipPlanes, *sjob.mVtxLayout);
+ mRenderQueue->FinishedBinningJob(job);
+ }
+ continue;
+ }
+
+ // Prio 3: No work is available, work steal from another thread's queue
+ if (mNumBins > mNumThreads)
+ {
+ binIdx = mRenderQueue->GetBestGlobalQueue();
+ if (binIdx < mRenderQueue->mNumBins)
+ {
+ RenderJobQueue::Job *job = mRenderQueue->GetRenderJob(binIdx);
+ if (job != nullptr)
+ {
+ if (job->mRenderJobs[binIdx].mTriIdx > 0)
+ mMOC->RenderTrilist(job->mRenderJobs[binIdx], &mRects[binIdx]);
+
+ mRenderQueue->AdvanceRenderJob(binIdx);
+ }
+ continue;
+ }
+ }
+
+ // No work available: Yield this thread
+ std::this_thread::yield();
+ threadIsIdle = true;
+ }
+ }
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+// Culling threadpool public API, similar to the MaskedOcclusionCulling class
+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+CullingThreadpool::CullingThreadpool(unsigned int numThreads, unsigned int binsW, unsigned int binsH, unsigned int maxJobs) :
+ mNumThreads(numThreads),
+ mMaxJobs(maxJobs),
+ mBinsW(binsW),
+ mBinsH(binsH),
+ mKillThreads(false),
+ mSuspendThreads(true),
+ mNumSuspendedThreads(0),
+ mModelToClipMatrices(maxJobs),
+ mVertexLayouts(maxJobs),
+ mMOC(nullptr)
+{
+ mNumBins = mBinsW*mBinsH;
+ assert(mNumBins >= mNumThreads); // Having less bins than threads is a bad idea!
+
+ mRects = new ScissorRect[mNumBins];
+ mRenderQueue = new RenderJobQueue(mNumBins, mMaxJobs);
+
+ // Add default vertex layout and matrix
+ mVertexLayouts.AddData(VertexLayout(16, 4, 12));
+ mCurrentMatrix = nullptr;
+
+ mThreads = new std::thread[mNumThreads];
+ for (unsigned int i = 0; i < mNumThreads; ++i)
+ mThreads[i] = std::thread(ThreadRun, this, i);
+
+}
+
+CullingThreadpool::~CullingThreadpool()
+{
+ // Wait for threads to terminate
+ if (mThreads != nullptr || !mKillThreads)
+ {
+ WakeThreads();
+ mKillThreads = true;
+ for (unsigned int i = 0; i < mNumThreads; ++i)
+ mThreads[i].join();
+
+ }
+
+ // Free memory
+ SAFE_DELETE(mRenderQueue);
+ SAFE_DELETE_ARRAY(mRects);
+ SAFE_DELETE_ARRAY(mThreads);
+}
+
+void CullingThreadpool::WakeThreads()
+{
+ // Wait for all threads to be in suspended mode
+ while (mNumSuspendedThreads < mNumThreads)
+ std::this_thread::yield();
+
+ // Send wake up event
+ std::unique_lock lock(mSuspendedMutex);
+ mSuspendThreads = false;
+ lock.unlock();
+ mSuspendedCV.notify_all();
+}
+
+void CullingThreadpool::SuspendThreads()
+{
+ // Signal threads to go into suspended mode (after finishing all outstanding work)
+ mSuspendThreads = true;
+}
+
+void CullingThreadpool::Flush()
+{
+ // Wait for pipeline to be empty (i.e. all work is finished)
+ while (!mRenderQueue->IsPipelineEmpty())
+ std::this_thread::yield();
+
+ // Reset queue counters
+ mRenderQueue->Reset();
+}
+
+void CullingThreadpool::SetBuffer(MaskedOcclusionCulling *moc)
+{
+ Flush();
+ mMOC = moc;
+ SetupScissors();
+}
+
+void CullingThreadpool::SetResolution(unsigned int width, unsigned int height)
+{
+ Flush();
+ mMOC->SetResolution(width, height);
+ SetupScissors();
+}
+
+void CullingThreadpool::SetNearClipPlane(float nearDist)
+{
+ Flush();
+ mMOC->SetNearClipPlane(nearDist);
+}
+
+void CullingThreadpool::SetMatrix(const float *modelToClipMatrix)
+{
+ // Treat nullptr matrix as a special case, otherwise copy the contents of the pointer and add to state
+ if (modelToClipMatrix == nullptr)
+ mCurrentMatrix = nullptr;
+ else
+ {
+ mModelToClipMatrices.AddData(Matrix4x4(modelToClipMatrix));
+ mCurrentMatrix = mModelToClipMatrices.GetData()->mValues;
+ }
+}
+
+void CullingThreadpool::SetVertexLayout(const VertexLayout &vtxLayout)
+{
+ mVertexLayouts.AddData(vtxLayout);
+}
+
+void CullingThreadpool::ClearBuffer()
+{
+ Flush();
+ mMOC->ClearBuffer();
+}
+
+void CullingThreadpool::RenderTriangles(const float *inVtx, const unsigned int *inTris, int nTris, BackfaceWinding bfWinding, ClipPlanes clipPlaneMask)
+{
+#if MOC_RECORDER_ENABLE != 0
+ mMOC->RecordRenderTriangles( inVtx, inTris, nTris, mCurrentMatrix, clipPlaneMask, bfWinding, *mVertexLayouts.GetData( ) );
+#endif
+
+ for (int i = 0; i < nTris; i += TRIS_PER_JOB)
+ {
+ // Yield if work queue is full
+ while (!mRenderQueue->CanWrite())
+ std::this_thread::yield();
+
+ // Create new renderjob
+ RenderJobQueue::Job *job = mRenderQueue->GetWriteJob();
+ job->mBinningJob.mVerts = inVtx;
+ job->mBinningJob.mTris = inTris + i * 3;
+ job->mBinningJob.nTris = nTris - i < TRIS_PER_JOB ? nTris - i : TRIS_PER_JOB;
+ job->mBinningJob.mMatrix = mCurrentMatrix;
+ job->mBinningJob.mClipPlanes = clipPlaneMask;
+ job->mBinningJob.mBfWinding = bfWinding;
+ job->mBinningJob.mVtxLayout = mVertexLayouts.GetData();
+ mRenderQueue->AdvanceWriteJob();
+ }
+}
+
+CullingThreadpool::CullingResult CullingThreadpool::TestRect(float xmin, float ymin, float xmax, float ymax, float wmin)
+{
+ return mMOC->TestRect(xmin, ymin, xmax, ymax, wmin);
+}
+
+CullingThreadpool::CullingResult CullingThreadpool::TestTriangles(const float *inVtx, const unsigned int *inTris, int nTris, BackfaceWinding bfWinding, ClipPlanes clipPlaneMask)
+{
+ return mMOC->TestTriangles(inVtx, inTris, nTris, mCurrentMatrix, bfWinding, clipPlaneMask, *mVertexLayouts.GetData());
+}
+
+void CullingThreadpool::ComputePixelDepthBuffer(float *depthData, bool flipY)
+{
+ Flush();
+ mMOC->ComputePixelDepthBuffer(depthData, flipY);
+}
diff --git a/neo/engine/opengl/thirdparty/MaskedOcclusionCulling/CullingThreadpool.h b/neo/engine/opengl/thirdparty/MaskedOcclusionCulling/CullingThreadpool.h
new file mode 100644
index 00000000..887c82b7
--- /dev/null
+++ b/neo/engine/opengl/thirdparty/MaskedOcclusionCulling/CullingThreadpool.h
@@ -0,0 +1,309 @@
+////////////////////////////////////////////////////////////////////////////////
+// Copyright 2017 Intel Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not
+// use this file except in compliance with the License. You may obtain a copy
+// of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations
+// under the License.
+////////////////////////////////////////////////////////////////////////////////
+#pragma once
+
+ /*!
+ * \file CullingThreadpool.h
+ * \brief Worker threadpool example for threaded masked occlusion culling.
+ *
+ * This class implements a threadpool for occluder rendering. Calls to CullingThreadpool::RenderTriangle()
+ * will immediately return, after adding work items to a queue, and occluder rendering is performed
+ * by worker threads as quickly as possible. Occlusion queries are performed directly on the calling
+ * threadand can be performed either synchronosly, by calling Flush() before executing the query, or
+ * asynchronosly, by performing the query without waiting for the worker threads to finish.
+ *
+ * Note that this implementation should be considered an example rather than the best threading
+ * solution. You may want to integrate threading in your own task system, and it may also be beneficial
+ * to thread the traversal code. Refer to MaskedOcclusionCulling::BinTriangles() and
+ * MaskedOcclusionCulling::RenderTrilist() for functions that can be used to make your own
+ * threaded culling system.
+ */
+
+#include
+#include
+#include
+#include
+
+#include "MaskedOcclusionCulling.h"
+
+class CullingThreadpool
+{
+protected:
+ static const int TRIS_PER_JOB = 1024; // Maximum number of triangles per job (bigger drawcalls are split), affects memory requirements
+
+ typedef MaskedOcclusionCulling::CullingResult CullingResult;
+ typedef MaskedOcclusionCulling::ClipPlanes ClipPlanes;
+ typedef MaskedOcclusionCulling::BackfaceWinding BackfaceWinding;
+ typedef MaskedOcclusionCulling::ScissorRect ScissorRect;
+ typedef MaskedOcclusionCulling::VertexLayout VertexLayout;
+ typedef MaskedOcclusionCulling::TriList TriList;
+
+ // Small utility class for 4x4 matrices
+ struct Matrix4x4
+ {
+ float mValues[16];
+ Matrix4x4() {}
+ Matrix4x4(const float *matrix)
+ {
+ for (int i = 0; i < 16; ++i)
+ mValues[i] = matrix[i];
+ }
+ };
+
+ // Internal utility class for a (mostly) lockless queue for binning & rendering jobs
+ struct RenderJobQueue
+ {
+ struct BinningJob
+ {
+ const float* mVerts;
+ const unsigned int* mTris;
+ unsigned int nTris;
+
+ const float* mMatrix;
+ ClipPlanes mClipPlanes;
+ BackfaceWinding mBfWinding;
+ const VertexLayout* mVtxLayout;
+ };
+
+ struct Job
+ {
+ volatile unsigned int mBinningJobStartedIdx;
+ volatile unsigned int mBinningJobCompletedIdx;
+ BinningJob mBinningJob;
+ TriList *mRenderJobs;
+ };
+
+ unsigned int mNumBins;
+ unsigned int mMaxJobs;
+
+ volatile unsigned int mWritePtr;
+ std::atomic_uint mBinningPtr;
+ std::atomic_uint *mRenderPtrs;
+ std::atomic_uint *mBinMutexes;
+
+ float *mTrilistData;
+ Job *mJobs;
+
+ RenderJobQueue(unsigned int nBins, unsigned int maxJobs);
+ ~RenderJobQueue();
+
+ unsigned int GetMinRenderPtr() const;
+ unsigned int GetBestGlobalQueue() const;
+ bool IsPipelineEmpty() const;
+
+ bool CanWrite() const;
+ bool CanBin() const;
+
+ Job *GetWriteJob();
+ void AdvanceWriteJob();
+
+ Job *GetBinningJob();
+ void FinishedBinningJob(Job *job);
+
+ Job *GetRenderJob(int binIdx);
+ void AdvanceRenderJob(int binIdx);
+
+ void Reset();
+ };
+
+ // Internal utility class for state (matrix / vertex layout)
+ template struct StateData
+ {
+ unsigned int mMaxJobs;
+ unsigned int mCurrentIdx;
+ T *mData;
+
+ StateData(unsigned int maxJobs);
+ ~StateData();
+ void AddData(const T &data);
+ const T *GetData() const;
+ };
+
+ // Number of worker threads and bins
+ unsigned int mNumThreads;
+ unsigned int mNumBins;
+ unsigned int mMaxJobs;
+ unsigned int mBinsW;
+ unsigned int mBinsH;
+
+ // Threads and control variables
+ std::mutex mSuspendedMutex;
+ std::condition_variable mSuspendedCV;
+ volatile bool mKillThreads;
+ volatile bool mSuspendThreads;
+ volatile unsigned int mNumSuspendedThreads;
+ std::thread *mThreads;
+
+ // State variables and command queue
+ const float *mCurrentMatrix;
+ StateData mModelToClipMatrices;
+ StateData mVertexLayouts;
+ RenderJobQueue *mRenderQueue;
+
+ // Occlusion culling object and related scissor rectangles
+ ScissorRect *mRects;
+ MaskedOcclusionCulling *mMOC;
+
+ void SetupScissors();
+
+ static void ThreadRun(CullingThreadpool *threadPool, unsigned int threadId);
+ void ThreadMain(unsigned int threadIdx);
+
+public:
+ /*!
+ * \brief Creates a new threadpool for masked occlusion culling. This object has a
+ * similar API to the MaskedOcclusionCulling class, but performs occluder
+ * rendering asynchronously on worker threads (similar to how DX/GL works).
+ *
+ * \param numThreads Number of worker threads to perform occluder rendering. Best
+ * balance may be scene/machine dependent, but it's good practice to leave at
+ * least one full core (2 threads with hyperthreading) for the main thread.
+ * \param binsW The screen is divided into binsW x binsH rectangular bins for load
+ * balancing. The number of bins should be atleast equal to the number of
+ * worker threads.
+ * \param binsH See description for the binsW parameter.
+ * \param maxJobs Maximum number of jobs that may be in flight at any given time. If
+ * the caller thread generates jobs faster than the worker threads can finish
+ * them, then the job queue will fill up and the caller thread will stall once
+ * "maxJobs" items have been queued up. For culling systems interleaving occlusion
+ * queries and rendering, this value should be kept quite low to minimize false
+ * positives (see TestRect()). We've observed that 32 [default] items typically
+ * works well for our interleaved queries, while also allowing good load-balancing,
+ * and this is the recommended setting.
+ */
+ CullingThreadpool(unsigned int numThreads, unsigned int binsW, unsigned int binsH, unsigned int maxJobs = 32);
+
+ /*!
+ * \brief Destroys the threadpool and terminates all worker threads.
+ */
+ ~CullingThreadpool();
+
+ /*!
+ * \brief Wakes up culling worker threads from suspended sleep, and puts them in a
+ * ready state (using an idle spinlock with significantly higher CPU overhead).
+ *
+ * It may take on the order of 100us to wake up the threads, so this function should
+ * preferably be called slightly ahead of starting occlusion culling work.
+ */
+ void WakeThreads();
+
+ /*!
+ * \brief Suspend all culling worker threads to a low CPU overhead sleep state.
+ *
+ * For performance and latency reasons, the culling work is performed in an active
+ * processing loop (with no thread sleeping) with high CPU overhead. In a system
+ * with more worker threads it's important to put the culling worker threads in a
+ * low overhead sleep state after occlusion culling work has completed.
+ */
+ void SuspendThreads();
+
+ /*!
+ * \brief Waits for all outstanding occluder rendering work to complete. Can be used
+ * to ensure that rendering has completed before performing a TestRect() or
+ * TestTriangles() call.
+ */
+ void Flush();
+
+ /*
+ * \brief Sets the MaskedOcclusionCulling object (buffer) to be used for rendering and
+ * testing calls. This method causes a Flush() to ensure that all unfinished
+ * rendering is completed.
+ */
+ void SetBuffer(MaskedOcclusionCulling *moc);
+
+ /*
+ * \brief Changes the resolution of the occlusion buffer, see MaskedOcclusionCulling::SetResolution().
+ * This method causes a Flush() to ensure that all unfinished rendering is completed.
+ */
+ void SetResolution(unsigned int width, unsigned int height);
+
+ /*
+ * \brief Sets the near clipping plane, see MaskedOcclusionCulling::SetNearClipPlane(). This
+ * method causes a Flush() to ensure that all unfinished rendering is completed.
+ */
+ void SetNearClipPlane(float nearDist);
+
+ /*
+ * \brief Sets the model to clipspace transform matrix used for the RenderTriangles() and TestTriangles()
+ * function calls. The contents of the matrix is copied, and it's safe to modify it without calling
+ * Flush(). The copy may be costly, which is the reason for passing this parameter as "state".
+ *
+ * \param modelToClipMatrix All vertices will be transformed by the specified model to clipspace matrix.
+ * Passing nullptr [default] disables the transform (equivalent to using an identity matrix).
+ */
+ void SetMatrix(const float *modelToClipMatrix = nullptr);
+
+ /*
+ * \brief Sets the vertex layout used for the RenderTriangles() and TestTriangles() function calls.
+ * The vertex layout is copied, and it's safe to modify it without calling Flush(). The copy
+ * may be costly, which is the reason for passing this parameter as "state".
+ *
+ * \param vtxLayout A struct specifying the vertex layout (see struct for detailed
+ * description). For best performance, it is advicable to store position data
+ * as compactly in memory as possible.
+ */
+ void SetVertexLayout(const VertexLayout &vtxLayout = VertexLayout(16, 4, 12));
+
+ /*
+ * \brief Clears the occlusion buffer, see MaskedOcclusionCulling::ClearBuffer(). This method
+ * causes a Flush() to ensure that all unfinished rendering is completed.
+ */
+ void ClearBuffer();
+
+ /*
+ * \brief Asynchronously render occluder triangles, see MaskedOcclusionCulling::RenderTriangles().
+ *
+ * This method puts the drawcall into a command queue, and immediately returns. The rendering is
+ * performed by the worker threads at the earliest opportunity.
+ *
+ * Important: As rendering is performed asynchronously, the application is not allowed to
+ * change the contents of the *inVtx or *inTris buffers until after rendering is completed. If
+ * you wish to use dynamic buffers, the application must perform a Flush() to ensure that rendering
+ * is finished, or make sure to rotate between more buffers than the maximum number of outstanding
+ * render jobs (see the CullingThreadpool() constructor).
+ */
+ void RenderTriangles(const float *inVtx, const unsigned int *inTris, int nTris, BackfaceWinding bfWinding = MaskedOcclusionCulling::BACKFACE_CW, ClipPlanes clipPlaneMask = MaskedOcclusionCulling::CLIP_PLANE_ALL);
+
+ /*
+ * \brief Occlusion query for a rectangle with a given depth, see MaskedOcclusionCulling::TestRect().
+ *
+ * Important: This method is performed on the main thread and does not wait for outstanding
+ * occluder rendering to be finished. To ensure that all occluder rendering is completed you must
+ * perform a Flush() prior to calling this function.
+ *
+ * It is conservatively correct to perform occlusion queries without calling Flush() (it may only
+ * lead to objects being incorrectly classified as visible), and it can lead to much better performance
+ * if occlusion queries are used for traversing a BVH or similar data structure. It's possible to
+ * use "asynchronous" queries during traversal, and removing false positives later, when rendering
+ * has completed.
+ */
+ CullingResult TestRect(float xmin, float ymin, float xmax, float ymax, float wmin);
+
+ /*
+ * \brief Occlusion query for a mesh, see MaskedOcclusionCulling::TestTriangles().
+ *
+ * Important: See the TestRect() method for a brief discussion about asynchronous occlusion
+ * queries.
+ */
+ CullingResult TestTriangles(const float *inVtx, const unsigned int *inTris, int nTris, BackfaceWinding bfWinding = MaskedOcclusionCulling::BACKFACE_CW, ClipPlanes clipPlaneMask = MaskedOcclusionCulling::CLIP_PLANE_ALL);
+
+ /*!
+ * \brief Creates a per-pixel depth buffer from the hierarchical z buffer representation, see
+ * MaskedOcclusionCulling::ComputePixelDepthBuffer(). This method causes a Flush() to
+ * ensure that all unfinished rendering is completed.
+ */
+ void ComputePixelDepthBuffer(float *depthData, bool flipY);
+};
diff --git a/neo/engine/opengl/thirdparty/MaskedOcclusionCulling/D3DValidate/D3DValidate.cpp b/neo/engine/opengl/thirdparty/MaskedOcclusionCulling/D3DValidate/D3DValidate.cpp
new file mode 100644
index 00000000..e6d881a5
--- /dev/null
+++ b/neo/engine/opengl/thirdparty/MaskedOcclusionCulling/D3DValidate/D3DValidate.cpp
@@ -0,0 +1,471 @@
+////////////////////////////////////////////////////////////////////////////////
+// Copyright 2017 Intel Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not
+// use this file except in compliance with the License. You may obtain a copy
+// of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations
+// under the License.
+////////////////////////////////////////////////////////////////////////////////
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include "../MaskedOcclusionCulling.h"
+#include "../CullingThreadpool.h"
+
+std::mt19937 gRnd;
+std::uniform_real_distribution gRndUniform(0, 1);
+
+////////////////////////////////////////////////////////////////////////////////////////
+// DX 11 functions
+////////////////////////////////////////////////////////////////////////////////////////
+
+#define NOMINMAX
+#include
+#include
+#include
+
+#pragma comment (lib, "d3d11.lib")
+#pragma comment (lib, "d3dcompiler.lib")
+
+ID3D11Texture2D *textureZ;
+ID3D11Texture2D *textureCol, *staging;
+ID3D11DepthStencilView *textureDSV;
+ID3D11RenderTargetView *textureRTV;
+ID3D11Device *device;
+ID3D11DeviceContext *context;
+
+ID3D11RasterizerState *rastState;
+ID3D11DepthStencilState *DSState;
+ID3D11InputLayout *layout;
+ID3D11VertexShader *VS;
+ID3D11PixelShader *PS;
+std::vector vBuffers;
+ID3D11Query *endQuery;
+
+#define D3DVERIFY(X) if (X != S_OK) exit(1);
+
+void InitD3D(unsigned int width, unsigned int height, D3D_DRIVER_TYPE DriverType = D3D_DRIVER_TYPE_HARDWARE)
+{
+ const char *shader =
+ "float4 VShader(float4 position : POSITION) : SV_POSITION { return position; }"
+ "float4 PShader(float4 position : SV_POSITION) : SV_TARGET { return 1.0f - position.z; }";
+
+ D3D_FEATURE_LEVEL fLevel;
+ D3DVERIFY(D3D11CreateDevice(nullptr, DriverType, nullptr, 0, nullptr, 0, D3D11_SDK_VERSION, &device, &fLevel, &context));
+
+ D3D11_TEXTURE2D_DESC tDesc;
+ tDesc.Width = width;
+ tDesc.Height = height;
+ tDesc.MipLevels = tDesc.ArraySize = 1;
+ tDesc.SampleDesc.Count = 1;
+ tDesc.SampleDesc.Quality = 0;
+ tDesc.CPUAccessFlags = 0;
+ tDesc.MiscFlags = 0;
+ tDesc.Usage = D3D11_USAGE_DEFAULT;
+
+ tDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
+ tDesc.BindFlags = D3D11_BIND_RENDER_TARGET;
+ D3DVERIFY(device->CreateTexture2D(&tDesc, nullptr, &textureCol));
+
+ tDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
+ tDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL;
+ D3DVERIFY(device->CreateTexture2D(&tDesc, nullptr, &textureZ));
+
+ tDesc.Usage = D3D11_USAGE_STAGING;
+ tDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
+ tDesc.BindFlags = 0;
+ tDesc.CPUAccessFlags = D3D11_CPU_ACCESS_READ;
+ D3DVERIFY(device->CreateTexture2D(&tDesc, nullptr, &staging));
+
+ D3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc;
+ dsvDesc.Flags = 0;
+ dsvDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
+ dsvDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;
+ dsvDesc.Texture2D.MipSlice = 0;
+ D3DVERIFY(device->CreateDepthStencilView(textureZ, &dsvDesc, &textureDSV));
+
+ D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
+ rtvDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
+ rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
+ rtvDesc.Texture2D.MipSlice = 0;
+ D3DVERIFY(device->CreateRenderTargetView(textureCol, &rtvDesc, &textureRTV));
+
+ // Set the viewport
+ D3D11_VIEWPORT viewport;
+ viewport.TopLeftX = 0;
+ viewport.TopLeftY = 0;
+ viewport.Width = (float)width;
+ viewport.Height = (float)height;
+ viewport.MinDepth = 0;
+ viewport.MaxDepth = 1;
+ context->RSSetViewports(1, &viewport);
+
+ // load and compile the two shaders
+ ID3D10Blob *VSBlob, *PSBlob;
+ D3DVERIFY(D3DCompile(shader, strlen(shader), "shader", nullptr, nullptr, "VShader", "vs_5_0", 0, 0, &VSBlob, nullptr));
+ D3DVERIFY(D3DCompile(shader, strlen(shader), "shader", nullptr, nullptr, "PShader", "ps_5_0", 0, 0, &PSBlob, nullptr));
+
+ // encapsulate both shaders into shader objects
+ D3DVERIFY(device->CreateVertexShader(VSBlob->GetBufferPointer(), VSBlob->GetBufferSize(), NULL, &VS));
+ D3DVERIFY(device->CreatePixelShader(PSBlob->GetBufferPointer(), PSBlob->GetBufferSize(), NULL, &PS));
+
+ // set the shader objects
+ context->VSSetShader(VS, 0, 0);
+ context->PSSetShader(PS, 0, 0);
+
+ // create the input layout object
+ D3D11_INPUT_ELEMENT_DESC ied[] =
+ {
+ { "POSITION", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
+ };
+
+ D3DVERIFY(device->CreateInputLayout(ied, 1, VSBlob->GetBufferPointer(), VSBlob->GetBufferSize(), &layout));
+ context->IASetInputLayout(layout);
+
+ D3D11_RASTERIZER_DESC rDesc;
+ rDesc.FillMode = D3D11_FILL_SOLID;
+ rDesc.CullMode = D3D11_CULL_NONE;
+ rDesc.FrontCounterClockwise = false;
+ rDesc.DepthBias = 0;
+ rDesc.DepthBiasClamp = 0;
+ rDesc.SlopeScaledDepthBias = 0;
+ rDesc.DepthClipEnable = false;
+ rDesc.ScissorEnable = false;
+ rDesc.MultisampleEnable = false;
+ rDesc.AntialiasedLineEnable = false;
+ device->CreateRasterizerState(&rDesc, &rastState);
+ context->RSSetState(rastState);
+
+ D3D11_DEPTH_STENCIL_DESC dsDesc;
+ ZeroMemory(&dsDesc, sizeof(D3D11_DEPTH_STENCIL_DESC));
+ dsDesc.DepthEnable = true;
+ dsDesc.StencilEnable = false;
+ dsDesc.DepthFunc = D3D11_COMPARISON_LESS_EQUAL;
+ dsDesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL;
+ device->CreateDepthStencilState(&dsDesc, &DSState);
+ context->OMSetDepthStencilState(DSState, 0);
+
+ D3D11_QUERY_DESC qDesc;
+ qDesc.Query = D3D11_QUERY_EVENT;
+ qDesc.MiscFlags = 0;
+ D3DVERIFY(device->CreateQuery(&qDesc, &endQuery));
+}
+
+bool D3DValidateTriangle(float *verts, MaskedOcclusionCulling *moc)
+{
+ unsigned int width, height;
+ moc->GetResolution(width, height);
+
+ ////////////////////////////////////////////////////////////////////////////////////////
+ // Draw triangle using our framework and read back depth buffer
+ ////////////////////////////////////////////////////////////////////////////////////////
+
+ // Draw triangle using our framework
+ unsigned int indices[3] = { 0,1,2 };
+ moc->ClearBuffer();
+ moc->RenderTriangles(verts, indices, 1);
+
+ // Read back result
+ float *depthBuffer = new float[width*height];
+ moc->ComputePixelDepthBuffer(depthBuffer, false);
+
+ ////////////////////////////////////////////////////////////////////////////////////////
+ // Draw triangle using DirectX 11 and read back color image
+ ////////////////////////////////////////////////////////////////////////////////////////
+
+ // Create D3D buffer
+ ID3D11Buffer *buf = nullptr;
+
+ D3D11_SUBRESOURCE_DATA iData;
+ iData.pSysMem = verts;
+ iData.SysMemPitch = 0;
+ iData.SysMemSlicePitch = 0;
+
+ D3D11_BUFFER_DESC bDesc;
+ bDesc.Usage = D3D11_USAGE_DEFAULT;
+ bDesc.ByteWidth = 3 * 4 * sizeof(float);
+ bDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
+ bDesc.CPUAccessFlags = bDesc.MiscFlags = bDesc.StructureByteStride = 0;
+ D3DVERIFY(device->CreateBuffer(&bDesc, &iData, &buf));
+
+ // Clear renderbuffers
+ float clearColor[4] = { 0.0f, 0.0f, 0.0f, 1.0f };
+ context->OMSetRenderTargets(1, &textureRTV, textureDSV);
+ context->ClearRenderTargetView(textureRTV, clearColor);
+ context->ClearDepthStencilView(textureDSV, D3D11_CLEAR_DEPTH, 1.0f, 0);
+
+ // Draw triangle using D3D
+ UINT stride = sizeof(float) * 4, offset = 0;
+ context->IASetVertexBuffers(0, 1, &buf, &stride, &offset);
+ context->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
+ context->Draw(3, 0);
+
+ buf->Release();
+
+ // Read back resulting D3D image
+ unsigned char *d3dimg = new unsigned char[width * height * 4];
+ D3D11_MAPPED_SUBRESOURCE map;
+ context->CopyResource(staging, textureCol);
+ context->Map(staging, 0, D3D11_MAP_READ, 0, &map);
+ memcpy(d3dimg, map.pData, width*height * 4);
+ context->Unmap(staging, 0);
+
+ ////////////////////////////////////////////////////////////////////////////////////////
+ // Compare rasterized coverage
+ ////////////////////////////////////////////////////////////////////////////////////////
+
+ bool identical = true;
+ for (unsigned int y = 0; y < height; ++y)
+ {
+ for (unsigned int x = 0; x < width; ++x)
+ {
+ bool d3dcov = (d3dimg[(x + y*width) * 4] + d3dimg[(x + y*width) * 4 + 1] + d3dimg[(x + y*width) * 4 + 2]) != 0;
+ bool ourcov = depthBuffer[x + y*width] != -1.0f;
+
+ if (d3dcov != ourcov)
+ identical = false;
+ }
+ }
+
+ delete[] depthBuffer;
+ delete[] d3dimg;
+
+ return identical;
+}
+
+bool D3DValidateTriangleThreaded(float *verts, unsigned int width, unsigned int height, CullingThreadpool *ctp)
+{
+
+ ////////////////////////////////////////////////////////////////////////////////////////
+ // Draw triangle using our framework and read back depth buffer
+ ////////////////////////////////////////////////////////////////////////////////////////
+
+ // Draw triangle using our framework
+ unsigned int indices[3] = { 0,1,2 };
+ ctp->ClearBuffer();
+ ctp->RenderTriangles(verts, indices, 1);
+ ctp->Flush();
+
+
+ // Read back result
+ float *depthBuffer = new float[width*height];
+ ctp->ComputePixelDepthBuffer(depthBuffer, false);
+
+ ////////////////////////////////////////////////////////////////////////////////////////
+ // Draw triangle using DirectX 11 and read back color image
+ ////////////////////////////////////////////////////////////////////////////////////////
+
+ // Create D3D buffer
+ ID3D11Buffer *buf = nullptr;
+
+ D3D11_SUBRESOURCE_DATA iData;
+ iData.pSysMem = verts;
+ iData.SysMemPitch = 0;
+ iData.SysMemSlicePitch = 0;
+
+ D3D11_BUFFER_DESC bDesc;
+ bDesc.Usage = D3D11_USAGE_DEFAULT;
+ bDesc.ByteWidth = 3 * 4 * sizeof(float);
+ bDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
+ bDesc.CPUAccessFlags = bDesc.MiscFlags = bDesc.StructureByteStride = 0;
+ D3DVERIFY(device->CreateBuffer(&bDesc, &iData, &buf));
+
+ // Clear renderbuffers
+ float clearColor[4] = { 0.0f, 0.0f, 0.0f, 1.0f };
+ context->OMSetRenderTargets(1, &textureRTV, textureDSV);
+ context->ClearRenderTargetView(textureRTV, clearColor);
+ context->ClearDepthStencilView(textureDSV, D3D11_CLEAR_DEPTH, 1.0f, 0);
+
+ // Draw triangle using D3D
+ UINT stride = sizeof(float) * 4, offset = 0;
+ context->IASetVertexBuffers(0, 1, &buf, &stride, &offset);
+ context->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
+ context->Draw(3, 0);
+
+ buf->Release();
+
+ // Read back resulting D3D image
+ unsigned char *d3dimg = new unsigned char[width * height * 4];
+ D3D11_MAPPED_SUBRESOURCE map;
+ context->CopyResource(staging, textureCol);
+ context->Map(staging, 0, D3D11_MAP_READ, 0, &map);
+ memcpy(d3dimg, map.pData, width*height * 4);
+ context->Unmap(staging, 0);
+
+ ////////////////////////////////////////////////////////////////////////////////////////
+ // Compare rasterized coverage
+ ////////////////////////////////////////////////////////////////////////////////////////
+
+ bool identical = true;
+ for (unsigned int y = 0; y < height; ++y)
+ {
+ for (unsigned int x = 0; x < width; ++x)
+ {
+ bool d3dcov = (d3dimg[(x + y*width) * 4] + d3dimg[(x + y*width) * 4 + 1] + d3dimg[(x + y*width) * 4 + 2]) != 0;
+ bool ourcov = depthBuffer[x + y*width] != -1.0f;
+
+ if (d3dcov != ourcov)
+ identical = false;
+ }
+ }
+
+ delete[] depthBuffer;
+ delete[] d3dimg;
+
+ return identical;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////
+// Random triangle generator
+////////////////////////////////////////////////////////////////////////////////////////
+
+void RandomTriangle(float *verts)
+{
+ float xprod = -1;
+ while (xprod < 0.0f)
+ {
+ for (unsigned int i = 0; i < 3; ++i)
+ {
+ verts[i * 4 + 0] = gRndUniform(gRnd) * 2.0f - 1.0f;
+ verts[i * 4 + 1] = gRndUniform(gRnd) * 2.0f - 1.0f;
+ verts[i * 4 + 2] = 0.0f;
+ verts[i * 4 + 3] = 1.0f;
+ }
+
+ // Test if triangle is front facing (ccw winded)
+ float v0x = verts[4] - verts[0];
+ float v0y = verts[5] - verts[1];
+ float v1x = verts[8] - verts[0];
+ float v1y = verts[9] - verts[1];
+ xprod = (v0x * v1y) - (v0y * v1x);
+ }
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////
+// Simple Command Line parser
+////////////////////////////////////////////////////////////////////////////////////////
+
+char* getCmdOption(char ** begin, char ** end, const std::string & option)
+{
+ char ** itr = std::find(begin, end, option);
+ if (itr != end && ++itr != end)
+ {
+ return *itr;
+ }
+ return 0;
+}
+
+bool cmdOptionExists(char** begin, char** end, const std::string& option)
+{
+ return std::find(begin, end, option) != end;
+}
+////////////////////////////////////////////////////////////////////////////////////////
+// Main: Validate a large number of randomized triangles
+////////////////////////////////////////////////////////////////////////////////////////
+
+int main(int argc, char* argv[])
+{
+ const int width = 2048, height = 2048;
+
+ // Flush denorms to zero to avoid performance issues with small values
+ _mm_setcsr(_mm_getcsr() | 0x8040);
+
+ if (cmdOptionExists(argv, argv + argc, "-h"))
+ {
+ printf("-Help\n");
+ printf("ValidateTest [-a []\n");
+ exit(0);
+ }
+
+ char * pOptions = getCmdOption(argv, argv + argc, "-a");
+
+ // Initialize directx
+ if (pOptions)
+ {
+ if (!strncmp(pOptions, "WARP", strlen(pOptions)))
+ {
+ printf("Testing against WARP\n");
+ InitD3D(width, height, D3D_DRIVER_TYPE_WARP);
+ }
+
+ if (!strncmp(pOptions, "REF", strlen(pOptions)))
+ {
+ printf("Testing against REF\n");
+ InitD3D(width, height, D3D_DRIVER_TYPE_REFERENCE);
+ }
+
+ }
+ else
+ {
+ printf("Testing against Hardware\n");
+ InitD3D(width, height);
+ }
+
+
+ MaskedOcclusionCulling *moc = MaskedOcclusionCulling::Create();
+
+ ////////////////////////////////////////////////////////////////////////////////////////
+ // Setup and state related code
+ ////////////////////////////////////////////////////////////////////////////////////////
+
+
+ // Setup a rendertarget with near clip plane at w = 1.0
+ moc->SetResolution(width, height);
+ moc->SetNearClipPlane(1.0f);
+
+ float verts[3*4];
+ static const int nTriangles = 1000;
+ int nPassed = 0;
+ for (int i = 0; i < nTriangles; ++i)
+ {
+ RandomTriangle(verts);
+ bool pass = D3DValidateTriangle(verts, moc);
+ if (pass)
+ nPassed++;
+ else
+ printf("Testing triangle %d... FAILED\n", i);
+
+ if (i % 100 == 0)
+ printf("Testing triangle %d\n", i);
+ }
+ printf("%d / %d triangles passed\n", nPassed, nTriangles);
+
+ int numThreads = std::thread::hardware_concurrency() - 1;
+ printf("\n\nTesting Masked multi threaded code path (using binning), %d threads\n", numThreads);
+ printf("----\n");
+ CullingThreadpool ctp(numThreads, 2, numThreads);
+ ctp.SetBuffer(moc);
+ ctp.WakeThreads();
+
+ unsigned int mocwidth, mocheight;
+ moc->GetResolution(mocwidth, mocheight);
+ // Rest Pass rate
+ nPassed = 0;
+ for (int i = 0; i < nTriangles; ++i)
+ {
+ RandomTriangle(verts);
+ bool pass = D3DValidateTriangleThreaded(verts, mocwidth, mocheight, &ctp);
+ if (pass)
+ nPassed++;
+ else
+ printf("Testing triangle %d... FAILED\n", i);
+
+ if (i % 100 == 0)
+ printf("Testing triangle %d\n", i);
+ }
+ printf("%d / %d triangles passed\n", nPassed, nTriangles);
+ ctp.SuspendThreads();
+}
diff --git a/neo/engine/opengl/thirdparty/MaskedOcclusionCulling/D3DValidate/D3DValidate.vcxproj.filters b/neo/engine/opengl/thirdparty/MaskedOcclusionCulling/D3DValidate/D3DValidate.vcxproj.filters
new file mode 100644
index 00000000..a7f52b9e
--- /dev/null
+++ b/neo/engine/opengl/thirdparty/MaskedOcclusionCulling/D3DValidate/D3DValidate.vcxproj.filters
@@ -0,0 +1,39 @@
+
+
+
+
+
+ MaskedOcclusionCullingLibrary
+
+
+ MaskedOcclusionCullingLibrary
+
+
+ MaskedOcclusionCullingLibrary
+
+
+ MaskedOcclusionCullingLibrary
+
+
+
+
+ MaskedOcclusionCullingLibrary
+
+
+ MaskedOcclusionCullingLibrary
+
+
+
+
+ {d8c0b3c7-550e-44c2-ac12-708a4d072746}
+
+
+
+
+ MaskedOcclusionCullingLibrary
+
+
+ MaskedOcclusionCullingLibrary
+
+
+
\ No newline at end of file
diff --git a/neo/engine/opengl/thirdparty/MaskedOcclusionCulling/Example/Example.vcxproj.filters b/neo/engine/opengl/thirdparty/MaskedOcclusionCulling/Example/Example.vcxproj.filters
new file mode 100644
index 00000000..ca949429
--- /dev/null
+++ b/neo/engine/opengl/thirdparty/MaskedOcclusionCulling/Example/Example.vcxproj.filters
@@ -0,0 +1,39 @@
+
+
+
+
+
+ MaskedOcclusionCullingLibrary
+
+
+ MaskedOcclusionCullingLibrary
+
+
+ MaskedOcclusionCullingLibrary
+
+
+ MaskedOcclusionCullingLibrary
+
+
+
+
+ MaskedOcclusionCullingLibrary
+
+
+ MaskedOcclusionCullingLibrary
+
+
+
+
+ {e1b85872-c29a-4dd3-b9db-e4ff2dedded9}
+
+
+
+
+ MaskedOcclusionCullingLibrary
+
+
+ MaskedOcclusionCullingLibrary
+
+
+
\ No newline at end of file
diff --git a/neo/engine/opengl/thirdparty/MaskedOcclusionCulling/Example/ExampleMain.cpp b/neo/engine/opengl/thirdparty/MaskedOcclusionCulling/Example/ExampleMain.cpp
new file mode 100644
index 00000000..6c164512
--- /dev/null
+++ b/neo/engine/opengl/thirdparty/MaskedOcclusionCulling/Example/ExampleMain.cpp
@@ -0,0 +1,198 @@
+////////////////////////////////////////////////////////////////////////////////
+// Copyright 2017 Intel Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not
+// use this file except in compliance with the License. You may obtain a copy
+// of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations
+// under the License.
+////////////////////////////////////////////////////////////////////////////////
+#ifndef _CRT_SECURE_NO_WARNINGS
+ #define _CRT_SECURE_NO_WARNINGS
+#endif
+#include
+#include
+#include
+#include
+#ifdef _WIN32
+ #include
+#else
+ #include
+#endif
+
+#include "../MaskedOcclusionCulling.h"
+
+////////////////////////////////////////////////////////////////////////////////////////
+// Image utility functions, minimal BMP writer and depth buffer tone mapping
+////////////////////////////////////////////////////////////////////////////////////////
+
+static void WriteBMP(const char *filename, const unsigned char *data, int w, int h)
+{
+ short header[] = { 0x4D42, 0, 0, 0, 0, 26, 0, 12, 0, (short)w, (short)h, 1, 24 };
+ FILE *f = fopen(filename, "wb");
+ fwrite(header, 1, sizeof(header), f);
+#if USE_D3D == 1
+ // Flip image because Y axis of Direct3D points in the opposite direction of bmp. If the library
+ // is configured for OpenGL (USE_D3D 0) then the Y axes would match and this wouldn't be required.
+ for (int y = 0; y < h; ++y)
+ fwrite(&data[(h - y - 1) * w * 3], 1, w * 3, f);
+#else
+ fwrite(data, 1, w * h * 3, f);
+#endif
+ fclose(f);
+}
+
+static void TonemapDepth(float *depth, unsigned char *image, int w, int h)
+{
+ // Find min/max w coordinate (discard cleared pixels)
+ float minW = FLT_MAX, maxW = 0.0f;
+ for (int i = 0; i < w*h; ++i)
+ {
+ if (depth[i] > 0.0f)
+ {
+ minW = std::min(minW, depth[i]);
+ maxW = std::max(maxW, depth[i]);
+ }
+ }
+
+ // Tonemap depth values
+ for (int i = 0; i < w*h; ++i)
+ {
+ int intensity = 0;
+ if (depth[i] > 0)
+ intensity = (unsigned char)(223.0*(depth[i] - minW) / (maxW - minW) + 32.0);
+
+ image[i * 3 + 0] = intensity;
+ image[i * 3 + 1] = intensity;
+ image[i * 3 + 2] = intensity;
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////////////
+// Tutorial example code
+////////////////////////////////////////////////////////////////////////////////////////
+
+int main(int argc, char* argv[])
+{
+ // Flush denorms to zero to avoid performance issues with small values
+ _mm_setcsr(_mm_getcsr() | 0x8040);
+
+ MaskedOcclusionCulling *moc = MaskedOcclusionCulling::Create();
+
+ ////////////////////////////////////////////////////////////////////////////////////////
+ // Print which version (instruction set) is being used
+ ////////////////////////////////////////////////////////////////////////////////////////
+
+ MaskedOcclusionCulling::Implementation implementation = moc->GetImplementation();
+ switch (implementation) {
+ case MaskedOcclusionCulling::SSE2: printf("Using SSE2 version\n"); break;
+ case MaskedOcclusionCulling::SSE41: printf("Using SSE41 version\n"); break;
+ case MaskedOcclusionCulling::AVX2: printf("Using AVX2 version\n"); break;
+ case MaskedOcclusionCulling::AVX512: printf("Using AVX-512 version\n"); break;
+ }
+
+ ////////////////////////////////////////////////////////////////////////////////////////
+ // Setup and state related code
+ ////////////////////////////////////////////////////////////////////////////////////////
+
+ // Setup a 1920 x 1080 rendertarget with near clip plane at w = 1.0
+ const int width = 1920, height = 1080;
+ moc->SetResolution(width, height);
+ moc->SetNearClipPlane(1.0f);
+
+ // Clear the depth buffer
+ moc->ClearBuffer();
+
+ ////////////////////////////////////////////////////////////////////////////////////////
+ // Render some occluders
+ ////////////////////////////////////////////////////////////////////////////////////////
+ struct ClipspaceVertex { float x, y, z, w; };
+
+ // A triangle that intersects the view frustum
+ ClipspaceVertex triVerts[] = { { 5, 0, 0, 10 }, { 30, 0, 0, 20 }, { 10, 50, 0, 40 } };
+ unsigned int triIndices[] = { 0, 1, 2 };
+
+ // Render the triangle
+ moc->RenderTriangles((float*)triVerts, triIndices, 1);
+
+ // A clockwise winded (backfacing) triangle
+ ClipspaceVertex cwTriVerts[] = { { 7, -7, 0, 20 },{ 7.5, -7, 0, 20 },{ 7, -7.5, 0, 20 } };
+ unsigned int cwTriIndices[] = { 0, 1, 2 };
+
+ // Render with counter-clockwise backface culling, the triangle is rendered
+ moc->RenderTriangles((float*)cwTriVerts, cwTriIndices, 1, nullptr, MaskedOcclusionCulling::BACKFACE_CCW);
+
+ // A quad completely within the view frustum
+ ClipspaceVertex quadVerts[] = { { -150, -150, 0, 200 }, { -10, -65, 0, 75 }, { 0, 0, 0, 20 }, { -40, 10, 0, 50 } };
+ unsigned int quadIndices[] = { 0, 1, 2, 0, 2, 3 };
+
+ // Render the quad. As an optimization, indicate that clipping is not required as it is
+ // completely inside the view frustum
+ moc->RenderTriangles((float*)quadVerts, quadIndices, 2, nullptr, MaskedOcclusionCulling::BACKFACE_CW, MaskedOcclusionCulling::CLIP_PLANE_NONE);
+
+ // A triangle specified on struct of arrays (SoA) form
+ float SoAVerts[] = {
+ 10, 10, 7, // x-coordinates
+ -10, -7, -10, // y-coordinates
+ 10, 10, 10 // w-coordinates
+ };
+
+ // Set vertex layout (stride, y offset, w offset)
+ MaskedOcclusionCulling::VertexLayout SoAVertexLayout(sizeof(float), 3 * sizeof(float), 6 * sizeof(float));
+
+ // Render triangle with SoA layout
+ moc->RenderTriangles((float*)SoAVerts, triIndices, 1, nullptr, MaskedOcclusionCulling::BACKFACE_CW, MaskedOcclusionCulling::CLIP_PLANE_ALL, SoAVertexLayout);
+
+
+ ////////////////////////////////////////////////////////////////////////////////////////
+ // Perform some occlusion queries
+ ////////////////////////////////////////////////////////////////////////////////////////
+
+ // A triangle, partly overlapped by the quad
+ ClipspaceVertex oqTriVerts[] = { { 0, 50, 0, 200 }, { -60, -60, 0, 200 }, { 20, -40, 0, 200 } };
+ unsigned int oqTriIndices[] = { 0, 1, 2 };
+
+ // Perform an occlusion query. The triangle is visible and the query should return VISIBLE
+ MaskedOcclusionCulling::CullingResult result;
+ result = moc->TestTriangles((float*)oqTriVerts, oqTriIndices, 1);
+ if (result == MaskedOcclusionCulling::VISIBLE)
+ printf("Tested triangle is VISIBLE\n");
+ else if (result == MaskedOcclusionCulling::OCCLUDED)
+ printf("Tested triangle is OCCLUDED\n");
+ else if (result == MaskedOcclusionCulling::VIEW_CULLED)
+ printf("Tested triangle is outside view frustum\n");
+
+ // Render the occlusion query triangle to show its position
+ moc->RenderTriangles((float*)oqTriVerts, oqTriIndices, 1);
+
+
+ // Perform an occlusion query testing if a rectangle is visible. The rectangle is completely
+ // behind the previously drawn quad, so the query should indicate that it's occluded
+ result = moc->TestRect(-0.6f, -0.6f, -0.4f, -0.4f, 100);
+ if (result == MaskedOcclusionCulling::VISIBLE)
+ printf("Tested rect is VISIBLE\n");
+ else if (result == MaskedOcclusionCulling::OCCLUDED)
+ printf("Tested rect is OCCLUDED\n");
+ else if (result == MaskedOcclusionCulling::VIEW_CULLED)
+ printf("Tested rect is outside view frustum\n");
+
+ // Compute a per pixel depth buffer from the hierarchical depth buffer, used for visualization.
+ float *perPixelZBuffer = new float[width * height];
+ moc->ComputePixelDepthBuffer(perPixelZBuffer, false);
+
+ // Tonemap the image
+ unsigned char *image = new unsigned char[width * height * 3];
+ TonemapDepth(perPixelZBuffer, image, width, height);
+ WriteBMP("image.bmp", image, width, height);
+ delete[] image;
+
+ // Destroy occlusion culling object and free hierarchical z-buffer
+ MaskedOcclusionCulling::Destroy(moc);
+
+}
diff --git a/neo/engine/opengl/thirdparty/MaskedOcclusionCulling/FillrateTest/FillrateTest.cpp b/neo/engine/opengl/thirdparty/MaskedOcclusionCulling/FillrateTest/FillrateTest.cpp
new file mode 100644
index 00000000..8f672c98
--- /dev/null
+++ b/neo/engine/opengl/thirdparty/MaskedOcclusionCulling/FillrateTest/FillrateTest.cpp
@@ -0,0 +1,433 @@
+////////////////////////////////////////////////////////////////////////////////
+// Copyright 2017 Intel Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not
+// use this file except in compliance with the License. You may obtain a copy
+// of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations
+// under the License.
+////////////////////////////////////////////////////////////////////////////////
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#ifdef _WIN32
+ #include
+#else
+ #include
+#endif
+
+#include "../CullingThreadpool.h"
+#include "../MaskedOcclusionCulling.h"
+
+std::mt19937 gRnd;
+std::uniform_real_distribution gRndUniform(0, 1);
+
+#define F_PI 3.14159265358979323846f
+
+// if 1, makes some of the random triangles slightly out of screen and enables clipping
+#define TEST_CLIPPING 0
+
+#ifdef _WIN32
+////////////////////////////////////////////////////////////////////////////////////////
+// DX 11 setup & resource creation code
+////////////////////////////////////////////////////////////////////////////////////////
+
+#define NOMINMAX
+#include
+#include
+#include
+
+#pragma comment (lib, "d3d11.lib")
+#pragma comment (lib, "d3dcompiler.lib")
+
+ID3D11Texture2D *textureZ;
+ID3D11Texture2D *textureCol, *staging;
+ID3D11DepthStencilView *textureDSV;
+ID3D11RenderTargetView *textureRTV;
+ID3D11Device *device;
+ID3D11DeviceContext *context;
+
+ID3D11RasterizerState *rastState;
+ID3D11DepthStencilState *DSState;
+ID3D11InputLayout *layout;
+ID3D11VertexShader *VS;
+ID3D11PixelShader *PS;
+std::vector vBuffers;
+ID3D11Query *endQuery;
+
+#define D3DVERIFY(X) if (X != S_OK) exit(1);
+
+void InitD3D(unsigned int width, unsigned int height)
+{
+ const char *shader =
+ "float4 VShader(float4 position : POSITION) : SV_POSITION { return position; }"
+ "float4 PShader(float4 position : SV_POSITION) : SV_TARGET { return 1.0f - position.z; }";
+
+ D3D_FEATURE_LEVEL fLevel;
+ D3DVERIFY(D3D11CreateDevice(nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr, 0, nullptr, 0, D3D11_SDK_VERSION, &device, &fLevel, &context));
+
+ D3D11_TEXTURE2D_DESC tDesc;
+ tDesc.Width = width;
+ tDesc.Height = height;
+ tDesc.MipLevels = tDesc.ArraySize = 1;
+ tDesc.SampleDesc.Count = 1;
+ tDesc.SampleDesc.Quality = 0;
+ tDesc.CPUAccessFlags = 0;
+ tDesc.MiscFlags = 0;
+ tDesc.Usage = D3D11_USAGE_DEFAULT;
+
+ tDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
+ tDesc.BindFlags = D3D11_BIND_RENDER_TARGET;
+ D3DVERIFY(device->CreateTexture2D(&tDesc, nullptr, &textureCol));
+
+ tDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
+ tDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL;
+ D3DVERIFY(device->CreateTexture2D(&tDesc, nullptr, &textureZ));
+
+ tDesc.Usage = D3D11_USAGE_STAGING;
+ tDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
+ tDesc.BindFlags = 0;
+ tDesc.CPUAccessFlags = D3D11_CPU_ACCESS_READ;
+ D3DVERIFY(device->CreateTexture2D(&tDesc, nullptr, &staging));
+
+ D3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc;
+ dsvDesc.Flags = 0;
+ dsvDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
+ dsvDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;
+ dsvDesc.Texture2D.MipSlice = 0;
+ D3DVERIFY(device->CreateDepthStencilView(textureZ, &dsvDesc, &textureDSV));
+
+ D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
+ rtvDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
+ rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
+ rtvDesc.Texture2D.MipSlice = 0;
+ D3DVERIFY(device->CreateRenderTargetView(textureCol, &rtvDesc, &textureRTV));
+
+ // Set the viewport
+ D3D11_VIEWPORT viewport;
+ viewport.TopLeftX = 0;
+ viewport.TopLeftY = 0;
+ viewport.Width = (float)width;
+ viewport.Height = (float)height;
+ viewport.MinDepth = 0;
+ viewport.MaxDepth = 1;
+ context->RSSetViewports(1, &viewport);
+
+ // load and compile the two shaders
+ ID3D10Blob *VSBlob, *PSBlob;
+ D3DVERIFY(D3DCompile(shader, strlen(shader), "shader", nullptr, nullptr, "VShader", "vs_5_0", 0, 0, &VSBlob, nullptr));
+ D3DVERIFY(D3DCompile(shader, strlen(shader), "shader", nullptr, nullptr, "PShader", "ps_5_0", 0, 0, &PSBlob, nullptr));
+
+ // encapsulate both shaders into shader objects
+ D3DVERIFY(device->CreateVertexShader(VSBlob->GetBufferPointer(), VSBlob->GetBufferSize(), NULL, &VS));
+ D3DVERIFY(device->CreatePixelShader(PSBlob->GetBufferPointer(), PSBlob->GetBufferSize(), NULL, &PS));
+
+ // set the shader objects
+ context->VSSetShader(VS, 0, 0);
+ context->PSSetShader(PS, 0, 0);
+
+ // create the input layout object
+ D3D11_INPUT_ELEMENT_DESC ied[] =
+ {
+ { "POSITION", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
+ };
+
+ D3DVERIFY(device->CreateInputLayout(ied, 1, VSBlob->GetBufferPointer(), VSBlob->GetBufferSize(), &layout));
+ context->IASetInputLayout(layout);
+
+ D3D11_RASTERIZER_DESC rDesc;
+ rDesc.FillMode = D3D11_FILL_SOLID;
+ rDesc.CullMode = D3D11_CULL_NONE;
+ rDesc.FrontCounterClockwise = false;
+ rDesc.DepthBias = 0;
+ rDesc.DepthBiasClamp = 0;
+ rDesc.SlopeScaledDepthBias = 0;
+ rDesc.DepthClipEnable = false;
+ rDesc.ScissorEnable = false;
+ rDesc.MultisampleEnable = false;
+ rDesc.AntialiasedLineEnable = false;
+ device->CreateRasterizerState(&rDesc, &rastState);
+ context->RSSetState(rastState);
+
+ D3D11_DEPTH_STENCIL_DESC dsDesc;
+ ZeroMemory(&dsDesc, sizeof(D3D11_DEPTH_STENCIL_DESC));
+ dsDesc.DepthEnable = true;
+ dsDesc.StencilEnable = false;
+ dsDesc.DepthFunc = D3D11_COMPARISON_LESS_EQUAL;
+ dsDesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL;
+ device->CreateDepthStencilState(&dsDesc, &DSState);
+ context->OMSetDepthStencilState(DSState, 0);
+
+ D3D11_QUERY_DESC qDesc;
+ qDesc.Query = D3D11_QUERY_EVENT;
+ qDesc.MiscFlags = 0;
+ D3DVERIFY(device->CreateQuery(&qDesc, &endQuery));
+}
+
+void D3DAddTriangles(float *verts, int nTris)
+{
+ ID3D11Buffer *buf = nullptr;
+
+ D3D11_SUBRESOURCE_DATA iData;
+ iData.pSysMem = verts;
+ iData.SysMemPitch = 0;
+ iData.SysMemSlicePitch = 0;
+
+ D3D11_BUFFER_DESC bDesc;
+ bDesc.Usage = D3D11_USAGE_DEFAULT;
+ bDesc.ByteWidth = nTris * 3 * 4 * sizeof(float);
+ bDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
+ bDesc.CPUAccessFlags = bDesc.MiscFlags = bDesc.StructureByteStride = 0;
+ D3DVERIFY(device->CreateBuffer(&bDesc, &iData, &buf));
+ vBuffers.push_back(buf);
+}
+
+double BenchmarkTrianglesD3D(ID3D11Buffer *buf, int numTriangles, bool color)
+{
+ // set the render target as the back buffer
+ if (color)
+ context->OMSetRenderTargets(1, &textureRTV, textureDSV);
+ else
+ context->OMSetRenderTargets(0, nullptr, textureDSV);
+
+ // clear the back buffer to a deep blue
+ float clearColor[4] = { 0.0f, 1.0f, 0.0f, 1.0f };
+ context->ClearRenderTargetView(textureRTV, clearColor);
+ context->ClearDepthStencilView(textureDSV, D3D11_CLEAR_DEPTH, 1.0f, 0);
+
+ // Setup primitivelist
+ UINT stride = sizeof(float) * 4, offset = 0;
+ context->IASetVertexBuffers(0, 1, &buf, &stride, &offset);
+ context->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
+ context->Flush();
+
+ // Draw triangles
+ auto before = std::chrono::high_resolution_clock::now();
+ context->Begin(endQuery);
+ context->Draw(numTriangles * 3, 0);
+ context->End(endQuery);
+ while (context->GetData(endQuery, nullptr, 0, 0) == S_FALSE) {}
+ auto after = std::chrono::high_resolution_clock::now();
+
+ return std::chrono::duration(after - before).count();
+}
+
+#endif
+
+////////////////////////////////////////////////////////////////////////////////////////
+// Simple random triangle rasterizer benchmark
+////////////////////////////////////////////////////////////////////////////////////////
+
+inline float frand() { return (float)rand() / (float)RAND_MAX; }
+
+void GenerateRandomTriangles(float *verts, unsigned int *triIdxBtF, int nTris, int size, float width, float height)
+{
+ // make some of the triangles slightly out of screen to test clipping paths
+#if TEST_CLIPPING
+ const float clippingMul = 1.1f;
+#else
+ const float clippingMul = 1.0f;
+#endif
+
+ for (int idx = 0; idx < nTris; ++idx)
+ {
+ triIdxBtF[idx * 3 + 0] = idx * 3 + 0;
+ triIdxBtF[idx * 3 + 1] = idx * 3 + 1;
+ triIdxBtF[idx * 3 + 2] = idx * 3 + 2;
+
+ while (true)
+ {
+ float vtx[3][3] = { { 0, 0, 1 },{ size * 2 / (float)width, 0, 1 },{ 0, size * 2 / (float)height, 1 } };
+ float offset[3] = { gRndUniform(gRnd)*2.0f - 1.0f, gRndUniform(gRnd)*2.0f - 1.0f, 0 };
+ float rotation = gRndUniform(gRnd) * 2 * F_PI;
+
+ float myz = (float)(nTris - idx);
+ bool triOk = true;
+ float rvtx[3][3];
+ for (int i = 0; i < 3; ++i)
+ {
+ rvtx[i][0] = cos(rotation)*vtx[i][0] - sin(rotation)*vtx[i][1] + offset[0];
+ rvtx[i][1] = sin(rotation)*vtx[i][0] + cos(rotation)*vtx[i][1] + offset[1];
+
+ if (rvtx[i][0] < -1.0f || rvtx[i][0] > 1.0f || rvtx[i][1] < -1.0f || rvtx[i][1] > 1.0f)
+ triOk = false;
+
+ float z = myz / (float)nTris;
+
+ int vtxIdx = idx * 3 + i;
+ verts[vtxIdx * 4 + 0] = rvtx[i][0] * myz * clippingMul;
+ verts[vtxIdx * 4 + 1] = rvtx[i][1] * myz * clippingMul;
+ verts[vtxIdx * 4 + 2] = z * myz;
+ verts[vtxIdx * 4 + 3] = myz;
+ }
+ if (triOk)
+ break;
+ }
+ }
+}
+
+double BenchmarkTriangles(float *verts, unsigned int *tris, int numTriangles, MaskedOcclusionCulling *moc)
+{
+ moc->ClearBuffer();
+
+ auto before = std::chrono::high_resolution_clock::now();
+#if TEST_CLIPPING
+ moc->RenderTriangles( verts, tris, numTriangles, nullptr, MaskedOcclusionCulling::BACKFACE_CW, MaskedOcclusionCulling::CLIP_PLANE_ALL );
+#else
+ moc->RenderTriangles(verts, tris, numTriangles, nullptr, MaskedOcclusionCulling::BACKFACE_CW, MaskedOcclusionCulling::CLIP_PLANE_NONE);
+#endif
+ auto after = std::chrono::high_resolution_clock::now();
+
+ return std::chrono::duration(after - before).count();
+}
+
+double BenchmarkTrianglesThreaded(float *verts, unsigned int *tris, int numTriangles, CullingThreadpool *ctp)
+{
+ ctp->ClearBuffer();
+
+ auto before = std::chrono::high_resolution_clock::now();
+#if TEST_CLIPPING
+ ctp->RenderTriangles(verts, tris, numTriangles, MaskedOcclusionCulling::BACKFACE_CW, MaskedOcclusionCulling::CLIP_PLANE_ALL);
+#else
+ ctp->RenderTriangles( verts, tris, numTriangles, MaskedOcclusionCulling::BACKFACE_CW, MaskedOcclusionCulling::CLIP_PLANE_NONE );
+#endif
+ ctp->Flush();
+ auto after = std::chrono::high_resolution_clock::now();
+
+ return std::chrono::duration]