matias-cataife commited on
Commit
05f1fb3
·
verified ·
1 Parent(s): 00dbec9

browse MV db: static/index.html

Browse files
Files changed (1) hide show
  1. static/index.html +38 -285
static/index.html CHANGED
@@ -3,7 +3,7 @@
3
  <head>
4
  <meta charset="UTF-8">
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>Scouting · Racing Santander</title>
7
  <link rel="preconnect" href="https://fonts.googleapis.com">
8
  <link href="https://fonts.googleapis.com/css2?family=DM+Sans:ital,opsz,wght@0,9..40,300;0,9..40,400;0,9..40,500;0,9..40,600;0,9..40,700;1,9..40,400&family=Instrument+Serif:ital@0;1&display=swap" rel="stylesheet">
9
  <link rel="stylesheet" href="/static/styles.css">
@@ -11,8 +11,8 @@
11
  <body>
12
 
13
  <header class="header">
14
- <h1>Scouting <em>Racing Santander</em></h1>
15
- <span class="subtitle">Cargando&hellip;</span>
16
  <span class="api-meta" id="apiMeta"></span>
17
  </header>
18
 
@@ -25,9 +25,7 @@
25
  <div class="filter-label">Liga</div>
26
  <div class="ms" id="leagueMs">
27
  <button type="button" class="ms-button" id="leagueMsBtn" aria-haspopup="listbox" aria-expanded="false">
28
- <span class="ms-label" id="leagueMsLabel">Todas las ligas</span>
29
- <span class="ms-count" id="leagueMsCount">0</span>
30
- <span class="ms-caret">&#9662;</span>
31
  </button>
32
  <div class="ms-panel" role="listbox" aria-multiselectable="true">
33
  <div class="ms-panel-search">
@@ -49,57 +47,46 @@
49
  <div class="filter-label">Edad</div>
50
  <div class="filter-range">
51
  <input type="number" class="filter-input" id="ageMin" placeholder="Min" min="14" max="45">
52
- <span class="filter-separator">&mdash;</span>
53
- <input type="number" class="filter-input" id="ageMax" placeholder="Max" min="14" max="45" value="25">
54
  </div>
55
  </div>
56
  <div class="filter-group">
57
- <div class="filter-label">Pasaporte UE</div>
58
- <select class="filter-select" id="euFilter">
59
- <option value="all">Todos</option>
60
- <option value="eu">Solo UE</option>
61
- <option value="non-eu">Solo no UE</option>
62
- </select>
63
  </div>
64
  <div class="filter-group">
65
- <div class="filter-label">Contrato</div>
66
- <select class="filter-select" id="contractFilter">
67
- <option value="all">Todos</option>
68
- <option value="libre">Libre (&le;6m)</option>
69
- <option value="urgente">Urgente (&le;12m)</option>
 
70
  </select>
71
  </div>
72
  <div class="filter-group">
73
- <div class="filter-label">Valor de mercado (€M)</div>
74
  <div class="filter-range">
75
- <input type="number" class="filter-input" id="mvMin" placeholder="Min" min="0" max="500" step="0.5" value="0">
76
- <span class="filter-separator">&mdash;</span>
77
- <input type="number" class="filter-input" id="mvMax" placeholder="Max" min="0" max="500" step="0.5" value="15">
78
  </div>
79
  </div>
80
  <div class="filter-group">
81
- <div class="filter-label">Pie</div>
82
- <select class="filter-select" id="footFilter">
83
- <option value="all">Todos</option>
84
- <option value="right">Derecho</option>
85
- <option value="left">Zurdo</option>
86
- <option value="both">Ambidiestro</option>
87
- </select>
88
  </div>
89
  <div class="filter-group">
90
- <label class="filter-checkbox">
91
- <input type="checkbox" id="tmDataFilter">
92
- <span>Solo con datos TM</span>
93
- </label>
 
 
94
  </div>
95
  <div class="filter-count" id="filterCount"></div>
96
  </div>
97
 
98
- <nav class="tab-nav">
99
- <button class="tab-btn active" data-tab="table" id="tabBtnTable">Tabla <span class="tab-badge" id="tabBadgeTable">0</span></button>
100
- <button class="tab-btn" data-tab="pitch" id="tabBtnPitch">Mejor 11</button>
101
- </nav>
102
-
103
  <section class="view active" id="view-table">
