Delete bone_types.py
Browse files- bone_types.py +0 -482
bone_types.py
DELETED
|
@@ -1,482 +0,0 @@
|
|
| 1 |
-
import time, copy, uuid, json, re
|
| 2 |
-
from dataclasses import dataclass, field, fields, asdict
|
| 3 |
-
from enum import Enum
|
| 4 |
-
from typing import List, Dict, Any, Optional
|
| 5 |
-
|
| 6 |
-
class Prisma:
|
| 7 |
-
RST = "\033[0m"
|
| 8 |
-
RED, GRN, YEL, BLU, MAG, CYN, WHT, GRY = (
|
| 9 |
-
"\033[31m",
|
| 10 |
-
"\033[32m",
|
| 11 |
-
"\033[33m",
|
| 12 |
-
"\033[34m",
|
| 13 |
-
"\033[35m",
|
| 14 |
-
"\033[36m",
|
| 15 |
-
"\033[97m",
|
| 16 |
-
"\033[90m",
|
| 17 |
-
)
|
| 18 |
-
INDIGO, OCHRE, VIOLET, SLATE = (
|
| 19 |
-
"\033[34;1m",
|
| 20 |
-
"\033[33;2m",
|
| 21 |
-
"\033[35;2m",
|
| 22 |
-
"\033[30;1m",
|
| 23 |
-
)
|
| 24 |
-
_STRIP_PATTERN = re.compile(r"\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])")
|
| 25 |
-
_COLOR_MAP = {
|
| 26 |
-
"R": RED,
|
| 27 |
-
"G": GRN,
|
| 28 |
-
"Y": YEL,
|
| 29 |
-
"B": BLU,
|
| 30 |
-
"M": MAG,
|
| 31 |
-
"C": CYN,
|
| 32 |
-
"W": WHT,
|
| 33 |
-
"0": GRY,
|
| 34 |
-
"I": INDIGO,
|
| 35 |
-
"O": OCHRE,
|
| 36 |
-
"V": VIOLET,
|
| 37 |
-
"S": SLATE,
|
| 38 |
-
}
|
| 39 |
-
|
| 40 |
-
@classmethod
|
| 41 |
-
def paint(cls, text: str, color_key: str = "0") -> str:
|
| 42 |
-
if len(color_key) == 1:
|
| 43 |
-
code = cls._COLOR_MAP.get(color_key, cls.WHT)
|
| 44 |
-
else:
|
| 45 |
-
code = cls._COLOR_MAP.get(str(color_key)[0].upper(), cls.WHT)
|
| 46 |
-
txt = str(text)
|
| 47 |
-
return f"{code}{txt}" if txt.endswith(cls.RST) else f"{code}{txt}{cls.RST}"
|
| 48 |
-
|
| 49 |
-
@classmethod
|
| 50 |
-
def strip(cls, text: str) -> str:
|
| 51 |
-
return cls._STRIP_PATTERN.sub("", str(text))
|
| 52 |
-
|
| 53 |
-
|
| 54 |
-
class LoreCategory(Enum):
|
| 55 |
-
LEXICON = "LEXICON"
|
| 56 |
-
SCENARIOS = "scenarios"
|
| 57 |
-
GORDON = "gordon"
|
| 58 |
-
GORDON_LOGS = "gordon_logs"
|
| 59 |
-
GENETICS = "genetics"
|
| 60 |
-
DEATH = "death"
|
| 61 |
-
ALMANAC = "almanac"
|
| 62 |
-
DREAMS = "dreams"
|
| 63 |
-
|
| 64 |
-
|
| 65 |
-
class RealityLayer:
|
| 66 |
-
TERMINAL = 0
|
| 67 |
-
SIMULATION = 1
|
| 68 |
-
VILLAGE = 2
|
| 69 |
-
DEBUG = 3
|
| 70 |
-
DEEP_CX = 4
|
| 71 |
-
|
| 72 |
-
|
| 73 |
-
@dataclass
|
| 74 |
-
class ErrorLog:
|
| 75 |
-
component: str
|
| 76 |
-
error_msg: str
|
| 77 |
-
timestamp: float = field(default_factory=time.time)
|
| 78 |
-
severity: str = "WARNING"
|
| 79 |
-
|
| 80 |
-
|
| 81 |
-
@dataclass
|
| 82 |
-
class EnergyState:
|
| 83 |
-
# --- VSL Somatic ---
|
| 84 |
-
voltage: float = 30.0 # (V) Creative intensity
|
| 85 |
-
health: float = 100.0 # (H) Structural integrity
|
| 86 |
-
stamina: float = 100.0 # (P) ATP pool
|
| 87 |
-
trauma: float = 0.0 # (T) Unresolved rupture
|
| 88 |
-
|
| 89 |
-
# --- VSL Cognitive ---
|
| 90 |
-
exhaustion: float = 0.2 # (E) Lexical fatigue
|
| 91 |
-
contradiction: float = 0.4 # (β) Capacity to hold opposing truths
|
| 92 |
-
scope: float = 0.3 # (S) Retrieval breadth
|
| 93 |
-
depth: float = 0.3 # (D) Hierarchical traversal
|
| 94 |
-
connectivity: float = 0.2 # (C) Logical bridging
|
| 95 |
-
|
| 96 |
-
# --- VSL Semantic ---
|
| 97 |
-
psi: float = 0.2 # (Ψ) Void / Abstraction
|
| 98 |
-
chi: float = 0.2 # (Χ) Entropy / Chaos
|
| 99 |
-
valence: float = 0.0 # (♥) Emotional polarity
|
| 100 |
-
|
| 101 |
-
# --- VSL Extended (SLASH Mod) ---
|
| 102 |
-
gamma: float = 0.0 # (Γ) Clarity Index
|
| 103 |
-
sigma: float = 0.0 # (Σ) Synergy Score
|
| 104 |
-
eta: float = 0.0 # (Η) Humanity Quotient
|
| 105 |
-
theta: float = 0.0 # (Θ) Resilience (Feedback loops)
|
| 106 |
-
upsilon: float = 0.0 # (Υ) Integrity
|
| 107 |
-
|
| 108 |
-
# --- Extended/Legacy Substrate ---
|
| 109 |
-
entropy: float = 0.2 # Legacy map to chi
|
| 110 |
-
mass: float = 0.0
|
| 111 |
-
velocity: float = 0.0
|
| 112 |
-
beta_index: float = 0.4 # Legacy map to contradiction
|
| 113 |
-
turbulence: float = 0.0
|
| 114 |
-
kappa: float = 0.0 # (κ) Drag corollary
|
| 115 |
-
epsilon: float = 0.0 # (ε) Entropy corollary
|
| 116 |
-
xi: float = 0.0 # (Ξ) Substrate depth
|
| 117 |
-
perfection_streak: int = 0
|
| 118 |
-
|
| 119 |
-
|
| 120 |
-
@dataclass
|
| 121 |
-
class MaterialState:
|
| 122 |
-
clean_words: List[str] = field(default_factory=list)
|
| 123 |
-
raw_text: str = ""
|
| 124 |
-
counts: Dict[str, int] = field(default_factory=dict)
|
| 125 |
-
antigens: int = 0
|
| 126 |
-
vector: Dict[str, float] = field(default_factory=dict)
|
| 127 |
-
truth_ratio: float = 0.0
|
| 128 |
-
repetition: float = 0.0
|
| 129 |
-
|
| 130 |
-
|
| 131 |
-
@dataclass
|
| 132 |
-
class SpatialState:
|
| 133 |
-
zone: str = "COURTYARD"
|
| 134 |
-
manifold: str = "DEFAULT"
|
| 135 |
-
narrative_drag: float = 0.6 # (F) Friction - High=stuck, Low=flow. Default 0.6
|
| 136 |
-
friction: float = 0.6 # (F) VSL alias for narrative drag
|
| 137 |
-
atmosphere: str = "NEUTRAL"
|
| 138 |
-
flow_state: str = "LAMINAR"
|
| 139 |
-
|
| 140 |
-
|
| 141 |
-
@dataclass
|
| 142 |
-
class PhysicsPacket:
|
| 143 |
-
energy: EnergyState = field(default_factory=EnergyState)
|
| 144 |
-
matter: MaterialState = field(default_factory=MaterialState)
|
| 145 |
-
space: SpatialState = field(default_factory=SpatialState)
|
| 146 |
-
|
| 147 |
-
@property
|
| 148 |
-
def E(self):
|
| 149 |
-
return self.energy.exhaustion
|
| 150 |
-
|
| 151 |
-
@E.setter
|
| 152 |
-
def E(self, v):
|
| 153 |
-
self.energy.exhaustion = v
|
| 154 |
-
|
| 155 |
-
@property
|
| 156 |
-
def beta(self):
|
| 157 |
-
return self.energy.contradiction
|
| 158 |
-
|
| 159 |
-
@beta.setter
|
| 160 |
-
def beta(self, v):
|
| 161 |
-
self.energy.contradiction = v
|
| 162 |
-
self.energy.beta_index = v
|
| 163 |
-
|
| 164 |
-
@property
|
| 165 |
-
def S(self):
|
| 166 |
-
return self.energy.scope
|
| 167 |
-
|
| 168 |
-
@S.setter
|
| 169 |
-
def S(self, v):
|
| 170 |
-
self.energy.scope = v
|
| 171 |
-
|
| 172 |
-
@property
|
| 173 |
-
def D(self):
|
| 174 |
-
return self.energy.depth
|
| 175 |
-
|
| 176 |
-
@D.setter
|
| 177 |
-
def D(self, v):
|
| 178 |
-
self.energy.depth = v
|
| 179 |
-
|
| 180 |
-
@property
|
| 181 |
-
def C(self):
|
| 182 |
-
return self.energy.connectivity
|
| 183 |
-
|
| 184 |
-
@C.setter
|
| 185 |
-
def C(self, v):
|
| 186 |
-
self.energy.connectivity = v
|
| 187 |
-
|
| 188 |
-
@property
|
| 189 |
-
def V(self):
|
| 190 |
-
return self.energy.voltage
|
| 191 |
-
|
| 192 |
-
@V.setter
|
| 193 |
-
def V(self, v):
|
| 194 |
-
self.energy.voltage = v
|
| 195 |
-
|
| 196 |
-
@property
|
| 197 |
-
def voltage(self):
|
| 198 |
-
return self.energy.voltage
|
| 199 |
-
|
| 200 |
-
@voltage.setter
|
| 201 |
-
def voltage(self, v):
|
| 202 |
-
self.energy.voltage = v
|
| 203 |
-
|
| 204 |
-
@property
|
| 205 |
-
def F(self):
|
| 206 |
-
return self.space.friction
|
| 207 |
-
|
| 208 |
-
@F.setter
|
| 209 |
-
def F(self, v):
|
| 210 |
-
self.space.friction = v
|
| 211 |
-
self.space.narrative_drag = v
|
| 212 |
-
|
| 213 |
-
@property
|
| 214 |
-
def narrative_drag(self):
|
| 215 |
-
return self.space.narrative_drag
|
| 216 |
-
|
| 217 |
-
@narrative_drag.setter
|
| 218 |
-
def narrative_drag(self, v):
|
| 219 |
-
self.space.narrative_drag = v
|
| 220 |
-
self.space.friction = v
|
| 221 |
-
|
| 222 |
-
@property
|
| 223 |
-
def H(self):
|
| 224 |
-
return self.energy.health
|
| 225 |
-
|
| 226 |
-
@H.setter
|
| 227 |
-
def H(self, v):
|
| 228 |
-
self.energy.health = v
|
| 229 |
-
|
| 230 |
-
@property
|
| 231 |
-
def P(self):
|
| 232 |
-
return self.energy.stamina
|
| 233 |
-
|
| 234 |
-
@P.setter
|
| 235 |
-
def P(self, v):
|
| 236 |
-
self.energy.stamina = v
|
| 237 |
-
|
| 238 |
-
@property
|
| 239 |
-
def T(self):
|
| 240 |
-
return self.energy.trauma
|
| 241 |
-
|
| 242 |
-
@T.setter
|
| 243 |
-
def T(self, v):
|
| 244 |
-
self.energy.trauma = v
|
| 245 |
-
|
| 246 |
-
@property
|
| 247 |
-
def psi(self):
|
| 248 |
-
return self.energy.psi
|
| 249 |
-
|
| 250 |
-
@psi.setter
|
| 251 |
-
def psi(self, v):
|
| 252 |
-
self.energy.psi = v
|
| 253 |
-
|
| 254 |
-
@property
|
| 255 |
-
def chi(self):
|
| 256 |
-
return self.energy.chi
|
| 257 |
-
|
| 258 |
-
@chi.setter
|
| 259 |
-
def chi(self, v):
|
| 260 |
-
self.energy.chi = v
|
| 261 |
-
self.energy.entropy = v
|
| 262 |
-
|
| 263 |
-
@property
|
| 264 |
-
def entropy(self):
|
| 265 |
-
return self.energy.entropy
|
| 266 |
-
|
| 267 |
-
@entropy.setter
|
| 268 |
-
def entropy(self, v):
|
| 269 |
-
self.energy.entropy = v
|
| 270 |
-
self.energy.chi = v
|
| 271 |
-
|
| 272 |
-
@property
|
| 273 |
-
def valence(self):
|
| 274 |
-
return self.energy.valence
|
| 275 |
-
|
| 276 |
-
@valence.setter
|
| 277 |
-
def valence(self, v):
|
| 278 |
-
self.energy.valence = v
|
| 279 |
-
|
| 280 |
-
# -- LEGACY SHORTCUTS --
|
| 281 |
-
@property
|
| 282 |
-
def clean_words(self):
|
| 283 |
-
return self.matter.clean_words
|
| 284 |
-
|
| 285 |
-
@clean_words.setter
|
| 286 |
-
def clean_words(self, v):
|
| 287 |
-
self.matter.clean_words = v
|
| 288 |
-
|
| 289 |
-
@property
|
| 290 |
-
def vector(self):
|
| 291 |
-
return self.matter.vector
|
| 292 |
-
|
| 293 |
-
@vector.setter
|
| 294 |
-
def vector(self, v):
|
| 295 |
-
self.matter.vector = v
|
| 296 |
-
|
| 297 |
-
@property
|
| 298 |
-
def counts(self):
|
| 299 |
-
return self.matter.counts
|
| 300 |
-
|
| 301 |
-
@counts.setter
|
| 302 |
-
def counts(self, v):
|
| 303 |
-
self.matter.counts = v
|
| 304 |
-
|
| 305 |
-
@property
|
| 306 |
-
def zone(self):
|
| 307 |
-
return self.space.zone
|
| 308 |
-
|
| 309 |
-
@zone.setter
|
| 310 |
-
def zone(self, v):
|
| 311 |
-
self.space.zone = v
|
| 312 |
-
|
| 313 |
-
def __init__(
|
| 314 |
-
self,
|
| 315 |
-
energy: Optional[EnergyState] = None,
|
| 316 |
-
matter: Optional[MaterialState] = None,
|
| 317 |
-
space: Optional[SpatialState] = None,
|
| 318 |
-
**kwargs,
|
| 319 |
-
):
|
| 320 |
-
self.energy = energy or EnergyState()
|
| 321 |
-
self.matter = matter or MaterialState()
|
| 322 |
-
self.space = space or SpatialState()
|
| 323 |
-
for k, v in kwargs.items():
|
| 324 |
-
setattr(self, k, v)
|
| 325 |
-
|
| 326 |
-
|
| 327 |
-
@classmethod
|
| 328 |
-
def void_state(cls):
|
| 329 |
-
p = cls()
|
| 330 |
-
p.space.atmosphere = "VOID"
|
| 331 |
-
p.space.zone = "VOID"
|
| 332 |
-
p.space.flow_state = "LAMINAR"
|
| 333 |
-
return p
|
| 334 |
-
|
| 335 |
-
def snapshot(self) -> "PhysicsPacket":
|
| 336 |
-
return copy.deepcopy(self)
|
| 337 |
-
|
| 338 |
-
def to_dict(self) -> Dict[str, Any]:
|
| 339 |
-
return asdict(self)
|
| 340 |
-
|
| 341 |
-
def get(self, key, default=None):
|
| 342 |
-
if hasattr(self, key):
|
| 343 |
-
return getattr(self, key)
|
| 344 |
-
return default
|
| 345 |
-
|
| 346 |
-
def __getitem__(self, key):
|
| 347 |
-
return getattr(self, key)
|
| 348 |
-
|
| 349 |
-
def __setitem__(self, key, value):
|
| 350 |
-
setattr(self, key, value)
|
| 351 |
-
|
| 352 |
-
def __contains__(self, key):
|
| 353 |
-
return hasattr(self, key)
|
| 354 |
-
|
| 355 |
-
|
| 356 |
-
@dataclass
|
| 357 |
-
class CycleContext:
|
| 358 |
-
input_text: str
|
| 359 |
-
is_system_event: bool = False
|
| 360 |
-
clean_words: List[str] = field(default_factory=list)
|
| 361 |
-
physics: PhysicsPacket = field(default_factory=PhysicsPacket.void_state)
|
| 362 |
-
logs: List[str] = field(default_factory=list)
|
| 363 |
-
flux_log: List[Dict[str, Any]] = field(default_factory=list)
|
| 364 |
-
is_alive: bool = True
|
| 365 |
-
refusal_triggered: bool = False
|
| 366 |
-
refusal_packet: Optional[Dict] = None
|
| 367 |
-
is_bureaucratic: bool = False
|
| 368 |
-
bio_result: Dict = field(default_factory=dict)
|
| 369 |
-
bio_snapshot: Optional[Dict] = None
|
| 370 |
-
world_state: Dict = field(default_factory=dict)
|
| 371 |
-
mind_state: Dict = field(default_factory=dict)
|
| 372 |
-
timestamp: float = field(default_factory=time.time)
|
| 373 |
-
bureau_ui: str = ""
|
| 374 |
-
user_profile: Dict = field(
|
| 375 |
-
default_factory=lambda: {"name": "TRAVELER", "confidence": 0}
|
| 376 |
-
)
|
| 377 |
-
last_impulse: Any = None
|
| 378 |
-
reality_stack: Any = None
|
| 379 |
-
active_lens: str = "NARRATOR"
|
| 380 |
-
validator: Any = None
|
| 381 |
-
|
| 382 |
-
@property
|
| 383 |
-
def user_name(self):
|
| 384 |
-
return self.user_profile.get("name", "TRAVELER")
|
| 385 |
-
|
| 386 |
-
@user_name.setter
|
| 387 |
-
def user_name(self, value):
|
| 388 |
-
self.user_profile["name"] = value
|
| 389 |
-
|
| 390 |
-
def log(self, message: str):
|
| 391 |
-
self.logs.append(message)
|
| 392 |
-
|
| 393 |
-
def record_flux(
|
| 394 |
-
self, phase: str, metric: str, initial: float, final: float, reason: str = ""
|
| 395 |
-
):
|
| 396 |
-
delta = final - initial
|
| 397 |
-
if abs(delta) > 0.001:
|
| 398 |
-
self.flux_log.append(
|
| 399 |
-
{
|
| 400 |
-
"phase": phase,
|
| 401 |
-
"metric": metric,
|
| 402 |
-
"initial": initial,
|
| 403 |
-
"final": final,
|
| 404 |
-
"delta": delta,
|
| 405 |
-
"reason": reason,
|
| 406 |
-
"timestamp": time.time(),
|
| 407 |
-
}
|
| 408 |
-
)
|
| 409 |
-
|
| 410 |
-
def snapshot(self) -> "CycleContext":
|
| 411 |
-
new_ctx = copy.copy(self)
|
| 412 |
-
for f in fields(self):
|
| 413 |
-
name = f.name
|
| 414 |
-
val = getattr(self, name)
|
| 415 |
-
if name == "physics" and hasattr(val, "snapshot"):
|
| 416 |
-
setattr(new_ctx, name, val.snapshot())
|
| 417 |
-
elif isinstance(val, (list, dict, set)):
|
| 418 |
-
setattr(new_ctx, name, copy.deepcopy(val))
|
| 419 |
-
return new_ctx
|
| 420 |
-
|
| 421 |
-
|
| 422 |
-
@dataclass
|
| 423 |
-
class MindSystem:
|
| 424 |
-
mem: Any
|
| 425 |
-
lex: Any
|
| 426 |
-
dreamer: Any
|
| 427 |
-
mirror: Any
|
| 428 |
-
tracer: Any
|
| 429 |
-
|
| 430 |
-
|
| 431 |
-
@dataclass
|
| 432 |
-
class PhysSystem:
|
| 433 |
-
observer: Any
|
| 434 |
-
forge: Any
|
| 435 |
-
crucible: Any
|
| 436 |
-
theremin: Any
|
| 437 |
-
pulse: Any
|
| 438 |
-
nav: Any
|
| 439 |
-
gate: Optional[Any] = None
|
| 440 |
-
tension: Optional[Any] = None
|
| 441 |
-
dynamics: Any = None
|
| 442 |
-
|
| 443 |
-
|
| 444 |
-
@dataclass
|
| 445 |
-
class DecisionTrace:
|
| 446 |
-
trace_id: str
|
| 447 |
-
timestamp: float
|
| 448 |
-
component: str
|
| 449 |
-
decision_type: str
|
| 450 |
-
inputs: Dict[str, Any]
|
| 451 |
-
reasoning: str
|
| 452 |
-
outcome: str
|
| 453 |
-
|
| 454 |
-
def to_json(self):
|
| 455 |
-
return json.dumps(asdict(self))
|
| 456 |
-
|
| 457 |
-
|
| 458 |
-
@dataclass
|
| 459 |
-
class DecisionCrystal:
|
| 460 |
-
decision_id: str = field(default_factory=lambda: str(uuid.uuid4())[:8])
|
| 461 |
-
timestamp: float = field(default_factory=time.time)
|
| 462 |
-
leverage_metrics: Dict[str, float] = field(default_factory=dict)
|
| 463 |
-
prompt_snapshot: str = ""
|
| 464 |
-
physics_state: Dict[str, Any] = field(default_factory=dict)
|
| 465 |
-
chorus_weights: Dict[str, float] = field(default_factory=dict)
|
| 466 |
-
system_state: str = "STABLE"
|
| 467 |
-
active_archetype: str = "OBSERVER"
|
| 468 |
-
council_mandates: List[str] = field(default_factory=list)
|
| 469 |
-
final_response: str = ""
|
| 470 |
-
|
| 471 |
-
def __str__(self):
|
| 472 |
-
e_val = self.leverage_metrics.get("E", 0.0)
|
| 473 |
-
return (
|
| 474 |
-
f"💎 CRYSTAL [{self.decision_id}] {self.system_state} | "
|
| 475 |
-
f"Arch: {self.active_archetype} | E: {e_val:.2f}"
|
| 476 |
-
)
|
| 477 |
-
|
| 478 |
-
def crystallize(self) -> str:
|
| 479 |
-
data = asdict(self)
|
| 480 |
-
data["_summary"] = f"{self.system_state}::{self.active_archetype}"
|
| 481 |
-
data["_type"] = "CRYSTAL"
|
| 482 |
-
return json.dumps(data)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|