From 56cea78b07cf03b12da549df997744357a4653d2 Mon Sep 17 00:00:00 2001 From: Spencer Cheng Date: Thu, 20 Aug 2026 23:04:37 +0000 Subject: [PATCH 01/19] 5.0 add druss --- ocean/robocode/bots.h | 84 ++++++++++++++++++++++++++++++++++++++- ocean/robocode/robocode.h | 9 +++++ 2 files changed, 92 insertions(+), 1 deletion(-) diff --git a/ocean/robocode/bots.h b/ocean/robocode/bots.h index 01b9f8c810..ed1415e611 100644 --- a/ocean/robocode/bots.h +++ b/ocean/robocode/bots.h @@ -29,6 +29,7 @@ typedef enum { BOT_WAVE_SURFER = 3, BOT_HAWK_ON_FIRE = 4, BOT_RAIKO = 5, + BOT_DRUSSGT = 6, } BotPolicy; #define WS_NUM_WAVES 8 @@ -74,6 +75,38 @@ typedef struct { int active; } RBRaikoWave; +// DrussGT adaptation sizes (agent_drussgt.h). Moderate caps for train SPS. +#ifndef DGT_WAVES +#define DGT_WAVES 10 +#define DGT_GUN_WAVES 14 +#define DGT_KNN_CAP 96 +#define DGT_GUN_CAP 160 +#define DGT_FEATS 8 +#define DGT_HIST 16 +#endif +typedef struct { + float ox, oy; + float head_on; + float speed; + float power; + int fire_tick; + int lat_sign; + float feats[DGT_FEATS]; + int active; + int imaginary; +} DGTWave; + +typedef struct { + float ox, oy; + float abs_bearing; + float lat_dir; + float speed; + float mea; + float dist_traveled; + float feats[DGT_FEATS]; + int active; +} DGTGunWave; + struct BotMem { int tick; int orbit_dir; // -1, 0, +1 @@ -110,10 +143,42 @@ struct BotMem { int raiko_wave_head; int raiko_guess[RAIKO_DIST_BINS][RAIKO_GF_BINS]; RBRaikoWave raiko_waves[RAIKO_WAVES]; + + // DrussGT (agent_drussgt.h). kNN persists across episodes; waves clear on reset. + int dgt_initialized; + float dgt_enemy_gunheat; + float dgt_enemy_energy; + float dgt_enemy_firepower; + float dgt_lat_dir; + float dgt_enemy_lat_dir; + float dgt_last_v; + float dgt_enemy_last_v; + int dgt_enemy_dir_change_tick; + int dgt_enemy_decel_tick; + float dgt_goto_x, dgt_goto_y; + int dgt_wave_head; + DGTWave dgt_waves[DGT_WAVES]; + int dgt_surf_n, dgt_surf_head; + float dgt_surf_feats[DGT_KNN_CAP][DGT_FEATS]; + float dgt_surf_gf[DGT_KNN_CAP]; + int dgt_gun_n, dgt_gun_head; + float dgt_gun_feats[DGT_GUN_CAP][DGT_FEATS]; + float dgt_gun_gf[DGT_GUN_CAP]; + int dgt_gun_wave_head; + DGTGunWave dgt_gun_waves[DGT_GUN_WAVES]; + int dgt_bullets_hit, dgt_bullets_fired; + int dgt_hits_taken, dgt_waves_passed; + int dgt_hist_n, dgt_hist_head; + float dgt_hist_x[DGT_HIST]; + float dgt_hist_y[DGT_HIST]; + float dgt_lat_hist[10]; + int dgt_lat_hist_i; + float dgt_current_gf; }; #include "agent_hawk_on_fire.h" #include "agent_raiko.h" +#include "agent_drussgt.h" // ---- Lifetime --------------------------------------------------------------- static inline void bot_mems_alloc(Robocode* env) { @@ -147,6 +212,15 @@ static inline void bot_mems_episode_reset(Robocode* env) { m->raiko_bearing_dir = m->raiko_bearing_dir == 0.0f ? 1.0f : m->raiko_bearing_dir; for (int wi = 0; wi < WS_NUM_WAVES; wi++) m->waves[wi].active = 0; for (int wi = 0; wi < RAIKO_WAVES; wi++) m->raiko_waves[wi].active = 0; + // DrussGT: clear per-round waves; keep kNN across episodes. + m->dgt_initialized = 0; + for (int wi = 0; wi < DGT_WAVES; wi++) m->dgt_waves[wi].active = 0; + for (int wi = 0; wi < DGT_GUN_WAVES; wi++) m->dgt_gun_waves[wi].active = 0; + m->dgt_hist_n = 0; + m->dgt_hist_head = 0; + m->dgt_lat_hist_i = 0; + for (int hi = 0; hi < 10; hi++) m->dgt_lat_hist[hi] = 0.0f; + m->dgt_current_gf = 0.0f; } } @@ -225,9 +299,13 @@ static inline void ws_add_sample(BotMem* m, const float feats[WS_NUM_FEATS], flo // sample to the kNN. static void bot_on_hit_by_bullet(Robocode* env, int bot_idx, float bullet_heading, float bullet_power) { - if (env->bot_policy != BOT_WAVE_SURFER) return; if (env->bot_mems == NULL) return; BotMem* m = &env->bot_mems[bot_idx - env->num_agents]; + if (env->bot_policy == BOT_DRUSSGT) { + dgt_on_hit_by_bullet(m, bullet_heading, bullet_power); + return; + } + if (env->bot_policy != BOT_WAVE_SURFER) return; float speed = 20.0f - 3.0f * bullet_power; WSWave* best = NULL; int best_age = -1; @@ -273,6 +351,10 @@ static void bot_step(Robocode* env, int bot_idx) { bot_raiko_step(env, bot_idx, m); return; } + if (env->bot_policy == BOT_DRUSSGT) { + bot_drussgt_step(env, bot_idx, m); + return; + } // Pick a target index. Normal training/eval bots target RL agents. // Temporary bot-vs-bot harnesses use num_agents=0, where bots target diff --git a/ocean/robocode/robocode.h b/ocean/robocode/robocode.h index 914aa3a7ce..093069f0cf 100644 --- a/ocean/robocode/robocode.h +++ b/ocean/robocode/robocode.h @@ -788,6 +788,15 @@ void puf_step(Robocode* env) { if (!t_agent && s_agent) { bot_on_hit_by_bullet(env, j, bullet->heading, bullet->firepower); } + // DrussGT gun learning when a bot's bullet hits anyone. + if (!s_agent && env->bot_mems != NULL + && env->bot_policy == BOT_DRUSSGT) { + int bmem = shooter - env->num_agents; + if (bmem >= 0 && bmem < env->num_bots) { + dgt_on_bullet_hit(&env->bot_mems[bmem], + target->x, target->y); + } + } bool killed = target->energy <= 0.0f; if (s_agent) { record_range_damage_inflicted(env, shooter, damage); From 3a70878e71bd90d8acc9c9e80048f7a21ed739f4 Mon Sep 17 00:00:00 2001 From: Spencer Cheng Date: Fri, 21 Aug 2026 00:29:10 +0000 Subject: [PATCH 02/19] missing bot code --- ocean/robocode/agent_drussgt.h | 718 ++++++++++++++++++++++++++++++++ ocean/robocode/bot_tournament.c | 149 +++++++ 2 files changed, 867 insertions(+) create mode 100644 ocean/robocode/agent_drussgt.h create mode 100644 ocean/robocode/bot_tournament.c diff --git a/ocean/robocode/agent_drussgt.h b/ocean/robocode/agent_drussgt.h new file mode 100644 index 0000000000..96b9a30254 --- /dev/null +++ b/ocean/robocode/agent_drussgt.h @@ -0,0 +1,718 @@ +// Structural adaptation of DrussGT 3.1.4159 (jk.mega.DrussGT) +// by Julian Kent / Skilgannon — open source (jar in third_party/). +// +// Core systems (speed-aware, not a full mega port): +// * Go-to wave surfing with SHORT path-sim → wave-hit GF (official idea) +// * One kNN danger profile per wave (not kNN-per-candidate) +// * First + light second wave +// * Visit flattener + hit-weighted surf samples +// * Gunheat-filtered waves + imaginary pre-fire waves +// * Visit-count DC gun (wave-pass GF logs) + cold linear/circular blend +// * Fair last-scan aim only +// +// Intentionally omitted for train SPS: multi-buffer VCS, precise GF ranges, +// dual guns, bullet shadows, shielding. +// +// License: keep open-source; credit Skilgannon / DrussGT. + +#ifndef ROBOCODE_AGENT_DRUSSGT_H +#define ROBOCODE_AGENT_DRUSSGT_H + +#include "agent_common.h" + +#ifndef DGT_KNN_K +#define DGT_KNN_K 6 +#endif +#ifndef DGT_GUN_K +#define DGT_GUN_K 10 +#endif +#ifndef DGT_GOTO_CANDS +#define DGT_GOTO_CANDS 8 +#endif +#ifndef DGT_SIM_STEPS +#define DGT_SIM_STEPS 12 +#endif +#ifndef DGT_BEST_DIST +#define DGT_BEST_DIST 450.0f +#endif +#ifndef DGT_DANGER_BINS +#define DGT_DANGER_BINS 17 +#endif + +// Manhattan weights (official metric). 8 attributes. +static const float DGT_FEAT_W[DGT_FEATS] = { + 5.00f, // distance / 900 + 4.00f, // |lat vel| / 8 + 2.00f, // adv vel / 8 + 3.00f, // 1/(1+k*tsdc) + 2.50f, // 1/(1+k*tsdecel) + 2.00f, // accel + 3.00f, // wall + 2.00f, // dist-last-10 / 80 +}; + +static inline float dgt_norm_time(float t, float k) { + return 1.0f / (1.0f + k * fmaxf(t, 0.0f)); +} + +static inline float dgt_kernel(float dgf, float inv_two_s2) { + float x = dgf * dgf * inv_two_s2; + return 1.0f / (1.0f + x + 0.5f * x * x); +} + +static inline void dgt_features(Robot* bot, float tgt_x, float tgt_y, Robocode* env, + int tick, int last_dir_change, int last_decel, + float last_v, float dist_last10, + float out[DGT_FEATS]) { + float dx = bot->x - tgt_x, dy = bot->y - tgt_y; + float dist = sqrtf(dx * dx + dy * dy); + float inv = (dist > 1e-6f) ? 1.0f / dist : 1.0f; + float ux = dx * inv, uy = dy * inv; + float bvx = cos_deg(bot->heading) * bot->v; + float bvy = sin_deg(bot->heading) * bot->v; + float wall_min = fminf(fminf(bot->x, env->width - bot->x), + fminf(bot->y, env->height - bot->y)); + float wall_half = fmaxf(fminf(env->width, env->height) * 0.5f, 1.0f); + out[0] = rb_clampf(dist * (1.0f / 900.0f), 0.0f, 1.2f); + out[1] = fabsf(-bvx * uy + bvy * ux) * 0.125f; + out[2] = rb_clampf((bvx * ux + bvy * uy) * 0.125f, -1.0f, 1.0f); + out[3] = dgt_norm_time((float)(tick - last_dir_change), 0.08f); + out[4] = dgt_norm_time((float)(tick - last_decel), 0.08f); + out[5] = rb_clampf((bot->v - last_v) * 0.5f, -1.0f, 1.0f); + out[6] = rb_clampf(wall_min / wall_half, 0.0f, 1.0f); + out[7] = rb_clampf(dist_last10 * (1.0f / 80.0f), 0.0f, 1.5f); +} + +static inline float dgt_feat_dist(const float* a, const float* b) { + float d = 0.0f; + for (int f = 0; f < DGT_FEATS; f++) { + d += fabsf((a[f] - b[f]) * DGT_FEAT_W[f]); + } + return d; +} + +static inline void dgt_knn_add(float knn_feats[][DGT_FEATS], float* knn_gf, + int* knn_n, int* knn_head, int cap, + const float feats[DGT_FEATS], float gf) { + int slot = *knn_head; + memcpy(knn_feats[slot], feats, DGT_FEATS * sizeof(float)); + knn_gf[slot] = gf; + *knn_head = (slot + 1) % cap; + if (*knn_n < cap) (*knn_n)++; +} + +static int dgt_knn_query(const float feats[DGT_FEATS], + const float knn_feats[][DGT_FEATS], + int knn_n, int k_max, + float* best_d, int* best_i) { + for (int k = 0; k < k_max; k++) { + best_d[k] = 1e18f; + best_i[k] = -1; + } + if (knn_n <= 0) return 0; + for (int n = 0; n < knn_n; n++) { + float d = dgt_feat_dist(feats, knn_feats[n]); + if (d >= best_d[k_max - 1]) continue; + int k = k_max - 1; + while (k > 0 && d < best_d[k - 1]) { + best_d[k] = best_d[k - 1]; + best_i[k] = best_i[k - 1]; + k--; + } + best_d[k] = d; + best_i[k] = n; + } + int count = 0; + for (int k = 0; k < k_max; k++) if (best_i[k] >= 0) count++; + return count; +} + +static void dgt_build_danger_profile(const float feats[DGT_FEATS], + const float knn_feats[][DGT_FEATS], + const float* knn_gf, int knn_n, + float dens[DGT_DANGER_BINS]) { + for (int b = 0; b < DGT_DANGER_BINS; b++) dens[b] = 0.0f; + if (knn_n <= 0) { + for (int b = 0; b < DGT_DANGER_BINS; b++) { + float gf = -1.0f + 2.0f * (float)b / (float)(DGT_DANGER_BINS - 1); + dens[b] = 0.25f / (1.0f + 8.0f * gf * gf); + } + return; + } + float best_d[DGT_KNN_K]; + int best_i[DGT_KNN_K]; + int nk = dgt_knn_query(feats, knn_feats, knn_n, DGT_KNN_K, best_d, best_i); + const float inv_two_s2 = 1.0f / (2.0f * 0.14f * 0.14f); + for (int k = 0; k < nk; k++) { + float w = 1.0f / (1.0f + best_d[k]); + float g0 = knn_gf[best_i[k]]; + for (int b = 0; b < DGT_DANGER_BINS; b++) { + float gf = -1.0f + 2.0f * (float)b / (float)(DGT_DANGER_BINS - 1); + dens[b] += w * dgt_kernel(gf - g0, inv_two_s2); + } + } +} + +static inline float dgt_profile_danger(const float dens[DGT_DANGER_BINS], float gf) { + gf = rb_clampf(gf, -1.0f, 1.0f); + float t = (gf + 1.0f) * 0.5f * (float)(DGT_DANGER_BINS - 1); + int i0 = (int)t; + if (i0 < 0) i0 = 0; + if (i0 >= DGT_DANGER_BINS - 1) return dens[DGT_DANGER_BINS - 1]; + float f = t - (float)i0; + return dens[i0] * (1.0f - f) + dens[i0 + 1] * f; +} + +static float dgt_gun_best_gf(const float feats[DGT_FEATS], + const float knn_feats[][DGT_FEATS], + const float* knn_gf, int knn_n) { + if (knn_n <= 0) return 0.0f; + float best_d[DGT_GUN_K]; + int best_i[DGT_GUN_K]; + int nk = dgt_knn_query(feats, knn_feats, knn_n, DGT_GUN_K, best_d, best_i); + if (nk <= 0) return 0.0f; + const float inv_two_s2 = 1.0f / (2.0f * 0.10f * 0.10f); + float best_gf = 0.0f; + float best_dens = -1.0f; + for (int pass = 0; pass < 2; pass++) { + int n_eval = (pass == 0) ? nk : 11; + for (int e = 0; e < n_eval; e++) { + float gf = (pass == 0) + ? knn_gf[best_i[e]] + : (-1.0f + 0.2f * (float)e); + float dens = 0.0f; + for (int k = 0; k < nk; k++) { + float w = 1.0f / (1.0f + best_d[k]); + dens += w * dgt_kernel(gf - knn_gf[best_i[k]], inv_two_s2); + } + if (dens > best_dens) { + best_dens = dens; + best_gf = gf; + } + } + } + return rb_clampf(best_gf, -1.0f, 1.0f); +} + +static inline float dgt_bullet_power(Robot* bot, float enemy_energy, float dist, + float enemy_fp, int bullets_hit, + int bullets_fired) { + float base = 1.95f; + float hitrate = (bullets_fired > 4) + ? (float)bullets_hit / (float)bullets_fired : 0.0f; + if (hitrate > 0.33f || dist < 180.0f) base = 2.95f; + if (dist > 600.0f && hitrate < 0.25f) base = 1.95f; + float power = base; + power = fminf(power, fmaxf(0.1f, ((float)bot->energy - 0.1f) * 0.25f)); + power = fminf(power, fmaxf(0.1f, enemy_energy * 0.25f)); + if (enemy_fp > 0.1f && enemy_fp < power && bot->energy < 40.0f) { + power = fmaxf(enemy_fp, 0.15f); + } + if (power >= 2.4f) power = 2.95f; + else if (power >= 1.5f) power = 1.95f; + else if (power >= 0.9f) power = 0.95f; + else if (power >= 0.4f) power = 0.45f; + else power = 0.15f; + return rb_clampf(power, 0.1f, fminf(3.0f, (float)bot->energy - 0.1f)); +} + +// Fair linear lead from last scan only. +static inline float dgt_linear_aim(Robot* bot, BotMem* m, float bspeed) { + float dx = m->last_x - bot->x; + float dy = m->last_y - bot->y; + float dist = fmaxf(sqrtf(dx * dx + dy * dy), 1.0f); + float dt = dist / fmaxf(bspeed, 0.1f); + float tvx = cos_deg(m->last_heading) * m->last_v; + float tvy = sin_deg(m->last_heading) * m->last_v; + float px = m->last_x + tvx * dt; + float py = m->last_y + tvy * dt; + // One refine pass. + dx = px - bot->x; dy = py - bot->y; + dist = fmaxf(sqrtf(dx * dx + dy * dy), 1.0f); + dt = dist / fmaxf(bspeed, 0.1f); + return rb_abs_bearing_deg(bot->x, bot->y, + m->last_x + tvx * dt, m->last_y + tvy * dt); +} + +// Fair circular lead from last scan (constant lateral orbit estimate). +static inline float dgt_circular_aim(Robot* bot, BotMem* m, float bspeed) { + float dx = m->last_x - bot->x; + float dy = m->last_y - bot->y; + float dist = fmaxf(sqrtf(dx * dx + dy * dy), 1.0f); + float dt = dist / fmaxf(bspeed, 0.1f); + float inv = 1.0f / dist; + float ux = dx * inv, uy = dy * inv; + float tvx = cos_deg(m->last_heading) * m->last_v; + float tvy = sin_deg(m->last_heading) * m->last_v; + float lat = -tvx * uy + tvy * ux; + float ang_vel = lat / dist; + float bearing = rb_abs_bearing_deg(bot->x, bot->y, m->last_x, m->last_y); + float new_bearing = bearing + ang_vel * dt * RB_R2D; + return rb_abs_bearing_deg(bot->x, bot->y, + bot->x + dist * cos_deg(new_bearing), + bot->y + dist * sin_deg(new_bearing)); +} + +static inline float dgt_hist_dist10(BotMem* m) { + if (m->dgt_hist_n < 2) return 0.0f; + int span = m->dgt_hist_n < 10 ? m->dgt_hist_n : 10; + int oldest = (m->dgt_hist_head - span + DGT_HIST) % DGT_HIST; + int latest = (m->dgt_hist_head - 1 + DGT_HIST) % DGT_HIST; + return rb_dist(m->dgt_hist_x[oldest], m->dgt_hist_y[oldest], + m->dgt_hist_x[latest], m->dgt_hist_y[latest]); +} + +static void dgt_fallback_move(Robocode* env, Robot* bot, BotMem* m) { + float abs_bearing = rb_abs_bearing_deg(bot->x, bot->y, m->last_x, m->last_y); + float distance = rb_dist(bot->x, bot->y, m->last_x, m->last_y); + float best_x = bot->x, best_y = bot->y; + float best_score = -1e18f; + for (int di = 0; di < 2; di++) { + float dir = (di == 0) ? 1.0f : -1.0f; + for (int t = 0; t < 6; t++) { + float orbit = 60.0f + 16.0f * (float)t; + float ang = (abs_bearing + dir * orbit) * RB_D2R; + float step = rb_clampf(distance * 0.4f + 100.0f, 90.0f, 190.0f); + float x = bot->x + step * cosf(ang); + float y = bot->y + step * sinf(ang); + if (x < 30.0f || x > env->width - 30.0f || + y < 30.0f || y > env->height - 30.0f) continue; + float d = rb_dist(x, y, m->last_x, m->last_y); + float score = -fabsf(d - DGT_BEST_DIST); + if (distance < 220.0f) score += 0.7f * d; + float wall = fminf(fminf(x, env->width - x), fminf(y, env->height - y)); + score += 0.35f * wall; + if (score > best_score) { + best_score = score; + best_x = x; + best_y = y; + } + } + } + rb_drive_to(env, bot, best_x, best_y); +} + +static inline float dgt_point_gf(DGTWave* w, float x, float y) { + float bearing = rb_abs_bearing_deg(w->ox, w->oy, x, y); + float gf_raw = rb_norm_deg(bearing - w->head_on); + float mea_deg = fmaxf(asinf(fminf(8.0f / w->speed, 1.0f)) * RB_R2D, 0.1f); + return rb_clampf((gf_raw / mea_deg) * (float)w->lat_sign, -1.5f, 1.5f); +} + +// Short path-sim: drive toward (tx,ty) until wave hits; return hit GF. +// Uses a cheap constant-speed slide (no full accel model) — captures go-to +// hit location for imminent waves without 120-step turn sim cost. +static float dgt_wave_hit_gf(Robot* bot, DGTWave* w, float tx, float ty, + int tick_now, float* out_hit_dist) { + float x = bot->x, y = bot->y; + float radius = (float)(tick_now - w->fire_tick) * w->speed; + float dx0 = tx - x, dy0 = ty - y; + float travel = sqrtf(dx0 * dx0 + dy0 * dy0); + float spd = 6.5f; // typical go-to cruise (between accel phases) + float ux = 0.0f, uy = 0.0f; + if (travel > 1.0f) { + ux = dx0 / travel; + uy = dy0 / travel; + } + for (int step = 0; step < DGT_SIM_STEPS; step++) { + float ddx = x - w->ox, ddy = y - w->oy; + float dist = sqrtf(ddx * ddx + ddy * ddy); + if (radius + w->speed >= dist - 18.0f) { + if (out_hit_dist) *out_hit_dist = dist; + return dgt_point_gf(w, x, y); + } + // Stop sliding once near destination. + float remx = tx - x, remy = ty - y; + if (remx * remx + remy * remy < 64.0f) { + x = tx; + y = ty; + } else { + x += ux * spd; + y += uy * spd; + } + radius += w->speed; + } + if (out_hit_dist) { + float ddx = x - w->ox, ddy = y - w->oy; + *out_hit_dist = sqrtf(ddx * ddx + ddy * ddy); + } + return dgt_point_gf(w, x, y); +} + +// Go-to surf: path-sim hit GF + profile dens. First wave full sim; second light. +static void dgt_surf_goto(Robocode* env, Robot* bot, BotMem* m) { + float abs_bearing = rb_abs_bearing_deg(bot->x, bot->y, m->last_x, m->last_y); + float distance = fmaxf(rb_dist(bot->x, bot->y, m->last_x, m->last_y), 1.0f); + + // Collect active waves sorted by TTI (soonest first). Prefer real over imag. + int idx[DGT_WAVES]; + float tti_a[DGT_WAVES]; + int n = 0; + for (int wi = 0; wi < DGT_WAVES; wi++) { + DGTWave* w = &m->dgt_waves[wi]; + if (!w->active) continue; + float tti = (rb_dist(bot->x, bot->y, w->ox, w->oy) + - (m->tick - w->fire_tick) * w->speed) / fmaxf(w->speed, 0.1f); + // Prefer real waves: inflate imaginary TTI slightly in sort key only. + float key = tti + (w->imaginary ? 50.0f : 0.0f); + idx[n] = wi; + tti_a[n] = key; + n++; + } + if (n == 0) { + dgt_fallback_move(env, bot, m); + return; + } + for (int a = 0; a < n; a++) { + for (int b = a + 1; b < n; b++) { + if (tti_a[b] < tti_a[a]) { + float tt = tti_a[a]; tti_a[a] = tti_a[b]; tti_a[b] = tt; + int ti = idx[a]; idx[a] = idx[b]; idx[b] = ti; + } + } + } + int surf_n = n > 2 ? 2 : n; + DGTWave* w0 = &m->dgt_waves[idx[0]]; + DGTWave* w1 = (surf_n > 1) ? &m->dgt_waves[idx[1]] : NULL; + + float dens0[DGT_DANGER_BINS]; + dgt_build_danger_profile(w0->feats, m->dgt_surf_feats, m->dgt_surf_gf, + m->dgt_surf_n, dens0); + // Second wave reuses dens0 (enemy gun state usually similar; saves a kNN). + + float best_x = bot->x, best_y = bot->y; + float best_danger = 1e18f; + float p0 = w0->power > 0.0f ? w0->power : ((20.0f - w0->speed) / 3.0f); + float dmg0 = 1.0f + 0.12f * (4.0f * p0); + // Path-sim only for imminent first waves; far waves use point GF. + float tti0 = (rb_dist(bot->x, bot->y, w0->ox, w0->oy) + - (m->tick - w0->fire_tick) * w0->speed) / fmaxf(w0->speed, 0.1f); + int do_sim = (tti0 < 55.0f && !w0->imaginary); + + for (int c = 0; c < DGT_GOTO_CANDS; c++) { + float t = (float)c / (float)(DGT_GOTO_CANDS - 1); + float gf_hint = -1.05f + 2.1f * t; + float ea = abs_bearing + 180.0f + gf_hint * 55.0f; + float ed = rb_clampf(0.5f * distance + 0.5f * DGT_BEST_DIST, 140.0f, 520.0f); + if (distance < 200.0f) ed = fmaxf(ed, 280.0f); + float x = m->last_x + ed * cos_deg(ea); + float y = m->last_y + ed * sin_deg(ea); + if ((c & 1) == 0) { + float orbit = abs_bearing + 90.0f * (gf_hint >= 0.0f ? 1.0f : -1.0f) + + gf_hint * 30.0f; + float rad = rb_clampf(0.4f * distance + 90.0f, 80.0f, 220.0f); + x = bot->x + rad * cos_deg(orbit); + y = bot->y + rad * sin_deg(orbit); + } + if (x < 28.0f || x > env->width - 28.0f || + y < 28.0f || y > env->height - 28.0f) continue; + + float hit_dist = rb_dist(x, y, w0->ox, w0->oy); + float egf0 = do_sim + ? dgt_wave_hit_gf(bot, w0, x, y, m->tick, &hit_dist) + : dgt_point_gf(w0, x, y); + float danger = dmg0 * dgt_profile_danger(dens0, egf0); + if (w0->imaginary) danger *= 0.55f; + + if (w1) { + float egf1 = dgt_point_gf(w1, x, y); + float p1 = w1->power > 0.0f ? w1->power : ((20.0f - w1->speed) / 3.0f); + float dmg1 = 1.0f + 0.12f * (4.0f * p1); + float wgt = 0.32f * dmg1; + if (w1->imaginary) wgt *= 0.5f; + danger += wgt * dgt_profile_danger(dens0, egf1); + } + + float d_en = rb_dist(x, y, m->last_x, m->last_y); + danger += 0.001f * fabsf(d_en - DGT_BEST_DIST); + danger += 0.0012f * fmaxf(0.0f, 300.0f - hit_dist); + if (danger < best_danger) { + best_danger = danger; + best_x = x; + best_y = y; + } + } + m->dgt_goto_x = best_x; + m->dgt_goto_y = best_y; + rb_drive_to(env, bot, best_x, best_y); +} + +static void dgt_update_gun_waves(BotMem* m) { + for (int i = 0; i < DGT_GUN_WAVES; i++) { + DGTGunWave* w = &m->dgt_gun_waves[i]; + if (!w->active) continue; + w->dist_traveled += w->speed; + float d = rb_dist(w->ox, w->oy, m->last_x, m->last_y); + if (w->dist_traveled + w->speed >= d) { + float bearing = rb_abs_bearing_deg(w->ox, w->oy, m->last_x, m->last_y); + float gf = rb_clampf( + (rb_norm_deg(bearing - w->abs_bearing) / fmaxf(w->mea, 0.1f)) * w->lat_dir, + -1.2f, 1.2f); + dgt_knn_add(m->dgt_gun_feats, m->dgt_gun_gf, &m->dgt_gun_n, + &m->dgt_gun_head, DGT_GUN_CAP, w->feats, gf); + m->dgt_current_gf = gf; + w->active = 0; + } else if (w->dist_traveled > 1200.0f) { + w->active = 0; + } + } +} + +static void dgt_expire_and_flatten(BotMem* m, Robot* bot) { + for (int wi = 0; wi < DGT_WAVES; wi++) { + DGTWave* w = &m->dgt_waves[wi]; + if (!w->active) continue; + if (w->imaginary && (m->tick - w->fire_tick) > 14) { + w->active = 0; + continue; + } + float radius = (m->tick - w->fire_tick) * w->speed; + float dist_now = rb_dist(bot->x, bot->y, w->ox, w->oy); + if (radius >= dist_now + 18.0f || m->tick - w->fire_tick > 350) { + if (!w->imaginary) { + float gf = dgt_point_gf(w, bot->x, bot->y); + dgt_knn_add(m->dgt_surf_feats, m->dgt_surf_gf, &m->dgt_surf_n, + &m->dgt_surf_head, DGT_KNN_CAP, w->feats, gf); + m->dgt_waves_passed++; + } + w->active = 0; + } + } +} + +static void dgt_add_enemy_wave(BotMem* m, Robot* bot, Robocode* env, + float power, int imaginary) { + if (power < 0.1f || power > 3.01f) return; + DGTWave* w = &m->dgt_waves[m->dgt_wave_head]; + m->dgt_wave_head = (m->dgt_wave_head + 1) % DGT_WAVES; + w->ox = m->last_x; + w->oy = m->last_y; + w->speed = rb_bullet_speed(power); + w->power = power; + w->fire_tick = imaginary ? m->tick + 1 : m->tick - 1; + if (w->fire_tick < 0) w->fire_tick = 0; + w->head_on = rb_abs_bearing_deg(w->ox, w->oy, bot->x, bot->y); + float lat_sum = 0.0f; + for (int i = 0; i < 10; i++) lat_sum += fabsf(m->dgt_lat_hist[i]); + dgt_features(bot, w->ox, w->oy, env, m->tick, m->last_dir_change_tick, + m->last_dir_change_tick, m->dgt_last_v, lat_sum, w->feats); + float bvx = cos_deg(bot->heading) * bot->v; + float bvy = sin_deg(bot->heading) * bot->v; + float dx = bot->x - w->ox, dy = bot->y - w->oy; + float dist = fmaxf(sqrtf(dx * dx + dy * dy), 1.0f); + float lat = (-bvx * dy + bvy * dx) / dist; + w->lat_sign = (lat >= 0.0f) ? 1 : -1; + w->imaginary = imaginary; + w->active = 1; +} + +static void bot_drussgt_step(Robocode* env, int bot_idx, BotMem* m) { + Robot* bot = &env->robots[bot_idx]; + int target_idx = rb_nearest_agent(env, bot); + if (target_idx < 0) return; + if (!rb_scan_target(env, bot, m, target_idx)) return; + + if (!m->dgt_initialized) { + m->dgt_initialized = 1; + m->dgt_enemy_energy = (float)m->last_energy_seen; + m->dgt_enemy_firepower = 2.0f; + m->dgt_enemy_gunheat = 0.0f; + m->dgt_lat_dir = 1.0f; + m->dgt_enemy_lat_dir = 1.0f; + m->dgt_last_v = bot->v; + m->dgt_enemy_last_v = m->last_v; + m->dgt_enemy_dir_change_tick = m->tick; + m->dgt_enemy_decel_tick = m->tick; + m->dgt_goto_x = bot->x; + m->dgt_goto_y = bot->y; + for (int i = 0; i < DGT_WAVES; i++) m->dgt_waves[i].active = 0; + for (int i = 0; i < DGT_GUN_WAVES; i++) m->dgt_gun_waves[i].active = 0; + } + + m->dgt_hist_x[m->dgt_hist_head] = m->last_x; + m->dgt_hist_y[m->dgt_hist_head] = m->last_y; + m->dgt_hist_head = (m->dgt_hist_head + 1) % DGT_HIST; + if (m->dgt_hist_n < DGT_HIST) m->dgt_hist_n++; + + m->dgt_enemy_gunheat = fmaxf(0.0f, m->dgt_enemy_gunheat - 0.1f); + + float drop = m->dgt_enemy_energy - (float)m->last_energy_seen; + if (drop >= 0.1f && drop <= 3.0f && m->dgt_enemy_gunheat <= 0.15f) { + m->dgt_enemy_firepower = drop; + m->dgt_enemy_gunheat = 1.0f + drop / 5.0f; + int promoted = 0; + for (int wi = 0; wi < DGT_WAVES; wi++) { + DGTWave* w = &m->dgt_waves[wi]; + if (w->active && w->imaginary && fabsf(w->power - drop) < 0.45f) { + w->imaginary = 0; + w->power = drop; + w->speed = rb_bullet_speed(drop); + w->fire_tick = m->tick > 0 ? m->tick - 1 : 0; + promoted = 1; + break; + } + } + if (!promoted) dgt_add_enemy_wave(m, bot, env, drop, 0); + for (int wi = 0; wi < DGT_WAVES; wi++) { + if (m->dgt_waves[wi].active && m->dgt_waves[wi].imaginary) + m->dgt_waves[wi].active = 0; + } + } + m->dgt_enemy_energy = (float)m->last_energy_seen; + + if (m->dgt_enemy_gunheat <= 0.0f) { + int has_imag = 0; + for (int wi = 0; wi < DGT_WAVES; wi++) { + if (m->dgt_waves[wi].active && m->dgt_waves[wi].imaginary) { + has_imag = 1; + break; + } + } + if (!has_imag) { + float pred = m->dgt_enemy_firepower > 0.1f ? m->dgt_enemy_firepower : 2.0f; + dgt_add_enemy_wave(m, bot, env, pred, 1); + } + } + + float abs_bearing = rb_abs_bearing_deg(bot->x, bot->y, m->last_x, m->last_y); + float dxe = m->last_x - bot->x, dye = m->last_y - bot->y; + float dist = fmaxf(sqrtf(dxe * dxe + dye * dye), 1.0f); + float inv = 1.0f / dist; + float ux = dxe * inv, uy = dye * inv; + float bvx = cos_deg(bot->heading) * bot->v; + float bvy = sin_deg(bot->heading) * bot->v; + float lat_v = -bvx * uy + bvy * ux; + m->dgt_lat_hist[m->dgt_lat_hist_i % 10] = lat_v; + m->dgt_lat_hist_i++; + if (fabsf(lat_v) > 0.1f) { + float nd = lat_v > 0.0f ? 1.0f : -1.0f; + if (nd != m->dgt_lat_dir) { + m->dgt_lat_dir = nd; + m->last_dir_change_tick = m->tick; + } + } + float tvx = cos_deg(m->last_heading) * m->last_v; + float tvy = sin_deg(m->last_heading) * m->last_v; + float enemy_lat = -tvx * uy + tvy * ux; + if (fabsf(enemy_lat) > 0.05f) { + float ed = enemy_lat > 0.0f ? 1.0f : -1.0f; + if (ed != m->dgt_enemy_lat_dir) { + m->dgt_enemy_lat_dir = ed; + m->dgt_enemy_dir_change_tick = m->tick; + } + } + if (m->last_v < m->dgt_enemy_last_v - 0.5f) { + m->dgt_enemy_decel_tick = m->tick; + } + + dgt_expire_and_flatten(m, bot); + dgt_update_gun_waves(m); + dgt_surf_goto(env, bot, m); // every tick + + // ---- Gun ---- + int can_fire = (bot->gun_heat <= 0.0f && bot->energy > 1.0f + && m->last_energy_seen > 0.0f); + // Full DC while cooling into a shot so the gun is aligned at fire time. + if (bot->gun_heat <= 0.35f) { + float gfeats[DGT_FEATS]; + Robot fake = *bot; + fake.x = m->last_x; + fake.y = m->last_y; + fake.heading = m->last_heading; + fake.v = m->last_v; + dgt_features(&fake, bot->x, bot->y, env, m->tick, + m->dgt_enemy_dir_change_tick, m->dgt_enemy_decel_tick, + m->dgt_enemy_last_v, dgt_hist_dist10(m), gfeats); + float power = dgt_bullet_power(bot, (float)m->last_energy_seen, dist, + m->dgt_enemy_firepower, + m->dgt_bullets_hit, m->dgt_bullets_fired); + if (power >= bot->energy) power = fmaxf(0.1f, (float)bot->energy - 0.1f); + float bspeed = rb_bullet_speed(power); + float max_escape = asinf(fminf(8.0f / bspeed, 1.0f)) * RB_R2D; + float gf = dgt_gun_best_gf(gfeats, m->dgt_gun_feats, m->dgt_gun_gf, m->dgt_gun_n); + float aim = abs_bearing + m->dgt_enemy_lat_dir * gf * max_escape; + // Cold gun: linear + circular blend from last scan (fair). + if (m->dgt_gun_n < 16) { + float lin = dgt_linear_aim(bot, m, bspeed); + float circ = dgt_circular_aim(bot, m, bspeed); + float blend = 0.55f * lin + 0.45f * circ; + float w = (float)m->dgt_gun_n / 16.0f; + aim = w * aim + (1.0f - w) * blend; + } else if (m->dgt_gun_n < 40) { + float lin = dgt_linear_aim(bot, m, bspeed); + aim = 0.88f * aim + 0.12f * lin; + } + float gun_delta = rb_turn_gun_to(bot, aim); + if (can_fire && fabsf(gun_delta) < 2.0f && power < bot->energy) { + fire(env, bot, bot_idx, power); + m->dgt_bullets_fired++; + DGTGunWave* gw = &m->dgt_gun_waves[m->dgt_gun_wave_head]; + m->dgt_gun_wave_head = (m->dgt_gun_wave_head + 1) % DGT_GUN_WAVES; + gw->ox = bot->x; + gw->oy = bot->y; + gw->abs_bearing = abs_bearing; + gw->lat_dir = m->dgt_enemy_lat_dir; + gw->speed = bspeed; + gw->mea = max_escape; + gw->dist_traveled = 0.0f; + memcpy(gw->feats, gfeats, DGT_FEATS * sizeof(float)); + gw->active = 1; + } + } else { + float aim = abs_bearing + m->dgt_enemy_lat_dir * 0.2f * + (asinf(fminf(8.0f / 14.0f, 1.0f)) * RB_R2D); + rb_turn_gun_to(bot, aim); + } + + rb_turn_radar_to(bot, abs_bearing, 10.0f); + m->dgt_last_v = bot->v; + m->dgt_enemy_last_v = m->last_v; +} + +static void dgt_on_hit_by_bullet(BotMem* m, float bullet_heading, float bullet_power) { + float speed = rb_bullet_speed(bullet_power); + DGTWave* best = NULL; + int best_age = -1; + for (int wi = 0; wi < DGT_WAVES; wi++) { + DGTWave* w = &m->dgt_waves[wi]; + if (!w->active) continue; + if (fabsf(w->speed - speed) > 0.6f) continue; + int age = m->tick - w->fire_tick; + if (age > best_age) { best_age = age; best = w; } + } + if (best == NULL) return; + float gf_raw = rb_norm_deg(bullet_heading - best->head_on); + float mea_deg = fmaxf(asinf(fminf(8.0f / best->speed, 1.0f)) * RB_R2D, 0.1f); + float gf = rb_clampf((gf_raw / mea_deg) * (float)best->lat_sign, -1.5f, 1.5f); + // Triple-weight hits vs flattener visits. + for (int r = 0; r < 3; r++) { + dgt_knn_add(m->dgt_surf_feats, m->dgt_surf_gf, &m->dgt_surf_n, + &m->dgt_surf_head, DGT_KNN_CAP, best->feats, gf); + } + m->dgt_hits_taken++; + best->active = 0; +} + +static void dgt_on_bullet_hit(BotMem* m, float hit_x, float hit_y) { + m->dgt_bullets_hit++; + DGTGunWave* best = NULL; + float best_err = 1e18f; + for (int i = 0; i < DGT_GUN_WAVES; i++) { + DGTGunWave* w = &m->dgt_gun_waves[i]; + if (!w->active) continue; + float err = fabsf(rb_dist(w->ox, w->oy, hit_x, hit_y) - w->dist_traveled); + if (err < best_err) { best_err = err; best = w; } + } + if (best == NULL) return; + float bearing = rb_abs_bearing_deg(best->ox, best->oy, hit_x, hit_y); + float gf = rb_clampf( + (rb_norm_deg(bearing - best->abs_bearing) / fmaxf(best->mea, 0.1f)) * best->lat_dir, + -1.2f, 1.2f); + dgt_knn_add(m->dgt_gun_feats, m->dgt_gun_gf, &m->dgt_gun_n, + &m->dgt_gun_head, DGT_GUN_CAP, best->feats, gf); + dgt_knn_add(m->dgt_gun_feats, m->dgt_gun_gf, &m->dgt_gun_n, + &m->dgt_gun_head, DGT_GUN_CAP, best->feats, gf); + best->active = 0; +} + +#endif // ROBOCODE_AGENT_DRUSSGT_H diff --git a/ocean/robocode/bot_tournament.c b/ocean/robocode/bot_tournament.c new file mode 100644 index 0000000000..d31d1788b2 --- /dev/null +++ b/ocean/robocode/bot_tournament.c @@ -0,0 +1,149 @@ +// Round-robin tournament among scripted robocode bots (3,4,5,6). +// +// Compile from repo root: +// gcc -O2 -Iocean/robocode -Iraylib-5.5_linux_amd64/include \ +// -o build/bot_tournament ocean/robocode/bot_tournament.c \ +// -Lraylib-5.5_linux_amd64/lib -lraylib -lm -lpthread -ldl +// +// Usage: +// ./build/bot_tournament [games_per_pair] [seed] +// +// Policies: 3=wave_surfer 4=hawk_on_fire 5=raiko 6=drussgt + +#include +#include +#include + +#include "robocode.h" + +static const char* policy_name(int p) { + switch (p) { + case 3: return "wave_surfer"; + case 4: return "hawk_on_fire"; + case 5: return "raiko"; + case 6: return "drussgt"; + default: return "unknown"; + } +} + +// Returns 0 if policy_a wins, 1 if policy_b wins, -1 draw. +static int play_one(int policy_a, int policy_b, int max_ticks, unsigned int seed) { + Robocode env; + memset(&env, 0, sizeof(env)); + env.num_agents = 0; + env.num_bots = 2; + env.width = 800; + env.height = 600; + env.max_ticks = max_ticks; + env.bot_policy = policy_a; + env.bot_policy_1 = policy_b; + env.bot_match_winner = -2; + env.rng = seed; + env.dr = 0.0f; + env.client = NULL; + + allocate_env(&env); + c_reset(&env); + + for (int step = 0; step < max_ticks + 5; step++) { + env.bot_match_winner = -2; + c_step(&env); + if (env.bot_match_winner != -2) { + int w = env.bot_match_winner; + c_close(&env); + return w; + } + } + c_close(&env); + return -1; +} + +int main(int argc, char** argv) { + int games = (argc > 1) ? atoi(argv[1]) : 100; + unsigned int seed0 = (argc > 2) ? (unsigned)atoi(argv[2]) : 42u; + if (games < 2) games = 2; + if (games % 2) games++; + + int policies[] = {3, 4, 5, 6}; + const int N = 4; + int wins[4][4]; + int draws[4][4]; + memset(wins, 0, sizeof(wins)); + memset(draws, 0, sizeof(draws)); + int total_wins[4] = {0}; + int total_games[4] = {0}; + + printf("Bot tournament: 3,4,5,6 | games/pair=%d (half each side) | seed=%u\n", + games, seed0); + printf("Field 800x600 max_ticks=3000\n\n"); + fflush(stdout); + + unsigned int game_i = 0; + int half = games / 2; + for (int i = 0; i < N; i++) { + for (int j = i + 1; j < N; j++) { + int pa = policies[i], pb = policies[j]; + int w_a = 0, w_b = 0, d = 0; + for (int g = 0; g < half; g++) { + int r = play_one(pa, pb, 3000, seed0 + 10007u * (++game_i)); + if (r == 0) w_a++; + else if (r == 1) w_b++; + else d++; + } + for (int g = 0; g < half; g++) { + int r = play_one(pb, pa, 3000, seed0 + 10007u * (++game_i)); + if (r == 0) w_b++; + else if (r == 1) w_a++; + else d++; + } + wins[i][j] = w_a; + wins[j][i] = w_b; + draws[i][j] = draws[j][i] = d; + total_wins[i] += w_a; + total_wins[j] += w_b; + total_games[i] += games; + total_games[j] += games; + printf("%-14s vs %-14s | wins %3d-%3d draws=%3d | score_wr=%.3f\n", + policy_name(pa), policy_name(pb), w_a, w_b, d, + (w_a + 0.5 * d) / (double)games); + fflush(stdout); + } + } + + printf("\n=== Win matrix (row beat col) ===\n"); + printf("%16s", ""); + for (int j = 0; j < N; j++) printf("%14s", policy_name(policies[j])); + printf("\n"); + for (int i = 0; i < N; i++) { + printf("%16s", policy_name(policies[i])); + for (int j = 0; j < N; j++) { + if (i == j) printf("%14s", "—"); + else printf("%14d", wins[i][j]); + } + printf("\n"); + } + + double score[4]; + int order[4] = {0, 1, 2, 3}; + for (int i = 0; i < N; i++) { + score[i] = (double)total_wins[i]; + for (int j = 0; j < N; j++) if (i != j) score[i] += 0.5 * draws[i][j]; + } + for (int a = 0; a < N; a++) { + for (int b = a + 1; b < N; b++) { + if (score[order[b]] > score[order[a]]) { + int t = order[a]; order[a] = order[b]; order[b] = t; + } + } + } + + printf("\n=== Ranking (score = wins + 0.5*draws) ===\n"); + for (int r = 0; r < N; r++) { + int i = order[r]; + double wr = score[i] / (double)total_games[i]; + printf("#%d %-14s score=%.1f / %d wr=%.3f pure_wins=%d\n", + r + 1, policy_name(policies[i]), score[i], total_games[i], wr, + total_wins[i]); + } + return 0; +} From 1d5c5de85c225aa602376b8fbf73ec6fdcef69b7 Mon Sep 17 00:00:00 2001 From: Spencer Cheng Date: Fri, 21 Aug 2026 14:04:50 +0000 Subject: [PATCH 03/19] same DR now for opponents and players --- ocean/robocode/robocode.h | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/ocean/robocode/robocode.h b/ocean/robocode/robocode.h index 093069f0cf..d343bb8a21 100644 --- a/ocean/robocode/robocode.h +++ b/ocean/robocode/robocode.h @@ -371,6 +371,17 @@ void move(Robocode* env, Robot* robot, float distance) { robot->energy -= melee_damage; robot->v = 0; target->v = 0; // both robots stop on ramming collision (classic rule) + // Mirror bullet kills: +1/-1 terminal reward, perf = bots killed. + bool s_agent = robot_idx < env->num_agents; + bool t_agent = j < env->num_agents; + bool killed = target->energy <= 0.0f; + if (s_agent && killed) { + add_agent_reward(env, robot_idx, 1.0f); + if (!t_agent) env->logs[robot_idx].perf += 1.0f; + } + if (t_agent && killed) { + add_agent_reward(env, j, -1.0f); + } return; } @@ -444,10 +455,6 @@ static inline void sample_dr_triplet(Robocode* env, float* a, float* b, float* c } } -static inline void sample_agent_multipliers(Robocode* env, Robot* robot) { - sample_dr_triplet(env, &robot->speed_mult, &robot->handling_mult, &robot->power_mult); -} - static inline void assign_agent_reward_coefficients(Robocode* env, Robot* robot, int agent_idx) { if (agent_idx == 0) { robot->reward_melee_damage_inflicted = env->reward_melee_damage_inflicted_slot_0; @@ -568,6 +575,10 @@ void puf_reset(Robocode* env) { // boundary_reached is owned by selfplay alignment; do not clear it here. int total_robots = env->num_agents + env->num_bots; memset(env->bullets, 0, NUM_BULLETS * total_robots * sizeof(Bullet)); + // One DR draw per episode shared by all agents so selfplay slots stay fair + // (independent per-slot draws can make matches unwinnable). + float speed_mult = 1.0f, handling_mult = 1.0f, power_mult = 1.0f; + sample_dr_triplet(env, &speed_mult, &handling_mult, &power_mult); int idx = 0; float x, y; while (idx < total_robots) { @@ -596,7 +607,9 @@ void puf_reset(Robocode* env) { robot->gun_heat = 3; robot->bullet_idx = 0; if (idx < env->num_agents) { - sample_agent_multipliers(env, robot); + robot->speed_mult = speed_mult; + robot->handling_mult = handling_mult; + robot->power_mult = power_mult; assign_agent_reward_coefficients(env, robot, idx); env->logs[idx] = (Log){0}; } else { From 9fe22493d0da8c33ee7dc8d2e0d2b504de42f53f Mon Sep 17 00:00:00 2001 From: Spencer Cheng Date: Tue, 25 Aug 2026 14:21:01 +0000 Subject: [PATCH 04/19] bot noise and hist policy noise --- config/robocode.ini | 5 + ocean/robocode/bot_tournament.c | 15 +-- ocean/robocode/bots.h | 68 ++++++++++-- ocean/robocode/robocode.h | 100 +++++++++++++++++- .../third_party/jk.mega.DrussGT_3.1.4159.jar | Bin 0 -> 159289 bytes 5 files changed, 171 insertions(+), 17 deletions(-) create mode 100644 ocean/robocode/third_party/jk.mega.DrussGT_3.1.4159.jar diff --git a/config/robocode.ini b/config/robocode.ini index 32e9f79bfb..cc43da4633 100644 --- a/config/robocode.ini +++ b/config/robocode.ini @@ -32,6 +32,11 @@ reward_range_damage_inflicted = 0.017177545879507577 dr = 0.6 bot_policy = 3 max_ticks = 3000 +# Opponent action-noise curriculum (0 = off). Win → decay toward full-strength opp. +bot_cl_noise = 0.0 +bot_cl_decay = 0.0 +hist_cl_noise = 0.0 +hist_cl_decay = 0.0 [policy] hidden_size = 256 diff --git a/ocean/robocode/bot_tournament.c b/ocean/robocode/bot_tournament.c index d31d1788b2..8769922fef 100644 --- a/ocean/robocode/bot_tournament.c +++ b/ocean/robocode/bot_tournament.c @@ -1,9 +1,10 @@ // Round-robin tournament among scripted robocode bots (3,4,5,6). // // Compile from repo root: -// gcc -O2 -Iocean/robocode -Iraylib-5.5_linux_amd64/include \ +// gcc -O2 -Iocean/robocode -Isrc -Iraylib-5.5_linux_amd64/include \ // -o build/bot_tournament ocean/robocode/bot_tournament.c \ -// -Lraylib-5.5_linux_amd64/lib -lraylib -lm -lpthread -ldl +// -Lraylib-5.5_linux_amd64/lib -lraylib -lm -lpthread -ldl \ +// -Wl,-rpath,$PWD/raylib-5.5_linux_amd64/lib // // Usage: // ./build/bot_tournament [games_per_pair] [seed] @@ -42,19 +43,19 @@ static int play_one(int policy_a, int policy_b, int max_ticks, unsigned int seed env.dr = 0.0f; env.client = NULL; - allocate_env(&env); - c_reset(&env); + init(&env); + puf_reset(&env); for (int step = 0; step < max_ticks + 5; step++) { env.bot_match_winner = -2; - c_step(&env); + puf_step(&env); if (env.bot_match_winner != -2) { int w = env.bot_match_winner; - c_close(&env); + puf_close(&env); return w; } } - c_close(&env); + puf_close(&env); return -1; } diff --git a/ocean/robocode/bots.h b/ocean/robocode/bots.h index ed1415e611..43e9c562fc 100644 --- a/ocean/robocode/bots.h +++ b/ocean/robocode/bots.h @@ -180,6 +180,13 @@ struct BotMem { #include "agent_raiko.h" #include "agent_drussgt.h" +// Per-bot policy: bot_policy_1 overrides for the second bot in bot-vs-bot. +static inline int bot_policy_for(Robocode* env, int bot_idx) { + int bi = bot_idx - env->num_agents; + if (bi == 1 && env->bot_policy_1 >= 0) return env->bot_policy_1; + return env->bot_policy; +} + // ---- Lifetime --------------------------------------------------------------- static inline void bot_mems_alloc(Robocode* env) { if (env->num_bots <= 0) { env->bot_mems = NULL; return; } @@ -301,11 +308,12 @@ static void bot_on_hit_by_bullet(Robocode* env, int bot_idx, float bullet_heading, float bullet_power) { if (env->bot_mems == NULL) return; BotMem* m = &env->bot_mems[bot_idx - env->num_agents]; - if (env->bot_policy == BOT_DRUSSGT) { + int policy = bot_policy_for(env, bot_idx); + if (policy == BOT_DRUSSGT) { dgt_on_hit_by_bullet(m, bullet_heading, bullet_power); return; } - if (env->bot_policy != BOT_WAVE_SURFER) return; + if (policy != BOT_WAVE_SURFER) return; float speed = 20.0f - 3.0f * bullet_power; WSWave* best = NULL; int best_age = -1; @@ -329,6 +337,41 @@ static void bot_on_hit_by_bullet(Robocode* env, int bot_idx, best->active = 0; } +// Curriculum random bot: sample from the same discrete action tables agents use. +// Called when rand_unit(env) < env->bot_cl_noise instead of the scripted policy. +static void bot_random_step(Robocode* env, int bot_idx) { + Robot* bot = &env->robots[bot_idx]; + float move_atn = ACCEL_VALUES[rand_r(&env->rng) % 4]; + move(env, bot, move_atn); + + float turn_atn = TURN_VALUES[rand_r(&env->rng) % 9]; + float max_turn = 10.0f - 0.75f * fabsf(bot->v); + if (max_turn < 0.0f) max_turn = 0.0f; + float body = turn(&bot->heading, turn_atn, max_turn, 0.0f); + + float gun_atn = GUN_TURN_VALUES[rand_r(&env->rng) % 11]; + float gun = turn(&bot->gun_heading, gun_atn, 20.0f, body); + + float radar_atn = RADAR_TURN_VALUES[rand_r(&env->rng) % 11]; + bot->radar_heading_prev = bot->radar_heading; + turn(&bot->radar_heading, radar_atn, 45.0f, body + gun); + + float firepower = FIREPOWER_VALUES[rand_r(&env->rng) % 6]; + if (firepower > 0.0f) { + fire(env, bot, bot_idx, firepower); + } + + float px = bot->x, py = bot->y; + bot->x = fmaxf(16.0f, fminf(bot->x, env->width - 16.0f)); + bot->y = fmaxf(16.0f, fminf(bot->y, env->height - 16.0f)); + if (bot->x != px || bot->y != py) { + float wall_dmg = fabsf(bot->v) * 0.5f - 1.0f; + if (wall_dmg < 0.0f) wall_dmg = 0.0f; + bot->energy -= wall_dmg; + bot->v = 0.0f; + } +} + // ---- Main entry ------------------------------------------------------------- static void bot_step(Robocode* env, int bot_idx) { Robot* bot = &env->robots[bot_idx]; @@ -337,21 +380,28 @@ static void bot_step(Robocode* env, int bot_idx) { if (bot->energy < 0) return; if (bot->energy == 0) { bot->v = 0; return; } if (bot->gun_heat > 0) bot->gun_heat -= 0.1f; - if (env->bot_policy == BOT_STATIONARY) return; + int policy = bot_policy_for(env, bot_idx); + if (policy == BOT_STATIONARY) return; BotMem* m = &env->bot_mems[bot_idx - env->num_agents]; m->tick++; if (m->orbit_dir == 0) m->orbit_dir = 1; - if (env->bot_policy == BOT_HAWK_ON_FIRE) { + // Curriculum: randomly replace scripted policy with discrete noise. + if (env->bot_cl_noise > 0.0f && rand_unit(env) < env->bot_cl_noise) { + bot_random_step(env, bot_idx); + return; + } + + if (policy == BOT_HAWK_ON_FIRE) { bot_hawk_on_fire_step(env, bot_idx, m); return; } - if (env->bot_policy == BOT_RAIKO) { + if (policy == BOT_RAIKO) { bot_raiko_step(env, bot_idx, m); return; } - if (env->bot_policy == BOT_DRUSSGT) { + if (policy == BOT_DRUSSGT) { bot_drussgt_step(env, bot_idx, m); return; } @@ -424,10 +474,10 @@ static void bot_step(Robocode* env, int bot_idx) { // Detect target fire from energy drop BEFORE overwriting last_energy_seen. float drop = m->last_scan_tick > 0 ? (m->last_energy_seen - tgt->energy) : 0.0f; bool fired = (drop > 0.0f && drop <= 3.0f); - if (env->bot_policy == BOT_SURFER && fired) { + if (policy == BOT_SURFER && fired) { m->orbit_dir = -m->orbit_dir; m->last_dir_change_tick = m->tick; - } else if (env->bot_policy == BOT_WAVE_SURFER && fired) { + } else if (policy == BOT_WAVE_SURFER && fired) { // Wave origin = target's PREVIOUS scanned position (where they // were the tick before they fired). speed inferred from drop. WSWave* w = &m->waves[m->wave_head]; @@ -454,7 +504,7 @@ static void bot_step(Robocode* env, int bot_idx) { if (m->last_scan_tick == 0) return; // still hunting for first contact // ---- Wave-surfer: expire missed waves, then choose orbit direction --- - if (env->bot_policy == BOT_WAVE_SURFER) { + if (policy == BOT_WAVE_SURFER) { for (int wi = 0; wi < WS_NUM_WAVES; wi++) { WSWave* w = &m->waves[wi]; if (!w->active) continue; diff --git a/ocean/robocode/robocode.h b/ocean/robocode/robocode.h index d343bb8a21..6437bdfd0e 100644 --- a/ocean/robocode/robocode.h +++ b/ocean/robocode/robocode.h @@ -60,6 +60,11 @@ struct Log { float policy_0_score; float policy_1_score; float draw_rate; + // Opponent action-noise curriculum faced this episode (pre-decay). + float bot_cl_noise; + float hist_cl_noise; + // Win credit * (1 - noise). Full credit only vs annealed (noise=0) opps. + float cl_perf; float n; }; @@ -129,8 +134,21 @@ struct Env { float reward_range_damage_inflicted_slot_1; float dr; int bot_policy; + // Optional second-bot policy for bot-vs-bot harnesses (num_agents=0). + // <0 means both bots use bot_policy (normal train/eval). + int bot_policy_1; + // Bot-vs-bot result when num_agents==0: -2 ongoing, 0/1 winner idx, -1 draw. + int bot_match_winner; BotMem* bot_mems; // per-bot scratch (allocated by bots.h) + // Opponent action-noise curriculum. With prob bot_cl_noise, scripted bots + // take uniform discrete actions; with prob hist_cl_noise, hist slot-1 + // actions are overwritten. Primary win decays the active noise by *_decay. + float bot_cl_noise; + float bot_cl_decay; + float hist_cl_noise; + float hist_cl_decay; + // Selfplay-pool tagging. tag = 0 means pure selfplay (both slots = primary // policy). tag > 0 means historical: slot 0 = primary, slot 1 = frozen // historical opponent. boundary_reached is set on game-end so the trainer @@ -177,6 +195,16 @@ void puf_init(Env* env, Dict* kwargs) { "reward_range_damage_inflicted_slot_1", env->reward_range_damage_inflicted); env->dr = robocode_get_float(kwargs, "dr", 0.0f); env->bot_policy = dict_get(kwargs, "bot_policy"); + env->bot_policy_1 = (int)robocode_get_float(kwargs, "bot_policy_1", -1.0f); + env->bot_match_winner = -2; + env->bot_cl_noise = robocode_get_float(kwargs, "bot_cl_noise", 0.0f); + env->bot_cl_decay = robocode_get_float(kwargs, "bot_cl_decay", 0.0f); + env->hist_cl_noise = robocode_get_float(kwargs, "hist_cl_noise", 0.0f); + env->hist_cl_decay = robocode_get_float(kwargs, "hist_cl_decay", 0.0f); + if (env->bot_cl_noise < 0.0f) env->bot_cl_noise = 0.0f; + if (env->bot_cl_noise > 1.0f) env->bot_cl_noise = 1.0f; + if (env->hist_cl_noise < 0.0f) env->hist_cl_noise = 0.0f; + if (env->hist_cl_noise > 1.0f) env->hist_cl_noise = 1.0f; env->agents[0].policy = 0; env->agents[1].policy = 1; env->agents[0].action_mask = NULL; @@ -196,6 +224,9 @@ void puf_log(Log* log, Dict* out) { dict_set(out, "policy_0_score", log->policy_0_score); dict_set(out, "policy_1_score", log->policy_1_score); dict_set(out, "draw_rate", log->draw_rate); + dict_set(out, "bot_cl_noise", log->bot_cl_noise); + dict_set(out, "hist_cl_noise", log->hist_cl_noise); + dict_set(out, "cl_perf", log->cl_perf); dict_set(out, "n", log->n); } @@ -231,6 +262,8 @@ void add_log(Robocode* env) { env->log.melee_damage_inflicted += env->logs[i].melee_damage_inflicted; env->log.damage_taken += env->logs[i].damage_taken; env->log.range_damage_inflicted += env->logs[i].range_damage_inflicted; + env->log.bot_cl_noise += env->logs[i].bot_cl_noise; + env->log.hist_cl_noise += env->logs[i].hist_cl_noise; env->log.n += 1.0f; } } @@ -653,15 +686,41 @@ static inline int agent_terminal_outcome(Robocode* env) { // 0 draw. Historical accounting only applies when env->tag > 0. static inline void end_episode(Robocode* env, int outcome) { float s0_score = (outcome > 0) ? 1.0f : (outcome < 0) ? 0.0f : 0.5f; + // Noise faced this episode (pre-decay). Bot vs scripted, hist vs frozen, else 0. + float noise = 0.0f; + if (env->num_bots > 0 && env->num_agents == 1) + noise = env->bot_cl_noise; + else if (env->tag > 0) + noise = env->hist_cl_noise; + if (noise < 0.0f) noise = 0.0f; + if (noise > 1.0f) noise = 1.0f; // Scale by num_agents so that (policy_0_score / n) where n increments by // num_agents per episode in add_log gives the win rate directly. match() // reads this from env/policy_0_score after eval_log divides by n. env->log.policy_0_score += s0_score * env->num_agents; env->log.policy_1_score += (1.0f - s0_score) * env->num_agents; + env->log.cl_perf += s0_score * (1.0f - noise) * env->num_agents; if (outcome == 0) env->log.draw_rate += env->num_agents; if (env->tag > 0) { env->boundary_reached = 1; } + // Snapshot pre-decay noise for metrics (what the agent actually faced). + for (int a = 0; a < env->num_agents; a++) { + env->logs[a].bot_cl_noise = (env->num_bots > 0 && env->num_agents == 1) + ? noise : 0.0f; + env->logs[a].hist_cl_noise = (env->tag > 0) ? noise : 0.0f; + } + // Curriculum: primary win → harden bot / frozen opp (lower random rate). + if (outcome > 0 && env->num_bots > 0 && env->bot_cl_decay > 0.0f + && env->bot_cl_noise > 0.0f) { + env->bot_cl_noise -= env->bot_cl_decay; + if (env->bot_cl_noise < 0.0f) env->bot_cl_noise = 0.0f; + } + if (outcome > 0 && env->tag > 0 && env->hist_cl_decay > 0.0f + && env->hist_cl_noise > 0.0f) { + env->hist_cl_noise -= env->hist_cl_decay; + if (env->hist_cl_noise < 0.0f) env->hist_cl_noise = 0.0f; + } for (int a = 0; a < env->num_agents; a++) { *env->agents[a].terminals = 1.0f; } @@ -709,10 +768,27 @@ static void robocode_human_controls(Robocode *env) { } } +static inline void bot_vs_bot_check(Robocode* env) { + if (env->num_agents > 0 || env->num_bots <= 0) return; + int alive = 0, winner = -1; + for (int b = 0; b < env->num_bots; b++) { + if (env->robots[b].energy > 0.0f) { + alive++; + winner = b; + } + } + if (alive == 1) env->bot_match_winner = winner; + else if (alive == 0) env->bot_match_winner = -1; +} + void puf_step(Robocode* env) { // Timeout: all agents step in lockstep, so logs[0].episode_length is shared. env->tick += 1; if (env->tick > env->max_ticks) { + if (env->num_agents <= 0) { + env->bot_match_winner = -1; + return; + } end_episode(env, 0); // draw return; } @@ -803,7 +879,7 @@ void puf_step(Robocode* env) { } // DrussGT gun learning when a bot's bullet hits anyone. if (!s_agent && env->bot_mems != NULL - && env->bot_policy == BOT_DRUSSGT) { + && bot_policy_for(env, shooter) == BOT_DRUSSGT) { int bmem = shooter - env->num_agents; if (bmem >= 0 && bmem < env->num_bots) { dgt_on_bullet_hit(&env->bot_mems[bmem], @@ -825,9 +901,15 @@ void puf_step(Robocode* env) { } } if (env->num_bots > 0 && !any_bot_alive) { + if (env->num_agents <= 0) { + env->bot_match_winner = -1; + return; + } end_episode(env, +1); // primary wiped all bots return; } + bot_vs_bot_check(env); + if (env->num_agents <= 0 && env->bot_match_winner != -2) return; agent_outcome = agent_terminal_outcome(env); if (agent_outcome != 2) { end_episode(env, agent_outcome); @@ -845,6 +927,16 @@ void puf_step(Robocode* env) { continue; } + // Hist curriculum: with hist_cl_noise, replace frozen slot actions. + if (i > 0 && env->tag > 0 && env->hist_cl_noise > 0.0f + && rand_unit(env) < env->hist_cl_noise) { + atn[0] = (float)(rand_r(&env->rng) % 4); + atn[1] = (float)(rand_r(&env->rng) % 9); + atn[2] = (float)(rand_r(&env->rng) % 11); + atn[3] = (float)(rand_r(&env->rng) % 11); + atn[4] = (float)(rand_r(&env->rng) % 6); + } + // Cool down gun if (robot->gun_heat > 0) { robot->gun_heat -= 0.1f; @@ -911,9 +1003,15 @@ void puf_step(Robocode* env) { } } if (!any_bot_alive) { + if (env->num_agents <= 0) { + env->bot_match_winner = -1; + return; + } end_episode(env, +1); return; } + bot_vs_bot_check(env); + if (env->num_agents <= 0 && env->bot_match_winner != -2) return; } compute_observations(env); } diff --git a/ocean/robocode/third_party/jk.mega.DrussGT_3.1.4159.jar b/ocean/robocode/third_party/jk.mega.DrussGT_3.1.4159.jar new file mode 100644 index 0000000000000000000000000000000000000000..fe094fdadcac4b441fda06f2a8a8aa6580748781 GIT binary patch literal 159289 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%0D|bt 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 literal 0 HcmV?d00001 From 82bd86974d1de8a818ef611efb82f8c448e2c0be Mon Sep 17 00:00:00 2001 From: Spencer Cheng Date: Wed, 26 Aug 2026 15:06:03 +0000 Subject: [PATCH 05/19] selfplay with bot eval for sweep --- config/default.ini | 8 ++++++-- config/robocode.ini | 2 ++ src/pufferl.cu | 39 ++++++++++++++++++++++++++++++++++++--- 3 files changed, 44 insertions(+), 5 deletions(-) diff --git a/config/default.ini b/config/default.ini index 99181dcaa3..05eca0d624 100644 --- a/config/default.ini +++ b/config/default.ini @@ -42,8 +42,9 @@ hist_policy_percent = 0 # Selfplay-pool training. When enabled, hist_policy_percent of agent slots (see # [vec]) play against older checkpoints from the current run. Opponents are # resampled from the pool every opp_timeout_steps global steps (0 = never). -# At end of train, final policy is matched vs up to eval_pool_size opponents from -# the pool (mean A winrate becomes the sweep score when eval_games > 0). +# At end of train, final policy scoring (first match wins): +# eval_bot_games > 0 → mean env/perf vs bots 3–6 (1 data point for Protein) +# else eval_games > 0 → mean A winrate vs up to eval_pool_size pool opps [selfplay] enabled = 0 max_size = 16 @@ -52,6 +53,9 @@ seed = 42 opp_timeout_steps = 500_000_000 eval_pool_size = 8 eval_games = 0 +# 0 = off. >0 = after train, eval final vs bots 3,4,5,6 for this many episodes +# each; mean env/perf becomes TrainResult.score (points=1 for Protein). +eval_bot_games = 0 # Args used by your env's binding.c go here [env] diff --git a/config/robocode.ini b/config/robocode.ini index cc43da4633..1ed918a612 100644 --- a/config/robocode.ini +++ b/config/robocode.ini @@ -18,6 +18,8 @@ seed = 42 opp_timeout_steps = 100000000 eval_games = 4096 eval_pool_size = 8 +# >0: end-of-train mean perf vs bots 3–6 becomes Protein score (overrides eval_games) +eval_bot_games = 0 [env] num_agents = 1 diff --git a/src/pufferl.cu b/src/pufferl.cu index 6dafbf5355..68abe4967c 100644 --- a/src/pufferl.cu +++ b/src/pufferl.cu @@ -3188,18 +3188,51 @@ TrainResult run_train(Ini* ini, TrainContext* ctx) { result.step_points[points - 1] = result.steps; } + long bot_games = use_selfplay ? puf_ini_get(ini, "selfplay", "eval_bot_games") : 0; int max_opp = use_selfplay ? puf_ini_get(ini, "selfplay", "eval_pool_size") : 0; long pool_games = use_selfplay ? puf_ini_get(ini, "selfplay", "eval_games") : 0; - int pool_eval = use_selfplay && max_opp > 0 && pool_games > 0 && final_checkpoint[0]; + int bot_ladder = use_selfplay && bot_games > 0 && final_checkpoint[0]; + int pool_eval = !bot_ladder && use_selfplay && max_opp > 0 + && pool_games > 0 && final_checkpoint[0]; long eval_episodes = puf_ini_get(ini, "base", "eval_episodes"); - if (ctx->artifact_owner && !pool_eval && eval_episodes > 0) { + if (ctx->artifact_owner && !bot_ladder && !pool_eval && eval_episodes > 0) { EvalResult r = eval_loop(ini, pufferl, EVAL_SCORE, 1, 0, eval_episodes, &last_log, (int)pufferl->epoch); result.score = result.scores[result.points - 1] = r.score; } close_pufferl(pufferl); - if (pool_eval && ctx->artifact_owner) { + // Final Protein point (points=1): bot ladder > pool match > train curve. + if (bot_ladder && ctx->artifact_owner) { + puf_ini_put(ini, "base.load_model_path", final_checkpoint); + puf_ini_put(ini, "env.num_agents", "1"); + puf_ini_put(ini, "env.num_bots", "1"); + puf_ini_put(ini, "env.dr", "0"); + puf_ini_put(ini, "env.bot_cl_noise", "0"); + puf_ini_put(ini, "env.hist_cl_noise", "0"); + puf_ini_put(ini, "selfplay.enabled", "0"); + puf_ini_put(ini, "vec.num_policies", "1"); + puf_ini_put(ini, "vec.hist_policy_percent", "0"); + int bots[4] = {3, 4, 5, 6}; + float sum = 0; + for (int i = 0; i < 4; i++) { + char bbuf[16]; + snprintf(bbuf, sizeof(bbuf), "%d", bots[i]); + puf_ini_put(ini, "env.bot_policy", bbuf); + PuffeRL* ep = eval_make(ini, ctx, EVAL_SCORE, 0); + EvalResult r = eval_loop(ini, ep, EVAL_SCORE, 0, 0, bot_games, NULL, 0); + close_pufferl(ep); + sum += r.perf; + printf("bot_eval policy=%d games=%d perf=%.4f\n", + bots[i], r.games, r.perf); + } + result.score = result.scores[0] = sum / 4.0f; + result.points = 1; + result.costs[0] = result.cost; + result.step_points[0] = result.steps; + dict_set(&last_log, "selfplay/bot_ladder_perf", result.score); + printf("bot_eval mean_perf=%.4f\n", result.score); + } else if (pool_eval && ctx->artifact_owner) { puf_ini_put(ini, "base.load_model_path", final_checkpoint); int n_opp = 0; float sum = 0; From fc21c3b0e5a87127b78c5420f447f3c370c1377d Mon Sep 17 00:00:00 2001 From: root Date: Wed, 26 Aug 2026 15:21:53 +0000 Subject: [PATCH 06/19] selfplay fixes --- src/pufferl.cu | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/src/pufferl.cu b/src/pufferl.cu index 6dafbf5355..cabbf984a0 100644 --- a/src/pufferl.cu +++ b/src/pufferl.cu @@ -2511,7 +2511,6 @@ typedef struct { } Selfplay; void selfplay_add_checkpoint(Selfplay* sp, const char* path) { - while (access(path, R_OK) != 0) usleep(50000); for (int i = 0; i < sp->pool_size; i++) { if (strcmp(sp->pool[i], path) == 0) return; } @@ -2953,16 +2952,16 @@ TrainResult run_train(Ini* ini, TrainContext* ctx) { if (!use_selfplay) { puf_ini_put(ini, "vec.num_policies", "1"); puf_ini_put(ini, "vec.hist_policy_percent", "0"); + } else { + int npol = puf_ini_get(ini, "vec", "num_policies"); + assert(npol >= 2 && npol <= SELFPLAY_MAX_HIST + 1 + && "selfplay requires vec.num_policies in 2..SELFPLAY_MAX_HIST+1"); + assert(puf_ini_get(ini, "vec", "hist_policy_percent") > 0 + && "selfplay requires vec.hist_policy_percent > 0"); } char run_id[64]; - const char* configured_run_id = puf_ini_get_str(ini, "base", "run_id"); - if (!configured_run_id[0] || strcmp(configured_run_id, "None") == 0) { - snprintf(run_id, sizeof(run_id), "%ld", (long)(1000.0 * wall_clock())); - puf_ini_put(ini, "base.run_id", run_id); - } else { - snprintf(run_id, sizeof(run_id), "%s", configured_run_id); - } + snprintf(run_id, sizeof(run_id), "%s", puf_ini_get_str(ini, "base", "run_id")); char checkpoint_dir[2048]; char log_dir[2048]; @@ -2983,9 +2982,7 @@ TrainResult run_train(Ini* ini, TrainContext* ctx) { char initial_checkpoint[4096]; snprintf(initial_checkpoint, sizeof(initial_checkpoint), "%s/%016ld.bin", checkpoint_dir, pufferl->global_step); - if (ctx->artifact_owner) { - puf_save_weights(pufferl, initial_checkpoint); - } + puf_save_weights(pufferl, initial_checkpoint); selfplay.num_hist = pufferl->num_policies - 1; assert(selfplay.num_hist > 0 && selfplay.num_hist <= SELFPLAY_MAX_HIST && "selfplay requires num_policies in 2..SELFPLAY_MAX_HIST+1"); @@ -3065,8 +3062,10 @@ TrainResult run_train(Ini* ini, TrainContext* ctx) { && (epoch + 1) % checkpoint_interval == 0)) { snprintf(saved_checkpoint, sizeof(saved_checkpoint), "%s/%016ld.bin", checkpoint_dir, pufferl->global_step); - if (ctx->artifact_owner) { + if (ctx->artifact_owner || use_selfplay) { puf_save_weights(pufferl, saved_checkpoint); + } + if (ctx->artifact_owner) { snprintf(final_checkpoint, sizeof(final_checkpoint), "%s", saved_checkpoint); } @@ -3201,6 +3200,7 @@ TrainResult run_train(Ini* ini, TrainContext* ctx) { if (pool_eval && ctx->artifact_owner) { puf_ini_put(ini, "base.load_model_path", final_checkpoint); + TrainContext eval_ctx = {.world_size = 1, .artifact_owner = 1}; int n_opp = 0; float sum = 0; for (int i = 0; i < selfplay.pool_size && n_opp < max_opp; i++) { @@ -3208,7 +3208,7 @@ TrainResult run_train(Ini* ini, TrainContext* ctx) { continue; } puf_ini_put(ini, "base.load_enemy_model_path", selfplay.pool[i]); - PuffeRL* ep = eval_make(ini, ctx, EVAL_MATCH, 0); + PuffeRL* ep = eval_make(ini, &eval_ctx, EVAL_MATCH, 0); EvalResult r = eval_loop(ini, ep, EVAL_MATCH, 0, 0, pool_games, NULL, 0); close_pufferl(ep); sum += r.score; @@ -3287,6 +3287,13 @@ TrainResult launch_train(Ini* ini) { assert(horizon % ADV_VEC_WIDTH == 0 && "train.horizon must be a multiple of ADV_VEC_WIDTH (4 float / 8 bf16)"); + const char* run_id = puf_ini_get_str(ini, "base", "run_id"); + if (!run_id[0] || strcmp(run_id, "None") == 0) { + char buf[64]; + snprintf(buf, sizeof(buf), "%ld", (long)(1000.0 * wall_clock())); + puf_ini_put(ini, "base.run_id", buf); + } + int nccl_pipe[2] = {-1, -1}; if (world_size > 1) { assert(pipe(nccl_pipe) == 0 && "pipe failed"); From 9dedc4c288524f0ec6c17a6ce250d7cd5958203d Mon Sep 17 00:00:00 2001 From: root Date: Wed, 26 Aug 2026 18:54:33 +0000 Subject: [PATCH 07/19] fixing selfplay sweeps vs bots eval --- config/default.ini | 2 +- config/robocode.ini | 86 ++++++++++++++++++++++++++++++--------------- src/pufferl.cu | 32 +++++++++-------- 3 files changed, 76 insertions(+), 44 deletions(-) diff --git a/config/default.ini b/config/default.ini index 05eca0d624..51b1e93ae0 100644 --- a/config/default.ini +++ b/config/default.ini @@ -101,7 +101,7 @@ verb_eps_anneal_start = 0.4 verb_eps_anneal_end = 1.0 [sweep] -metric = score +metric = cl_perf metric_distribution = linear goal = maximize max_suggestion_cost = 3600 diff --git a/config/robocode.ini b/config/robocode.ini index 1ed918a612..32de3a302c 100644 --- a/config/robocode.ini +++ b/config/robocode.ini @@ -3,74 +3,88 @@ env_name = robocode checkpoint_interval = 100 [vec] -total_agents = 16384 +total_agents = 4096 num_buffers = 4 num_threads = 4 num_policies = 1 -hist_policy_percent = 0.0 -hist_policy_hidden_size = 256 +hist_policy_hidden_size = 512 hist_policy_num_layers = 4 +hist_policy_percent = 0 [selfplay] enabled = 0 max_size = 100 seed = 42 opp_timeout_steps = 100000000 -eval_games = 4096 eval_pool_size = 8 # >0: end-of-train mean perf vs bots 3–6 becomes Protein score (overrides eval_games) eval_bot_games = 0 +eval_games = 0 [env] +dr = 0.0387078 num_agents = 1 num_bots = 1 width = 800 height = 600 -reward_damage = 0.0 -reward_spot = 0.0 -reward_melee_damage_inflicted = 0.007448376232810955 -reward_damage_taken = -0.004918136926337855 -reward_range_damage_inflicted = 0.017177545879507577 -dr = 0.6 -bot_policy = 3 +reward_damage = 0.00266758 +reward_spot = 0 +reward_melee_damage_inflicted = 0.00357583 +reward_damage_taken = 0 +reward_range_damage_inflicted = 0.02 +bot_policy = 6 max_ticks = 3000 -# Opponent action-noise curriculum (0 = off). Win → decay toward full-strength opp. -bot_cl_noise = 0.0 -bot_cl_decay = 0.0 -hist_cl_noise = 0.0 -hist_cl_decay = 0.0 +bot_cl_noise = 1 +bot_cl_decay = 0.0126647 +hist_cl_decay = 0 [policy] -hidden_size = 256 +hidden_size = 512 num_layers = 4 [train] gpus = 1 -# vs wave-surfer confirmation. Do not start from the 14B repro. -total_timesteps = 200_000_000 -learning_rate = 0.0072914747025563794 -gamma = 0.9996207050319893 -gae_lambda = 0.8883938238847433 -minibatch_size = 8192 -horizon = 128 - +total_timesteps = 461110992 +learning_rate = 0.00164182 +anneal_lr = 1 +min_lr_ratio = 0 +gamma = 0.997897 +gae_lambda = 0.863659 +replay_ratio = 1.86936 +clip_coef = 0.360877 +vf_coef = 3.62434 +vf_clip_coef = 1.86018 +max_grad_norm = 1.5 +ent_coef = 0.000163238 +anneal_ent_coef = 0 +min_ent_coef_ratio = 0.1 +momentum = 0.890661 +minibatch_size = 4096 +horizon = 64 +vtrace = 0 +vtrace_rho_clip = 1 +vtrace_c_clip = 1 +verb_eps = 0 +verb_eps_anneal_start = 0.4 +verb_eps_anneal_end = 1 [sweep.train.total_timesteps] distribution = log_normal -min = 5e8 -max = 1e11 +min = 2e8 +max = 2e9 mean = 5e8 scale = auto + [sweep.policy.hidden_size] distribution = uniform_pow2 min = 32 -max = 1024 +max = 512 scale = auto [sweep.policy.num_layers] distribution = uniform min = 1 -max = 8 +max = 4 scale = auto [sweep.env.dr] @@ -100,3 +114,17 @@ min = -0.02 max = 0.0 mean = -0.005 scale = auto + +[sweep.env.bot_cl_noise] +distribution = uniform +max = 1.0 +min = 0.5 +mean = 0.8 +scale = auto + +[sweep.env.bot_cl_decay] +distribution = uniform +max = 0.25 +min = 0.01 +mean = 0.05 +scale = auto diff --git a/src/pufferl.cu b/src/pufferl.cu index 05fef1a4df..60d3827432 100644 --- a/src/pufferl.cu +++ b/src/pufferl.cu @@ -3137,25 +3137,28 @@ TrainResult run_train(Ini* ini, TrainContext* ctx) { dict_set(&new_log, "pool/num_hist", selfplay.num_hist); dict_set(&new_log, "pool/num_policies", pufferl->num_policies); } - // Dense keys: replace last_log wholesale. - dict_clear(&last_log); - dict_copy(&last_log, &new_log); - dict_clear(&new_log); - + // n=0 logs omit env/*; keep last complete-episode snapshot. + int episodes = dict_get(&new_log, "env/n") > 0; if (ctx->artifact_owner) { - puf_dashboard_print(ini, pufferl, &last_log, (int)pufferl->epoch); + puf_dashboard_print(ini, pufferl, &new_log, (int)pufferl->epoch); + } + result.cost = dict_get(&new_log, "uptime"); + result.steps = dict_get(&new_log, "agent_steps"); + if (episodes || !last_log.size) { + dict_clear(&last_log); + dict_copy(&last_log, &new_log); + } else { + dict_set(&last_log, "uptime", result.cost); + dict_set(&last_log, "agent_steps", result.steps); } - // Wait until the objective appears; do not treat negative values as missing. - if (!dict_find(&last_log, target_key)) { - continue; + if (episodes && dict_find(&new_log, target_key)) { + puf_log_history_add(&log_history, &last_log); } - puf_log_history_add(&log_history, &last_log); + dict_clear(&new_log); } // TrainResult curve: bin-mean over log_history (same as artifact metrics). - result.cost = dict_get(&last_log, "uptime"); - result.steps = dict_get(&last_log, "agent_steps"); DictItem* target = dict_find(&last_log, target_key); result.score = target ? (float)target->value : 0; @@ -3260,6 +3263,7 @@ TrainResult run_train(Ini* ini, TrainContext* ctx) { } if (ctx->artifact_owner) { + assert(log_history.size == 0 || dict_find(&last_log, target_key)); puf_log_history_add(&log_history, &last_log); char log_path[4096]; snprintf(log_path, sizeof(log_path), "%s/%s.ini", log_dir, run_id); @@ -3271,11 +3275,11 @@ TrainResult run_train(Ini* ini, TrainContext* ctx) { puf_ini_write(fp, ini); fprintf(fp, "\n[metrics]\n"); - // Dense keys from first history row; bin-mean same as TrainResult curve. + // Last snapshot keys (train + selfplay eval overlays). if (log_history.size > 0) { int metric_points = points; double* out = (double*)calloc(metric_points, sizeof(double)); - Dict* key_src = &log_history.items[0]; + Dict* key_src = &log_history.items[log_history.size - 1]; for (int k = 0; k < key_src->size; k++) { const char* key = key_src->items[k].key; if (strncmp(key, "loss/", 5) == 0) { From 4adc7366472869be63734e2039ac6c17a5654476 Mon Sep 17 00:00:00 2001 From: root Date: Fri, 28 Aug 2026 14:59:11 +0000 Subject: [PATCH 08/19] selfplay + constellation fixes --- config/robocode.ini | 89 ++++++++++++++++++++++++++------------------- src/constellation.c | 4 +- src/pufferl.cu | 26 +++++++++---- 3 files changed, 72 insertions(+), 47 deletions(-) diff --git a/config/robocode.ini b/config/robocode.ini index 32de3a302c..a20ade93e3 100644 --- a/config/robocode.ini +++ b/config/robocode.ini @@ -1,42 +1,41 @@ [base] env_name = robocode checkpoint_interval = 100 - [vec] -total_agents = 4096 +total_agents = 8192 num_buffers = 4 num_threads = 4 -num_policies = 1 +num_policies = 2 hist_policy_hidden_size = 512 hist_policy_num_layers = 4 -hist_policy_percent = 0 +hist_policy_percent = 0.0986825526 [selfplay] -enabled = 0 +enabled = 1 max_size = 100 seed = 42 -opp_timeout_steps = 100000000 +opp_timeout_steps = 23164294 eval_pool_size = 8 -# >0: end-of-train mean perf vs bots 3–6 becomes Protein score (overrides eval_games) -eval_bot_games = 0 eval_games = 0 +eval_bot_games = 8192 [env] -dr = 0.0387078 -num_agents = 1 -num_bots = 1 +dr = 0 +num_agents = 2 +num_bots = 0 width = 800 height = 600 reward_damage = 0.00266758 reward_spot = 0 -reward_melee_damage_inflicted = 0.00357583 -reward_damage_taken = 0 -reward_range_damage_inflicted = 0.02 +reward_melee_damage_inflicted = 0.0153914625 +reward_damage_taken = -0.00830152631 +reward_range_damage_inflicted = 0.0148673765 bot_policy = 6 max_ticks = 3000 bot_cl_noise = 1 bot_cl_decay = 0.0126647 hist_cl_decay = 0 +hist_cl_noise = 0 [policy] hidden_size = 512 @@ -44,36 +43,50 @@ num_layers = 4 [train] gpus = 1 -total_timesteps = 461110992 -learning_rate = 0.00164182 +total_timesteps = 1.04093504e+09 +learning_rate = 0.00203742459 anneal_lr = 1 min_lr_ratio = 0 -gamma = 0.997897 -gae_lambda = 0.863659 -replay_ratio = 1.86936 -clip_coef = 0.360877 -vf_coef = 3.62434 -vf_clip_coef = 1.86018 +gamma = 0.997819901 +gae_lambda = 0.744058013 +replay_ratio = 1.46916461 +clip_coef = 0.162855715 +vf_coef = 2.80316305 +vf_clip_coef = 0.240199268 max_grad_norm = 1.5 -ent_coef = 0.000163238 +ent_coef = 9.99999975e-06 anneal_ent_coef = 0 min_ent_coef_ratio = 0.1 -momentum = 0.890661 +momentum = 0.893604636 minibatch_size = 4096 -horizon = 64 +horizon = 32 vtrace = 0 vtrace_rho_clip = 1 vtrace_c_clip = 1 verb_eps = 0 verb_eps_anneal_start = 0.4 verb_eps_anneal_end = 1 + [sweep.train.total_timesteps] distribution = log_normal min = 2e8 -max = 2e9 +max = 3e9 mean = 5e8 scale = auto +[sweep.vec.hist_policy_percent] +distribution = uniform +min = 0.05 +max = 1.0 +mean = 0.25 +scale = auto + +[sweep.selfplay.opp_timeout_steps] +distribution = log_normal +min = 1e7 +max = 1e9 +mean = 1e8 +scale = auto [sweep.policy.hidden_size] distribution = uniform_pow2 @@ -115,16 +128,16 @@ max = 0.0 mean = -0.005 scale = auto -[sweep.env.bot_cl_noise] -distribution = uniform -max = 1.0 -min = 0.5 -mean = 0.8 -scale = auto +#[sweep.env.bot_cl_noise] +#distribution = uniform +#max = 1.0 +#min = 0.5 +#mean = 0.8 +#scale = auto -[sweep.env.bot_cl_decay] -distribution = uniform -max = 0.25 -min = 0.01 -mean = 0.05 -scale = auto +#[sweep.env.bot_cl_decay] +#distribution = uniform +#max = 0.25 +#min = 0.01 +#mean = 0.05 +#scale = auto diff --git a/src/constellation.c b/src/constellation.c index 89a68bca4c..97d03e36f8 100644 --- a/src/constellation.c +++ b/src/constellation.c @@ -388,7 +388,7 @@ static void write_env(FILE* fp, const char* env, Table* table) { if (r > 0) { fputc(',', fp); } - fprintf(fp, "%.6g", table_get(table, r, c)); + fprintf(fp, "%.9g", table_get(table, r, c)); } fputc('\n', fp); } @@ -1038,7 +1038,7 @@ void copy_hypers_to_clipboard(Table *table, char* buffer, int row) { } else if (val == (long long)val) { buffer += sprintf(buffer, "%s = %lld\n", suffix, (long long)val); } else { - buffer += sprintf(buffer, "%s = %g\n", suffix, val); + buffer += sprintf(buffer, "%s = %.9g\n", suffix, val); } } buffer[0] = '\0'; diff --git a/src/pufferl.cu b/src/pufferl.cu index 60d3827432..d3d7a119da 100644 --- a/src/pufferl.cu +++ b/src/pufferl.cu @@ -2958,6 +2958,14 @@ TrainResult run_train(Ini* ini, TrainContext* ctx) { && "selfplay requires vec.num_policies in 2..SELFPLAY_MAX_HIST+1"); assert(puf_ini_get(ini, "vec", "hist_policy_percent") > 0 && "selfplay requires vec.hist_policy_percent > 0"); + // Pool opps are this run's checkpoints; hist arch must match policy. + char hb[32], lb[32]; + snprintf(hb, sizeof(hb), "%d", + (int)puf_ini_get(ini, "policy", "hidden_size")); + snprintf(lb, sizeof(lb), "%d", + (int)puf_ini_get(ini, "policy", "num_layers")); + puf_ini_put(ini, "vec.hist_policy_hidden_size", hb); + puf_ini_put(ini, "vec.hist_policy_num_layers", lb); } char run_id[64]; @@ -3204,6 +3212,16 @@ TrainResult run_train(Ini* ini, TrainContext* ctx) { } close_pufferl(pufferl); + char log_path[4096]; + snprintf(log_path, sizeof(log_path), "%s/%s.ini", log_dir, run_id); + if (ctx->artifact_owner) { + FILE* fp = fopen(log_path, "w"); + assert(fp && "failed to open log for writing"); + fprintf(fp, "# PufferLib log v1\n"); + puf_ini_write(fp, ini); + fclose(fp); + } + // Final Protein point (points=1): bot ladder > pool match > train curve. if (bot_ladder && ctx->artifact_owner) { puf_ini_put(ini, "base.load_model_path", final_checkpoint); @@ -3265,14 +3283,8 @@ TrainResult run_train(Ini* ini, TrainContext* ctx) { if (ctx->artifact_owner) { assert(log_history.size == 0 || dict_find(&last_log, target_key)); puf_log_history_add(&log_history, &last_log); - char log_path[4096]; - snprintf(log_path, sizeof(log_path), "%s/%s.ini", log_dir, run_id); - - FILE* fp = fopen(log_path, "w"); + FILE* fp = fopen(log_path, "a"); assert(fp && "failed to open log for writing"); - - fprintf(fp, "# PufferLib log v1\n"); - puf_ini_write(fp, ini); fprintf(fp, "\n[metrics]\n"); // Last snapshot keys (train + selfplay eval overlays). From 0cd9312a58e670e0afe6b4252aa588d320e9ab2e Mon Sep 17 00:00:00 2001 From: root Date: Fri, 28 Aug 2026 16:32:37 +0000 Subject: [PATCH 09/19] bug fixes --- src/constellation.c | 23 +++-------------------- src/pufferl.cu | 4 ++++ 2 files changed, 7 insertions(+), 20 deletions(-) diff --git a/src/constellation.c b/src/constellation.c index 97d03e36f8..b0d174a842 100644 --- a/src/constellation.c +++ b/src/constellation.c @@ -328,16 +328,6 @@ static void load_env(const char* env, int full_dataset, Table* out) { free(ents); int steps_col = table_col(out, "agent_steps"); - int total_steps_col = table_col(out, "train/total_timesteps"); - for (int r = 0; r < out->rows; r++) { - if (steps_col >= 0) { - table_set(out, r, steps_col, table_get(out, r, steps_col) / 1e6f); - } - if (total_steps_col >= 0) { - table_set(out, r, total_steps_col, table_get(out, r, total_steps_col) / 1e6f); - } - } - if (full_dataset || steps_col < 0) { return; } @@ -1028,17 +1018,10 @@ void copy_hypers_to_clipboard(Table *table, char* buffer, int row) { char* suffix = slash + 1; double val = table_get(table, row, col); - if (strcmp(suffix, "total_timesteps") == 0) { - // Use agent_steps (training-only) instead of total_timesteps (train+eval) - int agent_steps = table_require_col(table, "agent_steps"); - val = table_get(table, row, agent_steps); - buffer += sprintf(buffer, "%s = %lld\n", suffix, (long long)(val * 1e6)); - } else if (strcmp(suffix, "agent_steps") == 0) { - buffer += sprintf(buffer, "%s = %lld\n", suffix, (long long)(val * 1e6)); - } else if (val == (long long)val) { + if (val == (long long)val) { buffer += sprintf(buffer, "%s = %lld\n", suffix, (long long)val); } else { - buffer += sprintf(buffer, "%s = %.9g\n", suffix, val); + buffer += sprintf(buffer, "%s = %.17g\n", suffix, val); } } buffer[0] = '\0'; @@ -1436,7 +1419,7 @@ int main(void) { float L = table_get(table, j, layers); float params = 3.0f * h * h * L; float flops = 6.0f * params * table_get(table, j, replay) - * table_get(table, j, steps) * 1e6f; + * table_get(table, j, steps); if (params <= 0 || flops <= 0 || flops >= best_flops) { continue; } diff --git a/src/pufferl.cu b/src/pufferl.cu index d3d7a119da..8e322dc2ca 100644 --- a/src/pufferl.cu +++ b/src/pufferl.cu @@ -3233,6 +3233,10 @@ TrainResult run_train(Ini* ini, TrainContext* ctx) { puf_ini_put(ini, "selfplay.enabled", "0"); puf_ini_put(ini, "vec.num_policies", "1"); puf_ini_put(ini, "vec.hist_policy_percent", "0"); + // One finished 1v1 per eval env; ignore swept train total_agents. + char nbuf[32]; + snprintf(nbuf, sizeof(nbuf), "%ld", bot_games); + puf_ini_put(ini, "vec.total_agents", nbuf); int bots[4] = {3, 4, 5, 6}; float sum = 0; for (int i = 0; i < 4; i++) { From f7e060141dba2c342d0f529ea7eea9d713ecb5a6 Mon Sep 17 00:00:00 2001 From: root Date: Fri, 28 Aug 2026 16:38:23 +0000 Subject: [PATCH 10/19] const --- src/constellation.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/constellation.c b/src/constellation.c index b0d174a842..4d3cdf5ea4 100644 --- a/src/constellation.c +++ b/src/constellation.c @@ -328,6 +328,11 @@ static void load_env(const char* env, int full_dataset, Table* out) { free(ents); int steps_col = table_col(out, "agent_steps"); + for (int r = 0; r < out->rows; r++) { + if (steps_col >= 0) { + table_set(out, r, steps_col, table_get(out, r, steps_col) / 1e6f); + } + } if (full_dataset || steps_col < 0) { return; } @@ -1018,7 +1023,11 @@ void copy_hypers_to_clipboard(Table *table, char* buffer, int row) { char* suffix = slash + 1; double val = table_get(table, row, col); - if (val == (long long)val) { + // agent_steps is stored in millions for plots; do not write it + // over train/total_timesteps (that was the replay-budget bug). + if (strcmp(suffix, "agent_steps") == 0) { + buffer += sprintf(buffer, "%s = %.0f\n", suffix, val * 1e6); + } else if (val == (long long)val) { buffer += sprintf(buffer, "%s = %lld\n", suffix, (long long)val); } else { buffer += sprintf(buffer, "%s = %.17g\n", suffix, val); @@ -1419,7 +1428,7 @@ int main(void) { float L = table_get(table, j, layers); float params = 3.0f * h * h * L; float flops = 6.0f * params * table_get(table, j, replay) - * table_get(table, j, steps); + * table_get(table, j, steps) * 1e6f; if (params <= 0 || flops <= 0 || flops >= best_flops) { continue; } From 9838e78c2811fececb3111352f1bf8d590273936 Mon Sep 17 00:00:00 2001 From: root Date: Fri, 28 Aug 2026 16:53:00 +0000 Subject: [PATCH 11/19] revert --- src/constellation.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/constellation.c b/src/constellation.c index 4d3cdf5ea4..97d03e36f8 100644 --- a/src/constellation.c +++ b/src/constellation.c @@ -328,11 +328,16 @@ static void load_env(const char* env, int full_dataset, Table* out) { free(ents); int steps_col = table_col(out, "agent_steps"); + int total_steps_col = table_col(out, "train/total_timesteps"); for (int r = 0; r < out->rows; r++) { if (steps_col >= 0) { table_set(out, r, steps_col, table_get(out, r, steps_col) / 1e6f); } + if (total_steps_col >= 0) { + table_set(out, r, total_steps_col, table_get(out, r, total_steps_col) / 1e6f); + } } + if (full_dataset || steps_col < 0) { return; } @@ -1023,14 +1028,17 @@ void copy_hypers_to_clipboard(Table *table, char* buffer, int row) { char* suffix = slash + 1; double val = table_get(table, row, col); - // agent_steps is stored in millions for plots; do not write it - // over train/total_timesteps (that was the replay-budget bug). - if (strcmp(suffix, "agent_steps") == 0) { - buffer += sprintf(buffer, "%s = %.0f\n", suffix, val * 1e6); + if (strcmp(suffix, "total_timesteps") == 0) { + // Use agent_steps (training-only) instead of total_timesteps (train+eval) + int agent_steps = table_require_col(table, "agent_steps"); + val = table_get(table, row, agent_steps); + buffer += sprintf(buffer, "%s = %lld\n", suffix, (long long)(val * 1e6)); + } else if (strcmp(suffix, "agent_steps") == 0) { + buffer += sprintf(buffer, "%s = %lld\n", suffix, (long long)(val * 1e6)); } else if (val == (long long)val) { buffer += sprintf(buffer, "%s = %lld\n", suffix, (long long)val); } else { - buffer += sprintf(buffer, "%s = %.17g\n", suffix, val); + buffer += sprintf(buffer, "%s = %.9g\n", suffix, val); } } buffer[0] = '\0'; From 719dc0450c13a36ea5ecfd3fcf066b81270560bb Mon Sep 17 00:00:00 2001 From: root Date: Mon, 31 Aug 2026 16:15:54 +0000 Subject: [PATCH 12/19] robocode selfplay 93% --- config/robocode.ini | 57 ++++++++++++++++++++++----------------------- 1 file changed, 28 insertions(+), 29 deletions(-) diff --git a/config/robocode.ini b/config/robocode.ini index a20ade93e3..64b757e4d1 100644 --- a/config/robocode.ini +++ b/config/robocode.ini @@ -2,22 +2,22 @@ env_name = robocode checkpoint_interval = 100 [vec] -total_agents = 8192 +total_agents = 16384 num_buffers = 4 num_threads = 4 num_policies = 2 hist_policy_hidden_size = 512 -hist_policy_num_layers = 4 -hist_policy_percent = 0.0986825526 +hist_policy_num_layers = 6 +hist_policy_percent = 0.00999999978 [selfplay] enabled = 1 max_size = 100 seed = 42 -opp_timeout_steps = 23164294 +opp_timeout_steps = 124200912 eval_pool_size = 8 eval_games = 0 -eval_bot_games = 8192 +eval_bot_games = 8192 [env] dr = 0 @@ -25,48 +25,47 @@ num_agents = 2 num_bots = 0 width = 800 height = 600 -reward_damage = 0.00266758 +reward_damage = 0.00266758003 reward_spot = 0 -reward_melee_damage_inflicted = 0.0153914625 -reward_damage_taken = -0.00830152631 -reward_range_damage_inflicted = 0.0148673765 +reward_melee_damage_inflicted = 0 +reward_damage_taken = 0 +reward_range_damage_inflicted = 0.00260018697 bot_policy = 6 max_ticks = 3000 -bot_cl_noise = 1 -bot_cl_decay = 0.0126647 +bot_cl_decay = 0.0126646999 hist_cl_decay = 0 +bot_cl_noise = 0 hist_cl_noise = 0 [policy] hidden_size = 512 -num_layers = 4 +num_layers = 6.00442648 [train] gpus = 1 -total_timesteps = 1.04093504e+09 -learning_rate = 0.00203742459 +total_timesteps = 2.11788314e+09 +learning_rate = 0.00357848359 anneal_lr = 1 min_lr_ratio = 0 -gamma = 0.997819901 -gae_lambda = 0.744058013 -replay_ratio = 1.46916461 -clip_coef = 0.162855715 -vf_coef = 2.80316305 -vf_clip_coef = 0.240199268 +gamma = 0.997707605 +gae_lambda = 0.868802786 +replay_ratio = 1.78362608 +clip_coef = 0.100000001 +vf_coef = 2.01139474 +vf_clip_coef = 1.35169744 max_grad_norm = 1.5 -ent_coef = 9.99999975e-06 +ent_coef = 2.53209255e-05 anneal_ent_coef = 0 -min_ent_coef_ratio = 0.1 -momentum = 0.893604636 -minibatch_size = 4096 +min_ent_coef_ratio = 0.100000001 +momentum = 0.853156328 +minibatch_size = 16384 horizon = 32 vtrace = 0 vtrace_rho_clip = 1 vtrace_c_clip = 1 verb_eps = 0 -verb_eps_anneal_start = 0.4 +verb_eps_anneal_start = 0.400000006 verb_eps_anneal_end = 1 - [sweep.train.total_timesteps] distribution = log_normal min = 2e8 @@ -76,7 +75,7 @@ scale = auto [sweep.vec.hist_policy_percent] distribution = uniform -min = 0.05 +min = 0.01 max = 1.0 mean = 0.25 scale = auto @@ -91,13 +90,13 @@ scale = auto [sweep.policy.hidden_size] distribution = uniform_pow2 min = 32 -max = 512 +max = 512 scale = auto [sweep.policy.num_layers] distribution = uniform min = 1 -max = 4 +max = 8 scale = auto [sweep.env.dr] From f1e9233f65c75e1541213a801b528474736e7968 Mon Sep 17 00:00:00 2001 From: Spencer Cheng Date: Wed, 2 Sep 2026 18:55:59 +0000 Subject: [PATCH 13/19] system for multiple selfplay envs --- config/default.ini | 12 +- config/robocode.ini | 8 + config/slimevolley.ini | 32 +- ocean/robocode/robocode.h | 5 + ocean/slimevolley/slimevolley.h | 512 +++++++++++++------------------- src/ini.h | 20 ++ src/pufferenv.h | 7 + src/pufferl.cu | 74 +++-- 8 files changed, 341 insertions(+), 329 deletions(-) diff --git a/config/default.ini b/config/default.ini index 51b1e93ae0..034a5c6ba1 100644 --- a/config/default.ini +++ b/config/default.ini @@ -43,7 +43,7 @@ hist_policy_percent = 0 # [vec]) play against older checkpoints from the current run. Opponents are # resampled from the pool every opp_timeout_steps global steps (0 = never). # At end of train, final policy scoring (first match wins): -# eval_bot_games > 0 → mean env/perf vs bots 3–6 (1 data point for Protein) +# eval_bot_games > 0 → mean env/perf vs the eval_bots ladder (1 Protein point) # else eval_games > 0 → mean A winrate vs up to eval_pool_size pool opps [selfplay] enabled = 0 @@ -53,9 +53,15 @@ seed = 42 opp_timeout_steps = 500_000_000 eval_pool_size = 8 eval_games = 0 -# 0 = off. >0 = after train, eval final vs bots 3,4,5,6 for this many episodes -# each; mean env/perf becomes TrainResult.score (points=1 for Protein). +# 0 = off. >0 = after train, eval final vs each bot in eval_bots for this many +# episodes each; mean env/perf becomes TrainResult.score (points=1 for Protein). eval_bot_games = 0 +# Ladder rungs, weakest first: the [env] bot_policy ids the env's header +# defines. Required when eval_bot_games > 0, e.g. eval_bots = 3,4,5,6. + +# Per-rung [env] overrides for the bot ladder, as full section.key = value +# lines (e.g. env.dr = 0). Env-owned so core needs no per-env knowledge. +[bot_eval] # Args used by your env's binding.c go here [env] diff --git a/config/robocode.ini b/config/robocode.ini index 64b757e4d1..933cb63203 100644 --- a/config/robocode.ini +++ b/config/robocode.ini @@ -18,6 +18,14 @@ opp_timeout_steps = 124200912 eval_pool_size = 8 eval_games = 0 eval_bot_games = 8192 +# wave_surfer, hawk_on_fire, raiko, drussgt (BOT_* in bots.h) +eval_bots = 3,4,5,6 + +# Ladder rungs run without domain randomization or curriculum noise. +[bot_eval] +env.dr = 0 +env.bot_cl_noise = 0 +env.hist_cl_noise = 0 [env] dr = 0 diff --git a/config/slimevolley.ini b/config/slimevolley.ini index 487e26e562..54fd7e4f18 100644 --- a/config/slimevolley.ini +++ b/config/slimevolley.ini @@ -1,17 +1,41 @@ [base] env_name = slimevolley # Same class of 5.0 trainer change that blocked drone: stale actor + RNN carry. -async = 0 +async = 1 reset_every_horizon = 1 +checkpoint_interval = 100 [vec] total_agents = 16384 num_buffers = 4 num_threads = 2 +num_policies = 1 +hist_policy_percent = 0.15 +hist_policy_hidden_size = 128 +hist_policy_num_layers = 3 +# Selfplay: slot 0 is the primary policy, slot 1 is a frozen checkpoint on +# hist_policy_percent of the envs. Final score is the primary's mean win rate +# over up to eval_pool_size pool opponents. +[selfplay] +enabled = 0 +max_size = 100 +seed = 42 +opp_timeout_steps = 100_000_000 +eval_pool_size = 8 +eval_games = 4096 +# Set > 0 to score off the bot ladder instead of the pool eval. +eval_bot_games = 0 +eval_bots = 0 + +# 1v1: num_agents + num_bots must be 2. Selfplay instead of the bot with +# ./puffer train --env.num_agents=2 --env.num_bots=0 --selfplay.enabled=1 +# --vec.num_policies=2 [env] num_agents = 1 -gamma = 0.99 +num_bots = 1 +bot_policy = 0 +max_ticks = 3000 [policy] hidden_size = 128 @@ -42,6 +66,10 @@ vtrace_rho_clip = 1.3635 vtrace_c_clip = 2.29725 [sweep] +# Lives margin in [0, 1]; the default cl_perf is a robocode curriculum metric +# this env does not log. Symmetric selfplay pins perf at 0.5, so a selfplay +# sweep scores off the pool eval below; vs the bot perf is the dense signal. +metric = perf downsample = 5 [sweep.train.total_timesteps] diff --git a/ocean/robocode/robocode.h b/ocean/robocode/robocode.h index 6437bdfd0e..ff0fd67945 100644 --- a/ocean/robocode/robocode.h +++ b/ocean/robocode/robocode.h @@ -6,6 +6,7 @@ #include #include "raylib.h" typedef float obs_t; +#define PUF_HAS_BOT_POLICY #include "pufferenv.h" #define NUM_ACTIONS 5 @@ -159,6 +160,10 @@ struct Env { unsigned int rng; }; +static inline void puf_set_bot_policy(Env* env, int bot_policy) { + env->bot_policy = bot_policy; +} + void init(Robocode* env); static inline float robocode_get_float(Dict* kwargs, const char* key, float default_value) { diff --git a/ocean/slimevolley/slimevolley.h b/ocean/slimevolley/slimevolley.h index 6419b6f1fa..41643c8cb7 100644 --- a/ocean/slimevolley/slimevolley.h +++ b/ocean/slimevolley/slimevolley.h @@ -4,6 +4,7 @@ #include #include typedef float obs_t; +#define PUF_HAS_BOT_POLICY #include "pufferenv.h" // CONFIG @@ -13,6 +14,10 @@ typedef float obs_t; typedef Env SlimeVolley; +// Scripted opponents, weakest first. These are the [env] bot_policy ids and the +// rungs of [selfplay] eval_bots. +enum { BOT_ABRANTI = 0 }; + #define REF_W 48 #define REF_H REF_W #define REF_U 1.5 // ground height @@ -30,27 +35,13 @@ typedef Env SlimeVolley; #define WINDOW_WIDTH 1200 #define WINDOW_HEIGHT 500 #define FACTOR (WINDOW_WIDTH / REF_W) -#define PIXEL_MODE false -#define PIXEL_SCALE 4 -#define PIXEL_WIDTH (84*2) -#define PIXEL_HEIGHT 84 -#define MAX_TICKS 3000 - -// Day colors -const Color BALL_COLOR = {255, 200, 20, 255}; -const Color AGENT_LEFT_COLOR = {240, 75, 0, 255}; -const Color AGENT_RIGHT_COLOR = {0, 150, 255, 255}; -const Color PIXEL_AGENT_LEFT_COLOR = {240, 75, 0, 255}; -const Color PIXEL_AGENT_RIGHT_COLOR = {0, 150, 255, 255}; -const Color BACKGROUND_COLOR = {255, 255, 255, 255}; -const Color FENCE_COLOR = {240, 210, 130, 255}; + const Color COIN_COLOR = {240, 210, 130, 255}; +const Color FENCE_COLOR = {240, 210, 130, 255}; const Color GROUND_COLOR = {128, 227, 153, 255}; - -const Color PUFF_RED = (Color){187, 0, 0, 255}; -const Color PUFF_CYAN = (Color){0, 187, 187, 255}; -const Color PUFF_WHITE = (Color){241, 241, 241, 241}; -const Color PUFF_BACKGROUND = (Color){6, 24, 24, 255}; +const Color PUFF_RED = {187, 0, 0, 255}; +const Color PUFF_CYAN = {0, 187, 187, 255}; +const Color PUFF_BACKGROUND = {6, 24, 24, 255}; // UTILS typedef struct { @@ -82,13 +73,10 @@ typedef struct { float vx; float vy; float prev_x; - float prev_y; - Color c; } Ball; void ball_move(Ball* ball){ ball->prev_x = ball->x; - ball->prev_y = ball->y; ball->x += ball->vx * TIMESTEP; ball->y += ball->vy * TIMESTEP; } @@ -98,7 +86,28 @@ void ball_accelerate(Ball* ball, float ax, float ay){ ball->vy += ay * TIMESTEP; } +// Returns 0 while the ball is live, else the side that conceded: -1 left, 1 right. int ball_check_edges(Ball* ball){ + // Solid fence. The old test only fired on the tick the ball crossed a face + // (x inside the band, prev_x outside), so a ball that got inside the band + // any other way - a player bounce shoving it off the wall, a stub bounce + // dropping it in - drifted out the far side and scored for free. Resolve + // against the face the ball came from instead. That also catches a full + // tunnel in one step, and runs after the player bounces so a hit into the + // wall cannot push the ball through it. + float fence = REF_WALL_WIDTH/2 + ball->r; + if (ball->y <= REF_WALL_HEIGHT){ + float side = (ball->prev_x >= fence) - (ball->prev_x <= -fence); + if (side == 0){ + side = (ball->x >= 0) ? 1.0f : -1.0f; // already inside: nearest face + } + if (side*ball->x < fence){ + ball->x = side*(fence + NUDGE*TIMESTEP); + if (side*ball->vx < 0){ + ball->vx *= -FRICTION; + } + } + } if (ball->x <= (ball->r-REF_W/2)){ ball->vx *= -FRICTION; ball->x = ball->r-REF_W/2+NUDGE*TIMESTEP; @@ -107,28 +116,14 @@ int ball_check_edges(Ball* ball){ ball->vx *= -FRICTION; ball->x = REF_W/2-ball->r-NUDGE*TIMESTEP; } - if (ball->y <= (ball->r+REF_U)){ - ball->vy *= -FRICTION; - ball->y = ball->r+REF_U+NUDGE*TIMESTEP; - if (ball->x <= 0){ - return -1; - } - else{ - return 1; - } - } if (ball->y >= (REF_H-ball->r)){ ball->vy *= -FRICTION; ball->y = REF_H-ball->r-NUDGE*TIMESTEP; } - // fence: - if ((ball->x <= (REF_WALL_WIDTH/2+ball->r)) && (ball->prev_x > (REF_WALL_WIDTH/2+ball->r)) && (ball->y <= REF_WALL_HEIGHT)){ - ball->vx *= -FRICTION; - ball->x = REF_WALL_WIDTH/2+ball->r+NUDGE*TIMESTEP; - } - if ((ball->x >= (-REF_WALL_WIDTH/2-ball->r)) && (ball->prev_x < (-REF_WALL_WIDTH/2-ball->r)) && (ball->y <= REF_WALL_HEIGHT)){ - ball->vx *= -FRICTION; - ball->x = -REF_WALL_WIDTH/2-ball->r-NUDGE*TIMESTEP; + if (ball->y <= (ball->r+REF_U)){ + ball->vy *= -FRICTION; + ball->y = ball->r+REF_U+NUDGE*TIMESTEP; + return (ball->x <= 0) ? -1 : 1; } return 0; } @@ -170,51 +165,15 @@ void ball_bounce(Ball* ball, SphericalObject* p){ ball->vy = uy + p->vy; } -void ball_limit_speed(Ball* ball, float minSpeed, float maxSpeed){ +void ball_limit_speed(Ball* ball, float max_speed){ float mag2 = ball->vx*ball->vx+ball->vy*ball->vy; - if (mag2 > (maxSpeed*maxSpeed)){ + if (mag2 > (max_speed*max_speed)){ float mag = sqrt(mag2); - ball->vx /= mag; - ball->vy /= mag; - ball->vx *= maxSpeed; - ball->vy *= maxSpeed; + ball->vx *= max_speed/mag; + ball->vy *= max_speed/mag; } } -// Relative State -typedef struct { - //agent - float x; - float y; - float vx; - float vy; - //ball - float bx; - float by; - float bvx; - float bvy; - //opponent - float ox; - float oy; - float ovx; - float ovy; -} RelativeState; - -// WALL -typedef struct { - float x; - float y; - float w; - float h; - Color c; -} Wall; - -void wall_display(Wall* wall){ - Rectangle rec = {to_x_pixel(wall->x - wall->w/2), to_y_pixel(wall->y + wall->h/2), - to_p(wall->w), to_p(wall->h)}; - DrawRectangleRec(rec, wall->c); -} - // PLAYER (game entity; RL Agent is from pufferenv) typedef struct { float x; @@ -227,12 +186,10 @@ typedef struct { float desired_vx; float desired_vy; float* observations; - RelativeState *state; int lives; } Player; void agent_display(Player *agent, float bx, float by) { - // fprintf(stderr, "agent_display: x=%f, y=%f, r=%f, lives=%d, dir=%d\n", agent->x, agent->y, agent->r, agent->lives, agent->dir); float x = agent->x; float y = agent->y; float r = agent->r; @@ -298,43 +255,29 @@ void agent_display(Player *agent, float bx, float by) { } void agent_set_action(Player* agent, float* action){ - bool forward = false; - bool backward = false; - bool jump = false; - if (action[0] > 0){ - forward = true; - } - if (action[1] > 0){ - backward = true; - } - if (action[2] > 0){ - jump = true; - } agent->desired_vx = 0; agent->desired_vy = 0; + bool forward = action[0] > 0; + bool backward = action[1] > 0; if (forward && !backward){ agent->desired_vx = -PLAYER_SPEED_X; } if (backward && !forward){ agent->desired_vx = PLAYER_SPEED_X; } - if (jump){ + if (action[2] > 0){ agent->desired_vy = PLAYER_SPEED_Y; } } -void agent_move(Player* agent){ - agent->x += agent->vx * TIMESTEP; - agent->y += agent->vy * TIMESTEP; -} - void agent_update(Player* agent){ agent->vy += GRAVITY * TIMESTEP; if (agent->y <= REF_U + NUDGE*TIMESTEP){ // if grounded agent->vy = agent->desired_vy; } agent->vx = agent->desired_vx*agent->dir; - agent_move(agent); + agent->x += agent->vx * TIMESTEP; + agent->y += agent->vy * TIMESTEP; if (agent->y <= REF_U){ agent->y = REF_U; agent->vy = 0; @@ -350,162 +293,175 @@ void agent_update(Player* agent){ } } +// Ego-centric and mirrored by dir, so both sides see the same game. void agent_update_state(Player* agent, Ball* ball, Player* opponent){ - int obs_idx = 0; float* observations = agent->observations; - - // self - observations[obs_idx++] = agent->x*agent->dir / 10.0f; - observations[obs_idx++] = agent->y / 10.0f; - observations[obs_idx++] = agent->vx*agent->dir / 10.0f; - observations[obs_idx++] = agent->vy / 10.0f; - // ball - observations[obs_idx++] = ball->x*agent->dir / 10.0f; - observations[obs_idx++] = ball->y / 10.0f; - observations[obs_idx++] = ball->vx*agent->dir / 10.0f; - observations[obs_idx++] = ball->vy / 10.0f; - // opponent - observations[obs_idx++] = opponent->x*(-agent->dir) / 10.0f; // negate direction for opponent - observations[obs_idx++] = opponent->y / 10.0f; - observations[obs_idx++] = opponent->vx*(-agent->dir) / 10.0f ; // negate direction for opponent - observations[obs_idx++] = opponent->vy / 10.0f; + observations[0] = agent->x*agent->dir / 10.0f; + observations[1] = agent->y / 10.0f; + observations[2] = agent->vx*agent->dir / 10.0f; + observations[3] = agent->vy / 10.0f; + observations[4] = ball->x*agent->dir / 10.0f; + observations[5] = ball->y / 10.0f; + observations[6] = ball->vx*agent->dir / 10.0f; + observations[7] = ball->vy / 10.0f; + observations[8] = opponent->x*(-agent->dir) / 10.0f; + observations[9] = opponent->y / 10.0f; + observations[10] = opponent->vx*(-agent->dir) / 10.0f; + observations[11] = opponent->vy / 10.0f; } // ENV // Required struct. Only use floats! +typedef struct Log Log; struct Log { + // Lives margin from each slot's own view, mapped to [0, 1]. 0.5 is a draw, + // 1.0 a 5-0 sweep. Denser than win credit, so it is the sweep metric. float perf; - float score; + float score; // lives margin from each slot's own view float episode_return; float episode_length; + // Per-slot win credit for match() scoring + a selfplay sanity check. In + // selfplay both average to ~0.5; in match A=policy 0, B=policy 1, so + // policy_0_score is A's win rate. Each game hands out 1.0 of credit total + // (win=1.0, draw=0.5 each). Scaled by num_agents on accumulation so the + // eval_log mean (sum / n, n incremented per slot per episode) is the rate. + float policy_0_score; + float policy_1_score; + float draw_rate; float n; }; struct Env { Log log; - Agent agents[2]; // pufferenv RL agents (learning slots) - Player players[2]; // game entities (left/right) - Wall* ground; - Wall* fence; - Ball* fence_stub; - Ball* ball; + Agent agents[2]; // pufferenv RL agents (learning slots) + Player players[2]; // game entities: 0 = left, 1 = right + Ball ball; + float episode_return[2]; + float bot_observations[OBS_SIZE]; // right side when it is a scripted bot + float bot_actions[NUM_ATNS]; + int num_agents; // 1 (right side is a bot) or 2 (selfplay) + int num_bots; + int bot_policy; // BOT_* id the scripted side runs + int max_ticks; // episode timeout; configured per-run via [env].max_ticks int delay_frames; - int num_agents; // 1 or 2 learning agents; if 1, right side is a bot + int tick; + // Selfplay-pool tagging. tag = 0 means pure selfplay (both slots = primary + // policy). tag > 0 means historical: slot 0 = primary, slot 1 = frozen + // historical opponent. boundary_reached is set on game-end so the trainer + // can swap frozen banks only between games. int tag; int boundary_reached; - float* bot_observations; - float* bot_actions; - int tick; Texture2D puffers; unsigned int rng; }; +static inline void puf_set_bot_policy(Env* env, int bot_policy) { + env->bot_policy = bot_policy; +} + +void puf_init(Env* env, Dict* kwargs) { + env->num_agents = dict_get(kwargs, "num_agents"); + env->num_bots = dict_get(kwargs, "num_bots"); + env->bot_policy = dict_get(kwargs, "bot_policy"); + env->max_ticks = dict_get(kwargs, "max_ticks"); + assert(env->num_agents + env->num_bots == 2 + && "slimevolley is 1v1: env.num_agents + env.num_bots must be 2"); + assert(env->bot_policy == BOT_ABRANTI + && "slimevolley ships one bot: env.bot_policy must be 0"); + for (int i = 0; i < env->num_agents; i++) { + env->agents[i].policy = i; + env->agents[i].action_mask = NULL; + } +} + +void puf_log(Log* log, Dict* out) { + dict_set(out, "perf", log->perf); + dict_set(out, "score", log->score); + dict_set(out, "episode_return", log->episode_return); + dict_set(out, "episode_length", log->episode_length); + dict_set(out, "policy_0_score", log->policy_0_score); + dict_set(out, "policy_1_score", log->policy_1_score); + dict_set(out, "draw_rate", log->draw_rate); + dict_set(out, "n", log->n); +} + float randf(SlimeVolley* env) { return (float)rand_r(&env->rng) / (float)RAND_MAX; } -/* Recommended to have an init function of some kind if you allocate -* extra memory. This should be freed by puf_close. Don't forget to call -* this in binding.c! -*/ -void init(SlimeVolley* env) { - env->ground = (Wall*)malloc(sizeof(Wall)); - *env->ground = (Wall){0}; - env->ground->x = 0; - env->ground->y = REF_U / 2.0f; - env->ground->w = REF_W; - env->ground->h = REF_U; - env->ground->c = GROUND_COLOR; - env->fence = (Wall*)malloc(sizeof(Wall)); - *env->fence = (Wall){0}; - env->fence->x = 0; - env->fence->y = (REF_U + REF_WALL_HEIGHT)/2.0f; - env->fence->w = REF_WALL_WIDTH; - env->fence->h = REF_WALL_HEIGHT - 1.5f; - env->fence->c = FENCE_COLOR; - env->fence_stub = (Ball*)malloc(sizeof(Ball)); - *env->fence_stub = (Ball){0}; - env->fence_stub->x = 0; - env->fence_stub->y = REF_WALL_HEIGHT; - env->fence_stub->r = REF_WALL_WIDTH/2.0f; - env->fence_stub->c = FENCE_COLOR; - env->ball = (Ball*)malloc(sizeof(Ball)); - env->bot_observations = NULL; - env->bot_actions = NULL; - if (env->num_agents == 1) { - env->bot_observations = (float*)calloc(12, sizeof(float)); - env->bot_actions = (float*)calloc(3, sizeof(float)); - } +void new_match(SlimeVolley* env) { + env->ball = (Ball){ + .x = 0, + .y = REF_W/4, + .r = 0.5, + .vx = 40.0f*randf(env) - 20.0f, + .vy = 15.0f*randf(env) + 10.0f, + }; + env->delay_frames = INIT_DELAY_FRAMES; } // Required function void puf_reset(SlimeVolley* env) { env->tick = 0; - env->delay_frames = INIT_DELAY_FRAMES; - float ball_vx = 40.0f*randf(env) - 20.0f; - float ball_vy = 15.0f*randf(env) + 10.0f; - *env->ball = (Ball){0}; - env->ball->x = 0; - env->ball->y = REF_W/4; - env->ball->vx = ball_vx; - env->ball->vy = ball_vy; - env->ball->r = 0.5; - env->ball->c = BALL_COLOR; - for (int i=0; i < 2; i++) { - obs_t* observations; - if (i == 0) { - observations = env->agents[0].observations; - } else if (env->num_agents == 1) { - observations = env->bot_observations; - } else { - observations = env->agents[1].observations; - } - env->players[i] = (Player){0}; - env->players[i].x = i == 0 ? -REF_W/4 : REF_W/4; - env->players[i].y = REF_U; - env->players[i].r = 1.5; - env->players[i].dir = i == 0 ? -1 : 1; - env->players[i].c = i == 0 ? PUFF_RED : PUFF_CYAN; - env->players[i].lives = MAXLIVES; - env->players[i].observations = observations; - } - agent_update_state(&env->players[0], env->ball, &env->players[1]); - agent_update_state(&env->players[1], env->ball, &env->players[0]); + for (int i = 0; i < 2; i++) { + env->players[i] = (Player){ + .x = (i == 0) ? -REF_W/4 : REF_W/4, + .y = REF_U, + .r = 1.5, + .dir = (i == 0) ? -1 : 1, + .c = (i == 0) ? PUFF_RED : PUFF_CYAN, + .lives = MAXLIVES, + }; + env->players[i].observations = (i < env->num_agents) + ? env->agents[i].observations : env->bot_observations; + env->episode_return[i] = 0.0f; + } + new_match(env); + agent_update_state(&env->players[0], &env->ball, &env->players[1]); + agent_update_state(&env->players[1], &env->ball, &env->players[0]); } -float clip(float val, float min, float max) { - if (val < min) { - return min; - } else if (val > max) { - return max; - } - return val; +void add_reward(SlimeVolley* env, int slot, float reward) { + env->agents[slot].rewards[0] += reward; + env->episode_return[slot] += reward; } -void new_match(SlimeVolley* env) { - float ball_vx = 40.0f*randf(env) - 20.0f; - float ball_vy = 15.0f*randf(env) + 10.0f; - *env->ball = (Ball){0}; - env->ball->x = 0; - env->ball->y = REF_W/4; - env->ball->vx = ball_vx; - env->ball->vy = ball_vy; - env->ball->r = 0.5; - env->ball->c = BALL_COLOR; - env->delay_frames = INIT_DELAY_FRAMES; +// Every episode-end path. outcome: 1 slot 0 won, -1 slot 0 lost, 0 draw. +void end_episode(SlimeVolley* env, int outcome) { + float s0_score = (outcome > 0) ? 1.0f : (outcome < 0) ? 0.0f : 0.5f; + env->log.policy_0_score += s0_score * env->num_agents; + env->log.policy_1_score += (1.0f - s0_score) * env->num_agents; + if (outcome == 0) { + env->log.draw_rate += env->num_agents; + } + if (env->tag > 0) { + env->boundary_reached = 1; + } + int margin = env->players[0].lives - env->players[1].lives; + for (int i = 0; i < env->num_agents; i++) { + int slot_margin = (i == 0) ? margin : -margin; + env->log.perf += (slot_margin + MAXLIVES) / (2.0f*MAXLIVES); + env->log.score += slot_margin; + env->log.episode_return += env->episode_return[i]; + env->log.episode_length += env->tick; + env->log.n += 1.0f; + env->agents[i].terminals[0] = 1.0f; + } + puf_reset(env); } -void abranti_simple_bot(float* obs, float* action) { - // the bot policy. just 7 params but hard to beat. +void puf_bot(SlimeVolley* env, int bot_idx) { + // BOT_ABRANTI. just 7 params but hard to beat. + float* obs = env->players[bot_idx].observations; float x_agent = obs[0]; float x_ball = obs[4]; float vx_ball = obs[6]; - float backward = (-23.757145f * x_agent + 23.206863f * x_ball + 0.7943352f * vx_ball) + 1.4617119f; - float forward = -64.6463748f * backward + 22.4668393f; - action[0] = forward; - action[1] = backward; - action[2] = 1.0f; // always jump + float backward = -23.757145f*x_agent + 23.206863f*x_ball + + 0.7943352f*vx_ball + 1.4617119f; + env->bot_actions[0] = -64.6463748f * backward + 22.4668393f; + env->bot_actions[1] = backward; + env->bot_actions[2] = 1.0f; // always jump } // Hold Left Shift + A/D/W or arrows/space. @@ -529,37 +485,31 @@ static void slimevolley_human_controls(SlimeVolley *env) { // Required function void puf_step(SlimeVolley* env) { - env->agents[0].rewards[0] = 0; - env->agents[0].terminals[0] = 0; - if (env->num_agents == 2){ - env->agents[1].rewards[0] = 0; - env->agents[1].terminals[0] = 0; + env->tick++; + for (int i = 0; i < env->num_agents; i++) { + env->agents[i].rewards[0] = 0; + env->agents[i].terminals[0] = 0; } - + Player* left = &env->players[0]; Player* right = &env->players[1]; - Ball* ball = env->ball; + Ball* ball = &env->ball; - env->tick++; agent_set_action(left, env->agents[0].actions); - if (env->num_agents == 1){ - abranti_simple_bot(right->observations, env->bot_actions); + if (env->num_bots == 1){ + puf_bot(env, 1); agent_set_action(right, env->bot_actions); - } - else { + } else { agent_set_action(right, env->agents[1].actions); } - - // Update agent_update(left); agent_update(right); if (env->delay_frames == 0) { ball_accelerate(ball, 0, GRAVITY); - ball_limit_speed(ball, 0, MAX_BALL_SPEED); + ball_limit_speed(ball, MAX_BALL_SPEED); ball_move(ball); - } - else { + } else { env->delay_frames--; } @@ -569,45 +519,28 @@ void puf_step(SlimeVolley* env) { if (ball_is_colliding(ball, (SphericalObject*)right)){ ball_bounce(ball, (SphericalObject*)right); } - if (ball_is_colliding(ball, (SphericalObject*)env->fence_stub)){ - ball_bounce(ball, (SphericalObject*)env->fence_stub); + SphericalObject fence_stub = {.y = REF_WALL_HEIGHT, .r = REF_WALL_WIDTH/2}; + if (ball_is_colliding(ball, &fence_stub)){ + ball_bounce(ball, &fence_stub); } - int right_reward = -ball_check_edges(ball); - - if (right_reward != 0){ - new_match(env); - if (right_reward == -1){ - right->lives--; - env->agents[0].rewards[0] = 1.0f; - if (env->num_agents == 2){ - env->agents[1].rewards[0] = -1.0f; - } - } - else{ - left->lives--; - env->agents[0].rewards[0] = -1.0f; - if (env->num_agents == 2){ - env->agents[1].rewards[0] = 1.0f; - } + int conceded = ball_check_edges(ball); + if (conceded != 0){ + env->players[(conceded < 0) ? 0 : 1].lives--; + float reward = (conceded < 0) ? -1.0f : 1.0f; // slot 0's view + add_reward(env, 0, reward); + if (env->num_agents == 2){ + add_reward(env, 1, -reward); } + new_match(env); } agent_update_state(left, ball, right); agent_update_state(right, ball, left); - if (env->tick > MAX_TICKS || left->lives <= 0 || right->lives <= 0){ - env->agents[0].terminals[0] = 1; - if (env->num_agents == 2){ - env->agents[1].terminals[0] = 1; - } - env->log.perf += (left->lives - right->lives + 5.0f) / 10.0f; - env->log.score += (float)(left->lives - right->lives); - env->log.episode_return += (5.0f - right->lives); - env->log.episode_length += (float)env->tick; - env->log.n += 1; - puf_reset(env); - } - + if (env->tick > env->max_ticks || left->lives <= 0 || right->lives <= 0){ + int outcome = (left->lives > right->lives) - (left->lives < right->lives); + end_episode(env, outcome); + } } // Required function. Should handle creating the client on first call @@ -626,17 +559,16 @@ void puf_render(SlimeVolley* env) { slimevolley_human_controls(env); BeginDrawing(); ClearBackground(PUFF_BACKGROUND); - wall_display(env->ground); - wall_display(env->fence); - - // Fence - Ball* stub = env->fence_stub; - DrawCircleV( - (Vector2){to_x_pixel(stub->x), to_y_pixel(stub->y)}, - to_p(stub->r), stub->c - ); - - Ball* puff = env->ball; + DrawRectangleRec((Rectangle){to_x_pixel(-REF_W/2.0f), to_y_pixel(REF_U), + to_p(REF_W), to_p(REF_U)}, GROUND_COLOR); + float fence_h = REF_WALL_HEIGHT - REF_U; + DrawRectangleRec((Rectangle){to_x_pixel(-REF_WALL_WIDTH/2.0f), + to_y_pixel(REF_U + fence_h), to_p(REF_WALL_WIDTH), to_p(fence_h)}, + FENCE_COLOR); + DrawCircleV((Vector2){to_x_pixel(0), to_y_pixel(REF_WALL_HEIGHT)}, + to_p(REF_WALL_WIDTH/2.0f), FENCE_COLOR); + + Ball* puff = &env->ball; DrawTexturePro( env->puffers, (Rectangle){ @@ -656,7 +588,7 @@ void puf_render(SlimeVolley* env) { ); for (int i=0; i<2; i++) { - agent_display(&env->players[i], env->ball->x, env->ball->y); + agent_display(&env->players[i], env->ball.x, env->ball.y); } EndDrawing(); @@ -666,33 +598,7 @@ void puf_render(SlimeVolley* env) { // Required function. Should clean up anything you allocated // Do not free env->observations, actions, rewards, terminals void puf_close(SlimeVolley* env) { - free(env->ground); - free(env->fence); - free(env->fence_stub); - free(env->ball); - free(env->bot_observations); - free(env->bot_actions); if (IsWindowReady()) { CloseWindow(); } } - -void puf_init(Env* env, Dict* kwargs) { - env->num_agents = dict_get(kwargs, "num_agents"); - if (env->num_agents < 1) env->num_agents = 1; - if (env->num_agents > 2) env->num_agents = 2; - for (int i = 0; i < env->num_agents; i++) { - env->agents[i].policy = 0; - env->agents[i].action_mask = NULL; - } - init(env); -} - -void puf_log(Log* log, Dict* out) { - dict_set(out, "perf", log->perf); - dict_set(out, "score", log->score); - dict_set(out, "episode_return", log->episode_return); - dict_set(out, "episode_length", log->episode_length); - dict_set(out, "n", log->n); -} - diff --git a/src/ini.h b/src/ini.h index 6d80261e7e..0a22f241f2 100644 --- a/src/ini.h +++ b/src/ini.h @@ -370,6 +370,26 @@ static inline const char* puf_ini_get_str(Ini* ini, const char* section, return dict_get_str(puf_ini_section(ini, section, 0), key); } +// Reads a key as a list of numbers. A scalar reads as one element and a missing +// key as none, so an optional list needs no placeholder in default.ini. +static inline int puf_ini_get_list(Ini* ini, const char* section, + const char* key, double* out, int max) { + DictItem* item = dict_find(puf_ini_section(ini, section, 0), key); + if (!item) { + return 0; + } + int n = item->len ? item->len : 1; + if (n > max) { + fprintf(stderr, "config error: [%s] %s has %d values, max %d\n", + section, key, n, max); + exit(1); + } + for (int i = 0; i < n; i++) { + out[i] = item->len ? item->values[i] : item->value; + } + return n; +} + static inline void puf_ini_put(Ini* ini, const char* full_key, const char* raw) { const char* split = strrchr(full_key, '.'); if (!split) { diff --git a/src/pufferenv.h b/src/pufferenv.h index e812100099..bf04f2779c 100644 --- a/src/pufferenv.h +++ b/src/pufferenv.h @@ -48,6 +48,13 @@ void puf_step(Env* env); void puf_render(Env* env); void puf_close(Env* env); void puf_log(Log* log, Dict* out); +// Bot ladder writes this between rungs so one PuffeRL can eval a whole ladder. +// Default no-op; envs with scripted opponents #define PUF_HAS_BOT_POLICY and +// assign env->bot_policy. +#ifndef PUF_HAS_BOT_POLICY +static inline void puf_set_bot_policy(Env* env, int bot_policy) { +} +#endif typedef uint16_t bf16; diff --git a/src/pufferl.cu b/src/pufferl.cu index 8e322dc2ca..1d6469745a 100644 --- a/src/pufferl.cu +++ b/src/pufferl.cu @@ -1198,24 +1198,39 @@ static void* vec_thread_main(void* arg) { } } +// Fresh episodes + zero RNN carry. Workers sit in BUF_WAITING between rollouts. +static void env_restart(PuffeRL* p) { + VecEnv* vec = p->vec; + if (PUF_BACKEND == PUF_GPU) { + puf_reset(vec->envs); + } else { + #pragma omp parallel for schedule(static) num_threads(vec->num_workers) + for (int i = 0; i < vec->size; i++) { + puf_reset(&vec->envs[i]); + } + cpu_upload(p, 0, vec->total_agents, p->default_stream); + } + for (int b = 0; b < p->num_policies; b++) { + for (int i = 0; i < vec->buffers; i++) { + Prec* st = &p->policies[b].buffer_states[i]; + cudaMemset(st->data, 0, numel(st->shape) * sizeof(precision_t)); + } + } + cudaDeviceSynchronize(); +} + static void env_start(PuffeRL* p) { + VecEnv* vec = p->vec; if (PUF_BACKEND == PUF_GPU) { - puf_reset(p->vec->envs); - cudaDeviceSynchronize(); + env_restart(p); return; } - VecEnv* vec = p->vec; vec->worker_state = (int*)calloc(1, vec->buffers * sizeof(int)); vec->threads = (pthread_t*)calloc(1, vec->buffers * sizeof(pthread_t)); VecThreadArg* args = (VecThreadArg*)calloc(1, vec->buffers * sizeof(VecThreadArg)); vec->accum = (float*)calloc(1, vec->buffers * NUM_PROF * sizeof(float)); - #pragma omp parallel for schedule(static) num_threads(vec->num_workers) - for (int i = 0; i < vec->size; i++) { - puf_reset(&vec->envs[i]); - } - cpu_upload(p, 0, vec->total_agents, p->default_stream); - cudaDeviceSynchronize(); + env_restart(p); for (int i = 0; i < vec->buffers; i++) { args[i].pufferl = p; args[i].buf = i; @@ -2492,6 +2507,7 @@ typedef struct { #define EVAL_MATCH 2 #define SELFPLAY_MAX_HIST 8 +#define SELFPLAY_MAX_LADDER 16 #define SELFPLAY_PATH_MAX 4096 // One historical opponent ↔ policies[policy_idx] (env tag == policy_idx). @@ -2966,6 +2982,11 @@ TrainResult run_train(Ini* ini, TrainContext* ctx) { (int)puf_ini_get(ini, "policy", "num_layers")); puf_ini_put(ini, "vec.hist_policy_hidden_size", hb); puf_ini_put(ini, "vec.hist_policy_num_layers", lb); + double ladder[SELFPLAY_MAX_LADDER]; + assert((puf_ini_get(ini, "selfplay", "eval_bot_games") <= 0 + || puf_ini_get_list(ini, "selfplay", "eval_bots", ladder, + SELFPLAY_MAX_LADDER) > 0) + && "selfplay.eval_bot_games requires selfplay.eval_bots"); } char run_id[64]; @@ -3227,30 +3248,41 @@ TrainResult run_train(Ini* ini, TrainContext* ctx) { puf_ini_put(ini, "base.load_model_path", final_checkpoint); puf_ini_put(ini, "env.num_agents", "1"); puf_ini_put(ini, "env.num_bots", "1"); - puf_ini_put(ini, "env.dr", "0"); - puf_ini_put(ini, "env.bot_cl_noise", "0"); - puf_ini_put(ini, "env.hist_cl_noise", "0"); puf_ini_put(ini, "selfplay.enabled", "0"); puf_ini_put(ini, "vec.num_policies", "1"); puf_ini_put(ini, "vec.hist_policy_percent", "0"); + // Env-owned overrides (curriculum noise, domain randomization, ...) so + // core stays env-agnostic. Re-fetch: puf_ini_put moves ini->sections if + // an override names a section the config does not have yet. + for (int i = 0; i < puf_ini_section(ini, "bot_eval", 1)->size; i++) { + DictItem* over = &puf_ini_section(ini, "bot_eval", 0)->items[i]; + puf_ini_put(ini, over->key, over->str); + } // One finished 1v1 per eval env; ignore swept train total_agents. char nbuf[32]; snprintf(nbuf, sizeof(nbuf), "%ld", bot_games); puf_ini_put(ini, "vec.total_agents", nbuf); - int bots[4] = {3, 4, 5, 6}; + double ladder[SELFPLAY_MAX_LADDER]; + int rungs = puf_ini_get_list(ini, "selfplay", "eval_bots", ladder, + SELFPLAY_MAX_LADDER); + // One PuffeRL for the whole ladder. close_pufferl frees nothing, so a + // trainer per rung is a leak. Swap bot_policy and restart instead. + PuffeRL* ep = eval_make(ini, ctx, EVAL_SCORE, 0); float sum = 0; - for (int i = 0; i < 4; i++) { - char bbuf[16]; - snprintf(bbuf, sizeof(bbuf), "%d", bots[i]); - puf_ini_put(ini, "env.bot_policy", bbuf); - PuffeRL* ep = eval_make(ini, ctx, EVAL_SCORE, 0); + for (int i = 0; i < rungs; i++) { + if (PUF_BACKEND != PUF_GPU) { + for (int e = 0; e < ep->vec->size; e++) { + puf_set_bot_policy(&ep->vec->envs[e], (int)ladder[i]); + } + } + env_restart(ep); EvalResult r = eval_loop(ini, ep, EVAL_SCORE, 0, 0, bot_games, NULL, 0); - close_pufferl(ep); sum += r.perf; printf("bot_eval policy=%d games=%d perf=%.4f\n", - bots[i], r.games, r.perf); + (int)ladder[i], r.games, r.perf); } - result.score = result.scores[0] = sum / 4.0f; + close_pufferl(ep); + result.score = result.scores[0] = sum / rungs; result.points = 1; result.costs[0] = result.cost; result.step_points[0] = result.steps; From 760081fda0dc749ea0b8c810e0b6435ae03ab4b9 Mon Sep 17 00:00:00 2001 From: Spencer Cheng Date: Wed, 2 Sep 2026 19:20:36 +0000 Subject: [PATCH 14/19] sweep bug --- src/pufferl.cu | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/pufferl.cu b/src/pufferl.cu index 1d6469745a..9d497f58ee 100644 --- a/src/pufferl.cu +++ b/src/pufferl.cu @@ -3251,12 +3251,14 @@ TrainResult run_train(Ini* ini, TrainContext* ctx) { puf_ini_put(ini, "selfplay.enabled", "0"); puf_ini_put(ini, "vec.num_policies", "1"); puf_ini_put(ini, "vec.hist_policy_percent", "0"); - // Env-owned overrides (curriculum noise, domain randomization, ...) so - // core stays env-agnostic. Re-fetch: puf_ini_put moves ini->sections if - // an override names a section the config does not have yet. - for (int i = 0; i < puf_ini_section(ini, "bot_eval", 1)->size; i++) { - DictItem* over = &puf_ini_section(ini, "bot_eval", 0)->items[i]; - puf_ini_put(ini, over->key, over->str); + // [bot_eval] keys are [env] names (dr, not env.dr). Dotted keys break + // sweep argv, which flattens as section.key and splits on the last dot. + Dict* bot_eval = puf_ini_section(ini, "bot_eval", 1); + for (int i = 0; i < bot_eval->size; i++) { + DictItem* over = &bot_eval->items[i]; + char ek[PUF_DICT_MAX_KEY + 8]; + snprintf(ek, sizeof(ek), "env.%s", over->key); + puf_ini_put(ini, ek, over->str); } // One finished 1v1 per eval env; ignore swept train total_agents. char nbuf[32]; From 2187be0b0c42cf80e058414c319e20035d735bdc Mon Sep 17 00:00:00 2001 From: Spencer Cheng Date: Thu, 3 Sep 2026 16:14:23 +0000 Subject: [PATCH 15/19] games per env --- src/pufferl.cu | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/pufferl.cu b/src/pufferl.cu index 9d497f58ee..0bf667e328 100644 --- a/src/pufferl.cu +++ b/src/pufferl.cu @@ -2509,6 +2509,11 @@ typedef struct { #define SELFPLAY_MAX_HIST 8 #define SELFPLAY_MAX_LADDER 16 #define SELFPLAY_PATH_MAX 4096 +// Bot-ladder parallelism, held fixed so rung scores stay comparable across +// sweep trials that vary vec.total_agents. selfplay.eval_bot_games / this is +// the games each env plays; scripted bots keep their kNN across episodes, so +// one game per env measures only cold bots. +#define SELFPLAY_LADDER_ENVS 8192 // One historical opponent ↔ policies[policy_idx] (env tag == policy_idx). typedef struct { @@ -2898,7 +2903,11 @@ static PuffeRL* eval_make(Ini* ini, TrainContext* ctx, int mode, int render) { int match = mode == EVAL_MATCH; long eval_agents = puf_ini_get(ini, "base", "eval_agents"); if (render) { - puf_ini_put(ini, "vec.total_agents", "1"); + // One env on screen, whatever its agent count. env_setup allocates whole + // envs, so total_agents must be a multiple of env.num_agents. + char nb[32]; + snprintf(nb, sizeof(nb), "%d", (int)puf_ini_get(ini, "env", "num_agents")); + puf_ini_put(ini, "vec.total_agents", nb); puf_ini_put(ini, "vec.num_buffers", "1"); puf_ini_put(ini, "vec.num_threads", "1"); puf_ini_put(ini, "train.verb_eps", "1"); @@ -3260,9 +3269,11 @@ TrainResult run_train(Ini* ini, TrainContext* ctx) { snprintf(ek, sizeof(ek), "env.%s", over->key); puf_ini_put(ini, ek, over->str); } - // One finished 1v1 per eval env; ignore swept train total_agents. + // Fixed parallelism; ignore swept train total_agents. Each env plays + // bot_games / SELFPLAY_LADDER_ENVS games, so bots face a warmed-up kNN + // rather than being re-measured cold once per env. char nbuf[32]; - snprintf(nbuf, sizeof(nbuf), "%ld", bot_games); + snprintf(nbuf, sizeof(nbuf), "%d", SELFPLAY_LADDER_ENVS); puf_ini_put(ini, "vec.total_agents", nbuf); double ladder[SELFPLAY_MAX_LADDER]; int rungs = puf_ini_get_list(ini, "selfplay", "eval_bots", ladder, From 8426a17c536781f97a14009464054daac7f38588 Mon Sep 17 00:00:00 2001 From: Spencer Cheng Date: Fri, 4 Sep 2026 15:43:30 +0000 Subject: [PATCH 16/19] new best against adaptive opponents --- config/robocode.ini | 115 ++++++++++++++++++++++---------------------- 1 file changed, 58 insertions(+), 57 deletions(-) diff --git a/config/robocode.ini b/config/robocode.ini index 933cb63203..e61f1d949f 100644 --- a/config/robocode.ini +++ b/config/robocode.ini @@ -1,43 +1,48 @@ [base] env_name = robocode checkpoint_interval = 100 + [vec] -total_agents = 16384 +total_agents = 8192 num_buffers = 4 num_threads = 4 num_policies = 2 hist_policy_hidden_size = 512 -hist_policy_num_layers = 6 -hist_policy_percent = 0.00999999978 +hist_policy_num_layers = 7 +hist_policy_percent = 0.0645349994 [selfplay] enabled = 1 max_size = 100 seed = 42 -opp_timeout_steps = 124200912 +opp_timeout_steps = 10000000 eval_pool_size = 8 eval_games = 0 -eval_bot_games = 8192 +# 8192 ladder envs x 10 games each. Scripted bots keep their kNN across +# episodes, so one game per env measures only cold bots. +eval_bot_games = 81920 # wave_surfer, hawk_on_fire, raiko, drussgt (BOT_* in bots.h) eval_bots = 3,4,5,6 # Ladder rungs run without domain randomization or curriculum noise. +# Keys are bare [env] names; the ladder adds the "env." prefix itself. + [bot_eval] -env.dr = 0 -env.bot_cl_noise = 0 -env.hist_cl_noise = 0 +dr = 0 +bot_cl_noise = 0 +hist_cl_noise = 0 [env] -dr = 0 +dr = 0.699881017 num_agents = 2 num_bots = 0 width = 800 height = 600 reward_damage = 0.00266758003 reward_spot = 0 -reward_melee_damage_inflicted = 0 -reward_damage_taken = 0 -reward_range_damage_inflicted = 0.00260018697 +reward_melee_damage_inflicted = 0.0030519499 +reward_damage_taken = -0.00483758003 +reward_range_damage_inflicted = 0.0116466004 bot_policy = 6 max_ticks = 3000 bot_cl_decay = 0.0126646999 @@ -47,44 +52,66 @@ hist_cl_noise = 0 [policy] hidden_size = 512 -num_layers = 6.00442648 +num_layers = 7.04325008 [train] gpus = 1 -total_timesteps = 2.11788314e+09 -learning_rate = 0.00357848359 +total_timesteps = 2999979980 +learning_rate = 0.00123165001 anneal_lr = 1 min_lr_ratio = 0 -gamma = 0.997707605 -gae_lambda = 0.868802786 -replay_ratio = 1.78362608 -clip_coef = 0.100000001 -vf_coef = 2.01139474 -vf_clip_coef = 1.35169744 -max_grad_norm = 1.5 -ent_coef = 2.53209255e-05 +gamma = 0.998830974 +gae_lambda = 0.853752017 +replay_ratio = 1.92679 +clip_coef = 0.200000003 +vf_coef = 1.23714006 +vf_clip_coef = 0.221594006 +max_grad_norm = 0.878167987 +ent_coef = 9.99999975e-06 anneal_ent_coef = 0 min_ent_coef_ratio = 0.100000001 -momentum = 0.853156328 +momentum = 0.918410003 minibatch_size = 16384 -horizon = 32 +horizon = 128 vtrace = 0 vtrace_rho_clip = 1 vtrace_c_clip = 1 verb_eps = 0 verb_eps_anneal_start = 0.400000006 verb_eps_anneal_end = 1 + +[sweep] +gpus = 8 + [sweep.train.total_timesteps] distribution = log_normal min = 2e8 max = 3e9 mean = 5e8 +scale = time + +[sweep.policy.hidden_size] +distribution = uniform_pow2 +min = 32 +max = 1024 +scale = auto + +[sweep.policy.num_layers] +distribution = uniform +min = 1 +max = 8 +scale = auto + +[sweep.vec.total_agents] +distribution = uniform_pow2 +min = 256 +max = 16384 scale = auto [sweep.vec.hist_policy_percent] distribution = uniform min = 0.01 -max = 1.0 +max = 1 mean = 0.25 scale = auto @@ -95,35 +122,23 @@ max = 1e9 mean = 1e8 scale = auto -[sweep.policy.hidden_size] -distribution = uniform_pow2 -min = 32 -max = 512 -scale = auto - -[sweep.policy.num_layers] -distribution = uniform -min = 1 -max = 8 -scale = auto - [sweep.env.dr] distribution = uniform -min = 0.0 -max = 0.6 +min = 0 +max = 0.8 mean = 0.3 scale = auto [sweep.env.reward_melee_damage_inflicted] distribution = uniform -min = 0.0 +min = 0 max = 0.02 mean = 0.005 scale = auto [sweep.env.reward_range_damage_inflicted] distribution = uniform -min = 0.0 +min = 0 max = 0.02 mean = 0.005 scale = auto @@ -131,20 +146,6 @@ scale = auto [sweep.env.reward_damage_taken] distribution = uniform min = -0.02 -max = 0.0 +max = 0 mean = -0.005 scale = auto - -#[sweep.env.bot_cl_noise] -#distribution = uniform -#max = 1.0 -#min = 0.5 -#mean = 0.8 -#scale = auto - -#[sweep.env.bot_cl_decay] -#distribution = uniform -#max = 0.25 -#min = 0.01 -#mean = 0.05 -#scale = auto From 88ab972c670955bfef85f2ee98bbbe20cb8c8fd6 Mon Sep 17 00:00:00 2001 From: Spencer Cheng Date: Sun, 6 Sep 2026 22:37:22 +0000 Subject: [PATCH 17/19] slimeconfig --- config/slimevolley.ini | 71 ++++++++++++++++++++++++------------------ 1 file changed, 40 insertions(+), 31 deletions(-) diff --git a/config/slimevolley.ini b/config/slimevolley.ini index 54fd7e4f18..499917f13d 100644 --- a/config/slimevolley.ini +++ b/config/slimevolley.ini @@ -1,67 +1,62 @@ [base] env_name = slimevolley # Same class of 5.0 trainer change that blocked drone: stale actor + RNN carry. -async = 1 -reset_every_horizon = 1 -checkpoint_interval = 100 [vec] -total_agents = 16384 +total_agents = 2048 num_buffers = 4 num_threads = 2 -num_policies = 1 -hist_policy_percent = 0.15 -hist_policy_hidden_size = 128 -hist_policy_num_layers = 3 +num_policies = 2 +hist_policy_percent = 0.171324745 +hist_policy_hidden_size = 512 +hist_policy_num_layers = 4 # Selfplay: slot 0 is the primary policy, slot 1 is a frozen checkpoint on -# hist_policy_percent of the envs. Final score is the primary's mean win rate -# over up to eval_pool_size pool opponents. +# hist_policy_percent of the envs. Final score is mean env/perf vs eval_bots. [selfplay] -enabled = 0 +enabled = 1 max_size = 100 seed = 42 -opp_timeout_steps = 100_000_000 +opp_timeout_steps = 165567856 eval_pool_size = 8 eval_games = 4096 # Set > 0 to score off the bot ladder instead of the pool eval. -eval_bot_games = 0 +eval_bot_games = 8192 eval_bots = 0 # 1v1: num_agents + num_bots must be 2. Selfplay instead of the bot with # ./puffer train --env.num_agents=2 --env.num_bots=0 --selfplay.enabled=1 # --vec.num_policies=2 [env] -num_agents = 1 -num_bots = 1 +num_agents = 2 +num_bots = 0 bot_policy = 0 max_ticks = 3000 [policy] -hidden_size = 128 -# Constellation #206 was 3.297; 5.0 truncates to int. -num_layers = 3 +hidden_size = 512 +num_layers = 4.63476706 [train] gpus = 1 -# 4.0 #206 solved at 115M; 5.0 needs ~250M without prio replay. -total_timesteps = 280000000 -learning_rate = 0.00207143 +total_timesteps = 151858608 +learning_rate = 0.00140897371 anneal_lr = 1 min_lr_ratio = 0 -gamma = 0.993389 -gae_lambda = 0.984654 -replay_ratio = 2.85524 -clip_coef = 0.142887 +gamma = 0.986717224 +gae_lambda = 0.845131516 +replay_ratio = 3.59742641 +clip_coef = 0.116425134 vf_coef = 5 -vf_clip_coef = 0.0465092 -max_grad_norm = 0.1 -ent_coef = 0.00113432 -momentum = 0.981078 +vf_clip_coef = 2.56304932 +max_grad_norm = 0.100000001 +ent_coef = 9.99999975e-06 +anneal_ent_coef = 0 +min_ent_coef_ratio = 0.1 +momentum = 0.932234406 minibatch_size = 4096 horizon = 32 -# 4.0 always applied rho/c clips. vtrace=0 made those keys no-ops. -vtrace = 1 +vtrace = 0 vtrace_rho_clip = 1.3635 vtrace_c_clip = 2.29725 @@ -78,3 +73,17 @@ min = 1e8 max = 2e9 mean = 3e8 scale = time + +[sweep.vec.hist_policy_percent] +distribution = uniform +min = 0.01 +max = 0.5 +mean = 0.15 +scale = auto + +[sweep.selfplay.opp_timeout_steps] +distribution = log_normal +min = 1e7 +max = 1e9 +mean = 1e8 +scale = auto From 1c3bae5bbbf31d0cf6fc82e4df98b1827decaf31 Mon Sep 17 00:00:00 2001 From: Spencer Cheng Date: Sun, 6 Sep 2026 22:39:03 +0000 Subject: [PATCH 18/19] deletd jar --- .../third_party/jk.mega.DrussGT_3.1.4159.jar | Bin 159289 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 ocean/robocode/third_party/jk.mega.DrussGT_3.1.4159.jar diff --git a/ocean/robocode/third_party/jk.mega.DrussGT_3.1.4159.jar b/ocean/robocode/third_party/jk.mega.DrussGT_3.1.4159.jar deleted file mode 100644 index fe094fdadcac4b441fda06f2a8a8aa6580748781..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 159289 zcmagFbChLWl0KZ3s)uU-Tls*`JJ`)x%aO7$2k%4 z?AQ_UM94`30V4r`fq?-CMN&ut{M&^D01O~4ti(?(E+axK%`YP^BCM!HBQ5eZ0RZqI zJvAvMNlh~kElEu=Gd0_&K)1xWcSJEEJ3&j{qA)hGGAS)ByW~htK~3WVyMJ_W1PCA} z`4fy3m%fwf&odbQEV=)FGVtG?jQ;0e3rkvSV^e)vBT;7?T5%gAb37k^WI3Pm2SgCT zG*eyrF2~)i@1GA};Co0vIUs_j&jPO`W!DZXnd;vA)!G$8Ma-mz3+qe?ZZ9|Il{&&> z81kDhp9Oqr2O{(5 zmGEp8e2EJ8aTS-R&5!7anm7ZM5lvNkAzZ8lM2Gn>H#u6snvb@c#Yjk8>L$q6v?w9g^hszV$tfN;3>s^as5x9h}F+qKdBp zFKD&sFi#v-mQb=V&Awta=I)P7UXU?Ib@4!NpsPzylAB>?Jlhw(X#Y|>C4P|@-46hO zf4C6Kfz||MNMo^0&j-c?pS1mG)`MfAv`46Aa9QrN68CA_dfs^{~E;9 z^hYkf|B(FefW!K`oVDDf#2_CMH>-D1^t_Vhh2y?LCtZM~a9qlY zupAvhSfx2bQu&$CLeck;00e}OpKm@c!A=kXnD&R4tv9mXW_^j2H%|wxqzu$D-o=BI2Ne@hq$mf`g#?^#&-pfHn4Jrl#%2r?%K& z@vMuefq$>p zEca!3&-i3D-tc((y6(2h_I_aaS>ADyS^*leI;oI0rDI~I%W*s=tyl;xMcEL6P-sXaJ1drOl%R*73y0)PO+iURps(9$ zRidI1Kc$|7OY=>k-i9>ZwWX-n3`d9MoRKgR?S(6lCYVc&94KL8FE64qqtB<5oQi5i zLbN$R9ETSKXI9*~d5TOIfq1e1Y(VGM*-n!v->z;tZr_P%%NREkr#2>!vB+AqksgJb zOgWF2iB#vBvSK!%cdt+ruB=O$nVL^js;jm^u?u}NQq)pZROruE;beLUCx0Fj<}joI z0jxe5ahBJLPSek`l;K8SX0dD{SL^N&zBV5*%8CEA*!dWQv6yHPQE%^R#JHYBQY+Y3 zFTQAa(cYYg`RpWQOf@mXS)8qfvvuj2fzkwt#EdSEemLd8oU;s( z2J^FQZ3O|Mc}80jd0c&j&~_=&!vy8Cs!BuVkc6WAiP~YJAl%TIB=_iv>9YwC@o)g@V-Uco^Yi{CmJIYxTXv$`-RVOYK#t^ zAX}rN$08ZBasE^&u&*tWj3O+$`h6LqC#06qxkEvu1_qOYR>z&|_W{I0bu$FSejH6D z#6TF`?!z#t-ET0`CDq`f>XJT?)~sP9Hu?#0ZdXceDrN5KBMAq28+^sJ=%=*(gE|!$ za1e+s8??6Ra2j_))E2D~cMX0BDdXT1%W@|i@Qz+0U|kaI_2oC(@a(RHs(@&{1rK-S zX$vC5A`K(;NvfWuf=fNxmT#Zmh$u`h@RlhbTx2pb7R@D`Mm1Dk3`d*{5=_~ zLb4iCCldca3WbwX(>kY)dcpqfcIl;QCL1&qFWG*XM>=W33>?yOs3Wd++5XQ2-8FdD zsHCd8pU58oh3Ge85o`Iv#$stXyhDRBmk4Ct00$In(W3WrEp>ryR>J#LsiNM>kz2p$ zL3jsnILbr{2~VpN%%9ozy9Up7nkM%^;{#mvD435shQ ziq9i6CtkS=^>}lPwJZ0V;Ac&m*tf!w$?T@Z#(4~&$3Als+2;teKf?iIrA`9f=EG5c zWhUMZVOHCyECvy0Gv6zs|5_-Dmngd<#?WPX6Pflp8qa=1h8i1qxnDU(*y?m3Xn)EJ zAaKKO{Qiph@LZj*qjD{c2?_tL$s4wc+@-Hmld+O$^C1PeHj5qs=|OvBy>Q+ZpgX2T zuB86Js6FK0iu?g#V{l?Z?yK5gdsG9mr6jSddh1Vqm9l^c!NX7tFW6(c5p6|Lz3Tl{gVB0XJ05K%pQ~oEt@%YCrjdV=ZK`b?vYf@sX+Mm0mGScn$bcf_4{~9H?HDo zEFbX+i;_JymnApyJ?QU-Uu@Y~Aiu!fRc`4j0zp38L||4Y_C46Q;2s|fpFu3ZmNI$R z*=78*WseTrbv!gBd_Nx>vb_8;?Gf0B!(CsCyNFLP* zIB@)|ub6SBS^d=xL}Sxn0&ro${lnEqV@TWyA~eR+;A=q4)cUSH>OjrZI=pvG_x{$< zZo^Zbc5i^OYpnwlX1DC*1IPDn9fG*?SuK(p2^l)FWIm!F{awzAUg zzFT-byNZhOy{Qhf2UkY}s@IiktdFp|zj3tE4L1vSK8!+YKWbvKzxaYkcUsp}q@M`eH6)9Vh$WMMEK`R@VXRHW}^>Um;CH2XM#EWhAzQeQF`ddPlmP8p>~ z;~sFtEUJ|*rduvg4WmyDTB?CFws)YcD*7OvO}F`{>qL^B*QKL(L~r5rs6H3`pe=yE zY2@YPXG0$V+#eFyH*RD?ksK0giX>N~FfnK^8-$n-(iEmtiEybxu&mQ4v+`%ELI$rw zR4+T=1dG%Tix`|6npC6RF@e0NVF`;B=jAVbB|K;WB(lOGvgUVMuNky%;V80_9$Pym zw6qk2&e1EE9(cv)m_-r!zi9Vx*P?a^LWpRhs|*nb z_S>1dS0v}qAJ}US9Ntdi2Joi@&cfbKJTf*v6Pk)=OX)77c69g?j+NKjs&h5)4Y?mb&Q#I9djP~g78aPougCp7V26rOy-i??NFBCcfVC6K8lpVNbyLn7 zuxzS5W}Hq1V{~64BUQUa9JlZ;X_!xZ zp-MEKUgCdj0jB(EmuK6yYR?GL=d&36A~lFJX$PIi@4~-mjL(aksmmP3Q?i5~I6274 zVF}r7>=xc87eaWCI=;-e>(0FtiX~f@`Vr=R2<~EsTi?mq&vQ=HyymWHDqRrSz^gcM zTQLM<2q!vw`HRlDx3u&lqK>L0k@B<0>KtIFNYi$N%{?-)RSkG_ru8$Z{LqKp816>NS%l3yb`h4HI1UGEXVCI_BKIErtMB?rQ6xe)a7AbOQR{iuIN67D ze|W$3MOlVK1zG00@)DD#c5>?BYe?-Q-Sj)y{+06mxHtXGJaqc1XlJzKS^NXEJ$44J z7sUs1)%PC(|KJv}C>aC*02|W3r#dus++u&C%>TarBjEpA$oW^gbESS|v&n+=nGNXq z^H~;uxW%d+q-A;9&&0eH@C=1%T~rQZ!RxdeUuxyXQDs=j;B{HwcMd|=u1 z8e@0jP6K?AdF)5Ol8Dt5RHT{&Mk17Gb?35@BpVf6J7yRNd`ZzI%eu}B(aDJK-Q!J! zKJkfY5FGmPRYXjRiH9ndEWT&iM^#JnqU}<$C8>ftd1mX9itxG=-#%WwdY3_@Q&L8f z>ZA4w;&U6Ah#8%Nj@b~EgCC;we_ta=hsTXJ!Oc)m`vBu^DJ=sdyU8#WBoC{HAVO!Q zfR!5;kL}%EBXBJki15Jai%Vq?kMY(AG%+$cWE>`;r0F_Go>;aY3*ER%`ph8(wFH$w zg5Sp@e{=n?{Gq$D(Qns=0dXI z!Ds>F2?G@@jF$v>hConxR0(3E%@n5CXJASdJ85uM zj=utbOAK4uz*L+ss6OslWh+10N{&>|I3Q|yV{Jw0G5=!TDcF`^hV;UOKk-WcpZH-bOL*t zd7VmDcj#~UC4gsU0bWF|KpZci-8MLYEFI=Saxhq+^+;+s?;ARtquvNS%o~-Y3Usmj zj$c#^j`Ve;)|Ax~c#9~;3b}gA=t!jZK^2@ocFInx-J$);8rjNBInVLe)4_`Ly2`}A z%yU5PCsCP-YfjT|t__L(XiLl4{P&IDK8_8NZLj)iUgDqM0&%b9%PWhjd8l{?_fztM zF)ZdVgCg%`p6Uc)x%t6Sgt)HahGq9{CV`_M$K_-=m_}MaQx}3R2#Md6>;Cn=j!2SH`J`oU&v=q?l1e+fWOH?`4Ro@ zg!Q~!eGhs80$0=W8?WZ_?&qe@9`OaMZ1%YPcm&VJbu3)lt)5b20E(q+Ny|28JOxf3 z7=M|fG}!d{DWB4P3KAJeT_^`)E0i!bQz4sxJ8CW;PcfQw*G8(HmB>5w&-w;vra^Ga zFi~$+Q-JZub8F|tU^Vw)pN`w6tfOvUm@;S36_zKtotRTY*-Dom1?hHsvqmK`ogAih zUl&|{@w6NbCGQ)3Pr;^)yRjz=T!{Ih$jy(NlW>Z{&sMrm>b0~}H~V#mCcPI1XW@W% zjBan->b=nFy`)z!MV~oMoEW;fO@-fCrM@t{y@HnyHMjSiz~ib!zh1aLShzmEC58^e zRX?u6*e>NS;qP#W7+(d1wxG+LJyuwtwFq<=nA9D$eF3&ovIrw{d6%~L-$i&tPl!S{ zCCyP~V7L;ucLqO<$3JioY#H4h-?A95w@!(U^W+vulnM>a7L-m^r7aL-Kqglbum)=Y z*Ddd=doIdo@+X$Z2il-HarkY-y2Qt324>TyPXfdeo%T)zZ`5h$GMFe2+hM?5j+b?m z=yDD(p~v%TpyyTmkq36h@dMnS1&G{~&w@|qykSrJ3`)%DB6@hM0&olR+!Fz1M)ko; zN3|_sr!rf2CC@g*^J|bG+1hr63-vPx-ry(bvTW*zj+5nHuG4G;1FGEtWn+(T8Z@7Y zfnN6Q#6@Z?Sveh9UcGrCaOfFWNvLNXlre!@1Xyu>h;fpm$QPTq^3OF7YX|~Gd+p9g%^vm zrGTMfcVs|jM5dTzS<4*o3n}YQ&qME^cd$0Z=9XT;jwuniAey1(Z}GD&JhWt*87`jV z_mFgUR#)Fz053ja!6><_>x-6+L=V%^D@yN4NN?T&U-;hG5k;gP+I!& zdv15V_69*RuGIy);nzcJCg`&wxgjag#x%mH7p+Bb44Ec$KxQz+X+Dg1&IVUr{*JSd zoP3^i`2^hcV~wS_ICHj``}34X?;}e!qN%SJfS}7oL@LH-H??j72&8H#yz=m+W#PJRv_6J8mLqVT!ogv^_&U((#K%8C zV!$BP4kEC2@}ib_|AIzvo~&K(pSoKU;Qs{;f`5aCfU}jAv6GywtFeQegYln=`+vhB zSxM3sQyJ;YX5@M8F#L+m#jw;olZAE@n*N$_*xqbm$eG?5XDwM00|$E((G+16=Fr}} zGiC^I9s~g}B1lhgh(dtE91tuR1hXZKSn~@A5@RMijYv8Uj&S{Ciu=UtZHYXow25rr~1O_Mz@El9}1eislF54y@)*-n&-aw#Sy z2!$%SQW;)lKBY!7KNNA|xDuN!=Bge~%N?w%l<)v~7QB5%LF^JmA*Lz$V~&D(86#v8 zNfHFErI-Nho6sXeTTZRI2rnqwr9?TC=3)iYOw61YgQL?#xLrnnXGd#<;AB4iUB;kz z&R$m(e-|J2YIA4>duvk=nE`>$FZUPxQY1t95fH6kH8-cAx$)re!^Y@?$L{jW6d!xU z==M=?YY@0`%t) zEL~7gPu2U{k2$q@W))`v9+^BAP6{dzRfD*wiMggRv!4-}^Z;4Mm&Ot94l?B zeUCsrFZNCXHzX87<0LdGIx!740-KSdhja0FUj4L}LA%A5o19S}@La&Cdz(|AbP3Zu z-56@${Mkkd25G_%(-DF2CI*X0AsAK^z6;pUtk^f?yYKi;LU3cPZw8r)TcAj4FI zHDNk_IH9P>G&ufTaV_@{7=At9ewsQT*Y8|3JiuGeMI%kr<*9ZvbTqY{wUhX1BD<&# zO(xH!I-v#0j7SPi(B2d7vc5akzg%0Kr}TX!FaQA4&wqDqgth;fgt z^Wr`F_<*~t5s(bOD#+h)fonLSLYff`U3EiU2~@FqVl2=VlKqNE_S&})YFM<8Ig%ED zOBQ1kYs#-Ck+CI*cXKEv>!owdf89}<|@2WeWD`jE>gMU<>Q{klo`$Gp?677%x{6%oarF|^8VdqicwP_ zB^ZqI>w3n^I}s0U=R9-b4irhh4W`7DV-0Hm6kBsrf0Qv#3zSoZd!TX%We4m2yGBrA zsK2XA+5vMVke5l&qD)Gp2`Xx1i1bizA)HmAYGgkmG%b%|7drhkj)80)-hIdh>BZZV z%bA(f^Z5-48F1rxytxsZh@%umKX8KCgP4LC-*LeH;WLI0BfnuSW)`mq0$(@?m{sUh z2R8X~*ELCO5PmpPWP2qs&g;}HK4gb8pu-u_w}9f|TV8!1y2DNUG^FieLoT_l?(obk zauQt=lcUoiv)_5W!~U5f%gOnj6FjbYjCx|KD_}+|_sSAAxBaZk4Q_UW_2Ka!oS08_ z3B1jpGkNS!*!C|j_U|Fve}UJ|!PwB;(U{iR$=r(e&!PO+kALxE-f`0sK=eq#vsX>n zoGO~W6#=|>ZE~ofPUUUp@IeJ2lG>&vs|gt-42k8hYBj*9JbtjmC5ostL(|;sq@?4b zJiR--09pE!Lg97XK1j0Uq!fnnoW;VnHrGc3fobcS0QJhy;PF6UUJfupr zN%GeTa9B9dU`H+34nY8u&O&NLOdS)q(mdhpSCYO#aNFx#(ytQJQV*za-+}(C5EVYcV7^X2ngz^3FHN^Qw+Dcd4_T?Y zQ8uA@D}~YWf=X5qRO-%|@6Rwa)`YGw|MD3J{-51sf5M^iKkHv=|2qYa_fMbkzpDKo zRQM!4Yyclr$o{tO{Q5qqs*1=@&_YM@WF(00E#xTrFIU<)HndK!!FMErg)r_xx{$Oq zB1bi?CJsNT`Gi3~N>DGi)AbTNs(dXi4P-!tDfEobn-I$0mba_yWaCpJ&Y7W9r7#E8 zPvxtE2_Iu-1mCZ;5u;~C?DOp%;=6S)ZL6JM??8WvWO))E7X0Uh$N#K7UIM z{|Ns7y8SJ{D^`VcQ#?ZVkxeAA=4#Q}SfB`V)<|fQ`+?jZg(6N_ZSCKL0x9E>fhAy; z!RH{MKXV}jhkfoO2$${1vDKv%pX8B#`aJdS(z|=)`&~PW6 z4Uy%&;SpghO$fg_{FDSJJ7Q?G(aqr)vsedX zwui%w!&2|alXM!5>7n3Hi5%T(Ne_`PG=WfXr^ZC%nbOE8>o=>qcl)+cZmmyH<+;~q zggk0UP;Gs%kg}6Q!@XWIj|rjTChEF++UU=BD1Y_R?3uSmNg*S`E-iMRADy3;Gg}XV z+-?{COL@PAs5gS^SEN$$fT8%J5*Cnhk)kqIB;Y)&;ILGdh-6cZ62Xe)sj0CS*C$yD z)^JdJkDnQjpm4tPMmog^-fkd!+6ibOt3A`CvKO+GqYgy| zq{ztG0R?3KwqHGRuE(HbLYWbc@v~Jo=h4GXgpSBs&7=b#4|zb8TY5goP}uWT=#|P@ zv9ZkB)Gx`c}91jB&p~FqE{yY}4AoZtBMDp&QdvN24RhjSD#k0wwL+ zF;l~dwZ_7fRxQa3snMg$UQ2>Zytv{o=M5k)CmZl^!sFp+21xLOD3P=7iC1$`x$vYM zs9>R-SuHKCH`3Ceap;2!$i3a5h>YJ|EzDmr7nUMHg6KNBGt9SM`cl z?dI!E`08`NG@UrkPCI}rv)ahVH4@<2^^_j4w6hp85Y46h!l&oH?7wOojK&2E^`g&k zBrjFk3dg-?k1*j%RG|BoJaa>O7;4+JPmRFcA2kXJvw@0@xGKo_z6e780SkVJgZv`l zf_xk1A-!`P;- zE3kMj6PgTw5X!hOAJ0hx#^YU5% z*?V)uZWy?MbL38H{;mbo8}ILEQz$nYIuvQ5?0-e zZmQGrjE?cw_)sUsSDL*|V~c)RbiBSHh_A|>f7N&)E0Bj+Y`7$^(w%BzO!<7Ae{cCK zns4cocnYk3WFDqAv#sf)SAcK3eH`#(FnIofqSuIYkbRDL){k|2wc+?FyPuyWWEBa7 zI^)Y`TTmJ68K=@Ak8fpjLv8RNTTJYsH?o3UHKeE`O-d4`6P;BYg02qpK8Y^&NI zeqDY6F)2OkUe!t+BKay~D1P)Xd3`NxF;RRHUo(}wP2Mk-mE7}7$sRhT=ML`xn3T#N zrXD^U`1cS;dpNEV_#OdZ;ErZ7X?(bUb(_V5NVaKhtPnJbA_TJ8YLb?o51MQ3(TWu+ z@@V^rV(jDZJq1B3F|a5DvnT6hi1?~3ekhvvNxj-*c$OYYW%Xm2pv?4JH8FnE4r%Gs zx~~l-m{T4rZc+$Y1-jBF9Ee!6ZhifzIeZdKR$Rv6vveWEurzHof5ecV!MEVwRtv&|| zU?6?1!Lc2_*zKt0wb}DabEnK}D*w%WwxGrBwWAT1S<|$G5#iCv=_5%S(*eycId`kt zswRENndxowEea83n1lBR(sr9d%Br1fcA3SehPJ7*G#z^b(zT(w)eq_j zsDt_u0u2PBQ^5+CyeuGI*l`AV`bt@_;5L+TGH@e_+*pcS3#L&ohJ#jwCw6=Y zNiTmV`5@ijr{|aGw8or5nJ2CZQXeiUt563=P2|mTXOvdKJ|@nJzbT*hF048k0&7j5 z;azgXB~v;jg!H4O7ABZ}+p?Ck9)d=~576iClMNSvi5!zL6Y1CQmI-f7tXl zw?VMR=U?mL>;~HE`w{OTVtM1N?#s5};2wxznH;g>Y$DTME6Et%v0!#4Yit!aHSC=a zY@7U2HSn^pUMRwXKXzg~V23!WA2jmZ$|sw^pK@fgNOqi(|0#+MqpryFz&i>BNT2# zGs%m4O^ClGnQ=o3vSpc}GXq$uqRu|>xEGegWutzZy0&*A3Zfgd8~Q30EP_T)A#@SG z9eCyzN7OqS#DX)UXqjA0*zZ=9*Vu1`|0!lKcSx;wP=V~d!((Eu+v^JFyLb01Y<(so z;EL7IN*I18GKqr{0{pD}D?%WivhCHoF;{q>HTRyM!aL0B7HoGscaA?cKVVC3yd`6u z8Ho4j;x#CIE;?&qmTtYD$@tT>(4s~D_tfGSLs)DJ3zA!RF#L$qtd;2x;)1gpGG~!4 z@S3&7T<_Y^^qXbItuG?o^%Jx<)NwsrBW2lrsTewCeCRh(SN!ac9P7SYh!f(BevFMB zCE4PD(lJeb+9Q=mPs!}4h{~n)8*GN{iFnoad*%b*?Bia3Hrosnj`+k>*=$C28a0m6 zbv}vLs?WsPZC*ko7W}~cF8@JECl-SIN4quNpD6x6i}e2)r~j3DEURzZZnD7n+W3FL zO5p;I#~X86`UBbk7Bxqrn>9|&Y*-89phdQOCY*%f&C<}LtvU* zIC^)AK$lMRK?IW2b|6YI7eF7r6GbRhoUj3EzGdu(mp%?)l}TjJKv5S#a1l=xs)9jm z==uy=1-8D`s97(l1)t#)s#9qo%wWut8c(C5#{wd1f*ZxF#{?iOIij>j78XNDrt}s+ z&MYyHr%PbZIAZ!8W{3npA4(hGl3haI4{jAMC{h+f~#2O5~o07dZMgnh@|Y zj}#+pfigkGIa15z^I#X9cpr%0jWas@WUmQNSzZaIMV7J{64AyoM5~lZAv8R3{(C{k zivM8_G+YM5L7E<;s!wH_ZCL3COjdHTh)a3Iz6*mAz2?RbQ)**mOjV@Q zx+msZboU}vmk}7clDapl6)GSUDA34(rnq{ykjq?Q@Vkx6)~V+~j2ZA>R&>N20I z$-$AXfpe|^GWc;}Coj`7>b`o1l1@Z*-h0g65@wg=e_SZE(#0yg<*G0iVu{p>&(V8c ziXyzRGAI9b4?9;aP5Au?bmU>ylEadWlKKq5P>{aLFEe5knnie3a#G^yM00(0%f>u8 z(S#&(9t3E6lwBBGvInn5|6F1tj}dZBrDRdl92UaU1IZnQUUmx>_h5-o3pG?4|NvPi_xz0&E1P}ERRm?T&=t>l7fXe7YVfB+N z=FC;++5;C=OS>=i+rd&b;WYU2J~UFtgK8H3ztw6Z)xoO*%$+fYzAQ#Od-ae5N%lTa-qL>4mjDS@(3Pw=BxZj!miAomuAQ<@&p zwtsq9{4GZk_0Ld9*_%<)LOsjPpQhOLU51fX%($@GnP~}F3uclx0+L+QbTLJ;_RG8A~?<}97jP@PXmDzZZHbySZ4ieBGnGV#^4y0x{qXNHA09;>5k zaS#NY*paEt511W+QwTn}?>$6tdd!nn8Sgz*p`DdTe!!+3!K(*5^dtTv4l$B?_{N2&DWQgeRk&0Ei^lY$n)*VnU$Bor{+H&q- zeQ}j@;*7*PeGkgdk$DspJDjXSPeOmGKBmtW#f2go~i7hsxA7CZ}Dtyz+5`7_4+L9(SFDs@A>BDqxO-QM@)7%Yi4`m08$ zXGrazMy6BFu6Rz%wl^xhCPB}J(RJ3&R`@F83$HSmUPnv2Z{7&wEJNfhwu_%StEC+E z(dW#OefXY4E25MSg)S?kCg3tH()nOc}iIJ~5Cn7OU)lP7^2T$3MS+tW|y%h#zf;3$M^ zL>ne=Y)O&BvrG#ovpI}lyr_Wk+sv`({4tdPkr}J8qKLUL1KuL@6I~jcC$&6yL|E$H zj?RnIix(^Rj#9o7v&YIS*cksVN(u)QYuer&o|&U18inT^ty1I1pKY>A9~6W8#5ofY zHwFPfO6SQhe*D@V4CH4tobh&7QZEPgSJo`g=t=us9~m$JT$dFx_TTD{TBW-R3+E)rNbPDKDw&` zk@O&)&V1e}ra`gpDOe7Q_4ua3K)@OE8TXI?)$L|+$9`dO#HN&PoWTecmhYE6%Z~m6 zNXSGOn*E00BVCbuDy-L#w2robN~d!hFSae8LA`k#{^o5vJ8V|!Ew;mMW+_JJy#o{q zs1|U(3$&os561lFJ=!>NqmJb9>n})mGb={6YBt%9bM-P*#nKj)rj&l@0x{wze<{Ue z4LGQy#%J`DFLVI*ykDm??A=I&kAmiNW%8JBDkWwr_#wwq5l6Nw^jot`rSJLk^K8Aa zk-T&f_iFef5TaOyDoZhRFPe%g+rI^oeiN>J(Bq@h^R9FkI+|^lyaohsoH8f3&x=w) zaMMEqO4`cS2~k@H(@RVtY9ZFjFpH|eyASC20-{mDEEXz|LMmcAzoa$ zM!VN`8-e>QE-L^%A^j_a)F8f2x%pGMh6nn;p!7cnY2>W*4UPY5@c1Wkyydkm5&8ej zG3i<^Fk3HeY|vU(XDFQp@Tho+gEtj5&+WY%G5%?MaK;>bn7k*lb zI;1MF>0Hgv9BH3Ukb9A$S^C(V{^U~M!yT@d=}=5A;dr`LtGnyfad#64{Wg;Ooe?Pd zsBv6XFkt&+2l>0KP<{{a1MoM}2!gv6gkfZ-bOBtYr>^}8BkG67h=zUIsPWdf;1yl7 zkkyrU|HK0>+(0KK*Xye}O||gGpn!Si3?FI$_T>Tj`9E_6ih{j@ls^V`|Br5szta={ zvu*WX2L3BQ(3b0$8Ki^aRxJP4lW78D2)~HAkI<$lSL=T#bQ)l0uE)`@<4`^>()Lq?Ow+p#8aB%PoA=AbH8i__ zZ4zk@AFj7QSyaM*P&|LG`IKfE;J`s?-{?Xw>L%|)-uuSKyuOK6v0!;P^>5j)eGwJTX zecXWSLa*?MLY!)AVTaLIJEO~sSBI#1;qX(d$&hZ>Dgwp=j*x`l4dgOQh+|3yW9l{`Vf6`#6|?>VLtm+{$5O&KcXg8J6m&U3 zkJ@_!^)V-zP_7PHur^{>NC)|6#DdgZ_U^ z1ONX9`wQ{XGW;+BbZ}jnuc6#6;0Wx6q=@VpXuNev%_wI0#X^XKyV~^>ju}%kQ!oIJ zWf)7q&WRceX)42~_fHV73@O#}c^X)tWHF{rR*WsS;|Y*JSR9*$qYcF;m!?YCreIV& zda#*P^&|A-2*W?_rCP_gmG+-aezPKdqoMLmCp(=Dl~;*_%-yd})2YH|y5I?A5j9Kk zR%ofA=M0=;&yJybAboEzC7yx&B`!UHXHVH5^g;ZGxPQkd{=eh%AAH?E`?8cA^bIYI z|EoXmFGs%g2d0gkEZa=Zo7Sz$m7jAIF1Q%;q~_#HD*WLZYsCe&iI>)C)(k+2;}X6p zu*G?Mu(zVfwhCTkRG`N@=xirjo-$ur-yhI>$T{w2U{%qxgINmbF+3UI!L}1rgse>r z?4%d@#C3Eji0CE?rTZstQsIbj^?e3L(pCtJZ=>soX|!2QGz@>JUo-!wvg3&x8maML z`{D8%-CR37EXG;zh$gd1#rYHA%)DU0;mpGPg|rR=!F)F%IvmNtp(_)SV#v#B&wRxi z9SaOs!%R~?PMb@b(!Yg?J6!u7XVgiu38h&W%q0kOKBe_cbj^=ofHP)YWk57UFQ-Hi zy8$9kJ=BoZG8iUCAv~C>*U@}neGOh4%us$H!jXnT26RlEKkm{_IU>Kyv?c|fq_wRk10(QZ2bL5*@%cge7e zsa9LeS~tFJ`U@pzk9@=TA4QY|HJtI;Gd)GW&RAn3%!f|4yE=# zfY<;)AafEa2ovh&iIq*=+Sc&26oo(7tv7@Snp1f&F)`KiJpkay(Gt;H?H&)>c0qi= zvvB$qj-5LVBIe@i8#Qn62Cb}dx3E8vf;qw>EX!kG{m4)P%z4@c_PJ#f<^$KbsI!_PtjbUDO4;yIvVrmd-`V0?=Q0Y@a>EMx=7WGOw zn!?7;{KIX2YjNQ66b04IkV=}(%2w}Q#mg2i8^a*eoG0Jk=|pgk-Z$R1QI50RFIj)x ztXv;Ob9p_n07wooS?ch9Ra??n&SQ8R`?Fi`H=I`-^+0Dp69qVC+XmKB{eomop|(;h z{e1|QUfrX|)?Q8oy|s zM;&xjYZ?_S1QUKJtJoPV<(xvJA|lApUYD(B3e{o}7#kIi=w_x44;xi=MVVHskCDUT zZ9`8<6Txa;EZN;@Dx^hDtkBVBsesAS3i8Fm*mBNG-kZ~O40W}jM~?aKZF(3aRkg+@ zdPs__3SPYfM!0~wYVR`g%yZ?ExSZPr(b3OEJAFVYBmh$^*2-6tsUr9=`KfVZrN)?> zs&Y(1B@hh1lm){)?3M6GwN*+CL0}Q9dCv;5eDqp&vs1M_;N-C?V~7gld0@1@ZWp!0 zWbp}=Z1vR%$kUyeQsvA0fMUsmx5^5p0Hbs^l%(-cf)dzy@GCr02QxK>A!7Y917?$& zm&!s2`m!=PTVgFK^CZIuA#*CdcVWPWt{e~XN&(YsFHlgTrlKvEFA|>e+ zj3#le+BJL_YUmk-euxWa5SD@Z)iu?{{E;+w@skP9!>9^XM(NnVQwGl(AR+@~A?HYF z(1liYVEDdz?;HC0{Ytfc!*uca#Sl^qYpIlb!4MoWSyDB**2IOXw3@wd0#EjEyD)DN~+{@05A~iDbwR@de?q{AbWNF8XTzfEec4$h8g-*!XrVB;n+-q z!+C&#{Plv2O>1~g*YU^GwKW&DWxx$S*06&G#5unw|ddIc84SfM=>?FMOzSy1qi*-G{LEg7v;egaC$l9%si ze+&9+?y~@+{(pR(V~`->lCImfZQItg?e1yYwr$(CZQHhOOxwP5&Yr#Z?B3X|h>EDF zf2I5?^L_Kll!=M(Gq3ztbrl)WuAxAKZ&baY+*WqzsZbq~x?SZ~E%a!* zNU&^FcI?>Pu@5=)O=^Y866)1VTNn#zKRTcxx5KnS+E9N&cyZc8T;9G8J!h=6FDWtW z;ICWzy`3ujS5VymP&zhK2trFWHEtT4>sQ;_S^2|(#?;wu8D-za><35jRS2}k z>`djn(3r*>mdH+4G3T#p=l2u^B~Ty6_y7j=8B;4J#fTOyfL^VMHcxs%@TuyP;1D@7Ax&e}oTXmQ64Kdc4Ichc z_Sc8G3S32T%LXmBh5eY){uC2FadeekL!Hlw{W?1s`DHfoNYD}d2DevRH z)lDiED#xOU9EZQM1M@Kr+`SihsWgV_g1$lQrbn2AmvgUnQ*pj(--Z!^w*2Y=!nbRf zVY-*Gil;|g1gaXqM@`c!yEO&<9-vyIzWgBT>!pk{H~Yv3(q+u^rLqeL{L=Iv2Yaj+ z{GBl~R|>TTbH*I}>EBAqe$P&y*I=y-L5|s>V`)Wrc=jPLNkR1;kny`AssMu4s<0kL zLNz&0$V_Ffq?28RQ>UJ3p+>L7ryh_NSIbV;>txZqf-&7cG(s_*`R?@NK)^UvMR=A^?v!QprkNHo21(^CNVR_S++~_j->u0tF*K z6Ef0`ORFETDzBQd9Q%L*v;ou9_I|hwN{I+k{&7zYG?J6Ll)RBiebz~e*|^?ygA%&L zK#Z2Jl~zMVyRjjJ`56MN}WmXGAn%1z6;ir#4)vJ zin>d_e2=DRg^hPio17IOi6-)6qMY%L9Rx`mGXb=D0;Gq*(?9v!*Dh$6r62 z&G|7>h85eUVIQcl<)!=8gDaueydKRGdYHKm4gH>#qU#hDiY^4z%e6-hH@tNp>6%jU z;PTK5x^W{Q-w&&Kh%|A43&6Q>{M>Z ziUh^M0kpq}niV-0ERP7g)cbAEIu!s*RijkCN&;HXDin=$1Lx-?eu}#41Z&op1!U$eI{CL^VNYQ(HErcx5L~)4SJ+$r% zH3=Ks8UN~lq1D3+i6Fw0uR|HFx86YYikd83cI&dc_Ym}Vut>fo;4>Z+GRpVI2Y|vm z*-Df!(ZDf>20vTZ%f9=z`TkQsL&Ktyb2pm!$!VO;N$9>|dYcBDdv!CPX=q<9(toq( z=p+;0;&xGv7bVXwMjG#>^Uy3UF?u>4o;q@dGl(`f>7!=vtTN8P)q|_sce8Ojd<0y^ zpBu0{n7Y=9iCW<4gr19UNjkZ3XDn$H;^ebYzvuKxSZ=Wwh0bAEjyK<~6wA-HDFHgt zrzW}kl*IbA@rM9?^v@3YILJ=itHppmtp@5r0dC{IoJ1<%CjPgApsn8+zG8CZ+6Ni) zh5DG5(b9a}j2vgcLc7+bVF>5ObbLh_-vYKEe&ckzlJ0N9P*Der0NOY)$KSc_nI~`F zCxK3Iu|D~M&YXSp)ZR2Kr$STpV>qE1hYXH5HZjCg@j7wu92+>}Y42(1OlSM$u}V%}WD;3Wi)NwcEY!q2 zz74VcQK(}1_YlgF#0(#s@3Ab7=bQbjdT#)KQhEb~2=puRMvQcXEvNV@9x0}%Q6bZ2 zb)h9=`vnu6MS##Ayd=)sKxi(LInrvCi~^gy1d%}9f>0xZkVPYK3SOzI7>YDq6AKIh zjNHx1tC~Kz_9i-C{JNWfYb5=CFwB}n46isetS&;FAUHYH6Um|o7S!%FbWT~6@AUdPQpF8dhh!nPW)?i&1+~gX6$E2R> zRk6@q2W3~V_{*+s!orj3**f%l#%skHbqc=aQLI+G!L(EnB#?9M z>ydk9&i)GA1Pv>e-2{sZ%_cG;)XZIxWX2)uz^IlmN4?;DcI+wT% zIecHwnQL~R=V5^S!ApNI?l{KB_0N6Gk!Acbhtg68g*(w$H=8|1gvj^N^9s$Qf*1J=)xiwXGd*Z3Xrj zAH5FHeK0`(G~tYXa6L@Kz4dHAf%wcRfp$6UfqM=7^-{{`7hf3r7-|tfmN3FOiU8-ZGu`+%tOLmg3<%aEMP;V7>LJi*=;Dc zC3l$xKsN|V^+M8v>_bjox>I#|WlbEzG?N$#)^`!>DeVR^$5aZ2>hvd?J#=UqEs-9R z+6Lvut!gIjidA(y)T$af$iFpq&?{;2!&!;MSi5HCeS!y=H0=w!p$?kwwnbxA4XM@%b5R2CD}B;(m<)1ap>c=0bsWDqaDi0Ux#cdwC4ug(6kM!eZRwmKr4{W2-11K z2oN8^_buN5Ga#QD!f&snCTbusGym|9dzNv*dClNaNun8w)TZ)6h^7zdn;=TtrF#Yl zEl%M=4(+VxB2l=p)gUh-rP%~vLMls|Pf7Mk;>E~=7S2n6##pTM6Wh@i7o_U{VVu&= z2j@MwD?H-@>ishe0sIiE*ofqEmVP#Gu-e-;njcmsqD}=<66rwL?chs7w z0OY)c<-Z1OZa{w&?(G!&(l2u0)27S=!93)XMvE81bq7I%8aqHW4@Y~z$Ta<{O$H~x zb4bZ9mjeb|7#yeIIbX@C9$eutBzFLf>Cc&wLg+eye`eVHxPkSHH9M-U?1~AF5Ms^> zdq}w<0oh#?oeDq<$)f~^@kEv&Q~Pfm3#dG*mD;r_+)DJc!E(5v8FaE7U=<#@iR2;> zZF8uOvfRAQ4~T`ulfNyeICzz*k%N@Dj^Wrtkt9!@OS4|^qLHai-V!g3Ecw}I#s+^# zbP9JuGPtBx+9F4s_eC~4?hb6SytoI2I_k5&JLWX?o!zYQE}1!C^LYaO(;-lwUB({Q za`%6vTfHnrW4Q;jpY3LMwK!%oC5rpCIQ^SZ)h$ZME0Hfhb+UaB2XbWF4(T?h5hLok&}H!{lMEw4vZYb$Z9)^%1Ht%y(!P~URA z&u7+m7f;5oM=E*OM;8T| z<&vd!hxA8N1=_kC!gl<;!e>IuIUTInY@G~T zO?MY>?_NrlmWP7dBgtn0MZQ8dkJk$DMdJ;ihUY5U^}rP$z^2jo03IL6q{$v?-J#JS zlmc@qwhn{ea^J7PlMI|H5=l}^ zru(Ze!~`0X!KFSXrNCv;G}@Oq9cZNoJ{|CWW;p2wPK}yyLJTSnKP?1eAM0&VLEoyX zhq+D=y0Py+PwKx`;rP>!#k)zyjO0!-zM`vFg$`Zro#hj6JOz1-gtQVBz?MS4ci{B7 zpg9C}f@kz`BKYU|TDNV4v=WjA&*~MxT3XlL(x_h$w-tou=(p<*kiFt6nVsjOFQz6c z3UWZ7D^Dqpy#pEaaCZUUumEX|P>#cpDjz`u^GxqIdn`oVN|^cyF$Dti48q(#;<<9Y zjkmh&tUj2=*mIA%iBgTBEMF@;Vze@^MBP1FSMVB$oA^(>G3FRwOET{4kKY?T#omEW zEuY$n1q&salB+ni2xW>%Smzv$GZOQ>U|i?nUYCzO9JSx-jI5Tg7-f;$rIOQU2I#_T zIBsoXNbK1Vh0Zws{+x!~I<;?WJClqkfxb;s#Y}oIIEjD+aBV%*hEJX6N}eh#2vi(rxu%f z6_Z*0q%&HmRb3gA6=l*TEwS;EBH3Zeq*3NERJ(#4HE-OcIccF>+Vdn8-3*l_p{L)I z^4QI3(LH6=jemj9`Kgy6Z)8@n!w)0}MQRk_YHHkr*sPj65V;pjV3_&XPguDelp>w< z%oQwOmX(PexRC-dm>DfC>rUeqFBh;N&afELqZ&1e-i;h*^jvMF0 z!tz#K=C8!Q(ew6}=pDaD#VpICMDo^Y>imc{OZucmV(U#cbiVDW<))!v+#nnqBJRX7 zIzcKfhteJ{Pj(LOI&Sz_*L}$Et8kT9F`(~dIMx#r6cXaFxpzN_H}8U`j3nPx%Fu-d z+V)RijTX$wS2sc5@b5}?h82fH(%KTeHn5RN%Y0cKc zrVZ<4|8Ovd`J3kQ7Ni-o3hSIrjhvR{2pdblCkn1#8VL>PY2xrMmE6{u7S=RdD`h`4 z4+Zf`3s1YMP^}{GrzuJCC5aaV_&}9j7$|QL#<9S0#Q4F#9+&8nWBY~QIJAgz{U#xP zQ^NQ2yrEPT+)=%;7)Qf>-MS0laYIxc)j!&t)M1$r0%t8yAIsgMew7LUYTl}RVjAhu zW%aL`RTbYkkG=l0fUJDit?-Tt0DwjQzZHn4>3Gh)z;~6 z&y%l>?LC>yV$mExD@Tw;yG*4b$S(^)TVU%As^YjJXYuB(qJ6gRaab0}WLSAjIAsbC zHW1DOBU#K3Lnp(U2+NmW+fG)dq37VPTX$L6*H_o<6e=J*~Fh_Y)|H)g_SFDiF%d6|F@}f5fHar;UgWA*V&rY*b##XeE~CG~Npe z@6=TDB4~MmAaQ|IY^AZ&t1OJbmyGCUHmEOuaL?N$kitZ+|6p${3~pSS(6(Inl@PE~ z;?HK_Xnp|ai<^!$eOs?^(J$a${K2`v?i;d7db_#qv~~V69(p2=5^j+pnBQa}h%+|y z;J7A;N8>gpq(vI*rqmx|KUJK6RTGXTJG7H1hZM>S-nq)02oGvBgcN#Ug$*P5epXm{ z{fC6(2(n{!^$E4&1CNcQ&Z4@*o*j8da=2)=b;apn-u1MA5fmzefaR4&Afw=zvt zS&&&WC`8RIpzC5!j4sV;O0WsBE#? zoISj~e%gfxWxsXu^v3lIRMC{Tmx_@n#FtOhtEy(OZS<=<`(shhp zy2^NLO8?Wn_*xc2nOGBPS`dxy-d+beE-^ zTl^=NgL;|ic=Qc&a$mc2{V{xBO04AxzJS<(`0i|HO5AG};Ra|$HkiNUb00iIr8^8~ z*LwuHZOPS7MpvAg_2>N-md$%tSN5mSX4y5(q3$cd>l{0hBMm&8#Rh3+uqxouB`0E6I>%2ZG17YxYbJX5pdaLSh3V`Sl#W})s0k5* zMmZdOph=+WFPF0zP7l<_3(gK`kLkaL_s0#+4)8`Gej5x@wG;s;uiTSd#qCHp#4{|} zD07tZgdU>~yVcckLD{iR?d_UP?P^u~>MNXTb-hgAt6P0|+GWkF1n-24x4ANzgx2MG z5>A6wshE*Oxp*N5C#h%EOTtV)RQ9ZF_e(J+!$YYiD8U9aBjlk-GD*1n=q(KGxvjM} zu-8+<#Wxc^nK469+C0`VBV30&Lpt%ua&+nsKzD?^RsAO~B-6Svi$YZel=y`RsH&HE zE$MS|@g<;jO3yL8%Yn01^73l2XOA+;)wcc^g%wX8l-mou4U9v>(veZRzwe1xFEQEW z80Mfi7h%VUe(_9U39#|LaVzd)*vp`Ky7p4R15!P69T&rMBU?}_od^=tPEE7OG zpaZcHI4e=`jv~})Bqc}>MKB$_bqb)fR8%ZsbS&b7H^9xc8s;}Z8mXTl!0AYIOPCGd zXS3f8Fa-bJ2f!{oJU-8--_2kZ{;juPFJ2-1hQ~uSY$4EkOgh)Q1LQNJ-$`Bf4|{v2 zf^Sje@~^y0!RWv`r+ngozU|<%Uw@W@Z6F4EGi!pipxR*?@EQOeIE!G`AtW!&G$EG( zg{%FNdgJKfw^>8$3EpGnQJ{nUC}E@t^`L;2AkqfHa0mGG^`QFsf&QL~0Qh@~s1F6G zgzpt5rLHTMB8w0f)hRu=yHi=MbH2Eho9?kv^Do9J!W3gxme=Ha z!JW@_x!mh~Z#!6MSWI*?eu}{A1z-tbq8qqaRbh-`0$WHTG~NwHS@axk%~PVVI!Pd- z(24x|&s9>8O6VxXu>P(D@k##BwnMOo2+5|7q>E)eF3H>LAa4USqq3t9(RoYcy*-SY{6cXjck@;szx{9>Te6F|QG4guQ)Bj5SAVM3tehet4ZI{=s?&M| ze3AlNgLBBO>R7|VM6)v`6TZCm4lqrxY&i7RHV}R|o1sfV*4p?tGw0)JtOtjzzxRmP zo&HBp&5gg6DO>_=%7cMgoy5eztU0&Pg0H_>wKMgwT2P;ayF~htZJaMB^^b8@tG|5# zdHoNj6C_iCE#Rp-PK#||ovFPuZ|LEV_T$ydT;r}-?>EBNJCDax@WJTdb;Sn3f^XR` zlv?>>HSO@JC?t2OI(YI~sHO2)wk6OuJ}n1W6#8@0pUVWgP>QBL6146p#hw5r9pN@H z$$eGy!DSylc~0^C?UGx_+>xtCN440DC7h3c(#sJsii3*(`Y1VJ{(YgpttR>}NWZ^- z0{`rv_%93nKlJh|HEYMi7R2vsUH=ng%1D$QNMUlZEqp`;2BL4yN2d7&3$ys6+DpuXt9L5T7Jy=C!i1x@y~VF*S_|dfJDA%z_s@rn3i)K6+Uh>kfUaqK zE3WZ-llbSWWj8}~&Bq}oiAvqYrrnzvcjekhUi8Z5D!A0zoV7T*Iv_O0Ad@r?*F|x* z*$73N|LfQ}PDenxWw))h%&1w=L3P%mI@wdl6gbBUWCirvNd%cc7O-a>7_Fac0@Cse z*$q$7c=SBoZDKez;0}M)?=m(QRdYDtG@93Tibjm-NFLeCrZH-i+D-p^py}yPJcL|T z6~%TonUs97#Og#S+6jYjzQ)JU9kg{a`V>mxcaLVONHWk8E82kO7xNr~#L+WjKsvJA z=y`l;NMxMCRKj;M9O4Mb?dbh=@;pMcC?!%7P@khdG>!rVBt6!EK5Zf_(KN$fkaH3! z=CJsE0p2qg6b+M7z&>M0>( z!-yoCK#&qq+@k$S&SlQ!H^I-49rs)*`|L@%{M*FNASE{j&$`O^Fr$EYOnLd>{UI~a zNR8E##Dkb13m6Z`86Xqi*!7vD2v)yM6)*uV^p0tx%!){mVFVnq;fqU4U!ZK&^^^fx#Z!48-6Jl)@g1d0(G#C0OBc{t59AvzCMe3J5 zZ_*jVD{5A38OB1rk{SCZW91{AF8wdJCf;JuGW$tq1S?S+sorXW6CGfuE5e4~g@cZe z8ZE%U!4QNDx8N&%MDYh2lrfygenN1_7_pmP9NKza5Y(;Lh>MJ!%C)#1&_ zifY1w$RWl?v6Z({ezPoyJvU1<_}gn&vrgPH>?S|ijko{~DaId2wI62TRvq>ZzXIxz=Y$pfbB5Q$I>aqbaWK_o7uS=~R=Ro@D*<8)y_!#_{UC$hzfmL4@ zFE{f)NQteg`gKQ-gCOk-1w)BPlJ!azRIp`b8nW-6@Aq5vES)ly?8le! z(;#q_6pzjNxOT|uFGJpONG)6dy_b9(z~UcKnxg_O=HE{20V2qa+p*3I6ah6~^FJm$ zgDaZwH6dHtwA_e-&#U9_H(_gh5RzqTn$E0ok2M2F*((>3b=IxQAL*2tORYY>)qJ4s z2);0EgD&irG0=#s>EBWZdJ#w$n-BlH7smXQv zYPD;0y*cFnr#m$ILT9(>@3P8>4U4!2$y0y4YfHSZ~R>ygs5Z}P@x$%eZHSUv$t zh(H>G%yQ~?jY2}3qg0A@&0~&r#&$@3`(SWj%sJn?(q`^PS@Ehf!c6FXsOXvJPQ8`u zvQ-D`q@a;W`VhDUDoP8rNbIU4EcGNgR*=4AO*YekqROa?F)R zwNB~j5*IJtvuvwnm(BsBBv*)?${rNqQ!l4Jj1-@b5Leo2h9ygDYV>Iij9`dU>;>X9 z0Cc@VrBng3IHXo8HKPtjJMN&(aSCiJt|%5}fPod419TOnW&6sxbLNS+6cjdBhM7i* z{T*wiF}6+ZWc;{8VVjfU)&2?Eq-I4{fvydUWHJ(=R;zWR<~AeF=#gsRkI|SE_d}Xp zv}^h8!=WoN`UH9MED+%Lg%|d5S#0$f$vJa?Ctg!*@2~R`do+^(Uc@YJSq%MN={csv z+&N#Y+>l%*uTH+v&1Of^#kYh$UN8JQzV>zAiCrJv zy{UOP&7insh=n3NK>m`kOO#Z5nY61jMPXLf2 zdO>guRTL9_^d=O;*xV*>5$a%TJ25Crgiqn4PCAJuIgnb>m5H4jgzy>B;a-=}Bi-$w zv)b~82ETE7ct0_J%Z12}$;@k0D2w244+3nD(rgm(-hwUcbNBfPCLKM=c$lk8ySrd< z%K75|5J8!^(cc3e<^TMX3JT4pS#|Q)XBzgGk@i1-IsZQH=br;t{$VzD{8x*S8l>Al zCa&B_CrFU7L;8b|k^BKnAY`hVs2gXZ@dsH)wA*KVfDj^M=3s{WWmygsq2Wqxk*vz! zyP&!i2l=b2Kt-O0uB`d*R%vbBykVgkS^VSvKn96nb~ws?n&Wxh{_@9^=RKD^7mPtw z#;HGl&QYkacHD}=tFgdj@#I}CGTn|)Dt{ELaQIdv$}I3Epc#8gPm$2qa0@0laJ+b* zOzGD$Rh!`c>mPA9;@|!=U+pD`iWu@Q#^cG*hWlm?CmzH&*+uee!TdPZ@@K}#DJ0Qu zrdE>gSW{|=vk6>e@|a<)wb5xwS_>-jr<|^(B*78aJEnId z2Ppd%Od5+39jmP5nTKSpNKnP+m6?hAVYVJTHdZyz!QepQ8X#Lm>6QY_)GTjTxW99Xil#qAXpsY;*H z8WX{YEL-IZRF~0b9>nP^1$0@3b1zdjE`?xx(F$dXW9e2B=nELp^%!CwtZCW@)Rh$; z&V8`-Gs(!Okoheh?szDlSjiX@YBkVe)1cEbmea3_fj*@&2J@u9h_RY^$GgfeoE%oO z)oG)GC6*_(^L$WEp~>3qGDI=oI~aih(M_lxulej)O!V1yC0Oa2s?g$y9a$}ykCJVq z`@QB%WeGc}5XyAuXrNi>5K;^p*6te9bcr+U3=vb>>e5Vj8}YEDm`hF5L_e1nCs|d; zYB1RQ+7eDX$`>W0Rn(@JwlHFgsTZ0m8ck7kJzc;Umxr-{6)4te2}mdhT2f0 zhclzb9-G6}ia5<>W7)*Zj8s5}_*4B+x#&_7M{Iu9>`jY9qg5y`;9z7!FUn}fRNz}$NGLQOJS>6fRO|cey1vg3*Vzl~e z=F1Sw!CcI=LNDLCgkK#Np$atGk1ny;56EgV2Nc4yHZ=0F+e8jkw?w&U{}MH;zZ+n+ z+X6MWJ!A*&WTUg&A|de`3Ipq1Ld4UQamUh6IyAqp<2Su+wnA;&>!k8^$u5N)GYWfx ztHSq#)bV3hu&W(S7Lj*HzF3fS)7LXtvq>$Ne_+~wY=4^Iko1nn(%BfS&$G-AnZ#|d z5Pf~*4nGd^X#(M93=ua9?-(4+$I+OHF2z{!5}jp-;?j^8bfU>=5)duwB`6tnYV zH;kD#A;1`?@25B!jNj${6`^7-<1i(#Tz(~% zehVI^Iw-hABAT~QUDmRI6-N%)viMNPXCbp^z8bOn#PYY@_86^DZi^nqzAANiZ&Y{7 zEnf(*Cl{(7{iqKH8o21f(f5yd7#1#5XuXQ}*JmiHx-X}P0F+P7G!=iB>?3)DITx+2 zQ|*~z@x~LAKIdZnB#a~rHD=7mS$%63qDz8&2oh_q)$~bJ$IVz5CUZ~ZtK)737@Hqy zf(jm+q2$HQq?TZ^5l!XAso<)rqi$gh1<~skf=8??Df_DiSA=y=wLhMTT)Ph_Rpl=# zdYYr;$H}P_YaH+MFuue2B#BirEvM3wPWTv*B|uNv4Zb(mpSTG|3|q%($CZCD;Lbx4v*TjC|ZGUc1iF{8+1Zce+vEkuZQQHfTN1+RO4JmG)et`LHu z>O^m&O|z|ShCR23Mq7`|Y1Whb;2{oIlnUphY4^6`#LJ9jjs%^wc1LCVV>XJvzn~<>SFW!tW0m z>nNsQfMO`PubLJ#e%?4^xa7tWOvfEYN!|Tn=Yw5R+Mo56_B&VfQmjc|-!7-MBx9_> zMJsJUWUD>sht6U!1GT8;!Sn(9xs#{nBE-e&_SC(B*Zpd3?QHhN$QG%oeO{N~^h-qK z+dz&DzLo9O)7`_pVbk87xZX?9x4g8;?v!`z@Hu6Qs5DHib|AYmPB)1#}BRXyQK%*{LX z#6+X0CzZkXxACzoH0BxQ#lRuHm8YqJv3fB%cW@}gy^>o{9zpOZWQ5|Hn0%HX_AhfN z@CmB7sA@_cW5P|PS3vgnqFa_oeB+ZZI!rr18-5Uj|dSHnRK`Y`1U`X9G8 z*gma-F6Paayn(JeuJ_iq>c&v`ZpZDKT@EsptA~>N)uYvR#%JX@5My#KA@>|1&u(ys zr%WK^c5p9-bew36B)=0IVg?mJ77+%WnjBs%ayny(ziHE=xfw$XXSHHjAL_6l?kFz$ z)`kFSjFfbP(Ca})>!ZBwI6szyU*ig05b0D&+mvC4uvk$-xWH4(7$GXuA<98<0)Oje zYlJ>gh16N}gE^C8EwjzEu;)o^hm>_>^1c9CDZ}qGHK#IP0+K8dk}M-yDc0tzbVpBL z@M_iUn7V&NF`q+fo!c2i76Sa{^w_fy!J?P@X86{ zz4P_DHre++RC#6<{-aupJ5JfP8m@DI8$a-t{bW$5QfOo3d_L^49-C~z!ANhZ220-- zo_u8DuoKa{i9SPKs>RWkwSRXWDBXO|_8ItkDx06B7x6VJSx*^j3>3&zEVw(8X=6&- zF~}5wT;WHwK5E^c1yGIDx`Tw1agf!4jqdhB>5SoX(&7Ns1AhaeBplw@Vq`Yzevl|i zsa{kfQCpIfAO=|o^1)Vm@!S4qyjzi!uUai}pcL0$%DA{|ce15ElGXrz**ER(1EPfK z-6Gzg>1tpYM-cnA=;@J%qt{Q>!hsOGOX_$7Y6(H|YC6>uo|xM*)=_R0_q^d#S=1R5 z>7L8t!+~&I=+(_DPSK`TB_VkyegLw6SF#)rh+eWhN5?di>ikhxx6+hX=n&U{-94rI zjPp7El=201j2H94XXu(jXKjF`RAEc{@xF>xtEqfP5mhDkJp;HxOW}8KYsshI#Z4a} zt6naa6NK1sT1&Zl&+#iCk8qUpYH~BSdWBd!m_jpOJR+$~=}(|0xwYLmA^NEf#J#>u4QUAqWn7XK`>k*9I=N}8avWA2 z$;`~ujOA(l*5V)64*jFao9`Iwv-eSapU?cYtILu_0{)*T`8QKbm|b=nYK;^8j)Ea6 z8E;Kf=NVCbpf}yyc_N)hac_^^H*D1#zlhu3^{B07Sa)4?6?E;N;^ulO4Qm#%fu0)p zR#M`oiSf(|L+q8f_h;xyu28M;s_}*n8o=^0YQ^1nPYHab+OP*+$Ci2I z7=eD<4@8%IXxy?ueOeaT=+l=CYl+ZEl5KU{^qLyV87J(bj*(#fkrvFP1~P!QTpMSo zLku0ywX_GV&Z6yCC208}l9G2IDc2G!qPe)TDzh#8*chRh07Iy9uws1Ry2K~CU z18?ZWhp*)fJ(2g`rdUN>%&=6Qfd)8nCKgf@2*oi;-&A~xR7URM5k_$ReH#n@toZ}6 zgXU>9MkQa~6&CWopvm_3A$ z)UX9=9||JiNv_&((rnCK63T8i)IKVzv0>6snHa|NadQqbBe1$}Mt3p0(6J`1=)MNT zr(5vt9#1OU{dpjh%-gAcZ23x`2kU~hLdkLX0e>x0xs(~>)W@kofZe)n=mPM1mYH_U zTLmsPD=a^9frUF@j0tYoJ{O8|Ln|9~TH<()r%byPe*%NDEq1_~UtSiey}8yHiLIs} z^ig5w*3j8*adtmjQ)vd2vW%gRivi{%y;2jBatde~Gv$)`uvTz)=*`a*<^vcB>yIQ1 zt+J7`A4_g;KInd%Pq%ZOCTM*;-_{Vo@;l++#xM#W=ARwo)`{CNP{MV|Dd9e!)-oj{ z7!8U+^n5><5n_qUCi4hp7TNmKCHCISKP|C-lrA%w+}#x3gjmQoF_~h1l&B(@Iot&0LBww zuXyWh<|+H`NAV*3`e#osxPM9ACX%1vozQJ?{K$x6N3hvMzVjx(5g7lya)=W;mk)V4 zwa3$Wn0n6hNm=>kY_PUA7~{qh2HxBPk_C5KOo=>O29dKs#6UKBk)cKf-G5rG0?VS; z@Ns|yed0ms0-Tv1s?Xwqx#_&FP9W1$F7uPWiAF?(0qhmUCkId$y;omsrO66}A7l9E z?MbX}u?9ccd{1fHF1f-eW4yhW`5e3R2pClmMBzB9U@;KC50l;DLPJ`Xoa5< z+WC99Rb;s|XUk@5=zZ@`ENd7X8JAzFhbVD9r^grYKwWlp4noY8-eZtmkF-C0 zs+^7u)3z%_f!PXh)zz;=t4{lcflHrZJYmb8Ss3WoEBw&q4UJj#_4!@tzinzk@Gt{K z9B>*SOFA!q?WaIUz(5Hp4N{`=O8P3uv|Pmw7`HE*KrZZRREOFQ(3&b@_%ItR1den> zYV#~s;17A|YUYA4@qR=k&nU^;fO4$LW4lV34s4n0T9To7kJ(l6bYDqBvwIumNUHW& z{KU@y%sl(urh4v?VtM4OFqPlkxe2_cvX{{l`1$#4j~a->1Li00#Rom7qjjf%3R8f4 z^sMybrS z>~V(db71V5gK%2+7lekM`^~3WFeX+cfaaIDn=3CpH~g&zW^A4AR@^NQmqMpE`AE*B z46g(%dwd90*BKsSIfDQP(c*A>ryyl-xKN|NEGETUm6ck|pG&=nMwpCO5KRF<44%L+ zD!m{V)Yu`RAZfl!Ce{O&R|F(cc%T7;Yg02Yd9rdfLlrszwUaP>^=QJw*qHfe6?$Vh zu|PQYEwDMI!+SQ7?tK79hOv6$x^xA00HcX6dHa|X9Cex1W35%jtccwc{rBX6A#Nzd zf>k%&4?keCLIojn!1|dDMs@b|%=XEp+{7G4^ZBE>mwIrBPth?9R5G6^_QxQub<#Os zY}0x%$(OrxEJdk_Xvf{&hQ`Dl>jul`u8VO?u)d<}}a`bP#;p z$S=4;1Lx8)+O1Rq>#;QrTPv?`S?k(TwAf)3*`+9R)Tl7{gxM}wQP^EB2Cl$T8n3`t z@Fw7P+qDy_cm$UB2Ghh1vfwQ{ed`PwyQ|@&S#{M-95Cqw;GerdZ06~(6-L3gw0bDwDE z%u3Mr@y4>r<2q)%E||yFw-uC;jXP10jXbeuOJsKi%PSqs@tX}YTgQF4inj%+GUc{} z=A6Prz}kUvzDb4lqWj8DPmun2SBs ziw8S*;EO%LNGbJel{_$F)a^6O0E^@V500dOJ+NzrK(|j21!@sbWY8{}WC=g*=h1R- z`3019(#IWxMrbvxuh11yNTCkKcuFSWKgtx9sDc1?&J)c+Ba=uHo~pnU`>Tuu(QV$K zM~l{PkO%Fv@Qo>aL4`%`z^z$L*g$R%ziNRb4cG~@L~!Sr3MvsmSoYK&VM4o5FP$cV z0z!Y6Ku3IvL~Ym{hg1QDHV`$GX3!{oWYQg@iX(FvSr(iu+HDut#2NHMyZ( zitNn5-k)!!TX#vYG2?n_0)IJUznKBhCP9J~maHrh0c4-Z5v?&l!7Kv60JA6okO!K3 zV9K%2hsR7FU!0E-ju7Y}FD;AY@i`yM#wm`VHV2||rZ`A0Xt<&FVClcLbL^kxy z_Y>nMrwr-@G2u8DV$##QmK;l}o{R=Sv^}@AJu@^Ow1k?OyYlW}-5Hn} zobl%H9H^t$uD>uf@V`}=@&12(M&7~PR>9fW`CrHtYvoPZzq*X} zsndpeXgPr~0OiXi0|aV(gg{sbn6+?MQeHfI$a5HQG3g>DnBhSr{$3#&-`hcCI3psd z=of%*f9~yiS=(%r0RmaNbJVPScW>hTc0rPw5;XJ6?tQM| zOk)K!DwL28XU|R9qpJapgZGP$F%KC1c=XJIy<`l7$%miOQj8|r06W}S#H4{#C76p6 zrMNbjsGg*R2l=>k69^e@(9ukNh>Y{jKq-_=+LNFV0NIPMf*e9UI69HOxjf>qxF#&; zGKf$--_Rd3vtN}FuevqHv*YA+?KRy>3-ci^16`*_4@;9;vc*(-*<3_(Ma$KNU|d31 zT}lYh$I~kNbQ_iK1?bamE-r@|-6~%(YwcTtcMY0e0w`03r?L|7@llPcb=?h8pcUv@ea#$gZ1eMPBFaF5~gcJ^(j4BQ?l5DDI9ifUTq2pS2o*J$$}z- zg#Dp?Y~dvMYXq+ITfmG2LHg<0Tnw35RXVY~8x}tcQ515D-jpiqiUeok74RkXyIF`o zL?*-h<(&*wt_)anO`%HFvkI2+?U8WQJ&`r7d^+&e+YR8q^KJ>8@C2hO%?|aQ?jWRV z^wTcSig_+tWA#Cl8AiNZywAv^0P)8k+j&S&sIFXT9(chLBl0Pz#|i4sm;&03!lKgh zUoGb#uJqOJA8<$b!Hr>zsQ@2RNMY4$k3_>ejHbO-zKS5-c$M*llGyX&u`%|d)AnTA z#xm`LTld&vmB_YBDir0!Im<7FLG8%mly&lJr{z_X#Q3BP7`bl$fI1P2cTr-H5wi0XE0s;mA$p2q8n}5%+ zg!P^Dm2LkLjQ+*;l9!SCiv{sstX*S~;cxO;3E2C^i!on#&>v!vZ`QAP+h)D`S1BZr zN&2RNSCqd6e=Qs`*Wd{c&2F`QzUoSUd-wSPu?qEkK};KOXCAO?WKtwgtcIOFRW}B)pNL$LN?( z5@5@36WwT@F$Xn ztqgkil{qUbNC4O07C_?^EI*`j$Nm7udAN}3`XL*qDKLYoEjzamH&pVj93)@;7|F(7bzZ{}u4M;uZ z<>l|0sZ968@kx?63Ae$FI(WFR@x#s7z}cZ{wq;MxRJv2EK{#kOtT*tTuk72CFL+qNsNr1O3~v!=gZGd=(A`Fqz{ z`#gI;Di{kcqqI!1)U8hw^aK{a;++X|`8tW$)Ll za2znl^oc5f1Xg=fVF?)qjHEihfO9%u!`(=Yf+X`}6g)%t0Ilv{LU_`*F&D>#o zLxE9F0fV8uT&JrnQy?X{X?^}=#XXO+hjnfZy@AChCQnrRAi>?kwL^P2|=BLx}t8U}}f5?0yuN);sgCjwn` z=)^L-NHZC`KWj+IKGa{cnBUSYK##%!?-EYwqi?%HYl!yzhUX(2#rY%VjL31}u*%0z zjY0vKC`O^`;)eNT^MCU(qiU!+=vf;jk0z9C;cdcakH<45PzXY24m^TZ8v3}1lwFa@ z(uQ9 zX1=L9Rh%;DDeTk6^}PbBR{AdHwj|2xa~a<`MAhyUfrYwy=hrR^WEAufqgF(N=HC_O zr`}xxP7KO=B7Ye&+|Ro}A8EMz^R!7}j|uiW+HS;q;ErE`D^>g45SbJaj!&(jl7I z94dN5$Cd9_xK(Y_8a^R4^07QJ(hag&zd2Au$#NUlR?PU8rEZvvW7UbnSt|jiqsuo{ z6W@<$`2Zi|3KBdZU%wl@f_#u`8>MSg9ZoH3hf9tR-8>4njPl3MQne<7{bpyN*|?ai z)1?&v*yPaobF*Ga09$UGkIEr!(+85&77+WDpS@FHmjLP_J0UrDUEV^BOGCYajmeX; z(ZWY@WOwUnl?e0?X?M+cCZW-9F;F?Tw1$I6^4ivXK z0@+c%L3hC;GD*5J79tQ1281qk_CbOi(cHG>h7X{^zq{;bI@6)hc;2hFPX@;jWq+)v zlf%kb5=gKgo8|J5d+W@q`T?3jVp z;FZ=L*vi(GWL!c_d@jdGdiTQmskui5`}?pY{E7jauP-drLVP;8{FA$Aq~O~X^nTiJ z@y_j2nApsxd+Tz-PAe+>2CeISWb{>Km;!_+O;U1@|DM6rCdb$+Ne>b!b*rj^LQCZJEwKFki%}5f-@kUT2Te*WHBC9>r#Qa^m-cyMccEG@FJ*c&) z=kLknDx-;`MY51>$rh?bOAQT#O`2?_xB0P(=Ha|Oc=p2N+@3gi?G8CV-b_O;KL!76 zCsmenN@!ig-wk0^ZKE>Pz_Aw-*D|reV4paRAf${+ZK0nxog!w=oHXX(pNG_tf=A$H zsS>?>jsi=SId;+175SYwIe-#wio2(=>_wa@(v*GB-hNsd7Vr%()*L` zvahdJ&Jt)%<#Gqx2`im(HhQhTRXa&q6#}M)$!rB$^qAv{CUb)f!)&t%&iJAwSr|^6 z{1E3BF;&bdQ_68;X5OR-?3fv(u+)UD3i6Rl>~&aktmO*l8qi!6JA-i>&T4~>DPPK! z%qgGWzN0x`HS0-#%AUBh0~);}XBR$b8%Zu;%*RmV3L=BII+DUTm6yx${uP_%;EY&{@$Mz7BVyPSq_F$iHe9&AW}; z@L4=s=;bP9Y?jW1I>PN#bD*-ZPNOS_t5DNm2FS2=so$Gc$P0sHbW7$DOlnz$)%z8s zw>A(@$8&av=#y)B=xe3kXO0hs*sYvhm`f;leN@XLjOd(*Ay+M(b(y*MmVS8Rq#X~W z+rQY*jDlT*G1%LnRDzpY7o4JO(2Rfs(-_-?Xl08S9ZV^y33{tdwj-m!#w+PZb{O-{ zP$A`@>~mOQG2~u7flk(FHVV#BERu4c%&Z%9ggL63-u&>WMmABWcKfObQP>;5iuu_g zakGXvc8xTZVQ6RT{cK2f+iVL=_sYC)p+YY(T@z<2YB1M7VlNbA#-?W=fyX}$QiUK5 zl$#qt3Ga3!@I}&vL1HR^w@3;6r86SWbXn2?EtsJ~rU<)#m&Z~tdYMvjbAS|lGT5(^ zDzP|8p<)R*+7*St-@~YBv|dt$Bn1d&w4^R2{<$k>Snq6q>}2y?kQkVe{pjVCu?y9R zC@eJf8w>}ARL;P<$`|a`q~fxYGvMF0_Gv$c9A{Z}KHLs2+*Z903e+=hMdxuB?VT=S zXwVM?GSF>u2_j}U(zl$Adu2alNl{46-pyk%H*t9AIbb??_`?WpqA&9W5F$B zkM-zDLT8uhoJ}H0Goi6_Hfqas>l-Ig-D1`G%o@5!52j5Q6=iEqjDCPsiGHv?&FSLAi-;VtVx#+$G|4a5%*sM+i+QXIp zB!l!^FSpf!yJe5?1jF4y4HyO*f23d|NF%Xt-Dmrv=Z4c~+r(#kBk&1S4OK>F?=vt$ zx6S`s=o2HtweWsK0GJ7X$j#u$*V-L3Z3VvPijaOc?tHtg0cO=@e}sN(YG}g>%LeCr z+ZWM|ye>=7%d$It>KoI&6@wqn>BGqa;a~^!hJlj9e_PjmkEw~mJ|5yF%O8S!FBOkF zUMr9EPJ+VpaY(R)Wcn8_`?xH;+hGJKJVH9Rp)FtTVwxke*b>X?8tijqN%w-=yZ8k7;&N*DP1il4{mbUJ zo>ke@qjfi)?aB#GRRWLv2Yj2%ak#hak&UU5q^4S?KR@_C=(wE+ZjUYj)VG^AYh*yL z^iTy&M;RDa74|M3PTS&5fh51;F%V0N?hG1PUcOi49ef4ch*w*yahQ-FRzX{qib>;yY(AN zdJchSl33z|z%<yWsw2p(5y~+!G_JkBob|qx`4yB#YUwKB6>M$PHOJ5fn z7M4{Xa=Hju-f*fC1w$u;?=#Upn6kX!`YUA5hsHWR_4bON52EE>*Qkt5WD@P(i+B|p znIji}n<%J>g|<|l`ULs&4|+&cH+xa_R;b;pEOT|S)>jzUo%PKx1OQg7iDo^^!%r70 zrI@+%aqgb<$_$c?C+3sCAg(F+cu8n6q^wiG>)|{zmeEIT%_9{a?sD;aSM{>Dq1x3t zt7(pKvQv09jepSmZ;`8TvcpxEZRw;Sp#(Xjz_0vw1$}Z7_A|YbY+ZvYsW~jky4@c@ z(a_)%M6kW=q|SdKa|cV5dwtLH@5*-~*~WXS%ui#Y3CXaG46todRlw5C%DY9_$~jST zMUaw@e(Jig7=1M_e*gQbxFNJ^YZ`8wmF0|}Iu6|km!>N%`sJ0Pj^h5b^n=3lGsF|% zIj2v_;u)$}b{h6~2^?V7W!J^f8Abgm3Y&wuGRpo+arU{Hhta$XFUxSWw$M{}n$~kq zCfY-+m(`({nsY&uX!7_k$)_|kXYmQ@tNdNX$9j!l_D_|(iF#`JpAvZ^qT+|wrs~av z879)Co>8R2q;SCEM(f};4fVa7;nrYN-7_H_J=Nco_Xd=vA@vG*X@zEacIxYrVlrQH z_LPX@93ZC)ps7T;vL0n=DUAufUdUDzPqKxqncU>*(NnYCLz;d0x_)f@g#82q5N=LHWyqnAjBp4Rv`hkr`)dGWh56O>=O-UR8>Luj2}svbSMQoj0`aQb3G53_y* z(tMX^h+jD0kY1fs`kd`n>p>^`d=qwf|;B+lX3(m5oi?j4NGD>vk}XHGh9hi}02o^zY5w z5xN$Py5VQ>ElaPg4?p3~Yh~-^%CkB%gHB!qx3yBEFy2t^YYaf?Kc%Y%y8+t|_Rk?- zjOVpZ`?P59MQ-yN=VNTJd1+V-Iz@ zE;R!9x#{~LVj=mQn+^zKUA>Pug5`0=@5&F!J{Rw?zm8vN_?$i&_}siB8F2p`?#32M zaNu#AI3HS>fqQ1J>x9FRIK~onHpZi#Iy-V;Bra+SS3G(jrNwCXL7AReqjw{$$wR8oImQq;dwgnEC zrOg97GUOEP@`PLJEvt2hFikWQdX z>nJdT!!x+Oq3JR$q*q_gJE1^wrL<=x!6_@XbbiTxMZw zhy~3EL-0lrsfQJ~PzKi>q6?U1iZjwB8x;f_?|CZ(*tnC5SrKR~ehoCm=S&k9*39SO z4pM$F8LvCNu01{OJUolms2BHb6A~HXIIrsu2w+^(-AM>EM(Ll}*TIogw{tD}-6TP7 zh<<<>rM#Zmj5RT?NLbpXoel7H+5yD>SR*^CjI>qXW|QeK1f>cTH!`JHyjCrH&lF<{ zPwtgEF$Jj^z~_uEZ@h7YsqORpqzt%d$P*n#%TW$GH9BRC$aa^0aIWqv#X(GsEq3=s zg0pZl*&PHqhu>jV(iUdg#-W-5;B-(0!K+2d*$hb844K*Xtu05GL#qqWrRiE~6UrAzCKP+}<43tJ zBlh6hj;cdP>c)BXEgbX!Oz*Sv>G&p_v{TsF&M60(s%tiLYLN|xZN5GckAbH-QF9|!PZ4*I%WB$| z^RrJ#YOZNgc@>*MZUKx7dk?LbdRo<=T;?>5nK;T)w)L{<%3|y$xuVU~wS;h9L#>bM zyoe5*nZmZD?csDIwa+2ilIRC*J8)m@UwuN^_l-J`_2-9+=9ZJCR^!7qBuX!-(rg)* z*g#+AFTq`uHtcJih}j(?T1&p5p#JDKhf%Z^i%g z3|$RZbg!A9MbH;YsKgM@t5(@MDyB|SB3GXV<6#;STc=LgH>UAf>>Ush2Eo4I!?HXw zNX0#`NPI`P>;jCVmb0;M`l5eHZkqj)+aSlT#p@<>?9DnWW*CCHgr|2N@P&vHceCyW zfj6<^Z%iL}fpzB2c7|v;lRIllvOA(jpSDGxmP>YotSatYC%x$xe8+-c)Du<_-oF53 zaA_Ljl8BTB+2{kTXEG|fs{JJOHK}oDKi1k@qDEpHMpFOsLUhE0_4r(M-GZzieJ{%N zP;*7I9l|!tUp1`Dz=dhv(|+&)S-lqWIpTXf6#u(Y!SB=H>XSPF@itGOJ((U#6w^YG z3wxxHz@w{05^u9|Vg+4?+gg>D&W#q-om$kuHk(iXIp?U%@D)#<7?SG%Zi?(F$hK^p zZn z91gI$fm3DO`ccA$>Eqf09NF3%-|-r=do6E^;6eiknKt>I-+zb=)qo(D$RAtNFPi_A z*g&r3{ck}5g#SOp#(&70V_Yk{t&w{tkR$#o5K_Y1>7=9)PDy{<^?IODCDP@Zedu4e zZHbhRV=(P*iPV?9ZqNTn$vQ1Q^20>h4`==(S@cTNERKph2NP2#5U<2$cmSX6`J&dZ zsmRRh$W)J_9xT+`ThBZS;j~Y&T~PFt6~k!L(gJ~Ya*y>ipV25ea(rU88MDaIud847 z)H{M{qFg8uWRTL)-?~wk{;a9sKX|{az3KUaCUVYAvk1UWL&D+2~D{V4Q-cyMW!pnAcztgTtxT=fucv3b=kA|m?< z6Hxp_WVWvP1be0BskP5MJ`RaHaai0vD9}109Yr8!4F1F|WvjB_<)5|kR?$7&@a(8! zcej&73*o1)cmPgqCt~>Z$*OM{$02hU*d_ftQQ)0TAPd~-3?wH23Gqq}S%JEVzP|!J zjl*cO_YZyljj(;2*Bb8OHz8|n1#l_Zp@%82Q-IjR8^7UykkkfzmfZL%_Gsdc9x&o|f;UlGMX$UjQ^E3l*_~ z3skyVhgJ(tpUgjIK!wIMn+3;!MkD(yP;(MNDIFtYzp{_a+9+Thf4Ye2VW;Och4%Zk zE$&^2I{ty6jvkf=^XS_r(%1OOF0A={ylH=2mcJQsLEjWl>ZpZ$k!1^`y-H?1eI7^= z_xdYjYxEHZ^}cs3S2&m}4pIgcb5I_N5I7pi^S`Gy z5ckCF`~=}(*!c7Pl6U>x(-nV{DCHnts1UQ@YBCF~rg;Q#3c8JWG78!FGkIt0>m-I- zEuEd+9qm2sT}SOA>~!(CJK4YQ47f7%S`DMvj;P6u-|ZH<6TUomZ{S6UoOk!_XNeha z&iB1pFp{EsjV~snQu6qy!F*Gq6k51!3ZS62O@IAq>4FV=jq=Iy~OiH zHHEW+A9EUr8As8s+!cbE^T*P{Excl=N-lI+Pl3&q%8#wq=iq6N)6RmUDpV_2?G^Nw zgi%ut1S_YN(a|I&vx--WxYzx~)d9;$!kW91hvVp1?$-)+>y`EfwGdKZ#hqT_9*BZSLIz$1s{FOVp^+q!$;8EI71pg?zO>-;O4AS~yC4_q- zrN6#@Czz0aa?`{PQv)+czbN$mPOip4lE@2-C?IbK3$ZNqSF>d5I^*$Ef)@MHj&OC!kpfI5h#;l2>|qW(Uf=xicp)-;jL>Ni6KbTPfui2wxC{tIB8%>O{E@<#Nq#@(`EMVJaD}{J@~*E#i}>_&k_btBN%%1ssxtP%O9vZu=nJFqu{%YYkE!5#KfJSW@V*_L*6S7$UM)sCmn2A-)M?J`~iP z?gbB3aaQExB^|T7KQ`;>xOV-szPoUGiQ~Abs`1GHHhXZAf@(;9)9c03ZdXw1%ByqN z!k}wDYu)556Hg}v)7Ma@zm&F|wd~b<#M2FF$SqcXP58%LX0kKxm?XxotKm`)dP{x_ zaP~dIr8ElrhIiWJtA}o(GJWCRu{AlllzmQb+cSGgk-&X^JoUH?aH9`p*>AnNVoQ}p zTeRqNcVI_F7X0t-0b{%9?Rek8@Fny9XdsS29UKT>jVJ*s6plHw|+ zvT4@7XTVqv$fl-1AL=cihC^1Uo&#KWU@`1cA#fVT5pwQF=y@B@MhEC3LK+5L@j{=* z#o%&A784e)NwrVSACyb@uA@>g?U9hY=UY2chD=4x<;fqo*T0oVeIwjp&{nsx<#?B+O^XS?OvHHIzNY(YedmL_fRdsKebOBo-bP*n&Z& ztD$5YcA`#8;y3378&my(QDLlYeJWIw;r=vw7a`lK|1$EFtR3SD{eiV=zRyu0?b33Q z-aN&?ln$Q`tG4TjS1&sz97#E@R;Z}W!Kumk`5i@gy@QuyJ2$| zANR5eL!J9OvP)e$@|j|M?KGj$6XM(Yp7w^axu2|ChvkWOPNOI*H_@RtFayFmzmymU z^3LsX>*8WF!`b=lb=8{}$@d66^Agfrl|enY4p*YbfvQV<*##|j@55ivTvFVrjb$%lD{wz=dJVX0hcILwR_`c=)dpT_k*`y-&vVFIrdZY?5OCoH6E~uO{>u8X;cX9@`yVA~zaO#R zXi(Zi1cqFs3jbsg`hxJ$zd3-8*zt6!BK(ADy(j(iN!~?Umi1ChA{(3%HbK>51__P9 zXa1rZVSH_tC{d*n6$Cj(4BK3O`~A92Azc;c1Aq}$O^{o~3Kb|YG`@;_W=x+FKi#)w z{5~tnZgtv@UsjV@&q_F%6p+`^+sOYJrJG8&9$`{_o=XdX6m`LEG^Caik3A`^!95%y z4OaOj?-|#(4OXj*V3m1&$p*FF;U(~8DTk~b{YQZg{=C3U9>rX22eHa^QP=Vdyp{f+ zs8nJZh!SntR8ve0cTyFx3d9f-JWXo5)iuc-$0M<9jaI!nJ#GYqAJIwWU~8%Itvo}# zBhq!u7Y=U$q%8auMc67jB+x<&F-7`KY739Aoj`Q3%vGs58(ddv>ch{TDaFBHN8}I1 zAjpicqkD^vbO_j`d=Pe=$IX$Zo@oKC*V)SEk^!4|)(?ISgWSoO2Wb?Z&qT@uHov0J zO$VyQhO6?046!&5o}ktqd^$gWuR7#7OpXw5s&d-EFABa(Lh{b~M(0Z9_zK;+hDd3+ z?!-uqK3fu)0+EUeF)A?e_H)Y=t${({`9I%Tm-TA@WGB5buAn$wVuN*J867k5n}{|9MrW;Ftwzk z%Vc+%UUi;Dc>UXqc3I&4E)YrRUqAz-$FHeFOUm9&2%_*q1HoUM&*S2u+{j*OUXZib zZnMqR4-5}!ZDIXF*w@k00rs|L@R+?dMC~YpFS(&5m8uS%qX+Ea&oc^m7oc=tNI&1s z^K|1sftkLGczNsATC8j8Bu0wA>#%r)SzFg^8NgMxaIiD{OGVL-dHnfg2wb*^fZLly z?^+q7c!+{G`Ywk9TBc1sLA0^YDd%h{(TRvlnve~>O)>$;WRXoE5-`e2%PXC*oC!5q zqvtw6SZ}c0_=Evdnu2$^wsK-=7Q(Z;B%Pj)PF_H?SjlOLp1e>DAUC4HyKF4X?`y6= zijZj4di`V^#X+vqwr`9P+nsm))%f?cL{rY#+kEO^$ij+ubD5*Twe$aOS%{9i~%~O%bJU&O*2L9w2hg3JmLa(Swa@ zUk;AT5I2UeOPIMyESh})a!sO#bRC>E%({HMq_~QK+!T_UX4F-ODA<{?=^I- zA-ztid_|B>C>`5-98B9)DlJKSJFWSehANiq<~$nC*!23+N0u}JUskF^ z9_l5-`bCZQPG3crUOTRvZP9)_See+kO~j`phU|hBvZ=TuX~jI?=o01-EG7Qo8@IbC zVB}4NQzRXcWyzV zJMBzTZOzm8;^P^$IxYc0_V%WlE2+5{GUkPsOc4(9|yvIMVu&5PyHzm@6>(VjlbG!}7q@jJ|P%hpa_grHV2hstp6A8wChwZ!p7WT!A2D><}KPPM+QL>tba*mHzt=93{Lia^&42eUk}B9)*g6ZF11$b;m2G_If6Dhn zZ#fWfjO-!f=mP_RDeV)GMNk9?L&87{cGpN6`}L$-P!eVfgbMaRUctV=m@dh|kZGoK zw=;6M)j$3|-a{FL<6*!97=0of z$8F?IaJ|s3qu;K75W6_dM5`{r0%o8D2Q;f|G{`oJf^W*%JNQVN;Nky>xTug`6^8r; z;!}g#*TCt?IYyx;SSB?J{8pHnNM~s74xTI@T`4@%#~D1PR8}2MiJ}wwt`%0)^c=!B z?(zJ!P?fxT9>|`Tkd_ zVbC?G!++W=-T#|L_J99t|6eQs|9do((zGoy0F^fl%k-y?4aON-tx^;$64}yPh={Z# ziM&ZADfKK+7J>`d1`iukX6q5YhSg!Yn2D*r;|!$jfzBIDeeYjMjO=FmnBh#$?Uq-M z6aAyn=RedwBOaA~qO%VOk5W6$H`&6O_zmXk*mI7OY9aDqhDOlht>#X-5W>>R3=CMS zZr(`*C@n<2pAEpd+0~8W+*OUKT;pcv5#+2Z1|QSoqe%^y(nG$1%7{Xg#OLT$8`WIAVikkxg!O zWd}8DO>ZMp1evbfy(U~agi3AV@lz)PSD6^XcehWW|5BTG&@N%J*F8x`G`veUTV&1F z%uLI5^s9BtcKrw)&1M8g;v#s3%COo~UC81UY+IxX``woQ75G}A zuB8}Tk56CWv}2rKc5En>k2%N2dv^mO1iUHw7Zb|#Sog%`B>f)7n7pvEIwnDgwI*)b&8^A{P4Y;aA1XJPD04vSY$j3v^<@H09{fz^pjEnhzuGKGq6?!*l9|=b%S$m}IY*o94D1OcUvk#?DtcDNSNBQ0~ao zJjd5BR7p9yl)&Y||5iMSVTwWvk{KexC6p|XojAr!zu09Z5@Z(LCUPY`;Ny1nYk}T0 z-X!}Zal2M=?-LwK}qKZU4z3GV28lW>L^0e zJ25*k<$x(|Q$=cHIKjlyL~4zjQ$JGWOiMTI=vbA3-FUjKD`?u#`@Wdv@$%9&yZXU5 z`?%Si+sn@Z1aw|E3r!2c)a+8@S+3>m@fhTr#$75>uF|9=yF^M8%)D2HmL-xV|D@ho zqP8N19}{3-TU9_v;|q@Y8zfu(!Qy~a@@eAB5?m;glmKKUQ`_qRr8z@IRKzZch*DMc z7Zgi~$FV>8J1;Uw5No?0b&8_vq@^5OZkSZm+5H?4&R-g25G~IMo2;hI-{o!f>Qt7E zWu9gce6S6bN=ZfFq(&I)fAkleo@p9lgoVgYruz)fg%(3gp=AtmtN@ zYs?jZOODda>)$-w>x#uzKnA=c#aXdgx+Ltf*Q(kp$clH^WE1{rWpeLSgVOjcfPxc~ z_Nw&Ol`#+|??B*iVcF?nJ-w0ADQFe$)yw?asgP0w(JB`&qWcqtHT zkrQgIaS)=!!JeRmL7yV&M=@3ZyOd-O(SgU>ZeFiuVx<-9xYuR|RK)R(y#Zke2o7Q* z8pQi7ID&8}+6W-+eN>;;k_|UHO#Duzo>`!9JHj>*&2DIpH3N6eA`?|uG`O+#K^C+X z%@Grm+21A!W}DL_^9sg39%hX{O1>to-Z*j3^|C#m|HT-d*!)Iy1Wyuu*Dh-$00c5c ziUU)m+cf?681&^!=5)WopcOqt7ZLBcU=h*usX-YL-5%jYJT+%HJ1GMMQ@T3GZMUnp z=U)lpPb9!!(x2S8{j?Nuyo@k4l>85smk}a;cEtTK8YBRk*D1>WMX|Dl7fUSi{zgo! zNz5fe{`lKKGFtBq;lM0QR!@D?HsQd_^MPdb;l^C)i{sYtHa|cm?sc^%2Tg>-vAO#B zeV$C@Omh>P``8U^Q*+CM(^r-riC)KBUgu5*x_jLb{wBm# z+)l#vygC47|FV7)*+_iPU!E4)5Fez20DRRqjyVq?atlmL)Dv!J?cn?Uuo zkhyU_IPo=fjzRiB{`FxQ*3AjyI_dQDv$$_&pT-Wr%!Ny7l4}kGROgg1+j9~GR_7>) z4JN|hHGF*34Mcow3kY|}IVBIsg-mzzlC)C*QD9COI%sUzFeDOB6S2rc9q2FaM%1vW zZM+A((CBO7!-mtu>}M4fhjLwi$07gw)BRT9HCMtbEnF{d$}29&hD!ih=P%c~tUZ!v zGLC-RQ0c2m`=spwk@{Mu^D8ynZ+0;Nclz>`t10&gW8K4yibkiIzx1BeD1CHj3t>XSjkM@N@eI-QgOoZl2ga%KH z#wSLN`}0VG22X;QtRE(8h@OCVeRT^g_9+f90@5#p~D1*Ow!z7Q9E%#E4|(K*TGWI2ToYuDes zB>;l2M-%g}Tf9zzfNxEnJa&r8nQ>aaaT;{>yh5$0YA?na2_J++YVd0kuAX|BPIm_u zI#T4+QTLHNk3_VAv9U1G9;gg9b~4Ybnq9L`UUq;AfG97?H1e%rdx6+s*hN8}Sh#9( z&l?3X`Adx@!$; z;$=!|>h(9G*w84YA>RzqjnTkm>0+)MfHYyGYcJ4v6LRdAVR5%QZR$?E$4>y}m-YNY z>CeD&_i|zGAZ?OqQ+2Np1+Vz1ug;31Ot^H8x<4+1N?T3Re8AV%(CcLA z>nU?Xp62LlYG`X~scPX}T;TH=I+h(kHOo^m)IbIlTBfSawpuAyNJ~59dJpxYNBPLl zl0nK{XX@ywscLjKVP|=@Sm9^yx^^Z-!Bm374GStZ>Aemm5LsV&s@Omx;2<)&%};y^ zH~?%s@*)Mzy#9ntT79IZfTRD-!KAFMz>DAH{ax2omRJ{=8I=V^fTXS3QQ)egonG4F zt$4nb`A~7N&`x%|JPZ?m(}p@Zs0+XwukEPUDMEK8+`vd9)-*gNelA`PNm-Pl0U17S zra@Zya8D-4-kp$#VB7Hd+!{zU;ZXNb)m(!`VxL%qNt?(1C&#Fd;~5JLudvvGUX5Gd z)X>m`9`@%!K6JCYR0RWFJz0%Ay%`ABrQ!XRYr+kg$yTc^zH(u(=OpvmdvezB%XOgZQ zNku1?V>(`I?5e2ysd7O}Sy?*aDnPACE3ANa$RgV(%QAi(y#~{G|L)90hyGpq){P#D)y z(a;mc6{m3#;uIEIO-6^Pkh+Sk*#J9UmRr|}KD1KARER!FQ(s-8o>`KC6+Dyx+XNv= zJ={wOC|0GUgKbjMLeNAM5}=dq!*1>dT3}>fDw{e@r&=Snl9Eo~+1S!*PLm+@bTN24 zxaj+Qkg9srEVL+pNL)Z1!{p}id)kWdc&`J|g_j+lzT2lv&R=|l9$7OiI!*R}?@y3w z8$tNPN?t24%gG68YMfqr$nX<91qCdA&S{0gf#ziIVB(?bajh`KTl~U0GhvVqhUWiz9<(fgG1D*xjL}w(T1PlQPgmd9AkBs@61eGK4C`$(ZTE5?q6(vs z4qXYW5&Oiyg4qecqAlV#)3%4tmM%bVh-EH*snYqqG(bIY<_&!GH&={C&s-2yWU(%a zPD6HZYmfqBn%bppDUc()WI+q&;Cg`zh6k}4ftySJAL1D`j1u9vzZE9wch0XlC-61n zRi_p2D^&U}U9>HGwk;VBTY;LAql37Z6FT%FL9P_r#ykenbIzZRPROS9Kw61{g&cI_ zAi3gBI!xoV3)*x@Glg?L81jBBNAoY~k1Y+Kxxg?37{^9aNj61e=i7P5F=>WtVUnM5 zpsH2ptca8;r(}Xkp|W=nc^?v$(?M~J*?-MD4F`;lJ?CHXPn~`m?r&ZEokc?*4Bk`r z1@Fwx<-Wtl2MXmURe#QH3*j#=g>y+5u7w%1rkhVq7^Ul++vYrir_zN-^yn71uL7_) z#vQPaJv0!#5u0Y=^+0t1=1uV#M{3AOuWi2q=E=ytoz@-tXV#Ug#WktQ9WrUGQVNE{7meDk4& zhl#`mOB6n_)7oe;#|Y-7^>N!*AU-l|pHStJqgDdWv66KRbXb4Vi;omA{lVX50U=Qs zX=?fZWTnQheWn=A`UP1JdeOZhb_<`Ez^}v%pX-I|ZsYD6fANDg_g>G?zJ@5UqN9{G zOa$-R(;RBQ1n>u+5uj&7OOk(%6Pma?+%Jeqk1wYdQ9x{~H9QE7!&r}|Y>{wsYtFWF zQIG`Ta9Ku*(Xvi?aN;O*^;7fYh-a2^7xoIcMm>#s@ zxA~li1=d4?V~vvBKtY)`NE8j8<+Tb|r9h~B8qTwtz$W;f=*Q;{GsX2EBvea`lXtbmlfT2eREta#+2kuBkt&zfT(Wp<&aglEpTcA7F zOPguUP18>|<%Q{H+6c;bI;VnlUoG&!aQ&(%z%L`tCvwTMsMRzS{B_pU{f16s1Vd>) zSf>ldB@y7T)G%j=W^Apy#+>i^D-tJ0B#HUgyRuiGVN?Vo^5!fl5Vg20B4f}yee)h` zgWt!RV^nosiH7w+pNlb}fOkf4OEB&5Iy!e){v<{ev^obLMcRl_a=hdrR%f3fh7u@B zy|V)pypkknKSRr!WniZia1xWVnkh520vi4(GY8diEwRo+nq6ZvdS~>Qff||`SUCJp z|0JC&RA(|{`$AwpW3XDbJhW5H@Cu5BvFzJ=aZ~Rltt;>Ktj%p4uoLjEd3_e7%olZf zYWq64Yg9iwvjh*58hR(21U&^_rizA=o<>MubHui7onOKq;d0@q4L4S?2jz;%N!pf- zZ9#yDM~aPxQ~9GVdZ%_k6bM_eQqJ%VoLr1~YLi^`?bmp!XAp1rbu~I60?0WtGciIR z^~OK7DBdajekvI0xnMVmaqbnZr(DyzYa4F|#v{k|g!(KSBW?-7OlzIe1Y91|`W)!h zfdXveMHKW+G*W%Wej@y<`n9Ahs^b;l=Lj*m34OEMc0oI@0{A8!ynpQpYunZV2wVz( zIiq;xDdUmXJjjXe3WoKFr{Ic!#)JF8}cE$yXqRcLK|3BhBKDlTZVV?_uBwy7)V#V%o~`i&QKYbC^v8y>tX00;Q(Bt z)L`V{A(T05MC?95oNeBp7?J2%I!uX{zjr->Dx^0qy4$QUF4%K{bP5B3={z}AhJ=Ngizbq8|?#9 z;vVHh0|)4AA{C)|`T41oQQ|0)WXE+9toT-fKk8QLd-Q1k1n`%{npTRsEH6fbJ^Y)- zwm*mw>AlG_hqyXCU4_F*S7c~B!O>xEEw7SG$R@49Q}`RXrwW%I>QQdWQo032%6L2- z9tb;=d%RReZ&60zQKfe~lzi~}gB^Ksg|u+n;D+(0_s#=-3WAs65ulew_dTdTg&g5s z74y>9i^Jg)0_*Ol;nF6`L`l|zWAXP%^I_k^RB2fVgj#TWAauUi^VAKYa+*TpG%d!O zJXvc7GYqwA#3FtD=mY~yQD&mfUvs_y)+St%l(4ruS1hr)ffq+B|<~?UQq&LPVf8Vd|iQP-tbFUa>@W)AQ*1 zEz(j7kPE~1lIZwCbP6?ZaH$u=Es~kZmCj|NX7lQio&jg}k)M!!lLw6vuIP%CB3#xS zlLt?E*-W>{(Qv-vqlGAF6ProJi1%_eZb@zV@i z;5>`3qG->=eW+;&c!9+)Bw$qd5un|4vBg)b{+M%wfR|c)4FTiY9NMa8BGzRjZ|f+B zI^l61Y0MSDY*b0?s1?N+fFnQk9Mg05Cu6pF(7&7+Q#AhdU&s($Ye60)k_oup;y3Uc zk&T#T5x+CEWs6b3nj z#&p7bb#8#xh~HuHJ4sS4BzwWqMG9U+E8K1Id&telLbKvgcrz!*^b!nUJ8tx@+r{-VWS;`?kC46m$IO*LWsQ&K*y zR2?z9`78W2gTES#D#O|={yKkyOb)#sz&Zt`;WOkp@Iev$E&d;a|C@5QV_Gf#HVKiW zBV~iXi!nkt^F}ycLg7fN@V>=A;2)ytRU97?aw47EGQG_>+%}=`vBf{3V9!`kSW|$j z(R80#{B{yLD^R86#35g&u-RJS!O2iY169*WRXT+ALqKZ>L~n9M`QpW;B~zAGSG7ei ztRXnS1z8$y26IDo7qaCE3ltXY&pILpV*^4|c-`{3i>(=0B4RkNb;5 z8vZNl3F&S!Ipb`T|4#C{w92lMN!V|}aOh7?@_@w;lKGDg*`xeGSsA(-{wNF3pKAJZ zBT=x$5+E=xi^l9BP`R|W)XAI}4Eq~f{@1N&=5dKS#70OjJ~RydrZ~wG z$)XFg2OI6+f)bA0zYZ>D(hj;=qB}9pZATJglwt0GdOor;P=lMIbe$r9`$bR3uqeMh zz4Y^c3cej7@+u=a=zo{IGbz*DFVZcMA^Ojl2@e{AuE#UvZH)nX8*!>71}bAvUNdUZVhof;rpPu#7V7?A4!6W0GW29RLk+~w zA(j{_h9N(R)^z?=gPzx>a`xZFG$&>P%{<%^y+x`iMlwhnHEGg>N!iJ{qo#}+IR!0+ z{iZf~LP2uDgo06L=1rb5ykJW5^x@M+b-@ks2HNRp^xS+nN%B}rDsbpiUI~bPO#MUyeVTROtsgT+{Mk`;SD5rXINqqX^y+7ylNy(g*m5~ zg8mYTlw7nj*%rs-@~Y$-wT7Nk?l`kyt5s}rPHSd2F;G+Pyq%uZUf_;N?M_I#(Ah(~ zm`xw{>Bv9sT|2WM(e^A$%%$8$t1MqsuJ~AJi6T*q2Aty3$%_Jk+6Bs(b^H6H4m$V| zrIwgaiXLATs9sc9IjI!&8f}J(d-Y+>(|zN<%3Y%mTlexezn=5oxAZ;9K^t*|@_{2F zV2Q;Pk!y=7??niY3dUh(us}(`{BjC~Ldh}G%76UeHCM?ytU~)K=){jx>?Y2&#Cdcu z;SMGflb4XJoNtK>#D%toVPw#5Qj%-?3IJLgLtM<@q*;G=eM4JpCyH9i=)B&e(M_P^ zMT>=zTWw&3It@=eLC`&#{AkW`8wdZBBkiGT3gYQHORN@`xX^-JVTmg#AC(KrYikS= z*o2f>x$UpQsBvOFyT%aL(yNpoZgCqdbc@a6PD9*5 zuTGA`sTxb%CGI9v1J!69dxz6gE!l>@!I^C%$zRil=&NtJbaUD*hPdBO$HQMrPsY6! zFPKzHF}O?ICmyueN06is`>!2h>$^V=#i?SOCAO|PenjiZ)%?G5egD&j_6EQ87>rPT-V!^-<78D|w8Tq9 zJ@;aad+hrb)Zt}Iydqw;-(1mr)15anf0Z7NrW3m?n)D4zys0LolR0NnF6i>WKJgz* zyd8Y&5=_b`mC|(*`^-zcYl-*B{=}BFZzbdRfh9f+Gk(LJh|o5EIjbi+Z+DpZ)Dknq zOtLtiTjC4y=~1Pa%2k(+EL>bjM<04l5`=nxV~J&AIhFoviSGpFeqAU{sxB=quPLQt z^6DB}*jv2=ibv_+1uN}z@9#X#@ikVSe}RqUPnP&u{9>noxpa#NjozvMSZG=$fH-wT z{AP*Y)$6qqH5DoOe$wPWDX(m=!kGJugU6hf(Vx&6o?9FsQ*l5XvBXi)f@*}+TUkt( z8D{+-h3UDuDVLsnWzIY-jW{a zMMji|O^<8cHr36}Ipza0+_Uxuk}S!qxzTxf9cKXixsu(dw*qvzxXbNk`J z!ql9g0?2MOS@+<`yga4NvZp0`saW4W@+Fe%!=ASf>Ey_GIZ-WG4GsGJ~BQ5uF!{zwNBHojvpI#y&a;Wg_M&mIfdRq znKj7Q1*L^0X!qnaOHNnLO(l2xB=XLDKaEKa?5q{3PWBVJS%NGuO+XPSJ~WE-CNCV>kRhN*I05r zEu$5oz*P|BI!j(p5Lra$?+Ccjk~gU?Wf(10>BHWz<%ybZvE;4Pq^~TktPCtC&?Za% zOMwE_WGM7u-@QaX`v~DXEqRx`o8BW<7cQskX+*g^QWb?uoh9#83oXaEw$zjut9e5Q z_sMiGlQOTu@@ksvK}$X)w@~Pha|JIsB^>9%56y1Mhq31}N4>L?O}Pz8QtP~VNDeYH zJDFy#w`4;IOS<@H${iH(t4mB}ORG>_YH5l`alKab+BDNNJ1zNmXqpMj3MzfRp>eCL2YqQ##pm_n~c~80J+~l~#|e zEUc*^qpjQC%#bh8#r_jrV8mhJ83wHqx`KmJ*fuyvYaP0@Ndv=TW$1z!(yjj-@PP(8 z)(kpl2NVBup~c5sk8X#mr{z2&oo5t8WB(Y{KNjn8?dtLE>Yg@rMt2Ssg%X^n&w2VG zQ9U~XMP4qt!lIs?$pbm#Pr`b#f-|}l6M}ceQn#>rckI{08Q;@+_EJwb-4j*M-s;Kd z2BT_EgLGBTaOUr$@N&_0PgU;+{Z)N{)Bj}Wd5ZHq)#*17=}FJioO-6yp5;8VRlAGs zhpP6$Fht4BP#C73IcgoClTh^>0VCBj*LjX|o}<-xpnyU>$2$DUQ*;EnT%?})FkU?i zocNBxEyIp-wyZTvS^|@Ft467I6u1qL_ zQiRM$B2*~e0sOHO%4Y0<^6gL=DpiF_i$kUAolrYtCoIF-ibhzuYX_XS9WH1CyvPP# zay;Og;{h-8z~$TF%AIia3=gbV|6k{U8+O1=+hL;zrf-K^J+Nsz+%C4m9r$}!ESvVY zz8&syp7+MGse|gE-!`}>(Tar!5=$4FR_XfvceANx%P-(*`6aw9zk=_v{JU`(&#zbOY>3^}tgN@Jya5dN!z|9%X7Kf*n5U>h8&*ak-eP0+H=!?XbQ zi)Th7bG7Lm&nz{~9gQr?ZlKjS!n!6Fi?Y+i5>RfMSR%?y6YE6s!jfm~U|q+j#~6>h z8(6n(P$?Q&uRScSAfujThym^XOP`!x&$@}2sT0y=1M8oTola?Bne-ggz=pO8Nm?Tt z=3yht@HvW}wz#D3WMgNf?O@{?*!bw}Y(h|Q*%_hI5p1H5H)cS%tMVULfcS`dRPK0QS<6h0QNvR z?1f6$2aDhhsDgJO03SgOdtTU`+J>hKD2QFp>a0#0UYuH(E z8CwABST$VE&Vwu1TDX#33s{Jp4^rm4!7-hjU2Mx^0QX!CDI4Z8_#>a9r4 z+mJHMHsAHc4cuuJW(;y1L0 z(YSbJDoR^%*!G&(nx(^W{CJeFbtm3yS_8Wx6}NB|D&{setC3y35#m#wd9Iy|_tj z*v2MYwSzs>$hK@_a}cs^hR^h{`r;j|QNhlzVX}!m8U#&N1ARJb_}bvmxvCqk{F*Mv)J?u*7lZVxl?`aM)m@dXdnK*no3ZzWNikMnL|=H zGPERayYwG=5MkFgvUjsBzl8&KHL?#p>=PPPf%GwC9Y~>&f;Z${PJPt|Fo~I;Il}b? z8aA?PXhAEoB7Kn__VtO!QuDX%n~hNO1sk9f+P;lop*f6a-=X=F=#%jGt~%)IbdQO? z13F-@4Nk8guoro*)MS*Y!UpzJtF*ri^f{!5F%oFS3sC5*q+7 zqs4fQ&4Ab0TzG>O!<(!O{=)+B9=ibEXY1etwjMrY|ALR$KKPiu4xh4r!)NSW_?&$O zUvM4189Hhv92+7jV1@5$ZRU?_JAd4<^CywU<~uej&#_=x(si1?lY3_D;2p9}znRv+6Z~dM15fm$5o_R` z{3iB%P4(uz`gpJGv_c1p-!6IM}vrv{J;X4)u2U#?8u^85g#j<1;&w4Nq%V1tM zkab{L%*RGBKO4&uQRX_bsVs@D#GV(jE=qzsf;3Uidex7@Hd1%fm+pik-2=XykXY{kW^K1sV2k@-lig@o^1&d`3n+AHTeTPskvL zq-J@bkxy#iQ!~gPg{E!b(=!mAXB+s;43vjC(;z1nTI|wHGr_o$5D8q9>59m7%YhMfKnQswWJ#!-s)uT~gFnG-6=k|tM=)=M z?XtC!%`GoQWJbt=RvipLbi9@`o|aYhP|d^V6(dpo2@yC+#A=IqE$rY-vNs~r5(6Xa zAT@!Y-pH^?W;r!NVok+0MVZ#>Nal@ceur#A6QUnK4~x*fbW*btN8PHoD&fBT^VpA7lzRG7<7gEE#00hWcKZ8luM2ElqZ817(0;C?m~wz3@9&4y#HGy?w3 zMxvt{g$g|eeqecUl%0+WJ)T*pvT`|ySb+Cpi+OLhgr~7; zp22E(UslWev!(oG?3cw>@NBk{4`FBX;aDES&gJ9TdAxwF;%Bh)`BW^=Vi)q+>>@sw zUCfKIT+UYWh3pc(h+WE;V0k&aji1Xl@k`jh_&Ron((GD@iO)go$zh?DVYc&nNEsbr zu>BlESpzBBf=OpY2&R6}JoY{a))6o{>k};WY=I_-ZrhP_fz#j=arP4Qr4ui)Cfk%~ zJsneWh)hY;O&cA9fu`U}3_Bg`fwikcanUMAZCXPvzGoX>FXwIN>)Y9ovS9q!piEM@ z`RP@R+O35&q}Mf#{5mnT4k+rL+DXCpXG_1V=X2;!9$6p{zp3>4jjfShoL^42yYmgx zSBsX_f_0)gVz;^Fu{OqwhPF3gj{VZw+b^x1{ldtT-?|6t(TbtAYR55P`iTvg*3N)w zCpKXEKQdqm#~859Eia?_(*L>nN;t-RZEkrUjhFVnXS|f@dg=dZ(}l()kL8CtQWxfE!pN)UzG11J!B|dlXF= z3OjoO-eJ4o3$`1+XM5mx_9WBUQ!If!jq%8{>{Ql_tL{bf^&A?u7uXb3$`bZ6t3`u# zK6{;A#NJ?Q*_-S>_7>ZU$i$k(%<_;u`Oegpf3-^7098`y9B7WO;8js3y@g~nnt z`;*^^{qAFj`2FlKe~2C7k6?KRYvE6D;JY~EPogn-7RxVk$zS3ce}(J(4J^OI4gM}S z`3Ky^Kf&@>{3QMz@4|oQUHL)YLz%iKz#o}|W}HkN9Z0A^J-=nlvN4+hN?9E71Lg}oq#r$8)Eh5ne%4&;4c zB&O^|ydRWeu2RJZz!HR?&j-R9ei~edsr)TG3-09EP|pX!vzXSu!H2?Ud>E$sIXL@p zIK)RX&PTC0jB~p3JeGk*r612{12N{Ajxo<1ELZT!7&lG97-=fo$fvQ}vAhLiphqwU z+QH|bahlD3;AgP|d>$H*BA&pDF?TBEr}6oGC||&b@p3+#FXSV61s}yL`53;4=kY3j zIuG#id@-NEm+&*N-*mo|pUIc;S$sL4i{(;&Irh9lnUo5Mje#T3UHo6L5}5kk9y91>c}(r2#tx0o=ud{2^x-nFyrQUtjpS?hG_r9=@fl0iJmzbaom= zi7vktA~>oR--NR~%pY;yA&pUQF9Dtln1g?<_F$!X5l!xSMZ-23`+)`3^<;9$+4UbRpt$oTDs~ zOoMM1j+5&z4nntRB2a2Za4+&L-
      zKC8^9`{IfNSsq`M&*Rf8ZoUPEVw1-gN5zwU9(v<|sQ0GTeWp)e?(Vgva^U z@D2*d`}|w@p8pqq=ik8*{yn;`k60}KiFM#_vF`jgCCtU(It&r0Y+i#8Xo1=4AR3i$ zfI8X}jDo#65Y-llK7me;1vU0Kb_6<<7!@B<`5?VYr*F-0auzYXGto1?}fdsN# z9c_M%PZte*jzcLsr2Cxuq=d;4avK$1L~ev=8%l8?YY8WB%NsQ4={6HnK#0PSSBe6{ z$5&t+NavF2wq%UM=bQ}?i;oG^99?|VZ4g7X-X0NCjG`B3PiC)G2PLYFx|U(%G-P$$ zMwp<2-ww|9HlZ<4XP=EC9tA+eq3QOB4m8jM>&pU7!dH={`7|_M<$){%JzTWU2%rT% zlFk~0yA2UC)yzw1S49~7{PRt<;@C?~(ItdjLJ+x*YQk0`VpXlVu~kIxM@tF(4{-DS zXodbn8+icD{(k7g55vi55=Zc(kcYgVgmN(zVZ}ni0--^zFkp=^;X2`ldqo5^2n%+J zNO)32!80NbUKjE3j_|@aq67RQe6U~m8GSm;D>|}dk;Hlk$xaqsSeEF@hKg=1PxN53 zMNhUsq_Ab8H@j4%va3ZJyGf+8jo7D7^i!hU3t|sLG>bTYGm2m(D zaPJ|Qh2lvc^vmVz9CKQV=9C;vUopgyBg{-rqGFOQc-bk+-i zvH~#>!;G=CyjMEwYa}Cn%@!znPAJRL@kuy!^iheAN8yU`>AmQctY0he>0?(*=9MAY z-Ime%7GoepBA&Sz%ZvhDi~&oGMSSy+RO28GpM69=3>V{JtSErf#RMq8K6AumwFh*C zM{xkM5yQ6Ow2|H-)!9gcx-kZ@APp@;8okdQD8)c6t)8EYI1EI?-I2;(I}uCHHv9%| zQS@D{F|X#;(aI>ZjYAx?X-Ee}346$XrINwk-?R%M#2kna^Kd7HkRpmug62V%sDPoO z62^-~xPwY469Ki02#`l1kujE#7>8T%3YW8mt8qfQk~9txJ-<2Zj)8n6w5g%UA!;TB zG3898vcsz6Y~8PSqAd~ez1rrMFWN=KVhO~GYKRlHkR+BPxmO^PXTvZo=ZOo0$i>1@ z@F98~5IOU>$X)c;$XyhM+(rK!xr-6G)rj1sh}>m}+&V<=azySjMDE(-A=l}+$X)W+ z$XybK+$H}Ux$6bi?-Vkj@}Gtwll`EOX*?@PO}DE}jbd;?Ml+m> zS@HxrUqEkDfoXpSyIpX*+YyXe#;0baqwwcspi}BvXTOveBh<|$k(*75JDp72sOfFh zVL`Y$WE(6S<1JSmq)~sbE99GL=ooaR;oxj@wTpROj#<3}OuyOO@&f*W7{6iLRI^cx zn;ufIn}TSKZY-3Hpby#s zi$oJF7LUP7@i?3>o`B25F1T6jhI_=5aG!Vzwu+~rSv&)8V)<+FEPOAT;h@;XqlgxISalF$4nQorL6?2K2u(kV0;3P< zJ1oA}iGcX=SiA+vKViDV=Lt5SC$#dJ46zLfvU&;fQ4k+nZC*ybnAi+HdU$2Oh#Q=X z8DcV$QL$Ua({yV@OhvPuYlkEm?L(4`U`TSv2}ussfiEN`;k`4v1OzQIWJzwm_k4)%y2;Cb;Aye58zx5Y2;q4*WP6~Du; zVn1WzPsLLoXh)&e<|#V}!wx_M=B3FL-qJ^y9Tnc}c*!}+KjydfkIE;e1wCXLrQ9B- zl{K+PF>pken3&SU$0;{y!=_Un;nyB+>m#?YhufK)gXkX*fkzyM9_YGHMc0=n0rC+( zOKJ*vH(;ZVzHk)z!Wm+w6J}qG<4-~%n~FA$XB+r8@-)-Au9xjjqZ#`HX zK%W@sr`tsxOuAd-H!!=(O7w_XC?x&_zk&PmX-#5|PYV=h#i#lWUt(`xd_{5ZMlsJ9 zS(X(Wo#pk#HnBS?M~d;q(ygm3{Cl4QixMo0GLI*pgK2Vc%lctO#5>l4jYRZR})6X6z7)vOD`b`;7)s zUufKD>s6u=x@-0)5FZ~HzO*W>mK`imR{hjIHaJ7#Sb=2Ny%#sdfsYg_odqi#F zIuv1D4)lBd8^G=L#klWKkC~f~e&~0%vS}mqM5`WwT`jO=BzR>sbd)jBMaDrd>48+~ zg$$Vpr^!x`CH*i|o&?imHz<+aVLm>~WLGGcJ)lzdf@LxVR>|IQu}p_`vJY&K{ooea zAMVEI1M*~eN)CkAWfpuO2f>$eFnlkEuy{F)b(F(dXE~A$mbq-09L*-k1U5;IRpN0j z7%h;2$sHZ62$i>?pi2WI5jwnAKL}td&zlPI$M0v~6k<#zeAy6pyj~)#({L2fRS`P4 z=wphG)jJdQCmL6~y;rY_aU_VyjjMNv6&PG%;R&eE*2O@h4ysbUhEl5|baMt7neD=i z-j5#VYO_Q%iIoE*R7IB1srN~KmtXf<0~*CSbc?Mwg`biR03uggEndqTaYxI?UiU`u z`gJwR@0#q_(9IC{4dx}cgNlce!S71N4r0~xc9)-JK1ewpVr2m&$_bDxCqkM$0|v-R zaH^aPBjgk)kW*o%oCbw*I`Z{Q`F&2k6;zm$t%un^x4 z#yK*<;>_3CN0EdKHro8YR9x+7Rexkh6s~b^S}Ho>Yt}T0>zc%kS2c8pm+F9YkGL<}@M(UdUOZ5or4dw}j((Pbd|iWPKFhGjMQ34v zH!N&agwN#>4^?Ej=(&}SydJ3V85K?9k%}xUo$B>_U|GFrn%(b8pH+O#8KJqKXr=U7 zbV?|%1SYRSF}xb0upBF|fH=7xI>~FHo4g)U%N`>`8^8iD8U z1w+)K#aOigmZ&Ml6Eq$B;qPt*DL}|283@S;LMYni7x^W^=+ACR$w?|r?A7eQ{o=*b z3)9u}nT16es_^W>qBB&etWbK>UM&{xN0l5zqdN7wGU}!ckd7dVSURVBOI$otW}J^(TDLGa6mptIZpJ@DCA zK7!iOfIMn~De^J2hL1y$+=CwODfDd5K&{-1+VVVV%Zq3YUxq8?t8krs4K?Le^lERz zbMhT{MZOE~$@kzh`92(y?=dOgVV3-W#mbMEPkyZUIT0ccLuckfOE}kgBaUIWxXQjA zGy-)FVy`U>t{M!ck^!{ZG~D}Mh)&xE_cn>= z)R{nfGv-h>I6VxE@po*70=qM8Fm^l%JHF7YZft)>r-`W;neS^5uc;9@_v<()P2EMc zyJ$=)uj*poA3f8#?7fo<)Zn+susSzP8@LfH-_XF_PFeiBLA+z14K?sc1>Dhqfeo6u zcPO4p^{dzE?&WHT0xwr12x?HI)+FA?scqyO#7oj}SlTu=!6QCu6rVJR*PZ%u8<4G0 zcjZ;7fRA~N;xj=>qL%=|k4YSQhDNq!wa&b@|J~g36}5T9mrdg9)HF2%ri$NYYb;xj z7e8bgVxXydQdT(-r!bvh!0mUZrup5C;>QN@tKVHOeoZiL#7Gli4eSpE$TU`)%xijG zn_HguW32i|db7AvO}bMYKtdi;$*MiOyN-R1v%8$xBgksuj5pkZUW@JZh+bJ1fvTKS z)KDlH$cpksVI*3S72}KX@FxQlm9mvtaVqen5g0dnU`lb8Cm5V|@OSV?T8?DcrT=>JH9;!xAZ3xh3l|C0;3)Y4eW5L8jv3Ca52HDW2Ejtd>HO0 zP^{z&@zh@j@%{wi_j&yeNBzv}R~9#y%&c1P0~Td zVf9E0UG)x?47 zY9lSFPFqHh{H_qBl>u%HYF)$tcZdNI!~mD@yVZpdVgOwNQ5}c@E=Qp<{4QrYqJ9L+ zwumQ@Vqla%f>;nuEQs(%IV_050Wrja*o4@GNX3HK%t(JswzWEnd8541$bt;NMbx#L zVT9jOq|5f34$TnY&`%LAR5I-LB^e}mR*-C|LftTf=Qcnz2HOqNo$A*cq(xK?WmLQx zZbd)y9fqafV@&V^hNVBDpZOX6%rBTt{f1HZ?=V>YiBb1Km@W^)Y>Z@=pd~+BlW>uy z!)2NY*J>`_LE!DEv3T+TOPaDkEX+zkJ+E8|fmct&>hO_P32=*AlpV3CK=e03x zpEj1gu8m{wX{WQVwS4xQR=`@c37l(_xuH$vCu!4oFKs$MRXdZ9(Pr?8+Dtx2o5f4D zIeeLR7QaB7%hzi2_!S7dMJwVDXvKVsR>~W-`MgOh)>WZ`Ky_7qtrhs#eKg z!?riIMf^i8z<37MW(h)4AGX0)3p_%KwBwhX=jTv?Od@~ zJ5Q|8R*7@9^Th=SU#DFxuGKCPo3yp!KJ7BGRa++-w9Ccg+7)7tcBN?6P8Y9g*N88) z_2LKZTJgJfooLanmoDuF8Kd1OW3~0tqunf%wN0|S_Ai;H-7ZhnHp?vS4w<9fDaUDd z$uqROzf^V)X# zl2$KYLxK5FYn0z=P4ZXmQF%yvOtxq{HK8?Vk=iaTUfZoDYkRb=+LKyu?J2E~_OzC% zJ)@1#p4IZSW^Ej{jo0>S)3trtZ0!}TSbJ3~*Iv^C+FKM`u%*x=zC&zmq~|cK!Q?jb z2xMd6$YKvbd<%WHTYYL~zw6M@#s@n>2z2KMAh88{{SBVjYuZs**1FZ3m$)9nxa6sV_+Yes8Bak5GM3vl_F>K20L#r$Kw_PBe7a5{?qbjmtmhIH!Eu4kL6 z6gT4UL^60CGL2AsXkZzoOlgh0+#?e!Fn>ZP?sHXKlZol-xU`Jm`K{@ZNj}XZJC_Br zTppR6rp{q8>GDNXs1A{#l`z(GD+@{_s=FX}G%w;lms>lXa1N5h|b z4C8t%i_zm)JpOjj<5_pz!_u)l0G~tj4lG~yv$OP0Du);VdMqil78JxIpiW+77=+GT zNN1Ob!!Vl1plE$3zITN5GZZZsy|oR-l#&j!(u0Rt>GshS2EqC1UfuDt7=~r2gGLlB zEV%L4$Or~z62r1=({K1qgwW|Eme5=JF*8@kRC3UD-qxXUVdJ3GT_l7}wDh$)pAQ$0d^mHiD2f~^9X)ssMf-)Qv&<87; zL<2txU2KhJhhQuw<$7?#{AS!Ry^$IlzE2t4eb|PVhi_Or@rKce8^_zQv^R`{R5a20 znF||&smx7bci?cr2!}T7)WIPx-+FLpFK?c3d6(bxyPV~*WG}Cd1#wXO<;~+SAE{0d zz4~1(YrV!mvknu#P_}{r9J42NDJH7C1bcq$m#u7k4Em_AvyRkb-~&xDow47ggK3D@HIjrtt8O+O26 z*XP0m`h0juFM~()1<@<81Lii~CA|*DfAdbX_j;0Qv8cie3;Ub4k4Evnv zes%gHoKAKRO4kp7&M|t^jvePd&bW31b$aE|5lp^GraNjm&ACLE>SSH{^hWY9vH+i= z3ezikE;G-`abFdokVAWf# zb{&0DMP5`2y?CR%RFdZ;x7pJt%TfZx2-_OkcpSM~{Z3r}c8JjLMj^Zp66wpzoT+=^ z#6;BS=$;-qup+t`Cvr9r_6A#jh~9OF1|>Nc5^={B?R!2EMW5IiwEaQj_|1yI~U;_{^nKxzt^oTYl&kal-~kvbt5NK9Q+Ov-@>h zct)`K*Vdz~J`jN`>;SGefuTQ&q<;+Jv7Dsugs%GINd8?&{@qCWT}b*ToqH#`Iu(!L z9@jz8z$LRn*j?gaH_*n;>V{|)h4A`~FjBbr{su2w9G*tJo$k8dQ?m`1vAN~H2^!hDl1r;vUA=losqaJ4 zc^RVgR}s(GAXR@I`s;6?y?Pz;bQM~IpKb*9w+(`QF2}ffrxBxY_J`EVe#4p>kts7o zpMhG2?1PBuUX9GVCqbrp4MfZ!#H3?;2{Gx#E^QF&OgBOFcR=Xxp;Et(4E_KK`5|=2 zXCK`@OH3rBI@rOgeO@Ssgs`H2&CB^ri-t^zN7=kTHMLO=ZQyZYu>Fzp%jmr=73q?M z(->oan!TIT6w}(oehb0q<5j_-RHgzo&E(zFx}7NaXaLQR62QU zfIW5KO-*GpaV^9J!_`!V#f}@9`X-2GMpw0V*;o3`p^u~Qa4yOQzg^>=EZrkVr+8pG zy-USVbF4>>^YD2o9+@BT$O42?_%}N%Dk~;tz`!^Rpw)L$(C|IJ7>}G-Hajb(qIhDI#@+Plxna?>_E zBF5+T={Sj-z9*znP9mt!-6W?r$}?LPY8!opmi`6Gz?b0Gzk*o(Yv`nZgNpQDRHW}9 zQ~w@v^dBH!{}~i?}MR<|1*>I@0n z4Gs1fIy`R}@Rs3%Uko?=VMM|KBZ?&%k*tdm&HCVTfDy|E8u2X4@UYqVEHu2V3ZKC%z#L`P;1}1r8lxFXzdMF z5GovC@S|ky8&I|l8W0hJi#Gk+!LhrK!er+fFL3&jNhcyq2Ktv;fsIL{R4Fy1LCzu` z+qbr(>4OPaL78(Tu8dypn;v$bPli6z;FHmUFq6@?lbA@ zUZT_&xRhm~ZHlnJ%O#6W?l6OENVDTI8pb}k`8K#K%?{l{fa`+a$KVbMzvXk=_Y>U9 zQGhKqo#k9ia95ONMfogW)N-Hci=tZzSyr^q9UZ)Q5TgXy^2N~AgE$I+{c%JA6jO^% zcin~QJLH_~cz--am>$0;95>SgPuV)?!|d=(RggZNWVcmbFQWGkMo-K{dSMup0v@9` zBp9iXZlu9DBOS&YePD*s7tS*JL8;Ln78wIzv2hBlFf!qMBMYuEvSG6^2<|rqqkIm5 z$Bdz{+ZYCWjp6WyF#9XY@8C7V_HyL^sdGcC=lWRl!GbfhT?%cadRZIQ+m>y$stMiW7+xl zB9yrw6ZSg_=zHcseFGi+V-cs~Z-0-Rx7EYG-s+J>TRr><{N24ZdTZ2Hg17aZ#x&54 z>5ys6fWgKr$T8+Xt}z$J8ikN=6hnbg4ik+^$9I~CA=4Ik6mX0!Wr>4u9}GbV;STAI zvNR2U%doHj3k%AcWO=)g#yAJnt4I_(V_!ii1!K2(U@oTOm1SsYr(pEgBm?wPAkPCu z2(CsjN}dfy;m)J39+;_m7YBPQaJ2#}(207TV9pa@kkYyV<-d*fC}P(_ALBY0Wn2$a zjEzuX+yWOFx55Tv6LNA1?;W~aU~jG~MuSUJ=sTNGl{#Q(TY>H*&?J}pBrZ`=wl$@d zFY2Q!#+_)r?t*0Fp5WJZBxCSi#RH+wu(;L4lMrY0mS>ms>P<*{wI+EE?hZlc69~7b zKy+q-y@(X5V>tAD8ybYPZdSzv#&(D|>Y=Bx4SE|5C?wlpn9+!Wu?;tRo?PYNGXt@q z=qWv=Cw)_hNA%k2)oa)EtVp3eRf)Z!=L zBx6@_+iq~tKN;yPGZeQ?7r#5(-=ig~dm&AGR}^Eh5{q|YaR=;d%~NbzHbbQTxG<3n(25#yAQ|Cm4ltJBODEl>6mmEXh{!tOuPfM#0NV*2yO0* z7_XvXdJT2|b#yLoK$KxecNpy(bk%2WNKQs0jM(Wxxut7VKDiYMc`Il=!zII>^KG2( z9VFAc5M#UtamEM1IWY|+94~O@%yn>#>((6uf35qLZe4H08M|)j*6vn|@i7wq6O8LV zMGQZ~S-%L*h@qZ~{#iL^#;y*<+#dd+Yv6bh`U3ypj?-Q+>Kfz5D+p+Ghrw-k-Ja>oY5| zBAgms1&u@$uSOK>z>TGAvE++D7e!yJhV>ily1dz`Z?x-ti&MYNX}{g6(`MCSi~2yX z*BvvpWWgGbOb(!H!(M@6uUwO1Uwho09r<@XsZ&&%KN7|FD*9V_l|M?Aqo~{{?`Yj~ z#|-sZo$-jnJ%~eEyu2@_B&J)Vd>~DIj7@Ic0iV#y_UA>h&EMMgh}||J)E13xDj{>O zVjj&_F}@w7tCxDGhkb1n8yfaqP!hZKaq8oPXUQzd!OJ;hR_*r3ahxK3rh?-Ca{3^J z4V!L1rmhK{7bAJfD#B^hn#!KZaOqb0U_dD^@s-O?KmXp+=M1NMD=<>|*%r zXz<+4FqLlYjB>=8K+Zd7)J0L1jrvF7qm^N!mo4e07*42_(6bVshS4Y=v*khBuUH$g zG^-g#I4Y1vRT`t0*riG=#pp3QjtjLJp*Eu=#*9JaAG6cL!Ro8ZAV>`dg6IWj zZLNpRjT2hUa3+r0gQIAd!wJ;7J$gTD*}JU!r#rOlFHJy7U(pO@j?#zHNcMq8J{`Df z$T8nUNcRg*34I-5r+M^#LHgxhIvVYAf&~TZl(e~JUnt^b7r{I-WCbRF%F6-o4xo@Glh>ad-I8A zD!3}tM6;h5Y7P;j%%P&l941zoIpS7xq`1=@CGIsxi>>AuvC|wY zo;35sbLKelnmI{)g>Ao^Q^jF(niS@Ad6Idi9AwUv`Q|J+*_-NdF)QSUW~KbXTqOT6t28hJnqe-{EVEimGHbLhX06uU zT&iUwY=pU1xyR*j(qTx#*nYBoOe5FP8La*NZs-dA@rNN*=+XFd5ElIj$eD@!AS*r$ zz~(9QxX;<@5Ap$t+I3h|e^9zJvgVKzYA0!ENZ3_hIB(E7r@Gf&S^7_3{;P z{Vz~U2M9b#rq~Z+2xzR4!^^c46&({c{_)uITS~=Kc>%XKpLW`m~cYt&^N_ zVyE?Mz9x20?s=U|W+kodjb*K>UD@$%^S?iUpCE}{tsJNAxvx5>v9wEqAP9m02!e}b za-N)~;=_6WB0Wv|(--+=y8EC1@t^;ZT`clt>0bP>n)f@q(R2UNVwp~|BJHorY(`%# z^Km}Orz!hP7XBIjDG03OGU+E*W&bqIFQAsd&tM=<@}+p4XY+D<|C_=ut=lxECi!fZ zPRcBwi~K}fC6{RtLw}mj@@3F!mWTaJ%Cr8nq$rP<*{S!YT&8LNr~PC2BWbo+jc3_J zOlC<@i2dcND3F{#9RG$dp#w#kl<@u}n;jp_i9AXmyU)E^e!aV(09?(X1X<;Y|bi7F47ukH0zMp2x$yqW#O}#=>1qohi znes@CcJ-{*MWQJIpx_z6EOzV4Jycje7Vm*8(`7RIX9|7F%Io@S;(ao`1nAlPl&|0# zkbQp(67aDmHh!-v{A2}k6GR;>4C(T*xVTmi)*<7~{}_H;0jK%CA!n1qd*k9snk=Ee z1?AOcb_rxNb@Vtr`T618?-WiF;^2{6Qge7wKR7hMG@n@=<3zWJ$0#8}c)WCg4R z%XG?c+WUO5P%sex;jllnI31rsJ@|hj5L;kXC|<%;ho7+i7U{f%cXRPzIQ)2jI22kFqBXu2KP6Y$ zY1Zy57>6g~I$wRWgz1%o_)jjfS(YrtRaTz)Ai9!VSMUgk4$NUFf$K2>!nesqzJh58 zq%9W71WH4Xme)wmWOkKY7vc;!O2D*B0erdyqEF2@00GVwpcYJXc!5|KFjU#;89-c> zved~kNBAI?UxRZoZnFsS!c^`V14kF(f7eOOg^_$nru$OG?x&r_E z_Ws?jxOe|<+hcmd?x*>2ew-{%!&w)~HBd9kAE2y!%*`OpOK7Nm$A<_pk9afo-_qtn$~KatPuQXwvqY>r=cgXcv$$>&q<4b1i>c_IHXR9FBs zDf_%W67?}#7Nz9l;>ss6v>6 zmYLFY9<1y{lW&ol?cenL$DS8`cmlms5Y=Pz7e+$8>5rL#BGiIUcGALvF!$d;N2V`V z7p=Cq15?tq2A`wrqD(LPAl<;^f}YRjt*>NH#Z*p{@5NVQE1Ih9-8CRyxccz1AYL@B zzc-nzE>^ghPTe%u+S-|#=;FVGLhc1xRZHw+3zj!n-#VOJ7_c&=Js3d+0P@v;eYF;; zXJ(oKB60?*_QQGU;Cu?lj~$ao;g~=vFy*{QQX8J-$yDj+ppgR=m;EDW%e6f8H8(r+ z$*%_p)Kz87y{P`PpiBhBGyS6K?rnAJz5!T`0Vx*&tNS$=fR=+q1=jlU)iE-bUmzfM zhO4l8CW^6MtgFk!BQoxfv$-*5fvJA^_T6r6i*}4)G_k=}tExbo3^x*|HEhQWG45lj z;+NsOs{cb9#h6E1y|qHR|Kf0e|M|iDCx7@d;wzi@N6d8~Vv~Dp#3S zL0k&mqFseK`RWwIO;tiIUYjj;+!^AICDh1Wi%7i-t_W9R;Cs{7GHlY6&L*L>GE4*Bpw>}!6(2mZSni> z=FuxOrwVR4dtWMBz^h9qf#(kb^J}rpKLF`k{_J9WIU3@B!?ZHc|J7=@Ln$x1`X#92 zXw zxmwO?`A@zIt@)W+Gp*RPN!!BbZ^_ftIWDRgllD#`S?FRttrO0Zc^)vaCo1~^c0}7< z>-ntUXbZqhNvNGh54Fu5%rP><1G&^Mvj0iVjIHKyhCv>?{3g0%}uWvc}o*$zRstJf?ILb9`FV?sl1pS?b$5JClj z0U>JvoR9|XcCB(iA$c7lR$^4kgK3vp1}Vu7#$(fJw^_!&)dk{9uMXyGw6g&XnRVFw zCDNMqgwseZnnl*w@pYmQJ$&*A(eZ&72jVv5R8mKWJ_nJ>vMl(3vE-|Iz%eP@;y zrxv5~E?>Ew3PpXpzkvSmIm{rmcJ0G{k({J@4`FQqBYQv;;9Oo6riRDYVds#&8bRx) z^Qlh`15J~nIV6^V1{%?#Hvt#X+`!YU)DV_rxL#%?HqI2GYSX&#DHGdw=7hYXq#xz%>Kp4O=92nep2I?7Gow z2CCWEt)c4sFeHj4**dG4AxC7=@5a>gV+|V^Nq6{h!=h5FeDWH*yjYk~BHQss%`gT)mly|K(Q2t>v`x%cy$jS=i{w9( z*~-&!u~8iR!}&9bC2lXFG90g%U?1iYaXV~T5?iH$jiDq)SMmNeTLd@g6oT}H-E5HVgmLNB zQhL47-s#Ivp?VcjEVg7Rr93~w!$(!V0MN@L$3b;z*FyMLRG8}xd6}^C4LI4ygYlS* z&|~MCAKY^uys(SAg8^8y*CL;1iA@w{#${^12Svz)KDwL}+R$K$x!k{^Z#)foxD6L^ESOnq^_5zCDcu3*<{&UqvQ8 z{qW~u1;HtBiT@qOl=lq z^VVqCt)*X^BcN<#%T0}D6zXimbhHDyQ+DqMe*?JDaPXi%JgJH8(#pq+gFW=_Ug7r0 zK`}`dsa$Yk`N9wsh|5kZ_61=g_B|bS?tRt32}xNz41pU4Rq>oWT}fmhi<29&wHOKC zd99u0VWg^pNlR^tau|Sm3wWyvdryvTfQ}1RU4sbUsJA=#In*G5t~a8H{<6ki5&jOr zC$`Y$VU~X3qCYd*Ew2R2GFIzTU!wOa5Hk>0@{KRe$*-uSFNn#ns3an)(BTzgg|b$l z<=^NnI!})9bl`rfidi{RQ#4yXH5w8TXi)`RAD#n>atTEV6_r?^C+pC7a{Mz6v?TCR zp@NKxb^As_x`%wv{3Gq2A!Qoub&}Xk=_*ODYFs73%Sx|F;4qOUckHO3o)h7_PB1pA zKg8`z;@5a6cKX9n@DTTbhu?iiu==`6!GA2aMO#!XqGVWnO_I(&Kg1;VZ&U_<82^Sm zEhwj+^KBHXF&<1T>l_@6cO^a$72!+1qDKhN)Xi(0Kz?_arM=3o+z#!^Kul^i%kz+| zi9!+7fs;{(n^0^XIHdEXbfb!oN(cXlW((nL#R2dfbnS3oIB*oT?C&;(fc^Z)tjeBm z<7?lSM4U-d*N+$MuxII2yp&NamMQKS$B4k^W3LxH^p=x#G`^veOxl2cvD$y)xFd)v1!`jc5cm%IrA-3kT+FtT5oyT-QvG}qY9zoBcac1(G^Hg=6w zGhhV#4|k32)Vap~c8jsJs&MQ4?Gp3JwY`B$>~DA2-|n!AH~jJ3za3wHJHEuNy34AV}e4eTzWUZ^EiJ#@B zPL@qQEVtoaxi#O)mvOAznpb5bm&$GVQ<^$cZtO|(A2THy7+{0ZrW{b-t3%ag_XVUXltINfVl|l;J59c}8x}E%Jx@L~iB~xw$vwk939nS$>d8 zCrE_{gmHiT?fbYr--rD$w#Z-6q^>+A)ZAKLYbw{;$rVO&Lkqc~dA!~>t}%?8TE&~0 z#B1!~hQ=^w2@^w9u&J+nyEZmf)A{t(i98SOo2c7O}CgXXgng1p;uwmBbbL5J}CL`0;!+Eiql}4)Lce^@&sye5X&!LAZ6O#F2 zax~eFtk1+m^L}7R&V9;zRShfG1hm?+-)_*fRv#AH^`TM%sgr7L{H|OdQR)T7Qc&S; zM^>c^=t4&fd07*51<<9oJGw*G5i0x9KM!k;c5$iML{;!E>*v`H*pDXIBPVoY z_ez-V2tGdK*7gv(*Q#-{-~o=nMjGr;e0+dbf2E;Aj%_?Y$gHGW50(oV?2~YYvi(@>7S&;)ma9Lde%QnikIoflAc6_&#N&em=XE- z1Juv@b6Fx_Tzr|$m8P7Z2W?flc7Q8%RA5`^sz|CL7;*wpgUoO8f3hQ{~_OmfVJ9&K*~xmrMMK9_lvxD1A6f84hz4E2wH#W^YMJt&1t zC>Wf@cIlQ>TTFLk%`Mx6%Mc(Q2T7<1u%MYXvx94M^P3!i$+*a8t1{K@;Rr}K$Osi% za|WccA7YHFYhY3VQl&0)g3nRp2pCkJEc2pBr~dv&7W0+*1RDfledVBGZB}~G!v4CE z4gBc!Rxn2#-2wuv!zR7b1({uk`g&@-Y6CyRO6REB=oYs$iake=_Mj!XU`s)-55%z_ zoV*g!Lvh}b^?(1}bPFFTOySvim?4sW?A#s7QAR7uP1eJKOso#8$mE`Jf4?EI1=ZAfkpYA<50z!5zJiegXd&7$~o?vSAJMqy2 z`f0YATQLxyq9?ILB8IezWhpVRlhlbgPzZ;}!*oIdZ!o2}k=f{g z)jD;fO3N@7D`lGCVhGQm=!y^C;%iL_VAKz>MG=^((Yozh5ilk|I)#$su$Ue9UdS4^WgpA%V&o#50C%l&PKXsP=%&(cOkRnB=wFZ#&ia!>EIqu0OFo9(K!PVLsa4aRc^n*K5@cLT07z4-F{W?Q6>_We=I%0(bd_ z*R2XT5^#5Oj{B3?Ebhb~DBxV1x5s*Gm-o_!H}cE7$6FN(yfL*3buY9E&@Fylwscr< zbZgy7=VaHbSrLxp<+--MZ?x$zv{6D8gRD5XSjan;Jewlm|1;BW{f%^isif|9%Dez5 zxz)?P2)BLRe1yg$BT{&49-fuS^K($WVRoFJ`PzS>^!yVTcDZjQ_47%-noYk^z=>r* zV7gY(SjNj_3+T5rlOt+$xen=2FV-86!(bXP+fdBSFSbZP8IVUgmiv_dp6J|KRxG>G8q7c=Ge}=Lg5))l2d6)ysqbK0G?! zdwDG0?)~%Nj(61#flPL#ywE_3ShV3Z_FjLUFG_6ajuN46$)(O;MaP2;lIO~`bIxqp zNgrux)<-B4WzZ0E4)|Wcb1-50>94C~Rsdbtty?C-CE7Ta5iZpmz#!vg)NAZ!D={hB zay6&kgfY+p!^I2q2^1+_T_QlLNC+v${9FUy&QFzZAQg+GpmK)w!FVPs)uNiS<=eyK zA7A~f`0>axBp3HZgV(~?wasGqV8R}%Ti$5w=LCeO4hw+ko8oeVq0i!CRg~fk8Sx^+ zh!L#l0NFd})WvaT;urZvdX`_=8Q*k4^X`eLn|`;q^6|^wUu4Z&6;x=}EOzuNzN&EM zz=OShZ3E;v!bTI3T<~m!I`z$V^>~ss3h7+6Y}S~}4VEYws}Kp28XeuB5h&^r=xDtp zEB`o~Kh<)CgiyzCf00PMi%bgj;lu`XSB$UCgaFy3f@i*}A<~y!kOc`EkG=9S)i5*W zklRyhwtZZwTd{k{qJA6M09$`rkUP#%znff_f#gdmEmgtkpS}M4#ZF2H52f%h5LQyv zBLPhFk3LeJ=s%x>#|7WG@ot5R{d(b5FaekGZ<2i)#AG##f(Drbv z={XWiLw%hWnLPU3dL7QN82qT>`z0pdQeG}eCKMgRUcNm&BDy~ZlYLd$oy^0mLg@QoG!wK^4 zVO;U_acKZ|^6KQINK5s2KXZa8pkAuNTm5w{*mjspgJ{T;+fxQZ;fXCiLloAKj<=VwZB~F`Yl7E zp42(ood=^gprO$fKmfNWRdpwN_qsz58`JR*iegdu(Js7t{76HGAH81a=P>$d zHb><`jyiP8&X%KJTXtA}`S6bMFu9r!k!u(~N=yR&{1caKs>*4B;jIDOuw{ogLz;Jw zpqD{gUNI?reDglG>l~+q$t^r7wl|x3!|D0Zy^UV!0MJ{#=UvGeb7H>B=OEEoMT(gP z^C+$hD|a4=^D0>b?}^6mVW_gKe3ZAf9L~!e!@rz#d04$M|5%K5&L7nSnCfGwTO0F@ z8$P<$x~PHA2^la=u<_Hy7#*WF^a2IAe)Kc$GB7Su?(B|Ev6ahAKO<=Y3(J$%NOlT*LEkGJMM_b!5qV|r~iQB%18Kpt2OFjW9>l;|MV1-;nyyK zxixCH+m+G<3Z7+Uq2R4IRk^(m&h~mZCoMqdF~AB2PfH=+Xj7#hR+jb(>t`-46+?Aal1+^oQphg3{TkI% zShLcU6<~tsLJup+@)*WC+L=O_{W)&D6y-~ttYh5u2wWurKK@I$S2RhpnX)sBUzcS| zg4QY*W5qqSd#NB_b0|NVby4T?S&^!1CSgil7c;b1CNnOZid&fiO|w{C=%ez({*Zp$ zu*$RJXq77HdOa|2b)J^eC2FxG8VtUcs|HlH&%B9I*%yI&9l(t9x)^-XUEk+UKmfMH zF8LI6H=AGXU7qS5Ls4qfn63?U8=P%XLt@o}TtO-Kp6u(Cw&Oak2%WOjx#77^|T;RJWy>?`TXHd7gl zcrcns2;7ylTSnr@0#)sI|5Y%^wH~jt@-B~qfOoF0rA38 z{kZ#@7X1E)V^dqN5dmec&@W3w8zkI~TD=`&`T@afTB#%u5KYB zPI!R38FjoEd=_>{lBi6DlpJj)CAA1qGBSMBfyL?s>@$y})$<+yg&8OHa`^4Nlik4p z3TUj!V-JZ)AcI<#M!xXmc_sVg0p;`ejl@+TV3C?vSX%t1-%mr+(!2C6&y zmNGD)e1?kXc}J>sH71%5Uwf=1^bbCC^>IA`+f3>L;c)5Y{Fe`aYX;P>>SVaeJIMZ) z=bBYV#2=!LFgl4EJ~J}&WVy_*G|n}H)7jRT*8u~5NH+kbVEndz)H~bpxYGsE>x7y` zVss+i9KSBfNkYRySsNz8_KD2I>nBhrJd?C~rI(599POTnBs6 z!*DaCqLV%L1yeZ~h#+2JPe%u-c!j9^mWk_V`!}6eru=1s zSZr$@`MByHDLi(=Wp-z7?>pV>=DuNkbDuwM5h6}`JGs&)VJa@4vsF&6!pIohwkJR9 zs_20-U#p5nSJ=ta^gA6wu*z0s?4~|v6KuzhfQ29{(nFFX z*XcwBrWKS-ZI=*EQp!b!ZT*w~Gw^#g$75~#HJ(JrS!1~?_OWz9LBRph&<7@?SXBNb zP&n`jlU}UCWu)^KEGS#mB`OGl^ho$nYf-nBEz17Xpoq$%{O;%_7G(`>ggTyLK|CZq zW?a;~l>kjJyV!(s7Jk)6cJMvgOH>5F6R!BPz{`p9rPS-nTqn5Fxe9EbLK7~^p1aw| zMr1?7k-m0o|^2IB}LPPj_W9P z{iy3vx9eJ}+Q-w_&v63nEuiwp{dkFU?o^9G6+B!IB3KXE`Bjy4Ux=#d7(tGah?DMP zNVyYluq7UlY^(4+OU_SJ4enk<-9Tf#4kJ9>*#;mL< zhjXdwJ?o(K5RS-%w9rqFb4H2fCTPqKUQB(BQN^Ipwew)qWsD*bxQlKGyH^Fg+SZDU zDqwSqK!u$poR0LXva^0wcGhcOP5PBHw0vx=iA6j?zp@R6&L9UQ@Byh$48WKQfnaE+ zRto>*1F=q&Rb)*dI~D{#X3Q9j-TEVqri#=!!rw=Q<#HxhDT9$E{s$DD@TcnL9oL+! z9H^=UAP&igCKR?rp7JYzYKNb-c*&BoYdkSuv6wN#IOVovs}Y5dqq4+{MJtv8BC?pP zN^0}QpIq#v2*S7?!*1QFWKVuxxuxn+NTOOZsooS=V{VF#EKWgo*Zk6IJlGmd%vAM> zod@#hk=tCZBN`x>2fx=W)e(_DAi0Ni@rg$1@wcbQkaL@I}9BL$^a@g+a}-9$XG zZFN#k<+Y4LWjPZ=7oDFcU(sAiGW4>YhWvJtEj0y;*Sd(^&k4hqth^v4eS?CHHL1Pw zhK?bLFplGdmCW(?iv6=ou4^vPqEycQD00Dh{podJqNn1YV?RF=oDfCwxmK4@=~5># zlpgg(e$^WGA3W#+K7(z?JbV=>)Ir31n1NA#+Y%!@`?sbZY3jTC*i>`~Zj74>Eg4h6 z^r$`9;ldMxkyGdJ+pX4k(Yb533~-NP*ah&I{I9cZREU~k)XPSA{EY4n#sS55-k)UY zZ2AUfVISSbNv2(Xa{nSu_P=()<>w3e6+{cE1S&48g(+t8S}c_BG@6eU{%LMo*EON6 z`AAAeIpHed_cJ214(ISLt-6=jAb5`JE%^~Ie$odN_!;S7 zM_DZu_h4Goz-xp3S3L+%c>nSa|23U|Bz_C?$TpNy2nj(30XkgX)Su;!zGjNb{^%8}b-vE3^V zWQvlz!$FIg5h1!SEJ$+ z5jW7IbT*kUt3wS2aWk3$(P6HES$3YzuDz^fH1!$l+saffi=#4MgaKvpn4KMJXmi(=R9ScQui*S0 zIo`HPi{kaM2=bX(*N3j}NuEj*ToTDDVS!4ZTVl;{Rna$@D@*WJuqq%;-6&8s8ciiX zHrV24f^63Tr9U~K5x`pN!TUM_+Uj*Q^b7H1v}G7d@@9aCoWN8gc(0oN?G1zJfR1*e z1oHDVld_EGf!3>7d+98bp4WWj+JH?_XEq$DN?$5+eASFS)a8naUBW=kqX}zxs`e z55=$cS!LGKwX;~&|9ckO&;RmS{BJmg#lP7srUy#&{E}x#$h56aQ%oi-KVyTFBsCNd z_i-aiM-xUd0n74HSrO2sCV4{x?M(O=qB?pglo&UV4;aiRMQjy8<{k5;Jg1j8#m z3$%ZPyqH!;teFho{)Uh@6L&%}s= z#A76yXy%HRw0xOf*`x+8e}mrDB)9b-yZhG@o2N3v0Kw3t>)wKb(R8MS&Qd}X>wM6j}^F~}7KpRnL z94I`zkxtT?qYl|WqFnA%B_KiND0#J}*pNPqEQssVW3FO#fmg!}`~AMF&=o~KyF@XE zhshiqujWd6oqt^=)1|^VUtX+cNf+62E(*+Ho1J8MZKasy^qxxR6SN$KG!6zc?utGZ zLpI?=%i`7+9rCL;YKu^BaXt0Q`Gq>-&1#kw{r!Wd2hR`Q>>VGzdWreJeBAW#6HHnT zrrZ|CwV+V$gCgq1W#sjGMY zwgONnE?71(`0Sdj%H|itD*N^Tf*!n%r8VWAKx~kzgO=?@&$djLiQ5`=cmUvE=*Cih z>NFoI4;I}f4hF_AH+r}AZ$fiQbt#0V`O#{5A`@M?r3fu0ouULUuAJpXT9jB0^X>+T zS4>O^hDvb(B^DMJMM5v2)EAwb@_q(8c?PB_N+Pr@N%e{p1q>ptQW!>8o@L8TkO|U9Z0yRJL_W<0F8+##2-AH-QjP|XfH&tRyiALkBu zSFqiIkGsk4QJhVyifmrIg!&M6_82L&q~kkc!g!*(+RRsZFF8`ezXmTrFS_u!il+WA zAwru^go&Z(#yO23+^vFCdkG{xXB;$C4e`uN-X|I*_45D}n1@+B(rWScsB8Mv9o^?n zG3aW*WcmdBGQIqPd{@^YR@TeSy^ppiUB6A@fgM<7hyCHUj*^hqLvG;(F$&FL|E@)I z(7HPucHqBuchukJPAz2S=1*wp-Y|Y2#CKR9CZc%2MA>niqV5o&fr(KO8>vVV7}~UA zWau?v6@wUV*>aP$)6z8TNk7{*So?AenL9o89csOvJb$yU50y0ftlknLR&>}gkl*JX z?XzQ-+wL}q2Tjn2jw$(od{1CbIZ0_hZWLYj;({BTP7_kW?gMTz$6V{)u;bkeY8nLc z_%eZ;5*iX-WcdbdOd}>NM7+RVLyYRPsg8W_CADj{$*!)Oz?F%5CAoW)Yc5Hyaxmg0 zw?6=E%VyqNMvOBuytVLxP03}>g5DNlBzcodQEMfViTj~q}9VaeryN67R2E= z@?6RWuOYW|dRK%e>Jr(hSvvF z+hX+2b1sB6+QVq$w!^SLY7D{KLNT>HA!58#*Z*9T5?F+5d$UCyO#um;Npfo%?a42} zbT+N5p}nBli%@U~cX#vXL3EFA)DmgNzhJkUco*wdnHeUJPWrJ_oiUC))j8?JBRP?% z;_eF(gg{bPax0R?wW}NRP-+xwLff#Jl?*rwo~9}tb=ib1Ox#R1o4s0S#?( zF@aOf{?UDyPJ)hxp_VWhu(GFm@>VTEiGPi>x9Ztzk*41D$Yjy+UANY+EG4|#)Cmuj zNcWaztl-+POUeMnRaQ>UTBeff~hinw})9S=n@S!oLyo zy13z~zMyTFyiy7>CVzh%NMm?;NyOJsZh^_owjiS$HlVLkyCjm7rd4qin%WD|K4}zV z1kMc>S*y z-Q9t%9G_(cjP6{FaoWOyiu+>)W--j>^K_}Ng9HuaI$w#aWR6CM`QKnL&*wdL?OP_p z5N9)WX9+Gj<7;u0U4TIXGP8#%#R^n60nAc7ef@KxsKi_yqAB*{-t%YgUmv>lP7DmE z)YN*r_xz{Bmp{BeIzD{*6AH}x!zOi}zkjj!=7+;Pj=UE@Qq!XFyCaIT zd^MYjQl5FhUM150F?}GX;%2iW!>Fx5Q-PJwnG4kJu)mNHWQwZ%Nc{0gt>#deTIV)w z-Dyd>;)ZkAuDiw(FjJ?i5#2Hmc5A>L1mHdza28Pm zt`{k+3^)%nsB+}M1=#hPVCP|m9NslUB7sB;h|0E&9YPjKq$dg(!zEn>`KFqYZ$Sjg zpe223tt_v_NwTElJ4a>$C`*uuGN7PPSJkI5f#zueYVK*d36Q9W#bXy7c4CN*|@29c|UGS3GIhIx4M1|x$$4M+%y#2=w&@Hpi z=P);2tM%%cI6u%QBM?<*ona@4MsUax4WyZXK>J;46%R$vU!Xc} zVFw=2I=FA)M+yMCoutUrodvqDnI*}gQnrdq0QA-cb zYkcjdk6blu^ZrVMOO34&O+2oqURl1ERTeTC(WNelYpv-d7$ah-U43-9O3bVe@EE6n zMk>xSlOY@VOtf^$)oYl%u$ZG4qt7rOmbKsvp6<36o2X`(5mr)sJOyJVTNO`d39J}kfV@8Vzh)lxtj?&Cr>n>wmAqWm z4JT4kD#4`1LO#x~vh%DzPs@LhW*DtJbf0S-u-Uxz7ZQbJJX>Y>um>;XN(`Z4))pYE zf=RhMsCrGS;vffA+rdhDnya)Bii~fP>^y&wO_sSFf&Y_SPGrW=mrX2$tPXLx_K zCi%5{c-^K;uaBl=Q0c1BkvwX?U*ZKrT@$tA2SdwuaTuXSkp}SD!ZIBgS2#1fYe7e4 zwQ8&l(@MmR+d6Z+tYEmnq3r@m`;E(EByPkqYydxqgX8Alds< zg3~VbO~Z#A!$mi?{n>6&@XTo#Ls`4K|`nIb}M?~%HHPX0}8~{L?(m) zm{>+plotnkvcq+WSiA~hNZ0k@ zmk;kcS0n=q{ARG@g19$Dty#ubM+z^GOfAA47A-qkw5U9fR&^CdG^fV1WOB|Y2#jyK zuLHBHNHd6$->#dF^p{Uvu$B>mRI57=P8bw}djnH{y}2v#dhyE{@}X2l~aPDG>wi zs$wm_lu06Gw5Yn2jZV3-*n5|a1)!^xDz-9@mQqS=g*CcK6ESLG`Qj;ftb}Uwtbt!d zo;4A(U!pssFVme+Fr!@Vns3+o+qQkS-H%qECJ)Y|Ly1jO|R&n>!=H#oM ziD)K_9%uuhw&b-gxpTj}bDuv{5{X@~Pkw8lzwkHmUR4i=qRi&1yX#Vo3)F7A;5drPWE5GrH8*V@#a-r%p+YJ25$ zH9t#}QmxeTk-odUyA!X`RVs%E3IT-|p-W&KEXUq7l-c8E`l5n)xp-PG6*#vtlCKQ& zGEnN+xS6FB-Wf|WeQ@pZ7sv)YixKI^%2mt6m0PMbP1~%y69R3Lyg4Fk(+A3p#l|(K zr#q5O=$Gd1*?OS3ka=BYYF%GsMw@D$(50 zX!>ui)tmd>`x}D0TL}){Jm@}PW+Ho$8#vw~)S&>d#;TbYjLKCp^ z;4{OAfFRFtfuba$%+d5LK*qSB7u6i&r`F;Jb>WTWqG|}&k0y;IVY~{Sy&qo~rs+a~ zaKrBus6gQ0Yl%STX57Fn%&P$Cr|4n)q{*1DYsb1V0nHR_ z<%Gv9>?_k8vzkgXHC8O@40lwK8+F*ucdP(1m?%6jWBiv(`V+&aOD#1JfGg9k;eZ5RC(ZS%o z{TJ{nd)P><2b9QB9y zm{({s4*Mgn){gKK@mCFpdB1lQjK{X??%q-Li0mCzjLF^+J1Vp$H!dUEZ1vCpO8($b zxD~_Wfvy=LuN*T-5ga#8=z8Mbse#&I-{DA^TZ5v1_dOX$?_8JC+K+>{6> zLIs!C@HWHIsz12g$RM7>`LRu1n3;4)M6T$_gjZv9f9M2^P7jbm#w4`HA4IJv`id-g zDoB1IZxn^_V7&Z7-Y8`VH4ai5iH3#oFL_SL2XDzQQihOIomw})JUk1FXc1uQlNw_! zya#MaLw&Ebc}QxwL4lIt2+0y;h{U6Kz+@S7oeLQ`;jSX1u{gqJ)>M4^%R4dCN+lUn z5&~z61$v(v&cTBY6-+@|#g@uJr^a_My5H_lNfi`^;U2WU8x9AfQM+TMR#0d(XpQhR zTPLRJ0P3`v=aq1LFgTDQ2q&L{>XHdNM8*a0-8c>&3_GEa3JUKpS4Dv;^AE>;eROWx zrBY!uZFeGR-2?~~BM2mt=m8LW%Liey4iTYUA~M_L#f}f=ldqCcR@*yz{#nfCuY+sZ z&0iYp7>+EIo3dQ>YJ|OGbnI`FH5}V^a$?)IZQHhO`^2_w+fGhw+s;YyD9Zn#O+fskQebIC_ix$+ z@{T6P7Dmn%cD72+2F@-{v_{qjPEIk3)3%HJ7+ErkC#AMY%r+8I*cl6nL!i|Ch(pC- z^A-I0ZuDSDZulTiCHwFy)Ubtj@#_gQW`ueig8Z1lCq1j5=YQ7lDF%u6bv-uW^r|jA zJ<9X515ur+s>K8apzA;@>(E6P;g!Kpq~^$aw2wWYo|OWD7H>WDEuvUu6@%SVHiS{$ zUO9h6IPHQgeyQ^ympN3E=1T@;o0BT%^OuON6i-rd6do?G-2`Z^}27m%YK}O z@V9K8F%CKGRvDhy@HjUnSt2ES)(=<<&-*q)E7~2;+$^ zTxF6N`(V*6%nL_Kg6E^1+PSF?ghg^b_o58n=i`PXOb>-c9<3GIG~kjmCaLs_Ljbr~)H z$gK+}m}}_Oe}%;KkybM7NSC{zExmAOK(HZKxS$l;HXB)MJ!wbdS}lgp*PVx8c(F0Y zFqa14)Q@>rR$ZX1nYQqhNFBbQ-}6k+A!~gnwzfzzT<@e^DzRfSrcR`4P%)P;7{`#Z zaPLwE2{|%eY7HUDwHWOEitPOfBX9`1SGFTiAOHYw;D49A$S4H;A7MrG{~uQW=wAF$ zsJ9%XN7w@X3d7DcL^-wWD4v50nG@tnhBLd^*EWs4zx(qEBTk*C>z+}`qf zQPy|tOV;;8;3y_PY^!HqmpIv92J9~=+mA-}Cl)f&S4un_YEZ33 zvoXQ)*9Qd1c|z{dVAb>6$DW?pt{&Fp0s^F1>ke+HwVH4qcxGPW5*(+5WvW)J%UT2w zXGK#Hq)R5E64PMKuHkYW6@>}f`>H~efzVP->-OLn#Y*-w;CUv+8Q(~E)YO8rs->WR zI8|?K?KzUn_t-r^R_Bml{N@_YA6_e3kVoHB>P@q{r-}uBY42Orhe#?OkTN`R{o$_9<1xH4t5HR;%0{G&M^US;d-#O?=j4Yb$G|B70RWc%$I1Wi z2O9IgPTtzYgiglf=Uvgj*ue2WpJG)FClnQwFHX#oq`goUNMHdJkt~qJfHDP$z%h^r z*+9}?2q?`=7GyG}9rdMT)U<6kohi_i`;l!3@<;`3ANs#l-*(||wjQ`a)hc#S%i>xjyzan2a*+&@eZm@dp3=j9jfs=k11= zLbGG-uD2~pxM4diGBqZrEXu^+7rM+$_A{fkYt5X^rbJK65;BrZZHZL_p>(`#54GHytT0}@$^A1rI7M3rrlc$!JGLatq;lEm}nOgB~*mU3) zOr_y;4oW_W*u%~IsaF>|I!vI*3L~NBUw`y2;=HffGBt%YH7@-`K;HZ8?f(w1PZMOZ zgwUON{M%TtWLoScvc+hP#)Kjzt~<#>&5dktSS|aD_FBlfSB6!Uaw*Q*S)>jI9a0sY zX;D2;6*NQ&r9{Yr-0CG-Sud)-GX4%`)K(6&MMqqEaP6RiL3d%vZe1|}Vp+dBc9NMo z?LBLNQ(LxzF-Mh1itVWWe365UrCrbf7%4bfjD!^MRY`TE?6c| zkVzpx7Vr;TbG*h<OYTF~I3q9k6%_6&lK-N? zxWK{@<@`=X9jp$P^2nG+pasElhR79X$VKr;V|mLsvDKw>0GDC{Hi|7yg06t$x0)rn zbCfe@F(lOqWC9VfNL*kM6cYhAnHtH zqt(l&4BHvGE)C0F@=GKQax$DXHujFdEp;HNHU80|DOw&bk-YK8XUB}u1AH~dx1YO4ZHu&9NxbO{IF}iGg{WLg^Q1Azc zk=CQrSm~@xgTWtSgekF!;kyjn`3DZ$kM+)4FmWuNipql=J*aP0I9{52m}``#$9pb2 z-}j5LE0nRpE1zAjv$4W9%5@$JdjPtITI1>(Q3RoDx~D>;RNo%uKnDqSm^F^nAoM$5C2NGt}zZ>fEot7x524P~E+9l-+!+W8vWDQlPDW!|hd6H&24kYuax-?-FpDY$H^)E{?@6Jyi<+?Y6)u z7bpVmp8){-fbBw_vem$?;R%=l`=mcV4&xKm1@@_-P1hUPg8Fp9Zv)dP4s*Dui0|FW zo1Fi|g8Ta*)Ngx=fJNoZ-~#b9FJI>c?{clDLKtN}PLG%U>p481y=s)8JHS3rBtx`7c~^VrHLM6tD#8Rts~)FYdn=Ihl63W>4(P>*H}G# zpS}Qv$5?7%UpyF^jC)fVe@M_DbeMyu9+c8BlXqLa$YgfbiH^G2QV^TEMKtRr2Q_!C zaZ4ZhLA#73qbwXEj8SmXQ{8a~1R>BZOUuX_0+M&Ku-oxvhD0%M1L(6AN#FVa)Fsx$ z6oapn(SrOFctRXl*rAl3TgDO^+;G@vLR{?xD-XzZ^YZM};-KK`M?|Q6@`3N0*D1bF zj-K0b-61g7WSGQK`9Zb5-hVDV$@H7@8ZZEWE9ifR8;~`G;y?G?f4?w(zWoP^{a=^f zKNzE0RZDJz9>q6z$nO@}Q5}tT9as?>30XuL3;nk(mfToT*z)eG%03Fle(%ky0}>Z( zxJ6W6L)`2U*NJxzwZ?njG5av>o0L-}}M!o52l87$ZzCz3|gB#J50a6RO|Zue5d#oJu6v8eli zi9CL4Kim?D)@%J10E^QzFu#IS$rW!=SN-B3PQ(X}J_$+you#}fwHVzXbE;u8;c*H% z{IZ*@9R=rT)Md1Zrl}(k#t{-y86rn}e%AukjeZHJIn~89=~r)qXpSV%YDZaGx|)&2 zyV?2a*T2Tzyg9lbw}NTMR#L$c>+fMKRlmLp6r?v_Geqb6Gm#CU@cW&qVSr&@4EH$7E*v0M~o17^h ztVfh9A4+h^t1eghiPEjvogy9lMPUW3P)vH@6 zkM2A4JDlWw823jq{T?j4+X_+buZ*Z{Bzb2GMapSvJl_IR2UCVyV|>(q9)|1~wS^{; zgmt}sS?zF1>KPND=)mxN z#j*S>%VfPDqQ-1~#3=n2UNy=V5dfDShb129)xC?^TgE$kXEkIl^s|LM%$V~!TxO}@ z&H+`JbhW=HT}ZP&t+0BwB~ypQ$Oc|*8u%SfKAr7{i5Dy-^H^4z zF<2}b`C*TRgpwlcTG-6R3n;{?k4>o~Qf-|OPdl$$@KB-Q;(q>ol38oSsL*(qSC>;> zOgGcDJAAT$*8J)5K*ihjNy0rh);wFqmFJ-nOm`ilq%Z-3vmd)0K6KtE%$z*EnGi+Y zP-nkIY=z259lpHb32&bH?Q+G zD`!??NJ5cI9j^Qs&=lJH(Z37VO|UJD!+CLr#egc8Og{J`@#()RV39STE89#BZLal` zL3~aiq2p|{#X=5U!3UE@v;dPrJ6u>B%R0MmLp3olG2uej;r>(|>!Y}QngODtl?1J{ zH~U|O=HuHuce6hmA+rSh?F9mDaEd64|5?z~Tll578~3=7YjiLD1R80JC}=N(iYKS< zR~+vu<`-3d&%x*@g?!H>`1^j7xpIQ98WQRRlZ)O&h$)gOG=qVfrC-FwF8Zi9i#sZr z&R|S!Y@F0YvW@YeS%Uq6b&0KNPJ{O|IB}n!FWU9}lxyPPOz8@_%%o{loq}x%{VEF_ z#X!CdT&qV^zT_@5}!Dea*8_^GCF|DV+q%Ks;d{uMmG)x5lu{$Tp{ z9N&}dAw!dhn?wC}Nh^ub5s2!RPZljItQNPb&l^~IY=o6bO7qSShqH6ZY@N2@9D+XgKFoT^dFeXw*m=l$;qmx5K$inj zkMXM@SETn_(T_=|kIswL-x$GfU+?{G^+WJI0Xn9qcQ#WFQ>ug&MT zP_fsQqRwD`DqE`-Qw$9uRfBBqxs6AZ3FRp5>mkCrU|OvwHDthYXwB}_5CJd6MrG$3 z{8ZSICNcN4$dOf2Q!{!P)({D+TS1dGwT6tRV8SVHCrp^LLo}>dLQ7&{ZzoqY-W#W46;u1<*= zUF=CTBCY>iV$W>N%7oFgJYma9({vIDT8u^OuNE+@wpMMJ9+(J(*CrpTNQRpk8*6 z+nhVH#eV5j9QFw-g0@>NYtAFP1P{x4xiV{Wyj|0z768Dec1hV64 zF+WAgWKX;kUxf(`3%=Ea-CE5+zOT5w2N@QQ3$+p4z+^}qUpCLJ7sI)G!m{m)c`VvN zz#&sIB|@%rvz$9R&sQIaul#X{&xeolC_NZxY*80y8x}!1wOg2rlVO(b9cHgGNF~UY z*;lM1usnq%vT()N`vP?26Ie-EXvXo^c&YN38UH(}Ixn%9A3!6@h|2I|R8bo>in3S- zNJG0BT@)ECE}~S^a&hbrhDRQ*?u0hjrZot0{VQs}{Lmk$mOFZ&lNIWd z&is{76M`KtDvIZN(Vh=)cYYMsNdA%*5(_2APhv3j4k3aX-V$1lg*+)^YekY3bQsV_ zWpL$|UPJov^Eq0 zf5{$VhuD$GkUlf>P;mTtO<37MUEquirv+MWR|4^@6ovX3wZnL8U$~d3jf3)3m)|He z5=q71;psd<+>8}N%A_DYC}Z*@YpPBz_*?^ab`PW4bf8lg{j5@%n%Z2M*czQGI31Wk zxpg)o&-;1}2L$v0i?A{e;1(H@Ir-3( zih>q>K&vd(t;!s;*4}q{7Kc=2X=f^g{hO$X#r;!!%2 zD5WnO*N#p)l*oWj=*;0+*1X%HV`wDbwC+-k7`XFda+K*~b%Ci8^KW4Y+hY;6JGVsM z*=1D)N$Enn&}`5~<7H?GvO9NYeG2P3ry@t?p*z95t^}V{YxKwyfRovzhBustU(77J zeSST^`6Xe6ZWfahtb4gbir=U2G2kQL}BC`X(S-&w< zVJ@?VL=MUx(Q7Gj-6e3ve)AEbe*$;~h?IE%Hm5XWIy{iipex=GR;@8ADj(8tWqq;1 zF2C59jyN#mr?S(b!<)PVRuRQwz1wr#we*D%9AVEzSJox;>Uh_0_AT>cLmP9|>_!@* z6muA;Dpee5sDP_vj@qmAxT5p%Macwb zLfU3(KOq5btUgDm;1;SQmu2vKsp!M3EZrAg%#ZFJD|39T$moAiEGbzSs5TH$8MMAU zJ!U#u&Yo<3kbIrrf?|cqureTIYAO>F&=V5KcK9?7Hd1L^H`5w7IG)g88o4;CvEVv~938|XH6D6={} zPoH80|F`PK${ri54&KUvOT!J^JmV*sC7@ z*X^ZroZr+R9L+e^N=yZGbQZdoV)Ycr?wzwYEoOs0=`gK4*tUNPC+xkrRp*I7Z;-BB z(vLF4s_!HE_>yAYAMiHnxz~B7UU>#yugost^g;22Nc5yr_Z{B-;?WNgBwj)E7Qivi z$V{|1>#~NSFryk8%~g$2a2_Aod-#sd9u^iCyW|Mhh8uER4{@5oX6~Gf_}eTV)Koen zTrUBZ#p!G`=&tZO9~~w5or{v5F=f{)D?r1OwXD!8c!d6p5>zLVSor&wZexM#G-5lhh@Kz& zA1yANJ=IBt+#^TyOntpWGP@&1yF@K}qN&DJ16rY;8_8A0Cx%ldf4h>i%QRGS2I(a%k_sm1Oo2mOQ`wn*WqrmEH~mzL?4hSp740k#y5 zQh4R?+)NhxVgO<$qalUk;`-iWB~zFBFN$wCACFYsuF(z8jJU>JdXwJS!)LsjVeo|{ ztTMBDbpqZfMJYhD!=naqGv2`Ik%kv2;KaL;$wCT4E1h=7+jb`=Uj;t~bz;3qOWML5 z@(EYJGh$u795vi!R4$BFHt6JR)VGkLj0(HGE1-(sqxZ@yici^rs%EH-04h5s$|e11 zCVjC)Y4ED2Ii|#BnKZLv@4_`;Wz3}T4bf}Vk@HlRKVUOHuv`1eamF|O0FV71dlm|>t%LfSLiJkv0^P4n4eV9? zVr%*KfB26ch%o-;js+9|zzg!f7d+lpF#luZ^7H3EJ&=DZcxeAaT3q|$M_L^5dprFL zek@E@7D-~*VsTtOMRU|u@lVU8s^dbe*a4tKJolMy`(T72^5@N#4mVui9{KycMX8Z1 zR)YH_t*c)r0GdA)Z|AX8e@zWp1KR#+YcI#<_m$o17q8dXBM=m++TYN|v(V4xX+_<- zlY)5VTC8qyvx2k;4y&m4vUF|8k({N#$w$#TGLxKCkwH8ujnYNc5)%eqDrjo7C+efM zSMOn~J9epB(2vhUs^^lj2~8jt!i{iVqU9!!nTu&5m3L7m8SIoZu*?P%{$v_{cT%Y> z1iqnY9^=M_b$ZUFKC&;owr6i~z}shTAdMExNp95L^G}Xmk;ZfF&6Z8AoQxcaLu^W+nzS zo9x?bw_QPSYMzuA&gp2}4@>>8I90IS2J+4PvP=cdB5VLD)`N`o!L%UkIAJJ_Dhj4Y zNB{`|Vs|B=juVCMI#V3F#yYEq~lg{#e zcuv1OGFV{512I(3L{vr@A<_rDx!bmR6jQxj$ zH&)4rQAhxMn;zWPF~%zYd13+wB<=sZ7*zSs_X5rV-k>}eV3bMHsLM1PU0;uw(C=wP z*Q#}jTQhH{cOlcpXttQx%{W@wRk~FOWe<1pz7YN#T0o6Pt6#H=evr=Wj6<4rsNin1 zAkK7>_SY7WX%^~%w=+`q%b2;BV= zC7)*uyr+8J&c&h4IN51VEZ{`>+i*Q(%8-trCsbCLP`YTPFe{rVeS)WD&68h|g(-$O zt7M;JIsd32WEiX)@o_8YgQy@vNYOi{M5MDdeab$6+8OL81GoZqFbxqa8=azfBQCCY zfh0w?rtVU_b!twrHcGP>#6wHzN}=qAn$gIMAt$ugS!-@bnhKi$2&J8vGSyiKK zKQI@L%^nFY0+iH;U0Su=2m<>W^g>Fr?x*0&vn;t{=+wAg0q@`mJ3oSWv+J~&Y;cp< zXv8BVq*~l1?)Zu+hN-L4rV;3J9ebU|QMR-b;x-~&m!L)y(h$tuQWsl*r*Igv0eFxw+*fj^@7`(*7Sb*ndREQ>D z9DmHr(SFv0);(B&Xw%WCp?;7?F;6D?4}_QZOV8wd-oEZXj+))b&i3%}aCN_$kui6G zVv>OR>c!|EcZARZwi1>31gpFr0aUz5zx1ryElLsOVfOmE_?|OdYanx*1K}SH=%qoy zXn6j`@J6D!$?i{vx+iB1=^5%*pfT1$*OiWTw(3Jm&>eFlw9l?9rjvH5HMsvB0gIsl zDa9qf6s}VjY1fcA3u`mzPss3C)H^CGt!n8GRSEs9tn4`4BWGn_>ePR+24w`rzMZuX z>7sMsJl(^L(`!6kVa=4~f@2vI{AOVbwOomUkZyjQ1ZCov{{j3ZFkMG)?+l2)s2ak4 zL=myK77#WMwXE93vPB-rC-Wf1AEWk6G^>5;oHe)V`JPT4(loID=oOhTZbaE2+J%mp zRSV4Mc05UI#9{-x{}^r4F|boK=r6!Ohl*m-`8AXK-v6N8ygMXsx1=q;h^6NUVMbzm ztiK&XnZbC4qtuTCevEdF^fZ2CL#m`6`c}+*!jBPB2I-KT5_S}b$cy!NxjOb~)!e5M zY)OJd8-(GPu_>pB|smQ%|5imc&3EGz>L`B|Nb^O5b_(S+pZXm9nyEjuiX@yK@Mn zM|TO4NU781NtfTQ7Hpkr8)+~IuT;P^+-LkR@2)SghM zo1~G()9>|zV4Skp)0^huCzEAQ)xlxb9~#b1K!WD`a+j8nUsukZPx&$=OkKIlkpo+l z){)33!ioKeDOvK$X}RfiS%u$XECV~7?-RpJZwLz3`LAAIaB*^WBw-zlvi}I;+nvMqb0t-KOr#&LQ9Mi~eA_mv7B>aLfV6+yUfy>9!w68yc)dlTq?~| z^+aP4w$@BZ-wl~y87K=g7xuqNghq?ovIhW*7*FP24bovm0=htvYQImonD(-zN{Jl} z-y_1e_IzyH1yb0F9gW;G3D+kM@w!Adf2aEU9UMG5PQ%(-4+`%8$i~xwrWWaYNDtK% z>)1PyoHt|MRPijJmL}ep;(05(-7gk0k%#-Tz=T|ZF{ZlO6kNCw6qK+h7ZI5jTS|{o zY}(^d`G-4DQPQWa*!++NEDx_2>obU4+}(|7(+V1Q*kxVaq#?Jtkvcmlgnl_vOX7@{ zuDd$?yr-pIqKlVMBsB>bMQae!uO+rIlcCPJ#Iba1J0e zdX8&1ZpO;ZV_*s~z-81b5 z!)(kQ%V6_vCjN!_&<7pn4+a|Z#^2~$E$aOT#Kvud_e=kUmu#*A19t!~Ez>}}5~B@M zc<)aV!H%iYs$wPV z<6Lcp)`BZ1{>y+YAGmPZ8+e#-07%$z{juD_gHf?jxx7uA`~|77+?N&O0KB-sb0;U) zvoOh2%l&u^0q~b9uDNjr9~bcQ@+37((ocu8+iFo^NOnH#!Wo!H9z2)kl1`(+V{OOM zBaCj)o4X3^6lZ6RhL*JZ=tY(-oa+9Pfz6G?;tmYeI_6q_iY*GV?L5S;_oO$QdQX%{ zu@!&%a+jFVvb2_>-YXPPhfc4sd^o@^XcJ#Jz4kk%=sRcXW{>JeJedhjvk@;I4lD}C z6EaL-r39i5K(|A|BzOn#C|K5>!Y-Mii~jA zFx|3@RA;U+GZa(XoAzIa3wMQyl46yWFTA6DJaA-DxTJO2o6Q5PZBLxjjLsbuRTbAIk%E}n-y9;JD6NB4 zM0kv3rp^jZW~OexzEp^9)#s0u!eO_rAY3S+>jllmc=C1%|E@~-e)AVr6C{G3+)Slc z)Z~o>!@IJu3p|m|*fKsF)S#K|&2NP348yS(h&_Z#T%PL0jkp0lm3JPjG~S1GXp`wq z6)dJyb}NYaP6m=PMp@3hctPWiU%7H~MdEpI9DMCCrSUrQY+I6yq9_nu7QG9AE-EZN z9|X&lEcbw2M#yVNT_a+`JQ684iokE9HhQ^QcuMz-?)pD81^=oXH|cd#ddQjn-CI@6 zh4CeS;MLOF_qfn4&|JJ`PLB(KZ$1|V*jabjnj3orp!oE=^tF2Ci;*oj!3lIOsSiBL z(v%Jy%UYr69xccL;B3RCdwjsw_c}<#`bTY%(htFrna8DtRlllw!^Y*SrP<6{NZQPC z&PBRPE^U42IVf{4ur%{?2>@CUD*7EtbV~#c!@;^%<`6E{%bp-#DSoBb(hpT~r?C8} zkS~l!I=HZX&n0sHZ`U+Y&^xn`v&ZQoc%p6BN1jmbWxW7Vhj%h&er*b^sk|u@?vMU3 zXHc9*w6|1Hgjz0EeP z=8OB=EB=kI_uu_#CN`#L$p8^7YjEI*XUS z>kp8Vv#@oyG&h1rN|A27Ps728uBCo~JHD2r!c)YG5yo$QlF2g}NYgvvR zeK0{x*q^;m>TSiHXd=B9#2zcm3A;hD>1)&CtLh8IS{uLZyVs%C@q|8+=f~whyzH?f z{d0rVoUJ}jDahANP)9i8Oi0EX5|F1=mGA%=%;Fl0*NIDao^X(PzB3A8@@ilAQeEOh z>uKyJ^Fm#Xq=Is5on=Rnp?sj{gx8vY+Bef5tA;ZS){*ck9TgGnTjkH)89&AnUREO| zp`#daLOIEO*aNi}ZmK8gCG2m_Q#W*_H1yy!s+U9e8wZ(+yksI644r6Fc!v$YqI`3O z?Z9Y*Fq<(1q-|N@+{H#iLBMY6z_{1{ZR3AEMJ6x|rNAwM+Dw!{Kz5{k6Zot@bpw6Z?H;>>z6S=BYHifu_}hOYv$Lv{3Nc>?z3%u>mrCabv1p+ zXm$5iX3=qxTU;U)1O$TF|h+!TpW9HN?q!;{Wk4qg6Ep4ADB4+U)Hml{G zW^tAFon?0GrD;T6k-P_t@#6Mj;4-qZvfdq2uLfn2V%hQCD#L#eELZ!Eo|jx9LQy5Y zbhn)7w~A~1&fMS*%>Je=K%Whox%9qPP3u5@2Unpdhrwq{e_V+fqZo(DMutXcVcyZR zxMNn?x$94VEIch*IpJ}*2{z&J|L*zQFN-4N+`q@jpZck1)gMH%28iOayZJ}--pf4e1u%)H=wldgJhtyl_w4cRZj=w^*T8cJ zxDNTKs(E`bFN&z^t8wN0HDbH zdz@twx)Lf8c_NuXh{JnAbg2dPuoZ>wp{u?QMycLm3RgV-u?8lTv>bg`cciP0-)c3Kk!1749pnmVYEJh8=+ap|wTcJO{7@ zv(Iaagog}y3J8y}I#z?bF~$mp1TVC=CQfjp50wyf^f_1`Kr#5@BV^S+lnKBDw^$99 zR3v)#2jSbfbrtW`mKMF!rD2O;yLzvdvE)Z zeoJJp89vv<=0$)_`#hza;~6<^6lep-ixw^2Ut60*7Kd^M7QJh@|Of4>XrqRbRZg+i|Rl@r&jx5YiP2|CBeU@ zPjGB4|7w|1NVBc*zU3LWgHN^&Y!J|gF2EZ^1b(zofJb!fJQif|t|VM93Y^FQ%{`;$ zuALAm7Mu$yL3j#VqABcAt5Cs4Pl+C_mdqGy`J&k;KO9Z}po^5qmJkm{C3dBe4V-I0 zlN<35WFzUK#cES|j{=I2C-t!uP_vszfv06I;sqS&!M6U&scRJ4zH%3cRu>aSW^24s z4;Z^wBMZonoe|N4vg4J(8CswT=;Dz-b|dPPAth-=8F?QLTz?HxMU@Gc-^V$MThjgFYa4 z;reKU)K|&Y@VHE6_FZLp3389#)MI|oiXjCSHQ|U|WVt96<33vDr80F+-YXHpDiwvW z_a=LWUoRcnN_n;l1|c$4Ddn#OwlZ2Yzo^@C`X#7D7j*ImqTm_mGzsDlpED9`=(Z>g zRLj+2^*CY3mgzOpUbOz~JH^!+rBm-M*ytKOu=cm-$p5nb;+r;#I@4U*ksvpo zw1V~7b9d5yxT%tB=#UVBvu@ZZFvKdEye6V-2sx{6)9Ggw{6e8s-VESsx9&h@fK%=J z!(>A5uu(z?&3bJk)TDaBYMD~$jg)***gqB;oD(lgFy%!TV;q+HP7LyrLb#@!CnQ1^ zs2!PsAVd#YYD<5N(6(|l;(f=c=Z${plewZc0fl&}I4ASN1(6m(;f`hOaPcXHh`GL( zR3TBm9KrLwo;y%f=~=kAkOaC^s>jDS0nzrkAgnAvY)R*kfW?Bn7T-Q}q!|*jU_E%0 z)%;VS$^6G6GPkKUW@L$$z9DB}Ym*{Q>=QCOO!;w__jqvjs0`F(iVH?)&xuOl&x@4=fR*}La&88TN zV^P7)%G>Gj<9>~bCu`*_WX<=Ndto>p9>v^@JJ#v5os8OqIiYU&pH7@YdTeg$#eQU`u?O*{DA>L>igto zIHPe@sSSEtJbqv?i$@qk4`@5p`5Q9?JsUnETa%`0*Xcv@W$;kQ< zFl*@mbE8L~f{rOCxM`KYW)FpWeN&FxO)v$&Q?I(39*smjEOR*-_S2)?7uUee*~r?! zohq7ikSh&rK{)ZZ1RGY!9VoZ;MlA8CNq7cOh^ zhSyE5e_-5uP7&Wt9uZtOz!}=*6pu1GIv)P!C>^y&dFT$j-jf>&vR~*XFB1A|GC!#I zBh_;aUY`Yr-NvZ@4o@WydUG=}I#TDe*@tFkeF^>q#%RSiK}OIB#i$iAx$FhBxP=Cc zGP&=F>#>YSWz>;XVw!@2fV)@e4gvZ|Z<{CfihT$%$YII9ceCd9S{K|3Za<5W7zCDx zt4*M)n;PxN?8l816y+6Xur6aXgn^OR)s-?ruaqTE7v_;n!4c}XO;>_^aDa~OrkGt3 z@e6F4Ei%0HH?Y<^7{V?B?6NE*9jI?qdp&+-k{lJLRDYX|%34;10e4;fsPIj(y)eqF z>PeCJb4->DQ4SrAXk5QQ+@Opc{W&l5T#~w|+#Z}KmJK!ZB9kZ>T>F$@L8}L)0O=w| zL@sNh#sn9|t@mEFG?vIIC3;2h@}iMW5{cy_b)y5+;u%MZcW3}cbef!lh;jYwa|AcD z@!OOm9bM^SrjCjg?u)TSWrd1%kB(0Pdoca#%CK91$P2c4s$TJaN3MB zA%mcRlNq+zEGsnkw@`H?t}Z}xNkwKH-U*ZUUQ5%B|KX8zXqoV>v zGo}^t&)c~Bg6Ma*jj8f0`W)5{;XT^&N&Afv_)hQEVH@lr3XM(7Aol4++7%m_iK@Z| zybzdC=}U(IBm|6rnF9p2VaA+lz?_+J_n7ftZ$~MQ2d*BMa-?ZMoY72piDxroU=Fg+ zM`xsM(ZkwtbOf0*`dHoJ-ked`XE-T!>x}#F#lNab44NLWN*-3F&|ep?NN|dzP7j_u z-Z^I$Ctpc@fOm@R_Eg^CXd82P7GCbmJVC$n@Db+W$0cePklqoS7fj9z@E3jGA#n?G z7lIzKo)#{g6MbdTPthN3JcEjR3-lIh&t%?VyG42nsUE#LBx^IRA4@1wzw|St?9$N| z@MR`XxJ2zF_NTxYP^#yiqwyDsRyky#~R;^oBhSvi0}iZP{q~ zzb1D_M8?>nvFYkXgIA>N|Dykco9xAFuz99lsP5z&IV}^E(cam;me$tp=uS%IG*0<6dkUHsY@B)q?2#`eJQ>70ghQGt>|7f zACnC)-jlcIEU#IonIx}+mD(0SVuq4H5YE)dI}yY=6K}7Z1Bu=0sPeNmt07&3IpUC~*OKMR{BDE0mv^D$qRLRjR4uBH2wa@K#oOinX8N2VRaD|a!a59 z&ogO}Z;`8|pdGe3r-L1S93XjOF(Psvs^u_v%oYkc~Ac{*-e`fhMT{rubJ z2M;q4oL?Vt7Ct!ZQxPX1iD-euIr~h{HcBxD1=7lxrlaA6ex)pchWEADZRA+T-Q(PD z-ML6osaQ`%84KC;WkiAVHfnfS?Z-!cx*y6i9?RJ7cL}-X9LEhEw<$wfUs{-c#fw(k zSkmaZxG5O5)?1wwchAzN)=3y6htIhZeA_I8hYYTDKu+7icr4H=@P0g>L(ig)nD^W^U;cWRbjNQ-kD42O1I4gKN~ zXc~HBHX0pl$!^{PZgu*;xp5w3%_qXw8I~sx#49OSIA~r%v??cLURcP^KX_VXbefNt z#vI8$3Onx*J;y$hj?5fjaSS6vIL$3WMnB3eq~spRA-6cjkeiRGJ_X7d!QChx*Hp^}dJ#wR7gjBXWGNIo zoCFAVWw$q`8zBfdx|<+K=*yEW;=c|R5y@rETvv?46L7~jVv zBKbWcxdDD-NXq=oWgcTkI#1Jp5uIVYs>h{B^nw%nxO75P;}o@ueXK`L1v$fH(@f!3 zA16;-)YQr;DBca&c0Rg8`Wvs!KJanaBNDHHZgFb;@ZUt;Jq5d6tnSFnshcxGU;Quf z)LZ24*xWPN&4Si0A_V_e&{k#NN`zQOqWn7+uvB zz|>>OffK&7-s z6B~*YgqkKsDl;P$0;1R7L!{AfjSvc*#@tr3Nt&RNb`>!~1jz|h8g=^!DE;B!>X+1@ zG{(0z!kB`7=>ht)8DVzmu@n|vog!e zb13aL_J!=UgO{9Pp$$!<85MfiMNkwheSxYijL`$J z-U`)&oNca}rTas039)qrxLQ1w{dU zAV^jfXkZ=4lO2Qxpv`H64#E-q3F9(+G>vW(^}tv&{ft)LK3~9*UN+HY9F-dOB(~~p+wvec#>!W#|ENJY3fj0< zuOC(PMo{W=k*X7X8rVtD_VJ5swj2`{fL^hK#k;e2u z6qF4!({0lF?vl-Lhv+c*2wSPNY6Q*0YAs_Tbn>X(PN`1DRKm$$M8Cwpn`L_u6^15y zZ0VZg(bTnSGm@p30}a|``Ub+;Ees-!q#dgovg}SBT@Myx_4D-gi$0nY4 zoYgi6Gt|_>mfUOCd9WG00{fb0%x{dG1uIw9Xxv&>?e!#28DA$a*si~|-4P#Zv_u^y zKgMquCow?c(nP-@i||;fqS4RIq+N~83T=xwoT51v2fvl>soi;0H`%0Rr3_fTJkupi zY%8h|KFw;?6{!)JuhyNqH^2Q*D&n@(1;hWR!Wr zVP<>C7_NxXdGkVwvEsJ}hV0Y^MVzog^G(H9`Ou_v(bRz`CwFMe(fRNLjH;71DFqSB z3I`^!k9JRzsllu&bp;#7V!WdfKjdnTV9})UN4-PSzj2(abpX&xysP4=oUgXG@0Y)u zC;ks#@4#JYv~7!4k_sz!R&1+c+qP}nwr$(CZ95g)PQ`xNIPdJc+iiF82h6XH(dQT) zKgJo;8^yR$G2vLGu?J6gOJ}Mn59RHJtKwg0n~mOX?ix$@@2;@8E{U>#b#A57g;ZDW zTRW7gayiuugr%C8T8Ipj){1eJ*!gG+ifno&=PkWq<=uE)dMCDA4y-mcBlwuW>}9HV zl#zJ+Xls{h@u)Ys64Dj&X}&Q$esi)UP`czSkPt1+2i?d7@_9*X|S29ZH{F;ClKf$DA4=fmzJIF;) z?GuTDPY|Zd;y1%E_^de^k<+p;$ZSXWLp4`BlPy;O9cnVZsd_B;d!0onfICEF^&sli zp5iG#14t+1{JzXlibiWdjxR^U!2%X>cH#%xX8L**3^HselY8}rCe=s!4CG7Z4(04> zqU{Ndi`3kYzf7A^5(V5@!xXcQ1{c<>5APv$b`#Eu7*U(D2A@c+78D>d`+J z%MR(N0=hGSYVEp`69#HZ-s~Ai@T_O;^SjOJmnb!g+^sQ_7K%Y}`-BTNOOon0OOA00 z?;;hq+ng{-CLT+t*W(h-CaOrID$%4hVlKOZ6wlOT7(DCmHwxhlf0~sW!@Vj>9ljI_ zwOC`e%eBmz9j9^JZ!CKg4-}+c1K8=gIv)}3;GKW*%hsjW(;@W(fRXzkRV706f3^nn zEsyzz(=!de9C|wHVbkp0{RZ1Oltj#!i_lo{hJfT8A^6m2*3pgfM#8+I5%CU<5Mri5 zprAn^ULor|L28(#mF`E$$507ps1>UmP}*bHq_!S1wxg{^c-nQp{n1VMxDR%VtiQ+7 zD%Kgkv^G7-~$h&aiw|w>(zTOg)cY z*80K@zRWtxWY{G&}@}YC!1u7XFQSX6kN;d(#6mf%h24<8rR^AZ*u1jR(K}M&>Y;z zC9do`p{!$Uk<0K*yK#q`rWrTCV>^wNpxfyPKxl`RI-8ne1J?SJ105nuCM8c%%CtQarKbQkn+2vhINc0zoO|sJ%*ogRarhq+iyvi zqyDI}Xq%wCFi;L*R-)MK3BQB3>{H9%Fgr8k;|_2{-uCRfDM!HFWXs-k&))cv4e}RztPW3r)}S?KI$?D+-{`86%m5;F!dW>|E8(svngB`p2)d)Tm$*_kXsTA5 z0rz~%|$q%!1?Mw^3&@RQDzi<X5FJ8H+IB7_WohkEn8_X%~c7?YHHzE6c?1*)msxA}4KBCKK-BTx-Ijf_j?)+RIM~km)O)`9|*_p?o}Y`D@fSvv0iVXc!l7YeUWD!Tam- z+AG>1?xg_+0RVglqhNo5dRiAo*NXUApaXwDjd*wEquiT>E2Nn?c^*X-nxq-ei*WKq z`-wb7C{zUbmmVtA30p zBOh8`T1da`2u-R_SaYOUef}WC{2U29V#dc(MZrrHYg05M-+f8pc4ap3fi(rqv7kOZ?9Bo=-!kAVJIxq;udQ9qWQJnWaK_`g3;le0D zdD}qsDw~oTjoV!!#j^q5vCPy^YVHtaby&!P#?n~m#MDxmIA`>5J`2_|Jxpw^%zh^Y zl73&KB|xYHJ+#&o14d;J4l=VAbSSUu{_7#u^z9GY*bifnC}%E@m{g+1^DOOb(J(!P zl@V-8-&-S1{&L9=S(LLf($C%{N`C+|00o^oPvBPz^JHeImqngFOK)ZMGzH3!TuINID6w2(lNyC zWpq|DMNwJyuhLd8%Z2n&g5$AQfQc$XWA1X*!k$))*VmhD>J8%u%hod|&m}B0jR-7v35tdecbCW!g{mw{K+g zb3OuQ-ORoRYsq8QX#|EMPldK#y_p7dWwB5VvoG2#SUgg@7;RNrRS?Da%2~D4N3D&! z!YS76Z`Y0$HjfjDea@&S6V+JJd$ep$JU47kG<&SdtbP9`eONw~<94ew^|Y>6PMLSm zcNIsO8T5?2W*gjUgs88dU5c(pH%eifjY7U#pxe1yIL8Q7(4Nbb%bnC>@Icn$`;$ws zQO`aUI)@fhy>N0$F}najI(vw0-zp45lqSa!O0T;wb`eQDz}b{f-sn#lAbz4v2!$cd z2#}B4%VN`X7Z;eyl>5zVdfXwHGz_=QCIX^VY4sJ!2%NVDb;_Ya1X7%G{5(|4K8yUU zXj0H_M2G#fE%2PaEMqksESS*1XxVksevRJ5~n zWKEH%wL8QGSYB-sWl1Fu{J;-{2ZqG|$^88mospc8yuNpod0knBc|y6e4SI_X^$mrm z!xItw=ZjBK5L8i6NLEnrUdP564W(zZrg+<9N$L7Sd#S>E#{2Im4Z&Ih3v=x7;)a$v zZ3k$Hmk@l3_nt6}B59X&%)%81U*5;4WJ`urDxf|uCpiFAa{0D`8~aLC0k*{grNFrV|0^krV)$ z8S`t;1Z~%&Rc1xQRe#-JfNncUh{J>epz;#PdOR4IQ2WXDU%N>gKCq5?kW3QT}TQIkIPoFdo@Kt z?UtUkBRXW{E*!Jl&9fw??vViaAHa%g6Ycc>Ob43o_B( zIFL35M8gV}bJfz8h_i-d+n5kcin>di0OB69pdQzTZIoW815vZzxR=;98vE_ppe=uz zSH5Tc@>wN=mT(@D`9Hm{n=&2?P*YZSCWF&Npps^Ix~Qr&$V~(~nwBA)2%QsuR!&h8+Ag zONgGBP;>wEbLCMHo9d~c1Q`$c4Q!UjH@p5g#d7<+44YeL=qTkd@vNZ^VfkKXQ8kR(z$00)f}frw*>O8c0L}ZOKc$mEC>fJYBvm;9Rht#Xm78}4Zmg}%PQcZ-$ke>Uf7w> z8SL6qMzLJF4~H|iJ0|<5@N4cq`A;6+P!jFtz%sbtOE@7)LCc|fveOp?eMMMwTGP7y z+%HRSj2dMva680@kPxCRne zbjD+^5A3ZCXKR%5YzaE{^rURYWz|RV>S11^4(!#N8KOgAexJC+YqPcv_TUcNsWP8D z&GI1{OE^nsDf`5(?S+UDBg^>67geLNrO}_vlwTZBWM>S`zR3$1GC3nA6IFkO?`CQU z0Y&Vb+aNB-W3-Ku2cmy=h(nkBsc!#aFw3L39)Z~5Tgz~g^A{KjM_+;>gYQc|41qNJ zS}+?4eUh~n3J3OnP*-bQJlr?L498zsPIfnNA1u>$*S7)j?SKY+fi0-0E0mnU}7*c>-F3fh-(VpP2Y{7ZqBp`BaLp7L35|s`br-C9T zXJv_w0yFZjW(^dABIzi@1`vsam2mt|y``P8zu{;mc0_qs^yLk5upgP3t6&mtG$o}| z)!3~|E4qm$grZ0tp$4-%YVlOrRGZGfR8=w-scPUy7YhYdWZiC@bZe^sWHG>HTJr;9 zdyxT_y2z*Ptdusnyez}Sg1@B~e-f6?31^BDjJ?a{oqJ@8(r>G9jnwU9M)q?ysyn_d z#u?rKl@B8${sic!!&wppoW+4u#Nt)dA+o5S>$1_+ih5Bo#ZQB?-103#aDcLud8N@u znOnVGgs2eWj#C1j=>)G!3`Fq$rn?eL^a;~X2N^v8HCOt{HIIDOL=}}COEl9_yu>yQ z(OH=tD0w0q_lht?S$|Y6G&|+jHHXFMc`hzV975SkK7J{DNUHR7e86x=hiO1-$K;Uf z+X^7%^gaXV<73jj9TZJe0@#WhCg?_-oSFV)?Bioj zhQ$WAfgi{=fY#4tLa|L|!mb)l2Vz+_^GDN}2t+d;^D}4M;khsz3#1!^7aCoGvW;(m z+c&ns+efzH9;iAX9I!gjA6y+Fj@};0k3t^(9t}IP9~C>&i}gsQ#3#+Dz|)vqidC3o zidC2@z%NO&z%R)-$1_PC;hSdsBQX7&g||7Kl)pI*6W=5QW0cJp*1kF|q;ZPifU^O! ze)AsxI0NVaxMBX~hY(03V%`#AqkGV@ah_B7EW6YkyTBZ~#2mZG+*-bAR*k7vsi{__ zsg+VAjY4C!Y-2OIx(cQG9}4w9lMWG%EfnhOC{^Dd4&*8hl&TJtDi7o;50t7m zqVGb9y0*l>CRl{D;E)hs6Ac#{7rK{D;c?hs^wk&in`e{D=Jf zhxq&lgIRYY-{lJaa})k^ro4yt+1I35cY!%~iMiLR{Dr;wbK3A_ z@bKl3@MV$k<&p4ZQvP2dH9PgHNZP1>An78`gHnfr@fup?Qq?wyW~p%S7pbgKEm1T2 zr}pH4r}yajr}f4BQ6q?d6{}L2(JkqZ1(=~q5Jb9n zLX}{jY*ziN7d;dY??9a#SxcRqm}*jYAlNY!k97s3M&x?{g z0W|u@vlQL%DYX-(Ogd4ND^ZQXE&G3+NU^7$_Rb#gst!eLuigEZZx>qaxkN^8BU-Jx z_|IRMG@G_^Vcwao)vo8m-hr%DaTkQ82t^pk3Zil=nZxbZT6H3 zUK_0%)jG1Jm#vEw8aYlBFLBtV*7-^-;1)2}XxJ4z!l&o6iyE5HPOvVG*i}5DnoVuy z-PSl9yC1o=a=ir6_I@1`Z01Hh#5sm>2REN3oXC5zYZcGrO+3K1^KYkAFQ&{gf5^6r z>qx1bkIXW?g0(Bp%saWWXw}%{W8Q1G%kgAc&$rA@y%IY{bVpe)+2pR@Up8v>1W>$c zHDb@X%<_Kl4(7`4x{O|gxSr~o=FiqrFbTL};Lg{$Q$T%Z!&GA<@A~|4gS-1XzZ^Z_ zGE4c4Yg)b57jero%eg0~y<~KI7UDW}k+orVTNmp9mUHy&H$R%?`R)~PC8e|!j0bmy zFar}R0YXTcFSDQU`A;`mGS0r{nr~CS%WuZ=|1M^UBmU3%63YJ#^8aI`l%z6Yzt0Tc zd96anKDOGcWP#iA7l`d3aijV1N4x+$2@W(){$b)5msHioU|Dd(Tp#07{||y9+4=Fo#F3UL8(|l4(BgN+~bQr*y(Tooz3#Y3gkrP4-X2K7>`w?^J)N6fZXMg(-mDv)=x*KIHMbd-vsdn| zv^qNcfgqoRk$-0RO7@732V}m2VY{}58Q!$(E4*ksoWMp_>RBh5*fLDOhV@L zg9ycPi0E>Q2cIyUQ~{w=YMiE`T>u4Wthm5JRA5PW3#v5zZI)PMmaNno-tozKz0A@6 zsx%08SraMAE>;sW)hZog6wJVOqX8m;y1II3o|DDgpon47bfFkW89K*9k%zT6)IXiD zwmGYJ^-RCp&H!M5F{ah-q^~As{m$iH%MZCGi&S7O)JLZIQK}+SiWtfAqPVTf^IpqC z6vMpZDGTUeU^2Bwudt%VdHH}E85vG`QY*Eg{OE$?UzHB3124h)YNzE=Iha9>VX|r* z5z~jBuHJKtPmTA{X5>E^A^`eQm6q;Wi^v*<7eXXWtNl)}WJF3#5hXFpW!(7UFhEO` z6zaQeP2RTNHeUDKV4$0m@Am@Xc5)R*B_Xx$my4-_Z^5l=B_$2<3_3V4STZo{bnNBa z?6BA8#!m4g!HykbMvF`?9{j_o9KpkFB#;y;j?_>D2jc}cQ!w9bf`%z^y>Qr@pC6{Z z2xHM<`b%t}RxFMx3KGgBt4SgT%Mc@l;O)*^5d~ASt!9Nz0$0BA(qB ztoMl(U)C!@07EYqd(8IrUH<)i$g2))YN`Ka3YE$^oh+*9ye&s6_*{NU)LL z8PFKgDu)M`N_FxvBEoWIKpH@C6_f98X{ij;REiORxZu%2suq^V0&M{twHW?_`^PwZ zhgnE1!EvnX2*5q7^%q!g=%>m_dVLEt;2}XebDlJ-!5Fl0%Dx*K&oP??wA~S9`}ki* z=2|i8?cP6s{4hfN&jR+}GYg!56|nzg>I*p;Seh9c=~@4aX%;0fC4(e~%vHmXb($!T zY>J^SH(PFn&pae5zs5+9Ed`~7WU9FWGeAcU;uOxHfb{eMSIuZQG@pu2O!Ew6y=l59 z@(u;q<1d&~I?w78^-X1saJlk0-g=vEyUTXYwghI4utVSmb2DPvS8dNuQ!4)%_KUho zkLt9X+}{M^+6W`iUk@N1=O>e_paLmAMa%^OD-YrQ69X*aaC|Gj^P8YeFZp4A{+e&C zv@`_fbf#qiC}t?Jh}K_$b&^iD5Er-ecnGqE2*Cg@FFtL~8vPAT1m{TIQ3iq!O;De~ zJ|@eW+J22EXPzD{XTzk?JZ~A7ewSRdRURAJ8Hf)Z5sMN3rGdl`Z3otKhC}yke&DA^ z6j;DI+`Gy`<)UsF#W}-K-s~=>b!Uv%ZWPZFoQ3c+o~fufadUFVv%$#hRcHWPX(l?5 zf$~f$iQ*`#y^NhYBK4NvseKQ}1W>Lvqp7Bu=XMnF_KsS<++t7r~@B7`&P1p;TjG^ zcqLGvV1_?aw zXY&r!xsjBHq>+q!#81Pu`K9%n83CceNyR2QCe*6VqojlQu0!8o5$suf|3etfQv{hO zmLzjfMke&94!B%&9gw(~s}ZT)_`rfF;-dnipe7XG^>z{d2iQLrLVy^pjlyqL%H#jj z@DT4m8umXWMN&4-Mh--hHU@f*HvgX1dC70ue7nehZC+hvnYpZCkAtG{eQzRpBsIbj z3zEtl*L_#5^*YF_aT8CkYO}7cpeLpOJQL8D(e8;r-{S6o;&{gT#-SHL;*(f;(sA!3 z%nia3lqyo@(w81jLvNx-Wo&$8y>T4BPp3ItjptnZK1fJRYaf;bftZbZXT~i^Dx`2O&dVh z1uGfpnt^FEePFol8kZrUn~zn$6)OSRyuy zfM)(SY8H!&RC{WHqbGvv*t#oLVb@hA=RQ?~nW)g%rEc~hkQoxO9C>t^YbtRG#^*jt zu4EpxEdleBf-Z}^R9zif%RD@sYNJ3AO{V5S7nxP;EO|;}Wa*}<@@nt##AUH=rX2Dc z7qfnM^kieQ-(|Aa>~y@Xn##f59d6-iu4piUvp0AcFWPP3NNKBcK0lZckFvSJ+SBDl>uxqepi0+OQ-D&Ddo5_^PcSK6u`WwgU0b)H`8BV+HJvD#b#kj9mWgiJ6xxZxe>)z zKrmuuZ{{nwxF}NF4gki|`ShjSiBeBRFGVY1H2`y?62e6S%a~fie#JodKum&*NLvG6YR8i*`OPUqD?-D1=WUPHeP|45m$5m} zgA~W+oh!P;tXwd%G^x{9aB+N+S|*jyUmFROL_gc@L1}D#s&gS6kDS&BXC$9&z6m? zL-;@n5m2DpUD-r|MPP!54`UOSjDm+cFXzv+>+Y`_ue}CvXCPK-Hcg>q|FSNx!w=yW z?W>5vg1I$i6l+ihLgf;aT7O|TBU@P(5aHT1-&Fs~WpmJR0BDGkhB0GtMjbO37K&ydv@5ISV0z_Ul&HcWL@+QtWqxic zw~^=)(KD2Jo53smgFX`h+iQ9!^F+2&SNu zFMA4@WNQhV1!WQ^Ne+`GOLS05hl$)i-W+8TE#EH`0YWJ1FJK|m(dI_&L%0LwltEDO zYRu1e6naQHZ*ec48K64#qdc`ncPmfxP9F!=loi;a^ukcXKSWQxR1d0nd|eLkH*P?3 zDMYe>erwxIP@Nb|yS3JLoWO2Dq8<^Zh)h8iok{9$KsUtjjDQz2WBE?&-fiO7c}F3&$^M&j9bcfb zSt(eAEm%9PY+NW(T)mJ#j4;3sGUs3(f@?XQVn!!=;$=|>O~I? zqDqLQSUcSzBEAyBWEUjXaJIJlIIy}jkGFI4}w^IE$WOhxvCd)xFQKbmH1%uh< z!y!yI)ExRb3*EO-xZB~M7C+dCp+^ZHZUw(c0@Jdi?2h&80n^)|NUC@28tveT>7Dmk zae(oaMUhDi!zx+#LzeFjf56++!i&4dMrw@A$G%fpbkO?Gjll-r^?nP;QxnQcsP&Ytzy3>S2@Q8m<1`Ft{p zQLPEy@0Sp!jSzhD8a-wIsq4h6jk?MG@n%>KMoSU@A(J$*y8J%5PFsG_`B6y(IP+Fq zIMF>EX;r7U zf@B;O6gW`eM#|m(e-t~@+hwi7!Ptv;V_dU981ggtDz>+1T4kIHty@`co5Nd%C8r8C zVSI*l(ChhDXO&&XdT&w|V@mW}Is<#gQEplCQbTFYCWbr|dlo|l51f4lSFI(vFah7rR1IXsXv(r7a%s#{fI!#x@$M~=1-k_yPn7bTrlSaB{9 zLPZohnTg<=^MlJxF`D*uvh0}LG%8(*bcsIZGo5tHV*f78=pmQEp3jvcC?%QIOXBDg zm5)Ok+sQ*6QHli+VkoYzaHU3B9^6PAs-W7xTw*+33TeM;5GHewZ#x(fHnq52Q9O=K z^>MeMtdQDxWQVN&KDzOs=@};z_>|lXbHgSi0}RJq=}`gdF}O|88sH_5*#cq-=Ogdj zC^#D=L~QTL+@fI?pE*f{$~z@BghspNU4V!Fs#3-LozGHTj?>B1xd8Ot{=E|KwjM%5 zEG47vErV1fiAg`G3#W3zURn=6ffQ=Vc0-0;$xk@FlW8vU zLyL2uQ=Im|4YYbBiqmF@3w@8xU&}T17>6^;#LakBuj7Z1=d{t;G5!2q+AIN;USo`j zo}w;75w6tBNG`_EqO34>#J8(9-4}grcE-C9D{RV+pgBj_Yw|uxW$y4oX#=9h7?(fb zOe<_tv-C-q$%#de_R=eR;^Sqp6YJ&8E;!uP+2D1KA_fe_37n{-{9Pj+S3Ju1qb%eg z>sNBZDW+=LYT=f(h&?%o2{Nz54sdcJOgbgr@C~Isi7masnrwS2{btyNs&@*DC?NC; zP{z_nsROAQ$60NO=VWk-NJ?1P&JI&MMwui`Fiow|3A254?fz+faBckAeJsAyJWM^R zu}hP6={zqrjBDf@Z2D?B+!Coxor0Zp%r4xPa_oL|W1O9Fi?oq7txhX}RXC|9ZM;Ke zU!&JOT^#9JDT1pntlP>K=^kfg;|xD)xz%4op%3K!63dlW^<84`x2XfTMV0j z2zFlyo4<>(d)wIKUrm1>?zX#*-;=gdw%+6%UT$lZMvP!9eCcm5k3Xi?gvLWe-{=Br zGx%Hsu{=ia&`bLFSy5!xjAaC-O=acdcDY^Q!Ev%T{B)$RdTTyyz_anE8a&q}2C@kc ze-(Pg!Cn-A&?fAo{OuG6*De65!QBA5DvAc-4o~S%J7ldLY37)zd%MMd`^1_$$6Wj( zxt?!v)#$dGaN$c6Q`=C-4m;0`MQ#he1Vd!&aW3THDz@F|bT=u&&NR@OyoP_J!S;-4 zeR4zb>Ggi0Q{ughe$jNpHoA^z8;vyGfxIFF1$@Ua{9#Oo9#JpQb zj7Jp_qnvh3)EsLJjW>t-+?4K|twVZacjf6`tOM~O>&ya)f-14qK1$6EvmOdEKw*(qtgquA>m$#URtg_!9uKJe zC{-K_pgN=z3;QjUmi}%-K&+Eijof>u^N(xvXY~`t)i?|C@l294VXv zMb#N26d*duh2;y_O_meTHXsVcRe5L{b++&4Pn40xytiB)_-Bo|8A(m822-m!ZIa4q zdnssDM;LJjK%Qj*28e8mqH-_kViN+#U`6kDDLYExzeNKj2J+>=6;VHlMz|lJvNA4XV|Stjkw4n+P#Fo1 zzwOdQEaM=`Vv!XPLSx-=r*n*qSZF(^TNSvGpQM6P*Xjl5eT$sP+emScwnTqdlZeaL zn=->%zr_GaAtP;=6Twm7UOtnJ71RHcg->7<;z}zzZHhT5$mf)t6LOVtSg;ll7*Tn>^#K-k{ldw5PI1CK=$-`v{+zWu zs}jH_F+fBNEBtgm;h%k=VOn+9$Wg$c_R#0^fp8Nsf;`!>%)-9IGrxv1=vus$ALK7q)!^zG@^O}l`*h?eF{Ne-Z0qg7 z(Rnxc_IHB_m~wC)ZPkV1dPo&=h{{CB-qXhM+d6UneFMJz#sj`x4Ym#DZN({orrN3Q zr9_xUIBV?jz=~4EPDh-=EaP=rOF_62%3OIw)l^m`%d1Ey^4yls8)u3xqvN*&Wse}x zz%~3j2Sf(9k2uBNj;Y%WvIkaIf5EshFWs(-Zaj`;k)vEbP>B+G`2&rD*qCD%F5q2n zI`;q-!xC;Eb{>`cb-wQm@~UA6HfPbwers_hTZW?~{tqhp-E-BCD>kqD!{{AU-w>8C zo)9mwlcLy3NX3JgO=}m-0mtmh-BUuC-$HeSDJs=Q5;tPJth7(mE1oCY1I0g<1nQwj zJW*&+_uXBYk|8WWX|uV02SH^0Y>T^5EOB1)*GkIDq2LO;MJ zEN@`|;YNBZ2mAH_sCwUSjbEEk+zdQ4MLcug*T(S<<5K-?eFFciq0sZ9|a8~9V z%rc=!awqF!XogL~&uw=j_6~FH(q6 z6IFR+0i@W|!);n?u|RO@_O-c)v4>(mst@zUdvtO=aDU28g)1}b^fbrZp8$zj3Iev%WYsWg`zX^O{;Al%loU_bHVtH*VG~xvzts@$EiVp)>4)GNv52x zq}ftW<=jmL`O@qW&C)93Xt`uAfPne7o0tnWs1?jpfU#=d^ccYrPv!#8{!@njPDgM8 zA`#i!TgRJP?6(QuYgq_^NvmR>?1@lRfZV`5pEq`L&Vg|-N){b2m1-=n7ZH+0dfoS>Z-MS&w==MiSDs@2dxs*F z2KzO5M8B1?3t`MY=RGw)Wt@ie-80IFDge8kFRil3i06_~lHh@hW&wRyd;gK4#yeM@L)qJsAI?75mj7#{vQKiXB` z5EP|GhWi=n5x0lqL{1r5Y3ToIpQy$Mbm}8Q5Dwu*`bP*^s4snGvb=GdMF8Xe2(fvN)tz= za8NHfT4bj>^xN>fPUXg+x4z_}j# z!41N5(sP&1PVQx3-D~vg2i-l~$0I>Tr!;NXo;T4iDm0)eMIDFTGCF%B6NukWJb?;Z z^QJ{G1%XgIKc`lo2poB~c3)Md7LX)AVUL)cr#pVTD@t5o)9pP^U7T%|>WzR|c!`QW zB%6t1@B68rnlc_ETE|34%`EjuY6!3Mtn5x~tgOUOqQw*sQUYKg`~Cw&;H$x(_AiEu zkK`r?J^wkh=6FfT|R3mu?zQg$I$b1Ut z^o$+bpn6iiMEP$Ec1zt{9@rqfqyEM2c4POtv%FjC@ceLoJ6gTc@Tsu*u;T6+ICg>Z zMtj-xzsBFDeCB>F!PeOl^U#!PO?PyvsraadZDl_>i>-LmEZWps-mPDri`f!u-{%Xj zCQTAOUzgdd{xgx2!ni%fIi{WaCAV=&uA5BQMY6s#;EAOiLnM+lvk4zu~ z69i+Mf}pGcut(VZ3oXa`r`m+B81%Ov0T%*ThPb=%Z|EZ{Zr{l_CzikNuAo)sWO1Gx zSzVdw$c<(CZi-5%UW|{^7BoN6a&eWW<=!ccq#i04~K zbfBXuSWd;yjf%h%5t}0XCbN%dWr z%9|9`2R>rL@u=ZY<*KdcpAqVrn9bmm-xU${8}I)wnEdaG`0u2-e?_SO!+hXhh|`p6=CG!%@DZIV5iWDNbG|0^iY9ehy05e+uM7}^$3Hq~FI$~%40lIU z87vIfyAC{`S9(8E$-GT`dC?o2^9sq)|E4U?m_;W(>rdUX0(Db>SVF8?d|B85?i2v23ADv=jm1-U1wcLoSW$RbX5lwBl8J%-bH(vzrmXR) zJCrv<87fR*VeAcNcl|rXf^Z>~oOYk@Y7sJ3+KrCNFyvf#oF?)=C2Lp6p zi}tFsxlVPucvx`CBmNJ&-`ZwDqPe=c9{f>x_~G}!8}4H-lY9Xp!pHZ#0*@Rk=*r4VF- zujNO>!@3089l{-k#p|Aix2^0W+<@n^C%NqRFo}J2^@{& zSLFMddesIZ#OZp$JRmhN$EHiNam}Jf2O=?yRs4!bjy<3tVAB1KTl)#e3y}0LLyQiB zgm`rvx+ok_py-1%b6<_ASc;KjAT|_$6*xqU_V)~?AVyA&mFX8nN~hLCKEN}af)nxo zm64$gY7p^ppa4h4fgJiJ>cQuSTEw+T~rbzUt zIA^*-68C>4CfLaM0hWFYFsuPs?ID(aJaxkTYPQV&T&Pyjiw$L7LU;Fnfooey`jjD$ z2WUq{-p`jo(+nZv-VGI3#o^{ zJhUwWQYqvttyv<{915mirZ1=8^TjqC2dkmw!i+)nd61AhJ+0}ZEusuRAMzl zX&~rRHDw4%ogsP$;U@Ky+6^^g%h6tDlKZ%~F9`Dab7mxyiq1Sj>h8v@`j=FVcU6aK zXU>0dc5-piLr!!twp_r&pfyaPMS9`c6{#hcW{&Ro$!30{i`)(_^^QFcgn`IdAJvLM zg%BdZL;f0=Kh?w+UtCUlvQHBPTo&aeK@d^PQ@CjSzR}tZ#rtR?$#E7L=>`v!RSkL&eIIY#4B#imzq^>k0^7}x`D#F7&_-uw8pMx zP<{)vq&!QRv~|T5xkMr}?(dso)d=j3IUw1f$PWd}$+RgkQQTNzw}BNER;+R_%${&g zHK8YNyw=pffj|`ja!!tJQfO}%;wdIU5zU?lKB|FWL?Uy>i%S~C$svK;;A1-3 zVc0vqAVW;f?YH!wiAO4@nYU3FKkeqrp`MTPdl?;rd-*WZy7mCk&HoRiKwH1X&9O*L zu*pwVQm>=jfy*Q=XBt1~* zQ6xlbr>Sh4hs_c<;6_5k!>0vR2%XF3-b|+-PvdhxcP?Y*;TDN!;F&~02I3l}Pkyx` zjDb{tq-sHsvr|B z``NJkpN$`MDfAUBr=5BduabB*#~a+ly`2)TQN7LV{MSmnuGe9y3DT7_yun8@+j2<3EJfAsRG99@n(s)utaBl>T<@|+a%u3Se+!2H5qlM#8!p!*Ke>;cS-y; zqqGfX|F;tFR&8Wb%JiQ~{JY|tGn*F<fzO{=e@#;*5q>FQER3UK6u*-AH7_-t%G1t#nwdH>TPRby%M#XuWt{!ZP(5D_ zDLmL5gf=f?{2Y|ii#R1|%f!isSWemSu%uF~5T}@Tft2*z!bA5rP1K5& zQuxIxvQ2P3UBu%DJzS(N9m^=hMEtHVeBHTyPRze(Ms~B!g6pLaotB7t zHR>}=2HPUeG{hMx2k9$Win9cjP7XR+ikyvpumlzL@KgSL%+j_>alZHkS5qNJ)2ZeJ#_U%}aV4|c zLR7dg)zwn$P(hsEJFMWtgx5&X!i0J>#_zdIdYu&4tJ1?))r;^(DQ;2{1DpMv7Q`)5 z+zPoQaUC1oe3xeY?NZ#qaYGV<(=z1|Q$nj0zfwltxQ1c^$L(KB@f-15e)BTlk_Yz9 z8gpjXFn*d-+#~KY#JzO>`y1z*ZVuDz;yY&!8>&r;WVfMe)HOY=HrgBu1ZRiYRkC{i zd1D;!6KOj)LU-q?Mt+fw^8=Eq0;!^*Euhdkm`YMR=+rZ)C%{2}oOEg7Uph$Ohn@_` zRBe`O)A*@YjSqla;&Um!Jo*mo)gMG(cb~q4Up~A0M^JxopFZ#-tCBm^YLB$qVPM{2 zhFk3j)jIj1ShWRKJJK3In%2YpQHme==ArPEYSlVM!x+`4vO={KBGtMaFdill{Y2`W zKsu>8AB0JD9WZ4#cwI1UH_Xs>LmB<8pubg_yJ6P-YKl2ZT{dAh33AbQFnx!R35L>_ z7chdTj)mh)@q$&P39z)d1LhV#2=nT4w2wPrei9b->77uVm4w>j%p{!1pQXiG66*M~ zoIfjyZAmzl={vx`8&-8g^~Ix;uzDA)*#mFwf(Wl+K%xUSxM1@xsJftG7gSsj?S#{} zx!{~=JDfM*f_Av59e&vkm!-(BCUT-}hn;=#*DCz=hv08g_*)La->&d?(qtDNGIp05 z`^~lB7;sN3*azH4T2NoVnGm~rAq+;er4Xi!`<2_U-Iplm8wECM2aprylcSZ8L(QZe zsiMtaKpVf5w*F+=_*Jy^m(#}IMO*(EQT>Uw{%aVINO3m@CgKQ~gj1;RrM+q=sb_-G zg%X4TbOJlLz1)CFU9^iSlxCs~c%X}p$N!elLD&c3_omNekE4Tl9QpOmUGUJ;kT$v< z9@z~KJqSQLz=6Wz}tzgrpWag!{z(5y#Wb*&56aG$4-zsi%!57{vatM75InV7NUGSwhi&&Pr z;45zq$@#YnzKMEsGc86Jd>3-T4=y-hA((_PU7d&xfljo$&=K|Kk;H5Vi@X)G-Fa?@ z3)4b0r#CMzvjvZ*L6Ma9^}IOfVo0C)s&L%Vg2Yh{6Eui1OX$Ijw4b! z4#&LV{pk2J)+4Ksa_-!n*Mh5izq)qb2)b>`uU0+# zT~lYcu&}0%wyC(LE}Kwes3F`qY8>Pu)bO-5rTN+EQ--_n81D#eNsyn^we zPMqK!=^p7GK}$?`kMxenE0{8TYXRmJc=8{~JMk1!WMHQ1WCdL4XOTs%FsX-t;~^$6CWj_CH*r9OL{>ywE$I_uTA8y%SY>&DJ@);>GTC?_^H~ zI}N)Jt({MW2i=o9@siT1o~gF+?(tFYv7V`#0!lg9dNSJZN-`RK>9GCK!2KPnzeDvY z{FY8oEHD?habj7-{4UIKNOvXCVHMiI?S;yuKalf?U}8I;5} z#Zq@c659zeIEkGKv78VODrf~k57AHwIYts6A!w|E9w%tDf}SGi*d#tfO=%MU&r?Zj zNaBm0N>4@-UsgiMvHqCEH%;}DxR+^WCGl-yDNo`%)J#m`d&EK3P2z_PXasyj1Cx{Z z36qy4@iW?|uu5zl_>Uz1v$zfaN&Az;e|a)?mHt8L)(K6?)o z)9%_p1x=X7{W%ES%tN@g>-}PP7T4nHc$ww+sZ?u=1)kaWQJHocY=cY0 zBC{~n-hpqZgsh@c-=|8qkuZ-6x#OXNO48$D5v+h}Do9U&W~e336XAR+Ww*gea0%4G zc31{i!g9C)PJ!o$@_ASZZ-O88K>)shdiWB8@FUby;Tk|2tU-QJ&4#s@4-Gg58gT+N zVJSqg3Zl3K*5L|Rk0HXxA%SN>GhPTA@JiT-SHmW}h1%Pxe@e zwa?&a`ztus{uYk2@1^!#9B=;^C)hv7iS~cvB>MrJtm`;MAAwW#(Ri#r0lm5xOZ6(8 zrq9Fa`eK}+pMo>>HCU#{uw37Q75aHtsc*w7{R;HyEjUZR183{^;2gajkJBH*x%!hh zPk#ZA*I&o^`rEib--nCzudrJG5l=8QtT80k8Ut~$F$_;MigAfC0hbzHJjw83ol%3! zj1{=TSc#_?oA6ZQW?X4JPVE!azJ{xecd*`gAA`nc)cy-sJ0yl2S-8egfNLG2u+cFC zBaQ_abyVXzM-10HHe%dy5uWC_22Xd~fLk1Q<5`YQJlpXQp5u55&vm?v=Q-ZMt&X?x ze8-2l&G9u}>~!KUogTc@S%8;0i|}&ic)Y?n1Fv*e;Z@GLc(t<{uXCP+H#nE$jm`$V z$r&Sf3*P2D7jJiN!#kXp;+@W`@Gia}iWaEKH~{nM&h}(E?gtNc!61<8Cif`eG!5ww z0jLp*BEyfcMANjiYORZIp057rtRDhQ65m5%wRQl;Ysm1hYVCUv`(X%8vKZWlV>ZMI z$RdUk+sH1u5U2M;4bTPUkn@vr=&pGH3Nco6e#hRj?n@wGvyVGuzpP%VE^d zu~8$i*2DU%|tKwR)Ykg=cc zU*E%^JXwwhNHas!mRoX1|JQO^3d^23Wzv-WkY8AvUO*vf z6A<;5HvC@63$Pcri{Qb^{}F8X8j-IN;s1pE4I+P&$V1()eHDa9ez7!brM0$|CeU;< z7$jj`&oVOk)fC@?T>LW(!o5mmI@*IsTwEkfakfust$Bn$Tbp4PD>GZQ=>!e2iV)k7 zYhmx`U81>NobIu;QB7-W6X!7W9Yg0fgj}$hUux{5)iB*3wp+lC?H;@8+8J&a=aHBT z`WLgUAz+Eo`xB$9uHIJ+RZkc1fpTq%(F)_ZlV>QMpDcBZ_Be=xFOu6C+MyuBXcrf6 zH89U$Vp{1fUC;B}dW$$tO|{gz5ioLla2wb!*44+fFkyq#ByW zZBKEByoP1H9&V!-H^FYho7uyC199&XH=BiPH9?wX*DTwV>{ggan7nKYl{4CtrTDXytQ-aBSh74h zrCD3EF)!Pcc1zbYtki8S@FvZ2r=??ho4Bh@-0jVBXYnm#pgT)>MT2sX0KePi9*pW? zyWgAR&N10?`q1Ps+d(MP6j`Pza?M_j*>m-0m|WG(O&O*i3YY4-EQ+lHhYY=C|5Mg2 z|3(;REmOT=ng&}ins3vMdz3=ohokTV zsK5`YfZj)i^IzdYDsq2~e}nt+6X?WG;bHtcJddBjUkUyizk~z$FABD+K;kW3=@9<*Wk5}LUY{4I~6}#|Rip4Jpfo}*6_X(RY=uf6_2)A&G0+A+)MY@(b{q`Mhl6t+F4?}3QIxAJU|Pk%yK_CIJ1Z?lqVo;CJqXB#ot1D z7fynVUW1xSELt~B$#;;pA0}&A`{8IUs|!vATZ)=&`yF^G@Ws00s7FOw`r8w7`Ja|R z%mpD>Cm}jSrwYVK;?EKffb;(WP)i30+oPN9s~i9Tt}_4tP)h>@6aWYa2mqma3`+n2 z0000000000000~S003%hFKuOKVJ~Dyb#5<2a&>caM|EyQLoRAzc46&(dvhDNvghCO zr}=gpbOc1pHvNB8n8f{`)f2X17JXk^6~Di ztqN1INDRaegwNlv>g6#phyJT-C#;^XYuiEj}yf7j|{kSBr%}%`7SE z^WpPiS-)RYXZnMBQI^C1JbaHo`}gkMyIg&oRwv%cv{){^!^LX3!~hSUdVk*YJa05Q zt!Bm4Th>L5N+0L*X<5v?_fNe?-f1yi0s?9|>rCfohecf&6=jvTy;^yHr}Up{;P+uJw4JbMQef?+NyA1oHd^~-8mKV;yKy(!u*is{eg zbbeCRRk@T1cWU+m-}n0#6cg3QUO6jUbi1Ie>RW-7toU|OPO1|ED=I8?f@!!u{iXPf zMpyWk3I^VyyqNQM(L$03d{G}(fJ^|1J_AuCsc?-FpG$r!iwP!<3PgK!?bX#qd0fp- zNsuq}H z;nQldtdCC$8g{){l@17!NGGesqMX$)p4%PC=QFV4!N=v3vLN0T6^`rqq7=Z1c+Ib_ zoG_=nE-tu#o;NXV3VbSOa1IKkYIQM)V&=Il~%TUnl$x=oa3YTpv%5M8Er%b)L@CiF);R5P&Ea`jT#_d8z5^)CM1u~E?0Q+37sL6ghLXipO=rFP zudcoGs$P&3)8_~8zW2cEF_rthSETb6^VMu3*!4%lKggaPyC}v%M&rZ-h8IZSFbB<<$z&WmgsagVnF?m|2%y9PvN&+F6O_(?)7xHqD5f9y&OXC z6|h>pR#fh3RBbH$u$WAG{=g_SMyO_RQCwWWEqdhH@V$p#kocaaMBhKvX2bGhgj8Qt zvtBfibb2-`7iZTRo+bP;jSD1+KNfHy=2rp*I75lX1@+?kPh+ z8l(n1G=XdUVtxg!PR@JJzMPboVv5Qy{XcIyXk(~P-jewp20Bz-R+s>yRkE-ALxY1{%AxR&Z_I}c^2ZK z@50=imkgX^&WkY)ZF~*WsIq}nGUynDZ8&FVE!#2o{z!9cbn-((Eiq982PL`NcA5rV zY#R3I_subweAJynhN;w>BAL_=kKX1RU7p%<$GSVtCPb8|HV&I zagh%-6yt?Y1{GFol~3mjvdms3+)4a-sQSZ?2M;WffDkAGeo*&_a6{>@=Mvgq=Ue|WZ)eC)xB8fdien?RmF%sRh*fPp+ayZ#xS zqfUp-$f@WM2=nSHj9i6rw-5%NTm)C`bY1PSt9Irp%-tY@q2GNFxJJjd9V5hpz%@uw z?jC308m1_Bk2G)%RFpf$8mt*>=o+dhcaJt)GuUv=V8bn1YHkAK9znB$3VlkZ;p@NAN~C7x1-n3k6s_W|JP<`q>+{3w49yQ z=PunYyPI%7LS-O!GG%$Mh4gFnq2F;|MB|4#%3TX!j%T8>myRlrs%_j0bgPsFX_f{* z3FL!igQ=2y^dNAM#zI(CePE(88o6>S0uKsxSC>YP$}|+4BS4XPJgv#tb%rw73;H%5 zCkvSMa_JQw@IgpF@lIDW&i!7US10G*$$VB(@uXh&u1cF79$ge-qSP}3Ljlb`e{Q73{AKiND`5r_?g zfzttRC}w68KDSA1;V-GQOzSbpiu2RcWl8*{7F33_`QoCO9(-KRr>nX=n4L{ajww6Y zh&?T5V8b<+6bKK6(r(k!5_IAI?bgNQGr|*q)!OfM0i4X2YXD4SfU`c}vFo?%0D|bt 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 From 8495261c158f5483e12814fc157bca493a29d345 Mon Sep 17 00:00:00 2001 From: Spencer Cheng Date: Sun, 6 Sep 2026 22:47:19 +0000 Subject: [PATCH 19/19] score --- config/default.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/default.ini b/config/default.ini index 034a5c6ba1..a5eafbe65f 100644 --- a/config/default.ini +++ b/config/default.ini @@ -107,7 +107,7 @@ verb_eps_anneal_start = 0.4 verb_eps_anneal_end = 1.0 [sweep] -metric = cl_perf +metric = score metric_distribution = linear goal = maximize max_suggestion_cost = 3600