104
  <div class="table-view">
105
  <div class="table-toolbar">
@@ -107,85 +94,7 @@
107
  <input type="text" id="tableSearch" placeholder="Buscar jugador, equipo o liga&hellip;" autocomplete="off">
108
  </div>
109
  <div class="table-meta">
110
- <strong id="tableShownCount">0</strong> de <strong id="tableTotalCount">0</strong> jugadores
111
- </div>
112
- <button type="button" id="openPondModalBtn" class="pond-open-btn" title="Ajustar ponderaciones">Ponderaciones</button>
113
- <button type="button" id="openScoreDocsBtn" class="pond-open-btn" title="Cómo se calcula el Score">¿Cómo se calcula?</button>
114
- </div>
115
- <div class="pond-modal" id="scoreDocsModal" aria-hidden="true">
116
- <div class="pond-modal-backdrop" id="scoreDocsBackdrop"></div>
117
- <div class="pond-modal-card" role="dialog" aria-labelledby="scoreDocsTitle" style="width:min(720px,94vw);">
118
- <div class="pond-modal-header">
119
- <h3 id="scoreDocsTitle">📖 Cómo se calcula el Score</h3>
120
- <button type="button" class="pond-modal-close" id="scoreDocsClose" aria-label="Cerrar">&times;</button>
121
- </div>
122
- <div class="pond-modal-body score-docs-body">
123
- <h3>Score final (Scouting Score)</h3>
124
- <p>El <strong>Scouting Score</strong> es una combinación lineal de dos componentes:</p>
125
- <pre><code>scouting_score = w_perf · performance_score + w_perfil · profile_score</code></pre>
126
- <p>Por defecto <code>w_perf = 0.6</code> y <code>w_perfil = 0.4</code>. Ambos pesos se ajustan desde el modal <em>Ponderaciones</em>.</p>
127
-
128
- <h3>1. Performance Score (rendimiento)</h3>
129
- <p>Mide qué tan bien rinde el jugador en métricas <strong>respecto de su posición y temporada</strong>. Se calcula en tres pasos:</p>
130
- <ol>
131
- <li><strong>Percentiles por (posición, temporada):</strong> cada métrica se transforma en un percentil [0,1] dentro del grupo de jugadores de la misma <code>mapped_position</code> y la misma <code>Temporada</code>. Las métricas marcadas como <em>invertidas</em> (donde menos es mejor) se calculan como <code>1 − percentil</code>.</li>
132
- <li><strong>Score por bloque:</strong> cada bloque (p. ej. <em>Pase</em>, <em>Defensa</em>, <em>Finalización</em>) es un promedio ponderado de los percentiles de sus métricas, usando los pesos definidos en <code>PESOS_POR_VARIABLE.xlsx</code>:
133
- <pre><code>block_score = Σ(percentil_metric · weight) / Σ(weight)</code></pre>
134
- </li>
135
- <li><strong>Performance Score:</strong> promedio simple de los <em>block_scores</em> del jugador, escalado por los pesos del modal <em>Ponderaciones → Bloques</em>.</li>
136
- </ol>
137
- <p>Resultado: un valor en [0,1] donde 1 = top de la posición.</p>
138
-
139
- <h3>2. Profile Score (perfil)</h3>
140
- <p>Mide qué tan atractivo es el <strong>perfil contextual</strong> del jugador (edad, ficha, liga, valor de mercado). Se calcula como promedio ponderado de hasta 4 factores:</p>
141
- <table>
142
- <thead><tr><th>Factor</th><th>Cómo se calcula</th><th>Peso default</th></tr></thead>
143
- <tbody>
144
- <tr>
145
- <td><strong>Edad</strong></td>
146
- <td><code>&lt; 23 → 1.0</code> · <code>23–25 → 0.5</code> · <code>&gt; 25 → 0.0</code></td>
147
- <td>0.35</td>
148
- </tr>
149
- <tr>
150
- <td><strong>Pasaporte UE</strong></td>
151
- <td><code>UE → 1.0</code> · <code>no UE → 0.0</code></td>
152
- <td>0.25</td>
153
- </tr>
154
- <tr>
155
- <td><strong>Liga (tier)</strong></td>
156
- <td>Tabla fija <code>LEAGUE_TIERS</code> en <code>scouting_score.py</code> (top-5 europeas y Argentina/Brasil = 1.0; tiers más bajos hasta 0.3).</td>
157
- <td>0.20</td>
158
- </tr>
159
- <tr>
160
- <td><strong>Valor de mercado</strong></td>
161
- <td><code>&lt; €3M → 1.0</code> · <code>€3–5M → 0.5</code> · <code>&gt; €5M → excluido</code> del promedio</td>
162
- <td>0.20</td>
163
- </tr>
164
- </tbody>
165
- </table>
166
- <pre><code>profile_score = Σ(factor_i · w_i) / Σ(w_i)</code></pre>
167
- <p>Si la edad o el valor de mercado faltan (sin datos TM), ese factor no entra en el promedio y los pesos se renormalizan automáticamente.</p>
168
-
169
- <h3>3. Filtros previos al cálculo</h3>
170
- <p>Antes de calcular percentiles, el dataset se filtra por: <em>temporadas activas, ligas seleccionadas, edad mínima/máxima, mínimo de minutos (450 por defecto), pie, valor de mercado tope, contrato</em>. Cambios en estos filtros disparan un recálculo del lado del servidor.</p>
171
-
172
- <h3>4. Ponderaciones personalizadas</h3>
173
- <p>El modal <em>Ponderaciones</em> permite modificar:</p>
174
- <ul>
175
- <li><strong>Rendimiento ↔ Perfil</strong>: el reparto entre los dos componentes principales.</li>
176
- <li><strong>Factores de perfil</strong>: cuánto pesa cada uno de Edad, UE, Liga, Valor.</li>
177
- <li><strong>Bloques de rendimiento</strong>: cuánto pesa cada bloque dentro del Performance Score (recalculado en cliente sin volver a pedir al server).</li>
178
- </ul>
179
- <p>Los cambios sólo se aplican al apretar <strong>Calcular</strong>.</p>
180
-
181
- <h3>Resumen visual</h3>
182
- <pre><code>scouting_score
183
- ├── performance_score (60% default)
184
- │ └── promedio de block_scores (con pesos del modal)
185
- │ └── promedio ponderado de percentiles por (posición, temporada)
186
- └── profile_score (40% default)
187
- └── Σ(factor · peso) / Σ(peso) sobre {edad, UE, liga, valor}</code></pre>
188
- </div>
189
  </div>
