chocobarlite: initial import.
This commit is contained in:
parent
5b14e38811
commit
dcf8f522c0
109 changed files with 16148 additions and 0 deletions
280
COPYING
Normal file
280
COPYING
Normal file
|
@ -0,0 +1,280 @@
|
||||||
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
Version 2, June 1991
|
||||||
|
|
||||||
|
Copyright © 1989, 1991 Free Software Foundation, Inc.
|
||||||
|
675 Mass Ave, Cambridge, MA 02139, USA
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
|
Preamble
|
||||||
|
|
||||||
|
The licenses for most software are designed to take away your
|
||||||
|
freedom to share and change it. By contrast, the GNU General Public
|
||||||
|
License is intended to guarantee your freedom to share and change free
|
||||||
|
software--to make sure the software is free for all its users. This
|
||||||
|
General Public License applies to most of the Free Software
|
||||||
|
Foundation's software and to any other program whose authors commit to
|
||||||
|
using it. (Some other Free Software Foundation software is covered by
|
||||||
|
the GNU Library General Public License instead.) You can apply it to
|
||||||
|
your programs, too.
|
||||||
|
|
||||||
|
When we speak of free software, we are referring to freedom, not
|
||||||
|
price. Our General Public Licenses are designed to make sure that you
|
||||||
|
have the freedom to distribute copies of free software (and charge for
|
||||||
|
this service if you wish), that you receive source code or can get it
|
||||||
|
if you want it, that you can change the software or use pieces of it
|
||||||
|
in new free programs; and that you know you can do these things.
|
||||||
|
|
||||||
|
To protect your rights, we need to make restrictions that forbid
|
||||||
|
anyone to deny you these rights or to ask you to surrender the rights.
|
||||||
|
These restrictions translate to certain responsibilities for you if you
|
||||||
|
distribute copies of the software, or if you modify it.
|
||||||
|
|
||||||
|
For example, if you distribute copies of such a program, whether
|
||||||
|
gratis or for a fee, you must give the recipients all the rights that
|
||||||
|
you have. You must make sure that they, too, receive or can get the
|
||||||
|
source code. And you must show them these terms so they know their
|
||||||
|
rights.
|
||||||
|
|
||||||
|
We protect your rights with two steps: (1) copyright the software, and
|
||||||
|
(2) offer you this license which gives you legal permission to copy,
|
||||||
|
distribute and/or modify the software.
|
||||||
|
|
||||||
|
Also, for each author's protection and ours, we want to make certain
|
||||||
|
that everyone understands that there is no warranty for this free
|
||||||
|
software. If the software is modified by someone else and passed on, we
|
||||||
|
want its recipients to know that what they have is not the original, so
|
||||||
|
that any problems introduced by others will not reflect on the original
|
||||||
|
authors' reputations.
|
||||||
|
|
||||||
|
Finally, any free program is threatened constantly by software
|
||||||
|
patents. We wish to avoid the danger that redistributors of a free
|
||||||
|
program will individually obtain patent licenses, in effect making the
|
||||||
|
program proprietary. To prevent this, we have made it clear that any
|
||||||
|
patent must be licensed for everyone's free use or not licensed at all.
|
||||||
|
|
||||||
|
The precise terms and conditions for copying, distribution and
|
||||||
|
modification follow.
|
||||||
|
|
||||||
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||||
|
|
||||||
|
0. This License applies to any program or other work which contains
|
||||||
|
a notice placed by the copyright holder saying it may be distributed
|
||||||
|
under the terms of this General Public License. The "Program", below,
|
||||||
|
refers to any such program or work, and a "work based on the Program"
|
||||||
|
means either the Program or any derivative work under copyright law:
|
||||||
|
that is to say, a work containing the Program or a portion of it,
|
||||||
|
either verbatim or with modifications and/or translated into another
|
||||||
|
language. (Hereinafter, translation is included without limitation in
|
||||||
|
the term "modification".) Each licensee is addressed as "you".
|
||||||
|
|
||||||
|
Activities other than copying, distribution and modification are not
|
||||||
|
covered by this License; they are outside its scope. The act of
|
||||||
|
running the Program is not restricted, and the output from the Program
|
||||||
|
is covered only if its contents constitute a work based on the
|
||||||
|
Program (independent of having been made by running the Program).
|
||||||
|
Whether that is true depends on what the Program does.
|
||||||
|
|
||||||
|
1. You may copy and distribute verbatim copies of the Program's
|
||||||
|
source code as you receive it, in any medium, provided that you
|
||||||
|
conspicuously and appropriately publish on each copy an appropriate
|
||||||
|
copyright notice and disclaimer of warranty; keep intact all the
|
||||||
|
notices that refer to this License and to the absence of any warranty;
|
||||||
|
and give any other recipients of the Program a copy of this License
|
||||||
|
along with the Program.
|
||||||
|
|
||||||
|
You may charge a fee for the physical act of transferring a copy, and
|
||||||
|
you may at your option offer warranty protection in exchange for a fee.
|
||||||
|
|
||||||
|
2. You may modify your copy or copies of the Program or any portion
|
||||||
|
of it, thus forming a work based on the Program, and copy and
|
||||||
|
distribute such modifications or work under the terms of Section 1
|
||||||
|
above, provided that you also meet all of these conditions:
|
||||||
|
|
||||||
|
a) You must cause the modified files to carry prominent notices
|
||||||
|
stating that you changed the files and the date of any change.
|
||||||
|
|
||||||
|
b) You must cause any work that you distribute or publish, that in
|
||||||
|
whole or in part contains or is derived from the Program or any
|
||||||
|
part thereof, to be licensed as a whole at no charge to all third
|
||||||
|
parties under the terms of this License.
|
||||||
|
|
||||||
|
c) If the modified program normally reads commands interactively
|
||||||
|
when run, you must cause it, when started running for such
|
||||||
|
interactive use in the most ordinary way, to print or display an
|
||||||
|
announcement including an appropriate copyright notice and a
|
||||||
|
notice that there is no warranty (or else, saying that you provide
|
||||||
|
a warranty) and that users may redistribute the program under
|
||||||
|
these conditions, and telling the user how to view a copy of this
|
||||||
|
License. (Exception: if the Program itself is interactive but
|
||||||
|
does not normally print such an announcement, your work based on
|
||||||
|
the Program is not required to print an announcement.)
|
||||||
|
|
||||||
|
These requirements apply to the modified work as a whole. If
|
||||||
|
identifiable sections of that work are not derived from the Program,
|
||||||
|
and can be reasonably considered independent and separate works in
|
||||||
|
themselves, then this License, and its terms, do not apply to those
|
||||||
|
sections when you distribute them as separate works. But when you
|
||||||
|
distribute the same sections as part of a whole which is a work based
|
||||||
|
on the Program, the distribution of the whole must be on the terms of
|
||||||
|
this License, whose permissions for other licensees extend to the
|
||||||
|
entire whole, and thus to each and every part regardless of who wrote it.
|
||||||
|
|
||||||
|
Thus, it is not the intent of this section to claim rights or contest
|
||||||
|
your rights to work written entirely by you; rather, the intent is to
|
||||||
|
exercise the right to control the distribution of derivative or
|
||||||
|
collective works based on the Program.
|
||||||
|
|
||||||
|
In addition, mere aggregation of another work not based on the Program
|
||||||
|
with the Program (or with a work based on the Program) on a volume of
|
||||||
|
a storage or distribution medium does not bring the other work under
|
||||||
|
the scope of this License.
|
||||||
|
|
||||||
|
3. You may copy and distribute the Program (or a work based on it,
|
||||||
|
under Section 2) in object code or executable form under the terms of
|
||||||
|
Sections 1 and 2 above provided that you also do one of the following:
|
||||||
|
|
||||||
|
a) Accompany it with the complete corresponding machine-readable
|
||||||
|
source code, which must be distributed under the terms of Sections
|
||||||
|
1 and 2 above on a medium customarily used for software interchange; or,
|
||||||
|
|
||||||
|
b) Accompany it with a written offer, valid for at least three
|
||||||
|
years, to give any third party, for a charge no more than your
|
||||||
|
cost of physically performing source distribution, a complete
|
||||||
|
machine-readable copy of the corresponding source code, to be
|
||||||
|
distributed under the terms of Sections 1 and 2 above on a medium
|
||||||
|
customarily used for software interchange; or,
|
||||||
|
|
||||||
|
c) Accompany it with the information you received as to the offer
|
||||||
|
to distribute corresponding source code. (This alternative is
|
||||||
|
allowed only for noncommercial distribution and only if you
|
||||||
|
received the program in object code or executable form with such
|
||||||
|
an offer, in accord with Subsection b above.)
|
||||||
|
|
||||||
|
The source code for a work means the preferred form of the work for
|
||||||
|
making modifications to it. For an executable work, complete source
|
||||||
|
code means all the source code for all modules it contains, plus any
|
||||||
|
associated interface definition files, plus the scripts used to
|
||||||
|
control compilation and installation of the executable. However, as a
|
||||||
|
special exception, the source code distributed need not include
|
||||||
|
anything that is normally distributed (in either source or binary
|
||||||
|
form) with the major components (compiler, kernel, and so on) of the
|
||||||
|
operating system on which the executable runs, unless that component
|
||||||
|
itself accompanies the executable.
|
||||||
|
|
||||||
|
If distribution of executable or object code is made by offering
|
||||||
|
access to copy from a designated place, then offering equivalent
|
||||||
|
access to copy the source code from the same place counts as
|
||||||
|
distribution of the source code, even though third parties are not
|
||||||
|
compelled to copy the source along with the object code.
|
||||||
|
|
||||||
|
4. You may not copy, modify, sublicense, or distribute the Program
|
||||||
|
except as expressly provided under this License. Any attempt
|
||||||
|
otherwise to copy, modify, sublicense or distribute the Program is
|
||||||
|
void, and will automatically terminate your rights under this License.
|
||||||
|
However, parties who have received copies, or rights, from you under
|
||||||
|
this License will not have their licenses terminated so long as such
|
||||||
|
parties remain in full compliance.
|
||||||
|
|
||||||
|
5. You are not required to accept this License, since you have not
|
||||||
|
signed it. However, nothing else grants you permission to modify or
|
||||||
|
distribute the Program or its derivative works. These actions are
|
||||||
|
prohibited by law if you do not accept this License. Therefore, by
|
||||||
|
modifying or distributing the Program (or any work based on the
|
||||||
|
Program), you indicate your acceptance of this License to do so, and
|
||||||
|
all its terms and conditions for copying, distributing or modifying
|
||||||
|
the Program or works based on it.
|
||||||
|
|
||||||
|
6. Each time you redistribute the Program (or any work based on the
|
||||||
|
Program), the recipient automatically receives a license from the
|
||||||
|
original licensor to copy, distribute or modify the Program subject to
|
||||||
|
these terms and conditions. You may not impose any further
|
||||||
|
restrictions on the recipients' exercise of the rights granted herein.
|
||||||
|
You are not responsible for enforcing compliance by third parties to
|
||||||
|
this License.
|
||||||
|
|
||||||
|
7. If, as a consequence of a court judgment or allegation of patent
|
||||||
|
infringement or for any other reason (not limited to patent issues),
|
||||||
|
conditions are imposed on you (whether by court order, agreement or
|
||||||
|
otherwise) that contradict the conditions of this License, they do not
|
||||||
|
excuse you from the conditions of this License. If you cannot
|
||||||
|
distribute so as to satisfy simultaneously your obligations under this
|
||||||
|
License and any other pertinent obligations, then as a consequence you
|
||||||
|
may not distribute the Program at all. For example, if a patent
|
||||||
|
license would not permit royalty-free redistribution of the Program by
|
||||||
|
all those who receive copies directly or indirectly through you, then
|
||||||
|
the only way you could satisfy both it and this License would be to
|
||||||
|
refrain entirely from distribution of the Program.
|
||||||
|
|
||||||
|
If any portion of this section is held invalid or unenforceable under
|
||||||
|
any particular circumstance, the balance of the section is intended to
|
||||||
|
apply and the section as a whole is intended to apply in other
|
||||||
|
circumstances.
|
||||||
|
|
||||||
|
It is not the purpose of this section to induce you to infringe any
|
||||||
|
patents or other property right claims or to contest validity of any
|
||||||
|
such claims; this section has the sole purpose of protecting the
|
||||||
|
integrity of the free software distribution system, which is
|
||||||
|
implemented by public license practices. Many people have made
|
||||||
|
generous contributions to the wide range of software distributed
|
||||||
|
through that system in reliance on consistent application of that
|
||||||
|
system; it is up to the author/donor to decide if he or she is willing
|
||||||
|
to distribute software through any other system and a licensee cannot
|
||||||
|
impose that choice.
|
||||||
|
|
||||||
|
This section is intended to make thoroughly clear what is believed to
|
||||||
|
be a consequence of the rest of this License.
|
||||||
|
|
||||||
|
8. If the distribution and/or use of the Program is restricted in
|
||||||
|
certain countries either by patents or by copyrighted interfaces, the
|
||||||
|
original copyright holder who places the Program under this License
|
||||||
|
may add an explicit geographical distribution limitation excluding
|
||||||
|
those countries, so that distribution is permitted only in or among
|
||||||
|
countries not thus excluded. In such case, this License incorporates
|
||||||
|
the limitation as if written in the body of this License.
|
||||||
|
|
||||||
|
9. The Free Software Foundation may publish revised and/or new versions
|
||||||
|
of the General Public License from time to time. Such new versions will
|
||||||
|
be similar in spirit to the present version, but may differ in detail to
|
||||||
|
address new problems or concerns.
|
||||||
|
|
||||||
|
Each version is given a distinguishing version number. If the Program
|
||||||
|
specifies a version number of this License which applies to it and "any
|
||||||
|
later version", you have the option of following the terms and conditions
|
||||||
|
either of that version or of any later version published by the Free
|
||||||
|
Software Foundation. If the Program does not specify a version number of
|
||||||
|
this License, you may choose any version ever published by the Free Software
|
||||||
|
Foundation.
|
||||||
|
|
||||||
|
10. If you wish to incorporate parts of the Program into other free
|
||||||
|
programs whose distribution conditions are different, write to the author
|
||||||
|
to ask for permission. For software which is copyrighted by the Free
|
||||||
|
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||||
|
make exceptions for this. Our decision will be guided by the two goals
|
||||||
|
of preserving the free status of all derivatives of our free software and
|
||||||
|
of promoting the sharing and reuse of software generally.
|
||||||
|
|
||||||
|
NO WARRANTY
|
||||||
|
|
||||||
|
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||||
|
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||||
|
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||||
|
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||||
|
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||||
|
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||||
|
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||||
|
REPAIR OR CORRECTION.
|
||||||
|
|
||||||
|
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||||
|
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||||
|
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||||
|
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||||
|
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||||
|
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||||
|
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||||
|
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||||
|
POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
7
INSTALL
Normal file
7
INSTALL
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
Dans le répertoire src/ taper :
|
||||||
|
|
||||||
|
make
|
||||||
|
export CLASSPATH=${CLASSPATH}:/usr/share/java/mysql.jar:.:../bin:../lib:../lib/JSAP_1.03a.jar:../lib/java-getopt-1.0.10.jar
|
||||||
|
|
||||||
|
Pour l'information sur le contenu, les tests, etc. referrez-vous au fichier
|
||||||
|
README.
|
61
Makefile
Normal file
61
Makefile
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
### Make file du projet CBL
|
||||||
|
### HEADER HERE
|
||||||
|
###
|
||||||
|
|
||||||
|
JAVAC=javac
|
||||||
|
JFLAGS=-d ../bin -classpath ../bin
|
||||||
|
PRJNAME=ChocoBarLite
|
||||||
|
GDATE:= $(shell date +"%Y-%m-%d_r%H%M")
|
||||||
|
GFILENAME:= $(PRJNAME)-$(GDATE).tar.bz2
|
||||||
|
PATH_GFILENAME:= ../$(GFILENAME)
|
||||||
|
GFILESIZE:=
|
||||||
|
LOCALDIR=$(shell pwd)
|
||||||
|
LASTONSERVER = $(shell ssh glenux.ath.cx -l warbrain "ls -rt ~/Projet/Archives/$(PRJNAME)* | tail -n 1")
|
||||||
|
#MAILS=warbrain@glenux.ath.cx
|
||||||
|
|
||||||
|
all: subdir
|
||||||
|
|
||||||
|
run:
|
||||||
|
( cd src/ ; \
|
||||||
|
$(MAKE) run )
|
||||||
|
|
||||||
|
subdir:
|
||||||
|
( cd src/ ; \
|
||||||
|
$(MAKE) )
|
||||||
|
|
||||||
|
doc:
|
||||||
|
( cd src/ ; \
|
||||||
|
$(MAKE) doc )
|
||||||
|
|
||||||
|
clean:
|
||||||
|
$(MAKE) clean -C src/
|
||||||
|
$(MAKE) clean -C doc/rapport/
|
||||||
|
@rm -f *.class *~
|
||||||
|
|
||||||
|
package: clean createpackage sendtoarchives
|
||||||
|
|
||||||
|
#mail: clean createpackage sendpackage sendtoarchives
|
||||||
|
|
||||||
|
createpackage:
|
||||||
|
@#mv lib ../lib$(GDATE)
|
||||||
|
tar -cjvf $(PATH_GFILENAME) -C ../ $(PRJNAME)
|
||||||
|
@##mv ../lib$(GDATE) lib
|
||||||
|
|
||||||
|
sendtoarchives:
|
||||||
|
mv $(PATH_GFILENAME) ../Archives
|
||||||
|
|
||||||
|
#sendpackage:
|
||||||
|
# (echo -e "\nCi joint le fichier:\n$(shell du -sh $(PATH_GFILENAME))" \
|
||||||
|
# && echo -e "\nPour décompresser:" \
|
||||||
|
# && echo -e "\n\ttar -xjvf $(GFILENAME)\n" \
|
||||||
|
# && echo -e "\n(n'oubliez pas de supprimer l'ancien répertoire du même nom avant de décompresser)" \
|
||||||
|
# && echo -e "\n\nHistorique des modifications :\n" \
|
||||||
|
# && cat CHANGELOG ) \
|
||||||
|
# | mutt $(MAILS) -a $(PATH_GFILENAME) -s "[$(PRJNAME)] $(GDATE)"
|
||||||
|
|
||||||
|
# Creer le fichier jar
|
||||||
|
jar: all
|
||||||
|
(cd bin && \
|
||||||
|
jar cvfm $(PRJNAME).jar manifest . && \
|
||||||
|
mv $(PRJNAME).jar ../ \
|
||||||
|
)
|
132
README
Normal file
132
README
Normal file
|
@ -0,0 +1,132 @@
|
||||||
|
|
||||||
|
TESTS
|
||||||
|
-----
|
||||||
|
ATTENTION: Les tests sont effectués en donnant des paramètres des tests sur la
|
||||||
|
ligne de commande, le répertoire tst/ comme demandé par l'énoncé
|
||||||
|
n'existe donc PAS. Cépendant, quelques fichiers .txt sont fournis
|
||||||
|
dans le répertoire io/ afin de pouvoir tester entrées/sorties du jeu.
|
||||||
|
|
||||||
|
Une fois que le projet est installé et compilé, dans le répertoire src/ taper
|
||||||
|
cette ligne pour tester :
|
||||||
|
|
||||||
|
java ChocoBarLite
|
||||||
|
|
||||||
|
et cette ligne pour afficher l'aide :
|
||||||
|
|
||||||
|
java ChocoBarLite -help
|
||||||
|
|
||||||
|
CONTENU PROJET
|
||||||
|
--------------
|
||||||
|
Les fichiers très utiles sont :
|
||||||
|
- INSTALL dans le répertoire racine du projet décrivant la procédure de
|
||||||
|
compilation et de configuration
|
||||||
|
- README dans le répertoire racine du projet décrivant ce projet en bref
|
||||||
|
- doc.txt contenant le pseudo langange des algorithmes demandés dans le
|
||||||
|
répertoire doc/rapport/
|
||||||
|
- Makefile dans le répertoire src/
|
||||||
|
- Fichiers .txt pour tester E/S dans le répertoire io/
|
||||||
|
- Les sources du projet dans le répertoire src/
|
||||||
|
- La documentation de la source dans le répertoire doc/doxydir/
|
||||||
|
|
||||||
|
L'arborescence complète des fichiers est figurée ci-dessous :
|
||||||
|
.
|
||||||
|
|-- COPYING
|
||||||
|
|-- INSTALL
|
||||||
|
|-- Makefile
|
||||||
|
|-- README
|
||||||
|
|-- doc
|
||||||
|
| |-- Doxyfile
|
||||||
|
| |-- Makefile
|
||||||
|
| |-- doxydir
|
||||||
|
| | `-- html
|
||||||
|
| | |-- ...
|
||||||
|
| | `-- (fichiers de documentation source)
|
||||||
|
| |-- enonce
|
||||||
|
| | `-- chocobar.ps.gz
|
||||||
|
| `-- rapport
|
||||||
|
| |-- Makefile
|
||||||
|
| `-- doc.txt
|
||||||
|
|-- io
|
||||||
|
| |-- ChocoBar5X5.txt
|
||||||
|
| |-- ChocoBar5X8.txt
|
||||||
|
| |-- ChocoBar8X5.txt
|
||||||
|
| |-- Random5X5.txt
|
||||||
|
| |-- Random5X8.txt
|
||||||
|
| |-- Random8X5.txt
|
||||||
|
| |-- Winning5X5.txt
|
||||||
|
| |-- Winning5X8.txt
|
||||||
|
| `-- Winning8X5.txt
|
||||||
|
|-- lib
|
||||||
|
| |-- JSAP_1.03a.jar
|
||||||
|
| `-- java-getopt-1.0.10.jar
|
||||||
|
| `-- java-getopt-1.0.10.jar
|
||||||
|
`-- src
|
||||||
|
|-- ChocoBarLite
|
||||||
|
|-- ChocoBarLite-bench
|
||||||
|
|-- ChocoBarLite-jmp
|
||||||
|
|-- ChocoBarLite-prof
|
||||||
|
|-- ChocoBarLite.java
|
||||||
|
|-- Makefile
|
||||||
|
|-- TODO
|
||||||
|
|-- chocobar
|
||||||
|
| |-- GenericChocoGraph.java
|
||||||
|
| |-- bpl
|
||||||
|
| | |-- BreakPointList.java
|
||||||
|
| | |-- CBLGlobal.java
|
||||||
|
| | |-- ChocoBar.java
|
||||||
|
| | |-- ChocoBarSet.java
|
||||||
|
| | |-- ChocoBarSetNode.java
|
||||||
|
| | |-- ChocoGraph.java
|
||||||
|
| | |-- EdgeListModel.java
|
||||||
|
| | |-- EdgeMatrixModel.java
|
||||||
|
| | |-- EdgeModel.java
|
||||||
|
| | |-- Graph.java
|
||||||
|
| | |-- IntPoint.java
|
||||||
|
| | |-- BreakPointList.java
|
||||||
|
| | |-- CBLGlobal.java
|
||||||
|
| | |-- ChocoBar.java
|
||||||
|
| | |-- ChocoBarSet.java
|
||||||
|
| | |-- ChocoBarSetNode.java
|
||||||
|
| | |-- ChocoGraph.java
|
||||||
|
| | |-- EdgeListModel.java
|
||||||
|
| | |-- EdgeMatrixModel.java
|
||||||
|
| | |-- EdgeModel.java
|
||||||
|
| | |-- Graph.java
|
||||||
|
| | |-- IntPoint.java
|
||||||
|
| | `-- VerticeSet.java
|
||||||
|
| `-- combi
|
||||||
|
| |-- BitSet.java
|
||||||
|
| |-- ChocoBar.java
|
||||||
|
| |-- ChocoBarArray.java
|
||||||
|
| |-- ChocoBarBigInt.java
|
||||||
|
| |-- ChocoBarLong.java
|
||||||
|
| |-- ChocoBarSet.java
|
||||||
|
| |-- ChocoGraph.java
|
||||||
|
| |-- EdgeBigIntModel.java
|
||||||
|
| |-- EdgeBitSetModel.java
|
||||||
|
| |-- EdgeListModel.java
|
||||||
|
| |-- EdgeMatrixModel.java
|
||||||
|
| |-- EdgeModel.java
|
||||||
|
| |-- Graph.java
|
||||||
|
| `-- VerticeSet.java
|
||||||
|
|-- conf
|
||||||
|
| `-- ChocoConfig.java
|
||||||
|
|-- exception
|
||||||
|
| |-- AlreadyBrokenPointException.java
|
||||||
|
| |-- OutOfRangeBreakPointException.java
|
||||||
|
| `-- OutOfRangeVerticeException.java
|
||||||
|
|-- exemple1.txt
|
||||||
|
|-- graph
|
||||||
|
| |-- EdgeModel.java
|
||||||
|
| |-- GenericGraph.java
|
||||||
|
| |-- Vertice.java
|
||||||
|
| `-- VerticeSet.java
|
||||||
|
|-- jeu
|
||||||
|
| |-- Simulation.java
|
||||||
|
| `-- Strategy.java
|
||||||
|
|-- tags
|
||||||
|
|-- testGraph.txt
|
||||||
|
|-- testStrategy.txt
|
||||||
|
`-- utils
|
||||||
|
`-- BitSet.java
|
||||||
|
|
1161
doc/Doxyfile
Normal file
1161
doc/Doxyfile
Normal file
File diff suppressed because it is too large
Load diff
11
doc/Makefile
Normal file
11
doc/Makefile
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
### Make file du projet CBL
|
||||||
|
### HEADER HERE
|
||||||
|
###
|
||||||
|
|
||||||
|
all: doxygen
|
||||||
|
|
||||||
|
doxygen:
|
||||||
|
doxygen
|
||||||
|
|
||||||
|
clean:
|
||||||
|
@rm -Rf doxydir
|
BIN
doc/enonce/chocobar.ps.gz
Normal file
BIN
doc/enonce/chocobar.ps.gz
Normal file
Binary file not shown.
5
doc/rapport/Makefile
Normal file
5
doc/rapport/Makefile
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
|
||||||
|
all:
|
||||||
|
|
||||||
|
clean:
|
||||||
|
# do nothing, expect nothing
|
509
doc/rapport/doc.txt
Normal file
509
doc/rapport/doc.txt
Normal file
|
@ -0,0 +1,509 @@
|
||||||
|
STRUCTURES DES DONNEES
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
Un GRAPHE est représenté par soit une liste d'adjacence soit une matrice
|
||||||
|
d'adjacence. Une matrice d'adjacence est un tableau à 2 dimension contenant des
|
||||||
|
booléens tandis qu'une liste d'adjacence est un tableau de hash dont chacun
|
||||||
|
contenant comme clés les sommets atteints.
|
||||||
|
|
||||||
|
Un CHOCOBAR est représenté par plusieurs façons différentes afin de pouvoir
|
||||||
|
comparer les méthodes plus efficaces d'une implémentation aux autres.
|
||||||
|
a/ Par une liste des "points de ruptures".
|
||||||
|
b/ Par un tableau d'entiers de 8 bits.
|
||||||
|
c/ Par un entier de 64-bit.
|
||||||
|
|
||||||
|
Une STRATEGIE est un tableau d'entiers, un entier x indexé à la position i du
|
||||||
|
tableau signifie que si le joueur concerné se trouve à la configuration i alors
|
||||||
|
il doit choisir la configuration x comme son coup.
|
||||||
|
|
||||||
|
Une STRATEGIE GAGNANTE est une stratégie d'un joueur qui effectue le PREMIER
|
||||||
|
coup et celle-ci garantit que quel que soit les états choisis par l'adversaire
|
||||||
|
alors l'adversaire perdra.
|
||||||
|
|
||||||
|
REMARQUE SUR LES DIFFERENTES IMPLEMENTATIONS DE CHOCHOBAR
|
||||||
|
---------------------------------------------------------
|
||||||
|
|
||||||
|
Il est évident que ces trois différentes implémentations ne distinguent que la
|
||||||
|
manière de générer le graphe de jeu : vitesse de construction du graphe et
|
||||||
|
espace occupé pour cette génération.
|
||||||
|
|
||||||
|
a/ Un POINT DE RUPTURE est une paire d'entiers représentant un point à partir du
|
||||||
|
duquel tous les carrés à droite et en bas de ceci sont déjà mangés. Un état de
|
||||||
|
jeu peut en effet contenir plusieurs point de ruptures.
|
||||||
|
|
||||||
|
L'espace occupé par un état de jeu est alors au pire = taille 2 entiers X nombre
|
||||||
|
de colonnes de la barre de chocolat car une barre de chocolat ne peut pas avoir
|
||||||
|
plus que (nombre de colonnes) point de ruptures.
|
||||||
|
|
||||||
|
Cette implémentation est réalisée par Glenn ROLLAND.
|
||||||
|
|
||||||
|
b/ Un TABLEAU DE CHAR. Un état de jeu est alors représenté par une liste
|
||||||
|
d'entiers marquant les carrés mangés de chaque colonne de la barre de chocolat.
|
||||||
|
Afin d'avoir un entier de 8 bits on utiliser le type char de Java.
|
||||||
|
|
||||||
|
Ceci dit, l'espace occupé par un état de jeu = nombre de colonnes de la barre de
|
||||||
|
chocolat X taille d'un entier.
|
||||||
|
|
||||||
|
Cette approche est réalisée par INDRAWATI.
|
||||||
|
|
||||||
|
c/ Un ENTIER DE 64-BIT. De même principe qu'en (b) on stocke toujours le nombre
|
||||||
|
de carrés mangés de chaque colonne mais au lieu d'utiliser un tableau alors on
|
||||||
|
utilise un entier de 64 bits pour "cartographier" ces colonnes.
|
||||||
|
|
||||||
|
Cette approche est réalisée par INDRAWATI.
|
||||||
|
|
||||||
|
Dans ce cas, un état de jeu prend un espace de taille un entier de 64 bits.
|
||||||
|
|
||||||
|
Cette dernière implémentation a rendu possible la génération de configuration de
|
||||||
|
jeu de taille assez grande puisque l'on a aucun espace perdu pour créer les
|
||||||
|
états : pour une barre de taille (mxn) alors un "cartographie" un état par un
|
||||||
|
tableau de n entiers en base(m+1). Ceci dit, la taille maximale de barre de
|
||||||
|
chocolat que l'on peut calculer est de (mxn) telle que (m+1)^n <= 2^64.
|
||||||
|
|
||||||
|
On estime que cette taille est suffisante puisque lors des tests on a trouvé que
|
||||||
|
de toute façon sans dépasser cette limitation on n'a pas assez d'espace de
|
||||||
|
mémoire pour stocker notre graphe (avec liste d'adjacence ni matrice
|
||||||
|
d'adjacence), on ne risque donc en aucun cas d'être bloqué à cause de la
|
||||||
|
structure de données de ChocoBar.
|
||||||
|
|
||||||
|
GENERATION DE GRAPHE
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
Afin d'économiser l'espace de mémoire utilisé au cours du déroulement de
|
||||||
|
programme, on supprime la liste des états une fois que le graphe du jeu aura été
|
||||||
|
généré.
|
||||||
|
|
||||||
|
a/ Avec une liste de POINTS DE RUPTURES
|
||||||
|
|
||||||
|
L'algorithme a été implémenté par Glenn ROLLAND.
|
||||||
|
|
||||||
|
Il s'agit d'un algorithme récursif dans lequel on génère en une seule passe les
|
||||||
|
états et le graphe. On commence par une ChocoBar vide, et on "mange"
|
||||||
|
récursivement les points inférieurs droits jusqu'à atteindre le sommet
|
||||||
|
supérieur gauche.
|
||||||
|
|
||||||
|
On définit dans la suite de cette section le type ChocoBar comme une liste de
|
||||||
|
couples d'entiers. On considèrera de plus que les variables E et V sont
|
||||||
|
globales.
|
||||||
|
|
||||||
|
D'autre part, dans le pseudo-code suivant, le chocobar et son index seront
|
||||||
|
confondus, mais dans notre implémentation, le temps de calcul de l'index d'un
|
||||||
|
chocobar donné est en O(min(m,n)). La récupération du chocobar correpondant à
|
||||||
|
un index se fait en temps constant. Chaque ajout d'élément à l'ensemble V du
|
||||||
|
graphe nécessite le calcul de l'index du chocobar. De même, chaque
|
||||||
|
vérification d'existance d'un élément dans V nécessite ce calcul.
|
||||||
|
|
||||||
|
Cette implémentation nécessite de maintenir aussi bien une liste des sommets
|
||||||
|
incidents que des sommets adjactents à un sommet donné pour avoir une
|
||||||
|
complexité en temps petite.
|
||||||
|
|
||||||
|
|
||||||
|
Pour commencer, voici quelques fonctions simples dont le détail ne sera pas donné:
|
||||||
|
|
||||||
|
chocobar.addBreakPoint(m,n)
|
||||||
|
// fonction qui ajoute le breakpoint (m,n) à la liste des points (triés) du
|
||||||
|
// chocobar en un temps O(min(m,n)), soit O(n)
|
||||||
|
|
||||||
|
chocobar.getBreakLine()
|
||||||
|
// fonction qui renvoie la ligne frontiere entre la partie mangée et la
|
||||||
|
// partie non-mangée de la tablette de chocolat. Les points de la liste
|
||||||
|
// sont des carrés non-mangés et incluent les bordures inférieure et droite
|
||||||
|
// de la tablette lorsque celle-ci est pleine. Elle se calcule
|
||||||
|
// en O(m+n), ce qui est équivalent à O(n)
|
||||||
|
|
||||||
|
chocobar.equals(c)
|
||||||
|
// fonction qui compare les deux listes de points de chocobar et c
|
||||||
|
// Sa temps de calcul est min(m,n), soit une complexité de O(n)
|
||||||
|
|
||||||
|
Et ensuite les fonctions permettant la génération du graphe et des états:
|
||||||
|
|
||||||
|
global (V,E) <- (vide,vide)
|
||||||
|
global etatInitial <- vide
|
||||||
|
global etatFinal <- vide
|
||||||
|
|
||||||
|
//fonction d'initialisation de la génération du graphe
|
||||||
|
debut genChoco(m: entier, n:entier)
|
||||||
|
etatInitial <- ChocoBar(m, n)
|
||||||
|
V <- etatInitial
|
||||||
|
genChocoFromPoint(etatInitial,m-1,n-1)
|
||||||
|
renvoyer configGraph
|
||||||
|
fin genChoco
|
||||||
|
|
||||||
|
Comme on le constate, genChoco ne fait que l'initialisation du graphe
|
||||||
|
avec l'état initial et aucun arc, suivi d'un appel à la fonction
|
||||||
|
récursive genChocoFromPoint.
|
||||||
|
La complexité de genChoco est donc égale à celle de O(genChocoFromPoint)
|
||||||
|
plus une constante.
|
||||||
|
|
||||||
|
|
||||||
|
//fonction qui construit une configuration de jeu à partir d'un état donné
|
||||||
|
//en mangeant le carré de coordonnées (m, n)
|
||||||
|
debut genChocoFromPoint(oldCBar: ChocoBar, m: entier, n: entier)
|
||||||
|
currentCBar <- oldCBar
|
||||||
|
currentCBar.addBreakPoint(m, n) //on mange le carré (m, n)
|
||||||
|
si currentCBar = Exception "déja mangé" alors
|
||||||
|
sortir
|
||||||
|
fin si
|
||||||
|
si currentCBar = Exception "invalide" alors
|
||||||
|
sortir
|
||||||
|
fin si
|
||||||
|
si V inclus currentCBar alors
|
||||||
|
E <- E U {(oldCBar,currentCBar)}
|
||||||
|
retourner
|
||||||
|
sinon
|
||||||
|
V <- V U {currentCBar}
|
||||||
|
si isFinalConfig(currentCBar) alors
|
||||||
|
etatFinal <- currentCBar
|
||||||
|
fin si
|
||||||
|
constructArcsFromAncestorsTo(oldCBar,currentCBar) ***** expliquer *****
|
||||||
|
frontline <- chocobar.getBreakLine()
|
||||||
|
pour chaque p=(x,y) dans frontline, faire
|
||||||
|
genChocoFromPoint(currentCBar,x,y)
|
||||||
|
fin pour
|
||||||
|
fin si
|
||||||
|
fin genChocoFromPoint
|
||||||
|
|
||||||
|
Cette fonction va s'appeller récursivement |V| fois (pour chaque
|
||||||
|
chocobar possible) au total. Chaque appel de la fonction coûte
|
||||||
|
O(addBreakpoint)+ O(V inclus currentCBar) + O(isFinalConfig) +
|
||||||
|
O(constructArcsFromAncestorsTo) + O(breakline).
|
||||||
|
Or isFinalConfig est une fonction qui teste en temps constant
|
||||||
|
si la configuration est la chocobar à 1 élément dans le coin
|
||||||
|
supérieur gauche.
|
||||||
|
|
||||||
|
|
||||||
|
// fonction qui dit si sonCB est une configuration accessible à
|
||||||
|
// partir de fatherCB
|
||||||
|
debut isNextOf(fatherCB,sonCB) : booleen
|
||||||
|
pour chaque p=(i,j) appartenant à la liste de breakpoint de sonCB
|
||||||
|
fatherCopy <- fatherCB
|
||||||
|
fatherCopy.addBreakPoint(i,j)
|
||||||
|
si fatherCopy = father alors
|
||||||
|
retourner vrai
|
||||||
|
sinon
|
||||||
|
retourner faux
|
||||||
|
fin si
|
||||||
|
fin isNextOf
|
||||||
|
|
||||||
|
La vérification de l'accessibilité d'un état à partir d'un autre
|
||||||
|
nécessite |sonCB| ajouts de breakpoints suivi de comparaisons de listes.
|
||||||
|
Or |sonCB| = min(m,n), O(addBreakPoint)=O(n) et O(equals)=O(n).
|
||||||
|
On a donc O(isNextOf) = O(n^3)
|
||||||
|
|
||||||
|
|
||||||
|
// fonction qui remplit le graphe à partir d'une configuration vers
|
||||||
|
// tous ses ancetres possibles...
|
||||||
|
debut constructArcsFromAncestorsTo(fatherCB: ChocoBar, sonCB:ChocoBar)
|
||||||
|
si isNextOf(fatherCB,sonCB) alors
|
||||||
|
E <- E U {(fatherCB,sonCB)}
|
||||||
|
pour tout ancetreCB appartenant à incident fatherCB dans V,
|
||||||
|
faire
|
||||||
|
constructArcsFromAncestorsTo(ancetreCB,sonCB)
|
||||||
|
fin pour
|
||||||
|
sinon
|
||||||
|
retourner
|
||||||
|
fin si
|
||||||
|
fin constructArcsFromAncestorsTo
|
||||||
|
|
||||||
|
La somme du nombre d'ancetreCB trouvés sur tous les appels de
|
||||||
|
constructArcsFromAncestorsTo est |V|, et pour chacun d'eux on appelle
|
||||||
|
isNextOf. La complexité d'un appel (récursif) à cette fonction
|
||||||
|
est donc de |V|*O(isNextOf), soit O( |V| * n^3 ).
|
||||||
|
|
||||||
|
|
||||||
|
La complexité totale de la construction du graphe et des états est donc égale à
|
||||||
|
O(genChocoFromPoint)
|
||||||
|
= |V| * ( O(addBreakpoint)+ O(V inclus currentCBar) +
|
||||||
|
O(isFinalConfig) + O(constructArcsFromAncestorsTo) + O(breakline) )
|
||||||
|
= O( |V| * ( n + |V|*n^3 + n))
|
||||||
|
= O( (n^3) * (|V|^2) + (|V|*n) )
|
||||||
|
|
||||||
|
|
||||||
|
b/ Avec un tableau de ENTIER de 8BIT
|
||||||
|
|
||||||
|
L'algorithme a été implémenté par INDRAWATI.
|
||||||
|
|
||||||
|
On génère d'abord toutes les configurations possibles du jeu de ChocoBar de
|
||||||
|
taille (m x n) avec m le nombre de lignes et n lenombre de colonnes : c'est
|
||||||
|
une génération d'une suite d'entiers de longueur n en ordre lexicographique
|
||||||
|
particulier.
|
||||||
|
|
||||||
|
genChoco(m: entier, n: entier)
|
||||||
|
V <- genEtat(m, n)
|
||||||
|
E <- vide
|
||||||
|
pour i de 0 à longeur(V) faire
|
||||||
|
pour j de i+1 à longeur(V) faire
|
||||||
|
si estFils(V[j], V[i]) alors
|
||||||
|
E <- E U {(i, j)}
|
||||||
|
fin si
|
||||||
|
fin pour
|
||||||
|
fin pour
|
||||||
|
renvoyer (V, E) //c'est notre graphe
|
||||||
|
|
||||||
|
genEtat(m: entier, n: entier)
|
||||||
|
pour i de 0 à (n-1) faire
|
||||||
|
init[i] <- 0
|
||||||
|
final[i] <- m
|
||||||
|
fin pour
|
||||||
|
etatCourant <- init
|
||||||
|
tabEtat[0] <- init
|
||||||
|
i <- 1
|
||||||
|
etatFinal <- final
|
||||||
|
tant que etatCourant != etatFinal faire
|
||||||
|
pour j de 0 à (n-1) faire
|
||||||
|
gen[j] <- etatCourant[j]
|
||||||
|
fin pour
|
||||||
|
gen[n-1] <- gen[n-1] + 1
|
||||||
|
si gen[n-1] > m alors
|
||||||
|
retenue <- vrai
|
||||||
|
fin si
|
||||||
|
j <- (n-1)
|
||||||
|
tant que (gen[j] > m) faire
|
||||||
|
si j=0 alors
|
||||||
|
arreter tant que
|
||||||
|
fin si
|
||||||
|
gen[j-1] <- gen[j-1] + 1
|
||||||
|
j <- (j - 1)
|
||||||
|
fin tant que
|
||||||
|
si retenue est vrai alors
|
||||||
|
pour cpt de j à (n-1) faire
|
||||||
|
gen[cpt] <- gen[j]
|
||||||
|
fin pour
|
||||||
|
fin si
|
||||||
|
etatCourant <- gen
|
||||||
|
tabEtat[i] <- gen
|
||||||
|
i <- i+1
|
||||||
|
fin tant que
|
||||||
|
tabEtat[i] <- etatFinal
|
||||||
|
renvoyer tabEtat
|
||||||
|
|
||||||
|
estFils(fils: tableau d'entiers, pere: tableau d'entiers)
|
||||||
|
eaten <- -1
|
||||||
|
pour i de 0 à longeur(fils) faire
|
||||||
|
si fils[i] < pere[i] alors
|
||||||
|
renvoyer faux
|
||||||
|
fin si
|
||||||
|
si eaten = -1 alors
|
||||||
|
si fils[i] = pere[i] alors
|
||||||
|
continuer
|
||||||
|
sinon
|
||||||
|
eaten <- i
|
||||||
|
fin si
|
||||||
|
sinon si pere[i] != fils[i] et fils[i] != eaten alors
|
||||||
|
renvoyer faux
|
||||||
|
fin si
|
||||||
|
fin pour
|
||||||
|
si eaten != -1 alors
|
||||||
|
renvoyer vrai // fils est bien un etat suivant du pere
|
||||||
|
sinon
|
||||||
|
renvoyer faux // pere identique au fils
|
||||||
|
fin si
|
||||||
|
|
||||||
|
Soit la taille de la barre de chocolat du jeu est de m lignes et n colonnes
|
||||||
|
et on souhaite générer tous les états possibles dont chacun nous coûte O(n) en
|
||||||
|
temps. Ceci fera un total de O(n*|V|). De même pour la complexité en espace
|
||||||
|
puisqu'un état est décrit par n entiers.
|
||||||
|
|
||||||
|
Pour vérifier si un état peut être atteint à partir d'un autre état donné alors
|
||||||
|
on doit comparer les 2n entiers décrivant ces deux états. Une comparaison coûte
|
||||||
|
donc O(n).
|
||||||
|
|
||||||
|
Etant donné que les états sont générés en ordre lexicographique alors on est sûr
|
||||||
|
que les candidats des états adjacents à un état indexé par i sont ceux indexé
|
||||||
|
par des entiers supérieur i. Le nombre de vérifications qu'il faut effectuer
|
||||||
|
sont alors = somme des entiers de 1 à |V| = 1/2
|
||||||
|
* |V| * (|V|+1). Chacune de ces vérifications coûte O(n), la construction des
|
||||||
|
arêtes coûte en total O(n*(|V|^2)).
|
||||||
|
|
||||||
|
Tout cela conduit à un coût total en temps de génération de graphe en
|
||||||
|
O(n*(|V|^2))+O(n*|V|).
|
||||||
|
|
||||||
|
ATTENTION: A la fin de génération de graphe on supprime la liste des
|
||||||
|
configurations, il nous reste que l'espace occupé par la matrice d'adjacence ou
|
||||||
|
la liste d'adjacence du graphe.
|
||||||
|
|
||||||
|
c/ Avec un ENTIER de 64BIT
|
||||||
|
|
||||||
|
C'est le même algo que pour le b/.
|
||||||
|
|
||||||
|
PARTIE DE JEU
|
||||||
|
-------------
|
||||||
|
|
||||||
|
Cet algorithme a été concu par INDRAWATI.
|
||||||
|
|
||||||
|
// C'est une fonction de simulation qui affiche le déroulement de jeu
|
||||||
|
// selon stratégie des deux joueurs
|
||||||
|
simulation(G: graphe, SA: strategie de A, SB: strategie de B)
|
||||||
|
courant <- etat initial de G
|
||||||
|
final <- etat final de G
|
||||||
|
tant que courant != final faire
|
||||||
|
coupA <- SA[courant]
|
||||||
|
afficher "A a bougé vers coupA"
|
||||||
|
si coupA == final alors
|
||||||
|
afficher "A a perdu"
|
||||||
|
quitter
|
||||||
|
fin si
|
||||||
|
courant <- SB[coupA]
|
||||||
|
afficher "B a bougé vers courant"
|
||||||
|
fin tant que
|
||||||
|
afficher "B a perdu"
|
||||||
|
|
||||||
|
En terme de complexité, ici on considère plutôt en temps puisque l'espace
|
||||||
|
utilisé est statique : par définition de STRATEGIE il est égal au nombre des
|
||||||
|
sommets du graphe, donc O(|V|).
|
||||||
|
|
||||||
|
En ce qui concerne de temps, au pire des cas on parcourt le chemin de longueur
|
||||||
|
maximale de l'état intial vers l'état final. Ce chemin dépendra, à son tour, du
|
||||||
|
graphe de jeu (peut-être donné par l'utilisateur, ce n'est donc pas
|
||||||
|
déterministe), tout ce que l'on sait c'est que ce chemin < |V|.
|
||||||
|
|
||||||
|
TEST DE STRATEGIE
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
Cet algorithme a été écrit par INDRAWATI.
|
||||||
|
|
||||||
|
// C'est une fonction qui teste si S est une stratégie gagnante ou non
|
||||||
|
isWinningStrategy(G: graphe, S: strategie)
|
||||||
|
courant <- etat initial de G
|
||||||
|
final <- etat final de G
|
||||||
|
etatsATraiter <- {courant}
|
||||||
|
etatsTraites <- vide
|
||||||
|
tant que etatsATraiter != vide faire
|
||||||
|
etat <- enfiler etatsATraiter
|
||||||
|
si etat == final alors
|
||||||
|
continuer
|
||||||
|
fin si
|
||||||
|
etatsTraites <- etatsTraites U {etat}
|
||||||
|
coup <- S[etat]
|
||||||
|
si coup == final
|
||||||
|
renvoyer faux
|
||||||
|
fin si
|
||||||
|
advers <- les sommets adjacents à coup
|
||||||
|
pour les sommets i contenus dans advers faire
|
||||||
|
si i n'est pas contenu dans etatsTraites alors
|
||||||
|
etatsATraiter <- etatsATraiter U {i}
|
||||||
|
fin si
|
||||||
|
fin pour
|
||||||
|
fin tant que
|
||||||
|
renvoyer vraie
|
||||||
|
|
||||||
|
En espace on sait qu'à tout moment un sommet est contenu soit dans l'ensemble
|
||||||
|
etatsATraiter soit dans l'ensemble etatsTraites, l'espace occupé est alors egal
|
||||||
|
au nombre des sommets du graphe. L'espace occupé est alors O(|E|).
|
||||||
|
|
||||||
|
En temps, on sait que l'on visite tous les coups possibles de l'adversaire et on
|
||||||
|
ne visite qu'un coup quand c'est notre tour. Ceci dit, on ne visite qu'une
|
||||||
|
partie des sommets du graphe. La complexité est alors inférieure à O(|V|).
|
||||||
|
|
||||||
|
REMARQUE : x->y
|
||||||
|
x->z
|
||||||
|
x->t
|
||||||
|
On ne peut prédire combien d'arrêtes que l'on a à chaque sommet puisque le
|
||||||
|
graphe peut être donné par l'utilisateur et le sommet choisi est également
|
||||||
|
décidé par l'utilisateur.
|
||||||
|
|
||||||
|
CONSTRUCTION DE STRATEGIE GAGNANTE
|
||||||
|
----------------------------------
|
||||||
|
|
||||||
|
Cet algorithme a été écrit par INDRAWATI.
|
||||||
|
|
||||||
|
L'approche choisie est de trouver le chemin gagnant le PLUS COURT partant de
|
||||||
|
l'état initial vers l'état final. Ceci dit que la stratégie ne peut pas être
|
||||||
|
appliquée à une simulation si le joueur qui lui est associée ne fait pas le
|
||||||
|
PREMIER coup.
|
||||||
|
|
||||||
|
// C'est une fonction qui renvoie un tableau d'entiers (une stratégie gagnante)
|
||||||
|
constructWinningStrategy(G: graphe)
|
||||||
|
final <- etat final de G
|
||||||
|
start <- etat initial de G
|
||||||
|
sommetsATraiter <- vide
|
||||||
|
pour i de 1 au ((nombre de sommets de G) - 1) faire
|
||||||
|
S[i]=0
|
||||||
|
sommetsATraiter <- sommetsATraiter U {sommet i}
|
||||||
|
fin pour
|
||||||
|
etatsGagnants <- {final}
|
||||||
|
etatsPerdants <- vide
|
||||||
|
tant que (S[start]==0) faire
|
||||||
|
sommet <- tete de sommetsATraiter
|
||||||
|
test_perdant <- withOnlyEdges(sommet, etatsGagnants, g)
|
||||||
|
si test_perdant != -1 alors
|
||||||
|
enfiler sommet de sommetsATraiter
|
||||||
|
etatsPerdants <- etatsPerdants U {sommet}
|
||||||
|
S[sommet] <- test_perdant
|
||||||
|
nuvo <- les sommets ayant un arc vers le sommet sommet
|
||||||
|
pour tout sommet i dans nuvo
|
||||||
|
etatsGagnants <- etatsGagnants U {i}
|
||||||
|
S[i] <- sommet
|
||||||
|
fin pour
|
||||||
|
pour tout sommet i dans sommetsATraiter faire
|
||||||
|
si i est contenu dans nuvo
|
||||||
|
enlever i de sommetsATraiter
|
||||||
|
fin si
|
||||||
|
fin pour
|
||||||
|
fin si
|
||||||
|
fin tant que
|
||||||
|
renvoyer S
|
||||||
|
|
||||||
|
// C'est une fonction qui renvoie -1 si sommet src a au moins un sommet adjacent
|
||||||
|
// qui n'est pas contenu dans dest
|
||||||
|
withOnlyEdges(src: entier, dest: liste d'entiers, G: graphe)
|
||||||
|
//si graphe est représenté par une matrice alors il faut parcourir
|
||||||
|
//toute la ligne de src
|
||||||
|
//si c'est une liste d'adjacence suffit de prendre la liste indexée par src
|
||||||
|
adjacents <- {sommets adjacents à src}
|
||||||
|
ret <- -1
|
||||||
|
pour tout sommet i contenu dans adjacents faire
|
||||||
|
si i n'est pas contenu dans dest alors
|
||||||
|
renvoyer -1
|
||||||
|
sinon si ret == -1 alors
|
||||||
|
ret <- i
|
||||||
|
fin si
|
||||||
|
fin pour
|
||||||
|
renvoyer ret
|
||||||
|
|
||||||
|
Par hypothèse du jeu de ChocoBar, on sait que le joueur qui commence est le
|
||||||
|
gagnant et que l'on peut lui trouver une stratégie gagnante. Ceci veut dire que
|
||||||
|
l'on arrivera à décider une suite des coups à partir de l'état initial vers
|
||||||
|
l'état final en gagnant le jeu.
|
||||||
|
|
||||||
|
ATTENTION: Cet algo ne marche donc pas pour les graphes qui ne respectent pas
|
||||||
|
les règles de ChocoBar.
|
||||||
|
|
||||||
|
On définit alors ETAT GAGNANT comme étant un état qui peut méner à un état
|
||||||
|
perdant. En effet, si un joueur se trouve dans cet état alors il peut choisir
|
||||||
|
son coup et logiquement il va choisir un état perdant pour le passer à son
|
||||||
|
adversaire.
|
||||||
|
|
||||||
|
Un ETAT PERDANT, par contre, est l'état qui ne peut que mener aux états
|
||||||
|
gagnants. C'est l'état dans lequel on souhaite placer l'adversaire afin de
|
||||||
|
bloquer ses choix.
|
||||||
|
|
||||||
|
Donc, partant de l'état final de jeu, on sait que celui qui trouve cet état
|
||||||
|
avant de décider de jouer est le gagnant, l'état final est donc un sommet
|
||||||
|
gagnant. A chaque itération on essaie de trouver un ou plusieurs états perdants.
|
||||||
|
Au pire des cas on ne trouve qu'un état perdant que l'on enlèvera de l'ensemble
|
||||||
|
des états à traiter. On en enlèvera également les états gagnants obtenus à
|
||||||
|
partir de cet état perdant. Ce "backtracking" est effectué jusqu'au début du
|
||||||
|
graphe (état initial).
|
||||||
|
|
||||||
|
Naïvement on peut dire que l'on a, à chaque étape d'itération, au moins un état
|
||||||
|
perdant et un état gagnant (car cet état perdant provient surement d'un autre
|
||||||
|
coup) et d'un coup on enlève ces deux états (au pire) de l'ensemble restant à
|
||||||
|
traiter et on doit faire donc 1/2 * (|V|) itérations dans le pire des cas. A
|
||||||
|
chaque itération on visite tous les états non traités jusqu'à ce que l'on trouve
|
||||||
|
un état perdant. Ceci dit qu'au maximal on effectue O(|V|^2 + |V|) visites.
|
||||||
|
|
||||||
|
Or, en réalité on s'arrête beaucoup plus tôt car dès que l'on puisse décider
|
||||||
|
quel coup à choisir à partir de l'état intial alors on s'arrête car on a déjà
|
||||||
|
trouvé le chemin gagnant le plus court partant du début de jeu. Ce chemin se
|
||||||
|
composera uniquement par un ensemble d'arrêtes de la forme (etat_gagnant -> etat
|
||||||
|
perdant).
|
||||||
|
|
||||||
|
Il existe des états non traités à la sortie de cet algo. Ce sont des états par
|
||||||
|
lesquels on ne passera jamais car quand on a plusieurs choix (tous perdants)
|
||||||
|
à partir d'un sommet gagnant alors on doit quand même en choisir qu'un seul
|
||||||
|
(par définition de STRATEGIE).
|
||||||
|
|
||||||
|
En terme de l'espace occupé on en a besoin de O(|V|) : |V| pour stocker la
|
||||||
|
stratégie sous forme d'un tableau et |V| pour stocker les états non-traités +
|
||||||
|
les états traités (états perdants + états gagnants = tous les etats).
|
257
io/ChocoBar5X5.txt
Normal file
257
io/ChocoBar5X5.txt
Normal file
|
@ -0,0 +1,257 @@
|
||||||
|
ChocoBar5X5
|
||||||
|
252
|
||||||
|
0
|
||||||
|
9
|
||||||
|
0 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 0 0 0 0 0 0 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 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 1
|
||||||
|
0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 0 0 0 0 0 0 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 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 1
|
||||||
|
0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 0 0 0 0 0 0 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 1 1 1 0 0 0 0 0 0 1 1 1 1 0 0 0 0
|
||||||
|
0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 0 0 0 0 0 0 0 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 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 0 0 0 0 0 0 0 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 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 0 0 0 0 1 1 0 0 0 1 1 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 1 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
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 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 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 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 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 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 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 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 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 1 0 0 0 1 1 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 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 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 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 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 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 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 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 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 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 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 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 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 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 0 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 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 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 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 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 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 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
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 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 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 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 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 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 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 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 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
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 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 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 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 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 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 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 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 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 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 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 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 0 0 0 0 0 0 0 0 0 0 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 1 1 0 0 0 0 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 1 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 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 1 0 0 0 0 0 0 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 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 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 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 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 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 0 0 0 1 1 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 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 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 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 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 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 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 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 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 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 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
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 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 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 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 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 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 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 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 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 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 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 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
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 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 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 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 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 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 1 0 0 0 0 0 0 1 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 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 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 1 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 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 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 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 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 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 1 0 0 0 0 0 0 0 0 0 0 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 1 1 0 0 0 0 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 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 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 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 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 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 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 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 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 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 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 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 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 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 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 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 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 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 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 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 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 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 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 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 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 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 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 1 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 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 1 1 0 0 0 0 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 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 1 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 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 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 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 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 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 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 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 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 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 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 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 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 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 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 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 0 0 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 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 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 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 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 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 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 0 0 0 0 1 0 0 0 1 0 0 0 0 1 1
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 0 1 0 0 1 0 0 0 1 0 0 0 0 1
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 0 1 0 0 1 0 0 0 1 0 0 0 0
|
||||||
|
|
1292
io/ChocoBar5X8.txt
Normal file
1292
io/ChocoBar5X8.txt
Normal file
File diff suppressed because it is too large
Load diff
1292
io/ChocoBar8X5.txt
Normal file
1292
io/ChocoBar8X5.txt
Normal file
File diff suppressed because it is too large
Load diff
254
io/Random5X5.txt
Normal file
254
io/Random5X5.txt
Normal file
|
@ -0,0 +1,254 @@
|
||||||
|
252
|
||||||
|
133
|
||||||
|
132
|
||||||
|
237
|
||||||
|
4
|
||||||
|
188
|
||||||
|
8
|
||||||
|
60
|
||||||
|
20
|
||||||
|
10
|
||||||
|
-1
|
||||||
|
9
|
||||||
|
10
|
||||||
|
10
|
||||||
|
9
|
||||||
|
16
|
||||||
|
9
|
||||||
|
9
|
||||||
|
16
|
||||||
|
15
|
||||||
|
21
|
||||||
|
16
|
||||||
|
12
|
||||||
|
13
|
||||||
|
14
|
||||||
|
17
|
||||||
|
13
|
||||||
|
8
|
||||||
|
18
|
||||||
|
41
|
||||||
|
8
|
||||||
|
9
|
||||||
|
16
|
||||||
|
30
|
||||||
|
9
|
||||||
|
30
|
||||||
|
31
|
||||||
|
21
|
||||||
|
13
|
||||||
|
8
|
||||||
|
35
|
||||||
|
37
|
||||||
|
8
|
||||||
|
33
|
||||||
|
48
|
||||||
|
19
|
||||||
|
31
|
||||||
|
32
|
||||||
|
22
|
||||||
|
29
|
||||||
|
24
|
||||||
|
25
|
||||||
|
49
|
||||||
|
42
|
||||||
|
43
|
||||||
|
48
|
||||||
|
46
|
||||||
|
47
|
||||||
|
41
|
||||||
|
55
|
||||||
|
61
|
||||||
|
51
|
||||||
|
55
|
||||||
|
63
|
||||||
|
28
|
||||||
|
14
|
||||||
|
30
|
||||||
|
11
|
||||||
|
32
|
||||||
|
13
|
||||||
|
72
|
||||||
|
35
|
||||||
|
65
|
||||||
|
37
|
||||||
|
23
|
||||||
|
39
|
||||||
|
13
|
||||||
|
77
|
||||||
|
75
|
||||||
|
80
|
||||||
|
80
|
||||||
|
70
|
||||||
|
67
|
||||||
|
65
|
||||||
|
85
|
||||||
|
49
|
||||||
|
50
|
||||||
|
87
|
||||||
|
85
|
||||||
|
78
|
||||||
|
80
|
||||||
|
81
|
||||||
|
85
|
||||||
|
89
|
||||||
|
58
|
||||||
|
63
|
||||||
|
26
|
||||||
|
87
|
||||||
|
114
|
||||||
|
107
|
||||||
|
65
|
||||||
|
66
|
||||||
|
100
|
||||||
|
82
|
||||||
|
73
|
||||||
|
74
|
||||||
|
75
|
||||||
|
64
|
||||||
|
77
|
||||||
|
88
|
||||||
|
89
|
||||||
|
90
|
||||||
|
105
|
||||||
|
92
|
||||||
|
107
|
||||||
|
109
|
||||||
|
95
|
||||||
|
96
|
||||||
|
118
|
||||||
|
99
|
||||||
|
120
|
||||||
|
110
|
||||||
|
91
|
||||||
|
99
|
||||||
|
113
|
||||||
|
59
|
||||||
|
122
|
||||||
|
120
|
||||||
|
62
|
||||||
|
130
|
||||||
|
119
|
||||||
|
96
|
||||||
|
132
|
||||||
|
28
|
||||||
|
64
|
||||||
|
10
|
||||||
|
9
|
||||||
|
17
|
||||||
|
135
|
||||||
|
134
|
||||||
|
135
|
||||||
|
139
|
||||||
|
134
|
||||||
|
38
|
||||||
|
12
|
||||||
|
139
|
||||||
|
133
|
||||||
|
143
|
||||||
|
43
|
||||||
|
138
|
||||||
|
139
|
||||||
|
136
|
||||||
|
82
|
||||||
|
148
|
||||||
|
84
|
||||||
|
25
|
||||||
|
152
|
||||||
|
153
|
||||||
|
53
|
||||||
|
148
|
||||||
|
90
|
||||||
|
25
|
||||||
|
155
|
||||||
|
146
|
||||||
|
158
|
||||||
|
95
|
||||||
|
160
|
||||||
|
6
|
||||||
|
173
|
||||||
|
133
|
||||||
|
135
|
||||||
|
46
|
||||||
|
47
|
||||||
|
142
|
||||||
|
143
|
||||||
|
50
|
||||||
|
106
|
||||||
|
156
|
||||||
|
157
|
||||||
|
142
|
||||||
|
55
|
||||||
|
179
|
||||||
|
179
|
||||||
|
58
|
||||||
|
163
|
||||||
|
60
|
||||||
|
146
|
||||||
|
194
|
||||||
|
177
|
||||||
|
168
|
||||||
|
179
|
||||||
|
189
|
||||||
|
192
|
||||||
|
162
|
||||||
|
183
|
||||||
|
60
|
||||||
|
165
|
||||||
|
198
|
||||||
|
183
|
||||||
|
188
|
||||||
|
61
|
||||||
|
211
|
||||||
|
206
|
||||||
|
134
|
||||||
|
169
|
||||||
|
140
|
||||||
|
203
|
||||||
|
208
|
||||||
|
136
|
||||||
|
137
|
||||||
|
155
|
||||||
|
176
|
||||||
|
216
|
||||||
|
214
|
||||||
|
159
|
||||||
|
144
|
||||||
|
213
|
||||||
|
146
|
||||||
|
201
|
||||||
|
164
|
||||||
|
146
|
||||||
|
186
|
||||||
|
157
|
||||||
|
202
|
||||||
|
213
|
||||||
|
203
|
||||||
|
202
|
||||||
|
162
|
||||||
|
221
|
||||||
|
194
|
||||||
|
226
|
||||||
|
131
|
||||||
|
163
|
||||||
|
218
|
||||||
|
226
|
||||||
|
235
|
||||||
|
237
|
||||||
|
237
|
||||||
|
223
|
||||||
|
224
|
||||||
|
225
|
||||||
|
210
|
||||||
|
242
|
||||||
|
243
|
||||||
|
229
|
||||||
|
230
|
||||||
|
246
|
||||||
|
242
|
||||||
|
240
|
||||||
|
251
|
||||||
|
236
|
||||||
|
239
|
||||||
|
240
|
||||||
|
|
1289
io/Random5X8.txt
Normal file
1289
io/Random5X8.txt
Normal file
File diff suppressed because it is too large
Load diff
1289
io/Random8X5.txt
Normal file
1289
io/Random8X5.txt
Normal file
File diff suppressed because it is too large
Load diff
254
io/Winning5X5.txt
Normal file
254
io/Winning5X5.txt
Normal file
|
@ -0,0 +1,254 @@
|
||||||
|
252
|
||||||
|
133
|
||||||
|
133
|
||||||
|
133
|
||||||
|
133
|
||||||
|
133
|
||||||
|
119
|
||||||
|
59
|
||||||
|
26
|
||||||
|
10
|
||||||
|
-1
|
||||||
|
9
|
||||||
|
10
|
||||||
|
10
|
||||||
|
10
|
||||||
|
16
|
||||||
|
10
|
||||||
|
15
|
||||||
|
16
|
||||||
|
16
|
||||||
|
21
|
||||||
|
16
|
||||||
|
17
|
||||||
|
21
|
||||||
|
25
|
||||||
|
21
|
||||||
|
13
|
||||||
|
19
|
||||||
|
25
|
||||||
|
42
|
||||||
|
32
|
||||||
|
10
|
||||||
|
16
|
||||||
|
17
|
||||||
|
32
|
||||||
|
35
|
||||||
|
30
|
||||||
|
35
|
||||||
|
35
|
||||||
|
35
|
||||||
|
35
|
||||||
|
35
|
||||||
|
42
|
||||||
|
13
|
||||||
|
48
|
||||||
|
47
|
||||||
|
35
|
||||||
|
32
|
||||||
|
45
|
||||||
|
45
|
||||||
|
32
|
||||||
|
47
|
||||||
|
48
|
||||||
|
47
|
||||||
|
55
|
||||||
|
55
|
||||||
|
45
|
||||||
|
55
|
||||||
|
55
|
||||||
|
55
|
||||||
|
53
|
||||||
|
55
|
||||||
|
55
|
||||||
|
80
|
||||||
|
74
|
||||||
|
68
|
||||||
|
10
|
||||||
|
16
|
||||||
|
32
|
||||||
|
13
|
||||||
|
64
|
||||||
|
35
|
||||||
|
21
|
||||||
|
68
|
||||||
|
74
|
||||||
|
70
|
||||||
|
74
|
||||||
|
74
|
||||||
|
74
|
||||||
|
80
|
||||||
|
80
|
||||||
|
45
|
||||||
|
80
|
||||||
|
80
|
||||||
|
80
|
||||||
|
80
|
||||||
|
80
|
||||||
|
26
|
||||||
|
68
|
||||||
|
93
|
||||||
|
80
|
||||||
|
80
|
||||||
|
80
|
||||||
|
93
|
||||||
|
90
|
||||||
|
59
|
||||||
|
26
|
||||||
|
93
|
||||||
|
0
|
||||||
|
106
|
||||||
|
101
|
||||||
|
80
|
||||||
|
100
|
||||||
|
101
|
||||||
|
48
|
||||||
|
101
|
||||||
|
68
|
||||||
|
64
|
||||||
|
68
|
||||||
|
0
|
||||||
|
111
|
||||||
|
101
|
||||||
|
100
|
||||||
|
106
|
||||||
|
111
|
||||||
|
59
|
||||||
|
106
|
||||||
|
111
|
||||||
|
126
|
||||||
|
119
|
||||||
|
100
|
||||||
|
101
|
||||||
|
111
|
||||||
|
119
|
||||||
|
93
|
||||||
|
126
|
||||||
|
126
|
||||||
|
107
|
||||||
|
0
|
||||||
|
119
|
||||||
|
119
|
||||||
|
126
|
||||||
|
133
|
||||||
|
133
|
||||||
|
64
|
||||||
|
10
|
||||||
|
16
|
||||||
|
32
|
||||||
|
68
|
||||||
|
133
|
||||||
|
35
|
||||||
|
21
|
||||||
|
0
|
||||||
|
133
|
||||||
|
74
|
||||||
|
25
|
||||||
|
133
|
||||||
|
42
|
||||||
|
133
|
||||||
|
133
|
||||||
|
80
|
||||||
|
21
|
||||||
|
47
|
||||||
|
133
|
||||||
|
0
|
||||||
|
25
|
||||||
|
133
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
55
|
||||||
|
25
|
||||||
|
26
|
||||||
|
93
|
||||||
|
59
|
||||||
|
26
|
||||||
|
0
|
||||||
|
0
|
||||||
|
133
|
||||||
|
133
|
||||||
|
0
|
||||||
|
101
|
||||||
|
47
|
||||||
|
133
|
||||||
|
0
|
||||||
|
0
|
||||||
|
133
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
55
|
||||||
|
111
|
||||||
|
0
|
||||||
|
0
|
||||||
|
59
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
119
|
||||||
|
55
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
59
|
||||||
|
0
|
||||||
|
126
|
||||||
|
0
|
||||||
|
59
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
133
|
||||||
|
133
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
133
|
||||||
|
0
|
||||||
|
0
|
||||||
|
133
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
|
1289
io/Winning5X8.txt
Normal file
1289
io/Winning5X8.txt
Normal file
File diff suppressed because it is too large
Load diff
1289
io/Winning8X5.txt
Normal file
1289
io/Winning8X5.txt
Normal file
File diff suppressed because it is too large
Load diff
BIN
lib/JSAP_1.03a.jar
Normal file
BIN
lib/JSAP_1.03a.jar
Normal file
Binary file not shown.
BIN
lib/java-getopt-1.0.10.jar
Normal file
BIN
lib/java-getopt-1.0.10.jar
Normal file
Binary file not shown.
1
src/.cvsignore
Normal file
1
src/.cvsignore
Normal file
|
@ -0,0 +1 @@
|
||||||
|
*.class
|
1
src/ChocoBarLite
Executable file
1
src/ChocoBarLite
Executable file
|
@ -0,0 +1 @@
|
||||||
|
make run JVMOPTS="$*"
|
3
src/ChocoBarLite-bench
Executable file
3
src/ChocoBarLite-bench
Executable file
|
@ -0,0 +1,3 @@
|
||||||
|
for i in 1 2 3; do
|
||||||
|
time make run JVMOPTS="$*" > dump.$1
|
||||||
|
done
|
1
src/ChocoBarLite-jmp
Executable file
1
src/ChocoBarLite-jmp
Executable file
|
@ -0,0 +1 @@
|
||||||
|
time make jmp JVMOPTS="$*"
|
1
src/ChocoBarLite-prof
Executable file
1
src/ChocoBarLite-prof
Executable file
|
@ -0,0 +1 @@
|
||||||
|
time make prof JVMOPTS="$*"
|
BIN
src/ChocoBarLite.class
Normal file
BIN
src/ChocoBarLite.class
Normal file
Binary file not shown.
241
src/ChocoBarLite.java
Normal file
241
src/ChocoBarLite.java
Normal file
|
@ -0,0 +1,241 @@
|
||||||
|
import java.io.*;
|
||||||
|
import java.text.*; // streamtokenizer
|
||||||
|
|
||||||
|
import java.lang.ClassNotFoundException;
|
||||||
|
import java.lang.InstantiationException;
|
||||||
|
import java.lang.IllegalAccessException;
|
||||||
|
|
||||||
|
import chocobar.GenericChocoGraph;
|
||||||
|
import graph.GenericGraph;
|
||||||
|
import conf.ChocoConfig;
|
||||||
|
import jeu.Strategy;
|
||||||
|
import jeu.Simulation;
|
||||||
|
|
||||||
|
/* command line parsing */
|
||||||
|
import com.martiansoftware.jsap.*;
|
||||||
|
import com.martiansoftware.jsap.stringparsers.*;
|
||||||
|
|
||||||
|
|
||||||
|
public final class ChocoBarLite
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Fonction de test de représentation de graphe
|
||||||
|
**/
|
||||||
|
public static void main(String[] args) throws Exception {
|
||||||
|
|
||||||
|
JSAP jsap = new JSAP();
|
||||||
|
|
||||||
|
FlaggedOption opt;
|
||||||
|
Switch sw;
|
||||||
|
|
||||||
|
sw = new Switch("graphgen") // true = génération du graphe à partir de la taill vérif
|
||||||
|
.setShortFlag('g') // false = on prend le graphe du fichier en entrée
|
||||||
|
.setLongFlag("graph");
|
||||||
|
sw.setHelp("Générer le graphe sans fichier d'entrée.");
|
||||||
|
jsap.registerParameter(sw);
|
||||||
|
|
||||||
|
sw = new Switch("strategy") // true = on gere la stratégie
|
||||||
|
.setShortFlag('s') // false = on ne gère pas la stratégie
|
||||||
|
.setLongFlag("strategy");
|
||||||
|
sw.setHelp("Génération des stratégies. (il faut obligatoirement activer la génération de graphe avec ou sans fichiers)");
|
||||||
|
jsap.registerParameter(sw);
|
||||||
|
|
||||||
|
sw = new Switch("simulate") // true = on gere la simulation
|
||||||
|
.setShortFlag('m') // false = on ne gère pas la stratégie
|
||||||
|
.setLongFlag("simulate");
|
||||||
|
sw.setHelp("Gestion de la partie simulation. (implique -s)");
|
||||||
|
jsap.registerParameter(sw);
|
||||||
|
|
||||||
|
sw = new Switch("verbose") // true = mode verbeux
|
||||||
|
.setShortFlag('v') // false = normal
|
||||||
|
.setLongFlag("verbose");
|
||||||
|
sw.setHelp("Mode verbeux");
|
||||||
|
jsap.registerParameter(sw);
|
||||||
|
|
||||||
|
opt= new FlaggedOption("cbmodel") // type de graphe
|
||||||
|
.setStringParser(new StringStringParser())
|
||||||
|
.setDefault("bpl.ChocoBar")
|
||||||
|
.setRequired(false)
|
||||||
|
.setLongFlag("cbmodel");
|
||||||
|
opt.setHelp("Modèle de ChocoBar bpl.ChocoBar, combi.ChocoBarLong, combi.ChocoBarBigInt, combi.ChocoBarArray. (défaut: bpl.ChocoBar)");
|
||||||
|
jsap.registerParameter(opt);
|
||||||
|
|
||||||
|
opt= new FlaggedOption("cbstyle") // type de graphe
|
||||||
|
.setStringParser(new StringStringParser())
|
||||||
|
.setDefault("bpl")
|
||||||
|
.setRequired(false)
|
||||||
|
.setLongFlag("cbstyle");
|
||||||
|
opt.setHelp("Style de ChocoBar : bpl, combi. (défaut: combi)");
|
||||||
|
jsap.registerParameter(opt);
|
||||||
|
|
||||||
|
opt= new FlaggedOption("edgemodel") // type de graphe
|
||||||
|
.setStringParser(new StringStringParser())
|
||||||
|
.setDefault("EdgeBigIntModel")
|
||||||
|
.setRequired(false)
|
||||||
|
.setLongFlag("edgemodel");
|
||||||
|
opt.setHelp("Modèle d'Arc (edge) : EdgeBigIntModel, EdgeBitSetModel, EdgeListModel, EdgeMatrixModel.");
|
||||||
|
jsap.registerParameter(opt);
|
||||||
|
|
||||||
|
|
||||||
|
opt = new FlaggedOption("width") // largeur du chocobar
|
||||||
|
.setStringParser(new IntegerStringParser())
|
||||||
|
.setDefault("6")
|
||||||
|
.setRequired(false)
|
||||||
|
.setShortFlag('w')
|
||||||
|
.setLongFlag("width");
|
||||||
|
opt.setHelp("Largeur de la ChocoBar. (défaut 6)");
|
||||||
|
jsap.registerParameter(opt);
|
||||||
|
|
||||||
|
opt = new FlaggedOption("height") // hauteur du chocobar
|
||||||
|
.setStringParser(new IntegerStringParser())
|
||||||
|
.setDefault("6")
|
||||||
|
.setRequired(false)
|
||||||
|
.setShortFlag('h')
|
||||||
|
.setLongFlag("height");
|
||||||
|
opt.setHelp("Hauteur de la ChocoBar. (défaut 6)");
|
||||||
|
jsap.registerParameter(opt);
|
||||||
|
|
||||||
|
opt= new FlaggedOption("ginput") // fichier de graphe en entrée
|
||||||
|
.setStringParser(new StringStringParser())
|
||||||
|
.setDefault("")
|
||||||
|
.setRequired(false)
|
||||||
|
.setShortFlag('G')
|
||||||
|
.setLongFlag("gpinput");
|
||||||
|
opt.setHelp("Fichier de graphe en entrée.");
|
||||||
|
jsap.registerParameter(opt);
|
||||||
|
|
||||||
|
|
||||||
|
opt= new FlaggedOption("strategyA") // fichier de graphe en entrée
|
||||||
|
.setStringParser(new StringStringParser())
|
||||||
|
.setDefault("")
|
||||||
|
.setRequired(false)
|
||||||
|
.setShortFlag('A')
|
||||||
|
.setLongFlag("strategyA");
|
||||||
|
opt.setHelp("Fichier de stratégie pour le joueur A. (Elle sera générée au besoin sinon)");
|
||||||
|
jsap.registerParameter(opt);
|
||||||
|
|
||||||
|
opt= new FlaggedOption("strategyB") // fichier de graphe en entrée
|
||||||
|
.setStringParser(new StringStringParser())
|
||||||
|
.setDefault("")
|
||||||
|
.setRequired(false)
|
||||||
|
.setShortFlag('B')
|
||||||
|
.setLongFlag("strategyB");
|
||||||
|
opt.setHelp("Fichier de stratégie pour le joueur B. (Elle sera générée au besoin sinon)");
|
||||||
|
jsap.registerParameter(opt);
|
||||||
|
|
||||||
|
sw = new Switch("random") // La stratégie est aléatoire
|
||||||
|
.setShortFlag('r')
|
||||||
|
.setLongFlag("random");
|
||||||
|
sw.setHelp("En cas de génération, le joueur A aura une statégie aléatoire. (Par défault elle est gagnante");
|
||||||
|
jsap.registerParameter(sw);
|
||||||
|
|
||||||
|
JSAPResult config = jsap.parse(args);
|
||||||
|
if (!config.success()) {
|
||||||
|
System.err.println();
|
||||||
|
for (java.util.Iterator errs = config.getErrorMessageIterator();
|
||||||
|
errs.hasNext();) {
|
||||||
|
System.err.println("Error: " + errs.next());
|
||||||
|
}
|
||||||
|
System.err.print("Usage: ChocoBarLite ");
|
||||||
|
System.err.println(jsap.getUsage());
|
||||||
|
System.err.println();
|
||||||
|
// show full help as well
|
||||||
|
System.err.println(jsap.getHelp());
|
||||||
|
System.err.println();
|
||||||
|
System.exit(1);
|
||||||
|
} else {
|
||||||
|
/* la ligne de commande est valide, on initialise donc les valeurs */
|
||||||
|
ChocoConfig.size = config.getInt("width");
|
||||||
|
ChocoConfig.height = config.getInt("height");
|
||||||
|
ChocoConfig.chocoBarModel = config.getString("cbmodel");
|
||||||
|
ChocoConfig.chocoBarStyle = config.getString("cbstyle");
|
||||||
|
ChocoConfig.edgeModel = config.getString("edgemodel");
|
||||||
|
|
||||||
|
GenericChocoGraph c=null;
|
||||||
|
try {
|
||||||
|
// Recherche du bon ChocoGraph
|
||||||
|
Class cCG = Class.forName("chocobar."+ChocoConfig.chocoBarStyle+".ChocoGraph");
|
||||||
|
c = (GenericChocoGraph) cCG.newInstance();
|
||||||
|
} catch (Exception e){
|
||||||
|
System.err.println("ERREUR: Le modèle de graphe '"+ChocoConfig.chocoBarStyle+"' est inconnu.");
|
||||||
|
e.printStackTrace();
|
||||||
|
System.exit(1);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
GenericGraph g=null;
|
||||||
|
if (config.getBoolean("graphgen")){
|
||||||
|
g = c.genChoco(true);
|
||||||
|
} else {
|
||||||
|
if (!config.getString("ginput").equals("")){ // on vérifie si la chaine n'est pas vide...
|
||||||
|
// On instancie le bon Graph
|
||||||
|
Class cCG = Class.forName("chocobar."+ChocoConfig.chocoBarStyle+".Graph");
|
||||||
|
g = (GenericGraph) cCG.newInstance();
|
||||||
|
g.loadFromFile(config.getString("ginput"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (g!=null){
|
||||||
|
System.out.println("Fin de calcul du graphe");
|
||||||
|
System.out.println(g.toDot());
|
||||||
|
|
||||||
|
Strategy a=null;
|
||||||
|
Strategy b=null;
|
||||||
|
if (config.getBoolean("strategy") || config.getBoolean("simulate")) {
|
||||||
|
// On a demandé à gérer la partie stratégie
|
||||||
|
|
||||||
|
// Création de la stratégie de A
|
||||||
|
a = new Strategy();
|
||||||
|
|
||||||
|
// A a-t-il une stratégie définie ?
|
||||||
|
if ( config.getString("strategyA").equals("") ) {
|
||||||
|
// Non. La stratégie de A est-elle aléatoire ?
|
||||||
|
if (config.getBoolean("random")) {
|
||||||
|
a.constructRandomStrategy(g);
|
||||||
|
} else {
|
||||||
|
a.constructWinningStrategy(g);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Oui, on lit donc la stratégie du fichier
|
||||||
|
a.constructFromFile(config.getString("strategyA"));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Création de la stratégie de B
|
||||||
|
b = new Strategy();
|
||||||
|
|
||||||
|
// B a-t-il une stratégie définie ?
|
||||||
|
if ( config.getString("strategyB").equals("") ) {
|
||||||
|
// B a forcément une statégie aléatoire
|
||||||
|
b.constructRandomStrategy(g);
|
||||||
|
} else {
|
||||||
|
// Oui, on lit donc la stratégie du fichier
|
||||||
|
b.constructFromFile(config.getString("strategyB"));
|
||||||
|
}
|
||||||
|
|
||||||
|
// On affiche la stratégie de A
|
||||||
|
a.display();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (config.getBoolean("simulate")) {
|
||||||
|
// On a demandé à gérer la partie simulate
|
||||||
|
// A et B ont déjà une stratégie (-m implique -s)
|
||||||
|
Simulation.simulate(a, b, g);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
System.err.println("ERREUR: Aucun graphe généré. Impossible d'aller plus loin");
|
||||||
|
System.err.println();
|
||||||
|
System.err.print("Usage: ChocoBarLite ");
|
||||||
|
System.err.println(jsap.getUsage());
|
||||||
|
System.err.println();
|
||||||
|
// show full help as well
|
||||||
|
System.err.println(jsap.getHelp());
|
||||||
|
System.err.println();
|
||||||
|
System.exit(1);
|
||||||
|
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
64
src/Makefile
Normal file
64
src/Makefile
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
### HEADER HERE
|
||||||
|
## /ens/sighirea/Algo2/projet/...
|
||||||
|
|
||||||
|
# @CLASSPATH=$(CLASSPATH) $(JAVAC) $(JCFLAGS) $<
|
||||||
|
|
||||||
|
JAVAC=javac
|
||||||
|
JAVADOC=javadoc -nonavbar
|
||||||
|
JAVA=java
|
||||||
|
#ORACLE_CLASSPATH:=../lib/rt.jar:../lib/classes12.zip:../lib/nls_charset12.zip
|
||||||
|
USER_CLASSPATH:=$$CLASSPATH:/usr/share/java/mysql.jar:.:../bin:../lib:../lib/JSAP_1.03a.jar:../lib/java-getopt-1.0.10.jar
|
||||||
|
|
||||||
|
# Java Compiler Flags
|
||||||
|
JCFLAGS+=-g -deprecation -O
|
||||||
|
#-target 1.4
|
||||||
|
|
||||||
|
# JVM Flags
|
||||||
|
JVM_MEM=-Xmx1g
|
||||||
|
JVM_DEBUG+=-verbose:gc
|
||||||
|
JVM_OPTIMIZE+=-server
|
||||||
|
JVMFLAGS+=$(JVM_MEM) $(JVM_DEBUG) $(JVM_OPTIMIZE)
|
||||||
|
|
||||||
|
PRJNAME=ChocoBarLite
|
||||||
|
GDATE := $(shell date +"-%Y-%m-%d_r%H")
|
||||||
|
GFILENAME := ../$(PRJNAME)$(GDATE).tar.bz2
|
||||||
|
LOCALDIR = $(shell pwd)
|
||||||
|
#LINUX_THREADING+=#LD_ASSUME_KERNEL=2.4.1
|
||||||
|
|
||||||
|
JAVAFILES := $(shell ls *.java */*.java */*/*.java)
|
||||||
|
CLASSFILES := $(patsubst %.java,%.class,$(JAVAFILES))
|
||||||
|
|
||||||
|
all: ctags build
|
||||||
|
|
||||||
|
doc:
|
||||||
|
$(JAVADOC) -d ../doc/html $(JAVAFILES)
|
||||||
|
|
||||||
|
build : $(CLASSFILES)
|
||||||
|
|
||||||
|
clean:
|
||||||
|
@echo -e "Cleaning..."
|
||||||
|
@rm -vf *~ *.class */*.class */*/*.class
|
||||||
|
|
||||||
|
ctags:
|
||||||
|
@echo -e "Generating CTAGS"
|
||||||
|
@ctags -R
|
||||||
|
|
||||||
|
%.class : %.java
|
||||||
|
@echo -e "JAVAC\t$<"
|
||||||
|
@CLASSPATH=$(USER_CLASSPATH) $(JAVAC) $(JCFLAGS) $<
|
||||||
|
|
||||||
|
jmp:
|
||||||
|
@echo -e "Profiling $(PRJNAME)..."
|
||||||
|
@($(LINUX_THREADING) CLASSPATH=$(USER_CLASSPATH) $(JAVA) -Xrunjmp:filter=+package:,-package:java.util $(JVMFLAGS) $(PRJNAME) $(JVMOPTS) )
|
||||||
|
|
||||||
|
prof:
|
||||||
|
@echo -e "Profiling $(PRJNAME)..."
|
||||||
|
@($(LINUX_THREADING) CLASSPATH=$(USER_CLASSPATH) $(JAVA) -Xprof $(JVMFLAGS) $(PRJNAME) $(JVMOPTS))
|
||||||
|
|
||||||
|
|
||||||
|
run:
|
||||||
|
@echo -e "Running $(PRJNAME)..."
|
||||||
|
@($(LINUX_THREADING) CLASSPATH=$(USER_CLASSPATH) $(JAVA) $(JVMFLAGS) $(PRJNAME) $(JVMOPTS))
|
||||||
|
|
||||||
|
################################################
|
||||||
|
## DEPENDS ##
|
BIN
src/chocobar/GenericChocoGraph.class
Normal file
BIN
src/chocobar/GenericChocoGraph.class
Normal file
Binary file not shown.
8
src/chocobar/GenericChocoGraph.java
Normal file
8
src/chocobar/GenericChocoGraph.java
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
package chocobar;
|
||||||
|
|
||||||
|
import graph.GenericGraph;
|
||||||
|
|
||||||
|
public interface GenericChocoGraph
|
||||||
|
{
|
||||||
|
public GenericGraph genChoco(boolean isList);
|
||||||
|
}
|
BIN
src/chocobar/bpl/BreakPointList.class
Normal file
BIN
src/chocobar/bpl/BreakPointList.class
Normal file
Binary file not shown.
136
src/chocobar/bpl/BreakPointList.java
Normal file
136
src/chocobar/bpl/BreakPointList.java
Normal file
|
@ -0,0 +1,136 @@
|
||||||
|
package chocobar.bpl;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
public class BreakPointList extends Vector{
|
||||||
|
/**
|
||||||
|
* Constructeur par defaut
|
||||||
|
**/
|
||||||
|
public BreakPointList(){
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructeur a partir d'un autre objet de meme type
|
||||||
|
**/
|
||||||
|
public BreakPointList(BreakPointList old){
|
||||||
|
super();
|
||||||
|
for (int i=0;i<old.size();i++){
|
||||||
|
super.add(old.elementAt(i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui verifie si le carre (x, y) est encore plein
|
||||||
|
* ou deja troue
|
||||||
|
**/
|
||||||
|
//PROFILED
|
||||||
|
public boolean isBroken(IntPoint current){
|
||||||
|
int cX=current.getX();
|
||||||
|
int cY=current.getY();
|
||||||
|
IntPoint p=null;
|
||||||
|
for(int i=0;i<this.size();i++){
|
||||||
|
p=(IntPoint)super.elementAt(i);
|
||||||
|
if ((p.getX()<=cX) && (p.getY()<=cY)){ return true; }
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui ajoute un breakpoint a cet objet si possible
|
||||||
|
**/
|
||||||
|
public void add(IntPoint current){
|
||||||
|
IntPoint p;
|
||||||
|
Iterator i=this.iterator();
|
||||||
|
|
||||||
|
int cX=current.getX();
|
||||||
|
int cY=current.getY();
|
||||||
|
int pX=0; int pY=0;
|
||||||
|
while (i.hasNext()){
|
||||||
|
p=(IntPoint)i.next();
|
||||||
|
pX=p.getX(); pY=p.getY();
|
||||||
|
if ( ((cX<pX)&&(cY<=pY) )
|
||||||
|
|| ((cX<=pX && (cY<pY)))){
|
||||||
|
// on "mange" l'ancien point
|
||||||
|
i.remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// we sort new point before insertion depending on the y coord.
|
||||||
|
int comp_idx;
|
||||||
|
int this_size=this.size();
|
||||||
|
if (this_size==0){
|
||||||
|
super.add(current);
|
||||||
|
} else {
|
||||||
|
boolean done=false; // pour savoir si on doit inserer a la fin
|
||||||
|
IntPoint comp=null;
|
||||||
|
i=this.iterator();
|
||||||
|
while(i.hasNext()){
|
||||||
|
comp=(IntPoint)i.next();
|
||||||
|
if (comp.getY() < cY){
|
||||||
|
// current is lower than cur, we have to insert it
|
||||||
|
// before indefOf(cur).
|
||||||
|
comp_idx=this.indexOf(comp);
|
||||||
|
super.insertElementAt(current,comp_idx);
|
||||||
|
done=true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!done){
|
||||||
|
super.insertElementAt(current, this_size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return a string corresponding to the current BreakPointList
|
||||||
|
**/
|
||||||
|
public String toString(){
|
||||||
|
IntPoint p;
|
||||||
|
StringBuffer s=new StringBuffer();
|
||||||
|
s.append("[");
|
||||||
|
Iterator i=this.iterator();
|
||||||
|
while (i.hasNext()){
|
||||||
|
p=(IntPoint)i.next();
|
||||||
|
s.append("(");
|
||||||
|
s.append(p);
|
||||||
|
s.append(") ");
|
||||||
|
}
|
||||||
|
s.append("]");
|
||||||
|
return s.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test the equality between two BreakPointLists
|
||||||
|
**/
|
||||||
|
public boolean equals(BreakPointList comp){
|
||||||
|
if (comp==null){
|
||||||
|
return false;
|
||||||
|
// everybody is null
|
||||||
|
} else {
|
||||||
|
int bpsize=this.size();
|
||||||
|
if (bpsize==comp.size()){
|
||||||
|
IntPoint p=null;
|
||||||
|
IntPoint q=null;
|
||||||
|
for (int i=0;i<bpsize;i++){
|
||||||
|
p=(IntPoint)this.elementAt(i);
|
||||||
|
q=(IntPoint)comp.elementAt(i);
|
||||||
|
if (!p.equals(q)){ return false; }
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
// breakpoint lists do not have the same size...
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Distance between two dinstinct breakpoint lists.
|
||||||
|
**/
|
||||||
|
/*
|
||||||
|
public int distance(BreakPointList other){
|
||||||
|
// TODO (using the code of onePlus if possible)!
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
BIN
src/chocobar/bpl/CBLGlobal.class
Normal file
BIN
src/chocobar/bpl/CBLGlobal.class
Normal file
Binary file not shown.
10
src/chocobar/bpl/CBLGlobal.java
Normal file
10
src/chocobar/bpl/CBLGlobal.java
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
package chocobar.bpl;
|
||||||
|
|
||||||
|
class CBLGlobal{
|
||||||
|
public static boolean isVerbose=true;
|
||||||
|
public static void debugMsg(String msg){
|
||||||
|
if (CBLGlobal.isVerbose){
|
||||||
|
System.out.println(msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
BIN
src/chocobar/bpl/ChocoBar.class
Normal file
BIN
src/chocobar/bpl/ChocoBar.class
Normal file
Binary file not shown.
266
src/chocobar/bpl/ChocoBar.java
Normal file
266
src/chocobar/bpl/ChocoBar.java
Normal file
|
@ -0,0 +1,266 @@
|
||||||
|
package chocobar.bpl;
|
||||||
|
|
||||||
|
// JDK imports
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
import graph.Vertice;
|
||||||
|
import exception.*;
|
||||||
|
|
||||||
|
class ChocoBar implements Vertice, Cloneable {
|
||||||
|
private int width;
|
||||||
|
private int height;
|
||||||
|
public BreakPointList brkPtLst;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructeur d'une barre de choco ayant x carres en largeur
|
||||||
|
* et y carres en hauteur, toute neuve.
|
||||||
|
**/
|
||||||
|
public ChocoBar(int x,int y){
|
||||||
|
this.width=x;
|
||||||
|
this.height=y;
|
||||||
|
this.brkPtLst=new BreakPointList();
|
||||||
|
}
|
||||||
|
|
||||||
|
public ChocoBar(int x, int y, BreakPointList oldBP){
|
||||||
|
this(x,y);
|
||||||
|
this.brkPtLst=new BreakPointList(oldBP);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the hash int of the current configuration
|
||||||
|
*/
|
||||||
|
public int getHash(){
|
||||||
|
int hash=0;
|
||||||
|
int hoffset=0;
|
||||||
|
IntPoint pt=null;
|
||||||
|
int ptcounter=0;
|
||||||
|
for (int x=0;x<this.width;x++){
|
||||||
|
if (this.brkPtLst.size()>0){
|
||||||
|
pt=(IntPoint)this.brkPtLst.elementAt(ptcounter);
|
||||||
|
if (x==pt.getX()){
|
||||||
|
if (ptcounter<this.brkPtLst.size()-1){
|
||||||
|
ptcounter++;
|
||||||
|
}
|
||||||
|
hoffset=this.height-pt.getY();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
System.out.print(hoffset+" ");
|
||||||
|
hash=hash*this.height+hoffset;
|
||||||
|
}
|
||||||
|
System.out.println(" = "+hash);
|
||||||
|
return hash;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructeur d'une ChocoBar à partir d'une ancienne barre
|
||||||
|
**/
|
||||||
|
public ChocoBar(ChocoBar old){
|
||||||
|
this(0,0);
|
||||||
|
try{
|
||||||
|
if (old==null){
|
||||||
|
throw new Exception();
|
||||||
|
} else {
|
||||||
|
this.width=old.width;
|
||||||
|
this.height=old.height;
|
||||||
|
this.brkPtLst=new BreakPointList(old.brkPtLst);
|
||||||
|
}
|
||||||
|
} catch (Exception e){
|
||||||
|
e.printStackTrace();
|
||||||
|
System.exit(-3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui affiche sur STDOUT cette barre de choco
|
||||||
|
**/
|
||||||
|
public void display(){
|
||||||
|
boolean[][] chocobar= new boolean[width][height];
|
||||||
|
System.out.print(" ");
|
||||||
|
for (int w=0;w<this.width;w++){ // affichage de l'indice x
|
||||||
|
if (w<100){ System.out.print(" "); }
|
||||||
|
if (w<10){ System.out.print(" "); }
|
||||||
|
System.out.print(w);
|
||||||
|
}
|
||||||
|
System.out.println("");
|
||||||
|
for (int h=0;h<this.height;h++){ // affichage de l'indice y
|
||||||
|
if (h<100){ System.out.print(" "); }
|
||||||
|
if (h<10){ System.out.print(" "); }
|
||||||
|
System.out.print(h+". ");
|
||||||
|
for (int w=0;w<this.width;w++){
|
||||||
|
if (this.brkPtLst.isBroken(new IntPoint(w, h))){
|
||||||
|
System.out.print(" _ ");
|
||||||
|
} else {
|
||||||
|
System.out.print(" X ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
System.out.println("");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a new breakpoint at position newBP
|
||||||
|
**/
|
||||||
|
public void addBreakPoint(IntPoint newBP)
|
||||||
|
throws OutOfRangeBreakPointException, AlreadyBrokenPointException
|
||||||
|
{
|
||||||
|
this.addBreakPoint(newBP.getX(),newBP.getY());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a new breakpoint at position (x,y)
|
||||||
|
**/
|
||||||
|
public void addBreakPoint(int x, int y)
|
||||||
|
throws OutOfRangeBreakPointException, AlreadyBrokenPointException
|
||||||
|
{
|
||||||
|
if ((x<0) || (x>=this.width)
|
||||||
|
|| (y<0) || (y>=this.height)){
|
||||||
|
throw (new OutOfRangeBreakPointException());
|
||||||
|
}
|
||||||
|
IntPoint current=new IntPoint(x,y);
|
||||||
|
if (this.brkPtLst.isBroken(current)){
|
||||||
|
throw (new AlreadyBrokenPointException());
|
||||||
|
}
|
||||||
|
this.brkPtLst.add(current);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui verifie si la barre passee en argument
|
||||||
|
* contient la meme config que cet objet
|
||||||
|
**/
|
||||||
|
public boolean equals(ChocoBar comp){
|
||||||
|
boolean eq=true;
|
||||||
|
|
||||||
|
if ((this.width != comp.width)||(this.height != comp.height)){
|
||||||
|
eq=false;
|
||||||
|
} else {
|
||||||
|
eq=this.brkPtLst.equals(comp.brkPtLst);
|
||||||
|
}
|
||||||
|
return eq;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui verifie si cet objet est une config
|
||||||
|
* suivante de la config passee en parametre
|
||||||
|
* cplx: O(|brkPtLst|)
|
||||||
|
**/
|
||||||
|
public boolean isNextOf(ChocoBar parent){
|
||||||
|
Iterator pointToEat=this.brkPtLst.iterator();
|
||||||
|
ChocoBar parentCopy=null;
|
||||||
|
BreakPointList parentBPCopy=null;
|
||||||
|
IntPoint currentEatPoint;
|
||||||
|
while(pointToEat.hasNext()){
|
||||||
|
currentEatPoint=(IntPoint)pointToEat.next();
|
||||||
|
// we make a copy of parent
|
||||||
|
parentBPCopy=new BreakPointList(parent.brkPtLst);
|
||||||
|
// we eat the copy with each break current chocobar
|
||||||
|
parentBPCopy.add(currentEatPoint);
|
||||||
|
// one of the resulting chocobars should be the same.
|
||||||
|
if (this.brkPtLst.equals(parentBPCopy)){ return true; }
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui renvoie true si cette barre de choco
|
||||||
|
* est la derniere config possible
|
||||||
|
**/
|
||||||
|
public boolean isFinalConfig(){
|
||||||
|
if (this.brkPtLst.size() != 1){
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
if (this.brkPtLst.contains(new IntPoint(0, 0)))
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui calcule les points de frontiere
|
||||||
|
* des carrees non mangés
|
||||||
|
**/
|
||||||
|
public Vector getBreakLine(){
|
||||||
|
Vector frontline=new Vector();
|
||||||
|
|
||||||
|
if ((brkPtLst==null) || (brkPtLst.size()<1)){
|
||||||
|
// on a une barre toute neuve, seul carre
|
||||||
|
// a manger est (width-1, height-1)
|
||||||
|
frontline.add(new IntPoint(this.width-1, this.height-1));
|
||||||
|
} else {
|
||||||
|
IntPoint firstPt;
|
||||||
|
IntPoint secondPt;
|
||||||
|
|
||||||
|
// draw vertical line before first point
|
||||||
|
firstPt=(IntPoint)this.brkPtLst.elementAt(0);
|
||||||
|
if (firstPt.getX()<0){
|
||||||
|
// do nothing, the point is on the left border
|
||||||
|
} else {
|
||||||
|
for (int y=this.height-1;y>=firstPt.getY();y--){
|
||||||
|
frontline.add(
|
||||||
|
new IntPoint(firstPt.getX()-1,y)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// loop with two points
|
||||||
|
for (int i=0;i<this.brkPtLst.size()-1;i++){
|
||||||
|
firstPt=(IntPoint)this.brkPtLst.elementAt(i);
|
||||||
|
secondPt=(IntPoint)this.brkPtLst.elementAt(i+1);
|
||||||
|
// horizontal line between...
|
||||||
|
for (int x=firstPt.getX()-1;
|
||||||
|
x<secondPt.getX()-1;
|
||||||
|
x++){
|
||||||
|
frontline.add(
|
||||||
|
new IntPoint(x,firstPt.getY()-1)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
// then the vertical one
|
||||||
|
for (int y=firstPt.getY()-1;
|
||||||
|
y>=secondPt.getY();
|
||||||
|
y--){
|
||||||
|
frontline.add(
|
||||||
|
new IntPoint(secondPt.getX()-1,y)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// draw horizontal line after last point
|
||||||
|
secondPt=(IntPoint)this.brkPtLst.elementAt(this.brkPtLst.size()-1);
|
||||||
|
if (secondPt.getY()<1){
|
||||||
|
// do nothing, the point is on the top border
|
||||||
|
} else {
|
||||||
|
int hshift=-1;
|
||||||
|
if ((secondPt.getX()+hshift)<0){ hshift=0; }
|
||||||
|
for (int x=secondPt.getX()+hshift;x<this.width;x++){
|
||||||
|
frontline.add(
|
||||||
|
new IntPoint(x,secondPt.getY()-1)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return frontline;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getColor(){
|
||||||
|
//TODO: fill;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setColor(int c){
|
||||||
|
//TODO:fill
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getLabel(){
|
||||||
|
//TODO:fill
|
||||||
|
return new String("");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLabel(String s){
|
||||||
|
//TODO:fill
|
||||||
|
}
|
||||||
|
|
||||||
|
public BreakPointList getBreakPointList(){
|
||||||
|
return this.brkPtLst;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
BIN
src/chocobar/bpl/ChocoBarSet.class
Normal file
BIN
src/chocobar/bpl/ChocoBarSet.class
Normal file
Binary file not shown.
155
src/chocobar/bpl/ChocoBarSet.java
Normal file
155
src/chocobar/bpl/ChocoBarSet.java
Normal file
|
@ -0,0 +1,155 @@
|
||||||
|
package chocobar.bpl;
|
||||||
|
|
||||||
|
import java.util.Vector;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Iterator;
|
||||||
|
|
||||||
|
import graph.Vertice;
|
||||||
|
|
||||||
|
public class ChocoBarSet implements VerticeSet {
|
||||||
|
private int size;
|
||||||
|
private ChocoBarSetNode CBSroot;
|
||||||
|
private ChocoBar prevSearch;
|
||||||
|
private ChocoBar prevResultCB;
|
||||||
|
private boolean prevResultContains;
|
||||||
|
private int prevResultId;
|
||||||
|
private Vector assoc;
|
||||||
|
private boolean assocTainted;
|
||||||
|
|
||||||
|
public int size(){
|
||||||
|
return this.size;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ChocoBarSet(){
|
||||||
|
this.size=0;
|
||||||
|
this.assoc=null;
|
||||||
|
this.assocTainted=true;
|
||||||
|
this.CBSroot=new ChocoBarSetNode();
|
||||||
|
}
|
||||||
|
|
||||||
|
public int add(Vertice vCB){
|
||||||
|
ChocoBar extCB=(ChocoBar)vCB;
|
||||||
|
int addId=this.size;
|
||||||
|
this.size=this.size+1;
|
||||||
|
ChocoBarSetNode addedCBSN=this.CBSroot.add(extCB,0,addId);
|
||||||
|
if (this.assocTainted){
|
||||||
|
this.buildAssoc();
|
||||||
|
} else {
|
||||||
|
this.assoc.add(addedCBSN);
|
||||||
|
}
|
||||||
|
if (this.prevSearch==vCB){
|
||||||
|
this.prevSearch=null;
|
||||||
|
}
|
||||||
|
return addId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void remove(Vertice vCB){
|
||||||
|
ChocoBar extCB=(ChocoBar)vCB;
|
||||||
|
int extId=this.getIdOf(extCB);
|
||||||
|
// TODO: supprimer l'element extCB/extId
|
||||||
|
for (int i=extId+1;i<this.assoc.size();i++){
|
||||||
|
ChocoBarSetNode cbsn=(ChocoBarSetNode)this.assoc.elementAt(i);
|
||||||
|
cbsn.setId(cbsn.getId()-1);
|
||||||
|
}
|
||||||
|
// décaler de -1 tous les Id suppérieurs
|
||||||
|
this.assocTainted=true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getIdOf(Vertice vCB){
|
||||||
|
ChocoBar extCB=(ChocoBar)vCB;
|
||||||
|
if (prevSearch==extCB){
|
||||||
|
// we already made something about this
|
||||||
|
//System.out.println("Using prev value");
|
||||||
|
return this.prevResultId;
|
||||||
|
} else {
|
||||||
|
this.updateSearchValues(extCB);
|
||||||
|
return this.prevResultId;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateSearchValues(ChocoBar extCB){
|
||||||
|
//System.out.println("Looking for :");
|
||||||
|
//extCB.display();
|
||||||
|
ChocoBarSetNode foundCBSN=this.CBSroot.getSimilar(extCB,0);
|
||||||
|
this.prevSearch=extCB;
|
||||||
|
if (foundCBSN==null){
|
||||||
|
//System.out.println("Not Found!");
|
||||||
|
this.prevResultCB=null;
|
||||||
|
this.prevResultId=-1;
|
||||||
|
this.prevResultContains=false;
|
||||||
|
} else {
|
||||||
|
this.prevResultCB=foundCBSN.getChocoBar();
|
||||||
|
//System.out.println("Found:");
|
||||||
|
//this.prevResultCB.display();
|
||||||
|
this.prevResultId=foundCBSN.getId();
|
||||||
|
this.prevResultContains=true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean contains(Vertice vCB){
|
||||||
|
ChocoBar extCB=(ChocoBar)vCB;
|
||||||
|
if (prevSearch==extCB){
|
||||||
|
// we already made something about this
|
||||||
|
//System.out.println("Using prev value");
|
||||||
|
return this.prevResultContains;
|
||||||
|
} else {
|
||||||
|
this.updateSearchValues(extCB);
|
||||||
|
return this.prevResultContains;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Vertice getSimilar(Vertice vCB){
|
||||||
|
ChocoBar extCB=(ChocoBar)vCB;
|
||||||
|
if (prevSearch==extCB){
|
||||||
|
// we already made something about this
|
||||||
|
//System.out.println("Using prev value");
|
||||||
|
return (Vertice)this.prevResultCB;
|
||||||
|
} else {
|
||||||
|
this.updateSearchValues(extCB);
|
||||||
|
return (Vertice)this.prevResultCB;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void buildAssoc(){
|
||||||
|
System.out.println("Building assoc for "+this.size);
|
||||||
|
Vector newAssoc=new Vector(this.size+1);
|
||||||
|
synchronized(newAssoc){
|
||||||
|
for (int i=0;i<this.size;i++){newAssoc.add(null); }
|
||||||
|
LinkedList fifo=new LinkedList();
|
||||||
|
fifo.addFirst(this.CBSroot);
|
||||||
|
ChocoBarSetNode curCBSN=null;
|
||||||
|
ChocoBarSetNode nextCBSN=null;
|
||||||
|
while(fifo.size()>0){
|
||||||
|
curCBSN=(ChocoBarSetNode)fifo.removeFirst();
|
||||||
|
if (curCBSN.getId()<0){
|
||||||
|
// content of CBSN is not initialized
|
||||||
|
} else {
|
||||||
|
newAssoc.setElementAt(curCBSN,curCBSN.getId());
|
||||||
|
}
|
||||||
|
Collection c=curCBSN.getSubTree().values();
|
||||||
|
Iterator i=c.iterator();
|
||||||
|
while(i.hasNext()){
|
||||||
|
nextCBSN=(ChocoBarSetNode)i.next();
|
||||||
|
fifo.addFirst(nextCBSN);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.assoc=newAssoc;
|
||||||
|
this.assocTainted=false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Vertice elementAt(int eIdx){
|
||||||
|
if (this.assocTainted){
|
||||||
|
//tout reconstruire
|
||||||
|
this.buildAssoc();
|
||||||
|
return this.elementAt(eIdx);
|
||||||
|
} else {
|
||||||
|
// renvoyer l'element eIdx de this.assoc
|
||||||
|
ChocoBarSetNode cbsn=(ChocoBarSetNode)this.assoc.elementAt(eIdx);
|
||||||
|
return cbsn.getChocoBar();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
BIN
src/chocobar/bpl/ChocoBarSetNode.class
Normal file
BIN
src/chocobar/bpl/ChocoBarSetNode.class
Normal file
Binary file not shown.
59
src/chocobar/bpl/ChocoBarSetNode.java
Normal file
59
src/chocobar/bpl/ChocoBarSetNode.java
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
package chocobar.bpl;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
public class ChocoBarSetNode {
|
||||||
|
private ChocoBar chocobar;
|
||||||
|
private int id;
|
||||||
|
private HashMap subtree;
|
||||||
|
|
||||||
|
public ChocoBarSetNode(){
|
||||||
|
this.chocobar=null;
|
||||||
|
this.id=-1;
|
||||||
|
this.subtree=new HashMap();
|
||||||
|
}
|
||||||
|
public ChocoBarSetNode add(ChocoBar extCB,int pos,int nid){
|
||||||
|
if (pos==extCB.brkPtLst.size()){
|
||||||
|
//ca se passe dans l'etat courant
|
||||||
|
this.id=nid;
|
||||||
|
this.chocobar=extCB;
|
||||||
|
return this;
|
||||||
|
} else {
|
||||||
|
//ca se passe dans le fils..
|
||||||
|
IntPoint bp=(IntPoint)extCB.brkPtLst.elementAt(pos);
|
||||||
|
if (this.subtree.containsKey(bp)){
|
||||||
|
ChocoBarSetNode subnode=(ChocoBarSetNode)this.subtree.get(bp);
|
||||||
|
return subnode.add(extCB,pos+1,nid);
|
||||||
|
} else {
|
||||||
|
ChocoBarSetNode ncbs=new ChocoBarSetNode();
|
||||||
|
this.subtree.put(bp,ncbs);
|
||||||
|
return ncbs.add(extCB,pos+1,nid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public ChocoBarSetNode getSimilar(ChocoBar extCB, int pos){
|
||||||
|
if (pos==extCB.brkPtLst.size()){
|
||||||
|
//c'est l'état courant
|
||||||
|
if (this.chocobar==null){
|
||||||
|
return null;
|
||||||
|
} else {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
//ca se passe dans le fils..
|
||||||
|
IntPoint bp=(IntPoint)extCB.brkPtLst.elementAt(pos);
|
||||||
|
if (this.subtree.containsKey(bp)){
|
||||||
|
ChocoBarSetNode subnode=(ChocoBarSetNode)this.subtree.get(bp);
|
||||||
|
return subnode.getSimilar(extCB,pos+1);
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(int nid){ this.id=nid; }
|
||||||
|
public int getId(){ return this.id; }
|
||||||
|
public ChocoBar getChocoBar(){ return this.chocobar; }
|
||||||
|
public HashMap getSubTree(){ return this.subtree; }
|
||||||
|
}
|
BIN
src/chocobar/bpl/ChocoGraph.class
Normal file
BIN
src/chocobar/bpl/ChocoGraph.class
Normal file
Binary file not shown.
156
src/chocobar/bpl/ChocoGraph.java
Normal file
156
src/chocobar/bpl/ChocoGraph.java
Normal file
|
@ -0,0 +1,156 @@
|
||||||
|
package chocobar.bpl;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
import exception.*;
|
||||||
|
import chocobar.GenericChocoGraph;
|
||||||
|
import graph.GenericGraph;
|
||||||
|
import graph.Vertice;
|
||||||
|
import conf.ChocoConfig;
|
||||||
|
|
||||||
|
public class ChocoGraph implements GenericChocoGraph
|
||||||
|
{
|
||||||
|
private int width;
|
||||||
|
private int height;
|
||||||
|
Graph configGraph;
|
||||||
|
private Vertice lastExistingVertice;
|
||||||
|
private int gccount;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructeur d'un graphe de jeu de Chocobar avec les barres
|
||||||
|
* de taille (width X height)
|
||||||
|
**/
|
||||||
|
public ChocoGraph(){
|
||||||
|
this.gccount=0;
|
||||||
|
this.width=ChocoConfig.size;
|
||||||
|
this.height=ChocoConfig.height;
|
||||||
|
this.configGraph=null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui verifie s'il existe deja un ChocoBar
|
||||||
|
* de même configuration que celle passee en param
|
||||||
|
* dans cet objet
|
||||||
|
**/
|
||||||
|
private void genChocoFromPoint(ChocoBar oldCBar,int x, int y){
|
||||||
|
// creer une config : ajouter breakpoint (x, y)
|
||||||
|
ChocoBar currentCBar=new ChocoBar(oldCBar);
|
||||||
|
try {
|
||||||
|
try{
|
||||||
|
currentCBar.addBreakPoint(x, y);
|
||||||
|
} catch (OutOfRangeBreakPointException e1){ return; }
|
||||||
|
} catch (AlreadyBrokenPointException e2){
|
||||||
|
// on doit pas y arriver ici
|
||||||
|
}
|
||||||
|
//System.out.print("Does the following bar exists? ");
|
||||||
|
ChocoBarSet cbs=(ChocoBarSet)this.configGraph.getVerticeModel();
|
||||||
|
int fatherIdx=this.configGraph.indexOfVertice(oldCBar);
|
||||||
|
if (cbs.contains(currentCBar)){
|
||||||
|
// on ajoute le du oldCbar (pere) vers
|
||||||
|
// cette config (fils)
|
||||||
|
// le pere est le dernier ajouté
|
||||||
|
int sonIdx=this.configGraph.indexOfVertice(currentCBar);
|
||||||
|
try{
|
||||||
|
this.configGraph.addEdge(fatherIdx,sonIdx);
|
||||||
|
} catch (Exception e){
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
// cette config existe deja donc finir
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
// c'est une nouvelle config
|
||||||
|
// ajouter cette config au graphe,
|
||||||
|
// par defaut, nouveaux arcs sont aussi rajoutes
|
||||||
|
this.configGraph.addVertice(currentCBar);
|
||||||
|
int sonIdx=this.configGraph.indexOfVertice(currentCBar);
|
||||||
|
if (currentCBar.isFinalConfig()){
|
||||||
|
this.configGraph.setFinalState(sonIdx);
|
||||||
|
}
|
||||||
|
constructArcsFromFatherAncestorsTo(fatherIdx,sonIdx);
|
||||||
|
/*
|
||||||
|
try {
|
||||||
|
this.constructArcsTo(currentCBar);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
// trouver des arcs vers ce nouveau vertice
|
||||||
|
//int verticeId=this.configGraph.indexOfVertice(currentCBar);
|
||||||
|
|
||||||
|
// generer les config suivantes a partir d'une liste
|
||||||
|
// des points frontieres
|
||||||
|
Vector frontline=currentCBar.getBreakLine();
|
||||||
|
Iterator i=frontline.iterator();
|
||||||
|
while (i.hasNext()){
|
||||||
|
IntPoint currentP=(IntPoint)i.next();
|
||||||
|
genChocoFromPoint(currentCBar,(int)currentP.getX(),(int)currentP.getY());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generation du graphe de jeu : creation de la racine
|
||||||
|
**/
|
||||||
|
public GenericGraph genChoco(boolean isList){
|
||||||
|
// creation du noeud racine avec une barre toute neuve
|
||||||
|
ChocoBar rootCBar=new ChocoBar(this.width,this.height);
|
||||||
|
System.out.println("Root ChocoBar:");
|
||||||
|
rootCBar.display();
|
||||||
|
this.configGraph=new Graph(new ChocoBarSet(),isList);
|
||||||
|
this.configGraph.setInitialState(0);
|
||||||
|
//System.out.println(this.configGraph.toDot());
|
||||||
|
this.configGraph.addVertice(rootCBar);
|
||||||
|
|
||||||
|
// on génère le graphe a partir de la racine
|
||||||
|
this.genChocoFromPoint(rootCBar,this.width-1,this.height-1);
|
||||||
|
|
||||||
|
return this.configGraph;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction de generation d'arc des sommets ascendants vers
|
||||||
|
* un nouveau sommet sonIdx
|
||||||
|
**/
|
||||||
|
public void constructArcsFromFatherAncestorsTo(int fatherIdx,int sonIdx){
|
||||||
|
ChocoBar fatherCB=(ChocoBar)this.configGraph.getVertice(fatherIdx);
|
||||||
|
ChocoBar sonCB=(ChocoBar)this.configGraph.getVertice(sonIdx);
|
||||||
|
Collection grandFathersIdx=null;
|
||||||
|
// verifier si c'est bien un successeur
|
||||||
|
if (sonCB.isNextOf(fatherCB)){
|
||||||
|
try{ this.configGraph.addEdge(fatherIdx,sonIdx);}
|
||||||
|
catch (Exception e){ e.printStackTrace(); System.exit(-10); }
|
||||||
|
try{ grandFathersIdx=this.configGraph.getIncident(fatherIdx);}
|
||||||
|
catch (Exception e){ e.printStackTrace(); System.exit(-10); }
|
||||||
|
if (grandFathersIdx!=null){ //condition d'arret
|
||||||
|
Iterator i=grandFathersIdx.iterator();
|
||||||
|
while(i.hasNext()){
|
||||||
|
int grandFatherIdx=((Integer)i.next()).intValue();
|
||||||
|
constructArcsFromFatherAncestorsTo(grandFatherIdx,sonIdx);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui renvoie le graph de cet objet
|
||||||
|
**/
|
||||||
|
public Graph getGraph(){
|
||||||
|
return (this.configGraph);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui affiche tous les ChocoBar dans ce graphe
|
||||||
|
**/
|
||||||
|
public void displayAll(){
|
||||||
|
int cpt=0;
|
||||||
|
ChocoBarSet cbs=(ChocoBarSet)this.configGraph.getVerticeModel();
|
||||||
|
for (int i=0;i<cbs.size();i++){
|
||||||
|
System.out.println("Vertice no : "+cpt);
|
||||||
|
cpt++;
|
||||||
|
ChocoBar cb=(ChocoBar)cbs.elementAt(i);
|
||||||
|
cb.display();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
BIN
src/chocobar/bpl/EdgeListModel.class
Normal file
BIN
src/chocobar/bpl/EdgeListModel.class
Normal file
Binary file not shown.
248
src/chocobar/bpl/EdgeListModel.java
Normal file
248
src/chocobar/bpl/EdgeListModel.java
Normal file
|
@ -0,0 +1,248 @@
|
||||||
|
package chocobar.bpl;
|
||||||
|
|
||||||
|
import java.util.*; // listes
|
||||||
|
|
||||||
|
import exception.*;
|
||||||
|
|
||||||
|
class EdgeListModel implements EdgeModel {
|
||||||
|
private HashMap[] adjacent;
|
||||||
|
private HashMap[] incident;
|
||||||
|
private int cardV;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructeur par defaut
|
||||||
|
**/
|
||||||
|
public EdgeListModel(){
|
||||||
|
this(10);
|
||||||
|
this.cardV=0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructeur d'un modele de graphe avec nbVertices sommets
|
||||||
|
**/
|
||||||
|
public EdgeListModel(int nbVertices){
|
||||||
|
if (nbVertices>=0){
|
||||||
|
this.cardV=nbVertices;
|
||||||
|
this.adjacent=new HashMap[this.cardV+(this.cardV/3)];
|
||||||
|
this.incident=new HashMap[this.cardV+(this.cardV/3)];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui renvoie le nombre de sommets de cette liste
|
||||||
|
* d'adjacence
|
||||||
|
**/
|
||||||
|
public int getCardV(){
|
||||||
|
return this.cardV;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Fonction qui réinitialise à la taille donnée.
|
||||||
|
*/
|
||||||
|
public int setSize(int size)
|
||||||
|
{
|
||||||
|
cardV=size;
|
||||||
|
adjacent=new HashMap[this.cardV+(this.cardV/3)];
|
||||||
|
incident=new HashMap[this.cardV+(this.cardV/3)];
|
||||||
|
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui rajoute un arc de srcV vers dstV
|
||||||
|
**/
|
||||||
|
public void addEdge(int srcV,int dstV)
|
||||||
|
throws OutOfRangeVerticeException
|
||||||
|
{
|
||||||
|
// on vérifie que les arcs ajoutés joignent des
|
||||||
|
// sommets existants dans le graphe
|
||||||
|
if ((srcV<0) ||(dstV<0)
|
||||||
|
||(srcV>=cardV) || (dstV>=cardV)) {
|
||||||
|
throw new OutOfRangeVerticeException();
|
||||||
|
} else {
|
||||||
|
if (this.adjacent[srcV]==null){
|
||||||
|
this.adjacent[srcV]=new HashMap();
|
||||||
|
}
|
||||||
|
if (this.incident[dstV]==null){
|
||||||
|
this.incident[dstV]=new HashMap();
|
||||||
|
}
|
||||||
|
HashMap srcList=this.adjacent[srcV];
|
||||||
|
HashMap dstList=this.incident[dstV];
|
||||||
|
Integer d=new Integer(dstV);
|
||||||
|
Integer s=new Integer(srcV);
|
||||||
|
if (!srcList.containsKey(d)){srcList.put(d,null);}
|
||||||
|
if (!dstList.containsKey(s)){dstList.put(s,null);}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui verifie s'il existe un arc
|
||||||
|
* de srcV vers dstV
|
||||||
|
**/
|
||||||
|
public boolean isEdge(int srcV,int dstV){
|
||||||
|
if (this.adjacent[srcV]==null){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
//works too with incident...
|
||||||
|
HashMap srcAdj=this.adjacent[srcV];
|
||||||
|
if (srcAdj.containsKey(new Integer(dstV))){ return true; }
|
||||||
|
else { return false; }
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui verifie si les sommets adjacents a src sont
|
||||||
|
* uniquement les sommets contenus dans le tableau dst
|
||||||
|
* Si non alors elle renvoie -1 et si oui elle renvoie le premier
|
||||||
|
* sommet dst adjacent a src
|
||||||
|
**/
|
||||||
|
public int withOnlyEdges(int src, Vector dst){
|
||||||
|
HashMap srcAdj=this.adjacent[src];
|
||||||
|
int taille=srcAdj.size();
|
||||||
|
int adj=-1;
|
||||||
|
Object[] adjacents=srcAdj.keySet().toArray();
|
||||||
|
|
||||||
|
if (taille>dst.size()){
|
||||||
|
//y a des sommets qui ne sont pas dans le tableau
|
||||||
|
return -1;
|
||||||
|
} else {
|
||||||
|
for (int i=0; i<taille; i++){
|
||||||
|
if (!dst.contains(adjacents[i])){
|
||||||
|
return -1;
|
||||||
|
} else {
|
||||||
|
if (adj==-1){
|
||||||
|
adj=((Integer)adjacents[i]).intValue();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return adj;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui renvoie la source (sommet racine) de ce graphe
|
||||||
|
**/
|
||||||
|
public int getSourceVertice(){
|
||||||
|
int i = -1;
|
||||||
|
if ((this.cardV != 0)&&(this.incident != null)){
|
||||||
|
for (int j=0; j<this.cardV; j++){
|
||||||
|
if (this.incident[j]==null){
|
||||||
|
i=j;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui renvoie la puis (sommet final) de ce graphe
|
||||||
|
* ou -1 s'il n'existe pas
|
||||||
|
**/
|
||||||
|
public int getFinalVertice(){
|
||||||
|
int i = -1;
|
||||||
|
if ((this.cardV != 0)&&(this.adjacent != null)){
|
||||||
|
for (int j=0; j<this.cardV; j++){
|
||||||
|
if (this.adjacent[j]==null){
|
||||||
|
i=j;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui renvoie la liste d'adjacence du sommet srcV
|
||||||
|
* ou -1 s'il n'existe pas
|
||||||
|
**/
|
||||||
|
public Collection getAdjacent(int srcV){
|
||||||
|
HashMap adj= this.adjacent[srcV];
|
||||||
|
if (adj==null){ return null; }
|
||||||
|
else { return adj.keySet(); }
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui renvoie le premier sommet adjacent a srcV
|
||||||
|
**/
|
||||||
|
public int getFirstAdjacentVertice(int srcV){
|
||||||
|
Iterator i=this.adjacent[srcV].keySet().iterator();
|
||||||
|
return ((Integer)i.next()).intValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui renvoie la liste de sommets ayant un arc vers
|
||||||
|
* sommet dstV
|
||||||
|
**/
|
||||||
|
public Collection getIncident(int dstV){
|
||||||
|
HashMap inc= this.incident[dstV];
|
||||||
|
if (inc==null){ return null; }
|
||||||
|
else { return inc.keySet(); }
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui enleve tous les arcs du graphe
|
||||||
|
**/
|
||||||
|
public void clear(){
|
||||||
|
for (int i=0; i<cardV; i++){
|
||||||
|
this.adjacent[i].clear();
|
||||||
|
this.incident[i].clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui rajoute tous les arcs possibles du graphe
|
||||||
|
**/
|
||||||
|
public void fill(){
|
||||||
|
for (int src=0; src<cardV; src++){
|
||||||
|
for (int dst=0; dst<cardV; dst++){
|
||||||
|
if (src==dst) {
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
|
if (this.adjacent[src]==null){
|
||||||
|
this.adjacent[src]=new HashMap();
|
||||||
|
}
|
||||||
|
if (this.incident[dst]==null){
|
||||||
|
this.adjacent[dst]=new HashMap();
|
||||||
|
}
|
||||||
|
HashMap srcList=this.adjacent[src];
|
||||||
|
HashMap dstList=this.incident[dst];
|
||||||
|
srcList.put(new Integer(dst),null);
|
||||||
|
dstList.put(new Integer(src),null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui rajoute un vertice a la fin de table d'adjacence
|
||||||
|
* Liste d'adjacence de ce nouveau vertice est encore VIDE
|
||||||
|
**/
|
||||||
|
public void addVertice(){
|
||||||
|
// Verify that we have enough free space
|
||||||
|
// and that 4*cardV < 3*adjlength <=> cardV < 3/4 * adj.length
|
||||||
|
if ((4*this.cardV) > (3*this.adjacent.length)){
|
||||||
|
System.out.println("ADDVERTICE: duplicating size: "+ this.cardV+"/"+this.adjacent.length+"...");
|
||||||
|
int extra=2*this.adjacent.length;
|
||||||
|
HashMap[] adjCopy = new HashMap[this.adjacent.length + extra];
|
||||||
|
HashMap[] incCopy = new HashMap[this.adjacent.length + extra];
|
||||||
|
System.arraycopy(this.adjacent,0,adjCopy,0,this.adjacent.length);
|
||||||
|
System.arraycopy(this.incident,0,incCopy,0,this.incident.length);
|
||||||
|
this.adjacent=adjCopy;
|
||||||
|
this.incident=incCopy;
|
||||||
|
System.out.println("ADDVERTICE: duplicating done.");
|
||||||
|
}
|
||||||
|
this.cardV++;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void removeVerticeAt(int index)
|
||||||
|
throws OutOfRangeVerticeException{
|
||||||
|
//TODO: écrire!!!
|
||||||
|
/*
|
||||||
|
if (index >= this.cardV){
|
||||||
|
throw (new OutOfRangeVerticeException());
|
||||||
|
} else {
|
||||||
|
|
||||||
|
}*/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
BIN
src/chocobar/bpl/EdgeMatrixModel.class
Normal file
BIN
src/chocobar/bpl/EdgeMatrixModel.class
Normal file
Binary file not shown.
248
src/chocobar/bpl/EdgeMatrixModel.java
Normal file
248
src/chocobar/bpl/EdgeMatrixModel.java
Normal file
|
@ -0,0 +1,248 @@
|
||||||
|
package chocobar.bpl;
|
||||||
|
|
||||||
|
import java.util.*; // listes
|
||||||
|
|
||||||
|
import exception.*;
|
||||||
|
|
||||||
|
public class EdgeMatrixModel implements EdgeModel {
|
||||||
|
private int cardV;
|
||||||
|
private boolean[][] adjacent;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default constructor
|
||||||
|
**/
|
||||||
|
public EdgeMatrixModel() {
|
||||||
|
this(10);
|
||||||
|
this.cardV=0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor with card (number of vertices) as a parameter
|
||||||
|
**/
|
||||||
|
public EdgeMatrixModel(int card) {
|
||||||
|
this.cardV=card;
|
||||||
|
this.adjacent=new boolean[this.cardV][this.cardV];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui renvoie la dimension de cette matrice d'adjance
|
||||||
|
**/
|
||||||
|
public int getCardV(){
|
||||||
|
return this.cardV;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Fonction qui réinitialise à la taille donnée.
|
||||||
|
*/
|
||||||
|
public int setSize(int size)
|
||||||
|
{
|
||||||
|
cardV=size;
|
||||||
|
adjacent=new boolean[size][size];
|
||||||
|
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui rajoute un arc partant du sommet srcV
|
||||||
|
* vers sommet dstV
|
||||||
|
**/
|
||||||
|
public void addEdge(int srcV,int dstV)
|
||||||
|
throws OutOfRangeVerticeException
|
||||||
|
// plustard qu'on parse un graphe et rajoute des arcs sans
|
||||||
|
// passer par l'initialisation, il faut detecter le cas qu'on
|
||||||
|
// rajoute un arc n'importe quoi
|
||||||
|
{
|
||||||
|
if ((srcV<0) ||(dstV<0)
|
||||||
|
||(srcV>=cardV) || (dstV>=cardV)) {
|
||||||
|
throw new OutOfRangeVerticeException();
|
||||||
|
}
|
||||||
|
adjacent[srcV][dstV]=true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui verifie l'existence d'un arc du sommet srcV
|
||||||
|
* vers sommet dstV
|
||||||
|
**/
|
||||||
|
public boolean isEdge(int srcV,int dstV){
|
||||||
|
return adjacent[srcV][dstV];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui verifie si les sommets adjacents a src sont
|
||||||
|
* uniquement les sommets contenus dans le tableau dst
|
||||||
|
* Si non alors elle renvoie -1 et si oui elle renvoie le premier
|
||||||
|
* sommet dst adjacent a src
|
||||||
|
**/
|
||||||
|
public int withOnlyEdges(int srcV, Vector dstV){
|
||||||
|
int j=0;
|
||||||
|
int adj=-1;
|
||||||
|
|
||||||
|
for (int i=0; i<cardV; i++){
|
||||||
|
if (adjacent[srcV][i]){
|
||||||
|
if (!dstV.contains(new Integer(i))){
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (adj==-1)
|
||||||
|
adj=i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return adj;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui renvoie la source (sommet racine) de ce graphe
|
||||||
|
* ou -1 s'il n'existe pas
|
||||||
|
**/
|
||||||
|
public int getSourceVertice(){
|
||||||
|
int i = -1;
|
||||||
|
|
||||||
|
if (this.cardV != 0){
|
||||||
|
i=0;
|
||||||
|
for (int j=0; j<this.cardV; j++){
|
||||||
|
if (this.adjacent[j][i]){
|
||||||
|
i=j;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (int j=0; j<this.cardV; j++){
|
||||||
|
if (!this.adjacent[i][j]){
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (int j=0; j<this.cardV; j++){
|
||||||
|
if (this.adjacent[j][i]){
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui renvoie la puis (sommet final) de ce graphe
|
||||||
|
* ou -1 s'il n'existe pas
|
||||||
|
**/
|
||||||
|
public int getFinalVertice(){
|
||||||
|
int i = -1;
|
||||||
|
|
||||||
|
if (this.cardV != 0){
|
||||||
|
i=0;
|
||||||
|
for (int j=i+1; j<this.cardV; j++){
|
||||||
|
if (this.adjacent[i][j]){
|
||||||
|
i=j;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (int j=0; j<this.cardV; j++){
|
||||||
|
if (this.adjacent[i][j]){
|
||||||
|
return -1; }
|
||||||
|
}
|
||||||
|
for (int j=0; j<this.cardV; j++){
|
||||||
|
if (!this.adjacent[j][i]){
|
||||||
|
return -1; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui renvoie une liste d'adjacence du sommet srcV
|
||||||
|
**/
|
||||||
|
public Collection getAdjacent(int srcV){
|
||||||
|
LinkedList res=new LinkedList();
|
||||||
|
for (int i=0; i<cardV; i++){
|
||||||
|
if (adjacent[srcV][i])
|
||||||
|
res.add(new Integer(i));
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui renvoie la liste d'incidence du sommet dstV
|
||||||
|
**/
|
||||||
|
public Collection getIncident(int dstV){
|
||||||
|
Vector incident=new Vector();
|
||||||
|
for (int i=0; i<cardV; i++){
|
||||||
|
if (isEdge(i, dstV))
|
||||||
|
incident.add(new Integer(i));
|
||||||
|
}
|
||||||
|
return incident;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui efface tous les arcs du graphe
|
||||||
|
**/
|
||||||
|
public void clear(){
|
||||||
|
// we remove edges between every vertice
|
||||||
|
for (int i=0; i<this.cardV;i++){
|
||||||
|
for (int j=0;j<this.cardV;j++){
|
||||||
|
this.adjacent[i][j]=false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui cree tous les arcs possibles du graphe
|
||||||
|
**/
|
||||||
|
public void fill(){
|
||||||
|
// we add edges between every vertice
|
||||||
|
for (int i=0; i<this.cardV;i++){
|
||||||
|
for (int j=0;j<this.cardV;j++){
|
||||||
|
this.adjacent[i][j]=true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// but a vertice cannot have an edge to itself
|
||||||
|
for (int i=0;i<this.cardV;i++){
|
||||||
|
this.adjacent[i][i]=false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui rajoute un vertice (sommet) a la liste des arcs du graphe
|
||||||
|
* les arcs sont encore VIDE
|
||||||
|
**/
|
||||||
|
public void addVertice(){
|
||||||
|
// Verify that we have enough free space
|
||||||
|
// and that 4*cardV < 3*adjlength <=> cardV < 3/4 * adj.length
|
||||||
|
if ((4*this.cardV) > (3*this.adjacent.length)){
|
||||||
|
int nuvolen=this.adjacent.length * 2;
|
||||||
|
boolean[][] copie = new boolean[nuvolen][nuvolen];
|
||||||
|
for (int i=0; i<this.cardV; i++){
|
||||||
|
// on copie juste les anciennes valeurs
|
||||||
|
// les nouvelles cases etant initialisee a 0
|
||||||
|
for (int j=0; j<this.cardV; j++){
|
||||||
|
copie[i][j]=adjacent[i][j];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.adjacent=copie;
|
||||||
|
}
|
||||||
|
this.cardV++;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void removeVerticeAt(int rmIdx)
|
||||||
|
throws OutOfRangeVerticeException{
|
||||||
|
if ((rmIdx<0) || (rmIdx>=this.cardV)){
|
||||||
|
throw new OutOfRangeVerticeException();
|
||||||
|
}
|
||||||
|
// create a new array (cardV-1) * (cardV-1)
|
||||||
|
boolean[][] neoAdj= new boolean[this.cardV-1][this.cardV-1];
|
||||||
|
|
||||||
|
// fill the new array zith the values of the previous
|
||||||
|
// adjacency matrix
|
||||||
|
int ni=0;
|
||||||
|
int nj=0;
|
||||||
|
|
||||||
|
for (int i=0;i<this.cardV;i++){
|
||||||
|
for (int j=0;j<this.cardV;j++){
|
||||||
|
if ((i!=rmIdx) || (j!=rmIdx)){
|
||||||
|
if (i<rmIdx){ni=i; }
|
||||||
|
if (i>rmIdx){ni=i-1; }
|
||||||
|
if (j<rmIdx){nj=j; }
|
||||||
|
if (j>rmIdx){nj=j-1; }
|
||||||
|
neoAdj[ni][nj]=this.adjacent[i][j];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// associate the new adjacency matrix to the class
|
||||||
|
this.cardV=this.cardV-1;
|
||||||
|
this.adjacent=neoAdj;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
BIN
src/chocobar/bpl/EdgeModel.class
Normal file
BIN
src/chocobar/bpl/EdgeModel.class
Normal file
Binary file not shown.
24
src/chocobar/bpl/EdgeModel.java
Normal file
24
src/chocobar/bpl/EdgeModel.java
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
package chocobar.bpl;
|
||||||
|
|
||||||
|
import java.util.Collection; // listes
|
||||||
|
import java.util.Vector;
|
||||||
|
|
||||||
|
import exception.*;
|
||||||
|
|
||||||
|
public interface EdgeModel {
|
||||||
|
public int getCardV();
|
||||||
|
public void addEdge(int srcV,int dstV) throws OutOfRangeVerticeException;
|
||||||
|
public boolean isEdge(int srcV,int dstV);
|
||||||
|
public int setSize(int size);
|
||||||
|
public int withOnlyEdges(int srcV, Vector dstV);
|
||||||
|
public Collection getAdjacent(int srcV);
|
||||||
|
public Collection getIncident(int dstV);
|
||||||
|
public int getSourceVertice(); //racine du graphe
|
||||||
|
public int getFinalVertice(); //sommet final (un seul) du graphe
|
||||||
|
public void clear(); //no edges
|
||||||
|
public void fill(); //edges to everywhere
|
||||||
|
|
||||||
|
public void addVertice(); // add vertice at the end
|
||||||
|
public void removeVerticeAt(int index) throws OutOfRangeVerticeException;
|
||||||
|
}
|
||||||
|
|
BIN
src/chocobar/bpl/Graph.class
Normal file
BIN
src/chocobar/bpl/Graph.class
Normal file
Binary file not shown.
410
src/chocobar/bpl/Graph.java
Normal file
410
src/chocobar/bpl/Graph.java
Normal file
|
@ -0,0 +1,410 @@
|
||||||
|
package chocobar.bpl;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
import java.util.*; // listes
|
||||||
|
import java.text.*; // streamtokenizer
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
|
||||||
|
import exception.*;
|
||||||
|
import graph.GenericGraph;
|
||||||
|
import graph.Vertice;
|
||||||
|
import conf.ChocoConfig;
|
||||||
|
|
||||||
|
public class Graph implements GenericGraph {
|
||||||
|
private EdgeModel edgeModel;
|
||||||
|
private boolean isListModel;
|
||||||
|
private String name;
|
||||||
|
private VerticeSet verticeModel;
|
||||||
|
private int initialState;
|
||||||
|
private int finalState;
|
||||||
|
//private Vector verticeTab;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructeur par defaut. On ne l'utilisera que lorsque l'on va
|
||||||
|
* initialiser via un fichier, on peut donc faire quelque consessions
|
||||||
|
**/
|
||||||
|
public Graph()
|
||||||
|
{
|
||||||
|
this.verticeModel=null;
|
||||||
|
this.name=null;
|
||||||
|
this.isListModel=false;
|
||||||
|
this.initialState=-1;
|
||||||
|
this.finalState=-1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Graph(VerticeSet vmodel){
|
||||||
|
this.verticeModel=vmodel;
|
||||||
|
this.name=null;
|
||||||
|
this.isListModel=false;
|
||||||
|
this.initialState=-1;
|
||||||
|
this.finalState=-1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructeur d'un graphe non-initalise avec une liste
|
||||||
|
* d'adjacence
|
||||||
|
**/
|
||||||
|
public Graph(VerticeSet vmodel,boolean isList){
|
||||||
|
this(vmodel);
|
||||||
|
this.isListModel=isList;
|
||||||
|
if (isList){
|
||||||
|
this.edgeModel=new EdgeListModel();
|
||||||
|
} else {
|
||||||
|
this.edgeModel=new EdgeMatrixModel();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructeur d'un graphe non-initialise avec cardV sommets
|
||||||
|
**/
|
||||||
|
public Graph (VerticeSet vmodel,boolean isList, int cardV){
|
||||||
|
this(vmodel);
|
||||||
|
this.isListModel=isList;
|
||||||
|
if (isList){
|
||||||
|
this.edgeModel=new EdgeListModel(cardV);
|
||||||
|
} else {
|
||||||
|
this.edgeModel=new EdgeMatrixModel(cardV);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructeur d'un graphe initialise a partir
|
||||||
|
* du fichier filename
|
||||||
|
**/
|
||||||
|
public Graph(VerticeSet vmodel,boolean isList, String filename)
|
||||||
|
throws ParseException, IOException, FileNotFoundException
|
||||||
|
{
|
||||||
|
this(vmodel,isList,0);
|
||||||
|
this.loadFromFile(filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Initialize the Graph.
|
||||||
|
*/
|
||||||
|
public int setSize(int size)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
Class cEM = Class.forName(ChocoConfig.edgeModel);
|
||||||
|
this.edgeModel = (EdgeModel) cEM.newInstance();
|
||||||
|
this.edgeModel.setSize(size);
|
||||||
|
} catch (Exception e) {
|
||||||
|
this.edgeModel = null;
|
||||||
|
e.printStackTrace();
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui met la valeur du sommet source du graphe
|
||||||
|
**/
|
||||||
|
public void setInitialState(int init){
|
||||||
|
this.initialState=init;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui met la valeur du sommet puis (final) du graphe
|
||||||
|
**/
|
||||||
|
public void setFinalState(int init){
|
||||||
|
this.finalState=init;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui rajoute un vertice passe en parametre
|
||||||
|
* dans le vecteur (collection) de vertices de ce graphe
|
||||||
|
**/
|
||||||
|
|
||||||
|
public void addVertice(Vertice e){
|
||||||
|
this.verticeModel.add(e);
|
||||||
|
//int idv2=this.verticeModel.getIdOf(e);
|
||||||
|
//System.out.println("Added new vertice "+idv+" / "+idv2);
|
||||||
|
// apply modification on the edge model
|
||||||
|
this.edgeModel.addVertice();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui rajoute un arc de x vers y
|
||||||
|
**/
|
||||||
|
public void addEdge(int x, int y) throws OutOfRangeVerticeException {
|
||||||
|
this.edgeModel.addEdge(x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui renvoie l'indice du vertice passe
|
||||||
|
* en parametre dans le vecteur des vertices de ce graphe
|
||||||
|
**/
|
||||||
|
public int indexOfVertice(Vertice e){
|
||||||
|
return this.verticeModel.getIdOf(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui enleve un vertice passe en parametre
|
||||||
|
* de la collection de vertices de ce graphe
|
||||||
|
**/
|
||||||
|
public void removeVertice(Vertice e)
|
||||||
|
{
|
||||||
|
int idx=this.indexOfVertice(e);
|
||||||
|
try {
|
||||||
|
this.edgeModel.removeVerticeAt(idx);
|
||||||
|
} catch (OutOfRangeVerticeException ex){
|
||||||
|
// normally, this is impossible...
|
||||||
|
ex.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui enleve un vertice a l'indice specifiee
|
||||||
|
**/
|
||||||
|
/*
|
||||||
|
public void removeVertice(int idx)
|
||||||
|
throws OutOfRangeVerticeException {
|
||||||
|
if ((idx<0) || (idx>= this.verticeTab.size())){
|
||||||
|
throw new OutOfRangeVerticeException();
|
||||||
|
}
|
||||||
|
this.verticeTab.removeElementAt(idx);
|
||||||
|
//apply modification on the edge model
|
||||||
|
this.edgeModel.removeVerticeAt(idx);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction d'initialisation du graphe a partir d'un fichier
|
||||||
|
**/
|
||||||
|
public void loadFromFile(String filename)
|
||||||
|
throws ParseException, IOException, FileNotFoundException
|
||||||
|
{
|
||||||
|
int verticeNb;
|
||||||
|
FileReader fi=new FileReader(filename);
|
||||||
|
StreamTokenizer si=new StreamTokenizer(fi);
|
||||||
|
si.eolIsSignificant(false);
|
||||||
|
si.lowerCaseMode(false);
|
||||||
|
si.parseNumbers();
|
||||||
|
|
||||||
|
/* parse the name of the graph */
|
||||||
|
si.nextToken();
|
||||||
|
if (si.ttype==StreamTokenizer.TT_WORD){
|
||||||
|
this.name=new String(si.sval);
|
||||||
|
} else {
|
||||||
|
throw new ParseException("Bad graph name",0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Parse number of vertices */
|
||||||
|
si.nextToken();
|
||||||
|
if (si.ttype==StreamTokenizer.TT_NUMBER){
|
||||||
|
verticeNb=(int)si.nval;
|
||||||
|
if (this.isListModel){
|
||||||
|
this.edgeModel=new EdgeListModel(verticeNb);
|
||||||
|
} else {
|
||||||
|
this.edgeModel=new EdgeMatrixModel(verticeNb);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
throw new ParseException("Bad graph size",0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Parse source vertice */
|
||||||
|
si.nextToken();
|
||||||
|
if (si.ttype==StreamTokenizer.TT_NUMBER){
|
||||||
|
setInitialState((int)si.nval);
|
||||||
|
} else {
|
||||||
|
throw new ParseException("Bad graph size",0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Parse final vertice */
|
||||||
|
si.nextToken();
|
||||||
|
if (si.ttype==StreamTokenizer.TT_NUMBER){
|
||||||
|
setFinalState((int)si.nval);
|
||||||
|
} else {
|
||||||
|
throw new ParseException("Bad graph size",0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Parse matrix */
|
||||||
|
for (int i=0; i<verticeNb;i++){
|
||||||
|
for (int j=0; j<verticeNb; j++){
|
||||||
|
si.nextToken();
|
||||||
|
if (si.ttype==StreamTokenizer.TT_NUMBER){
|
||||||
|
if (si.nval==0) {
|
||||||
|
// do nothing
|
||||||
|
} else {
|
||||||
|
// add an edge to the graph
|
||||||
|
try {
|
||||||
|
this.edgeModel.addEdge(i,j);
|
||||||
|
} catch (OutOfRangeVerticeException e){
|
||||||
|
throw new ParseException("Unknown vertice used",0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
throw new ParseException("Bad graph matrix",0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the number of vertices of the Graph
|
||||||
|
**/
|
||||||
|
public int getCardV(){
|
||||||
|
return this.edgeModel.getCardV();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui renvoie les sommets du graphe
|
||||||
|
**/
|
||||||
|
public VerticeSet getVerticeModel(){
|
||||||
|
return this.verticeModel;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the vertice at index vertIdx
|
||||||
|
* range verification is done by verticetab...
|
||||||
|
**/
|
||||||
|
public Vertice getVertice(int vertIdx) {
|
||||||
|
return ((Vertice)this.verticeModel.elementAt(vertIdx));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui verifie l'existence de l'arc
|
||||||
|
* du sommet srcV vers dstV
|
||||||
|
**/
|
||||||
|
public boolean isEdge(int srcV, int dstV){
|
||||||
|
return this.edgeModel.isEdge(srcV, dstV);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui renvoie l'indice du vertice racine du graphe
|
||||||
|
* ou -1 s'il n'existe pas
|
||||||
|
**/
|
||||||
|
public int getInitialState(){
|
||||||
|
return this.initialState;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui renvoie l'indice du vertice final du graphe
|
||||||
|
* ou -1 s'il n'existe pas
|
||||||
|
**/
|
||||||
|
public int getFinalState(){
|
||||||
|
return this.finalState;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui renvoie la liste d'adjacence du sommet srcV
|
||||||
|
**/
|
||||||
|
public Collection getAdjacent(int srcV)
|
||||||
|
throws OutOfRangeVerticeException
|
||||||
|
{
|
||||||
|
if ((srcV<0) || (srcV >= edgeModel.getCardV())){
|
||||||
|
throw new OutOfRangeVerticeException();
|
||||||
|
}
|
||||||
|
return this.edgeModel.getAdjacent(srcV);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui verifie si les sommets adjacents a src sont
|
||||||
|
* uniquement les sommets contenus dans le tableau dst
|
||||||
|
* Si non alors elle renvoie -1 et si oui elle renvoie le premier
|
||||||
|
* sommet dst adjacent a src
|
||||||
|
**/
|
||||||
|
public int withOnlyEdges(int src, Vector dst){
|
||||||
|
return this.edgeModel.withOnlyEdges(src, dst);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui renvoie la liste d'incidence du sommet srcV
|
||||||
|
**/
|
||||||
|
public Collection getIncident(int dstV)
|
||||||
|
throws OutOfRangeVerticeException
|
||||||
|
{
|
||||||
|
if ((dstV<0) || (dstV >= edgeModel.getCardV())){
|
||||||
|
throw new OutOfRangeVerticeException();
|
||||||
|
}
|
||||||
|
return this.edgeModel.getIncident(dstV);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui renvoie representation (sous forme de String)
|
||||||
|
* du graphe en format .txt
|
||||||
|
**/
|
||||||
|
public String toTxt(){
|
||||||
|
StringBuffer output;
|
||||||
|
if (this.verticeModel != null)
|
||||||
|
output=new StringBuffer(4*this.edgeModel.getCardV());
|
||||||
|
else
|
||||||
|
output=new StringBuffer(80);
|
||||||
|
String endl=System.getProperty("line.separator");
|
||||||
|
if ((this.name) != null){
|
||||||
|
output.append(this.name+endl);
|
||||||
|
} else {
|
||||||
|
output.append("noName"+endl);
|
||||||
|
}
|
||||||
|
if (this.edgeModel==null){
|
||||||
|
output.append("0"+endl);
|
||||||
|
} else {
|
||||||
|
int taille=this.edgeModel.getCardV();
|
||||||
|
output.append(""+taille+endl);
|
||||||
|
output.append(""+initialState+endl);
|
||||||
|
output.append(""+finalState+endl);
|
||||||
|
for (int i=0;i<taille;i++){
|
||||||
|
for (int j=0; j<taille; j++){
|
||||||
|
if (this.edgeModel.isEdge(i,j)){
|
||||||
|
output.append("1 ");
|
||||||
|
} else {
|
||||||
|
output.append("0 ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
output.append(endl);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return output.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui renvoie representation (sous forme de String)
|
||||||
|
* du graphe en format .dot
|
||||||
|
**/
|
||||||
|
public String toDot(){
|
||||||
|
StringBuffer output;
|
||||||
|
String tempName;
|
||||||
|
String endl=System.getProperty("line.separator");
|
||||||
|
|
||||||
|
if (this.name==null){
|
||||||
|
tempName="noName";
|
||||||
|
} else {
|
||||||
|
tempName=this.name;
|
||||||
|
}
|
||||||
|
output=new StringBuffer("digraph "+tempName+" {"+endl);
|
||||||
|
if (this.edgeModel==null) {
|
||||||
|
output.append("}"+endl);
|
||||||
|
} else {
|
||||||
|
output=new StringBuffer("digraph "+this.name+" {");
|
||||||
|
output=output.append(endl);
|
||||||
|
|
||||||
|
// Pour l'instant label vaut le sommet d'ou l'arc part
|
||||||
|
int taille=this.edgeModel.getCardV();
|
||||||
|
for (int i=0; i<taille; i++){
|
||||||
|
Collection adj=this.edgeModel.getAdjacent(i);
|
||||||
|
output.append(i);
|
||||||
|
output.append(" [label=");
|
||||||
|
output.append(i);
|
||||||
|
output.append("];");
|
||||||
|
output.append(endl);
|
||||||
|
//output.append(adj);
|
||||||
|
if (adj!=null){
|
||||||
|
Iterator j=adj.iterator();
|
||||||
|
while(j.hasNext()){
|
||||||
|
output.append(" ");
|
||||||
|
output.append(i);
|
||||||
|
output.append(" -> ");
|
||||||
|
output.append((Integer)j.next());
|
||||||
|
output.append(" ;");
|
||||||
|
output.append(endl);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
output=output.append("}"+endl);
|
||||||
|
}
|
||||||
|
return output.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
BIN
src/chocobar/bpl/IntPoint.class
Normal file
BIN
src/chocobar/bpl/IntPoint.class
Normal file
Binary file not shown.
67
src/chocobar/bpl/IntPoint.java
Normal file
67
src/chocobar/bpl/IntPoint.java
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
package chocobar.bpl;
|
||||||
|
|
||||||
|
public class IntPoint implements Comparable {
|
||||||
|
int x;
|
||||||
|
int y;
|
||||||
|
int hash=-1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructeur d'un IntPoint a partir de deux entiers
|
||||||
|
**/
|
||||||
|
public IntPoint(int x, int y){
|
||||||
|
this.x=x;
|
||||||
|
this.y=y;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui renvoie la valeur de x de cet objet
|
||||||
|
**/
|
||||||
|
public int getX(){
|
||||||
|
return this.x;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui renvoie la valeur de y de cet objet
|
||||||
|
**/
|
||||||
|
public int getY(){
|
||||||
|
return this.y;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui renvoie la representation de cet objet en
|
||||||
|
* String
|
||||||
|
**/
|
||||||
|
public String toString(){
|
||||||
|
return (new String(x+", "+y));
|
||||||
|
}
|
||||||
|
|
||||||
|
public int hashCode(){
|
||||||
|
// on numérote les couples (p,q) dans l'ordre des diagonales
|
||||||
|
// cf cours denombrabilité...
|
||||||
|
if (this.hash<0){
|
||||||
|
int s=this.x+this.y;
|
||||||
|
this.hash=(s)*(s+1)+this.y+this.y;
|
||||||
|
}
|
||||||
|
return this.hash;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean equals(Object o){
|
||||||
|
if(!(o instanceof IntPoint)) { return false; }
|
||||||
|
IntPoint p=(IntPoint)o;
|
||||||
|
return ((this.x==p.x)&&(this.y==p.y));
|
||||||
|
}
|
||||||
|
|
||||||
|
public int compareTo(Object o){
|
||||||
|
if(!(o instanceof IntPoint)) { throw new ClassCastException(); }
|
||||||
|
IntPoint p=(IntPoint)o;
|
||||||
|
int comp=0;
|
||||||
|
if (this.equals(p)){
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
if ((this.x<=p.x) && (this.y<=p.y)){
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
BIN
src/chocobar/bpl/VerticeSet.class
Normal file
BIN
src/chocobar/bpl/VerticeSet.class
Normal file
Binary file not shown.
13
src/chocobar/bpl/VerticeSet.java
Normal file
13
src/chocobar/bpl/VerticeSet.java
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
package chocobar.bpl;
|
||||||
|
|
||||||
|
import graph.Vertice;
|
||||||
|
|
||||||
|
public interface VerticeSet {
|
||||||
|
public int add(Vertice v);
|
||||||
|
public boolean contains(Vertice v);
|
||||||
|
public Vertice elementAt(int idx);
|
||||||
|
public int getIdOf(Vertice v);
|
||||||
|
public void remove(Vertice v);
|
||||||
|
public Vertice getSimilar(Vertice extCB);
|
||||||
|
public int size();
|
||||||
|
}
|
BIN
src/chocobar/combi/BitSet.class
Normal file
BIN
src/chocobar/combi/BitSet.class
Normal file
Binary file not shown.
79
src/chocobar/combi/BitSet.java
Normal file
79
src/chocobar/combi/BitSet.java
Normal file
|
@ -0,0 +1,79 @@
|
||||||
|
package chocobar.combi;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Classe pour faire un bitset.
|
||||||
|
*/
|
||||||
|
|
||||||
|
public final class BitSet
|
||||||
|
{
|
||||||
|
// On utilise un long, pour maximiser la place utile
|
||||||
|
// TODO - Pour l'instant on utilise qu'un seul bitfield
|
||||||
|
private long bits[];
|
||||||
|
|
||||||
|
public BitSet(long l)
|
||||||
|
{
|
||||||
|
bits = new long[1];
|
||||||
|
|
||||||
|
// Init
|
||||||
|
bits[0] = l;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BitSet(long l, long s)
|
||||||
|
{
|
||||||
|
System.out.println("BitSet("+l+","+s+")");
|
||||||
|
int size = (int)(s / 64) + 1;
|
||||||
|
|
||||||
|
bits = new long[size];
|
||||||
|
bits[0] = l;
|
||||||
|
for (int i=1; (i<size); i++) {
|
||||||
|
bits[i] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public BitSet(long[] l)
|
||||||
|
{
|
||||||
|
int size = l.length;
|
||||||
|
|
||||||
|
bits = new long[size];
|
||||||
|
|
||||||
|
for (int i=0; (i<size); i++) {
|
||||||
|
bits[i] = l[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Getter & Setter for bits
|
||||||
|
public boolean testBit(int i)
|
||||||
|
{
|
||||||
|
// sizeof(long) = 64
|
||||||
|
int n = i / 64;
|
||||||
|
int o = i % 64;
|
||||||
|
|
||||||
|
// BitMask
|
||||||
|
long m = ((long) 1) << o;
|
||||||
|
return ((bits[n] & m) == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Getter & Setter for bits
|
||||||
|
public void setBit(long i)
|
||||||
|
{
|
||||||
|
// sizeof(long) = 64
|
||||||
|
long n = i / 64;
|
||||||
|
long o = i % 64;
|
||||||
|
|
||||||
|
// BitMask
|
||||||
|
long m = ((long) 1) << o;
|
||||||
|
bits[(int)n] |= m;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Getter & Setter for bits
|
||||||
|
public void clearBit(long i)
|
||||||
|
{
|
||||||
|
// sizeof(long) = 64
|
||||||
|
long n = i / 64;
|
||||||
|
long o = i % 64;
|
||||||
|
|
||||||
|
// BitMask
|
||||||
|
long m = ((long) 1) << o;
|
||||||
|
bits[(int)n] &= ~m;
|
||||||
|
}
|
||||||
|
}
|
BIN
src/chocobar/combi/ChocoBar.class
Normal file
BIN
src/chocobar/combi/ChocoBar.class
Normal file
Binary file not shown.
81
src/chocobar/combi/ChocoBar.java
Normal file
81
src/chocobar/combi/ChocoBar.java
Normal file
|
@ -0,0 +1,81 @@
|
||||||
|
package chocobar.combi;
|
||||||
|
|
||||||
|
/** class Abstraite pour les ChocoBars.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import graph.Vertice;
|
||||||
|
|
||||||
|
abstract class ChocoBar implements Vertice {
|
||||||
|
/* On utilise des variables statiques car elles sont
|
||||||
|
* forcément partagées par tous les ChocoBar
|
||||||
|
*/
|
||||||
|
protected static int size;
|
||||||
|
protected static int height;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Affichage de la barre de choco en graphique.
|
||||||
|
**/
|
||||||
|
public String toMap()
|
||||||
|
{
|
||||||
|
String s = "";
|
||||||
|
for (int j=0; (j<height); j++) {
|
||||||
|
for (int i=0; (i<size); i++) {
|
||||||
|
s += (isBroken(i,j) ? "_" : "X");
|
||||||
|
}
|
||||||
|
s += "\n";
|
||||||
|
}
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Affichage de la barre de choco en ligne.
|
||||||
|
**/
|
||||||
|
public abstract String toLine();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Méthode par défaut
|
||||||
|
*/
|
||||||
|
public String toString()
|
||||||
|
{
|
||||||
|
return toLine();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Vérifie si le carre (x, y) est déjà mangé.
|
||||||
|
**/
|
||||||
|
protected abstract boolean isBroken(int cX, int cY);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Comparaison de barres.
|
||||||
|
**/
|
||||||
|
public abstract boolean equals(ChocoBar comp);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Recherche si l'on peut être un fils de la ChocoBar.
|
||||||
|
*/
|
||||||
|
public abstract boolean isNextOf(ChocoBar parent);
|
||||||
|
|
||||||
|
/** Calcul du nombre de combinaisons.
|
||||||
|
* Cette fonction est récursive pour calculer le nombre de combinaisons.
|
||||||
|
* C'est correct en attendant une formule mathématique plus rapide.
|
||||||
|
*/
|
||||||
|
protected static int nbChocoBars(int n, int m)
|
||||||
|
{
|
||||||
|
if (n == 1) {
|
||||||
|
return (m + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int nb = 0;
|
||||||
|
for (int i=m; (i>=0); i--) {
|
||||||
|
nb += nbChocoBars(n - 1, i);
|
||||||
|
}
|
||||||
|
|
||||||
|
return nb;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Implémentation de Vertice
|
||||||
|
public void setLabel(String l) { }
|
||||||
|
public String getLabel() { return "null"; }
|
||||||
|
public void setColor(int c) { }
|
||||||
|
public int getColor() { return 0; }
|
||||||
|
}
|
BIN
src/chocobar/combi/ChocoBarArray.class
Normal file
BIN
src/chocobar/combi/ChocoBarArray.class
Normal file
Binary file not shown.
201
src/chocobar/combi/ChocoBarArray.java
Normal file
201
src/chocobar/combi/ChocoBarArray.java
Normal file
|
@ -0,0 +1,201 @@
|
||||||
|
package chocobar.combi;
|
||||||
|
|
||||||
|
import java.util.Vector;
|
||||||
|
|
||||||
|
import conf.ChocoConfig;
|
||||||
|
|
||||||
|
class ChocoBarArray extends ChocoBar {
|
||||||
|
char points[];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructeur d'une barre de choco ayant x carres en largeur
|
||||||
|
* et y carres en hauteur, toute neuve.
|
||||||
|
**/
|
||||||
|
private ChocoBarArray()
|
||||||
|
{
|
||||||
|
points = new char[size];
|
||||||
|
for (int i=0; (i<size); i++) {
|
||||||
|
points[i] = (char) height;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Constructeur par copie.
|
||||||
|
*/
|
||||||
|
private ChocoBarArray(ChocoBarArray old)
|
||||||
|
{
|
||||||
|
points = new char[size];
|
||||||
|
for (int i=0; (i<size); i++) {
|
||||||
|
points[i] = old.points[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Constructeur par initialisation
|
||||||
|
*/
|
||||||
|
private ChocoBarArray(char p[])
|
||||||
|
{
|
||||||
|
points = new char[size];
|
||||||
|
for (int i=0; (i<size); i++) {
|
||||||
|
points[i] = p[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Affichage de la barre de choco en ligne.
|
||||||
|
**/
|
||||||
|
public String toLine()
|
||||||
|
{
|
||||||
|
String s = "";
|
||||||
|
for (int i=0; (i<size); i++) {
|
||||||
|
s += (int)points[i] + " ";
|
||||||
|
}
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String toString()
|
||||||
|
{
|
||||||
|
return toLine();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Vérifie si le carre (x, y) est déjà mangé.
|
||||||
|
**/
|
||||||
|
protected boolean isBroken(int cX, int cY)
|
||||||
|
{
|
||||||
|
// We are inside what's defined
|
||||||
|
return ((height - cY) <= points[cX]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Comparaison de barres.
|
||||||
|
* La conversion entre type de ChocoBar n'est pas implémentée
|
||||||
|
**/
|
||||||
|
public boolean equals(ChocoBar comp) { return equals((ChocoBarArray) comp); }
|
||||||
|
public boolean equals(ChocoBarArray comp)
|
||||||
|
{
|
||||||
|
// If the other bar is null we're not equal, since
|
||||||
|
// we're obviously not null ;-)
|
||||||
|
if (comp==null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// not the same size, isn't the same
|
||||||
|
if (comp.size != size || comp.height != height) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// We don't have a choice now... doing it the hard way
|
||||||
|
for (int i=0; (i<size); i++) {
|
||||||
|
if (comp.points[i] != points[i]) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we arrive here... it's the same !
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Recherche si l'on peut être un fils de la ChocoBar.
|
||||||
|
* La conversion entre type de ChocoBar n'est pas implémentée
|
||||||
|
*/
|
||||||
|
public boolean isNextOf(ChocoBar parent) { return isNextOf((ChocoBarArray) parent); }
|
||||||
|
public boolean isNextOf(ChocoBarArray parent)
|
||||||
|
{
|
||||||
|
int eaten = -1;
|
||||||
|
for (int i=0; (i<size); i++) {
|
||||||
|
// Si le parent est plus mangé que le fils, c'est toujours non !
|
||||||
|
if (parent.points[i] > points[i]) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (eaten == -1) {
|
||||||
|
if (parent.points[i] != points[i]) {
|
||||||
|
// On a mangé ce carré, les carrés suivants doivent donc être
|
||||||
|
// identiquent à celui-ci ou à celui du père
|
||||||
|
eaten = points[i];
|
||||||
|
// On a traité ce carré, on passe au suivant
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// Le carré est identique, suivant !
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// On a mangé le carré précédent, ils doivent donc être
|
||||||
|
// identiques au point précédents, ou à celui que l'on vient de
|
||||||
|
// manger
|
||||||
|
if (parent.points[i] != points[i] && points[i] != eaten) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Si on arrive ici, c'est que tout c'est bien passé, a-t-on un carré
|
||||||
|
// mangé ?
|
||||||
|
return (eaten != -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Usine pour construire une liste de ChocoBar.
|
||||||
|
* Cette usine contruit une liste exhaustive et ordonnée de ChocoBar.
|
||||||
|
*/
|
||||||
|
public static ChocoBar[] genChocoBars(int x, int y)
|
||||||
|
{
|
||||||
|
// On mets à jour les variables statiques de taille
|
||||||
|
ChocoBarArray.size = x;
|
||||||
|
ChocoBarArray.height = y;
|
||||||
|
|
||||||
|
// Calcul du nombre de chocobars différentes existantes
|
||||||
|
int nbChocobars = nbChocoBars(x, y);
|
||||||
|
|
||||||
|
// Hop, on réserve le tableau de résultat...
|
||||||
|
ChocoBar[] chocoBars = new ChocoBar[nbChocobars];
|
||||||
|
|
||||||
|
// Il est temps de remplir le tableau !
|
||||||
|
|
||||||
|
// Création du tableau pour stocker les valeurs
|
||||||
|
char[] points = new char[x];
|
||||||
|
|
||||||
|
boolean fin = false;
|
||||||
|
int cbIdx = 0;
|
||||||
|
while (!fin) {
|
||||||
|
// Affectation
|
||||||
|
chocoBars[cbIdx] = new ChocoBarArray(points);
|
||||||
|
cbIdx++;
|
||||||
|
|
||||||
|
// Calcul du suivant :
|
||||||
|
|
||||||
|
// On incrémente ...
|
||||||
|
int idx = x-1;
|
||||||
|
points[idx] ++;
|
||||||
|
|
||||||
|
// ... et on gère la retenue
|
||||||
|
boolean overflow = (points[idx] > y);
|
||||||
|
while (points[idx] > y) {
|
||||||
|
if (idx == 0) {
|
||||||
|
fin = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
points[idx-1] ++;
|
||||||
|
idx--;
|
||||||
|
}
|
||||||
|
// On répercute la modif vers la droite s'il y a eu overflow
|
||||||
|
if (overflow) {
|
||||||
|
for (int i=idx; (i<x); i++) {
|
||||||
|
points[i] = points[idx];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return chocoBars;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ChocoBar[] genChocoBars(Integer x, Integer y)
|
||||||
|
{
|
||||||
|
return genChocoBars(x.intValue(), y.intValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Implémentation de Vertice
|
||||||
|
|
||||||
|
public void setLabel(String l) { }
|
||||||
|
public String getLabel() { return "null"; }
|
||||||
|
public void setColor(int c) { }
|
||||||
|
public int getColor() { return 0; }
|
||||||
|
}
|
BIN
src/chocobar/combi/ChocoBarBigInt.class
Normal file
BIN
src/chocobar/combi/ChocoBarBigInt.class
Normal file
Binary file not shown.
163
src/chocobar/combi/ChocoBarBigInt.java
Normal file
163
src/chocobar/combi/ChocoBarBigInt.java
Normal file
|
@ -0,0 +1,163 @@
|
||||||
|
package chocobar.combi;
|
||||||
|
|
||||||
|
import java.math.BigInteger;
|
||||||
|
|
||||||
|
class ChocoBarBigInt extends ChocoBar {
|
||||||
|
static private BigInteger[] powers;
|
||||||
|
private BigInteger points;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructeur d'une barre de choco.
|
||||||
|
* Elle a x carres en largeur et y carres en hauteur, et est toute neuve.
|
||||||
|
**/
|
||||||
|
private ChocoBarBigInt()
|
||||||
|
{
|
||||||
|
points = new BigInteger("0");
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Constructeur par copie.
|
||||||
|
*/
|
||||||
|
private ChocoBarBigInt(ChocoBarBigInt old)
|
||||||
|
{
|
||||||
|
points = old.points;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Constructeur par initialisation.
|
||||||
|
*/
|
||||||
|
private ChocoBarBigInt(BigInteger bi)
|
||||||
|
{
|
||||||
|
points = bi;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Constructeur par initialisation.
|
||||||
|
*/
|
||||||
|
private ChocoBarBigInt(char c[])
|
||||||
|
{
|
||||||
|
points = new BigInteger("0");
|
||||||
|
for (int i=0; (i<size); i++) {
|
||||||
|
points.add(powers[i].multiply(new BigInteger("" + (int)c[i])));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Affichage de la barre de choco en ligne.
|
||||||
|
**/
|
||||||
|
public String toLine()
|
||||||
|
{
|
||||||
|
String s = "";
|
||||||
|
BigInteger bi = points;
|
||||||
|
for (int i=0; (i<size); i++) {
|
||||||
|
s += get(i) + " ";
|
||||||
|
}
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
private int get(int x)
|
||||||
|
{
|
||||||
|
BigInteger rest = points.pow(x);
|
||||||
|
BigInteger value = (rest.mod(ChocoBarBigInt.powers[x+1])).divide(powers[x]);
|
||||||
|
return value.intValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Vérifie si le carre (x, y) est déjà mangé.
|
||||||
|
**/
|
||||||
|
protected boolean isBroken(int cX, int cY)
|
||||||
|
{
|
||||||
|
return ((height - cY) <= get(cX));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Comparaison de barres.
|
||||||
|
* La conversion entre type de ChocoBar n'est pas implémentée
|
||||||
|
**/
|
||||||
|
public boolean equals(ChocoBar comp) { return equals((ChocoBarBigInt) comp); }
|
||||||
|
public boolean equals(ChocoBarBigInt comp)
|
||||||
|
{
|
||||||
|
return points.equals(comp.points);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Recherche si l'on peut être un fils de la ChocoBar.
|
||||||
|
* La conversion entre type de ChocoBar n'est pas implémentée
|
||||||
|
*/
|
||||||
|
public boolean isNextOf(ChocoBar parent) { return isNextOf((ChocoBarBigInt) parent); }
|
||||||
|
public boolean isNextOf(ChocoBarBigInt parent)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Usine pour construire une liste de ChocoBar.
|
||||||
|
* Cette usine contruit une liste exhaustive et ordonnée de ChocoBar.
|
||||||
|
*/
|
||||||
|
public static ChocoBar[] genChocoBars(int x, int y)
|
||||||
|
{
|
||||||
|
// On mets à jour les variables statiques de taille
|
||||||
|
ChocoBarBigInt.size = x;
|
||||||
|
ChocoBarBigInt.height = y;
|
||||||
|
// Précalcul des puissances
|
||||||
|
ChocoBarBigInt.powers = new BigInteger[x+1];
|
||||||
|
BigInteger bi = new BigInteger("1");
|
||||||
|
for (int i=0; (i<=x); i++) {
|
||||||
|
ChocoBarBigInt.powers[i] = bi;
|
||||||
|
bi = bi.multiply(new BigInteger("" + y));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Calcul du nombre de chocobars différentes existantes
|
||||||
|
int nbChocobars = nbChocoBars(x, y);
|
||||||
|
|
||||||
|
// Hop, on réserve le tableau de résultat...
|
||||||
|
ChocoBar[] chocoBars = new ChocoBar[nbChocobars];
|
||||||
|
|
||||||
|
// Il est temps de remplir le tableau !
|
||||||
|
|
||||||
|
// Création du tableau pour stocker les valeurs
|
||||||
|
char[] points = new char[x];
|
||||||
|
|
||||||
|
|
||||||
|
boolean fin = false;
|
||||||
|
int cbIdx = 0;
|
||||||
|
while (!fin) {
|
||||||
|
// Affectation
|
||||||
|
chocoBars[cbIdx] = new ChocoBarBigInt(points);
|
||||||
|
cbIdx++;
|
||||||
|
|
||||||
|
// Calcul du suivant :
|
||||||
|
|
||||||
|
// On incrémente ...
|
||||||
|
int idx = x-1;
|
||||||
|
points[idx] ++;
|
||||||
|
|
||||||
|
// ... et on gère la retenue
|
||||||
|
boolean overflow = (points[idx] > y);
|
||||||
|
while (points[idx] > y) {
|
||||||
|
if (idx == 0) {
|
||||||
|
fin = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
points[idx-1] ++;
|
||||||
|
idx--;
|
||||||
|
}
|
||||||
|
// On répercute la modif vers la droite s'il y a eu overflow
|
||||||
|
if (overflow) {
|
||||||
|
for (int i=idx; (i<x); i++) {
|
||||||
|
points[i] = points[idx];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return chocoBars;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ChocoBar[] genChocoBars(Integer x, Integer y)
|
||||||
|
{
|
||||||
|
return genChocoBars(x.intValue(), y.intValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Implémentation de Vertice
|
||||||
|
|
||||||
|
public void setLabel(String l) { }
|
||||||
|
public String getLabel() { return "null"; }
|
||||||
|
public void setColor(int c) { }
|
||||||
|
public int getColor() { return 0; }
|
||||||
|
}
|
BIN
src/chocobar/combi/ChocoBarLong.class
Normal file
BIN
src/chocobar/combi/ChocoBarLong.class
Normal file
Binary file not shown.
223
src/chocobar/combi/ChocoBarLong.java
Normal file
223
src/chocobar/combi/ChocoBarLong.java
Normal file
|
@ -0,0 +1,223 @@
|
||||||
|
package chocobar.combi;
|
||||||
|
|
||||||
|
import java.lang.Long;
|
||||||
|
|
||||||
|
class ChocoBarLong extends ChocoBar {
|
||||||
|
/// Précalcul des puissances.
|
||||||
|
static private long[] powers;
|
||||||
|
|
||||||
|
/// Représente la ChocoBar
|
||||||
|
private long points;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructeur d'une barre de choco.
|
||||||
|
* Elle a x carres en largeur et y carres en hauteur, et est toute neuve.
|
||||||
|
**/
|
||||||
|
private ChocoBarLong()
|
||||||
|
{
|
||||||
|
points = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Constructeur par copie.
|
||||||
|
*/
|
||||||
|
private ChocoBarLong(ChocoBarLong old)
|
||||||
|
{
|
||||||
|
points = old.points;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Constructeur par initialisation.
|
||||||
|
*/
|
||||||
|
private ChocoBarLong(long bi)
|
||||||
|
{
|
||||||
|
points = bi;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Constructeur par initialisation.
|
||||||
|
*/
|
||||||
|
private ChocoBarLong(int c[])
|
||||||
|
{
|
||||||
|
points = 0;
|
||||||
|
for (int i=0; (i<size); i++) {
|
||||||
|
points += powers[i] * c[size-i-1];
|
||||||
|
}
|
||||||
|
// XXX - DEBUG
|
||||||
|
// System.out.println(
|
||||||
|
// "ChocoBarLong(" + toLine(c) + ")"
|
||||||
|
// + " = " + toLine()
|
||||||
|
// + " = " + toNumber()
|
||||||
|
// );
|
||||||
|
// XXX - DEBUG
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Affichage de la barre de choco en nombre.
|
||||||
|
**/
|
||||||
|
public String toNumber()
|
||||||
|
{
|
||||||
|
String s = (new Long(points)).toString();
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Affichage de la barre de choco en ligne.
|
||||||
|
**/
|
||||||
|
public String toLine()
|
||||||
|
{
|
||||||
|
String s = "";
|
||||||
|
for (int i=0; (i<size); i++) {
|
||||||
|
s += get(i) + " ";
|
||||||
|
}
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Affichage de la barre de choco en ligne.
|
||||||
|
**/
|
||||||
|
private static String toLine(int c[])
|
||||||
|
{
|
||||||
|
String s = "";
|
||||||
|
for (int i=0; (i<size); i++) {
|
||||||
|
s += c[i] + " ";
|
||||||
|
}
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
private int get(int x)
|
||||||
|
{
|
||||||
|
int i = (size - 1) - x;
|
||||||
|
long value = (points % powers[i+1]) / powers[i];
|
||||||
|
return (int) value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Vérifie si le carre (x, y) est déjà mangé.
|
||||||
|
**/
|
||||||
|
protected boolean isBroken(int cX, int cY)
|
||||||
|
{
|
||||||
|
return ((height - cY) <= get(cX));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Comparaison de barres.
|
||||||
|
* La conversion entre type de ChocoBar n'est pas implémentée
|
||||||
|
**/
|
||||||
|
public boolean equals(ChocoBar comp) { return equals((ChocoBarLong) comp); }
|
||||||
|
public boolean equals(ChocoBarLong comp)
|
||||||
|
{
|
||||||
|
return points == comp.points;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Recherche si l'on peut être un fils de la ChocoBar.
|
||||||
|
* La conversion entre type de ChocoBar n'est pas implémentée
|
||||||
|
*/
|
||||||
|
public boolean isNextOf(ChocoBar parent) { return isNextOf((ChocoBarLong) parent); }
|
||||||
|
public boolean isNextOf(ChocoBarLong parent)
|
||||||
|
{
|
||||||
|
// TODO - Il faudrait améliorer cet algo, en fonction des données que
|
||||||
|
// Long peut nous offrir
|
||||||
|
int eaten = -1;
|
||||||
|
for (int i=0; (i<size); i++) {
|
||||||
|
// Si le parent est plus mangé que le fils, c'est toujours non !
|
||||||
|
if (parent.get(i) > get(i)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (eaten == -1) {
|
||||||
|
if (parent.get(i) != get(i)) {
|
||||||
|
// On a mangé ce carré, les carrés suivants doivent donc être
|
||||||
|
// identiquent à celui-ci ou à celui du père
|
||||||
|
eaten = get(i);
|
||||||
|
// On a traité ce carré, on passe au suivant
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// Le carré est identique, suivant !
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// On a mangé le carré précédent, ils doivent donc être
|
||||||
|
// identiques au point précédents, ou à celui que l'on vient de
|
||||||
|
// manger
|
||||||
|
if (parent.get(i) != get(i) && get(i) != eaten) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Si on arrive ici, c'est que tout c'est bien passé, a-t-on un carré
|
||||||
|
// mangé ?
|
||||||
|
return (eaten != -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Usine pour construire une liste de ChocoBar.
|
||||||
|
* Cette usine contruit une liste exhaustive et ordonnée de ChocoBar.
|
||||||
|
*/
|
||||||
|
public static ChocoBar[] genChocoBars(int x, int y)
|
||||||
|
{
|
||||||
|
// On mets à jour les variables statiques de taille
|
||||||
|
ChocoBarLong.size = x;
|
||||||
|
ChocoBarLong.height = y;
|
||||||
|
// Précalcul des puissances
|
||||||
|
long pows = 1;
|
||||||
|
ChocoBarLong.powers = new long[x+1];
|
||||||
|
for (int i=0; (i<=x); i++) {
|
||||||
|
ChocoBarLong.powers[i] = pows;
|
||||||
|
pows *= y + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Calcul du nombre de chocobars différentes existantes
|
||||||
|
int nbChocobars = nbChocoBars(x, y);
|
||||||
|
|
||||||
|
// Hop, on réserve le tableau de résultat...
|
||||||
|
ChocoBar[] chocoBars = new ChocoBar[nbChocobars];
|
||||||
|
|
||||||
|
// Il est temps de remplir le tableau !
|
||||||
|
|
||||||
|
// Création du tableau pour stocker les valeurs
|
||||||
|
int[] points = new int[x];
|
||||||
|
|
||||||
|
boolean fin = false;
|
||||||
|
int cbIdx = 0;
|
||||||
|
while (!fin) {
|
||||||
|
// Affectation
|
||||||
|
chocoBars[cbIdx] = new ChocoBarLong(points);
|
||||||
|
cbIdx++;
|
||||||
|
|
||||||
|
// Calcul du suivant :
|
||||||
|
|
||||||
|
// On incrémente ...
|
||||||
|
int idx = x-1;
|
||||||
|
points[idx] ++;
|
||||||
|
|
||||||
|
// ... et on gère la retenue
|
||||||
|
boolean overflow = (points[idx] > y);
|
||||||
|
while (points[idx] > y) {
|
||||||
|
if (idx == 0) {
|
||||||
|
fin = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
points[idx-1] ++;
|
||||||
|
idx--;
|
||||||
|
}
|
||||||
|
// On répercute la modif vers la droite s'il y a eu overflow
|
||||||
|
if (overflow) {
|
||||||
|
for (int i=idx; (i<x); i++) {
|
||||||
|
points[i] = points[idx];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return chocoBars;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ChocoBar[] genChocoBars(Integer x, Integer y)
|
||||||
|
{
|
||||||
|
return genChocoBars(x.intValue(), y.intValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Implémentation de Vertice
|
||||||
|
|
||||||
|
public void setLabel(String l) { }
|
||||||
|
public String getLabel() { return "null"; }
|
||||||
|
public void setColor(int c) { }
|
||||||
|
public int getColor() { return 0; }
|
||||||
|
}
|
BIN
src/chocobar/combi/ChocoBarSet.class
Normal file
BIN
src/chocobar/combi/ChocoBarSet.class
Normal file
Binary file not shown.
57
src/chocobar/combi/ChocoBarSet.java
Normal file
57
src/chocobar/combi/ChocoBarSet.java
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
package chocobar.combi;
|
||||||
|
|
||||||
|
import graph.Vertice;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Classe pour encapsuler le Vertices.
|
||||||
|
*/
|
||||||
|
final class ChocoBarSet implements VerticeSet
|
||||||
|
{
|
||||||
|
ChocoBar[] cbList;
|
||||||
|
int size;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructeur
|
||||||
|
*/
|
||||||
|
ChocoBarSet(ChocoBar[] cl)
|
||||||
|
{
|
||||||
|
cbList = cl;
|
||||||
|
size = cl.length;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ChocoBar item(int idx)
|
||||||
|
{
|
||||||
|
return cbList[idx];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Implémentation de VerticeSet
|
||||||
|
public Vertice elementAt(int idx)
|
||||||
|
{
|
||||||
|
return cbList[idx];
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Recherche de l'id d'un vertice.
|
||||||
|
* Renvoie -1 si on ne le trouve pas
|
||||||
|
*/
|
||||||
|
public int getIdOf(Vertice v)
|
||||||
|
{
|
||||||
|
// On parcoure tout le tableau
|
||||||
|
for (int i=0; (i<size); i++) {
|
||||||
|
if (v.equals(cbList[i])) {
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// On ne l'a pas trouvé, on retourne -1
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean contains(Vertice v)
|
||||||
|
{
|
||||||
|
return (getIdOf(v) != -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int size()
|
||||||
|
{
|
||||||
|
return this.size;
|
||||||
|
}
|
||||||
|
}
|
BIN
src/chocobar/combi/ChocoGraph.class
Normal file
BIN
src/chocobar/combi/ChocoGraph.class
Normal file
Binary file not shown.
92
src/chocobar/combi/ChocoGraph.java
Normal file
92
src/chocobar/combi/ChocoGraph.java
Normal file
|
@ -0,0 +1,92 @@
|
||||||
|
package chocobar.combi;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
import java.lang.ClassNotFoundException;
|
||||||
|
import java.lang.NoSuchMethodException;
|
||||||
|
import java.lang.IllegalAccessException;
|
||||||
|
|
||||||
|
import chocobar.GenericChocoGraph;
|
||||||
|
import graph.GenericGraph;
|
||||||
|
import conf.ChocoConfig;
|
||||||
|
|
||||||
|
public class ChocoGraph implements GenericChocoGraph
|
||||||
|
{
|
||||||
|
static int width;
|
||||||
|
static int height;
|
||||||
|
Graph configGraph;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructeur d'un graphe de jeu de Chocobar avec les barres
|
||||||
|
* de taille (width * height)
|
||||||
|
**/
|
||||||
|
public ChocoGraph()
|
||||||
|
{
|
||||||
|
this.width=ChocoConfig.size;
|
||||||
|
this.height=ChocoConfig.height;
|
||||||
|
this.configGraph=null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generation du graphe de jeu.
|
||||||
|
**/
|
||||||
|
public GenericGraph genChoco(boolean isList)
|
||||||
|
{
|
||||||
|
// Création des Vectors
|
||||||
|
ChocoBar[] cBars;
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Recherche du bon ChocoBar
|
||||||
|
Class cCBM = Class.forName("chocobar."+ChocoConfig.chocoBarModel);
|
||||||
|
Class[] paramsType = {Class.forName("java.lang.Integer"), Class.forName("java.lang.Integer")};
|
||||||
|
|
||||||
|
Method genChocoBars = cCBM.getMethod("genChocoBars", paramsType);
|
||||||
|
Object[] paramsValue = {new Integer(width), new Integer(height)};
|
||||||
|
cBars = (chocobar.combi.ChocoBar[]) genChocoBars.invoke(null, paramsValue);
|
||||||
|
|
||||||
|
ChocoBarSet cbs = new ChocoBarSet(cBars);
|
||||||
|
|
||||||
|
// Création de l'objet Graph
|
||||||
|
configGraph = new Graph();
|
||||||
|
configGraph.setSize(cbs.size());
|
||||||
|
|
||||||
|
// Création des Noeuds
|
||||||
|
// On sait que les noeud fils sont forcément *après* les noeuds pères.
|
||||||
|
for (int i=0; (i<cbs.size()); i++) {
|
||||||
|
for (int j=i+1; (j<cbs.size()); j++) {
|
||||||
|
if (cbs.item(j).isNextOf(cbs.item(i))) {
|
||||||
|
// le j-ieme est le fils du i-eme
|
||||||
|
configGraph.addEdge(i,j);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
/*
|
||||||
|
} catch (ClassNotFoundException e) {
|
||||||
|
} catch (NoSuchMethodException e) {
|
||||||
|
} catch (IllegalAccessException e) {
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
return configGraph;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui renvoie le graph de cet objet
|
||||||
|
**/
|
||||||
|
public Graph getGraph()
|
||||||
|
{
|
||||||
|
return this.configGraph;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui affiche tous les ChocoBar dans ce graphe
|
||||||
|
**/
|
||||||
|
public void displayAll(){
|
||||||
|
System.out.println("ChocoGraph:displayAll()");
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Usine pour la construction du graph.
|
||||||
|
*/
|
||||||
|
}
|
BIN
src/chocobar/combi/EdgeBigIntModel.class
Normal file
BIN
src/chocobar/combi/EdgeBigIntModel.class
Normal file
Binary file not shown.
228
src/chocobar/combi/EdgeBigIntModel.java
Normal file
228
src/chocobar/combi/EdgeBigIntModel.java
Normal file
|
@ -0,0 +1,228 @@
|
||||||
|
package chocobar.combi;
|
||||||
|
|
||||||
|
import java.util.*; // listes
|
||||||
|
import java.math.BigInteger;
|
||||||
|
|
||||||
|
import exception.*;
|
||||||
|
|
||||||
|
public class EdgeBigIntModel implements EdgeModel {
|
||||||
|
private int cardV;
|
||||||
|
|
||||||
|
// Bit Array of (x, y) -> (x * cardV + y)
|
||||||
|
private BigInteger adjacent;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default constructor
|
||||||
|
**/
|
||||||
|
public EdgeBigIntModel() {
|
||||||
|
this(10);
|
||||||
|
this.cardV=0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor with card (number of vertices) as a parameter
|
||||||
|
**/
|
||||||
|
public EdgeBigIntModel(int card) {
|
||||||
|
this.cardV=card;
|
||||||
|
this.adjacent=new BigInteger("0");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui renvoie la dimension de cette matrice d'adjance
|
||||||
|
**/
|
||||||
|
public int getCardV(){
|
||||||
|
return this.cardV;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Fonction qui réinitialise à la taille donnée.
|
||||||
|
*/
|
||||||
|
public int setSize(int size)
|
||||||
|
{
|
||||||
|
cardV=size;
|
||||||
|
adjacent=new BigInteger("0");
|
||||||
|
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui rajoute un arc partant du sommet srcV
|
||||||
|
* vers sommet dstV
|
||||||
|
**/
|
||||||
|
public void addEdge(int srcV,int dstV)
|
||||||
|
throws OutOfRangeVerticeException
|
||||||
|
// plustard qu'on parse un graphe et rajoute des arcs sans
|
||||||
|
// passer par l'initialisation, il faut detecter le cas qu'on
|
||||||
|
// rajoute un arc n'importe quoi
|
||||||
|
{
|
||||||
|
if ((srcV<0) ||(dstV<0)
|
||||||
|
||(srcV>=cardV) || (dstV>=cardV)) {
|
||||||
|
throw new OutOfRangeVerticeException();
|
||||||
|
}
|
||||||
|
adjacent.setBit(srcV * cardV + dstV);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui rajoute un arc partant du sommet srcV
|
||||||
|
* vers sommet dstV
|
||||||
|
**/
|
||||||
|
public void delEdge(int srcV,int dstV)
|
||||||
|
throws OutOfRangeVerticeException
|
||||||
|
// plustard qu'on parse un graphe et rajoute des arcs sans
|
||||||
|
// passer par l'initialisation, il faut detecter le cas qu'on
|
||||||
|
// rajoute un arc n'importe quoi
|
||||||
|
{
|
||||||
|
if ((srcV<0) ||(dstV<0)
|
||||||
|
||(srcV>=cardV) || (dstV>=cardV)) {
|
||||||
|
throw new OutOfRangeVerticeException();
|
||||||
|
}
|
||||||
|
adjacent.clearBit(srcV * cardV + dstV);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui verifie l'existence d'un arc du sommet srcV
|
||||||
|
* vers sommet dstV
|
||||||
|
**/
|
||||||
|
public boolean isEdge(int srcV,int dstV){
|
||||||
|
return adjacent.testBit(srcV * cardV + dstV);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui verifie si les sommets adjacents a src sont
|
||||||
|
* uniquement les sommets contenus dans le tableau dst
|
||||||
|
* Si non alors elle renvoie -1 et si oui elle renvoie le premier
|
||||||
|
* sommet dst adjacent a src
|
||||||
|
**/
|
||||||
|
public int withOnlyEdges(int src, Vector dst){
|
||||||
|
Collection srcAdj = getAdjacent(src);
|
||||||
|
int taille = srcAdj.size();
|
||||||
|
int adj=-1;
|
||||||
|
Object[] adjacents=srcAdj.toArray();
|
||||||
|
|
||||||
|
if (taille>dst.size()){
|
||||||
|
//y a des sommets qui ne sont pas dans le tableau
|
||||||
|
return -1;
|
||||||
|
} else {
|
||||||
|
for (int i=0; i<taille; i++){
|
||||||
|
if (!dst.contains(adjacents[i])){
|
||||||
|
return -1;
|
||||||
|
} else {
|
||||||
|
if (adj==-1){
|
||||||
|
adj=((Integer)adjacents[i]).intValue();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return adj;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui renvoie la source (sommet racine) de ce graphe
|
||||||
|
* ou -1 s'il n'existe pas
|
||||||
|
**/
|
||||||
|
public int getSourceVertice(){
|
||||||
|
int i = -1;
|
||||||
|
|
||||||
|
if (this.cardV != 0){
|
||||||
|
i=0;
|
||||||
|
for (int j=0; j<this.cardV; j++){
|
||||||
|
if (isEdge(j, i)){
|
||||||
|
i=j;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (int j=0; j<this.cardV; j++){
|
||||||
|
if (!isEdge(i, j)){
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (int j=0; j<this.cardV; j++){
|
||||||
|
if (isEdge(j, i)){
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui renvoie la puis (sommet final) de ce graphe
|
||||||
|
* ou -1 s'il n'existe pas
|
||||||
|
**/
|
||||||
|
public int getFinalVertice(){
|
||||||
|
int i = -1;
|
||||||
|
|
||||||
|
if (this.cardV != 0){
|
||||||
|
i=0;
|
||||||
|
for (int j=i+1; j<this.cardV; j++){
|
||||||
|
if (isEdge(i, j)){
|
||||||
|
i=j;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (int j=0; j<this.cardV; j++){
|
||||||
|
if (isEdge(i, j)){
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (int j=0; j<this.cardV; j++){
|
||||||
|
if (!isEdge(j, i)){
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui renvoie une liste d'adjacence du sommet srcV
|
||||||
|
**/
|
||||||
|
public Collection getAdjacent(int srcV){
|
||||||
|
LinkedList res=new LinkedList();
|
||||||
|
for (int i=0; i<cardV; i++){
|
||||||
|
if (isEdge(srcV, i))
|
||||||
|
res.add(new Integer(i));
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Collection getIncident(int dstV){
|
||||||
|
//TODO: écrire la méthode !!!
|
||||||
|
return new Vector();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui efface tous les arcs du graphe
|
||||||
|
**/
|
||||||
|
public void clear()
|
||||||
|
{
|
||||||
|
adjacent = new BigInteger("0");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui cree tous les arcs possibles du graphe
|
||||||
|
**/
|
||||||
|
public void fill(){
|
||||||
|
// we add edges between every vertice
|
||||||
|
for (int i=0; i<this.cardV;i++){
|
||||||
|
for (int j=0;j<this.cardV;j++){
|
||||||
|
try { addEdge(i, j); } catch (OutOfRangeVerticeException e) { }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// but a vertice cannot have an edge to itself
|
||||||
|
for (int i=0;i<this.cardV;i++){
|
||||||
|
try { delEdge(i, i); } catch (OutOfRangeVerticeException e) { }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui rajoute un vertice (sommet) a la liste des arcs du graphe
|
||||||
|
* les arcs sont encore VIDE
|
||||||
|
**/
|
||||||
|
public void addVertice()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public void removeVerticeAt(int rmIdx)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
BIN
src/chocobar/combi/EdgeBitSetModel.class
Normal file
BIN
src/chocobar/combi/EdgeBitSetModel.class
Normal file
Binary file not shown.
227
src/chocobar/combi/EdgeBitSetModel.java
Normal file
227
src/chocobar/combi/EdgeBitSetModel.java
Normal file
|
@ -0,0 +1,227 @@
|
||||||
|
package chocobar.combi;
|
||||||
|
|
||||||
|
import java.util.*; // listes
|
||||||
|
|
||||||
|
import exception.*;
|
||||||
|
|
||||||
|
public class EdgeBitSetModel implements EdgeModel {
|
||||||
|
private int cardV;
|
||||||
|
|
||||||
|
// Bit Array of (x, y) -> (x * cardV + y)
|
||||||
|
private BitSet adjacent;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default constructor
|
||||||
|
**/
|
||||||
|
public EdgeBitSetModel() {
|
||||||
|
this(10);
|
||||||
|
this.cardV=0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor with card (number of vertices) as a parameter
|
||||||
|
**/
|
||||||
|
public EdgeBitSetModel(int card) {
|
||||||
|
this.cardV=card;
|
||||||
|
this.adjacent=new BitSet(0, (long)card * card);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui renvoie la dimension de cette matrice d'adjance
|
||||||
|
**/
|
||||||
|
public int getCardV(){
|
||||||
|
return this.cardV;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Fonction qui réinitialise à la taille donnée.
|
||||||
|
*/
|
||||||
|
public int setSize(int size)
|
||||||
|
{
|
||||||
|
cardV=size;
|
||||||
|
adjacent=new BitSet(0, (long)size * size);
|
||||||
|
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui rajoute un arc partant du sommet srcV
|
||||||
|
* vers sommet dstV
|
||||||
|
**/
|
||||||
|
public void addEdge(int srcV,int dstV)
|
||||||
|
throws OutOfRangeVerticeException
|
||||||
|
// plustard qu'on parse un graphe et rajoute des arcs sans
|
||||||
|
// passer par l'initialisation, il faut detecter le cas qu'on
|
||||||
|
// rajoute un arc n'importe quoi
|
||||||
|
{
|
||||||
|
if ((srcV<0) ||(dstV<0)
|
||||||
|
||(srcV>=cardV) || (dstV>=cardV)) {
|
||||||
|
throw new OutOfRangeVerticeException();
|
||||||
|
}
|
||||||
|
adjacent.setBit(srcV * cardV + dstV);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui rajoute un arc partant du sommet srcV
|
||||||
|
* vers sommet dstV
|
||||||
|
**/
|
||||||
|
public void delEdge(int srcV,int dstV)
|
||||||
|
throws OutOfRangeVerticeException
|
||||||
|
// plustard qu'on parse un graphe et rajoute des arcs sans
|
||||||
|
// passer par l'initialisation, il faut detecter le cas qu'on
|
||||||
|
// rajoute un arc n'importe quoi
|
||||||
|
{
|
||||||
|
if ((srcV<0) ||(dstV<0)
|
||||||
|
||(srcV>=cardV) || (dstV>=cardV)) {
|
||||||
|
throw new OutOfRangeVerticeException();
|
||||||
|
}
|
||||||
|
adjacent.clearBit(srcV * cardV + dstV);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui verifie l'existence d'un arc du sommet srcV
|
||||||
|
* vers sommet dstV
|
||||||
|
**/
|
||||||
|
public boolean isEdge(int srcV,int dstV){
|
||||||
|
return adjacent.testBit(srcV * cardV + dstV);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui verifie si les sommets adjacents a src sont
|
||||||
|
* uniquement les sommets contenus dans le tableau dst
|
||||||
|
* Si non alors elle renvoie -1 et si oui elle renvoie le premier
|
||||||
|
* sommet dst adjacent a src
|
||||||
|
**/
|
||||||
|
public int withOnlyEdges(int src, Vector dst){
|
||||||
|
Collection srcAdj = getAdjacent(src);
|
||||||
|
int taille = srcAdj.size();
|
||||||
|
int adj=-1;
|
||||||
|
Object[] adjacents=srcAdj.toArray();
|
||||||
|
|
||||||
|
if (taille>dst.size()){
|
||||||
|
//y a des sommets qui ne sont pas dans le tableau
|
||||||
|
return -1;
|
||||||
|
} else {
|
||||||
|
for (int i=0; i<taille; i++){
|
||||||
|
if (!dst.contains(adjacents[i])){
|
||||||
|
return -1;
|
||||||
|
} else {
|
||||||
|
if (adj==-1){
|
||||||
|
adj=((Integer)adjacents[i]).intValue();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return adj;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui renvoie la source (sommet racine) de ce graphe
|
||||||
|
* ou -1 s'il n'existe pas
|
||||||
|
**/
|
||||||
|
public int getSourceVertice(){
|
||||||
|
int i = -1;
|
||||||
|
|
||||||
|
if (this.cardV != 0){
|
||||||
|
i=0;
|
||||||
|
for (int j=0; j<this.cardV; j++){
|
||||||
|
if (isEdge(j, i)){
|
||||||
|
i=j;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (int j=0; j<this.cardV; j++){
|
||||||
|
if (!isEdge(i, j)){
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (int j=0; j<this.cardV; j++){
|
||||||
|
if (isEdge(j, i)){
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui renvoie la puis (sommet final) de ce graphe
|
||||||
|
* ou -1 s'il n'existe pas
|
||||||
|
**/
|
||||||
|
public int getFinalVertice(){
|
||||||
|
int i = -1;
|
||||||
|
|
||||||
|
if (this.cardV != 0){
|
||||||
|
i=0;
|
||||||
|
for (int j=i+1; j<this.cardV; j++){
|
||||||
|
if (isEdge(i, j)){
|
||||||
|
i=j;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (int j=0; j<this.cardV; j++){
|
||||||
|
if (isEdge(i, j)){
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (int j=0; j<this.cardV; j++){
|
||||||
|
if (!isEdge(j, i)){
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui renvoie une liste d'adjacence du sommet srcV
|
||||||
|
**/
|
||||||
|
public Collection getAdjacent(int srcV){
|
||||||
|
LinkedList res=new LinkedList();
|
||||||
|
for (int i=0; i<cardV; i++){
|
||||||
|
if (isEdge(srcV, i))
|
||||||
|
res.add(new Integer(i));
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Collection getIncident(int dstV){
|
||||||
|
//TODO: écrire la méthode !!!
|
||||||
|
return new Vector();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui efface tous les arcs du graphe
|
||||||
|
**/
|
||||||
|
public void clear()
|
||||||
|
{
|
||||||
|
adjacent = new BitSet(0, (long)cardV * cardV);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui cree tous les arcs possibles du graphe
|
||||||
|
**/
|
||||||
|
public void fill(){
|
||||||
|
// we add edges between every vertice
|
||||||
|
for (int i=0; i<this.cardV;i++){
|
||||||
|
for (int j=0;j<this.cardV;j++){
|
||||||
|
try { addEdge(i, j); } catch (OutOfRangeVerticeException e) { }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// but a vertice cannot have an edge to itself
|
||||||
|
for (int i=0;i<this.cardV;i++){
|
||||||
|
try { delEdge(i, i); } catch (OutOfRangeVerticeException e) { }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui rajoute un vertice (sommet) a la liste des arcs du graphe
|
||||||
|
* les arcs sont encore VIDE
|
||||||
|
**/
|
||||||
|
public void addVertice()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public void removeVerticeAt(int rmIdx)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
BIN
src/chocobar/combi/EdgeListModel.class
Normal file
BIN
src/chocobar/combi/EdgeListModel.class
Normal file
Binary file not shown.
248
src/chocobar/combi/EdgeListModel.java
Normal file
248
src/chocobar/combi/EdgeListModel.java
Normal file
|
@ -0,0 +1,248 @@
|
||||||
|
package chocobar.combi;
|
||||||
|
|
||||||
|
import java.util.*; // listes
|
||||||
|
|
||||||
|
import exception.*;
|
||||||
|
|
||||||
|
class EdgeListModel implements EdgeModel {
|
||||||
|
private HashMap[] adjacent;
|
||||||
|
private HashMap[] incident;
|
||||||
|
private int cardV;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructeur par defaut
|
||||||
|
**/
|
||||||
|
public EdgeListModel(){
|
||||||
|
this(10);
|
||||||
|
this.cardV=0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructeur d'un modele de graphe avec nbVertices sommets
|
||||||
|
**/
|
||||||
|
public EdgeListModel(int nbVertices){
|
||||||
|
if (nbVertices>=0){
|
||||||
|
this.cardV=nbVertices;
|
||||||
|
this.adjacent=new HashMap[this.cardV+(this.cardV/3)];
|
||||||
|
this.incident=new HashMap[this.cardV+(this.cardV/3)];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui renvoie le nombre de sommets de cette liste
|
||||||
|
* d'adjacence
|
||||||
|
**/
|
||||||
|
public int getCardV(){
|
||||||
|
return this.cardV;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Fonction qui réinitialise à la taille donnée.
|
||||||
|
*/
|
||||||
|
public int setSize(int size)
|
||||||
|
{
|
||||||
|
cardV=size;
|
||||||
|
adjacent=new HashMap[this.cardV+(this.cardV/3)];
|
||||||
|
incident=new HashMap[this.cardV+(this.cardV/3)];
|
||||||
|
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui rajoute un arc de srcV vers dstV
|
||||||
|
**/
|
||||||
|
public void addEdge(int srcV,int dstV)
|
||||||
|
throws OutOfRangeVerticeException
|
||||||
|
{
|
||||||
|
// on vérifie que les arcs ajoutés joignent des
|
||||||
|
// sommets existants dans le graphe
|
||||||
|
if ((srcV<0) ||(dstV<0)
|
||||||
|
||(srcV>=cardV) || (dstV>=cardV)) {
|
||||||
|
throw new OutOfRangeVerticeException();
|
||||||
|
} else {
|
||||||
|
if (this.adjacent[srcV]==null){
|
||||||
|
this.adjacent[srcV]=new HashMap();
|
||||||
|
}
|
||||||
|
if (this.incident[dstV]==null){
|
||||||
|
this.incident[dstV]=new HashMap();
|
||||||
|
}
|
||||||
|
HashMap srcList=this.adjacent[srcV];
|
||||||
|
HashMap dstList=this.incident[dstV];
|
||||||
|
Integer d=new Integer(dstV);
|
||||||
|
Integer s=new Integer(srcV);
|
||||||
|
if (!srcList.containsKey(d)){srcList.put(d,null);}
|
||||||
|
if (!dstList.containsKey(s)){dstList.put(s,null);}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui verifie s'il existe un arc
|
||||||
|
* de srcV vers dstV
|
||||||
|
**/
|
||||||
|
public boolean isEdge(int srcV,int dstV){
|
||||||
|
if (this.adjacent[srcV]==null){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
//works too with incident...
|
||||||
|
HashMap srcAdj=this.adjacent[srcV];
|
||||||
|
if (srcAdj.containsKey(new Integer(dstV))){ return true; }
|
||||||
|
else { return false; }
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui verifie si les sommets adjacents a src sont
|
||||||
|
* uniquement les sommets contenus dans le tableau dst
|
||||||
|
* Si non alors elle renvoie -1 et si oui elle renvoie le premier
|
||||||
|
* sommet dst adjacent a src
|
||||||
|
**/
|
||||||
|
public int withOnlyEdges(int src, Vector dst){
|
||||||
|
HashMap srcAdj=this.adjacent[src];
|
||||||
|
int taille=srcAdj.size();
|
||||||
|
int adj=-1;
|
||||||
|
Object[] adjacents=srcAdj.keySet().toArray();
|
||||||
|
|
||||||
|
if (taille>dst.size()){
|
||||||
|
//y a des sommets qui ne sont pas dans le tableau
|
||||||
|
return -1;
|
||||||
|
} else {
|
||||||
|
for (int i=0; i<taille; i++){
|
||||||
|
if (!dst.contains(adjacents[i])){
|
||||||
|
return -1;
|
||||||
|
} else {
|
||||||
|
if (adj==-1){
|
||||||
|
adj=((Integer)adjacents[i]).intValue();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return adj;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui renvoie la source (sommet racine) de ce graphe
|
||||||
|
**/
|
||||||
|
public int getSourceVertice(){
|
||||||
|
int i = -1;
|
||||||
|
if ((this.cardV != 0)&&(this.incident != null)){
|
||||||
|
for (int j=0; j<this.cardV; j++){
|
||||||
|
if (this.incident[j]==null){
|
||||||
|
i=j;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui renvoie la puis (sommet final) de ce graphe
|
||||||
|
* ou -1 s'il n'existe pas
|
||||||
|
**/
|
||||||
|
public int getFinalVertice(){
|
||||||
|
int i = -1;
|
||||||
|
if ((this.cardV != 0)&&(this.adjacent != null)){
|
||||||
|
for (int j=0; j<this.cardV; j++){
|
||||||
|
if (this.adjacent[j]==null){
|
||||||
|
i=j;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui renvoie la liste d'adjacence du sommet srcV
|
||||||
|
* ou -1 s'il n'existe pas
|
||||||
|
**/
|
||||||
|
public Collection getAdjacent(int srcV){
|
||||||
|
HashMap adj= this.adjacent[srcV];
|
||||||
|
if (adj==null){ return null; }
|
||||||
|
else { return adj.keySet(); }
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui renvoie le premier sommet adjacent a srcV
|
||||||
|
**/
|
||||||
|
public int getFirstAdjacentVertice(int srcV){
|
||||||
|
Iterator i=this.adjacent[srcV].keySet().iterator();
|
||||||
|
return ((Integer)i.next()).intValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui renvoie la liste de sommets ayant un arc vers
|
||||||
|
* sommet dstV
|
||||||
|
**/
|
||||||
|
public Collection getIncident(int dstV){
|
||||||
|
HashMap inc= this.incident[dstV];
|
||||||
|
if (inc==null){ return null; }
|
||||||
|
else { return inc.keySet(); }
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui enleve tous les arcs du graphe
|
||||||
|
**/
|
||||||
|
public void clear(){
|
||||||
|
for (int i=0; i<cardV; i++){
|
||||||
|
this.adjacent[i].clear();
|
||||||
|
this.incident[i].clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui rajoute tous les arcs possibles du graphe
|
||||||
|
**/
|
||||||
|
public void fill(){
|
||||||
|
for (int src=0; src<cardV; src++){
|
||||||
|
for (int dst=0; dst<cardV; dst++){
|
||||||
|
if (src==dst) {
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
|
if (this.adjacent[src]==null){
|
||||||
|
this.adjacent[src]=new HashMap();
|
||||||
|
}
|
||||||
|
if (this.incident[dst]==null){
|
||||||
|
this.adjacent[dst]=new HashMap();
|
||||||
|
}
|
||||||
|
HashMap srcList=this.adjacent[src];
|
||||||
|
HashMap dstList=this.incident[dst];
|
||||||
|
srcList.put(new Integer(dst),null);
|
||||||
|
dstList.put(new Integer(src),null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui rajoute un vertice a la fin de table d'adjacence
|
||||||
|
* Liste d'adjacence de ce nouveau vertice est encore VIDE
|
||||||
|
**/
|
||||||
|
public void addVertice(){
|
||||||
|
// Verify that we have enough free space
|
||||||
|
// and that 4*cardV < 3*adjlength <=> cardV < 3/4 * adj.length
|
||||||
|
if ((4*this.cardV) > (3*this.adjacent.length)){
|
||||||
|
System.out.println("ADDVERTICE: duplicating size: "+ this.cardV+"/"+this.adjacent.length+"...");
|
||||||
|
int extra=2*this.adjacent.length;
|
||||||
|
HashMap[] adjCopy = new HashMap[this.adjacent.length + extra];
|
||||||
|
HashMap[] incCopy = new HashMap[this.adjacent.length + extra];
|
||||||
|
System.arraycopy(this.adjacent,0,adjCopy,0,this.adjacent.length);
|
||||||
|
System.arraycopy(this.incident,0,incCopy,0,this.incident.length);
|
||||||
|
this.adjacent=adjCopy;
|
||||||
|
this.incident=incCopy;
|
||||||
|
System.out.println("ADDVERTICE: duplicating done.");
|
||||||
|
}
|
||||||
|
this.cardV++;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void removeVerticeAt(int index)
|
||||||
|
throws OutOfRangeVerticeException{
|
||||||
|
//TODO: écrire!!!
|
||||||
|
/*
|
||||||
|
if (index >= this.cardV){
|
||||||
|
throw (new OutOfRangeVerticeException());
|
||||||
|
} else {
|
||||||
|
|
||||||
|
}*/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
BIN
src/chocobar/combi/EdgeMatrixModel.class
Normal file
BIN
src/chocobar/combi/EdgeMatrixModel.class
Normal file
Binary file not shown.
251
src/chocobar/combi/EdgeMatrixModel.java
Normal file
251
src/chocobar/combi/EdgeMatrixModel.java
Normal file
|
@ -0,0 +1,251 @@
|
||||||
|
package chocobar.combi;
|
||||||
|
|
||||||
|
import java.util.*; // listes
|
||||||
|
|
||||||
|
import exception.*;
|
||||||
|
|
||||||
|
public class EdgeMatrixModel implements EdgeModel {
|
||||||
|
private int cardV;
|
||||||
|
private boolean[][] adjacent;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default constructor
|
||||||
|
**/
|
||||||
|
public EdgeMatrixModel() {
|
||||||
|
this(10);
|
||||||
|
this.cardV=0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor with card (number of vertices) as a parameter
|
||||||
|
**/
|
||||||
|
public EdgeMatrixModel(int card) {
|
||||||
|
this.cardV=card;
|
||||||
|
this.adjacent=new boolean[this.cardV][this.cardV];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui renvoie la dimension de cette matrice d'adjance
|
||||||
|
**/
|
||||||
|
public int getCardV(){
|
||||||
|
return this.cardV;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Fonction qui réinitialise à la taille donnée.
|
||||||
|
*/
|
||||||
|
public int setSize(int size)
|
||||||
|
{
|
||||||
|
cardV=size;
|
||||||
|
adjacent=new boolean[size][size];
|
||||||
|
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui rajoute un arc partant du sommet srcV
|
||||||
|
* vers sommet dstV
|
||||||
|
**/
|
||||||
|
public void addEdge(int srcV,int dstV)
|
||||||
|
throws OutOfRangeVerticeException
|
||||||
|
// plustard qu'on parse un graphe et rajoute des arcs sans
|
||||||
|
// passer par l'initialisation, il faut detecter le cas qu'on
|
||||||
|
// rajoute un arc n'importe quoi
|
||||||
|
{
|
||||||
|
if ((srcV<0) ||(dstV<0)
|
||||||
|
||(srcV>=cardV) || (dstV>=cardV)) {
|
||||||
|
throw new OutOfRangeVerticeException();
|
||||||
|
}
|
||||||
|
adjacent[srcV][dstV]=true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui verifie l'existence d'un arc du sommet srcV
|
||||||
|
* vers sommet dstV
|
||||||
|
**/
|
||||||
|
public boolean isEdge(int srcV,int dstV){
|
||||||
|
return adjacent[srcV][dstV];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui verifie si les sommets adjacents a src sont
|
||||||
|
* uniquement les sommets contenus dans le tableau dst
|
||||||
|
* Si non alors elle renvoie -1 et si oui elle renvoie le premier
|
||||||
|
* sommet dst adjacent a src
|
||||||
|
**/
|
||||||
|
public int withOnlyEdges(int src, Vector dst){
|
||||||
|
Collection srcAdj = getAdjacent(src);
|
||||||
|
int taille = srcAdj.size();
|
||||||
|
int adj=-1;
|
||||||
|
Object[] adjacents=srcAdj.toArray();
|
||||||
|
|
||||||
|
if (taille>dst.size()){
|
||||||
|
//y a des sommets qui ne sont pas dans le tableau
|
||||||
|
return -1;
|
||||||
|
} else {
|
||||||
|
for (int i=0; i<taille; i++){
|
||||||
|
if (!dst.contains(adjacents[i])){
|
||||||
|
return -1;
|
||||||
|
} else {
|
||||||
|
if (adj==-1){
|
||||||
|
adj=((Integer)adjacents[i]).intValue();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return adj;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui renvoie la source (sommet racine) de ce graphe
|
||||||
|
* ou -1 s'il n'existe pas
|
||||||
|
**/
|
||||||
|
public int getSourceVertice(){
|
||||||
|
int i = -1;
|
||||||
|
|
||||||
|
if (this.cardV != 0){
|
||||||
|
i=0;
|
||||||
|
for (int j=0; j<this.cardV; j++){
|
||||||
|
if (this.adjacent[j][i]){
|
||||||
|
i=j;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (int j=0; j<this.cardV; j++){
|
||||||
|
if (!this.adjacent[i][j]){
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (int j=0; j<this.cardV; j++){
|
||||||
|
if (this.adjacent[j][i]){
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui renvoie la puis (sommet final) de ce graphe
|
||||||
|
* ou -1 s'il n'existe pas
|
||||||
|
**/
|
||||||
|
public int getFinalVertice(){
|
||||||
|
int i = -1;
|
||||||
|
|
||||||
|
if (this.cardV != 0){
|
||||||
|
i=0;
|
||||||
|
for (int j=i+1; j<this.cardV; j++){
|
||||||
|
if (this.adjacent[i][j]){
|
||||||
|
i=j;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (int j=0; j<this.cardV; j++){
|
||||||
|
if (this.adjacent[i][j]){
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (int j=0; j<this.cardV; j++){
|
||||||
|
if (!this.adjacent[j][i]){
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui renvoie une liste d'adjacence du sommet srcV
|
||||||
|
**/
|
||||||
|
public Collection getAdjacent(int srcV){
|
||||||
|
LinkedList res=new LinkedList();
|
||||||
|
for (int i=0; i<cardV; i++){
|
||||||
|
if (adjacent[srcV][i])
|
||||||
|
res.add(new Integer(i));
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Collection getIncident(int dstV){
|
||||||
|
//TODO: écrire la méthode !!!
|
||||||
|
return new Vector();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui efface tous les arcs du graphe
|
||||||
|
**/
|
||||||
|
public void clear(){
|
||||||
|
// we remove edges between every vertice
|
||||||
|
for (int i=0; i<this.cardV;i++){
|
||||||
|
for (int j=0;j<this.cardV;j++){
|
||||||
|
this.adjacent[i][j]=false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui cree tous les arcs possibles du graphe
|
||||||
|
**/
|
||||||
|
public void fill(){
|
||||||
|
// we add edges between every vertice
|
||||||
|
for (int i=0; i<this.cardV;i++){
|
||||||
|
for (int j=0;j<this.cardV;j++){
|
||||||
|
this.adjacent[i][j]=true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// but a vertice cannot have an edge to itself
|
||||||
|
for (int i=0;i<this.cardV;i++){
|
||||||
|
this.adjacent[i][i]=false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui rajoute un vertice (sommet) a la liste des arcs du graphe
|
||||||
|
* les arcs sont encore VIDE
|
||||||
|
**/
|
||||||
|
public void addVertice(){
|
||||||
|
// Verify that we have enough free space
|
||||||
|
// and that 4*cardV < 3*adjlength <=> cardV < 3/4 * adj.length
|
||||||
|
if ((4*this.cardV) > (3*this.adjacent.length)){
|
||||||
|
int nuvolen=this.adjacent.length * 2;
|
||||||
|
boolean[][] copie = new boolean[nuvolen][nuvolen];
|
||||||
|
for (int i=0; i<this.cardV; i++){
|
||||||
|
// on copie juste les anciennes valeurs
|
||||||
|
// les nouvelles cases etant initialisee a 0
|
||||||
|
for (int j=0; j<this.cardV; j++){
|
||||||
|
copie[i][j]=adjacent[i][j];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.adjacent=copie;
|
||||||
|
}
|
||||||
|
this.cardV++;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void removeVerticeAt(int rmIdx)
|
||||||
|
throws OutOfRangeVerticeException{
|
||||||
|
if ((rmIdx<0) || (rmIdx>=this.cardV)){
|
||||||
|
throw new OutOfRangeVerticeException();
|
||||||
|
}
|
||||||
|
// create a new array (cardV-1) * (cardV-1)
|
||||||
|
boolean[][] neoAdj= new boolean[this.cardV-1][this.cardV-1];
|
||||||
|
|
||||||
|
// fill the new array zith the values of the previous
|
||||||
|
// adjacency matrix
|
||||||
|
int ni=0;
|
||||||
|
int nj=0;
|
||||||
|
|
||||||
|
for (int i=0;i<this.cardV;i++){
|
||||||
|
for (int j=0;j<this.cardV;j++){
|
||||||
|
if ((i!=rmIdx) || (j!=rmIdx)){
|
||||||
|
if (i<rmIdx){ni=i; }
|
||||||
|
if (i>rmIdx){ni=i-1; }
|
||||||
|
if (j<rmIdx){nj=j; }
|
||||||
|
if (j>rmIdx){nj=j-1; }
|
||||||
|
neoAdj[ni][nj]=this.adjacent[i][j];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// associate the new adjacency matrix to the class
|
||||||
|
this.cardV=this.cardV-1;
|
||||||
|
this.adjacent=neoAdj;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
BIN
src/chocobar/combi/EdgeModel.class
Normal file
BIN
src/chocobar/combi/EdgeModel.class
Normal file
Binary file not shown.
23
src/chocobar/combi/EdgeModel.java
Normal file
23
src/chocobar/combi/EdgeModel.java
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
package chocobar.combi;
|
||||||
|
|
||||||
|
import java.util.Collection; // listes
|
||||||
|
import java.util.Vector;
|
||||||
|
|
||||||
|
import exception.*;
|
||||||
|
|
||||||
|
public interface EdgeModel {
|
||||||
|
public int getCardV();
|
||||||
|
public void addEdge(int srcV,int dstV) throws OutOfRangeVerticeException;
|
||||||
|
public boolean isEdge(int srcV,int dstV);
|
||||||
|
public int setSize(int size);
|
||||||
|
public int withOnlyEdges(int srcV, Vector dstV);
|
||||||
|
public Collection getAdjacent(int srcV);
|
||||||
|
public Collection getIncident(int dstV);
|
||||||
|
public int getSourceVertice(); //racine du graphe
|
||||||
|
public int getFinalVertice(); //sommet final (un seul) du graphe
|
||||||
|
public void clear(); //no edges
|
||||||
|
public void fill(); //edges to everywhere
|
||||||
|
|
||||||
|
public void addVertice(); // add vertice at the end
|
||||||
|
public void removeVerticeAt(int index) throws OutOfRangeVerticeException;
|
||||||
|
}
|
BIN
src/chocobar/combi/Graph.class
Normal file
BIN
src/chocobar/combi/Graph.class
Normal file
Binary file not shown.
313
src/chocobar/combi/Graph.java
Normal file
313
src/chocobar/combi/Graph.java
Normal file
|
@ -0,0 +1,313 @@
|
||||||
|
package chocobar.combi;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
import java.util.*; // listes
|
||||||
|
import java.text.*; // streamtokenizer
|
||||||
|
|
||||||
|
import exception.*;
|
||||||
|
import graph.GenericGraph;
|
||||||
|
import graph.Vertice;
|
||||||
|
import conf.ChocoConfig;
|
||||||
|
|
||||||
|
public class Graph implements GenericGraph
|
||||||
|
{
|
||||||
|
private EdgeModel edgeModel;
|
||||||
|
private boolean isListModel;
|
||||||
|
private String name;
|
||||||
|
private VerticeSet verticeModel;
|
||||||
|
|
||||||
|
public Graph(){
|
||||||
|
this.edgeModel=null;
|
||||||
|
this.name=null;
|
||||||
|
this.isListModel=false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructeur par defaut
|
||||||
|
**/
|
||||||
|
public Graph(VerticeSet vmodel){
|
||||||
|
this.edgeModel=null;
|
||||||
|
this.name=null;
|
||||||
|
this.isListModel=false;
|
||||||
|
this.verticeModel=vmodel;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructeur d'un graphe non-initialise avec cardV sommets
|
||||||
|
**/
|
||||||
|
public Graph (VerticeSet vmodel,boolean isList, int cardV){
|
||||||
|
this(vmodel);
|
||||||
|
this.isListModel=isList;
|
||||||
|
if (isList){
|
||||||
|
this.edgeModel=new EdgeListModel(cardV);
|
||||||
|
} else {
|
||||||
|
this.edgeModel=new EdgeMatrixModel(cardV);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructeur d'un graphe initialise a partir
|
||||||
|
* du fichier filename
|
||||||
|
**/
|
||||||
|
public Graph(VerticeSet vmodel,boolean isList, String filename)
|
||||||
|
throws ParseException, IOException, FileNotFoundException
|
||||||
|
{
|
||||||
|
this(vmodel,isList,0);
|
||||||
|
this.loadFromFile(filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Initialize the Graph.
|
||||||
|
*/
|
||||||
|
public int setSize(int size)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
Class cEM = Class.forName("chocobar.combi."+ChocoConfig.edgeModel);
|
||||||
|
this.edgeModel = (EdgeModel) cEM.newInstance();
|
||||||
|
this.edgeModel.setSize(size);
|
||||||
|
} catch (Exception e) {
|
||||||
|
this.edgeModel = null;
|
||||||
|
e.printStackTrace();
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addEdge(int x, int y)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
this.edgeModel.addEdge(x, y);
|
||||||
|
} catch (OutOfRangeVerticeException e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui renvoie l'indice du vertice passe
|
||||||
|
* en parametre dans le vecteur des vertices de ce graphe
|
||||||
|
**/
|
||||||
|
public int indexOfVertice(Vertice e){
|
||||||
|
return this.verticeModel.getIdOf(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction d'initialisation du graphe a partir d'un fichier
|
||||||
|
**/
|
||||||
|
public void loadFromFile(String filename)
|
||||||
|
throws ParseException, IOException, FileNotFoundException
|
||||||
|
{
|
||||||
|
int verticeNb;
|
||||||
|
FileReader fi=new FileReader(filename);
|
||||||
|
StreamTokenizer si=new StreamTokenizer(fi);
|
||||||
|
si.eolIsSignificant(false);
|
||||||
|
si.lowerCaseMode(false);
|
||||||
|
si.parseNumbers();
|
||||||
|
|
||||||
|
/* parse the name of the graph */
|
||||||
|
si.nextToken();
|
||||||
|
if (si.ttype==StreamTokenizer.TT_WORD){
|
||||||
|
this.name=new String(si.sval);
|
||||||
|
} else {
|
||||||
|
throw new ParseException("Bad graph name",0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Parse number of vertices */
|
||||||
|
si.nextToken();
|
||||||
|
if (si.ttype==StreamTokenizer.TT_NUMBER){
|
||||||
|
verticeNb=(int)si.nval;
|
||||||
|
if (this.isListModel){
|
||||||
|
this.edgeModel=new EdgeListModel(verticeNb);
|
||||||
|
} else {
|
||||||
|
this.edgeModel=new EdgeMatrixModel(verticeNb);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
throw new ParseException("Bad graph size",0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Parse matrix */
|
||||||
|
for (int i=0; i<verticeNb;i++){
|
||||||
|
for (int j=0; j<verticeNb; j++){
|
||||||
|
si.nextToken();
|
||||||
|
if (si.ttype==StreamTokenizer.TT_NUMBER){
|
||||||
|
if (si.nval==0) {
|
||||||
|
// do nothing
|
||||||
|
} else {
|
||||||
|
// add an edge to the graph
|
||||||
|
try {
|
||||||
|
this.edgeModel.addEdge(i,j);
|
||||||
|
} catch (OutOfRangeVerticeException e){
|
||||||
|
throw new ParseException("Unknown vertice used",0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
throw new ParseException("Bad graph matrix",0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui verifie si les sommets adjacents a src sont
|
||||||
|
* uniquement les sommets contenus dans le tableau dst
|
||||||
|
* Si non alors elle renvoie -1 et si oui elle renvoie le premier
|
||||||
|
* sommet dst adjacent a src
|
||||||
|
**/
|
||||||
|
public int withOnlyEdges(int src, Vector dst){
|
||||||
|
return this.edgeModel.withOnlyEdges(src, dst);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the number of vertices of the Graph
|
||||||
|
**/
|
||||||
|
public int getCardV(){
|
||||||
|
return this.verticeModel.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
public VerticeSet getVerticeModel(){
|
||||||
|
return this.verticeModel;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the vertice at index vertIdx
|
||||||
|
* range verification is done by verticetab...
|
||||||
|
**/
|
||||||
|
|
||||||
|
public Vertice getVertice(int vertIdx) {
|
||||||
|
return ((Vertice)this.verticeModel.elementAt(vertIdx));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui verifie l'existence de l'arc
|
||||||
|
* du sommet srcV vers dstV
|
||||||
|
**/
|
||||||
|
public boolean isEdge(int srcV, int dstV){
|
||||||
|
return this.edgeModel.isEdge(srcV, dstV);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui renvoie l'indice du vertice racine du graphe
|
||||||
|
* ou -1 s'il n'existe pas
|
||||||
|
**/
|
||||||
|
public int getInitialState(){
|
||||||
|
return this.edgeModel.getSourceVertice();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui renvoie l'indice du vertice final du graphe
|
||||||
|
* ou -1 s'il n'existe pas
|
||||||
|
**/
|
||||||
|
public int getFinalState(){
|
||||||
|
return this.edgeModel.getFinalVertice();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui renvoie la liste d'adjacence du sommet srcV
|
||||||
|
**/
|
||||||
|
public Collection getAdjacent(int srcV)
|
||||||
|
throws OutOfRangeVerticeException
|
||||||
|
{
|
||||||
|
if ((srcV<0) || (srcV >= verticeModel.size())){
|
||||||
|
throw new OutOfRangeVerticeException();
|
||||||
|
}
|
||||||
|
return this.edgeModel.getAdjacent(srcV);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Collection getIncident(int dstV)
|
||||||
|
throws OutOfRangeVerticeException
|
||||||
|
{
|
||||||
|
if ((dstV<0) || (dstV >= verticeModel.size())){
|
||||||
|
throw new OutOfRangeVerticeException();
|
||||||
|
}
|
||||||
|
return this.edgeModel.getIncident(dstV);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui renvoie representation (sous forme de String)
|
||||||
|
* du graphe en format .txt
|
||||||
|
**/
|
||||||
|
public String toTxt(){
|
||||||
|
StringBuffer output;
|
||||||
|
if (this.verticeModel != null)
|
||||||
|
output=new StringBuffer(4*this.verticeModel.size());
|
||||||
|
else
|
||||||
|
output=new StringBuffer(80);
|
||||||
|
String endl=System.getProperty("line.separator");
|
||||||
|
if ((this.name) != null){
|
||||||
|
output.append(this.name+endl);
|
||||||
|
} else {
|
||||||
|
output.append("noName"+endl);
|
||||||
|
}
|
||||||
|
if (this.edgeModel==null){
|
||||||
|
output.append("0"+endl);
|
||||||
|
} else {
|
||||||
|
int taille=this.edgeModel.getCardV();
|
||||||
|
output.append(""+taille+endl);
|
||||||
|
for (int i=0;i<taille;i++){
|
||||||
|
for (int j=0; j<taille; j++){
|
||||||
|
if (this.edgeModel.isEdge(i,j)){
|
||||||
|
output.append("1 ");
|
||||||
|
} else {
|
||||||
|
output.append("0 ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
output.append(endl);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return output.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction qui renvoie representation (sous forme de String)
|
||||||
|
* du graphe en format .dot
|
||||||
|
**/
|
||||||
|
public String toDot(){
|
||||||
|
StringBuffer output;
|
||||||
|
String tempName;
|
||||||
|
String endl=System.getProperty("line.separator");
|
||||||
|
|
||||||
|
if (this.name==null){
|
||||||
|
tempName="noName";
|
||||||
|
} else {
|
||||||
|
tempName=this.name;
|
||||||
|
}
|
||||||
|
output=new StringBuffer("digraph "+tempName+" {"+endl);
|
||||||
|
if (this.edgeModel==null) {
|
||||||
|
output.append("}"+endl);
|
||||||
|
} else {
|
||||||
|
output=new StringBuffer("digraph "+this.name+" {");
|
||||||
|
output=output.append(endl);
|
||||||
|
|
||||||
|
// Pour l'instant label vaut le sommet d'ou l'arc part
|
||||||
|
int taille=this.edgeModel.getCardV();
|
||||||
|
for (int i=0; i<taille; i++){
|
||||||
|
Collection adj=this.edgeModel.getAdjacent(i);
|
||||||
|
output.append(i);
|
||||||
|
output.append(" [label=");
|
||||||
|
output.append(i);
|
||||||
|
output.append("];");
|
||||||
|
output.append(endl);
|
||||||
|
//output.append(adj);
|
||||||
|
if (adj!=null){
|
||||||
|
Iterator j=adj.iterator();
|
||||||
|
while(j.hasNext()){
|
||||||
|
output.append(" ");
|
||||||
|
output.append(i);
|
||||||
|
output.append(" -> ");
|
||||||
|
output.append((Integer)j.next());
|
||||||
|
output.append(" ;");
|
||||||
|
output.append(endl);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
output=output.append("}"+endl);
|
||||||
|
}
|
||||||
|
return output.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
BIN
src/chocobar/combi/VerticeSet.class
Normal file
BIN
src/chocobar/combi/VerticeSet.class
Normal file
Binary file not shown.
10
src/chocobar/combi/VerticeSet.java
Normal file
10
src/chocobar/combi/VerticeSet.java
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
package chocobar.combi;
|
||||||
|
|
||||||
|
import graph.Vertice;
|
||||||
|
|
||||||
|
public interface VerticeSet {
|
||||||
|
public boolean contains(Vertice v);
|
||||||
|
public Vertice elementAt(int idx);
|
||||||
|
public int getIdOf(Vertice v);
|
||||||
|
public int size();
|
||||||
|
}
|
BIN
src/conf/ChocoConfig.class
Normal file
BIN
src/conf/ChocoConfig.class
Normal file
Binary file not shown.
47
src/conf/ChocoConfig.java
Normal file
47
src/conf/ChocoConfig.java
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
package conf;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Classe pour la configuration
|
||||||
|
*/
|
||||||
|
|
||||||
|
public final class ChocoConfig
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Cannot Instantiate it
|
||||||
|
*/
|
||||||
|
private ChocoConfig() {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Définit la taille de la ChocoBar.
|
||||||
|
* On utilise 8 x 6 pour les benchmark
|
||||||
|
*/
|
||||||
|
public static int size;
|
||||||
|
public static int height;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Définit le style de ChocoBar à utiliser.
|
||||||
|
* Par exemple :
|
||||||
|
* - cbl ( avec une liste de BreakPoints )
|
||||||
|
* - combi ( à base de combinaisons )
|
||||||
|
*/
|
||||||
|
public static String chocoBarStyle = "combi";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Définit la classe de ChocoBar à utiliser.
|
||||||
|
* Par exemple :
|
||||||
|
* - cbl.ChocoBar
|
||||||
|
* - combi.ChocoBarLong
|
||||||
|
* - combi.ChocoBarBigInt
|
||||||
|
* - combi.ChocoBarArray
|
||||||
|
*/
|
||||||
|
public static String chocoBarModel = "combi.ChocoBarLong";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Définit la classe de EdgeModel à utiliser.
|
||||||
|
* - EdgeBigIntModel
|
||||||
|
* - EdgeBitSetModel
|
||||||
|
* - EdgeListModel
|
||||||
|
* - EdgeMatrixModel
|
||||||
|
*/
|
||||||
|
public static String edgeModel = "EdgeBigIntModel";
|
||||||
|
}
|
BIN
src/exception/AlreadyBrokenPointException.class
Normal file
BIN
src/exception/AlreadyBrokenPointException.class
Normal file
Binary file not shown.
3
src/exception/AlreadyBrokenPointException.java
Normal file
3
src/exception/AlreadyBrokenPointException.java
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
package exception;
|
||||||
|
|
||||||
|
public class AlreadyBrokenPointException extends Exception { }
|
BIN
src/exception/OutOfRangeBreakPointException.class
Normal file
BIN
src/exception/OutOfRangeBreakPointException.class
Normal file
Binary file not shown.
3
src/exception/OutOfRangeBreakPointException.java
Normal file
3
src/exception/OutOfRangeBreakPointException.java
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
package exception;
|
||||||
|
|
||||||
|
public class OutOfRangeBreakPointException extends Exception { }
|
BIN
src/exception/OutOfRangeVerticeException.class
Normal file
BIN
src/exception/OutOfRangeVerticeException.class
Normal file
Binary file not shown.
3
src/exception/OutOfRangeVerticeException.java
Normal file
3
src/exception/OutOfRangeVerticeException.java
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
package exception;
|
||||||
|
|
||||||
|
public class OutOfRangeVerticeException extends Exception { }
|
103
src/graph.dot
Normal file
103
src/graph.dot
Normal file
|
@ -0,0 +1,103 @@
|
||||||
|
digraph null {
|
||||||
|
0 [label=0];
|
||||||
|
0 -> 2 ;
|
||||||
|
0 -> 13 ;
|
||||||
|
0 -> 4 ;
|
||||||
|
0 -> 19 ;
|
||||||
|
0 -> 1 ;
|
||||||
|
0 -> 18 ;
|
||||||
|
0 -> 14 ;
|
||||||
|
0 -> 3 ;
|
||||||
|
0 -> 5 ;
|
||||||
|
1 [label=1];
|
||||||
|
1 -> 2 ;
|
||||||
|
1 -> 13 ;
|
||||||
|
1 -> 4 ;
|
||||||
|
1 -> 19 ;
|
||||||
|
1 -> 18 ;
|
||||||
|
1 -> 14 ;
|
||||||
|
1 -> 3 ;
|
||||||
|
1 -> 5 ;
|
||||||
|
2 [label=2];
|
||||||
|
2 -> 17 ;
|
||||||
|
2 -> 13 ;
|
||||||
|
2 -> 4 ;
|
||||||
|
2 -> 16 ;
|
||||||
|
2 -> 14 ;
|
||||||
|
2 -> 3 ;
|
||||||
|
2 -> 5 ;
|
||||||
|
3 [label=3];
|
||||||
|
3 -> 4 ;
|
||||||
|
3 -> 9 ;
|
||||||
|
3 -> 8 ;
|
||||||
|
3 -> 11 ;
|
||||||
|
3 -> 12 ;
|
||||||
|
3 -> 5 ;
|
||||||
|
4 [label=4];
|
||||||
|
4 -> 6 ;
|
||||||
|
4 -> 7 ;
|
||||||
|
4 -> 5 ;
|
||||||
|
5 [label=5];
|
||||||
|
6 [label=6];
|
||||||
|
6 -> 5 ;
|
||||||
|
7 [label=7];
|
||||||
|
7 -> 6 ;
|
||||||
|
7 -> 5 ;
|
||||||
|
8 [label=8];
|
||||||
|
8 -> 4 ;
|
||||||
|
8 -> 9 ;
|
||||||
|
8 -> 10 ;
|
||||||
|
8 -> 5 ;
|
||||||
|
9 [label=9];
|
||||||
|
9 -> 6 ;
|
||||||
|
9 -> 5 ;
|
||||||
|
10 [label=10];
|
||||||
|
10 -> 9 ;
|
||||||
|
10 -> 7 ;
|
||||||
|
10 -> 5 ;
|
||||||
|
11 [label=11];
|
||||||
|
11 -> 4 ;
|
||||||
|
11 -> 9 ;
|
||||||
|
11 -> 8 ;
|
||||||
|
11 -> 12 ;
|
||||||
|
12 [label=12];
|
||||||
|
12 -> 9 ;
|
||||||
|
12 -> 10 ;
|
||||||
|
12 -> 7 ;
|
||||||
|
13 [label=13];
|
||||||
|
13 -> 15 ;
|
||||||
|
13 -> 4 ;
|
||||||
|
13 -> 8 ;
|
||||||
|
13 -> 14 ;
|
||||||
|
13 -> 5 ;
|
||||||
|
14 [label=14];
|
||||||
|
14 -> 9 ;
|
||||||
|
14 -> 6 ;
|
||||||
|
14 -> 5 ;
|
||||||
|
15 [label=15];
|
||||||
|
15 -> 14 ;
|
||||||
|
15 -> 7 ;
|
||||||
|
15 -> 10 ;
|
||||||
|
15 -> 5 ;
|
||||||
|
16 [label=16];
|
||||||
|
16 -> 17 ;
|
||||||
|
16 -> 13 ;
|
||||||
|
16 -> 4 ;
|
||||||
|
16 -> 11 ;
|
||||||
|
16 -> 14 ;
|
||||||
|
17 [label=17];
|
||||||
|
17 -> 15 ;
|
||||||
|
17 -> 14 ;
|
||||||
|
17 -> 7 ;
|
||||||
|
17 -> 12 ;
|
||||||
|
18 [label=18];
|
||||||
|
18 -> 13 ;
|
||||||
|
18 -> 19 ;
|
||||||
|
18 -> 16 ;
|
||||||
|
18 -> 14 ;
|
||||||
|
19 [label=19];
|
||||||
|
19 -> 17 ;
|
||||||
|
19 -> 15 ;
|
||||||
|
19 -> 14 ;
|
||||||
|
}
|
||||||
|
|
BIN
src/graph.out
Normal file
BIN
src/graph.out
Normal file
Binary file not shown.
After Width: | Height: | Size: 14 KiB |
BIN
src/graph.png
Normal file
BIN
src/graph.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 14 KiB |
BIN
src/graph/EdgeModel.class
Normal file
BIN
src/graph/EdgeModel.class
Normal file
Binary file not shown.
21
src/graph/EdgeModel.java
Normal file
21
src/graph/EdgeModel.java
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
package graph;
|
||||||
|
|
||||||
|
import java.util.Collection; // listes
|
||||||
|
|
||||||
|
import exception.*;
|
||||||
|
|
||||||
|
public interface EdgeModel {
|
||||||
|
public int getCardV();
|
||||||
|
public void addEdge(int srcV,int dstV) throws OutOfRangeVerticeException;
|
||||||
|
public boolean isEdge(int srcV,int dstV);
|
||||||
|
public Collection getAdjacent(int srcV);
|
||||||
|
public Collection getIncident(int dstV);
|
||||||
|
public int getSourceVertice(); //racine du graphe
|
||||||
|
public int getFinalVertice(); //sommet final (un seul) du graphe
|
||||||
|
public void clear(); //no edges
|
||||||
|
public void fill(); //edges to everywhere
|
||||||
|
|
||||||
|
public void addVertice(); // add vertice at the end
|
||||||
|
public void removeVerticeAt(int index) throws OutOfRangeVerticeException;
|
||||||
|
}
|
||||||
|
|
BIN
src/graph/GenericGraph.class
Normal file
BIN
src/graph/GenericGraph.class
Normal file
Binary file not shown.
24
src/graph/GenericGraph.java
Normal file
24
src/graph/GenericGraph.java
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
package graph;
|
||||||
|
|
||||||
|
import java.text.ParseException;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Vector;
|
||||||
|
|
||||||
|
import exception.*;
|
||||||
|
|
||||||
|
public interface GenericGraph
|
||||||
|
{
|
||||||
|
public int getInitialState();
|
||||||
|
public int getFinalState();
|
||||||
|
public int getCardV();
|
||||||
|
public int setSize(int size);
|
||||||
|
public Collection getAdjacent(int i) throws OutOfRangeVerticeException;
|
||||||
|
public Collection getIncident(int i) throws OutOfRangeVerticeException;
|
||||||
|
public String toDot();
|
||||||
|
public String toTxt();
|
||||||
|
public int withOnlyEdges(int sommetInt, Vector gagnant);
|
||||||
|
public void loadFromFile(String filename)
|
||||||
|
throws ParseException, IOException, FileNotFoundException;
|
||||||
|
}
|
BIN
src/graph/Vertice.class
Normal file
BIN
src/graph/Vertice.class
Normal file
Binary file not shown.
8
src/graph/Vertice.java
Normal file
8
src/graph/Vertice.java
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
package graph;
|
||||||
|
|
||||||
|
public interface Vertice {
|
||||||
|
public void setLabel(String l);
|
||||||
|
public String getLabel();
|
||||||
|
public void setColor(int c);
|
||||||
|
public int getColor();
|
||||||
|
}
|
BIN
src/graph/VerticeSet.class
Normal file
BIN
src/graph/VerticeSet.class
Normal file
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue