Hardcoded Neural Network does not work as expected
-
Hi everyone,
I'm currently building a plugin with a distortion neural network inside.
I used Tensorflow, and added my model in the same way as in the example snippet:
const var tf = Engine.createNeuralNetwork("ExampleNetwork");; const var weights_tf = pythonRoot.getChildFile("model_tf.json").loadAsObject(); tf.loadTensorFlowModel(weights_tf);
then I load it in Scriptnode into the Math.neural node, export it as dll, and use it as a Hardcoded Master FX. Everything works fine in HISE.
However, as soon as I export my plugin, and load it into my DAW, the plugin is not recognized.
If I remove the script (see above), and export again, the plugin loads up, but the neural network sounds like it's bypassed (it's hardcoded, so it's weird). This way it acts the same way inside HISE as well (bypassed).
Then I added the code above again, it works well in HISE, but the plugin is not recognized again when it is exported.What can be the problem here? Is there something I am missing?
Thanks!
Gábor -
Oh, and I did the same with the Example Neural Network snippet, and I had the same issue there as well.
-
@Gabor-K So this thing here doesn't work when you compile it as plugin?
https://docs.hise.dev/tutorials/scriptnode/index.html#neural-network-sine-generator
Have you set HISE_INCLUDE_RT_NEURAL=1 in your plugin export? Might be possible that I've deactivated it by default.
-
@Christoph-Hart
I've added this to the extra definitions, but it's still the same. -
@Christoph-Hart
I could not solve the problem yet, but I have more details.When I run the plugin in debug mode, I get this error message:
I tried the same with the example project (NeuralNetworkExample):
- add script to create neural network, load the model layout weights (in this case model_tf.json), and load Tensorflow model
- add the model into a ScriptNode FX in math.neural
- export file to DLL and load it as a Hardcoded Master FX
- export plugin
I got the same error message as above. The JSON files pass JSON Validation, and the models work properly inside HISE, they are sounding in the way as expected.
Do you have any ideas on which direction should I move forward?
Your help would be greatly appreciated. -
@Christoph-Hart
Here's an update about the actual status.The JSON exception issue disappeared after I put all the file content into the script as an object. Now the plugin always opens, and the "plugin is not recognized" issue disappeared. Yay!
However, the neural stuff I am using still acts as bypassed in the exported plugin. In HISE it works properly, in the exported plugin it doesn't.
HISE_INCLUDE_RT_NEURAL=1 is used during the export as well.
Any tips for possible next steps?
Is there anyone who is facing the same issue, or who has a working setup with the same settings? -
@Gabor-K I haven't exported a plugin with it yet. I should be caught up this week.
-
@Dan-Korneff Thanks, Dan! Let me know if it will work on your end.
-
Ok. Finally getting around to exporting a node.... instant crash in my DAW.
I ran into the same issues as @Gabor-K with the exception when trying to parse auto shape = parent.at("in_shape");
My model has this parameter listed as NULL:"in_shape": [ null, null, 1 ],
I'm assuming this model is correct since it works in HISE and other models on the net have this value as NULL.
Here's the trace:> RTNeural Debug.vst3!nlohmann::json_v3_11_1::basic_json<std::map,std::vector,std::string,bool,__int64,unsigned __int64,double,std::allocator,nlohmann::json_v3_11_1::adl_serializer,std::vector<unsigned char,std::allocator<unsigned char>>>::at<char const (&)[9],0>(const char[9] & key) Line 21109 C++ RTNeural Debug.vst3!RTNeural::json_parser::parseJson<float>(const nlohmann::json_v3_11_1::basic_json<std::map,std::vector,std::string,bool,__int64,unsigned __int64,double,std::allocator,nlohmann::json_v3_11_1::adl_serializer,std::vector<unsigned char,std::allocator<unsigned char>>> & parent, const bool debug) Line 608 C++ RTNeural Debug.vst3!hise::TensorFlowModel::TensorFlowModel(const juce::var & obj) Line 326 C++ RTNeural Debug.vst3!hise::NeuralNetwork::loadTensorFlowModel(const juce::var & jsonData) Line 624 C++ RTNeural Debug.vst3!hise::ScriptingObjects::ScriptNeuralNetwork::loadTensorFlowModel(const juce::var & modelJSON) Line 5209 C++ RTNeural Debug.vst3!hise::ScriptingObjects::ScriptNeuralNetwork::Wrapper::loadTensorFlowModel(hise::ApiClass * m, juce::var value1) Line 4991 C++ RTNeural Debug.vst3!hise::ApiClass::callFunction(int index, juce::var * args, int numArgs) Line 331 C++ RTNeural Debug.vst3!hise::HiseJavascriptEngine::RootObject::FunctionCall::getResult(const hise::HiseJavascriptEngine::RootObject::Scope & s) Line 336 C++ RTNeural Debug.vst3!hise::HiseJavascriptEngine::RootObject::Expression::perform(const hise::HiseJavascriptEngine::RootObject::Scope & s, juce::var * __formal) Line 657 C++ RTNeural Debug.vst3!hise::HiseJavascriptEngine::RootObject::BlockStatement::performWithinScope(const hise::HiseJavascriptEngine::RootObject::Scope & s, juce::var * returnedValue) Line 537 C++ RTNeural Debug.vst3!hise::HiseJavascriptEngine::RootObject::BlockStatement::perform(const hise::HiseJavascriptEngine::RootObject::Scope & s, juce::var * returnedValue) Line 548 C++ RTNeural Debug.vst3!hise::HiseJavascriptEngine::RootObject::execute(const juce::String & code, bool allowConstDeclarations) Line 2745 C++ RTNeural Debug.vst3!hise::HiseJavascriptEngine::execute(const juce::String & javascriptCode, bool allowConstDeclarations, const juce::Identifier & callbackId) Line 815 C++ RTNeural Debug.vst3!hise::JavascriptProcessor::compileInternal() Line 1398 C++ RTNeural Debug.vst3!hise::JavascriptProcessor::compileScript::__l2::<lambda>(hise::Processor * p) Line 1489 C++ [External Code] RTNeural Debug.vst3!hise::MainController::KillStateHandler::killVoicesAndCall(hise::Processor * p, const std::function<enum hise::SafeFunctionCall::Status __cdecl(hise::Processor *)> & functionToExecuteWhenKilled, hise::MainController::KillStateHandler::TargetThread targetThread) Line 417 C++ RTNeural Debug.vst3!hise::JavascriptProcessor::compileScript(const std::function<void __cdecl(hise::JavascriptProcessor::SnippetResult const &)> & rf) Line 1511 C++ RTNeural Debug.vst3!hise::ModulatorSynthChain::compileAllScripts() Line 239 C++ RTNeural Debug.vst3!hise::FrontendProcessor::createPreset(const juce::ValueTree & synthData) Line 429 C++ RTNeural Debug.vst3!hise::FrontendProcessor::FrontendProcessor(juce::ValueTree & synthData, juce::AudioDeviceManager * manager, juce::AudioProcessorPlayer * callback_, juce::MemoryInputStream * imageData, juce::MemoryInputStream * impulseData, juce::MemoryInputStream * sampleMapData, juce::MemoryInputStream * midiFileData, juce::ValueTree * externalFiles, juce::ValueTree * __formal) Line 363 C++ RTNeural Debug.vst3!hise::FrontendFactory::createPluginWithAudioFiles(juce::AudioDeviceManager * deviceManager, juce::AudioProcessorPlayer * callback) Line 69 C++ RTNeural Debug.vst3!createPluginFilter() Line 23 C++ RTNeural Debug.vst3!juce::createPluginFilterOfType(juce::AudioProcessor::WrapperType type) Line 39 C++ RTNeural Debug.vst3!juce::JuceVST3Component::JuceVST3Component(Steinberg::Vst::IHostApplication * h) Line 2210 C++ RTNeural Debug.vst3!juce::createComponentInstance(Steinberg::Vst::IHostApplication * host) Line 3677 C++ RTNeural Debug.vst3!juce::JucePluginFactory::createInstance(const char * cid, const char * sourceIid, void * * obj) Line 3813 C++
I guess this happens cause HISE doesn't embed the external script? @Christoph-Hart can you confirm?
@Gabor-K Once I add the content of my model as a parameter like you did, everything appears to be working.
If you want to give it a try, here's the model that I'm testing:
-
If anyone wants to start learning about RTneural, here's a snip that contains a model of the ProCo Rat pedal:
HiseSnippet 20992.3oc6810imccdcmUKp1Rh1dlDj.ja4vqjAnXN6226XXXY8VFgQThPjQSBBLLJ0cQwBpYWDcWTxLF494qPta9ZL24OR4avLqeO+qlc2h7+dQqoRPvfoSfEqpN0oN+2m89400yZ89O6lGc0ye9MO6hG7c9vO+Su5hG7m8vO3ye5se7O7iu75mdwO8GcwCdyG9K+ve9Ue1yt7IW7C97O8xm+7qd7EO3Auw+V94O367MuH92+0+5evkO4xm9nqd425hK9U2b8it5mc8mb8su7699e++2t9IO4mb4iu5Cu9Sdkqt98+oO5lm9Cu4I27Y5Y4Md3wEe5kO52d4u4pe9kbYeiGdwC9S9wO95au4YevsWd6UO+hG7M+A273O+C93a98O8z0+qt94W+qexU7EoK9.ciN8s+I27jGySLe2K9ge70O4wu+K9L+7Kzc48e4JvabZE3e4Ceuqe70ew2+kqD+yheva8xeiWc83AeiW+w6MdsGuzq93c7JOdeEORO3Udj9lmdj9m+vO3QO65O81W9S344O8g+zmd6UO6itTK6u5ixoq8h23c9QO3g+vazk7zae2O4xe6U+jmou3K9U9t8ii24sz+m+h+x27M0Z+yu8sdue1mbyiu5Iu0e0a8O7luk92ae8S+6d9Ge4md0a+u4s9OFeG92S+rm7j24LeUJ9u9aO8Md6mb4me0yd9q8K+O7E+WwUb6mG2729IO+1O4semW+mc4it85e2k2d8MOkq3O7m9ket9peh1+cyGu125u8O3Oxu+pq+Me7sO+q7OyW96b9uK+66c7tGkUtTGqY8H0V0T+c1c04dt1x4Zczl8i1ZyUe7ty0QZpKO0GszwZs6ZSkYstJiiYOczzCztK9n2F0xnsxiZclGkcWbNmFqbpj58boOG6uy4wPOtY8aLJ4Qps8CXdpqMsFoiYV2451qM0Si9fG21n0mau3RtcTOJ0iZtz1eooZN0Z0kdB547QZ6qui7pNzMMUFrdm1sLykenGidq0FirdRzh81OgG5faunG67penm68uUpGsQOUmGkh9Lr+khVaSixPqccsuqs888QYrzF4wT+Os7rl19XzyiiUaNlo3SnY4nmV5QdoCASciyqsWdR6+mq0TapSCcVor8pG5Ey7PuQz6whd12u+uVV04ZNR4dQuiN+EmdWsWt06Is+b1zG08qzMssuLKozgd2zq411qNMz67RoUq5by7X+6kj1Tu5q0pdzmo5tsGrVOa8iZSux0C+w3nue8XoscsiVJqUOYFa+9CYynMJU8njvt29S37Zt0z0ps+ks2XttZIos+ZuzpX1bn2wZcanih85Z3Vm05VKw0ejMKyG5SmLMOl8o19mOLKyIcCWxhfVoWklrPt2ViNhmq8UsVko28Kyozb1X0qO65guaVmO57.26qCYo7XuWnCsk93HkKSYbrk1+JjMGU8pqvowg7Ds8VuzVzVQO0itN3l1usaVkIwp7VUzqHsBd9KN+tyRWaPJxH8bjkEuc2XsyWGsWyoV7ZGyoYmTopGDYXT2X8aV2e0st1fpKWqwEVr2ejUN1lM8bu5krwA2w.WlxBoBhPQTr+PXQVZjke4Ibsxa8vom4VtkOFUtT8Xu2Bl1ymlI8.mzle44e+MVGmj8bsQMszF5lwhTIul53hr9NKGi49McJPhCYBSFSGKsqd+sFK4Irun210xbqKq9Xpm2rLqO3HvduJE44NujIukdrMNNmyhNKUVxR97vsXnWeZy7XHic5xy62Yn6ltNEo4p14IZ+FZcPUduayTRwOdrx6eRvpqr6mzakjr6sOhTE0QgfZT3OGiQYsOvQEKSi.TNZxgQqXVQjcCYKPFSakb4HuOZ2YuWkwVs0P1kl6uyJl.EIn7Wn.i0YKS.rccma8ZUGTjivwdCoJ1NcxhfoUH54R1b.Pa90sOqjDj66TwDpYQqEXuSwtISz68rncQy4pMV3pifv2uCIqcdx2sdv0Yq59GjDGEU3IxlfL9m16fqKiRGGJIjgdxMAgUjo.cjUWormJqoFGsZ2TVVNVkDAyt2A.d.0Qrd3NrsO5XEKphCKIqB5s9XYhTRQ8HmEJ+iFI2nykekW7e6W56929N2KIaJaEJWL8mszORKWHREEbohKtqPHFaMdE1PaEk6He3jmyQs6dOqTZhbJTrOlnMzQUYVVwp0Tn70ism+zYzAwOSN0J3bW9XEseSIFlvekhMoXhQJcTwnn9m7rr8wfCRxMgxoubbrO7RkQuBjRtcx5wQ24lIaZ8zpHXjOYEcRs497oTtIYLY7Wa62Glq96qTeZXTTFy6ysWsN+qjYk8YxtWgqseqjhdnIm2Jz.E75gyfgBfI0zaQsZq8flMGJEBclV4XkWojoHGU9noWfJgod9nt2daRIeTvDvP6UU986C3HQTnJPhiAeDKi8gTor+6gsSYVpISi6OrjUzI5dqWl4CSHw5TxQVI5IicoxZ+yblzZ5IEEn100WtXjjaD4+VwyL6TAJi414XzKJ1jFgw2bWdQISqDjKDLwPaP1GEQknRT1RZW0vZESGCOV5TqVMpKyqbtw0tLbrj2yp4NKCiy7fsQTFLyYb4f+.yRxSgRFJMc9tWopN3JKoILBuOKnYUm.00qHR0B99BLn0V8zpz5U9aK8tbercGj.jrQO5ZIwX8fJbjx3SSFUMQarHyJ8JWVQIyPi8.Y4.W7knND6WLjUWEKfBNQqwXVZWgYTdwJ6CEFpBxsZLyHCRxrAqE5YHObamaxZgxDanDUZZO8buQIEnlLvz4bHQ5ZR4UgFoPNHEV8bu8NO5xPfhNQwjPov1ahVGN5J8iEATQob1uMR+kkGKk4aD1Zxj+gNrJO.0UTdHsdahjPIzqjjo3gqtLlse0S2yjBKVwuJaiqCSlr5dRIt0hcGCH6epKZmgbNqjlNvwgo1jYYetKKBUYPmJNt+XnLKlkmELSqHdM0LfJwoHz0t+j1qLcwznGkCYjQICwal8KeSk8u1mTZxQvZePwEkozwjG7l1R6JM4j24wqasDV2dnsp6pdZyr3sTJBlp.K2DZChhjXp0u0dKMxxemxQ2pzi.EhkYoSYHqUXEfU5zK+sqGZOsLipsQjae17fH6yT4B1gbLwT19c0KV0Hn2jNdkLmt3Ht7fJy4soRsX6ctwqQckUp7X1EJlNKp7BSxl2DOnlCLQo.z00p7bTMN4TFCjG9ZonB06njw0rdUKaXJX8V8Xs2JoRAnxGRLNPxd6MkM04uDkwTq0r8a+igdOt3PtL+REibdMnjfccDSOyq88I6PgSnzEzQQRwuadyjivITxbxed2UEpTjYwj5WWoHIku5jNem+omPo1DsTp8JCmbSd51aGKyCgBSWlQzaRSUnzAJYmgZnqOoJojsUNSgpOzAf0hpFzcUQgpfcPUtNZ819PuIPZkhwAkDojM9laDHs16ezHCijoTXxUThfCzehdsruNvZKDNvoCs3uauwTE6H9Wz0qT8Sl7PNzI7dUwaRFWlZyqqRKXZ0ntnTJFGhTiktVIh7szx3Xe8nUJYKNFRMdObYKvQPYuixynbXLowUUPdxHCa9qygqLQ57gx0ZrhTPUFZlfllc8BmLqa1Z1lj2Ppx1nePKqG6SymBYpDnTl6cWxVIRUoSqvIjkwXe4pj66nQ35UYQlab0Ydo7C408fCBl9BknBPKZipBSXauMhBGGOy4Zli3Glx4qzfV530rTUxElZ8I+Dc4jqF8sPQraJf8fd6slzpmw1acDa0jddoM02YIcysNwF0LVapGJn2owAGghQsD0ybZHiBllp0RMsnrHH7oyvK6kU5ExZpVFkCizdadYZxdOqDth9vY5yhhcSwHToYY48QtoSV.IkFqh5Lf4TKHXPVbnYVJgNiYL4yTu8T3aJJujocVTMbYZTAP1kOiZ20WAxNSuHGxxmRBNu2p9XQSbV3fKk22p.kXepq8PDPQqatuGTEwgNSoUttoPdYJ4QzhcE.oqCzsoxXmCVGipMHLEs6rSIlTFTJQfhs+k5QQoiH+97K12uUZLkwFEdfBQXPBAlxQ0oEX5AR1ZxtBYjT.0T6+N4pZaGXWlOzYqAsUPAfLLsYuRg+JzyNdR1uaRgMtFzYx5HRVb+mQ5VgrQlS.2jVeY5xWE7WP+pWGqrAgSfJkD8DQoAmxMiawDw3giiIKMi86nzknDbR5Mjx2JUSlh6Lq5nH.DSaDStdsqTEGxhdT29byzvrLUrmbn3nKfJaO.fzFZYnVldoEdlH6OTBnx1woZnsn78aiIiHazgfhLSpCYlvDTBc8njdqRQYxzbMXltbKOF5kY1rwNqblk+hlh1Rokj2+Pqc15n6nGkFXn.V150P1ZTTpYYEVYwX5XFH5QVH0x2jFtaBpfJwJ2gfKvkrEeX7wfkTZZGgIjLkgLpllV4T7aJ5y8EVTdKnojjM.Mqs41dDomEQmpzAL95XQtpiJMEXcu1sYQ0ItFRbP1Jc8tFKvSJ6KIaa5qKURSeD0Agi9Wi9zPoiJIveFs4pc+jTIcWNpbEwD1butUN3EhpgX12V9pDmqNHiqAU32UwMBfrh07FFUMQxp7aTHaKL.SraCa7GCpOHs+TmYml7nhmCf9BO3t3uU.JGjGmhnfnOL6M5zFXvclB1L6LyrJ4bQ9aI6gsdD0sRwLMoCWxMTdeMzTB1fZUY6Uqeq995YqMDJfIEiPZNTnxiU2jaaBO3.hE.WpYmTl5BHycf7EJ+895BT.3fkRsB1J7GAkEoC4bSmuR6KmsBFTOpS.VshYeeMBkc79Qk.NqSGDthZNpT3zZRgpLsOlFRSPeBa5QPwM02CGpNlP0qCBTwDXp9w.XCE7SbDee82oYRk.+h.mLCHrkmslh8Qoqj8c8WGMjmdsNC.OjMWSl3DVPKBRJf529npnRQZEICb9StG5wT65p.zk5p6NUoDw0IOclpRWoa6M0ovVIL8ohxzAAB7P0UHLoJ.hctG2FJsW.UDvrMYwsQI1DGKZyzvzw.EBZgVHloI9tF.qXuTXAJMtnWKEmc.siXFgUAfg12.wJf6n1K5tqmaClyxAxE0FZvnYeeoCHhDspoX9aJw819HSTJxJjj.OmYZFroawfejdoBTnnQQ6eLJMxApfKqzzTdvCYskMQzCelLDSUJO5TQIsGMqS.ltdNoX.x1I.ItVMcVPKWx7LuOFwdu8kRboczJ0I8Xqys6yBRgtzTNYM5ZbcKNLXiDERL.DeTug01Z+HahxyMspUI7s0F5IeDxaF.dDjn1G95nKerijbqQiDMk2hBhTAlGJ5jkaGcixF.fGU1oJ3ts1jZfLxL.zTaSJNjvB1Lo77M4Ij.e1WjxFnhD.zuXLi1tuqFEtSeHkisjqwqZKGkj.nkK+wi8mUNXbSHlwF1RMgDzwHPYIG7J5jwtTSSuqNlP80J5IG7et8imdOz.qPKp0lou7oIXJW4p2oB4lDdkwb42QAWpP8SDi49ifKhgADvImwKGNqvXQmYUHScQLglTxbBQl45ATHb8e6XLo7jo.CP66PafjTskVgyI6iFj6Jibr+LKC50gxQvLtP.jRkxc3s2hdjhreEy1VBj83K.fRqQ1Dz9+xXucTlXuor9qM9G66p7ozZj+OEy3g9EVyj4XkxjgqkCVSiciZfjYllqDPKZXlXtB0krCdWT5Gy6qDG0o0QA3.NlLsDl59efGM8RLCTTGJ108nMVwvbbvj.ModsIyMmy2UlQxCdsWMsQ5ftjon909jQLkVcSkYn6M3bgQFJs0lN8YQgXRyT4jvzLybU84rOiX1nnvtb25TCyTTxf49W5.3+9hjH0RxdCoLZjIldIhvLcXl9R.2mrLtNMslU25bEXxwrsIeg.i1817NXXOZfyUFgOWsIilXRJmZ0n6h8+fyW3CeICZtdP.BOxju2hdBtG5wT.tJNrnGvl1tpyeDRbixPPGtcvZaI2wqAQq.BZ2uIU9MYaJCrPIkZtHoST5+CJnE0ZvDSiV6XvgXTSWGMyPFUi4HIw3FpTA12B+HUVkkJ9tjEASixvzKotovzq19HwD.MIOOkZs1vlbFmRfC1FsObnjIc8zUly01iB.ly0lEFb0BnoWGCF6m0oLcWoEilaK0JlYWklfyXksZU4Kce3+D5i1gvXmDows+hKiwhvUTRmyUeeW0nTGEsmCr7NRNKBCZdNyIYSlQalouWWDivNn5T9QM4rHWs0zf5MhY8jYZrU3+xKqheSlyylCsKlryn94Z6+vflxkbornXi5YW+B6GdOkgmhPoRmFWMeu90GtJcjzEHMMDEPkNYVHvrt6jhhOHAZ.0yQd+P+ps6MFlKJ09X3Z.BMzf9U20xVFLHaFnxJkNjBH1sFG0xf9zAfJpLlVtQqQVzIOHJxdYu+vACENlAnoFUSc9ThE5EGENWgUqfNcwktX1PlTDEZ1jAeZMPJcIZHtbrzMmuo98EEVfbJa5VcO2.y1xIaK6liq5TQFPRY5AXteqQocB+53mntcGZjLTXyO0acRzwU4bYuWwXJGDLoSlw2PIvNntqxQKS1fqwh5eJB1Tfc7r4AoC170SPMSUAMYgnkYvllLSC9I2aI3f4seRaEi1O35+gb.obHi5aiEOS8TAvkx0irp6JcGnbQqxZwaE3evTfMR0KAcODyj218FAUOzjuXYs0fg3DY3QgZUvTZUouegSFhnOF8vV99xXRVxJ8.J3XotJlA+BxdfLTYzsKVnC.fohyILK688EPgt6JynLNdEfKa2hubvqRB13.H1tusof3BPBddF3AeqktFCiGvEQOMq8AeQ5Dz66DnzVuIuuxgLCFeJPPEAv9RNvAMFJEYkERoBNGMQO.CiHCiQIeFlXMhvaI.BPJ6QdXhoih2yctoGGSwFab56TG3gWTbM4sGsZSum0mxrqWWZmOlMj+dZhbY5nQBc4LWtx8c2fzrDNHVT0roLPOLnaQthitncp.5loSozYTZB.QtRNPQTTVMxkVT1+koCjLlnrH2F5guXVoasRLIYAafXPgNUhaxvO.jRYxNK1o0A3bnWkckmhYdlYxRSLAsin7+FXQLX.WWY4i63v0w4L4gANXxT.EGbAUbCMnoEZ0TpZ3nHhVToyWobDokgba.KlDWGwoQEg2e1Jc.MHP87oFM66daggjrAXH2GlKMSfVMKahc.2xzEwAU1lh8DDSxXt8Qlp82XNOz41Z0P7KYFIbYYhziqVXs.nFoG7GgW.SsjVv7QJrR.J6z31j5BoXuzaQvpWYOR6kQ5JnLiR4q216y8.xjgZEKiFohoEjJ7uXFLZLQ3CSPArIhtllGTuQCcBnjL6JCyocb.qLBu.lV.54bqGyXZFVAv4W4dv2OICFlzFtB9eNJlsmoblJW1BfjxfBa.oBSP.KGoSEKaerkLVX33l586ZlGUVTusiRxbTLr1fBAdvPJKyR4wxAtxFEfPtR3WvDOUh2IDvC8ez.giAtSxELKWMSiEAGQM4WyX90WlksfN+fVJVrE0E.3fSTxfAUnJaxpRgbob.ovaUNor2lObOBTjFCQSYenkGzaDYg6KFtOyjrAa5AzyqwzZrOdfC5vkLLulw7+ru.DSbPoqES3i8e9n4bv0ccY1nQgeMcemFjn.ifV0BdKzMr1JP.Jjp76XbmjWM53MrICC9ichvJrwWmpzuV2r8nvFHxPmdoIanlYWexz0dnbS6ksi0TBCRyUghUL.9GFbFovJUHALXZz6CC8VoXnRLqp.Y95djhAll6c.RXNXqCSb4GmJ1KXlyTVClNUJhbAJxvLYg5O+AdpBPzh698mtoEdfEZEThxk2P1DLuJz5fdLSQK2VTlC7N.OuPTtl4PDlTR14Z.bTlz2gicVht0zHiWEU79XKYbhBlN4X0N5lhZy.mxy7hsnirI545X.+VAVWqtRfqrGAs7cPg4w59J2Qf7qNTQh+YldL2fGQ5tJ5kDYRerbnfNSi8SfoDFpHSsHY5nGsX.C2lQSjOuNLUHePZLP2h4Ix4GXfNCxuX4HssnR+LywU1cah3moTB3DNXnYsT5DU7gptBH4SikCKSJGhUNZoMAPObSmLSt9QCXF.8gXXH0ghCTonrfWF1eu4Ve.Aop+uPnE.lBSCrljmP39xFo4AXHGnv.f1cPaLA0pAIslXbQllxZImVU5uITckqWWAcLNNf9KSmJhtgCGpm.3xRYhLbCyrNI.oHdvfZ1bkuPNwGiSkYS1dxFFBtfExQTLZGfZ6SL0.IEkgDSc8BRFFKzDMLRYLtqfzyT+W4Q.93zLBCGPIP7VuDC.mqaWLxaAyigoACkvA5YzBsrlcX1cHO9ZOwDxAhWglB4zo6l5bRgLec8BphILchpR2JMiTMwcOfEBHqnggIbl0iQ6.eWf8IGrivMaz0YJImClySJhItVjQohoSu4LznJ4LPFWFFaJvgr1fnyg0HaG2fNxPtynmV.3CFKdkfNWOHSmwb43rLlbbsCU1c0AVyr7ePsSzZgBlV+NCCodC7Xw3n9XhCOSkOKAikMho11fDffQWfAeYHFoLdtVwPB3ZKkxbQ1mZN1WUN7kSKlwbPZv9WiC.8FbuRUQ7MLLydp1NHNAfra0DNVhY97.N8dQuYWF3NbnnjILccXeZnTUJzdA+4G7733xBlflF37D5A1MI3LBaUlAJRYsalMG3vhgdajYHPlq8nvEjIoyq3CGNIu3KPeAKHEhGxgIYcBb.2xjoIR08jyKEfRAd.EfWA6oNmKL13v4ovLNNXb1xf5Nl53AXnzToFP2tVRnKKPXqFloJnLVnnHk1pAKv8f0UZMP.UZ4x3BPz0w7O8CzX8.Nm3DBJmTDlsl0UzozJT4RlheX5+8QLvHJUtAb3+d2xoXx0k8fYLjUK6fR2G3VFFmF1tL6RDV96YN.mkijglQhwpMSgfOBkGXeUlY6l7MulC9m408PIwQEt50bMa1abPzO.SD4OuZRaNGP9l4MCPPYF3FfW.6hHPBkUogygn4XvsM5t2gjpMgVoyoZKM8axHHFAW+VpPW3Pr168YoXHRASjyHjA5uu2HXGT8AFrhIHXqaPuILC..YUFTsvJOSt8nJGwrLL2Oa4sns1MDcgRtLc.qMJF.vXBU4vDqzhfGkKVnpdavfcpfMzQR3J2zifns1vE4ClrBSO.mXFRd4YxsX5hLHTMwLi.HoNFlzNgzIA5bkjN15D3BXxfEKFvNENtJi9oCjj0SA4MahaDNZpMQqCTNjcSDXJSc.nJoltboXkSwFiAL4nRgxQWq5SVE3pbP1PtLg.+p.ZyT.Kyoq6hInUAYN5fZ.sG6EvoTP2P5+Kj1TwzmEFeelOU.sUStCSF1pYAwXojQR3t2PfgvlAf4NslCtsbtuSjWeTgbmFdTBVbGdESVnU3ltgGdPJNDmNbthIbWF7MDxfXR2c8aUgvPlVsf890yuYCUARPCEaAuFCybofX5PJskI7QhKnM4IdQtYfai0vAnUHmZxFmAhpXncwbm4yDPERQhalTytqaK85QLXVlAXTuEA0tTogQ2L5MTg0dPjVLY21wmu.5wTNkn+Ti847w1hX8fLRlN1wk93TigCSgU2ptguFsLPohzBUaXY.zcANdUuqyxNh4nXFBPMPUKwIXYS5AM7QFpaQOOLrgCGRVcFsNXWroiCrWSlMF41BZP8nZbHAdW3jH0.BaqaixaAKALXN0HbOmutnp5A25wjPXxaQO1JVVV+PiS1e5RFFKT36AyEhLVt8pgo2BkIPN0gyZLyvBCIFPdYkc78VllJOhtbyrhYjxfYvhVSZQB3OyLtD.C2dPB7yb2Plz.LMbMuVv9tsjY+QNWBhgiQxHsubCmXsL3TLny7AosZr+x.X.MmAe+Xh0qH+bYF7EN8VZNhILiB.UomQsso8Ey3Az0GiSFPFxLEKifG.6HlSTMO2f8.kSvvUfGCljbWPYLtIL1zYp.Sw4gFrqCOcIydEqpioyfL9rLJz52XXvFbmp0jPzi56krmTHlGAW6ehbALmBpALjnfkEhC2X+MgZkzXFAVl1WHeJmpe1hA8qV6N.oivjAbZvWiYJBGETVvH.enfNCcWkhoiDpm.vS3XpwFsjl1nmQ8TbyjJTzBv0F5TrmbZ5z.gaT9kPJGRtAmPlGUbdyfd9cE6BJ2R6S0acHFDkEy8FNWwBCykEpPPos2aDBNSPMmXFyIjdMDPhBy0OvzbYkYN38H.0hRGXkcZTYCYcBZlBSqlPkQDKnnyybBAPp5X3rDLdBmdcBMWgDofvmUh9xb1vMIWLamJABF1alxh8oCiElCbAzspoDMGAw.EJCfIRxodhGSBgiNYbfao8JyHGsAsCLI2Td38nHjDmYCMvRPKNNLixgWD4CFEggijofXKpn9dJDt84KBqyAM+Q0tZoCW2.jwN8Tz6D0Bhmv90ZJJ0Au4g0CbjpHQIvjxC5cZEC9Sfxl5.mxBvxwza+Bi3bJjhMPEgAE40fB7T7oT2lV0QrDCZ.0nFDX7wduhxMDnNedPZiSWUHIZ1XbD.AHFTlBgBsv5Nrc49TzJPc7nFIDKoi3aWAUDGZ2Sd3XMiIjs.gvdRyZ2utEX9P2RTJIL0rOKJrIsBtRep+m8mqTjOX1sAMEYFdODSIHXInEAj4MiLBMAOkPsRvvYtPSAWHfoK8eLLEOJUiBfFDHmdo3RyAhqGw0.BdolmtFzncmAzBn8cllNRdYZurbY.hmLgKgrtQwrgJTIAImcW1d1fq9X1cL7BB5YQv74Jti1dKXP0sTqDtVkkcxzHcftceAhSHGQCs+i7NzCTPX.kJA8.8p1AH1JP1rYbaAGKAQomLbUAibIDdKCIBkSaZIWoNEvcFRMminCoAoDfxL3hOm29BCdYm20c1T6vOWEYnMna1iPALLDACZiUuEONKq9UAbu6f37YHUFtrUyP..vMnGIq3egHLw.2lNA2n8o80YoH5hNM+2DaEPVlgV9qQ+bhDaBcrNpZuYL.BdwMCmjoPNbi8THF5.SdFbf8ZPV5cQitwxDVz2y7C3ChhQo3i4.iB8XO9XgONQitkQuQ0oMPYHEDFiC4jStEsF7Tn+MfHHzmgiW7gwtwZJQtMllBElwqBHohcI48.VfgKEbGRwqzy8dKBvBSqPD4iAKt53DbpeKMh8zrqseqDC9gBPtyt08xf.Bd+DIaZAnVL8EDhPXTgrQnh1IaenH9HPWWfYXW7ZJfwLMfB1nr4TGRzh5vcKhEV1pUACxrlxo.Fzb5f.puph9OXklZ5di0cNhAA.DWWBRDwnQ8qPPCnJg0poPCXRhOgsriGGBtTg.GOIVHtyIAUYP42Y1MKldWGzPfhGFtqrX3PpVP7J7DP5aMC40rXeOLELCIQ03ERmWgfwnaN0pis0ZQ6BlcJb.rwggc8XrvYvCKnrAFvqRFjsJRSMfxvoA4mpSJBLHiU+xPuqLSGPnivcMFVC.M9kQCeDdhLMqRw0AWzRZY5HqSFdh.yancJNFhnGy9AOFS3MCCHIAQ6TGmFZeWwIDIxKUEHskzqbfAjozpnPAny5582b5t2H.HrEMPrVyMJ4LfAvmJztijQpIBoYov3NbXnU9P1smmDdiAbLoYtyIWH4SC3aP4NLHrC9SKJtTqD7.79I1phn3BJpzY2joHrAzbQz1Tj2to1j1ARMenrDjkpq23jrWYFDBkqKof9FHoK4weA52GFjuP4H.LYMhlNa.USsFJ58HTRTCGRQFKfrg.24rSc+5mrGn2hvWoPkOlys.nXTP8JfdxjgyjoQ.rEnbVLa7zSg1ssnQ9PsoUKKwizDA4aUbDNHwowX.HeVZky06oA0xADhkwVpSplXLGfnRQcMalJkhJWyvicRX5bcC4HpiChSZYTbCBID+yJj.jQ0zCGniR3cQ89V46YfFBE2cgPxnfdQ+s2WXjNwzkvv6XczVVH3Py7kOeXJTCTmPyJ.K6PMA08NvkArLHN+HGLrpwyYnPkjiPnM.FgPGRrlJnqn.gGObTxQLS3GHt2L4vNdrENcrPgRUT5zYg8Y2fnfBNVfq8bp4gNfPF3T.pR2vnIgjeQxP7V2VzXY5B8TfAJ+vPUiSTuKL2BFwNpN8CsCL1gj+ykkSDjoXzAuSCMz2cXwlZtvnHhNYiLSXFnbv3ZDK1dlMJJYbTnVFHLXs9ioC2FgpeMgNaMH0rGjzabiaN49hTZ5vCwLnJGlKtG4UEphALPjA.UPB+5Uhdz2OlfgEIHozLcPp.poMI8xgDvTQdzcrcfRdDsAoSvwSpfm64fgcC1+Idku+4nfZthnPxBhwXNjsXNxeDvwuxNSRg9Nm0d4kipOZPmVx1QKgfg6.+.++Pf5AMR5Y59CiqxarhI4ELciiEJo2N0.9w.RFSETlTg4Q.xOvkkYJ9TzIbiAaXzAZmHITPrfB010zlhRjLQ8DWN5zAzSBWCnFG4kn0cU9T26NVQiwJ7vvXQYkDKCV1D4OH6qpZ3HpfV5IaelNpUPBPIRsP4frv0D44So8hSK4.0MNlSzZ2F3Iah2q8mtPqcqH1EGfNECAJOYljOBlOe3hnWlBzdCZEOAnOM0mDNpqybRUgSoc5bDMLIxLrx7.3jVVTIsgdRXDHsLZPv9AT4ZZ7zzznyV4DIdPwQLCPJHPBDLh4lhIKAH0kkLfEzPmY5aavMyUDXYTQzpCpKfxpYve+UCGbw.9K6h.krZfGZya6JUHchS7Q3XzzDIvqGjZBP3d4HxPzmRHvyFM4vTxpNg4x.Zvc1wlGJblLlYNw6nFgEjdT2qnmeqokLvzFznBJP9u1g.NeBOf0.I4EmHmmCosEzy1C4Ry8JOQ005f7RTZQiNc2nonjaHogu2RcB4rBT2fBFUMpa3ASiIEVhp0Zh7ngtWNlQkCbrgL7Rdvi.LNNl4+pfbkTIuWPUee+bnwmeJHRkr6aFicP3FDwQzO249RggVHoSI5cWlbKJlI.FU+lAM5fgD2XhYA7W0qD5Aw9abCd8FxSBBvp5H.Hkk9fAnRKCybyoHXL9YP70GL7saKYVBZl8..1hdaLcrOh1+F5TBEpZeCPNwMtHPALH9xfpgiDOXp9QmBnI+tZj1.eMnuCcHNr1dbKpnzHbd4cSQHOMRm2fvuVmDQ0lo5qL4uCjdNciYXLMxH3hAyhZj1sDY3AgXRv4kkqo8Q+DnY1czggf6JLuTvrUlQlYBgot+fBJKMv84DpDLr3jbTxnk9E5YiI4sAC1o7fCS663KHkdiLGF4J.SKmrDSKb0MrIcCQ3bZ.jdmQmKliDsBtO5DZNF8tm1OyP2sOcuwLnyZTVpiTx0xDvD+pgoQlysrw8M58B4tQBCN4KBpKuFc5WgHObX.jXFolRwbEaPYdMHY4IYblnfUtASp.htCAXt3lyBbHSlMzu2ilC5hXgFPlQydBf2XV9.jACv0Zv29MiXqjg5hCIlCYt8dKYRpSKMZQVq47hAdxLYY813zv2tWQTOAS5fMcgtpsyTHz5FTeKiRRuYBYCdRIzF6AfM2P+g.PevdGMaU6vMMrHlzIlbektUo3T3pNQVUok0Mi1.bZROF.ubHuEyMtBm9N5wyx3qA77YNtOfrFPJq6VgbIlr.XQ.5OpatIGyN7L.PiukcZwCGWaXNiRisbjhAfhmIRCpQ1.0EnFcvfJp9UwUpgLyEBJJPA8N0AoHpQCvtohHblrrbAB3NPtjViZ9.hxofoClDWGPUKYFqLkdZBjTZNHJyy.5M4I.BxqaR6j5vByUrhQLyo3WHNF55JfOYGvvXpxh5RCsI1bzcLQLETwakQC0pABKX6.Neo2JFNepQSHfVVQiJ6F9JjRZBqbUxZmc027W5Xc.IKXsv8gxpLEvT8AYmYfEODDckQHMEpqPwUsCfh3hFOUbpNOvEDJzGEzZTMwLgnlC9zpLUskCGFSRDPOhfvxvqmvXFqVkNXdLYxBLBmB7+4XMF4fQybe.Q9HfWG34wT6ezwCD4AJC1dDJ78xuanA0vy70XZO1ycFT7N.H2QfHd2DySciQzboKsGYm.xufEcvWKx1tozALHszaOPeW2ILp0v.lr0L51tfq0AhKsQlKcSkR6Xs.t8B.XzM0fBpmHC7MWvBn6aDXeFTOHUtHaF7Fj9P3t6.6eYCJsWL5fJJSfpTu3nl7UL+aPuuSbXYPHD06OFyIFMQCcgFSWRvMaLs7FIjT1a0FSF2.F9Qiw49o19B00nsc6KitrrnK+HDM6wV1sSV4x4AxFZ8NzRYdLfcATtjYlNxlSn.CX4zY9pgT5MP.IGLzFcNcQONL8OEx9S16YBpnjel4hMT8CR+svKRi5kpsyjuNy.GvVr6xpf0sxfYDywKGJk1ZH01mPUmKO7YnTB4fp1x6G.BznVrYPShYWpQ23zBbJz6QXPCSgcg4GxPQyHDUYC+0vL2rB3REBn3V5xE79KOxw7rSygbjEcLvYMX7ugi4MIGxHMkixWC9biPs0VCzyrfMobZj7f1tRGg.a4lQbEYJjJufin8QPyv2M01zfqfV6GSAFm3BEFAd+.iG2a.ZE3lBihRGVRtlfSKQAFcnbhJdFS1G5zcGMPrnysfsi8A1QYqgG7PfcZFnHBObDScYi3dVNmazkQlbpf7LFFnnfF7Ps1XFYZNldhQHfPni1a3vshxNXvrlSU+Ln8OyNeXHzJhDdwjVCjpAD8WEV8zkAIgQsfRDfB+RFFMm5CQ89ALXIPpv9n9AfF74Dz8YK3B9dzJQhfSxNJ.f19FSN9jj6SF5rhmTzZHFQLpnoQ+TxP6+Po3b0tAMAkwfsed5cI3IkAD6L8qCI3zwYuLDrCjJCJdfgXc0QqRzqGYkt3HaX8R4T5RvsEJ9NimY4qJivIxPqlFl3kPtWBicLqUcaqEFAeGWOk.tgrDAE358dL7dU3OXGaMuz8GCBAFCMb7KkrkrNY96MmcoBrcDBw0jQ4xTQG3MrFsDIvcYwQkNDeEC+k93QPNlFqQqEv.R35na4AK5SUHuZIC506Hg6T0aPr5x0EZzucvxChipi5pYjekYZpsuh6crepWXFq.SqPaQf838PNHH+mLPnmpqVM5BDyVAN4TdNGaSaIQYokoQDxEZjoCz3KDcrNs.FNow.aPJY1fdNgT9tLUCKR6TajVLncH.E66svgbvP47Y3NSlrTkYIv7bMfvnhsv7RLwJbHI50XLG1WjlHfZnT1CHPImNXfBcyNCpOR1Y+.tBfRlx.WYZFG86eQiHfi0Mpn.8Ul1xr.UVGNwjjZRThB3Av+yUSvaA6qQvGxbvQw7LGdUnGl.iQmPbRMGw8BR43zpHzUFSsECZdjW9vnYSQMDC5BbOW2Q8OKrOMCvoVl2JxdKcU6PQRNYRnMaSglW0ZV8HJkgCnPof0iWA0X6TPmAXCFRAFrRXxcmt.xr1tf6LxkpooVoXxZ.zWGtwKEc2isQEfR+vf6xLL9JJxo7Asp1YjD79FzjUfh9CSetSQyIkSYferBsMYUIHlPlZGDuzbpXM3akFXy1ilQPUY33GYBauMJqtiRfqXqAhBTwbl2GPVjGhx3BRPeZxOCFGAyXAio2coFEsLtbhdz3bqovzJ4SfdyLXqsCyruW4sNrncFFV2H3gnulXQsTMCd0IgqkvpyHTOzcs6urJQ3ggFthQz0XDSuji3umHLZ8tKdof5RgiQg6qLAtUBxRjHTgfFLXjg51lH1mUn7a6yCXNH0cRGVI5jb8gSNgHVI8xFD6zrqG7+KXo0w9BNbTBEQPIBvr3H6MlkiBg9PkooMQFpXmn0ZyPauTh7lgWBtCgoNLTfamrc.c7jwpAYY2byuALKVPDR.8LyJGJ3vhI9.LEWcRULfiufZzFL6rgs+fxMgBF6.gcWt9MPJwQLr7Jph1zIn8ZuWFIYWuGMd.NxQVYArdXZPccOm.kV5kXO3x97drKE.C.NgrcTc9kOhlRBUttNZFRQXw4ouVJ+K0YnfFenUOsqauaV4QApPU2SGkudZN1ksQX5dnE08NfFTspB.t5vB1QF.Zc65z0hZ0.HJP9VDYBr5oUrhZAgpqTZmvVXFuDGHcsfEDp2wgY9ajEQZEubroGjoatu.aXvnWHZx6WLlAoeBf8PjTJVdGZgKdFS+kA45L6V5UBpJdlrKbCAmdNICqf5TyMig.HNgNC6pd8kWl9OSX4f0QHlJWmsIGYlEJzrbXmGCn8ffI6ckn.5Db01GBZ..C9KcKyQJlo.5+jdOCt5xM8YfyvBvtYTlFYngICV9cHwhx5vhKQZuG5iHnzwQHHUNtB8eQ+6Kld.P4jHvXFYFj0z8O1PGqJH2Rv9DUmSVvfG7Y6Dofce0DQFqWjujxTtc3HARFD0JJAFn01X6.RoWm+TT2TUroQNKj2JrFTONBkkyPRc.M.BOutbzkd3HjmAze9tYzFB09oP5rGwnU2brnbL78ZaJndzs6.oVqdD3FYJu.FLlTHJd8pQqFGGolknRqAuqPiIWVsgHiZvRAj0lI2TRRJm.upYjxrY4SVkV46FUee8iosBLpBTZPsCzQ8CA6.gDfwXOser2QKnVLKR.BupgVuP5dBIWGtlesmvQXLTaIPeWMTYu8lZXbTgY56ouFfLL52O5C+XYlmwP+DX5DQ3TA0pFpAOHi64H31qkcXtzVelicxBA4fz0UWhpih1B8KZl+9f0gPIvCVkX+5rdqg7XIa6zKLyTBGYRWo7c0ho8ngR0S2glL2n2aL1Jz59PInDLqwxhzWY3pSbUjEzvoLViX36kKH5l6V5P96cBA6v2x4X7nZlJFbPgHXPRzhWYMr.pKXjGsXCRhaVv6RtwM.SLcq0jAoRLrCy6xic2vz8LlXZwf2jEGBJkeM.UTFu9c27MPqUfmJNJg5EOM34eBQGBsVTLjkD0MgVxf56Ry72GNCiVTCVDZEx7poQOxgEEp5TOmLXRochzs5nMWPlaFjpRFMqPnjFkpqfAJHS3BMXbGLc3X2LHkj.R56EY7SjsihaT2cEnoRFxARTlEJkkNz.OsneueB43b1HBI5OpahqPdM4PKQJE30aukwE8ujonJl.TS+GFfsHFCAvQy9vplLaET3I3wvxvnSRzY.xSWuyg4+MM+k8aknWctNUzwCeBAbiQraeDGGg5tQAiw9uQxEUbLZqIHWoAcVYXXVDmHEaGFORltl2BQlSm.lfp0gorqAAKCkP64Pw9INT+.McmdgXjNBj7hIcSNse5mOITYyS18Yxg.ugF.TpjDP+35AaR6DLvv28.hXhXG2uYldMAecCAR6BQBxzFdQoFfBvji.mRYjCTzknd4lx1Qix6YFDnNfqyvIOGLL8uPSkLFcAW9TNBvQLwP6B3Po6B2xTf6gbtMWAy8nksXTr22imDR02AJzEzYjQp9fSTfX6olDfdcWKQKmjkNBlOcXLQqf5nZ6A0T0MTzUEZtB3PIadNa+502.g+Mnv1rYVBhwzQl4xsVrydeLw.vwVfhX.htSU.Jz8kJHCnZ55PBxum9KArkL3rGVWIDV46XA+pi7WRzaSxvJcXTQ8DECePLzHfJYmNVWH8eZ4KLgA7tkC35893jlQvvNY7TrB9BWIfS8ZKlJ9S0sUbDS5VQwX7Pg+Aor24z8xTAEbwBVbQJYT3GlZ5NgKg34Fz9t0HstonP2TlEFBIWGNQ2Olc8ZAP2avdDb2VLfIo.flltcc27hR.Dsdyk68A1PYJqBxHyPalTTjCxMENcwrxgx6DkErQ5o6SONgLGUCDfLKFF1rBe5CcUBaRTM.LDBZggCKTFwrASBHJXgFho..2GwQTRqCxRAkQTFy2u+DVoHdcnc+Lpv2aSF4AkXAHMA6VdjlV.TxXXSelPJOLSZauQtzJJIF4ktSsYBUK7.gJClG1xItn9TEXp90gi6bPvb04T4Oo.m33zGa5ZTvhDLBIUKe0bDvdNEr8ooyCc1tI2gxeXae0kOUCXlVATzOpjhSCEkMFD4SNIheHSrAsDz0WB090z24ShURCcYW9gHiRGzmaPA3QswoHQcSiHKvdOGrMYkbPG.kvhlJBkHC81sOxJ4kqtBEBtasOlyAgHjfxj0Boo.hJCxB1lVgybGGlvHrLYryF9AWRlj53Em3zCkIxD4ARB.SI4hW4FzV1fHsxUXmVzUUGs0njj60XxSV6Ilv6JdWdDiBjVH0yiChgMJnICCDsLyAelZzQ1.K3NiHmDaI.vKCH09JoT.Mec5FCBIWywX2vRPnyswrjXfbrhuLBjNDAMSigRA64bPtB5Ptczi6HDKH7FEnyDCfKQiJgHgdgAaiMUEY0jOekV10PFXMifpCBBdwnKnoTn2LfFW8JLuOd5D.+XVhYCYrryNQnDWj2IL7heNuqzA7NvQoLLHLrhhPOARvwD93lUepjYNpfGXTtapePvz94CuXVGRmBsnBUbdYfhBlMlHbh3WZKXsSAyZGkph.BMb1JvmD+DGnqf4halLZn71SFS.Rzww65Lo9HvlCf8oiM4fDCUTabd0OCZjI6LjdxSRvS01o3L.CdxzUa5SFR+Tuy3hw3Olb9xAe4CFPqrVYRlbnxAszxrJnfbVtAOTGUI72Uvv7cWQAH.DDV9I0eznOzYN.v7n1o3bt.kwYeYgsFGuldRAuf3honlkXrMcoxgZqimYJnc0pH3CjgAJimrpZJDD875fXxnzsSCHqBDG2GgzrPwRLleCwBlReSklpoCmxwRybRnYIKzVuriNLB++DYc0n6EGTbNH8MnCltgRO4rNZ7cMTJu8CPDjhVcw5L3fJYUxbNEnyVfQktiA+.hiQGqkgJGIGkkMZ5nDE+KiWcqnVqqEV6hdyXp0kRFtDo4y4QWbjIH6aksOpUYrMwQQyTYGZOJ4i5l7D37oTKbFrrMPuGMepEU4YOw6DXBYFEyXh8IBQ7dSQIGLcMy.xDy4zEiEzNEGYqLN0NZ1FknErIR2hbI0w7vQph.UgpUJDZvlZKRVrZXHpPvslQgdUH3oQ0pufDcpLqWkgxILWgIpBDVXc2Kv6lykqPqvM3c8+OA+RXXLBHC6CpEitsMSG7Pv.QndgRQ5MS8PoVFn6KYnj2toCkn1hA43DjZtyj.K1gzq.9TFla8AkalQeAwVqrLEpCsbGGtAWrm6l1ovAFn2cP1+gsuiJtZLTNNNw0bl7A.tNUHB2IvI1.2VEHDhvTvoYZyc1T9zAcoOQ8PlVq0LnrGLJt.RPCI.EwIyDlkPqj5l.qGLvc.mrScgYeWcZLhpY.0ucRwQ3NQYRYZbY4aXH48VDGIiwgrvu1qFHs.+AKXQ3tiXmQK5AoSCxAc+0J+DHFfv+IoU2IMPQW7KjsXFsHy33Rt7qD5ag2fI2xLPBjRe0fIapNPxPbaJrCk879XYYf8o8qZc.fLlMu+nV1KjUFlinkSYTzGwFMuNPSukP3CE2sCusLMgKAe9f3OBwcMxF89AZMjn0GJsR4HvA9LZyPv4Z8PuVqNkQg9rES03xkkM08qVXNvxfREKfqfksg0dowXohCvNqBvHoFLj+p3nhNHoPkqnR.b+vveBxsmFALPwZYO8xoOhnVlkYTUHCVtRITjbftsd1KtfOfA6U7+A.0WTIDCO.gVOPDHgXBk2knMyGKv7f8F4h6sRtCt2YV2PjMLsE.AmCYXVoxofDllQ4lj9PMUz9ZsX6J0ek5pyjKyHL6RuEbqBAqvvZsLM1gyfz2wIVTatQBBR0L5F6fnjaNkgFgLBU.fpJWbZsSJ3pbfTbPUSNfSSiawdmbrPkkMs5ZFgbTyySPzvz2nvyBMIzHtpQESv9zB15uB2FXT.o95HXSChnsYlo7B8bfQySK4FswUtsjII.2L6VsCX4.EnYDXgArt4nQLriQAd.e5FuhLxqCjgrAQ7suAjTHYnstlbd0W1abJmhzxXv+FNIRAMhDB4JEvzxzPkAt3VgxMoXO1ZySwPLw4LPCDz7s2yEYwAj3nZ0CCyTJGsIlVXFC8zdOygnmBN4oL7Fw+MloEJpMTnQ69iBdNNMamiDjelgiBY9NYX44fJjPU2rrAOuvb6CZmpUqp0fIN4IRuNlCCCaEvHtE67Uf8caANwADDdvcTxksRFK7zBg7hPV4TW.nscphAbdmShRymFS3X7Olly2MLiCkio8+8dwTwsDrLMnrfirVNEGAOr.Uni7IXZ7RvrCUj+zwI0p17QrS4kF.AKcN20+LZRzHnuTF8aSjrMHJjiXV..dbl1zrHA.k5IEjeXF5hFrNKZDWnkgFwH.zdj.uQz2aW+lKn05znnET4kQOqOIrpAidqsraeIB38nOuZQI21mZXCY5CVzlV0OVNt9JnFGXhzDs9duwNPPnNxlfU5L7dOj1tRJaEZhqb0ZFjIDmKFInPZk1emgvuGzz.YeTlmxlBovTcASZp68b+AknmKji.T71vUo4AEfsA4sx1YydHFNkVH2tTtHGBqoT8npqDm9dmULB4bttx+iq8BCZqLDh.D4TaOHBykP9MPmHYGhAvZPgS.yhSjJ8zndBGon1wsthH.BBaOMJb.ZCYQtPjUlBuSCZwNdFhxsazrl5oVPjZHPVkpSS8voBV4XjBMCY8BDAchMaASP6qZPLX3qCXeJjMCSwLo7ELv.inON6esP+GnJengIyrIsvN0OOsHANqVqSOb3D3DngObrn.5EkrFv4Pro6nM6AC00KEUdm0YFW+EZo3n3XYdLKWh5Rz5GNZFHvfwjRWPkDMAQv3VvQf4jpJ0LhYM0PTuIgQYqi99PWozHGoEB7g1iZnbD3jUsgiY3qlMz4LCwA0QQGzQQNrTNxXdZP.RJRoihi35HhG34CT5C24PnN3JIAoLgJgHluu9EmXRgIgaHu2qsz.ZGlirEgcWcvmivdPSAlfyslUojz6iCnoJDxAyD.CJwPXyP9UJFmrxjQCZqg4M0fByLxsdIHiWJLmoTsTswRvtRXq1D4JBFhdOCjPIdaCveI7AZy8ji4NVze.NwNn+MHdTGFOKkXnAfEVTTz5biICRszU6LnyPz7cmSKnw7HD5AEBcOkgNGnulTxrB3tcOpWPjryA7MlJvFSeWW0PjhGPccN.VDjNNR6cVg9rxGlLNkIWpaGSxsdpu25HIopbppOvvcF0egIZAMEqBOOs1mVOvdf9stTvqorozSUT1OlDydOFlOiQWTZWn4O.i2gov+AgpqadGIFzcXg15AKQmB3HmcZPF35L3TKZTvvgyZEGJElAzxOcRPYnMjElcmSLr698nT3DnxsD3Qx.1azfIPJLLahoN.T0DDh4Jpna0wekTqc.JGS0X1AQRXNMjrIsFuP7zLLtFCVlhPIwxxzPtiY5vtV0Bx+eezcrimn96.3k8TTBJXZGN3kqNahSJA3b..iInenxzUSDZQvjQTLynwYJpKSfYhA1GH.Uy1nY.fII5+WSuV12+sJ5EK57F5W9QZ5fsGzjRBQ8kVKaZEoxSYhVNFJW1dWrzzW3GAHuf79f4CAbIQ+ll.VXC+5cRtUjmP1MumQZjgwEcKryC89JRByQokKp5DL5uaLZmnQk5sRj3axv0fCxqAhCtB7YctiYuCU8sPK6KlNQBEoW95ftjSTJArW0ZAzDxlJolngrE3ksE7.libWlmTDW5X9.xi7cLLDWfpIjVfQduNOm.eAL4IDGZYO5fSPHfTMP.SIBx496L91.CC8RLUUFISF16HF1NH6CCOuxfL1Y1syfxDyLyD3bf2JHfgYmayhxCCIatJCXZSkCZ0DqAUslYynjcceVlixTbuCJrz9B4bDylJJrLjXukaNgJXoqam3icC850Km3MInwaWsnw8st3B8MGS0l4mf9TfvBfDpXl26LRtHhmaCVVxPpPMvMSLJ6XPvjXChrNSVbf1KGADgxpgGqBT82dUD86EJfb.tO8Nj4Ss5.eArVrxvoCI3YRXAQP.7+y+jkLyrVHyFcT5pIvN6vb0Ltxglj.oYe33FJziMRFBdcH7yYZwY7ZGbSKeRl9PF.TFqXjXQ1b5ZDuEgiYfedNL3CB7F2QAtAZ+6qGNx5mrHAWXvr.aVo6kXzgzoKxrvAPH1DACvw.jZFb4L3ASAORfDi5JatyrSslCTjYlT8BLti7dmCcXM4GCAnBuiPnLlkxxIjcoP4qUTr75wQ++xyUGjRAxbmlrHWGA+6JaXECEySV2nsS5bXKzH28CBI.j.p2cPgOMhNDL0xAzOZfJg6OPsxfBK2EwPebXxrAP6VYj5SYPfQ2z1HkVSJZ4qWO3P83pfxrxcI2ajVvjL5qMbPDL8gSfH6g7rbnnqVyokDVfyVUzXLn.IyfKWXljThEJ7CkcQ0b5dfFSAcKu.7JlhjNgKegoyX.eMrNRAdigCUPls5ffgaIzUefL1MQDjLppwogTQ4OsN.AMtravXGi5uNa2qty2nU3wvhUfalMdgNo1PHP6cXOOShx5uNCPBJoap6lbtRO536frk2+FjJrQIk5zLFmdLSPcPs1Pqo5U9gy4lrNB.k.Zlk8412vgbRaOKdVXYAYNPM9X5dSNgMirwNnZHGMCE92GknYofpvpcZWyn1EncCHE308c.gItoDZ0TTR7zdayXOT6LOPX.Nbj+.86d.ZU3Ovd30.m3h6AniL7JuuZY0.xxLar5yoY79IHdE0EipY1Pzfk9AwjS8hOb0NIfr.yD.3+BN.yIs3JZtEeJQ.qL5P9oAHP15j0fUxPOCzJzJzBMX6Z4nSqXvvSsvLdd+RGSMHHrjgTaXPaJTxI4nDEkYb3pa9.Fdd.4uerLjLHQdtZz4MXpaOCktBJVCwPu.UAYo.LDdOfn8fAZ2oWmDKvLHet1zgxgEX1Gdvi3bylJ9zYPugQbJzkXiWPDyIsapwDvuLUW63HjDaH9JEQU5vNlDAukWhCWIijCiadFt4.DyCGoin8oUpdwHT7JyPR.7u3rcHFtFDFSxqHQ8HtlbrwMXyo.pjKHjx19TlhonQuRTjqn+S58ui22XBWNNwUD5sigtr4vchYvGxY1HAC3FrDfhSl1qKWv4sI0xbR.PKmN0CuuAP3gQqgOmc7+.0wO5rM4.XJeALlmLmxfRffqXHeWXXbDS6nzAltmRg3.FSz8xikaJxm.qKn6iTALXs8pqfXkIBMMO9FNyag9sOn97KO2UBT7I9bEKsR8ranHzIiqGjURF0dy33pOQrXGAJZZNgFJzlTF1vE8YzonMfG.fjL.XASI64csLYtgTJ1vefQRCZM.qN.PBxA2TMyPLGOPKzgT0MFTUL+JSY7hqP21u1ovLkYrjL+NPn7btLhYBGqAAhV26TrDB9Kh3aGL6d+Q8NKFLGfhUHpMlDPH1iLnboS3al5qkinQA6e60OWpAVI3JxTBntb3BSQGPfJDRgnikrchIXSZXXF3Qp887pDDn4LXTWjyt8GXGxAqdCFVdMrnFU9ZBR5BtiwTRvCHUaf7WBtpxDKA0tDXjyhsREyN9.vocUh+f1q6ZaR4NRlLpmZcOzYZARUjAWHb48OzDIHnyfxPSJCNd9iw+Ke.lLqF91AAHDAFJit3ZRJDc7.9rV9AYWm63JbmlBPIAM8.D92mv4A5g6LqTafkUchqL0QZwneBleFlXMq.wLYDf9WVn7R62kp0iFxSOxnwxpDJEhhczBJKXr+VSJrxkUfob3A.yPOnL8HlzfKZNbwgEv2jJXzidfaTlBHcM3dQhFqYDvNV6H1jIDLSypL0vo7sPwp1C6zHvJPrKCCXGNowjR6JHh0FSuxQtsbBoGH4C.rALNmtDJkw4.Uzw06xJZBXNB97rNcJ2LSRDTWIcGczMOEZGGeznijGtRagVyLgMvALVtJtjfxS3..oJrbQRipFCYpLltfv3EdPrQZ4XwDPubhCoBwEFdri7Ys5tHGWHYn.qii.Zeto+jjrRHC8xSmiiO3YEl3kVQGtRMbyObSx7twOxTMEh73DymvXPa1TC8xPMiA9oECHNY.vgGAg7M0tEST5k.XB5PnLA2RslSg.PyDYL4FlY6NEiTp1fPsAJYGst.e1xfi.98aK2n8Ekabg.UzAqPFOLfGYJd1DtSn3v7I8heh5RovAU.9SGp2Rftcs+lLybXJBZ6ErBxHSWcCzCgwhPOqOscSSnKfPOPECDlkw.4ALWC1YfOeN12y0LhVd.WpQxM0rPkVU5zeGo+a3nGSF.azvNNFVbQzGTYnBdrMcDGBCaYEHrP3a6MOdJOKvvOhmhg07NgqIEyQHJzDc+9Pw.d6y.CFxrmolsJP2A5rEhpTfZbyXg0BWrv0HolQsSyf2.zQLDI9dwMIAMnxh9f4edsbytEQRirh.dFN5F34PSSFjJ9Wigwh7gFgHWo21YSLdj045fzYQEUaNKoYpLGGqA+7FjtP68oiuPy1vjDF5MfIOkTTCQT43LoR9leMRt7qNwR4ynB7sP66jWoyxEAeuz6RebAiggrSb15BiBuEi3HRW9LeVdSHB+mZ9f2Gpn94rNGaNCxKT13Hm814.7idFYh.RKFvczrs0YuiM3LqR+D19OqjG.hmTbsjQihpjzpN6MDDOpM3LlVHYEm+IbfZwhNDzCF4ndtUmBcopUhoIABQ5rqhkVzqmwKXOmyegIp6XiPUFsypEa2c7FHOzfEIFmsvfeuLbbRPRSC5K5YgMOsfeET93hIc9rVDCYqqRfC.YYF7myccTeyDj3HVXOKMMvryEzPzodIrNWaOhYkIPgZE9FqbV.TgqqPeaynseLocm40W9cYbIf41ox6mkaSSXjVICUOQpA0yc3K8tvFsPT0HyCswY+7Nwq.0rFPne1XRRuKUIlTzo0Cy95rWGRGhdkUN8mue1GO.QLdQoEums3J51AXlohJv1Gmkx0RHhCLXQbpaVJaLKzSznEbOOlmCh6gke3kPXztFExXd9kuI43gJfdzVm+sAjOLge1C0e9bmjzwiBzfDR0S5rU9JXi.DvvCc9HDCoyuom7IQhFAfa41F6kLziUvOEShync1yQPfP3AGDJP0UN61TbCgklZBilm89wHAD+KC8kbVr1DSiB58WiwoKyrqe1Ozxlu9yhTKAUpe1EG.qObSsBYHSxim2RchJTEg8k1QycALpfP4gYl1fxzu2oRSEFpavlZmK1onmlfm.XtZ33ty16XhCBnnyP8qC8Dhy4MXxbyJapob.Xzy5SlgqZA0XvnJrN+iHMWDbjlkG77liJIBEEVuAuimcdYi44aEXAkGyy2NineuPQI4f3qym8rLX5oDLJeP.E4ytuQgzLh.xJq5Y6DVTCgDn5g5khZSc16GLuKtsoK2iy4A6NdRGzSB6CTYRyO6J3DP1qrMKniRm89AmZhZlAcY1Wm6Cr7PzCAFF4SEJW+7VafrUA7prvbVRXIZILyykxGPwntFmUdnAsZ.wnZnlIkyJK555zlZfwBBOz3r34j8pDoPFNP.s.47u5BLjxjFBk7b1I++DySC7NxbYkylIjVq0YSvVEgdTNqrRECnPHgwToaHC4448Qw.p1NI0DnjFme+eElaRAfCPS6k5Fudv47X7nbZxIO6FLjzTH1wfYhOR4y+9KjZGc.f7Rxm+8B0yIPBQGiMm8HZgkvP383s2YykLBwsBKvC00hPH+l6yq4ke0+4WdG+GdsK4su8y+zqd6+Mu0a+3qd5yu5se8+vu8kO51q+cWd6027Ttj+ve5y+3Kie2ubdRO8ydxSdmule2zatIMr292e00+lO91m+U9W4+3eLJwAEMSYaTQxeXrhum5zXG+tibjpJyhZ6pu2Q6diTdzSsNNfUJpR+w8nxVBqPPdx5nNhvx8WeWyHpMCkeECPBCG68ysNgj0.xQjuLlWmw79i4ilAN9OP2.WxJ981hLIiCD6SLb0G2aHjN5dYTzclYtYZcuciY7cYpfy.9TBv3d6NOwTGqwAVdl2eRrSOKmtSEXRnUSiw8H.BXBqPLHzBACHy81ctx7jJG1cFrUE9+80hLzvaAcUKzgs6sC0Aj2PgCmvAlLHi2aqD.BkL8zSgHCXhx2a2YXqWEI3Dny2XKx82YDFv8fp5GK8ne+cDYLfMalHSSAt.tuqeYT8UXWGpY.AHqPm95GGwad5q+O+W9lu4+5+0+u7Ve3O9m+A+he4O4m8K9e+sduewO5G+ydq+p6q+8lu4it4oO+1252c4ydqa+n25u5s9wO82b8Su5cezyt5xau5me0m8rKexO+pa+827re628s+PE7xMO6m7ja9828sd6+h+R8Dd6G8tO4lKe7K+ou2MO9pm7ceue1mv+6egthO5yd5iH7l25lm9yu41q9EO869W7l+Cu424M0my+vezG8Qek+re3MO81mcySdxUO6q7G+gW+Im4mb2u328oe1m7qu5Yui9f9jO6pu3Bu3Aeye7iu91ad1Gbq9397KdvC+A273O+C93a98O8hG7FOLcwu55me8u9IWc5K9fadxM7ecbgVzt8pmd6qbg27ze5Su91ewmd0ce8E+vO95m732+Y27nqdtVVd9E56b5W5BcA28To+KBL7hG7+zC+fG8rq+za+fmb8iu5YWb8iu3AeqG9Se5m9Y2dQ7.ewC9NeyKdw+9Z7K+se3u3yt8+W7a+ie5k7o9O329+5e8E+69o+nKu8R8Q3A28oQeB+zqd1sWyh2C9QW86t9QW8gw8867vezUO+2d6MeZ7w8S9zadJe1evel8C7e+K+C9e36+4u7Kt96+IW+3G+jqd+ad907x8k+j7+3yu8pO8Ct9+zKdV++7+x+k+u9q+jqekK4+v+3mb4e+qtN77O6i9nq024gO7sd7O3B1od5Q9QW+qu5IW7ou381OUOX+Y28r9V+j+8oK9zKe1kexU2d0c+j3Q9mc0uS+NW705S4W7l4kOMe+O6+A+i4e9cOye4OmeK+dnW4w4ouxmy+wm88+C9zDav9Z9D8l2c2+ke3EW7Emwzg4Sa89m8PYA5ydxk5b8O7iuTqO+zeDey+s5+7te.qq+fO+Su74O+Jc2dva7SYurVu+7W8Y4AeiW21vabdaCGuhsguhS9eMeD+m+v2+5aezG+U+L9M9JdF04v+awy3ab5Y7O+g+3O5it5Q29xGvu4C+I+6es0s6s+7O3Ae40n27tW+5uI+wescCu5Cwou8EO3+iG9RC+e5ytRaXt5Cu48exke9284W9Iep1rnmw24s90O4lG8aYa2W1awca99AbEe2G8wW9zmd0Sd9eLNU9S9Zupj1+R4Wdymc60O827dWd6yhSw+7O6S9fa9rm8nq9g28zou2C9FXU+zWevWy9hO3pm933K9+V+6teXhu9A28CSu3G9R2RWbmW830wc+25H9o09ezy+zW7s9UW8rmGFl9VOTAR8tGW727D4zGqBWe21V8RI9du+MO4y+zO9lmd8i3ac5Jdwi9eymbymgIjSO++ud4y+vKu9IrO+C9rmKunO9W7zOPW7SezUw9rG7yCSWeqexkORKre96e4seLmWvOr1bd0yd2G8EaResm0WtOgU3etrf7GbA7Z48egokme5UB+s9g50xm8rWrbpG8OIL38MdntD94rH8Fmdn9S3u5exC+M7.7ZOe+o546YW8twO3q5A4teGyetuwq73oe6u3qzu+6c8S+UmbQ+se32Kcv6h26x+969VOj2NW7AegQ1+kO7DbX3egRGk5Z22u8pe+om4Kdv+hG1d2ZP2xn8yUPk+Em9ngkyK9a9rau4SzF5GeW.Ne0OHm9q9xmhu8C4u4+zdP3Bn6xEcAvVnqwQJdR9Se3G7I2byserNRbwc2++jGl4tew+8eY4O6g+xqd9U2d519Z27Kdkfht3hWYSxe9Ce9Mezs+c+5XuvquW4e0qrW9Uunup8Mu9swsa8UeXzloSekbh7M3I5+4WthRLzu3yw2TqpewGiWbsJZmm+q3N8nKexKtPc38EmFdvq7A8a+vmFoN75eF+yen1+7wu6c+nupOYewum8Lwq9g5A+AOneqGFYf7hmw+EO7Kk3xqreI788pewq7w3aEGPS+S6T8K9k9++X8+e5i0m+02cmUdYlA+29G7W6dE4l8zqhfUd9Eu1WpscrsjPnuy4y6+pgUe2VhK9C+z75I.7+P9w4Em5bed9l744URe37awe3CS5qu6KHTmUe907g40MP+9udlKegMiK1ZD6LVa+iIA7+6RXjexkO5Y2728nSQFyGnuc7czYimFlE+NO783qeqzWtlDJg2q+6dzid8a0W5WL+G6uX4O1ew5er+hs+X+E6+w9KN9i8Wb5+EeO8024kfs4Wbw689+3XS3CdvoiQQVXW7+CvggePC
I'm still working out the details of the training scripts for my own models. It's mostly working, but seems to stop training before my desired threshold of tolerance is reached.
I'll post more when the script is working. -
@Dan-Korneff I'm not sure if the tolerance refers to an absolute loss/ESR value, or whether it actually refers to a threshold of progress between Epochs.
Also, depending on the size of the model, there's basically a hard limit to how close the model can be to the original. The Rat is quite harmonically rich, so it will be on the harder end to model.
-
@Dan-Korneff Would it be CPU greedy to run several small models at the same time?
I'm thinking about modelling key component of a circuit. Not for reconstructing it though, just for having those models here and there in a DSP...In fact my question is, since a single component/sub-circuit has an easier behaviour than a full circuit, are the resultant models lighter to run, at least if you run only one of those?
-
@ustk I think it should be doable. My plan is to do a Grey Box approach. Use ML for some items, and then analog modeling for others.
Test out the snippet above and see how much CPU it uses.
I'm still in the "trying to make this work" phase so I haven't gotten into measuring or optimizing yet. -
@ustk so basically every NN model uses a number of weights. This results in a certain number of parameters being able to be tweaked by the AI essentially. The more parameters the more CPU is required for processing.
With simpler circuits, or even say individual components, you could probably use very small models. I am actually planning to use the same approach as you, using NNs just for the non linnear stuff. I'm hoping to get it all working at higher sample rates though to reduce aliasing which would stack up quickly if you are chaining NNs together.
-
@Dan-Korneff are there any flags I need to enable when compiling HISE to get the RT_Neural stuff compiling into a plugin properly?
-
@ccbl I didn't add any flags and it exported correctly.
-
@Dan-Korneff Thanks for sharing this.
What is the method to train your models?
-