190
  </div>
191
  <div class="data-table-wrap">
@@ -193,18 +102,16 @@
193
  <table class="data-table" id="dataTable">
194
  <thead>
195
  <tr>
196
- <th data-key="j" class="sortable">Jugador <span class="sort-arrow"></span></th>
197
- <th data-key="p" class="sortable">Pos <span class="sort-arrow"></span></th>
198
- <th data-key="t" class="sortable">Temp. <span class="sort-arrow"></span></th>
199
  <th data-key="age" class="sortable num">Edad <span class="sort-arrow"></span></th>
200
- <th data-key="nat" class="sortable">Nacionalidad <span class="sort-arrow"></span></th>
201
- <th data-key="foot" class="sortable">Pie <span class="sort-arrow"></span></th>
202
- <th data-key="mv_n" class="sortable num">Valor <span class="sort-arrow"></span></th>
203
- <th data-key="ct" class="sortable">Contrato <span class="sort-arrow"></span></th>
204
- <th data-key="min" class="sortable num">Min <span class="sort-arrow"></span></th>
205
- <th data-key="ps" class="sortable num">Rendimiento <span class="sort-arrow"></span></th>
206
- <th data-key="pf" class="sortable num">Perfil <span class="sort-arrow"></span></th>
207
- <th data-key="ss" class="sorted desc num">Score <span class="sort-arrow">&darr;</span></th>
208
  </tr>
209
  </thead>
210
  <tbody id="dataTableBody"></tbody>
@@ -223,160 +130,6 @@
223
  <div class="table-drawer-body" id="tableDrawerBody"></div>
