比较提交

...
此合并请求有变更与目标分支冲突。
/protobuf-definitions/proto/mlagents_envs/communicator_objects/agent_info.proto
/config/ppo/PushBlock.yaml
/Project/Assets/ML-Agents/Examples/WallJump/Scripts/WallJumpAgent.cs
/Project/Assets/ML-Agents/Examples/Hallway/Scripts/HallwayAgent.cs
/Project/Assets/ML-Agents/Examples/Hallway/Prefabs/SymbolFinderArea.prefab
/Project/Assets/ML-Agents/Examples/Soccer/Scenes/SoccerTwos.unity
/Project/Assets/ML-Agents/Examples/Soccer/Prefabs/SoccerFieldTwos.prefab
/com.unity.ml-agents/Runtime/Communicator/GrpcExtensions.cs
/com.unity.ml-agents/Runtime/Agent.cs
/com.unity.ml-agents/Runtime/Grpc/CommunicatorObjects/AgentInfo.cs
/com.unity.ml-agents/Runtime/Policies/BehaviorParameters.cs
/ml-agents-envs/mlagents_envs/rpc_utils.py
/ml-agents-envs/mlagents_envs/communicator_objects/agent_info_pb2.py
/ml-agents-envs/mlagents_envs/communicator_objects/agent_info_pb2.pyi
/ml-agents-envs/mlagents_envs/base_env.py
/ml-agents/mlagents/trainers/ghost/trainer.py
/ml-agents/mlagents/trainers/optimizer/torch_optimizer.py
/ml-agents/mlagents/trainers/agent_processor.py
/ml-agents/mlagents/trainers/behavior_id_utils.py
/ml-agents/mlagents/trainers/policy/torch_policy.py
/ml-agents/mlagents/trainers/ppo/optimizer_torch.py
/ml-agents/mlagents/trainers/ppo/trainer.py
/ml-agents/mlagents/trainers/tests/test_buffer.py
/ml-agents/mlagents/trainers/tests/torch/test_attention.py
/ml-agents/mlagents/trainers/buffer.py
/ml-agents/mlagents/trainers/torch/layers.py
/ml-agents/mlagents/trainers/torch/attention.py
/ml-agents/mlagents/trainers/torch/components/bc/module.py
/ml-agents/mlagents/trainers/torch/components/reward_providers/extrinsic_reward_provider.py
/ml-agents/mlagents/trainers/torch/agent_action.py
/ml-agents/mlagents/trainers/torch/utils.py
/ml-agents/mlagents/trainers/torch/networks.py
/ml-agents/mlagents/trainers/torch/encoders.py
/ml-agents/mlagents/trainers/trajectory.py
/Project/Assets/ML-Agents/Examples/SharedAssets/Scripts/CollisionCallbacks.cs
/Project/Assets/ML-Agents/Examples/PushBlock/Scripts/GoalDetectTrigger.cs
/Project/Assets/ML-Agents/Examples/PushBlock/Scripts/SimpleNPC.cs
/Project/Assets/ML-Agents/Examples/PushBlock/Scripts/SimpleNPC.cs.meta
/Project/Assets/ML-Agents/Examples/SharedAssets/Scripts/CollisionCallbacks.cs.meta
/Project/Assets/ML-Agents/Examples/PushBlock/TFModels/PushBlockCollab.onnx
/Project/Assets/ML-Agents/Examples/PushBlock/Scenes/PushBlockCollab.unity
/Project/Assets/ML-Agents/Examples/PushBlock/Scripts/PushAgentCollab.cs
/Project/Assets/ML-Agents/Examples/PushBlock/Scripts/PushBlockEnvController.cs
/Project/Assets/ML-Agents/Examples/PushBlock/TFModels/PushBlockCollab.onnx.meta

11 次代码提交

作者 SHA1 备注 提交日期
Andrew Cohen f9ff3fef shared baseline and v 4 年前
Andrew Cohen 869a2811 update zombie config 4 年前
Andrew Cohen b5271926 remove value head clipping 4 年前
Andrew Cohen da4f4ae8 update configs 4 年前
Andrew Cohen b0bf7817 clipping values and updated zombie 4 年前
Andrew Cohen 687f411b try again on cloud 4 年前
Andrew Cohen 2c3147b9 add value clipping 4 年前
Andrew Cohen 95253b47 ntegrate teammate dones 4 年前
Ervin Teng b71f38cf Add team dones 4 年前
Andrew Cohen e3239529 remove target update 4 年前
Andrew Cohen a3453c5d target of baseline is returns_v 4 年前
共有 98 个文件被更改,包括 18233 次插入299 次删除
  1. 1
      protobuf-definitions/proto/mlagents_envs/communicator_objects/agent_info.proto
  2. 18
      ml-agents-envs/mlagents_envs/base_env.py
  3. 11
      ml-agents-envs/mlagents_envs/communicator_objects/agent_info_pb2.py
  4. 7
      ml-agents-envs/mlagents_envs/communicator_objects/agent_info_pb2.pyi
  5. 29
      ml-agents-envs/mlagents_envs/rpc_utils.py
  6. 12
      config/ppo/PushBlock.yaml
  7. 39
      com.unity.ml-agents/Runtime/Grpc/CommunicatorObjects/AgentInfo.cs
  8. 1
      com.unity.ml-agents/Runtime/Policies/BehaviorParameters.cs
  9. 5
      com.unity.ml-agents/Runtime/Communicator/GrpcExtensions.cs
  10. 42
      com.unity.ml-agents/Runtime/Agent.cs
  11. 8
      Project/Assets/ML-Agents/Examples/Soccer/Prefabs/SoccerFieldTwos.prefab
  12. 146
      Project/Assets/ML-Agents/Examples/Soccer/Scenes/SoccerTwos.unity
  13. 22
      Project/Assets/ML-Agents/Examples/WallJump/Scripts/WallJumpAgent.cs
  14. 2
      Project/Assets/ML-Agents/Examples/Hallway/Scenes/Hallway.unity.meta
  15. 932
      Project/Assets/ML-Agents/Examples/Hallway/Prefabs/SymbolFinderArea.prefab
  16. 22
      Project/Assets/ML-Agents/Examples/Hallway/Scripts/HallwayAgent.cs
  17. 35
      ml-agents/mlagents/trainers/behavior_id_utils.py
  18. 14
      ml-agents/mlagents/trainers/ghost/trainer.py
  19. 72
      ml-agents/mlagents/trainers/buffer.py
  20. 194
      ml-agents/mlagents/trainers/trajectory.py
  21. 81
      ml-agents/mlagents/trainers/agent_processor.py
  22. 29
      ml-agents/mlagents/trainers/tests/test_buffer.py
  23. 26
      ml-agents/mlagents/trainers/tests/torch/test_attention.py
  24. 10
      ml-agents/mlagents/trainers/policy/torch_policy.py
  25. 137
      ml-agents/mlagents/trainers/ppo/trainer.py
  26. 59
      ml-agents/mlagents/trainers/ppo/optimizer_torch.py
  27. 115
      ml-agents/mlagents/trainers/optimizer/torch_optimizer.py
  28. 2
      ml-agents/mlagents/trainers/torch/components/bc/module.py
  29. 3
      ml-agents/mlagents/trainers/torch/components/reward_providers/extrinsic_reward_provider.py
  30. 25
      ml-agents/mlagents/trainers/torch/encoders.py
  31. 12
      ml-agents/mlagents/trainers/torch/utils.py
  32. 150
      ml-agents/mlagents/trainers/torch/attention.py
  33. 31
      ml-agents/mlagents/trainers/torch/layers.py
  34. 100
      ml-agents/mlagents/trainers/torch/agent_action.py
  35. 460
      ml-agents/mlagents/trainers/torch/networks.py
  36. 63
      config/ppo/WallJumpCollab.yaml
  37. 26
      config/ppo/HallwayCollab.yaml
  38. 28
      config/ppo/Zombie.yaml
  39. 3
      com.unity.ml-agents/Runtime/ITeamManager.cs.meta
  40. 14
      com.unity.ml-agents/Runtime/ITeamManager.cs
  41. 143
      Project/Assets/ML-Agents/Examples/SharedAssets/Scripts/CollisionCallbacks.cs
  42. 11
      Project/Assets/ML-Agents/Examples/SharedAssets/Scripts/CollisionCallbacks.cs.meta
  43. 50
      Project/Assets/ML-Agents/Examples/WallJump/Scripts/WallAreaScoring.cs
  44. 11
      Project/Assets/ML-Agents/Examples/WallJump/Scripts/WallAreaScoring.cs.meta
  45. 11
      Project/Assets/ML-Agents/Examples/WallJump/Scripts/WallJumpCollabAgent.cs.meta
  46. 67
      Project/Assets/ML-Agents/Examples/WallJump/Scripts/WallJumpCollabAgent.cs
  47. 7
      Project/Assets/ML-Agents/Examples/WallJump/Scenes/WallJumpCollab.unity.meta
  48. 1001
      Project/Assets/ML-Agents/Examples/WallJump/Scenes/WallJumpCollab.unity
  49. 7
      Project/Assets/ML-Agents/Examples/WallJump/Prefabs/WallJumpCollabArea.prefab.meta
  50. 1001
      Project/Assets/ML-Agents/Examples/WallJump/Prefabs/WallJumpCollabArea.prefab
  51. 7
      Project/Assets/ML-Agents/Examples/Hallway/Scenes/HallwayCollab.unity.meta
  52. 1001
      Project/Assets/ML-Agents/Examples/Hallway/Scenes/HallwayCollab.unity
  53. 566
      Project/Assets/ML-Agents/Examples/Hallway/TFModels/HallwayCollab.onnx
  54. 15
      Project/Assets/ML-Agents/Examples/Hallway/TFModels/HallwayCollab.onnx.meta
  55. 11
      Project/Assets/ML-Agents/Examples/Hallway/Scripts/HallwayCollabAgent.cs.meta
  56. 11
      Project/Assets/ML-Agents/Examples/Hallway/Scripts/HallwayTeamManager.cs.meta
  57. 24
      Project/Assets/ML-Agents/Examples/Hallway/Scripts/HallwayTeamManager.cs
  58. 204
      Project/Assets/ML-Agents/Examples/Hallway/Scripts/HallwayCollabAgent.cs
  59. 1001
      Project/Assets/ML-Agents/Examples/PushBlock/TFModels/PushBlockCC.onnx
  60. 14
      Project/Assets/ML-Agents/Examples/PushBlock/TFModels/PushBlockCC.onnx.meta
  61. 1001
      Project/Assets/ML-Agents/Examples/PushBlock/TFModels/PushBlockCollab.onnx
  62. 14
      Project/Assets/ML-Agents/Examples/PushBlock/TFModels/PushBlockCollab.onnx.meta
  63. 1001
      Project/Assets/ML-Agents/Examples/PushBlock/TFModels/PushBlockMaster.onnx
  64. 14
      Project/Assets/ML-Agents/Examples/PushBlock/TFModels/PushBlockMaster.onnx.meta
  65. 1001
      Project/Assets/ML-Agents/Examples/PushBlock/Prefabs/PushBlockCollabArea.prefab
  66. 7
      Project/Assets/ML-Agents/Examples/PushBlock/Prefabs/PushBlockCollabArea.prefab.meta
  67. 1001
      Project/Assets/ML-Agents/Examples/PushBlock/Prefabs/ZombiePushBlockCollabArea.prefab
  68. 7
      Project/Assets/ML-Agents/Examples/PushBlock/Prefabs/ZombiePushBlockCollabArea.prefab.meta
  69. 1001
      Project/Assets/ML-Agents/Examples/PushBlock/Prefabs/ZombiePushBlockCollabArea 1.prefab
  70. 7
      Project/Assets/ML-Agents/Examples/PushBlock/Prefabs/ZombiePushBlockCollabArea 1.prefab.meta
  71. 1001
      Project/Assets/ML-Agents/Examples/PushBlock/Scenes/1ZombieVs2AgentsPushBlock.unity
  72. 9
      Project/Assets/ML-Agents/Examples/PushBlock/Scenes/1ZombieVs2AgentsPushBlock.unity.meta
  73. 9
      Project/Assets/ML-Agents/Examples/PushBlock/Scenes/2ZombieVs3AgentsPushBlock.unity.meta
  74. 63
      Project/Assets/ML-Agents/Examples/PushBlock/Scenes/2ZombieVs3AgentsPushBlockSettings.lighting
  75. 8
      Project/Assets/ML-Agents/Examples/PushBlock/Scenes/2ZombieVs3AgentsPushBlockSettings.lighting.meta
  76. 969
      Project/Assets/ML-Agents/Examples/PushBlock/Scenes/PushBlockCollab.unity
  77. 9
      Project/Assets/ML-Agents/Examples/PushBlock/Scenes/PushBlockCollab.unity.meta
  78. 997
      Project/Assets/ML-Agents/Examples/PushBlock/Scenes/ZombiePushBlock.unity
  79. 9
      Project/Assets/ML-Agents/Examples/PushBlock/Scenes/ZombiePushBlock.unity.meta
  80. 1001
      Project/Assets/ML-Agents/Examples/PushBlock/Scenes/2ZombieVs3AgentsPushBlock.unity
  81. 60
      Project/Assets/ML-Agents/Examples/PushBlock/Scripts/GoalDetectTrigger.cs
  82. 11
      Project/Assets/ML-Agents/Examples/PushBlock/Scripts/GoalDetectTrigger.cs.meta
  83. 139
      Project/Assets/ML-Agents/Examples/PushBlock/Scripts/PushAgentCollab.cs
  84. 12
      Project/Assets/ML-Agents/Examples/PushBlock/Scripts/PushAgentCollab.cs.meta
  85. 241
      Project/Assets/ML-Agents/Examples/PushBlock/Scripts/PushBlockEnvController.cs
  86. 11
      Project/Assets/ML-Agents/Examples/PushBlock/Scripts/PushBlockEnvController.cs.meta
  87. 15
      Project/Assets/ML-Agents/Examples/PushBlock/Scripts/PushBlockTeamManager.cs
  88. 11
      Project/Assets/ML-Agents/Examples/PushBlock/Scripts/PushBlockTeamManager.cs.meta
  89. 45
      Project/Assets/ML-Agents/Examples/PushBlock/Scripts/SimpleNPC.cs
  90. 11
      Project/Assets/ML-Agents/Examples/PushBlock/Scripts/SimpleNPC.cs.meta
  91. 11
      Project/Assets/ML-Agents/Examples/PushBlock/Scripts/ZombiePushBlockDeathEnvController.cs.meta
  92. 289
      Project/Assets/ML-Agents/Examples/PushBlock/Scripts/ZombiePushBlockEnvController.cs
  93. 11
      Project/Assets/ML-Agents/Examples/PushBlock/Scripts/ZombiePushBlockEnvController.cs.meta
  94. 347
      Project/Assets/ML-Agents/Examples/PushBlock/Scripts/ZombiePushBlockDeathEnvController.cs
  95. 3
      com.unity.ml-agents.extensions/Runtime/Teams.meta
  96. 3
      com.unity.ml-agents.extensions/Runtime/Teams/BaseTeamManager.cs.meta
  97. 34
      com.unity.ml-agents.extensions/Runtime/Teams/BaseTeamManager.cs

1
protobuf-definitions/proto/mlagents_envs/communicator_objects/agent_info.proto


repeated bool action_mask = 11;
reserved 12; // deprecated CustomObservationProto custom_observation = 12;
repeated ObservationProto observations = 13;
string team_manager_id = 14;
}

18
ml-agents-envs/mlagents_envs/base_env.py


reward: float
agent_id: AgentId
action_mask: Optional[List[np.ndarray]]
team_manager_id: Optional[str]
class DecisionSteps(Mapping):

this simulation step.
"""
def __init__(self, obs, reward, agent_id, action_mask):
def __init__(self, obs, reward, agent_id, action_mask, team_manager_id=None):
self.team_manager_id: Optional[List[str]] = team_manager_id
self.action_mask: Optional[List[np.ndarray]] = action_mask
self._agent_id_to_index: Optional[Dict[AgentId, int]] = None

agent_mask = []
for mask in self.action_mask:
agent_mask.append(mask[agent_index])
team_manager_id = None
if self.team_manager_id is not None and self.team_manager_id != "":
team_manager_id = self.team_manager_id[agent_index]
team_manager_id=team_manager_id,
)
def __iter__(self) -> Iterator[Any]:

reward=np.zeros(0, dtype=np.float32),
agent_id=np.zeros(0, dtype=np.int32),
action_mask=None,
team_manager_id=None,
)

reward: float
interrupted: bool
agent_id: AgentId
team_manager_id: Optional[str]
class TerminalSteps(Mapping):

across simulation steps.
"""
def __init__(self, obs, reward, interrupted, agent_id):
def __init__(self, obs, reward, interrupted, agent_id, team_manager_id=None):
self.team_manager_id: Optional[List[str]] = team_manager_id
@property
def agent_id_to_index(self) -> Dict[AgentId, int]:

agent_obs = []
for batched_obs in self.obs:
agent_obs.append(batched_obs[agent_index])
team_manager_id = None
if self.team_manager_id is not None and self.team_manager_id != "":
team_manager_id = self.team_manager_id[agent_index]
team_manager_id=team_manager_id,
)
def __iter__(self) -> Iterator[Any]:

reward=np.zeros(0, dtype=np.float32),
interrupted=np.zeros(0, dtype=np.bool),
agent_id=np.zeros(0, dtype=np.int32),
team_manager_id=None,
)

11
ml-agents-envs/mlagents_envs/communicator_objects/agent_info_pb2.py


name='mlagents_envs/communicator_objects/agent_info.proto',
package='communicator_objects',
syntax='proto3',
serialized_pb=_b('\n3mlagents_envs/communicator_objects/agent_info.proto\x12\x14\x63ommunicator_objects\x1a\x34mlagents_envs/communicator_objects/observation.proto\"\xd1\x01\n\x0e\x41gentInfoProto\x12\x0e\n\x06reward\x18\x07 \x01(\x02\x12\x0c\n\x04\x64one\x18\x08 \x01(\x08\x12\x18\n\x10max_step_reached\x18\t \x01(\x08\x12\n\n\x02id\x18\n \x01(\x05\x12\x13\n\x0b\x61\x63tion_mask\x18\x0b \x03(\x08\x12<\n\x0cobservations\x18\r \x03(\x0b\x32&.communicator_objects.ObservationProtoJ\x04\x08\x01\x10\x02J\x04\x08\x02\x10\x03J\x04\x08\x03\x10\x04J\x04\x08\x04\x10\x05J\x04\x08\x05\x10\x06J\x04\x08\x06\x10\x07J\x04\x08\x0c\x10\rB%\xaa\x02\"Unity.MLAgents.CommunicatorObjectsb\x06proto3')
serialized_pb=_b('\n3mlagents_envs/communicator_objects/agent_info.proto\x12\x14\x63ommunicator_objects\x1a\x34mlagents_envs/communicator_objects/observation.proto\"\xea\x01\n\x0e\x41gentInfoProto\x12\x0e\n\x06reward\x18\x07 \x01(\x02\x12\x0c\n\x04\x64one\x18\x08 \x01(\x08\x12\x18\n\x10max_step_reached\x18\t \x01(\x08\x12\n\n\x02id\x18\n \x01(\x05\x12\x13\n\x0b\x61\x63tion_mask\x18\x0b \x03(\x08\x12<\n\x0cobservations\x18\r \x03(\x0b\x32&.communicator_objects.ObservationProto\x12\x17\n\x0fteam_manager_id\x18\x0e \x01(\tJ\x04\x08\x01\x10\x02J\x04\x08\x02\x10\x03J\x04\x08\x03\x10\x04J\x04\x08\x04\x10\x05J\x04\x08\x05\x10\x06J\x04\x08\x06\x10\x07J\x04\x08\x0c\x10\rB%\xaa\x02\"Unity.MLAgents.CommunicatorObjectsb\x06proto3')
,
dependencies=[mlagents__envs_dot_communicator__objects_dot_observation__pb2.DESCRIPTOR,])

message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='team_manager_id', full_name='communicator_objects.AgentInfoProto.team_manager_id', index=6,
number=14, type=9, cpp_type=9, label=1,
has_default_value=False, default_value=_b("").decode('utf-8'),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
],
extensions=[
],

oneofs=[
],
serialized_start=132,
serialized_end=341,
serialized_end=366,
)
_AGENTINFOPROTO.fields_by_name['observations'].message_type = mlagents__envs_dot_communicator__objects_dot_observation__pb2._OBSERVATIONPROTO

7
ml-agents-envs/mlagents_envs/communicator_objects/agent_info_pb2.pyi


from typing import (
Iterable as typing___Iterable,
Optional as typing___Optional,
Text as typing___Text,
)
from typing_extensions import (

max_step_reached = ... # type: builtin___bool
id = ... # type: builtin___int
action_mask = ... # type: google___protobuf___internal___containers___RepeatedScalarFieldContainer[builtin___bool]
team_manager_id = ... # type: typing___Text
@property
def observations(self) -> google___protobuf___internal___containers___RepeatedCompositeFieldContainer[mlagents_envs___communicator_objects___observation_pb2___ObservationProto]: ...

id : typing___Optional[builtin___int] = None,
action_mask : typing___Optional[typing___Iterable[builtin___bool]] = None,
observations : typing___Optional[typing___Iterable[mlagents_envs___communicator_objects___observation_pb2___ObservationProto]] = None,
team_manager_id : typing___Optional[typing___Text] = None,
) -> None: ...
@classmethod
def FromString(cls, s: builtin___bytes) -> AgentInfoProto: ...

def ClearField(self, field_name: typing_extensions___Literal[u"action_mask",u"done",u"id",u"max_step_reached",u"observations",u"reward"]) -> None: ...
def ClearField(self, field_name: typing_extensions___Literal[u"action_mask",u"done",u"id",u"max_step_reached",u"observations",u"reward",u"team_manager_id"]) -> None: ...
def ClearField(self, field_name: typing_extensions___Literal[u"action_mask",b"action_mask",u"done",b"done",u"id",b"id",u"max_step_reached",b"max_step_reached",u"observations",b"observations",u"reward",b"reward"]) -> None: ...
def ClearField(self, field_name: typing_extensions___Literal[u"action_mask",b"action_mask",u"done",b"done",u"id",b"id",u"max_step_reached",b"max_step_reached",u"observations",b"observations",u"reward",b"reward",u"team_manager_id",b"team_manager_id"]) -> None: ...

29
ml-agents-envs/mlagents_envs/rpc_utils.py


decision_rewards = np.array(
[agent_info.reward for agent_info in decision_agent_info_list], dtype=np.float32
)
decision_team_manager = [
agent_info.team_manager_id
for agent_info in decision_agent_info_list
if agent_info.team_manager_id is not None
]
if len(decision_team_manager) == 0:
decision_team_manager = None
terminal_team_manager = [
agent_info.team_manager_id
for agent_info in terminal_agent_info_list
if agent_info.team_manager_id is not None
]
if len(terminal_team_manager) == 0:
terminal_team_manager = None
_raise_on_nan_and_inf(decision_rewards, "rewards")
_raise_on_nan_and_inf(terminal_rewards, "rewards")

action_mask = np.split(action_mask, indices, axis=1)
return (
DecisionSteps(
decision_obs_list, decision_rewards, decision_agent_id, action_mask
decision_obs_list,
decision_rewards,
decision_agent_id,
action_mask,
decision_team_manager,
TerminalSteps(terminal_obs_list, terminal_rewards, max_step, terminal_agent_id),
TerminalSteps(
terminal_obs_list,
terminal_rewards,
max_step,
terminal_agent_id,
terminal_team_manager,
),
)

12
config/ppo/PushBlock.yaml


PushBlock:
trainer_type: ppo
hyperparameters:
batch_size: 128
buffer_size: 2048
batch_size: 512
buffer_size: 10240
learning_rate_schedule: linear
learning_rate_schedule: constant
network_settings:
normalize: false
hidden_units: 256

gamma: 0.99
strength: 1.0
keep_checkpoints: 5
max_steps: 2000000
max_steps: 50000000
summary_freq: 60000
summary_freq: 10000
env_settings:
num_envs: 8

39
com.unity.ml-agents/Runtime/Grpc/CommunicatorObjects/AgentInfo.cs


string.Concat(
"CjNtbGFnZW50c19lbnZzL2NvbW11bmljYXRvcl9vYmplY3RzL2FnZW50X2lu",
"Zm8ucHJvdG8SFGNvbW11bmljYXRvcl9vYmplY3RzGjRtbGFnZW50c19lbnZz",
"L2NvbW11bmljYXRvcl9vYmplY3RzL29ic2VydmF0aW9uLnByb3RvItEBCg5B",
"L2NvbW11bmljYXRvcl9vYmplY3RzL29ic2VydmF0aW9uLnByb3RvIuoBCg5B",
"YXRvcl9vYmplY3RzLk9ic2VydmF0aW9uUHJvdG9KBAgBEAJKBAgCEANKBAgD",
"EARKBAgEEAVKBAgFEAZKBAgGEAdKBAgMEA1CJaoCIlVuaXR5Lk1MQWdlbnRz",
"LkNvbW11bmljYXRvck9iamVjdHNiBnByb3RvMw=="));
"YXRvcl9vYmplY3RzLk9ic2VydmF0aW9uUHJvdG8SFwoPdGVhbV9tYW5hZ2Vy",
"X2lkGA4gASgJSgQIARACSgQIAhADSgQIAxAESgQIBBAFSgQIBRAGSgQIBhAH",
"SgQIDBANQiWqAiJVbml0eS5NTEFnZW50cy5Db21tdW5pY2F0b3JPYmplY3Rz",
"YgZwcm90bzM="));
new pbr::GeneratedClrTypeInfo(typeof(global::Unity.MLAgents.CommunicatorObjects.AgentInfoProto), global::Unity.MLAgents.CommunicatorObjects.AgentInfoProto.Parser, new[]{ "Reward", "Done", "MaxStepReached", "Id", "ActionMask", "Observations" }, null, null, null)
new pbr::GeneratedClrTypeInfo(typeof(global::Unity.MLAgents.CommunicatorObjects.AgentInfoProto), global::Unity.MLAgents.CommunicatorObjects.AgentInfoProto.Parser, new[]{ "Reward", "Done", "MaxStepReached", "Id", "ActionMask", "Observations", "TeamManagerId" }, null, null, null)
}));
}
#endregion

id_ = other.id_;
actionMask_ = other.actionMask_.Clone();
observations_ = other.observations_.Clone();
teamManagerId_ = other.teamManagerId_;
_unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
}

get { return observations_; }
}
/// <summary>Field number for the "team_manager_id" field.</summary>
public const int TeamManagerIdFieldNumber = 14;
private string teamManagerId_ = "";
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public string TeamManagerId {
get { return teamManagerId_; }
set {
teamManagerId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
}
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public override bool Equals(object other) {
return Equals(other as AgentInfoProto);

if (Id != other.Id) return false;
if(!actionMask_.Equals(other.actionMask_)) return false;
if(!observations_.Equals(other.observations_)) return false;
if (TeamManagerId != other.TeamManagerId) return false;
return Equals(_unknownFields, other._unknownFields);
}

if (Id != 0) hash ^= Id.GetHashCode();
hash ^= actionMask_.GetHashCode();
hash ^= observations_.GetHashCode();
if (TeamManagerId.Length != 0) hash ^= TeamManagerId.GetHashCode();
if (_unknownFields != null) {
hash ^= _unknownFields.GetHashCode();
}

}
actionMask_.WriteTo(output, _repeated_actionMask_codec);
observations_.WriteTo(output, _repeated_observations_codec);
if (TeamManagerId.Length != 0) {
output.WriteRawTag(114);
output.WriteString(TeamManagerId);
}
if (_unknownFields != null) {
_unknownFields.WriteTo(output);
}

}
size += actionMask_.CalculateSize(_repeated_actionMask_codec);
size += observations_.CalculateSize(_repeated_observations_codec);
if (TeamManagerId.Length != 0) {
size += 1 + pb::CodedOutputStream.ComputeStringSize(TeamManagerId);
}
if (_unknownFields != null) {
size += _unknownFields.CalculateSize();
}

}
actionMask_.Add(other.actionMask_);
observations_.Add(other.observations_);
if (other.TeamManagerId.Length != 0) {
TeamManagerId = other.TeamManagerId;
}
_unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
}

}
case 106: {
observations_.AddEntriesFrom(input, _repeated_observations_codec);
break;
}
case 114: {
TeamManagerId = input.ReadString();
break;
}
}

1
com.unity.ml-agents/Runtime/Policies/BehaviorParameters.cs


/// </summary>
[HideInInspector, SerializeField, FormerlySerializedAs("m_TeamID")]
public int TeamId;
// TODO properties here instead of Agent
[FormerlySerializedAs("m_useChildSensors")]

5
com.unity.ml-agents/Runtime/Communicator/GrpcExtensions.cs


agentInfoProto.ActionMask.AddRange(ai.discreteActionMasks);
}
if (ai.teamManagerId != null)
{
agentInfoProto.TeamManagerId = ai.teamManagerId;
}
return agentInfoProto;
}

42
com.unity.ml-agents/Runtime/Agent.cs


/// </summary>
public int episodeId;
/// <summary>
/// Team Manager identifier.
/// </summary>
public string teamManagerId;
public void ClearActions()
{
storedActions.Clear();

/// </summary>
float[] m_LegacyActionCache;
private ITeamManager m_TeamManager;
/// <summary>
/// Called when the attached [GameObject] becomes enabled and active.
/// [GameObject]: https://docs.unity3d.com/Manual/GameObjects.html

new int[m_ActuatorManager.NumDiscreteActions]
);
if (m_TeamManager != null)
{
m_Info.teamManagerId = m_TeamManager.GetId();
}
// The first time the Academy resets, all Agents in the scene will be
// forced to reset through the <see cref="AgentForceReset"/> event.
// To avoid the Agent resetting twice, the Agents will not begin their

/// <summary>
/// The reason that the Agent has been set to "done".
/// </summary>
enum DoneReason
public enum DoneReason
{
/// <summary>
/// The episode was ended manually by calling <see cref="EndEpisode"/>.

}
}
// Request the last decision with no callbacks
// We request a decision so Python knows the Agent is done immediately
m_Brain?.RequestDecision(m_Info, sensors);
ResetSensors();
if (m_TeamManager != null)
{
// Send final observations to TeamManager if it exists.
// The TeamManager is responsible to keeping track of the Agent after it's
// done, including propagating any "posthumous" rewards.
m_TeamManager.OnAgentDone(this, doneReason, sensors);
}
else
{
SendDoneToTrainer();
}
// We also have to write any to any DemonstationStores so that they get the "done" flag.
foreach (var demoWriter in DemonstrationWriters)

m_RequestAction = false;
m_RequestDecision = false;
m_Info.storedActions.Clear();
}
public void SendDoneToTrainer()
{
// We request a decision so Python knows the Agent is done immediately
m_Brain?.RequestDecision(m_Info, sensors);
ResetSensors();
}
/// <summary>

var actions = m_Brain?.DecideAction() ?? new ActionBuffers();
m_Info.CopyActions(actions);
m_ActuatorManager.UpdateActions(actions);
}
public void SetTeamManager(ITeamManager teamManager)
{
m_TeamManager = teamManager;
m_Info.teamManagerId = teamManager?.GetId();
teamManager?.RegisterAgent(this);
}
}
}

8
Project/Assets/ML-Agents/Examples/Soccer/Prefabs/SoccerFieldTwos.prefab


m_BehaviorType: 0
m_BehaviorName: SoccerTwos
TeamId: 1
GroupId: 0
m_UseChildActuators: 1
m_ObservableAttributeHandling: 0
--- !u!114 &114492261207303438
MonoBehaviour:

m_BehaviorType: 0
m_BehaviorName: SoccerTwos
TeamId: 0
GroupId: 0
m_UseChildActuators: 1
m_ObservableAttributeHandling: 0
--- !u!114 &114850431417842684
MonoBehaviour:

m_BehaviorType: 0
m_BehaviorName: SoccerTwos
TeamId: 1
GroupId: 0
m_UseChildActuators: 1
m_ObservableAttributeHandling: 0
--- !u!114 &5320024511406682322
MonoBehaviour:

m_BehaviorType: 0
m_BehaviorName: SoccerTwos
TeamId: 0
GroupId: 0
m_UseChildActuators: 1
m_ObservableAttributeHandling: 0
--- !u!114 &5379409612883756837
MonoBehaviour:

146
Project/Assets/ML-Agents/Examples/Soccer/Scenes/SoccerTwos.unity


propertyPath: m_RootOrder
value: 8
objectReference: {fileID: 0}
- target: {fileID: 114387866097048300, guid: 54f3340298537426e96a6cc530e2d5d8,
type: 3}
propertyPath: GroupId
value: 4
objectReference: {fileID: 0}
- target: {fileID: 114734187185382186, guid: 54f3340298537426e96a6cc530e2d5d8,
type: 3}
propertyPath: GroupId
value: 4
objectReference: {fileID: 0}
- target: {fileID: 3316085536305919483, guid: 54f3340298537426e96a6cc530e2d5d8,
type: 3}
propertyPath: GroupId
value: 4
objectReference: {fileID: 0}
- target: {fileID: 8577361778124631730, guid: 54f3340298537426e96a6cc530e2d5d8,
type: 3}
propertyPath: GroupId
value: 4
objectReference: {fileID: 0}
m_RemovedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: 54f3340298537426e96a6cc530e2d5d8, type: 3}
--- !u!1001 &774084574

propertyPath: m_RootOrder
value: 11
objectReference: {fileID: 0}
- target: {fileID: 114387866097048300, guid: 54f3340298537426e96a6cc530e2d5d8,
type: 3}
propertyPath: GroupId
value: 7
objectReference: {fileID: 0}
- target: {fileID: 114734187185382186, guid: 54f3340298537426e96a6cc530e2d5d8,
type: 3}
propertyPath: GroupId
value: 7
objectReference: {fileID: 0}
- target: {fileID: 3316085536305919483, guid: 54f3340298537426e96a6cc530e2d5d8,
type: 3}
propertyPath: GroupId
value: 7
objectReference: {fileID: 0}
- target: {fileID: 8577361778124631730, guid: 54f3340298537426e96a6cc530e2d5d8,
type: 3}
propertyPath: GroupId
value: 7
objectReference: {fileID: 0}
m_RemovedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: 54f3340298537426e96a6cc530e2d5d8, type: 3}
--- !u!1001 &1177695920

propertyPath: m_RootOrder
value: 5
objectReference: {fileID: 0}
- target: {fileID: 114387866097048300, guid: 54f3340298537426e96a6cc530e2d5d8,
type: 3}
propertyPath: GroupId
value: 1
objectReference: {fileID: 0}
- target: {fileID: 114734187185382186, guid: 54f3340298537426e96a6cc530e2d5d8,
type: 3}
propertyPath: GroupId
value: 1
objectReference: {fileID: 0}
- target: {fileID: 3316085536305919483, guid: 54f3340298537426e96a6cc530e2d5d8,
type: 3}
propertyPath: GroupId
value: 1
objectReference: {fileID: 0}
- target: {fileID: 8577361778124631730, guid: 54f3340298537426e96a6cc530e2d5d8,
type: 3}
propertyPath: GroupId
value: 1
objectReference: {fileID: 0}
m_RemovedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: 54f3340298537426e96a6cc530e2d5d8, type: 3}
--- !u!1001 &1325062279

propertyPath: m_RootOrder
value: 7
objectReference: {fileID: 0}
- target: {fileID: 114387866097048300, guid: 54f3340298537426e96a6cc530e2d5d8,
type: 3}
propertyPath: GroupId
value: 3
objectReference: {fileID: 0}
- target: {fileID: 114734187185382186, guid: 54f3340298537426e96a6cc530e2d5d8,
type: 3}
propertyPath: GroupId
value: 3
objectReference: {fileID: 0}
- target: {fileID: 3316085536305919483, guid: 54f3340298537426e96a6cc530e2d5d8,
type: 3}
propertyPath: GroupId
value: 3
objectReference: {fileID: 0}
- target: {fileID: 8577361778124631730, guid: 54f3340298537426e96a6cc530e2d5d8,
type: 3}
propertyPath: GroupId
value: 3
objectReference: {fileID: 0}
m_RemovedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: 54f3340298537426e96a6cc530e2d5d8, type: 3}
--- !u!1001 &1348885204

m_Name:
m_EditorClassIdentifier:
gravityMultiplier: 1
monitorVerticalOffset: 0
reuseCollisionCallbacks: 1
--- !u!114 &1574236051
MonoBehaviour:
m_ObjectHideFlags: 0

blueMaterial: {fileID: 2100000, guid: c9fa44c2c3f8ce74ca39a3355ea42631, type: 2}
randomizePlayersTeamForTraining: 0
agentRunSpeed: 2
strikerPunish: -0.1
strikerReward: 1
goaliePunish: -1
goalieReward: 0.1
--- !u!1001 &1606160104
PrefabInstance:
m_ObjectHideFlags: 0

propertyPath: m_RootOrder
value: 9
objectReference: {fileID: 0}
- target: {fileID: 114387866097048300, guid: 54f3340298537426e96a6cc530e2d5d8,
type: 3}
propertyPath: GroupId
value: 5
objectReference: {fileID: 0}
- target: {fileID: 114734187185382186, guid: 54f3340298537426e96a6cc530e2d5d8,
type: 3}
propertyPath: GroupId
value: 5
objectReference: {fileID: 0}
- target: {fileID: 3316085536305919483, guid: 54f3340298537426e96a6cc530e2d5d8,
type: 3}
propertyPath: GroupId
value: 5
objectReference: {fileID: 0}
- target: {fileID: 8577361778124631730, guid: 54f3340298537426e96a6cc530e2d5d8,
type: 3}
propertyPath: GroupId
value: 5
objectReference: {fileID: 0}
m_RemovedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: 54f3340298537426e96a6cc530e2d5d8, type: 3}
--- !u!1001 &1748755984

propertyPath: m_RootOrder
value: 10
objectReference: {fileID: 0}
- target: {fileID: 114387866097048300, guid: 54f3340298537426e96a6cc530e2d5d8,
type: 3}
propertyPath: GroupId
value: 6
objectReference: {fileID: 0}
- target: {fileID: 114734187185382186, guid: 54f3340298537426e96a6cc530e2d5d8,
type: 3}
propertyPath: GroupId
value: 6
objectReference: {fileID: 0}
- target: {fileID: 3316085536305919483, guid: 54f3340298537426e96a6cc530e2d5d8,
type: 3}
propertyPath: GroupId
value: 6
objectReference: {fileID: 0}
- target: {fileID: 8577361778124631730, guid: 54f3340298537426e96a6cc530e2d5d8,
type: 3}
propertyPath: GroupId
value: 6
objectReference: {fileID: 0}
m_RemovedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: 54f3340298537426e96a6cc530e2d5d8, type: 3}
--- !u!1001 &2043067438

- target: {fileID: 4558743310993102, guid: 54f3340298537426e96a6cc530e2d5d8, type: 3}
propertyPath: m_RootOrder
value: 6
objectReference: {fileID: 0}
- target: {fileID: 114387866097048300, guid: 54f3340298537426e96a6cc530e2d5d8,
type: 3}
propertyPath: GroupId
value: 2
objectReference: {fileID: 0}
- target: {fileID: 114734187185382186, guid: 54f3340298537426e96a6cc530e2d5d8,
type: 3}
propertyPath: GroupId
value: 2
objectReference: {fileID: 0}
- target: {fileID: 3316085536305919483, guid: 54f3340298537426e96a6cc530e2d5d8,
type: 3}
propertyPath: GroupId
value: 2
objectReference: {fileID: 0}
- target: {fileID: 8577361778124631730, guid: 54f3340298537426e96a6cc530e2d5d8,
type: 3}
propertyPath: GroupId
value: 2
objectReference: {fileID: 0}
m_RemovedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: 54f3340298537426e96a6cc530e2d5d8, type: 3}

22
Project/Assets/ML-Agents/Examples/WallJump/Scripts/WallJumpAgent.cs


public class WallJumpAgent : Agent
{
// Depending on this value, the wall will have different height
int m_Configuration;
protected int m_Configuration;
// Brain to use when no wall is present
public NNModel noWallBrain;
// Brain to use when a jumpable wall is present

public GameObject ground;
public GameObject spawnArea;
Bounds m_SpawnAreaBounds;
protected Bounds m_SpawnAreaBounds;
Rigidbody m_ShortBlockRb;
Rigidbody m_AgentRb;
Material m_GroundMaterial;
Renderer m_GroundRenderer;
WallJumpSettings m_WallJumpSettings;
protected Rigidbody m_ShortBlockRb;
protected Rigidbody m_AgentRb;
protected Material m_GroundMaterial;
protected Renderer m_GroundRenderer;
protected WallJumpSettings m_WallJumpSettings;
public float jumpingTime;
public float jumpTime;

string m_SmallWallBehaviorName = "SmallWallJump";
string m_BigWallBehaviorName = "BigWallJump";
EnvironmentParameters m_ResetParams;
protected EnvironmentParameters m_ResetParams;
public override void Initialize()
{

/// <returns>The Enumerator to be used in a Coroutine.</returns>
/// <param name="mat">The material to be swapped.</param>
/// <param name="time">The time the material will remain.</param>
IEnumerator GoalScoredSwapGroundMaterial(Material mat, float time)
protected IEnumerator GoalScoredSwapGroundMaterial(Material mat, float time)
{
m_GroundRenderer.material = mat;
yield return new WaitForSeconds(time); //wait for 2 sec

}
// Detect when the agent hits the goal
void OnTriggerStay(Collider col)
protected virtual void OnTriggerStay(Collider col)
{
if (col.gameObject.CompareTag("goal") && DoGroundCheck(true))
{

/// If 1: Small wall and smallWallBrain.
/// Other : Tall wall and BigWallBrain.
/// </param>
void ConfigureAgent(int config)
protected virtual void ConfigureAgent(int config)
{
var localScale = wall.transform.localScale;
if (config == 0)

2
Project/Assets/ML-Agents/Examples/Hallway/Scenes/Hallway.unity.meta


fileFormatVersion: 2
guid: d6d6a33ed0e18459a8d61817d600978a
guid: 71d1487c63f604ff6985cc2f23c7afbf
DefaultImporter:
externalObjects: {}
userData:

932
Project/Assets/ML-Agents/Examples/Hallway/Prefabs/SymbolFinderArea.prefab
文件差异内容过多而无法显示
查看文件

22
Project/Assets/ML-Agents/Examples/Hallway/Scripts/HallwayAgent.cs


public GameObject symbolO;
public GameObject symbolX;
public bool useVectorObs;
Rigidbody m_AgentRb;
Material m_GroundMaterial;
Renderer m_GroundRenderer;
HallwaySettings m_HallwaySettings;
int m_Selection;
protected Rigidbody m_AgentRb;
protected Material m_GroundMaterial;
protected Renderer m_GroundRenderer;
protected HallwaySettings m_HallwaySettings;
protected int m_Selection;
StatsRecorder m_statsRecorder;
public override void Initialize()

m_GroundRenderer = ground.GetComponent<Renderer>();
m_GroundMaterial = m_GroundRenderer.material;
m_statsRecorder = Academy.Instance.StatsRecorder;
//m_statsRecorder = Academy.Instance.StatsRecorder;
}
public override void CollectObservations(VectorSensor sensor)

}
}
IEnumerator GoalScoredSwapGroundMaterial(Material mat, float time)
protected IEnumerator GoalScoredSwapGroundMaterial(Material mat, float time)
{
m_GroundRenderer.material = mat;
yield return new WaitForSeconds(time);

{
SetReward(1f);
StartCoroutine(GoalScoredSwapGroundMaterial(m_HallwaySettings.goalScoredMaterial, 0.5f));
m_statsRecorder.Add("Goal/Correct", 1, StatAggregationMethod.Sum);
// m_statsRecorder.Add("Goal/Correct", 1, StatAggregationMethod.Sum);
m_statsRecorder.Add("Goal/Wrong", 1, StatAggregationMethod.Sum);
// m_statsRecorder.Add("Goal/Wrong", 1, StatAggregationMethod.Sum);
}
EndEpisode();
}

symbolXGoal.transform.position = new Vector3(7f, 0.5f, 22.29f) + area.transform.position;
symbolOGoal.transform.position = new Vector3(-7f, 0.5f, 22.29f) + area.transform.position;
}
m_statsRecorder.Add("Goal/Correct", 0, StatAggregationMethod.Sum);
m_statsRecorder.Add("Goal/Wrong", 0, StatAggregationMethod.Sum);
// m_statsRecorder.Add("Goal/Correct", 0, StatAggregationMethod.Sum);
// m_statsRecorder.Add("Goal/Wrong", 0, StatAggregationMethod.Sum);
}
}

35
ml-agents/mlagents/trainers/behavior_id_utils.py


from typing import NamedTuple
from typing import NamedTuple, Optional
from urllib.parse import urlparse, parse_qs

behavior_id: str
brain_name: str
team_id: int
group_id: int
Parses a name_behavior_id of the form name?team=0
Parses a name_behavior_id of the form name?team=0&group=0
group_id: int = 0
if "group" in ids:
group_id = int(ids["group"][0])
behavior_id=name_behavior_id, brain_name=name, team_id=team_id
behavior_id=name_behavior_id,
brain_name=name,
team_id=team_id,
group_id=group_id,
def create_name_behavior_id(name: str, team_id: int) -> str:
def create_name_behavior_id(
name: str, team_id: Optional[int] = None, group_id: Optional[int] = None
) -> str:
"""
Reconstructs fully qualified behavior name from name and team_id
:param name: brain name
:param team_id: team ID
:return: name_behavior_id
Reconstructs fully qualified behavior name from name and team_id
:param name: brain name
:param team_id: team ID
:return: name_behavior_id
"""
return name + "?team=" + str(team_id)
final_name = name
if team_id is not None:
final_name += f"?team={team_id}"
if group_id is not None:
final_name += f"&group={group_id}"
return final_name
def get_global_agent_id(worker_id: int, agent_id: int) -> str:

14
ml-agents/mlagents/trainers/ghost/trainer.py


:param parsed_behavior_id: Behavior ID that the policy should belong to.
:param policy: Policy to associate with name_behavior_id.
"""
name_behavior_id = parsed_behavior_id.behavior_id
self._name_to_parsed_behavior_id[name_behavior_id] = parsed_behavior_id
name_behavior_id = create_name_behavior_id(
parsed_behavior_id.brain_name, team_id=parsed_behavior_id.team_id
)
# Add policy only based on the team id, not the group id
self._name_to_parsed_behavior_id[
parsed_behavior_id.behavior_id
] = parsed_behavior_id
self.policies[name_behavior_id] = policy
def get_policy(self, name_behavior_id: str) -> Policy:

:return: Policy associated with name_behavior_id
"""
# Get policy based on team id, but not group id
parsed_behavior_id = BehaviorIdentifiers.from_name_behavior_id(name_behavior_id)
name_behavior_id = create_name_behavior_id(
parsed_behavior_id.brain_name, team_id=parsed_behavior_id.team_id
)
return self.policies[name_behavior_id]
def _save_snapshot(self) -> None:

72
ml-agents/mlagents/trainers/buffer.py


import numpy as np
import h5py
from typing import List, BinaryIO
from typing import List, BinaryIO, Any
import itertools
from mlagents_envs.exception import UnityException

class AgentBufferField(list):
"""
AgentBufferField is a list of numpy arrays. When an agent collects a field, you can add it to its
AgentBufferField with the append method.
AgentBufferField is a list of data, usually numpy arrays. When an agent collects a field,
you can add it to its AgentBufferField with the append method.
"""
def __init__(self):

def __str__(self):
return str(np.array(self).shape)
def append(self, element: np.ndarray, padding_value: float = 0.0) -> None:
def append(self, element: Any, padding_value: Any = 0.0) -> None:
Adds an element to this list. Also lets you change the padding
Adds an element to this AgentBuffer. Also lets you change the padding
type, so that it can be set on append (e.g. action_masks should
be padded with 1.)
:param element: The element to append to the list.

self.padding_value = padding_value
def extend(self, data: np.ndarray) -> None:
"""
Adds a list of np.arrays to the end of the list of np.arrays.
:param data: The np.array list to append.
"""
self += list(np.array(data, dtype=np.float32))
def set(self, data):
def set(self, data: List[Any]) -> None:
Sets the list of np.array to the input data
:param data: The np.array list to be set.
Sets the AgentBuffer to the provided list
:param data: The list to be set.
dtype = None
if data is not None and len(data) and isinstance(data[0], float):
dtype = np.float32
self[:] = list(np.array(data, dtype=dtype))
self[:] = data
def get_batch(
self,

) -> np.ndarray:
) -> List[Any]:
from the list of np.array
from the AgentBuffer.
:param batch_size: The number of elements to retrieve. If None:
All elements will be retrieved.
:param training_length: The length of the sequence to be retrieved. If

)
if batch_size * training_length > len(self):
padding = np.array(self[-1], dtype=np.float32) * self.padding_value
return np.array(
[padding] * (training_length - leftover) + self[:],
dtype=np.float32,
)
return [padding] * (training_length - leftover) + self[:]
return np.array(
self[len(self) - batch_size * training_length :],
dtype=np.float32,
)
return self[len(self) - batch_size * training_length :]
else:
# The sequences will have overlapping elements
if batch_size is None:

tmp_list: List[np.ndarray] = []
for end in range(len(self) - batch_size + 1, len(self) + 1):
tmp_list += self[end - training_length : end]
return np.array(tmp_list, dtype=np.float32)
return tmp_list
def reset_field(self) -> None:
"""

if key not in self.keys():
return False
if (length is not None) and (length != len(self[key])):
print(length, key, len(self[key]))
return False
length = len(self[key])
return True

return len(next(iter(self.values())))
else:
return 0
@staticmethod
def obs_list_to_obs_batch(obs_list: List[List[np.ndarray]]) -> List[np.ndarray]:
"""
Converts a List of obs (an obs itself consinsting of a List of np.ndarray) to
a List of np.ndarray, with the observations batchwise.
"""
# Transpose and convert List of Lists
new_list = list(map(lambda x: np.asanyarray(list(x)), zip(*obs_list)))
return new_list
@staticmethod
def obs_list_list_to_obs_batch(
obs_list_list: List[List[List[np.ndarray]]]
) -> List[List[np.ndarray]]:
"""
Convert a List of List of obs, where one of the dimension is time and the other is number (e.g. in the
case of a variable number of critic observations) to a List of obs, where time is in the batch dimension
of the obs, and the List is the variable number of agents.
"""
new_list = list(
map(
lambda x: AgentBuffer.obs_list_to_obs_batch(list(x)),
zip(*obs_list_list),
)
)
return new_list

194
ml-agents/mlagents/trainers/trajectory.py


from typing import List, NamedTuple
import itertools
import attr
import numpy as np
from mlagents.trainers.buffer import AgentBuffer

class AgentExperience(NamedTuple):
@attr.s(auto_attribs=True)
class TeammateStatus:
"""
Stores data related to an agent's teammate.
"""
reward: float
action: ActionTuple
done: bool
@attr.s(auto_attribs=True)
class AgentExperience:
obs: List[np.ndarray]
teammate_status: List[TeammateStatus]
reward: float
done: bool
action: ActionTuple

return result
class TeamObsUtil:
@staticmethod
def get_name_at(index: int) -> str:
"""
returns the name of the observation given the index of the observation
"""
return f"team_obs_{index}"
@staticmethod
def get_name_at_next(index: int) -> str:
"""
returns the name of the next team observation given the index of the observation
"""
return f"team_obs_next_{index}"
@staticmethod
def _padded_time_to_batch(
agent_buffer_field: AgentBuffer.AgentBufferField,
) -> List[np.ndarray]:
"""
Convert an AgentBufferField of List of obs, where one of the dimension is time and the other is number (e.g.
in the case of a variable number of critic observations) to a List of obs, where time is in the batch dimension
of the obs, and the List is the variable number of agents. For cases where there are varying number of agents,
pad the non-existent agents with NaN.
"""
# Find the first observation. This should be USUALLY O(1)
obs_shape = None
for _team_obs in agent_buffer_field:
if _team_obs:
obs_shape = _team_obs[0].shape
break
# If there were no critic obs at all
if obs_shape is None:
return []
new_list = list(
map(
lambda x: np.asanyarray(x),
itertools.zip_longest(
*agent_buffer_field, fillvalue=np.full(obs_shape, np.nan)
),
)
)
return new_list
@staticmethod
def _transpose_list_of_lists(
list_list: List[List[np.ndarray]],
) -> List[List[np.ndarray]]:
return list(map(list, zip(*list_list)))
@staticmethod
def from_buffer(batch: AgentBuffer, num_obs: int) -> List[np.array]:
"""
Creates the list of observations from an AgentBuffer
"""
separated_obs: List[np.array] = []
for i in range(num_obs):
separated_obs.append(
TeamObsUtil._padded_time_to_batch(batch[TeamObsUtil.get_name_at(i)])
)
# separated_obs contains a List(num_obs) of Lists(num_agents), we want to flip
# that and get a List(num_agents) of Lists(num_obs)
result = TeamObsUtil._transpose_list_of_lists(separated_obs)
return result
@staticmethod
def from_buffer_next(batch: AgentBuffer, num_obs: int) -> List[np.array]:
"""
Creates the list of observations from an AgentBuffer
"""
separated_obs: List[np.array] = []
for i in range(num_obs):
separated_obs.append(
TeamObsUtil._padded_time_to_batch(
batch[TeamObsUtil.get_name_at_next(i)]
)
)
# separated_obs contains a List(num_obs) of Lists(num_agents), we want to flip
# that and get a List(num_agents) of Lists(num_obs)
result = TeamObsUtil._transpose_list_of_lists(separated_obs)
return result
next_collab_obs: List[List[np.ndarray]]
agent_id: str
behavior_id: str

agent_buffer_trajectory = AgentBuffer()
obs = self.steps[0].obs
for step, exp in enumerate(self.steps):
if step < len(self.steps) - 1:
is_last_step = step == len(self.steps) - 1
if not is_last_step:
next_obs = self.steps[step + 1].obs
else:
next_obs = self.next_obs

agent_buffer_trajectory[ObsUtil.get_name_at(i)].append(obs[i])
agent_buffer_trajectory[ObsUtil.get_name_at_next(i)].append(next_obs[i])
# Take care of teammate obs and actions
teammate_continuous_actions, teammate_discrete_actions, teammate_rewards = (
[],
[],
[],
)
for teammate_status in exp.teammate_status:
teammate_rewards.append(teammate_status.reward)
teammate_continuous_actions.append(teammate_status.action.continuous)
teammate_discrete_actions.append(teammate_status.action.discrete)
# Team actions
agent_buffer_trajectory["team_continuous_action"].append(
teammate_continuous_actions
)
agent_buffer_trajectory["team_discrete_action"].append(
teammate_discrete_actions
)
agent_buffer_trajectory["team_rewards"].append(teammate_rewards)
team_reward = teammate_rewards + [exp.reward]
agent_buffer_trajectory["average_team_reward"].append(
sum(team_reward) / len(team_reward)
)
# Next actions
teammate_cont_next_actions = []
teammate_disc_next_actions = []
if not is_last_step:
next_exp = self.steps[step + 1]
for teammate_status in next_exp.teammate_status:
teammate_cont_next_actions.append(teammate_status.action.continuous)
teammate_disc_next_actions.append(teammate_status.action.discrete)
else:
for teammate_status in exp.teammate_status:
teammate_cont_next_actions.append(teammate_status.action.continuous)
teammate_disc_next_actions.append(teammate_status.action.discrete)
agent_buffer_trajectory["team_next_continuous_action"].append(
teammate_cont_next_actions
)
agent_buffer_trajectory["team_next_discrete_action"].append(
teammate_disc_next_actions
)
for i in range(num_obs):
ith_team_obs = []
for _teammate_status in exp.teammate_status:
# Assume teammates have same obs space
ith_team_obs.append(_teammate_status.obs[i])
agent_buffer_trajectory[TeamObsUtil.get_name_at(i)].append(ith_team_obs)
ith_team_obs_next = []
if is_last_step:
for _obs in self.next_collab_obs:
ith_team_obs_next.append(_obs[i])
else:
next_teammate_status = self.steps[step + 1].teammate_status
for _teammate_status in next_teammate_status:
# Assume teammates have same obs space
ith_team_obs_next.append(_teammate_status.obs[i])
agent_buffer_trajectory[TeamObsUtil.get_name_at_next(i)].append(
ith_team_obs_next
)
agent_buffer_trajectory["team_dones"].append(
[_status.done for _status in exp.teammate_status]
)
cont_next_actions = np.zeros_like(exp.action.continuous)
disc_next_actions = np.zeros_like(exp.action.discrete)
if not is_last_step:
next_action = self.steps[step + 1].action
cont_next_actions = next_action.continuous
disc_next_actions = next_action.discrete
agent_buffer_trajectory["next_continuous_action"].append(cont_next_actions)
agent_buffer_trajectory["next_discrete_action"].append(disc_next_actions)
agent_buffer_trajectory["continuous_log_probs"].append(
exp.action_probs.continuous
)

Returns true if trajectory is terminated with a Done.
"""
return self.steps[-1].done
@property
def teammate_dones_reached(self) -> bool:
"""
Returns true if all teammates are done at the end of the trajectory.
Combine with done_reached to check if the whole team is done.
"""
return all(_status.done for _status in self.steps[-1].teammate_status)
@property
def interrupted(self) -> bool:

81
ml-agents/mlagents/trainers/agent_processor.py


import sys
import numpy as np
from typing import List, Dict, TypeVar, Generic, Tuple, Any, Union
from collections import defaultdict, Counter
import queue

StatsAggregationMethod,
EnvironmentStats,
)
from mlagents.trainers.trajectory import Trajectory, AgentExperience
from mlagents.trainers.trajectory import TeammateStatus, Trajectory, AgentExperience
from mlagents.trainers.policy import Policy
from mlagents.trainers.action_info import ActionInfo, ActionInfoOutputs
from mlagents.trainers.torch.action_log_probs import LogProbsTuple

"""
self.experience_buffers: Dict[str, List[AgentExperience]] = defaultdict(list)
self.last_step_result: Dict[str, Tuple[DecisionStep, int]] = {}
# current_group_obs is used to collect the last seen obs of all the agents in the same group,
# and assemble the collab_obs.
self.current_group_obs: Dict[str, Dict[str, List[np.ndarray]]] = defaultdict(
lambda: defaultdict(list)
)
# last_group_obs is used to collect the last seen obs of all the agents in the same group,
# and assemble the collab_obs.
self.teammate_status: Dict[str, Dict[str, TeammateStatus]] = defaultdict(
lambda: defaultdict(None)
)
# last_take_action_outputs stores the action a_t taken before the current observation s_(t+1), while
# grabbing previous_action from the policy grabs the action PRIOR to that, a_(t-1).
self.last_take_action_outputs: Dict[str, ActionInfoOutputs] = {}

if global_id in self.last_step_result: # Don't store if agent just reset
self.last_take_action_outputs[global_id] = take_action_outputs
# Iterate over all the terminal steps
# Iterate over all the terminal steps, first gather all the teammate obs
# and then create the AgentExperiences/Trajectories
for terminal_step in terminal_steps.values():
local_id = terminal_step.agent_id
global_id = get_global_agent_id(worker_id, local_id)
self._gather_teammate_obs(terminal_step, global_id)
for terminal_step in terminal_steps.values():
local_id = terminal_step.agent_id
global_id = get_global_agent_id(worker_id, local_id)

# Iterate over all the decision steps
# Clear the last seen group obs when agents die.
self._clear_teammate_obs(global_id)
# Clean the last experience dictionary for terminal steps
for terminal_step in terminal_steps.values():
local_id = terminal_step.agent_id
global_id = get_global_agent_id(worker_id, local_id)
# Iterate over all the decision steps, first gather all the teammate obs
# and then create the trajectories
for ongoing_step in decision_steps.values():
local_id = ongoing_step.agent_id
global_id = get_global_agent_id(worker_id, local_id)
self._gather_teammate_obs(ongoing_step, global_id)
for ongoing_step in decision_steps.values():
local_id = ongoing_step.agent_id
global_id = get_global_agent_id(worker_id, local_id)

[_gid], take_action_outputs["action"]
)
def _gather_teammate_obs(
self, step: Union[TerminalStep, DecisionStep], global_id: str
) -> None:
stored_decision_step, idx = self.last_step_result.get(global_id, (None, None))
stored_take_action_outputs = self.last_take_action_outputs.get(global_id, None)
if stored_decision_step is not None and stored_take_action_outputs is not None:
if step.team_manager_id is not None:
stored_actions = stored_take_action_outputs["action"]
action_tuple = ActionTuple(
continuous=stored_actions.continuous[idx],
discrete=stored_actions.discrete[idx],
)
teammate_status = TeammateStatus(
obs=stored_decision_step.obs,
reward=step.reward,
action=action_tuple,
done=isinstance(step, TerminalStep),
)
self.teammate_status[step.team_manager_id][global_id] = teammate_status
self.current_group_obs[step.team_manager_id][global_id] = step.obs
def _clear_teammate_obs(self, global_id: str) -> None:
self._delete_in_nested_dict(self.current_group_obs, global_id)
self._delete_in_nested_dict(self.teammate_status, global_id)
def _delete_in_nested_dict(self, nested_dict, key):
for _manager_id, _team_group in nested_dict.items():
self._safe_delete(_team_group, key)
if not _team_group: # if dict is empty
self._safe_delete(_team_group, _manager_id)
def _process_step(
self, step: Union[TerminalStep, DecisionStep], global_id: str, index: int
) -> None:

)
action_mask = stored_decision_step.action_mask
prev_action = self.policy.retrieve_previous_action([global_id])[0, :]
# Assemble teammate_obs. If none saved, then it will be an empty list.
teammate_statuses = []
for _id, _obs in self.teammate_status[step.team_manager_id].items():
if _id != global_id:
teammate_statuses.append(_obs)
teammate_status=teammate_statuses,
reward=step.reward,
done=done,
action=action_tuple,

len(self.experience_buffers[global_id]) >= self.max_trajectory_length
or terminated
):
# Make next AgentExperience
next_collab_obs = []
for _id, _exp in self.current_group_obs[step.team_manager_id].items():
if _id != global_id:
next_collab_obs.append(_exp)
next_collab_obs=next_collab_obs,
behavior_id=self.behavior_id,
)
for traj_queue in self.trajectory_queues:

29
ml-agents/mlagents/trainers/tests/test_buffer.py


b = AgentBuffer()
for step in range(9):
b["vector_observation"].append(
[
100 * fake_agent_id + 10 * step + 1,
100 * fake_agent_id + 10 * step + 2,
100 * fake_agent_id + 10 * step + 3,
]
np.array(
[
100 * fake_agent_id + 10 * step + 1,
100 * fake_agent_id + 10 * step + 2,
100 * fake_agent_id + 10 * step + 3,
],
dtype=np.float32,
)
[100 * fake_agent_id + 10 * step + 4, 100 * fake_agent_id + 10 * step + 5]
np.array(
[
100 * fake_agent_id + 10 * step + 4,
100 * fake_agent_id + 10 * step + 5,
],
dtype=np.float32,
)
)
return b

a = agent_1_buffer["vector_observation"].get_batch(
batch_size=2, training_length=1, sequential=True
)
assert_array(np.array(a), np.array([[171, 172, 173], [181, 182, 183]]))
assert len(a) == 2
assert_array(
np.array(a), np.array([[171, 172, 173], [181, 182, 183]], dtype=np.float32)
)
a = agent_2_buffer["vector_observation"].get_batch(
batch_size=2, training_length=3, sequential=True
)

[261, 262, 263],
[271, 272, 273],
[281, 282, 283],
]
],
dtype=np.float32,
),
)
a = agent_2_buffer["vector_observation"].get_batch(

26
ml-agents/mlagents/trainers/tests/torch/test_attention.py


from mlagents.trainers.torch.layers import linear_layer
from mlagents.trainers.torch.attention import (
MultiHeadAttention,
EntityEmbeddings,
EntityEmbedding,
ResidualSelfAttention,
)

input_1 = generate_input_helper(masking_pattern_1)
input_2 = generate_input_helper(masking_pattern_2)
masks = EntityEmbeddings.get_masks([input_1, input_2])
masks = ResidualSelfAttention.get_masks([input_1, input_2])
assert len(masks) == 2
masks_1 = masks[0]
masks_2 = masks[1]

torch.manual_seed(1336)
size, n_k, = 3, 5
embedding_size = 64
entity_embeddings = EntityEmbeddings(size, [size], embedding_size, [n_k])
transformer = ResidualSelfAttention(embedding_size, [n_k])
entity_embeddings = EntityEmbedding(size, size, n_k, embedding_size)
transformer = ResidualSelfAttention(embedding_size, n_k)
point_range = 3
init_error = -1.0
for _ in range(250):
center = torch.rand((batch_size, size)) * point_range * 2 - point_range
key = torch.rand((batch_size, n_k, size)) * point_range * 2 - point_range
for _ in range(200):
center = torch.rand((batch_size, size))
key = torch.rand((batch_size, n_k, size))
with torch.no_grad():
# create the target : The key closest to the query in euclidean distance
distance = torch.sum(

target = torch.stack(target, dim=0)
target = target.detach()
embeddings = entity_embeddings(center, [key])
masks = EntityEmbeddings.get_masks([key])
embeddings = entity_embeddings(center, key)
masks = ResidualSelfAttention.get_masks([key])
if init_error == -1.0:
init_error = error.item()
else:
assert error.item() < init_error
assert error.item() < 0.3
assert error.item() < 0.02

10
ml-agents/mlagents/trainers/policy/torch_policy.py


masks: Optional[torch.Tensor] = None,
memories: Optional[torch.Tensor] = None,
seq_len: int = 1,
critic_obs: Optional[List[List[torch.Tensor]]] = None,
) -> Tuple[AgentAction, ActionLogProbs, torch.Tensor, torch.Tensor]:
"""
:param obs: List of observations.

masks: Optional[torch.Tensor] = None,
memories: Optional[torch.Tensor] = None,
seq_len: int = 1,
team_obs: Optional[List[List[torch.Tensor]]] = None,
team_act: Optional[List[AgentAction]] = None,
log_probs, entropies, value_heads = self.actor_critic.get_stats_and_value(
obs, actions, masks, memories, seq_len
log_probs, entropies, q_heads, baseline, values = self.actor_critic.get_stats_and_value(
obs, actions, masks, memories, seq_len, team_obs, team_act
return log_probs, entropies, value_heads
return log_probs, entropies, q_heads, baseline, values
@timed
def evaluate(

memories = torch.as_tensor(self.retrieve_memories(global_agent_ids)).unsqueeze(
0
)
run_out = {}
with torch.no_grad():
action, log_probs, entropy, memories = self.sample_actions(

137
ml-agents/mlagents/trainers/ppo/trainer.py


self.policy.update_normalization(agent_buffer_trajectory)
# Get all value estimates
value_estimates, value_next = self.optimizer.get_trajectory_value_estimates(
(
value_estimates,
baseline_estimates,
value_next,
) = self.optimizer.get_trajectory_value_estimates(
trajectory.next_collab_obs,
trajectory.teammate_dones_reached and trajectory.done_reached and not trajectory.interrupted,
agent_buffer_trajectory[f"{name}_baseline_estimates"].extend(
baseline_estimates[name]
)
self._stats_reporter.add_stat(
f"Policy/{self.optimizer.reward_signals[name].name.capitalize()} Baseline Estimate",
np.mean(baseline_estimates[name]),
)
np.mean(v),
np.mean(value_estimates[name]),
# Evaluate all reward functions
self.collected_rewards["environment"][agent_id] += np.sum(
agent_buffer_trajectory["environment_rewards"]
)

tmp_advantages = []
tmp_returns = []
for name in self.optimizer.reward_signals:
bootstrap_value = value_next[name]
local_value_estimates = agent_buffer_trajectory[
baseline_estimates = agent_buffer_trajectory[
f"{name}_baseline_estimates"
].get_batch()
v_estimates = agent_buffer_trajectory[
local_advantage = get_gae(
#next_value_estimates = agent_buffer_trajectory[
# f"{name}_value_estimates_next"
#].get_batch()
#next_m_value_estimates = agent_buffer_trajectory[
# f"{name}_marginalized_value_estimates_next"
#].get_batch()
returns_v, returns_b = get_team_returns(
value_estimates=local_value_estimates,
value_next=bootstrap_value,
baseline_estimates=baseline_estimates,
v_estimates=v_estimates,
value_next=value_next[name],
local_return = local_advantage + local_value_estimates
#print("loc", local_rewards[-1])
#print("tdlam", returns_v)
#local_advantage = get_team_gae(
# rewards=local_rewards,
# value_estimates=v_estimates,
# baseline=baseline_estimates,
# value_next=value_next[name],
# gamma=self.optimizer.reward_signals[name].gamma,
# lambd=self.hyperparameters.lambd,
#)
self._stats_reporter.add_stat(
f"Policy/{self.optimizer.reward_signals[name].name.capitalize()} TD Lam",
np.mean(returns_v),
)
#local_advantage = np.array(returns_v) - baseline_estimates
local_advantage = np.array(returns_v) - np.array(baseline_estimates)
#self._stats_reporter.add_stat(
# f"Policy/{self.optimizer.reward_signals[name].name.capitalize()} GAE Advantage Estimate",
# np.mean(gae_advantage),
#)
self._stats_reporter.add_stat(
f"Policy/{self.optimizer.reward_signals[name].name.capitalize()} TD Advantage Estimate",
np.mean(local_advantage),
)
local_return = local_advantage + baseline_estimates
#local_return = local_advantage + q_estimates
agent_buffer_trajectory[f"{name}_returns"].set(local_return)
# agent_buffer_trajectory[f"{name}_returns"].set(local_return)
agent_buffer_trajectory[f"{name}_returns_b"].set(returns_v)
agent_buffer_trajectory[f"{name}_returns_v"].set(returns_v)
agent_buffer_trajectory[f"{name}_advantage"].set(local_advantage)
tmp_advantages.append(local_advantage)
tmp_returns.append(local_return)

)
global_returns = list(np.mean(np.array(tmp_returns, dtype=np.float32), axis=0))
agent_buffer_trajectory["advantages"].set(global_advantages)
agent_buffer_trajectory["discounted_returns"].set(global_returns)
# Append to update buffer
agent_buffer_trajectory.resequence_and_append(

n_sequences = max(
int(self.hyperparameters.batch_size / self.policy.sequence_length), 1
)
advantages = self.update_buffer["advantages"].get_batch()
#Normalize advantages
advantages = np.array(self.update_buffer["advantages"].get_batch())
(advantages - advantages.mean()) / (advantages.std() + 1e-10)
list((advantages - advantages.mean()) / (advantages.std() + 1e-10))
)
num_epoch = self.hyperparameters.num_epoch
batch_update_stats = defaultdict(list)

return discounted_r
def lambd_return(r, value_estimates, gamma=0.99, lambd=0.8, value_next=0.0):
returns = np.zeros_like(r)
returns[-1] = r[-1] + gamma * value_next
for t in reversed(range(0, r.size - 1)):
returns[t] = gamma * lambd * returns[t + 1] + r[t] + (1 - lambd) * gamma * value_estimates[t + 1]
return returns
def get_team_gae(rewards, value_estimates, baseline, value_next=0.0, gamma=0.99, lambd=0.95):
"""
Computes generalized advantage estimate for use in updating policy.
:param rewards: list of rewards for time-steps t to T.
:param value_next: Value estimate for time-step T+1.
:param value_estimates: list of value estimates for time-steps t to T.
:param gamma: Discount factor.
:param lambd: GAE weighing factor.
:return: list of advantage estimates for time-steps t to T.
"""
value_estimates = np.append(value_estimates, value_next)
delta_t = rewards + gamma * value_estimates[1:] - baseline
advantage = discount_rewards(r=delta_t, gamma=gamma * lambd)
return advantage
def get_gae(rewards, value_estimates, value_next=0.0, gamma=0.99, lambd=0.95):
"""
Computes generalized advantage estimate for use in updating policy.

delta_t = rewards + gamma * value_estimates[1:] - value_estimates[:-1]
advantage = discount_rewards(r=delta_t, gamma=gamma * lambd)
return advantage
def get_team_returns(
rewards,
baseline_estimates,
v_estimates,
value_next=0.0,
died=False,
gamma=0.99,
lambd=0.8,
):
"""
Computes generalized advantage estimate for use in updating policy.
:param rewards: list of rewards for time-steps t to T.
:param value_next: Value estimate for time-step T+1.
:param value_estimates: list of value estimates for time-steps t to T.
:param gamma: Discount factor.
:param lambd: GAE weighing factor.
:return: list of advantage estimates for time-steps t to T.
"""
rewards = np.array(rewards)
returns_b = lambd_return(
rewards, baseline_estimates, gamma=gamma, lambd=lambd, value_next=value_next
)
returns_v = lambd_return(
rewards, v_estimates, gamma=gamma, lambd=lambd, value_next=value_next
)
return returns_v, returns_b

59
ml-agents/mlagents/trainers/ppo/optimizer_torch.py


from typing import Dict, cast
import itertools
import numpy as np
from mlagents.torch_utils import torch
from mlagents.trainers.buffer import AgentBuffer

from mlagents.trainers.torch.agent_action import AgentAction
from mlagents.trainers.torch.action_log_probs import ActionLogProbs
from mlagents.trainers.torch.utils import ModelUtils
from mlagents.trainers.trajectory import ObsUtil
from mlagents.trainers.trajectory import ObsUtil, TeamObsUtil
from mlagents.trainers.torch.networks import CentralizedValueNetwork
class TorchPPOOptimizer(TorchOptimizer):

self.stream_names = list(self.reward_signals.keys())
# ModelUtils.soft_update(
# self.policy.actor_critic.critic, self.policy.actor_critic.target, 1.0
# )
def ppo_value_loss(
self,
values: Dict[str, torch.Tensor],

for name, head in values.items():
old_val_tensor = old_values[name]
returns_tensor = returns[name]
clipped_value_estimate = old_val_tensor + torch.clamp(
head - old_val_tensor, -1 * epsilon, epsilon
)
#clipped_value_estimate = old_val_tensor + torch.clamp(
# head - old_val_tensor, -1 * epsilon, epsilon
#)
v_opt_b = (returns_tensor - clipped_value_estimate) ** 2
value_loss = ModelUtils.masked_mean(torch.max(v_opt_a, v_opt_b), loss_masks)
#v_opt_b = (returns_tensor - clipped_value_estimate) ** 2
#value_loss = ModelUtils.masked_mean(torch.max(v_opt_a, v_opt_b), loss_masks)
value_loss = ModelUtils.masked_mean(v_opt_a, loss_masks)
value_losses.append(value_loss)
value_loss = torch.mean(torch.stack(value_losses))
return value_loss

decay_lr = self.decay_learning_rate.get_value(self.policy.get_current_step())
decay_eps = self.decay_epsilon.get_value(self.policy.get_current_step())
decay_bet = self.decay_beta.get_value(self.policy.get_current_step())
returns = {}
returns_b = {}
returns_v = {}
old_marg_values = {}
returns[name] = ModelUtils.list_to_tensor(batch[f"{name}_returns"])
old_marg_values[name] = ModelUtils.list_to_tensor(
batch[f"{name}_baseline_estimates"]
)
returns_v[name] = ModelUtils.list_to_tensor(batch[f"{name}_returns_v"])
returns_b[name] = ModelUtils.list_to_tensor(batch[f"{name}_returns_b"])
#
team_obs = TeamObsUtil.from_buffer(batch, n_obs)
team_obs = [
[ModelUtils.list_to_tensor(obs) for obs in _teammate_obs]
for _teammate_obs in team_obs
]
team_actions = AgentAction.from_team_dict(batch)
# next_team_actions = AgentAction.from_team_dict_next(batch)
memories = [
ModelUtils.list_to_tensor(batch["memory"][i])

memories = torch.stack(memories).unsqueeze(0)
log_probs, entropy, values = self.policy.evaluate_actions(
log_probs, entropy, qs, baseline_vals, values = self.policy.evaluate_actions(
team_obs=team_obs,
team_act=team_actions,
# q_loss = self.ppo_value_loss(qs, old_values, returns_q, decay_eps, loss_masks)
baseline_loss = self.ppo_value_loss(
baseline_vals, old_marg_values, returns_b, decay_eps, loss_masks
)
values, old_values, returns, decay_eps, loss_masks
values, old_values, returns_v, decay_eps, loss_masks
policy_loss = self.ppo_policy_loss(
ModelUtils.list_to_tensor(batch["advantages"]),
log_probs,

loss = (
policy_loss
+ 0.5 * value_loss
+ 0.5 * (value_loss + baseline_loss)
- decay_bet * ModelUtils.masked_mean(entropy, loss_masks)
)

loss.backward()
self.optimizer.step()
# ModelUtils.soft_update(
# self.policy.actor_critic.critic, self.policy.actor_critic.target, 1.0
# )
# "Losses/Q Loss": q_loss.item(),
"Losses/Baseline Value Loss": baseline_loss.item(),
"Policy/Learning Rate": decay_lr,
"Policy/Epsilon": decay_eps,
"Policy/Beta": decay_bet,

115
ml-agents/mlagents/trainers/optimizer/torch_optimizer.py


from typing import Dict, Optional, Tuple, List
from mlagents.torch_utils import torch
from mlagents.trainers.torch.agent_action import AgentAction
from mlagents.trainers.trajectory import ObsUtil
from mlagents.trainers.trajectory import ObsUtil, TeamObsUtil
from mlagents.trainers.torch.components.bc.module import BCModule
from mlagents.trainers.torch.components.reward_providers import create_reward_provider

)
def get_trajectory_value_estimates(
self, batch: AgentBuffer, next_obs: List[np.ndarray], done: bool
self,
batch: AgentBuffer,
next_obs: List[np.ndarray],
next_critic_obs: List[List[np.ndarray]],
done: bool,
all_dones: bool,
team_obs = TeamObsUtil.from_buffer(batch, n_obs)
#next_obs = ObsUtil.from_buffer_next(batch, n_obs)
#next_team_obs = TeamObsUtil.from_buffer_next(batch, n_obs)
team_obs = [
[ModelUtils.list_to_tensor(obs) for obs in _teammate_obs]
for _teammate_obs in team_obs
]
#next_team_obs = [
# [ModelUtils.list_to_tensor(obs) for obs in _teammate_obs]
# for _teammate_obs in next_team_obs
#]
actions = AgentAction.from_dict(batch)
team_actions = AgentAction.from_team_dict(batch)
#next_actions = AgentAction.from_dict_next(batch)
#next_team_actions = AgentAction.from_team_dict_next(batch)
next_obs = [obs.unsqueeze(0) for obs in next_obs]
# critic_obs = TeamObsUtil.from_buffer(batch, n_obs)
# critic_obs = [
# [ModelUtils.list_to_tensor(obs) for obs in _teammate_obs]
# for _teammate_obs in critic_obs
# ]
next_critic_obs = [
ModelUtils.list_to_tensor_list(_list_obs) for _list_obs in next_critic_obs
]
# Expand dimensions of next critic obs
next_critic_obs = [
[_obs.unsqueeze(0) for _obs in _list_obs] for _list_obs in next_critic_obs
]
next_obs = [obs.unsqueeze(0) for obs in next_obs]
q_estimates, baseline_estimates, mem = self.policy.actor_critic.critic_pass(
current_obs,
actions,
memory,
sequence_length=batch.num_experiences,
team_obs=team_obs,
team_act=team_actions,
)
value_estimates, next_memory = self.policy.actor_critic.critic_pass(
current_obs, memory, sequence_length=batch.num_experiences
value_estimates, mem = self.policy.actor_critic.critic_value(
current_obs,
memory,
sequence_length=batch.num_experiences,
team_obs=team_obs,
next_value_estimate, _ = self.policy.actor_critic.critic_pass(
next_obs, next_memory, sequence_length=1
boot_value_estimates, mem = self.policy.actor_critic.critic_value(
next_obs,
memory,
sequence_length=batch.num_experiences,
team_obs=next_critic_obs,
#next_value_estimates, next_marg_val_estimates, next_mem = self.policy.actor_critic.target_critic_pass(
# next_obs,
# next_actions,
# memory,
# sequence_length=batch.num_experiences,
# team_obs=next_team_obs,
# team_act=next_team_actions,
#)
# # Actions is a hack here, we need the next actions
# next_value_estimate, next_marg_val_estimate, _ = self.policy.actor_critic.critic_pass(
# next_obs, actions, next_memory, sequence_length=1, critic_obs=next_critic_obs
# )
# These aren't used in COMAttention
for name, estimate in baseline_estimates.items():
baseline_estimates[name] = ModelUtils.to_numpy(estimate)
next_value_estimate[name] = ModelUtils.to_numpy(next_value_estimate[name])
# the base line and V shpuld not be on the same done flag
for name, estimate in boot_value_estimates.items():
boot_value_estimates[name] = ModelUtils.to_numpy(estimate)
if done:
for k in next_value_estimate:
if all_dones:
for k in boot_value_estimates:
next_value_estimate[k] = 0.0
boot_value_estimates[k][-1] = 0.0
# else:
# print(len(next_critic_obs))
# print(baseline_estimates)
# print(value_estimates)
# print(boot_value_baseline[k][-1])
#if done and not all_dones:
# print("agent finished but team going")
#elif all_dones:
# print("alldone")
#else:
# print("neither")
#print("final", boot_value_estimates)
#print("value", value_estimates)
#print("base", baseline_estimates)
return value_estimates, next_value_estimate
return (
value_estimates,
baseline_estimates,
boot_value_estimates,
)

2
ml-agents/mlagents/trainers/torch/components/bc/module.py


from mlagents.trainers.policy.torch_policy import TorchPolicy
from mlagents.trainers.demo_loader import demo_to_buffer
from mlagents.trainers.buffer import AgentBuffer
from mlagents.trainers.buffer import AgentBuffer
class BCModule:

3
ml-agents/mlagents/trainers/torch/components/reward_providers/extrinsic_reward_provider.py


class ExtrinsicRewardProvider(BaseRewardProvider):
def evaluate(self, mini_batch: AgentBuffer) -> np.ndarray:
return np.array(mini_batch["environment_rewards"], dtype=np.float32)
return np.array(mini_batch["average_team_reward"], dtype=np.float32)
# return np.array(mini_batch["environment_rewards"], dtype=np.float32)
def update(self, mini_batch: AgentBuffer) -> Dict[str, np.ndarray]:
return {}

25
ml-agents/mlagents/trainers/torch/encoders.py


return height, width
class VectorInput(nn.Module):
class InputProcessor:
def copy_normalization(self, other_input: "InputProcessor") -> None:
pass
def update_normalization(self, inputs: torch.Tensor) -> None:
pass
class VectorInput(nn.Module, InputProcessor):
def __init__(self, input_size: int, normalize: bool = False):
super().__init__()
self.normalizer: Optional[Normalizer] = None

inputs = self.normalizer(inputs)
return inputs
def copy_normalization(self, other_input: "VectorInput") -> None:
if self.normalizer is not None and other_input.normalizer is not None:
self.normalizer.copy_from(other_input.normalizer)
def copy_normalization(self, other_input: "InputProcessor") -> None:
if isinstance(other_input, VectorInput):
if self.normalizer is not None and other_input.normalizer is not None:
self.normalizer.copy_from(other_input.normalizer)
def update_normalization(self, inputs: torch.Tensor) -> None:
if self.normalizer is not None:

class SmallVisualEncoder(nn.Module):
class SmallVisualEncoder(nn.Module, InputProcessor):
"""
CNN architecture used by King in their Candy Crush predictor
https://www.researchgate.net/publication/328307928_Human-Like_Playtesting_with_Deep_Learning

return self.dense(hidden)
class SimpleVisualEncoder(nn.Module):
class SimpleVisualEncoder(nn.Module, InputProcessor):
def __init__(
self, height: int, width: int, initial_channels: int, output_size: int
):

return self.dense(hidden)
class NatureVisualEncoder(nn.Module):
class NatureVisualEncoder(nn.Module, InputProcessor):
def __init__(
self, height: int, width: int, initial_channels: int, output_size: int
):

return input_tensor + self.layers(input_tensor)
class ResNetVisualEncoder(nn.Module):
class ResNetVisualEncoder(nn.Module, InputProcessor):
def __init__(
self, height: int, width: int, initial_channels: int, output_size: int
):

12
ml-agents/mlagents/trainers/torch/utils.py


return torch.as_tensor(np.asanyarray(ndarray_list), dtype=dtype)
@staticmethod
def list_to_tensor_list(
ndarray_list: List[np.ndarray], dtype: Optional[torch.dtype] = torch.float32
) -> torch.Tensor:
"""
Converts a list of numpy arrays into a list of tensors. MUCH faster than
calling as_tensor on the list directly.
"""
return [
torch.as_tensor(np.asanyarray(_arr), dtype=dtype) for _arr in ndarray_list
]
@staticmethod
def to_numpy(tensor: torch.Tensor) -> np.ndarray:
"""
Converts a Torch Tensor to a numpy array. If the Tensor is on the GPU, it will

150
ml-agents/mlagents/trainers/torch/attention.py


from mlagents.torch_utils import torch
from typing import Tuple, Optional, List
from mlagents.trainers.torch.layers import LinearEncoder, Initialization, linear_layer
from mlagents.trainers.torch.layers import (
LinearEncoder,
Initialization,
linear_layer,
LayerNorm,
)
"""
Multi Head Attention module. We do not use the regular Torch implementation since
Barracuda does not support some operators it uses.
Takes as input to the forward method 3 tensors:
- query: of dimensions (batch_size, number_of_queries, embedding_size)
- key: of dimensions (batch_size, number_of_keys, embedding_size)
- value: of dimensions (batch_size, number_of_keys, embedding_size)
The forward method will return 2 tensors:
- The output: (batch_size, number_of_queries, embedding_size)
- The attention matrix: (batch_size, num_heads, number_of_queries, number_of_keys)
"""
"""
Multi Head Attention module. We do not use the regular Torch implementation since
Barracuda does not support some operators it uses.
Takes as input to the forward method 3 tensors:
- query: of dimensions (batch_size, number_of_queries, embedding_size)
- key: of dimensions (batch_size, number_of_keys, embedding_size)
- value: of dimensions (batch_size, number_of_keys, embedding_size)
The forward method will return 2 tensors:
- The output: (batch_size, number_of_queries, embedding_size)
- The attention matrix: (batch_size, num_heads, number_of_queries, number_of_keys)
:param embedding_size: The size of the embeddings that will be generated (should be
dividable by the num_heads)
:param total_max_elements: The maximum total number of entities that can be passed to
the module
:param num_heads: The number of heads of the attention module
"""
super().__init__()
self.n_heads = num_heads
self.head_size: int = embedding_size // self.n_heads

return value_attention, att
class EntityEmbeddings(torch.nn.Module):
"""
A module used to embed entities before passing them to a self-attention block.
Used in conjunction with ResidualSelfAttention to encode information about a self
and additional entities. Can also concatenate self to entities for ego-centric self-
attention. Inspired by architecture used in https://arxiv.org/pdf/1909.07528.pdf.
"""
class EntityEmbedding(torch.nn.Module):
entity_sizes: List[int],
entity_size: int,
entity_num_max_elements: Optional[int],
entity_num_max_elements: Optional[List[int]] = None,
:param entity_sizes: List of sizes for other entities. Should be of length
equivalent to the number of entities.
:param embedding_size: Embedding size for entity encoders.
:param entity_num_max_elements: Maximum elements in an entity, None for unrestricted.
:param entity_size: Size of other entitiy.
:param entity_num_max_elements: Maximum elements for a given entity, None for unrestricted.
:param concat_self: Whether to concatenate x_self to entites. Set True for ego-centric
:param embedding_size: Embedding size for the entity encoder.
:param concat_self: Whether to concatenate x_self to entities. Set True for ego-centric
self.entity_sizes: List[int] = entity_sizes
self.entity_num_max_elements: List[int] = [-1] * len(entity_sizes)
self.entity_size: int = entity_size
self.entity_num_max_elements: int = -1
if entity_num_max_elements is not None:
self.entity_num_max_elements = entity_num_max_elements

self.self_size = 0
self.ent_encoders = torch.nn.ModuleList(
[
LinearEncoder(self.self_size + ent_size, 1, embedding_size)
for ent_size in self.entity_sizes
]
# Initialization scheme from http://www.cs.toronto.edu/~mvolkovs/ICML2020_tfixup.pdf
self.ent_encoder = LinearEncoder(
self.self_size + self.entity_size,
1,
embedding_size,
kernel_init=Initialization.Normal,
kernel_gain=(0.125 / embedding_size) ** 0.5,
def forward(
self, x_self: torch.Tensor, entities: List[torch.Tensor]
) -> Tuple[torch.Tensor, int]:
def forward(self, x_self: torch.Tensor, entities: torch.Tensor) -> torch.Tensor:
num_entities = self.entity_num_max_elements
if num_entities < 0:
if exporting_to_onnx.is_exporting():
raise UnityTrainerException(
"Trying to export an attention mechanism that doesn't have a set max \
number of elements."
)
num_entities = entities.shape[1]
expanded_self = x_self.reshape(-1, 1, self.self_size)
expanded_self = torch.cat([expanded_self] * num_entities, dim=1)
self_and_ent: List[torch.Tensor] = []
for num_entities, ent in zip(self.entity_num_max_elements, entities):
if num_entities < 0:
if exporting_to_onnx.is_exporting():
raise UnityTrainerException(
"Trying to export an attention mechanism that doesn't have a set max \
number of elements."
)
num_entities = ent.shape[1]
expanded_self = x_self.reshape(-1, 1, self.self_size)
expanded_self = torch.cat([expanded_self] * num_entities, dim=1)
self_and_ent.append(torch.cat([expanded_self, ent], dim=2))
else:
self_and_ent = entities
# Encode and concatenate entites
encoded_entities = torch.cat(
[ent_encoder(x) for ent_encoder, x in zip(self.ent_encoders, self_and_ent)],
dim=1,
)
entities = torch.cat([expanded_self, entities], dim=2)
# Encode entities
encoded_entities = self.ent_encoder(entities)
@staticmethod
def get_masks(observations: List[torch.Tensor]) -> List[torch.Tensor]:
"""
Takes a List of Tensors and returns a List of mask Tensor with 1 if the input was
all zeros (on dimension 2) and 0 otherwise. This is used in the Attention
layer to mask the padding observations.
"""
with torch.no_grad():
# Generate the masking tensors for each entities tensor (mask only if all zeros)
key_masks: List[torch.Tensor] = [
(torch.sum(ent ** 2, axis=2) < 0.01).type(torch.FloatTensor)
for ent in observations
]
return key_masks
class ResidualSelfAttention(torch.nn.Module):
"""

def __init__(
self,
embedding_size: int,
entity_num_max_elements: Optional[List[int]] = None,
entity_num_max_elements: Optional[int] = None,
num_heads: int = 4,
):
"""

super().__init__()
self.max_num_ent: Optional[int] = None
if entity_num_max_elements is not None:
_entity_num_max_elements = entity_num_max_elements
self.max_num_ent = sum(_entity_num_max_elements)
self.max_num_ent = entity_num_max_elements
# Initialization scheme from http://www.cs.toronto.edu/~mvolkovs/ICML2020_tfixup.pdf
self.fc_q = linear_layer(
embedding_size,
embedding_size,

kernel_init=Initialization.Normal,
kernel_gain=(0.125 / embedding_size) ** 0.5,
)
self.embedding_norm = LayerNorm()
self.residual_norm = LayerNorm()
inp = self.embedding_norm(inp)
# Feed to self attention
query = self.fc_q(inp) # (b, n_q, emb)
key = self.fc_k(inp) # (b, n_k, emb)

output, _ = self.attention(query, key, value, num_ent, num_ent, mask)
# Residual
output = self.fc_out(output) + inp
output = self.residual_norm(output)
# Residual between x_self and the output of the module
@staticmethod
def get_masks(observations: List[torch.Tensor]) -> List[torch.Tensor]:
"""
Takes a List of Tensors and returns a List of mask Tensor with 1 if the input was
all zeros (on dimension 2) and 0 otherwise. This is used in the Attention
layer to mask the padding observations.
"""
with torch.no_grad():
# Generate the masking tensors for each entities tensor (mask only if all zeros)
key_masks: List[torch.Tensor] = [
(torch.sum(ent ** 2, axis=2) < 0.01).type(torch.FloatTensor)
for ent in observations
]
return key_masks

31
ml-agents/mlagents/trainers/torch/layers.py


pass
class LayerNorm(torch.nn.Module):
"""
A vanilla implementation of layer normalization https://arxiv.org/pdf/1607.06450.pdf
norm_x = (x - mean) / sqrt((x - mean) ^ 2)
This does not include the trainable parameters gamma and beta for performance speed.
Typically, this is norm_x * gamma + beta
"""
def forward(self, layer_activations: torch.Tensor) -> torch.Tensor:
mean = torch.mean(layer_activations, dim=-1, keepdim=True)
var = torch.mean((layer_activations - mean) ** 2, dim=-1, keepdim=True)
return (layer_activations - mean) / (torch.sqrt(var + 1e-5))
def __init__(self, input_size: int, num_layers: int, hidden_size: int):
def __init__(
self,
input_size: int,
num_layers: int,
hidden_size: int,
kernel_init: Initialization = Initialization.KaimingHeNormal,
kernel_gain: float = 1.0,
):
kernel_init=Initialization.KaimingHeNormal,
kernel_gain=1.0,
kernel_init=kernel_init,
kernel_gain=kernel_gain,
)
]
self.layers.append(Swish())

hidden_size,
hidden_size,
kernel_init=Initialization.KaimingHeNormal,
kernel_gain=1.0,
kernel_init=kernel_init,
kernel_gain=kernel_gain,
)
)
self.layers.append(Swish())

100
ml-agents/mlagents/trainers/torch/agent_action.py


from typing import List, Optional, NamedTuple, Dict
import itertools
from mlagents.trainers.buffer import AgentBuffer
class AgentAction(NamedTuple):

return action_tuple
@staticmethod
def _padded_time_to_batch(
agent_buffer_field: AgentBuffer.AgentBufferField,
dtype: torch.dtype = torch.float32,
) -> List[torch.Tensor]:
"""
Pad actions and convert to tensor. Note that data is padded by 0's, not NaNs
as the observations are.
"""
action_shape = None
for _action in agent_buffer_field:
if _action:
action_shape = _action[0].shape
break
# If there were no critic obs at all
if action_shape is None:
return []
new_list = list(
map(
lambda x: ModelUtils.list_to_tensor(x, dtype=dtype),
itertools.zip_longest(
*agent_buffer_field, fillvalue=np.full(action_shape, 0)
),
)
)
return new_list
@staticmethod
def from_dict(buff: Dict[str, np.ndarray]) -> "AgentAction":
"""
A static method that accesses continuous and discrete action fields in an AgentBuffer

discrete_tensor[..., i] for i in range(discrete_tensor.shape[-1])
]
return AgentAction(continuous, discrete)
@staticmethod
def from_dict_next(buff: Dict[str, np.ndarray]) -> "AgentAction":
"""
A static method that accesses continuous and discrete action fields in an AgentBuffer
and constructs the corresponding AgentAction from the retrieved np arrays.
"""
continuous: torch.Tensor = None
discrete: List[torch.Tensor] = None # type: ignore
if "next_continuous_action" in buff:
continuous = ModelUtils.list_to_tensor(buff["continuous_action"])
if "next_discrete_action" in buff:
discrete_tensor = ModelUtils.list_to_tensor(
buff["discrete_action"], dtype=torch.long
)
discrete = [
discrete_tensor[..., i] for i in range(discrete_tensor.shape[-1])
]
return AgentAction(continuous, discrete)
@staticmethod
def _from_team_dict(
buff: Dict[str, np.ndarray], cont_action_key: str, disc_action_key: str
):
continuous_tensors: List[torch.Tensor] = []
discrete_tensors: List[torch.Tensor] = [] # type: ignore
if cont_action_key in buff:
continuous_tensors = AgentAction._padded_time_to_batch(
buff[cont_action_key]
)
if disc_action_key in buff:
discrete_tensors = AgentAction._padded_time_to_batch(
buff[disc_action_key], dtype=torch.long
)
actions_list = []
for _cont, _disc in itertools.zip_longest(
continuous_tensors, discrete_tensors, fillvalue=None
):
if _disc is not None:
_disc = [_disc[..., i] for i in range(_disc.shape[-1])]
actions_list.append(AgentAction(_cont, _disc))
return actions_list
@staticmethod
def from_team_dict(buff: Dict[str, np.ndarray]) -> List["AgentAction"]:
"""
A static method that accesses continuous and discrete action fields in an AgentBuffer
and constructs the corresponding AgentAction from the retrieved np arrays.
"""
return AgentAction._from_team_dict(
buff, "team_continuous_action", "team_discrete_action"
)
@staticmethod
def from_team_dict_next(buff: Dict[str, np.ndarray]) -> List["AgentAction"]:
"""
A static method that accesses next continuous and discrete action fields in an AgentBuffer
and constructs the corresponding AgentAction from the retrieved np arrays.
"""
return AgentAction._from_team_dict(
buff, "team_next_continuous_action", "team_next_discrete_action"
)
def to_flat(self, discrete_branches: List[int]) -> torch.Tensor:
discrete_oh = ModelUtils.actions_to_onehot(
self.discrete_tensor, discrete_branches
)
discrete_oh = torch.cat(discrete_oh, dim=1)
return torch.cat([self.continuous_tensor, discrete_oh], dim=-1)

460
ml-agents/mlagents/trainers/torch/networks.py


from mlagents.trainers.torch.encoders import VectorInput
from mlagents.trainers.buffer import AgentBuffer
from mlagents.trainers.trajectory import ObsUtil
from mlagents.trainers.torch.attention import ResidualSelfAttention, EntityEmbedding
ActivationFunction = Callable[[torch.Tensor], torch.Tensor]

return encoding, memories
# NOTE: this class will be replaced with a multi-head attention when the time comes
class MultiInputNetworkBody(nn.Module):
def __init__(
self,
sensor_specs: List[SensorSpec],
network_settings: NetworkSettings,
action_spec: ActionSpec,
):
super().__init__()
self.normalize = network_settings.normalize
self.use_lstm = network_settings.memory is not None
# Scale network depending on num agents
self.h_size = network_settings.hidden_units
self.m_size = (
network_settings.memory.memory_size
if network_settings.memory is not None
else 0
)
self.processors, _input_size = ModelUtils.create_input_processors(
sensor_specs,
self.h_size,
network_settings.vis_encode_type,
normalize=self.normalize,
)
self.action_spec = action_spec
# Modules for self-attention
obs_only_ent_size = sum(_input_size)
q_ent_size = (
sum(_input_size)
+ sum(self.action_spec.discrete_branches)
+ self.action_spec.continuous_size
)
self.obs_encoder = EntityEmbedding(
0, obs_only_ent_size, None, self.h_size, concat_self=False
)
self.obs_action_encoder = EntityEmbedding(
0, q_ent_size, None, self.h_size, concat_self=False
)
self.self_attn = ResidualSelfAttention(self.h_size)
encoder_input_size = self.h_size
self.linear_encoder = LinearEncoder(
encoder_input_size, network_settings.num_layers, self.h_size
)
if self.use_lstm:
self.lstm = LSTM(self.h_size, self.m_size)
else:
self.lstm = None # type: ignore
@property
def memory_size(self) -> int:
return self.lstm.memory_size if self.use_lstm else 0
def update_normalization(self, buffer: AgentBuffer) -> None:
obs = ObsUtil.from_buffer(buffer, len(self.processors))
for vec_input, enc in zip(obs, self.processors):
if isinstance(enc, VectorInput):
enc.update_normalization(torch.as_tensor(vec_input))
def copy_normalization(self, other_network: "NetworkBody") -> None:
if self.normalize:
for n1, n2 in zip(self.processors, other_network.processors):
if isinstance(n1, VectorInput) and isinstance(n2, VectorInput):
n1.copy_normalization(n2)
def _get_masks_from_nans(self, obs_tensors: List[torch.Tensor]) -> torch.Tensor:
"""
Get attention masks by grabbing an arbitrary obs across all the agents
Since these are raw obs, the padded values are still NaN
"""
only_first_obs = [_all_obs[0] for _all_obs in obs_tensors]
obs_for_mask = torch.stack(only_first_obs, dim=1)
# Get the mask from nans
attn_mask = torch.any(obs_for_mask.isnan(), dim=2).type(torch.FloatTensor)
return attn_mask
def q_net(
self,
obs: List[List[torch.Tensor]],
actions: List[AgentAction],
memories: Optional[torch.Tensor] = None,
sequence_length: int = 1,
) -> Tuple[torch.Tensor, torch.Tensor]:
self_attn_masks = []
concat_f_inp = []
for inputs, action in zip(obs, actions):
encodes = []
for idx, processor in enumerate(self.processors):
obs_input = inputs[idx]
obs_input[obs_input.isnan()] = 0.0 # Remove NaNs
processed_obs = processor(obs_input)
encodes.append(processed_obs)
cat_encodes = [
torch.cat(encodes, dim=-1),
action.to_flat(self.action_spec.discrete_branches),
]
concat_f_inp.append(torch.cat(cat_encodes, dim=1))
f_inp = torch.stack(concat_f_inp, dim=1)
self_attn_masks.append(self._get_masks_from_nans(obs))
encoding, memories = self.forward(
f_inp,
None,
self_attn_masks,
memories=memories,
sequence_length=sequence_length,
)
return encoding, memories
def baseline(
self,
self_obs: List[List[torch.Tensor]],
obs: List[List[torch.Tensor]],
actions: List[AgentAction],
memories: Optional[torch.Tensor] = None,
sequence_length: int = 1,
) -> Tuple[torch.Tensor, torch.Tensor]:
self_attn_masks = []
f_inp = None
concat_f_inp = []
for inputs, action in zip(obs, actions):
encodes = []
for idx, processor in enumerate(self.processors):
obs_input = inputs[idx]
obs_input[obs_input.isnan()] = 0.0 # Remove NaNs
processed_obs = processor(obs_input)
encodes.append(processed_obs)
cat_encodes = [
torch.cat(encodes, dim=-1),
action.to_flat(self.action_spec.discrete_branches),
]
concat_f_inp.append(torch.cat(cat_encodes, dim=1))
if concat_f_inp:
f_inp = torch.stack(concat_f_inp, dim=1)
self_attn_masks.append(self._get_masks_from_nans(obs))
concat_encoded_obs = []
encodes = []
for idx, processor in enumerate(self.processors):
obs_input = self_obs[idx]
obs_input[obs_input.isnan()] = 0.0 # Remove NaNs
processed_obs = processor(obs_input)
encodes.append(processed_obs)
concat_encoded_obs.append(torch.cat(encodes, dim=-1))
g_inp = torch.stack(concat_encoded_obs, dim=1)
# Get the mask from nans
self_attn_masks.append(self._get_masks_from_nans([self_obs]))
encoding, memories = self.forward(
f_inp,
g_inp,
self_attn_masks,
memories=memories,
sequence_length=sequence_length,
)
return encoding, memories
def value(
self,
obs: List[List[torch.Tensor]],
memories: Optional[torch.Tensor] = None,
sequence_length: int = 1,
) -> Tuple[torch.Tensor, torch.Tensor]:
self_attn_masks = []
concat_encoded_obs = []
for inputs in obs:
encodes = []
for idx, processor in enumerate(self.processors):
obs_input = inputs[idx]
obs_input[obs_input.isnan()] = 0.0 # Remove NaNs
processed_obs = processor(obs_input)
encodes.append(processed_obs)
concat_encoded_obs.append(torch.cat(encodes, dim=-1))
g_inp = torch.stack(concat_encoded_obs, dim=1)
# Get the mask from nans
self_attn_masks.append(self._get_masks_from_nans(obs))
encoding, memories = self.forward(
None,
g_inp,
self_attn_masks,
memories=memories,
sequence_length=sequence_length,
)
return encoding, memories
def forward(
self,
f_enc: torch.Tensor,
g_enc: torch.Tensor,
self_attn_masks: List[torch.Tensor],
memories: Optional[torch.Tensor] = None,
sequence_length: int = 1,
) -> Tuple[torch.Tensor, torch.Tensor]:
self_attn_inputs = []
if f_enc is not None:
self_attn_inputs.append(self.obs_action_encoder(None, f_enc))
if g_enc is not None:
self_attn_inputs.append(self.obs_encoder(None, g_enc))
encoded_entity = torch.cat(self_attn_inputs, dim=1)
encoded_state = self.self_attn(encoded_entity, self_attn_masks)
inputs = encoded_state
encoding = self.linear_encoder(inputs)
if self.use_lstm:
# Resize to (batch, sequence length, encoding size)
encoding = encoding.reshape([-1, sequence_length, self.h_size])
encoding, memories = self.lstm(encoding, memories)
encoding = encoding.reshape([-1, self.m_size // 2])
return encoding, memories
class ValueNetwork(nn.Module):
def __init__(
self,

return output, memories
class CentralizedValueNetwork(ValueNetwork):
def __init__(
self,
stream_names: List[str],
observation_shapes: List[SensorSpec],
network_settings: NetworkSettings,
action_spec: ActionSpec,
outputs_per_stream: int = 1,
):
# This is not a typo, we want to call __init__ of nn.Module
nn.Module.__init__(self)
self.network_body = MultiInputNetworkBody(
observation_shapes, network_settings, action_spec=action_spec
)
if network_settings.memory is not None:
encoding_size = network_settings.memory.memory_size // 2
else:
encoding_size = network_settings.hidden_units
self.value_heads = ValueHeads(stream_names, encoding_size, outputs_per_stream)
def q_net(
self,
obs: List[List[torch.Tensor]],
actions: List[AgentAction],
memories: Optional[torch.Tensor] = None,
sequence_length: int = 1,
) -> Tuple[torch.Tensor, torch.Tensor]:
encoding, memories = self.network_body.q_net(
obs, actions, memories, sequence_length
)
output = self.value_heads(encoding)
return output, memories
def value(
self,
obs: List[List[torch.Tensor]],
memories: Optional[torch.Tensor] = None,
sequence_length: int = 1,
) -> Tuple[torch.Tensor, torch.Tensor]:
encoding, memories = self.network_body.value(
obs, memories, sequence_length
)
output = self.value_heads(encoding)
return output, memories
def baseline(
self,
self_obs: List[List[torch.Tensor]],
obs: List[List[torch.Tensor]],
actions: List[AgentAction],
memories: Optional[torch.Tensor] = None,
sequence_length: int = 1,
) -> Tuple[torch.Tensor, torch.Tensor]:
encoding, memories = self.network_body.baseline(
self_obs, obs, actions, memories, sequence_length
)
output = self.value_heads(encoding)
return output, memories
def forward(
self,
value_inputs: List[List[torch.Tensor]],
q_inputs: List[List[torch.Tensor]],
q_actions: List[AgentAction] = None,
memories: Optional[torch.Tensor] = None,
sequence_length: int = 1,
) -> Tuple[Dict[str, torch.Tensor], torch.Tensor]:
encoding, memories = self.network_body(
value_inputs, q_inputs, q_actions, memories, sequence_length
)
output = self.value_heads(encoding)
return output, memories
class Actor(abc.ABC):
@abc.abstractmethod
def update_normalization(self, buffer: AgentBuffer) -> None:

masks: Optional[torch.Tensor] = None,
memories: Optional[torch.Tensor] = None,
sequence_length: int = 1,
critic_obs: Optional[List[List[torch.Tensor]]] = None,
) -> Tuple[
AgentAction, ActionLogProbs, torch.Tensor, Dict[str, torch.Tensor], torch.Tensor
]:

masks: Optional[torch.Tensor] = None,
memories: Optional[torch.Tensor] = None,
sequence_length: int = 1,
team_obs: Optional[List[List[torch.Tensor]]] = None,
team_act: Optional[List[List[torch.Tensor]]] = None,
) -> Tuple[ActionLogProbs, torch.Tensor, Dict[str, torch.Tensor]]:
encoding, memories = self.network_body(
inputs, memories=memories, sequence_length=sequence_length

sensor_specs, network_settings, action_spec, conditional_sigma, tanh_squash
)
self.stream_names = stream_names
self.critic = ValueNetwork(stream_names, sensor_specs, network_settings)
self.critic = CentralizedValueNetwork(
stream_names, sensor_specs, network_settings, action_spec=action_spec
)
self.target = CentralizedValueNetwork(
stream_names, sensor_specs, network_settings, action_spec=action_spec
)
@property
def memory_size(self) -> int:

actor_mem = None
return actor_mem, critic_mem
def critic_pass(
def target_critic_value(
) -> Tuple[Dict[str, torch.Tensor], torch.Tensor]:
team_obs: List[List[torch.Tensor]] = None,
) -> Tuple[Dict[str, torch.Tensor], Dict[str, torch.Tensor], torch.Tensor]:
value_outputs, critic_mem_out = self.critic(
inputs, memories=critic_mem, sequence_length=sequence_length
all_obs = [inputs]
if team_obs is not None and team_obs:
all_obs.extend(team_obs)
value_outputs, _ = self.target.value(
all_obs,
memories=critic_mem,
sequence_length=sequence_length,
# if mar_value_outputs is None:
# mar_value_outputs = value_outputs
if actor_mem is not None:
# Make memories with the actor mem unchanged
memories_out = torch.cat([actor_mem, critic_mem_out], dim=-1)

def critic_value(
self,
inputs: List[torch.Tensor],
memories: Optional[torch.Tensor] = None,
sequence_length: int = 1,
team_obs: List[List[torch.Tensor]] = None,
) -> Tuple[Dict[str, torch.Tensor], Dict[str, torch.Tensor], torch.Tensor]:
actor_mem, critic_mem = self._get_actor_critic_mem(memories)
all_obs = [inputs]
if team_obs is not None and team_obs:
all_obs.extend(team_obs)
value_outputs, _ = self.critic.value(
all_obs,
memories=critic_mem,
sequence_length=sequence_length,
)
# if mar_value_outputs is None:
# mar_value_outputs = value_outputs
if actor_mem is not None:
# Make memories with the actor mem unchanged
memories_out = torch.cat([actor_mem, critic_mem_out], dim=-1)
else:
memories_out = None
return value_outputs, memories_out
def target_critic_pass(
self,
inputs: List[torch.Tensor],
actions: AgentAction,
memories: Optional[torch.Tensor] = None,
sequence_length: int = 1,
team_obs: List[List[torch.Tensor]] = None,
team_act: List[AgentAction] = None,
) -> Tuple[Dict[str, torch.Tensor], Dict[str, torch.Tensor], torch.Tensor]:
actor_mem, critic_mem = self._get_actor_critic_mem(memories)
all_obs = [inputs]
if team_obs is not None and team_obs:
all_obs.extend(team_obs)
all_acts = [actions]
if team_act is not None and team_act:
all_acts.extend(team_act)
baseline_outputs, _ = self.target.baseline(
inputs,
team_obs,
team_act,
memories=critic_mem,
sequence_length=sequence_length,
)
value_outputs, critic_mem_out = self.target.q_net(
all_obs, all_acts, memories=critic_mem, sequence_length=sequence_length
)
# if mar_value_outputs is None:
# mar_value_outputs = value_outputs
if actor_mem is not None:
# Make memories with the actor mem unchanged
memories_out = torch.cat([actor_mem, critic_mem_out], dim=-1)
else:
memories_out = None
return value_outputs, baseline_outputs, memories_out
def critic_pass(
self,
inputs: List[torch.Tensor],
actions: AgentAction,
memories: Optional[torch.Tensor] = None,
sequence_length: int = 1,
team_obs: List[List[torch.Tensor]] = None,
team_act: List[AgentAction] = None,
) -> Tuple[Dict[str, torch.Tensor], Dict[str, torch.Tensor], torch.Tensor]:
actor_mem, critic_mem = self._get_actor_critic_mem(memories)
all_obs = [inputs]
if team_obs is not None and team_obs:
all_obs.extend(team_obs)
all_acts = [actions]
if team_act is not None and team_act:
all_acts.extend(team_act)
baseline_outputs, _ = self.critic.baseline(
inputs,
team_obs,
team_act,
memories=critic_mem,
sequence_length=sequence_length,
)
q_out, critic_mem_out = self.critic.q_net(
all_obs, all_acts, memories=critic_mem, sequence_length=sequence_length
)
# if mar_value_outputs is None:
# mar_value_outputs = value_outputs
if actor_mem is not None:
# Make memories with the actor mem unchanged
memories_out = torch.cat([actor_mem, critic_mem_out], dim=-1)
else:
memories_out = None
return q_out, baseline_outputs, memories_out
def get_stats_and_value(
self,
inputs: List[torch.Tensor],

sequence_length: int = 1,
team_obs: Optional[List[List[torch.Tensor]]] = None,
team_act: Optional[List[List[torch.Tensor]]] = None,
) -> Tuple[ActionLogProbs, torch.Tensor, Dict[str, torch.Tensor]]:
actor_mem, critic_mem = self._get_actor_critic_mem(memories)
encoding, actor_mem_outs = self.network_body(

value_outputs, critic_mem_outs = self.critic(
inputs, memories=critic_mem, sequence_length=sequence_length
q_outputs, baseline_outputs, _ = self.critic_pass(
inputs,
actions,
memories=critic_mem,
sequence_length=sequence_length,
team_obs=team_obs,
team_act=team_act,
value_outputs, _ = self.critic_value(inputs, memories=critic_mem, sequence_length=sequence_length, team_obs=team_obs)
return log_probs, entropies, value_outputs
return log_probs, entropies, q_outputs, baseline_outputs, value_outputs
def get_action_stats(
self,

masks: Optional[torch.Tensor] = None,
memories: Optional[torch.Tensor] = None,
sequence_length: int = 1,
critic_obs: Optional[List[List[torch.Tensor]]] = None,
) -> Tuple[
AgentAction, ActionLogProbs, torch.Tensor, Dict[str, torch.Tensor], torch.Tensor
]:

)
action, log_probs, entropies = self.action_model(encoding, masks)
all_net_inputs = [inputs]
if critic_obs is not None:
all_net_inputs.extend(critic_obs)
inputs, memories=critic_mem, sequence_length=sequence_length
all_net_inputs, memories=critic_mem, sequence_length=sequence_length
)
if self.use_lstm:
mem_out = torch.cat([actor_mem_outs, critic_mem_outs], dim=-1)

63
config/ppo/WallJumpCollab.yaml


behaviors:
SmallWallJump:
trainer_type: ppo
hyperparameters:
batch_size: 128
buffer_size: 2048
learning_rate: 0.0003
beta: 0.005
epsilon: 0.2
lambd: 0.95
num_epoch: 3
learning_rate_schedule: linear
network_settings:
normalize: false
hidden_units: 256
num_layers: 2
vis_encode_type: simple
reward_signals:
extrinsic:
gamma: 0.99
strength: 1.0
keep_checkpoints: 5
max_steps: 15000000
time_horizon: 128
summary_freq: 20000
threaded: true
environment_parameters:
big_wall_height:
curriculum:
- name: Lesson0
completion_criteria:
measure: progress
behavior: SmallWallJump
signal_smoothing: true
min_lesson_length: 100
threshold: 0.1
value: 3
- name: Lesson1
completion_criteria:
measure: progress
behavior: SmallWallJump
signal_smoothing: true
min_lesson_length: 100
threshold: 0.3
value: 5
- name: Lesson2
completion_criteria:
measure: progress
behavior: SmallWallJump
signal_smoothing: true
min_lesson_length: 100
threshold: 0.5
value: 8
- name: Lesson3
completion_criteria:
measure: progress
behavior: SmallWallJump
signal_smoothing: true
min_lesson_length: 100
threshold: 0.7
value: 9
- name: Lesson4
value: 9

26
config/ppo/HallwayCollab.yaml


behaviors:
HallwayCollab:
trainer_type: ppo
hyperparameters:
batch_size: 128
buffer_size: 1024
learning_rate: 0.0003
beta: 0.01
epsilon: 0.2
lambd: 0.95
num_epoch: 3
learning_rate_schedule: linear
network_settings:
normalize: false
hidden_units: 128
num_layers: 2
vis_encode_type: simple
reward_signals:
extrinsic:
gamma: 0.99
strength: 1.0
keep_checkpoints: 5
max_steps: 10000000
time_horizon: 64
summary_freq: 10000
threaded: true

28
config/ppo/Zombie.yaml


behaviors:
PushBlock:
trainer_type: ppo
hyperparameters:
batch_size: 1024
buffer_size: 10240
learning_rate: 0.0003
beta: 0.01
epsilon: 0.2
lambd: 0.95
num_epoch: 3
learning_rate_schedule: constant
network_settings:
normalize: false
hidden_units: 256
num_layers: 2
vis_encode_type: simple
reward_signals:
extrinsic:
gamma: 0.99
strength: 1.0
keep_checkpoints: 5
max_steps: 20000000 #2000000
time_horizon: 64
summary_freq: 10000
threaded: true
env_settings:
num_envs: 3

3
com.unity.ml-agents/Runtime/ITeamManager.cs.meta


fileFormatVersion: 2
guid: 75810d91665e4477977eb78c9b15aeb3
timeCreated: 1610057818

14
com.unity.ml-agents/Runtime/ITeamManager.cs


using System.Collections.Generic;
using Unity.MLAgents.Sensors;
namespace Unity.MLAgents
{
public interface ITeamManager
{
string GetId();
void RegisterAgent(Agent agent);
// TODO not sure this is all the info we need, maybe pass a class/struct instead.
void OnAgentDone(Agent agent, Agent.DoneReason doneReason, List<ISensor> sensors);
}
}

143
Project/Assets/ML-Agents/Examples/SharedAssets/Scripts/CollisionCallbacks.cs


using UnityEngine;
using Random = UnityEngine.Random;
using Unity.MLAgents;
using UnityEngine.Events;
namespace Unity.MLAgentsExamples
{
/// <summary>
/// Utility class to allow target placement and collision detection with an agent
/// Add this script to the target you want the agent to touch.
/// Callbacks will be triggered any time the target is touched with a collider tagged as 'tagToDetect'
/// </summary>
public class CollisionCallbacks : MonoBehaviour
{
// [System.Serializable] public class BoolEvent : UnityEvent<bool> { }
// [SerializeField] BoolEvent boolEvent = new BoolEvent();
// public void OnBoolEvent(bool value)
// {
// Debug.Log($"OnBoolEvent {value}");
// }
[Header("Collider Tag To Detect")]
public string tagToDetect = "agent"; //collider tag to detect
// [Header("Target Placement")]
// public float spawnRadius; //The radius in which a target can be randomly spawned.
// public bool respawnIfTouched; //Should the target respawn to a different position when touched
//
// [Header("Target Fell Protection")]
// public bool respawnIfFallsOffPlatform = true; //If the target falls off the platform, reset the position.
// public float fallDistance = 5; //distance below the starting height that will trigger a respawn
//
//
// private Vector3 m_startingPos; //the starting position of the target
// private Agent m_agentTouching; //the agent currently touching the target
[System.Serializable]
// public class TriggerEvent : UnityEvent<string>
public class TriggerEvent : UnityEvent<Collider>
{
}
[Header("Trigger Callbacks")]
public TriggerEvent onTriggerEnterEvent = new TriggerEvent();
public TriggerEvent onTriggerStayEvent = new TriggerEvent();
public TriggerEvent onTriggerExitEvent = new TriggerEvent();
[System.Serializable]
public class CollisionEvent : UnityEvent<Collision, Transform>
{
}
[Header("Collision Callbacks")]
public CollisionEvent onCollisionEnterEvent = new CollisionEvent();
public CollisionEvent onCollisionStayEvent = new CollisionEvent();
public CollisionEvent onCollisionExitEvent = new CollisionEvent();
// // Start is called before the first frame update
// void OnEnable()
// {
// m_startingPos = transform.position;
// if (respawnIfTouched)
// {
// MoveTargetToRandomPosition();
// }
// }
// void Update()
// {
// if (respawnIfFallsOffPlatform)
// {
// if (transform.position.y < m_startingPos.y - fallDistance)
// {
// Debug.Log($"{transform.name} Fell Off Platform");
// MoveTargetToRandomPosition();
// }
// }
// }
// /// <summary>
// /// Moves target to a random position within specified radius.
// /// </summary>
// public void MoveTargetToRandomPosition()
// {
// var newTargetPos = m_startingPos + (Random.insideUnitSphere * spawnRadius);
// newTargetPos.y = m_startingPos.y;
// transform.position = newTargetPos;
// }
private void OnCollisionEnter(Collision col)
{
if (col.transform.CompareTag(tagToDetect))
{
onCollisionEnterEvent.Invoke(col, transform);
// if (respawnIfTouched)
// {
// MoveTargetToRandomPosition();
// }
}
}
private void OnCollisionStay(Collision col)
{
if (col.transform.CompareTag(tagToDetect))
{
onCollisionStayEvent.Invoke(col, transform);
}
}
private void OnCollisionExit(Collision col)
{
if (col.transform.CompareTag(tagToDetect))
{
onCollisionExitEvent.Invoke(col, transform);
}
}
private void OnTriggerEnter(Collider col)
{
if (col.CompareTag(tagToDetect))
{
onTriggerEnterEvent.Invoke(col);
}
}
private void OnTriggerStay(Collider col)
{
if (col.CompareTag(tagToDetect))
{
onTriggerStayEvent.Invoke(col);
}
}
private void OnTriggerExit(Collider col)
{
if (col.CompareTag(tagToDetect))
{
onTriggerExitEvent.Invoke(col);
}
}
}
}

11
Project/Assets/ML-Agents/Examples/SharedAssets/Scripts/CollisionCallbacks.cs.meta


fileFormatVersion: 2
guid: 506de7b261f374159a5cdfdb0ff48c0c
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

50
Project/Assets/ML-Agents/Examples/WallJump/Scripts/WallAreaScoring.cs


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class WallAreaScoring : MonoBehaviour
{
public GameObject[] agents;
WallJumpSettings m_WallJumpSettings;
Renderer m_GroundRenderer;
Material m_GroundMaterial;
protected IEnumerator GoalScoredSwapGroundMaterial(Material mat, float time)
{
m_GroundRenderer.material = mat;
yield return new WaitForSeconds(time); //wait for 2 sec
m_GroundRenderer.material = m_GroundMaterial;
}
public void Start()
{
m_WallJumpSettings = FindObjectOfType<WallJumpSettings>();
m_GroundRenderer = GetComponent<Renderer>();
m_GroundMaterial = m_GroundRenderer.material;
}
public void WinCondition()
{
foreach (var agent in agents)
{
WallJumpCollabAgent agentScript = agent.GetComponent<WallJumpCollabAgent>();
agentScript.SetReward(1f);
agentScript.EndEpisode();
}
StartCoroutine(
GoalScoredSwapGroundMaterial(m_WallJumpSettings.goalScoredMaterial, 1f));
}
public void LoseCondition()
{
foreach (var agent in agents)
{
WallJumpCollabAgent agentScript = agent.GetComponent<WallJumpCollabAgent>();
agentScript.SetReward(-1f);
agentScript.EndEpisode();
}
StartCoroutine(
GoalScoredSwapGroundMaterial(m_WallJumpSettings.failMaterial, .2f));
}
}

11
Project/Assets/ML-Agents/Examples/WallJump/Scripts/WallAreaScoring.cs.meta


fileFormatVersion: 2
guid: ad7213222795741f5b6ca2b332f16da9
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

11
Project/Assets/ML-Agents/Examples/WallJump/Scripts/WallJumpCollabAgent.cs.meta


fileFormatVersion: 2
guid: 2cdbc0d9a64fe4b12a3ed4b81a151117
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

67
Project/Assets/ML-Agents/Examples/WallJump/Scripts/WallJumpCollabAgent.cs


//Put this script on your blue cube.
using System.Collections;
using UnityEngine;
using Unity.MLAgents;
using Unity.Barracuda;
using Unity.MLAgents.Actuators;
using Unity.MLAgents.Sensors;
using Unity.MLAgentsExamples;
public class WallJumpCollabAgent : WallJumpAgent
{
Vector3 m_InitialPosition;
WallAreaScoring m_Scoring;
public override void Initialize()
{
m_WallJumpSettings = FindObjectOfType<WallJumpSettings>();
m_Scoring = ground.GetComponent<WallAreaScoring>();
m_Configuration = 5;
m_AgentRb = GetComponent<Rigidbody>();
// m_ShortBlockRb = shortBlock.GetComponent<Rigidbody>();
m_SpawnAreaBounds = spawnArea.GetComponent<Collider>().bounds;
m_GroundRenderer = ground.GetComponent<Renderer>();
m_GroundMaterial = m_GroundRenderer.material;
m_InitialPosition = transform.localPosition;
spawnArea.SetActive(false);
m_ResetParams = Academy.Instance.EnvironmentParameters;
}
public override void OnEpisodeBegin()
{
transform.localPosition = m_InitialPosition;
m_Configuration = 5;
m_AgentRb.velocity = default(Vector3);
}
public override void OnActionReceived(ActionBuffers actionBuffers)
{
MoveAgent(actionBuffers.DiscreteActions);
if (!Physics.Raycast(m_AgentRb.position, Vector3.down, 20))
{
m_Scoring.LoseCondition();
}
}
protected override void ConfigureAgent(int config)
{
var localScale = wall.transform.localScale;
var height = m_ResetParams.GetWithDefault("big_wall_height", 9);
localScale = new Vector3(
localScale.x,
height,
localScale.z);
wall.transform.localScale = localScale;
}
// Detect when the agent hits the goal
protected override void OnTriggerStay(Collider col)
{
if (col.gameObject.CompareTag("goal") && DoGroundCheck(true))
{
m_Scoring.WinCondition();
}
}
}

7
Project/Assets/ML-Agents/Examples/WallJump/Scenes/WallJumpCollab.unity.meta


fileFormatVersion: 2
guid: 136090e065a8f48bfb97ea3083893d8a
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

1001
Project/Assets/ML-Agents/Examples/WallJump/Scenes/WallJumpCollab.unity
文件差异内容过多而无法显示
查看文件

7
Project/Assets/ML-Agents/Examples/WallJump/Prefabs/WallJumpCollabArea.prefab.meta


fileFormatVersion: 2
guid: ff1a5743be49d43f08378dcd76451821
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

1001
Project/Assets/ML-Agents/Examples/WallJump/Prefabs/WallJumpCollabArea.prefab
文件差异内容过多而无法显示
查看文件

7
Project/Assets/ML-Agents/Examples/Hallway/Scenes/HallwayCollab.unity.meta


fileFormatVersion: 2
guid: d6d6a33ed0e18459a8d61817d600978a
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

1001
Project/Assets/ML-Agents/Examples/Hallway/Scenes/HallwayCollab.unity
文件差异内容过多而无法显示
查看文件

566
Project/Assets/ML-Agents/Examples/Hallway/TFModels/HallwayCollab.onnx


pytorch1.7:��
Q
vector_observation22Slice_0"Slice*
axes@�*
ends@i�*
starts@�
Q
vector_observation23Slice_1"Slice*
axes@�*
ends@o�*
starts@i�
4
22
2324Concat_2"Concat*
axis����������
�
24
/network_body.linear_encoder.seq_layers.0.weight
-network_body.linear_encoder.seq_layers.0.bias25Gemm_3"Gemm*
alpha�?�*
beta�?�*
transB�

2526 Sigmoid_4"Sigmoid

25
2627Mul_5"Mul
�
27
/network_body.linear_encoder.seq_layers.2.weight
-network_body.linear_encoder.seq_layers.2.bias28Gemm_6"Gemm*
alpha�?�*
beta�?�*
transB�

2829 Sigmoid_7"Sigmoid

28
2930Mul_8"Mul
K
action_masks31Slice_9"Slice*
axes@�*
ends@�*
starts@�
L
action_masks32Slice_10"Slice*
axes@�*
ends@�*
starts@�
�
30
5action_model._discrete_distribution.branches.0.weight
3action_model._discrete_distribution.branches.0.bias33Gemm_11"Gemm*
alpha�?�*
beta�?�*
transB�
134 Constant_12"Constant*
value*J���

31
3435Mul_13"Mul
136 Constant_14"Constant*
value*J�?�

35
3637Add_15"Add

33
3138Mul_16"Mul
139 Constant_17"Constant*
value*J ��L�

37
3940Mul_18"Mul

38
4041Sub_19"Sub
*
4142
Softmax_20"Softmax*
axis�
�
30
5action_model._discrete_distribution.branches.1.weight
3action_model._discrete_distribution.branches.1.bias43Gemm_21"Gemm*
alpha�?�*
beta�?�*
transB�
144 Constant_22"Constant*
value*J���

32
4445Mul_23"Mul
146 Constant_24"Constant*
value*J�?�

45
4647Add_25"Add

43
3248Mul_26"Mul
149 Constant_27"Constant*
value*J ��L�

47
4950Mul_28"Mul

48
5051Sub_29"Sub
*
5152
Softmax_30"Softmax*
axis�
153 Constant_31"Constant*
value*J���3�

42
5354Add_32"Add

5455Log_33"Log
156 Constant_34"Constant*
value*J���3�

52
5657Add_35"Add

5758Log_36"Log
:
55
58discrete_actions Concat_37"Concat*
axis�
0
55
58action Concat_38"Concat*
axis�
< memory_size Constant_39"Constant*
value*
J�torch-jit-export*OB3action_model._discrete_distribution.branches.0.biasJ��� ��;ۺ���#�;�U<*��B5action_model._discrete_distribution.branches.0.weightJ�`�����=�}{<�'0���_];�{�:��*�����鼦G <>�ջ���� �ܗ��P��C�_<Yj����ֺǟ����;��w���ʼr�O��y�<���e��;��케X�<Bhļ8d�;�+<����滯����d���V�ê�<Vp��s ����;�^6�"X�|��G;D<��4�����kB�;�5k���$=����
e<�V��<�D;<�[^;d=*��r����m<13�]m߼}5[�v������� ��֝<��ϼ�Jռ��<�]�����<����C)�eж��R�n��3G<̲X�Lz׼$uǻ���<�5n��;λ5�;����q��T��������94׼&�����t!�<Y��==F���;B>���6���x��{�:��뺁S���%�뼛�=�,�<�༘�ۼ&��$����v�;@�:��D<:c��ŗ��?Ĝ<� ���� �::AԼW_*���6�>��o��:V�߼��������<�%�hD����=<+-�=�ۄ��G=ͣ<| =��=��= �����v�<� �=���==Ͻ�Wy�݆ʼ�׻��=UbI=���=`)�<�Ѡ��5���{�<�҉=��J=��(�I�E=�of���=OK=��q;��p���g�t��=��?=�8o��K�<[k�;fs �RT��]�׉c<s���R��]����=����> =����y1 ���м�`D=��
=vU��A(=AQ�=ԚJ= ���!��� >h�ἐlۼEॽ�a)=ڒ�����<wؘ=����f�p0�<��5=� h��Ț�K�������� =|�<�!�=�
&�~6�=mO����j<|Tg�#f|=��(�4�=�.�#<�7[>���D�<#낽:�����˼ӭ<qq��}�����=����+Դ�6:��i7�f$5=(P;�S< �K�{�=�w���h�W]����=_jg�%y=�V=L+<���<�Ӏ=�������<z=迼=+�=�<�k�����=�R��d˃�MRu��y�T��<����k�;<罻���<^ͼg2<�q���:t�;����&�<{��<C2?�����m��^�Sc��*���H��������<2�U���k��R�'\3<Q�H=B;��伓�H��b<U��P���`��,�<�)
�if��o"�<��Ҽr3�:��ֻ��f<���:���=<?�=�R���9�;p*�<]Y.���������4d�3r�G������۬���`��\�0<����>=#��;= �|<��K�X�Ir4�sd¼�*<��'c=�)�<G<7��<�>���o=�,���=jo'�po�<#��^v< ��;;��<�
6��`e�l�<oJ�?��<%��<c���pIo=g���>���m�<���;������<�/�eG+�D�J=d
<�.{<�z¼�ؼ���`�<~��<$'����^� ���;�5�������̼���<rT`�D�|;r\<R2��@A$���>��0ͻځ���1�,��;�B=�F<��
�;��=�#���굼��;ת=z|`= �=��»�U����F=�ʊ��m�=�$�<C�H�2�p���M=��qC��}���i��Bک<֣?�DH<�S���r6���o�H��=v�׽^����(m�B
�=�Pټꧽ�^�{��=���1�[=O��=�+�=�O�=��e<'(6�2��;����m�<j��=H��<Yf�=���=�i^=J=� ω���9:��l�<�d�=�-�=Jwr��K����=Xy����}=����A�=(�p=�"��J꒽���<����HЍ��҄=r�>��=���=���=M�=�M���=(���8s=�;��=E�����=)���2Ľ�]e=T�
��|=G��=}���C�<�<�=�懽�\ >�%=X ��gAN=�}��]��Ǡa=�?<��S<��<)'f<}�x<r�'=s ==�ɺ�@l��0X�#���ׄ4��W���á=ө�����=��n<r�N=�S0����_=����r,�$w�=߹�; �_��j��ܛ��7�^=[�-<d���A{ǽI8��[�P�][�=V=�<�Ґ�)�A��~���/�V@>=�ʪ=< �,3o=��:����,�=Be�=��׼-V��>H=��)= � ��H�#z�;�U<ӌ=c���QҦ=��*�p�h=`i*�Q�=�փ<?+���ݎ��Ô<%�<t�4=*Uq=`,�=ߢ������nR��t�<96�<{���U@�:i0"=��=���=� `�*ڽ����i�q=�Ƽ��Q�;o�=�!��C6=����A������`X�=�H=��=2D�=6:���u�d���YF̼�,��)VŽ�!ǽHI1�`Nz�z�I��~:=f��z��n�"�e>:���=v���ܑ�
��􎔽|%�=8�=[ap���x=��|��� =TZ���̠�ͱ�=��=��8�J|��?�]�<))k="T��0o��/���q�=$=N�=��C=�E�=�f=���T=Uj>�� ���ཐ&��� μsb����==rk��J��*CB3action_model._discrete_distribution.branches.1.biasJЕ?�Е?<*��B5action_model._discrete_distribution.branches.1.weightJ����f�<�m����;øP<��<��;�x����;�#����<��<1�� �軝
���Ԗ<�4<�� ��( ����;�V��"}{<j�~��ze���A=s���,<C ��G"=��?�mu<Q~�<NU�<a���\�� (?<���;��޹Q?;��ڼ��/<Y7N;��~��|�����<bE�;4E��$D���D��ɰ<�6��j�����;�������!�;o*<=��������3k�<䍖;ӑ;��v<{����~<������#;F�������":��+5;�/&��<� <W�x<�^Y<Y��FOm<�J�<�� �~�=�ą��nѻWoϹ6xl:%�<��<�꼻=��<+��<�Z����_<1����0&߼L�G��_��(�l��Q�<<1'���!��+�����<�oǼ\�;ל�;�!�f_�����;Vx<��;�L�:9)�<%Z�;�&��Ѡ<D�r;D[漨�F<���#~�<�r�;��$<?���Mژ�-*���.�;[�?��;���<���5)�T`Ѽ]�<Jd< ��;e�ü������W<m��;&2+�K����,�8��`ѱ� X�;�\߻Ӱ�;[�;�J�<�<���*�9s7�� ������L�s��A�ټ/AѼ���<���;���˷�L��P�;�ܫ<��Z�<O��:$<�.W;����z�<����e�A�;��� R��c6z<��X<�����"; �!<)/�0>1<������x<��<�/���޻j�:�+����;�懼�z/=_<Z�<p+Լ��]<������$>�:����a��+�<�B�;,���Q�W�@<f��0��;�X��҄���w�򻥼ɯ�� �<����kn��^X��{��E�<�==�^�<@x�<v��9r����P����U<�5�<Rސ<G��� =�ja;b ���.<�O�<� ;������U�;���8򰼘6 =�k��i���y�<[?���;8J��]j����`�<���<U�<*Baction_output_shapeJ�@*(Bdiscrete_action_output_shapeJ�@*!Bis_continuous_controlJ*��B-network_body.linear_encoder.seq_layers.0.biasJ�B�#=ŌE=��<�$c=�U=g�1<��V=C�=��9=h�=Űn��N <C� =�r=B.K=g袺~G)=t–<�!�;_z%;T < �Y��G=���<��*�cf;���<�S:<�["=�Z�<�N�<��$=`��<ɷ�<; �<�#t<���;�k�� %#=!A=��H<^b�<l�ݻ�=�a%<�R�<��<�����3=(�<R@�Y�*<ɨ1<tDH;e[�< �< >�<�'�<��=�'�;�hM<��&=��Z<I��<ٳ� �=��;� #=�&�<� �<�����x�k�>=��<=�>�<�~Q<.�<���:Nj�<�j<� �<>��<���<c�=oC=�˻��=E\�@2.<��;97=�&J��W1<PÕ<���;��<_j�;+!=U��<��<�8�<>�=���<7�<1<Z2+<��C<|�=<�}}<�6���m�<��};#��<9��<l ;�=��;i�=��q<9�$<�&=���<O�H<G�=&�p<�_=>�;=���;*���oB/network_body.linear_encoder.seq_layers.0.weightJ��s5>�J)�I��@G&=c��=1��=�] �Y��=�����5;�3/���A=�����h�<H�=���#tܼ��,�S�]�����ٮ<IM<�ݜ=E��_L�<�ཽ�y���?>Kis�\h7<������T>q�����=��}<�yg>B��<��=.�dž��W#����= &�=� �<��̽=8��9c�<R�T>�y�=�\h>��[���p�P��=�(H>X�,>�ܑ=�=�M4>� >��;T��� ��> �J�x��=dX>I�����=<� >�����=_0�>�2m�{f�@
P�I��đ���o=.�;;?#=��?����=�.�=��.= ��<�(�<с/�gOļ#* ��e�=���ĺY=����mtE>��]=A��=%�e==��<}ξ��Ž��C>�M>��ȼ�ɽx��� 4>H6&>��r��2>��ʼ��h�<�f>1��;>�AF>~cͼ-8,>�����<'@S�(��!��<�<=@�ۼ��=�hN<Cԗ�Wx㼭�;=�A=���= ˍ����>�*�=�8P�t��F�=�s����=�ގ�F���C��<W�(=�k�=2��z�>ʁ�<�
/���4=�y>�*�T���4w=��>Pd�g�W��-���!��B�">��=�k۽�Q�=(�l��6�=������=��ݽ-�(>�†����=k*��������нj�b�D!�'Ƨ���=%�%�l񘽮�/>o㜼YS��q#=�F�=&c<��\=���0`�=6�>B�#�SX<>ؽ�s��0/>�zV=�Ǒ�WJ�=���=+�R=��=yuʽ���={S�>L,��$[4�jy;�+�5����>��1���5>D��:�\�<CBZ=����R��)����8>w���q��?k�=����l ��!e��n�0A=h{�N�>5I=��[=�
�8/�=@�w=]VY=[Q;Oo�=r>n=0���$�='Љ�Jp��e�߽��˼�q�<���Ch>#��/>�jL<�2׽�����0>sC�=�?�=�̽KK�<�� �A5>�����E>@�;a��;e��<j�=�6�<���=�`V=_��*%�<�ټ=�=��%=��}=��l>�;d= �E��=��&�ས8>0��=2� �����t�]=� ��������=������>�v���\y=�>��Y>��/��<h=L� ��3�;�x=:MC=ޥF>k ����d>����� �Ѥ{<��=��H� �+��o:>���=ޝ���{��
�<;�R>����cV>�
�=�vV=�2z<�Wi��?��">�0���e>=� ��@�=_��<t�We �ݑ�=F5��i��[' >:�G����<;F>����=˯e<#�!�ʊ,N�"r�>�ev��'�=� ����8١<T��=���>�����[=5�|����=��=+-��T �΢V��?�=��b�.p<wm>�|W>F�6=M�L�c>���:���=R���?/f>DE�=m�E����=�L=��=gظ����=������L>0D�=�q[��{��'>�%^>xX����@=w)�f�]�($>�=ֽr;�=D���n>2}=˒�����=��P<�nV>@2�(�W����<��4� J<��ľS@�=���;�Ӈ>�I>���<��=B�&�7�F>
�����6�=�_������N8�=� �>�ԗ=����\�>H�;=�Z���h�=V>������6��=%�<���>)��=6X�ge�=�7��Z��=�<=���=0XE��"�_�
�����_I��w~+;���N��>w��*/���/�&�� �=�$>���=�f*������n\���Ͻ�Y'>D�9>��>/�������wb�=lW�= lj��y�< %+>?eA=��>Դ=�0M�~��<��->;^ջ4�����2�q9w�>�g���c��OR�'�>�Gӽ��=���=m���8 �b���`>�f:�g�!=j,Q���;;Q3=��>
��`^�`́<e�>ޕ�<�<�PK��P�< p�=��; �����(�J����=̭�'�=8��<�9住0����>�����s�铂��!�=�t�=9��=&~˽�(���0>����?�6< ��=�$����/��=b�������4n= lY������W>t "�J(�=�F�=>7Q�Ā=Hot��R��?(>KD�=��=6���!���7�>+<���yR�5�<t�=��E>Q�i=�i�;}���1�y=�ɘ�H�=��=ʈ�<��O>���Zz�=JW�M��q�P>sٝ=��;��B=S!b>�_(�Y�Z= G�=8�]=�Qa�q ���H<}�ڼ��K=l��=�N�=�`m;���=t��=���� �@=�;�=KQ��u/���9>-֍>���=�����&G=#Ҡ�f(�~}O<���=�8�����;h>����:5H�<>�=������I�������覽���:���r�=>��=��*>����>l�>���=I�8=��Z�bw����V�k�����X������<4菽T�X�Y��=���= ��;��𽗳�=e��Ĥw=�䅽h'��1��<�;��h`+��4��� J��N����=����A��<���=�=$cq9rkże�:>#�E=�D>�Є=���<��;=�ٮ<Ͼ����'=� �=w�9����=�}�<ĭf=�U>�-1��~�=���="�������ż��.>X�׽;2_��É;�7�;ߍ�=���<�v�<�=rΚ<x
�=�Q�=Ԍ��my=��A<�蛽OI�;tni=ˉR>�թ�<��<ϖ�<d��0[˻-�[=�}����м�D6>��G�7�S=�b�<�����I��=VJ>�q�=��l�α>{c�������=C�$��%���>j�d���˼�^=R�q=;3=��k���<�fK=��ڽG�&=���:߭����=8�轡��=S��=�I���F�=`��>T�>�G;��ZY;>��=U ѽE����[>a ��6T=�y@��0���M;&73>Z֏=�'� ���9ގ=_r^>7J�]d�=?yt>�?>>O��>F;�H_)��C�;x��r�Ǽ/��=?��<p�=�!ǻ�� �q��<��=� >�4=��;Kec=�bq>.b>:���?���6E=��P<O�I=�������=��^=9�=p暽���=��>�#��>>�� �{>Ws\�Ok�������=�?= �>Ҥo<<�=�-�<��=YlȽ��U=�>D�'�>@�>��ӽ�����[>?������W���\J���E�h�m=昝=�J�<��a<h�l�5��=A�n=MD�pn�="���0'Ӽ�)I=��?={P�=q�Ƚ>�+=>�=r\�=E&>;>s�S>�k�=�V�,���V8���W>�߽��; R�>�F2�$:=6���L����"t�MЊ�o� ��i">�r�<��=�ok���X>���=��O>WH ��W��厼�L�=܇���l�=�Q�R{)>j{��V�z����'8�=��O�� �=WV9>��(= ]J�_==>�zE=i,�=���=��~��>�V0>���=ړU�D%>d-f���>^�����;�Hl��ߚ<����s�A;F�Ǽ����`Z�@�b��B<�Z����=��G;)w>N����>>���� Y��[X����=z��=d^�<�wB>K�=ph� =轋��8��=. z==T����=�v�=�́>S 6=��W���z���f=�G��$F�Z1�=�� =$y�<��%�)�ν�ȍ>�د���=�d=������=�� >�غ��� ����>z�����W��:=���<���=yW/�[�d�ƒR���F����Fƒ�Q4�= 2=�B>���=�ʳ�`�=n> ���b3:>a�d����=€!>��"������J<bF<�ţ=|B���fҽ�<�*�=��]�J.�=]E�=Ґ �E,<�u^���M�?�=��7���e��� ���#=n����e��>D��=��;a,�=���r0�<��=Y䣽H���ӏ=��==p^�]礽Ko/>��ĽO�=1�>Gg���$��|�<���=Z� >7<׎<� �����=�6s�� �<�H��D'�<Ӯ�=�<�r���pZv=7Ĝ=�����1���:� =۱�����="߆=�C�<y����e�=����W�y<�p���b.>]�нC�&>޴z=lk����=�1>^��>Z�p���'���=��:=1~߽ԁ��]� >��4=Ɋ��qFa>�Ž�����Y� ��:�e� ����=��鼀�"����~x޼�}ڽҸ�=ڹ'>�+= �ӽj.���R�=�Z˽TW�{@e=y�|V$���=��>�c��o^����=r�G���2AV��W=G���ǰ<)�Q>�Ҧ=�^�=M�'>t����N=򶩸$�3>��q���=3ei�x�-�1 >�A�<su併 ;=mUٽ���<4�:�e��:(�<>׿ڼ�`9��~����v�,�:,��1ҽbC��2P�������=i���m"�x >�a�9��x���N5�)X�<%>n�<�'�ny��N>��=Z%���Ƚ�>�S=����%29=���=K�2�f{�Ƽ�=s)�=)�
��̑��.�=+ =y8p�n-#>�d������$ʠ={ >fi>�.=����$�S=~I)���սp��=��-��"������E�B�#@t=V��}F��>}杼�����<��w���m� �<B��=u�ݻ�#;Δ'=M���*¼N�=���<H��O'�=����y� ��>��-%�=��:���`����=�H*�ײ�<����Q22=�p����=�i���7_�J�i�8Zi=���1̽}b��_��=�妼o�2>t��<P�f=2�û.를��c<��4�V%���>Z�Z>-�<��%=�V��u(D>�+�<[��[6�]�\�� *�,�y=Ѡ�F����T�k�&��ʥ=�����=��<�>v�X�8�<�2H��0�q�=�޺=:z-�'����=pn�=�+�=�\8�/�p=x�ȼq�����=v��=M ���&>���<kn�=ac:��`$=�D=š黎u>ܺ#�(���� >��> Qм"g��}��< �H�x�i=xn.�\�=�L�C����>��@ܽЃ���޽�hy=#^b=�NN=��l=9>��l��a޻�)=��]=���<��ٽ�`=> �=��Ľ��>L��<'�½�����jv=|(Q��c>:���)>�.��`���E�<kϸ=�q��L,�󏙽���=���{ə=�$Ͻ��9�4��� M=k�=��<f*��3@��4>�O)��1r��`�<7�=r���� >ن�<*&=�=4pY>�9@�J����>���n鼟��=�=j�<j��''=/��`[��γ'>�@���X>�)�԰�=BH�<y,��4q=V >:fg�M���F�>G�<s7=�5����=�~����������ID=���<Si(>�Y>���M_.>z�>.|���>x���t =��ĽϜO���t�
}=�>#>$>���|�=��3>||�=��{�ь�<HP���݀<6���轎>;=N5���������=�G=��=C⧾n�>��|=!�.>���=n/����=I�5> ����m��q���g<��C�Y��=ݑy�Gq,=�lν8S����=>2ơ� �=�÷= �ڽgi�ˎ�=�짽1kh=�O2>�z��-�< ��=�=�Q�>�e�==�q�m۽�s����8����<�r���,=f�޽1@ >S���Ƙ�<rf=l#����=�Y7��(�ಧ=� /=�Y=�O=}�q<�[�9w��=�K�=^6$�IY,= �<ɟ&>�`���3ܽ�������=�}r=�0=��ѽ������ս^' >�:= ��;�쇽�ǽǕԽ��=V��<�vL>��:k��=P"f>��� L=��?= �=o*�=F�E��O���>̟����%>�#��by3>�<�=��>Cݸ�a���od���F��\�����>A�=��X>D�=�]����0�e R�A�仩�K�X�(�cS=-S��]G�=X�ս��]� �>DVͽ�[���ּ#g9��qR>ھ?>o������<.� ����%=Dݻ=z�J�V�8>s:�������=�Zm����=�$�=�Zľy����#�c�=U9�=S��=��=_p9<�{D;d ��ν�I��t�=/Kr>c6�=y��=���=ɡ��:�%��<[�>>���<�o���R$��=P��jݪ;V�U>�9
����<�Xp���U=U��
}����琐=BO�=�+�:$K�<�V>�ܼ��}>?�<b$�<��3=�O=��ͼ%Џ;[��=�h�o_c�����CgI=� ׽7��=��=��=�%<�1�=@�=o=
��;�ݔ>/�G=ɛ�"&>�m]�3w?<�5>��p��5<\�|=���=H�>�ͳ�
�F�2�)>|�>4��=��E<��'>N�ڽv��=g)>�l[=��F<�8"���#=!�>DY�=�� =>��=W��;� μ�8�<�����н� �=����-i'�n����N � �>��;��D��Iǻd�<>3og�+"]=�늽vY�b��=K� <��G=��&�νv��=�h����>��<ˑ�=�v9��RM>�i��K�ȼ���<�3A��Bt��a�T|�88_���ܼf*�=�ځ��/:���;B1ܽn��=A�*�� �<����o
F<�P���]=OY�=cC>!+8�������2>���<��߼��U�������6��Pۼ�Լ/=�g���=yf��O��<G(�=
�{=��T;��)�ZD5�a����M=o=���=3\Ͻ����\z��x��9
2:>ʨ@=h��<R��=P޽���4��>�(�/�f�If�=/�n��½Z���������t ���e8�i�E=��̽f����v���%=�d>��<z>.����T��k�ֽ[���&�>Q��6�ý�>܃�<�{<7�Z<��e=RS=���<�|<>w�=��>1,������h�=q,��6�w���=B���~�>Β�.�7��̄�^����Ī���뽎<E��L5��y�=.����=�_պJ^6<!>��b<ܕ�=S�O����=g�Q>���PvѽO�=`��u�>Ub�=�H_=��<UW�9g�꽳@>Z�>:��y\>��7$U�(:=)�<X�=uN�=��=lOa��8=���=��{Z��Wi�>s�=�r�����6�<w��=�Ў=�Y�=~Fu�L��3���H<)�����X��!�I�y=Αu=�����
>sy> 2�=��a>ٖ=Q�:?a=s���gi=x��<����9�=-F��>b��==����ɼd��=����q�V��`��=��=���>��<X1�;�Y��ܽ� �=t��<�y�id��e��cr��hp�9��!�C��<�����'�Sv�~=�1�A��=;n�=If�^{F=��=�i =g��``=Ͷ��~t�<���u�����b���(��l\ >�xG�����
]��u��3���H󶼬&>.�=���=����\��=�l=cG>?V>���R�>�;Ľ�H=�P<Mc�=���)� >a��9;���+v=XCO�}��%��=θ�:\r�=�X�<�=�F=�e�=t���=䓽�V~=gм��> ,�=�:�������<���<���=�ŽK��:A߽YJt=[�~���=h��=��d>��>8י�4�<=�0��V��u�=��=@�����=�jнQ'�<�yy>��=a��=��w>j��w>
=J�����ӽ��J�υ�=���=W9Y����;?+"=��>�=����>y<�=��=�g=~��=$w�0�==%��<肝>
�=��ֽͰ���ҽ����#��=籤��C�=����t,]<@m>En�H�S>g%�;��#�(�d�q�O�l����],<U�A=�!��x��<�a@>�=,=��?=�S=�Fl=ca3�b�.��%���86�.�D>Zwc�-bL=��<��R�gx߽G�<�໼��;�i����~>`����L='>�bԼRR�=7Ȩ��l�=�b�
�%����Lv����=|�м�M2>�Ei��z���H>Po��fP4>�f���R>JJ��} h>�����y�k�=��<�o,>6ڴ<�c�=��,>?E�D�ƽ7M��K��=
o���v�;S5�=��0�v>�=�->�c���� >��e_���=d�=�<���c��W��� �:aϽF <��=�8K���=�o���YP���>gZ��j�=\��=����)3�Ie#��L=����J�y�Խ{"�=�]�<8^���?=i<��� ���/�=�Q ��=j���B<������:>���=��=i<��j��=q��=#�޼���%v�=kq���.�z1x�+zg=��=��,���ؼ#B���)���7Q>o,�=Hʕ=r�z=��<���=q�̻�|=r�����y@=�]�=�j%��c7����=U���=i��=��5����Q��">���=� ��T��=\<�I�"�~/��K[ϽR.��=Ͻ������<� ���]-��і�{���� >���=����/��<kp��E�K�����N �1d׽\�� +>�ܻ����=�A�x&������Mм����p�iT����{����=0g����=+�׼:�=񟽌Fs=vc�;��=���{+F=�9E>�g=g@�鬿=�<>����=x��Q�<zl>��=u5�����=�;=_;c�s�%�� �(e�������L���>{8>�\�����
)e:�׌�Z��=%��=f �;��⽺�
=�z����
=�޽�����5�=w¥�& ���V�Nm���*>%��=gE5=#M�;�i>�½H>Z ����� ���t0�>�>F-r<q�=�g�=5iA�4���
ؙ�a�>�i)��ϽE��<���%N��5>c('<�X<� $=���=G�����=�o
=�����'� )> ���.�V��=L ��`�)�VV뽔FT>�h�uUX�Z��<�� =��#=(ѵ=Q���s�l��/S<�w�֘����,>� =`Լ�W�>�r���8�����=��*=��*�;>N)�|��;ȅ�=*L��fh�����t�^>�D�=��������>N=ZP�<k|�=ּ�=�:=�<>�yZ��$�;ɤ뽤��=Pˊ=�-t;y 7�Mb�<�l����>4P�Wtw�e����W���S�=}���Z�����r�=%������=P��<5ۭ<A�̼�Yh>(�< �%�E�]=�$@=x;�=Mi���=g�0=�a�=%� �e�V����=� g�ۺ<pJ�qi�=��߹_>G��=0�6>��e����<NH��.�P<y�=<��՟�=�ҝ��%����g<�w1=��=aUϽ�!��I ��O�U��;������=uM�=�>,_<���=���=��h��c��n���̒�����$
��Y�=�l�u\q<��x=o�><��?
�=]�=RyP�MG�=�t��2����=5�e>��=Z��bA(=�YH� �2>�ʘ=sн�;$��d�=�d��+c}� �~>rZ��X^g�вR��!>�8˽ ;>?
���^=� ;�S<<Ӊ��ϼ���=����W��=��<q���.]>*=���=3 �ΰ켦�~=dr�*�>R:�<�� =�Y��n@>q�%���m�ӊ�;7A�<r=�d(�Rr>f���ͼ���= �=P7>�O8�|�;e����*��a x��/ӽ^_/=$�����Լ0t>��r���=��;��a=9(��M�*��~��JK���z���<G�I=
�>��0�}��=.�����>���V*=,��T3�=M@O=�}>�>�t =.�D>�松 -���8ý�)����н��=e���}�=�0�?��>\y���ކ�x��=���=�s��_���*<������`��->Vq�� �<9�=��z�;�cݻw���[> >�,w>sa�=��H��>�P�=~.����=O�=��]�&Bb=�g><���,6��^�<>%4O���=4��=|6 >�x >���=���;��o>�=�R_����=oZ���ݤ=��V�_J�K>��=\֜�� =n��=b���պ�=��H�>=�Ҝ<G>�V��7.���J;��:���S>�½ՠ==-�6�[ >%"�=1�佦h->��I=~^׽ux=`�=��>���=���k.�=��?9�<�`��Zj&>o���(��=J@D�k��<��W=���>Lx�=]��=e˜�Ң+�u�罫��=8�>��N�ܷA�O$�w�F�H��=rc=���=y��=�)e����=��<P �
�����b>J ��=�{��͌��H=�� � M�a&>PLj�*5��Q]��������=�w���z�LJ�=������>������u=���>�ܽ��=i�ʽ�햽pW>����X|���R=��<�ϗ=f�=U���Z[�=a��ӓ��������=�` = "%>��<�����> ��^'>�(>)��=[6��\bW=�$�:��%���9> ���!>*��=�a�@<H=��h<����%��,h�;Is<�ф=�`��w��=F��<�[�?���i˽�d2���X>s�y=��->j]�=]��=Ԅ�b��=X��=X븺[<��Ĭ��L.�k�=�q5�Q��=�����sx�f<��cK�=`xK�y��<j�.</X/� c���Hּ�Z�=Ǣ���y�� >R�����2����;�k�:����r�h���>�.�=�J�=t���[��_������<��I=��=��Ͻ�h���)�MW4>%e ����<c�0��j����(>UE��͠'�p��;�l�J��=Ǎ���?�:�>D�+�� �;#\q=���=��[>�z=�%>b6 > �n�����*��g�Q=���=�]w�r�(��>-,=� �=\�����=���=�9�=ͼ��ҥ����R�R<���=�;�=��߽�������<-�`��>2$�=����}��=1�>1�C�%I���ͼ�w�0�e�����f�=�{A��
���]
�B�&>J&ƾ��`=8^�=�===��9�X!=�铺n�(<�ۉ�m�^��=
��_D[������mq<�y���ѿ=�!�S��=��Ӽ�t>>��� ���&&>�Q/ ;+�ռʞH�F$�=G�7>B'�<�F�= �; <�����!��>�s��&_=R�<�⫼�>e̮=Ŷ�<�mm=ct=(��=��(�� �<�@�Ae���䎽Z�>E< V�;A}���>pj=��#�)�����o��Y
�s�}�����>�=��=�����zw>�ܼ�T$>oʔ�#�=n��<����4>��=�7>�0+>h\?>��w=�ڽ�� >�2��؎|=���Rzнv)���9�S|=�����1`�D3D>&!���� =�Q=���<�OD>S�:�\!'=^�>&��<M�D=ƚ�����=�i�=�
�=2���'���v;�Ȇ=�e�<��0=I��t5h� ֽ��ü&��n�=L�=�'Խ����9)=�� ��䯽��e=���=q|#>Z�F=� u�"vֽR��<��<#�ӽ��>�I�=�i=�Z>� �=��\����=�z�=K�[���ֽ��<��<<�S:�M��<t��=s��C�I=ƒ��X�=�D1� �=�=<�K= �Խ;1.>؍��~�>Xe��|r�=�E�<������=:=�n������ia=���<���:=mE��Sq=r��;k>�4�=1BM�y�b��=��3�I�M�z�ʽ[��=� �<� �;y��=/��=��¼)�r>e�߽�&�<�,k�m�V���Y��[�<�@���=�����
>���~m�=���=�yּ�\�=����ᆽP�=�>���=�s=�c���:>���<j@�>p}�=j�Ƽ�sO�/�� a�=1��t_�������Z>��#>�>+�+>�ۗ������=2�>��h���~= ̈��< >����X<�@�=����p*��:�<�>���=X�Y�s��='@�>d7����>e>� �n$O>k��> �=Np=��U���<D�=X}Ž��l�okQ��<">���<x��=��e=���=��>���*�G������U��0���=MѼ{� =�W��^.�=3�=j�=�������+=5��;S~>�[ͼ놾=K>��>���<g�@<Ӡ�=BO�����=; �����{Ҽ�Z����=���=�2�>裏�����|g8�өw=+0�uc�|��=aNX=���� yr>�<�;��=,%���ji������H��HH�5:$���4=&�}��=X�����=���������=�f�=v����=%ܛ=�1I�� ��9f���*u>���<n��>m�=A��fU$��ļ�̻�<�)=p�M><�J=%#���6��4�ǽ Lj���)�奊> o��Xd�;�] �V>������[{�=�I��b̽2�>�<#����֦�DDx>m�>=
z<0(E�ʄ�<&T�<�D(=��Ͻ�S�=i|\���:���w=VD�OŢ=���=��ټ����5�漢�>#�=���=��-� =�oS=_ >�c="�=Ƕ�=T][>T�(=Q�8Ƽ��<P ��L�=�8�>��=���X�\���漙5�=�*��,���\=>^�m@>L0E>� -����=C��>Ї�;�d�[q���f<g$@� �>u\����>UTҼx�`�6�=��=���]:�ލ.>��J�t����>��Ҽu�v=d�>��T�,`�=���> z�=rE������O�4�s<^�_.p;���ýL�n55<���=��;���P;�(�O�=��y<��-;Z��<H��<�$:>�H�����
���6u<%D�[��=�=���.(��}�W>]ԅ�.��<QAV��9��@�9��42>�>G�L��Nڽ��%���6�Jք;�����=V��F�@�}����iO=bV������c_=�tI��ƣ=��tdh<B/�<����\����:=r���.��0f�=g�d=|`>e[=贍;�9f�D/k� ����$�=���=��=�@V�n�6=�H�=���>� >�e�3�=i�R>J���漯p;=�R��$Ž�I���'T���X=�1b�Kc_>M��;� 1��!>u,�>ASF�)�ļ�-Ƚ�C>Z) >;�&=�\ ��~���ϽWԈ���'��*�=�F=���>(�=�c{���,���lx=ӂ���9�=�����4 =�� >��< ަ������=>�i>�?\=�S�=���< b=�LW=�I5�s���!x�^�=>|潧j�[���]O�.�<K �=����揟<���<� �a &� �˺8���������<,C�HD�=Q��=�,���=�p�<�=<;=j�wR�=�?=���=�L7>��!�p~�m>��\>q4Y�������<̈́����<���z���>�����<�w�7�8إ��3 ��>J� ��5��+��=�c{�?����ݽls��`��= ���=�.>��<�q�e�w�K���T�3�H�D=�_P=��|�������>[N�<t�=���!
�=���=6T�=S�;l�Y=_,?>�Ž��;�j =�8߼���&�I����=�9#>��[>�u>�R�>TT+=o3��U��l�<e����(�;�k����޽����)᥽*��=����s\�=hJ�>��#>,}�>^k�,�ں�K2=�Y,>��=��f�p���Z[>ƅ�-�.<+��=W��<=���=D ���׳�(M�X�Խ���=��;��=F�<Q9P�u%����=E��>�����"=�ܼ�5J=š>P5�<U��=�5�b�E>驷=yn<\��=�—� �=�RνoT>��_�=\��?�=6��=��T>_�W=�g���� I>v����=����*>��^��^|<�4>'Ӣ=�`=?\?�~ƽ7�="�= T�}8����C_!>���= �T�1��= s<っ�e?�=w
Ӽlp��)���(6w�)���o^C��U=���u�)>9`�s���AԽ�+>(R9�b�½�Y�='1���0�>K(>
����}�=�1>�o�=�\>z�Ժ�<��0w=�JR��Zǽr9��#+�<.���\��=mL�ߦ�[��'4>�!�=�Џ�U�|���Z=w o��n���nv����=����u�=�)=#%޽��𻨏T>.��<����_��=@t��R��K��c�b>�9�=ٌ�=~qE>w�����;��;A>�V= �_�>�L>�^���,���@�6Ի ������=�^�=���=�R����`�:o��U-��p��}�Lo$>!�>��>����g�=�*�=pE�<qD.�4����L=��&=}�v��O=�_�&�!����#;>h�u=�T�^�>t\0��1=�!���t�=su>>��;��Լ���=@��1��=�P�=�h=��!=�M�;��#�5����gI���id���}�����a�8�.���m�j����’�
�=+�\=^�o=���>=�S>5q����z�<���=nV�I�?>�.W��E��j>7֫��\������8���D�>�䗼ԗ<�e3��^�<l�j�Q�ս'E�i�����;=�^�=,�*>�=��I<0�S=��ֽI��=���=�A'��c/;D�n>Y�>)���.�k=MA�=��<�&��Ր=J�۽� >sD>������&<��)���.�qv�=x:,���=D�;���θ�Y[Z=�>��-=�\>T,��tͽ�� ����=��s�T��;]�0=K�T=��9���>eRڽg�=�Nj� XB>c/�=-��:y����/��<����g�i=����'=��<���=�]���m�lW,����=BF��\<=�� �&LA��Cr�514>F�P�q�CU&=��b�c�^>�ǎ��b��KVb�)�>��(=���=�<.�=OV�����v/=�X�=gg)<^.�=Ŧ����<��=!�j<a|�>Q��< �=:&*>p��+���E2>}�=�ӌ��ֽ�5<��ս�[=e� > =ݬ9��EG�I|=�3y=.�л��=��>�* �,ɼ���~#��ܧ ����<��=^�%��B^=�\�e�j�=��9�La��Q��OC�<�a�=�7$:>.<�ü=���<8S�����<9���?4�����t��=M5��9F=H[� >�8;i9�<��=�vH��i���V=�Z�� �=~-�=+������:E�V��,�=1R�=81��/Pͻr2�2(��Ee=x���
����ʽ �D<���>͗�=%}B�I�.> >o٦�rp<~����G>� ��->$}�;���Z�<�a�V��=�.t�n+/����Zj=w����`!>��=}}��J:=�T�<���=&����q?:<�I�#놽��^=� c�*k{�Cح=FU ���>���<6国.��=a�%�7|>-�5=���� ��]=q��<��<K�>S�6>a���EW�f�X�LBP���&�4Ʒ����=��= C;;�&�9y���R\>���=jɽ�`T>U�5>�����=���=�>=��ؽ�f <l뒼����p��;��p��4�=���>���Z�=|�Z���=���=@-q����2� �U �<��׽'�=��0��1�,=���;�m�<���=:A>�:�=��2>#�_>��=������=_��=�N%<��p=K�J��� =A>׽%B5��_�=O�ݽ��V�f��=��=�N6<{�F=%�8� m�=��U>���=�C޽��:_�j��?<1� �%O(�s�|>���=�h �"x">�P4��@ҽ�d >cu��M?>3O3=��\��g>A�=e64>BW=Y�����=�J=T#�n:�=y� =�8�<&�B=&M�="�&=">��\>q^� �=='<��p��V�=$#�����<�D� ,�<�ޛ�,}W=�� >��<cl3=�>�P>^����1���#--�sKʽXc�*�<S�>3��<L�`=r�=<xM>8<��8nK�7�W=Jq�>M�f=E/P=K� =H�<0=,��t=޾��Wm<,�ɽ�i ��l)>�8}�� ���7��!�>p�#<��W>�=���������<C�U=ݤ> �����=�b��G�+=�[�=/B>ت����c>�s(<E��<��=� ���� �7ճ���-=��$���%���� 9_�����v��=�������j] >U�>>Ҳ2��>�E= �x>��= �d��߷=M;��`��dN�;=�0�T6��2w��~�=�o��ij��4.<�G=Q7t=�h=>���=� ~=�$��=��缱��>� >��>����>=�>,�]�*n��"聽�`I<:�<S2�= ��>���k>*BO>�1�;���=��">Ь�=��^������⽱e�<��t��2;>��XH<����&�$��2&�)�[>���=��μ�Ù�4�1=XRȼ$����K�*�����p��,��r�K��E�=��K<�[�����=[�m�ֳ���_F=R��=������/��x�=r�L>oxҽs8� �?<]L���U=X>I<`�s<c�����;��ҽ}�:>)�I<k����<ˏ��Q>�d<�
��uԽ�Z�=(�=��?��� ���C���7=�M<�ַ�f��Y�<Pݢ�& �<T�J�(�ܢ;�N�8>��ν��&�j�?=4��<qǽpn >y������=� >�"w���=f��@g\<��=�Pm>��_��J�;���=;&�=.�k�aʃ<z� >�M8=������Hu�����܁��ژ=)n`>�-�8ڀ=0O�d"<�0ļ9L�=����ã�myH=Ղ>��4��N<��k����=��7�ߑ��o���5�<! ��s��^(����>�a���ؐ�Gf�=� �=S�4>� �:�窽a^l���C=�F0��� =ˍ�=�>&1����t>�� ���P=A��=�ߚ<u$C��y��;}��%�B�6}��CC�����i���8[� �ج�s5.=���=��=�q���f�<,_(>�έ�f��=��4=ジ;�ּ�䁽�r���=�#��}�=�V�徊��g�=Mݐ=�=�2>�U�=Xۻ��=C��ݜ;�:>)!����> ��/z>M� >!��<;����Z���мeu6���c��̅��[������&��x�>>���=NjU��,ǻ�܅���-�y��;�|��T����_������ ��v��=�����E=�S6���>8.C>{g�=����8�U:s��=�$�=q��<C5<�7�=�{!>X�{=@k�=��=���=����>u>�=7��=Ec#��|�=S����<OC=�pH>$���=�_��mܼ�d��7��;�UR>=I�[�=���=U�ҽVA>W k>+�<����ǒ�:�>p���MZӽ�,��}0>���=d���nV<�A@����93���W8���j�=�B'�R�v=���=�b>�G>,pM=�.��R�����2<5�� ��;��Ƚ�%>� �<�Jj>���=L��=��p��s�>��t=�sg�A����=(�=��{����<И>����T:=��8��9[�/vj��7����O���x�<�=���<H�`=�����
�=�ʀ�7b<��E>�$d=t)νm�h��=d7��F����9>��׽&c�=��:=GMS>:��=���= ����A�=5�&>��<�>��޽�s>�#��,J<����Ƀ=���
q������_����:%��{e&=w�>�KH� >�H�;�/l�.V>��q��b>�ټ��Ǽ��� �8�N����>Mr=� �=A)�=+�,�zJ0=u>ܨ>��|r�__����y=e齁1,=uCA��σ>&CP>��S��|o<� [<�};} V��ӕ��A�=�aW�g|���
d=��?>Om�>�~���ངWҽ�=��K�>� ��D��=7S�6χr�G�=���k�=n��<�%T=�_>�Ё���Z��bE=�m�<{,'��/> �_>�ý��H�'�=Ѻ��� ;�ʺ� �=�">����~X��9���i���o=LZ�;sB�=Hw@����ؽ�Wy>�lԼGi�>~�*�������f T=2vk>��K�9G�=�I�=�^=�]=��L�;��=S#a=�Z=�p�=�ߺ<���=�v��<�=�������<u��9iS=�(�Y�=ْ/>Nb3��P;��!>>QݽM�<^�f�U�'>)-�=*��[=�u��a�>�>�:;>�1(=P�E>C+<�8�=#Tн���<'�u>�d�� a >+��;�/��� �=�E���<���~)0��~��&.�<�8+����<0���׊<�=�<�(��;�g�0�D=I��͑�=%� >�J�=�o>0�:=��'>�♽�R}���Q�ز$��^�=���=��_�y9�F�.>N�=J��=&c=��ܽ@�߽�t�<d齇f��\�0=׎a=!#=�d�<���7Ѧ�p�p�5����:� ��KDH=
�=��g>��ֽ%x�����t�=����سR=^kн{�;��ֽ ?�<BDS=���:=v��=�� >�=�N�;&O%�dS���<(�Ϛc���\�ܲI��#o=$N=��"��R�<���=$
�<��.>�7Ӽ��>�ҩ=#�=��;���6����=j�=��7���'=i�k>)="�*>_f�<�o�����S=���<Z��g�Żb����=��$=]'%=R��<I��~�:�J$=2�ɽQf������ ���k��%d<!����K���=y(6<:��>��u��*[=4�����f�S���>~f4=�%+<ٿ��Ş&�t�=�q�Y;C���Q����Y�#=����К�������=��������_S=^��` =Ph^�Y@��V����r=3>8=jȷ��Ʌ=g�<X+5�D=5>�S���nN��oW><=��ü�>�=�g��)�P=֔ҼJ}���ά���=`;ڼ��=�d]�(?�����L�� Ƙ<LI�=�.�=�b������0T=��d�D=(���!����y6�ݐ/�d���Go�f�t=���q/|��<���� �=k齿���q|=�!��S��b�>���>�ר�T�<��j=��%>|%\>�WH=p=�z:;��˽$?O���>�=�,�����=a�������њ<�^i=c������D�D<��A>h)�<��t�1=l�=>q^�=���n��#E �6�G��F�<��ٻ��<��f<2��`u>(\>��z�=nd��<5#=�T�=�
��ו�Oh]=J7��&=�S�aG~��$5�]W>O > ��r�=o=2���]>vk�=$� �;Yڽv��P�,��G��sY�=� <��ۼ�;'�社2��<��6�L�������v�ar�=mp��^+=�+��=(!>�?�ڼ�"D>�Z>�&5>�]��y<�r��m&���z���=��<Y�t=�p��Rb�<��Խ�G���kȼ>q��
Ѫ=��=��ܼ�I"���+>����]��� ���˼נ����=?=����Y��E>�cV�|W�G��CӲ=D� ��p��Og�=b�>찻�}�<p%��0���=^d>l9�����������A>+�j=9R��7>��B�yS�=+;���N=.��=>�z=�y��@��=e7�<k�I���/>�*�!3�K�����=����Q >:6�ţ��}�<����[��zs(>v ڻI�=(��q��6-���ם��t ��s8��e�;�<g<Cc�=�|��ҽ_|��yX �:*�<l̼�߽��f<��?>��Z�ʛ�=ۉ�<�D��̆���m�=좽�6l�� P>�Ƚ3�=ȸ+�𹬽&�Z�I���z�������K�<�<����nw�w6�=���=N�ʻE��<�n�<p��=�_I=oc��g������ =���e����=�$9=�Q
�g��=HЬ='�����<=���=>2R�7Փ����e��=^n�K��<�/��&��=o�w<�
�U�= _-�6伽���<B�=+�f�É=�p!�
c�B�ؽ~v�;{�<"X6<���5�>>�"6��!@�����2>Kg�= -�=Uކ>��;μ=n]>� �=&�w��h���R�<�!��Tw�=�,�,��;�;=��?�m�^>��L��u�=VG�w<��=��=>�~�3=�2O=���=Cʧ=���<)_=��G=!�\=��7����� �q�/>h��=��d<���=�X���%=z�>�ܢ<�]����L>f�:�<�!��g�5=������\>S�?�y3ٽ46:����Iv��D)��B,��5���`�=��>Xk��en,�k��=a�]=�A>���e�U><����\�<��ͽ�ܰ<�
'�P�
��ۖ=�=�/�=�S�i�<>�i����g�m� �՝�җR���W<�$�R�f�r�Q<#�
?+��U=����:o#�_�D>�ݼ82�=X/[�~�=s��=B&���yK>�g�=�F&��fƼ)0g<��ʽ(ݩ��t�;���=���=�P�U�|>��n>YL<}E=�2=���<��_��u
���j<�ta�c����N�6��>�Cr� 2�<����h��� >IN��QE�0�=!(=����f��;���;Bq�=r0;=��v��w�;�㙽|����7#>%)�<㖽l&�=�v�~��:�%н�^=�d�=f������=�� ���b>���=o7��l��A�p�>�bR=+>d0��,��=� �<�=WS�=op� #��1ħ�2 �=�@;=v��� L�t4�<�a ;�9ݹ��!>� D>���=�w0>�~>}�`�Qd);��'<�n����;�ȇ��s�n-�=)�*�L�F��=��>ɞ"=���k��=p8ʻY[�=�U�� *m�*&���.��a=����(kb���>Y�3��!R>!�=��μ�OV��ђ=���=��'��D����1<n��=1g�<�� =��ͽsz����'��<�=���=l��=�^�L,�<�;�>�0�=���P��=@�=r�3=�0>c��=a��<3S-�D�����=�1�=X>��.=�˜<�*@���=>~�P��Q
��4z�QȎ����G�����"��=�w���y����=�P=�8�|�=�B�=��=MZ����=���=Ưk=�ٟ=y)�ǘ'��]=*��=��7=�*���\>+��=��%><f��b��=���=�U>Y���X�l��H%>� �,΢��<���$>���+��=h�'>��Խ�8->�a>���Bn���������=�O=�����=� ���D��-@���6���=��=;���1�9)�S<>PrX�5.>e_�=|$~����=+=�E>�A���dp< O&=��(��خ=HT<�����Պ��^�<F��=����j�k=�+�q�0�>)p=��.>���/l=C�jt>8w����d=�Qg�60!>!��J��؛�=[}�>����#��=̆=��X=���=��=��F>�ɹ=��<b�=[���U=d�:>TF��}����<>�m��5v=" E=�%d��ү=��8=�\�<�“��u?>躣��t�=:HP�Y��<f>�8<>&�B�0c��1�C�d��>3�p<���=�5���~=Y"� �->��ý�n>G�Ѽ8߻=���=1����=��=X۸;�R�=?��= �`h�J]��̆�s%��pF���m�=��߼yȽ��D� ���&=M�;$ָ=i=ш߼.Uv���������=>��=�G��!f<���A�*�%�>>�{J=�n�<}{��1�">�3�� �4Qj=��;� ҽTl>%���Dzu��e ���Һ-q�<IR�=�a��3,{k�*i��Ųb����=e'�<�.�NnF��9�=�WJ�+sϻ �=��Ǽ�Q�<J?%���;�w3��/�={��=v"W��=^!G=fs>C��<򛽱x���m�u��=��<SG�iӽ���=����">]�]=P��=���>�2x�.�X��=t�C�D£�b�潷n= �-��}���7�Kٽ��=�<���„�؇E�î ���ؽI���Žr�<i�@=�>�=(��<iT�=�B���c�<��';5Ȭ�tn��"�����=K��=0�˽9���ڠ=�3�=���$f>�\�v)>����[V<B���c]>_E== n-�3����۽C�|=r��;�-q�c�=WΥ=5��=��w<೰<����S<#>q)H�Gs���.�8Uj�u2A=UC��)Ap<} ���9۽��=��d�V�q���;�W���<���=�Z�; !��TK�����;�d=}@���[<A��=@ư��U6>�^=7ɽ/�<������m��~�=�솽��k���B��}�=0J=1����zn�<]�:g����%L��x����3�����d����V:�����@��j��]��=��<=�B=�o���/��@���-�@��=t\����=�k'=�RĽ���<%
#=��=(��3o߽��=�f�=��齷�<�2���;r>e�<b;=��4=�� >m�=�(��Q� >QT��O��=��}�M�h���=�FS��� ��g@<�Rj�����K|����ɽ����:�
>3����o��O{<��b=�y���q��?��M�����6=(E�=u]O=m��=�\���=>��<������= �n=�I�>en2�eL;-Zj=�!���I��;�<�[=��JQ>� �=�O��v����I=7>�9�����>)��=�S=�� ���=�����r�=���<2�;�Q�=6� >�e ���f��Q$=��>��>��ս�nO�)��>�a��� >R�z�$`[�ԩ= �">/�o<_��=Z>rit=�\>>�`:��H�=��X>i ��+G=��B�Ъn>p�W>� �=bd.�u5 �\�8��'����k�O>���Y ��+!<ؤ�>[%�= ڵ���㼻��=@�ἋXk��n�=6>��G=� �C���N =��j>�l�=J'K��ؑ<��4<'���l� ��Mn>v��<�����<Ѐ����@>�YɽV�P>��R>$>L�-=���=�˄=R۞��.�<����_�������W�=ҜM=� =Z�:�l�<����؈:> ����o�� T����̸ؼ)+�=��߽�B6��=���T`=b��=��V�o� ����=�$ �G�%=`N4���>%lM�S���H�E�z^ƽ��o����53>�Rl;`��,�C��!��<�<]q=y��=���2:U=8E�=������e=�1��U$�=��E=T��=�j�=�/ܽa�����>�)F�i����Ͷ;kF���;G�;�+�����;!l=ۻz��>���;�>3x�=�X!��z=��o<#U��C�������Ձ>��̽x�ؼW�M>1 Ƚ���=޿5>~J*��B�O>�
ּ�<ѽ��4���=�}b�ގ��R���6=��>�N=
*,��
你��л2>��½��-<�ө�"%�=��==�&=����$�J-$;?�=�̽=m���wU>�=�'��Ͱ����̽�_c�����^�;���+<�3�=n��=<h�=�~��"��s���|���aO�=���=���
/��y=03=t�����C�\���ؠ�>v�\���c�}�N��=�3>��T>�-Y���ͽLi
��>k^��� �=+B�<^T�����{�<�>̹W>cS>�|��J1>>ݬ�Ѱ7>���{�����=b>�^/��% <Q�����=|��;`��=��(=�Qk>p�E��.���>E�= �=��=�#��lq��.����<�[���!�<� �<��F��c�;��2��'ӽu��=�=D���">�<Y:]g7�R�=ԁ >nC��[�><����ܻo��9@��Qm>`� �{�k=e�>Mӯ<"%�)5��3.�ʸ4���՛�<A�/=(i����C��`���)��@��=�q�=d�1�I���S�~H%=��w>/�%��D��tN�=����t)>���;n���E���=��=��=|�� <�d|��E�>��r�3��:8V�=n:=�Z����=�߼ɢ�=�j�=��>�O=�mw��2ͽ`�b�#�>��@=� �<#���a�����=�Q0>L�%�af�lI�< ��=��I�h���"D�=`u>�̼U�����=,������=?E>�Y=
bǼp�i�=y �<��;=��j)F=��=��_$�=��a��=h�j�+׽C��>^��`�'��U��eE�� �=?\4����=���>��T=�*2<�}����>Z@�=�;=�w�<�S���B>rD��b8��w閼�i�==�&E�u�=I�&�^��=�X=��"=�_�=���=�F���1�=�ъ���m=��\>�{>=�d�=Z��=8 �S#<p�>���<��9=��>��۽׋3�ݪ��:��=���Nx�-�;�=1={���~��=+8�= ���B=�?����=h��=�����_������µ�&ҽ�s�>w���P���@A�L��e<��=��Y��=�vq��y��Q�[=(��"�s=��Ͼ�F�=��=�M\���>J ��y��t�>�C>��a=� ý��;�-�K�b�F>�s� =�=�1=�a#>ӗ�=����61=|~�=<�u�%��&p�����˒>���=�s�=X��xɼ;S���_�=�Z�=��>��=Ϯ=�Y*=�'�="h�=��#�KY>/A�=[�=\��6�~>,ͧ�U�����=���=X�>������=��&�+z��ˁ>B p��߽����� h���۽=��;>�諼� �=�U�=4j@=��>o��>���(�ͽ����c�)>�x�<X��C�+<E�3>�I���#ӼM���H�M�����ku��/�=�a��U ����ɼ(a�=�T�=lG>��R=�z��B̦�`w=K���ľ�� ���ն=� ���V�<l >��Ld�=�+;>�j�v��<.���`l����|=a$l=���<���{>42��հ������#<>?P��!��>��=��s>u*>Y���a<>�΅>~�k�δ �[:���Ǩ�~j��~ች^g���S��:B�=S�2��>�<������=��W>�V+�(��=^�=V[1���F=e*���ý��o==?���7=���������<\����]>~> >��R��h=�.�=�6e���W��-k=��=�c=���<�sQ>����@���=K�>iW<��k���y=�F>`a1=�1��(�};�����w>���r�=Ą~=Ŋ�<��'��� >E2�=*��=I]=��z>kR>�=����`=�����6��zR"��|3=��=���$�� � >7�=��ϼҸ���G>χ�D�>�kM��r�=~^��M�=�H=�Tڽ�cۼ^O$=� :��2>��U��Y�>�bY=��j��s��EH>�����;x_ >¢x���a�a�@�:L>&�<ŗ<a�=A7�= )=G��p&Ƚ*��<����']�=�I=������=�d+>��ں*ۮ=�I���.���������4d�����Ǩ�"��5���l��n�=Z#P=b'p=�6����"����;�4�:�F}������0�C�.�.ĸ�0����-�5�K=�N>ζ��JV�����<���=�WC��#=��ͧ� �B�WL�=LL�`�!���=���=�3�=~a+�]�=b�=i\����Q�C=LG> Q�=�T�=+s�=熽b�=��4�m�=����Y�>i����ku=W�J��8����T<���bT�=��=
��/�=���4ż��S=���=ՍD�D=���cY>0��}�ǽ:����:���꼲�3��܆���f=���;#��=��>I��<'�>DM����>ʅ=�?���1�&��հ��sO=���� ���p�<�r��} ��II >�Dj������vڽ�P�<��=�[P�����ǰ=�3l���F>ƀ~��� q8=�M���U��%>C��<�q=n&�=U�=�^�=�~�=CO�>$ ,���A=Ʃ����� $�� <<�Ʊ=VY��D���߽78�_7`��9~��=�7���C?j=`ۀ>�H�<�#=�+>��p<���"Kz=��3��=0>�8x�a֮=g���H�-��?�=I� �>�ȶ�r�&���E���p�;�\=���������>ɼ�=� I�mt��">꩒=�wV�KV�=�J�=#uC<&C =R�<'iY�'�8>bk�<�r>���:H���֫,=F� >� �o��P����Q�w�=]Q=��e=ࢩ�׋�:�L��h��=nv<����dƽ���+C �O%=-;_=0�=�hԽ�4W<{(��Jy�=����=%.=�
<���=�6 ��X�=�Tx=��>�n >*��v�������ra�;���=vT�<������=�Ð=���<N5=���;*�;>H(�N����=�c�=nd�=�'U�� ��ibѽ�f����=-�,���Z=Uǽ����]O=8*H�v8>(ڏ�a>�ף=F>Y��<$+L��\����;[
�<�I��:����7=ʘp�0�M���Y���.��K���vS������=��<��6=lʃ����<� =ѳ��oY,��4����ʽ���>+-1�W:��uL<��O�=<�={ /�*�<�Ѽ��U��z�<~���hK�=^
:��f>��ý[N��%��=���<\�=(1�=����ݺ�>)+>۽����N<~��f�Y������<:�R=c��;�!��Ug&�� >='=<�w:��S=�9>` ����7W<�+��c �Xg�<v����Q��O�=�$M���F��Q�=F�;���=�/>ji����������t�e��=5@ ��N2��O�<�z�<v�+���*���r��):��g���'9���Ĭ$;��>�� ��;��r= �n��
��׶��-��g*=��D���(=�9�� ν(������:�{C� ��=�V>�W>�=�����<K?>�@��$��=���<%?=s�J>�i�=�o����=��Ͻ h5=�[�=w,>H�>f�T����Y"c�:���P�Z> c7� -��6*�>��"����=�� ��u�'�>q�n���_��T��`��<��V=1�^=6�<�>���>r����H�A>���{E�����\�PL��EIǽ-����ׇ�t3���==i�%��+=w�N>���=�@�=|O�=.�⼿>T�3��� >C�A=&�۽v��=\2�=݅վ9�Q>Ξ=�yǻ�r��(=p���'6�>>���EЩ�$��= 2Y=�4#���>��Y�:�[�<:�;�;�=By�=z!��'XT��z��y�a;�ߐ�u�9�7�>��p������}\��h�="�N���=Д�S>U׮=�D=�'�yM�'�=akZ=��<�Q��wd>��p=
�>]C8��i4<���O=>�Y�<�� >�;V�\8��5�5=��O=k�>�&��$��P��=�F=eؚ=Gg4>C͌���Ͻ�rS���#��&:�o=��={%%�6���b��F��ߙ�=H�:>�Y�=f8�@�Kn���A<ܙ�;��!���=6��=M>����׋Ž�ƛ=���<3^"�n%ȼb��=G�e�B@>��>����߯>U�H�����~����J�x� >��b>i��>�Q���(>RJM�_K;�>Ԫ�=~��!==�gD>�F�=��=�`���g{=�e�>I ������f�'xW���=a�>��#=��=�|�<}=��/<#4Z�#�=11�=$p!��q-��)�:��J4>O�D=~��=y6��r�=��7=����2�=��<>���< o�=�/���;y�8=��%������M�;p2�=ϔ �ۘ�=Y)�p{V�ٍ���_!=� !=��=9^;�ƽ�(�<f= �=d5�<9�f>ޟ�<�5=2I�==_��<�6c��7�r�>�l����N|D��5�=�C�����<�dH>��=�P> k�=�H��i������NF>}����=xk@��c�=Y1��r!�=3Һ�T1Q���=��<�K�[�#��~��X���R����(� �(>�.<���Q@m���R>�Q�@�"�V�!����<�8v��"�;��=�"#������Ͻ0����+*�+V�<���ɽ��(� 氽�L�=��=Y�>�G��¼������5�(=ڽt�e=/�<����J#���>����<�����<��f8M^<���=qE�=*==�񗽅��;VK�-�+=e
_���M�8�s�mE�=&�"<��)�� ������[̼w��;Ѯ�=�}<�Ԟ�U =eɽ@k=>��� C���/�=Y�=�|��.���=4��ͽ�c�=��>n�+�dH�T�a=2�q�����"|޽�]��޻��X"=C=X����2��w[=7�ݽ�v��*�U=z�Y�rs⼑h)���F=]��=�q�Bn���h������€=\��=��y;� e�nF>0�˽�\��q0==�ꏽ�'_���r��y@���<.� >���m�=չi�9��<7A>~�0����d����v>n�нݧB>k����;��O���켛�S��O\=�u�=C�.=ť�<Y�m�I��=���;=���T�ļ���=����w@>D�.��:<��'�NQ<Xq)>F�ڼ�v����=��=���=<R���I�=Pe]�� ڽu)�=��"��T_�ձ8�el1>�#��b�=���������3#>��U=z������{���<���=��<l{�=DS=,ʌ�Q�`�B=�:����=�V�H��=;>�y>�b>��c>U�>��T�=�J>�)w��t>a��9�^��N�=rx��C�Y>Vt���!=7��뫒�dΦ����=` �=��h<Ť5>�)�dF�;qK��^Ə=Ku*>M���/�z>���TH>p >Y��=��_��)>~�S��-6>�p>mb��o�j>iVg>��%��r�<�nw=�<��
̽/�=�&�>���m7ڽ���=?Z��3{=��t>��[=j� �����y�pg�;
��H��=��>]�>�S�a̐�9~�;��=~�!>�N��^>B %>�f>�N�=j|=��]�V=� ܽ;��=Js =4��=���=��=�O��;߅#�-�U)�<,S���ɬ�-Lнͫ���=�p=�=�<x�����>��j=�<�V;���>:%��!�ƽ,9>���=��Ȼ�x���@�=�>�Q������5���:2�$��=Lcr=�彡��=��^�Vq���ف���=FI>���>�<���+���4Y�Y;����(>�>���eȽHV�x�\�há����=0��;���<�=;��ȳ=�`����={�j��E����[� ˆ=�g̻R�(>$�Ž\Ң>�����ѼL-�=�<�P<��&X���J<��q��~��F�/>�,�<��+>�Dٽc��$��=wq��{?�=�N�<�k=PY(>,h�#��=v˕���=���=s���?6�:�|�=u'W���(��1��s�<+��������=�,K�a+g�{�<�>��cӹ:��\���e���=#�y=���L|/���t��鸼 �z�<U�=LuO=Ι`��ԼA�)���л��=>qυ��ۺ-Sn=1����ͽ�!�=u�9�� )>�&@>��\��<�@=��.>8u~�$��=�P�=@=��1�Rܽ�Q ��X<��彪�!=�-�=Sp >Mv���)8>0�;^��<^!;��N�K+��f�3�B��<gx�<8`��p�=?�X���r�>={ ���;������ =-�Y�P�=�O�=�u��؏=� �=9]�q�5<7Z�<�pJ�g%�eN�=>c���>0�����\��Qs��i=�=>̍W>V����v�t���(�0>]�>����Q ��=�3=Vb����ӽ�S6>�C>O���C�[����;��/<��'>�%����=�K �)<�=�� �b�@>4Ŷ=��3�W�F�ۈ���?��սׁ=|�>�"�2=D�F��n}�k��ݱ���0>�S�=��>.�=��=���=�է�n� :w@<֮=�λMh�=�춼1%=��=i���g��=���=-�<�W��<CF=i"�<��@&\=Z��: NR�������=_7�L��=��=��;����D�<V�&��� =?S��7>�uX>Q�Խbs.�1'� ��>���軻��<
z'�Ue@>��T=� ��Xm=��>8���@C�=�g�=W��=���=nn>�B�<¬�=���I�<��;Vdѽ�>���=4vz�kID=���=TY��Xv=�8=e"k<cO����g�kh�=Jf> �>u�}�6����ƽv�7=�=L��<i=^�l�n��=�=V݇<�~ս��=��\>x?��ɘ��.�>��ҽd,*=m0�=����f��<�G�j��3��=?d��$`�<�>9w�=Jj��f�<� ��4Q|=���=��� �=�����OD;j�R�Oٗ=����3_��=h�!����<,���M�<Qֽg�d��<�����=L�m=Hw����L>�0>��+���<F.�<��U'<=��'���>��<�"&= �A>^h>G&���c�>M�<Nh�=�$�<��<�xC>��\>���=ce�����=|�*=��={A��k�>&&I��=5:�22=t�O�E��=`��Y��;�aV>Q���i�z~����=���=��n>�IT�,tf�e�;;T��;�}ͼ
��=��P>>�k�q�ӽ��R���=h��4� � /1>sjz�åx��'��-S_�1PȽ{#���3�V��y=�C=���#�F>�B@��P'���w=����4ŽW���q%
=����>� 9�{�,=N셽 ���ʺ`^;=q��=c5�<��=h =���<��>��ؽ���;�כ=[��=���=�顼�B��g��=�Ix=(��;t);��[�^B�=��r���Y����;�(;�s����=����Ǽ/> ��;�<r=� �;���=uI>)ED=����#�p�=<�>�2��]��=�O���>�(Q����=^��*��<�D���X����ѽ�=s��O�=�6��huX�u
<Ƚc>L�;>�c�<��N=��k����=BŽMw<�v��Bsu�%ټ���=9*0���Ͻ^��=�8>,��=�6�=�od<u�弽�<֍���S=m��>�����z$���3ս��=��;��t�l\>��<�P=<�9�c}���
�<Y���)�d��N�{餽ʏ_�"��㙽K�ʽA�>¶ռl��;y�= 5�=��N��C��a>��V>d�>��ǽ�˃�m����<3 >�lR��]F>Ҽ�A�������<�У�׊�=���=�=�޼=4��>
5Y;�-^>����
�<r��fW<�<p�3=�<)�����a>k���A�V�z����Y'�H]C��t��C��xjk�cH�<�8�=j�<�����I��
�.>j�6�о/<�������5g�=h�->�����ɽ�r���X��_G��e�=�� ����v>Iƽ=�ƽ��۽`�=Ӌ���L��+�>Ri����^�^| ���
��T<�:w�>�<��I�����7'�< Jf=����(=�����<�:��틖��=�Gd�.�����<�B��au����=9����<(у=�g=��[>��8<E��<��:���������0ʼ#7/��4�>7�>/���@K=T�X�|�����Z��\{��l�=�>=͎�����=0��<{�޽с>60O>�������>9��N*����=���#��|�>I���2�=��"�p�=/A�A~<�0=��<�AG��O����
� V�;�=o�#>� �={'�=�{Q>��"���#=��@��������
�<gU��T>��Al�Dݗ�"�E=�s�<�s>����$^1>���=i�i;��=Kz�<�3���>A7M���s����=�o�����<�������Y">!��;#>PZ>�9i=�$$=^�=Q���4ϕ=?�=�VV���_�=���4^<����n���:>��Ž�ݙ�/�i��0�=�3= *޽�(#>V�To�=� a>w��]���l�ո�������;=ZKu��N<B<;`�h��2 =(<(<-��r�V>�l���?@����=������=RI�=�6%�(|>5�V�٣�<�z>�EL�/3ڼ�Uo������4�=��};��~�c�D>��d>��T>�����ֽb��� � ��Pt>��7>�{s=�#:t�X=�G�z=|U�<�SO>��½/_R=�{�<��>����y,��|���Ր=6��pM6�Uw��q��=��]>���=�9�<'�=�;%=�<q�hV^���">����Y8�`'"����iA��Ƌ�<�w>&�:���y�ʼ<߼>�k=� =��<��[�vS����<ܗ-<vB$=-���4�=�;����}o� X�����[2=������\>������=o>��)=1݁>w�>M�1=(��<C�/=o�=s��=xR@���/>��<PRƽ~��=�b��Ђ�FB6>D��銈��N\<I]�=@Jb=S��<X7��cQ >F:�=��"� ק��|��a,>�d̻n��$>y���8��>�=�g&��@>��>�-TD�!���ޜ��C=���8�O�=(��<�F�_Df��Z >-�;��M=CY��CY�>���;���B�=3񶼶#�=���=1�Q;o!=IJo=�>>�������=���ĝ>�Ƚ1�A>�����2Q=7t���3���@F���=~@c�u.>�T4��-�>�x�=f��=��%>�%�=��`=��ֽ8w7�G��o�>*#�,<L>>�1>�I7=C��aR>�$Ƚ�Y<�����x��<75U=���=w�����_>U����I�n���u#���=���<[�=.W=2<ȽҝS=θ����=�<�;�ձ=9��׶M�k2L>q�>�T�=���y!�>]4�Nn���2E=B\�<��1�YX'>'����/>P�,�ȽռT�=Yv5=yμ =�=~ `� Ѽ=�9>}�>Uc����!>Gɽ�p�=9���$$>�l��Ua�=ȟ=�:�=���N�R��=��{=��蚻�4<=�x�;<��}��<�d]>b�m�����w��=��������6�d=����x�����=�����H>qz<���=B�[>/���</ �ð)��/B��k4���c=T���*��sU=j���,��]�M�t4E=p�T��'$����ui�=f� >gG�=��㼈V�=CM�b�a��n&>�h:,zS>śS=����b��SJ>��>=L�K%�P����G�=_/S;�Y�ZD��Jý�<>�;�>1@����U`U�L�+=-��=��>�����+X�1��o!�a�P��!+>��<�ȳ<Ԟ�>�T�VF{=@m]���:ƾ.>��:=K�Z�a�=#�>� ����e�?Ю=\. =<+I=H���۽潁ظ0ě;ډ=���=��=�|�;�&��9�Y=%�C�4>y ����l�l">ș��f�=!���-۬<��^��
> �o�$<\/�����=)�\=�Z��"�]��=G��<V�G�sj7=��x��|D��ԍ�>�?�_�M>B蘽�#���\�<n4��-�=v��ʇ��䑽ŭ��E;8>s�)��D�=.��X� �z|�'��=��>@μS�¼�~�>�v#>R���m��<lW���d9���,h�=�K">1b>�V��*�]��U �m�$>qN�=�8>�k� lǼa�<ɰսq9h�K_���8k={OǼ��%�� =�k���ey;���/���K��>����8𼇿���ü���ǰ�& �=�OͽM$�<kN�<��5=z|��
�����h��=̍�e*=�fk=m�>����=B >�-�Hc}�w�v�zA�l�꽖v��x��= i���θ�9սZ�!�Xk=Ѡ������ýj3=[� �A�>+����= �=#�]=�+�=<咽z��<�� ��J����>����l��=m�D=�O&��Vѽ��X=��ֽ�>��t<���3>�@=���<��T�qb>>k��}�_]�=��B<��(�1�u=��F�0�=x�=�u >����j�7=,��=�g�<�U>9ν��{�]�2<$�,>�v�=�I��7��=�5����z���:�����=q�v>fJ<B�g=I9;=M�Լ���<��+<�q%=�y�=���=��=O�$=�3��lp:>�ؼ<�W��Bn�>m���n5>�9���OV<Ht,>F�=�����=�@�< ^>��� ���O=���=��:���H�Z�Z��S�����=�Q<"��jݏ�$��;{a��[Ђ=�n=�:�=�C3>�= 7=�n�=jTU���>�Ͼ��{P=�^�<G�;XG>���<;�F>U/��/ޟ<W�1=���=��t>�
-�X��=UY��<��7p����C����=<$�B�0��=���<}�'�pĞ� �:���=��^�V�T>K�=��&>���<[��:E7�=޲9>2���o->!��v�O>��=��#<o$>pد=إ�<>�=8�������(>��b<��{=�f�=�"~��F�T�E�q��;�.F��K=�[��=<� �[Z뽹�>t�A=���=���=�-�=�C۽���� }>�!k=���(����=s%+>p�[������=���=�{�>>P�<� p<��f=2�=M�㽢_W<�~�=0�P=�0Ƚ���ɨ<Z�>��C�aR6���x>�6�j0��i7`�US����<�ؑ>g6��ky=�'�=P�Y>T3>%�¼�]�sM0=K�ֻ#�����a>H�}����k0>�T4��b ��2��;> <��S���{�Klv�6 9����:�†=�{7>8'>S���k�=�-�;u�E[n<��.�d�&=>�>�{�<���=�����=���=yG<��(�~�3<?����P�<�/�<8ӿ�Xߡ��כ=�@<���U>~�.=��1=p ����W=^eb�q�@��+�G��=��ܱe<��C>���=������cV<��]�U��=2�Q�1��=�y��ݙ�� 0=\��y���m����;=�HD�Y��=h��/t��˽�<�����N>P� �M����<V���H�<U �<aJ���p= �<�>|��<XI�=Z�>qN>�6*=1�><�;N��{�=n=�Ժ��8�=e���[=��4>�-f�F��=�'i>ו���K����c�=u�>,V~�O���އ
>8� �Lg7=P9S=��l�X��y*>�|= K>���=ۖ��I�'>˨=;�#=Rk
���>E��<��b=�u:=ts>��->v˳�Oe�b� <�F�=&�<.�K>.����H��i�=(\ ����=��*>�Ӟ>����>����i��=:1�<���j�=����>�=騍=cm ������>\?����=���ה�=7��=�:��.�=�VF>M��=��>k"6�� 7=)�-њ<jQ=��>e/ >����o��<��k=x5>\ڻN��\0>�OH=:�F��=�=�_��� <���<=�p���9����ì�=�[���Z�J����=O$>=�b=��:�� /��X>�&_<��@�=E�>@���DWý�l4�?G2>��=�C�>\H�������r����;��Ͻ+x}��f�Y_8�� �����;�6��?0
>ſ�=NQ�C��;�z�=j=-�Q<d�=�=H>@z��AM�=�근�u;���=�G��<�r�=�>�=��<���=p0R<7�������
�u^
=b=�nM��lL>pe=�6� �>� C�{�������Iv<�o�=����aY4;5Z�= v=��>�d=
n?��6.> 7�0��=���<fKp;QT&>�|>#LD=�d>y��=�J���-����=L��=��I�|���G=/�=V��<��=" >�)ν��y�‘#>���X}}=��>��='a =��7=V1>.=��=��Y�i�z��{�=c≯>2*ὼ���~5<B�ʼ���:�=���<!�D<��t>�b>ȡ>(&�=]���[��&7�`��<��4���F<0�-=�R�=�M =v���%���B>�� ��p�������>_�>4��=�D���=`0=GN:����<�:����b�ZB=�ͭ���*���@>S�= ����x�=�����7����M>䁊�ɾ��t��=z#�>Y
�=�-��Q4�*=9`��7��(o>Y۾<�\ѻ�ٽ<��=K۽[�.�!����T=>�=�N=<�|�j=���M�f�-��1�;}�=�)��HN��a1<�G-Z�b0���G�8�F�O�=>ʍY>��p>���=���=L��>�=�Sl�#ڔ=�����[=ﮏ�>��=�u㽐�O<�����>��* >�!��N�*=N��3�����;@:�=l����n�<��B���9<!2>�O���)��Խ >�i>0�������ׄ=7��<Rj��%2:>�M��)=�н �<�g���� ����<gς>���=K?�=�ޔ=�C$���z�n=#=,?S�=����������=G2���1<�WP>��=�>��༃:��)*z= h�=0\�����I|
>��<� �;��=�V�=F3�<���=�7޻�u�=it�=F���+���()�H�<f�-�/.�<���N|_=}�>�I�K��=c�ڽ�$�� %�<���> P�<����2�Kk��U9��ҡ��{�q�>�������=�L�=�0>>P+����9>��=�|�=�� �©�=8ֽ����0�>�/��S���F=K� ���T�鯾<U��|m�=ګ�&����5#> m$>�h-=� I=�{������=<N�={�.�g՗=Z�W���=���=;�;�~8=$�5=#X�?a:�#4>~�Ѽ��R>���=��[���<镧>3
��E�ܔ���a@=�7�=�A>��>8�>��^&=n�=>b�=��u=�[D>�*s��^+����=��[���û���>�{��GY>��sU޽�H:��WX�wn?�du<�{>!�<���=�����~���=i��=����[;}p���[d��_@�u����<P�m�Q��<VU>=�G=�'=����e'��T
=C����V>^�;��n<ӊ>%���J�9�;A��=?ˣ���`��8]�]�4<���<gւ<��-��G�= �>�*�����6����<<�A���_~=�x�滄=�_������<�V>�̽�M�㲏����>�㩽���=_�$>�$�< S�J>0*�=�܀�{L��1w���"B��g�==�r�Z>��< ]w���>$ ���>��s>���<�6�=���=w_�X蝽�tS�,$�� >��v���g��)���>86<9� ��<a>"�[��Ed>�
�<�H��i�=[�=�}��M�j=�Z7��ߩ=ÿa�Rn���⑾�
Խ�->���<�N�;n���3��<h9|>������=GQƽe��<��V;{��=&��=ȉ>6��e��-P��vc���K��9��<��>n,=���a�=�IM���-��̼+欼QM��� x;�f���f�=K�ռ��3�|���b���<?����<Y�>g�:>5�=� �������T<d���E_G�Y��=_��={�ؽꚁ=�>:$>t+㽛�>�"���>�j�;<�q-<I���ρ=80�=�=9��<����ֻ� ��h�=p襽FL�=�O>��Lt�B��=�8�=���=d�;)`n=���l�$��&�=����ޭ�=b�=��ٸJ���>� 㽼����(>�Q�>�Na�* `��r˽C���������l�'�#��^^���{��1��=��l��->p��(I��� �c?�_�%>e��=� ��s7�=ؠ�=�` :�d�=�o=A� �M��;�-�=e5�=�8��]��=�\J����=�>Y=�=��(�g���i�=%�;>��=��F=�:����^��=>��YS���=�(�;A����8 ���-<�=d<z��<)��>JC�A<�;�����=��"=�J>q�!��@>�����?�v��=��E>�ꁻ?#0����=3M"���c�������n��9���!=[>,���c>��w={������;� >t >��=�5;={߆��Zڽ�d�=P�=��;��<N�=������+��=�g�=��>�X��ۺ=�n��٭�����=��?>ei��(�x>+�d��,R�֩���)˽�F����>^�8>�Č��%�=�,���.��8�=�AI>�+H�p�����=Ma1<���=�M�=���WN�= � �Rm�<
�^=���=B�`��Q�>�+�=o�C�fa�=IkԻs�=�ݪ=\�O�Ճ >%��=M�x>L�3=��<*��=`rK>}��>ҭ;n�߽���=�������ncU��p����=��}�&�%����M=���=���%m�<�%P=�hx=î5�:�6�ޢ�=
�O��<p=�� ��$��4�=�y���eg=2�K�=l���V�=k�⽛na�C��=���;-C��䠽{;�C�=�s6�=��������0C=+����V���iA�ѻ���U�=y&�%d�<2������1�4��=>��<�?�� ٽ+�H��1����ҽ;�V#�<��ý�%�<�����J<�<��}�=_*�=%~�=B1^=��A��==#���=�.9�>D�>a�H=�K�����Ӕ��u����=<!�D����)�ԙ��퇽���=��B< �@��}<jR{;�1;=��>�=p?���l������,���սZР�u��~��=<n=�5�=_���+
�<�*��NB&>������=����^�8=�����X�=��9=�h���q��{���\"��a>�=d� >im����.�2��=F���^)���1b>5���� ���=�Ǽ�e���ׄ�"R>2ɼ=8�{�[��<.͒���1<�h�����ἵvr=X��<oS�����=���;\+;��T>=.� ��5�=���<���=&�:׽ݽ�Ů=����=��>�ɕ)�rUr=-[="N���酽�7=����x�<�,�=gkK>�q�=�+����t���U� -����p>`�=��νV��>�B=�w#����=��=Ia��a�)=���;��E�X�Q�]�:�K;��LC���l>�^�x >�ϝ=
�TYG>���<b$��E�A�;j?>�z���׉<u*�� �>�y>R">������=�v�<Y����U�^=�Z*>��$��Nk=R�;� ��|�'�J,�=x ;{�=ذt����<!����'0�E>���=�pQ����������=���ҡ�=�]��>�%'=��8>`�>+����G��=uV>�����d��p��.5>+}8��N���j�<wV ��n>��
<D�M>orػ�ft���>.5>& ��t�=�g�u�̽���= �,=K�Ἥ����Ƚ��;i���8"c���=?)o=�r���]������͓�f �=�P�YP��V�W��)2��| >�J��<��`=_y>�Y�=���=ퟚ<G�,�ɔ<�&�����=o�K>��彌{��$���!e�=�m�=� \=v?����<� >��d=u1�<�ܰ=re��4�R<�ZJ��)�a$=&�U�n{�=L�r> \�8�4=W�M>3/����=񑏽i Խ�'�=Rr��E8�6=K=�=�Q��G�<��><+p��uμ��ٽ;�?>��{������?���y�1 2��ˌ=4��=��g=��<��� =w�6��<7!3=�&��>T[�<���;��5��;���=���8��� �<�&>�:K�L�=g���1A�ҫ�8�q>N�����d;y��= #=�
�=��N�Z�ؼ�K0��><�߄>[�,=�[B�2a:>�y���C�=oaF�����Z���C�=�H��:>������ �]= ^>� ҽ��ý��>pH�=�ؕ����= �=M�N=�2p��{>�D �S =��(�i�$=���=�܆=i
s<x��Z# =R�=�(=�r`=r#)��=$e>��]�?s=LИ=�����)>8ʽ-Y���~�=�H>\J>���;����Q�A=�S�=�^�C΂�j��v����y�M�`=W�S�Ru�=b�a����=y>��ȶ�>���=ٙ><2J=���=)����!=���<$�Q�6��=ǟͽ�@����=��ޢ=4��n�����>>�/>���=p��=��l=�ܽ�%�=�z�4��<���!Ac=�n��
�=���\�=E[���KT�2:P>bt��_��=�l���L��[˺�t�o�D��<Y�>����� >1��
�ؽ�����m>|�ͽU�=Hqg�ٍ=�<�M>���Ѐ8>����~%>t�{��Yx=�e�����=��=Sƭ=P�,���"�^�:'��=j�Y�j;�'}���߽u�B>|���crʽ@��=�fh��殽���;�=m�9T�d���ڳ����=����6���Y>@p��@<WL˽�k���w5��mR��.>Cdн�~�=Np����ɪ��Bښ�9R��B<�~�Y�X\��2����W�=�ug��+,>��������2�d<dk=l�5�R��=cj��K� �0��g��gW��Z�;���=jB��Ħ�/����?�}2[=�ڥ;�E�<60�=�p��r��=|�>��><�=Z5�)�C>n+��́=��'�=u�>4��̍=z�����s=ŧ�Us�k���)<:��=���Q7;Pp �����R��7�*>�5V��6�>q'�=n�><�8�[J*�ߌ����=�\>���|�����=��,=��6��c>��=���;�c>�����Q�j>ɘ!>�T��e�ǽ �>"�r=�������=�C½�y��8(=C��;�@��������<��q��ͽ�j�����=9�v=���xQ�<�Z����<f���-��F=��=]��=�Aw�b���̼a�Խ1� ;�����G=1b����AH{�ƍ�=�>R��0�8����
>�0�<�{>?��=�E\<� Ỿ��< <~���߽���F8=�y����=�e�fo^<��4>��Ӽ�f1>'+�<K��8�=:���\�I���>�
X>Z�C>r�>xJ'=�f>���;4e�<߳$=��e�[Y��n�=QgؽG~'��1!��A��Q�<�e�=��C>����-�rcs;��4=zb��;S½�
ӽ�=�;>pU���!>��ýR�= �
=N��< �.��*��k>��>�T�=e�(��C�]���=���P��b'<T���3t���=���=KR=��&>�ZC=�����=�9���|�=���<���>�1����<�Q>�M=����\g>CL=> \>��>��'=�n��Z�c>���<����x�~R��5�ݼ��\�&�F��>?��=ڢ�=4Y>+ȼ���w}}=ȡ��Ύ��^ >�ߤ<��=���<�0�=d>�����U;=�]��NƇ>��;}=4����^=/[���>G��p;<��.=ed�;��罉H������l�=e����@#>���;}_4�1��=���=�ݼ<��=(� �۠�=���1=�i[�M�G��#5������Q1���!�D0��Tϻ��� w�=��F<'R���1q�F�=H_��_�������f߽��=����c,~=8�����L���ļa�o��ı��� �\�=�U�<Z"�s�A=�s�($��w��r��`z��(u���`(�pKC����= �4<��=6u�=����i��T�=�<(_(>�"�2 x=�����=
�����<�<��,�-׽
�<�c��Z�<x
.>u��<�=�?=�A�<E5�=Xu�=-��=�� >|�=̶��� >7���n�н:��>!A�qZ9<��=�̙=^��<+�v<�[3=zIG�s�<��������>kȲ� S
=|��=����_=�M"�\�=P�{��
���Ԁ��Y�ov�=h�o�� >A�9�y����
=bh#> ��=�֢� �t=�Pv�#n> ���p�����q��ҼtG����>�~��3�=�V(=�ޯ�k���E�\>��J�y�<�i`�<�~��I�=yFѾ�*>��'��X�=�s�U�滊H=�և�z�=A�׽r�<W~����V=�#G=��V�l��=긽�/S� �p=Hْ�����ÏH>�@>���=P�`��F����Խ���=�d��KW@>7��=Pkʽ��=ˀ*9���=`1��$�=>���=q�E=�Cc>SR���:u<,��<�\>�t��Ƚ�z���k�g� <^���`�>�5���4��N�=e�
=��'�ȴ�<�U������¦��P>� K�N����d��މ�<)�U�h�_>BI�=N�L���;ޖ=�z���~���o����Ow�=�"[=�_X�gC/�\
����=?�=b���C!=8��<5-����*�����,��H˽:A�0s���&���9=�v�=��+=tŽ E>�o�=]%�� 1����� !��u��|���}�>�$���a=�!�=b`P>�w:=��U��<t�J>8=��&=`����W�<;��=�ow��@�}���8= 鲼�0$�N���²<9>|X9�rws=�5��Y��0>?�I>�+�����;{�<^�X����
*����_��ѽ�_�����=|��=mq��C�����&>��K�+w ����>R0���{�[��=�l�=�-!>�!�� �߼�m�=HH>�G"���>>�f>�½�w#>��J=;O�<���==��<P W��7�� j����<��Ľ���=l�<�ӣ��'0>�>uO�<�D�<{�\=�39����1>.AS=�R�y =�5G=�uu��������=ˠ��t�=�D�=�����& =u�t<1���,������>T�ۿW=t~޽ǭ��6#q=�q�=�]�=�"O>�?�=��&�� >�o,�����F q�6= ��<Mҙ���Ľ�9> z��eUD<gW�=~r=<r�S��� Ҽ�����T��/�=ֱ=�jj<.��=��=��y�*�/>m R=A��<yۼ��”:v��|�T�٩>>�3>��*=m P��_ܽ��E>�Bļ�[F>���>�+���E�\`�s�|=�ȷ�d�Լ��.=���;NS=Q��׆=
*� ��={�=��=��7=���<M�}=ȬT=���?�<�6k=��<Ż=��<�zy߼����j#=�Ҍ;��J=�Q&=��;>���=�=�S�;έ=괱<��b�;�x��v�<4!|<�pJ����{lY=�>���0>=g�k�ĩ=�^<>�&�<W���,:;���=\� ���=��ut�� ���t>���=�+&>�s.�Ԩ=���<'=Z �<W�>ҹ���[6>���}�O<�I!=�ꎽ֢��cֽ��<���={u=�uǽ�gn�� !=��>���4��=j~���@�=ڠ�=gŽ���H���< �W=���=T�Hp�=ƒ:�Hdž>���=�m1��_ռd��Ӽ�=^�)>|��;WKh�2�'>V� ��5�=��W���=;L�^Q>�0>�b�=j��=�Sd�ڌ�<8N�=/d!=6m=��:q}v�R�3���=:���s�<,�m= >u-=�e�=F�=gb}>��������û�4�<h��<�x�l�������(=�W�f㶽� �=WP_=m��,���t��=<Y����J�ս�-(�e�(>����"�-��ir>^yD�H7�=,[���m� �v��� <�%=U�=c)>pk��)^�=����<*"0��_��oL���/�;�%���ʵ=W/��@D\<��J���ٻnۡ��m�;䓒�H��� ��D*=m(S���]�.A�<��޽yt�@Q����>�,��&�%�B�;�A�=�V�=,��f�+=\v<��*�Z,=7��=$�\=^ZE��KD�������=����gD�#�l=�'��( ��wE�mؽ��I.����Ҽ*:½��=L�9��Ծa�)>f�<�A2=򳕻�u|<G)�<��0>��><�>�WS)���ν\�>ӯ3=�� �Q�Q>��=DN!>䝱�����@�=�|>6���v�"꽇��8P7�<���=������f5�iȽ�}#>*�>f�S�V�G=��<� \�O^�����=[Q�=�[���ܽ����)�7Y>����CQh=],)>�Ps=��нq����Z��HlM��<�;�d�>��ռ�<�;b�6������?��F��++}���">5�'>�5g���y=�u��(����>siB>��;�T>>)���٬ܽ-�B>xS1>C�\�BCA�A��=�T��=1"��t����}�~Ҷ������m=�֐�>臼Q�L>E�˽�=^�&�ӹ%}����='�8>5� �5>6>��>�jO�*(9>�o=�/�;��U�9-�=���;jyH>"��<�g>y��=��{>u+ļ�!4=��Y�=~�q=>���K<�}��{�;�%��M=u����<��/:�=񊆾l��-d�>x�=���=r��=}E�=��>z�=�ʻ=�T=�!����}�et����J��.��[��$
��{���V�'�u�= }��̌>����l��=*͝�&B>��#�O-�=E�<�q�����"-�
O.>�W�<V��<~���!>Zf�=��}��Τ>�"���0>VJ�;��=x%�<^��=�=>|]>hh)�\�>������A<��Q<_1ս��T=SS��[X�>p��=�c���H<o�7>%Y>��>=�R;ˈ�=�N�=�%���;��DJ>`�Q=Z�ؼ��.;�R|� J"�e�>>s�;U���ۼ�<��Ž֌>�
>6[ֽj�m=�;�=���=ڰ�={��cý����֓�=����
>��>ߣF=� =�P�>͛���=�y��>�2������ =�)��Y=f>��ѽ��E=6>�o>)I<ogT>�c���1����=8�X=T�.>�E �92��e>���=>o��ŏ��W�=.�����=>n��>\�ý ��<� W>�҈=K�Ȼo�G>%��=[�>�� =���=2w>=7Yҽx�D>6<�^&>���= ���0 >m�:�k��[%;>Z��;8nн�L��3<�<Ҧ'�VFd=Y�s��_L>} ���s���}>�Q�����=Z��f=ڊ�=Dz��w��=4aU>�
;.��P6�=OYk��Q�=�� �%˃=��=RO�<n�k=ٻ/�� �=69�:�C�=eFX��p>(���r���
�2�':B�WӍ<m*>3�=Ш=꽵�$>y��>7=~����. �� ;G�˼���=����SMh�
����<u�<��(=��;�–Y��-�]m�=��v>E >o���u�<�I�=�y�= (�=ݲw=@=x���&>�؋�i >h�g�~�3�=]5ァj"=��>HX8��d>�}�<�轒s�g8���E���9��B��I�3�m=�tn�|ؽx�K�E!W<���=M-��d+;������=,�������&<;,Ƚ��=�ɖ=6S�>��Ž2�a=K���h�S=���� �>����m��ܼ��N���B=��6��7�=���=ת�=d��=mf�=X��=e&�<�:�����=�7l��Ae=�Y�=}]�=���= 1>��N�?�U=��9�4�6�%���<">�>=�=��=�:-�������<$��<�cǽ@�<1��=,�F���<��f>~W�='2=.�w���$<��� i��g(<� >�<ν�U�=��s�|U���7�=��p=����Ж>sz���A=F��=�k��Γ��ǻ����<!��;wj==1j�����|��>�����\q�L�=���=���=��>���=UoG=Օ>��>�l �Ž8>��=*|�=�*�=p������=5UٽBڸ����ZD�=0�>�=�vR><߭6>fDZ<�k�hc��C6�N۟���K��=�]���#>�h�= x޽@�(>.(�;���<Ljk�t)ӽXc<���D♼ ý-�e��d=�*g�i �rUx�3��p�cn>��;��=Q���=!q�=�61>dƍ�}���{�$�KS�=����Y'V>ܺн�1ƽ���>?�4�c*������t>��4<�о��<wŽ=��=��> =>�͂�U��=AP���>�=�K�%�ߊ���fI=q��=� �=�0����3�-��=�� �&�&>�}���=�荽�m����TB>&�6����<V�[=��@>/F-<X� ��i�=���= 2�=3� �]�=XԽ`X�=`_���>��=#X���VS�� @�Ҧ��n�5>Ş)��غ��G�=y0�=���=�L>�D�f�=�g)�C���f=]��=��>��9=�oڼ8U>�/ļ��#=|a>�d�=��t��=)=ҼE=6y!>IȀ=��2�Z<1)=4�W=5>��x���h����=�p��sн��������d�la�;�ν��g=��>}��=��L>gc�����ˬ>�0>�ч<�ך<�!��j<���=�W�=�R
=��AP�<���={$ҹ��:��9�*>��D��a=���<84��h����=�@>��'��v����K=�Y۽��Z�q2b�/>i<��#=�E�<$&<�ҷ��J ��q�=aB>İ�����=^���o�fA�=������'��ȟ�8��=�3�:�#<����uJ>#8�;�D˽/�<L�T=]WH=e88>������/���pѽSy`�,�u=����b�>1Ex>��i��w>?��=������8=|T��.��
K>^.�=�3= ʦ<���������=���=�v<�Թ��E�=H;�����=hv����n���#U���h>>4���\2>N��<��=/ͼ5]m=��>Oj^;ax>e�"=��������=>��1=���;j�*���<O�C<��=��<&h�=�(?�+��A>��r=�8 >d~���\�>Xi�;��*=3�u��jԽ����(m+���>ԑ��p'Y>�dܽ���=�����Ol=|�v<�� ��૽�V�=�M���֘�ˮ[�'&9=�h�� �c� ���n��]%=Ƌ�='�f���=>�w��s�Z>��A�]��<���5�>>ɀ�[������(�����Լ;佽�[<)����H�2a��lR���u�6b4>یg�\�D<Gl��÷�= Ym=�SP�x=]�MH>Ϻ�= �Q<�YB�VX >N���Ȯw=N@����#>�nL>�">/d¼�1��PL�2-��� >��#�)��=Z������d����=C��=��=�'>*�ؼ5 �=��8��/�=T|;�Ҡ��Ђ=��J�\�6�?D�={J>2U���׵�_�2>���;JE<<A�g��<wt��ͫ>���=�z =�!�<�\(>�K�<��{����.�P�=L����[b���E>m�q�].>�Gҽм�=�BE�)9����8>NX�=z���F��D���Z�=��(>��<=ܓ�=v���%��;��^=a ����0����=�� >tR$<:�+=�t=��<1'E>R�j���=�1:��Ǽ}z����=Ъ�����>�gb�9��{Q%>�x�=�0�=�T������t ���7>��=�3�=T�d>+�=9�=�-9������됽�����>�ս�>�k)<�%��tY^=e��<+絽o��=f��<�G��#,=�н<�z#���=� �=� +���=��>����%����Э�IaV=,�ν�_�=`�%=���g(<u�t<|>>�v��t���WA>���=�<�=8�z���=J]�]����>:j>4��<����+>��Ͻ��>��>���=\�=J4�=��=�����ad�=���}��|�+�P�x9#>l�3>{���'���䵠���=Ks���w6��%���M/��s|������V%���v>�p&>��2����
���l7���_��V����9>����/>��KE�=}�9dY=)�a>6�ý7S`=S7h�u�A��,�=h�;,����ڻI�����C<JH0>�[Ƹ��[�01�Q>z n�p��_%�=��=�a�=�w���d>��:�^����P�<�(��T��=������=��<��:�;�<�������=���=}�f�1�����>���=�ۀ�Bk�tSF�Z��l��=�v<�m�=?I�=o'D����r~�=.t=��=IF<��7����;��5�O��?���۽��=�����W=_�2�`ˢ��+\�J�"�l<7�K��HK��j�����=�/Z=9���q�ܠ�{�W�Y��x��� ���%�4��=�6�<��x�A����<A�+��=��Q>m���������ռ���=��>Ŕ_��M"=�g=�ڤ<ƽ������p��=1gݽ�ߞ=�z��ʡ��z������<�ۜ=���=�飼�%=wo=SIo�;��=�z2���G<���x��<��ֽ�C�<�@弲+8�pp�=82>L��������<�q�<���=�& ��V����1� ��Z[�=�Z���r���ݼ�-��Z=㮢��/���X>�W=]�=�*�?1>�.(<����_>n���D�=NVZ=EV��e�V�^{���:����<P��=z�=0�>���<n�;����=��1z=���< ��=� #>��M= �ڽ��#�kV �nCC>M*�=)ҽy� >z{ >M����.<��K��<�U=���=�r�X>������<Ĵq<�7> =�<A�Q�[�x=�C[=1J�=�E:>�K�<#|�<�ϸ��G}<�����nB�=��G>�PA= �
<��=o��=�"=o��x�������\=��;�=*k���qA�`v�==�ʼϣy������ѷ=�����j�����<xǢ<`<,>^�~<T�!=޻�
�>����s��X��%�J��nI�N�������S��H��=����ڄ�<�7��Ђ>W�={��[<{+d=_>�=k4��F+��^; ���@��cd�����%�b=�sB�m �]�ƽ�缈愼��<p��=[��<t��kj �<�<E# >���<�%&>�tp���1=W;�c��=>����sE=Ґl=+��<^���)E= -��)�L3=� #=�v轂���q�=,��=s�f�|<G7�<�U>� �=��>������5ɼz��O2۽%��u��=��?>e�����<��A<����.Q���5=F�6>p߄=S�8=l�$���<O����)+>!a���<2�G��V�=���3��� �~=��2>QI�=�U��I2�L>|�"��X#=�>�}�̿�=J�潆L=���޻��3���=���ch ��8���c����=���=p@=�-`� !�<Z-���D���˽ydf��l�9�lN=ܷ�=�Y�<O&u���<ŵ�=� ���>���=���=��>�…�x�S=�yv�3�= |ͽ-�I�h�L�`�=qNO�6g>;�5�?�c]3�7�z�"��;�1R�����5\=�b.=�7����O>�!���V����=��8��8>�{�`*D>��=��z=|K#=�n,�k�#�齡U>^4->p�����<�H1=�R�=�4��M��<�F�=�y>���=�� ���>�e��<V��=0l���w�: w
=�ڊ�v��<V?ڽ�@>�@@=���=L�>���}���Q ��x�=ޱ��2,<Nj��V��> =��[<XLO>ӹK��r[��>����BW�3u�����=�q�=|H�x�7>�����x��!»��^>"�<���=k��<ոH��S�.����٣=,+��������:�)q��扽d�����<h��:"ŭ<��ֽ��#�i�S�
s">�Y�.���$�B��?=&k=ԛ�=;;^���#=(�=�$��㼫��d��� >���<Q�>8ñ����=���=z�~����=+��<х >}��=@>���tq<��<�ҡ=�X���I�=��=��> w�/�-��,>~n�f�)<j�=�R�k����P���Ἐ ݽ�ҵ=;{>o��=M ���V�x���ؽ�P�T�)=���~p��Z�=~��:��=�NF<�]��ȋ=�u6�tp��߉= l>���=htR�]U�<՜{�Xoн%%�=�Q�F=����4>�&>�F����;��\>&��=��=֟��NPU���a>n�ڽ�Tm�t�>]���D�M>����vϽ&Z�����6��=�]�=��=�s@=A꽐�@���%=�;ֻ\��=G+>������;>����2n���xA���/��+=5>�\�H���>4#>=[�~���_=�>��y8���l>e�"�O��<���=��Ƚ'O�='���aiP�ֳ�<����A���lv���%/>�&d��į=��}=�.=9J��)iu�67y�U�E>��c����=5�g=W��:��<H�-=������=��L>�p���0>[�<��!>�7�=Sp+=�%y=�݃=U7�<[�>A�-=�������0��멍�8$�=eL �i���h�= (�=]��=L��]A��5u�=���=e�0>;� =��>��Y=@
�=���=��C>؎��\<���=���PK;��=O���B=���=E�#=,G>�n�a@�<�6���r>w��=��;C��<;|U�������J���{�=V��Id=�M��BJ��֪�b~>��^�ڶ~=��� b��!��p�`�j΂��ɽ=�>�u?=�T�<<��O@�����;�9�=|m�=�!���ݽSَ�n9�UN��%����z���'=y.��{����=�v,�y�;��=�V=]㮼ʔ����1H�="�����=�5Ľߞ=$+<-#W=�S�L�ȼ� v=���J��=b��>��(>�?�=M��=����- X��2=�ʧ�fՠ;kLj���=��>� �0=5Lý���==Z��r�=&�=v��=\�=1� >�<"r����=�y��jV��(c˽4��=�`>��N�E6<^��=�O�و�S��7��= ��=E�=;N���~��Y��<���>ǃ<(*�<����= v>�z��b�o� �_>�]��!�����!>��/��"�r^>PS�=U�=
�'�0,#>�Л���0����<%ʿ=D�d<"���p��=��S�4.��������=S��<����>��yF��aJ*=Y�#>cى�9eڼ�[ݽ�۫=^'?��½r0��=�>g��f/��"��<kP�<�D ���>�E]�@�X�ܫ�� >+��<E�I=�뒽�F�=�r�=��=4�=�b�=�-q=�6Z�<a�=O�g�;��=�'ʼ�o��+�_>E+��3̸�� ż#^)�u�=�Q;�_��<���� �@��Ә=�v=���V�=ٍ�=�x���G>*Q���녾tL>En�=���= 3�������>��8>׊�������T=Y�b�c�=�t.��#=~=�4���o=�q=ĉ��:���i���>�$����=�^s=$�l�Z� >|�<����k�9o(�=���=>�<������^> S�����=Fߞ=��ν_N9����=�]̼����� 4>�U8>�7ͼ14L�y8>�4[�&Ѐ�.��^�JEW=��J<�@ �'Z���;��N�� ���Ѽ[y >� �=:�=�<�qj=�O��P���fm��`>�-J����=�3=E��5|��� <����<1�;�Z< �c�}�2�]r>���E >q|��Z#P�}ġ��a= a[�+-ҽ�K�J+ν��<<��<�?@>�!Y�&��;d��=<��=o��=q�?>:h�����;RU�=t=W�F=�U>=�m�<-6����<�j�<�]��;i><���X٢=(`�>@(��B�C=���o�Y�F����`>��j>&��=�)u���:��.��I>K��: ��# ܼ%׫�ݾ�=�E>�b=>Q> V�����(D��8��<Ow�<����W��=�����f>��D����T������%>��<�T#���l=
�>K@@�-׽~ǯ>���͑=#�W�/0=&���>p�t=� �=c�R>ܚ
�ü�=t5�=59>ac>�3�� �k�tb��������<R�=�Q);�
��!�=2ּ�'>W���� )���%��3���I;=�Ӟ=��>C}��ʗ>��Q>$Q���QW>�k>��>>L�����Z����=G�:���?�>@�P�-�D�O�ھ���<%��;x���P�zc
���y<�ʋ��YO>z������]LT>���;����L��=��;�}������=*>ОO=�]C>5�=������!�|�s���<x���k>�M��">�N=gw��F`<�y7= >ÄJ��)o>�&��se=�=�c�u{=�����&�;g���E�Y9>���;0�X=�J����>�'�H�����>���> �>F+�)��M��ڧ�������<�J��"C>������9�5�< �����Ϡ�o�=���q�ټf�=�,O>�޽+��>�g�=.#+�T[Q;�ƽ4��
���}¾l>�=��;=}>�*#�6^p=&�+��=6<<ӫ�w��bC��P�9������{��+�=J5���=*=��`>�\�=��X�| =͹L����<j���hཌྷ�d��ԥ��-\="�!�������O�Or��i�"��e`���0>Ks�;&c����%>���=��r>�s��܊�=Y/�=��>�x������n>�TK�3��=L
�<�-���̸=���A��\��I��=[=>��=���<�L̽%>k��=���CN���콌z�=�s>��<>V��=���tzz=0Q�������4�2>>D6����=������=��U;W���uf$�/C�=� =iW�=�����{½�_ʼ��P���=��0>��b��K=�=���=S��� 闼���=SH�1�=����F��=� ��`3ѽ�2i<-"�=f�5��%.=�z�<FV>�x�� 3��S��=>�=�=cd��;��k���&=�� ��e������ϸ��h"�<��6=�[�P�t=���=�J*=�>�?��UT�Q�A��*#>t8+��4����=֯�T䙽  �+���0� =ԓ&<��S�� ��dh�=Tު�����3D=p;>&���K>
d���ݝ<��P=6 =��|�����l�>s\F��p�=� �=��=�΃=����kF��Q�=��,>1f��1�O����>�k.�'B溭[�����>y��@�=� ��2�޽�%�=}��;G��=Ç>�����>#���x=g�O>O|��G=�$�<�j,=v���찿=��'>��&>Z'Ľ"pI=�t��p$>;͔���wv=5�= 9����)�>�?�=�����齜bi=��=��=� ��P�B�_�'�ٔ���6>ez~=S�S�H��=)+\�Rkt=��$=8с=Y���٩�=5�.���j� ?M�I����j=�V�=�}E�o=x�ɺ�L;� �oͳ<� \�C�>��I�;L�D>���=��Z>����EԽz�8�7#>�y>�I&�J�>�.�Y2W=$���ɛ=� �S]�+=j �; Y��w��Rpw>֥=���>�}�=G��<�cϽ��߽V�=�~�K���^!�=a-�=�C�<�Ï=�A�=�n\��F.�T���/�^��+Z�0��&�>�\Z��%���>����b�;~u��f��.�`���t���ق����<B@[�� �=���<㪽��$>h�=0_��,;�<� �oۼ������=��u=��e�B|����k>�J���>!��=0���_ڒ=0�4��c>��K���>Q�D�]�w�} >�!�=8����}g��0<�5�R=O�s��z�=Ԧ����$>��䞀�4'�=+�Y<\����>���\�=���T�>��<�b��>K�=)��;�Mt=1q>�;��Z����;ٸ=��+� �{�.��=(T,�� ����A�½^0��O�o�Q�>�z����W`>d �<<_�����m��<����jjw=}�½��y���;B��=�.+<�����D#<�̬�3���o=<H�= �=��ཬ����4��|�M>Q�y=�GB=ѧ��Q�s�yt ��e����ŝb�鿖����=+��;g
�3�=�;���۽��:�Vt�=(PD>}�_������]o>nC!��j�� �=.s �M� ���L=Ʋ=stʽ���.yr��́��B=˚���6���\ͼ�����o7>y���rHw�%�O�7���X�L<t)l��t�������_�=M7���=>%�t�`b9�-�/�~ֽ>��<w ��"�����<=���(��<]�6>��1��kd=\��=S��������4s�=⦟=<�Ҽ�ֽ$�o�k�F��c��@a> �"��,��ʵy="�½T���*==z�9<�״��n<i9��w ����= �>(��=�� >|/b�,�=�ֽES�<�%�A`h>H�%>�N�=��j�st=�=�[��=�R=}->^�K�B��=_.ڽ��f=%%u>��;u���#K��`&n> mB��;>~�f���>�*��1���3ļ�T��s�w=��>��>'섽�耽1o[>&V��v��=��(�Fc�
��ҋ��%�p���<�ʼ�R=��M>(���rٽ_�x� E�=)��=2�z>����w=��=h!Y>եt=��>�R��t�>�r=���=9K'��&�� ��=>a��[E�=�� ����,�� y�=}=0���5*6>o�0�N�>���=N}��hsS=�=>�m$<��=\��=�q=G��<��r>RRk���:���\����=l�>;a���$+�87)>��c>n>��y�ٹ�=O��=R�m��=��.�=6 P�2�:>��<���׽"�l�)��<�=�oý)?=�X�$=j�[��Ls�bL�ֲ�=��g��J˼Z� >��i=���=oŽ��%U<''�=��=��3>�Έ�Ԑӽ� =� ��?,�=A<N�ܼ���=~�>"�ܽ�l>R\���>�+3< �/�;��=��>26>d>�=��M����K�8>���=�X7=� z=��3>���=�Rk����S{G�����C\=P���2�=&ؑ=�{�:#:����=/��<Ȗ!<���FO����=SW�=� �Ɛ'�Vzh���`��8�=q��=�W��O>-(>�*�;��e;[���z��U��;Еu��ن>=���<�Z=Obe�I���=��=���Bb�<� �=�X<>��=��1�r&�=;}7>(��=�'>�n�=��*���Z=�$��o���ڼ=��=� >����Ì�;��d5>G/^���<�i&=��Ƚ�h<�+Q=�`��2!>�����z��x��2>���]-����<��˽䵇<Uy�=��=��M>V��=q S���>K�>=% ��s�����<�G ��^<����=����]ټISν��=��!�3��=�D�=�q��_��<���=u��<�(�<�_���Տ=f��+<���J��=_V �-��=~Y�<ù�e�>�׽{(��
o����<r1>2>�mӼ�1��ۺ�<`Z�=U��1�9>��{=�b���0�2� >�+=; (>�y�;�>M �=2��=�)>{u�=�ԣ�� �(Q��Hܽ�:���H����=4S���,�Ni=y��<"K:S��s���f�J�@�:>!@�<2?=�ɼ{o��>ȨT=�̢= 0�>d����,�S� =���<�!=�&�#�Z�=��=��=�1ʽ (:>8�D=�y���ٺˢ<h�0�(��h�>.�9��n�� ߺ���>?�¼.ϕ<=��=>f⽧Sj�_[�>���=� =�ῼ��="���+���'���1>'���H
E�����=ƽEe��|��<���==]���I ��� =���=�m=![q="@`>#88�
g��*k=����t��0�( >>��=qw�=m��= ��F=o�&>1˩:P�۽ �� ���[n�=}X,=2Y�>�1 ����<Q����^�<����.��=������;>�ʊ����=,��=N����;=;�=h�u�`�B�Ē�����<��g�~y:>nI��ID�8v=5C>�a|��!>Ί�<���=�ٍ�1�M=g?J>䕻#N�;�l+>��=��<.�˽ya=]��=��.=��T<D%
=�x�������=0�=��$�Z{$>�&�?��=BoڻR+���>��2��?%��'�<X"S=���=�� �gN*>�R�=~��=�S�����=�Z\� ��=96%=�3���P�9�<���=(e%=r^�=+���Ī >�L��(o��i�<�6>���$;�KPм��=BٽX6=:&
<���:���=M$�� "���=O������=$.Ӽ����i�5�<a e��㺼�������<_'~���<�4ͼ������>�=���;ˡ7=�>K?
�~L~��,�=��_=u �<5����R�=��=>��W��=�ë���T�̢>���;zL�1h+>4�D�Л�<���=��=�"��U�=C�<�ܰ��v���<�-=��%�hB_=�ʂ��'=]�>�/Ž �⽃�����#�֤�7��"������<2H-�)��*��B-network_body.linear_encoder.seq_layers.2.biasJ��s?:�\�;]�<���< .=��^;��z��>�<���<��C<�3�<�^z;�v�<���<���;��_�<�F;ە�<�S�<' =��=�-ƻ�
�<B"=Av��e��;�p�<_�6�o����<u+<�ç:KӋ<���<9V�<�=fl;<�]�<9$�<���<��<�ߓ<nMZ<��P7�ȻB�-<�ř;K�=%� =U�V;��)< ��<���;H��<��;�&8=�%�<�Y?<&8�<�$#=�{�;���<e�=�{�<k=o�;� =�b�<�ˁ<�_�<u��+��<���<��<���<�a<��i<��:=Dκ���;�ǻ<&��`��<�B&�3/�<���C?=ms�<�q=y+;M` =�^�;S�w;�R�<?�\<�N�<���<\�=���<�a�<�=�<��<2��<o�=�;�u�;�L<Ѷ�<0̂<��/;R��<9�=�X�<OW�<�k<���<C�<u�=�Q<Jب<�<Pb�<8_c;�S*<s��;R��<�~<0�<*����B/network_body.linear_encoder.seq_layers.2.weightJ�����ݣ��+���m��Z住�>���<�� >�-�=1�%�rV@���>�� �!�<��6���3<9{=-��]���ʻ�M�</*���
=I�=4ˋ>Y �<&�=ڝN��!�=�4=@��;)'=��O=~zN=��1��Wj���=���<,�����z�<y���:���a�<@��;��<)�=��=�O#�2@"�V#ϼ����k�|<L"�<֡���Ƚ×<C��$��=��S=��=qڬ=�r潖�;��<2NH=RE="���m&�������p>�ܸ=fO3=�F�=>ʁ�=?���,�=O�мK1>��?����<d�9�nU;��ʽ�:����=�XL;]K�=›�=�-z=&�5���}=`񱽙��<:o�<���=Lk >��|�ѽ;�|����tü.�d=���(�:�B��u[��ش�d�<�Pi�����û�tݏ=���T��=��Ƽ�³��Q�-��
� =�'h=�ެ=i�*=�R
��K!>�4&=X��g�<��J�P>C�^�BQ>��`�i��V����
�Wg���7�|������=��l� ���w=!B=X�o=�h*�&�ƻG�f=�E,��ϐ;E�E�ݠ�=�����h�<��:�(�=�H�= �ʽ�/��V���J��E< �v�ƹ7=K1�<��>�ܽ:c�=reR��"j�Ԉ������q��=��O>��ԽE��<��7=��<j=&��Z�<)�׽��5=��!>u��=l�\��n���i�?��="GO��=_]���bN�m�e����}<5�S�ޞ=�)���ҽ�>>A���>�Ҽo�O��6>����@@���.:z9(<�S��\���^<k �=���<o?�=qS>$y�3�E�P���<���c��C�����<d��M=-�=l#8=-�<��>=2;U� �����R>��2��2~=�$�=�t>��s=ߢR���=� >>H�<��<��ڼ����>qk뻭g���U�=��ҽ��S>����Z����=��N>��a<e��;��$�\��c[���2=�=�S,��YҼ$d4=�������=��%=d�>6.m�6{z��=V��=��G�,}�P��=���Eצ=�8�<(�׽5����H>|��=�V�;S��)� >�E=�ׁ�Z�(>NA���WM=�i�= � �X�ʼ�]\<� j�{�=� ��<�D�3=����v=p�=�A�<�E�=�+��޽V���QٽgoC=�1��qw��N[<]?���<q5�=:r�%>��ۼta�=�:s>[��=r�����]�~���́���<=f�ּ55н��::L(��t��wv>>�.I=R4�< ߹9L��Fн��H>$�����<|�>[1=��w���彘_�� 钽�����5>�c�=7!��T����[=�0������=�c>�Y�<�™=B?߽��4<��[�d� �R���ֈ��BҦ<�>���=M;n�ԽkQĽ~��<�'�Y�$��{�^Ş=������e=�jZ=o��=Y�2���=�aٽ���s�8>[�/�x��=rR����=CD�t>���,:>_,���~���&>��>��=]�>�Թ=QB�;��q�!ȭ=ׄO�t�L>a��Wz����)='D9>B���y�����k������R;=�Eq���>��&=��=�f,=4�p3����=�m��/!>%�_��y�=� ?�,��;�p >����{�7�L7�=�=�';Z�ý�����=P@>= ��<:ξ=�e�=�v^>0О<�/�=#�z ->Q��=��e�C����=�ɽ`�'>e+>9ϵ=�,�����=���<$�:���=a&>l �=����c��� ����k_m�L���� ݽE_���\=�|�=��|�=�=����_\=�.0>@I<-;>�~�\y�=��=6C�<�W��0zz��\��
�����l9��@%����=)U�=LG�;D�=�T���'��jxO;���
���ԯ-�#"A�<\w���D��g=*�>-C���=6u�(?V����=H%齛y�������-���=�Й= �Y=�_=_<���@=6a�����=������3��@��"���i>p}�<<#�)M�N���]�o�4h'9�ʽ�g�ϼU{_=6}�;dk}=�I�=�g�<j�>�g��,������<������mն�-0�=�y�<����*r�hXμ���<��3�ʽ�_�=j����ؼ���=`n<��=�:���?<�*���Бp���Ἦ�>/�I=��=�
��U��y�@�=���J��u��<��>�=����=��C=c\e�/#���6 ��l>��]�Lv���m�=�><"ݽ��༿��=w�)>�>�h�=�a>K%�q�o=b!>��
�3J9='н,t={߽93�:^�=��2;~q�|K<[U>��U=��Q���*���&����=}3�=�8�7!Z��5��=Ġ���J��R=��3�>]ք�*��=N7f��^�=���Í=ZFi>���_��=6�p=�|<�σ�P���hU�=<� >L�J=�+��A1 =�/ٽ����z~������ф�=���=��~Ӑ<�KH��;I�Ѧ=�@�=�������=@�h�J=�%�;H� =~��=�L�=��=钭�ƂY�)�"�E=*���F�h+g���)>�X�=�T����=��/=�^=6�>ܑ��$)���a���E�!��<�н�=2y��;Ľ�@���iS�iP<~�^<B�=������g��=��l;��%��=�v����/==5>�}�.�u�4P����=�g�=��<�ȕ<݅�� 7�V���D/i�Kl&�y�@=bWS�|r>� s=�����
���v���(��� ��"���=a=,ܤ�1��|{<�� ��[=�wt�0w��2OѼ�;���J�<[�'='_)>�N��?��<�@>zT�=˭��*׽���g�=_n�=s���N��j���m���=�ނ=z��<7��%��Ծ�=q}�jG�=[t�=v�> y��\���O���R
�<��,>O�����ٽa|��&�d�=�Q��"�=�y彛�ܻr+���r�=������=dj���=z��=7��=�� �Ա4��0<�^i���%<e⽡�F�M\��HΘ=�Ͱ:<K�:�׈�S�=�8<&�����������+M��D">�m�1����R;���ܽ��z=�1��ļ�G'��ؼ�H�B�8,�$���G9��<�_˽+, ����xw��gi��&��<�i�>�O�=�ゼ�d���7>h�;̇A=��=���:=p��h=�=�A,>+k<:�#=� 9���>9�Ƚ&ZD�:5�=�����>�$����k>0�=6=�����='AY�"dG=�@ �O��j�G��_I���'��S:�#䆽Պ/<�%=�_2= G6�j�ǽ��;>y|��>v뻡o7=�=� �=�4���������FC>7�Ͻ<JW<�X(�D��=���=��B=�5.���>Ԥ >ղ��dE����w=njE=f�R>l�׽�'=�4&=Mj��`_7��J��n���V��'�<�[�8���'��i��}��2
��~ =�Vb=��!>X4�;��n=!�&��\��u���2�>�^= ׽�x��c;r��\�p �=��`<:@�:��=���=��=��D<a���� �7U�=��<L��Ej�~D�=���<g�>����0���>7N��{@>�@��ߡ��`�=5�>}�Q�xC-��sr���=E3��%�=�^�;�6c���#<^� >��8��ަ=�n��ouԽ�D
�z~> �z}�<7��<x����t3����=��=M�F���
>0�3<5��>Xe���?��u�<)��<װ�<,�S�><�B>���<7� �)9����;��\=짭<گ>{a�=*ȣ��i4>\�q�չ?�(��=�v|�B=�=*۽�LN>l5
��s�o-���a��^z�#���2�=9ٚ=�jJ�(�H>�o+=�j����<@��|)����=m{K�|�}<������нK�=&F�<��*� >���=V
>Y@��`zK<��½tż=( �:#x���K�;˚��◝�.�=T��>T>��D>��=�����S�<�ڥ=��!>��> ��<�2X����;8��=X�Y�&� >{�=�����=��<�i�=�[ ���=x8�:e��=I< �#�󾼏� >.�=���<�.=�.5���=x�q� XŽ�w>���w�8Q�=��� ��=ٝ��d�
�c4!�}���EH=�X�=�&>G� =Iy�=�ļ��>�-��M��pk�=
k�<�N_��섽@��l��=���0�>���>�:+>� ������N>ha�<�k0��;o=���^��� �>5i�=� �>��� ��=�u$�ɏ=��޻�t˽g�(>`��=�!F=.�=�V�� ����=�c5�w�F>����ً�v+����i��F=�#p�Tp���m���i��Qv�;����vN�=,� ���(<� >!b[�~˅����=d��<�n�~�=�*(>IԹ=�� =(S>\� =Z�U=#R�=�C>k8����#��-�=C��<�������=�*=�t��s�=b��<��)�ľ
>�� =T��=ם6��:=F:%>��q= c=��D�@���u>}� >��'>�a2�x�D�y��=���;���j�<{<>p��=��=���ʹ/��0�=�GM�(����S�T��;���2�B��~�|����y=�\K�&�y=���=b c� �R=?�D�����p��<�>&tɽG-�=��<��u=b\��l������A<J�����<B���=�E�<>�Y�w���� >�n�=:>s
=�M�ʚ<�S>gUĽ��=┍�hq��c�4��[�=��;�&���"V=y�=�6C��M>����TlO����=&3u��Z��j!��B�g����a��=#�R�����I������=|�ἆ֧;M渽�0�=wiͽ�g`�N��<�r=!��<�J̽�M-�N�=�� =�Π�J�f��������;���<=���fh=L���q�Y��}($=�b�����= {��UX���I��E�<p��<R�� �=%$S=�Ic���ݻ��#� ��<Ŋ=�d�=.B�=`�:�Z�=U��b4��A=C�2=ۜ)�Ԥ߼��$�/�1=5��;4���ȷ�;3O�a[һ�,�=��>+H�h�D�����}�=�j��i����-��o=J��=����#�+�j>8 z=�0>o��,+H��t��Xt;>p��Y�<�0[;���=^�̽kB>^��=��;>�K�K��B�=�D�=�O�=TD��L����:�;ͻ�<k=a�K>N� �`���4ܼ"�ռ����t�=�[�h�d<a<ὲm!��@<Iݼ�'?�U�Y�ECM��ž����; vM=զd���|>0=�|��v=�p�;�+'�� >O^��S��Y��X�4>�����=�<M���q���Z?>�5�=?�սv�=ȼڽ�v�=H�]��Ǝ���=�zz=����%��ς>1/>���5���@�����۴��B=�=��W>�\�<ιc=�3Y=XVn���#����=w �<1�=�L,>�w]= �p<�w�=�m> % =���=P/d�t,=C=<,
�=��ƼC�<��;��$=Մ����󒶼�,X�|��Rab;�i����֗>����;j=%�=�w��=������;��=)Ľnd=�2��[>F��< Od<�S�~�U�@_�=a�$�B�(=�1���f�U��=�����#h=+c�<�c=Ԉc=iQ��G�=,�:=�� =��i�HV=ڐ=�ӽ���=�.�����=ym��B���փ�������o��<r��=E���p4���i>E���p�q=�8�%��<#�=F=��r*>�s��d�_� ���!^K�{��=E��<����<�=�|Z<.,<3�������5����<Ix�=�sg��@�����<F;�<>_ �m@=�����z�w������.�n���>�S�<]�^�}=�(=Y�_>�����νГ�=��=��(�����M�ݽ7p���j=b@���O����<B���t�,R�=��ϻ��x=�
��o)>��Q�� W��H>�k=��8=�y�ǝ׽��H>��=ld���e�_�޽Z���r�=1���H��"{�=�"���/>�8>����<p#�3�E�2����5>&7 =��=�����{F=��:���='�ѼK�/��{�=�'�,���1c <聂����;�m�vg�=��U<���=_��=��5��k=>��ý���@��=?�>��=�"1��>��9�� �0W��o���o;<ģG=����U�����=2�V=��D>�9�=wӈ>!V=$s=�t>�d���=G����=/R�L�>>х>�[w=Ko�<�qf���>�C��^/���0�=e�}�
Վ<膣;W�½N�A<���=n���m^�=M%�<Lx =��Խ(��=�7�=��=yA&���o=�v�J�=Xl�=t{�
0&=.�=[��=K=��ƽ�ƾ��-�����S<��0>��;G�x=$
ڽɧ5�����n����:>S#�f2 �|��=��[����o�p>W��=Z4���̘�x�=*K)�Rع; L/<J���O:��CM�Wl�<�V}>�����伈
i��Zս���=U�1�=CJ��*G>���=���= yջS��<&3ʽsw>_f�>�Y�<�t&�΄9>xY>rH>�O�ʳ�;�[e>�ہ<�I�| ��W�F=c]�=y����h�<'bj=C=�<\�=ׁT�-�����;e��=��>}G�=���<&���5�>��νhmI>a� �:���R�<�߭��%�����=1)��0`4���:��?ؼ���6X���m>��m����<ȯI=��P=��S=_K��Q?&���=��E������ ��'=��;>�5�=�fB=F�;l�5>��>�Y,>��h� y�<�@p����=�^.<u52��<�<Λ�*h.>a5�= <=��@=�[=�� ����֡+>+#;>����=j��� ��=�8=a̡�"[ܼ��.�����N]>qؽ,q>����Q<�ѫ=X�B�TY����L=�>����޽���<����[>Z{ѽ2����>��a��瞽��8>�>J�>}��;�\u��Q�>_½��x>�5{�6Y�=-$�=�Â<���=A1^<>c�<w�߽~��b�Q=���<�=�G�����<�<�a{9L�u>0�"�frн����xJ/> �>��Җ=���<���=Zܪ=V�;Iy�����9�X�=�� ��A> J�U7��]�<x悼n��<��8>�?#�Gz��|Q��"�=�W��y�=kz��SH<���<��:~[�9(��;���Q l>@�=�a�;��8����=��&>P�[��'�o��=_���Z>�a�=�*p=�/�<Q��v>�I2�����Ҋ��<o<��Ӽ�=�z�<�-Ͻ�3��Tʼ�S���oƽ)�=8�[=��=Oq>��BD�m=�<�^o����<̊&>C��=հ1�`) �4~i=�Zs=�����;��n;#�e������b�������>��F��$5=�l^���U=Nĩ��bp�6�[>j�1�R�u=�J�<���<��x=�g�=\9r=��=-
h=*�>4��=�~�����������i;��R<>�%�������P�L��=8����ȟ��U�<��c>p䑽j1��L@=Ђ>��X��V�=�q>O��7=O��"<@���%9���a ��-[>�a�=��<��<�ι=��7:Z���l����>ʪ˽�͉�i/L�*u�=ߧ��*d=88>�;ތ�=�B=C�ʽ}Խ�Ƭ=Xd��SI���=2έ�I�=�=|��=� �=>n$o>5Gu<�l�<(��;z�d=E;:>DnN�s{��:�μ�AU�񬉽Z)��ݔl�XI�=�J���LǼ�L�=@`�ƀ<:xA:;�E>������
�y^=���:̓� Q�<m��<qN�=����.Z=!� ��co=_f��%V���ƽ���</Ժ$A���2
��{��E��=�5�=�S��O��=+�>�<�=8�=�v(<� B�"8+=� ����㩸=*"μ*qT���A<�[O> ������=��3>,M�ׄ�� ��;�A�=�~<SP<��=$�J;����[>����H=����l
���qY�LL9=�e=f�f�����?��f���Ì�=��1�-Y|=6= >�©�z�=���=ٽ�#>�!�Gpּ�g�;�Z�=ؾH<Rq�=�/>+sH���$�T�����+����=l�ڽ4�0=n� �� �rD��d�����=��[=ե)�G�ĽN�/=� ���W�=�=���<�u�#�R<�q���y���v>o������q#>���=l�����<�84>�N�=;9���qؼ�6=1����R�<��L<y�ͽ������sG,=/CL<:�=c����Z�T��!A=�&5��'��2�<��<C�vuX��,ٽ8�=������VK��3R�!� =
e�����=Ã�=󠼔�B�E���L햻W�н��9��⁽H�ý�޶��H-�� -=BfB>Ye�=�eb<�Q�<Ӂ>�����j��a=vsj���<�#3>y��=�*���,=����.Y����=4*&�'U�+�Ϭ�<|6ý����&|>�'=9�<�[6��,�fI�<���=���;}F�Y%�#�<��9�ȧ�<��<ڈ;��(ؼa.A�Λf=|D��==/
�= ���m�>�5A��fェ�J<<�컎ce>�>����9��?�nd�=��)>�yV>��༠�ʽP\�=6T�=v��=P�ּ���=��*<ꢗ<���ð<q��;�b�<Pn]=5��;�i�<���� ��>�g�=%���:�� ��l���j�����5��Ȍ<��8�0mf�g&�=Fb>�u����N<2y<D�E�����1!�>��=�_���.��ݨ<b%>��<7`(��KK�%>s��=6�;> ۷��Õ��r=ۃ
�q��=�T��1Q׽̏r�
���ϼ_f�>jG>��ɼ��;�]�;��/�<��b��=vڤ=�ݎ�����*������<]��<k�q=��'=x���M11>]������=w4f>vD�R��=�*�YaĻ�,W�Sq�:���*'�=m�=�,>�H�={; ��i>̰>��6>�2ɽ�F,����%��>�02>ޕܽrJ��!vѽ�6?�@�<� =B1>-� ��=δ=>N�=�qx=(B��2�m<��>Ni潄���L��[�Ǽ�l=w��=�%O�#G>\xz=\�<P�Լh�=Tt>��s>ѿ�=����7�>�/�1x:=��V��;)>��<=u�6�=>�%>��&=��;��[=݁��<�#�=�窼������=�ݮ<��a�|�@=\KO>p���!C ��2�=_>�g$�����݈=� =�P���$���LŽ8�u>y� ��½���Z�=�?�U���m�=f�<��"=��>W.��cӽh1_>�Լ�j>���<&�Z> ����k=�Bx>߷��W��W��>���=��� W�=P�=ua���<£��oC"���=?@���޽5���B��=c�s���ý�=�_>��f<-C&=n5�=C�,�ڑ���oO=���Pw�<��v�q���B��]�w=��B>D >�X8:��)�T��=���<�o-<�o�<p�^>L�x��~�=�z_����A����*�����U�<w��껁��=�
�WR�<��V������+>>B�=<R�= ��=�=5mh>���;5�<K�����='����TE>�=N�����2%���>��a>8��)�6�$�^�����!=�U}�:�¼�
�=JL:�1<sJ��P�=��"=]N�=�=۽���>N?I���>S�e��xB��9нxs����軝��;��D�?��=唽�Kӽ3D�=]�=5�>Z�'��R<�a�=u�M���˽:@�=Uݖ=��0>=Mf=�je> �>�w>���=6��;�н���;���Ժ�=q��2i�Gډ� �!>���8� >��<��=�Ye����:}��eZ>���;~/7�~�<^�t���`��U�=��>�6��?->g�\�~�)-�����9��?>|Ǖ���=�: >��ý3�^=�Q>rk
>B�����f� >��=����qT�=�"7�v)�=벽=��ѻ�ڽ=pZ��)�>�n���F=W�#=�>�<�{���h���d= i�� Am��Pg<�_ʼ�NX��V4���=1�ʽח�=��佊�нbJL��>�<dU�>��X��ڡ=�@�����(��W�/�P>���<����ݾ2�{��<�6�=��'������q�<E&��P`���">�p�=®=UZý�q==m�ƽ��=����>�(=�w��Z;> ��=�0������F�x��rn=O� =������=˖Ž������*�=߉g=&�
�=H��t�>J#�N簽ReC���l�NzX=��>|f<>�A�=ܟo>O�S>�#W��"��O�=�1��v�)�c�<x��n7���^?>�Ԥ=̺��sl׽������ ��j�=ws>]���빙�R��=]#J=m�=�9P�����
��=��,�/�=&�e��u����������m�s"�=�SD=��޽j�=�&н�t�=� M��g�=Q>��Ͻ���򳼽1�='=(W< ���@�+��=#2g=�U">M����m��!�=�ͥ�<�<�GڽF����Y�/�d�W�V<�U@=�����<)��!�WU��5T6��D=ԝ:>��H=8��=spD�y�|=�B= 1���7�&��<����L>�V��~�<"�%�b{�=���<����$�������B�=�3��=��R=���>.�]���;�1 �m�I�2bK�ȑ�<򫿽r��=$H>�`�<���|���Z�=1𧺞僻Y
=�w���q!<�:齔�����-L�=����е9�+*=�j���sý� =˱���Գ=x��;LK=R����*½�ko=�4=���Zկ���->��<l��%�=Sz=��=���<�^�}�>����=->�Ü�Ӵk���>�*�=�?H>�k<�M}=w��<z��=�vE<�Z�<Ϥ˽ޤ
>�n�lP<>V,м�j,=S��y2<N߸<�n�<�!�� �#��ܐ�m��=�{7�����U��&.c��Wq=�LP�cga��qQ>2S>)|�;^�E;�s����;á=ڭ�:q�T�/ż!�׽�bY=�3��ݤ���<- /�/�=��m�(.v���V�X����P�G� =H� >1���� ����%<.�ݺ�w3=&V�=�K�=f2I�,�o=���� _��œ�=�)��<�=���<�p�����by�=z �V�.>'!�Z���������:�$J><"#> *O=�MF�Qˇ<"։=�6������ �=l�������HB��6�z=����?4@>wu�=�)���{�<�ڽ�RL�$ ~�1���=P���3�>m:�=6�/>H u����<d)�=�u���Z>��5>���j{ �tS����l�_�������?��S��������<�hs> �=={g�@�˼�i�=q���A�<$�@��-)=�1�/Rüԩ�=���=�����I4� �$<GC�< �^">��><��;�� <��L<���<A@=C�,=�k�;2��=W��=t�����<"u�;� ��a�^=����!�9>�h�=���=���c�=�5O=0\�=�B[>�佋��>;��=�21>-"=T�)�� '��W>� ��b:>�m���л=�ˋ=���=b��=A��: O���,��슽Ƚ�K��/[���y=�Z�=��z<>��=� �<��>��4��� ����>� &=���=e��<ώ3=S8�_m�=Y�����=�p>�8���-��A=#�k��� ���K=Bt彥*h�yC�=镬= �����8N�=�н�->=SF�;�"=�;����=߽{�<6^[=��g��ļ2��;\�>��On2=A[e�|�f=���=�������=��Q>�s�<����&��2�1?$����=�Xk��"�<�<11w�D�?>�{:���I=���Ú�=Ck�<aH���u�=tPK���>���<S}��u#>�x��m =���=`�)�%̗=��.=R$�;k <�*I�m�>���>㭍=?{�=̏�=E�%���u=�4�=��`>�2�� Ё���B>�Kl����<T�?=I� �ߔ�=j� >�;��>$m�=��M��˕�h�������~>�@=���z'=�`?=�����=H/>��=j�<�ü��=07����<v2@��%����^��=';�:^U,���Ǽ"��;�4�}b =����f�ٓ!=�]<���<��M<;��֎=HZ�=�Nӽ|{L<֘���4=8�>Z��C����<�[ý����wȸ<��W<�&� p+=#b4�ݓؽ�#���3=7��c��=�Խ��A>Hn�=�;�=T>���e"� 9<��f���Ip��F�l( ��y�<9-:��N>�v�<)1��9���M�*q��8 �n�I�����=������db��/�=��B��Z���L=�� =������=��_�2�=W)��JH>���<.K�<E*�(9|<�,�:*��= v=���=!;�:V=|[�J��=?䉼�X���s:= �ɽɽO�y��eI���i/��?߽Va��I��=� >J>e��᡽���=B�f=꽅>ݶ>U�=ި>��)$�'��:]�=�#��-����Q=��$>��>4o��9��<�7�����=��U=���=}\�=Dl�����V���6�>k讽ݱ<���<�i=��yo�a��>�>R�>�M��L���I9=F��< ��;S��~`ʽ�Y����b���3�x=��n<�m�� �ͽr ����4E����(�u���;U��<>��=<\��_�<i���s�N>Z��r�>= �=�i,�:;�==����*��=iX)��;�<ת=�w�=�[��p:�ľ�=����N���=l��=�����˳=l�@>-���,b>�5�=y%E��I:>��s;*�;Z҉��� >ϲ߽��׽%7��*����<A0��ɼ���3?<� ���qn�;T�<�B�<������=�(�,��<�a�=�~�=�����=��=�L��� >%Y�=_�x=� J��븺^�<:�#�~�L>��������!=E�=�j�*=�p����6>��o+/>C��;ޙ����=������U>� ��ݽ�=1@�<><��.e>H��<�1 =(���D��=�n=?{j����=E����7�#���>=K��=c�H⁽��k=�<a^��ϲ������p >ea_>3��;�K��?������=�C�=�!���1�<�~;�\� �4|�=d`(>����ڥ��0<��eڼ5�=�I�=x�ͺڀf<��$���=�7V��~T=�� �8n�TB��=U��T�=�����v=B3��&��<U�@�we�<*2�;���=@5=<U�=*s=�'���D�Z���#�9=��l=���=�2L>,> �.>".> '�<���<�� �<�ݽ�ι�jP8�쥽��>�ͤ� Μ>��>�>!{��oG��>I�=��}=��$<�ނ<���<�u> #�=v�=���}��4��'�=;�q=qX=�Ὄ� >��F=�]=���=L��t��f��=Xj�=>{��=KH
���B=Y%=�td=�����%B�.�X=w���%�=Mp��t>���=�Z�<�g.=uH��S�}�,�?;h;��|=~��<@赼�m=;�K���߼}�7<���=���=!�=W�=�dͽX��� 7�;WNv�R�=�~2���`�<V�=B�+�]$=� �I��<F������n>�}>>����<S|�S��=��t<3�T��О=��E�~�f=_jj���x=�"/��9=�p��(k��S>�ZR>�>J�ӷL�C~�=���]�2=�3ͽ��V�fޮ=#J�5����%�>X8>~+T< Z<�7�=��y=Z[-��)<J_r="�=,=9>�l�=H���%]��޻�>����X����O�l��;\L>�f����ý�>,8׽��̽�֐=�ȳ=1�?=8�f� F���J�;;e̽�淽�̪=mM6����=���
u>4���@�j=99:��8����3h�c���>�^�<�%���C>l��=�\��;1�� �8�z�>���=���=�VX=xp߻y$�=S~�<pS�=;h�<�k>+)Q>F�u=gA=\Oܽ �n�>�ܽ�M(>?5��@̽�tF<B?=�e�=��<��S<6at=]�����|�L��=��=s�>��b�&M�<"�˽���=o��_;���B>�\<�0=���� �r >Lt<��6�7��=�˄=�Q��-�ϼUY��� w=*�N��;<���=��i=�N4;��V� ��;n\=[�i��<���<%�?>�;*=J��=�l�)��=Dr�<nS���Z>��u�b�M��ɼ7=�!�<����|?^=��=C���ҵ��p��rX��H�>�J|����f���L=��> zP;�{+��}߽����Ҕ����<.��hk�=D;;��="��<��"=���=�Å��6�=���<�:I���=���q>�����O�#5�=N�:�[�3>�]�їʽ����#ۧ=%
a=�j=Àk�}8>�,�o</�>iś�4�=y�$�,���mu��ֺ=�нO6)��� >�U�=�齾(��BO�=�[1�p������<�{[>���Ǐ=��罅V��-�<�8�<�*��<�;��,>= ?�4G���|ѽ���";���)b=kB=�u������+->�>�=��-�����{�b�D�ؼ��N=�����g>�t ���Ƽq�����=r�>Hw���v�<,@(=P �=���=6}罒�����=���<�� ��#��촼� >�׌��>���<�>4T=�C���w�o5)=��='Ĉ>U�(>~�'���H��;>-;{�`T�=����1�q�Ğ��ʧ�=���= 6�=ř�=�Y>�s->�����e��w<��4�=KM����n�
�~��=i�>3����B >)g�# �=2�V�Z>�e�=+��=�2��?.�� =>0#/�
��=mu�ݩ��o���h)�z�i�N~7���6��K*� ��=q�<��I���к��a�V�����T����N^��m�Q�^^d=-�R�r ��+β�)�����ܽ������ :��[�|�Ǽ��T>�R׽�Ɠ=�4�=m�; R><#T=غ=%���䈼��a� ٻ\Q�VfؽӠq�ˢ��ң�=�c�<� 佶 ؽ�-(��?=�y�:�>|�g<��齁`�=�q�=�`y=98����=_W0<t��=��3ٞ=:��=�XJ=���HB���f>f;>���n����V�ۙ����]Б= ($>�E>�򒽘�U>�H4�����\=�f�=Re8���>������'=�t@�ڤ�<p�罔�>�1K>z}�:�8@=`罔E>*@ �#H��*>�ś=2��=��c=��;��� �z��[|V=��>���I�<�8>b=�=���=���FM�=,���Pv;�[�<�뉽Ɓ��d�=��9��4>�/����1>��>�-)>��L�w���P$ռ���=�6˼a�K��=d���TF=Va��ު;>�k߽�����Kt=���dp�#UJ<t6<��={�=�I���A��X��<�?x���Խ!y�=Z2�<����=KX�A�>>C�=X�D�W:y�bB�<~��=����i�,>�='=HD=>�8��������m��=;n=����ڣ=���<9v�=��>���='�=p���b�<����i=���"=�j�=o���Iؽ�3>ɐH�!�=�c��渣��fM;5wY=:h�<0����/��%�h=ų(�e��=��޽�:;�����O=~C�=�.;M���h��Y䗽�>.=��>�ȶ���(=ћ�;ɦ=�g��\>�M��50�O�V��|�������~�8>2��L0=����yC��0�=���=Z�x�'�w�X8�<������Β��b�L=���=�Z�<�����=�93=GӰ���6���8=x��=/8:�7���7w�å��Ł=b�=�s���> ƥ=;⽸����U��L >�Ҁ>i��=b!L>�=��>� �=�����-�G:_=)H�=W�;`tg<�V=��=^Ӿ=3ױ<���=�>ӽ���ٚ=~��=Xsz=��=O��_ل�d&='�|�^� =��3�4��=��缮r=���=�x�<��=gY+>\v�=���w�d�ǭ�oΩ��μ�ݽ"v��8��=� ��-�<���<ML��N>�=�Ќ=J�p�z9�<�9i�^&�;eR���F=\�����=��M<^��;�T3=7#)����A3�=5�����=Х�*pB���\���G��I$=�嗽�e�=��">�y �j�˽83�<�G2>|ٽW�1>�S��o�y=s�c=�x=9HU;:5<F�9�@#?��S������= $��� �?�V�Y���E'��Ux�=
4 >��
���8=Y�;�Ƚ�@���=Tqü��>���=Ջz=�v�=�]%=�R~�A���t=CY�;M�#�rT�<Pڗ=K(_����=Xg����3=yʧ=���;5���.�ݽ�1o���~���<�<��0�=�==�����%=�� =Hci��*@�UB����>�-�����=�J�=�Q�eT>�l:J ��z檽�ߦ�C�὇s�3�¼�q>9�¼��L�F^���J�=ǀ$���>ds-�;_g:���=�c���?V=z�o>wx����=��>�b>F�/����;t�>R��=5��<o靽JnK>Y�Y>b��>O�=`�.<�Kݽ�W>���=�C���L>Se>��<@w½
��=ק>���������C��c��ro_��w��T�n=�k<k����=^�~=rN�<�ŽuV>�
>3w<���>4Z�f9>Ź�j�=�&;�(J0�? 3=�|==����a��m�=��νُ
���E>�o�M��=a�>N�T=���� ��ω�<�;�=kl,�_�a>���<&_L;5���n4�ы������+�<�VڽX!N=���<��0�_� � ��=�?�<���=�b�i��=�*��?!+=���d�{;�%a<�r=F79=����I���І�=C(/��L�;5�> V�<l���f=�o�==l����6=���V���0�<����F�rz��4� �3�=���<@wq�]̽*N>m��<B�>>z��<���<���=N�5�/�=i�0>�I
�1�#�N��,C�=�Ю=����i��|��<J�R=���=�k�� ���o�=��P=��>��B>d=��dOO���<ԙ$�b.�=��ؼ5� =e��;m�=��a��^��3��g�=9!R<2�x:�
�.M��]L>�gx=��\�L* �U�����>��q�#�=񒪽��=��,���>@��<-�H=&*<�g���ڶ=�H�=�!=�|��u�{�����_2[=���O��;���=�
W���w�X1��[6�=u;���'�<~��<� �=�%�=������={��=z��<��Žns3� �9=Jpg=0��bc=�k�=�n�;�u�=j�T�����[�:���=L��<�>L����5�%� > �>�� �J����E=��2=`�K<"��=��<mOm����=�q�����=��>U�>�m�Q�=����=�@�q�,=hd?>������=��>��h�+����&>��E�;���N��=z�=15�<rw�;G�i=_��=&m!�ำ�ϟL=�>[�=�������0=X��+1���˽�U�������=̔!>��s��D�<��5=̦�=*f���>�D=��!�����KW>���Z�½(ۏ<� z>��>M�
jO�[��=�h >)=��!%<B>qw1>�ɠ�AMu=+����Ҽ� �=�q&>������ ��l�<�&��` ��XH>Nð��=�
�k�==� ����VM^=+�x� �'���:�1�{=orE<8�<{8 =���w�>�`��Jܕ>SM��C��2�>=��<��S=dk��8互C�=��-=��r�O��=��=&{�=�Dg��-2��b>H� ��;[+�z��':�,%=��t;E����߽�� =>`>����Ͼý���=� x>�ŷ����>rܼ�� >�n�<��*=����HL���3�=w�=�d���D�����<=��5p�< ���!c��jw��5�8�Ƞ;�a>F^ڽ����1�6<�ю�GM=��f��<��]��=f�=,M9>�僽 �b>N��=���
��=��Y�Y0�^+$>Y�s;~虾b��<~o�U�{=�N��7�=}����n�=�p�;�����.�z�x>����&�<;{�;�ګ;5.ݽ}�=����I����=H7���=Q��<��<h|=iK�=`���l�<!5<�>��2V�=�н�\�<V� �oK�:}̼�Z�=Z����g>)cj��+��q��Dh=���+���C���=ZJ�_f="�a�N�$������� >�pڽ�2F�{�;S���W"��׆�= �.>� �=e>�¶�;��=�2g>���������D��-������� �j������3M�^;3��T �aF =��=��j=���:dG9���ǽ�7k=:Ys>n�3�F�=��=?��=���=Ӫ+>�—=���<�*'�^��'�>��<�w >���=Y >Aq@=圼6�G=�֛�e�x�ڭ��]�k>�=4+H>�[�:���~<��m����ym����<�����#>0L�=S#���ĽX��9l5�՚�=�
5�'�>��=��=��J=uc��� �=I"p�E>e��;����JW>�~�=)���lνF�ͽN����lD>�6�=Bb='��=6���� >�r��������=?2=�>c$M�{�W>2�H=�������=5��<G�����=�h�=|��� >�q>��6���2=n0a��u�=V
I=37�<��6��A�=����]؄=( N=�=�=?���q��=(�ȼj�!��k�=]4�<r��k~体��=W(�;s�=>İ=���=�\$>����1�s����<�A����<kf�;�8� 1�9���&=���<�E�F�
>��=�������,�H���ys���=(a+>�(�= ��=�,�Y7�<��Y=+b =�c9��< �;<ix�����=2�N���;�J�<@R�=�.�Ĭ�=4@�<s¼�� �� �����nW��+@>6�~�t�Z=���F7�s�>�3W��i��� Ӽ1B&>�f�>1�>�|s;Ff�� ���xL��C=reY��r�����V5/>N�Y���>=��ɼ�+w=4��=uCp=P6X��q�=d�=�6]=<O�D5�=�$>˽ʨ����;r����=+QT�Pb<_�0>���1��<�Fj���>>�zX���=��!���]���<.=�}���@=��w�Ғ ����઼�c+��$@>�)���>n =<�Ứ��<� ��^��e�{���=����`�P+
>��s���)=��f=j`3�S7�=���=� ��)������͓�2>x��=53;�-�<ɯ"<�=T>s)]>Ğ�=I�X::��=�D�=`����都*���b�$�po>Ӱ�<�~��=n"�=_� >��5�[���yw�<C񼡭���7K�~��=N�B>��ƹ�b�=�E> �-�oz�=dz�J.>��L��̗=��>KtM�F?�;��!>���ou��q �=�;�=6y�=ϸʽڏM>5&�=M���Y' �.{��ͭ=���=������=��:S.>��?�=��=L-�<3";=0#2<�C�=�-�;J��-u,=��˼��A������J������8>���=�����=`l>;}{��K����<�#���Ͻ�?��p{=e��=3t�<���=������>�D��΃�ϟ��V<.D��M�==v�=V蠽V��;�����=v)>��A=@��Մt������*f=��|� ས!�*��;g�T���:kB��g&�!|��;�6>o=���s��=M<)>����*�����>�H�=@�=��C>4��g0>���=B�=�����r��+�6����:U��<\�$>g�s=ʍ��}>�=ۛ�����"��<�('>��)>W�=�O��Q�y=�:=>�����k��n@��r�>�2B=��=e���6� ��n�=�`G��b{=�/t<���n�V��bG��²�vٶ���>= g6�uoz<�&��k�=Ǝ��r�<j��=�6�:�>>ܼн�K<jR.����=�,>M,=O�V���4>(�k;+�5=Y (>�aɼ��ѽ�/7>�n�=N� >7�&=�Ϭ��-\�w��E�<�N��D���ɓ=�t'>:��G�=t�< �;�l�:���)�<'^r��=b���d[�j꽘��<��4�G=h�=�UK<��T��<MJ'�7�ҽ����g�/�5� �K��<(�½�W�C�Ƚ�o8>�ce�zA����=��=�m���Q輔��=/=�秽�>�춽���=�_��ԋ=mH�=O��<O弽�H+>z&.�O�= #>�-�=��>��=� �=�;���k �l6;�n�<�ڥ=�
>"���[�<���A|=���=��=���=.�m>  >b������=5�<n�5��>���1�Ħ�<} =�Ԥ=���X.=�TF��B�<|�ڽ�4 =���C��5=}��=ͬ�:��R��#d=+&q<�^?����ɀ�`?%�� ���Z>���xY��*��̙��ܕ=�0�<��E�->���[�%õ=���N��>�4=&}��u
*>Q$�; ������=�]�=#P�=�u�=�@y=Iȉ�kT�=�l,>F.��/�Q=C��=B�=!B>螩�����#��&(=���=�_�<~��=���B��<�� ����=AU`>��ӽq�<7�A>��ڼ�ķ<�d/����=�����������"5� ��=ʹ�=��<� �D>�e�=�=h<�=�����g<$i��'D���`p� w ��բ�M2_>*��=H���Tp�<[�>F˽���=O�漉c�=`���� 9!>_�1>�����|M=��ݻ�f��ʹq� ;=N��<'�<�z�<uL=��Z<���=����a��I>�� >�5�=�s���� ��)�<�z=��0��^��>���9>q��=⁩<H�i��֤=��߽C�s�L��X2��z(� �D=���FDA<�`��k̽�%�<���<�z���>z�h�fI�<�B>hG>)b*<�Q��8����� �9>v?_�,9�=$*��i�=��H���c>i��<���>���=�D>��=D!�����<v��=%x=sS�<��J�u��p�c�]DB��t�����=�&H�i��=� �oۃ=a>�J������ �=�x&>���= ?s�� <N�ܼ�;>nwĽ��->�~=���= OL���=7�J>��=ڿ�=gȊ=p���u=Qᢽ���=�>x��=0�=#�ؽ� ��=`!���>��^�Eo�����v�=$�2��!
=|�̼��=ɠ�H:��^!��A=&�p=N��=�wܽ�!C� ��=S0��TL�;鞇=Ki�=�R�����F�8��`�=.@�S}�=��Q���
>yr>Ȱ)��)���)��^s'>�E#>���=�_��Q��=~G��I��������^���<���=��1���;�|>h>�������G0>� ����z�=Տ9�����S�=�E�����=u'�=��=ڼ�=Ȉ�=�lR=T@�;�=���80>�!>;v�7��ꝼK��=z"�<�x�����=��&��->�^��nN�����=�竽�̈́<W��=|>�1V=<ի���<��F�`m<�2b�����z�=N��=z{��T� =��N��� � �3��籽�B������W�����<�P �Ȼ�=ޱ=��V��$�=]^=Ƃ$�>=��G�� #ʽ�"�<�<��=ѽP�=3�=B�>pD� D�����M�=+1T=wv�F1 >��=UG6=0 ��F�=z �����m�.>����6�>�mw��O��=}/~=���>4�=�Q=>�����a<�_&=S^=�.>Mڟ=$�=�L��G�=[k���~�Qz��µ�=}�<�0Y>��|=P͠�>�>�S�W��hME=4�3=w6 �����5�=%}��T�O�i��<o�������U���v��L躜=��?���V�<���F �;~�)��A�������̽������=Iuý$�}�*q�k[����<8�(�`�=4:=���;N��=�D=�����=���%�Z= Vƽ朢=d����=�2�=�O̻�+<�zSl�[; �;���<* �V;�<`���j >n��=.����?*����=L=�-=(�:>v%X��8Լ����wW�=�[����`�,�=�����p�=-��$�=����n���C ��ȏ��71>
�#:�Dҽz㻼j�e>�> )j:s�R=���=|!%=�=�5�‘��Pl=��[�p�k���ڽJ;m��e �7<^��9c�|���5>�f���}�=�RX��:�=aյ��\�� �=&��:�}d�/Qd�V�C>h�
>oV>At��j�=�D �}��9���M�='���p;���L�A>�d <���=@C�<~����|<n��+���r����=���=��輾q�����9���>��`�B�/�=�����=�b�F� =m�>|�>w�><�.=Q��=q���P�N%�<��#=��[=7�=5Ee������ܽ��,>ᇭ<��=���=:)=1̚���O<{i=u�,��&�1i�9
>7$ �fJ>ȗ�D>,���G��-�����=Am=�q���z:R��&�<�:<?�[=|�Y�K�+>E�<�<��>߽'1)��O�<�>J<B��<afo��
|=1�>v��<S��<!��s"���'>d2w<g׽�a=g�>�V�,`�< x�;�u��k�=�ч�G@>>�w�)?>�!�<Ma�-#<��;{�=�5��>w���S<�����=>=J�= �=6C�=I#�� ���.�?���*�����=K�<��>p�X;cYl<�sx��� >��=�l9�*�*����<YG=K=껊�#�¶��,�HL �^���i%�=y
��څ�޿-�<�֏;�[� ����n���x�<e5`�Jd>P�a=Z���1>�<3�a=�%�L�>�ʂ<�i>=�ʓ=�C�=/��G�v=���=��=^��g\G�j9��P�=���jw=����X|��Gv=�u���0�;��=��{=�#�=�����T� �<���=�������x�;�y>�Y�=��%>�=}��k�b=Xg�<,�= S�<eF�=8n��uu6�W���DZ��,�޽ ;%=������=�wƻG|�=�E+=T��z�T=����*>���=�W��Q>�@:���=�^�:�񈾝�o>/��=S=�=,n�=t��`3��,�x��-�=���<.wS<��=��0��G�<�ʼё��D=�up�Vh>7�.>�m�>�7M=(k�]� ��m�zK.<o'�ݶ%�B�����������#��/H�HTl<1��. <�X>K��=�� �(*>_������=�.w<]Z�=6�U=�X#=+�,>9ʽ���=�NG�O� >����}9��b�<
��F��*H���>��<�&�=�a�=��G=��>�����Ҍ������ཨ��<D��=������S��̮=��޽P�d={�=պ�=Q�>�����-<�K����<<{��:Ln�����=���=���=t���f�=n�;0�W=�=Q0������*��i)�<���=�M�=s�<��J��,���>>�eX=UĻ爜�F=.e�=��y=s_T=�W^=YѼ�>��ڼlV[�BH�=z���p+�=B��=� ��k� ��Ꮍ9Ѵ=m��<�a^�U
><\>��"�<A���B�=@�|>���=�H�=����#Z���<=o=�ɐ�Ë|��㽱i�������=<��=ۘ��rC���n$�)������켽<�6��Z���ڍ�;�ິ����B �3h)�A����>?� =3��=+������<k��;5�F=��;/>1�?�$�K�=$�>�� ��0����q#>y��K��=�&�=b�>mWE>R4�=��)<�F���N�>�]��<�#��k�e��;)��=Z�/��z�=?�~��?��j>���u�=��x�����=(�Ժ�a;>��<��h������f��\l=ۇ �Ҍɽ[��=�����qŽ���=�}>7��<+&���Pཱ���� �d�">M#t�n�T�!G��Q�=���� >��?�/�����8>( �;�l=�E;a�r��\�=���=� >��w��%>ٓ1�� N>���=5޽�U;����=���=[�ν�=
(�;=�<�[=~t[������;=;$< _���;���=�q=G�><�1�=�c>�}�=H����p=�E~<4����ݽc��Ð=ۉ�Y�Z>
���r=0���~���!z�; >�:�����y>�(�)ߐ��ع�7H�=l��� �<IaC��d����q��>B�=��:=6���=1��= �=G>�<d�=�t��K(��cb=�����q�<$��=*��=���N�U=��z���N.���q�=���=6�ֽ�{X=wCJ< ���0�8� =y�L�K���p� <y. >����N�@��8��%�ã�=��\�f<���. �0#�=�}��\߽i� �x��<��P���)����%2�=
A2�d=�θ=���VW%�2�J���>�8�<YЕ�ڮ���E.�%�bBὺ>�g=�H$���g��=���=]45<����9=V�ʽ�C �I,=�~ѽ��<��=)Q!>��5=��S=L�\=�'�c��<�:����佪fR<���p��<�K>�|d��0�2�&��-��U����=u�?�~��ވ�=��ɼİ�5�D=>��=��>0{,�$2�=������=V������;!�޽����AU�U[=�f�=_�>�)C<��e=��0>W��<���r,<�ߠ����=��!>� �����=/Z����=E��=��<�á�j`�=G��=&�-���>���=э�=4���)������弊X����<����>w=!:Z>��.=�6=�nG>4�h���=Cm:��= N��]��<�������μA=��&=j��<�Q���'���Ƚ����u�">_O�s��=�\�=ť�� =�5"�a�=��E=�� ��?� �G;�)=9I�A&:=�����>Lj�:��s�1d;=��=��y=�����U�'������S�e�(�潣&�;z�ֺ�����=�� �*:>@�Q�o%d>�x=�
��i�=�>��=�ҥ=���=K��=B<�|�e<_��L�=!!>o�=�w&>�>�W<
%=����=A�oD�����=;�=��j�Jٽ4 M=�x->-Й<��Q�����<�m�=�`A=(M���_&>Q#���{�=���ԑ ��y[�S2�=<2�������U�0;噺=�i�=��Ǽ��>�=����o�������v��-+>��=�1�=$���ؽ4θ�X����%<���=}���P*<^u> ��=dC��3-��+I�=Y
��t�=�S����Z�.uO=H�h=�=�����<�ա=����v��<:l_=CS��I��<�����r >LJT=�ّ��,车�,���W=A/>�Z<�O.��3нvW�}�
=v?;��W�=�x��Ӛ���X�����={i��*m_>"�I;v�D�Y�S= ���'A=� �&K�=4��=�<=!�1=�oѽU��=㋲��� >�˽)!>�ֺ�L��=�=;2�=�Y������C��l/ټ Qʽƞ=���<���=�l�=� >iE��_=�g��>�d,<F�9�}�0��c�\��<Z�<�P�e�zf >g=2�޼|�>�'�+��N׻���wo2=��9<fxq>���0�����<<��X'.>F��=����"���>`�E>�y�=%q�W���&i7�?=X���W�=�g`��=��)<Sʘ>� >�$=�-��#�D�k��=�Q>],��Я���=12<(���X5�= �`���>�����g�श=�qǽ��N=�O�=��s�v��<䍕���ԽP-�<�H�Yd���Ƚ1 ���.�=1e>B<�^�= �~�X��;�ӭ�|��=>��<�a$a�i�<\깼��b=ث�=f�o�۽k�>�
���'<<9/>6�����"��}���L���\���"���:=����jR=�ϴ<^i��.�=;N�=֊=l>K��$*����CE`> +��>� ��b�(��#�<�?>�֗�����}&z=,T�� ��=� h�`›<����#�˼W�|=3��= ���6�3=.�d<�"�=��=�u���">�X�=�Ju=��ͼYt�$�J��~��}�D��񣽞���W�&>�r)��<+�x�=����$>~=�ha��������=YC,=)���`&t�Xd =��=���;��c=�X�=�����=�w�<��Pἇ��=ה�:��=��9�œн��h7 =���<^q���J�b�
>��H>�(=K�x=�C�=�/��^Aョ{T=(�i=����#=z�>�{b�!��������<?�<���=y�9���н�'!>��*��Vu��F�<����g���< �;K�b=W$�<�g>vzL=q؍=�q߽�4�=h��;Ҧ=�5�=o�U>���^������x!��$=�h^�
��=�i��!�Q= �ż��R=/Y�=wu�=�G�<c��=���<?�g=�{�=�g^������qa>(7����N�S����b�X�����=)�=/zW=�6�<�Խ=���=D�Z�.~>W�y>�mn>Ur�=�5�������U=���R��=sT�=�kx����k>^��<ti>�:�������>�"B�dֺ���=����O���$�<!�*=��=�m�.=:�=�&1�����������a��, >S����ռ���=���=T��<��ܽ��>p|�=$�=�W=�P�<l�#�F��;�_����=��,�W\=�8w�]��<�g�u��Ԡ�0�S�ث�=��s=��Q>�n��c.����p⇽=S���ǽ5h��0��=��>Gԙ��Q޽j�����=�x�=�� ��v�>>��<�i�=�]���M��7'J>u���,��� �� �1;b#D<K%)=U����Wʊ�� �=����`��Q✽��>ݬ�=�<3��3)>�&1���<!RT�4�`|C=uE ����=W*��u֏�Gk�=��>i
�=�6��F�>�1 ��N�2�&=��<췽/wa=0ΰ���7=��O<�H���+>)'�(zY�m}#=�ė=��/���=Y��<��q�=��=�=<����U�����F>��O2)�i�彴�=-�;=�e<�>5� >">���=o� >�Y-=�>�o{=���=vy>���=��O=U���~��pL<�����]�=�ꏽo �=�>����Zş�W����m��P�F���(=GN�<�P"�^�н0J�=����@*=�P>��� �+�^��=ÁB�C�*<|a�=/v��TX��1w车6�=��=+�G>�3½� t�{�J=�ؽJ9t=ny�=0�9<��=� =d��2=hX�=\��=f->�A(=��<ft~=��@>��=�/0���h$i<��j�����(�(����@'��"B��r��>Á����=��U�������==㽺�0��Ka=*�>ͣ�=�����S>�:E=� ���e�=J>���%����<�d=)��=�t <� >�p��/��Vk=�v� ��= ����J���,>�__��ou=�2�<������u>�P�� ��= ����"��j��=�=Ü�=Pu0��3�=ؒd=1=;�����L��{�=��">k�=��>Rb+����;=�>�׫=4�"=�bI�֞�=�&�����^�;Wá�Eg>g�;a.�<�c�����:B�t=(s�<����۾�>i��<L�G�F�$��^�=(z��d�=a07=�B��2����л(�(>�m����<Y��=��6�%��==�6 >)������=��9�s�(������tq>`\�=�(��=��~��V�o��K�<o�=~���K;�\]>�&Ľ����ּ=�JW=ͦ=��'�� �Q� >�����������|��| ��5�� CE=����/��3�<��%>�Ԛ=�b�<�q�<����eǽ���<���c�*���'>PYO<�;��-��<:�=rY��b��=�
�z#�=�zL���:��$=��̽��{��/G>��=e(0=�C��:��%�b=�U�=bQC>GI ��@J��N=ꣾ��3��\?>9�]>0��> ��<^��=�!��p<�p ��aB�ڷ>�oK�\c^>7�=L� ;l䧽2�B��z��/�'=m9��x% �A��k�*�k�����>ȇ�=f�7>�=�>�=�=�l����߽=�ǵ<���=(]��x_y=�p�=���= <*�������r'=�4>�<�<�kQ��ἂ��9Z^�<��=G�4=���=�u ����Z��EM��f����<�<�o�S;��
=�������<
�ʽ��ټb����\���6<�:>��R=ʓ��B�>��s=���: �!��pk=�>i���n�f>�IL>���=�Np=�0��Ͻ�=�pa�c�{�"Yʽ����O=�u�P���>m�`�c��=�t#�i�)�8��=�=�>�3<겂<i"5>T�=ƒ�� �<b�E>��<7��Z�y=��=M?=
�>��=b�S>�4>E>zƊ��T���A�=����?�Ko>�$�;+D=>��н��w<%��9��/��,<���7� =���<h�n>�j����[�4���!� �~�����=v��=�����KN=9�<έ�<i���n�u�[=:�M=i?=�á�>^���8�!/ =��>�ϵ�4���
�|=��m>G�>�mp>�y�<�ª����=�~����l=I?�=����� �¯���}&��+ � �V>x��=x��;�n'�v���}5�k��;��{<�=�f@=���=6��=K��=�A=� A�ϗ�;HM>�b*>sg+�.�"���0����d\1�+�=���=�]����^��c
>�4�vS��:��u
=�����޼�1=���=Uz!�,�=d�{��1�<-�
=��N��Ӹ=�}a=^�=���<����,�a>]�b��� �=+�=��鼶�����S��d�=�s>�t�=7d>nx1������*>i5�%�<
>9;��<�x!���S��E��{�y�����=�@:= '��Y_=%���$��!=�%�<E܀=~���^��kl ���#>�M��8�/$<>m���I�=�n<�n3>3@�<�� =������.<>�Ӌ>6T�;Wbߺ.f >�LD>�o��hڀ=_B�� Z�<�=�=�� <��������Sz���=_�#��s��c���Y�=E����b�޻ŋ������l8�����}hA=Y�½X< �>����=s=j6>C�f�mb���"2>e(���'���v�3�< I>��"<6m>&m����_�U>i�����<��<��{�wp�="�����/>jR9=��
�M�d=�C�;��ýr ���=]���Y7���1�������]�Wཬ�E= �W�z�0�� *=*4�;Dt><
�=I���F>Gx=r��=���8�=�U�=���o�{��ii�a=4����H���=5�� T�=�>f�˽!H����=�#��� ���%��ا�!>[�s�� j���Ѽ����m� �������c�-�I6O=��== �����=��=�h*>�2X�1��=| ��*�G>�y�=�v�=�6��N =�V�=�; >�s>O�=lj;���=�
�=��=�����=�;vI=���<ک⼞�����=�V3���J>
�=�&�=�t�:��:�XȾ<����#>����t2���ٗ<Ǝ%>����=���j�>A�p�o��<�g=i����Y�==���># [��. =���.���r�=��=[-%=l�<6=f>4<���,>�#<{@0=3�-=���;X�)��&>��=)�j=����ط�>���=�7>�'��A�=�(=�;(���A>��H=��>~�\>��=1:=�q[=�G���%�=���� �<l�u���Ƚb�ȼ�T=˅o=�:��8�=G��>/���Lm�=I��=���<h�g���[����=���=��=b$�="+j��y(>`��=���=��J� ��=9����1�����3���S��=�����>R�G�k�:��=��ߑ�,���Xc>/4>�7���X<O��<���K�=WJ ��-<�������S;��wӖ==[�>4j;>�Nw=�>\�<�9��6��=f�%�=R �=��7;$)��%�ͽ���X7ڽ��5=�W=���}�������둽 �>�6�Bg��=
t;�~�<"#=z��=Q.޽����?=��L=~��;�':���3�ȇ��s0�b=��8�.�<��2�
i<>�⋽��D=�h�<*���'>|7U����;x�=؁�B����F=�e8���J=��=J�ļ4$��J�ĵ�=Q��<�C�&�=���6�o=~�y=�H��U�6<�7 >m���*:�t+��Z!���R��� >)`3=�ĽC���4�=��==�>j��@�=Ay���*�:
��<��5� ��=��=�|b�ש�=��A>H�=�<�;Bx<4|=Kp���+8Tlx=J���}u9�]T�l�J>�=��*>;5���#��ד=f�=�p��1>� ==��J����:�z<�~��4 >jH�=�T>���<�U����v��}ۼNdѽ>��>l =D{>NCJ��&c��V���49>�6>�!�;qd�v����(��=C�&����=F���|=�$e>׳e=��`=�����J�<4���.�>�-��s�J�D>�M�= V�=XO��� <��>\�S�o�w��Wȼ�U(>��޽�$D����B�>Έd=zƂ�[� �ݽ����� �=�L�=��x*=dzϼ�2�=�d��8�V=q��<x&5�w�?�=<�=^=ַ��m����V��<�>J=��p��+F=������a=m4"� ���C<�=�N=`�����KH=@��D���R�=Pf>ǭ>�x4>�/� a�=*$�=���q��U�;ɘ�P|;@���� ����=���<;킽��D=�G=��A=���=�'��P�;��=(�>������=&r�o>��>m����<����$�= �*�׬t=�sf=%t�:W�@�*�=Z�=x��<&5=:r/>-V���=�^*��o���C ���W;�e�� WL>E�u<=�#>˪��M<ۼ=�%�=em��:�������f���=�,=���=d^)��� ��sq>qW=��X�o�]=G�F�z�D�0>�#�(4���*U�`>���=V������=LD=�wԽ�2���H=�!_2=�V�=Ӡ�<��I���<�K�D�l���">%�?<�{���׽����������e�Z=��h��\�3�2>\ J��">jf���<$>L.ڽ�-y<"RT=�Ƕ��9'<d>d%>·=���=�>����
Q�=F>�%>Ic����<�{W>�_����u� �y=f!0=����X#=�A��+�<������<;�4��G�������{�r� >{�,=�+�=[��=���Uk1=�m"����<u(��z`��T��k�1>cR��F�ǽ���<+p>�Ô��)�~��5�A<�D�=R�=�(���5��~�< ��wɞ=� M=���&ש���X>@��=��?��)>�=�_z=����=>fm �����`�X>�`���t��^���>�f��̧=1�8�%�8=axR=��/>���=]����/���a�<3�P>�,=��
��5�O0k��#�= ���aq伝- �<��=�����FC<�Yc�� ��T>8��<-�>��=�P���=�)C�o�>�᷽-"5>�;�=X�= 8�=EJ>�d��_m�<ni�:���C��k,=�o����,���J=�d0��;>�.�c��\ ��� >�B�� �����<�9A�L�D=�7�=�� =;W�< ����(�è/=���D <��<Q=�={xu�S�I=,V��?��p�=�C۽\�>��5�����9>���<x�)��KC>��=ڈ=t�����<��޽߶�T�=0�ֻ��2�J��=���=���=�E%��?6���S<4 ����;>[�ʼ�l��̐{=�f>h��P�<;��>o��������
<�����ځ� ��=7G�=���<��v=f�I=��� � >%�O>2Tq��t>��=.�A=��=�֙<:f*=��A>�_]=07�=�㮉=Hލ���4��ˈ=z��= �ʽ��{���m=�}Z=#��61-=�@�;�1A=I�J=�a���J>� ��j>�
����<J�=x��q��|㻹�p>�}$�Ω`=�@Q><z�=���<p!�Uk=�jY���B�4`=T�ӽ��>k��<��=��;>D�:��t=Y>��=`7�C�˽=��=f��<���KFܻ�=�=�m���#�>ހ�<r4>!e=�>{=5�?��)ټ�����"� ����N<v�>��?>.>=�༸� >m����
�<��Y�R=��^=�e@=�?�l���ɶ�<z ���=��p��b��<mz�=[ ���ɶ�+DQ>�d�KL��*ׇ=�Z>�� �8�>%��=��n=ڦ�;�-v��w=�>է]�/�-=xݡ�T9�.d�<(=6�B����<��'>o�u�t�?=ߪo�r�:�����e��.>W.=�;>��I<�zؽV��ux;C8.�":(=n��=b��<m~��(����<g�=��w�䠭=��>L�k=܈>��;���)�(/c��Ň=���<�>�v�=�[�=1�>a��}ҼPʁ:xg=� �=j>�����<0�-=r1>��1<��n;� �=��G=5y���E��\�D��<���=�M��5H�~v8>�4>��=���=Sm�Ҳ2��s=�;��"҂�$;>��)t����A=�
��o6�Z]�u�&��1]�s�"�k�=s׸<�m-�Fbڼ��B=��Q<+<b��DŽ=�½*o��/��>=��z>��}<,��=u��=v�k� ���‾�n۽󦼒���,�=
�!>�>s\�=@в��il��;�=@�\�N@�����)ݽ��� �-=���=^��=l=-U;���<����) =��4�Y&��3;� �=�z�=�S���$-=a��=/�-��Ͱ�gf��^��=q*�%o]�x>�p�=|>��~� }=�D!<�Ix�l$j����=���<�Q[=�]�=D����O%����>�V=��H>W�ɼ��ȽL�v=����������+4�=���=�~�>i�6>�^L�Of>r:/<��F>�h��������>�G����<۲=b=(�=�.�f�m���<>��.=�ߠ�s� ��`=4[�;Ҍ%�𦏼Hu:0m
>��\;Yx���ļj��ɓ�=�� �`��;�Y���*=�����l�X��<NUN=���= '/=G��=��,>(����8=��Q��F�<�:>",���=���<L�&��H=DX"�l�=�%�=n�=&�������<��=Lm�<Ʉ>v�v>Q��� ��o���6�su��ǻ�~�\���ɽ��D<�н=W��4爻O)���p=J�l>���=�c�;�H�;TN�m�ֽ2�;�ј�>,��=/ �=CA=��= 
=M������&=����*U���<���ϻ�s�=�y�<�E�;h%�=�M��ZA>q��=jU�o���oM�=��������`��<g&>(�=M���"<'V�=�Д=��=�<�=�:�<β�iP�=/)�=h��|<����u[>Uț=xB'=��]=x>L,>�,�=Y�1=�ވ�3,��d��=��<� ջrɯ=�Zۼ������I=��g=ć�=y�=5&�=t��=���=zd�<���J�˽L�>]$`=i��=���<�h����.�=������P�Ɔ�=�<���=)_>},��L+�=��Ἒ}�=���[b�;��׼�ds�"����=�n��&�=��:=58�=1s���#>�v��~���q��=ǒ�<x����^=��=�w>R�޽g�X��2�;o.�7��˕>%Te=1*:�Q���\�Y=e�=jH%�S�i=�Ҩ�ۗս������XG=�D�qV;=�p��E9ڽ��}�?<���=�V�=L�=���=�A���򇽈*��Ş���޼=�LE�/�����i�7���/=����|=�գ< ����<�ؼ(���v�=�?>@���V�-�<���<�8�=�Q �o(���)>�H�=�������=L
�<��=Ϫ�����=7
s������<#K� ?�=Hc�~�>��g�`�=�hV>�y]��x7>#����j��.>W��>�[�����<��<H��=K�q>�C�!M
�*�
>D;\��I����<}�>@�->�<��9���A�=��7=A��Ȟֽ(�=V��ՙ,<�M$>G�o����=��]<��|=79�=�����܋��"9=rM=� �=܀��vNe>���Γ$��]��h1> �U��y\>���>e���[�̽&Y�܀��&�>aP�= d/=wv�=��>R�̽\Z5����=\�T>Y��=����#>S� �܋\>?*���,��>Q�q��,= �h=Pջo��-�@=M��=Wݩ9�n0�"¡=�k>�vs�s)����=v��>��:�;F>>�A>g#>�>.鱽��X�[і�����' ��m��&.`=C�ҽ���;�
м�%��l�ὐh��kI=H?=6�$��f=r�4�G���(=����5���ﵽ�H���=��>�!�<�ۮ�ahq=Yvҽ��< �Q�D�<ʊ<��2k��s�=& L�r�;���=d�=s�R<���=M�1>��꽻�D��� H>g_�t�;��>4�=�e>H_�<��:=����=�1S�Ӻ5���c���z>NU7>�7/>+� >�P���>�����%=q��<f�2����.��<oR��*Oݺϵ�m���P�>=��=GN�<h߂������~�Z�C�61��C9=��/�1C��z�=�T�;_{�Ц��
�-�S.0�\S4�x5����H>l���*���mP>��=o�;!�=��_=ޛ�<��ӽ�W>܂ѽ���s�:���R՝�.�����ҽЩ=�����P*� ��==�3>��l>@=�d>)˨�D�=-Յ��� =�>"�C�r��Z�=��q=P/�<3=���x><��=��=/�=�F_>"�<@�=�L=4�>T�̽��='��=~PA= Y���q�=V��<��L<Ƿ�=lD:=�Tn>���=��>� ����S����=GGZ=^o�=��=.�=�� ���ƺ)'�2`=>�ѽ'S'>�>ٽ��4> #C�����f_@��u�<�]> Gc�� $;q �=��F�53m�-�/<, �<����h6>4y���ys=�v�={͝=JU>3T���b=dQ�=��<���=kC��;.8���3=جN�H�=���|��=��A�4ރ��Ho<��i>zϺ�;���=�r=4�<\��r�\���=ݾ�=��=�l�?
�<�ͯ��_=Tf�=� F���=3�w�?Ρ���>�bd>��u<E�=T�����DŽC<���/ =�s�=�ǩ�7��� �����=EQg=��K�C��ie=���z!>���>�����M+���=��<�2Q��F>~{�=6����֔�cOm=��S�v��=:ỵm �k�<�5��&�<��=�Q,�N
49>�֑̽�=4m�����E g����=� �=���=�ݰ<i�R>�Ľ=�g���q� 9%���;{�=��>l�D=���=ҝ��'��!��QɈ�*��k���h*�ɏ���s���1;���=��;�=է��D!���M,�ͅQ���a>�][=%�<K�>S^�<t��=Ϥ+����ɹ?<��->QE>��e��1F��+�<��>��ѽ����/�;I�-� =ȩ,>;[�������N�=`�=��/R����eP�=����k�>#sI�󰼸4��R=�z��R���f ���=�W�<5����̼][������m�ý8$�=�#��㾩�����a/>���<���Q�����<X
>���=��=�% <�v�}!�=�N�=8��;�q�d���t�; s��O� =5z½�gƻ᧼������p�M�>��>�g+��ѯ�|ʞ=1?@�z5_��>>�� > � =u>��[=m
�=���:���"��=���� 4�</�I>)�=��v=�ڴ=D��Z =�>�=�a>l9�=0��=�*�=کs>(E���<-��='=q�[=���>�2M>��=L�=2���N��=o�>;���{<n½g�5>�}��bo=����µ�fz3>,�=H���� �����=\�������u�=��]>}��<=�;=�1�>���<os����b=;�n=E#< :����C=�=� ��St>��=޸�����=4�E��*1>���=����R��ƽ$���6O��P`�=�/�6L>�1M������<2�D=���u
� �;<��<�.�=`d*��½y�<\���6@�+(���w�7��e���l��J3>B�x�ģ����^�Km�=&��=��,>}K�����=�
�=�!=T�m�
�<��<uҬ=��
���D�o��W��>�C>D@�=�<&>�=5�Q�4>ռ�a�4��=L�>����8n={ѣ=���=���=���=� �=p+>4�>=譛���ż�u��';׭<�6>==�'E;���<���=�c�=�Yh�;> ��C�<7>�=n�0> �2��$�=�eF>oш=��>�`<�.���"$���'>M�l=��b����<�]>��P=(��=�{��s���x���ɶ���/=P��<4� >���=v�<>��;G��=;�9=�)л��'�-@���+>�� �t[&�d�L>����ԩ�����h��i��9�=q����)?�sN(>�ĵ���=t�g��B�����֔�=@����=�*�x�<Ii�޻<�Z�ٽ+��=^:���b�=-׫=��>奜�?b�=��q=��=?,ŽL�:>'�'>5�_=�`�=��0����=�GK=�S#>����i���B�l�>������=3<�j,+=�c�<i����V��n�<�P�>�=���ҋ=e=`���9�����<�w1�I���������a<�F==ϔ��N��=����۝<u��=-�*<J*�;
�����=��J����ũ/�9S-=��=�нG>�z�����=6�����m= �m=��A<B=K��<��b�L]���ǽ$��,�C���S���� =�M<Y�I>ٓ�(�=���k����\<ѧ�=������{>��L>{\�=��H=�OȽ��=DiW=�)!���������d��=.��Q�ڴ��ы:��=�I��� ���r�Y`�<��>��=I=qqA=�����ph=�>}�J>G.=����$w2=�*�=L�B��ޮ=�%�����s�1���
>M�H=�;<���=��K� *>�T�<g���?��B� >�G����߽��w?.>��9<I��_Z�0M<$�j�N�>��z>�u�=��ʽ��=�\�=�ˇ=�t��wB�<��������=�0��`>>z@=�4"�:P����׼��#���=�r׼��=�5 = �N>�.�=L�½{��$�����*���3k�=c�=� =r������H>nV<w�������"���������<}F���T��i��Qߡ�x��=�e�� �=GUý�PἋ>=\��<�;>���������?����=����iA^>��
�r�/���U����=�ս���=��Z>u0 � n �\�O��C0�=S?>��=��p=�`һ[�P����:Q(�d�Ƚ2nz=^=П=�!�<��N=<���<n�,��fG�I�9��c�<�t�f����>6�=9U��#@�� j=6=�����=Sm�=S��`�<Dɵ�嘭=`]
>�o>�h��ߘ7=��ս�l<<塓<۵�=-��<4�=>������=���= h2��x�=[��=>d��
@�=,�Ƽ8�'{ ����=��C=G��=���؛=��&��">���]��=8=�XD�=�I޼ ���j��.c>������l4�@��nu���Q<�?-��ɬ��H��<L�Ի�½3�>a���/�꼁��Vt��w(x�Y+g��K�= 2>�Q=��ĺ<�=qĐ��G�Tg�=vm��X���|2�����=Q�ͻ��_���=*N =U<c��< �=�Ȫ���>`ю<4��!`;Je��^ >���=򨻽W0V����=�D1>��e�\h>���;�A�=��=T>~�N�-���=��o�->a���(4����+=��=�]����&����s0��j�
U�<�&��Y���P=.M�=jk��B�B�1B�Y};=e�>�˳;=f�=���<�X��Λ>�R?>&a>��뽳�;�4��>��2�Zِ=rҽ&냽�a�Rj�V�ý�R>��½�} >��n<]��<�tn;���=MBڽHX�<�=���:����=�>���<d�8>�|�=;���`�:���=y�ӻ�d5�E�������p$>�FѼ��j<�\4�!
�sw���R���&=��g��Խ��i��!�֏�=��#�0�= ���� ѻy�=�9O>�{C��]Ļ*�=MlF���o�&#>cs���v�>�k@>�ˈ��"��^��=���p^�u���G;`>8����3=�t^=�X�=�j�l���mkh>�x���v�.�B=�2> o3>R�ֽ�>u솽krҽ�e= ��;X�v<�u�%�m���L>ԅn>��>�_A��$½�W-��.d>��X� �=R =6T���z=���=@2>s�j=M�<i*f=P��=�.�� �E� �����=9>'#]�O�=�l���
>���<�� >���=ʌ���y>*g�7��;��x=�׽PR�=8u�<���=�lK�j^&�X�q�tTr��f�=!���j�����=�RU�z?�=��<�O߽j�>�㽼�]�<#qѽ�+<�"%�����?�/��7[<�9�;o��om�=�,����>f>��i�u�;1w>��>�1�;����q>a+>�Q��]ټ�Ì�?�3��о=)�۽�Π=�=I ��Z�<��KZ��ML>��;��qf=g�O�=\
O��G=�E�<���<��@�;w�&��=�43>*��=
�:O l=��=��">z�ټ�� ���=��w=�!�Ic���� ���*A= ��=�,��E�;���=ҿ�=���e����L��z����ͼo;�O<=@)���+��^��=�}9=�y�= ]M=�>�<�����!>�}�>j�=� �<���m��`򊽫�>�5>�z=��$�J��=gZR>!A'�݉>������D>¾�;���<�O�=�]��@a>��x����r��׼�=n���ܼ = ���{$>����^6>}�� �����;���;P����,�� ͌<"�O�J��=�#�%�='�P�Y�<��=��1>�l�*�>̲C=r���<wf:>g'�<�ܿ=��d>�G[�,���i�e= �=8��<D�o=7��<�bf>��<T��<LA~���=K,ӽh�>��׽T��=`�x���&��k���0�=��T=���;%ᔽ�����=��:D�=��ٽ����'Q��ʽ����?��=��`4˽>0���_=-1����t�$ڋ���=�}g=���E$��\�Y=�,��"3���S����=��=3��LE�=ԛ��+��=�/�=y��=dw'�����ׂ<���������!��98="�����y�)�ý>/�=y�1>�'f=���"a��=j<. 7>��>"�2=����9��u�
��U���G���+;$0U<�M���?<>
<��<=���:hXu=]$>t's=�󏽮n����;�R�=̌S�e ��:����l�=��`�<'��=����_����~�a���xN=t��=~��{Q���9�}��d� <���>a
�=���>����r�=��Ul�=���= ��<d�4��f>��>���&I��V<��=�,�;4�5>�'��]K>�b �-���SN��:�C�7><F�=A���p�#>��=���ؽb��F�ݻ����.�=J��=�*�<��X>8y<p�g�ϳ�<�
x<j"�=���=��*>(��Ͻ���ݗ�Pbz�q'��%:=��1���6�\Y����&>�8 =[7��8��=o�Ļ5r����=�?�#:�=���<��>���<z��=�>�\���='��=e��=���=��=p,���H7%=�'=l�=���q�>��F�@� ��Aż�*�礵=&��=���<a�A��1=,�>Z�Žj޷�`��=�6�>_�S;=��> %>=f=6�=�p�:C�=WK=���>n��=��N��0>�����oA<�1<��P�/�+>O�)���=<��{;t<�><U�=m C���7�;�y�*>�!�=/�P��N>l����c�=Ƅ=h������V�������Y ��=�;���=���<��=-�=����2=�:=�� ��f��U|=:��;)2\���
����=�u�w����N�;�e#>�!8�%f���#�=�@�<͂ =�H=�3��%�=�`*��I�������=�_s=+��=S���W�f9�=� �=H ü�xl��>5��<u��\�v��ߊ��^��jy��<Hn���ʽ^O��&=<j+�=g�Ὀ���ay���;�=�!��c焼wM-����X觽E�=�3���)�=�� >�<O���=O�����=7�ҽA.�;�J8���W�1��=eؽ����g�=���Qٽ�*-�v`��=��=���=�*�=_�A�):�=�T��w�y�=��A�����[�(W��▥= *��E�𼋸���~׽�>v;�/={���)<�����#=��&� =�����=x�Z]�=�8 ��t �Q�< �=�����߽��ҽ6���aɼưq��m���oZ�7�<��W=��&>�p�<r�[=N�������[���^=ݧp=o��9܅���>?��=M�=<6T��h> ���FK=-�<����Z�ؼ��>D>vR�=�Y�<�G=K��<G����F=�Qb=�ɼ����'�=�V�=Or*����=Y�����=�ȍ=�=��M����=Re��!?��*k�<���;�B�<�+�<92�=_���d#d>�Aݼ^����?Ͻ���;I����={r�=�SƼ��;��=��t>��R�gUڽ�۷;�ͣ=�DZ=��=�T�CJ�=�4�=nX�<��ۼ��B����=c�'�������ýV�ż4Iս=i���<o� ��� �=��+��6>�$��xȑ=�J��K@2���ʻΔ�=iټ۰�=5>��=�m��-=\p���l���W�<��;�V�ڼ��g������ (>3?�=��#��������)Q+>�>�=s�=�䧽­�����Ig=)��=H{�=�]&>��M�7#0�����kI���>;���Ž�k��r��=`�<��4�����+I=���=�)�=H��=㨅=�� ��݋=���;Q >�X=��>+v��)⎽���{�C=`U�=TAս>���}�=���=a�?�W�=����"f��ݰ����=���<"�S=��/;`�P��7��}��������V=^u�=A�-����<������=7��<BԂ����=���:�G��d�/��������FӽK �<0ӽM��P6>�>��&�ط���͟��5�]�>< �
�T�[�rg"��>�+��9� ���>%�:�� e�u{�=�_��D>T� �d�r=��y>#A=�j�<�����Tƽ�63�]-=���=��;%�=>6Do��G�<��0��½�8��i�S��f�<���=��v>Vソ�`��銽�Խ�k��������X��G��k�`�=���=���<!�=���T=�b��f�^=�7��o��=�����&��D>������:����=����`�*��P���=D�=�b��X��<�'����=&*)<��;�ч�æ̽�B�:]�=lȽ='}�=�i�<@�<���]=V�3�_���Ry><w�:@�Žq�z�CF.>���i���D2j��Ϋ<VA��g�= SQ<�\����=)o��c>��9�E�����=G۪=�6��O׽��,����=��޼����l��=h�=����aU<��:�ϻ��>�NR�ڒ^>-��=��ڽG�޽!=<�q�<j�]����=������=c3V=��=3��<�"�=9��;+xż��,��;�����=B��=���=�U(>K�W�4����\&�xU��� �=F��=;���0���<�ߋ<k�0��会��>�Sa�"��=S��<�ݽ�D>`6~�\��h� ���Q��k�5�@=�W�= I ����=�a��1���Pս��9��c>B�;>Q�;�|�='��=�����ݿu��z>Q��=ݮ�<�kz�ܴ�=(�>R�8ý����'�;i1��^��ɕw��F�=t ����2�r
w����� ='(������ݛؽ�[[� /�=� z=�w�=��ݻ1N>�8�/_='{�=�2c==�=���;v�`�(}D�e�ҽ"���$'�=���=�Gd�)�
=�H�R�罚�L�k���2��aP�I<>��ҽ�=��-�<��������M�Z�R��=9�2>)�)=ٻ<y;_<�ۯ�� �>Р��Mx*=��=Ӄ=����&|�=�ݩ=� @>X$>m�5�w�'�N�=�>m�4>\���Ǵ��7��e�<f>�T�=��R=5!>�Y8>*�>E �=lu1>���=�g�=�)�!��:�����2=�=ԋ�=���=��=F�ӽ�, >0�<�sp=y ��ZП�JH�<���=�3�< ��<u��<�P�=v1�#j��(2F�w�=�~���x�6>o=�=[a_=��O�n�>Ԅ�=�&2=ݑY�ѱT��D=q�>�Ǡ<�>��y=�3O=R���`��r>�6�;�R7�'�-�h��;���no>��V������=�[��8ώ���w�� ���[��U�=:7����Ͻ��=Ǔ�= �=�����彳6�����6x� �~<�7�=ճ�=���>s��<S�=q!ν�; �E�='J=��Y>���klR��H���([<j� O6��c���b����H�?�<��s��f�~��=a�����`��.>셊��Ղ=x�� ig��z׽[��=�u =1��=e��<�9(<Քn�B#�G H��G���w=*缽��>��(�]� ��UI�+4�S����4�xo^>���v���搽��n>�r~� �����=˶�=s���aRt�� l �L��;N���֫���7=§�=VΊ� ->���="��=M�"���=1�=Slȼ���;��=�ar;�m=`�9=�ҳ=~A�<�@�<S�����>z8�n��nn�=�P���,�=:�'� ��=r��A2!=��4��¥�!�=y���R!=�F�<n� >��t8(#�;��>��k�=���=��
>��=�<>�i@�t�>��<���=�7�=ΐ<<G��=2ǽ��)�&��=�q�<�K�=����DA >�����Ƚ!+=_6�=$��nq�=�g��޹�������Z=��=5������=�z�)\���Q�=x&>Ҽgի��.ý$�L�nc���J����Ⰷ=3齘�x=γ7�*h��##>)�>�7���p�=l[+>�dh>�=޽�[=�ci�jg�=5 ��+ߪ����<C(*��%������<AV>��7�N>�] ����`�������[=m�H�
$�=�=-�����=N�������Y����a��Dǽ�>��1<7���W����A�\��<� ���>.�\=U�F�c+;�7e'�/�?�J��=l�<��m>a�h<�A������:���������i�)<�\����L� !>>'6�<d}�=�[����_���i��<L����*M<���=�4�=c�=�]��W$������<�y�v�����nE�<q>�p>�4�3Y�=̃3>��콴�=h���hB<�?�`�o>�h*<iO
=�-ֽV=�=�;�<����Kս�Z��:�����<nI >�К=VN��QMD��E��Z=���=/��=w�>� �Es۽"� ��i!�o�w>[�����9s���sU><=�w<E%
>�k�=�$=��:;<h=�I=��>>gaP������W�=[�2<��K>�}=1�=��G��O�=��<=� $��� ��;����WP=��G_>�V>��>d?�<Aƶ=]7>.�S=� ���)��
����y�;V��ׇ���I����=�J(=5Ѽe)�=��==���= l��v�Ľœ�YƓ=�T!�k4F�ʲ�=D��<�ܒ<)����>͊�=�ց>{s���fŽ�妽8�D���1>�a��/;$�~c0� S˼*��m��=Ar�`�⽅m>��=(Mڽ��ʽ�d潭�6>���=�-��pߺ<1 �5�P��X$��?[>��=*œ��F�;_K�� �]>��������˽l5v���<S�=M�(�b���27����=�T��ی����&<�[w=��m>�@��l�<�S��$>���=D�0>9�6�1Y<���G =�T�<���=���B �D�м*ν�=�����=V�M=��=B!���N<ݎI>sܽ��;���<�.�=!�>@�+s������S=�XF>
����B�QL>�m��<����W?��t �}>#�=m�+�/�>�[Q>s�4=����<(�= �J��F��Ma ���=%tv:@I2�n�'>�e6>e �=
���>�<�� =��+��lI;��>4��<@��=zm�=�=�Gϻ\��=AQ�;T? >dq5<�<�<�f>���<4d��s�(=�J����{%���+��
��;� >r�=bo���U��-m��l=g�]�M�>��;>��]<B�w=�tG;���=A��=�|<Z�w<�+ ��t9>~��K�(�`�w=�Ӽi�>���K��2=߃o=B;0>�$ټ|���P�=�"��~�������4����� �N�Z �<o�
����
>�
>�N-�Ҥ�����=�-O=ҫ��
����[���\)=��}=�J8>.>��(=ٟu<x�<dO��r��=[h�<�W<��u�U3=�ԕ=3�4������n���/㽱���ӟ�=��=e?�=��b�R������t=v<�=E�ؽ�CT����='c�w��=��D>��<?(�K2ۼ�d�=�q6>W.ڽ���<E\�={Fڽo�P=
K�=;��S�Ƽ�gF���=�����<�
5Y�:��������=�X >3�S��X�=���<FF�=IJ�=������:��T>T��=K��=� �xP⽆��>W�<|7���”���5>P_&�����s��=�w =�a=q�C>�O�=�v�<vb^>2��=N�����I���,�>�>��i�@K>)A�������>)����v� 4�P�,>d���f�m=��4>�)�=ڬ>_9�1G����=��2��s�<��ӽܙ��q^=���=9�f�(�=�A�=5݀�n茽x��؄׽���<X��=���=$����$;�>��" �=��5<�J ����=�ɽ#�>�{J�jo��� Ͻ�U�<�q��14�=��>���=��\=���=^���:>�C�����=}`1��$�U�h�:F=��u6M�����1�˽����v`�<�]�<���=��V=�^���>VYZ=P���?Gp����;�5�� ���)�7�>�Rg=/�[���(>��>����'f�٫V=">�WM�$Mv=����t�=vq���� ����(ҟ<�=x���,tG=�R�����+��=��<}�<�%:��P�<�8�ۼ� ��=/>{Tb�m����r>K���]��������>�<h����%��:&�=���"���i�=�M���49=%�U>��>�a��T[a��� ���X=����hM=�M����<�>7>pW\=ϻ�=~��ޮ���<�Aս�b�=m�+��ོk�n=��ٻ8�=�;Ƚs�V=���<a09>��8� k��ط��)ֽ�j����˽T���B�<d9�=b�Q=\��;�L����;�C��G�=��V=�$�<?$��D�=c�T<M�>�ݕ<���<xN��# >� �̖�=�Ǚ��>��W�5L=����=���;k-�<�d�<���P7����>���=�轮������&���B��<�('��>1<ٌν
v��H<�qq<W��=����h����v��;7�=k9<B�콎��� �M>�h�����=Т�:.~���_�=�����~��%�=�B_�l(ʼ�A��@�=��O=��(=�=��|>����n�=���-f��d:����=� >��8=�� ��oV�b���>7�=�q����;�>�=&��;Ʒ+�aC(��ج=:y>G <�UN��c�=L��M����@>�U>n����׉�غ'=�᲻ ��_e�a�1�}��=b-�=����p���)ʹ��=*.��v����-=�g��� �=3ڼ暽Yk=P;���½V�;>\�=����<� � L��Z6�����\z� �i;13<訆�.�9 �=����ւ>=Q =
b>�-9=��=�(�.n>��9�1�3�&���=#f/>�_��L�O<��=!��= 락s���#V=��]; A�=E��=�[=����7����Ž�� >��!�쬼�!>�>�=Lԧ=����$y�r�{=X7�=K�=�,#>��>t.p<�Y�\���>m��H3�=�+^�2�뽡瀽��P>:��=�3��I=851>k-�$+�����=�`=m�x=�L���\<�@�=�=��7�!�=�!���\�=E��<��>���l=��> i��CC����ټyF�X����D)��C,�;������=��ս�l>\��=���=)'=7`=�z�<�>�}�=T��VM��
D��� Ǽ}�H���;S�7��є=s,�=Fh5>�`j�$Y�DM����=��7>ЈZ��F+��}Q���<��=Q ǽ��X��j���C��W�=Y������'>� >�(�=���=��=�bB=-�Ľ���=?i ;���^5�<�5��:5�0���T@>�lS=���=�2{>��i�Uѽ�Zֽ%xi�g<���D��N ���!�
�ػ]3���>ഩ=X�+����=�4=]�=��o=h��b�E=CQ<V^���q���`�=y��=�3�B��=yI��Yp���B=c�=duٽx ,< 舼.؄=��,�f.�F�ؽ}��;3^�KP>��
==�\=^=�>�=`f�x���ɒ��vŽ�Q>Kb�=BA~<r��<�?�У � i�� ���1�<u�!>a͋�<8>����FR=񩬽���=cB�����=���=��=���|�=��N>�m�=omJ��F>�������=��=�t�=����yE<��u>�, >���^�N=�=�;�=�*�=D�'=BE����\=� >$G1>(6�d��=Zt]<6�U�lQ,=��I=o�?>�6��X�:��>>��>h? =�j���.
>�ѽC�����<|[<�D=> ���6=��=GY;��U>�
����=���7� ��!���W�=��Z>�B�=��p����Xf=�,8=��>e�K=�|����N<�f�=�伿�j�> �=�ὈZ˽Z�d>K���%�׽��>9x<��= w=$�<o � >
X�=�U潛'����1��V�5�r�v.��9B]=E>�=�N=���3=o�=ښ���!�A3>���: I���Q�R~>wR.<�{�<`YV="Q�<\X&>�A���ý�ʽ�/>H��A��<8JV;�'��Լ�y�����=��=i�<������:���)�ڼN���x�<�D὎����(R=��]��[�v��<(�����=<��U���}>�5F<ط�=]�w�O�G�T:#�,�H<F#!>�R�=ʶ�=]r��_c>�">8�ν9�~���>i��=�p�0L ����=�.$=\8Ҽ%9H�cL���w��|�<8QA��\�m�W��0��c���1<[���-\p=g�S<��==Ͱ9=&V��Dx=�e*�>�`����"��1;>��ٽb��=d��=��=�g>҂���-�=ݿa���O>�� � 7c=DG���0=\��?Ľ[��i{=
�>�v��e=עF=�򭽸‚<� >�C�=��������j��<`ew���w<C�Y>\��=bj=��=�
���={ü2�+�u�=md�w4�C�>z��<�)=���<���= Ѽx>� ����>������[f�=^�>W6>�W=t�)���<�]ƽg[G�'q%�ZF��8�T���O<�6��K=��u=��U�e*�<��H��.=Up��h��=�p��VL���S�5fɼu�n�$]j>A|�=9��=y���S>�
> �%�YVY�:�o>U]
�U�1>�H¼����%os=h��M8= ����ك�^풽�c軓v,�B��!�0=���=���Aғ��'2�6��|�/>�w�=�}:�7���m��=&�Ny߽��+>HP�;�⩽<<�)����=����Ԙ�<$�>������<�N}�0�=bι=p@��5�=8�z���w<p+�����=�^h<��%�K7����$=��(:�׊�N�r<{Y���J���9,��� �������8�=�:��7���Q>� �=�.��n_���9=Q^>���R�=�~�<���=�3�=gc_��"e=�p��Ƣ=�m�=�>;e��@�x�"dؽ�]�<� ż�[t�����e�������H�<+�R�l; ��=g�<�J
��7I�����M >r�R�A�a���'�f��=�
�D @=s~�;�K�=���=M$<���=n7��?J�kX�=�\g����FF�=��2�<E#<�l�=Gs>�/�>��r���o<��=�H�%xA��Z�>�0=x�>�����>�=ع4=�ν_6�=���:���< �>��=ƃ$>X޼�{w9�4���>K��=�㔼Kt%>�g�<m�=�$�����>iCݽ�^���T�1��c�\= �'�F�z=X��f�v>bo��3��:����=T�@>}Yl<� �����Տ���6S=.Bڽ��bĽϞc��kA=R��;V����->A~m�O�>� ̽T'L>�[-����=����T��=�u�;ڧ�=!�����=�A^����>��^=�ǟ:���9B������.�L��d6>�D<�qG�=m��=-�=�{���8�{コ���.�*���׽���d�m��9<򧐻B]��<m��Og�;�A7>�G��k�1�2=1���m�C�⽣H7>�z�=��`<��D�nط��N�=kWK=^�p�BgS�;��=@L����=��I��I`�� }=��w=۫�=�]���r�= 'i<�5��C����%=zG�=�z���f�<�&�<��=(�<���=��=��׽�!�= ��=� /�@��< >��<Г��KU>�L�=hJ�ޢ���JD>Z��=��P=f���� �aC���Ww=�%��u��=
Q�=�cK=|����Y=�'�!��r������'=��K�:�����<1v�=����&O=����Ɏn="8>V�Խ�.<��6>�>��=b���^�+=����WU���싽Ǎ�<��= ����S��B��=X���Ke<���=LǪ�k�L=}F�=ţ��*�=�6��3k�=� �:$I_���q�������=�k�== ��p�޼ӽ�=1�=�V�y9=�;>�[�=J|��׬<I.o�󄧽�
1��4 �j|�=��&=���<w�s=)��1&u=�s��.�=��;<���������5'��h�=��%>ڑ�=���=�������u��p�~;�׆�=Y<`=BL=#K�='��<�1ͽ�´V�L<W��=�`6>�=��=�J(��$>��<OR�=�Ӆ��MI>Q�='>4=�>f��=��y����=�0g�ңƼ�K�څ ��`ǽ@p�=�`�>2 ^=������>���=8� ��5�ζJ�P3v��m�b��=���cx=�|�z�=���l�A>}l��
��!|��/�>� �=��ɽ�>=v>�s�=��<Wa<��<�� >Q�X���,��>�=��>=�s�$ї�!�N�ߊ;��3�:<�=J�2>-#��$
H��E�LՐ<���f]��g�=3�@��6"<����,��ϡ=ݏ�:_���_ ļ�J_<�!��Y��>��Ž��/<����o�x���<��U=0߽���=�n�=X"���!���J=�;>3��=u�u�4��=�F�=��>�mj>1B�<�خ=�O<�^�<A�<�%�����=� ;/W=�� � _�[z>GgA�x٧=wa�.w>��B>$ѽ����K
�=�o>F>�N=+�=^zP���x>�u����=&HI��9��.=[��<���=X;5�;
<6����̜�>��<#��� �/F��*=��-=� �7�i�^=�z�8�)��R=Q��'�ս}@�b�<�����'=��< R>6��=�c���\������T��2������u��h3=�P�Y�p��;C��}�=Gɀ�#�<,G�=�Y=!�޽�t >�$˼�`
>grؽښf��-Ӽ}μ*0>�I<<>j>:�(��Y׼�=� ���<`���<�=6]V��<��"�/�����4ꊽ�|�<`�����=D�Y=W�I> <�=���=\���VQ<���=.�=s��;֣>��ҽ�#:�X��p]�<�K��Da�<m �,��C> >�`�;Y�ؽF>�=L� �t�s��<K�k�=�&�uQ�=q�
��T>�V�=��x<��Ͻ�6<Z�8�!U�<����8��[���b���V�8!��ǰ�=0y��R >� >6X1>G�<\?=��<Y���$�@>�^�<�5ͽT$�;�<��Rh=�<�=zi��J�=��="��=!�U� �>�=�&!�}���� >i�A��#���3����݅>+3�;_u���<�#��z��=SN���Gz��Aw=��1�u��=��)<JӠ=�i��f�!>iLj>��S=��F=�'���v�=Ǿ/=��I:��=PS/�| $=�p<��z=m��=f���GTF>���=_�e>�Y3�:�׽�wV�A�8=m�[�&�=P��=�==vޫ=`��=��Z����=d(޼�%9��+��v]<�ǽv̽����G=��>Ξ!�S M�Y���kl�<$�*�j�w�>��!��e+���>e��=���*pq<3񺼍������x j��]+>7�q=�ʼ^Խ��h>8tU=!M�yZ
>�9>ReU>u�+>2������=q\/�4,�<ćν>��<砽6i���Q!��<.+e>��>�>���<��
��'W=B�Ȼ�|�<�K����<���=����D.�H�J�ۀ��s�����;��>|�ýW��=���h�8>2l��������<R;��ٽiYI>q�I<��,<Ӑ=MO��0� =������EN&>�O >B�H��\c����cٽ v�=$�='G�;��=E��=1�=m�N<���= ��Ф�=�Fh�B��=�����%ν1����r��N<>�H��7�u��)�7׽N�>����=<z >4��:1DA��D�<Xݫ=�|=A��9�j�=>9ʮ�2~��k8�A����;���� ��5=v�}<�X>R1=�����<!=s�t=�O�=�a�<�N�S�>��-=����;��=C�=����3UU=��B>S��N�=��ĥ�=��=(�<��>d]M�aQ�>^��=�J�=�e�>9��=ZT=� B��٩=0��=��5��*�����=;�<��;�=�;@��E���"�$���<^��=9誼�)� �5=�j!�؄z�b�׼��Ҽ? �=� >�?�l������=k�>�4=�#¼=���!�=/{�=�N��&�">j�:>*�I=ό>��Ƽ˂=�m�<�܇�˼
> gм�m�=��<�l׽�%=�>�e$>GD�=aܒ���v�-�4=^Vd��b����Ľ���<?�O=5>��+>za=">�<
�=��<�0$�Ҩ ���[=�F1<��>TS�S*û��j���ht���R=vIR�}S��'��\�a=~]�=BG�<h����+>�r ����=�0
�J���.>�DZ=N�_>��/��<Ӽ��<Ok+�pg�=n*������^�<��t�V<�νTl=�즽W��<�?�L��뽰���<6���X��\R�=��= �a�-�=�=� >���!�7����=�=6) ;�u>���<���=6�=��<�߽�q���창z�"={z����L>����ET�<1d�<&��=�� ��T��3���=��
�`���1�#���4�=X8|=`0�=����T���n��y �$�<�b��.���Y�=�a��{.*�$��:����nY��&h=̓�=����p8�<�v��&T�=o��; /����?=W�+��֦�"��<���=�8R=/7�=���=�&�+�_��d%�Y4��E�����>�/��P�8� �is3��U��n��(�\=���=����k�,>QN�=��n8\
>��<(:W=�v�=�����c������7��*>��a��
K=�m����=+��:�����;.�<���5=B��=C=��x�<����d{� �>�?�=��E;P��<y�q=fb���z<�&=�@0<}&�=�AV���D� ���S�;�u$=�;�<-����`g=5Ǽ��>"= T >}~*��o+=��e=�'<�LT�|�-<z�>��!=ֲN�~��=�1�)��=�J|���ӽ�R��˻+�ʽ��� ;����=���ӽ��;�I<+�L>�F%<�0���
��CS��E���J޽ �=����G?�5 '�cY�=��[�A٪=��鼄��<W=�u��5r=��> b6��3Y;�n��� <����,ҽ�玽$�;,��<�!;��3>B᜼h�!<1j�=��`��}��YL��k)���)�E��=�#�YMz;/^���L�bR���h=���<�����B!�y�� ��=���Ē������;��E�iE�=*+C>�<;d���Ӓ=7���&c��`>ծ�� �2>��<���=��=�¼���=�x���*�����T ���� �P��<~,&�.���2.������m�J;�K�|�@�[t�;4��W�;����}�=\��=����T��=E��=��=���=Bbv=�9v<Le���=q�8��-�=��I<-���!K>��h���t=Iò�Ȍ=�̸��"<��`�=v�l=.�g�̳=J��;0�;� Y>��>�q�=��O��2���M���r��m�<zH=}S;�;����u=V�<�C =~M���a��H�� S�=�c��$x��!6^�u��/R��e�}=T��MJq��8�=\o��� ���E�ܗ<p[�=���=�(�<@�M=jK��{�r�m����o=��=^�Ƚ^�*��/����ܽ]]= �>��H�<����
I)>�c�=������軍�:����2��� [=V�<��@���S����=:��=���=� <�=7��X-�=되����bI�</��;]��/�=�iϼ}Hl=�n&���˽��=O�ĽЫ��„%��HI>�M�=��0;._>:����<��j=��>��_������I�Id�;���6�エ8$=ؓ:���;;�=f��"v=M} �S�i��>߬s=j �<��Q�ØV>��=� ���5[=��=5q=�f>�u�ѽ|�O=���� >��� V�=Y�V=4��;*|g=J>��m=���r'�=��E�e���C����eZ�� ������=��s�==о�=��m;P\5��z�=�|����^=Y/�=�Pd=q�=�K <�U>�����<�O��Ȣ�=�uc�#�μGC0�����:L�<I`">�`B���]>��4>@�ʽ7Tؼ>+]� ��/�̼��޽ݢQ=-��=�@�=���=’D=4���� =�����H�<�ϝ= �>��]=�^`��T�<�ԽU�=2yҽ-�&<���<��>����(�0>J��41����潿����è=C�$=ԮG��a�=�w>n��=� ս7&<1��=�\�=:� >nI`>�!���<1v>3+=�y�=@ᘽ��= 2>}=>�d��H�=v_�=�m��>���l��ULl���b�Ȼ������:�=���=��=��׽O��=�LJ�0=6=]ֽ�5<=xe��FG=��ϻ��འ��;|�Z���r�ء����ܻ�2;�d�<Lk9�٦.>�К�Ȱ��/�=�6>'�}=��J����=?�k�:�E=f��=��#=qнά= V���(�= �~�M������=��(��|]=��|=]���Ϛ��~^>8�m��n���V=)��<�QO�F�<B�#�O��=θt=3@��N����>�K�����9�=��:���H�K�=#�;Le��鸽P:M�b= ��~��<����M����u>1]����=8�*>� >]�
�����ܧZ<��<\��=!�=��=vlh�l�>��>d3��E�պㇷ<O��9=�=�L>W����ֽ
���`.=��=�G�鮜=��"=Q��=�&������5!�&=>q�����=f>�3�=���=�߻=O����d>E��=��'�=4>��~>뛶�����:H<�6m�mxN�2���x>�q�=����� �h�]�E6,�Wx=�� >�y<C� >!!A>c>B��K����ɽ����ͱ�<Ǫ���P=���<߱���h;q� =��>�M�=!8�=W�>=?#
>=<=�-�<��O>�X��H:�<��!�=���~0>-;�X=�d�� �K>|z���=���=�VӼs�o��L�1����;�y(=��ν$,�=��l�nF��q�7�4<�O>1N�;�#��ã<�1>X>SA��p=�b�>I��=�"=㍹�j��Rː=g����4W=�_L>��r=� 齣�9�"�82�<�H!��A�=�څ=��Z���齭(�<5h��SSƽ{C
=�e�����<ױo��U�=h⽃�j������Dɼ`{)�џ ���=Nӌ=v���_=��ս��>�e�=f�&>�ؽ�s�����."=L>.�*�O<M��=�қ�T�`;�p�<���+��<{U�=�"��D�V;�'�=I�]� ���9aٽRJ���
B��-�7wڼ0�<>�Eżm���#�x�0����P�w��!�>�R=�?Ͻx“���1=���=��"�=aH<���<�&@=�H�=P
�=q�;�lj�d��<2�� �q<)I�=��S=1�>=- ��i>$�==�C�=�ߴ��4<�9��(�=ЖT=�&��+�= �E�.75����<�ȕ=�z���dN��E�=�&�F�:.��oI>F%�=�C���g�= ��=\�>��ѽ$���[�<0�=l�/<P�����=��=(m�=��ּ>=Cմ=���6+˼=½4��896��� �Jv�<��Z>�s�;��c=���*��<&CJ����=�ㄽ�7>�l�O_���s޽W�ۼ�̽"��=� ҽ�
�=�Mv�%D6=j���9�Ž�->>W����B=�o�:=e>�'�=K���������=�><A���9=�茽|}z�EҎ=���Y�����< |�^+<6�n=���]�M���޽�ZνO�B��5>@m]<x�o��v=� =A�;���*�;�DZ=\�a���6�ѴX�� {<� �<d�������1 ; �=��<v�=M��< }���4=�<�=�N�=�␽�:��l��r G< 꼥�2> #�g��=�rb<`��=%J�ÇL��Tս�E>�n>Q�'�>5=?a��">�<��1���м�FA>.�\��l�<��=7��=�|�=�L��J��}=d���=ʼnw�XSN���o=�>�}ּ��5=� ���<f��o�Ͻx=:�=n���ͥ�K��=��=��ǽ2�=QE�.�c��Z���"��{��:o�/h=�������+>a������q��=S;�i >�l���R����<V�/���F�e�>N�=5����� ��=�0��e��/���T��=}��=�oɽ�s�;8%����=bp�<�J= �J��H|�c�4>�I��K�0�u�����=��o=f��=�' >�. ����=�o3��
>J��=j]�<�xE>)ڼ��@=Ph���½�(=K���쐄=Z�g����<G��=6<Cy��3��=�5 >n&�¨ �cQ�=�Y�=�ݼ<���Gٴ=�� ��ý1j!=���:~���*��=�jH>�I��md�<.��<r<!7���Z$���1�I���2V�.�J>���;7=����>�ߝ��s��ɏ����"=Z<+��>P���U!�={�������.��=�g�N����K>ϸ�=����������<�������� И�a�>��<���<Dr>-��<M��;�j�=��Ļ���=%�ɽ�P=�r��ޖ=ر�<�����冼�8J�z��=zb =s�ԕ�=�oH=���pU@>�}+=Y>�����2=xn��G>Fy���n���W~=���<��k;q� =Tz�=��;Q�x������=�3^=S%x=��#=�� ��MA>��<���p���48?��G]>���=������=��=����g�0�‘���Ѽ�r�gv}����= 5>瞻�ᄑfY������ǽ!����w���r#>����/�<����1�= >?b�<C�m��5ڼ��q:C�{>ү9;Q֦�$=��e1�=������ϼF�= ��=��-><@�^B�� e�<�P=/ʽ�&:eJ�<����;Di���t�=T�y��lS�;BQ~=�f=���;��'�F�<P8>yJ�����`�ͼ/�<�Ǽ˄:*�b>I>����;>z��@g��;*=�,��x�=~�]�&������|\Y=���<Gd����=_��=Wk�=�9p�+�G�A�ĺc.P=���a������=[��=FQ�<����fT=eX%>���>�<Y��$߼���Y��=�L��Ux�=��>$�=�{X��)�=���=�;��ˋ�=��<�"�=+��=�9��{����޽��/� ��=G�=,��=]���Z��=Α<�:�b> H>)��2����[<l,�=u�9�x���5?���W<*�z=���=G�`���B�S��s����:T�;>��=o�>J���4� >o��<T�*�:�>�D�=�]�=02���� ����=̗�=m�����J=Cc=�(j;:Z,>#������.�7冼
>Î7=�Q=D�o���&�&�>�<>�\">���#b
�خt���K���w�v>�<�oI�X16=G���@�l�T��=M�.�C�-�l�}<% ->�hؽ�.�=����A :=0�Ƚ�RK>>`=�Hɽe��<��u��1Y>�;�>�ʽr����N�=Q���_R<:�����=洐=��>�g�>~`2>�ܒ���"�o�����<Z��=��T>����JY�=��&��J4�l�$>dpn����&���}���!�=�(����L=���>����_�1=�,,>�>O=���=���=ID>�<�>�`�=a4 =�Cw����=|xH�ا��A�� �=���:��e��<����9 >6��=Y=�;Վ�;�U�:�gV>��7a�<�^����,Y>�=r�(]���n$��7�=�ͷ��J�<��߽�״��Ǐ=�[�E%<�-�=� ��/�5<�_*���n>i�*< �W>j�j��5�7��x�=�`=�R<�l�=���=$k<Tz�>"Ø�:s/<tio��=��}�=����0p=-=�+�<!�������ڥ�&��={��ˬ=3M^��-����<�9wz�v3m�S��=M����q=�4->�~!;� �<УU=_�ҽ�5��
�����=Z��=K�->�<�w�=�� >RZ�=� �ң ��������<9�(�ƽ��I=L��=St�=\���=A��=pR@=#x=���=�k,>i�<����Z��<ʹ>��=�
��d�6��=I� �h�=]��|)��J���+���[C=+&�&1>�$��J�~�����
Խ��>YR=��
���B<*�=��A�0�5��&E����s�ټ)�<���=�N���Υ=�˕=/*���������=Ʋ���S���g>3
��2v�ղ<=���=⡼�έ�B��=1\����=�"ֽ�[=��=?Y�<]��<����?�:��*�RxU��y*��x�=v�>����j���}UX:��w�[3f��,'>)@;��W�=x�X�Է>�>�ZO��d2= 蹼���<J�������д�=�*=��L�?8>~�ڽ �n=M t=c����t=���<�Qy>��A��S�=�m=€�;�۔�(���=/=&���뉽|Wl�-5���]=�M��4N�=N'�=j+�4+>�PV���K=G�>_��=Cc���:�<�������;�&>�8��h�>�? ���)�)�&��.>�ۦ�t�=ɮ�O��vgн��j>3�J=`�|<9�)>���>�C��F@o>B =r�</L�ȕ��9�1>�P"�wa� ��>Q�>���=��'=����r���=��=�j�<�p��F轄c�����=]-�=�ؽ>���}Ӈ=idw=�W >-�k�ʟ���޽���=�����;,�w�*�ソO��&��&��=#\>�;=��������]9��C�=��=h�����: ��z�=W����˻Vi�=���G��F"�=���=���=�1=�Ἅ�`�m�ɼ�yK>�sH���D�b��=��E��˘=4�彫x˽���<3�'��� ����<���=��<c�\�A�J�̤=V�&���>r�<:q'�L���ؤ�=�V�=���=�Ն�=�_�����=�*'����� ��� r�=�����S>�g =r�>M�A����=�,½�y�=~n>)�J<Kб;j+���/�P��=,��}���Xܵ<��3>"�A>������d��h��=R�����=�����0��۔=��m��P�<�g��K/�=���=M�=P�=�!��{ɽWƼ)D�<��>��B<��2=�N<=Spo>+�伷u(>G���q�Y=er>_�[=p��T4�9�{��J�}�(��=7�=����{���>�X�=�d'�4#��,�c=|�O���=l�>���;]ن=sY�=���=lI%�����N*���"T���<�38<���=�޽UΡ=JT��̭�=9��<�+��� >u���x=M�¼�^4�����%��=�p;����1��m�ͽͿ�=�`��ˬP<
�^=�� �6-�=P�
>�N;�[����=>���� ~����=ۯ�=ȮD� �>�9�Rw����:�q @>X�-=�;��_Xýr��=ht<����`M�=�=v���=e؀�n=x��=PE��po����\0���� ��Q����=5��=ZQѻ�Q�=��2��r=!��=����!)���G+=��>>�Ѫ����<����� �>��t����!_>v��=�����ǀ�t�>��j<i[
=��E�DL���Ȏ<���P_�-y��u���� %>,v��xE�S
=0<=�~�<�����:�S/7���N>������^tn=�~�=�2�<Q�ɽ4ī�;��=pr���A���M����=T�b=h�.�W��=Ⱥż�(ټe�y�]��D½�b)��$\=p�=.\弿�0=r,��|s��Z��=��M�kG"�N&?=�$%�b*(>~�[=?ل=KP==��=�@ =�t>?����8�;���^e�=�>����ܼc�q=��3=�+F:�i�<d����A,�ź=��=�ʼy�=��ڤ�=�~����<6썽K4 >�����y>�ȧ�d�,>�����"a��1=�[=�Q>e�W�����`�k.�<2\���=�>J�?=N&<_�=Q��;�^���b=a�>|�?=�D���6��JM>.$>C��:�����5?>`Ԗ��,<�&JS�))���̽p2<{�<Z = x">��hK>&���ey���;>�%S>��8�A��<�>N3->h�=�X�;�f <�9�_��=��^��"> ���<��s�=u >��D>f���t��;z�<=c�>�M5�i�!='�ܽ�ƚ; !>����XR�;�,2=�>�=ۭ>�>�=����>������ �9=���<=B�<où����>$Z�<�Y�[ �=ږ���5W<YJ�fL�<�t=p�=Y��^͂=Ub���
>�x�<I6t�֨9�}3�>s��:`�j=9t���`<�j=�1l�3��?�۽|L�=S6�=a��<���=׻?>5�=Jw]��{B��A=[�<%��=iK��D�\=�J�=}l�����=?�}���>�ur;���Ÿ>�q��73�=J��=&6>�"����w�Xh�<���=��=kn�+0�=��~�'u��[�>ǧ$>��C<��.=R۽=�qG�򒤻�(�v)n�� h���A���f<Xx>�L>�?�=��9;?�1=�c2�I�>d��=5ǎ��a��y�A���ν��к��>5g�=̭�=�4Ƚg5��RHU>�T=�� �y2;����e��<g��= KS�*����J��A���H���-<dn��Ο=bˣ=����+��=jL>�\0���O��e!>��1��T��Y�k�Q�]�U�h>�^ ="NZ��%=��=�� >�&���G=G]��<�ؽA�5=I-j>o>ZO�=k0<>�'��4�=ǡ���]��^_��u)=�ګ=������:'>=��н�צ=�$�=!żU�b��Ɵ=��+=�g
>�
��|N�<��}=ǃ\=�t�=/6��[V�N�7���W=�H��&�Yv=Iн�f�=���=����"<��Q=�Mν ڧ=Dr�=�>ݻ���<��=F*�G`>A��dv���_��k�$=�w:<�AB�Q��<�j5�o���n=���=���9W���_��X=)�&�=F��<S3�;����BX"��_<).�<� ��%�$P�=\sf=��<=2n��� �=Y��� ��->�߯=�U[�� �Ͱ�/��=9紽KZ�=4����B��P���(+B��$r=��ؽ�� =0�轀���\�:ɞ=��<�Ii>�X����ֻ�gd>��<����*�<�0=��<<l�m=���=-�f��6��)4뼋p޼]?�=K�>#VF>������*��=���=}�=T�H�S��o���4��������i=宑���f����>��=>V�%�˽`ͽ i1���>sHq=�
��8� Ƽ�0�����=b="HU�7 �=%����<��=�S>�#>˚�=�ͅ���y� ��=�b��@���c~>
&��6.;�(�<�Z�=��=�wC=�7/�Y�������N>x�=�'����%'�=��*>6�=���F�=����~�a�U�=a=u>JW��q��3�� >9-��!��<��ǽ�4>d��=���=#Z�;�㙻Wb�=>���&�=@�2=�W9>x6e<��7��i����>�V���)V=Ef�<���=$�7���U:I��V�����"]��t4>�1 =x!Q=��� >Z��<e V>O��;j��<y_>䳽>��<n����0�=\𐽥������"�>̱��� =Tm�=��=�mb�f�G>E�;�]�d�Sɔ�0Ѩ����=eM-��E >���=�������}t�H�z�PȨ�,�z=��c>������<�p�-=��`�Q�:<0R���=U*5�'B|����=�Jż�u�=Ѐ�=�i�=�
6�1_>�G��[xi��D<�q<ћ=L6�=���;|�>Zh��m��M=I���DO�=!�<��=��\=52n��\޽�),�`�(��\�$H׽f9�>=�� ��=����t��;��ѽ�`>r�l<<�c=d���L��<�ힽ�6>]O彌u�=N絽T.S����<v7�=���=�=L a��GA>��`=���=�w���"<�Δ+>��I=��=Ԉ�=@��<a6���\�<f� >���=n�=I~=^�L>7�̽|
(>��<^�ǽD�_��k!�fG�=e����>V��8�'�,*��
�=�=>�j�*�T]>9�2>��=>�R=!@��=�<��=��d=��G=$���0=�5�=2x�o���ω���d�=�f�?�i>�J<g������=���ͱ��"vP=�Ľ�����=Du�<��=������=�} �H� =O�!=�]�=���>�a ��C�=���)o����3�:�|�H=Պt�q�=ۉ�=���=� ��L�L�c( �`I.<z��<�<�u��m�?��h�=T��= ���>=jE�=�����<
>�Le=��=5ǽ�� ���=�]�=#T��TD:�q�ɏŽ"A>'�x=�\&>�X
<<c�<#�c�QB_�v����k�=�J�=�$8=�4����;�t>�Gs��ҏ�)�+��7N���u�� >S:@>��i:o�\=��6�]߼��=��>��t<���=�޺��Xʼ���0R��=J�Q��>.�?�Q=��!=ک���<$��#���z|>f]Ƽ�U��5m �q�>Eg=��%;K�ʖ=tcu=��=^�Ⱥ��=S�V<'����̚=�d?=���;6"�=��Ž�e�=}�>��(��=�<|�������Aȴ�_�)R�b�W=�� ��<�'̼o�)=�Qy=�~�7���ǂ�<�A���g=�綠�q�=m(O=���s ҽD��<q2/=��?=@����G���A��廟��= LY�� �=n8�<�����U�Qv:���μ���5�>�=T=�'�=KJQ=�+��@����g���o��h���B�_ \>��(>��=_�3=�~���k�<tǼn��<��4��u'�N>L����u&<=�=��#=�O=�GV�=�!��'6�����sl>f� =z} �|O �M@h=��>��U>`����>}�=J_��̭=���q�3�����Y!>0��W/a���=�. >�s9;ϝ�=��=O� >��=*��l����
=u2�=��K=S��=0}A����=?�4>3��=�5�=޿>��=',m�ܛ==���=��)���/�ΗE=g�'��伽Ԑ$���h��$>�<¯>#|9�b�[���4>��V=��*��c��,�=�M=�c���z�=$(*>�޼�(��9�z���ͬ���'>��>��;�P���k�*{���VE;� ��������S=�1�hW����=�~>�ѽd���=`Ď=�W>zH�=KI�����=e"_��==^�Lwv��f�<�+a=��������=-�:<(�$� ! =#n�<�ϼ� �� >I�<@B#>��\>��8����<���:�r�=jo�lj����S=��J=@B>��8>q��=�,��lr[��ƨ;k��=ӻ�=���<K��4Q���$�vi>X���H�������4V=AuԽ���=��!>�Y�
+���N���=E)=&�)��g�=ݍ�� �<� �=r����>=���l�� �>g<�<�ϡ��v⹳ˇ=�^ϼv�ƽ���=�����Ͻh=L��������=�Z1=���<y~����>��޽n����.�<����Ѝ�����7ï< �5\���W.�Q���a?����=7�m��?r>�$�< n�=Q$;U<X=�����޽sV�=��ra��6�=c ��쿼�SY=�����d�=�����^����<���3G@>< >
m�<%5��]Ҽ��=�ş=���=�[�:�R������(������l!��Dp=�?��_��=O��= �Ƚ����H��x��g�X>��=n�=K(���ē<��e�S7�=�%/�W���G>-4��Ƚ��a6�=�Md���W>�1 ���6��n=�_��3!=��r+=Q�)��ӽ�7b�)�����6='b=>�V�Y��=e�k������n�<rz��ՌY� �9>&߉=���=���;%��'�ƽi������9>�<��U>�+�2}�;8�=So�;輽�;��,X�Q��= ��:е�F&�=���;�6�R�>h=aG>��7>Ia>��X<�}���!�=���=�K6>���jn�=�;��P�=qU�=x�>����xA=�u�u9ս�����=>o>�Φ���|�B��;K>���=iW켺��~�ҽ �=���<о�="5��Q[�� �<1�h=��<t�:����;��t���Ž\K��v �=���=B<ͺ>Ė�<�Z�<T.�=
; <;��=����qĽJG=Y����������6=�M�΄�=G��>�����G�Tͥ=��=��%�����ސ=T����'>\�ŽΗ�RJg=ȽI<��A��ր=��<��o���=�I=Q�B�N =��7�/m�=��9>u� >�
\= [d��*�<1[?�q)>���=MfU�Z\k<�p���;�;=t�=O��<��>�h��� <<�Rҽ�ϻ�Ar����R$<�ɻ�=φؽ�c�>y�^>i�-������>+��<]̗�؃�=�<���=��d�J >Y�[>�}�<h��#�T=R1X=ؼ���� ��[��N�@��=��->a���.�a<s�=�cE;?J!>HY=�31=Mb齘��=�B>��9��aڽS����s�h�+<2�B=pH��B���n>����8">7G �y!��a��� ��>&�w������=�d��(����U���ͼ���<sD<�a >>@>ʬl���>Z�&���G=|�<= �>��+R����*Bversion_numberJ@Z)
vector_observation

batch
oZ#
action_masks

batch
b
version_number

b
memory_size

b'
discrete_actions

batch
b*
discrete_action_output_shape

b
action

batch
b#
is_continuous_control

b!
action_output_shape

B

15
Project/Assets/ML-Agents/Examples/Hallway/TFModels/HallwayCollab.onnx.meta


fileFormatVersion: 2
guid: 24bf45e63f29d458f812c1702e665803
ScriptedImporter:
fileIDToRecycleName:
11400000: main obj
11400002: model data
2186277476908879412: ImportLogs
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
script: {fileID: 11500000, guid: 683b6cb6d0a474744822c888b46772c9, type: 3}
optimizeModel: 1
forceArbitraryBatchSize: 1
treatErrorsAsWarnings: 0

11
Project/Assets/ML-Agents/Examples/Hallway/Scripts/HallwayCollabAgent.cs.meta


fileFormatVersion: 2
guid: f7451777d89fd47418f0e1c3e2511919
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

11
Project/Assets/ML-Agents/Examples/Hallway/Scripts/HallwayTeamManager.cs.meta


fileFormatVersion: 2
guid: 8b67166b7adef46febf8b570f92c400d
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

24
Project/Assets/ML-Agents/Examples/Hallway/Scripts/HallwayTeamManager.cs


using System.Collections.Generic;
using Unity.MLAgents;
using Unity.MLAgents.Extensions.Teams;
using Unity.MLAgents.Sensors;
public class HallwayTeamManager : BaseTeamManager
{
List<Agent> m_AgentList = new List<Agent> { };
public override void RegisterAgent(Agent agent)
{
m_AgentList.Add(agent);
}
// public override void OnAgentDone(Agent agent, Agent.DoneReason doneReason, List<ISensor> sensors)
// {
// }
// public override void AddTeamReward(float reward)
// {
// }
}

204
Project/Assets/ML-Agents/Examples/Hallway/Scripts/HallwayCollabAgent.cs


using UnityEngine;
using Unity.MLAgents.Extensions.Teams;
using Unity.MLAgents.Actuators;
using Unity.MLAgents.Sensors;
public class HallwayCollabAgent : HallwayAgent
{
public GameObject symbolSGoal;
public GameObject symbolS;
public HallwayCollabAgent teammate;
public bool isSpotter = true;
int m_Message = 0;
[HideInInspector]
public int selection = 0;
public override void Initialize()
{
base.Initialize();
if (isSpotter)
{
var teamManager = new HallwayTeamManager();
SetTeamManager(teamManager);
teammate.SetTeamManager(teamManager);
}
}
public override void OnEpisodeBegin()
{
m_Message = -1;
var agentOffset = 10f;
if (isSpotter)
{
agentOffset = -15;
}
if (!isSpotter)
{
transform.position = new Vector3(0f + Random.Range(-3f, 3f),
1f, agentOffset + Random.Range(-5f, 5f))
+ ground.transform.position;
transform.rotation = Quaternion.Euler(0f, Random.Range(0f, 360f), 0f);
}
else
{
transform.position = new Vector3(0f,
1f, agentOffset)
+ ground.transform.position;
transform.rotation = Quaternion.Euler(0f, 0f, 0f);
}
// Remove the randomness
m_AgentRb.velocity *= 0f;
if (isSpotter)
{
var blockOffset = -9f;
// Only the Spotter has the correct selection
selection = Random.Range(0, 3);
if (selection == 0)
{
symbolO.transform.position =
new Vector3(0f, 2f, blockOffset)
+ ground.transform.position;
symbolX.transform.position =
new Vector3(0f, -1000f, blockOffset + Random.Range(-5f, 5f))
+ ground.transform.position;
symbolS.transform.position =
new Vector3(0f, -1000f, blockOffset + Random.Range(-5f, 5f))
+ ground.transform.position;
}
else if (selection == 1)
{
symbolO.transform.position =
new Vector3(0f, -1000f, blockOffset + Random.Range(-5f, 5f))
+ ground.transform.position;
symbolX.transform.position =
new Vector3(0f, 2f, blockOffset)
+ ground.transform.position;
symbolS.transform.position =
new Vector3(0f, -1000f, blockOffset + Random.Range(-5f, 5f))
+ ground.transform.position;
}
else
{
symbolO.transform.position =
new Vector3(0f, -1000f, blockOffset + Random.Range(-5f, 5f))
+ ground.transform.position;
symbolX.transform.position =
new Vector3(0f, -1000f, blockOffset)
+ ground.transform.position;
symbolS.transform.position =
new Vector3(0f, 2f, blockOffset)
+ ground.transform.position;
}
var goalPos = Random.Range(0, 7);
if (goalPos == 0)
{
symbolOGoal.transform.position = new Vector3(7f, 0.5f, 22.29f) + area.transform.position;
symbolXGoal.transform.position = new Vector3(0f, 0.5f, 22.29f) + area.transform.position;
symbolSGoal.transform.position = new Vector3(-7f, 0.5f, 22.29f) + area.transform.position;
}
else if (goalPos == 1)
{
symbolOGoal.transform.position = new Vector3(7f, 0.5f, 22.29f) + area.transform.position;
symbolXGoal.transform.position = new Vector3(-7f, 0.5f, 22.29f) + area.transform.position;
symbolSGoal.transform.position = new Vector3(0f, 0.5f, 22.29f) + area.transform.position;
}
else if (goalPos == 2)
{
symbolOGoal.transform.position = new Vector3(-7f, 0.5f, 22.29f) + area.transform.position;
symbolXGoal.transform.position = new Vector3(7f, 0.5f, 22.29f) + area.transform.position;
symbolSGoal.transform.position = new Vector3(0f, 0.5f, 22.29f) + area.transform.position;
}
else if (goalPos == 3)
{
symbolOGoal.transform.position = new Vector3(-7f, 0.5f, 22.29f) + area.transform.position;
symbolXGoal.transform.position = new Vector3(0f, 0.5f, 22.29f) + area.transform.position;
symbolSGoal.transform.position = new Vector3(7f, 0.5f, 22.29f) + area.transform.position;
}
else if (goalPos == 4)
{
symbolOGoal.transform.position = new Vector3(0f, 0.5f, 22.29f) + area.transform.position;
symbolXGoal.transform.position = new Vector3(-7f, 0.5f, 22.29f) + area.transform.position;
symbolSGoal.transform.position = new Vector3(7f, 0.5f, 22.29f) + area.transform.position;
}
else
{
symbolOGoal.transform.position = new Vector3(0f, 0.5f, 22.29f) + area.transform.position;
symbolXGoal.transform.position = new Vector3(7f, 0.5f, 22.29f) + area.transform.position;
symbolSGoal.transform.position = new Vector3(-7f, 0.5f, 22.29f) + area.transform.position;
}
}
}
public override void CollectObservations(VectorSensor sensor)
{
if (useVectorObs)
{
sensor.AddObservation(StepCount / (float)MaxStep);
}
sensor.AddObservation(toOnehot(m_Message));
}
float[] toOnehot(int message)
{
float[] onehot = new float[3];
if (message < 0 || message >= 3)
{
return onehot;
}
onehot[message] = 1f;
return onehot;
}
public void tellAgent(int message)
{
m_Message = message;
}
public override void OnActionReceived(ActionBuffers actionBuffers)
{
AddReward(-1f / MaxStep);
if (!isSpotter)
{
MoveAgent(actionBuffers.DiscreteActions);
}
int comm_act = actionBuffers.DiscreteActions[1];
teammate.tellAgent(comm_act);
// if (isSpotter) // Test
// {
// teammate.tellAgent(selection);
// }
}
void OnCollisionEnter(Collision col)
{
if (col.gameObject.CompareTag("symbol_O_Goal") || col.gameObject.CompareTag("symbol_X_Goal") || col.gameObject.CompareTag("symbol_S_Goal"))
{
if (!isSpotter)
{
// Check the ground truth
if ((teammate.selection == 0 && col.gameObject.CompareTag("symbol_O_Goal")) ||
(teammate.selection == 1 && col.gameObject.CompareTag("symbol_X_Goal")) ||
(teammate.selection == 2 && col.gameObject.CompareTag("symbol_S_Goal")))
{
SetReward(1f);
teammate.SetReward(1f);
StartCoroutine(GoalScoredSwapGroundMaterial(m_HallwaySettings.goalScoredMaterial, 0.5f));
}
else
{
SetReward(-0.1f);
teammate.SetReward(-0.1f);
StartCoroutine(GoalScoredSwapGroundMaterial(m_HallwaySettings.failMaterial, 0.5f));
}
EndEpisode();
teammate.EndEpisode();
}
}
}
}

1001
Project/Assets/ML-Agents/Examples/PushBlock/TFModels/PushBlockCC.onnx
文件差异内容过多而无法显示
查看文件

14
Project/Assets/ML-Agents/Examples/PushBlock/TFModels/PushBlockCC.onnx.meta


fileFormatVersion: 2
guid: 9a4ea4894b7fb49859cfa9c16652b207
ScriptedImporter:
fileIDToRecycleName:
11400000: main obj
11400002: model data
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
script: {fileID: 11500000, guid: 683b6cb6d0a474744822c888b46772c9, type: 3}
optimizeModel: 1
forceArbitraryBatchSize: 1
treatErrorsAsWarnings: 0

1001
Project/Assets/ML-Agents/Examples/PushBlock/TFModels/PushBlockCollab.onnx
文件差异内容过多而无法显示
查看文件

14
Project/Assets/ML-Agents/Examples/PushBlock/TFModels/PushBlockCollab.onnx.meta


fileFormatVersion: 2
guid: a051c5abff78d40c586086c42e713e18
ScriptedImporter:
fileIDToRecycleName:
11400000: main obj
11400002: model data
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
script: {fileID: 11500000, guid: 683b6cb6d0a474744822c888b46772c9, type: 3}
optimizeModel: 1
forceArbitraryBatchSize: 1
treatErrorsAsWarnings: 0

1001
Project/Assets/ML-Agents/Examples/PushBlock/TFModels/PushBlockMaster.onnx
文件差异内容过多而无法显示
查看文件

14
Project/Assets/ML-Agents/Examples/PushBlock/TFModels/PushBlockMaster.onnx.meta


fileFormatVersion: 2
guid: 76af036f6a9b94e3c988951e6315dab4
ScriptedImporter:
fileIDToRecycleName:
11400000: main obj
11400002: model data
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
script: {fileID: 11500000, guid: 683b6cb6d0a474744822c888b46772c9, type: 3}
optimizeModel: 1
forceArbitraryBatchSize: 1
treatErrorsAsWarnings: 0

1001
Project/Assets/ML-Agents/Examples/PushBlock/Prefabs/PushBlockCollabArea.prefab
文件差异内容过多而无法显示
查看文件

7
Project/Assets/ML-Agents/Examples/PushBlock/Prefabs/PushBlockCollabArea.prefab.meta


fileFormatVersion: 2
guid: 8689a8cfb0ac742bfa27214909ebb1e8
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

1001
Project/Assets/ML-Agents/Examples/PushBlock/Prefabs/ZombiePushBlockCollabArea.prefab
文件差异内容过多而无法显示
查看文件

7
Project/Assets/ML-Agents/Examples/PushBlock/Prefabs/ZombiePushBlockCollabArea.prefab.meta


fileFormatVersion: 2
guid: 4efb4d72c7b94469ca38276842875f65
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

1001
Project/Assets/ML-Agents/Examples/PushBlock/Prefabs/ZombiePushBlockCollabArea 1.prefab
文件差异内容过多而无法显示
查看文件

7
Project/Assets/ML-Agents/Examples/PushBlock/Prefabs/ZombiePushBlockCollabArea 1.prefab.meta


fileFormatVersion: 2
guid: 0ed44cea8ffd043ca8db76dd48deb7a2
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

1001
Project/Assets/ML-Agents/Examples/PushBlock/Scenes/1ZombieVs2AgentsPushBlock.unity
文件差异内容过多而无法显示
查看文件

9
Project/Assets/ML-Agents/Examples/PushBlock/Scenes/1ZombieVs2AgentsPushBlock.unity.meta


fileFormatVersion: 2
guid: bd81f203c716d4c88af4b47f450907b2
timeCreated: 1506808980
licenseType: Pro
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

9
Project/Assets/ML-Agents/Examples/PushBlock/Scenes/2ZombieVs3AgentsPushBlock.unity.meta


fileFormatVersion: 2
guid: 473dc7cfdb610468983d530a0fb29bdc
timeCreated: 1506808980
licenseType: Pro
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

63
Project/Assets/ML-Agents/Examples/PushBlock/Scenes/2ZombieVs3AgentsPushBlockSettings.lighting


%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!850595691 &4890085278179872738
LightingSettings:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: 2ZombieVs3AgentsPushBlockSettings
serializedVersion: 2
m_GIWorkflowMode: 0
m_EnableBakedLightmaps: 1
m_EnableRealtimeLightmaps: 1
m_RealtimeEnvironmentLighting: 1
m_BounceScale: 1
m_AlbedoBoost: 1
m_IndirectOutputScale: 1
m_UsingShadowmask: 1
m_BakeBackend: 0
m_LightmapMaxSize: 1024
m_BakeResolution: 40
m_Padding: 2
m_TextureCompression: 1
m_AO: 0
m_AOMaxDistance: 1
m_CompAOExponent: 1
m_CompAOExponentDirect: 0
m_ExtractAO: 0
m_MixedBakeMode: 2
m_LightmapsBakeMode: 1
m_FilterMode: 1
m_LightmapParameters: {fileID: 0}
m_ExportTrainingData: 0
m_TrainingDataDestination: TrainingData
m_RealtimeResolution: 2
m_ForceWhiteAlbedo: 0
m_ForceUpdates: 0
m_FinalGather: 0
m_FinalGatherRayCount: 256
m_FinalGatherFiltering: 1
m_PVRCulling: 1
m_PVRSampling: 1
m_PVRDirectSampleCount: 32
m_PVRSampleCount: 500
m_PVREnvironmentSampleCount: 500
m_PVREnvironmentReferencePointCount: 2048
m_LightProbeSampleCountMultiplier: 4
m_PVRBounces: 2
m_PVRRussianRouletteStartBounce: 2
m_PVREnvironmentMIS: 0
m_PVRFilteringMode: 2
m_PVRDenoiserTypeDirect: 0
m_PVRDenoiserTypeIndirect: 0
m_PVRDenoiserTypeAO: 0
m_PVRFilterTypeDirect: 0
m_PVRFilterTypeIndirect: 0
m_PVRFilterTypeAO: 0
m_PVRFilteringGaussRadiusDirect: 1
m_PVRFilteringGaussRadiusIndirect: 5
m_PVRFilteringGaussRadiusAO: 2
m_PVRFilteringAtrousPositionSigmaDirect: 0.5
m_PVRFilteringAtrousPositionSigmaIndirect: 2
m_PVRFilteringAtrousPositionSigmaAO: 1

8
Project/Assets/ML-Agents/Examples/PushBlock/Scenes/2ZombieVs3AgentsPushBlockSettings.lighting.meta


fileFormatVersion: 2
guid: dca348899e31f4a34b26296363df80fa
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 0
userData:
assetBundleName:
assetBundleVariant:

969
Project/Assets/ML-Agents/Examples/PushBlock/Scenes/PushBlockCollab.unity


%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!29 &1
OcclusionCullingSettings:
m_ObjectHideFlags: 0
serializedVersion: 2
m_OcclusionBakeSettings:
smallestOccluder: 5
smallestHole: 0.25
backfaceThreshold: 100
m_SceneGUID: 00000000000000000000000000000000
m_OcclusionCullingData: {fileID: 0}
--- !u!104 &2
RenderSettings:
m_ObjectHideFlags: 0
serializedVersion: 9
m_Fog: 0
m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
m_FogMode: 3
m_FogDensity: 0.01
m_LinearFogStart: 0
m_LinearFogEnd: 300
m_AmbientSkyColor: {r: 0.8, g: 0.8, b: 0.8, a: 1}
m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1}
m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1}
m_AmbientIntensity: 1
m_AmbientMode: 3
m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1}
m_SkyboxMaterial: {fileID: 0}
m_HaloStrength: 0.5
m_FlareStrength: 1
m_FlareFadeSpeed: 3
m_HaloTexture: {fileID: 0}
m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0}
m_DefaultReflectionMode: 0
m_DefaultReflectionResolution: 128
m_ReflectionBounces: 1
m_ReflectionIntensity: 1
m_CustomReflection: {fileID: 0}
m_Sun: {fileID: 0}
m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1}
m_UseRadianceAmbientProbe: 0
--- !u!157 &3
LightmapSettings:
m_ObjectHideFlags: 0
serializedVersion: 11
m_GIWorkflowMode: 0
m_GISettings:
serializedVersion: 2
m_BounceScale: 1
m_IndirectOutputScale: 1
m_AlbedoBoost: 1
m_EnvironmentLightingMode: 0
m_EnableBakedLightmaps: 1
m_EnableRealtimeLightmaps: 1
m_LightmapEditorSettings:
serializedVersion: 10
m_Resolution: 2
m_BakeResolution: 40
m_AtlasSize: 1024
m_AO: 0
m_AOMaxDistance: 1
m_CompAOExponent: 1
m_CompAOExponentDirect: 0
m_Padding: 2
m_LightmapParameters: {fileID: 0}
m_LightmapsBakeMode: 1
m_TextureCompression: 1
m_FinalGather: 0
m_FinalGatherFiltering: 1
m_FinalGatherRayCount: 256
m_ReflectionCompression: 2
m_MixedBakeMode: 2
m_BakeBackend: 0
m_PVRSampling: 1
m_PVRDirectSampleCount: 32
m_PVRSampleCount: 500
m_PVRBounces: 2
m_PVRFilterTypeDirect: 0
m_PVRFilterTypeIndirect: 0
m_PVRFilterTypeAO: 0
m_PVRFilteringMode: 1
m_PVRCulling: 1
m_PVRFilteringGaussRadiusDirect: 1
m_PVRFilteringGaussRadiusIndirect: 5
m_PVRFilteringGaussRadiusAO: 2
m_PVRFilteringAtrousPositionSigmaDirect: 0.5
m_PVRFilteringAtrousPositionSigmaIndirect: 2
m_PVRFilteringAtrousPositionSigmaAO: 1
m_ShowResolutionOverlay: 1
m_LightingDataAsset: {fileID: 112000002, guid: 03723c7f910c3423aa1974f1b9ce8392,
type: 2}
m_UseShadowmask: 1
--- !u!196 &4
NavMeshSettings:
serializedVersion: 2
m_ObjectHideFlags: 0
m_BuildSettings:
serializedVersion: 2
agentTypeID: 0
agentRadius: 0.5
agentHeight: 2
agentSlope: 45
agentClimb: 0.4
ledgeDropHeight: 0
maxJumpAcrossDistance: 0
minRegionArea: 2
manualCellSize: 0
cellSize: 0.16666667
manualTileSize: 0
tileSize: 256
accuratePlacement: 0
debug:
m_Flags: 0
m_NavMeshData: {fileID: 0}
--- !u!1 &255077123
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 255077126}
- component: {fileID: 255077125}
- component: {fileID: 255077124}
m_Layer: 0
m_Name: EventSystem
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!114 &255077124
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 255077123}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 1077351063, guid: f70555f144d8491a825f0804e09c671c, type: 3}
m_Name:
m_EditorClassIdentifier:
m_HorizontalAxis: Horizontal
m_VerticalAxis: Vertical
m_SubmitButton: Submit
m_CancelButton: Cancel
m_InputActionsPerSecond: 10
m_RepeatDelay: 0.5
m_ForceModuleActive: 0
--- !u!114 &255077125
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 255077123}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: -619905303, guid: f70555f144d8491a825f0804e09c671c, type: 3}
m_Name:
m_EditorClassIdentifier:
m_FirstSelected: {fileID: 0}
m_sendNavigationEvents: 1
m_DragThreshold: 5
--- !u!4 &255077126
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 255077123}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 0}
m_RootOrder: 2
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &318490716
GameObject:
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 318490717}
m_Layer: 0
m_Name: UnityEngine-Recorder
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &318490717
Transform:
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 318490716}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children:
- {fileID: 365376271}
- {fileID: 1265651286}
m_Father: {fileID: 0}
m_RootOrder: 6
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &365376270
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 365376271}
m_Layer: 0
m_Name: Settings
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &365376271
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 365376270}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children:
- {fileID: 1257687049}
m_Father: {fileID: 318490717}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1001 &502449554
PrefabInstance:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
m_TransformParent: {fileID: 0}
m_Modifications:
- target: {fileID: 4943719350691982, guid: 5889392e3f05b448a8a06c5def6c2dec, type: 3}
propertyPath: m_LocalPosition.x
value: 106.38621
objectReference: {fileID: 0}
- target: {fileID: 4943719350691982, guid: 5889392e3f05b448a8a06c5def6c2dec, type: 3}
propertyPath: m_LocalPosition.y
value: 38.840767
objectReference: {fileID: 0}
- target: {fileID: 4943719350691982, guid: 5889392e3f05b448a8a06c5def6c2dec, type: 3}
propertyPath: m_LocalPosition.z
value: 34.72934
objectReference: {fileID: 0}
- target: {fileID: 4943719350691982, guid: 5889392e3f05b448a8a06c5def6c2dec, type: 3}
propertyPath: m_LocalRotation.x
value: 0.31598538
objectReference: {fileID: 0}
- target: {fileID: 4943719350691982, guid: 5889392e3f05b448a8a06c5def6c2dec, type: 3}
propertyPath: m_LocalRotation.y
value: -0.3596048
objectReference: {fileID: 0}
- target: {fileID: 4943719350691982, guid: 5889392e3f05b448a8a06c5def6c2dec, type: 3}
propertyPath: m_LocalRotation.z
value: 0.13088542
objectReference: {fileID: 0}
- target: {fileID: 4943719350691982, guid: 5889392e3f05b448a8a06c5def6c2dec, type: 3}
propertyPath: m_LocalRotation.w
value: 0.8681629
objectReference: {fileID: 0}
- target: {fileID: 4943719350691982, guid: 5889392e3f05b448a8a06c5def6c2dec, type: 3}
propertyPath: m_RootOrder
value: 4
objectReference: {fileID: 0}
m_RemovedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: 5889392e3f05b448a8a06c5def6c2dec, type: 3}
--- !u!1001 &687199677
PrefabInstance:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
m_TransformParent: {fileID: 0}
m_Modifications:
- target: {fileID: 2313762877161590336, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: GroupId
value: 1
objectReference: {fileID: 0}
- target: {fileID: 2415063656827223864, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: m_LocalPosition.x
value: 50
objectReference: {fileID: 0}
- target: {fileID: 2415063656827223864, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: m_LocalPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2415063656827223864, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: m_LocalPosition.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2415063656827223864, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: m_LocalRotation.x
value: -0
objectReference: {fileID: 0}
- target: {fileID: 2415063656827223864, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: m_LocalRotation.y
value: -0
objectReference: {fileID: 0}
- target: {fileID: 2415063656827223864, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: m_LocalRotation.z
value: -0
objectReference: {fileID: 0}
- target: {fileID: 2415063656827223864, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: m_LocalRotation.w
value: 1
objectReference: {fileID: 0}
- target: {fileID: 2415063656827223864, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: m_RootOrder
value: 7
objectReference: {fileID: 0}
- target: {fileID: 2415063656827223864, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: m_LocalEulerAnglesHint.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2415063656827223864, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: m_LocalEulerAnglesHint.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2415063656827223864, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: m_LocalEulerAnglesHint.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2416678558414254088, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: m_Name
value: PushBlockCollabArea (1)
objectReference: {fileID: 0}
- target: {fileID: 2416809913911815199, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: GroupId
value: 1
objectReference: {fileID: 0}
m_RemovedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: 8689a8cfb0ac742bfa27214909ebb1e8, type: 3}
--- !u!1001 &768746187
PrefabInstance:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
m_TransformParent: {fileID: 0}
m_Modifications:
- target: {fileID: 2313762877161590336, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: GroupId
value: 3
objectReference: {fileID: 0}
- target: {fileID: 2415063656827223864, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: m_LocalPosition.x
value: 150
objectReference: {fileID: 0}
- target: {fileID: 2415063656827223864, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: m_LocalPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2415063656827223864, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: m_LocalPosition.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2415063656827223864, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: m_LocalRotation.x
value: -0
objectReference: {fileID: 0}
- target: {fileID: 2415063656827223864, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: m_LocalRotation.y
value: -0
objectReference: {fileID: 0}
- target: {fileID: 2415063656827223864, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: m_LocalRotation.z
value: -0
objectReference: {fileID: 0}
- target: {fileID: 2415063656827223864, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: m_LocalRotation.w
value: 1
objectReference: {fileID: 0}
- target: {fileID: 2415063656827223864, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: m_RootOrder
value: 9
objectReference: {fileID: 0}
- target: {fileID: 2415063656827223864, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: m_LocalEulerAnglesHint.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2415063656827223864, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: m_LocalEulerAnglesHint.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2415063656827223864, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: m_LocalEulerAnglesHint.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2416678558414254088, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: m_Name
value: PushBlockCollabArea (3)
objectReference: {fileID: 0}
- target: {fileID: 2416809913911815199, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: GroupId
value: 3
objectReference: {fileID: 0}
m_RemovedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: 8689a8cfb0ac742bfa27214909ebb1e8, type: 3}
--- !u!1 &1009000883
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1009000884}
- component: {fileID: 1009000887}
m_Layer: 0
m_Name: SingleCam
m_TagString: MainCamera
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &1009000884
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1009000883}
m_LocalRotation: {x: 0.5, y: 0, z: 0, w: 0.8660254}
m_LocalPosition: {x: 0, y: 20, z: -15}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 0}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 60, y: 0, z: 0}
--- !u!20 &1009000887
Camera:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1009000883}
m_Enabled: 1
serializedVersion: 2
m_ClearFlags: 2
m_BackGroundColor: {r: 0.46666667, g: 0.5647059, b: 0.60784316, a: 1}
m_projectionMatrixMode: 1
m_SensorSize: {x: 36, y: 24}
m_LensShift: {x: 0, y: 0}
m_GateFitMode: 2
m_FocalLength: 50
m_NormalizedViewPortRect:
serializedVersion: 2
x: 0
y: 0
width: 1
height: 1
near clip plane: 0.3
far clip plane: 1000
field of view: 56.2
orthographic: 0
orthographic size: 6.98
m_Depth: 2
m_CullingMask:
serializedVersion: 2
m_Bits: 4294967295
m_RenderingPath: -1
m_TargetTexture: {fileID: 0}
m_TargetDisplay: 0
m_TargetEye: 3
m_HDR: 1
m_AllowMSAA: 1
m_AllowDynamicResolution: 0
m_ForceIntoRT: 0
m_OcclusionCulling: 1
m_StereoConvergence: 10
m_StereoSeparation: 0.022
--- !u!1001 &1219049691
PrefabInstance:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
m_TransformParent: {fileID: 0}
m_Modifications:
- target: {fileID: 2313762877161590336, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: GroupId
value: 4
objectReference: {fileID: 0}
- target: {fileID: 2415063656827223864, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: m_LocalPosition.x
value: 200
objectReference: {fileID: 0}
- target: {fileID: 2415063656827223864, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: m_LocalPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2415063656827223864, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: m_LocalPosition.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2415063656827223864, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: m_LocalRotation.x
value: -0
objectReference: {fileID: 0}
- target: {fileID: 2415063656827223864, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: m_LocalRotation.y
value: -0
objectReference: {fileID: 0}
- target: {fileID: 2415063656827223864, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: m_LocalRotation.z
value: -0
objectReference: {fileID: 0}
- target: {fileID: 2415063656827223864, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: m_LocalRotation.w
value: 1
objectReference: {fileID: 0}
- target: {fileID: 2415063656827223864, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: m_RootOrder
value: 10
objectReference: {fileID: 0}
- target: {fileID: 2415063656827223864, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: m_LocalEulerAnglesHint.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2415063656827223864, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: m_LocalEulerAnglesHint.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2415063656827223864, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: m_LocalEulerAnglesHint.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2416678558414254088, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: m_Name
value: PushBlockCollabArea (4)
objectReference: {fileID: 0}
- target: {fileID: 2416809913911815199, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: GroupId
value: 4
objectReference: {fileID: 0}
m_RemovedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: 8689a8cfb0ac742bfa27214909ebb1e8, type: 3}
--- !u!1 &1257687048
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1257687049}
m_Layer: 0
m_Name: 50bfc0f4c3d6f46df98d3c66ceb89209
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &1257687049
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1257687048}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 365376271}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &1265651285
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1265651286}
m_Layer: 0
m_Name: RecordingSessions
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &1265651286
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1265651285}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 318490717}
m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1001 &1558468742
PrefabInstance:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
m_TransformParent: {fileID: 0}
m_Modifications:
- target: {fileID: 2313762877161590336, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: GroupId
value: 2
objectReference: {fileID: 0}
- target: {fileID: 2415063656827223864, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: m_LocalPosition.x
value: 100
objectReference: {fileID: 0}
- target: {fileID: 2415063656827223864, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: m_LocalPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2415063656827223864, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: m_LocalPosition.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2415063656827223864, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: m_LocalRotation.x
value: -0
objectReference: {fileID: 0}
- target: {fileID: 2415063656827223864, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: m_LocalRotation.y
value: -0
objectReference: {fileID: 0}
- target: {fileID: 2415063656827223864, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: m_LocalRotation.z
value: -0
objectReference: {fileID: 0}
- target: {fileID: 2415063656827223864, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: m_LocalRotation.w
value: 1
objectReference: {fileID: 0}
- target: {fileID: 2415063656827223864, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: m_RootOrder
value: 8
objectReference: {fileID: 0}
- target: {fileID: 2415063656827223864, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: m_LocalEulerAnglesHint.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2415063656827223864, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: m_LocalEulerAnglesHint.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2415063656827223864, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: m_LocalEulerAnglesHint.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2416678558414254088, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: m_Name
value: PushBlockCollabArea (2)
objectReference: {fileID: 0}
- target: {fileID: 2416809913911815199, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: GroupId
value: 2
objectReference: {fileID: 0}
m_RemovedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: 8689a8cfb0ac742bfa27214909ebb1e8, type: 3}
--- !u!1 &1574236047
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1574236049}
- component: {fileID: 1574236050}
- component: {fileID: 1574236048}
m_Layer: 0
m_Name: PushBlockSettings
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!114 &1574236048
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1574236047}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: ec51f47c5ed0478080c449c74fd9c154, type: 3}
m_Name:
m_EditorClassIdentifier:
gravityMultiplier: 1.5
fixedDeltaTime: 0.02
maximumDeltaTime: 0.33333334
solverIterations: 6
solverVelocityIterations: 1
reuseCollisionCallbacks: 1
--- !u!4 &1574236049
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1574236047}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 0}
m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &1574236050
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1574236047}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: e5ed63dbfa25542ecb8bc013adfba183, type: 3}
m_Name:
m_EditorClassIdentifier:
agentRunSpeed: 3
agentRotationSpeed: 15
spawnAreaMarginMultiplier: 0.5
goalScoredMaterial: {fileID: 2100000, guid: df32cc593804f42df97464dc455057b8, type: 2}
failMaterial: {fileID: 2100000, guid: a1daf31cdf41e484ca9ac33a5c6f524a, type: 2}
--- !u!1001 &1900462655
PrefabInstance:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
m_TransformParent: {fileID: 0}
m_Modifications:
- target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68,
type: 3}
propertyPath: m_LocalPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68,
type: 3}
propertyPath: m_LocalPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68,
type: 3}
propertyPath: m_LocalPosition.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68,
type: 3}
propertyPath: m_LocalRotation.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68,
type: 3}
propertyPath: m_LocalRotation.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68,
type: 3}
propertyPath: m_LocalRotation.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68,
type: 3}
propertyPath: m_LocalRotation.w
value: 1
objectReference: {fileID: 0}
- target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68,
type: 3}
propertyPath: m_RootOrder
value: 3
objectReference: {fileID: 0}
- target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68,
type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68,
type: 3}
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68,
type: 3}
propertyPath: m_SizeDelta.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68,
type: 3}
propertyPath: m_SizeDelta.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68,
type: 3}
propertyPath: m_AnchorMin.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68,
type: 3}
propertyPath: m_AnchorMin.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68,
type: 3}
propertyPath: m_AnchorMax.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68,
type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68,
type: 3}
propertyPath: m_Pivot.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68,
type: 3}
propertyPath: m_Pivot.y
value: 0
objectReference: {fileID: 0}
m_RemovedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: 3ce107b4a79bc4eef83afde434932a68, type: 3}
--- !u!1001 &2416809913901764614
PrefabInstance:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
m_TransformParent: {fileID: 0}
m_Modifications:
- target: {fileID: 2415063656827223864, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: m_LocalPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2415063656827223864, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: m_LocalPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2415063656827223864, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: m_LocalPosition.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2415063656827223864, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: m_LocalRotation.x
value: -0
objectReference: {fileID: 0}
- target: {fileID: 2415063656827223864, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: m_LocalRotation.y
value: -0
objectReference: {fileID: 0}
- target: {fileID: 2415063656827223864, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: m_LocalRotation.z
value: -0
objectReference: {fileID: 0}
- target: {fileID: 2415063656827223864, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: m_LocalRotation.w
value: 1
objectReference: {fileID: 0}
- target: {fileID: 2415063656827223864, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: m_RootOrder
value: 5
objectReference: {fileID: 0}
- target: {fileID: 2415063656827223864, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: m_LocalEulerAnglesHint.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2415063656827223864, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: m_LocalEulerAnglesHint.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2415063656827223864, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: m_LocalEulerAnglesHint.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2416678558414254088, guid: 8689a8cfb0ac742bfa27214909ebb1e8,
type: 3}
propertyPath: m_Name
value: PushBlockCollabArea
objectReference: {fileID: 0}
m_RemovedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: 8689a8cfb0ac742bfa27214909ebb1e8, type: 3}

9
Project/Assets/ML-Agents/Examples/PushBlock/Scenes/PushBlockCollab.unity.meta


fileFormatVersion: 2
guid: b9c81cbb0f0ac40649eddfef0971e81b
timeCreated: 1506808980
licenseType: Pro
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

997
Project/Assets/ML-Agents/Examples/PushBlock/Scenes/ZombiePushBlock.unity


%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!29 &1
OcclusionCullingSettings:
m_ObjectHideFlags: 0
serializedVersion: 2
m_OcclusionBakeSettings:
smallestOccluder: 5
smallestHole: 0.25
backfaceThreshold: 100
m_SceneGUID: 00000000000000000000000000000000
m_OcclusionCullingData: {fileID: 0}
--- !u!104 &2
RenderSettings:
m_ObjectHideFlags: 0
serializedVersion: 9
m_Fog: 0
m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
m_FogMode: 3
m_FogDensity: 0.01
m_LinearFogStart: 0
m_LinearFogEnd: 300
m_AmbientSkyColor: {r: 0.8, g: 0.8, b: 0.8, a: 1}
m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1}
m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1}
m_AmbientIntensity: 1
m_AmbientMode: 3
m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1}
m_SkyboxMaterial: {fileID: 0}
m_HaloStrength: 0.5
m_FlareStrength: 1
m_FlareFadeSpeed: 3
m_HaloTexture: {fileID: 0}
m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0}
m_DefaultReflectionMode: 0
m_DefaultReflectionResolution: 128
m_ReflectionBounces: 1
m_ReflectionIntensity: 1
m_CustomReflection: {fileID: 0}
m_Sun: {fileID: 0}
m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1}
m_UseRadianceAmbientProbe: 0
--- !u!157 &3
LightmapSettings:
m_ObjectHideFlags: 0
serializedVersion: 11
m_GIWorkflowMode: 0
m_GISettings:
serializedVersion: 2
m_BounceScale: 1
m_IndirectOutputScale: 1
m_AlbedoBoost: 1
m_EnvironmentLightingMode: 0
m_EnableBakedLightmaps: 1
m_EnableRealtimeLightmaps: 1
m_LightmapEditorSettings:
serializedVersion: 10
m_Resolution: 2
m_BakeResolution: 40
m_AtlasSize: 1024
m_AO: 0
m_AOMaxDistance: 1
m_CompAOExponent: 1
m_CompAOExponentDirect: 0
m_Padding: 2
m_LightmapParameters: {fileID: 0}
m_LightmapsBakeMode: 1
m_TextureCompression: 1
m_FinalGather: 0
m_FinalGatherFiltering: 1
m_FinalGatherRayCount: 256
m_ReflectionCompression: 2
m_MixedBakeMode: 2
m_BakeBackend: 0
m_PVRSampling: 1
m_PVRDirectSampleCount: 32
m_PVRSampleCount: 500
m_PVRBounces: 2
m_PVRFilterTypeDirect: 0
m_PVRFilterTypeIndirect: 0
m_PVRFilterTypeAO: 0
m_PVRFilteringMode: 1
m_PVRCulling: 1
m_PVRFilteringGaussRadiusDirect: 1
m_PVRFilteringGaussRadiusIndirect: 5
m_PVRFilteringGaussRadiusAO: 2
m_PVRFilteringAtrousPositionSigmaDirect: 0.5
m_PVRFilteringAtrousPositionSigmaIndirect: 2
m_PVRFilteringAtrousPositionSigmaAO: 1
m_ShowResolutionOverlay: 1
m_LightingDataAsset: {fileID: 112000002, guid: 03723c7f910c3423aa1974f1b9ce8392,
type: 2}
m_UseShadowmask: 1
--- !u!196 &4
NavMeshSettings:
serializedVersion: 2
m_ObjectHideFlags: 0
m_BuildSettings:
serializedVersion: 2
agentTypeID: 0
agentRadius: 0.5
agentHeight: 2
agentSlope: 45
agentClimb: 0.4
ledgeDropHeight: 0
maxJumpAcrossDistance: 0
minRegionArea: 2
manualCellSize: 0
cellSize: 0.16666667
manualTileSize: 0
tileSize: 256
accuratePlacement: 0
debug:
m_Flags: 0
m_NavMeshData: {fileID: 0}
--- !u!1001 &185397489
PrefabInstance:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
m_TransformParent: {fileID: 0}
m_Modifications:
- target: {fileID: 7252038608842613995, guid: 4efb4d72c7b94469ca38276842875f65,
type: 3}
propertyPath: GroupId
value: 2
objectReference: {fileID: 0}
- target: {fileID: 7252038610261898582, guid: 4efb4d72c7b94469ca38276842875f65,
type: 3}
propertyPath: GroupId
value: 2
objectReference: {fileID: 0}
- target: {fileID: 7252929719452920129, guid: 4efb4d72c7b94469ca38276842875f65,
type: 3}
propertyPath: m_Name
value: ZombiePushBlockCollabArea (2)
objectReference: {fileID: 0}
- target: {fileID: 7253705700397590129, guid: 4efb4d72c7b94469ca38276842875f65,
type: 3}
propertyPath: m_LocalPosition.x
value: 50
objectReference: {fileID: 0}
- target: {fileID: 7253705700397590129, guid: 4efb4d72c7b94469ca38276842875f65,
type: 3}
propertyPath: m_LocalPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7253705700397590129, guid: 4efb4d72c7b94469ca38276842875f65,
type: 3}
propertyPath: m_LocalPosition.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7253705700397590129, guid: 4efb4d72c7b94469ca38276842875f65,
type: 3}
propertyPath: m_LocalRotation.x
value: -0
objectReference: {fileID: 0}
- target: {fileID: 7253705700397590129, guid: 4efb4d72c7b94469ca38276842875f65,
type: 3}
propertyPath: m_LocalRotation.y
value: -0
objectReference: {fileID: 0}
- target: {fileID: 7253705700397590129, guid: 4efb4d72c7b94469ca38276842875f65,
type: 3}
propertyPath: m_LocalRotation.z
value: -0
objectReference: {fileID: 0}
- target: {fileID: 7253705700397590129, guid: 4efb4d72c7b94469ca38276842875f65,
type: 3}
propertyPath: m_LocalRotation.w
value: 1
objectReference: {fileID: 0}
- target: {fileID: 7253705700397590129, guid: 4efb4d72c7b94469ca38276842875f65,
type: 3}
propertyPath: m_RootOrder
value: 9
objectReference: {fileID: 0}
- target: {fileID: 7253705700397590129, guid: 4efb4d72c7b94469ca38276842875f65,
type: 3}
propertyPath: m_LocalEulerAnglesHint.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7253705700397590129, guid: 4efb4d72c7b94469ca38276842875f65,
type: 3}
propertyPath: m_LocalEulerAnglesHint.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7253705700397590129, guid: 4efb4d72c7b94469ca38276842875f65,
type: 3}
propertyPath: m_LocalEulerAnglesHint.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7292016560317339401, guid: 4efb4d72c7b94469ca38276842875f65,
type: 3}
propertyPath: GroupId
value: 2
objectReference: {fileID: 0}
m_RemovedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: 4efb4d72c7b94469ca38276842875f65, type: 3}
--- !u!1 &255077123
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 255077126}
- component: {fileID: 255077125}
- component: {fileID: 255077124}
m_Layer: 0
m_Name: EventSystem
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!114 &255077124
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 255077123}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 1077351063, guid: f70555f144d8491a825f0804e09c671c, type: 3}
m_Name:
m_EditorClassIdentifier:
m_HorizontalAxis: Horizontal
m_VerticalAxis: Vertical
m_SubmitButton: Submit
m_CancelButton: Cancel
m_InputActionsPerSecond: 10
m_RepeatDelay: 0.5
m_ForceModuleActive: 0
--- !u!114 &255077125
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 255077123}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: -619905303, guid: f70555f144d8491a825f0804e09c671c, type: 3}
m_Name:
m_EditorClassIdentifier:
m_FirstSelected: {fileID: 0}
m_sendNavigationEvents: 1
m_DragThreshold: 5
--- !u!4 &255077126
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 255077123}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 0}
m_RootOrder: 5
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &318490716
GameObject:
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 318490717}
m_Layer: 0
m_Name: UnityEngine-Recorder
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &318490717
Transform:
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 318490716}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children:
- {fileID: 365376271}
- {fileID: 1265651286}
m_Father: {fileID: 0}
m_RootOrder: 7
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1001 &323272729
PrefabInstance:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
m_TransformParent: {fileID: 0}
m_Modifications:
- target: {fileID: 7252038608842613995, guid: 4efb4d72c7b94469ca38276842875f65,
type: 3}
propertyPath: GroupId
value: 1
objectReference: {fileID: 0}
- target: {fileID: 7252038608842613995, guid: 4efb4d72c7b94469ca38276842875f65,
type: 3}
propertyPath: m_Model
value:
objectReference: {fileID: 11400000, guid: 9a4ea4894b7fb49859cfa9c16652b207,
type: 3}
- target: {fileID: 7252038610261898582, guid: 4efb4d72c7b94469ca38276842875f65,
type: 3}
propertyPath: GroupId
value: 1
objectReference: {fileID: 0}
- target: {fileID: 7252038610261898582, guid: 4efb4d72c7b94469ca38276842875f65,
type: 3}
propertyPath: m_Model
value:
objectReference: {fileID: 11400000, guid: 9a4ea4894b7fb49859cfa9c16652b207,
type: 3}
- target: {fileID: 7252929719452920129, guid: 4efb4d72c7b94469ca38276842875f65,
type: 3}
propertyPath: m_Name
value: ZombiePushBlockCollabArea (1)
objectReference: {fileID: 0}
- target: {fileID: 7253705700397590129, guid: 4efb4d72c7b94469ca38276842875f65,
type: 3}
propertyPath: m_LocalPosition.x
value: -50
objectReference: {fileID: 0}
- target: {fileID: 7253705700397590129, guid: 4efb4d72c7b94469ca38276842875f65,
type: 3}
propertyPath: m_LocalPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7253705700397590129, guid: 4efb4d72c7b94469ca38276842875f65,
type: 3}
propertyPath: m_LocalPosition.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7253705700397590129, guid: 4efb4d72c7b94469ca38276842875f65,
type: 3}
propertyPath: m_LocalRotation.x
value: -0
objectReference: {fileID: 0}
- target: {fileID: 7253705700397590129, guid: 4efb4d72c7b94469ca38276842875f65,
type: 3}
propertyPath: m_LocalRotation.y
value: -0
objectReference: {fileID: 0}
- target: {fileID: 7253705700397590129, guid: 4efb4d72c7b94469ca38276842875f65,
type: 3}
propertyPath: m_LocalRotation.z
value: -0
objectReference: {fileID: 0}
- target: {fileID: 7253705700397590129, guid: 4efb4d72c7b94469ca38276842875f65,
type: 3}
propertyPath: m_LocalRotation.w
value: 1
objectReference: {fileID: 0}
- target: {fileID: 7253705700397590129, guid: 4efb4d72c7b94469ca38276842875f65,
type: 3}
propertyPath: m_RootOrder
value: 8
objectReference: {fileID: 0}
- target: {fileID: 7253705700397590129, guid: 4efb4d72c7b94469ca38276842875f65,
type: 3}
propertyPath: m_LocalEulerAnglesHint.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7253705700397590129, guid: 4efb4d72c7b94469ca38276842875f65,
type: 3}
propertyPath: m_LocalEulerAnglesHint.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7253705700397590129, guid: 4efb4d72c7b94469ca38276842875f65,
type: 3}
propertyPath: m_LocalEulerAnglesHint.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7292016560317339401, guid: 4efb4d72c7b94469ca38276842875f65,
type: 3}
propertyPath: GroupId
value: 1
objectReference: {fileID: 0}
- target: {fileID: 7292016560317339401, guid: 4efb4d72c7b94469ca38276842875f65,
type: 3}
propertyPath: m_Model
value:
objectReference: {fileID: 11400000, guid: 9a4ea4894b7fb49859cfa9c16652b207,
type: 3}
m_RemovedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: 4efb4d72c7b94469ca38276842875f65, type: 3}
--- !u!1 &365376270
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 365376271}
m_Layer: 0
m_Name: Settings
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &365376271
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 365376270}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children:
- {fileID: 1257687049}
m_Father: {fileID: 318490717}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1001 &394216286
PrefabInstance:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
m_TransformParent: {fileID: 0}
m_Modifications:
- target: {fileID: 7430253518223459950, guid: ff2999c8614d848f8a7e55e3a6fb9282,
type: 3}
propertyPath: m_Name
value: WormBasePrefab
objectReference: {fileID: 0}
- target: {fileID: 7430253518223459950, guid: ff2999c8614d848f8a7e55e3a6fb9282,
type: 3}
propertyPath: m_IsActive
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7430253518223459951, guid: ff2999c8614d848f8a7e55e3a6fb9282,
type: 3}
propertyPath: m_LocalPosition.x
value: -9.25
objectReference: {fileID: 0}
- target: {fileID: 7430253518223459951, guid: ff2999c8614d848f8a7e55e3a6fb9282,
type: 3}
propertyPath: m_LocalPosition.y
value: 1.1849128
objectReference: {fileID: 0}
- target: {fileID: 7430253518223459951, guid: ff2999c8614d848f8a7e55e3a6fb9282,
type: 3}
propertyPath: m_LocalPosition.z
value: 0.6859223
objectReference: {fileID: 0}
- target: {fileID: 7430253518223459951, guid: ff2999c8614d848f8a7e55e3a6fb9282,
type: 3}
propertyPath: m_LocalRotation.x
value: -0
objectReference: {fileID: 0}
- target: {fileID: 7430253518223459951, guid: ff2999c8614d848f8a7e55e3a6fb9282,
type: 3}
propertyPath: m_LocalRotation.y
value: -0
objectReference: {fileID: 0}
- target: {fileID: 7430253518223459951, guid: ff2999c8614d848f8a7e55e3a6fb9282,
type: 3}
propertyPath: m_LocalRotation.z
value: -0
objectReference: {fileID: 0}
- target: {fileID: 7430253518223459951, guid: ff2999c8614d848f8a7e55e3a6fb9282,
type: 3}
propertyPath: m_LocalRotation.w
value: 1
objectReference: {fileID: 0}
- target: {fileID: 7430253518223459951, guid: ff2999c8614d848f8a7e55e3a6fb9282,
type: 3}
propertyPath: m_RootOrder
value: 1
objectReference: {fileID: 0}
- target: {fileID: 7430253518223459951, guid: ff2999c8614d848f8a7e55e3a6fb9282,
type: 3}
propertyPath: m_LocalEulerAnglesHint.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7430253518223459951, guid: ff2999c8614d848f8a7e55e3a6fb9282,
type: 3}
propertyPath: m_LocalEulerAnglesHint.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7430253518223459951, guid: ff2999c8614d848f8a7e55e3a6fb9282,
type: 3}
propertyPath: m_LocalEulerAnglesHint.z
value: 0
objectReference: {fileID: 0}
m_RemovedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: ff2999c8614d848f8a7e55e3a6fb9282, type: 3}
--- !u!1001 &502449554
PrefabInstance:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
m_TransformParent: {fileID: 0}
m_Modifications:
- target: {fileID: 4943719350691982, guid: 5889392e3f05b448a8a06c5def6c2dec, type: 3}
propertyPath: m_LocalPosition.x
value: 106.38621
objectReference: {fileID: 0}
- target: {fileID: 4943719350691982, guid: 5889392e3f05b448a8a06c5def6c2dec, type: 3}
propertyPath: m_LocalPosition.y
value: 38.840767
objectReference: {fileID: 0}
- target: {fileID: 4943719350691982, guid: 5889392e3f05b448a8a06c5def6c2dec, type: 3}
propertyPath: m_LocalPosition.z
value: 34.72934
objectReference: {fileID: 0}
- target: {fileID: 4943719350691982, guid: 5889392e3f05b448a8a06c5def6c2dec, type: 3}
propertyPath: m_LocalRotation.x
value: 0.31598538
objectReference: {fileID: 0}
- target: {fileID: 4943719350691982, guid: 5889392e3f05b448a8a06c5def6c2dec, type: 3}
propertyPath: m_LocalRotation.y
value: -0.3596048
objectReference: {fileID: 0}
- target: {fileID: 4943719350691982, guid: 5889392e3f05b448a8a06c5def6c2dec, type: 3}
propertyPath: m_LocalRotation.z
value: 0.13088542
objectReference: {fileID: 0}
- target: {fileID: 4943719350691982, guid: 5889392e3f05b448a8a06c5def6c2dec, type: 3}
propertyPath: m_LocalRotation.w
value: 0.8681629
objectReference: {fileID: 0}
- target: {fileID: 4943719350691982, guid: 5889392e3f05b448a8a06c5def6c2dec, type: 3}
propertyPath: m_RootOrder
value: 4
objectReference: {fileID: 0}
m_RemovedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: 5889392e3f05b448a8a06c5def6c2dec, type: 3}
--- !u!1001 &714209662
PrefabInstance:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
m_TransformParent: {fileID: 0}
m_Modifications:
- target: {fileID: 7252038608842613995, guid: 4efb4d72c7b94469ca38276842875f65,
type: 3}
propertyPath: GroupId
value: 3
objectReference: {fileID: 0}
- target: {fileID: 7252038610261898582, guid: 4efb4d72c7b94469ca38276842875f65,
type: 3}
propertyPath: GroupId
value: 3
objectReference: {fileID: 0}
- target: {fileID: 7252929719452920129, guid: 4efb4d72c7b94469ca38276842875f65,
type: 3}
propertyPath: m_Name
value: ZombiePushBlockCollabArea (3)
objectReference: {fileID: 0}
- target: {fileID: 7253705700397590129, guid: 4efb4d72c7b94469ca38276842875f65,
type: 3}
propertyPath: m_LocalPosition.x
value: 100
objectReference: {fileID: 0}
- target: {fileID: 7253705700397590129, guid: 4efb4d72c7b94469ca38276842875f65,
type: 3}
propertyPath: m_LocalPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7253705700397590129, guid: 4efb4d72c7b94469ca38276842875f65,
type: 3}
propertyPath: m_LocalPosition.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7253705700397590129, guid: 4efb4d72c7b94469ca38276842875f65,
type: 3}
propertyPath: m_LocalRotation.x
value: -0
objectReference: {fileID: 0}
- target: {fileID: 7253705700397590129, guid: 4efb4d72c7b94469ca38276842875f65,
type: 3}
propertyPath: m_LocalRotation.y
value: -0
objectReference: {fileID: 0}
- target: {fileID: 7253705700397590129, guid: 4efb4d72c7b94469ca38276842875f65,
type: 3}
propertyPath: m_LocalRotation.z
value: -0
objectReference: {fileID: 0}
- target: {fileID: 7253705700397590129, guid: 4efb4d72c7b94469ca38276842875f65,
type: 3}
propertyPath: m_LocalRotation.w
value: 1
objectReference: {fileID: 0}
- target: {fileID: 7253705700397590129, guid: 4efb4d72c7b94469ca38276842875f65,
type: 3}
propertyPath: m_RootOrder
value: 10
objectReference: {fileID: 0}
- target: {fileID: 7253705700397590129, guid: 4efb4d72c7b94469ca38276842875f65,
type: 3}
propertyPath: m_LocalEulerAnglesHint.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7253705700397590129, guid: 4efb4d72c7b94469ca38276842875f65,
type: 3}
propertyPath: m_LocalEulerAnglesHint.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7253705700397590129, guid: 4efb4d72c7b94469ca38276842875f65,
type: 3}
propertyPath: m_LocalEulerAnglesHint.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7292016560317339401, guid: 4efb4d72c7b94469ca38276842875f65,
type: 3}
propertyPath: GroupId
value: 3
objectReference: {fileID: 0}
m_RemovedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: 4efb4d72c7b94469ca38276842875f65, type: 3}
--- !u!1 &1009000883
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1009000884}
- component: {fileID: 1009000887}
m_Layer: 0
m_Name: SingleCam
m_TagString: MainCamera
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &1009000884
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1009000883}
m_LocalRotation: {x: 0.5, y: 0, z: 0, w: 0.8660254}
m_LocalPosition: {x: 0, y: 20, z: -15}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 0}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 60, y: 0, z: 0}
--- !u!20 &1009000887
Camera:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1009000883}
m_Enabled: 1
serializedVersion: 2
m_ClearFlags: 2
m_BackGroundColor: {r: 0.46666667, g: 0.5647059, b: 0.60784316, a: 1}
m_projectionMatrixMode: 1
m_SensorSize: {x: 36, y: 24}
m_LensShift: {x: 0, y: 0}
m_GateFitMode: 2
m_FocalLength: 50
m_NormalizedViewPortRect:
serializedVersion: 2
x: 0
y: 0
width: 1
height: 1
near clip plane: 0.3
far clip plane: 1000
field of view: 56.2
orthographic: 0
orthographic size: 6.98
m_Depth: 2
m_CullingMask:
serializedVersion: 2
m_Bits: 4294967295
m_RenderingPath: -1
m_TargetTexture: {fileID: 0}
m_TargetDisplay: 0
m_TargetEye: 3
m_HDR: 1
m_AllowMSAA: 1
m_AllowDynamicResolution: 0
m_ForceIntoRT: 0
m_OcclusionCulling: 1
m_StereoConvergence: 10
m_StereoSeparation: 0.022
--- !u!1 &1257687048
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1257687049}
m_Layer: 0
m_Name: 50bfc0f4c3d6f46df98d3c66ceb89209
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &1257687049
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1257687048}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 365376271}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &1265651285
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1265651286}
m_Layer: 0
m_Name: RecordingSessions
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &1265651286
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1265651285}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 318490717}
m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &1574236047
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1574236049}
- component: {fileID: 1574236050}
- component: {fileID: 1574236048}
m_Layer: 0
m_Name: PushBlockSettings
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!114 &1574236048
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1574236047}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: ec51f47c5ed0478080c449c74fd9c154, type: 3}
m_Name:
m_EditorClassIdentifier:
gravityMultiplier: 1.5
fixedDeltaTime: 0.01333
maximumDeltaTime: 0.33333334
solverIterations: 12
solverVelocityIterations: 12
reuseCollisionCallbacks: 1
--- !u!4 &1574236049
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1574236047}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 0}
m_RootOrder: 3
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &1574236050
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1574236047}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: e5ed63dbfa25542ecb8bc013adfba183, type: 3}
m_Name:
m_EditorClassIdentifier:
agentRunSpeed: 3
agentRotationSpeed: 15
spawnAreaMarginMultiplier: 0.5
goalScoredMaterial: {fileID: 2100000, guid: df32cc593804f42df97464dc455057b8, type: 2}
failMaterial: {fileID: 2100000, guid: a1daf31cdf41e484ca9ac33a5c6f524a, type: 2}
--- !u!1001 &1900462655
PrefabInstance:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
m_TransformParent: {fileID: 0}
m_Modifications:
- target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68,
type: 3}
propertyPath: m_LocalPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68,
type: 3}
propertyPath: m_LocalPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68,
type: 3}
propertyPath: m_LocalPosition.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68,
type: 3}
propertyPath: m_LocalRotation.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68,
type: 3}
propertyPath: m_LocalRotation.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68,
type: 3}
propertyPath: m_LocalRotation.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68,
type: 3}
propertyPath: m_LocalRotation.w
value: 1
objectReference: {fileID: 0}
- target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68,
type: 3}
propertyPath: m_RootOrder
value: 2
objectReference: {fileID: 0}
- target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68,
type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68,
type: 3}
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68,
type: 3}
propertyPath: m_SizeDelta.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68,
type: 3}
propertyPath: m_SizeDelta.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68,
type: 3}
propertyPath: m_AnchorMin.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68,
type: 3}
propertyPath: m_AnchorMin.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68,
type: 3}
propertyPath: m_AnchorMax.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68,
type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68,
type: 3}
propertyPath: m_Pivot.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 224194346362733190, guid: 3ce107b4a79bc4eef83afde434932a68,
type: 3}
propertyPath: m_Pivot.y
value: 0
objectReference: {fileID: 0}
m_RemovedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: 3ce107b4a79bc4eef83afde434932a68, type: 3}
--- !u!1001 &7252038610051467599
PrefabInstance:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
m_TransformParent: {fileID: 0}
m_Modifications:
- target: {fileID: 7252929719452920129, guid: 4efb4d72c7b94469ca38276842875f65,
type: 3}
propertyPath: m_Name
value: ZombiePushBlockCollabArea
objectReference: {fileID: 0}
- target: {fileID: 7253705700397590129, guid: 4efb4d72c7b94469ca38276842875f65,
type: 3}
propertyPath: m_LocalPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7253705700397590129, guid: 4efb4d72c7b94469ca38276842875f65,
type: 3}
propertyPath: m_LocalPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7253705700397590129, guid: 4efb4d72c7b94469ca38276842875f65,
type: 3}
propertyPath: m_LocalPosition.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7253705700397590129, guid: 4efb4d72c7b94469ca38276842875f65,
type: 3}
propertyPath: m_LocalRotation.x
value: -0
objectReference: {fileID: 0}
- target: {fileID: 7253705700397590129, guid: 4efb4d72c7b94469ca38276842875f65,
type: 3}
propertyPath: m_LocalRotation.y
value: -0
objectReference: {fileID: 0}
- target: {fileID: 7253705700397590129, guid: 4efb4d72c7b94469ca38276842875f65,
type: 3}
propertyPath: m_LocalRotation.z
value: -0
objectReference: {fileID: 0}
- target: {fileID: 7253705700397590129, guid: 4efb4d72c7b94469ca38276842875f65,
type: 3}
propertyPath: m_LocalRotation.w
value: 1
objectReference: {fileID: 0}
- target: {fileID: 7253705700397590129, guid: 4efb4d72c7b94469ca38276842875f65,
type: 3}
propertyPath: m_RootOrder
value: 6
objectReference: {fileID: 0}
- target: {fileID: 7253705700397590129, guid: 4efb4d72c7b94469ca38276842875f65,
type: 3}
propertyPath: m_LocalEulerAnglesHint.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7253705700397590129, guid: 4efb4d72c7b94469ca38276842875f65,
type: 3}
propertyPath: m_LocalEulerAnglesHint.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7253705700397590129, guid: 4efb4d72c7b94469ca38276842875f65,
type: 3}
propertyPath: m_LocalEulerAnglesHint.z
value: 0
objectReference: {fileID: 0}
m_RemovedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: 4efb4d72c7b94469ca38276842875f65, type: 3}

9
Project/Assets/ML-Agents/Examples/PushBlock/Scenes/ZombiePushBlock.unity.meta


fileFormatVersion: 2
guid: be1201eb6253541c38e8258fceae65cb
timeCreated: 1506808980
licenseType: Pro
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

1001
Project/Assets/ML-Agents/Examples/PushBlock/Scenes/2ZombieVs3AgentsPushBlock.unity
文件差异内容过多而无法显示
查看文件

60
Project/Assets/ML-Agents/Examples/PushBlock/Scripts/GoalDetectTrigger.cs


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
public class GoalDetectTrigger : MonoBehaviour
{
[Header("Trigger Collider Tag To Detect")]
public string tagToDetect = "goal"; //collider tag to detect
[Header("Goal Value")]
public float GoalValue = 1;
private Collider m_col;
[System.Serializable]
public class TriggerEvent : UnityEvent<Collider, float>
{
}
[Header("Trigger Callbacks")]
public TriggerEvent onTriggerEnterEvent = new TriggerEvent();
public TriggerEvent onTriggerStayEvent = new TriggerEvent();
public TriggerEvent onTriggerExitEvent = new TriggerEvent();
private void OnTriggerEnter(Collider col)
{
if (col.CompareTag(tagToDetect))
{
onTriggerEnterEvent.Invoke(m_col, GoalValue);
}
}
private void OnTriggerStay(Collider col)
{
if (col.CompareTag(tagToDetect))
{
onTriggerStayEvent.Invoke(m_col, GoalValue);
}
}
private void OnTriggerExit(Collider col)
{
if (col.CompareTag(tagToDetect))
{
onTriggerExitEvent.Invoke(m_col, GoalValue);
}
}
// Start is called before the first frame update
void Awake()
{
m_col = GetComponent<Collider>();
}
// Update is called once per frame
void Update()
{
}
}

11
Project/Assets/ML-Agents/Examples/PushBlock/Scripts/GoalDetectTrigger.cs.meta


fileFormatVersion: 2
guid: 9dcea692df32b46b4a884cfcc150aef7
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

139
Project/Assets/ML-Agents/Examples/PushBlock/Scripts/PushAgentCollab.cs


//Put this script on your blue cube.
using System.Collections;
using UnityEngine;
using Unity.MLAgents;
using Unity.MLAgents.Actuators;
using Unity.MLAgents.Sensors;
public class PushAgentCollab : Agent
{
PushBlockSettings m_PushBlockSettings;
// Rigidbody m_BlockRb; //cached on initialization
Rigidbody m_AgentRb; //cached on initialization
public bool useVectorObs = true;
void Awake()
{
m_PushBlockSettings = FindObjectOfType<PushBlockSettings>();
}
public override void Initialize()
{
// Cache the agent rigidbody
m_AgentRb = GetComponent<Rigidbody>();
}
/// <summary>
/// Moves the agent according to the selected action.
/// </summary>
public void MoveAgent(ActionSegment<int> act)
{
var dirToGo = Vector3.zero;
var rotateDir = Vector3.zero;
var forwardAxis = act[0];
var rightAxis = act[1];
var rotateAxis = act[2];
switch (forwardAxis)
{
case 1:
dirToGo = transform.forward * 1f;
break;
case 2:
dirToGo = transform.forward * -1f;
break;
}
switch (rightAxis)
{
case 1:
dirToGo = transform.right * 1f;
break;
case 2:
dirToGo = transform.right * -1f;
break;
}
switch (rotateAxis)
{
case 1:
rotateDir = transform.up * -1f;
break;
case 2:
rotateDir = transform.up * 1f;
break;
}
transform.Rotate(rotateDir, Time.fixedDeltaTime * 200f);
m_AgentRb.AddForce(dirToGo * m_PushBlockSettings.agentRunSpeed,
ForceMode.VelocityChange);
}
public override void CollectObservations(VectorSensor sensor)
{
if (useVectorObs)
{
sensor.AddObservation(StepCount / (float)MaxStep);
}
}
/// <summary>
/// Called every step of the engine. Here the agent takes an action.
/// </summary>
public override void OnActionReceived(ActionBuffers actionBuffers)
{
// Move the agent using the action.
MoveAgent(actionBuffers.DiscreteActions);
// Penalty given each step to encourage agent to finish task quickly.
//AddReward(-1f / MaxStep);
}
public override void Heuristic(in ActionBuffers actionsOut)
{
var discreteActionsOut = actionsOut.DiscreteActions;
discreteActionsOut.Clear();
//forward
if (Input.GetKey(KeyCode.W))
{
discreteActionsOut[0] = 1;
}
if (Input.GetKey(KeyCode.S))
{
discreteActionsOut[0] = 2;
}
//rotate
if (Input.GetKey(KeyCode.A))
{
discreteActionsOut[2] = 1;
}
if (Input.GetKey(KeyCode.D))
{
discreteActionsOut[2] = 2;
}
//right
if (Input.GetKey(KeyCode.E))
{
discreteActionsOut[1] = 1;
}
if (Input.GetKey(KeyCode.Q))
{
discreteActionsOut[1] = 2;
}
}
/// <summary>
/// In the editor, if "Reset On Done" is checked then AgentReset() will be
/// called automatically anytime we mark done = true in an agent script.
/// </summary>
public override void OnEpisodeBegin()
{
}
}

12
Project/Assets/ML-Agents/Examples/PushBlock/Scripts/PushAgentCollab.cs.meta


fileFormatVersion: 2
guid: d94a85eca2e074578943301959c555ba
timeCreated: 1506829537
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

241
Project/Assets/ML-Agents/Examples/PushBlock/Scripts/PushBlockEnvController.cs


using System.Collections;
using System.Collections.Generic;
using Unity.MLAgents;
using UnityEngine;
public class PushBlockEnvController : MonoBehaviour
{
[System.Serializable]
public class AgentInfo
{
public PushAgentCollab Agent;
[HideInInspector]
public Vector3 StartingPos;
[HideInInspector]
public Quaternion StartingRot;
[HideInInspector]
public Rigidbody Rb;
}
[System.Serializable]
public class BlockInfo
{
public Transform T;
[HideInInspector]
public Vector3 StartingPos;
[HideInInspector]
public Quaternion StartingRot;
[HideInInspector]
public Rigidbody Rb;
}
/// <summary>
/// Max Academy steps before this platform resets
/// </summary>
/// <returns></returns>
[Header("Max Environment Steps")] public int MaxEnvironmentSteps = 25000;
private int m_ResetTimer;
/// <summary>
/// The area bounds.
/// </summary>
[HideInInspector]
public Bounds areaBounds;
/// <summary>
/// The ground. The bounds are used to spawn the elements.
/// </summary>
public GameObject ground;
public GameObject area;
Material m_GroundMaterial; //cached on Awake()
/// <summary>
/// We will be changing the ground material based on success/failue
/// </summary>
Renderer m_GroundRenderer;
public List<AgentInfo> AgentsList = new List<AgentInfo>();
public List<BlockInfo> BlocksList = new List<BlockInfo>();
public bool UseRandomAgentRotation = true;
public bool UseRandomAgentPosition = true;
public bool UseRandomBlockRotation = true;
public bool UseRandomBlockPosition = true;
PushBlockSettings m_PushBlockSettings;
private int m_NumberOfRemainingBlocks;
private PushBlockTeamManager m_TeamManager;
void Start()
{
// Get the ground's bounds
areaBounds = ground.GetComponent<Collider>().bounds;
// Get the ground renderer so we can change the material when a goal is scored
m_GroundRenderer = ground.GetComponent<Renderer>();
// Starting material
m_GroundMaterial = m_GroundRenderer.material;
m_PushBlockSettings = FindObjectOfType<PushBlockSettings>();
foreach (var item in BlocksList)
{
item.StartingPos = item.T.transform.position;
item.StartingRot = item.T.transform.rotation;
item.Rb = item.T.GetComponent<Rigidbody>();
}
// Initialize TeamManager
m_TeamManager = new PushBlockTeamManager();
foreach (var item in AgentsList)
{
item.StartingPos = item.Agent.transform.position;
item.StartingRot = item.Agent.transform.rotation;
item.Rb = item.Agent.GetComponent<Rigidbody>();
item.Agent.SetTeamManager(m_TeamManager);
}
ResetScene();
}
// Update is called once per frame
void FixedUpdate()
{
m_ResetTimer += 1;
if (m_ResetTimer > MaxEnvironmentSteps)
{
ResetScene();
}
}
/// <summary>
/// Use the ground's bounds to pick a random spawn position.
/// </summary>
public Vector3 GetRandomSpawnPos()
{
var foundNewSpawnLocation = false;
var randomSpawnPos = Vector3.zero;
while (foundNewSpawnLocation == false)
{
var randomPosX = Random.Range(-areaBounds.extents.x * m_PushBlockSettings.spawnAreaMarginMultiplier,
areaBounds.extents.x * m_PushBlockSettings.spawnAreaMarginMultiplier);
var randomPosZ = Random.Range(-areaBounds.extents.z * m_PushBlockSettings.spawnAreaMarginMultiplier,
areaBounds.extents.z * m_PushBlockSettings.spawnAreaMarginMultiplier);
randomSpawnPos = ground.transform.position + new Vector3(randomPosX, 1f, randomPosZ);
if (Physics.CheckBox(randomSpawnPos, new Vector3(2.5f, 0.01f, 2.5f)) == false)
{
foundNewSpawnLocation = true;
}
}
return randomSpawnPos;
}
/// <summary>
/// Resets the block position and velocities.
/// </summary>
void ResetBlock(BlockInfo block)
{
// Get a random position for the block.
block.T.position = GetRandomSpawnPos();
// Reset block velocity back to zero.
block.Rb.velocity = Vector3.zero;
// Reset block angularVelocity back to zero.
block.Rb.angularVelocity = Vector3.zero;
}
/// <summary>
/// Swap ground material, wait time seconds, then swap back to the regular material.
/// </summary>
IEnumerator GoalScoredSwapGroundMaterial(Material mat, float time)
{
m_GroundRenderer.material = mat;
yield return new WaitForSeconds(time); // Wait for 2 sec
m_GroundRenderer.material = m_GroundMaterial;
}
/// <summary>
/// Called when the agent moves the block into the goal.
/// </summary>
public void ScoredAGoal(Collider col, float score)
{
//Decrement the counter
m_NumberOfRemainingBlocks--;
//Are we done?
bool done = m_NumberOfRemainingBlocks == 0;
//Disable the block
col.gameObject.SetActive(false);
//Give Agent Rewards
foreach (var item in AgentsList)
{
item.Agent.AddReward(score);
}
// Swap ground material for a bit to indicate we scored.
StartCoroutine(GoalScoredSwapGroundMaterial(m_PushBlockSettings.goalScoredMaterial, 0.5f));
if (done)
{
//Reset assets
ResetScene();
}
}
Quaternion GetRandomRot()
{
return Quaternion.Euler(0, Random.Range(0.0f, 360.0f), 0);
}
void ResetScene()
{
m_ResetTimer = 0;
//Random platform rot
var rotation = Random.Range(0, 4);
var rotationAngle = rotation * 90f;
area.transform.Rotate(new Vector3(0f, rotationAngle, 0f));
//End Episode
foreach (var item in AgentsList)
{
if (!item.Agent)
{
return;
}
item.Agent.EndEpisode();
}
//Reset Agents
foreach (var item in AgentsList)
{
var pos = UseRandomAgentPosition ? GetRandomSpawnPos() : item.StartingPos;
var rot = UseRandomAgentRotation ? GetRandomRot() : item.StartingRot;
item.Agent.transform.SetPositionAndRotation(pos, rot);
item.Rb.velocity = Vector3.zero;
item.Rb.angularVelocity = Vector3.zero;
}
//Reset Blocks
foreach (var item in BlocksList)
{
var pos = UseRandomBlockPosition ? GetRandomSpawnPos() : item.StartingPos;
var rot = UseRandomBlockRotation ? GetRandomRot() : item.StartingRot;
item.T.transform.SetPositionAndRotation(pos, rot);
item.Rb.velocity = Vector3.zero;
item.Rb.angularVelocity = Vector3.zero;
item.T.gameObject.SetActive(true);
}
//Reset counter
m_NumberOfRemainingBlocks = BlocksList.Count;
// m_NumberOfRemainingBlocks = 2;
}
}

11
Project/Assets/ML-Agents/Examples/PushBlock/Scripts/PushBlockEnvController.cs.meta


fileFormatVersion: 2
guid: 4bb2bb36bb51d452ab58d30a868dfab3
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

15
Project/Assets/ML-Agents/Examples/PushBlock/Scripts/PushBlockTeamManager.cs


using System.Collections.Generic;
using Unity.MLAgents;
using Unity.MLAgents.Extensions.Teams;
using Unity.MLAgents.Sensors;
public class PushBlockTeamManager : BaseTeamManager
{
List<Agent> m_AgentList = new List<Agent> { };
public override void RegisterAgent(Agent agent)
{
m_AgentList.Add(agent);
}
}

11
Project/Assets/ML-Agents/Examples/PushBlock/Scripts/PushBlockTeamManager.cs.meta


fileFormatVersion: 2
guid: f6ff089e647ef48ffbb569d14d170662
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

45
Project/Assets/ML-Agents/Examples/PushBlock/Scripts/SimpleNPC.cs


// using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SimpleNPC : MonoBehaviour
{
public Transform target;
private Rigidbody rb;
public float walkSpeed = 1;
// public ForceMode walkForceMode;
private Vector3 dirToGo;
// private Vector3 m_StartingPos;
// Start is called before the first frame update
void Awake()
{
rb = GetComponent<Rigidbody>();
// m_StartingPos = transform.position;
}
// Update is called once per frame
void Update()
{
}
void FixedUpdate()
{
dirToGo = target.position - transform.position;
dirToGo.y = 0;
rb.rotation = Quaternion.LookRotation(dirToGo);
// rb.AddForce(dirToGo.normalized * walkSpeed * Time.fixedDeltaTime, walkForceMode);
// rb.MovePosition(rb.transform.TransformDirection(Vector3.forward * walkSpeed * Time.deltaTime));
// rb.MovePosition(rb.transform.TransformVector() (Vector3.forward * walkSpeed * Time.deltaTime));
rb.MovePosition(transform.position + transform.forward * walkSpeed * Time.deltaTime);
}
public void SetRandomWalkSpeed()
{
walkSpeed = Random.Range(6f, 7f);
}
}

11
Project/Assets/ML-Agents/Examples/PushBlock/Scripts/SimpleNPC.cs.meta


fileFormatVersion: 2
guid: 9685bac759362440ea71765cdece3305
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

11
Project/Assets/ML-Agents/Examples/PushBlock/Scripts/ZombiePushBlockDeathEnvController.cs.meta


fileFormatVersion: 2
guid: 7df9fa4d08b7d4d198d5165b07ddd47e
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

289
Project/Assets/ML-Agents/Examples/PushBlock/Scripts/ZombiePushBlockEnvController.cs


using System.Collections;
using System.Collections.Generic;
using Unity.MLAgents;
using UnityEngine;
public class ZombiePushBlockEnvController : MonoBehaviour
{
[System.Serializable]
public class AgentInfo
{
public PushAgentCollab Agent;
[HideInInspector]
public Vector3 StartingPos;
[HideInInspector]
public Quaternion StartingRot;
[HideInInspector]
public Rigidbody Rb;
public Collider Col;
}
[System.Serializable]
public class ZombieInfo
{
public SimpleNPC Agent;
[HideInInspector]
public Vector3 StartingPos;
[HideInInspector]
public Quaternion StartingRot;
[HideInInspector]
public Rigidbody Rb;
public Collider Col;
}
[System.Serializable]
public class BlockInfo
{
public Transform T;
[HideInInspector]
public Vector3 StartingPos;
[HideInInspector]
public Quaternion StartingRot;
[HideInInspector]
public Rigidbody Rb;
}
/// <summary>
/// Max Academy steps before this platform resets
/// </summary>
/// <returns></returns>
[Header("Max Environment Steps")] public int MaxEnvironmentSteps = 25000;
private int m_ResetTimer;
/// <summary>
/// The area bounds.
/// </summary>
[HideInInspector]
public Bounds areaBounds;
/// <summary>
/// The ground. The bounds are used to spawn the elements.
/// </summary>
public GameObject ground;
public GameObject area;
Material m_GroundMaterial; //cached on Awake()
/// <summary>
/// We will be changing the ground material based on success/failue
/// </summary>
Renderer m_GroundRenderer;
public List<AgentInfo> AgentsList = new List<AgentInfo>();
public List<ZombieInfo> ZombiesList = new List<ZombieInfo>();
public List<BlockInfo> BlocksList = new List<BlockInfo>();
public bool UseRandomAgentRotation = true;
public bool UseRandomAgentPosition = true;
public bool UseRandomBlockRotation = true;
public bool UseRandomBlockPosition = true;
PushBlockSettings m_PushBlockSettings;
private int m_NumberOfRemainingBlocks;
void Start()
{
// Get the ground's bounds
areaBounds = ground.GetComponent<Collider>().bounds;
// Get the ground renderer so we can change the material when a goal is scored
m_GroundRenderer = ground.GetComponent<Renderer>();
// Starting material
m_GroundMaterial = m_GroundRenderer.material;
m_PushBlockSettings = FindObjectOfType<PushBlockSettings>();
foreach (var item in BlocksList)
{
item.StartingPos = item.T.transform.position;
item.StartingRot = item.T.transform.rotation;
item.Rb = item.T.GetComponent<Rigidbody>();
}
foreach (var item in AgentsList)
{
item.StartingPos = item.Agent.transform.position;
item.StartingRot = item.Agent.transform.rotation;
item.Rb = item.Agent.GetComponent<Rigidbody>();
item.Col = item.Agent.GetComponent<Collider>();
}
foreach (var item in ZombiesList)
{
item.StartingPos = item.Agent.transform.position;
item.StartingRot = item.Agent.transform.rotation;
item.Col = item.Agent.GetComponent<Collider>();
}
ResetScene();
}
// Update is called once per frame
void FixedUpdate()
{
m_ResetTimer += 1;
if (m_ResetTimer > MaxEnvironmentSteps)
{
ResetScene();
}
}
//Kill/disable an agent
public void KillAgent(Collider col)
{
}
/// <summary>
/// Use the ground's bounds to pick a random spawn position.
/// </summary>
public Vector3 GetRandomSpawnPos()
{
var foundNewSpawnLocation = false;
var randomSpawnPos = Vector3.zero;
while (foundNewSpawnLocation == false)
{
var randomPosX = Random.Range(-areaBounds.extents.x * m_PushBlockSettings.spawnAreaMarginMultiplier,
areaBounds.extents.x * m_PushBlockSettings.spawnAreaMarginMultiplier);
var randomPosZ = Random.Range(-areaBounds.extents.z * m_PushBlockSettings.spawnAreaMarginMultiplier,
areaBounds.extents.z * m_PushBlockSettings.spawnAreaMarginMultiplier);
randomSpawnPos = ground.transform.position + new Vector3(randomPosX, 1f, randomPosZ);
if (Physics.CheckBox(randomSpawnPos, new Vector3(2.5f, 0.01f, 2.5f)) == false)
{
foundNewSpawnLocation = true;
}
}
return randomSpawnPos;
}
/// <summary>
/// Resets the block position and velocities.
/// </summary>
void ResetBlock(BlockInfo block)
{
// Get a random position for the block.
block.T.position = GetRandomSpawnPos();
// Reset block velocity back to zero.
block.Rb.velocity = Vector3.zero;
// Reset block angularVelocity back to zero.
block.Rb.angularVelocity = Vector3.zero;
}
/// <summary>
/// Swap ground material, wait time seconds, then swap back to the regular material.
/// </summary>
IEnumerator GoalScoredSwapGroundMaterial(Material mat, float time)
{
m_GroundRenderer.material = mat;
yield return new WaitForSeconds(time); // Wait for 2 sec
m_GroundRenderer.material = m_GroundMaterial;
}
/// <summary>
/// Called when the agent moves the block into the goal.
/// </summary>
public void ScoredAGoal(Collider col, float score)
{
// //Decrement the counter
// m_NumberOfRemainingBlocks--;
//
// //Are we done?
// bool done = m_NumberOfRemainingBlocks == 0;
//
// //Disable the block
// col.gameObject.SetActive(false);
//Give Agent Rewards
foreach (var item in AgentsList)
{
item.Agent.AddReward(score);
}
// Swap ground material for a bit to indicate we scored.
StartCoroutine(GoalScoredSwapGroundMaterial(m_PushBlockSettings.goalScoredMaterial, 0.5f));
// if (done)
// {
//Reset assets
ResetScene();
// }
}
public void ZombieTouchedBlock()
{
//Give Agent Rewards
foreach (var item in AgentsList)
{
item.Agent.AddReward(-1);
}
// Swap ground material for a bit to indicate we scored.
StartCoroutine(GoalScoredSwapGroundMaterial(m_PushBlockSettings.failMaterial, 0.5f));
ResetScene();
}
Quaternion GetRandomRot()
{
return Quaternion.Euler(0, Random.Range(0.0f, 360.0f), 0);
}
void ResetScene()
{
m_ResetTimer = 0;
//Random platform rot
var rotation = Random.Range(0, 4);
var rotationAngle = rotation * 90f;
area.transform.Rotate(new Vector3(0f, rotationAngle, 0f));
//End Episode
foreach (var item in AgentsList)
{
if (!item.Agent)
{
return;
}
item.Agent.EndEpisode();
}
//Reset Agents
foreach (var item in AgentsList)
{
var pos = UseRandomAgentPosition ? GetRandomSpawnPos() : item.StartingPos;
var rot = UseRandomAgentRotation ? GetRandomRot() : item.StartingRot;
item.Agent.transform.SetPositionAndRotation(pos, rot);
item.Rb.velocity = Vector3.zero;
item.Rb.angularVelocity = Vector3.zero;
}
//Reset Blocks
foreach (var item in BlocksList)
{
var pos = UseRandomBlockPosition ? GetRandomSpawnPos() : item.StartingPos;
var rot = UseRandomBlockRotation ? GetRandomRot() : item.StartingRot;
item.T.transform.SetPositionAndRotation(pos, rot);
item.Rb.velocity = Vector3.zero;
item.Rb.angularVelocity = Vector3.zero;
item.T.gameObject.SetActive(true);
}
//End Episode
foreach (var item in ZombiesList)
{
if (!item.Agent)
{
return;
}
// item.Agent.EndEpisode();
item.Agent.transform.SetPositionAndRotation(item.StartingPos, item.StartingRot);
item.Agent.SetRandomWalkSpeed();
}
//Reset counter
m_NumberOfRemainingBlocks = BlocksList.Count;
// m_NumberOfRemainingBlocks = 2;
}
}

11
Project/Assets/ML-Agents/Examples/PushBlock/Scripts/ZombiePushBlockEnvController.cs.meta


fileFormatVersion: 2
guid: 5e113b4a4dbb24eea8d143f2b168e161
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

347
Project/Assets/ML-Agents/Examples/PushBlock/Scripts/ZombiePushBlockDeathEnvController.cs


using System.Collections;
using System.Collections.Generic;
using Unity.MLAgents;
using UnityEngine;
public class ZombiePushBlockDeathEnvController : MonoBehaviour
{
[System.Serializable]
public class AgentInfo
{
public PushAgentCollab Agent;
[HideInInspector]
public Vector3 StartingPos;
[HideInInspector]
public Quaternion StartingRot;
[HideInInspector]
public Rigidbody Rb;
[HideInInspector]
public Collider Col;
}
[System.Serializable]
public class ZombieInfo
{
public SimpleNPC Agent;
[HideInInspector]
public Vector3 StartingPos;
[HideInInspector]
public Quaternion StartingRot;
[HideInInspector]
public Rigidbody Rb;
[HideInInspector]
public Collider Col;
}
[System.Serializable]
public class BlockInfo
{
public Transform T;
[HideInInspector]
public Vector3 StartingPos;
[HideInInspector]
public Quaternion StartingRot;
[HideInInspector]
public Rigidbody Rb;
}
/// <summary>
/// Max Academy steps before this platform resets
/// </summary>
/// <returns></returns>
[Header("Max Environment Steps")] public int MaxEnvironmentSteps = 25000;
private int m_ResetTimer;
/// <summary>
/// The area bounds.
/// </summary>
[HideInInspector]
public Bounds areaBounds;
/// <summary>
/// The ground. The bounds are used to spawn the elements.
/// </summary>
public GameObject ground;
public GameObject area;
Material m_GroundMaterial; //cached on Awake()
/// <summary>
/// We will be changing the ground material based on success/failue
/// </summary>
Renderer m_GroundRenderer;
public List<AgentInfo> AgentsList = new List<AgentInfo>();
public List<ZombieInfo> ZombiesList = new List<ZombieInfo>();
public List<BlockInfo> BlocksList = new List<BlockInfo>();
public bool UseRandomAgentRotation = true;
public bool UseRandomAgentPosition = true;
public bool UseRandomBlockRotation = true;
public bool UseRandomBlockPosition = true;
PushBlockSettings m_PushBlockSettings;
private int m_NumberOfRemainingBlocks;
private PushBlockTeamManager m_TeamManager;
bool all_dead;
void Start()
{
// Get the ground's bounds
areaBounds = ground.GetComponent<Collider>().bounds;
// Get the ground renderer so we can change the material when a goal is scored
m_GroundRenderer = ground.GetComponent<Renderer>();
// Starting material
m_GroundMaterial = m_GroundRenderer.material;
m_PushBlockSettings = FindObjectOfType<PushBlockSettings>();
foreach (var item in BlocksList)
{
item.StartingPos = item.T.transform.position;
item.StartingRot = item.T.transform.rotation;
item.Rb = item.T.GetComponent<Rigidbody>();
}
// Initialize TeamManager
m_TeamManager = new PushBlockTeamManager();
foreach (var item in AgentsList)
{
item.StartingPos = item.Agent.transform.position;
item.StartingRot = item.Agent.transform.rotation;
item.Rb = item.Agent.GetComponent<Rigidbody>();
item.Col = item.Agent.GetComponent<Collider>();
// Add to team manager
item.Agent.SetTeamManager(m_TeamManager);
}
foreach (var item in ZombiesList)
{
item.StartingPos = item.Agent.transform.position;
item.StartingRot = item.Agent.transform.rotation;
item.Col = item.Agent.GetComponent<Collider>();
}
ResetScene();
}
// Update is called once per frame
void FixedUpdate()
{
m_ResetTimer += 1;
if (m_ResetTimer > MaxEnvironmentSteps)
{
ResetScene();
}
}
//Kill/disable an agent
public void KillAgent(Collision col, Transform t)
{
print($"zombie {t.name} ate {col.collider.name}");
//Disable killed Agent
foreach (var item in AgentsList)
{
if (item.Col == col.collider)
{
item.Agent.EndEpisode();
item.Col.gameObject.SetActive(false);
break;
}
}
bool allZombiesDead = true;
// Kill zombies
foreach (var item in ZombiesList)
{
if (item.Agent.transform == t)
{
item.Agent.gameObject.SetActive(false);
//break;
}
if (item.Agent.gameObject.activeSelf)
{
allZombiesDead = false;
}
}
// If all zombies dead, unfreeze block
if (allZombiesDead)
{
all_dead = true;
foreach (var item in BlocksList)
{
// Unfreeze block's motion when zombies are killed
item.Rb.constraints &= RigidbodyConstraints.FreezePositionX;
item.Rb.constraints &= RigidbodyConstraints.FreezePositionZ;
}
}
}
/// <summary>
/// Use the ground's bounds to pick a random spawn position.
/// </summary>
public Vector3 GetRandomSpawnPos()
{
var foundNewSpawnLocation = false;
var randomSpawnPos = Vector3.zero;
while (foundNewSpawnLocation == false)
{
var randomPosX = Random.Range(-areaBounds.extents.x * m_PushBlockSettings.spawnAreaMarginMultiplier,
areaBounds.extents.x * m_PushBlockSettings.spawnAreaMarginMultiplier);
var randomPosZ = Random.Range(-areaBounds.extents.z * m_PushBlockSettings.spawnAreaMarginMultiplier,
areaBounds.extents.z * m_PushBlockSettings.spawnAreaMarginMultiplier);
randomSpawnPos = ground.transform.position + new Vector3(randomPosX, 1f, randomPosZ);
if (Physics.CheckBox(randomSpawnPos, new Vector3(2.5f, 0.01f, 2.5f)) == false)
{
foundNewSpawnLocation = true;
}
}
return randomSpawnPos;
}
/// <summary>
/// Resets the block position and velocities.
/// </summary>
void ResetBlock(BlockInfo block)
{
// Get a random position for the block.
block.T.position = GetRandomSpawnPos();
// Reset block velocity back to zero.
block.Rb.velocity = Vector3.zero;
// Reset block angularVelocity back to zero.
block.Rb.angularVelocity = Vector3.zero;
}
/// <summary>
/// Swap ground material, wait time seconds, then swap back to the regular material.
/// </summary>
IEnumerator GoalScoredSwapGroundMaterial(Material mat, float time)
{
m_GroundRenderer.material = mat;
yield return new WaitForSeconds(time); // Wait for 2 sec
m_GroundRenderer.material = m_GroundMaterial;
}
/// <summary>
/// Called when the agent moves the block into the goal.
/// </summary>
public void ScoredAGoal(Collider col, float score)
{
// //Decrement the counter
// m_NumberOfRemainingBlocks--;
//
// //Are we done?
// bool done = m_NumberOfRemainingBlocks == 0;
//
// //Disable the block
// col.gameObject.SetActive(false);
//Give Agent Rewards
if(all_dead)
{
foreach (var item in AgentsList)
{
if (item.Agent.gameObject.activeInHierarchy)
{
print($"{item.Agent.name} scored");
item.Agent.AddReward(score);
}
}
// Swap ground material for a bit to indicate we scored.
StartCoroutine(GoalScoredSwapGroundMaterial(m_PushBlockSettings.goalScoredMaterial, 0.5f));
// if (done)
// {
//Reset assets
ResetScene();
// }
}
}
public void ZombieTouchedBlock()
{
//Give Agent Rewards
// foreach (var item in AgentsList)
// {
// item.Agent.AddReward(-1);
// }
// Swap ground material for a bit to indicate we scored.
StartCoroutine(GoalScoredSwapGroundMaterial(m_PushBlockSettings.failMaterial, 0.5f));
ResetScene();
}
Quaternion GetRandomRot()
{
return Quaternion.Euler(0, Random.Range(0.0f, 360.0f), 0);
}
void ResetScene()
{
all_dead = false;
m_ResetTimer = 0;
//Random platform rot
var rotation = Random.Range(0, 4);
var rotationAngle = rotation * 90f;
area.transform.Rotate(new Vector3(0f, rotationAngle, 0f));
//End Episode
foreach (var item in AgentsList)
{
if (!item.Agent)
{
return;
}
item.Agent.EndEpisode();
}
//Reset Agents
foreach (var item in AgentsList)
{
var pos = UseRandomAgentPosition ? GetRandomSpawnPos() : item.StartingPos;
var rot = UseRandomAgentRotation ? GetRandomRot() : item.StartingRot;
item.Agent.transform.SetPositionAndRotation(pos, rot);
item.Rb.velocity = Vector3.zero;
item.Rb.angularVelocity = Vector3.zero;
item.Agent.gameObject.SetActive(true);
}
//Reset Blocks
foreach (var item in BlocksList)
{
var pos = UseRandomBlockPosition ? GetRandomSpawnPos() : item.StartingPos;
var rot = UseRandomBlockRotation ? GetRandomRot() : item.StartingRot;
item.T.transform.SetPositionAndRotation(pos, rot);
item.Rb.velocity = Vector3.zero;
item.Rb.angularVelocity = Vector3.zero;
item.T.gameObject.SetActive(true);
// Freeze block's motion until zombies are killed
item.Rb.constraints |= RigidbodyConstraints.FreezePositionX;
item.Rb.constraints |= RigidbodyConstraints.FreezePositionZ;
}
//End Episode
foreach (var item in ZombiesList)
{
if (!item.Agent)
{
return;
}
// item.Agent.EndEpisode();
item.Agent.transform.SetPositionAndRotation(item.StartingPos, item.StartingRot);
item.Agent.SetRandomWalkSpeed();
item.Agent.gameObject.SetActive(true);
}
//Reset counter
m_NumberOfRemainingBlocks = BlocksList.Count;
// m_NumberOfRemainingBlocks = 2;
}
}

3
com.unity.ml-agents.extensions/Runtime/Teams.meta


fileFormatVersion: 2
guid: 77124df6c18c4f669052016b3116147e
timeCreated: 1610064454

3
com.unity.ml-agents.extensions/Runtime/Teams/BaseTeamManager.cs.meta


fileFormatVersion: 2
guid: b2967f9c3bd4449a98ad309085094769
timeCreated: 1610064493

34
com.unity.ml-agents.extensions/Runtime/Teams/BaseTeamManager.cs


using System.Collections.Generic;
using Unity.MLAgents;
using Unity.MLAgents.Sensors;
namespace Unity.MLAgents.Extensions.Teams
{
public class BaseTeamManager : ITeamManager
{
private readonly string m_Id = System.Guid.NewGuid().ToString();
public virtual void RegisterAgent(Agent agent)
{
}
public virtual void OnAgentDone(Agent agent, Agent.DoneReason doneReason, List<ISensor> sensors)
{
// Possible implementation - save reference to Agent's IPolicy so that we can repeatedly
// call IPolicy.RequestDecision on behalf of the Agent after it's dead
// If so, we'll need dummy sensor impls with the same shape as the originals.
agent.SendDoneToTrainer();
}
public virtual void AddTeamReward(float reward)
{
}
public string GetId()
{
return m_Id;
}
}
}
正在加载...
取消
保存