UG_RRobots 1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (165) hide show
  1. data/bin/rrobots +202 -0
  2. data/bin/tournament +413 -0
  3. data/config/rrobots.yml +15 -0
  4. data/contribs/allbots.rb +0 -0
  5. data/doc/manual.rdoc +126 -0
  6. data/doc/manual_fr.rdoc +129 -0
  7. data/images/explosion00.gif +0 -0
  8. data/images/explosion01.gif +0 -0
  9. data/images/explosion02.gif +0 -0
  10. data/images/explosion03.gif +0 -0
  11. data/images/explosion04.gif +0 -0
  12. data/images/explosion05.gif +0 -0
  13. data/images/explosion06.gif +0 -0
  14. data/images/explosion07.gif +0 -0
  15. data/images/explosion08.gif +0 -0
  16. data/images/explosion09.gif +0 -0
  17. data/images/explosion10.gif +0 -0
  18. data/images/explosion11.gif +0 -0
  19. data/images/explosion12.gif +0 -0
  20. data/images/explosion13.gif +0 -0
  21. data/images/explosion14.gif +0 -0
  22. data/images/red_body000.gif +0 -0
  23. data/images/red_body010.gif +0 -0
  24. data/images/red_body020.gif +0 -0
  25. data/images/red_body030.gif +0 -0
  26. data/images/red_body040.gif +0 -0
  27. data/images/red_body050.gif +0 -0
  28. data/images/red_body060.gif +0 -0
  29. data/images/red_body070.gif +0 -0
  30. data/images/red_body080.gif +0 -0
  31. data/images/red_body090.gif +0 -0
  32. data/images/red_body100.gif +0 -0
  33. data/images/red_body110.gif +0 -0
  34. data/images/red_body120.gif +0 -0
  35. data/images/red_body130.gif +0 -0
  36. data/images/red_body140.gif +0 -0
  37. data/images/red_body150.gif +0 -0
  38. data/images/red_body160.gif +0 -0
  39. data/images/red_body170.gif +0 -0
  40. data/images/red_body180.gif +0 -0
  41. data/images/red_body190.gif +0 -0
  42. data/images/red_body200.gif +0 -0
  43. data/images/red_body210.gif +0 -0
  44. data/images/red_body220.gif +0 -0
  45. data/images/red_body230.gif +0 -0
  46. data/images/red_body240.gif +0 -0
  47. data/images/red_body250.gif +0 -0
  48. data/images/red_body260.gif +0 -0
  49. data/images/red_body270.gif +0 -0
  50. data/images/red_body280.gif +0 -0
  51. data/images/red_body290.gif +0 -0
  52. data/images/red_body300.gif +0 -0
  53. data/images/red_body310.gif +0 -0
  54. data/images/red_body320.gif +0 -0
  55. data/images/red_body330.gif +0 -0
  56. data/images/red_body340.gif +0 -0
  57. data/images/red_body350.gif +0 -0
  58. data/images/red_radar000.gif +0 -0
  59. data/images/red_radar010.gif +0 -0
  60. data/images/red_radar020.gif +0 -0
  61. data/images/red_radar030.gif +0 -0
  62. data/images/red_radar040.gif +0 -0
  63. data/images/red_radar050.gif +0 -0
  64. data/images/red_radar060.gif +0 -0
  65. data/images/red_radar070.gif +0 -0
  66. data/images/red_radar080.gif +0 -0
  67. data/images/red_radar090.gif +0 -0
  68. data/images/red_radar100.gif +0 -0
  69. data/images/red_radar110.gif +0 -0
  70. data/images/red_radar120.gif +0 -0
  71. data/images/red_radar130.gif +0 -0
  72. data/images/red_radar140.gif +0 -0
  73. data/images/red_radar150.gif +0 -0
  74. data/images/red_radar160.gif +0 -0
  75. data/images/red_radar170.gif +0 -0
  76. data/images/red_radar180.gif +0 -0
  77. data/images/red_radar190.gif +0 -0
  78. data/images/red_radar200.gif +0 -0
  79. data/images/red_radar210.gif +0 -0
  80. data/images/red_radar220.gif +0 -0
  81. data/images/red_radar230.gif +0 -0
  82. data/images/red_radar240.gif +0 -0
  83. data/images/red_radar250.gif +0 -0
  84. data/images/red_radar260.gif +0 -0
  85. data/images/red_radar270.gif +0 -0
  86. data/images/red_radar280.gif +0 -0
  87. data/images/red_radar290.gif +0 -0
  88. data/images/red_radar300.gif +0 -0
  89. data/images/red_radar310.gif +0 -0
  90. data/images/red_radar320.gif +0 -0
  91. data/images/red_radar330.gif +0 -0
  92. data/images/red_radar340.gif +0 -0
  93. data/images/red_radar350.gif +0 -0
  94. data/images/red_turret000.gif +0 -0
  95. data/images/red_turret010.gif +0 -0
  96. data/images/red_turret020.gif +0 -0
  97. data/images/red_turret030.gif +0 -0
  98. data/images/red_turret040.gif +0 -0
  99. data/images/red_turret050.gif +0 -0
  100. data/images/red_turret060.gif +0 -0
  101. data/images/red_turret070.gif +0 -0
  102. data/images/red_turret080.gif +0 -0
  103. data/images/red_turret090.gif +0 -0
  104. data/images/red_turret100.gif +0 -0
  105. data/images/red_turret110.gif +0 -0
  106. data/images/red_turret120.gif +0 -0
  107. data/images/red_turret130.gif +0 -0
  108. data/images/red_turret140.gif +0 -0
  109. data/images/red_turret150.gif +0 -0
  110. data/images/red_turret160.gif +0 -0
  111. data/images/red_turret170.gif +0 -0
  112. data/images/red_turret180.gif +0 -0
  113. data/images/red_turret190.gif +0 -0
  114. data/images/red_turret200.gif +0 -0
  115. data/images/red_turret210.gif +0 -0
  116. data/images/red_turret220.gif +0 -0
  117. data/images/red_turret230.gif +0 -0
  118. data/images/red_turret240.gif +0 -0
  119. data/images/red_turret250.gif +0 -0
  120. data/images/red_turret260.gif +0 -0
  121. data/images/red_turret270.gif +0 -0
  122. data/images/red_turret280.gif +0 -0
  123. data/images/red_turret290.gif +0 -0
  124. data/images/red_turret300.gif +0 -0
  125. data/images/red_turret310.gif +0 -0
  126. data/images/red_turret320.gif +0 -0
  127. data/images/red_turret330.gif +0 -0
  128. data/images/red_turret340.gif +0 -0
  129. data/images/red_turret350.gif +0 -0
  130. data/images/toolbox.gif +0 -0
  131. data/lib/battlefield.rb +102 -0
  132. data/lib/bullets.rb +39 -0
  133. data/lib/configuration.rb +26 -0
  134. data/lib/explosions.rb +20 -0
  135. data/lib/overloads.rb +10 -0
  136. data/lib/robot.rb +122 -0
  137. data/lib/robotrunner.rb +260 -0
  138. data/lib/tkarena.rb +197 -0
  139. data/lib/toolboxes.rb +28 -0
  140. data/robots/BillDuck.rb +92 -0
  141. data/robots/BotOne.rb +39 -0
  142. data/robots/DuckBill.rb +384 -0
  143. data/robots/DuckBill04.rb +330 -0
  144. data/robots/DuckToEndAllDucks.rb +140 -0
  145. data/robots/EdgeBot.rb +203 -0
  146. data/robots/HuntingDuck.rb +74 -0
  147. data/robots/HyperactiveDuck.rb +15 -0
  148. data/robots/Killer.rb +58 -0
  149. data/robots/Kite.rb +193 -0
  150. data/robots/KoDuck.rb +57 -0
  151. data/robots/LinearShooter.rb +279 -0
  152. data/robots/LuckyDuck.rb +83 -0
  153. data/robots/MoxonoM.rb +85 -0
  154. data/robots/MsgBot.rb +13 -0
  155. data/robots/NervousDuck.rb +13 -0
  156. data/robots/Polisher.rb +15 -0
  157. data/robots/RomBot.rb +514 -0
  158. data/robots/RoomPainter.rb +205 -0
  159. data/robots/Rrrkele.rb +48 -0
  160. data/robots/Seeker.rb +57 -0
  161. data/robots/ShootingStation.rb +15 -0
  162. data/robots/SittingDuck.rb +18 -0
  163. data/robots/SniperDuck.rb +277 -0
  164. data/robots/WallPainter.rb +224 -0
  165. metadata +220 -0