224
  </aside>
225
 
226
- <section class="view" id="view-pitch">
227
- <div class="main">
228
- <div class="pond-sidebar" id="pondSidebar">
229
- <div class="pond-sidebar-title">Ponderaciones</div>
230
- <div class="pond-section">
231
- <div class="pond-section-title">Pesos generales</div>
232
- <div class="pond-rows">
233
- <div class="pond-row">
234
- <span class="pond-row-label">Rendimiento</span>
235
- <input type="range" class="pond-slider" id="pondPerf" min="0" max="100" value="70">
236
- <span class="pond-val" id="pondPerfVal">70</span>
237
- </div>
238
- <div class="pond-row">
239
- <span class="pond-row-label">Perfil</span>
240
- <input type="range" class="pond-slider" id="pondProf" min="0" max="100" value="30">
241
- <span class="pond-val" id="pondProfVal">30</span>
242
- </div>
243
- </div>
244
- </div>
245
- <div class="pond-section">
246
- <div class="pond-section-title">Perfil &mdash; Factores</div>
247
- <div class="pond-rows">
248
- <div class="pond-row">
249
- <span class="pond-row-label">Edad</span>
250
- <input type="range" class="pond-slider pond-profile" data-key="age" min="0" max="100" value="35">
251
- <span class="pond-val">35</span>
252
- </div>
253
- <div class="pond-row">
254
- <span class="pond-row-label">Pasaporte UE</span>
255
- <input type="range" class="pond-slider pond-profile" data-key="eu" min="0" max="100" value="0">
256
- <span class="pond-val">0</span>
257
- </div>
258
- <div class="pond-row">
259
- <span class="pond-row-label">Liga</span>
260
- <input type="range" class="pond-slider pond-profile" data-key="league" min="0" max="100" value="0">
261
- <span class="pond-val">0</span>
262
- </div>
263
- <div class="pond-row">
264
- <span class="pond-row-label">Valor</span>
265
- <input type="range" class="pond-slider pond-profile" data-key="market" min="0" max="100" value="20">
266
- <span class="pond-val">20</span>
267
- </div>
268
- </div>
269
- </div>
270
- <div class="pond-section">
271
- <div class="pond-section-title">Rendimiento &mdash; Bloques</div>
272
- <div class="pond-blocks-wrap">
273
- <div class="pond-blocks-grid" id="pondBlocksGrid">
274
- <!-- Block sliders injected by JS -->
275
- </div>
276
- </div>
277
- </div>
278
- <button class="pond-reset" id="pondReset">Restaurar valores</button>
279
- </div>
280
- <div class="pitch-container" id="pitchContainer">
281
- <div class="pitch" id="pitch">
282
- <div class="pitch-lines">
283
- <div class="outline"></div>
284
- <div class="halfway"></div>
285
- <div class="center-circle"></div>
286
- <div class="center-dot"></div>
287
- <div class="pen-area-top"></div>
288
- <div class="pen-area-bottom"></div>
289
- <div class="goal-area-top"></div>
290
- <div class="goal-area-bottom"></div>
291
- <div class="arc-top"></div>
292
- <div class="arc-bottom"></div>
293
- <div class="corner-tl"></div>
294
- <div class="corner-tr"></div>
295
- <div class="corner-bl"></div>
296
- <div class="corner-br"></div>
297
- </div>
298
- <!-- Markers injected by JS -->
299
- </div>
300
- </div>
301
-
302
- <div class="panel" id="panel">
303
- <div class="panel-inner">
304
- <div class="panel-header">
305
- <h2 id="panelTitle"></h2>
306
- <button class="panel-close" id="panelClose">&times;</button>
307
- </div>
308
- <div class="panel-body">
309
- <div class="panel-list" id="panelList"></div>
310
- <div class="panel-detail" id="panelDetail">
311
- <div class="panel-detail-empty">Seleccionar un jugador de la lista</div>
312
- </div>
313
- </div>
314
- </div>
315
- </div>
316
- </div>
317
- </section>
318
-
319
- <div class="pond-modal" id="pondModal" aria-hidden="true">
320
- <div class="pond-modal-backdrop" id="pondModalBackdrop"></div>
321
- <div class="pond-modal-card" role="dialog" aria-labelledby="pondModalTitle">
322
- <div class="pond-modal-header">
323
- <h3 id="pondModalTitle">Ponderaciones</h3>
324
- <button type="button" class="pond-modal-close" id="pondModalClose" aria-label="Cerrar">&times;</button>
325
- </div>
326
- <div class="pond-modal-body">
327
- <div class="pond-section">
328
- <div class="pond-section-title">Pesos generales</div>
329
- <div class="pond-rows">
330
- <div class="pond-row">
331
- <span class="pond-row-label">Rendimiento</span>
332
- <input type="range" class="pond-slider" id="modalPondPerf" min="0" max="100" value="70">
333
- <span class="pond-val" id="modalPondPerfVal">70</span>
334
- </div>
335
- <div class="pond-row">
336
- <span class="pond-row-label">Perfil</span>
337
- <input type="range" class="pond-slider" id="modalPondProf" min="0" max="100" value="30">
338
- <span class="pond-val" id="modalPondProfVal">30</span>
339
- </div>
340
- </div>
341
- </div>
342
- <div class="pond-section">
343
- <div class="pond-section-title">Perfil &mdash; Factores</div>
344
- <div class="pond-rows">
345
- <div class="pond-row">
346
- <span class="pond-row-label">Edad</span>
347
- <input type="range" class="pond-slider modal-pond-profile" data-key="age" min="0" max="100" value="35">
348
- <span class="pond-val">35</span>
349
- </div>
350
- <div class="pond-row">
351
- <span class="pond-row-label">Pasaporte UE</span>
352
- <input type="range" class="pond-slider modal-pond-profile" data-key="eu" min="0" max="100" value="0">
353
- <span class="pond-val">0</span>
354
- </div>
355
- <div class="pond-row">
356
- <span class="pond-row-label">Liga</span>
357
- <input type="range" class="pond-slider modal-pond-profile" data-key="league" min="0" max="100" value="0">
358
- <span class="pond-val">0</span>
359
- </div>
360
- <div class="pond-row">
361
- <span class="pond-row-label">Valor</span>
362
- <input type="range" class="pond-slider modal-pond-profile" data-key="market" min="0" max="100" value="20">
363
- <span class="pond-val">20</span>
364
- </div>
365
- </div>
366
- </div>
367
- <div class="pond-section">
368
- <div class="pond-section-title">Rendimiento &mdash; Bloques</div>
369
- <div class="pond-blocks-wrap">
370
- <div class="pond-blocks-grid" id="modalPondBlocksGrid"></div>
371
- </div>
372
- </div>
373
- </div>
374
- <div class="pond-modal-footer">
375
- <button type="button" class="pond-reset" id="modalPondReset">Restaurar</button>
376
- <button type="button" class="pond-apply" id="modalPondApply">Calcular</button>
377
- </div>
378
- </div>
379
- </div>
380
- <script src="/static/app.js" defer></script>
381
  </body>
