Exploring Communicating Sequential Processes in Javascript
Tags: csp, javascript
Published: 2022-11-30 22:12:56

Here is a nice intro form Krasimir [https://krasimirtsonev.com/blog/article/we-need-channels-intro-to-csp](https://krasimirtsonev.com/blog/article/we-need-channels-intro-to-csp):

_CSP is a formal language for describing patterns of interaction in concurrent systems_

The library used in the following example is [CISPY](https://barandis.github.io/cispy/)

I am new to this concept. It's not widely use in Javascript world, because of well established alternatives like Redux-Saga.

To dive directly into the subject, I suggest you to give an eye to the following sample.

A specific task is assigned to three workers.
Those tasks are accomplished in order in asynchronous mode.

The main idea of CSP, is the ability to synchronize tasks using channels.

That resssembles to the patterm Observer/Subscriber, but there are subtils differences and they are not incompatible.

In CSP you put data in a channel and you take data from channel.
Those two operations are blocking ones.

If there is nothing to take, the process block
You can't put data in an 'occupied' channel.

That's why we can write 'while(true)' loops without any problems.

The workers can't accomplish anything, before the scheduler receives the number of the task to dispatch.

The scheduler process and the worker process are synchronized.

Note that there is no global variables.


```js
const { go, put, take, sleep, chan } = cispy;

let random =  () => Math.floor(Math.random() * 1000 +  800)  

const schedchannel = chan()
const workerchannel =  chan()


function fetchWorker () {
  return  async () => {
    let req = await fetch("https://randomuser.me/api/")
    let resp = await req.json()
    let workerinfo = (resp.results[0])
    return {name : workerinfo.name.first, photo : workerinfo.picture.thumbnail }
  }
} 

function taskRunner () {
 return  async (p) =>  { 
    let delay = random(); 
    await sleep(random()); 
    return delay 
  }
}

const tasks = [
    {
      task: "init tasks",
      run : taskRunner(),
      worker: fetchWorker ()
    },
    {
      task : "assemble the product",
      run :  taskRunner(),
      worker :  fetchWorker ()
    }, 
    {
      task : "put the  product in box",
      run :  taskRunner(),
      "worker":  fetchWorker ()}, 
    { 
      task: "send the product",
      run :  taskRunner(),
      worker:  fetchWorker ()
    }
  ]

// Scheduler
go (async () => {
  let numproduct = 0
  while (true) {
    let numtask = await take(schedchannel)  
    let nexttask = (numtask % 3) + 1  
    if (nexttask == 1)  numproduct++  
    await put(workerchannel, { task : tasks[nexttask], numtask:nexttask, numproduct:numproduct }) 
  }
})

function reportTask (worker, task, numproduct, delay) {
   report.innerHTML = `
    <div class="item"><span class="title">Product :</span> ${numproduct}</div> 
    <div class="item"><span class="title">Worker :</span> <img src="${worker.photo}"  height="60px" />${worker.name}</div>
    <div class="item"><span class="title">Task :</span> ${task.task}</div>
    <div class="item"><span class="title">Delay :</span> ${delay}ms</div>`  
}

// Worker
go (async () => {
  while (true) {
    let taskpayload = await take(workerchannel)
    const {task, numtask, numproduct} = taskpayload
    let worker = await task.worker()
    let delay = await task.run()
    reportTask (worker, task, numproduct, delay)
    await put(schedchannel, numtask)
  }
})

function start () {
  put(schedchannel, 0)   
}

start ()
```

You can test the code here : [CSP-Demo](https://flems.io/#0=N4IgtglgJlA2CmIBcA2AjAOgEwBYA0IAzgMYBOA9rLMgNoAMeKAnFgLoEBmEChtoAdgEMwiJCAwALAC5hqBYuX5T4S5CAA8UCADcABISkBPBAF4AOiGUAPKQFpBsCAHN+SYiuWkLAPjP9duuoSWL7+ugDC5GBgAK78EMSCUhD8TroAyvAAjjEeEA66AAoU7oSEurYR6YV+6gD0waH1Wtqhfu38QQDMutAmAOSk8AAO5KRS-d4BtQ1doSAEhPAIxMmKvGIoSHQgAL54AsKi4gBWvPKKyqpiCvwGusC6TuR4usMxUq9SggDW8K+EBAjV7ECSCfy7XQmXTECCEYaGADcHQQUl0pHBUCiUICAAoAJRQqYAWSSEgwHFg5DGuNJUnJGP4WLABN0ACpdGg6NzdABqAIADm5hN0HVu9xIEngUFB4P4yxxsv4BL84rRAHcxn9SEr5bAcTCwcr8R0-Bw4qsIIpdBx4FJQQB1LXwUi6VnAPwBIZSGKkMKCQiGfjEN2EkxTD1hAKo9HZHGCdWCCBo232iS4izSKTDQhIOp1RnMmJLUgYER1QTDCB1CwmqO6GNDeHxxPJ2NZDBnRQq+sxzWkbUpDjkHG4pvDDBNmKwKSEeisOsBL1233+YBCES6JC6fuD-jDjAb+AUiCkAyvYYSchSEfb3cuofkDBV1a+4-0mJgABGQm4ul2nr-n4kIdOawZrP43yED8ABKcTyq67qet6q4BAGQYhriwxhlMDyir2dq6FAyyCIYOKFlEBKIvhS66AmSZooC8AjGOmKUfi+LUYBy4+n6REkWRgEAfwwmqusaJQT85TQjQ3EPHJASSduFgpG2kmEBYeAKeicRbroklwfwCEElp9YBPepDbqmjrOohi5LvscmRrRikBj8ekWAGSzfgg+lSm8FBQDEqyadppC6du+luYZxn4qZLk7rZek2naNkDi6oZyfsNFLs5LmSR5IDvBJ-kBeQQWrL0-hfuQVihWZOn+JFBnwS6JnaRYFkWJF1kSE66V2dlTk5bRSmikQKhQH58BlRVUj1Ql4VNa50ExW1cXaRZPWpX1SU9rRwkBKwHT5hkoLStOLp+M8brocGoZEvJYQxvwn7DIFwVotCdCAeqEjcDNuJSOF8CEnl0aEa9YAFdC9Fqb88C4pK0q6ssIpyS98A2DDbpQwVACkuhdIS-JoNM9YQBwuNY1IMPQmgIpQ+95Wfby-IjXRrZosVuIWajsCvI8BXbupNDytjbnsLoeNuUg4u025rxMx9qxy29KtorshJCcBdZmhaEGxqM4wACpuW6FlfIr0vqyzqyvMRsCkWD3FDMbUgYCkCEABIm8SAAyOIAAZyZoOgwk7ZTmCAybwGAPjqPC4IR150fJFICA+MUdtokg9RJ-wUwACTrrbc27M0OhTKHLQp1HKnKPHIDeInwzJ8QkeEGnyaZ83-Xalu+dt4XgQQGAaSEDq0clxZz5XjeAEgAEUrONI0coHQwx1UvdTeDPtmHkcFd1C0oS0WHegd6nDdxwnBd113Fjp733hm9Bg91AXxfAJJGCScfp8a7hyvvXGOjc77Dwft3DO8AfAABEBIfy-roEujtSK7DAIQSurQg7k1EvwU6-crqpBHLiO6mEcJPXMv9XyQMQYuwIhJNybdjDkEEFNWGXMop-F5rZfm9kAhqgeJJJWn4RE2zAMzcuOJJIsKpOwjGhELItgYlFaCGALL7SXDGNBZFOGqN-ktLRy53Zv3crwgaVtoKiMkRrB2AkBGc1UTzZGMojR6hsZJeywktagQNlafwBhBDjAenlFx503FymWK8OgIp8L4KCSEnspp+ApL8AsCaKwIIbBAHQbYtgmB5J2PsQ4Ig1AYGIGUDJtwrhSHKc-GaeV1TQHpNuLkm8rDIjCFoeETtDBIBSI4eUtgvxUmID8YCfhPaNyoboMAwSnApBGdeG8YBtxdA6V03YGSlhZICTkrYaA9jsBAEMqSfAQBHjULCeEhgMm+moGILMOY8x1DiMMH4TgKlRDqDchEAABLAGA6AYDQJ-HUFYqydnOJYQwwxjgkFIBAYYdSCBtzTPADYNBsW2DQAQOobJPQckiAiJFThpBumIISLAdA0AAHZbA0rQAKXQJsrzzPKAAeVpi6QgigiVEqKC6SAZQAm9HKFKIYX4yJOEZMoKArwOBDBmuQKmspSBOH+PpEc4IyLwrPNacgX5viqVSHRGE5AES6FVYK+kcJ9CqqkImIYdEmR0TKOQWESRpREU9Z+DwSQxVcB4G6ekM0LDpEdc62BIA4rav4gUFItr-KRo4E64JM1mn0nIB8WMBgkWWkUK8FIHcYhaDNVmq8ubHCQG+IbMN6JV6zm1YK4sWqFAIleGAcqlNDBdpdJqi8MRRlwgkA7OEwMIBfg+Fqwgw7HDuDuFqzEdQxj6GWPqDtEBMXWo4Mmmaqb01DFeJieN+ra1vF5eseNf1sQNsPdG8VNpVyjp9TeX1Dr4ocjnV+E48BKrvobcOKg5BmlmtuFobJSABX+A5GymaggaraBmh2wwZKKX8GvAkBDbq7XlHPXCQgYrMPJHcPoMEVBdBfhmiW2AZafUpDolQQVW6d1rp-UEpQ+R9Tu32bu6aGQo0ZowDB9krLvYAFEMicoAGImwdAAQRglJgAkukIoMFOUADUVNwIk3A8aCn1Nqc0roB0KmTbe05QAVRNmZpTMEFMADkTYAE1dCyd0M59zABpFTTm4GvAkwADUKMp9I6nOUwUFSp4khR-Yqf068fz4R-bWbgf5gA4roAAQrZ3QTnOV2YS8SCz+nWWcvE1JxTMFHMucS5FmTuhiQSZguEb2zmTYKZyyphLbnXgyYs05iTEXBUyai15ooSmTYqfCNZ-2SmijWZgoUTl6QpPOYM4Vpz-mZMwSyxJlrLmMC6H8wVyrEmtMSZcxkDr-tA6WY27ZqzMFIvRdgxETlhRXP7cy77XQVn-Z6de7lqTCXuv+yk+NmCXmnPudSwp2Lrw4EKeJApzLI2PMw6K5JmH4Oet9dc68B0knHvvbE2d5zXnwgzc5U5jzTXwh05No5mnrwTZRbsxNnHrXzPrdeEptTWXdB7c5cSV4NmudNYm-5wVTOnPDZpypunZmLPeyq9JuTNWpMTce7oaz62scebJ7oPTCmEtOcy8Z+nev0iyfk0piTInYM1lSf4AlhKPsKco6qgTNMXRCFgOEaoz7wJ8YzU8MkLofWSpw1NLG7sfUBnNbehAJ22X2to-R8oCgXXB5qB9sCha7g2jXfzcop7malCWIQV4060RtgcHyqqpbiLlGnRwW0Z4ATwq9fqbQDhci19dVND43BkxkSL9k537JBX-O7UFXyfzDBEtd2JO4aJHhcCsNKAEjhy1OAdhQYYVZUhBbi25-85FsgxFPIjfoGA6gL8uoQOoHeu+EH6Jxdf9xHhKi+GPPADmp8BHOQEsK8KlmtklqbhJjJgpvNnZpCNCEMDkHfriA-k-izDwL8u4ssF-l0kIo8MVApoGMGFbH8CQRhCejOIQJQWQW8B8OQVqt8H8JyqQGyhQOqNQbOHvsxMMK8DdEge2LfkMOgY-s-tgZap-t-sGOJHhLcFwIfhkBJibAAPqxYtYZYKYmwSavAtYRbo4SaqHtbObDb+yvDrZqEzYtaS5X7IE35oEYESGYonxwjornSkD4FihyFj6wDSTCGOHiFYEuG+HSFdJ+Ae6CrwYWoupHhJxkZxDESuh-QJASBMb6i+4NrzKMZT58ZNjQA0aQT+QKaFAqYnYSbIakCGB2pmqMZ4bSxHDxE0YaQfaCDEDV5Tq+TJ6CBzJxzUauiZH+TZH+BBzL64JGp-oAZggN7lAoEiG769CSJjDyqvBrptHV5J4V5PBUhfgFATH-oeyiYcj-JxFtxkbhBuEr4u4nRsie5iYKb+AugUCuhGhwApBpC5GKDp7-TlD2ptpTTvqvG+RYzuAop8b0icH+CMZV6Yo14j76SMiEAVS8rfEzQoR8QD50awIfa+7JwgkjCGxAkZT2pGAvgOCwB6q5qXA6qGhRKwDUSUx+5WCgmEmVjwryhTSVqMY9EwllDFoajcD6jUYMHzQfaAbTFlTV79DlDAHFS0lGTRLwmMkNr4lgnWhggn4qAMb+A9HAzghInBQuj8k7iClUYzRynikoa4H6g3iCopGggCZ6l3DImuj2pJDfARIz53HHGJBUC7HjK6CqkQTeyYgIBeAfb-JtwYhgAPCcq-oHGQhPGsr+RPFrr7FTFJA7jJ4QmgaQQjiJBtp+6kDPFmnvG6BElQBem6D-LolrhsiQgKa6CYm5B+SZnNKUbClynUnmr8wYBelr4EK3GCqNm+mwD+nuRLQ7hSg6nSyKAjJjI-Bln8zWr6qBrWgKCSKoiYqolNmD4zT0iZn1GfH+BDDuA6A7qZ7ERca+m2ojh-SZn2q1k+rSrmqjKeqLngbkkiz+TNkzTUZlksEqA2gUAxkNrLnDiug9FByAVByrGujQUgzjHwUcBN7wAhwfbETskH7WpFFWl0n6B1rFil6QW6BBzFRBwnYqZojyg+okaxi8Q6n8DVH-SpDUS6r0WoS-lPrOCYZDCVlHHVmjnjnSxfjhDknjlz5RnCAPD1m7lYm6ASbJiSoCZcWAX+BKp3r+T8xwVTl2jKVrp0U9FcWJjlBzrtGwnmhUCUmHHXFu6RFe4wjiVtETm6R-RAU9GYb8DznvllkODNqWouhrn+AbnDBbmEDfGBmqUSlHn+LWinnbrIa-EV7+DpmiliaVr6SahlT6rJCYrfkzRRWHn+R+UymrmGwhVbmclKVujwBKUZQNqqUIzqUgUCbLlJqtHcIqplUBI6UIW5BIWkUoV+FoVVTmrFSlWBUQRxoOCKBpAZVgXWm6UuoNoBUYiGxtE+jklXFiY3jkDuShVtHHjJn2rHnSzMRTR0W1murMXvFsVMUcUYl7ncUuBjDShelz5CXOVMazhiV+nOWSXBLSXABxmTFSCQhQBJA9HRFcVPlTQaWgXFU0ErmTUBJVmRmA0xnACyUQ3fAYBcXQ1PWDEoZRChV2g+qrVBWUVUwrXdXWgmXmqAVfA-FPoNVPUHkagBiCqjRNXAWaV4UKn6i4hrpBzAD-JnJzLBFuCXEAB+kB62cCAAPnLfprsLgsqVpYtfTR3GAT6pWsAealxf+akFzUuGpfiFTQJhTYbPTTyYwX5JnuUH1SNereabmsZdmTzaekHENUsGrdTRrfhSZSbYIlSEsFNNRhBfuRKVxQoNOOHfuU1WjVJZjc4VLbcjgXSbLdaeDZDRUotdEcuXTf9A6TTSjdaOzVmTniTZVXRKsG9avjcd6ZNqdRXU6YQBBZgkRJDfCYkNVHhSkG+iONeMpW3S6eFcdUleWaGc+WREsFJcoA2FOhiEipitRGGoKooBSVVNoJQMhiIEoPxvUY4F+MvWRG6VseKP6gMdTYiWPSdo2aPYaa6aZcoJqQCRIBQDEOSoGW0WkckJuEZXuYKiSTzfDT2dae9R9ibLfU-eULuFRmRGCNoGWQYCMKHsXuUBXRHj8JhuqP4MgzyRQDeAoALEqTMdNEsARWg8eZg9FQjNNIKjjbqSOMKW3R3ZsXRBqv6koOPdEQstw82paQifqWPdNJgssIlZwyqmGq6I-e4GeK2WiBHmGm7mJiFTrVNCkO+j0URqkL5HI0aVOakSzdOQ9RyaiZQ7+aZVWrABddeGaT2YoPIylVTD0W2tffbS0WJsfafdRCcMWNzF5AzTA-I-GqLeLancvtLUqArUqJCKevAJUTdWassJQ+2UKTNBWZA2Jv8p9QGQY+GTk8nQ8JEzLQU5CFYB3ZNgU-GrKHUczTUzeGjVdcAKU7ctLeU5NvKOqMI86U-bSaamkPUYoPuSOEHJU2MGABRQ3W7s4RgAnssf4XlM8PFCKas4zYBIBWwRwaBqsyVas0xMCIBP-ps4AcAas9reAYBMQaQcQOswjHQXc4BCVY8xc4oIoas9vtKDljEJ3i6FZBADvgqoBICNAO8T8385ZPoPvu8as1AMfqfk4BC13tuPC5aoi6s8rYFoBHpnAQgas4doUP1oBJYeocSJoSptoboYBPoekIYcYR1grhJuYSSyoaodYRJpLqZIBPZUuByLcY2UsGiL7r4RPug9ksRYlAOGWRleXhgEOVGHcQEHBszW6foPMpRtKd8EyMElND48EoYP0PxszCKvACMgGOTbTSXlgy6m2pZbpf4LuDK9VXK9xEqzk6SY0m0wiG8skLALLZcdZn64QIdMq9WSIN+C6JylTN64YAG7cm667gEKEcBF0iAOwDQHiiAAAITHm4j-BSD4geggCpUWAmAmCeu+4LPjCEAABktbFgpbIA5blbMbwRAA-HM9W7OBWwSNBiAMeWWxW3CkAVTMRFwPKPW+OwPRgMIFAO29O-KLiDQOwIW-202y2yO1W1YO7IQO292+Fcvr2-iEgMeEe1IASLsLzCkFiFwXm0W1daQCYMAPsE+GACYPwCYDQHmwW3gPwEWwPgMR+7iEwHFE+8qFgHFFACYKWDkPALkHgBADByeEC3gNoMh4S-1u+8qAAKzm09LuFjqGDAdoDEzPhEOeqUC15OAmDpCGDfiUAmRfi0f0c1SwAZggBYu1h4BPt0cMfscWC4vwH+wmy1iIinVWD5sPsrh+jZu4jZvwAK0K0Kc0CGCTgXTuBQALi7CnXqhSfAC1nAC-mnt4A1RWBIBOC7A6exU6m4gQB4CCB4C-v-tGfBLogmBYDqD8P72zgYAICpD0j1s73QC6B0DZvlvwD1v-AxAmBdBedcM+fhX+dOCBe1vBdTRhctvttSCoD4DEAmA4DxdOACNJcqApcSBBfkAheZcfvtuuBci4B4BdxQAmQcAmAtdxSwAmAMDDDdd4ASAmDZtoCIiGeapoiXPSgEgGcyf+ASD7BjdUa-Nd6TfScMXZvZsQDzeET-1AEfBTe1nrekD7DFRIA-t4CFvACUz5vlsmBfj4g5k9MSbFk0gWBiVGT2NylYs4XgN0lidXcSD4hXUewbm1omR6dDecSAfSw8eIhXcQD1sbcUjTiwBFvA9RCg+cQQW4hQ-kAmCSeCCqcYCoPDCsB2dOccSIg1cQDfJxBSD1u4ifvhXERwe5AEj4jhcmDaCIj4j8CzuWjIb1v3sGcfvfLRDJhURQ-wAmDU9DDdrIZUSkD1sshC+PtSdaxXucRXXkD1t4YVKh2IxxTg+xI6c0iIgM8mBM837wcG-s-ltc-4hXe88bXnmA8zf6Si8Y94Bjgi8g-i8cRK+4gq9u+kBq+G-yexKw8cC4gxDqDDDtuB8ngzhtQ-ureoTHhEmljO-IZax4C9exJIDDBsx4AcA09KDeAmBUoPcKXPch8WBOYjjdrLVGjjTfLBhJC4hPNLxYVlnjVSPpGgbk0zm6NOBL7Wm1ia9u8l8qAs+IzAAZ9ICfDGf-BmcWc5+vRUD7CAWnc2f6dQ+fD8Aw9w-1t0DqDU+x1KBFtnvo9+-ic0g4-S-qdy8G+IiI+WWwD09SAmAl-M+5Cs8cQc-29zeHsDPubSz6Rda2uIb3rz194Xt-etbZXjv1T58QQ+2bY3nFHx6E9iepPezh7F-JwDdeE3NniNzd56dyA+IE3iHzN6f9v+VvP-rb057c8ruQAyQNPVICgD+eoMWslAI95+98QAfIPgxXRDh9yBYfXAXuU4j-dXeggq-mL1gF4A9Od3SPtH3UCwB4+4VYNJ4ED479QY03aQXz2SDZ9Ou3XE9rACL6Hsc0ZfCvvdw-qgZq+zxDjvXwlpN9k4FgVvokAvad9L0TIACgjArwupySA-KaNaB0bvFR+v3WNBP0EHhVp+v-RGKDD-bI99gE3bfmHm7BFsru2bAHq51kZOc-2SggbqgMQ74gseBPNTlOBnDYDOIVPUvnTwgGf9LeM-NngAO54ewwBgvRAeuArY8DYBiISXg-1l7kB5enEfgPwI6FXVlQoMdXlRCx5UCLeGAH-tbyaF28Wh+g88vT0-Zo9ZBbPUYakONC6DUIyoO7lrFv6UDruNAxof-2WH4h0+rA1YQLwgGfsbhTIMMt0O2HwCtBuw-bm72VAQ91eVnazrsN0AxAvhggr8ACOLwwh8253P9kWw2EM9IhBwjnl+Ci6zsYA8IpzuCMNiEAGe5PbIfpB44mA0ARXErn5zK6pd0uoXDnvAH3ZIAYgxAwQeQCBjPt9ganYnsXx36fAdBwMQwPsL4j8BMBr9UnpyPIHuDQQ+nK6sQCBg8dyeVnOKIyM+BlDMU04T4Hmwu7cjeR-gfkYqLnQVCgYIopIGKJ0ESipRpAGUTnzBpQ82uQtc3i+zwBqdVIKojoVXye72CVI8QaivY0EAD5uAiGXuCILwCMiD+rI1+uyM+EFskBjxVES10LYYi5ROI7UcqNDHF5xRbveAGv0x42cGw+nM9vr0vbHgD2z7LFkgC-B4AhOCBJAKaJX5cE4QOWWqCkOTFGjUxKIszjd0s54AlQ9YiCFNz6En9vOHgUrgFwq5pcquGXDnn2J4bzh22442cPOG2DndCRxIxLqSMHGVdquY4hLv2MzasApxG4icWgFYBIBbRGwv+CEyNJPsKRdAG7vwHbYXi5YAYroRnz-ac8RxoXG7uQBvEvi8kLwXHh7HmRWA4Ep4IwPeIvFvj22KAHAEgBeCf9fxggKwAAEVYhCqT-iBKy4NcIJnI7rjd2pHr9YAJnKXhYChj9Eh2rbQMu2wgBSdT2SgxXrWwU7WDOCdgl7iAE5T8At67+aPFNHLyOV-AhZNhpM15RicrqggKEdiNIDtsQ+HAE9hwBhF4AhuAY87uQPO5nMPgnYgJLvzc6f8hJOEproHziioCERfEIVibCUkXsBBqEdjoW32DxCwa7Y-XkgFgBWckxXY5zgBzc7QdlQdKOKJ+2VCxI0OIvMzngGw6exCAtYqwASOgFGg7RIvMsSJ3E6ZjGRjYhisAAW5gCQRq4VAUkOv45dTJfENMVZ1OrkT-gbAvEZ-087TiBx5XVcaOPLZlSaAbAHccV0S61SDxR4kwMeGS70glBl48tv+2dE18OO3uZtKOV1rVVMMyNNavsjE7391uHsd6FaCRRASkO74ldipO7A6Csee-L9uwE-Z0BEQnQeAIiDZg9TnwxYdMP+xOHY83OT7M1sNxP6kBEQtgWwEVPv50hyQlIakCHxemTg2ILIfEGyDHC8gGYcUJDlIBoCkBWAiIEGWDIrY0ByAq7GGawGl67AgeV7f9g5057CDYpgI4ERdyupS9HOn7FPgZ1xCucsSJnfmAv3V4HBkpHA1KTlLxp7kMpsglaXsNxn0ysSg3PFCJF2C9C3O-wESOtLc75cdpxAdQPwAOm8gqUeI2vFJK67wAYZ7bYgAMhoDEBWA7AXrheP67PjquSgtrgpmLKkQgpesjEIYFxAo94+vXJGO11Nl4BIO+IecJrLnD7jc+x0i9mOmBHYQOISALCCYBR5-wEY0fLCBxACk6SH2xM4ziX1-LtjrSBfY4SfXgC-ArO2bZXnwNrbACAwnKPBtnByomyLA47QQMqNrD1tBAbM3IPT2Lm-kOZPHMOXuQX7zD4AKFRMeTMMBaxyBp1ISc5J-itSXZUowMRT1qEjDa2yoMQViVbmZjgR4Y4AFL3fD+z5RFPcAbUIvbHg8BuwfMTu0WbPsXmtzAZLnw+CPMkAjnQCnvJiA7yspHImERqLOo9Ns4prD4Q2KLZCT9+MohSVv1VERjL5RQECnCERiEzsZT8zfgjG2Y2D1QzMlMYIO6YfyogX82+V2P35Ftx5jk1SToNxAuixg5Ha8NeBHZBTs4N4T1tGyk51cF++IUPpTJKogKLuUPT9kSLKnLiKpw4tcdVN3Ezj9x9UkrluMPHczxh8AK+Z-KWDQLEF6QqUXzJEH7BDmwwEBS5NdDbTFx-YmheSM-HriGpm4ugNuJqnKLtg9Ig4VwogU3zCZG0kPpxEMnGS+FaQi+cD1zEKTUZv8yYQpOeAgK1pd-dSSYGoXtSx0XkrRUbNIi4giRUgbLrim2BgdCRI3dQFIBG5sweeoM3FAjJqlgyNFdMtkhSWx6fiYR-whBatPkl4jP2fHNjhx0w6uYxOp1fRRqOAAGBXqSAFdrnyq5KB-mDABbuf1gGmKfiRPG8EMFkUSBbAuvUYFoxdBbc0QccFFCbLfldSK2jSkpS0pcWWT+AM-OxajxGXNLjw7wQgOmEmF4AFhuQcRZdyj668+lRgKQQcJ5mugpeuvUZXLI6WVLPA4Mq6lgDZBsxTlXS0gOXyOVzLWlH-WZa9WGVwgmlr1IngukRi3KqlbA87o0s6X-LjBGI3PsxB+DrKgejS7ZYYAIWPLXqNAP5ecv2AaD-mhMgWbIz64bDGldSiGaLPFnkLLp7yhobEKoiIw2BOvGFZMrJVsD-hmIsVPFIkX6QYOCvGbklMIgXDTFPS-QBAAABeBvC+WmLwC1KLB9S6FR8pn41D9gAw5DFCrd668pVqyg3v8NXm7tn2uSu8VMtNFfMoA0yi+SDQOKztRULgXEIatWAVIhg3qa0fEOABv9DxY3eVYIMVWxCahDykZfytyk59gA7CPVUL0xWBknFjC8qfSHnHgKPFJs+IdtN2nqB9p-AMJSDP4BRLg1YscGQGqfY7TSAwS1paEt5DMqfxoM8GS6ut7zMaViwsgf8IUlosT87xfVVdXNWtCTVyoBtZavjnKAbVcUO1cjwdV2gnVaUtAJWoOC+r1lAavGcGtaVhr3F+syNZ5O64xq41Ca1NUGsUUTik150qHhmqCUewXFua-NdDJiXFrcgNQ4JR6oFVUrJVrqmIeWvIGyiRFMLVIHWrd4tqvIPFM1fGQtVkA21iMJlQcHtUcrT5nwiMUN0HU+qYAI6hxQcuXUkiXFk6nphGqk5Pidpe03aYuqTVQbGpa69NXOqzXbqyREgXdXiILUHrGlUqupTdyOWerz14VJVbQIN6AqL1Jaq9azwrW3qHJZ3WBZPPmZrya2JHUDqiu0HpLTqko5ztKJeD2dBAqPKoniJi5yyIApPCTe2JMAxAS5aY0UUsrfkTC4odAXYMpqxDyhsuHfE9tfK-nqc+UsAeXlSj-jTkxwAY8gWqvXl5sYgb8oXn0LwxoyypsSzUVouM28LVR58jdUptnYn4El-wCTZjIhFMrgAko00Y-LE1aRLkNMTSJMPyn6dot0Ig-nFqfhAKkt5AxkReOEVsad+Y6f4FACLbGKh5zKqXi10g5PjjwFwgkceFyX3isljHCNGyw0L6ZKWOhbjkhxa0CcQAtLeliYSZb+xuOggFjvxw46ksOWkubjjF2AC7E0w6QT1UgDQkrK3CBoiQMSD0rlRIJSQn2SZC7iyS2uQ3cLYbHY5FtCAWaMUULyu3JgxRumjbWmG23ZpStUWi1r0ArEzcLAiReuQPSgAWBwuJE7bWUEECapwg1pMifvMRCJBKGggL7YIMECIg85yohHZxXkVZdyA-bX7RO2lCA7h28KX3CDsIBg74AEOuklDsEBWc2e72yhljqur+r62hAJToH0G4MAL2Hs7mbDpoxIA+h4C4naTvJ0C1PNgZZ8MsUwCKARAoOzVCYH4KM7a2zOhWqzsKHzLliQKUYAYAF2apcQsScgTDo+3w6GdHQjgEzpZ0naGAhikQMASwh4Bdd-w06sMCm4nbLZek9dbzLnXc9ipIvZVVRCu6f9y2bAuOb8CUFyD4A5fZTZJByybbltAq-EEHp+CIh4AbMXYEds5nPLa2ko8geSALFRb3mzgfVQGobzcTrhLAwgBnP4BZyXQRgPUfTxiBIqEZJy9gLnKe2ggXtV4AHc2xbb098uF2jiPsAI6bb9VvPJjXELiiZ79gpLDrVoR0KQS8Ag2jHAy1MLMtt5022LJy1sz7zZRFSckkDB+IrKvFsSInnaBUzRBpQ+QZQApPY3MqCZYwhVT8Q14QypNXkpTjJh34WAJVGkWNASBZ0MBEmDgIhVlrhC1hdgam-To23fXzRO9JEsDLe3WEmAYDoGOzVxvVUiRUlEw9LcyvA5eKcAcokjnh0Q4kcUAnEezTxqv0XyQ+oMJTvFPklKdyJN6tA1CI40BaIOuB0sLqoIOlhQWB+NGaWGrUYsYupYJrfl28lxQu4xAPOuCGL4V8-4xkvAF13EMTdc+0hrFprPEPRSTYKykjnFHQ6VkbmVBd9pWUPm3NIplZTeVQRo66HGCzHQwwjDwBWB2ufs1guwSAXyCHD+zH4A4dEV4AJMDhlZibGA74Gn2JsVvh83y7BHJ95LTrVS00PBH59RhYbWYTwD+HwjbLGbbZifHKh6UxB5A+vKSlY7dCJ3Q-FvxLFbNnDnBJAKFNIVcFRFSAH4FHPBBIBa8O3YAqdxsk607JJ8vedoHO4PMt5YABzjQT3l9oFC+enVYC2+ZLd-mLwLg+C0mOWR7OfB2Y5C33l4Aix-BdQ0gDHSarj5ERillSzcBz6RsdLBfQkeX0KpV9NhDfRodCJyxCtYY9JSQZ7bsbz5QPUatSJbWLt4Ale8YJGuhEky1lB-FQFfV9HwAkAhQkY8VwxCjJQThQ9UPNJBNgntNJ7RvR+wxH8b7jYmsrboscUXiqRUXJTj9qZB-aOS+OkibshN0K7lgHAJTgga4KftX9uwtBTgswXxKkQBSxgzMo+WqE+gBbRpaoQ7jxzSAMmDYbsCfCW7du1A2-WAq0Uh9oBO+8U+c0+BlSx9CAYJEZKt0fAFJYp4-f8sxJf8pTminprKe31UAkYOpzwJiWhHKmbJgplTLqf-2vs9egp9UxKZMBPgBTwSO0xaYcD6mwxl-FEYQIUmlhmYzJ+FBgDiBDA2uwZijp63U5tcheMqpkxgrDMTdfTyYzk+FX5OqmhTcp0058F17cnStjplQBQCoBpmnJ6Sj0+wSMXHhCzCAF08ARUylanOGAOs-AAbMfAK2jpuICWcoBddCZVZjs4vNbPQB6zxkps3FFrOjn2zxkkwLikdOqEIz9chTBwLdN3CpeA57M0OfzYjm4AM5jU1IAnP7KWVU5vc0Ocp7qAK29PU82OYPNNmLedobc0L1rOKAhzKI1Qq+aMXPy+9iHLxQzADFH7Dzp+rQN6mjg47-tpJrdlTHJNM6qTgFk-SIBAvKAlOuJiLiiKFYIWz93qJTnhio3wXgL5+-4O6ezOYWkL+EkAOBZJM5sCdo7ddLAApPkmnTnpgi9hYVqoXWpAZkiyxeQsK1cLqc3FVxcQuEWtYJp8yXvvIlEHL9AmjjeVqhFvbc2O-A-kVJ+2UN80CQSA8ebi0Hy8Ax8-4Hc2llnaxU7HHQceD5S+h3AV4+thYDUvG0oDUF0XUw2P5YT5hudG9ljDwUST626YXkMeCYbfLsMCfFxX3od36dHYZNOiDQHgCsAGV6pfTn7vxAKm9uY6X-cQeGoZKnFkV8GY71R5s7H9PIhS4BrxFS9czY5ZymGtnYapCAiIO7WmCBitKi23O0Lqeyojx79dlDNAM1ZBnKLOIrVxq1gE6v2yQZ+4nq1aoT2NWugA15Redy3HTW2AI1+OQnpR0zhT2QW0KibJi03rL2E7LasAEd1WSOZ9K3nhhe4uKcldSHPFJ-zk7jaX2cUGLrzyxDEABGTnEwNdxbVjdsFyZ+ANG3rZvW7QH13BVH3-YpzTLj54yTSIy3RwYZEByUrCWOid7mRf8cgOkEnSpBRLDPNBdXnxDttCZlZeWEZPGSyWi26m9Xussd5i7NdsJUnQj155jx3Y6QMgMilnCVa2d5VyXZTc1Qi7eebN6XRuY6FS9gNf7cm1IC12IwLAoUEAISljSC3ubJOmXZyOp1Y3Wd1l4-SdaLgWBeQn0iiD9N5AWA1bCwJ3jAAqIeB-YE6LUqJINtQAjbSgE26g2MgWApdstmNHIZkkMw5Ys7BWKCCtsXtG2-AB26Ts0go8GDOg3nhruFvs3v5Pl+LZLZEFu2RbQuvUPH0tn87w78dtGGLvGAS7fb4d8s-wrn47mmGUlv08UvTtSB1dYBMOzzdD60irLJbfgFaqgCGAgkygJUJqjdFAjW13qCTAgB84cdEUjN2sPH3y66a-UPnLu3HA8BB3mVn-ZTZ+s7vd2PAvdhmyijE4exFA9dxu3Wn-RGgZdQvdTedwwBr345Ddpu1vfBAy6tJ4h2VWTpoTRi4on-HCUkNWuTQId3AW+1rH1WJXXZtumUS2eOtCXQLhMiwIO2oskTwB13cBQyeTFi2QAPlinoXo-ZTrjZZCcdS4txSzqkN2andfGrzWJrk1K6mcfGv3GJ7n2eTSFaFsqsUyRdBPOTa1IDF2cgZyels1WdIuEXZd5AjjpRbx12XCd0Fqkx+Oq5YTsuPxU9o0apMiC0bbm5UEQb-ZeLbZ6JhsekooXSip5ORnjS+0MuGopuVfcBSgtr4TQpAQ5qeuUDorUYgKnxjvaPMBF0Gf4QC9+bo446DnjJRj2cmiFMf+BzHwBtuXqI2Xm9y2n93ZQZNBsHmpREfJgZ+3LbkAlO2bf9rBYMfGSAnmoh83E4PNNcgnEpkJ5xHVHjCMnIBzbfpyyffC0bWkz4Mb1AMJSDhEjvfSU5vW7ACr6Zn+E-ujjAPN2PD9dMk4lPttP7e2sp7CLdO7AsnTTmzsRPsuOODzCsrc8ZIGS5ParRoxGQ-qh7Hz8u5S1PVIdxQaP-AF24pfWxiD08VnymlxQrMC23B3Bhm07nObxTiGXF9bR3cFczE3OfH2bQgMzaEko9qruV+B5c7w0QzPdWPGLncyWfgy2YHAYJdzx2e1s69HAVgJODiDTDzn84z54OJ00ftkeTXSua-J8dPty2oziUwk4jjOmjFhbJQd73LYQAonlKjPRM4PO4un22L85rS726Eusneo6Z4aMk08jH2RTlFxZJ6fkHKncIeSf8LV4xXZuHJmxx8rAi0PdewSY2V2dOodcX2x4PGwkA8PYmsV4a6dcg-wchq2lDMJQVQpQd4bihEG6WIEs6DOKvn2D+7mLEiXobNxa68QwstOlaKll8kuKGgA54IvyuSnRXUJOwj7ByQIZz69C5v2FXdeYEVawkuKeNLpXzsSyTIZgTRwT6oGEsElowBJv1QJYFm-mP4DodbRx4BZOh3KVLzeUASaOKm8qJEZ1gzIls4oHa4tnfVNtq4C6DrfHgnGVWmt53hbeP9Bh8ARt2ba7dX3vcsAPtwhGa4tm44yYLt+9BGCTQR3zbhVPMrdiTRmJ7gOd0+wXd+dTbo7nO6tIjErs43X4G9u8R3eaabH9EnR31IsC8lwqh77wbUWMf2M50J+ZYlw4Ulnt1Q0HbKakhAA1g9gTDiQFoCfaEztHWi+x1e5KCwk86gHp9HRSfeJ4LHcbz8G5BPe0z-A2m+RxWaJWSKwLRJ3HR3qB32W+t6zoQeU75Hts+tFIGkKDH7b-J-krg45+30mH39LungJIGMDljkfWOlAaZJNXY8WBaPscNamME0gOiKxHHApnUAdHcdieYnp+KeNICfxX63HcoTlz0cSeVPynjTtKFk+WB5PBYLTxY7Q41y1Pen38sAcT2qOe2u1ijiQ1zDkA7jCji7o8a7iEyruEaw2Rq9Bi4vcpQdh45Z5c-SXr9m0gkYUNx6ySkOF4vK3auNeOcZNNACj4J7Y9gyqIcnJ9mQkC3yw2e8wkZinPRuOuyEKm3SVICU688XFHPQl0+1d0sv1NwAMLwwCQ5pjtrVlBp+y5K-I9y2ym2skp068zctrKQHa1dzIFV9NuSM74Q58w+X9-PKHmZee60UmwR2YHkAHacxIhd3S2y+NG3mBifQ3ws5Lyol+hNVROM7gYAxh8QUYG8RWB5lLgYg7-mvJuILAEQYs8Fjn1Ta4mTKrkn-tTvaSpg8Svclj7gOxMVF8qBwP3iRDUh90xFK67EWdaOltcyobu--neuIdxggN156M03JLsx5sR-ImmjMTeI8bVHwzGAjBVXAqXtiPEPzIBw5WwMt2PUl5CJRGiDEI7oxWm9ueNVw0eR0SZdz5YDVj7Xkk-4QA2rM0Dq6zPlixd+uQtTiONYGRR9zeINi-jdyc1XUWu2lr91mIk05983J9GICig461kxOirmmCYDpSIherH2ulAv1ZWwKhfugAUCtbF-Dczf7VvJNzosCTRuorMkpTc4cm8m4QIgjiBG5NlublTo3wQc+cD+77+XIfkyFTuc-Ps+KhpbedSTsWKPHF7nuEPBtBjttv2O5oK05wPGRXzuq7K3zbLijjaur7AGLkNbTWZiWZvXxnh3zLDBIfg1PwVXvz-aibEOIu8Q3CcrCyX7FlAtn9dqWWc-0OhvmwLz8oZ5JP2cnS6z5PPFJLF3XProPeLr0JfWPzS0nlL4+04cZfTIuzmucy8B+9NJlw8Eb7QBYBTfo10P6hCQ7U9I54-z-kwFz5kIihNvpgJb5V1n+bAJgHDlf4Ws2+F-vb7n+AoP-7B6jVmgAQSS-uhyQBLZlICXiZ7Hk6A+M-gwBXSf8MLIfazKCtbTuMAQKAtmOAYSLP+xXgrQ4SETupwMUVBuQGrgVEH1YdWV3NAEecnMnRK2Cd0o-4ecOAGAFjWH2rgBo6dMhOyjo93rq59Wu-qzL8Biyl4oCg2-pQwPedkmQhSBM0FgAW+rviADu+yAJ743g3vpZL0ateNigr+sAcyg2yKABmxoAz-jbJ4oWADhyqy-vqALBaQfnvoh+RuoVZO8tgZH6140fmX77AWjFjpkGn-On60EnnljaF+UgAX5Fu7AFLwh8nwDVqf8cssooi65EmQasy+XjGLCqcsk7IewoLO4Bs8KSs8YucAWmr54YBJiWwQGwzq04wWlJvRYa8L+m-ogAH+rWAmQuPKWBDAmqAhBJehkDtzH8l5r9ZSA5et8ZGATmI0Rjg5tG5ZWAeCu-rwAzQbx6kAbQYAQ9abpvWyNB4wWbatBtPIARUS6nBMFCeUwSsEiAWshlzju3Gj2wQcPkmQILBGwcsFcYOwYL6pM+5FJphWC9KcFLBzStMEiA1XuKLrBjwWMDPBUvBeLjeqkgpi4idTk5JFsKljNBqWIUCADHm+lsXzO2-BGOj78JgC2qBunrJoa88YIGXqZyx+FXp9oaXuNpAOQztw60WfWpx78c7CkMEb+YwIUECe5IV4ALAuPMXLkIVFJMGUh-yAyHUhInk4qI2yNkiipAZsE4DMhN4FyHvEvIZpC4hRQaDQlBtFv8Eya7wS0FPB2wftKnU2gIwYd+T0m5xaWOlvOILySZp6yHe2rO4C+4cKjlx9on-C2qz27ajNIxmI7AErgKJsGOBKcK7PpKQQI5jm57UUvELS0OSHAfzjapojFzSygXj44xc5bCjwgej3Je4gAmWB8HP0TGOvaNQ8QLZYSCUfIGFsOPjllqcEQ7K1LMBPTCEpXU6QFtY0gxciICvatDvSEaoFbIiCe6FChyFhWTgN6hKCuQcSqnUvyv5rEqHsIl7NKYsGWA7aWnFRI3cksmTbVhoFlpKphoGOmG88hYe3rpCmyjx6bBVAX6DrCnYUWFjBDFJpBO8pYXcxNhqMsOHqgo4QuEThuLvhpjhXYWnDZa+thVY0cNoQt5hh0RG2FroWIDuh0UzMMgzEQ5qP0APcRrOOHlQwBldRzcT7CyAxa04Ul6C2CyAmHieJ4TdylgnrLi6Hhi4ZYAnhQEaWGZ8GqILYDhygMi5UA-XMeZPsiEU4Ai6okrwYjM8fPyIewKnv0EiACMqWCRyvPGL4ew8sP7Ceo8Wvr7UWIvB+FQA84SxHRw8sCuFnhVgshHLA4wYOEouAPBWJey0Ee3rHhaYaeELICDj0zze8KIt43hroCp4wenoilTFBUtvdZ8RNYahFaSAPCjIOcIEUVJXcmLiYAA8NSCkC5AuEVZxXcBEolrw2BYV2H4gxcksBKAHIaoTORGkmeGJ6w1L0BR8W4emH2Rr2pOHR8N3E85V8MXPwQlhOEcXID6aYBJjMkBJKpKRRdmsNRLhq4P5G7h5UEXKzs2vrr6pRfoCKFnhnEDFz0kv4ULSIc+kUoIESkzA4DphEEVaEBhVYQRFiKUkthE3cpkZcDmR+0oZzGc2ESsojM+8tl7ygVnH5Hw2dUfCi16sug5wZR0HCNFTRUkdhE3qd9sK5zIyoS5wFOiUp6z9svFBqwihGqCtajkUop96vBpHvwA-wI7P2wPcu0U4Cns9upmIDKL7KdROAU3MtFfgz0RJz6cskAlo2A4tpdELAeUd+5QuEFBJi-0slk5716KHidGeMzoTvQ8Iworeq6ccgcVIQyfJikAwxvNp8JKWRbI2Goe78j5rfy-oYCFioi8iqG2ak8iYAsgBPFFYOcMIpVGwREkVSJ-w9UVDwNeZ4U+L3+e5JzY12G7DRa+4A8pWQHRB-BYCqEqhHDCQGWNnjGmau9IjC88wsaLHm0KjP36o8HHJxELAhUrZpfep7t7Z0xI4arGiaMdhLFNgUsfCJWaKgIrGXcKmrQ4h8EAIXZ3ypiqBESRuQrj7CK8UoVF6RpouGLq8QPBWzZcJsegbUeKqstEt+OghtItedEYrIxB0VoiBkwjGGA7A8m2mHGtSW4nFBYAbxh-wnggeBSQJxcsmwD72ggGmgugWcTQBdAC4NoEnihgBJhKAK9OFRJBljhCISYaklioyCpNBBBKc6jh7CesHEdVGwAmkHcH7krMU3GogpbmDSnUtoVyKNK3IhXGTomKF+yhxnqP2wUA14BYC7AYQZR6kAwMWKJ1GeGHfaNKTYHaDCCy0ZyjeO8VkVb7qWVlHycCqYhI4gReIbsIShmRN-6FsQPEoIbchAP0FOYdVkFZBeuKM9bYxWMabyHSmDl84O8UfPzE76sCt54WxuDi2Yn+lcl1GXxFcuuGDR-Nr-ocKl8WL65ShnPLBIA6QHlKZiuYRGL-GoJncwn+iJlZwxAU4vTwKYU3k5peywUceBNBkYV8FOK7bFQkHspIYz6VgnPKi7WWxYFhTSgyNsEiQGUhjwnwgk0NKCuY26LYwB20cFjD-oY+LZZKGFgBVRk0HeprK2i13DdaFq03g0pwg+wOl7peXQf9Yjs0bCnJCSQkofEOhHEKYkc8fMWjaOc5LtdwKan-F+DahI7CYBqcSIW4mmhVqu2rxCuIF8ieJ8KF0Jqg4UKsBjAt3ObQhJn0OEmH4X4DQA0OXyARx9IpEeRYRhsoWMCQOEEJpDKacIGkmTBmSaW6Ey5Fs048xVMOAJX8G+KEnNKnmutxgOUvOWx8hCtBYB5JmwQUn8o8NvnZuEySUcBKcirkcA-mympT4qu2gm-ItqQrEYnwo0bO2xjJf1paGTJ58aZwnsO5sLGBuwsbdyIcbxizqyaCMs0mRhbSd+5Byi7ugodx3iV+p6iYKspoJgTPhDEEJssVzA3R+wJJzqgrifCiG8LyXLKwy2iR-r7Aymo8yMhmwfAY6WxqhhAQx6Wjxx7q4CnpxKhImmwKOh7drkl7JHIljZY6T4Ef6+xZsazIn++7CpqQSD8ZewKSknDGIgyNDrsnpJNIdNZQy+Qffr72AoSjY0cX7hYBQ2oNLoAtJSXnDY-JGAH8CN2KHvWEHKBIiuznShRNLCA8x0uIGgwuEepwVudGr-HRelAqWA7qU9shyjANziHqjU-7KzIVynIkgmwJN-nTIwJKug5LKaVjAiFJG7ySQ7iQVSex4aGu8QBq2xfukCpDA6HOzqNKYvs6kfK7kSSqtmHqXcy68+qRdaNKKEcVZcujSuxE2R30QsBSua4aXETxlcdujqCYwOvHpgEmLpKgwheqNRbxT8OmHA8YIKQAKYF7LEhTsfLk0YpyL8W-G4gvIOkE-KXinAKuB4MVSgiKGgesq+pIzLlaua48VUSTxVcfOCi8zcQEi0xv0c5aQRVfPm4aoIurrykAmJP3ot6EgHFEskASCAouc9qR8on+mYdLCYRJKsR5xC6SldTU8HcbNHU8UkUpYPxkrvTylgoaV9FCJrUVSgyS2bMPHGu0Eu2nlxsaduSoON0peYhKD0lh7WonqTGlTxc4MEEEG7ptXR2gfadZE1B1IJAZviZcWHHeeHHKoEgRT4NyJhx76Q6mJMzKuNqgJppi8BKJ8cZ6hzaDhgdHYZA7P15WUYcX9xR8ggNs5BRHSo6nqA7prhlUouMkLTb6aYGHEySoTpsqoZ2gHRnpxW1DBlMZT4E16ZxnqMlGUMV3BJo+ONGYkw8ZamvxmpizGbJn0RekivJpWGQk5ohhDEiZ6z0m9j5wmk2aLmhqa1qK6BCZK+LGgh6XGTxkmZcmdILMZVmSJn0qDnDlG2pE3rKkXS2Hrry-pVca0prOJ-B+z3StgLynucHmR2nPpc4GupGR0GZ6goZHyjgGFpB0aaJAOJGcJnEAhcvxYxZtGWwZJZhgDBmEaMHJwFWc2vBAIWA8eumGnWSiR1GvQMaFhIpyiGVUTIZV5qnKXmgmVllhx9PLjw4SkPG5yLS7bEBmbkIGYoDsKcQYzFBJ-wAemlhnwO+KuB00RxG2RpcWL7NZGcdln0RQkQQLAZ7atbGMyzcaCZkGYGQOkRcw2aDDDpnkYxElZ8Nu+AjshQWZGVZpWQdlCOHyuglnh88d9pnZt2VNkTpPppGk0cI6UUYhpR4f9GaQuvGL5u+TILWBbRXcTdmesOvC8r3ZRvjGJzcxfKpCLKBevek-pIWX+neZb6WWGfpQXsFlPpf6fXp1hvGaRmeo1WR-o9pW5OjbKJEEEBH5xpADBneG6InNxJCg+iz4h8G0rjmdpcaRjkXmWOe0o45j6ZzmYoBOWTZIZJORFyYGoPuTn9ZYsoxF7Za5pDkQCT7E+ALIDOUDY8cVnBpnyRVAPxGbom2nRA8okiGLH96mkd6gSJywH6rSWLxnfrLpJuahEsekwUgCHx8QiRFHAC-H+w0wYcbcbxaKseRq-Zr2tDnhUUkdelM57DlSlwghQdzFkmVJrBYVB3+grT7Jevtbmf6RCj+Y5BzKuhwQcNWthy4ggPsRzA+1oTrpxQNHKWD-4zHCXn68dhshzw+Whq4bI+nwB4Zo+thp6GzsNBN4Yi8ehmQT+GjeRQTGGXXD-CVguYH1occsQDODJglYHUDfAOYOZ5x+u1sijbZilnrFdqxPqh7XcJsmABN+VPjKl78Iuuvm9+zPiMmuZ5YQlbD+O5gQGP+k-jNB5Iovkb5YAeAC35nSfVnv5Mi8voWw3cVgLi6ROCtK9EAqWvuFC5RIAKdl4AF-tkZi+KAJwE2+WwNfk-+eAXpwbWNvnb70BR+hfycaDvjtLx6uqZGKIYf+VrGAFwBYAF5IbAWgWjWgAf1bKBqgbwGRiXvpexaBW8S3I2Ba1q4EOcwauQKOB9Tvm4uBwfswUa86ubnyCJyYPOl5smMSfGlSBriuJ0KVUra4TidUjVJsAc4p-xxc5rmIXsWNUsXEsKjUsXFziuPE9HxCSHE9GEuXjhGLpea+Rvkt+W+epI75HCfvlF2MwkP73aI-mfkPxF+U1ZQFJUnfmDBNvv1ZMC0QUgWv55bO-lXUr0WQKmc9DvW5OZHHLgW6ubASb5O+M0Bb4uFJgM-56cFWj1nbyhLo1Yf+hBeAUQBHVmQUg5agZfFUF9Br75POdBRH6cFWriwWT8HQvSEcF9gVwUmQMMohzRWAUgOjz5RdgFpPR+rlq7p6yhSmrMKNUvuL+K94qZZVpRPhCLiqvXp-zGFQya360+OQjLlu8u+Uz5mxNhcfl2Fp+Y6nc+NME4V5IV3EMpPgQVqzJYFOvjgWjWmkGgB4cFnmL6X+MRboD9W8RfgDkSZAjb4QSjvF3LuR5VpRE+81pPOJ+FUEWubDBeCqjJimoVAFYH8-5r-knFDjhVm5A5xcTBXF5-o77EF2RRQWi6Dviv6wF8koAETWmRbcUXFxYu4UQBWwLkUd6qJaZYaB1BbkK0FViWUV1FFRRgXisqkqjy0lUfvUVgcIiqCXOZiUX-Fs5vMrD7lKGkqIXlcGRog6eK3ir4odW8-oEo4au6vyKkANrtEpnxXijdwH+QyqV54a2frIX-s6etdwQA9soympUBWJ+D9EcNjdyIhcye+BI2dKWjagw9bHCAyYDoqPocQAarjx6lU1khzlKQsjDp0Z4slSjU8+XhHwBqXcDtJYI1PDuqEAYSniJtcepYQDgyymvl5PREkuQJQ8XXE9FxQefMR7pgRbF1IPSwwPWz1xKPMtHyuXAtBzTFzfrMVT2JMWJoWFe+SsWs+axTM6j+WxRP606l+WSXHpt+S35haj+V4XvFHgPQLv5KBUb5gF6BVjzRqnQPs4WuYSk+x16SasEVsCIupCX-5uBZBwQFp3DSC9ck5YOL3iO0uQDqAW5eVyIg5AGEpIcderDIM5OAv1xwpbAVyBuFrzhAEEFx6UQUABEAaQUWswOaSXqBlqJSXFF1gSyVuBXBawVdiRbKYa1FrJfSUmQMQP-LNRB+RtJdF0GnhqVSlIgwpauW4moWbigxWmWLlNALAB+yOYKwBKcjmkWwfGxJl8aYhPxtHxyGeFbXi56+4M4C+gCJrCbwm0JoiZGepMvu6dZroPlxplqLjtKnUhPsAA5ltgHWy1s9cfWkyppPu4m4g6+TMVmF8xZ37iaNZcsWs5uIEfns+9hZsXn5rZc4VoJN+W4VOaHhU-neF7kfiBv5SnEMp16uFZPmxl9Vsr58RC9JZXUVK8ccXLlZxQsAbIIBcOVZFH2lsBY8XcI5XWVULjBqVe5vHpLASi-k2W3lp5ThVOV8Xlx64VCkVv4v85vOl7U8R-vhw5eu0mzqORHIZHL1xqvp5U-+zKN5XtWUAZFX4A74AgEsZYolyABKoXl3LwBgAXb4MBBgS1XP+-AG15lm-QjNy0Gs4caAeFdAefFNlWAHihsCVfOQAIlP-rgAlVCgRBKiBiOemAjV8gXcUiBl8WIHpgV3h4WQFulVNV4BLflSgeFzVU+UzVRMC77vlKgXkXtlhRT77aBeANii3l+gXgEPexgaYEjVNspYHacNJayaMFIfoTEmK7BQwXlFJXOw7sO8QtLRyyVlQPlQugJZsr4gvSTFWBVoqemBEpPyUoCVgKfl+mPCCNVDUv8HVQrS4oHPEyI02RJiMGw1uXkdaglmQZ8D-mapenr1xXnqjWT5Q7vqoQ1TldebY1+FcF701P5vMgwVnwvpY8lbmTaByGJgE9EiF3RVc7iFyFZIUzi0hSmqyFPkr1zauT4uUoDc5StBw8VUvDtLwAsfOLKgwEgJlYoeOMlUVF2REQ3q265bA9IUm9cQqhHWoxZtbipLdCvlTF0lSYUVlxUlWXlRsXkpV9+KlWpUn5DAVpWNWeSFjxtc-BJ-w7SUgLrU3K+ILaH-p7AAbXBB15cen4ALfqVovFcsH2VKA94ql7ZVBBhrIMBeAeNr8i6-pMFJVD5Xv5peMXMXLpVSCZN4O+oAegVXcRqXuRv5uLq9GB2S5VrGMRhVZ-wXFJ1fiWVev+selcgA9UdXXFHAbcU0o2AZsU0ocAVVWgGkgTnX1eDVRgHSBZVQQGNcDARYE8cnVV1wchXXgrTFyXAstWKBe-tvV0otmsN6TV8hc+XgBH2hsjtl61fd4eSNvl0Ai+a1QtX3eOBm-X3FO1fIX4AenALDiG31RrJKhQNstVdAZVa6knVXQMSXnV5BV+WaBVJXvrYoT1QwCNcXQDnG1SOHHgA2yl9e-VWBpRd9VA1iXJUVh+Tov+VMFEFZ1zZBluYFlYGWAID7tZ39UDLAcFgdkYFihMqryUGCtEyq0GlJWQZx+rnlHx+BmfhxCuZG0gwBuKcGp571W+Km1JfOUgGEpm1iccEGc2dDfcZOeU3iI24gpdZsGjUDalJyFBTKQcReYwaqaXls5pccmYKtKdyFfIB0V55XU7nvDRCuvnto1cNTorY4XhckWGHLeDgKt4G5KKPGjwg9drt62A+3r5ApAR3jGj0GaeXiJuSOedobAcIPlgY+S77CXkRSxHBBGyGxeXrww+ZeRgDV5mRugLt5jBOqAi8JVMR5BxEYgaXQ2TmMaUugljQiEQG7yZyHWljjSnL2ljpWrwz5xEDVAWgbRcmK6W53gFrAAqpgfhgmF1hiDj4D6oUJ-iCCH0hzivdO4C4SP0q+wmALfoWw0iDAPlxbNWNjlwFsLTaDTGqRGKaqmiuIPs3wqcNQrQ3WqLiyBBFbXLhrsIsLF1ztxMzUMiH4vXDBL-iAkJrJxxwYMsDY+K+RF64glZLJWZibfnT5KWckopXK+lhXWWD+DZRz4OFPPtpX8+5MSZCfsP0gSJfgb9e2Vi+uDXpw0Ax8o-ISAC4Db67+4mVnUTZuVXuRe8SHMXL8IbUbi5PRTzqEXYF4RW5V4AXQJIE31hIkiUvlmAYNV2cHPE5pDlP-hsj5Zg3jdx3cV1Gy2Tm2UZy3FZ3Lby291hIn-54lVLRRldCzRowQu116dmyUZtbCfx5lDwlJUeyMkhJIStJUtEXX+4mfXU35k9df7xFWALfmScteM8V9W-VmwEWBJ1TwFK5Hhbv6+tjdciXcBFvu-yK5bpqfXj1RvnA2wNuxZsqYts6ji2RtpAEiIQJYvl0C4NHreCn8t8bbcXZtFYrdxv1WwGwFdAsDXb4klHvgUUUlRRdoF-lJDXSXA1DJULwHpYFQBU0NTXJvw2CtMAgAgKjnB3JjNEzbWqFCepLM3XR4JuCCrNSAOs33iVzaCYMAMXFc2HN84i95nNyoBc1XNrgIWytxOfPlwPNohl0IjtZ+E80niSYJ80i1ALas3AthhaC3gt5ZXJX4iMLdWXwttZX7W2FjZai3bF6LZb44tn7Hi2P5DxfILLs2lrAAUtjVq8VR8LMR8VPs7MViRe8rpRIYC0plUGGsthmhy1QlKrQtaaQOABHw3lNxWG3tWnhVHzkAY4o62Std9T8C7ARkbK3od16V3VctOHQsB4d6rWgAjlRHcL5bATAsDIyGVLizou1TmrpJPONrR5x2tC1jR3QdFHSVLOtEna63utHfHm3etwAVNWatnHXcUQSFJubwLlwgSp0lSobUK3SBFvlp2fsOndwGxtkrQZ331lDI-VXcFJvwAZtXsSbJOaLZlm34AknHcxnS5beJ3WdM0FA2Z1JYuW1WdXATZ0W+n-D9Jv1FnSVInVeHW4AINl1Ug0-lDbcQ0dt1DS21AVTJebFNt4FS20mQxAP8LsA7pjBwAWn7vQ1FsT4NQa7tCtCRW46vQb8afAk8lDCBULFYUKOqIkFqaTgNycWycO+HqUkZA8VfWwUedjUKFg6P1q02fGdXVCJDdVpfY28hBwMZwWAxIMERLxcUDV0D0k3f8BCxqhJihLdi+E7aEJpCR12SmnwsKI+OaALWyxxbpnqJxQAoBd24uISldw4AF3VzFqRLTrRYLyOvK2bbdhALt2XQ93ceafspydaodZSgk+Cymq3eN2kVk3YLEgAS1kImNdwJi10MAxnGDTJxz3Q2xEAdKZBatOhbOmrpp+IE+AtcMLdw0KqmVrsBpuN7AzwousKRo0AWIbrbEbS5SV907dHbGr6+W9cvnIzguwH2o5SqCQyLzCUop5AA5S0QBa48CQU+qtNgSTcLohFeuRVGANpQK4AWvXNA50OYpiYB8tp1JFpGRmVtS6ZW-nseaf8pAIbWXcJnLhKySbCS+x89Bwnr0HRHsAezQidvQcGetd9n5ws2jvbuy7ASjkdycQ6bHgA4cKAHSgr+GyBvB4BDAMoonIuyAcT7IagHkjB9dAAKDHIBAFchiA+eBECXEFQGYi8AuwEAA)