@@ -0,0 +1,15 @@
1
+ --- !ruby/object:Configuration
2
+ battlefield:
3
+ :height: 800
4
+ :width: 800
5
+ bullets:
6
+ :speed: 30
7
+ game:
8
+ :timeout: 50000
9
+ robots:
10
+ :energy_max: 100
11
+ toolboxes:
12
+ :energy_heal_points: 20
13
+ :with_toolboxes: false
14
+ :life_time: 200
15
+ :spawning_chances: 100
File without changes
@@ -0,0 +1,126 @@
1
+ = RRobots v0.2.2
2
+
3
+ == Presentation
4
+
5
+ First there was CRobots, followed by PRobots and many others, recently
6
+ (well also years ago) Robocode emerged and finally this is RRobots bringing
7
+ all the fun to the ruby community.
8
+
9
+ == What is he talking about?
10
+
11
+ RRobots is a simulation environment for robots, these robots have a scanner
12
+ and a gun, can move forward and backwards and are entirely controlled by
13
+ ruby scripts. All robots are equal (well at the moment, maybe this will
14
+ change) except for the ai.
15
+
16
+ == A simple robot script
17
+
18
+ <code>
19
+ require 'robot'
20
+ class NervousDuck
21
+ include Robot
22
+ def tick events
23
+ turn_radar 1 if time == 0
24
+ turn_gun 30 if time < 3
25
+ accelerate 1
26
+ turn 2
27
+ fire 3 unless events['robot_scanned'].empty?
28
+ end
29
+ end
30
+ </code>
31
+
32
+
33
+ all you need to implement is the tick method which should accept a hash
34
+ of events occured turing the last tick.
35
+
36
+
37
+ == API RRobots Fork
38
+
39
+ By including Robot you get all this methods to controll your bot:
40
+
41
+ - *battlefield_height* the height of the battlefield
42
+ - *battlefield_width* the width of the battlefield
43
+ - *energy* your remaining energy (if this drops below 0 you are dead)
44
+ - *gun_heading* the heading of your gun, 0 pointing east, 90 pointing, north, 180 pointing west, 270 pointing south
45
+ - *gun_heat* your gun heat, if this is above 0 you can't shoot
46
+ - *heading* your robots heading, 0 pointing east, 90 pointing north, 180 pointing west, 270 pointing south
47
+ - *size* your robots radius, if x <= size you hit the left wall
48
+ - *radar_heading* the heading of your radar, 0 pointing east, 90 pointing north, 180 pointing west, 270 pointing south
49
+ - *time* ticks since match start
50
+ - *speed* your speed (-8/8)
51
+ - *x* your x coordinate, 0...battlefield_width
52
+ - *y* your y coordinate, 0...battlefield_height
53
+ - *accelerate*(_param_) accelerate (max speed is 8, max accelerate is 1/-1, negativ speed means moving backwards)
54
+ - *stop* accelerates negativ if moving forward (and vice versa), may take 8 ticks to stop (and you have to call it every tick)
55
+ - *fire*(_power_) fires a bullet in the direction of your gun, power is 0.1 - 3, this power will heat your gun
56
+ - *turn*(_degrees_) turns the robot (and the gun and the radar), max 10 degrees per tick
57
+ - *turn_gun*(_degrees_) turns the gun (and the radar), max 30 degrees per tick
58
+ - *turn_radar*(_degrees_) turns the radar, max 60 degrees per tick
59
+ - *dead* true if you are dead
60
+ - *say*(_msg_) shows msg above the robot on screen
61
+ - *broadcast*(_msg_) broadcasts msg to all bots (they recieve 'broadcasts' events with the msg and rough direction)
62
+
63
+ These methods are intentionally of very basic nature, you are free to
64
+ unleash the whole power of ruby to create higher level functions.
65
+ (e.g. move_to, fire_at and so on)
66
+
67
+ Some words of explanation: The gun is mounted on the body, if you turn
68
+ the body the gun will follow. In a simmilar way the radar is mounted on
69
+ the gun. The radar scans everything it sweeps over in a single tick (100
70
+ degrees if you turn your body, gun and radar in the same direction) but
71
+ will report only the distance of scanned robots, not the angle. If you
72
+ want more precission you have to turn your radar slower.
73
+ UG RRobots Fork introduce toolboxes, toolboxes could spawn during a match and if a robot run over it, the toolbox heal it of a default value of 20 energy point.
74
+ Toolboxes could be scan separatly of the robots (events keys scanned_toolboxes)
75
+ The toolbox mode is optionnal
76
+
77
+ RRobots is implemented in pure ruby using a tk ui and should run on all
78
+ platforms that have ruby and tk. (until now it's tested on windows, OS X
79
+ and several linux distributions)
80
+
81
+ === To start a match call:
82
+
83
+ <pre>
84
+ ruby rrobots.rb [resolution] [#match] [-nogui] [-speed=<N>] [-with-toolboxes] [-timeout=<N>] <FirstRobotClassName[.rb]> <SecondRobotClassName[.rb]> <...>
85
+
86
+ [resolution] (optional) should be of the form 640x480 or 800*600.
87
+ default is 800x800
88
+ [match] (optional) to replay a match, put the match# here, including
89
+ the #sign.
90
+ [-nogui] (optional) run the match without the gui, for highest possible
91
+ speed.(ignores speed value if present)
92
+ [-speed=<N>] (optional, defaults to 1) updates GUI after every N ticks.
93
+ The higher the N, the faster the match will play.
94
+ [-timeout=<N>] (optional, default 50000) number of ticks a match will
95
+ last at most.
96
+ [-ignore-config] (optional) to ignore the config file YAML present in the path.
97
+ [-write-config] (optional) to write the config in YAML in a file in the path.
98
+ [-with-toolboxes] (optional) to accept the spawning of healing toolboxes (randomly).
99
+ </pre>
100
+
101
+ the names of the rb files have to match the class names of the robots (up to 8 robots)
102
+
103
+ e.g.
104
+ 'ruby rrobots.rb SittingDuck NervousDuck'
105
+ or
106
+ 'ruby rrobots.rb 600x600 #1234567890 SittingDuck NervousDuck'
107
+
108
+ === If you want to run a tournament call:
109
+
110
+ <pre>
111
+ ruby tournament.rb [-timeout=<N>] [-matches=<N>] [-with-toolboxes] (-dir=<Directory> | <RobotClassName[.rb]>+)
112
+
113
+ [-timeout=<N>] (optional, default 10000) number of ticks a match
114
+ will last at most.
115
+ [-matches=<N>] (optional, default 2) how many times each robot
116
+ fights every other robot.
117
+ -dir=<Directory> All .rb files from that directory will be
118
+ matched against each other.
119
+ [-ignore-config] (optional) to ignore the config file YAML present in the path.
120
+ [-with-toolboxes] (optional) to accept the spawning of healing toolboxes (randomly).
121
+ </pre>
122
+
123
+
124
+ the names of the rb files have to match the class names of the robots.
125
+ Each robot is matched against each other 1on1. The results are available
126
+ as yaml or html files.
@@ -0,0 +1,129 @@
1
+ = UG RRobots Fork
2
+
3
+ == Version
4
+
5
+ - UG RRobots Fork v1.0
6
+ - fork of RRobots v0.2.2
7
+
8
+ Au début il y avait CRobots (Version C), suivit par PRobots (Pascal) et beaucoup d'autres, récemment (quelques années quand même) Robocode à fait son apparition (version Java) et maintenant il y a RRobots qui apporte le fun à la communauté Ruby
9
+ Cette Variante du programme initilale de Simon Kröger, http://rubyforge.org/projects/rrobots, apporte de nouvelles fonctionnalitées
10
+
11
+ == De quoi parle-t-on ?
12
+
13
+ UG RRobots est une simulation de champs de bataille pour Robots Virtuels
14
+ Chaque Robots possède un Radar et un Canon
15
+ Les robots peuvent bouger vers l'avant et l'arrière et son entièrement contrôlés par des scripts en Ruby
16
+ Tous les robots ont les même caractéristiques, et tant que le joueur n'a pas codé son Intelligence le robot est un objet inerte.
17
+
18
+ == Un exemple de script rudimentaire
19
+
20
+ === il pourrait ressembler à ceci :
21
+
22
+ <code language="ruby">
23
+ require 'robot'
24
+ class NervousDuck
25
+ include Robot
26
+ def tick events
27
+ turn_radar 1 if time == 0
28
+ turn_gun 30 if time < 3
29
+ accelerate 1
30
+ turn 2
31
+ fire 3 unless events['robot_scanned'].empty?
32
+ end
33
+ end
34
+ </code>
35
+
36
+ *Précaution* : le fichier d'un robot doit avoir le même nom que la Classe du Robot (son nom), par exemple ici NervousDuck.rb
37
+
38
+ == API RRobots
39
+
40
+ La seule méthode à implémenter au minimum pour animer votre robot est la méthode *tick* qui a pour paramètre *events*, un hachage des événements qui sont survenus pendant le dernier 'tick'.
41
+ Un tick est une opération atomique pour tout les éléments du jeu.
42
+
43
+ En incluant le module Ruby Robot vous récupérez les méthodes indispensable pour piloter votre robot :
44
+
45
+ - *battlefield_height* : la longueur du champ de bataille
46
+ - *battlefield_width* : la largeur du champ de bataille
47
+ - *energy* : la quantité d'énergie restante (si elle tombe à 0 votre robot meure )
48
+ - *gun_heading* : l'orientation de votre canon, EST : 0 / NORD : 90 / OUEST : 180 / SUD : 270)
49
+ - *gun_heat* : l'indicateur de surchauffe du canon, quand il re-descent à 0, vous pouvez tirer de nouveau
50
+ - *heading* : l'orientation de votre robot, EST : 0 / NORD : 90 / OUEST : 180 / SUD : 270)
51
+ - *size* : le rayon de votre robot, si x <= size vous heurtez le mur gauche
52
+ - *radar_heading* : l'orientation de votre radar, EST : 0 / NORD : 90 / OUEST : 180 / SUD : 270)
53
+ - *time* : le nombre de 'tick' depuis le début du round.
54
+ - *speed* : votre vitesse (-8/8)
55
+ - *x* : votre abscisse X, dans l'intervalle 0...battlefield_width
56
+ - *y* : votre ordonné Y, dans l'intervalle 0...battlefield_height
57
+ - *accelerate*(_param_) : définit l'accélération (la vitesse max est -8/8, l'acceleration max est 1/-1, une vitesse négative signifie reculer
58
+ - *stop* : réduit votre vitesse à 0, l'opération prend 1 ticks par point de vitesse, positif ou négatif
59
+ - *fire*(_power_) : lance un boulet de canon dans le sens de votre canon, la puissance va de 0,1 à 3 (plus la puissance est grande plus le temps de surchauffe est grand)
60
+ - *turn*(_degrés_)* : tourne votre robot et donc votre canon et votre radar (max 10 degrés par tick)
61
+ - *turn_gun*(_degres_) : tourne votre canon et donc votre radar (max 30 degrés par tick)
62
+ - *turn_radar*(_degres_) : tourne votre radar (max 60 degrés par tick)
63
+ - *dead* : renvoie vrai si vous êtes mort
64
+
65
+ * *say*(_msg_) : affiche un message sur l'écran en mode GUI/TK au dessus de votre robot.
66
+ * *broadcast*(_msg_) : envoie un message à tous les robots sur le champs de bataille, une clef '*broadcast*' est ajouté au hachage '*events*' avec le message
67
+
68
+ Cette liste de méthode est volontairement réduite et basique, à la charge du joueur créer ses propres méthodes de haut niveau grace à la puissance de Ruby.
69
+ (exemple : move_to, fire_at, etc...)
70
+
71
+ === Quelques mots d'explication :
72
+
73
+ - Le canon est monté sur le corps du robot, donc si vous bougez le robot le canon suit.
74
+ Pareil pour le radar, qui se trouve sur le canon.
75
+
76
+ - Le radar scan tout se qui trouve sur le rayon de déplacement cumulé du robot, du canon et du radar lui même (mouvement relatif du radar) sur un '*tick*' donné, mais ne renvoi que la distance vers le/les objets scannés (clef *scanned_robots* avec la distance en valeur pour les robots, et clef scanned_toolboxes avec la distance en valeur pour les boites à outils) ceci fait donc un angles d'incertitude maximum de 100°, pour pouvoir être précis il faut bouger votre radar plus doucement.
77
+
78
+ - UG RRobots Fork introduit les boites à outils, elle sont donc détectables par le radar, lorsqu'un robot passe sur l'une d'elle, il récupère des points d'energie (20 par défaut).
79
+ Les boites à outils apparaissent de façon aléatoire et reste pour une durée définie ( 200 ticks par défaut), chaque tick elle ont la même chance (faible) d'apparaître (1 sur 100 par défaut)
80
+
81
+ UG RRobots Fork comme la version d'origine est implémenté en Ruby pur avec une Interface Graphique TK et peut tourner sur de nombreuses plateformes qui possèdent Ruby et TK, le moteur du jeu en lui même peu très bien se passer de TK.
82
+ UG RRobots Fork à été testé sur Windows, la plus part des distributions Linux, FreeBSD et Windows
83
+
84
+ == Utilisation du moteur de match simple
85
+
86
+ <pre>
87
+ ruby rrobots.rb [resolution] [#match] [-nogui] [-speed=<N>] [-timeout=<N>] [-with-toolboxes] <RobotClassName[.rb]> <RobotClassName[.rb]> <...>
88
+
89
+ [resolution] (optionel) doit être de la forme 640x480 ou 800*600.
90
+ 800x800 par défaut
91
+ [match] (optionel) pour rejouer un match, préciser un numéro de match , avec le signe
92
+ # devant.
93
+ [-nogui] (optionel) lance le match sans GUI/TK, ignore -speed
94
+ [-with-toolboxes] (optionel) active l'apparition de boite à outils et leurs détections.
95
+ [-speed=<N>] (optionel, défaut 1) rafraîchit la GUI après N ticks.
96
+ Plus N est grand, plus le match s'affichera vite.
97
+ [-timeout=<N>] (optionel, defaut 50000) nombre de ticks maximum d'un match
98
+ [-ignore-config] (optional) pour ignorer la config au format YAML dan un fichier dans le path.
99
+ [-write-config] (optional) pour ecrire la config au format YAML dan un fichier dans le path.
100
+ </pre>
101
+
102
+ * le fichier d'un robot doit avoir le même nom que la Classe du Robot
103
+ * (jusqu'à 8 robots)
104
+
105
+ exemple :
106
+
107
+ ruby rrobots.rb SittingDuck NervousDuck'
108
+
109
+ ou
110
+
111
+ ruby rrobots.rb 600x600 #1234567890 SittingDuck NervousDuck'
112
+
113
+ == Utilisation du moteur de tournoi :
114
+
115
+ Pas besoin de TK
116
+
117
+ <pre>
118
+ ruby tournament.rb [-timeout=<N>] [-matches=<N>] (-dir=<Directory> | <RobotClassName[.rb]>+)
119
+
120
+ [-timeout=<N>] (optionel, defaut 50000) nombre de ticks maximum d'un match
121
+ [-with-toolboxes] (optionel) active l'apparition de boite à outils et leurs détections.
122
+ [-matches=<N>] (optionel, defaut 2) nombre de rounds par match entre deux robots
123
+ -dir=<Directory> tout les fichiers .rb dans le répertoire seront considérents comme des robots concurents
124
+ [-ignore-config] (optional) pour ignorer la config au format YAML dan un fichier dans le path.
125
+ </pre>
126
+
127
+ - le fichier d'un robot doit avoir le même nom que la Classe du Robot
128
+ - les robots s'affrontes un contre un
129
+ - les resultats son disponible au formats YAML et HTML
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file