382
- </html>
 
3
  <head>
4
  <meta charset="UTF-8">
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Base de datos · Racing Santander</title>
7
  <link rel="preconnect" href="https://fonts.googleapis.com">
8
  <link href="https://fonts.googleapis.com/css2?family=DM+Sans:ital,opsz,wght@0,9..40,300;0,9..40,400;0,9..40,500;0,9..40,600;0,9..40,700;1,9..40,400&family=Instrument+Serif:ital@0;1&display=swap" rel="stylesheet">
9
  <link rel="stylesheet" href="/static/styles.css">
 
11
  <body>
12
 
13
  <header class="header">
14
+ <h1>Base de datos <em>Racing Santander</em></h1>
15
+ <span class="subtitle">Stats Opta · valores Transfermarkt por temporada</span>
16
  <span class="api-meta" id="apiMeta"></span>
17
  </header>
18
 
 
25
  <div class="filter-label">Liga</div>
26
  <div class="ms" id="leagueMs">
27
  <button type="button" class="ms-button" id="leagueMsBtn" aria-haspopup="listbox" aria-expanded="false">
28
+ <span id="leagueMsLabel">Todas</span><span class="ms-count" id="leagueMsCount"></span>
 
 
29
  </button>
30
  <div class="ms-panel" role="listbox" aria-multiselectable="true">
