浏览代码

Barracuda integration into ML-Agents (#1557)

* Switched default Mac GFX API to Metal

* Added Barracuda pre-0.1.5

* Added basic integration with Barracuda Inference Engine

* Use predefined outputs the same way as for TF engine

* Fixed discrete action + LSTM support

* Switch Unity Mac Editor to Metal GFX API

* Fixed null model handling

* All examples converted to support Barracuda

* Added model conversion from Tensorflow to Barracuda
copied the barracuda.py file to ml-agents/mlagents/trainers
copied the tensorflow_to_barracuda.py file to ml-agents/mlagents/trainers
modified the tensorflow_to_barracuda.py file so it could be called from mlagents
modified ml-agents/mlagents/trainers/policy.py to convert the tf models to barracuda compatible .bytes file

* Added missing iOS BLAS plugin

* Added forgotten prefab changes

* Removed GLCore GFX backend for Mac, because it doesn't support Compute shaders

* Exposed GPU support for LearningBrain inference
...
/develop-generalizationTraining-TrainerController
Vincent-Pierre BERGES 6 年前
当前提交
4a6ae4e0
共有 210 个文件被更改,包括 15338 次插入137 次删除
  1. 3
      UnitySDK/Assets/ML-Agents/Editor/LearningBrainEditor.cs
  2. 5
      UnitySDK/Assets/ML-Agents/Editor/Tests/EditModeTestInternalBrainTensorGenerator.cs
  3. 2
      UnitySDK/Assets/ML-Agents/Examples/3DBall/Brains/3DBallHardLearning.asset
  4. 2
      UnitySDK/Assets/ML-Agents/Examples/3DBall/Brains/3DBallLearning.asset
  5. 2
      UnitySDK/Assets/ML-Agents/Examples/3DBall/Prefabs/Game.prefab
  6. 2
      UnitySDK/Assets/ML-Agents/Examples/3DBall/Prefabs/GameHard.prefab
  7. 2
      UnitySDK/Assets/ML-Agents/Examples/BananaCollectors/Brains/BananaLearning.asset
  8. 10
      UnitySDK/Assets/ML-Agents/Examples/BananaCollectors/Prefabs/RLArea.prefab
  9. 2
      UnitySDK/Assets/ML-Agents/Examples/Basic/Brains/BasicLearning.asset
  10. 2
      UnitySDK/Assets/ML-Agents/Examples/Basic/Prefabs/Basic.prefab
  11. 2
      UnitySDK/Assets/ML-Agents/Examples/Bouncer/Brains/BouncerLearning.asset
  12. 2
      UnitySDK/Assets/ML-Agents/Examples/Bouncer/Prefabs/Environment.prefab
  13. 2
      UnitySDK/Assets/ML-Agents/Examples/Crawler/Brains/CrawlerDynamicLearning.asset
  14. 2
      UnitySDK/Assets/ML-Agents/Examples/Crawler/Brains/CrawlerStaticLearning.asset
  15. 2
      UnitySDK/Assets/ML-Agents/Examples/GridWorld/Brains/GridWorldLearning.asset
  16. 2
      UnitySDK/Assets/ML-Agents/Examples/GridWorld/Scenes/GridWorld.unity
  17. 2
      UnitySDK/Assets/ML-Agents/Examples/Hallway/Brains/HallwayLearning.asset
  18. 2
      UnitySDK/Assets/ML-Agents/Examples/Hallway/Prefabs/HallwayArea.prefab
  19. 2
      UnitySDK/Assets/ML-Agents/Examples/PushBlock/Brains/PushBlockLearning.asset
  20. 2
      UnitySDK/Assets/ML-Agents/Examples/PushBlock/Prefabs/PushBlockArea.prefab
  21. 2
      UnitySDK/Assets/ML-Agents/Examples/Pyramids/Brains/PyramidsLearning.asset
  22. 2
      UnitySDK/Assets/ML-Agents/Examples/Pyramids/Prefabs/AreaPB.prefab
  23. 2
      UnitySDK/Assets/ML-Agents/Examples/Reacher/Brains/ReacherLearning.asset
  24. 2
      UnitySDK/Assets/ML-Agents/Examples/Soccer/Brains/GoalieLearning.asset
  25. 2
      UnitySDK/Assets/ML-Agents/Examples/Soccer/Brains/StrikerLearning.asset
  26. 8
      UnitySDK/Assets/ML-Agents/Examples/Soccer/Prefabs/SoccerFieldTwos.prefab
  27. 2
      UnitySDK/Assets/ML-Agents/Examples/Tennis/Brains/TennisLearning.asset
  28. 4
      UnitySDK/Assets/ML-Agents/Examples/Tennis/Prefabs/TennisArea.prefab
  29. 2
      UnitySDK/Assets/ML-Agents/Examples/Walker/Brains/WalkerLearning.asset
  30. 2
      UnitySDK/Assets/ML-Agents/Examples/WallJump/Brains/BigWallJumpLearning.asset
  31. 2
      UnitySDK/Assets/ML-Agents/Examples/WallJump/Brains/SmallWallJumpLearning.asset
  32. 26
      UnitySDK/Assets/ML-Agents/Scripts/Academy.cs
  33. 5
      UnitySDK/Assets/ML-Agents/Scripts/Agent.cs
  34. 40
      UnitySDK/Assets/ML-Agents/Scripts/InferenceBrain/ApplierImpl.cs
  35. 61
      UnitySDK/Assets/ML-Agents/Scripts/InferenceBrain/GeneratorImpl.cs
  36. 3
      UnitySDK/Assets/ML-Agents/Scripts/InferenceBrain/TensorApplier.cs
  37. 4
      UnitySDK/Assets/ML-Agents/Scripts/InferenceBrain/TensorGenerator.cs
  38. 4
      UnitySDK/Assets/ML-Agents/Scripts/InferenceBrain/TensorNames.cs
  39. 124
      UnitySDK/Assets/ML-Agents/Scripts/LearningBrain.cs
  40. 4
      UnitySDK/ProjectSettings/ProjectSettings.asset
  41. 17
      docs/Background-TensorFlow.md
  42. 40
      docs/Basic-Guide.md
  43. 12
      docs/Getting-Started-with-Balance-Ball.md
  44. 8
      docs/Learning-Environment-Design-Learning-Brains.md
  45. 4
      docs/Learning-Environment-Executable.md
  46. 4
      docs/ML-Agents-Overview.md
  47. 3
      docs/Readme.md
  48. 2
      docs/Training-Imitation-Learning.md
  49. 2
      docs/Training-ML-Agents.md
  50. 10
      ml-agents/mlagents/trainers/policy.py
  51. 2
      ml-agents/mlagents/trainers/trainer_controller.py
  52. 29
      UnitySDK/Assets/ML-Agents/Editor/NNModelImporter.cs
  53. 11
      UnitySDK/Assets/ML-Agents/Editor/NNModelImporter.cs.meta
  54. 286
      UnitySDK/Assets/ML-Agents/Examples/3DBall/TFModels/3DBallHardLearning.nn
  55. 7
      UnitySDK/Assets/ML-Agents/Examples/3DBall/TFModels/3DBallHardLearning.nn.meta
  56. 258
      UnitySDK/Assets/ML-Agents/Examples/3DBall/TFModels/3DBallLearning.nn
  57. 7
      UnitySDK/Assets/ML-Agents/Examples/3DBall/TFModels/3DBallLearning.nn.meta
  58. 340
      UnitySDK/Assets/ML-Agents/Examples/BananaCollectors/TFModels/BananaLearning.nn
  59. 7
      UnitySDK/Assets/ML-Agents/Examples/BananaCollectors/TFModels/BananaLearning.nn.meta
  60. 14
      UnitySDK/Assets/ML-Agents/Examples/Basic/TFModels/BasicLearning.nn
  61. 7
      UnitySDK/Assets/ML-Agents/Examples/Basic/TFModels/BasicLearning.nn.meta
  62. 87
      UnitySDK/Assets/ML-Agents/Examples/Bouncer/TFModels/BouncerLearning.nn
  63. 7
      UnitySDK/Assets/ML-Agents/Examples/Bouncer/TFModels/BouncerLearning.nn.meta
  64. 1001
      UnitySDK/Assets/ML-Agents/Examples/Crawler/TFModels/CrawlerDynamicLearning.nn
  65. 7
      UnitySDK/Assets/ML-Agents/Examples/Crawler/TFModels/CrawlerDynamicLearning.nn.meta
  66. 1001
      UnitySDK/Assets/ML-Agents/Examples/Crawler/TFModels/CrawlerStaticLearning.nn
  67. 7
      UnitySDK/Assets/ML-Agents/Examples/Crawler/TFModels/CrawlerStaticLearning.nn.meta
  68. 1001
      UnitySDK/Assets/ML-Agents/Examples/GridWorld/TFModels/GridWorldLearning.nn
  69. 7
      UnitySDK/Assets/ML-Agents/Examples/GridWorld/TFModels/GridWorldLearning.nn.meta
  70. 1001
      UnitySDK/Assets/ML-Agents/Examples/Hallway/TFModels/HallwayLearning.nn
  71. 7
      UnitySDK/Assets/ML-Agents/Examples/Hallway/TFModels/HallwayLearning.nn.meta
  72. 1001
      UnitySDK/Assets/ML-Agents/Examples/PushBlock/TFModels/PushBlockLearning.nn
  73. 7
      UnitySDK/Assets/ML-Agents/Examples/PushBlock/TFModels/PushBlockLearning.nn.meta
  74. 1001
      UnitySDK/Assets/ML-Agents/Examples/Pyramids/TFModels/PyramidsLearning.nn
  75. 7
      UnitySDK/Assets/ML-Agents/Examples/Pyramids/TFModels/PyramidsLearning.nn.meta
  76. 284
      UnitySDK/Assets/ML-Agents/Examples/Reacher/TFModels/ReacherLearning.nn
  77. 7
      UnitySDK/Assets/ML-Agents/Examples/Reacher/TFModels/ReacherLearning.nn.meta
  78. 1001
      UnitySDK/Assets/ML-Agents/Examples/Soccer/TFModels/GoalieLearning.nn
  79. 7
      UnitySDK/Assets/ML-Agents/Examples/Soccer/TFModels/GoalieLearning.nn.meta
  80. 1001
      UnitySDK/Assets/ML-Agents/Examples/Soccer/TFModels/StrikerLearning.nn
  81. 7
      UnitySDK/Assets/ML-Agents/Examples/Soccer/TFModels/StrikerLearning.nn.meta
  82. 276
      UnitySDK/Assets/ML-Agents/Examples/Tennis/TFModels/TennisLearning.nn
  83. 7
      UnitySDK/Assets/ML-Agents/Examples/Tennis/TFModels/TennisLearning.nn.meta
  84. 1001
      UnitySDK/Assets/ML-Agents/Examples/Walker/TFModels/WalkerLearning.nn
  85. 7
      UnitySDK/Assets/ML-Agents/Examples/Walker/TFModels/WalkerLearning.nn.meta
  86. 1001
      UnitySDK/Assets/ML-Agents/Examples/WallJump/TFModels/BigWallJumpLearning.nn
  87. 7
      UnitySDK/Assets/ML-Agents/Examples/WallJump/TFModels/BigWallJumpLearning.nn.meta
  88. 1001
      UnitySDK/Assets/ML-Agents/Examples/WallJump/TFModels/SmallWallJumpLearning.nn
  89. 7
      UnitySDK/Assets/ML-Agents/Examples/WallJump/TFModels/SmallWallJumpLearning.nn.meta
  90. 8
      UnitySDK/Assets/ML-Agents/Plugins/Barracuda.Core.meta
  91. 23
      UnitySDK/Assets/ML-Agents/Resources/NNModelIcon.png
  92. 106
      UnitySDK/Assets/ML-Agents/Resources/NNModelIcon.png.meta
  93. 615
      UnitySDK/Assets/ML-Agents/Scripts/InferenceBrain/BarracudaModelParamLoader.cs
  94. 3
      UnitySDK/Assets/ML-Agents/Scripts/InferenceBrain/BarracudaModelParamLoader.cs.meta
  95. 10
      UnitySDK/Assets/ML-Agents/Scripts/InferenceBrain/NNModel.cs
  96. 11
      UnitySDK/Assets/ML-Agents/Scripts/InferenceBrain/NNModel.cs.meta
  97. 28
      docs/Unity-Inference-Engine.md
  98. 491
      ml-agents/mlagents/trainers/barracuda.py
  99. 1001
      ml-agents/mlagents/trainers/tensorflow_to_barracuda.py

3
UnitySDK/Assets/ML-Agents/Editor/LearningBrainEditor.cs


public class LearningBrainEditor : BrainEditor
{
private const string ModelPropName = "model";
private const string InferenceDevicePropName = "inferenceDevice";
private const float TimeBetweenModelReloads = 2f;
// Time since the last reload of the model
private float _timeSinceModelReload;

serializedBrain.Update();
var tfGraphModel = serializedBrain.FindProperty(ModelPropName);
EditorGUILayout.ObjectField(tfGraphModel);
var inferenceDevice = serializedBrain.FindProperty(InferenceDevicePropName);
EditorGUILayout.PropertyField(inferenceDevice);
serializedBrain.ApplyModifiedProperties();
if (EditorGUI.EndChangeCheck())
{

5
UnitySDK/Assets/ML-Agents/Editor/Tests/EditModeTestInternalBrainTensorGenerator.cs


var inputTensor = new Tensor()
{
Shape = new long[] {2, 2},
ValueType = Tensor.TensorType.FloatingPoint
ValueType = Tensor.TensorType.Integer
};
var batchSize = 4;

Assert.Catch<NotImplementedException>(
() => generator.Generate(inputTensor, batchSize, agentInfos));
inputTensor.ValueType = Tensor.TensorType.Integer;
generator.Generate(inputTensor, batchSize, agentInfos);
Assert.IsNotNull(inputTensor.Data as int[,]);
Assert.AreEqual((inputTensor.Data as int[,])[0, 0], 1);

2
UnitySDK/Assets/ML-Agents/Examples/3DBall/Brains/3DBallHardLearning.asset


-
-
vectorActionSpaceType: 1
model: {fileID: 4900000, guid: 8a2da2218425f46e9921caefda4b7813, type: 3}
model: {fileID: 11400000, guid: 8be33caeca04d43498913448b5364f2b, type: 3}

2
UnitySDK/Assets/ML-Agents/Examples/3DBall/Brains/3DBallLearning.asset


-
-
vectorActionSpaceType: 1
model: {fileID: 4900000, guid: 9f58800fa9d54477aa01ee258842f6b3, type: 3}
model: {fileID: 11400000, guid: c282d4bbc4c8f4e78b2bb29eccd17557, type: 3}

2
UnitySDK/Assets/ML-Agents/Examples/3DBall/Prefabs/Game.prefab


m_Script: {fileID: 11500000, guid: aaba48bf82bee4751aa7b89569e57f73, type: 3}
m_Name:
m_EditorClassIdentifier:
brain: {fileID: 11400000, guid: 97d8f9d40dc8c452f932f7caa9549c7d, type: 2}
brain: {fileID: 11400000, guid: 383c589e8bb76464eadc2525b5b0f2c1, type: 2}
agentParameters:
agentCameras: []
maxStep: 5000

2
UnitySDK/Assets/ML-Agents/Examples/3DBall/Prefabs/GameHard.prefab


m_Script: {fileID: 11500000, guid: edf26e11cf4ed42eaa3ffb7b91bb4676, type: 3}
m_Name:
m_EditorClassIdentifier:
brain: {fileID: 11400000, guid: 55f48be32ac184c6ab67cf647100bac4, type: 2}
brain: {fileID: 11400000, guid: 4f74e089fbb75455ebf6f0495e30be6e, type: 2}
agentParameters:
agentCameras: []
maxStep: 5000

2
UnitySDK/Assets/ML-Agents/Examples/BananaCollectors/Brains/BananaLearning.asset


-
-
vectorActionSpaceType: 0
model: {fileID: 4900000, guid: 69bd818d72b944849916d2fda9fe471b, type: 3}
model: {fileID: 11400000, guid: 9aed85b22394844eaa6db4d5e3c61adb, type: 3}

10
UnitySDK/Assets/ML-Agents/Examples/BananaCollectors/Prefabs/RLArea.prefab


m_Script: {fileID: 11500000, guid: 700720465a0104fa586fa4a412b044f8, type: 3}
m_Name:
m_EditorClassIdentifier:
brain: {fileID: 11400000, guid: dff7429d656234fed84c4fac2a7a683c, type: 2}
brain: {fileID: 11400000, guid: 9e7865ec29c894c2d8c1617b0fa392f9, type: 2}
agentParameters:
agentCameras: []
maxStep: 5000

m_Script: {fileID: 11500000, guid: 700720465a0104fa586fa4a412b044f8, type: 3}
m_Name:
m_EditorClassIdentifier:
brain: {fileID: 11400000, guid: dff7429d656234fed84c4fac2a7a683c, type: 2}
brain: {fileID: 11400000, guid: 9e7865ec29c894c2d8c1617b0fa392f9, type: 2}
agentParameters:
agentCameras: []
maxStep: 5000

m_Script: {fileID: 11500000, guid: 700720465a0104fa586fa4a412b044f8, type: 3}
m_Name:
m_EditorClassIdentifier:
brain: {fileID: 11400000, guid: dff7429d656234fed84c4fac2a7a683c, type: 2}
brain: {fileID: 11400000, guid: 9e7865ec29c894c2d8c1617b0fa392f9, type: 2}
agentParameters:
agentCameras: []
maxStep: 5000

m_Script: {fileID: 11500000, guid: 700720465a0104fa586fa4a412b044f8, type: 3}
m_Name:
m_EditorClassIdentifier:
brain: {fileID: 11400000, guid: dff7429d656234fed84c4fac2a7a683c, type: 2}
brain: {fileID: 11400000, guid: 9e7865ec29c894c2d8c1617b0fa392f9, type: 2}
agentParameters:
agentCameras: []
maxStep: 5000

m_Script: {fileID: 11500000, guid: 700720465a0104fa586fa4a412b044f8, type: 3}
m_Name:
m_EditorClassIdentifier:
brain: {fileID: 11400000, guid: dff7429d656234fed84c4fac2a7a683c, type: 2}
brain: {fileID: 11400000, guid: 9e7865ec29c894c2d8c1617b0fa392f9, type: 2}
agentParameters:
agentCameras: []
maxStep: 5000

2
UnitySDK/Assets/ML-Agents/Examples/Basic/Brains/BasicLearning.asset


vectorActionDescriptions:
-
vectorActionSpaceType: 0
model: {fileID: 4900000, guid: 503ce1e8257904bd0b5be8f7fb4b5d28, type: 3}
model: {fileID: 11400000, guid: 386a7729ad86e4aadaae21077b35f0f7, type: 3}

2
UnitySDK/Assets/ML-Agents/Examples/Basic/Prefabs/Basic.prefab


m_Script: {fileID: 11500000, guid: 624480a72e46148118ab2e2d89b537de, type: 3}
m_Name:
m_EditorClassIdentifier:
brain: {fileID: 11400000, guid: 1adbe3db6a2f94bf2b1e22a29b955387, type: 2}
brain: {fileID: 11400000, guid: e5cf0e35e16264ea483f8863e5115c3c, type: 2}
agentParameters:
agentCameras: []
maxStep: 0

2
UnitySDK/Assets/ML-Agents/Examples/Bouncer/Brains/BouncerLearning.asset


-
-
vectorActionSpaceType: 1
model: {fileID: 4900000, guid: 760d2b8347b4b46e3a44d9b989e1304e, type: 3}
model: {fileID: 11400000, guid: 055df42a4cc114162939e523d053c4d7, type: 3}

2
UnitySDK/Assets/ML-Agents/Examples/Bouncer/Prefabs/Environment.prefab


m_Script: {fileID: 11500000, guid: 0f09741cbce2e44bc88d3e92917eea0e, type: 3}
m_Name:
m_EditorClassIdentifier:
brain: {fileID: 11400000, guid: 5527511df7b944e8e9177dd69db5a9c1, type: 2}
brain: {fileID: 11400000, guid: 573920e3a672d40038169c7ffdbdca05, type: 2}
agentParameters:
agentCameras: []
maxStep: 0

2
UnitySDK/Assets/ML-Agents/Examples/Crawler/Brains/CrawlerDynamicLearning.asset


-
-
vectorActionSpaceType: 1
model: {fileID: 4900000, guid: 9482a8782450a4d87b20942c4523176b, type: 3}
model: {fileID: 11400000, guid: 94d1889cee00f4361b74cbc4eb129f11, type: 3}

2
UnitySDK/Assets/ML-Agents/Examples/Crawler/Brains/CrawlerStaticLearning.asset


-
-
vectorActionSpaceType: 1
model: {fileID: 4900000, guid: e256bd37f98f246e5be72618766d0a93, type: 3}
model: {fileID: 11400000, guid: 9dbf8cc316ac9410b961ed268824778f, type: 3}

2
UnitySDK/Assets/ML-Agents/Examples/GridWorld/Brains/GridWorldLearning.asset


vectorActionDescriptions:
-
vectorActionSpaceType: 0
model: {fileID: 4900000, guid: 0fd168a0ea1d04ef9a68c80cf452ce3d, type: 3}
model: {fileID: 11400000, guid: 86e6c88c11c2a4a72bbe56a71c20bfff, type: 3}

2
UnitySDK/Assets/ML-Agents/Examples/GridWorld/Scenes/GridWorld.unity


type: 2}
propertyPath: brain
value:
objectReference: {fileID: 11400000, guid: 8096722eb0a294871857e202e0032082,
objectReference: {fileID: 11400000, guid: 2c1d51b7167874f31beda0b0cf0af468,
type: 2}
- target: {fileID: 114143683117020968, guid: 628960e910f094ad1909ecc88cc8016d,
type: 2}

2
UnitySDK/Assets/ML-Agents/Examples/Hallway/Brains/HallwayLearning.asset


vectorActionDescriptions:
-
vectorActionSpaceType: 0
model: {fileID: 4900000, guid: 84588668e6ea948d3ab55bb813cc769b, type: 3}
model: {fileID: 11400000, guid: 184185c35f3b14a56946e95977be2904, type: 3}

2
UnitySDK/Assets/ML-Agents/Examples/Hallway/Prefabs/HallwayArea.prefab


m_Script: {fileID: 11500000, guid: b446afae240924105b36d07e8d17a608, type: 3}
m_Name:
m_EditorClassIdentifier:
brain: {fileID: 11400000, guid: 51f870f0190b643adae5432c0e6205e7, type: 2}
brain: {fileID: 11400000, guid: 533f2edd327794ca996d0320901b501c, type: 2}
agentParameters:
agentCameras: []
maxStep: 3000

2
UnitySDK/Assets/ML-Agents/Examples/PushBlock/Brains/PushBlockLearning.asset


vectorActionDescriptions:
-
vectorActionSpaceType: 0
model: {fileID: 4900000, guid: e22850d2072904a0ab06069cda2599e5, type: 3}
model: {fileID: 11400000, guid: 16027726448534f92916ae237e0ba315, type: 3}

2
UnitySDK/Assets/ML-Agents/Examples/PushBlock/Prefabs/PushBlockArea.prefab


m_Script: {fileID: 11500000, guid: dea8c4f2604b947e6b7b97750dde87ca, type: 3}
m_Name:
m_EditorClassIdentifier:
brain: {fileID: 11400000, guid: dd07b1953eac4411b81fba032f394726, type: 2}
brain: {fileID: 11400000, guid: e8b2d719f6a324b1abb68d8cf2859f5c, type: 2}
agentParameters:
agentCameras: []
maxStep: 5000

2
UnitySDK/Assets/ML-Agents/Examples/Pyramids/Brains/PyramidsLearning.asset


vectorActionDescriptions:
-
vectorActionSpaceType: 0
model: {fileID: 4900000, guid: 7d1c7f27447234c3a81169de00dcaa8a, type: 3}
model: {fileID: 11400000, guid: 38874f53f06bd4f7782bc81d917a0442, type: 3}

2
UnitySDK/Assets/ML-Agents/Examples/Pyramids/Prefabs/AreaPB.prefab


m_Script: {fileID: 11500000, guid: b8db44472779248d3be46895c4d562d5, type: 3}
m_Name:
m_EditorClassIdentifier:
brain: {fileID: 11400000, guid: d60466fdbfb194c56bdaf78887f2afc8, type: 2}
brain: {fileID: 11400000, guid: 7b7715ed1d436417db67026a47f17576, type: 2}
agentParameters:
agentCameras: []
maxStep: 5000

2
UnitySDK/Assets/ML-Agents/Examples/Reacher/Brains/ReacherLearning.asset


-
-
vectorActionSpaceType: 1
model: {fileID: 4900000, guid: 5fb4a3624e9ca4e1c81b51b5117cb31e, type: 3}
model: {fileID: 11400000, guid: 0c779bd93060f405cbe4446e1dcbf2a6, type: 3}

2
UnitySDK/Assets/ML-Agents/Examples/Soccer/Brains/GoalieLearning.asset


vectorActionDescriptions:
-
vectorActionSpaceType: 0
model: {fileID: 4900000, guid: 890ab8f03425c4a80a52ba674ddec3f3, type: 3}
model: {fileID: 11400000, guid: b6dd703e0bf914268a4e110ad85ab7a9, type: 3}

2
UnitySDK/Assets/ML-Agents/Examples/Soccer/Brains/StrikerLearning.asset


vectorActionDescriptions:
-
vectorActionSpaceType: 0
model: {fileID: 4900000, guid: 23410257d39d44616bfefdff59c7fbc9, type: 3}
model: {fileID: 11400000, guid: 0df960ed78a964cd4a671395390ac522, type: 3}

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


m_Script: {fileID: 11500000, guid: 2a2688ef4a36349f9aa010020c32d198, type: 3}
m_Name:
m_EditorClassIdentifier:
brain: {fileID: 11400000, guid: b7b6884feff2f4a17a645d7e0b9dc8f3, type: 2}
brain: {fileID: 11400000, guid: 090fa5a8588f5433bb7f878e6f5ac954, type: 2}
agentParameters:
agentCameras: []
maxStep: 3000

m_Script: {fileID: 11500000, guid: 2a2688ef4a36349f9aa010020c32d198, type: 3}
m_Name:
m_EditorClassIdentifier:
brain: {fileID: 11400000, guid: 0e2b949bf7d37469786426a6d913f5af, type: 2}
brain: {fileID: 11400000, guid: 29ed78b3e8fef4340b3a1f6954b88f18, type: 2}
agentParameters:
agentCameras: []
maxStep: 3000

m_Script: {fileID: 11500000, guid: 2a2688ef4a36349f9aa010020c32d198, type: 3}
m_Name:
m_EditorClassIdentifier:
brain: {fileID: 11400000, guid: b7b6884feff2f4a17a645d7e0b9dc8f3, type: 2}
brain: {fileID: 11400000, guid: 090fa5a8588f5433bb7f878e6f5ac954, type: 2}
agentParameters:
agentCameras: []
maxStep: 3000

m_Script: {fileID: 11500000, guid: 2a2688ef4a36349f9aa010020c32d198, type: 3}
m_Name:
m_EditorClassIdentifier:
brain: {fileID: 11400000, guid: 0e2b949bf7d37469786426a6d913f5af, type: 2}
brain: {fileID: 11400000, guid: 29ed78b3e8fef4340b3a1f6954b88f18, type: 2}
agentParameters:
agentCameras: []
maxStep: 3000

2
UnitySDK/Assets/ML-Agents/Examples/Tennis/Brains/TennisLearning.asset


-
-
vectorActionSpaceType: 1
model: {fileID: 4900000, guid: 6d4281b70d41f48cb83d663b84f78c9a, type: 3}
model: {fileID: 11400000, guid: 14a6405c810e241918d14d3b6226b87b, type: 3}

4
UnitySDK/Assets/ML-Agents/Examples/Tennis/Prefabs/TennisArea.prefab


m_Script: {fileID: 11500000, guid: e51a3fb0b3186433ea84fc1e0549cc91, type: 3}
m_Name:
m_EditorClassIdentifier:
brain: {fileID: 11400000, guid: 6bf6a586a645b471bb9bd1194ae0e229, type: 2}
brain: {fileID: 11400000, guid: 1674996276be448c2ad51fb139e21e05, type: 2}
agentParameters:
agentCameras: []
maxStep: 5000

m_Script: {fileID: 11500000, guid: e51a3fb0b3186433ea84fc1e0549cc91, type: 3}
m_Name:
m_EditorClassIdentifier:
brain: {fileID: 11400000, guid: 6bf6a586a645b471bb9bd1194ae0e229, type: 2}
brain: {fileID: 11400000, guid: 1674996276be448c2ad51fb139e21e05, type: 2}
agentParameters:
agentCameras: []
maxStep: 5000

2
UnitySDK/Assets/ML-Agents/Examples/Walker/Brains/WalkerLearning.asset


-
-
vectorActionSpaceType: 1
model: {fileID: 4900000, guid: 48ab33cf9fbee4883948187618027835, type: 3}
model: {fileID: 11400000, guid: 097040deda0de41ddb3050c60d8cfc67, type: 3}

2
UnitySDK/Assets/ML-Agents/Examples/WallJump/Brains/BigWallJumpLearning.asset


-
-
vectorActionSpaceType: 0
model: {fileID: 4900000, guid: c118879bb5db84f269e4da23ba8c4f61, type: 3}
model: {fileID: 11400000, guid: dc3a7a234db41444fb51386dafe44cbc, type: 3}

2
UnitySDK/Assets/ML-Agents/Examples/WallJump/Brains/SmallWallJumpLearning.asset


-
-
vectorActionSpaceType: 0
model: {fileID: 4900000, guid: 92cd96b2c34334db692e93af25b64d2a, type: 3}
model: {fileID: 11400000, guid: 7ed5da5ea3aa74cb4bf83bda60b1518e, type: 3}

26
UnitySDK/Assets/ML-Agents/Scripts/Academy.cs


private const string kApiVersion = "API-6";
/// Temporary storage for global gravity value
/// Used to restore oringal value when deriving Academy modifies it
private Vector3 originalGravity;
/// Temporary storage for global fixedDeltaTime value
/// Used to restore oringal value when deriving Academy modifies it
private float originalFixedDeltaTime;
/// Temporary storage for global maximumDeltaTime value
/// Used to restore oringal value when deriving Academy modifies it
private float originalMaximumDeltaTime;
// Fields provided in the Inspector
[SerializeField]

/// </summary>
private void InitializeEnvironment()
{
originalGravity = Physics.gravity;
originalFixedDeltaTime = Time.fixedDeltaTime;
originalMaximumDeltaTime = Time.maximumDeltaTime;
InitializeAcademy();
Communicator communicator = null;

void FixedUpdate()
{
EnvironmentStep();
}
/// <summary>
/// Cleanup function
/// </summary>
protected virtual void OnDestroy()
{
Physics.gravity = originalGravity;
Time.fixedDeltaTime = originalFixedDeltaTime;
Time.maximumDeltaTime = originalMaximumDeltaTime;
}
}
}

5
UnitySDK/Assets/ML-Agents/Scripts/Agent.cs


{
action.memories = memories;
}
public void AppendMemoriesAction(List<float> memories)
{
action.memories.AddRange(memories);
}
/// <summary>
/// Updates the text action.

40
UnitySDK/Assets/ML-Agents/Scripts/InferenceBrain/ApplierImpl.cs


using System.Collections.Generic;
using MLAgents.InferenceBrain.Utils;
using UnityEngine;
namespace MLAgents.InferenceBrain
{

public void Apply(Tensor tensor, Dictionary<Agent, AgentInfo> agentInfo)
{
var tensorDataAction = tensor.Data as float[,];
var actionSize = tensor.Shape[1];
var actionSize = tensor.Shape[tensor.Shape.Length - 1];
var agentIndex = 0;
foreach (var agent in agentInfo.Keys)
{

}
}
}
public class BarracudaMemoryOutputApplier : TensorApplier.Applier
{
private bool firstHalf = true;
public BarracudaMemoryOutputApplier(bool firstHalf)
{
this.firstHalf = firstHalf;
}
public void Apply(Tensor tensor, Dictionary<Agent, AgentInfo> agentInfo)
{
var tensorDataMemory = tensor.Data as float[,];
var agentIndex = 0;
var memorySize = tensor.Shape[tensor.Shape.Length - 1];
foreach (var agent in agentInfo.Keys)
{
var memory = new List<float>();
for (var j = 0; j < memorySize; j++)
{
memory.Add(tensorDataMemory[agentIndex, j]);
}
if (firstHalf)
{
agent.UpdateMemoriesAction(memory);
}
else
{
agent.AppendMemoriesAction(memory);
}
agentIndex++;
}
}
}
/// <summary>
/// The Applier for the Memory output tensor. Tensor is assumed to contain the new

{
var tensorDataMemory = tensor.Data as float[,];
var agentIndex = 0;
var memorySize = tensor.Shape[1];
var memorySize = tensor.Shape[tensor.Shape.Length - 1];
foreach (var agent in agentInfo.Keys)
{
var memory = new List<float>();

61
UnitySDK/Assets/ML-Agents/Scripts/InferenceBrain/GeneratorImpl.cs


{
public void Generate(Tensor tensor, int batchSize, Dictionary<Agent, AgentInfo> agentInfo)
{
var shapeSecondAxis = tensor.Shape[1];
var shapeSecondAxis = tensor.Shape[tensor.Shape.Length - 1];
tensor.Shape[0] = batchSize;
if (tensor.ValueType == Tensor.TensorType.FloatingPoint)
{

public void Generate(Tensor tensor, int batchSize, Dictionary<Agent, AgentInfo> agentInfo)
{
tensor.Shape[0] = batchSize;
var vecObsSizeT = tensor.Shape[1];
var vecObsSizeT = tensor.Shape[tensor.Shape.Length - 1];
tensor.Data = new float[batchSize, vecObsSizeT];
var agentIndex = 0;
foreach (var agent in agentInfo.Keys)

public void Generate(Tensor tensor, int batchSize, Dictionary<Agent, AgentInfo> agentInfo)
{
tensor.Shape[0] = batchSize;
var memorySize = tensor.Shape[1];
var memorySize = tensor.Shape[tensor.Shape.Length - 1];
tensor.Data = new float[batchSize, memorySize];
var agentIndex = 0;
foreach (var agent in agentInfo.Keys)

}
}
}
public class BarracudaRecurrentInputGenerator : TensorGenerator.Generator
{
private bool firstHalf = true;
public BarracudaRecurrentInputGenerator(bool firstHalf)
{
this.firstHalf = firstHalf;
}
public void Generate(Tensor tensor, int batchSize, Dictionary<Agent, AgentInfo> agentInfo)
{
tensor.Shape[0] = batchSize;
var memorySize = tensor.Shape[tensor.Shape.Length - 1];
tensor.Data = new float[batchSize, memorySize];
var agentIndex = 0;
foreach (var agent in agentInfo.Keys)
{
var memory = agentInfo[agent].memories;
int offset = 0;
if (!firstHalf)
{
offset = memory.Count - (int)memorySize;
}
if (memory == null)
{
agentIndex++;
continue;
}
for (var j = 0; j < memorySize; j++)
{
if (j >= memory.Count)
{
break;
}
tensor.Data.SetValue(memory[j + offset], new int[2] {agentIndex, j});
}
agentIndex++;
}
}
}
/// <summary>
/// Generates the Tensor corresponding to the Previous Action input : Will be a two

{
public void Generate(Tensor tensor, int batchSize, Dictionary<Agent, AgentInfo> agentInfo)
{
if (tensor.ValueType != Tensor.TensorType.Integer)
{
throw new NotImplementedException(
"Previous Action Inputs are only valid for discrete control");
}
var actionSize = tensor.Shape[1];
var actionSize = tensor.Shape[tensor.Shape.Length - 1];
tensor.Data = new int[batchSize, actionSize];
var agentIndex = 0;
foreach (var agent in agentInfo.Keys)

public void Generate(Tensor tensor, int batchSize, Dictionary<Agent, AgentInfo> agentInfo)
{
tensor.Shape[0] = batchSize;
var maskSize = tensor.Shape[1];
var maskSize = tensor.Shape[tensor.Shape.Length - 1];
tensor.Data = new float[batchSize, maskSize];
var agentIndex = 0;
foreach (var agent in agentInfo.Keys)

public void Generate(Tensor tensor, int batchSize, Dictionary<Agent, AgentInfo> agentInfo)
{
tensor.Shape[0] = batchSize;
var actionSize = tensor.Shape[1];
var actionSize = tensor.Shape[tensor.Shape.Length - 1];
tensor.Data = new float[batchSize, actionSize];
_randomNormal.FillTensor(tensor);
}

3
UnitySDK/Assets/ML-Agents/Scripts/InferenceBrain/TensorApplier.cs


bp.vectorActionSize, seed);
}
_dict[TensorNames.RecurrentOutput] = new MemoryOutputApplier();
_dict[TensorNames.RecurrentOutput_C] = new BarracudaMemoryOutputApplier(true);
_dict[TensorNames.RecurrentOutput_H] = new BarracudaMemoryOutputApplier(false);
}
/// <summary>

4
UnitySDK/Assets/ML-Agents/Scripts/InferenceBrain/TensorGenerator.cs


_dict[TensorNames.SequenceLengthPlaceholder] = new SequenceLengthGenerator();
_dict[TensorNames.VectorObservationPlacholder] = new VectorObservationGenerator();
_dict[TensorNames.RecurrentInPlaceholder] = new RecurrentInputGenerator();
_dict[TensorNames.RecurrentInPlaceholder_C] = new BarracudaRecurrentInputGenerator(true);
_dict[TensorNames.RecurrentInPlaceholder_H] = new BarracudaRecurrentInputGenerator(false);
_dict[TensorNames.PreviousActionPlaceholder] = new PreviousActionInputGenerator();
_dict[TensorNames.ActionMaskPlaceholder] = new ActionMaskInputGenerator();
_dict[TensorNames.RandomNormalEpsilonPlaceholder] = new RandomNormalInputGenerator(seed);

4
UnitySDK/Assets/ML-Agents/Scripts/InferenceBrain/TensorNames.cs


public const string SequenceLengthPlaceholder = "sequence_length";
public const string VectorObservationPlacholder = "vector_observation";
public const string RecurrentInPlaceholder = "recurrent_in";
public const string RecurrentInPlaceholder_H = "recurrent_in_h";
public const string RecurrentInPlaceholder_C = "recurrent_in_c";
public const string VisualObservationPlaceholderPrefix = "visual_observation_";
public const string PreviousActionPlaceholder = "prev_action";
public const string ActionMaskPlaceholder = "action_masks";

public const string RecurrentOutput = "recurrent_out";
public const string RecurrentOutput_H = "recurrent_out_h";
public const string RecurrentOutput_C = "recurrent_out_c";
public const string MemorySize = "memory_size";
public const string VersionNumber = "version_number";
public const string IsContinuousControl = "is_continuous_control";

124
UnitySDK/Assets/ML-Agents/Scripts/LearningBrain.cs


using System;
#define ENABLE_BARRACUDA
using System;
using Barracuda;
using Tensor = MLAgents.InferenceBrain.Tensor;
public enum InferenceDevice
{
CPU = 0,
GPU = 1
}
/// <summary>
/// The Learning Brain works differently if you are training it or not.
/// When training your Agents, drag the Learning Brain to the Academy's BroadcastHub and check

private TensorGenerator _tensorGenerator;
private TensorApplier _tensorApplier;
#if ENABLE_TENSORFLOW
private ModelParamLoader _modelParamLoader;
#endif
#if ENABLE_TENSORFLOW
private ModelParamLoader _modelParamLoader;
#elif ENABLE_BARRACUDA
public NNModel model;
private Model _barracudaModel;
private IWorker _engine;
private bool _verbose = false;
private BarracudaModelParamLoader _modelParamLoader;
private string[] _outputNames;
[Tooltip("Inference execution device. CPU is the fastest option for most of ML Agents models. " +
"(This field is not applicable for training).")]
public InferenceDevice inferenceDevice = InferenceDevice.CPU;
private IEnumerable<Tensor> _inferenceInputs;
private IEnumerable<Tensor> _inferenceOutputs;

_inferenceOutputs = _modelParamLoader.GetOutputTensors();
_tensorGenerator = new TensorGenerator(brainParameters, seed);
_tensorApplier = new TensorApplier(brainParameters, seed);
#elif ENABLE_BARRACUDA
if (model != null)
{
#if BARRACUDA_VERBOSE
_verbose = true;
#endif
D.logEnabled = _verbose;
// Cleanup previous instance
if (_engine != null)
_engine.Dispose();
_barracudaModel = ModelLoader.Load(model.Value);
var executionDevice = inferenceDevice == InferenceDevice.GPU
? BarracudaWorkerFactory.Type.ComputeFast
: BarracudaWorkerFactory.Type.CSharpFast;
_engine = BarracudaWorkerFactory.CreateWorker(executionDevice, _barracudaModel, _verbose);
}
else
{
_barracudaModel = null;
_engine = null;
}
_modelParamLoader = BarracudaModelParamLoader.GetLoaderAndCheck(_engine, _barracudaModel, brainParameters);
_inferenceInputs = _modelParamLoader.GetInputTensors();
_outputNames = _modelParamLoader.GetOutputNames();
_tensorGenerator = new TensorGenerator(brainParameters, seed);
_tensorApplier = new TensorApplier(brainParameters, seed);
#endif
}

{
#if ENABLE_TENSORFLOW
return (_modelParamLoader != null) ? _modelParamLoader.GetChecks() : new List<string>();
#elif ENABLE_BARRACUDA
return (_modelParamLoader != null) ? _modelParamLoader.GetChecks() : new List<string>();
#else
return new List<string>(){

// Update the outputs
_tensorApplier.ApplyTensors(_inferenceOutputs, agentInfos);
#elif ENABLE_BARRACUDA
if (_engine == null)
{
Debug.LogError($"No model was present for the Brain {name}.");
return;
}
// Prepare the input tensors to be feed into the engine
_tensorGenerator.GenerateTensors(_inferenceInputs, currentBatchSize, agentInfos);
var inputs = PrepareBarracudaInputs(_inferenceInputs);
// Execute the Model
Profiler.BeginSample($"MLAgents.{name}.ExecuteGraph");
_engine.Execute(inputs);
Profiler.EndSample();
_inferenceOutputs = FetchBarracudaOutputs(_outputNames);
CleanupBarracudaState(inputs);
// Update the outputs
_tensorApplier.ApplyTensors(_inferenceOutputs, agentInfos);
#else
if (agentInfos.Count > 0)
{

#endif
agentInfos.Clear();
}
#if ENABLE_BARRACUDA && !ENABLE_TENSORFLOW
protected Dictionary<string, Barracuda.Tensor> PrepareBarracudaInputs(IEnumerable<Tensor> infInputs)
{
var inputs = new Dictionary<string, Barracuda.Tensor>();
foreach (var inp in _inferenceInputs)
{
inputs[inp.Name] = BarracudaUtils.ToBarracuda(inp);
}
return inputs;
}
protected List<Tensor> FetchBarracudaOutputs(string[] names)
{
var outputs = new List<Tensor>();
foreach (var name in names)
{
var outp = _engine.Fetch(name);
outputs.Add(BarracudaUtils.FromBarracuda(outp, name));
outp.Dispose();
}
return outputs;
}
protected void CleanupBarracudaState(Dictionary<string, Barracuda.Tensor> inputs)
{
foreach (var key in inputs.Keys)
{
inputs[key].Dispose();
}
inputs.Clear();
}
public void OnDisable()
{
_engine?.Dispose();
}
#endif
}
}

4
UnitySDK/ProjectSettings/ProjectSettings.asset


iOSURLSchemes: []
iOSBackgroundModes: 0
iOSMetalForceHardShadows: 0
metalEditorSupport: 0
metalEditorSupport: 1
metalAPIValidation: 1
iOSRenderExtraFrameOnPause: 1
appleDeveloperTeamID:

m_BuildTargetBatching: []
m_BuildTargetGraphicsAPIs:
- m_BuildTarget: MacStandaloneSupport
m_APIs: 1100000010000000
m_APIs: 10000000
m_Automatic: 0
m_BuildTargetVRSettings: []
m_BuildTargetEnableVuforiaSettings: []

17
docs/Background-TensorFlow.md


performing computations using data flow graphs, the underlying representation of
deep learning models. It facilitates training and inference on CPUs and GPUs in
a desktop, server, or mobile device. Within the ML-Agents toolkit, when you
train the behavior of an agent, the output is a TensorFlow model (.bytes) file
train the behavior of an agent, the output is a TensorFlow model (.nn) file
that you can then embed within a Learning Brain. Unless you implement a new
algorithm, the use of TensorFlow is mostly abstracted away and behind the
scenes.

recommend our guide on [using Tensorboard with ML-Agents](Using-Tensorboard.md) or
this [tutorial](https://github.com/dandelionmane/tf-dev-summit-tensorboard-tutorial).
## TensorflowSharp
One of the drawbacks of TensorFlow is that it does not provide a native C# API.
This means that the Learning Brain is not natively supported since Unity scripts
are written in C#. Consequently, to enable the Learning Brain, we leverage a
third-party library
[TensorFlowSharp](https://github.com/migueldeicaza/TensorFlowSharp) which
provides .NET bindings to TensorFlow. Thus, when a Unity environment that
contains a Learning Brain is built, inference is performed via TensorFlowSharp.
We provide an additional in-depth overview of how to leverage
[TensorFlowSharp within Unity](Using-TensorFlow-Sharp-in-Unity.md)
which will become more
relevant once you install and start training behaviors within the ML-Agents
toolkit. Given the reliance on TensorFlowSharp, the Learning Brain is currently
marked as experimental.

40
docs/Basic-Guide.md


Equivalent or .NET 4.x Equivalent)**
6. Go to **File** > **Save Project**
## Setting up TensorFlowSharp
We provide pre-trained models (`.bytes` files) for all the agents
in all our demo environments. To be able to run those models, you'll
first need to set-up TensorFlowSharp support. Consequently, you need to install
the TensorFlowSharp plugin to be able to run these models within the Unity
Editor.
1. Download the [TensorFlowSharp Plugin](https://s3.amazonaws.com/unity-ml-agents/0.5/TFSharpPlugin.unitypackage)
2. Import it into Unity by double clicking the downloaded file. You can check
if it was successfully imported by checking the
TensorFlow files in the Project window under **Assets** > **ML-Agents** >
**Plugins** > **Computer**.
3. Go to **Edit** > **Project Settings** > **Player** and add `ENABLE_TENSORFLOW`
to the `Scripting Define Symbols` for each type of device you want to use
(**`PC, Mac and Linux Standalone`**, **`iOS`** or **`Android`**).
![Project Settings](images/project-settings.png)
**Note**: If you don't see anything under **Assets**, drag the
`UnitySDK/Assets/ML-Agents` folder under **Assets** within Project window.
![Imported TensorFlowsharp](images/imported-tensorflowsharp.png)
We've included pre-trained models for the 3D Ball example.
We include pre-trained models for our agents (`.nn` files) and we use the
[Unity Inference Engine](Unity-Inference-Engine.md) to run these models
inside Unity. In this section, we will use the pre-trained model for the
3D Ball example.
1. In the **Project** window, go to the `Assets/ML-Agents/Examples/3DBall/Scenes` folder
and open the `3DBall` scene file.

folder.
7. Drag the `3DBallLearning` model file from the `Assets/ML-Agents/Examples/3DBall/TFModels`
folder to the **Model** field of the **3DBallLearning** Brain in the **Inspector** window. __Note__ : All of the brains should now have `3DBallLearning` as the TensorFlow model in the `Model` property
8. Click the **Play** button and you will see the platforms balance the balls
8. Select the **InferenceDevice** to use for this model (CPU or GPU).
_Note: CPU is faster for the majority of ML-Agents toolkit generated models_
9. Click the **Play** button and you will see the platforms balance the balls
using the pretrained model.
![Running a pretrained model](images/running-a-pretrained-model.gif)

## Training the Brain with Reinforcement Learning
### Setting up the enviornment for training
### Setting up the environment for training
To set up the environment for training, you will need to specify which agents are contributing
to the training and which Brain is being trained. You can only perform training with

### After training
You can press Ctrl+C to stop the training, and your trained model will be at
`models/<run-identifier>/<brain_name>.bytes` where
`models/<run-identifier>/<brain_name>.nn` where
`<brain_name>` is the name of the Brain corresponding to the model.
(**Note:** There is a known bug on Windows that causes the saving of the model to
fail when you early terminate the training, it's recommended to wait until Step

`UnitySDK/Assets/ML-Agents/Examples/3DBall/TFModels/`.
2. Open the Unity Editor, and select the **3DBall** scene as described above.
3. Select the **3DBallLearning** Learning Brain from the Scene hierarchy.
5. Drag the `<brain_name>.bytes` file from the Project window of
5. Drag the `<brain_name>.nn` file from the Project window of
the Editor to the **Model** placeholder in the **3DBallLearning**
inspector window.
6. Press the :arrow_forward: button at the top of the Editor.

12
docs/Getting-Started-with-Balance-Ball.md


use it with Agents having a **Learning Brain**.
__Note:__ Do not just close the Unity Window once the `Saved Model` message appears.
Either wait for the training process to close the window or press Ctrl+C at the
command-line prompt. If you close the window manually, the `.bytes` file
command-line prompt. If you close the window manually, the `.nn` file
### Setting up TensorFlowSharp
Because TensorFlowSharp support is still experimental, it is disabled by
default. Please note that the `Learning` Brain inference can only be used with
TensorFlowSharp.
To set up the TensorFlowSharp Support, follow [Setting up ML-Agents Toolkit
within Unity](Basic-Guide.md#setting-up-ml-agents-within-unity) section. of the
Basic Guide page.
### Embedding the trained model into Unity

8
docs/Learning-Environment-Design-Learning-Brains.md


To use a graph model:
1. Select the **Learning Brain** asset in the **Project** window of the Unity Editor.
**Note:** In order to use the **Learning** Brain with inference, you need to have
TensorFlowSharp enabled. Refer to [this section](Basic-Guide.md#setting-up-ml-agents-within-unity) for more information.
2. Import the `model_name` file produced by the PPO training
program. (Where `model_name` is the name of the model file, which is
constructed from the name of your Unity environment executable and the run-id

[import assets into Unity](https://docs.unity3d.com/Manual/ImportingAssets.html)
in various ways. The easiest way is to simply drag the file into the
**Project** window and drop it into an appropriate folder.
3. Once the `model_name.bytes` file is imported, drag it from the **Project**
3. Once the `model_name.nn` file is imported, drag it from the **Project**
window to the **Model** field of the Brain component.
If you are using a model produced by the ML-Agents `mlagents-learn` command, use

The default values of the TensorFlow graph parameters work with the model
produced by the PPO and BC training code in the ML-Agents SDK. To use a default
ML-Agents model, the only parameter that you need to set is the `Model`,
which must be set to the `.bytes` file containing the trained model itself.
which must be set to the `.nn` file containing the trained model itself.
* `Model` : This must be the `.bytes` file corresponding to the pre-trained
* `Model` : This must be the `.nn` file corresponding to the pre-trained
TensorFlow graph. (You must first drag this file into your Project window
and then from the Resources folder into the inspector)

4
docs/Learning-Environment-Executable.md


```
You can press Ctrl+C to stop the training, and your trained model will be at
`models/<run-identifier>/<brain_name>.bytes`, which corresponds
`models/<run-identifier>/<brain_name>.nn`, which corresponds
to your model's latest checkpoint. (**Note:** There is a known bug on Windows
that causes the saving of the model to fail when you early terminate the
training, it's recommended to wait until Step has reached the max_steps

`UnitySDK/Assets/ML-Agents/Examples/3DBall/TFModels/`.
2. Open the Unity Editor, and select the **3DBall** scene as described above.
3. Select the **Ball3DLearning** object from the Project window.
5. Drag the `<brain_name>.bytes` file from the Project window of
5. Drag the `<brain_name>.nn` file from the Project window of
the Editor to the **Model** placeholder in the **Ball3DLearning**
inspector window.
6. Remove the **Ball3DLearning** from the Academy's `Broadcast Hub`

4
docs/ML-Agents-Overview.md


model. This model is then embedded within the Learning Brain during inference to
generate the optimal actions for all Agents linked to that Brain.
**Note that our Learning Brain is currently experimental as it is limited to TensorFlow
models and leverages the third-party
[TensorFlowSharp](https://github.com/migueldeicaza/TensorFlowSharp) library.**
The
[Getting Started with the 3D Balance Ball Example](Getting-Started-with-Balance-Ball.md)
tutorial covers this training mode with the **3D Balance Ball** sample environment.

3
docs/Readme.md


* [Using TensorBoard to Observe Training](Using-Tensorboard.md)
## Inference
* [TensorFlowSharp in Unity (Experimental)](Using-TensorFlow-Sharp-in-Unity.md)
* [Unity Inference Engine](Unity-Inference-Engine.md)
## Help

2
docs/Training-Imitation-Learning.md


similarly to the demonstrations.
11. Once the Student Agents are exhibiting the desired behavior, end the training
process with `CTL+C` from the command line.
12. Move the resulting `*.bytes` file into the `TFModels` subdirectory of the
12. Move the resulting `*.nn` file into the `TFModels` subdirectory of the
Assets folder (or a subdirectory within Assets of your choosing) , and use
with `Learning` Brain.

2
docs/Training-ML-Agents.md


When training is finished, you can find the saved model in the `models` folder
under the assigned run-id — in the cats example, the path to the model would be
`models/cob_1/CatsOnBicycles_cob_1.bytes`.
`models/cob_1/CatsOnBicycles_cob_1.nn`.
While this example used the default training hyperparameters, you can edit the
[training_config.yaml file](#training-config-file) with a text editor to set

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


import tensorflow as tf
from mlagents.trainers import UnityException
from mlagents.trainers.models import LearningModel
from mlagents.trainers import tensorflow_to_barracuda as tf2bc
logger = logging.getLogger("mlagents.trainers")

def export_model(self):
"""
Exports latest saved model to .tf format for Unity embedding.
Exports latest saved model to .nn format for Unity embedding.
with self.graph.as_default():
target_nodes = ','.join(self._process_graph())
ckpt = tf.train.get_checkpoint_state(self.model_path)

input_checkpoint=ckpt.model_checkpoint_path,
output_node_names=target_nodes,
output_graph=(self.model_path + '.bytes'),
output_graph=(self.model_path + '/frozen_graph_def.pb'),
tf2bc.convert(self.model_path + '/frozen_graph_def.pb', self.model_path + '.nn')
def _process_graph(self):
"""

2
ml-agents/mlagents/trainers/trainer_controller.py


def _export_graph(self):
"""
Exports latest saved models to .bytes format for Unity embedding.
Exports latest saved models to .nn format for Unity embedding.
"""
for brain_name in self.trainers.keys():
self.trainers[brain_name].export_model()

29
UnitySDK/Assets/ML-Agents/Editor/NNModelImporter.cs


using System.IO;
using UnityEditor;
using UnityEngine;
using UnityEditor.Experimental.AssetImporters;
using MLAgents.InferenceBrain;
namespace MLAgents
{
/// <summary>
/// Asset Importer of barracuda models.
/// </summary>
[ScriptedImporter(1, new[] {"nn"})]
public class NNModelImporter : ScriptedImporter {
private const string IconPath = "Assets/ML-Agents/Resources/NNModelIcon.png";
public override void OnImportAsset(AssetImportContext ctx)
{
var model = File.ReadAllBytes(ctx.assetPath);
var asset = ScriptableObject.CreateInstance<NNModel>();
asset.Value = model;
Texture2D texture = (Texture2D)
AssetDatabase.LoadAssetAtPath(IconPath, typeof(Texture2D));
ctx.AddObjectToAsset(ctx.assetPath, asset, texture);
ctx.SetMainObject(asset);
}
}
}

11
UnitySDK/Assets/ML-Agents/Editor/NNModelImporter.cs.meta


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

286
UnitySDK/Assets/ML-Agents/Examples/3DBall/TFModels/3DBallHardLearning.nn


vector_observation����-epsilon����action&action_output_shape������?action_output_shape memory_size������? memory_sizeversion_number������?version_numberis_continuous_control������?is_continuous_control global_step������? global_stepadd_2/y������?add_2/ynormalized_state/Minimum/y������?normalized_state/Minimum/ymul_4/x������?mul_4/xclip_by_value/Minimum/y������?clip_by_value/Minimum/yclip_by_value/y������?clip_by_value/y normalized_state/y������?normalized_state/y
running_variance������?running_variance- - running_mean������? running_mean-8-mul_3/x������?mul_3/xe truediv_3/y������? truediv_3/yfmul_2/x������?mul_2/xgLog/x������?Log/xhlog_sigma_squared������?log_sigma_squaredisub_3e�����?vector_observation running_meanadd_2d�����? global_stepadd_2/y truediv_1g�����?running_varianceadd_2Sqrt2o�����? truediv_1 truediv_2g�����?sub_3Sqrtnormalized_state/Minimumn�����? truediv_2normalized_state/Minimum/ynormalized_stateo�����?normalized_state/Minimumnormalized_state/ymain_graph_0/hidden_0/BiasAdd�����?normalized_statemain_graph_0/hidden_0/kernel-�k�main_graph_0/hidden_0/bias���main_graph_0/hidden_0/Mul2 �����?main_graph_0/hidden_0/BiasAddmain_graph_0/hidden_1/BiasAdd�����?main_graph_0/hidden_0/Mulmain_graph_0/hidden_1/kernel��k@main_graph_0/hidden_1/bias�kW�main_graph_0/hidden_1/Mul2 �����?main_graph_0/hidden_1/BiasAdd dense/BiasAdd�����?main_graph_0/hidden_1/Mul dense/kernel��W
dense/bias�XExp2q�����?log_sigma_squaredSqrt_12o�����?Expmul_1f�����?Sqrt_1epsilonadd_3d�����? dense/BiasAddmul_1clip_by_value/Minimumn�����?add_3clip_by_value/Minimum/y clip_by_valueo�����?clip_by_value/Minimumclip_by_value/y truediv_3g�����? clip_by_value truediv_3/yaction2�����? truediv_3@�?�?QCG�?�@?@@@����`BuJ�A�Er�LE��E�X
B�K�A� E��PEךE�\ Bv�A��E�iTE�QEmBhlBVEH�WE��E��B�BC$EP`ZEH�&E��B:�B�8,EB�\E�/E\+B��B��5E��^E�9EZ�B��B�hAE��_E!�DE�B$ B��NE�H_E>�RE�2I�9�!;�V?� "Z?���-|g�.K(;y�:�=][?.��A����/;�45�ԁ\?� ��ґ���7;��.���]?j�N���|�@;��&�C�^?T���2����J;L��z_?ͪ�+?���U;&���E`?����ƺ��`; ����`?o6��fҺ��m;i<��!a?� �?@@���@ΝG�C�D�a��>��)>atӽ��m>y��}�~> ��>^+c>p+(���=��d��I�=c�= �{��蜾�"���3���w>����v��;\� >v �;�R�<�Gv>�f!��Bҽ��v>�=��G=~�>7`��-��=Jۍ�������<�o�>��н�aj=iᶼy��I߼�&�O���_�,�e>3��Z[>R�R>�gK>踯�1�7�WE>7@.=Aw(>Dat���� #�R8�=@z
�Y�T3��Y�>L����R����w`��fMO�� ���*i�>��9�����ƽ0ҝ��t>X�=>�<�=��;=K���{B�^Nl����W��+�¼받����<� K=�;=b>�*V=��[<�נ=�IF�E󤽣 �<rL�>*�?=Z|����~����>?z ���̽��ڽ�>��=1!> #|=�F����3�U�<��E>��=���=�M��e\���{�>vKR���N>�X�������W�ux�>��H�i>�V��{�>�F;ں<�*]>��1;�DY<k��>u��� a =od-> ; >D���=����P.��&*>�l�;�u>�/$�� �>��S��m0�{�'@���M� ��Yo�>��=k;_�@�=f�<�x�>d�Ľfb�H��ƴ����p��P�=�p�=[��= k3>�.�=AB�(U*���>�_�=��:>Hl�=��=��/>c�r�i��=�«�U2l��y>��Z<�j�<3���¬�z�;>���>k@�=�1��p���Ya��J����
>��x�n��н9�J(���J����4�>gg�=���=D!�����>�(���M=��߼Yf�<9ý�FཌBt����K⣽�M�;ˤo=w t�`�Ľ��w�f�2=)]S�Qy ���1��%K>�g=�q=����uS0��pQ>1�>�3> ��˟���8�=7٢��_�>��F��2)=�a��Y�����<YI��ۑ��#�&>�xD>˸�>b,�=c^�=b7�=;��=�{��l��j�r>�a���}>{�L>M�>g��wd���Ͻ��ͼH&>��>��������=g���<'74� �="��~y�<��=�[˼�b= ��>�su���>y漘�)�D�= >$��=4R���B�N�߽���҅�QAg=Ց�<�+l�z܊<�cn��+W����=-<,>`B~�2����v=>o5�4��",<�����*��d=���=�sq��4����H{�=��<Ɩ��^нH��=��1�V��>A���������;�X�>#L>2�u=���=���=��:��;l=�|��j4{��ߡ�[(>�*s���t=_�I�,�l�K��>���=�]��h >Ñ�<��
>�� �� �\��.���]T��&�O;(9�[��[�#��*��c��=f�">չ�=o3>���e�`>-�{���.>A�C�-L��0t�d�aC�� ޽C� <,=��m�=��k�� �=n���3x>Nc>g��<�t�<$���ta<#�Ƚ/�b<�D�u�>�͕=��`�%ጾ$�p�a��=��x��*��*!�=����}�.v���X4=qȡ=��p�3 x�I�2�D�9��<x�B�Ŵ4�����;���<H (>�P�:�>�W3<7�Ac�=�H_>��L>��ʽ_;�=q��5!�>/y<9����ڼn��=��>�����v8�~q��U¾�o}�>'i=b��I]&���;��@�9��<� %>�
>}H>z�w>w�-�?p=1�>z����W�>Y��|k!��8l��_�>@O�=pq =�B7��}�����=�E^���n=��R>""��D�!F�<2�W=���P���#>��>w:��@[=s��=�2�=ʄ'�˻�=b[���u��0U�<��8��
��l�P>�z>@��>�$��*ؼtr�=#� �Cd#�YIJ���Au>�&�=�+�>��=��p���=�}@��ν�V;K.@<M)�m+� ��e� >#��� �<�$�=�R����!=C�"��->�+�<���=�fy���j�U2޽�#;�֑=�s>چ��L��;�Fg�+~>B[�;e�ڼ��e�q f>�F��K��=I��= ���+���~����>�C={��==>$�O>YT��g=(�N>Z�`;_�T��l>�P�����=���=�U�>�[/��.�I� =�O>�]�=�t�>Q>ಉ��<�@+�����շ>oq=�a�ؽ��y���=�k$�>㆟>�J�����=�W8>�
ڼ�����ػӻ,>��ݼ鴦��5�=�q�<ePx>"ϑ���=VS>}M@�{e�<�l��->� ��h<��#���>�y��*ԏ=C�b������=�I�<(3K=�1>+�8<�:q<,tj>��� ��=�콳�� r>1�x>m��=W��Ŝ���ս�����z�g� =��=��h���U>��=�1z>�����!��:�<���nx>��=�F�=�4�>�e >!5�!`���W��������gŻC�w���`>�-�'�<Y>2|>��F��h>'��=�<R>T^�=��,>��>wؓ>����y���?$=͌X=� �=�\�=b���\���D>���<�d.�f���Q��R�1>|�a��h�>��>U%=7�̽��>�c���oo����$� �V3��ky�=�m�>ߓ��=��v�T1=t�.�JEP�f(i=��.�(H��VǼ�t>��h��$j���Ѽ�bѽ4-ý�/;��h�=�`��'��Y�����+>tͽ�Z->�9>����)�2�����:߽���<I$��`��=,�7>ɔ�`���p@>S3�=m4��4��?>��n�W�׼g��=�񀽄�==
�y=�L������K�G���i> ���k!>�oM:�6>�F �E��=[�=2]�=���s��>*$�� ]>����"�>��ؼ4�뽪4A�\�ܽ���}��=L��=��=��">���������[ڼ3Ee�wh��������>@U,�i���)e��3��gZ�=Xx@�4�<y�H�*���\�� ���ν��X>�3��"3!�'�<��B� �Nu�Xܥ�"�����>Ӣ�� ú=p�D��};*�\�J�d=?��=$�V>��'>Vs==>}=�3�b��=Ÿ�����~�s�����=�=�&>#` =��=�!��Y^������%��<�\�=��ֽ�g]<K��>_�Ӽ����7̼"�ս��=}��=��u=�Z�?o:=>޽��=hv�=��򽏅;>��>9N��22�= �y>^D*<e�N>U�Ǽa:��"�nkڽl8���нЋ;=���=�@5��ͺ�Pa���[>��1�|T�>�T�=�J�[��=��1>O��=�[��
|=���=Í^< �J����=�Y޽2�<x�住� >x��)�,>t%�=�gн�1>Td>a/c�W_��w��<j��=P�~>�e�=f;�>o>7�8�����~V>�0Q��¦=�;{���{=1�5��ߌ�W�����ݽ��=�N�=C�{>#�����Y����,�wm��� =}��>p䭽�T޼%��=�e>�a�#��>!M�묜>7������=
��=G2�B�)<o<n]����
����z ���<�F%=�C�=U�,�d����/��/C��po�<ûO>��=�!`>�1��y���D#<�[����U>n���PG>A��=�����M�=����#Y>�3�> ��=��<�ʽQ9-��ar�|L��M�������<�c�>[�z�1¡�0v7����~y�=�0>��s>��5�٦��p�1>g�*>�-�� ���g���*��B����3��>�1q��-�=sӳ>������=vdq>�u�@r}=�gܽ��:�j=U>��b��)-=?*>�,��h��A�=)�=����@�=�6��a�= �>-�������Hֽ�]�1���Rn==�nǼ��=�:�=ne�잲=.߇<d�e��>WG���=.�=�[�����-C ��U���<��(d�G�j=��I���g��j��Q����f�$yB���н��ڽ�U=�|�O��:F���ԝ��Y�ͬc���&�j��©���� ������A=�����=����o�=彷�V�t�{�k K���ڽhp�̈�=Ko>{l1=@!s���8��%8�� l�<�;>��=ס ����s���g/^���]�ځ >�k>�0���=m��"�K>�X��/K�> ���l�2L�-� �/<D O>L�d��c�=���n��=C�*��a�����I>�Q=I��<k�~��Ե=��l>[�(=�J�>��>���=��=-儽�o=,���~�{>B��>"����4>
�=�->z<F> ݨ�H�����_>��8�I�p��m�z��=B�����=���L&U>��x�������!����=�� >�W1���d�2�H�2f�=���>� ��ٺ�n���ƀ�=qT_���ͽ`�= >Yk0����"�z�>�U��Z�l���&U\`�I����q��A���\����>���2��=1Z2>�;G���'�Ӽ�^��s�����M>���=�>ڽ^�w��"�<�[3>Z���SI����5>�!4>�V�=�M=<Z�ؿ����<���=X��=$�f>B��=�yK=�ǚ� �%��o��B�<������C>Pƥ��u\�����K��yA�2�b>J�ٽ��=u��>�0*>l͚=�5��i����={��>�=;
k���c>M�T=KG�=��;b<G=���=��@��j���qk�pzq>~�>z�+����!i���>*J=�}�џ��`=��<��>�q>ܒ���?o=�����h��:�S��1^>k� �E�s;��I�[�4>g��%k�=�G>������=����>.�=G�<���=���J�'�̆r=��Q��s=\�=!���·��C@=���=�[1>ߟ�>h��=��&<��ڽ*AX�c��=9������Y�g&>�U�>�ҷ=d�.=afܽ<��>�(T>y�^���>����Y����w�=Wp`������=e���F=2��>�W���D�� ��f��S� >���;�
�>ĆR���{< ���j�=?�սN���i!�V�=W�b��� �_֦�ݼ�<?�E=�:���|>G���9��> W��|�=d�K>&B=CKW�1!�p�5� �]<�ԩ>�Ee>-p=�V=?jR��P���ڃ�-�\���Ӆ��r2�+�&>t6���˽Đ=����(�=��=:<�ꊽ���6<�O�=VQ'�D���ڼ� �=�4��%G�^p���إ>�-"��4=U�=2H>���=������>�Fi�4p�����Nk>CR�;B� >�0:=`�M>��]>��A��u>x�q>�˽s:0� ��=�Q�=;:l;��Z>�^#>�+=����Zd>t~C>��: ����F� ��<�+�l�����<ۈ����� ;����=����(>$S�=�n��_X��>s���b4���t=��!=�zѽmX>T�:ـ>jlD<t� �o��=4�}�pi���(>۷F>6%�>�nB>�]>��c������Z���D=I���d&N=�x�<���=�7�=��ͽ[^G>넅�9q�> <x>T0�Y@Z��]p=m������n>� 7�ɱ��,��P�D�=]�� .8�##3��BB����$>�I��=�w��05����U>���<s �鼗H]>"��� ��7 �d�d>/�w>^V=�\�>� �=�b=�o����=V����g(>�<�=�����y@�B�&=��>V *>~��$׽(H��7���XÒ<�$6��m�=�-�q|����y= �>��t��B>�@�������ѼH�ؽ�)��f��<~]>���(����/�Tދ=��u���=`?�<�2���0�����nܽ����l����>D̜>y\�����vS)>��
���>�%X�:�
��b<>�J>3��;��9�p�|>��n�*�=�Sn�@�>���>���=8����L�9�P��_<at��-m>ũa�ӎ>"�6<(o�&���闽��˼@h>�r�v����&�t�j>Ʌ<�>^b=׌#>�Q��|�E>N��/w=���8�<ɥ>l�V<��<Cg����&>H�g=tXμ ��=W׉>��7���>�H;��}��(�V�B>�� ��7=�>
E�<ແ�R,>����h�v=���>;\��#e<>DÛ>k㜼�>$�<2�ؽOf�=�5�= 7ӽ�َ=�l ���=�j{�=d�Ƚ�D�>��s��+W>��S>�&���!7<�׶���F>��g��OY>[������=#餽��>C2���2m=�'k=�/�=`ْ=�}�>�*���Z<၇>9WH�x�3��R��&[�$_=?�I� O�J����E<yS�>�>u�>,T!>p��7D�;����Сf������=�n]>7:1�K��=8��=-¤=_�O>'�>�a ��D�x<�������[<���>� ���]�<e>�=h�=3�=�T>B��=��>5�i��{<>��"> �P>GX</�Y>�p;���߽�J��O��>Z��=���<��s>�7I=��3��"��fL>�8>�X�=�ZW>o6}=c�ӽ���=����o:=� ƽ�d=><�e� L>�b�$0�b�>�-Y>]���� =��x��+>��X��h�=��>�;�|��=��ɽ�����o�N">׈ �Ws`���~�K�>�R�<�"�=xh>7>�mS��}!�����,��>|:f�3]�;����g���N�>q%z�v�&=䲽۠���?>s>�=�07����'
V�Jǐ���H>�M�>��=G����$>I<7<�>Tp >r��=�� ��5-�%p�>���$_>�[�n->����AE>��}����=!*t�,����>���=쉼\�𽸣/�X�{�F^������Q��;I�����헼���=dm�$�>y�׼ƽ�>��>����+�{Ѓ<(\R=�^'���}>�l=�kݽ�
������Nߕ=7��=Y��>��>��=��e=�F>�mq;�3׼Q{<��Z�<(q� $0�!�l>��[$8��z,>�W<z a>�W��V�g�F>�S����Y=I��Z�X�mgX�W�'�_�G�#�J><_�=�_��I�a���6���0=h��>�U�;���u�=Ё_=)��=���=�J����)�S>F��<����7O>�n�D= �=!�>Ls�>߉��."�=�HS�x�9>T�>Y�>SՖ>�>�=D�ݺ�5S>�kw���3� >�u>+�k>E�u��Kw<��>י�=\=x��ɻ��#�WN/����=�[�����2�w>n����6C>:3�=ak������M>�J�>�9�U3����>��`�q;�;К���Jz��T���#��V>w�>(��<�?U����=��y�]
۽��?���Z���W>�3�<f�>X� ��[x����<)Pн��>�i�=��8>"W�VS�>fʗ>�G�=�n߽w-P���=�]��i��>��0>"�� S���<>2�/��Ä>C�ƽ^� �tw ��!��O>�RO���[=(R��`��=���>w: <V�{?�>MEO=�Q$�+l������%�l���>Q�>��s���W���4>��t=���=3
��~s�=�j =��>h�H���p>C >>r�{�c�*ּ�@�=����d���ě��1�S�r�s*N�8��S�I=�ip��;D�.O�RP>�粻��@��f �ʭ�={��=��N���M���&��{���!=A�=��SF=�=���<��>nP���5�>UQ��P]��>�=� >��$���5��H�={�6��pQ�[۫���j�v���8`�=0M�� ݽnR�>��t=�(!>����
Y �D�t=�V�=�d�=�H��s��=^$��o�N>f>/:��_;�7�P=]�{��*>9e�[��E>&�1�^�����=FJ ���m �g��=T�%>���=,=��7�9�5>H��< \�=�9���� ��e���v�=;��=�x��,�4>2,�=���=@� ��)��D|�;j���⟾ j�=V9���=]?��X�4;�37>镱�YV\�;S��v �W��<�16>���5����� =�� >�u�=A-�<��>�k�=�6���� ��
\>�� >��>�ê<��=ݔ�=A�q=P��=x/��u=W%�=���6x��rFH>es�<0x�=Ù�>Ug�=;�\=�m���;-;e��< ���)kJ>���=)�C;��>��k��n=�m�=-�0�R�;>y�=��?� `>i��=��"�7?ؽ���=�R���o> 냽�)>t� �Cv�<V��=�W�>4�=�L�=ǚ����>���S~>f#�6q˽(�^�����Fg=t�f�׋=bI��ʝ�:��8��yu��y���%�mj�>����g>+�;+�ʼ�t�;+=܊&>*>��>� �<I�.�J=]�I�9F��n����
=[$����>ֱ%=�Ow���> M����>>�!>��%>7�W��*�<<�񺶍ؽ ��0��'����3��A�=m�c��r���L�=�[�=1t�=)>�F@>��=��y=^ >$��������Z>vI>�v�=�`>�۽�>�O����<��u��=���|��=Z>��Ҽ�W>}�u>�@7>͚�<p�\���=� �=��$���-��@�=�̘>"���7L�ϴ�<m6P>6��>B��7L1=��R<�w=���+6���ܴ�7��ʵ ��2k�:>�=IN>�"���O�=j��> KF�oI�=�O �տ�>���0 �7��=�� �8�/>w,�UBx>�t�=Cr�=m�$>�oʽ� :=�iL>�,��c���h>�<�z�">���Ŭg><5�r�<����<o�P>�T��� >Q^>�R@�v��="A�>g� �qWH���==LI-=�r]���t>�>�=�<>-ꍾɹ��l�-���߻����1w�4��>eݼ>.�=e�t�A� >δ=–��#P>F^0=Y�?��P���B���3;#�G�`�>}s�#X4=g���T�=e>�f5=�ჾ�D���<����O����=g���=>a�">����6��=#E��^R�������=XM �G��k&Ľ�qk=��#=S)����">V���%�=/5�?������=%(K�$
�A�H�GnZ���D>7b���z�� s�ʐ
>��7�C��Zb��E�=�=[d�6tw��dk>,췾/솽P�>O���K{n�5m>qT� ��=Wo�='
���/= �ǽzx�>�����Ө: X#>�Ċ<� ���=3�O=�Eܽ`۰��|�xP��J�LI��C>.*�=������� |>�=�=֕��D��@\`<K��=��z>ط���<:���Z�U>��<+ >�I<���=>̙m�}:H�[D>��ս�a�k!�;,�<����Q >��7��W:����*匾������=�J���
�=Fxh>��A�������=�_=X�����=/9�����<����\L=%ʬ=<��=���� ���ߗ>�zC�)��|+�Dݠ=�Y�=��߽�2�>�=�4�>B�v��IU���ϼ�QQ��1��Kx=�"�>(v=tlD>Շ�;H[\�G4>��>�U�<�{ɽ݇��N�=zq���ʆ> 0�8�>��K> ��&�=�$��.�=�'�����<g=�[>��9=���=�)>� B>��u�<�ͽ7Վ�����\�:G_�����<�zy=���>�ͽ�)�<^��u��>�1��D�(� �=^̄�nq��cMK>��v:>�=���]<��>)�e���(>oR��Ĵ۽nѧ=۷_=p�>�1�=ec�ĺ>�����e`���ӽdM&�-���X��=R"��+=%+�=���>0��=���=tn�qH9F>Yȼ;�X����b�3S㽪+U=���^�F�XCF���;_~�=U >�(v���=��M]>�ǟ��:A>`� �MԽ0{�=�7o=�x>x�����>W��=O�Q�U|����a>Ƙ��wd�<�O�>e�>B�=�켟0l�,��>��E�*7�=�ƌ>�aX>J�$�_�̽�[����,>׏J>��A>3!6���=��=��}�,=<�≾� ����B�x��*.n��>���<r����:�J��=s��=/$���~��Q>�@(���"���Ὣ�/���Q�&���Z��lu=/
m�����+ �Ue�=���� >�VM>��,>(�=+(�>�4�=g/5>��=���=�W�<���=v �� �=`��=Q�U��!+�����MȽsk���� ��L=���<l�>���ġ-�����{�}>A��=o-B=K1�ӂ^�Ы���Z�s�e>U�A������6R>:H�=��V��O+>z
c�>�'�{2�P啾�G�]����,=�+�=|��=h�2��ڜ�s� >�kC�3�9���D=���>ҵD<6�.>e�Q���3>�P��V>�66��~���=�� ��Jm�ok\>�.>N0~�� ��˺���^F=�߅>^��>)���I%�u��<\�?�[F(���={�8�~`=��>C��8��wu7<�`��hm�=�O�=_.><dW���G=��:���>:L̽y�o=y��=�4��̽u����=O�>9�=�0��_���%���$�� Y�ZE��Q�<ӎ�<�L.>B�>��;���2�����E��=��P�َ^�w���n>�2z>P ����=�X =���$2<������J=Μ=Q����}�f�;��ѻ������.>U����"�=4��� X;,눾��Խ�O>��<KZ���t�=��>LP��@�}>{�!�!F���Z<ս�m��D!��6�R���8�P��_>4)�=y��սB񞾿r[���;�KM�=��=�·��n�1������g�=)->�'>��4�+P�8+ƽoX��گ+=�2 �o_,��}>�E�>}�q�2k1>�D���P�>Qʼs������1��}�T�����
�`>�ق=13�>���K���ER�>R��=�����:"��b���E~��>��fm�=���<���>傗��:�2�c>�ټ�*��œ>D���M0��{=款���<n�=p<���|x>����0 A>5���:�=�ڐ<�#8�=F=��l�E�8=�P6�5�r��`-�J�=
ڂ����>Xv��J�>�U�=�N�>��<�hǽ�;�>jqS�MA��=��dJ+=q'�{�'=�<uz:>��=�}� �н�>�'����=�>3�k>wO�<7�=�}�>{.��a>�'&<}�>&+但km�[iU=uv8�|`'>��<S>������P��y�P-E=�xN����>F =��X�Ӵ5>2>��;��~=���1�g�۲��I~���C�>�ɋ�ݛ�=��#����Ryv�"1>6FT�^s=
�����>���=k␾پ�>�i`;%�J���,��A>��3����N�н�^>>�{��/���⦽�9 >��½]k�bk>�
�B��,��;�RI�3�>!#Z�[I���F��ŏb���>��<v��-�>M��� =������ʻ0��k�&>F?c�}0B=aFƽ�a�Qau=J��<A'�>.��� �<蓌� 8>U�{��ڣ���(>���=��e�3��=�����:���>yB�;|���;��<Xy�ݚk�a>�*���;��?�mT>Mv2=��U>]����̀=������&>f���o�=5��IR���?������i�C�t>�4�]����>轼����CT�E�;>����v��=��%�5�"�T>�;��mϽ�=L��P:����;<�u�>z�E>"���M��>ڐ�0���fH+�!l�=�k =h�|>� �=�p/>@��<:Ͻ���<6� >��=I�*�i����!�BF>�>�/��{���8�F�'�^�����"�^�=����y8=��e� ���N�/���u*��dH���=�l伓�<�����x��kt��LH�>�D�I�E>��_=���=F? ��?(���V����=5�?�c���_���&��=���<�V >c�]>Z�=;Ž�=B6?=���aΊ���U>�ܮ� Zv>���;�e����>0 �����rh�=�`T��21������)�����5�Y���=���=l
���>; ��ʱ��*��05�=��=����Bv>l�=>�J;�e��%���?���!���mg>��<�b�„��w"�;�-�c �=���A�%�8���n>w�@>0����d�<\���$@��e4�轝=����bM>��n�=�򍾆��Jݛ=^ڼ�A���5c�=&�=)�P�T�>I����6>�9�;y/�=��9KF>��ս�_��m�O>�}�>��= $>�4��;��=t�P<ق����&>N2g�d�>��Q�� j>��!�4��<찳<��4>
>p>Ƚ��W�U��=D܆��9����Q��S$=��
�����E>W�>��&��%�������>�ȃ��b�<'.��Z�wk7��3�S�Y��+ �̷��u y�X��2�X�h��==l�<� >� ��R>g�
=\{��yJ�=���=��=�DϽQS==���=���=s���&)>��ܽ)=5C���kJ���=i�>�����k;�=�G@<��,����=����|=ֽr���!������K�>��>��t�&���C+��=�0>8x\=��E������;�T���و���>7�|<@�T�95�;I98>h~Z=�U� �P=��<xv����$=��V<�=��=�v���iV=���=d��X�һ��=L�R����>�ݓ�t��ʄ>�P�<Y�7>0Ŝ=�����=���� ���=�\$��T�[���k:>ݑ;>���Cl>���<c�W��p>��W=a�>��<Y�<���>�zl=��@�SR>]t=.�u����<���p��=T�۽���;���=-=�O�>�->0�=��� =C�S��#���\7>�=I>�z�={`�=8��f R>��S=GK�<��>�! ;��J�[���C.�=���<��=�f>���=�u�=񶚽z]a>�i�;��
�r��= W��:U<<��<��>�A�=%s}> ���c�>�ώ�=޽7��5&��̫=��=$�8������O>��ٽo�,>��=���JHJ=��U>Ǿ>=�>�z =�;��/ҟ>o�>R��>�ĥ=�ӻ����==�B>�����>G$�=򮻼r>���Փ=�f_>��>^���;&Q<q�}=A�5���<=�͹�ً���X��I=�@�=-�b>T��k��=�*c=�Ȩ�#�����`>"�����>��i�W�v�۪���<�;<p�>G�;=�V���k<>?%̼Xq4�=���;0o=-��='�>����}��ѮS��[R>=�>� ����>n;W>@�<��y��nV;�4�=@Q�>�a'=��Ͻ�_������5&�]¡>� �JT���A�=4?H<!l���2�m�$>��=>/\�� �漊R�=��Z=_��=w>���<�F>K�$>�Y���E=��8���y2����=G����G>OB������G��׀�N��=�y����=�&>|�>�q���~�=�VU�M`���@�>�>M0*��3>n�Y=դ9��& <b��<6Rd>�\�>и<@���L���k��=��);B8�=���=_6��7��� 7;>�<_n�=lDv����\���RPڽ�ʍ� L��u�<�|�S���>M�<uHƼ3|��Š��{�=gࣽrL6��w����0>K)�=q��<c�>��>���<��=~T���X���<��[�=y>́P�,J���GD���=!*�dؽ8��>;��>��=JӮ=�[�='+"=Xy�EU�=N�=�����u9>���<l$0��9�=�[*>-ҩ���&����<y禽&a��O��>4��<��b>��}��\>�O<�^$�f�="H<�!�=o��<��g>�[I>�j�=��Z@�����<.��>rv���>���=�q>���<'�����=�0>���<�E>o����N�>���=09i;@��=�,>(�1<<�ᯟ�����*�E�;��3�]�q=�R�<>�=~�h>y��=���gZ�;���La�<�L=��.=ۭ����=��<��=TO>�m�~#��{�����>��ͽ�c�=Z�> ����<o����q>�,\>̟�N*S>��h=����2�;=�����U>�����&>dC'���q>�>�Q=�gt>���5����V���>���=y��x%>]�k>�z�=��g>[�>d����\���ѽ�,=�p�>�����wE�R�E�6ᆾhK���k�����̎���XA�Wͼ{�#>[.=^�&>P�����ͽI L>L�+<���=��&=�콸ڵ���;��>X���~^u>��K>ʏ�=H�=�9���޽�+>��8�N��=�o^��1�� K����������)�6>�ʠ��ty>PP�=��͉��c�ud>m ��L>���<��� ���4�>�J�>��J�C�|��w<��d��Q;5k�����
�ߡ�<����^Z>��4�^��=^�O��>]Q�nm�>�HڽʒQ�'OS=�� =��޽EVo� 2=���<��e�� O>9D>`�=΁T���t>ǯ?�x~�������$ �c>K�%��+X>��ɽ�� >׹�Q��S��>��)�/�X>���;�8��a����>�X�~��d��>8t>�g����=)��B3�=�=��>�ļ�t�=���Zh=�6�>‚�q�<��K=C�%>�u��u�����6�������)=r5�=ŸS����=(0�=8.>쬣<�t�����<Q=�=������y�@!������y��;������H&��3X�=?(�<co%�WH�e:6>E���o�@>o >`O������C�5��ւ� ��=�V��s)= ��=W�����j=M����q<�\/���Ǽ��^>F�l>[G/�{.����#��Z��:��������3��o>��5���=O�F<�Ľb�߽�22>Hh���۽���Y#�=x潨��n[׽8� >K�Ͻ.<#<��]�n���AP�wbg=uL;���ە>5H\�Δ��6����G�����=�����>S���~[=uޗ>T��"i�>t'�>�ٽ�I>|Χ�Y5'>�N�<4~�}��<���=�nM�)%l��΋=��'>G�S�;��>nS=���)��=51�<����"ɽ�n��< w=� ������<���;F�>�j�c�����=�es�DH=٬T=�U.��Y�=���>~��5:����X>����}2�px�=攽�W��\rA>6�9<���=2z+>S|*��d��Z!=>�uϼ�.�=[�> �:>*����L���� >DP<ދ=t�K>��:��ɚ>�X�;��>���܏>rQP>(�v=����k\��n��=�����>f�����<᜽�+>�s>o"<3���T�V<�}=��l��3S����=���=�O>�$=�G��b�̼�p8>��Y���w=��=<{���sX>-B=��y��+����>w����Ε��ވ=���ӧ���s����=5J��<�Y>��>����~D>������$o�=��= C�����=�?>gJ���/�������e���v���>�r ��Ͻb��_]< ��<�?(>��c�H,3=v��=��=90��s�=�d�>6�<��=�Q�=Ҵj����<JzD�:T�� ����<F�:>!�D=��=w��<��?���o=�V���'V�'����^Q<���t� ��¬��Kɽ�~� +=���=�CO>��=�">H�R�}%4��E���a@�p�&��������=�����˼H��Y��=_�=�=>��R�@sT>5�)���1>׊�=�����3������Hf>>�)h>#-�и6>��Լp��=��)���1�C"���[>�{�=�}>�ݸ=�)1=Qt�r=�Rx>S�0=�U��L��=��{�Z�>�L>���=���˱��x�{=J =vR�=db=��y�mQ��i�3�%��-�x]/>���<z�=�~��O���զ���K�n�C=�<ӽ�=�=Ex���,&>�"�>�hs�3� >F�>݆�>�O�>��E�C&>'୽6��>���>��Y��0~���?>`t��d���s>�?�Z.�=벼�M�V*ͼj)V>�Ƽa���ܵ0>�z�>�A���n����P���=�ֽ�5���풾�����B<2"�=�����_>��Խ`-�=���=W��=�t�=碼9M˽-ϴ<(��=l]>,�>�:.+�:�=��/������uF��K4��5*���={�=*�3>jj�o="E >pR�um�(�Q� ko=���`5s�A]D�x!��:=�]�m�R=�:�<��>y����6>�2>Oz�ON'>��o��-������|�ʼ��=�+��Z[>P >�|�=�����9�/�S���=-=[�A��>M"/>��=x�=�y�=����'�>Np��ﵼ�A����h���u=���;�s'>N<��u�Q>�(=t$�=�t�����=a>b=�<��t�E��>�3�=JW =8e#>����7Y� ̽
���N�Q<�n)��uh>������/�9=ɚ�!��=��%���>TN�=I���J=]N��@h�=a�x>��=r6`����x=���n�8>5S�<Z?=>✟�tG�=|:���=\X�;��q> >o��<��v����ݕ�>N�ӽM>Yߚ��J�=pf>V�'� ӿ����L,>�|+���c=:�=.A�=���=��� �#�!��>��J����m='���1ٮ>RӅ�s'W���g��j�D��<����!��=8 ѽ��y�;��<e'ڽEeB=���P��=���������>��=xݱ>�>�7�=/�>��� :?>k��=�� >�»2Vl���/�� M>���!�>�+ܽ�W�Cw��l���<���&A>�V����-�l"�;�4�>5;���8>aKQ�Z߈>�a=�L�=�Ls�����_;>�H�<�c>�>"��=��\>
/����&>��=�[>s^0=��þ�K>O�Y��v(��ؽ�k>.t��Ǿ�uԔ�s.>����,����=�9��] ���@�<5;{Gнe��4Y�='��=s�輩����'�;6�A>���=m� ��5g���$�H>��K�t��>�ᚾo2B>��Ľ�"�����rƼ�U:��>Ԅh>m�,<T�B��pn���">U�p�Ҳ��V��<->N�M,�=b��=�}= �X=�s<�^(=�s���Xٻ%=Z�>�RL>
���4{�=&���s�� ;�>�ZT��;���B�����˵۽�
>�6�>|3�<c?�>Z�}=���<�*��<>,>9� =B�>b�>�ܘ>��ѽ�4�Ǭּ�c(��Ց=)��=��6>8�r=�4.��֍�W!�” �Dbi>�v�0��;Xu<�>,�ӽKYx>0� �G 2��ɹ�+/����e=����|���H=.�f�gV=�B�=]�=�U�[
�͡>x� ��5 �6��=�m��ip=9���z� >b�5K����>ܨ�<�u�����=p�.>�*�=]\�<�t(=>�=>��B�Ƴ^���>/��=���[ݽo l��k̽��^���>H��B[��dƒ��ػ�%~�>=r� >�` ��=_z>s�=ZB =E(�=�8�����=N��=>>=�jj����=؂`>��8�?�=�å=����Oc?>5�=DU�<'�����=~0�=�;�=�Z?>���=a0>�R��:�=\��c<��Ce�:�v���8,>�N{>�nC��? >CI#>Hf=";�<CϪ=W�����>Q3<�S),����c[��wH��|�=6���y}�te�>⢾"�(��e�.���6½�R*� ˆ�b.�����= y�>..�>݂�<!'�<�Γ>p�����b=叿=�D�=R�]=R���+;��7>8�K�h�l�V^��%�½��*� �'L�>�>�)��=����T�=�o�=���<�п=YT�ܰ�<��C�� ��?>>��<7��;g�*���=���=3�>k3>,i=� �=/�4�dw�<�T> 0�����<�\>󝲽�
y<.��W�/>�eZ<��,>�ӻ=i >��d��找?���OA۽ςY>@���yt=����"9>e�e>j3�=��=�y�f�<+`��H!=�r����B<����2�>�g�>9"u>�[M�n�(>F�i�.����|�=�T����F��O�>�7=a�=��=*�)>�%9�ю'>��n=q �<���>�f=D 9��.�=|�=��Ƽۆ�=���=�
pM��Ҟ>�����̼�>H�ō��=�D�=T+=- ��W���7>�T�o#齚S8>�3�ڑ�JJ��h�=����EV��ւ�/3=�%>�u�=�N�����<�>@��=�s����a�ic�4}��>��Z>���k�=RM����=�x �kOO=#�d�@���!>��>3�V=����v��>4� >�$�>;|�=!n>͸�=?��=��:�[k�>�����X=d�F>��>�1>��A:z�=�.o���ļA4���+<Ŗ�=�+��l��<�0>BV�>'���i���2Q>n�c�}�=',{��U7=ox=������>�;}v�=biA�<%J>ea���ȼg�˶p>���=@3�����B�=���<��L��^���F>;F�=�Q:���<G�B��y=ΪX�9��=@�@>��6>��V>�c>;�>���>�l�>��`��4�+�-
a�-Z�< 3="x�=� �>�����1�|1A>��>�x��E�>��E=j���#��==Z��K��7>��u=[�!�J,>�׮���&>J@t>_t�>���=s%����=G�=4f�o�}>R-P>�v����\��|>/�6>4���f>-x>3�=�9N�����b�=�t�¤��0f>�ý�7>�� �]��j�=μ >��Ͻ��:�"��=f�;��$�*+�=p�N>�y��!�P��zǒ=���>�/ >L��<�~)>Q�E�o�罁�=G� >��y�u5=n��������P ��^ֽ~֙�~�>�2=j�C>��!>;<S= ̃>��B>��d>�2�͛�=:�r�~y���p>خ�=;`\=a�Q�{�;>�� �cL罇N��b��Eyz<<0����=�7,�`Rn>ӝ��й���_=�Z/��࠾i䛾3�}��`">��[�<�\ �
�<��n<Rǿ�A�
>V���'O��^�����=+{�Rq伛2G�B �J��=��>+�սd�y�����yd��f�ؼ��н���$�=��>���~�����=�J��lkU��� ���P�b>J,�=�gX�, 8��^@=5�k=iJJ>b�ѻ�Hռ��q�;j���o���͑ �
$ �|d� ��=*>H�ѽC�X>���=[m>>�%��k�<b�>û�a�
>���=��y����=D��=M�=j>�V�zhB��l����>��O�ʯi�|=_� ����=1e>� g��8���%�#��=Œ�=�3�=2q>D���wv>����I��=�|��ѽ7>(�Y3���iؽ���>Q�,�2��=[絻p�=~��=h;����0���V����aْ:\��� z1>Q9V�I5�)����4H���F=��=�5>�k<��Z>����#(=Ȥ�����J��0�o>��<�v�:��h=�&����ӽ��)�� ����\=��g�q;l���1�� >Sϯ�>&Ѽ χ=a��=���5�\>:J>����6w�B�=�:>):�<A�O���=q���`'�����󅦽2R|������t����;��ZH=�vԻ�`�p k�Wa�̀½͙��'�V�>_��� ����%�== �����+�t=������6E��1Vp��O�b�(�߮m>%�����=���>� �D�z>�� >����V>$��*�A�8��<b�'=�?��B��=�6->�
>�р>��&�~ƽ-�=����:>PC>Y�;>|� >,{���+>�b���Zܻ7g�Ţ�����hU=n�>?���}B)>�k�=Ƚ����o��"*=�E�<�)?��Q����+>y\>U>�A�W ��IE�(�I�]��� =h>���=��N=C5�=��?�*->�&u�`��=�[콀x]���=�^>̢����н������n�����0&�GV�=%)b=�����ͽ� ��i[�%G>w�
�� ���Eн >�刾�q�<��a>cxp�X%9=��->
�>4��=��>��=>�W�ʛ�>C�>h7j�5�=�R>��>�r/>󧢽�{�=jH>J?��ߑN>6�<=<b
=5�E=���=1�=��:�w4�=Ӡ��1���vZ�ج+��$�=�9 >/��=�3��W >-�=M-<'�{�}߽(�!���>�]v=%|a��j��S/�<ѡ��P���<Gp����>9�N>�E=���3�<A܅=|s��gv>}B>>��$>�>�=��:�7�=Xqh�(�?> F2�����Se`�z���t����l������v��$�r���=;�)>�\A>yF��^V��}���>�=��`=�s��YK��W>��>9�>0"�>��a<u΄><���>�_�<cJX�D��=�`�<@>;ͽ<5M=~��= k�>`�/>�h$��f�=v<��A���IH.�Y�w=��罢���:> <���=���=%���w��>���=�Y>f��=m3�����vô=�I:>л�=�b����\g�>c�=�dʽ׀�=.e;>�6�=k����>�ϽfT=���<7��7u`���2=?����A��L�<��5���ͽ��>��=e�,�4X�;�r5����B����T�=7m���e<����4�=� `<\'���.�=� =�!��1T���l��0�$>e@Ͻ4e���q>�0���>�*�>D��� �6= 0=3v���9����>z�=�qƼ~g�=2�'>�ٜ�g������!>�5N��c��Gm=Q��RO�<�h->[�=TW`��X)<�E<��U=��;>�P
�ւ�>~���0-���r=���l>��d�’Z����>.�6>𵓾�v�<����wF�=KJ�=�����=���g��Ɯ���o���>݆0���+� ��;t����<�=�i��=��=u� ��tB���=��a>\!��嫾�� � �B�J�=���=���(�N>+� �=�W�����6>��p<�m:��Y��qC=�6i�P���=3���=�� >Y�>*�����E�S���;�Ǭ��W��=e��=n1��Q>i�z>�>{�rO��6�;|c<�� �bh4>��#�A?q=&>�r�Uoy=�s6=K�t>�?���/m�6 ˽��ɼ�v�=�'�Ƞ��T|��=f>�����>j��DHR�r��P >���>�b><&c��}�Bn����<��E�=!�=��q>�q>=�����N=�w�=�F��K��<�fy=���=Q��=�㐾K����� �D%F�����������=��>�ܕ>�6��!�R������7�=�p�����z���?n>�����y�A��=���=�]����Ƴ>�e�=�
=pڙ��E��(r����>����%B�9
L>��[<�W:���=�u<YO �ע�<c�>7mG9�ԋ�#�=>�b��n�C�i�>"�`>����G����<��]W�9�>�%]�^�ɽ`2#>Օ��a��\���-�=�pb>�*��L��<�=�>�m�4�
v�=����E>ꨁ�Jg�<�jC=?e�=et�=���� ���J�<��X�����X��� ����=�#�-A]>������F\;m�O>���<�%��z���98ѻ1ֽH+�����x���qt�< ���h�n?��T�=O�%���ʽn�>GӜ>� A���ٽ�䲽5�|>s�Q� ���a���@G�Vj����<�OʽLq�<����e#>H^��9}2�?�;$3(����>�E��w,#�� �J�����W[�=����T�Q>�潕Š��P�=� 2���>*|��8P>��B�d_���_�;w4J�、�G���oɽ)��=�:M=��#>m}����=���GN=�h����Q<��>����⵾���=�h1��ݫ=nBA�̵���
>h��>쨏���e>R�;� >5q����<>�jj�*����=k�!>$�������%l>�5;���f��=��<�,ှ|�"�>��>��0�D%�6ON=8�</󂻃�0�����c�ڽKn�=���=�v�������'��2��;����o�=�D<�P1�~�ż �)>T$T>P������C�3>;��� ��[ >6�=��>D�K�$�m>��@��*=�[�e��u�=��b>��=}��E�:>i�C���=u콸��<5����>M�=�q��G�!>�^�=gv���|>L��=�_�w�7����;�|���ͥ>�*z=����0��=U���[�"=c!�=|j="r;5�ּ�R�]�j>6�j��\ =˴�=������<'�>���7 W=��I>޳�>d�=��=���>�V >r׊Q>]�d�S�2>,SN>A��8܈�=r������ރ=��?�>���^�=ȸ==�'{>aS���V�>��I>��%>`{w>kg2����ee��'���;%��>�
��$=d�8�C=0�
>�̋=�N�( 2�/"a=�!<�[��M2=��=I��=��~>A Խ���=6늽��2�`��>-ԁ>�������̉��*�?%]<��o���ͼ7��=�>�]<C��9��W=��1;�J�q]��!�Ѽ�C>�>��v���0=����Gi>�8>B�<��<>=/���!��� �U4�B=6w�>m�m� �����">7�H>j��=�h��/$>�=j�l>ף��k��)�>� �ب(>� ��b��=�==\
V<2��<F={��<~=��*=@`<� ���
=+�=�҅�/{9=4n�<UA=��g<x��< ��<g=TtU����Ǒ<Oq=� ��9��<�2���(�<�S�;(�7=;w���!��b4�<z3=I��<����my<jf/=#TJ=�Q);/�i<���<q��<������0<u�Z�Ȉ=b,9��!<Ս�<[��<pP���z�<6;;��Q=�sB<=��;��w;fw:$~�<X}�<I�x;k.=�=�<�=ɯ�<d�\=�H_<j�<��:<'׬����;�!;;}��<Z.:ˋ�;��<˴8=�9=w��;ڿ=��;b������<��u<`$������M9<9���a��;$� �~-= �O<��[�h�߻��L=�H�;!�<䮮<=f�<�}8=`����i�6�U<�ȩ9��-<u���q�w!F=4O�<�[��0���dI=ar�<GS��p�<P��<�(��]ϼm}'="��;HT0;2��<�==��<���;���<����oI�<��<������\�s>r�I�-.G>��A;� >�]A�Fj5=�5�6�&��j��� 3;��������<W��<���=5������y���~=���< H�-�> B�;��� )�
6�=�4�<�� =�����=~<�NػX��<zo=���+�L=e��K�%;?L$=�kp=��=*�d��7��맮<}mxp�|k=��H��=�PM>)m�=��?������D>U�����.�[���4�=��#<��=�<SNo�́=0Tr=`B<�Í��N�= ���
�=/+��0=�v>>`��=Fe@=���=������ׁq�sU>�R��;=�q�=�_�=��<�gѽ�e��%���h�=��W= >����x���r�<s��=eJ��ޥ����=#���^I�l� =lƸ�꺽/�-��������:�7��8������;N_�=5 ��H�=�\���q���v��?�ڽ&����q�@�*>f�">�i�=�JQ�9�=�r(���D�殔=�P�=�M̽�u#��lҽ?�ɽ�S_>�k�= ��gՆ���P�nV�=“ټ�� >�S��'>$��=�S>�)|�WQ�<��=#����$�|$�=vA5>���=L$> �{���2�S'Ѽw�>$y<����H�<��;��l_>L�������'�zgw� �t<�� ������=�=���=N$�<�#�<�:���S���t4>�vv���4=��ݕ=�^�=�>���vv=��?>�&�5��",�)e���1B�K_=��= X��K >��F��n�=���<�q�<�*<�Dּ���<
7��@�����.>��Q=���<,?M�P��=��<�d=kX%� �>�?�=e% ��&��30�=��<hh��{½{-j�^��;��Ƚ����9� �a馽��e>��=|�ټ'n�=����P��v���� (>S"�<YS=��=�s��h��<D5-���=:����>�1Q�y��=Y���(����<]́<��ƼF!>1g����=v�ѽ�6j= ����<���=z �=�_�=���:����Gu>=�hü���=o������2���"�G���,��I��$����}@>ϲ�=7���7R�c�0>�_���<�.{:�F���}�W;���h���=-X����
���}=�5�=h[����o=H��V
�=�>�>y��#�!�N=4��T�@��;�����=Ծ�=碅<��<8�?=3�нA���aB>�3��6>��=9�ǽ�&�=�k/�FI��O�<���=�/��f����ڼ��n�}4��u��]����K�<�JA=�=��=52����=?���q)��լ��:=hs�������~@�n�=��i=�d̽��R=�?d>�-�=� �=7��=+�;���M��E������=+t�=`�y=U��=�>��=��=�'��oF�-\>I8�:�~��ɞ=;J��,��<ID�=�
m�KC5�x�==� �=��񻐪��?ĽU����ː=�����=_A_�=�$<�ͽ- �=CVB�>�*>�5r�3���[���9>h�O=���<.�����8=^Ѽ��=��zW-��U��>�Ϣ=Fܸ�gr���Sq=* >��a�ŏ�=�+�� �>$�<yޅ;}O��D@=a�=W ��2�]K>T#>H�Ͻ��(>�!D>���=�P��e>]ӽt�>� �1�<wk�=|�->+��=Pf��-���o�+>>X���\K=��û#��=�"�=C�$�uXƽm��=�0�<T�S<��\=��<����٫�<`=ٕ+����=D���������<�� >3�����0�,�=�J1>��x���;>�m =O��=�� <7�ֽ-ɼM5�<��B����|";ߖ�=�'�t� <(�A=�D7<k�>��ɼ�TB��M�=�y>�_�<�$b��t�;���=���!֦<^}��N���N��|��=mC�=�n�<���<CN�'��=(��P��=`=�3w<��.�����x��=#T�qڏ<�ȝ���Ͻ$���٩����Լ�MȽ���� >����V��=I(�����<��Ƚ��=��`;>ٽ��a�J�
=]ڼ�[�=���&�)�n����0�<>L�=��F=)Ֆ=Y�=3Z>zm��?����F��M�1U_=ӯF��y�=��>����?�<7�e�?~p=*�i4:��gF<<��.^���a���Q)���<���=x|=6:�����;�M���y�=T����m������_ =�t=J����ֽvm=�"�<��*=��"=&v�=�������(,��>��o�<�w�=�E����h�BM�<0��� 2�=����=s.�D~^=1D2<�<y�FI�<�tc�J�=���� �=����'݂= �I��ҩ�v����<� w���|�<�>����P�=�����:�SҽS>{�GO�6BE=��q=�h�R�ܻh��=�����=}{<�j =���<qJ">���=wO����=F-b=M�}=��ּ���<�ks=a�<��>Q��� �y���>�Hy��C�=`>v��AO��@��?�=��U�d�5=z=�F�ܷ�i�>�4<��I�D����H9>���<F"%;���<�[x��Q8����=�� >���=7��4��������1=(9'�f ��2>�â;��="6�4��{�>���=S�;�X1>Њ*��e�<��&=d�=��;>Rs�
"��O�Ƽ%8=a�l=.�>T3�=�
=>�=����x�=�v�=�.�=�K��|U�=��r=\o��f�� ~����<Dc�|����<�= Y��L���G�=���<�B��.8v=cVg��1�=h�F��x�=Tx�=
g3��>>I��]�K���v=�W��/�_>|��<^��|8(=�m�;>�Cͻ��=�V����(�h��M���T =���=��=���<Ӱ0>H<�r�<��=���n'���6�U >�v= V�<ʿ�=�[3>�Z�=`:���B���gY=~�n�l*J=�W�<���;7���瞚:���=R�>XU]>�偼���<C�=��ֽ�f���� >��@>�l�=$�
�ƫ=����L��g�>e�ƽ�N����=�kҽx�<錙=]>�������= �=O:=��->�"�� ��=<>��=�D��ό�?*[= +v���\=6�="��=f5��L{�= w
��H��9��=������<�A���c��M�?=e�=�K�=M�»[ �=�*��DZg�$��=�D�c�=l�p��&��T >��>�)</Rƽ�K�=�
R�Q��=�j
> n=��d;�˧<��Ͻ�X��c�K<�2=�2�=��(�[F=W�ݽ� ̼��н�G�;��,����L>4+;�R���=��f<�u�����71�^��48k�񯬽Z�L=l�߽;ط����=6��=�a�;��=�v�<�e>���=z�ռ;���r����~Y��;���%���z=��.>��<[l>���=����_>sey=�ng���@=ቅ<���;��ν�-.����<�H=>֪�=Nԁ������=��=��I=D|��I5!<�ב=�K=���=e���:Լ�iq��̡=7����J�����ܽ�@�=!#��FA��d�=�_��6mf=��=��VH>%q�=$��=�����A�=�g;Ƭ����=��������}ܼ�$�<�d=�0�� Ҽ����<
 ���;�������"�<�D�=��C�H<(�<f-����&�#'��d�ƽ�;�Ƿ��9>�k:��ɏ=_�=����:���8<�=j���3�����*�<d�I�B�ǽJ�=V�=% � �<�j���䞻 �߼ �=��>�(ٽ�&6=���'�=�.��D��� �=�� >��&� �<���=jR��[�=ֈ��N�>0� ���=oCC�7�;�W7��s>�W���^m��@j#�w�0<5H��2垽*u�=��=8�� ~a=΃������+/<7X��r�A��=�<>;ݜ�Yl�/�μl�<!E�UM�IO=\< >i��;��*�}�=32>}A�c/��_ �dO���}��t"���7=1�o�me=>Ր��h=�󊽮u�=��
>Iv{���K�#yv=��%>���R_>� %>y41=s�,=�k�<r��=앢���=�D>@W>L�'>�/�< �"=�x>���=�c=д�;����� >K��=D���O򠽹<�<���=9M�=D <
�>ɟF=�I=�C�<��ǽ���<`�7:�d=� �=|iS�f&�c>�s�,�μ�ڽ),��)<�F=эǽ˹�8��8"u=��p=���=F>L�X>�K�=���=*�9>W<^��d#����=n� =���<R=�x�=#Q]��[Q�0�
=�-a�7 ����=�eн,�E=6��h/��(˾��Xý�2����Q9��\=.�=�ӺN��<����_j�=uh =d�����$>��=�Gս+�<#��;�d�<�A��e��<��{�O�Y���>3؇���<W%<�1|��C9��S�=�� ��#�=�w>|$!�ԍ�=�S=I�V���>Pn>��Y�)����;=QdϽ-���W=�<���\<A$ݽ�G�����=�7�=�>�9=�2O;� >� ��&��=�?�<h=d�ŽՀ=�4������@ɺP�='S;��n�"5K<
��=�y>�k>7���m=W�8>Ln�=Tͽ�{>�"����/=g�*>���=�KW=� >�y =�O�=���*C��� ==(��=�\������B�>M�\����= 7��V�H;B#�ۭF��`S=��=����,G;�t�=�:R<��S��j#���H�>��=�命;%r=��L�M����=��z�J�>^���GR���x�e�����#��ٳ���0���x���]d*<� ߼�<�>��=oƽ1򚽨7\��9�����<�����)>��
���&�Hy>� I�ʄ�=
cɽ=螽���=ܞ��#�Ƚ�D�<I?�=���z������=Y�-=�E���f=-�=m+e�m3H��ڢ��=���=���=�s�=�:i=$:���-����ݽ��=�2�<W=�A>�T�<I����ye����=�C<S��=�t>�n">,�N=��*��M��N��=
)�=�-=)��=��8��<ڽZ�=��>s.y=�����H=j/�<�I���=h=�>�,�=��$>��=�������@ͼ�y� ����=s ӽ��㽊�8�}���}�)=6��=�( ��&=]=ڽ._r����=k��=?!��>A�;���=������=zVF����鿠���̽�&,<5ٛ= 7X�Ȉ�<��=g4�<�X=�"�R98<��$>E���<!+�n=3>��W��A�q �=7�H�(�<iH�����<uS���Dt=�j�������]Sv<�����=a78��=dt�� �=�̝���N�3?=��<��A��H#>����Ѽ��=��(�����Ä�����Cz|��d=5>����Z��<�dw=��v���=���=-�����<�N���>�=!���F�=V&�<!��=G.>�y6�4��<�Y�=4���P�<��G��ߨ�b�?>�k ��6��ұ�b�= ��<w�=7g�<PN�=��>��I=�B��Cd#��c*�<:� >�]B���(;7�"��=e>y ��Z:= ����X���:���=Z����{ҽn��}�:=���=G�e�)q�=U2�=��c�5�6=���� �>~~��V�ǽ�퟽�5>�-==�<�=�-=kO�=m��=z+�=,�1>/*Ža����=r���BXºg�=D����u=f6>F���[� ���޽�8��ʗ߼o<�h�=(K�=�ʽ���=r-�=������=�p缵��=�>p=Se�\���F�L=5��<U�;"9�� O�=�B���
���<�ph>�� ��ɔ��u=Y[b��a��'0��-F>Z{ۻJx�=�e��V�;+����[;PA��F;`1�=��>��Ҽ^%>��3>.�l�����='�F>o�?��+�x_�ǔ���;n����=e�J=�����⳽�O =��Q=;�.���ȼ^g���� #=V��\3�<���=��e���K�W��<���������=!A�tK�=� �=I��'�=�_]=����A��b� < ����ڼ"2�����.����q�=SG>��=�GU=-s��l��ϐ���K<��m=�|��+���i��e;�=P�꼘��=��Y=#����bB >]P�=�1��3��w����6�<*5��s��=���<g���α�L4���˼������轭ф�Q������Is�dD���@۽�l�<��ü�(8�N�=�uu�U^��M<<�^��z����<�=�۱��51�Lɻ�6��< 4�<��>$�%<�OC=�/b<f�5�1,����>� ��3&�`��<�2���󽟻�<K��=gG�= ����c-��;u3�=/�d=3���u<=1�=&�7=��b��ҽ����/�h\����=b2�<��5:V@�=!�,�c�E>��|�c:;`h=�N�<X&�=�n-=$�h���"�Jxؼ�-%:��\���#>g�����=� >����"=��!�4v���E>�h�hs/����=�
�=KK�����=�Ȃ=�U�=F�t>|] �PLp<>"�^*<g[C=k~��L� >��F>�;�7L.���U</l>���<�Q�=�L<=��޽��=�W4>�(1>���=��=Yr6��K;�j�=8��-g����= �ѽ�#��>3"�3����=�?>�5�<G�����=ck`�p�2>ҍ�=H���t��;*��<��r>��=���=Y�o=����N%�2q+��wO�tl>���=�M=O��ؖ�����;��1������<��D��p (=�3����m>����Ɍ�W+��3�cn�=o��<`�[=L�ͻ�C��fF�<]��s�u=h�<8�=�}�<������>�L��Q'(=�u�#g�yy=��>E
�=�1�=:��=f�=(� ;[��=�W����;�<_m��Ӛ�^=������n<�n � �A=�=9����?���>��>�E6>њ=Ȼ$�Y��=��<�=I>�>mj�Ljk= �ͼή$=�� >��j���E7<���<�#�=c�=^EϽ"?'���=� ���"�=&���H��� ɽy�
>F�������
�5A�;��λ�<�r(��H >�?��Im=eF׼�a ���N�b�Ƽd3��P����y��h*��f: �7<�ϵ����`[k�(K=a >���|N���M��[���q�K��;A����=�'=)�<E�6�9��=Z�<-ݯ<��=.� 퓽�m�� �����>��'=�N����<�X�<�<ɽ�Fs��I�=�'�0��=i�K=�����i���E<�m(> X��4ɂ�AG>'�8�$�����;Ǒ���,>Y���72�=�1T�xS
������ �<���x�5���>s�>�f:B�E�kҘ<�=ӗ�<h�E�ڬ�=�4�B�: n�=k��=��=��<� ��=z�=�l=��F�T!J�! =� �(w���r��j�^Q�=�3�HO8�E�>��=?�����>/��;칄��u�-�3������[�;Y���FY<�%>��
=B,|�d��=ڂ=����p<>jP�=��M=�-��ߏ=���*Z=�I�<P��ҧ%�n;'��<ŗ�'">iڼ=)��=��-=$����z#�е�=��K��B>4F̽���%�]=L�����=OS->;���˟C=�.�/��=�V�;��=�M<u��=g���0 >�1��1g ���=�1����:(�R���/����=�� >�%�=��ĽR� > �н��
> ���?��<�&>V>m=���=jHL����^��F>�*s�?!�;kV����j���<���;�c>_'���\B<y��<]�=�����>�����M� 7�<5�"��g)����=l��=�1'=�;1=�x=��x=���=�*v�Y���+�=��ֽ�G�;��ڼ�ά��(�;dG�=�+̽�'0�i��<���=�O �;�(��X=B�2�;C>a�}������,�=1�*��ԣ<�.n��`"���8��O�=���4./>Φ���I�s�-����=�qy��N>�͹���m��7f���k*>sQ(=�� >���xzK� �<Þ��� 0���߻�i�=C�)>��%�/=�:㽘A'>ȯz=!�<�֤�Ꮆ=�G�����=��B>����-s!��s�<����^$�� >���=;䪽��>��R,=��L>m����>��Y�qNƼW1�=)M��T���x=�!O<ٞ�=��)=���!1�Twb=��>�o�=4<�<`��;�=��&�������!�#�=N@��v���Fq�<]ƽ����[ӽ_&��{PC���ڽ�c3����=�?>��>G���)��okV=�®=I�ҽ8�@=~M!��o�=a��=�J�E͙<b >1��=9��<0�<[ļ�0]����=)���'���U� ���==眼Y)$>o=������ ��=T+�< �d;�� >�G�=�h��U��<�R�=m�k=���Yg�<�fϽ ���À� ��:��=fW�=Q؆=!q��z�3��yZ=�Pa=�[%�r�:>�%�<�����jC=T��=���>|9+�/=��Ľ<�0 ��)�;�?Լ� 7��E���S�=�2 =;b�=oa�<���<\^=����|;>gz><�W>~9�=t���w�d�6̌<6�Q����=s�����=��M���=bzw</V��Ρ"���(>�Ƽ� !>3O����=A����/���"����U�������Mb<�sQ�J\=�6>?|���������LX�mE�=D�=��X=7��)�.�M�q������˼3���3>P=���84e>d�ֽ!g�=�S<�M=6� ����ң���ی�]N��Q]���7��� =$�<A">�ZмnӶ�s�=��>=(�=G���� �=-+�=�#w��抽4:�=��<ʽ��=&x�����<u��<���<z�=��˽,>�Tr;Y;>t�<����怒�����%>nA/�1��Bժ���ټ<�=��������y�3����ȼj3q��=>*�<!���滽Ð�=�=�_������#+=[�x���^=����'<m�E=eK�=��ý�h<IDd=�Ȩ��)���ʽ��V�m�=�i;���ȃ<��S=����P�<g�~�U-=��B�ٙ�=T����n��Bq=�q��ሽf�p�97=<c��<>��;�cs<˿��T�-�*UϼU��>N\� >Ũ:<<�)>śV�<i��X�=r�=� �Z;ʽ5|�=w���󭽎�>��=�}#>}��=0d�=��<'F����>�0�;c���$�=e6�=�h�Mֽ�G���wҼ�n;����w½��ν &><��:=v�.�I[<�=�=�C����=���'>��=��5D=�Nm<��ż��^<�r}=kن<��
>����,����: ���,���kW=6*���F<��=˂���B>����W�;�_��Y�=�YD��;�=