31
  <div class="ms-panel-search">
 
47
  <div class="filter-label">Edad</div>
48
  <div class="filter-range">
49
  <input type="number" class="filter-input" id="ageMin" placeholder="Min" min="14" max="45">
50
+ <span></span>
51
+ <input type="number" class="filter-input" id="ageMax" placeholder="Max" min="14" max="45">
52
  </div>
53
  </div>
54
  <div class="filter-group">
55
+ <div class="filter-label">Nacionalidad</div>
56
+ <input type="text" class="filter-input" id="natFilter" placeholder="ej. Argentina" autocomplete="off" style="width:120px;">
 
 
 
 
57
  </div>
58
  <div class="filter-group">
59
+ <div class="filter-label">Pie</div>
60
+ <select class="filter-select" id="footFilter">
61
+ <option value="">Cualquiera</option>
62
+ <option value="right">Derecho</option>
63
+ <option value="left">Izquierdo</option>
64
+ <option value="both">Ambos</option>
65
  </select>
66
  </div>
67
  <div class="filter-group">
68
+ <div class="filter-label">Valor fin temp. (€M)</div>
69
  <div class="filter-range">
70
+ <input type="number" class="filter-input" id="mvMin" placeholder="Min" min="0" max="500" step="0.5">
71
+ <span></span>
72
+ <input type="number" class="filter-input" id="mvMax" placeholder="Max" min="0" max="500" step="0.5">
73
  </div>
74
  </div>
75
  <div class="filter-group">
76
+ <div class="filter-label">Min. minutos</div>
77
+ <input type="number" class="filter-input" id="minMinutes" placeholder="0" min="0" step="90" style="width:80px;">
 
 
 
 
 
78
  </div>
79
  <div class="filter-group">
80
+ <div class="filter-label">Fiabilidad match</div>
81
+ <select class="filter-select" id="confFilter">
82
+ <option value="">Todas</option>
83
+ <option value="high">Alta (verificada)</option>
84
+ <option value="low">Baja (sin verificar)</option>
85
+ </select>
86
  </div>
87
  <div class="filter-count" id="filterCount"></div>
88
  </div>
89
 
 
 
 
 
 
90
  <section class="view active" id="view-table">
91
  <div class="table-view">
92
  <div class="table-toolbar">
 
94
  <input type="text" id="tableSearch" placeholder="Buscar jugador, equipo o liga&hellip;" autocomplete="off">
95
  </div>
96
  <div class="table-meta">
97
+ <span id="tableShownCount">0</span> / <span id="tableTotalCount">0</span> filas
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
98
  </div>
99
  </div>
100
  <div class="data-table-wrap">
 
102
  <table class="data-table" id="dataTable">
103
  <thead>
104
  <tr>
105
+ <th data-key="Jugador" class="sortable">Jugador <span class="sort-arrow"></span></th>
106
+ <th data-key="Posicion" class="sortable">Pos <span class="sort-arrow"></span></th>
107
+ <th data-key="Temporada" class="sortable">Temp. <span class="sort-arrow"></span></th>
108
  <th data-key="age" class="sortable num">Edad <span class="sort-arrow"></span></th>
109
+ <th data-key="nationality" class="sortable">Nacionalidad <span class="sort-arrow"></span></th>
110
+ <th data-key="Competencia" class="sortable">Liga <span class="sort-arrow"></span></th>
111
+ <th data-key="Minutos totales" class="sortable num">Min <span class="sort-arrow"></span></th>
112
+ <th data-key="mv_eos" class="sorted desc num">Valor fin temp. <span class="sort-arrow">&darr;</span></th>
113
+ <th data-key="mv_eos_prev" class="sortable num">Valor temp-1 <span class="sort-arrow"></span></th>
114
+ <th>Fuente</th>
 
 
115
  </tr>
116
  </thead>
117
  <tbody id="dataTableBody"></tbody>
 
130
  <div class="table-drawer-body" id="tableDrawerBody"></div>
131
  </aside>
132
 
133
+ <script src="/static/app.js"></script>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
134
  </body>
135
+ </html>