Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. ioBroker Allgemein
  4. Javascript Schedule Start-End wann ist der letzte Lauf

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    17
    1
    4.0k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    1.2k

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.5k

Javascript Schedule Start-End wann ist der letzte Lauf

Geplant Angeheftet Gesperrt Verschoben ioBroker Allgemein
15 Beiträge 4 Kommentatoren 732 Aufrufe 2 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • T Offline
    T Offline
    trojanhector
    schrieb am zuletzt editiert von
    #3

    Ich habe jetzt mal versucht, die Zeit "19:00" und "19:30" in Sekunden und auch in Millisekunden umzuwandeln und diese Werte in dem Skript aus dem Link eingetragen. Beim Speichern wird zwar kein Fehler angezeigt, das Skript wird aber auch nicht ausgeführt. Mit der funktion new date geht es natürlich. Aber da ist dann halt auch der Datumsteil dabei, was für heute okay ist, aber nicht mehr für morgen.
    Und in der schedule function des Javascript Adapters schaffe ich es nicht das Event nextInvocation abzufangen.

    OliverIOO HomoranH 2 Antworten Letzte Antwort
    0
    • T trojanhector

      Ich habe jetzt mal versucht, die Zeit "19:00" und "19:30" in Sekunden und auch in Millisekunden umzuwandeln und diese Werte in dem Skript aus dem Link eingetragen. Beim Speichern wird zwar kein Fehler angezeigt, das Skript wird aber auch nicht ausgeführt. Mit der funktion new date geht es natürlich. Aber da ist dann halt auch der Datumsteil dabei, was für heute okay ist, aber nicht mehr für morgen.
      Und in der schedule function des Javascript Adapters schaffe ich es nicht das Event nextInvocation abzufangen.

      OliverIOO Offline
      OliverIOO Offline
      OliverIO
      schrieb am zuletzt editiert von
      #4

      @trojanhector

      Zeige mal das was du da wie geschrieben hast.
      Das Beispiel im link zeigt was zu einem extra Node Modul, was so direkt mit iobroker Nix zu tun hat.
      Mn kann die Bibliothek zwar verwenden, muss dieses aber nochmal extra registrieren
      Welches schedule meinst du da genau?

      Meine Adapter und Widgets
      TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
      Links im Profil

      paul53P 1 Antwort Letzte Antwort
      0
      • T trojanhector

        Ich habe jetzt mal versucht, die Zeit "19:00" und "19:30" in Sekunden und auch in Millisekunden umzuwandeln und diese Werte in dem Skript aus dem Link eingetragen. Beim Speichern wird zwar kein Fehler angezeigt, das Skript wird aber auch nicht ausgeführt. Mit der funktion new date geht es natürlich. Aber da ist dann halt auch der Datumsteil dabei, was für heute okay ist, aber nicht mehr für morgen.
        Und in der schedule function des Javascript Adapters schaffe ich es nicht das Event nextInvocation abzufangen.

        HomoranH Nicht stören
        HomoranH Nicht stören
        Homoran
        Global Moderator Administrators
        schrieb am zuletzt editiert von Homoran
        #5

        @trojanhector sagte in Javascript Schedule Start-End wann ist der letzte Lauf:

        aber auch nicht ausgeführt.

        Natürlich nicht!

        @trojanhector sagte in Javascript Schedule Start-End wann ist der letzte Lauf:

        da ist dann halt auch der Datumsteil dabei,

        und den braucht ein Unix Timestamp!

        @trojanhector sagte in Javascript Schedule Start-End wann ist der letzte Lauf:

        aber nicht mehr für morgen.

        warum nicht?

        Nimm den Timestamp des jeweiligen Tages um 00:00 und rechne

        @trojanhector sagte in Javascript Schedule Start-End wann ist der letzte Lauf:

        die Zeit "19:00" und "19:30" in Sekunden und auch in Millisekunden umzuwandeln

        hinzu

        PS Solange du nicht zeigst, was du da genau tust, wird dir such niemand spezifisch helfen können

        kein Support per PN! - Fragen im Forum stellen - es gibt fast nichts, was nicht auch für andere interessant ist.

        Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

        der Installationsfixer: curl -fsL https://iobroker.net/fix.sh | bash -

        T 1 Antwort Letzte Antwort
        0
        • OliverIOO OliverIO

          @trojanhector

          Zeige mal das was du da wie geschrieben hast.
          Das Beispiel im link zeigt was zu einem extra Node Modul, was so direkt mit iobroker Nix zu tun hat.
          Mn kann die Bibliothek zwar verwenden, muss dieses aber nochmal extra registrieren
          Welches schedule meinst du da genau?

          paul53P Offline
          paul53P Offline
          paul53
          schrieb am zuletzt editiert von
          #6

          @oliverio sagte: zu einem extra Node Modul, was so direkt mit iobroker Nix zu tun hat.

          Das Modul "node-schedule" ist Teil des Javascript-Adapters.

          Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
          Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

          OliverIOO 1 Antwort Letzte Antwort
          0
          • paul53P paul53

            @oliverio sagte: zu einem extra Node Modul, was so direkt mit iobroker Nix zu tun hat.

            Das Modul "node-schedule" ist Teil des Javascript-Adapters.

            OliverIOO Offline
            OliverIOO Offline
            OliverIO
            schrieb am zuletzt editiert von OliverIO
            #7

            @paul53
            W
            Das wusste ich tatsächlich nicht, aber so wie es dort beschrieben wird kann man es im iobroker nicht verwenden.

            https://github.com/ioBroker/ioBroker.javascript/blob/dcc86d319d6e9b5a5e2f0ae6c93c9e7814df35f3/docs/en/javascript.md#time-schedule

            aber das werden wir erst sehen wenn er seinen Code zeigt.

            Meine Adapter und Widgets
            TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
            Links im Profil

            1 Antwort Letzte Antwort
            0
            • HomoranH Homoran

              @trojanhector sagte in Javascript Schedule Start-End wann ist der letzte Lauf:

              aber auch nicht ausgeführt.

              Natürlich nicht!

              @trojanhector sagte in Javascript Schedule Start-End wann ist der letzte Lauf:

              da ist dann halt auch der Datumsteil dabei,

              und den braucht ein Unix Timestamp!

              @trojanhector sagte in Javascript Schedule Start-End wann ist der letzte Lauf:

              aber nicht mehr für morgen.

              warum nicht?

              Nimm den Timestamp des jeweiligen Tages um 00:00 und rechne

              @trojanhector sagte in Javascript Schedule Start-End wann ist der letzte Lauf:

              die Zeit "19:00" und "19:30" in Sekunden und auch in Millisekunden umzuwandeln

              hinzu

              PS Solange du nicht zeigst, was du da genau tust, wird dir such niemand spezifisch helfen können

              T Offline
              T Offline
              trojanhector
              schrieb am zuletzt editiert von
              #8

              @homoran
              Hier ist soweit mein Code, angelehnt an das Beispiel aus dem Netz.

              const schedule = require('node-schedule');
              const EventEmitter = require('events');
              class Ee extends EventEmitter {}
              
              const jobStatus = new Ee();
              
              jobStatus.on('finished', () => {
                  console.log('JOB FINISHED');
                  job.cancel();
              
                  // Preform your DB Operations here (in your case: delete job from database)
              
              });
              
              function calcSecondsFromTime(time){
                  //console.log("Time: " + time);
                  var array = time.split(":");
                  var seconds = 0; 
                  if(typeof(array[2] = "undefined")){
                      seconds = (parseInt(array[0], 10) * 60 * 60) + (parseInt(array[1], 10) * 60);        
                  } else {
                      seconds = (parseInt(array[0], 10) * 60 * 60) + (parseInt(array[1], 10) * 60) + parseInt(array[2], 10); 
                  }
                  //console.log("Array: "+ array.length +" Seconds: " + seconds);
                  //console.log(array[0] +" -- " + array[1] +" -- " + array[2] +" -- " );
                  return seconds;
              } 
              
              //So funktioniert das nicht.
              const strStart = "20:10"
              const strEnd = "21:15"
              const startTime = calcSecondsFromTime(strStart);
              const endTime = calcSecondsFromTime(strEnd);
              log("StartTime: " + startTime,"info");
              log("EndTime: " + endTime, "info");
              
              /*
              //So funktioniert das.
              const startTime = new Date(Date.now() + 5000);
              const endTime = new Date(startTime.getTime() + 5000);
              */
              
              const job = schedule.scheduleJob({ start: startTime, end: endTime, rule: '*/1 * * * * *' }, function(){
              
                  console.log('Time for tea!');
                          if (this.nextInvocation() === null) {
                        //here you can code whatever you need to do in the last invocation
                  jobStatus.emit('finished'); // Emit your job done emitter when you are done.            
                      }
              
              });
              

              Das mit dem jeweiligen Timestamp um Mitternacht setzt immer eine Bearbeitung voraus. Mein Ziel ist es aber einmal Start und Ende als hh:mm anzugeben und dann nicht mehr.

              Wenn ich in Blockly den Wizard vom kleinen Cron Bauteil nehme, kann ich da Start und Endzeit eingeben.
              Dann kommt als JS sowas raus:
              '{"time":{"start":"08:00","end":"20:00","mode":"minutes","interval":2},"period":{"days":1}}'
              Und das habe ich mit den Werten aus den Objekten nachgebaut und es funktioniert.

              Hier ist mein Ansatz als Blockly. Den Teil mit nextInvocation ist in der function createSchedule als Block auskommentiert, da er Fehler schmeißt und den Adapter zum Neustart zwingt.

              var cronConditions, modus, conditions, rootdp, ObjectID, var_CronConditions, dp, var_Raum, schedule1;
              
              // Beschreibe diese Funktion …
              async function getSchedule() {
                  const list = getSchedules(false);
                  list.forEach(schedule => log(JSON.stringify(schedule)));
              }
              
              // Beschreibe diese Funktion …
              async function createSchedule(cronConditions) {
                  let testSched = null;
                  const EventEmitter = require('events');
                  class Ee extends EventEmitter {}
                  
                  const jobStatus = new Ee();
                  //log("cronConditions: " + cronConditions,"info");
                  
                  jobStatus.on('finished', () => {
                      console.log('JOB FINISHED');
                      job.cancel();
                       // Preform your DB Operations here (in your case: delete job from database)
                  
                  });
                     
                  (() => { if (testSched) { clearSchedule(testSched); testSched = null; }})();
                  //log("TestSchedCond: " + cronConditions,"warn");
                    console.info('Hier wird der TESTScheduler gesetzt');
                    (() => { if (testSched) { clearSchedule(testSched); testSched = null; }})();
                  
                    testSched = schedule((await buildCronRule('time', cronConditions)), function() {
                      console.info('Hier läuft der TESTTrigger');
                      /*
                      if (this.nextInvocation() === null) {
                              //here you can code whatever you need to do in the last invocation
                          jobStatus.emit('finished'); // Emit your job done emitter when you are done.            
                              }
                              */
                    });
                   
                  
              
              }
              
              // Beschreibe diese Funktion …
              async function buildCronRule(modus, conditions) {
                  let result = "";
                  let resultStart = "";
                  let ovalPeriod = "";
                  
                  conditions.forEach(function (line,index, array) {
                  
                      /*
                          '{"time":{"start":"08:00","end":"20:00","mode":"minutes","interval":2},"period":{"days":1}}'
                      */
                      let okey = Object.keys(line);
                      let oval = line[okey];
                      okey = okey.toString().replace(/\s+/g, '');
                     
                      //log(okey,"info");
                          if(okey == "period"){
                              okey = stringQuote({strVariable: okey});
                              //log("okey is: ","info");
                              ovalPeriod = ovalPeriod.concat(okey,":", oval);
                          } else if(okey != "period") {
                          okey = stringQuote({strVariable: okey});    
                          if(typeof oval == "string"){
                              oval = stringQuote({strVariable: oval});
                          }
                          //log(okey,"warn");
                          //log("Val: " + oval + " | typeof: "+ typeof oval,"info");
                          if(index === array.length -1){
                          result =result.concat(okey,":", oval); 
                          } else {
                          result =result.concat(okey,":", oval,",");        
                          }
                  
                          }
                  
                  
                  
                  });
                  
                  result = stringQuote({strVariable: result,strQuote: "{}", boolSplitQuote: true});
                  //log(ovalPeriod,"warn");
                  
                  switch(modus){
                      case "time":
                          resultStart = "time";
                  
                      default:
                          resultStart = "time";
                  }
                  resultStart = stringQuote({strVariable: resultStart});
                  resultStart = "".concat(resultStart,":") ;
                  
                  
                  result = "".concat(resultStart, result,",", ovalPeriod);
                  
                  result = stringQuote({strVariable:result,strQuote:"{}",boolSplitQuote: true }) ;
                  //log(result,"warn");
                  
                  
                  return result;
              }
              
              // Beschreibe diese Funktion …
              async function getCronConditions(rootdp) {
                  let result = [];
                  log("getCronConds","warn");
                  const dps = $(rootdp).toArray();
                  log(dps);
                  dps.forEach((id) => {
                      const dpval = getState(id).val;
                      const dp = splittVariable(id,"last",".");
                      let obj = {};
                      obj[dp] = dpval;
                      result.push(obj);
                  });
                      //log(result,"warn");
                  return result;
              }
              
              // Beschreibe diese Funktion …
              async function gl_leseRaum(ObjectID) {
                  let room = leseRaum(ObjectID);
                  return room;
              }
              
              // Beschreibe diese Funktion …
              async function runTest(dp) {
                console.info('Hier wird der Scheduler gesetzt');
                (() => { if (schedule1) { clearSchedule(schedule1); schedule1 = null; }})();
                schedule1 = schedule((await buildCronRule('time', var_CronConditions)), async () => {
                  console.info('Hier läuft der Trigger');
                });
                await getSchedule();
              }
              
              
              var_CronConditions = await getCronConditions('0_userdata.0.Rolladen.Allgemein.Schatten.cronConditions.*');
              console.info((await buildCronRule('time', var_CronConditions)));
              console.info(var_CronConditions);
              await createSchedule(var_CronConditions);
              await getSchedule();
              on({ id: [].concat(Array.prototype.slice.apply($('state[state.id=0_userdata.0.Rolladen.Allgemein.Schatten.cronConditions.*]'))), change: 'any' }, async (obj) => {
                let value = obj.state.val;
                let oldValue = obj.oldState.val;
                var_CronConditions = await getCronConditions('0_userdata.0.Rolladen.Allgemein.Schatten.cronConditions.*');
                await runTest(var_CronConditions);
              });
              
              //JTNDeG1sJTIweG1sbnMlM0QlMjJodHRwcyUzQSUyRiUyRmRldmVsb3BlcnMuZ29vZ2xlLmNvbSUyRmJsb2NrbHklMkZ4bWwlMjIlM0UlM0N2YXJpYWJsZXMlM0UlM0N2YXJpYWJsZSUyMGlkJTNEJTIyYyU1QiUzQVd3aiU3QnNpd3JOJTJGRiU1RSglNjBoTHclMjIlM0Vjcm9uQ29uZGl0aW9ucyUzQyUyRnZhcmlhYmxlJTNFJTNDdmFyaWFibGUlMjBpZCUzRCUyMlVRaCUyNVMhJTVERyU3Qig4UUU3YW9SRkNvJTIyJTNFbW9kdXMlM0MlMkZ2YXJpYWJsZSUzRSUzQ3ZhcmlhYmxlJTIwaWQlM0QlMjJtUnhrcSklNUQxMUclMkYqVlglNDBxdkxkRCUyMiUzRWNvbmRpdGlvbnMlM0MlMkZ2YXJpYWJsZSUzRSUzQ3ZhcmlhYmxlJTIwaWQlM0QlMjJvNk51LUZjQnZEMyUyNHIlMkYlN0QuanElNjAqJTIyJTNFcm9vdGRwJTNDJTJGdmFyaWFibGUlM0UlM0N2YXJpYWJsZSUyMGlkJTNEJTIyTSU2MGZyOS1hRyUzQVMlMkNLcSh4JTVFYTkoLiUyMiUzRU9iamVjdElEJTNDJTJGdmFyaWFibGUlM0UlM0N2YXJpYWJsZSUyMGlkJTNEJTIyLmg2WFclMjVxX1lDJTNEaDJhXy14TDlTJTIyJTNFdmFyX0Nyb25Db25kaXRpb25zJTNDJTJGdmFyaWFibGUlM0UlM0N2YXJpYWJsZSUyMGlkJTNEJTIyNVElMkNXQkYlNUJtJTIzJTJGSCUyQ2tPIXglN0M4NCU1RCUyMiUzRWRwJTNDJTJGdmFyaWFibGUlM0UlM0N2YXJpYWJsZSUyMGlkJTNEJTIyQSUyNHpKJTNELm9hLkslN0MlMkM4MCUzRFclMjRTJTQwRyUyMiUzRXZhcl9SYXVtJTNDJTJGdmFyaWFibGUlM0UlM0N2YXJpYWJsZSUyMHR5cGUlM0QlMjJjcm9uJTIyJTIwaWQlM0QlMjJzY2hlZHVsZTElMjIlM0VzY2hlZHVsZTElM0MlMkZ2YXJpYWJsZSUzRSUzQyUyRnZhcmlhYmxlcyUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnByb2NlZHVyZXNfZGVmY3VzdG9tbm9yZXR1cm4lMjIlMjBpZCUzRCUyMkZiKE9oV3BGJTdEbmMlM0ZHZDB0ODIlMjQpJTIyJTIweCUzRCUyMjYzJTIyJTIweSUzRCUyMjM4JTIyJTNFJTNDbXV0YXRpb24lMjBzdGF0ZW1lbnRzJTNEJTIyZmFsc2UlMjIlM0UlM0MlMkZtdXRhdGlvbiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMk5BTUUlMjIlM0VnZXRTY2hlZHVsZSUzQyUyRmZpZWxkJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyU0NSSVBUJTIyJTNFWTI5dWMzUWdiR2x6ZENBOUlHZGxkRk5qYUdWa2RXeGxjeWhtWVd4elpTazdEUXBzYVhOMExtWnZja1ZoWTJnb2MyTm9aV1IxYkdVZ1BUNGdiRzluS0VwVFQwNHVjM1J5YVc1bmFXWjVLSE5qYUdWa2RXeGxLU2twT3clM0QlM0QlM0MlMkZmaWVsZCUzRSUzQ2NvbW1lbnQlMjBwaW5uZWQlM0QlMjJmYWxzZSUyMiUyMGglM0QlMjI4MCUyMiUyMHclM0QlMjIxNjAlMjIlM0VCZXNjaHJlaWJlJTIwZGllc2UlMjBGdW5rdGlvbiUyMCVFMiU4MCVBNiUzQyUyRmNvbW1lbnQlM0UlM0MlMkZibG9jayUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnByb2NlZHVyZXNfZGVmY3VzdG9tbm9yZXR1cm4lMjIlMjBpZCUzRCUyMnIlNUV0KWQhLlQlNURtJTJCR1hoMCUyNTlYUUklMjIlMjB4JTNEJTIyNjMlMjIlMjB5JTNEJTIyNjMlMjIlM0UlM0NtdXRhdGlvbiUyMHN0YXRlbWVudHMlM0QlMjJmYWxzZSUyMiUzRSUzQ2FyZyUyMG5hbWUlM0QlMjJjcm9uQ29uZGl0aW9ucyUyMiUyMHZhcmlkJTNEJTIyYyU1QiUzQVd3aiU3QnNpd3JOJTJGRiU1RSglNjBoTHclMjIlM0UlM0MlMkZhcmclM0UlM0MlMkZtdXRhdGlvbiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMk5BTUUlMjIlM0VjcmVhdGVTY2hlZHVsZSUzQyUyRmZpZWxkJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyU0NSSVBUJTIyJTNFYkdWMElIUmxjM1JUWTJobFpDQTlJRzUxYkd3N0RRcGpiMjV6ZENCRmRtVnVkRVZ0YVhSMFpYSWdQU0J5WlhGMWFYSmxLQ2RsZG1WdWRITW5LVHNOQ21Oc1lYTnpJRVZsSUdWNGRHVnVaSE1nUlhabGJuUkZiV2wwZEdWeUlIdDlEUW9OQ21OdmJuTjBJR3B2WWxOMFlYUjFjeUE5SUc1bGR5QkZaU2dwT3cwS0x5OXNiMmNvSW1OeWIyNURiMjVrYVhScGIyNXpPaUFpSUNzZ1kzSnZia052Ym1ScGRHbHZibk1zSW1sdVptOGlLVHNOQ2cwS2FtOWlVM1JoZEhWekxtOXVLQ2RtYVc1cGMyaGxaQ2NzSUNncElEMCUyQklIc05DaUFnSUNCamIyNXpiMnhsTG14dlp5Z25TazlDSUVaSlRrbFRTRVZFSnlrN0RRb2dJQ0FnYW05aUxtTmhibU5sYkNncE93MEtJQ0FnSUNBdkx5QlFjbVZtYjNKdElIbHZkWElnUkVJZ1QzQmxjbUYwYVc5dWN5Qm9aWEpsSUNocGJpQjViM1Z5SUdOaGMyVTZJR1JsYkdWMFpTQnFiMklnWm5KdmJTQmtZWFJoWW1GelpTa05DZzBLZlNrN0RRb2dJQ0FOQ2lnb0tTQTlQaUI3SUdsbUlDaDBaWE4wVTJOb1pXUXBJSHNnWTJ4bFlYSlRZMmhsWkhWc1pTaDBaWE4wVTJOb1pXUXBPeUIwWlhOMFUyTm9aV1FnUFNCdWRXeHNPeUI5ZlNrb0tUc05DaTh2Ykc5bktDSlVaWE4wVTJOb1pXUkRiMjVrT2lBaUlDc2dZM0p2YmtOdmJtUnBkR2x2Ym5Nc0luZGhjbTRpS1RzTkNpQWdZMjl1YzI5c1pTNXBibVp2S0NkSWFXVnlJSGRwY21RZ1pHVnlJRlJGVTFSVFkyaGxaSFZzWlhJZ1oyVnpaWFI2ZENjcE93MEtJQ0FvS0NrZ1BUNGdleUJwWmlBb2RHVnpkRk5qYUdWa0tTQjdJR05zWldGeVUyTm9aV1IxYkdVb2RHVnpkRk5qYUdWa0tUc2dkR1Z6ZEZOamFHVmtJRDBnYm5Wc2JEc2dmWDBwS0NrN0RRb05DaUFnZEdWemRGTmphR1ZrSUQwZ2MyTm9aV1IxYkdVb0tHRjNZV2wwSUdKMWFXeGtRM0p2YmxKMWJHVW9KM1JwYldVbkxDQmpjbTl1UTI5dVpHbDBhVzl1Y3lrcExDQm1kVzVqZEdsdmJpZ3BJSHNOQ2lBZ0lDQmpiMjV6YjJ4bExtbHVabThvSjBocFpYSWdiTU9rZFdaMElHUmxjaUJVUlZOVVZISnBaMmRsY2ljcE93MEtJQ0FnSUM4cURRb2dJQ0FnYVdZZ0tIUm9hWE11Ym1WNGRFbHVkbTlqWVhScGIyNG9LU0E5UFQwZ2JuVnNiQ2tnZXcwS0lDQWdJQ0FnSUNBZ0lDQWdMeTlvWlhKbElIbHZkU0JqWVc0Z1kyOWtaU0IzYUdGMFpYWmxjaUI1YjNVZ2JtVmxaQ0IwYnlCa2J5QnBiaUIwYUdVZ2JHRnpkQ0JwYm5adlkyRjBhVzl1RFFvZ0lDQWdJQ0FnSUdwdllsTjBZWFIxY3k1bGJXbDBLQ2RtYVc1cGMyaGxaQ2NwT3lBdkx5QkZiV2wwSUhsdmRYSWdhbTlpSUdSdmJtVWdaVzFwZEhSbGNpQjNhR1Z1SUhsdmRTQmhjbVVnWkc5dVpTNGdJQ0FnSUNBZ0lDQWdJQ0FOQ2lBZ0lDQWdJQ0FnSUNBZ0lIME5DaUFnSUNBZ0lDQWdJQ0FnSUNvdkRRb2dJSDBwT3cwS0lBMEtEUW8lM0QlM0MlMkZmaWVsZCUzRSUzQ2NvbW1lbnQlMjBwaW5uZWQlM0QlMjJmYWxzZSUyMiUyMGglM0QlMjI4MCUyMiUyMHclM0QlMjIxNjAlMjIlM0VCZXNjaHJlaWJlJTIwZGllc2UlMjBGdW5rdGlvbiUyMCVFMiU4MCVBNiUzQyUyRmNvbW1lbnQlM0UlM0MlMkZibG9jayUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnByb2NlZHVyZXNfZGVmY3VzdG9tcmV0dXJuJTIyJTIwaWQlM0QlMjJzJTVFJTJDZkhEJTNBZEMlMjRkb2VoJTQwRSUyRjNhMSUyMiUyMHglM0QlMjI2MyUyMiUyMHklM0QlMjI4OCUyMiUzRSUzQ211dGF0aW9uJTIwc3RhdGVtZW50cyUzRCUyMmZhbHNlJTIyJTNFJTNDYXJnJTIwbmFtZSUzRCUyMm1vZHVzJTIyJTIwdmFyaWQlM0QlMjJVUWglMjVTISU1REclN0IoOFFFN2FvUkZDbyUyMiUzRSUzQyUyRmFyZyUzRSUzQ2FyZyUyMG5hbWUlM0QlMjJjb25kaXRpb25zJTIyJTIwdmFyaWQlM0QlMjJtUnhrcSklNUQxMUclMkYqVlglNDBxdkxkRCUyMiUzRSUzQyUyRmFyZyUzRSUzQyUyRm11dGF0aW9uJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyTkFNRSUyMiUzRWJ1aWxkQ3JvblJ1bGUlM0MlMkZmaWVsZCUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlNDUklQVCUyMiUzRWJHVjBJSEpsYzNWc2RDQTlJQ0lpT3cwS2JHVjBJSEpsYzNWc2RGTjBZWEowSUQwZ0lpSTdEUXBzWlhRZ2IzWmhiRkJsY21sdlpDQTlJQ0lpT3cwS0RRcGpiMjVrYVhScGIyNXpMbVp2Y2tWaFkyZ29ablZ1WTNScGIyNGdLR3hwYm1Vc2FXNWtaWGdzSUdGeWNtRjVLU0I3RFFvTkNpQWdJQ0F2S2cwS0lDQWdJQ0FnSUNBbmV5SjBhVzFsSWpwN0luTjBZWEowSWpvaU1EZzZNREFpTENKbGJtUWlPaUl5TURvd01DSXNJbTF2WkdVaU9pSnRhVzUxZEdWeklpd2lhVzUwWlhKMllXd2lPako5TENKd1pYSnBiMlFpT25zaVpHRjVjeUk2TVgxOUp3MEtJQ0FnSUNvdkRRb2dJQ0FnYkdWMElHOXJaWGtnUFNCUFltcGxZM1F1YTJWNWN5aHNhVzVsS1RzTkNpQWdJQ0JzWlhRZ2IzWmhiQ0E5SUd4cGJtVmJiMnRsZVYwN0RRb2dJQ0FnYjJ0bGVTQTlJRzlyWlhrdWRHOVRkSEpwYm1jb0tTNXlaWEJzWVdObEtDOWNjeXN2Wnl3Z0p5Y3BPdzBLSUNBZ0RRb2dJQ0FnTHk5c2IyY29iMnRsZVN3aWFXNW1ieUlwT3cwS0lDQWdJQ0FnSUNCcFppaHZhMlY1SUQwOUlDSndaWEpwYjJRaUtYc05DaUFnSUNBZ0lDQWdJQ0FnSUc5clpYa2dQU0J6ZEhKcGJtZFJkVzkwWlNoN2MzUnlWbUZ5YVdGaWJHVTZJRzlyWlhsOUtUc05DaUFnSUNBZ0lDQWdJQ0FnSUM4dmJHOW5LQ0p2YTJWNUlHbHpPaUFpTENKcGJtWnZJaWs3RFFvZ0lDQWdJQ0FnSUNBZ0lDQnZkbUZzVUdWeWFXOWtJRDBnYjNaaGJGQmxjbWx2WkM1amIyNWpZWFFvYjJ0bGVTd2lPaUlzSUc5MllXd3BPdzBLSUNBZ0lDQWdJQ0I5SUdWc2MyVWdhV1lvYjJ0bGVTQWhQU0FpY0dWeWFXOWtJaWtnZXcwS0lDQWdJQ0FnSUNCdmEyVjVJRDBnYzNSeWFXNW5VWFZ2ZEdVb2UzTjBjbFpoY21saFlteGxPaUJ2YTJWNWZTazdJQ0FnSUEwS0lDQWdJQ0FnSUNCcFppaDBlWEJsYjJZZ2IzWmhiQ0E5UFNBaWMzUnlhVzVuSWlsN0RRb2dJQ0FnSUNBZ0lDQWdJQ0J2ZG1Gc0lEMGdjM1J5YVc1blVYVnZkR1VvZTNOMGNsWmhjbWxoWW14bE9pQnZkbUZzZlNrN0RRb2dJQ0FnSUNBZ0lIME5DaUFnSUNBZ0lDQWdMeTlzYjJjb2IydGxlU3dpZDJGeWJpSXBPdzBLSUNBZ0lDQWdJQ0F2TDJ4dlp5Z2lWbUZzT2lBaUlDc2diM1poYkNBcklDSWdmQ0IwZVhCbGIyWTZJQ0lySUhSNWNHVnZaaUJ2ZG1Gc0xDSnBibVp2SWlrN0RRb2dJQ0FnSUNBZ0lHbG1LR2x1WkdWNElEMDlQU0JoY25KaGVTNXNaVzVuZEdnZ0xURXBldzBLSUNBZ0lDQWdJQ0J5WlhOMWJIUWdQWEpsYzNWc2RDNWpiMjVqWVhRb2IydGxlU3dpT2lJc0lHOTJZV3dwT3lBTkNpQWdJQ0FnSUNBZ2ZTQmxiSE5sSUhzTkNpQWdJQ0FnSUNBZ2NtVnpkV3gwSUQxeVpYTjFiSFF1WTI5dVkyRjBLRzlyWlhrc0lqb2lMQ0J2ZG1Gc0xDSXNJaWs3SUNBZ0lDQWdJQ0FOQ2lBZ0lDQWdJQ0FnZlEwS0RRb2dJQ0FnSUNBZ0lIME5DZzBLRFFvTkNuMHBPdzBLRFFweVpYTjFiSFFnUFNCemRISnBibWRSZFc5MFpTaDdjM1J5Vm1GeWFXRmliR1U2SUhKbGMzVnNkQ3h6ZEhKUmRXOTBaVG9nSW50OUlpd2dZbTl2YkZOd2JHbDBVWFZ2ZEdVNklIUnlkV1Y5S1RzTkNpOHZiRzluS0c5MllXeFFaWEpwYjJRc0luZGhjbTRpS1RzTkNnMEtjM2RwZEdOb0tHMXZaSFZ6S1hzTkNpQWdJQ0JqWVhObElDSjBhVzFsSWpvTkNpQWdJQ0FnSUNBZ2NtVnpkV3gwVTNSaGNuUWdQU0FpZEdsdFpTSTdEUW9OQ2lBZ0lDQmtaV1poZFd4ME9nMEtJQ0FnSUNBZ0lDQnlaWE4xYkhSVGRHRnlkQ0E5SUNKMGFXMWxJanNOQ24wTkNuSmxjM1ZzZEZOMFlYSjBJRDBnYzNSeWFXNW5VWFZ2ZEdVb2UzTjBjbFpoY21saFlteGxPaUJ5WlhOMWJIUlRkR0Z5ZEgwcE93MEtjbVZ6ZFd4MFUzUmhjblFnUFNBaUlpNWpiMjVqWVhRb2NtVnpkV3gwVTNSaGNuUXNJam9pS1NBN0RRb05DZzBLY21WemRXeDBJRDBnSWlJdVkyOXVZMkYwS0hKbGMzVnNkRk4wWVhKMExDQnlaWE4xYkhRc0lpd2lMQ0J2ZG1Gc1VHVnlhVzlrS1RzTkNnMEtjbVZ6ZFd4MElEMGdjM1J5YVc1blVYVnZkR1VvZTNOMGNsWmhjbWxoWW14bE9uSmxjM1ZzZEN4emRISlJkVzkwWlRvaWUzMGlMR0p2YjJ4VGNHeHBkRkYxYjNSbE9pQjBjblZsSUgwcElEc05DaTh2Ykc5bktISmxjM1ZzZEN3aWQyRnliaUlwT3cwS0RRb05DbkpsZEhWeWJpQnlaWE4xYkhRNyUzQyUyRmZpZWxkJTNFJTNDY29tbWVudCUyMHBpbm5lZCUzRCUyMmZhbHNlJTIyJTIwaCUzRCUyMjgwJTIyJTIwdyUzRCUyMjE2MCUyMiUzRUJlc2NocmVpYmUlMjBkaWVzZSUyMEZ1bmt0aW9uJTIwJUUyJTgwJUE2JTNDJTJGY29tbWVudCUzRSUzQyUyRmJsb2NrJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIycHJvY2VkdXJlc19kZWZjdXN0b21yZXR1cm4lMjIlMjBpZCUzRCUyMiU3QjBjVyUzRjBWJTdCJTIzb05+fipzMzAwMkklMjIlMjB4JTNEJTIyNjMlMjIlMjB5JTNEJTIyMTEzJTIyJTNFJTNDbXV0YXRpb24lMjBzdGF0ZW1lbnRzJTNEJTIyZmFsc2UlMjIlM0UlM0NhcmclMjBuYW1lJTNEJTIycm9vdGRwJTIyJTIwdmFyaWQlM0QlMjJvNk51LUZjQnZEMyUyNHIlMkYlN0QuanElNjAqJTIyJTNFJTNDJTJGYXJnJTNFJTNDJTJGbXV0YXRpb24lM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJOQU1FJTIyJTNFZ2V0Q3JvbkNvbmRpdGlvbnMlM0MlMkZmaWVsZCUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlNDUklQVCUyMiUzRWJHVjBJSEpsYzNWc2RDQTlJRnRkT3cwS2JHOW5LQ0puWlhSRGNtOXVRMjl1WkhNaUxDSjNZWEp1SWlrN0RRcGpiMjV6ZENCa2NITWdQU0FrS0hKdmIzUmtjQ2t1ZEc5QmNuSmhlU2dwT3cwS2JHOW5LR1J3Y3lrN0RRcGtjSE11Wm05eVJXRmphQ2dvYVdRcElEMCUyQklIc05DaUFnSUNCamIyNXpkQ0JrY0haaGJDQTlJR2RsZEZOMFlYUmxLR2xrS1M1MllXdzdEUW9nSUNBZ1kyOXVjM1FnWkhBZ1BTQnpjR3hwZEhSV1lYSnBZV0pzWlNocFpDd2liR0Z6ZENJc0lpNGlLVHNOQ2lBZ0lDQnNaWFFnYjJKcUlEMGdlMzA3RFFvZ0lDQWdiMkpxVzJSd1hTQTlJR1J3ZG1Gc093MEtJQ0FnSUhKbGMzVnNkQzV3ZFhOb0tHOWlhaWs3RFFwOUtUc05DaUFnSUNBdkwyeHZaeWh5WlhOMWJIUXNJbmRoY200aUtUc05DbkpsZEhWeWJpQnlaWE4xYkhRNyUzQyUyRmZpZWxkJTNFJTNDY29tbWVudCUyMHBpbm5lZCUzRCUyMmZhbHNlJTIyJTIwaCUzRCUyMjgwJTIyJTIwdyUzRCUyMjE2MCUyMiUzRUJlc2NocmVpYmUlMjBkaWVzZSUyMEZ1bmt0aW9uJTIwJUUyJTgwJUE2JTNDJTJGY29tbWVudCUzRSUzQyUyRmJsb2NrJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIycHJvY2VkdXJlc19kZWZjdXN0b21yZXR1cm4lMjIlMjBpZCUzRCUyMlhZU185WiUzQmZOJTNENi5XKjdCMDEzYiUyMiUyMHglM0QlMjI2MyUyMiUyMHklM0QlMjIxMzglMjIlM0UlM0NtdXRhdGlvbiUyMHN0YXRlbWVudHMlM0QlMjJmYWxzZSUyMiUzRSUzQ2FyZyUyMG5hbWUlM0QlMjJPYmplY3RJRCUyMiUyMHZhcmlkJTNEJTIyTSU2MGZyOS1hRyUzQVMlMkNLcSh4JTVFYTkoLiUyMiUzRSUzQyUyRmFyZyUzRSUzQyUyRm11dGF0aW9uJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyTkFNRSUyMiUzRWdsX2xlc2VSYXVtJTNDJTJGZmllbGQlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJTQ1JJUFQlMjIlM0ViR1YwSUhKdmIyMGdQU0JzWlhObFVtRjFiU2hQWW1wbFkzUkpSQ2s3RFFweVpYUjFjbTRnY205dmJUcyUzRCUzQyUyRmZpZWxkJTNFJTNDY29tbWVudCUyMHBpbm5lZCUzRCUyMmZhbHNlJTIyJTIwaCUzRCUyMjgwJTIyJTIwdyUzRCUyMjE2MCUyMiUzRUJlc2NocmVpYmUlMjBkaWVzZSUyMEZ1bmt0aW9uJTIwJUUyJTgwJUE2JTNDJTJGY29tbWVudCUzRSUzQyUyRmJsb2NrJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydGV4dCUyMiUyMGlkJTNEJTIyNHUlNDB0Tl9tZCklM0ElNUQlNDBLJTQwMG9yQyU1RHclMjIlMjBkaXNhYmxlZCUzRCUyMnRydWUlMjIlMjB4JTNEJTIyMTA2MyUyMiUyMHklM0QlMjIxODglMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJURVhUJTIyJTNFJTdCJTIydGltZSUyMiUzQSU3QiUyMmVuZCUyMiUzQSUyMjIwJTNBMDAlMjIlMkMlMjJpbnRlcnZhbCUyMiUzQTIlMkMlMjJtb2RlJTIyJTNBJTIybWludXRlcyUyMiUyQyUyMnN0YXJ0JTIyJTNBJTIyMDglM0EwMCUyMiU3RCUyQyUyMnBlcmlvZCUyMiUzQSU3QiUyMmRheXMlMjIlM0ExJTdEJTdEJTNDJTJGZmllbGQlM0UlM0MlMkZibG9jayUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnZhcmlhYmxlc19zZXQlMjIlMjBpZCUzRCUyMkwlNUJxNkQlNURtREJvV1klNURLTCUzQWNoJTI1ZCUyMiUyMHglM0QlMjIxMiUyMiUyMHklM0QlMjIyNjklMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJWQVIlMjIlMjBpZCUzRCUyMi5oNlhXJTI1cV9ZQyUzRGgyYV8teEw5UyUyMiUzRXZhcl9Dcm9uQ29uZGl0aW9ucyUzQyUyRmZpZWxkJTNFJTNDdmFsdWUlMjBuYW1lJTNEJTIyVkFMVUUlMjIlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJwcm9jZWR1cmVzX2NhbGxjdXN0b21yZXR1cm4lMjIlMjBpZCUzRCUyMjllcGslMkNDbyUyQzZlRVFUMDRhXyU0ME1xJTIyJTIwaW5saW5lJTNEJTIydHJ1ZSUyMiUzRSUzQ211dGF0aW9uJTIwbmFtZSUzRCUyMmdldENyb25Db25kaXRpb25zJTIyJTNFJTNDYXJnJTIwbmFtZSUzRCUyMnJvb3RkcCUyMiUzRSUzQyUyRmFyZyUzRSUzQyUyRm11dGF0aW9uJTNFJTNDdmFsdWUlMjBuYW1lJTNEJTIyQVJHMCUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnRleHQlMjIlMjBpZCUzRCUyMjJ4V3AyTn5VJTdDVmguTkJwVzQlNURwVCUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlRFWFQlMjIlM0UwX3VzZXJkYXRhLjAuUm9sbGFkZW4uQWxsZ2VtZWluLlNjaGF0dGVuLmNyb25Db25kaXRpb25zLiolM0MlMkZmaWVsZCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGdmFsdWUlM0UlM0MlMkZibG9jayUzRSUzQyUyRnZhbHVlJTNFJTNDbmV4dCUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmRlYnVnJTIyJTIwaWQlM0QlMjJuJTNCVCUzRDhqT1J+JTNGTjBWOHYuQUVvSyUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlNldmVyaXR5JTIyJTNFaW5mbyUzQyUyRmZpZWxkJTNFJTNDdmFsdWUlMjBuYW1lJTNEJTIyVEVYVCUyMiUzRSUzQ3NoYWRvdyUyMHR5cGUlM0QlMjJ0ZXh0JTIyJTIwaWQlM0QlMjJEU1NtcWElN0MxbV9EcCUzRCF6UVE0dVMlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJURVhUJTIyJTNFdGVzdCUzQyUyRmZpZWxkJTNFJTNDJTJGc2hhZG93JTNFJTNDYmxvY2slMjB0eXBlJTNEJTIycHJvY2VkdXJlc19jYWxsY3VzdG9tcmV0dXJuJTIyJTIwaWQlM0QlMjIuOVlnRi1GTTlFVkh6RXY0JTIzZzElMkYlMjIlMjBpbmxpbmUlM0QlMjJ0cnVlJTIyJTNFJTNDbXV0YXRpb24lMjBuYW1lJTNEJTIyYnVpbGRDcm9uUnVsZSUyMiUzRSUzQ2FyZyUyMG5hbWUlM0QlMjJtb2R1cyUyMiUzRSUzQyUyRmFyZyUzRSUzQ2FyZyUyMG5hbWUlM0QlMjJjb25kaXRpb25zJTIyJTNFJTNDJTJGYXJnJTNFJTNDJTJGbXV0YXRpb24lM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJBUkcwJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydGV4dCUyMiUyMGlkJTNEJTIySG1HOCUzQkolMkJaWCUzRnlwJTdEJTI0cyUyNWxZRyU3RCUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlRFWFQlMjIlM0V0aW1lJTNDJTJGZmllbGQlM0UlM0MlMkZibG9jayUzRSUzQyUyRnZhbHVlJTNFJTNDdmFsdWUlMjBuYW1lJTNEJTIyQVJHMSUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnZhcmlhYmxlc19nZXQlMjIlMjBpZCUzRCUyMnE2RjZsJTdCVUpYJTNGM1Y5dHUlNDAhamxlJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVkFSJTIyJTIwaWQlM0QlMjIuaDZYVyUyNXFfWUMlM0RoMmFfLXhMOVMlMjIlM0V2YXJfQ3JvbkNvbmRpdGlvbnMlM0MlMkZmaWVsZCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGdmFsdWUlM0UlM0MlMkZibG9jayUzRSUzQyUyRnZhbHVlJTNFJTNDbmV4dCUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmRlYnVnJTIyJTIwaWQlM0QlMjIlMkJKfmklNDBLMEZhJTdCeTBkKiUzQkFXbjglN0IlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJTZXZlcml0eSUyMiUzRWluZm8lM0MlMkZmaWVsZCUzRSUzQ3ZhbHVlJTIwbmFtZSUzRCUyMlRFWFQlMjIlM0UlM0NzaGFkb3clMjB0eXBlJTNEJTIydGV4dCUyMiUyMGlkJTNEJTIyRFNTbXFhJTdDMW1fRHAlM0QhelFRNHVTJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVEVYVCUyMiUzRXRlc3QlM0MlMkZmaWVsZCUzRSUzQyUyRnNoYWRvdyUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnZhcmlhYmxlc19nZXQlMjIlMjBpZCUzRCUyMkIzViFiSkclMkNOcUJ0Y0lfc1RRdW0lMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJWQVIlMjIlMjBpZCUzRCUyMi5oNlhXJTI1cV9ZQyUzRGgyYV8teEw5UyUyMiUzRXZhcl9Dcm9uQ29uZGl0aW9ucyUzQyUyRmZpZWxkJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZ2YWx1ZSUzRSUzQ25leHQlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJwcm9jZWR1cmVzX2NhbGxjdXN0b21ub3JldHVybiUyMiUyMGlkJTNEJTIyc2RVaWN0fiU0MFglN0JDKVhKS34lMkMoJTNESCUyMiUzRSUzQ211dGF0aW9uJTIwbmFtZSUzRCUyMmNyZWF0ZVNjaGVkdWxlJTIyJTNFJTNDYXJnJTIwbmFtZSUzRCUyMmNyb25Db25kaXRpb25zJTIyJTNFJTNDJTJGYXJnJTNFJTNDJTJGbXV0YXRpb24lM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJBUkcwJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydmFyaWFibGVzX2dldCUyMiUyMGlkJTNEJTIyOSElMjMlMjMlM0I1JTdCJTNCNDUzJTJGVXglM0FCN2hMWiUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlZBUiUyMiUyMGlkJTNEJTIyLmg2WFclMjVxX1lDJTNEaDJhXy14TDlTJTIyJTNFdmFyX0Nyb25Db25kaXRpb25zJTNDJTJGZmllbGQlM0UlM0MlMkZibG9jayUzRSUzQyUyRnZhbHVlJTNFJTNDbmV4dCUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnByb2NlZHVyZXNfY2FsbGN1c3RvbW5vcmV0dXJuJTIyJTIwaWQlM0QlMjJyJTIzSG1iVW4uTUt3aEk4flZpNl9CJTIyJTNFJTNDbXV0YXRpb24lMjBuYW1lJTNEJTIyZ2V0U2NoZWR1bGUlMjIlM0UlM0MlMkZtdXRhdGlvbiUzRSUzQ25leHQlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJvbl9leHQlMjIlMjBpZCUzRCUyMmZ0UG9VZ0hNdG8lM0ElNUV6cDElN0JzWlktJTIyJTNFJTNDbXV0YXRpb24lMjB4bWxucyUzRCUyMmh0dHAlM0ElMkYlMkZ3d3cudzMub3JnJTJGMTk5OSUyRnhodG1sJTIyJTIwaXRlbXMlM0QlMjIxJTIyJTNFJTNDJTJGbXV0YXRpb24lM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJDT05ESVRJT04lMjIlM0VhbnklM0MlMkZmaWVsZCUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMkFDS19DT05ESVRJT04lMjIlM0UlM0MlMkZmaWVsZCUzRSUzQ3ZhbHVlJTIwbmFtZSUzRCUyMk9JRDAlMjIlM0UlM0NzaGFkb3clMjB0eXBlJTNEJTIyZmllbGRfb2lkJTIyJTIwaWQlM0QlMjJTdTdCel9wJTdCMjMuU00lM0R0Rn5+dWYlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJvaWQlMjIlM0VJRCUyMGF1c3clQzMlQTRobGVuJTNDJTJGZmllbGQlM0UlM0MlMkZzaGFkb3clM0UlM0NibG9jayUyMHR5cGUlM0QlMjJzZWxlY3RvciUyMiUyMGlkJTNEJTIyWS5kanRib0x2KkxTTVEqdSUyNTclMkNkJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVEVYVCUyMiUzRXN0YXRlJTVCc3RhdGUuaWQlM0QwX3VzZXJkYXRhLjAuUm9sbGFkZW4uQWxsZ2VtZWluLlNjaGF0dGVuLmNyb25Db25kaXRpb25zLiolNUQlM0MlMkZmaWVsZCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGdmFsdWUlM0UlM0NzdGF0ZW1lbnQlMjBuYW1lJTNEJTIyU1RBVEVNRU5UJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydmFyaWFibGVzX3NldCUyMiUyMGlkJTNEJTIyR1UwViUzRFBUSHdPby41MXVkKHVPSSUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlZBUiUyMiUyMGlkJTNEJTIyLmg2WFclMjVxX1lDJTNEaDJhXy14TDlTJTIyJTNFdmFyX0Nyb25Db25kaXRpb25zJTNDJTJGZmllbGQlM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJWQUxVRSUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnByb2NlZHVyZXNfY2FsbGN1c3RvbXJldHVybiUyMiUyMGlkJTNEJTIyLUhJJTVEKFZSaCloJTYwKCUzQmhiWkwxQ1YlMjIlMjBpbmxpbmUlM0QlMjJ0cnVlJTIyJTNFJTNDbXV0YXRpb24lMjBuYW1lJTNEJTIyZ2V0Q3JvbkNvbmRpdGlvbnMlMjIlM0UlM0NhcmclMjBuYW1lJTNEJTIycm9vdGRwJTIyJTNFJTNDJTJGYXJnJTNFJTNDJTJGbXV0YXRpb24lM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJBUkcwJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydGV4dCUyMiUyMGlkJTNEJTIyd0hCa1QlMkJWcSUyM045UzchdWtMZWw2JTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVEVYVCUyMiUzRTBfdXNlcmRhdGEuMC5Sb2xsYWRlbi5BbGxnZW1laW4uU2NoYXR0ZW4uY3JvbkNvbmRpdGlvbnMuKiUzQyUyRmZpZWxkJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZ2YWx1ZSUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGdmFsdWUlM0UlM0NuZXh0JTNFJTNDYmxvY2slMjB0eXBlJTNEJTIycHJvY2VkdXJlc19jYWxsbm9yZXR1cm4lMjIlMjBpZCUzRCUyMiU0MCgyZnlXIVRoYWpON19OWml6RmYlMjIlM0UlM0NtdXRhdGlvbiUyMG5hbWUlM0QlMjJydW5UZXN0JTIyJTNFJTNDYXJnJTIwbmFtZSUzRCUyMmRwJTIyJTNFJTNDJTJGYXJnJTNFJTNDJTJGbXV0YXRpb24lM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJBUkcwJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydmFyaWFibGVzX2dldCUyMiUyMGlkJTNEJTIyYTg2S04uJTdCc3IlMjN2JTNBJTQwZiUzQXUlN0J+Qk0lMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJWQVIlMjIlMjBpZCUzRCUyMi5oNlhXJTI1cV9ZQyUzRGgyYV8teEw5UyUyMiUzRXZhcl9Dcm9uQ29uZGl0aW9ucyUzQyUyRmZpZWxkJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZ2YWx1ZSUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGbmV4dCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGc3RhdGVtZW50JTNFJTNDJTJGYmxvY2slM0UlM0MlMkZuZXh0JTNFJTNDJTJGYmxvY2slM0UlM0MlMkZuZXh0JTNFJTNDJTJGYmxvY2slM0UlM0MlMkZuZXh0JTNFJTNDJTJGYmxvY2slM0UlM0MlMkZuZXh0JTNFJTNDJTJGYmxvY2slM0UlM0MlMkZuZXh0JTNFJTNDJTJGYmxvY2slM0UlM0NibG9jayUyMHR5cGUlM0QlMjJwcm9jZWR1cmVzX2RlZm5vcmV0dXJuJTIyJTIwaWQlM0QlMjJseS0lN0RZRSUyM1pxJTJCUW8lNURtfiUyRllRblElMjIlMjB4JTNEJTIyOTg4JTIyJTIweSUzRCUyMjMxMyUyMiUzRSUzQ211dGF0aW9uJTNFJTNDYXJnJTIwbmFtZSUzRCUyMmRwJTIyJTIwdmFyaWQlM0QlMjI1USUyQ1dCRiU1Qm0lMjMlMkZIJTJDa08heCU3Qzg0JTVEJTIyJTNFJTNDJTJGYXJnJTNFJTNDJTJGbXV0YXRpb24lM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJOQU1FJTIyJTNFcnVuVGVzdCUzQyUyRmZpZWxkJTNFJTNDY29tbWVudCUyMHBpbm5lZCUzRCUyMmZhbHNlJTIyJTIwaCUzRCUyMjgwJTIyJTIwdyUzRCUyMjE2MCUyMiUzRUJlc2NocmVpYmUlMjBkaWVzZSUyMEZ1bmt0aW9uJTIwJUUyJTgwJUE2JTNDJTJGY29tbWVudCUzRSUzQ3N0YXRlbWVudCUyMG5hbWUlM0QlMjJTVEFDSyUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmRlYnVnJTIyJTIwaWQlM0QlMjJXJTNBViUzRlNLKElqM1hPJTQwTnNGKSUyM3AtJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyU2V2ZXJpdHklMjIlM0VpbmZvJTNDJTJGZmllbGQlM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJURVhUJTIyJTNFJTNDc2hhZG93JTIwdHlwZSUzRCUyMnRleHQlMjIlMjBpZCUzRCUyMjdieiU1RU9JJTI1MUhIZ0gwYS1zeiUyQiU1REQlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJURVhUJTIyJTNFSGllciUyMHdpcmQlMjBkZXIlMjBTY2hlZHVsZXIlMjBnZXNldHp0JTNDJTJGZmllbGQlM0UlM0MlMkZzaGFkb3clM0UlM0MlMkZ2YWx1ZSUzRSUzQ25leHQlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJ2YXJpYWJsZXNfc2V0JTIyJTIwaWQlM0QlMjJ6bSFITVA3X1pOViUyMyUyRikpQndNcVglMjIlMjBkaXNhYmxlZCUzRCUyMnRydWUlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJWQVIlMjIlMjBpZCUzRCUyMkElMjR6SiUzRC5vYS5LJTdDJTJDODAlM0RXJTI0UyU0MEclMjIlM0V2YXJfUmF1bSUzQyUyRmZpZWxkJTNFJTNDdmFsdWUlMjBuYW1lJTNEJTIyVkFMVUUlMjIlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJwcm9jZWR1cmVzX2NhbGxjdXN0b21yZXR1cm4lMjIlMjBpZCUzRCUyMkJWJTQwTDJaNCUzQjFVSCUzRiU1RCU1QmFXRDQ0eiUyMiUzRSUzQ211dGF0aW9uJTIwbmFtZSUzRCUyMmdsX2xlc2VSYXVtJTIyJTNFJTNDYXJnJTIwbmFtZSUzRCUyMk9iamVjdElEJTIyJTNFJTNDJTJGYXJnJTNFJTNDJTJGbXV0YXRpb24lM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJBUkcwJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydmFyaWFibGVzX2dldCUyMiUyMGlkJTNEJTIyNnRXQWJFNlpEMmElN0JHTkEtQ3UlMjM0JTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVkFSJTIyJTIwaWQlM0QlMjI1USUyQ1dCRiU1Qm0lMjMlMkZIJTJDa08heCU3Qzg0JTVEJTIyJTNFZHAlM0MlMkZmaWVsZCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGdmFsdWUlM0UlM0MlMkZibG9jayUzRSUzQyUyRnZhbHVlJTNFJTNDbmV4dCUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnNjaGVkdWxlX2NsZWFyJTIyJTIwaWQlM0QlMjIpYzElMjMlM0JCTkNNaWoyJTNEJTJCJTJDTWklMjRfcyUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMk5BTUUlMjIlM0VzY2hlZHVsZTElM0MlMkZmaWVsZCUzRSUzQ25leHQlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJzY2hlZHVsZV9jcmVhdGUlMjIlMjBpZCUzRCUyMiUyNCglMjQlNUJ0ZDVscjhKJTNCZiUzQjlFejhUJTdDJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyTkFNRSUyMiUzRXNjaGVkdWxlMSUzQyUyRmZpZWxkJTNFJTNDdmFsdWUlMjBuYW1lJTNEJTIyU0NIRURVTEUlMjIlM0UlM0NzaGFkb3clMjB0eXBlJTNEJTIyZmllbGRfY3JvbiUyMiUyMGlkJTNEJTIydSElMkIlNUIhJTIzby0lNUV5YSU3RHlSQXF+VC5FJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyQ1JPTiUyMiUzRSolMjAqJTIwKiUyMColMjAqJTNDJTJGZmllbGQlM0UlM0MlMkZzaGFkb3clM0UlM0NibG9jayUyMHR5cGUlM0QlMjJwcm9jZWR1cmVzX2NhbGxjdXN0b21yZXR1cm4lMjIlMjBpZCUzRCUyMnd3JTNGWFMqfl9UTHh0ZUY5S09aenglMjIlMjBpbmxpbmUlM0QlMjJ0cnVlJTIyJTNFJTNDbXV0YXRpb24lMjBuYW1lJTNEJTIyYnVpbGRDcm9uUnVsZSUyMiUzRSUzQ2FyZyUyMG5hbWUlM0QlMjJtb2R1cyUyMiUzRSUzQyUyRmFyZyUzRSUzQ2FyZyUyMG5hbWUlM0QlMjJjb25kaXRpb25zJTIyJTNFJTNDJTJGYXJnJTNFJTNDJTJGbXV0YXRpb24lM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJBUkcwJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydGV4dCUyMiUyMGlkJTNEJTIyMyg1YTBNLWMlNDAxVWwoRERVUlQlMkM2JTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVEVYVCUyMiUzRXRpbWUlM0MlMkZmaWVsZCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGdmFsdWUlM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJBUkcxJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydmFyaWFibGVzX2dldCUyMiUyMGlkJTNEJTIySzlBVU1oJTQwMFZyJTNBLThtVTN+JTdCcmElMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJWQVIlMjIlMjBpZCUzRCUyMi5oNlhXJTI1cV9ZQyUzRGgyYV8teEw5UyUyMiUzRXZhcl9Dcm9uQ29uZGl0aW9ucyUzQyUyRmZpZWxkJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZ2YWx1ZSUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGdmFsdWUlM0UlM0NzdGF0ZW1lbnQlMjBuYW1lJTNEJTIyU1RBVEVNRU5UJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIyZGVidWclMjIlMjBpZCUzRCUyMk0lMkY4RipPeGQqTVc0NSU3RCUyNWgpWDQlN0IlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJTZXZlcml0eSUyMiUzRWluZm8lM0MlMkZmaWVsZCUzRSUzQ3ZhbHVlJTIwbmFtZSUzRCUyMlRFWFQlMjIlM0UlM0NzaGFkb3clMjB0eXBlJTNEJTIydGV4dCUyMiUyMGlkJTNEJTIyRyUzRCU1RFAyZ3pMJTVCbUUlM0ZlMC1xLS5DLiUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlRFWFQlMjIlM0VIaWVyJTIwbCVDMyVBNHVmdCUyMGRlciUyMFRyaWdnZXIlM0MlMkZmaWVsZCUzRSUzQyUyRnNoYWRvdyUzRSUzQyUyRnZhbHVlJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZzdGF0ZW1lbnQlM0UlM0NuZXh0JTNFJTNDYmxvY2slMjB0eXBlJTNEJTIycHJvY2VkdXJlc19jYWxsY3VzdG9tbm9yZXR1cm4lMjIlMjBpZCUzRCUyMmJOJTdCcC0lN0JJYnAhJTdEJTJCRktnSWRBaF8lMjIlM0UlM0NtdXRhdGlvbiUyMG5hbWUlM0QlMjJnZXRTY2hlZHVsZSUyMiUzRSUzQyUyRm11dGF0aW9uJTNFJTNDbmV4dCUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmNvbnRyb2xzX2lmJTIyJTIwaWQlM0QlMjJYcmclMjQyTlMlNUVnQ04qJTNGT3BVc0cwUSUyMiUyMGRpc2FibGVkJTNEJTIydHJ1ZSUyMiUzRSUzQ211dGF0aW9uJTIwZWxzZSUzRCUyMjElMjIlM0UlM0MlMkZtdXRhdGlvbiUzRSUzQ3ZhbHVlJTIwbmFtZSUzRCUyMklGMCUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmxvZ2ljX2NvbXBhcmUlMjIlMjBpZCUzRCUyMld4LiU3QkolNUVhX3olMkJKJTI1SUlkJTQwJTVCJTdCU0clMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJPUCUyMiUzRUVRJTNDJTJGZmllbGQlM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJBJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydGV4dCUyMiUyMGlkJTNEJTIyVyUzRCUyNUF5JTYwLkRpMCUyNHFlcSU3Q24lMkIlMjUlM0J1JTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVEVYVCUyMiUzRXVuZGVmaW5lZCUzQyUyRmZpZWxkJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZ2YWx1ZSUzRSUzQ3ZhbHVlJTIwbmFtZSUzRCUyMkIlMjIlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJjb252ZXJ0X3R5cGUlMjIlMjBpZCUzRCUyMjBTOSU1Qjl4SClsRU0teF9Edk5YVjQlMjIlM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJJVEVNJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydmFyaWFibGVzX2dldCUyMiUyMGlkJTNEJTIyMjU5SkglMkIoN1ZYdEd4cTlhJTJGTyglN0QlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJWQVIlMjIlMjBpZCUzRCUyMkElMjR6SiUzRC5vYS5LJTdDJTJDODAlM0RXJTI0UyU0MEclMjIlM0V2YXJfUmF1bSUzQyUyRmZpZWxkJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZ2YWx1ZSUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGdmFsdWUlM0UlM0MlMkZibG9jayUzRSUzQyUyRnZhbHVlJTNFJTNDc3RhdGVtZW50JTIwbmFtZSUzRCUyMkRPMCUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmRlYnVnJTIyJTIwaWQlM0QlMjIhLSU3Q1RZSlZjQ35XMyU3QnhYan5oS1glMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJTZXZlcml0eSUyMiUzRWluZm8lM0MlMkZmaWVsZCUzRSUzQ3ZhbHVlJTIwbmFtZSUzRCUyMlRFWFQlMjIlM0UlM0NzaGFkb3clMjB0eXBlJTNEJTIydGV4dCUyMiUyMGlkJTNEJTIyISU3QiUzQiUyQ3BnNiU2MC4yRyU3QyU1QkxuJTJCbjFoJTYwJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVEVYVCUyMiUzRWtlaW4lMjBSYXVtJTNDJTJGZmllbGQlM0UlM0MlMkZzaGFkb3clM0UlM0MlMkZ2YWx1ZSUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGc3RhdGVtZW50JTNFJTNDc3RhdGVtZW50JTIwbmFtZSUzRCUyMkVMU0UlMjIlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJkZWJ1ZyUyMiUyMGlkJTNEJTIyNjclNUJzUnBMJTJCblEwNUFnJTQwMSlHNHYlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJTZXZlcml0eSUyMiUzRWluZm8lM0MlMkZmaWVsZCUzRSUzQ3ZhbHVlJTIwbmFtZSUzRCUyMlRFWFQlMjIlM0UlM0NzaGFkb3clMjB0eXBlJTNEJTIydGV4dCUyMiUyMGlkJTNEJTIydWMyJTJDOHQ4Qk5IdnYlMjV6JTJCSCUzQSUyMy5iJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVEVYVCUyMiUzRXRlc3QlM0MlMkZmaWVsZCUzRSUzQyUyRnNoYWRvdyUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnZhcmlhYmxlc19nZXQlMjIlMjBpZCUzRCUyMnMlMkYlMjVGJTNGKkUpZmNPSWMlMjRteGlGJTVEdyUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlZBUiUyMiUyMGlkJTNEJTIyQSUyNHpKJTNELm9hLkslN0MlMkM4MCUzRFclMjRTJTQwRyUyMiUzRXZhcl9SYXVtJTNDJTJGZmllbGQlM0UlM0MlMkZibG9jayUzRSUzQyUyRnZhbHVlJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZzdGF0ZW1lbnQlM0UlM0MlMkZibG9jayUzRSUzQyUyRm5leHQlM0UlM0MlMkZibG9jayUzRSUzQyUyRm5leHQlM0UlM0MlMkZibG9jayUzRSUzQyUyRm5leHQlM0UlM0MlMkZibG9jayUzRSUzQyUyRm5leHQlM0UlM0MlMkZibG9jayUzRSUzQyUyRm5leHQlM0UlM0MlMkZibG9jayUzRSUzQyUyRnN0YXRlbWVudCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGeG1sJTNF
              
              T OliverIOO 2 Antworten Letzte Antwort
              0
              • T trojanhector

                @homoran
                Hier ist soweit mein Code, angelehnt an das Beispiel aus dem Netz.

                const schedule = require('node-schedule');
                const EventEmitter = require('events');
                class Ee extends EventEmitter {}
                
                const jobStatus = new Ee();
                
                jobStatus.on('finished', () => {
                    console.log('JOB FINISHED');
                    job.cancel();
                
                    // Preform your DB Operations here (in your case: delete job from database)
                
                });
                
                function calcSecondsFromTime(time){
                    //console.log("Time: " + time);
                    var array = time.split(":");
                    var seconds = 0; 
                    if(typeof(array[2] = "undefined")){
                        seconds = (parseInt(array[0], 10) * 60 * 60) + (parseInt(array[1], 10) * 60);        
                    } else {
                        seconds = (parseInt(array[0], 10) * 60 * 60) + (parseInt(array[1], 10) * 60) + parseInt(array[2], 10); 
                    }
                    //console.log("Array: "+ array.length +" Seconds: " + seconds);
                    //console.log(array[0] +" -- " + array[1] +" -- " + array[2] +" -- " );
                    return seconds;
                } 
                
                //So funktioniert das nicht.
                const strStart = "20:10"
                const strEnd = "21:15"
                const startTime = calcSecondsFromTime(strStart);
                const endTime = calcSecondsFromTime(strEnd);
                log("StartTime: " + startTime,"info");
                log("EndTime: " + endTime, "info");
                
                /*
                //So funktioniert das.
                const startTime = new Date(Date.now() + 5000);
                const endTime = new Date(startTime.getTime() + 5000);
                */
                
                const job = schedule.scheduleJob({ start: startTime, end: endTime, rule: '*/1 * * * * *' }, function(){
                
                    console.log('Time for tea!');
                            if (this.nextInvocation() === null) {
                          //here you can code whatever you need to do in the last invocation
                    jobStatus.emit('finished'); // Emit your job done emitter when you are done.            
                        }
                
                });
                

                Das mit dem jeweiligen Timestamp um Mitternacht setzt immer eine Bearbeitung voraus. Mein Ziel ist es aber einmal Start und Ende als hh:mm anzugeben und dann nicht mehr.

                Wenn ich in Blockly den Wizard vom kleinen Cron Bauteil nehme, kann ich da Start und Endzeit eingeben.
                Dann kommt als JS sowas raus:
                '{"time":{"start":"08:00","end":"20:00","mode":"minutes","interval":2},"period":{"days":1}}'
                Und das habe ich mit den Werten aus den Objekten nachgebaut und es funktioniert.

                Hier ist mein Ansatz als Blockly. Den Teil mit nextInvocation ist in der function createSchedule als Block auskommentiert, da er Fehler schmeißt und den Adapter zum Neustart zwingt.

                var cronConditions, modus, conditions, rootdp, ObjectID, var_CronConditions, dp, var_Raum, schedule1;
                
                // Beschreibe diese Funktion …
                async function getSchedule() {
                    const list = getSchedules(false);
                    list.forEach(schedule => log(JSON.stringify(schedule)));
                }
                
                // Beschreibe diese Funktion …
                async function createSchedule(cronConditions) {
                    let testSched = null;
                    const EventEmitter = require('events');
                    class Ee extends EventEmitter {}
                    
                    const jobStatus = new Ee();
                    //log("cronConditions: " + cronConditions,"info");
                    
                    jobStatus.on('finished', () => {
                        console.log('JOB FINISHED');
                        job.cancel();
                         // Preform your DB Operations here (in your case: delete job from database)
                    
                    });
                       
                    (() => { if (testSched) { clearSchedule(testSched); testSched = null; }})();
                    //log("TestSchedCond: " + cronConditions,"warn");
                      console.info('Hier wird der TESTScheduler gesetzt');
                      (() => { if (testSched) { clearSchedule(testSched); testSched = null; }})();
                    
                      testSched = schedule((await buildCronRule('time', cronConditions)), function() {
                        console.info('Hier läuft der TESTTrigger');
                        /*
                        if (this.nextInvocation() === null) {
                                //here you can code whatever you need to do in the last invocation
                            jobStatus.emit('finished'); // Emit your job done emitter when you are done.            
                                }
                                */
                      });
                     
                    
                
                }
                
                // Beschreibe diese Funktion …
                async function buildCronRule(modus, conditions) {
                    let result = "";
                    let resultStart = "";
                    let ovalPeriod = "";
                    
                    conditions.forEach(function (line,index, array) {
                    
                        /*
                            '{"time":{"start":"08:00","end":"20:00","mode":"minutes","interval":2},"period":{"days":1}}'
                        */
                        let okey = Object.keys(line);
                        let oval = line[okey];
                        okey = okey.toString().replace(/\s+/g, '');
                       
                        //log(okey,"info");
                            if(okey == "period"){
                                okey = stringQuote({strVariable: okey});
                                //log("okey is: ","info");
                                ovalPeriod = ovalPeriod.concat(okey,":", oval);
                            } else if(okey != "period") {
                            okey = stringQuote({strVariable: okey});    
                            if(typeof oval == "string"){
                                oval = stringQuote({strVariable: oval});
                            }
                            //log(okey,"warn");
                            //log("Val: " + oval + " | typeof: "+ typeof oval,"info");
                            if(index === array.length -1){
                            result =result.concat(okey,":", oval); 
                            } else {
                            result =result.concat(okey,":", oval,",");        
                            }
                    
                            }
                    
                    
                    
                    });
                    
                    result = stringQuote({strVariable: result,strQuote: "{}", boolSplitQuote: true});
                    //log(ovalPeriod,"warn");
                    
                    switch(modus){
                        case "time":
                            resultStart = "time";
                    
                        default:
                            resultStart = "time";
                    }
                    resultStart = stringQuote({strVariable: resultStart});
                    resultStart = "".concat(resultStart,":") ;
                    
                    
                    result = "".concat(resultStart, result,",", ovalPeriod);
                    
                    result = stringQuote({strVariable:result,strQuote:"{}",boolSplitQuote: true }) ;
                    //log(result,"warn");
                    
                    
                    return result;
                }
                
                // Beschreibe diese Funktion …
                async function getCronConditions(rootdp) {
                    let result = [];
                    log("getCronConds","warn");
                    const dps = $(rootdp).toArray();
                    log(dps);
                    dps.forEach((id) => {
                        const dpval = getState(id).val;
                        const dp = splittVariable(id,"last",".");
                        let obj = {};
                        obj[dp] = dpval;
                        result.push(obj);
                    });
                        //log(result,"warn");
                    return result;
                }
                
                // Beschreibe diese Funktion …
                async function gl_leseRaum(ObjectID) {
                    let room = leseRaum(ObjectID);
                    return room;
                }
                
                // Beschreibe diese Funktion …
                async function runTest(dp) {
                  console.info('Hier wird der Scheduler gesetzt');
                  (() => { if (schedule1) { clearSchedule(schedule1); schedule1 = null; }})();
                  schedule1 = schedule((await buildCronRule('time', var_CronConditions)), async () => {
                    console.info('Hier läuft der Trigger');
                  });
                  await getSchedule();
                }
                
                
                var_CronConditions = await getCronConditions('0_userdata.0.Rolladen.Allgemein.Schatten.cronConditions.*');
                console.info((await buildCronRule('time', var_CronConditions)));
                console.info(var_CronConditions);
                await createSchedule(var_CronConditions);
                await getSchedule();
                on({ id: [].concat(Array.prototype.slice.apply($('state[state.id=0_userdata.0.Rolladen.Allgemein.Schatten.cronConditions.*]'))), change: 'any' }, async (obj) => {
                  let value = obj.state.val;
                  let oldValue = obj.oldState.val;
                  var_CronConditions = await getCronConditions('0_userdata.0.Rolladen.Allgemein.Schatten.cronConditions.*');
                  await runTest(var_CronConditions);
                });
                
                //JTNDeG1sJTIweG1sbnMlM0QlMjJodHRwcyUzQSUyRiUyRmRldmVsb3BlcnMuZ29vZ2xlLmNvbSUyRmJsb2NrbHklMkZ4bWwlMjIlM0UlM0N2YXJpYWJsZXMlM0UlM0N2YXJpYWJsZSUyMGlkJTNEJTIyYyU1QiUzQVd3aiU3QnNpd3JOJTJGRiU1RSglNjBoTHclMjIlM0Vjcm9uQ29uZGl0aW9ucyUzQyUyRnZhcmlhYmxlJTNFJTNDdmFyaWFibGUlMjBpZCUzRCUyMlVRaCUyNVMhJTVERyU3Qig4UUU3YW9SRkNvJTIyJTNFbW9kdXMlM0MlMkZ2YXJpYWJsZSUzRSUzQ3ZhcmlhYmxlJTIwaWQlM0QlMjJtUnhrcSklNUQxMUclMkYqVlglNDBxdkxkRCUyMiUzRWNvbmRpdGlvbnMlM0MlMkZ2YXJpYWJsZSUzRSUzQ3ZhcmlhYmxlJTIwaWQlM0QlMjJvNk51LUZjQnZEMyUyNHIlMkYlN0QuanElNjAqJTIyJTNFcm9vdGRwJTNDJTJGdmFyaWFibGUlM0UlM0N2YXJpYWJsZSUyMGlkJTNEJTIyTSU2MGZyOS1hRyUzQVMlMkNLcSh4JTVFYTkoLiUyMiUzRU9iamVjdElEJTNDJTJGdmFyaWFibGUlM0UlM0N2YXJpYWJsZSUyMGlkJTNEJTIyLmg2WFclMjVxX1lDJTNEaDJhXy14TDlTJTIyJTNFdmFyX0Nyb25Db25kaXRpb25zJTNDJTJGdmFyaWFibGUlM0UlM0N2YXJpYWJsZSUyMGlkJTNEJTIyNVElMkNXQkYlNUJtJTIzJTJGSCUyQ2tPIXglN0M4NCU1RCUyMiUzRWRwJTNDJTJGdmFyaWFibGUlM0UlM0N2YXJpYWJsZSUyMGlkJTNEJTIyQSUyNHpKJTNELm9hLkslN0MlMkM4MCUzRFclMjRTJTQwRyUyMiUzRXZhcl9SYXVtJTNDJTJGdmFyaWFibGUlM0UlM0N2YXJpYWJsZSUyMHR5cGUlM0QlMjJjcm9uJTIyJTIwaWQlM0QlMjJzY2hlZHVsZTElMjIlM0VzY2hlZHVsZTElM0MlMkZ2YXJpYWJsZSUzRSUzQyUyRnZhcmlhYmxlcyUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnByb2NlZHVyZXNfZGVmY3VzdG9tbm9yZXR1cm4lMjIlMjBpZCUzRCUyMkZiKE9oV3BGJTdEbmMlM0ZHZDB0ODIlMjQpJTIyJTIweCUzRCUyMjYzJTIyJTIweSUzRCUyMjM4JTIyJTNFJTNDbXV0YXRpb24lMjBzdGF0ZW1lbnRzJTNEJTIyZmFsc2UlMjIlM0UlM0MlMkZtdXRhdGlvbiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMk5BTUUlMjIlM0VnZXRTY2hlZHVsZSUzQyUyRmZpZWxkJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyU0NSSVBUJTIyJTNFWTI5dWMzUWdiR2x6ZENBOUlHZGxkRk5qYUdWa2RXeGxjeWhtWVd4elpTazdEUXBzYVhOMExtWnZja1ZoWTJnb2MyTm9aV1IxYkdVZ1BUNGdiRzluS0VwVFQwNHVjM1J5YVc1bmFXWjVLSE5qYUdWa2RXeGxLU2twT3clM0QlM0QlM0MlMkZmaWVsZCUzRSUzQ2NvbW1lbnQlMjBwaW5uZWQlM0QlMjJmYWxzZSUyMiUyMGglM0QlMjI4MCUyMiUyMHclM0QlMjIxNjAlMjIlM0VCZXNjaHJlaWJlJTIwZGllc2UlMjBGdW5rdGlvbiUyMCVFMiU4MCVBNiUzQyUyRmNvbW1lbnQlM0UlM0MlMkZibG9jayUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnByb2NlZHVyZXNfZGVmY3VzdG9tbm9yZXR1cm4lMjIlMjBpZCUzRCUyMnIlNUV0KWQhLlQlNURtJTJCR1hoMCUyNTlYUUklMjIlMjB4JTNEJTIyNjMlMjIlMjB5JTNEJTIyNjMlMjIlM0UlM0NtdXRhdGlvbiUyMHN0YXRlbWVudHMlM0QlMjJmYWxzZSUyMiUzRSUzQ2FyZyUyMG5hbWUlM0QlMjJjcm9uQ29uZGl0aW9ucyUyMiUyMHZhcmlkJTNEJTIyYyU1QiUzQVd3aiU3QnNpd3JOJTJGRiU1RSglNjBoTHclMjIlM0UlM0MlMkZhcmclM0UlM0MlMkZtdXRhdGlvbiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMk5BTUUlMjIlM0VjcmVhdGVTY2hlZHVsZSUzQyUyRmZpZWxkJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyU0NSSVBUJTIyJTNFYkdWMElIUmxjM1JUWTJobFpDQTlJRzUxYkd3N0RRcGpiMjV6ZENCRmRtVnVkRVZ0YVhSMFpYSWdQU0J5WlhGMWFYSmxLQ2RsZG1WdWRITW5LVHNOQ21Oc1lYTnpJRVZsSUdWNGRHVnVaSE1nUlhabGJuUkZiV2wwZEdWeUlIdDlEUW9OQ21OdmJuTjBJR3B2WWxOMFlYUjFjeUE5SUc1bGR5QkZaU2dwT3cwS0x5OXNiMmNvSW1OeWIyNURiMjVrYVhScGIyNXpPaUFpSUNzZ1kzSnZia052Ym1ScGRHbHZibk1zSW1sdVptOGlLVHNOQ2cwS2FtOWlVM1JoZEhWekxtOXVLQ2RtYVc1cGMyaGxaQ2NzSUNncElEMCUyQklIc05DaUFnSUNCamIyNXpiMnhsTG14dlp5Z25TazlDSUVaSlRrbFRTRVZFSnlrN0RRb2dJQ0FnYW05aUxtTmhibU5sYkNncE93MEtJQ0FnSUNBdkx5QlFjbVZtYjNKdElIbHZkWElnUkVJZ1QzQmxjbUYwYVc5dWN5Qm9aWEpsSUNocGJpQjViM1Z5SUdOaGMyVTZJR1JsYkdWMFpTQnFiMklnWm5KdmJTQmtZWFJoWW1GelpTa05DZzBLZlNrN0RRb2dJQ0FOQ2lnb0tTQTlQaUI3SUdsbUlDaDBaWE4wVTJOb1pXUXBJSHNnWTJ4bFlYSlRZMmhsWkhWc1pTaDBaWE4wVTJOb1pXUXBPeUIwWlhOMFUyTm9aV1FnUFNCdWRXeHNPeUI5ZlNrb0tUc05DaTh2Ykc5bktDSlVaWE4wVTJOb1pXUkRiMjVrT2lBaUlDc2dZM0p2YmtOdmJtUnBkR2x2Ym5Nc0luZGhjbTRpS1RzTkNpQWdZMjl1YzI5c1pTNXBibVp2S0NkSWFXVnlJSGRwY21RZ1pHVnlJRlJGVTFSVFkyaGxaSFZzWlhJZ1oyVnpaWFI2ZENjcE93MEtJQ0FvS0NrZ1BUNGdleUJwWmlBb2RHVnpkRk5qYUdWa0tTQjdJR05zWldGeVUyTm9aV1IxYkdVb2RHVnpkRk5qYUdWa0tUc2dkR1Z6ZEZOamFHVmtJRDBnYm5Wc2JEc2dmWDBwS0NrN0RRb05DaUFnZEdWemRGTmphR1ZrSUQwZ2MyTm9aV1IxYkdVb0tHRjNZV2wwSUdKMWFXeGtRM0p2YmxKMWJHVW9KM1JwYldVbkxDQmpjbTl1UTI5dVpHbDBhVzl1Y3lrcExDQm1kVzVqZEdsdmJpZ3BJSHNOQ2lBZ0lDQmpiMjV6YjJ4bExtbHVabThvSjBocFpYSWdiTU9rZFdaMElHUmxjaUJVUlZOVVZISnBaMmRsY2ljcE93MEtJQ0FnSUM4cURRb2dJQ0FnYVdZZ0tIUm9hWE11Ym1WNGRFbHVkbTlqWVhScGIyNG9LU0E5UFQwZ2JuVnNiQ2tnZXcwS0lDQWdJQ0FnSUNBZ0lDQWdMeTlvWlhKbElIbHZkU0JqWVc0Z1kyOWtaU0IzYUdGMFpYWmxjaUI1YjNVZ2JtVmxaQ0IwYnlCa2J5QnBiaUIwYUdVZ2JHRnpkQ0JwYm5adlkyRjBhVzl1RFFvZ0lDQWdJQ0FnSUdwdllsTjBZWFIxY3k1bGJXbDBLQ2RtYVc1cGMyaGxaQ2NwT3lBdkx5QkZiV2wwSUhsdmRYSWdhbTlpSUdSdmJtVWdaVzFwZEhSbGNpQjNhR1Z1SUhsdmRTQmhjbVVnWkc5dVpTNGdJQ0FnSUNBZ0lDQWdJQ0FOQ2lBZ0lDQWdJQ0FnSUNBZ0lIME5DaUFnSUNBZ0lDQWdJQ0FnSUNvdkRRb2dJSDBwT3cwS0lBMEtEUW8lM0QlM0MlMkZmaWVsZCUzRSUzQ2NvbW1lbnQlMjBwaW5uZWQlM0QlMjJmYWxzZSUyMiUyMGglM0QlMjI4MCUyMiUyMHclM0QlMjIxNjAlMjIlM0VCZXNjaHJlaWJlJTIwZGllc2UlMjBGdW5rdGlvbiUyMCVFMiU4MCVBNiUzQyUyRmNvbW1lbnQlM0UlM0MlMkZibG9jayUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnByb2NlZHVyZXNfZGVmY3VzdG9tcmV0dXJuJTIyJTIwaWQlM0QlMjJzJTVFJTJDZkhEJTNBZEMlMjRkb2VoJTQwRSUyRjNhMSUyMiUyMHglM0QlMjI2MyUyMiUyMHklM0QlMjI4OCUyMiUzRSUzQ211dGF0aW9uJTIwc3RhdGVtZW50cyUzRCUyMmZhbHNlJTIyJTNFJTNDYXJnJTIwbmFtZSUzRCUyMm1vZHVzJTIyJTIwdmFyaWQlM0QlMjJVUWglMjVTISU1REclN0IoOFFFN2FvUkZDbyUyMiUzRSUzQyUyRmFyZyUzRSUzQ2FyZyUyMG5hbWUlM0QlMjJjb25kaXRpb25zJTIyJTIwdmFyaWQlM0QlMjJtUnhrcSklNUQxMUclMkYqVlglNDBxdkxkRCUyMiUzRSUzQyUyRmFyZyUzRSUzQyUyRm11dGF0aW9uJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyTkFNRSUyMiUzRWJ1aWxkQ3JvblJ1bGUlM0MlMkZmaWVsZCUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlNDUklQVCUyMiUzRWJHVjBJSEpsYzNWc2RDQTlJQ0lpT3cwS2JHVjBJSEpsYzNWc2RGTjBZWEowSUQwZ0lpSTdEUXBzWlhRZ2IzWmhiRkJsY21sdlpDQTlJQ0lpT3cwS0RRcGpiMjVrYVhScGIyNXpMbVp2Y2tWaFkyZ29ablZ1WTNScGIyNGdLR3hwYm1Vc2FXNWtaWGdzSUdGeWNtRjVLU0I3RFFvTkNpQWdJQ0F2S2cwS0lDQWdJQ0FnSUNBbmV5SjBhVzFsSWpwN0luTjBZWEowSWpvaU1EZzZNREFpTENKbGJtUWlPaUl5TURvd01DSXNJbTF2WkdVaU9pSnRhVzUxZEdWeklpd2lhVzUwWlhKMllXd2lPako5TENKd1pYSnBiMlFpT25zaVpHRjVjeUk2TVgxOUp3MEtJQ0FnSUNvdkRRb2dJQ0FnYkdWMElHOXJaWGtnUFNCUFltcGxZM1F1YTJWNWN5aHNhVzVsS1RzTkNpQWdJQ0JzWlhRZ2IzWmhiQ0E5SUd4cGJtVmJiMnRsZVYwN0RRb2dJQ0FnYjJ0bGVTQTlJRzlyWlhrdWRHOVRkSEpwYm1jb0tTNXlaWEJzWVdObEtDOWNjeXN2Wnl3Z0p5Y3BPdzBLSUNBZ0RRb2dJQ0FnTHk5c2IyY29iMnRsZVN3aWFXNW1ieUlwT3cwS0lDQWdJQ0FnSUNCcFppaHZhMlY1SUQwOUlDSndaWEpwYjJRaUtYc05DaUFnSUNBZ0lDQWdJQ0FnSUc5clpYa2dQU0J6ZEhKcGJtZFJkVzkwWlNoN2MzUnlWbUZ5YVdGaWJHVTZJRzlyWlhsOUtUc05DaUFnSUNBZ0lDQWdJQ0FnSUM4dmJHOW5LQ0p2YTJWNUlHbHpPaUFpTENKcGJtWnZJaWs3RFFvZ0lDQWdJQ0FnSUNBZ0lDQnZkbUZzVUdWeWFXOWtJRDBnYjNaaGJGQmxjbWx2WkM1amIyNWpZWFFvYjJ0bGVTd2lPaUlzSUc5MllXd3BPdzBLSUNBZ0lDQWdJQ0I5SUdWc2MyVWdhV1lvYjJ0bGVTQWhQU0FpY0dWeWFXOWtJaWtnZXcwS0lDQWdJQ0FnSUNCdmEyVjVJRDBnYzNSeWFXNW5VWFZ2ZEdVb2UzTjBjbFpoY21saFlteGxPaUJ2YTJWNWZTazdJQ0FnSUEwS0lDQWdJQ0FnSUNCcFppaDBlWEJsYjJZZ2IzWmhiQ0E5UFNBaWMzUnlhVzVuSWlsN0RRb2dJQ0FnSUNBZ0lDQWdJQ0J2ZG1Gc0lEMGdjM1J5YVc1blVYVnZkR1VvZTNOMGNsWmhjbWxoWW14bE9pQnZkbUZzZlNrN0RRb2dJQ0FnSUNBZ0lIME5DaUFnSUNBZ0lDQWdMeTlzYjJjb2IydGxlU3dpZDJGeWJpSXBPdzBLSUNBZ0lDQWdJQ0F2TDJ4dlp5Z2lWbUZzT2lBaUlDc2diM1poYkNBcklDSWdmQ0IwZVhCbGIyWTZJQ0lySUhSNWNHVnZaaUJ2ZG1Gc0xDSnBibVp2SWlrN0RRb2dJQ0FnSUNBZ0lHbG1LR2x1WkdWNElEMDlQU0JoY25KaGVTNXNaVzVuZEdnZ0xURXBldzBLSUNBZ0lDQWdJQ0J5WlhOMWJIUWdQWEpsYzNWc2RDNWpiMjVqWVhRb2IydGxlU3dpT2lJc0lHOTJZV3dwT3lBTkNpQWdJQ0FnSUNBZ2ZTQmxiSE5sSUhzTkNpQWdJQ0FnSUNBZ2NtVnpkV3gwSUQxeVpYTjFiSFF1WTI5dVkyRjBLRzlyWlhrc0lqb2lMQ0J2ZG1Gc0xDSXNJaWs3SUNBZ0lDQWdJQ0FOQ2lBZ0lDQWdJQ0FnZlEwS0RRb2dJQ0FnSUNBZ0lIME5DZzBLRFFvTkNuMHBPdzBLRFFweVpYTjFiSFFnUFNCemRISnBibWRSZFc5MFpTaDdjM1J5Vm1GeWFXRmliR1U2SUhKbGMzVnNkQ3h6ZEhKUmRXOTBaVG9nSW50OUlpd2dZbTl2YkZOd2JHbDBVWFZ2ZEdVNklIUnlkV1Y5S1RzTkNpOHZiRzluS0c5MllXeFFaWEpwYjJRc0luZGhjbTRpS1RzTkNnMEtjM2RwZEdOb0tHMXZaSFZ6S1hzTkNpQWdJQ0JqWVhObElDSjBhVzFsSWpvTkNpQWdJQ0FnSUNBZ2NtVnpkV3gwVTNSaGNuUWdQU0FpZEdsdFpTSTdEUW9OQ2lBZ0lDQmtaV1poZFd4ME9nMEtJQ0FnSUNBZ0lDQnlaWE4xYkhSVGRHRnlkQ0E5SUNKMGFXMWxJanNOQ24wTkNuSmxjM1ZzZEZOMFlYSjBJRDBnYzNSeWFXNW5VWFZ2ZEdVb2UzTjBjbFpoY21saFlteGxPaUJ5WlhOMWJIUlRkR0Z5ZEgwcE93MEtjbVZ6ZFd4MFUzUmhjblFnUFNBaUlpNWpiMjVqWVhRb2NtVnpkV3gwVTNSaGNuUXNJam9pS1NBN0RRb05DZzBLY21WemRXeDBJRDBnSWlJdVkyOXVZMkYwS0hKbGMzVnNkRk4wWVhKMExDQnlaWE4xYkhRc0lpd2lMQ0J2ZG1Gc1VHVnlhVzlrS1RzTkNnMEtjbVZ6ZFd4MElEMGdjM1J5YVc1blVYVnZkR1VvZTNOMGNsWmhjbWxoWW14bE9uSmxjM1ZzZEN4emRISlJkVzkwWlRvaWUzMGlMR0p2YjJ4VGNHeHBkRkYxYjNSbE9pQjBjblZsSUgwcElEc05DaTh2Ykc5bktISmxjM1ZzZEN3aWQyRnliaUlwT3cwS0RRb05DbkpsZEhWeWJpQnlaWE4xYkhRNyUzQyUyRmZpZWxkJTNFJTNDY29tbWVudCUyMHBpbm5lZCUzRCUyMmZhbHNlJTIyJTIwaCUzRCUyMjgwJTIyJTIwdyUzRCUyMjE2MCUyMiUzRUJlc2NocmVpYmUlMjBkaWVzZSUyMEZ1bmt0aW9uJTIwJUUyJTgwJUE2JTNDJTJGY29tbWVudCUzRSUzQyUyRmJsb2NrJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIycHJvY2VkdXJlc19kZWZjdXN0b21yZXR1cm4lMjIlMjBpZCUzRCUyMiU3QjBjVyUzRjBWJTdCJTIzb05+fipzMzAwMkklMjIlMjB4JTNEJTIyNjMlMjIlMjB5JTNEJTIyMTEzJTIyJTNFJTNDbXV0YXRpb24lMjBzdGF0ZW1lbnRzJTNEJTIyZmFsc2UlMjIlM0UlM0NhcmclMjBuYW1lJTNEJTIycm9vdGRwJTIyJTIwdmFyaWQlM0QlMjJvNk51LUZjQnZEMyUyNHIlMkYlN0QuanElNjAqJTIyJTNFJTNDJTJGYXJnJTNFJTNDJTJGbXV0YXRpb24lM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJOQU1FJTIyJTNFZ2V0Q3JvbkNvbmRpdGlvbnMlM0MlMkZmaWVsZCUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlNDUklQVCUyMiUzRWJHVjBJSEpsYzNWc2RDQTlJRnRkT3cwS2JHOW5LQ0puWlhSRGNtOXVRMjl1WkhNaUxDSjNZWEp1SWlrN0RRcGpiMjV6ZENCa2NITWdQU0FrS0hKdmIzUmtjQ2t1ZEc5QmNuSmhlU2dwT3cwS2JHOW5LR1J3Y3lrN0RRcGtjSE11Wm05eVJXRmphQ2dvYVdRcElEMCUyQklIc05DaUFnSUNCamIyNXpkQ0JrY0haaGJDQTlJR2RsZEZOMFlYUmxLR2xrS1M1MllXdzdEUW9nSUNBZ1kyOXVjM1FnWkhBZ1BTQnpjR3hwZEhSV1lYSnBZV0pzWlNocFpDd2liR0Z6ZENJc0lpNGlLVHNOQ2lBZ0lDQnNaWFFnYjJKcUlEMGdlMzA3RFFvZ0lDQWdiMkpxVzJSd1hTQTlJR1J3ZG1Gc093MEtJQ0FnSUhKbGMzVnNkQzV3ZFhOb0tHOWlhaWs3RFFwOUtUc05DaUFnSUNBdkwyeHZaeWh5WlhOMWJIUXNJbmRoY200aUtUc05DbkpsZEhWeWJpQnlaWE4xYkhRNyUzQyUyRmZpZWxkJTNFJTNDY29tbWVudCUyMHBpbm5lZCUzRCUyMmZhbHNlJTIyJTIwaCUzRCUyMjgwJTIyJTIwdyUzRCUyMjE2MCUyMiUzRUJlc2NocmVpYmUlMjBkaWVzZSUyMEZ1bmt0aW9uJTIwJUUyJTgwJUE2JTNDJTJGY29tbWVudCUzRSUzQyUyRmJsb2NrJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIycHJvY2VkdXJlc19kZWZjdXN0b21yZXR1cm4lMjIlMjBpZCUzRCUyMlhZU185WiUzQmZOJTNENi5XKjdCMDEzYiUyMiUyMHglM0QlMjI2MyUyMiUyMHklM0QlMjIxMzglMjIlM0UlM0NtdXRhdGlvbiUyMHN0YXRlbWVudHMlM0QlMjJmYWxzZSUyMiUzRSUzQ2FyZyUyMG5hbWUlM0QlMjJPYmplY3RJRCUyMiUyMHZhcmlkJTNEJTIyTSU2MGZyOS1hRyUzQVMlMkNLcSh4JTVFYTkoLiUyMiUzRSUzQyUyRmFyZyUzRSUzQyUyRm11dGF0aW9uJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyTkFNRSUyMiUzRWdsX2xlc2VSYXVtJTNDJTJGZmllbGQlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJTQ1JJUFQlMjIlM0ViR1YwSUhKdmIyMGdQU0JzWlhObFVtRjFiU2hQWW1wbFkzUkpSQ2s3RFFweVpYUjFjbTRnY205dmJUcyUzRCUzQyUyRmZpZWxkJTNFJTNDY29tbWVudCUyMHBpbm5lZCUzRCUyMmZhbHNlJTIyJTIwaCUzRCUyMjgwJTIyJTIwdyUzRCUyMjE2MCUyMiUzRUJlc2NocmVpYmUlMjBkaWVzZSUyMEZ1bmt0aW9uJTIwJUUyJTgwJUE2JTNDJTJGY29tbWVudCUzRSUzQyUyRmJsb2NrJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydGV4dCUyMiUyMGlkJTNEJTIyNHUlNDB0Tl9tZCklM0ElNUQlNDBLJTQwMG9yQyU1RHclMjIlMjBkaXNhYmxlZCUzRCUyMnRydWUlMjIlMjB4JTNEJTIyMTA2MyUyMiUyMHklM0QlMjIxODglMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJURVhUJTIyJTNFJTdCJTIydGltZSUyMiUzQSU3QiUyMmVuZCUyMiUzQSUyMjIwJTNBMDAlMjIlMkMlMjJpbnRlcnZhbCUyMiUzQTIlMkMlMjJtb2RlJTIyJTNBJTIybWludXRlcyUyMiUyQyUyMnN0YXJ0JTIyJTNBJTIyMDglM0EwMCUyMiU3RCUyQyUyMnBlcmlvZCUyMiUzQSU3QiUyMmRheXMlMjIlM0ExJTdEJTdEJTNDJTJGZmllbGQlM0UlM0MlMkZibG9jayUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnZhcmlhYmxlc19zZXQlMjIlMjBpZCUzRCUyMkwlNUJxNkQlNURtREJvV1klNURLTCUzQWNoJTI1ZCUyMiUyMHglM0QlMjIxMiUyMiUyMHklM0QlMjIyNjklMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJWQVIlMjIlMjBpZCUzRCUyMi5oNlhXJTI1cV9ZQyUzRGgyYV8teEw5UyUyMiUzRXZhcl9Dcm9uQ29uZGl0aW9ucyUzQyUyRmZpZWxkJTNFJTNDdmFsdWUlMjBuYW1lJTNEJTIyVkFMVUUlMjIlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJwcm9jZWR1cmVzX2NhbGxjdXN0b21yZXR1cm4lMjIlMjBpZCUzRCUyMjllcGslMkNDbyUyQzZlRVFUMDRhXyU0ME1xJTIyJTIwaW5saW5lJTNEJTIydHJ1ZSUyMiUzRSUzQ211dGF0aW9uJTIwbmFtZSUzRCUyMmdldENyb25Db25kaXRpb25zJTIyJTNFJTNDYXJnJTIwbmFtZSUzRCUyMnJvb3RkcCUyMiUzRSUzQyUyRmFyZyUzRSUzQyUyRm11dGF0aW9uJTNFJTNDdmFsdWUlMjBuYW1lJTNEJTIyQVJHMCUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnRleHQlMjIlMjBpZCUzRCUyMjJ4V3AyTn5VJTdDVmguTkJwVzQlNURwVCUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlRFWFQlMjIlM0UwX3VzZXJkYXRhLjAuUm9sbGFkZW4uQWxsZ2VtZWluLlNjaGF0dGVuLmNyb25Db25kaXRpb25zLiolM0MlMkZmaWVsZCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGdmFsdWUlM0UlM0MlMkZibG9jayUzRSUzQyUyRnZhbHVlJTNFJTNDbmV4dCUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmRlYnVnJTIyJTIwaWQlM0QlMjJuJTNCVCUzRDhqT1J+JTNGTjBWOHYuQUVvSyUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlNldmVyaXR5JTIyJTNFaW5mbyUzQyUyRmZpZWxkJTNFJTNDdmFsdWUlMjBuYW1lJTNEJTIyVEVYVCUyMiUzRSUzQ3NoYWRvdyUyMHR5cGUlM0QlMjJ0ZXh0JTIyJTIwaWQlM0QlMjJEU1NtcWElN0MxbV9EcCUzRCF6UVE0dVMlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJURVhUJTIyJTNFdGVzdCUzQyUyRmZpZWxkJTNFJTNDJTJGc2hhZG93JTNFJTNDYmxvY2slMjB0eXBlJTNEJTIycHJvY2VkdXJlc19jYWxsY3VzdG9tcmV0dXJuJTIyJTIwaWQlM0QlMjIuOVlnRi1GTTlFVkh6RXY0JTIzZzElMkYlMjIlMjBpbmxpbmUlM0QlMjJ0cnVlJTIyJTNFJTNDbXV0YXRpb24lMjBuYW1lJTNEJTIyYnVpbGRDcm9uUnVsZSUyMiUzRSUzQ2FyZyUyMG5hbWUlM0QlMjJtb2R1cyUyMiUzRSUzQyUyRmFyZyUzRSUzQ2FyZyUyMG5hbWUlM0QlMjJjb25kaXRpb25zJTIyJTNFJTNDJTJGYXJnJTNFJTNDJTJGbXV0YXRpb24lM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJBUkcwJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydGV4dCUyMiUyMGlkJTNEJTIySG1HOCUzQkolMkJaWCUzRnlwJTdEJTI0cyUyNWxZRyU3RCUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlRFWFQlMjIlM0V0aW1lJTNDJTJGZmllbGQlM0UlM0MlMkZibG9jayUzRSUzQyUyRnZhbHVlJTNFJTNDdmFsdWUlMjBuYW1lJTNEJTIyQVJHMSUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnZhcmlhYmxlc19nZXQlMjIlMjBpZCUzRCUyMnE2RjZsJTdCVUpYJTNGM1Y5dHUlNDAhamxlJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVkFSJTIyJTIwaWQlM0QlMjIuaDZYVyUyNXFfWUMlM0RoMmFfLXhMOVMlMjIlM0V2YXJfQ3JvbkNvbmRpdGlvbnMlM0MlMkZmaWVsZCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGdmFsdWUlM0UlM0MlMkZibG9jayUzRSUzQyUyRnZhbHVlJTNFJTNDbmV4dCUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmRlYnVnJTIyJTIwaWQlM0QlMjIlMkJKfmklNDBLMEZhJTdCeTBkKiUzQkFXbjglN0IlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJTZXZlcml0eSUyMiUzRWluZm8lM0MlMkZmaWVsZCUzRSUzQ3ZhbHVlJTIwbmFtZSUzRCUyMlRFWFQlMjIlM0UlM0NzaGFkb3clMjB0eXBlJTNEJTIydGV4dCUyMiUyMGlkJTNEJTIyRFNTbXFhJTdDMW1fRHAlM0QhelFRNHVTJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVEVYVCUyMiUzRXRlc3QlM0MlMkZmaWVsZCUzRSUzQyUyRnNoYWRvdyUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnZhcmlhYmxlc19nZXQlMjIlMjBpZCUzRCUyMkIzViFiSkclMkNOcUJ0Y0lfc1RRdW0lMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJWQVIlMjIlMjBpZCUzRCUyMi5oNlhXJTI1cV9ZQyUzRGgyYV8teEw5UyUyMiUzRXZhcl9Dcm9uQ29uZGl0aW9ucyUzQyUyRmZpZWxkJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZ2YWx1ZSUzRSUzQ25leHQlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJwcm9jZWR1cmVzX2NhbGxjdXN0b21ub3JldHVybiUyMiUyMGlkJTNEJTIyc2RVaWN0fiU0MFglN0JDKVhKS34lMkMoJTNESCUyMiUzRSUzQ211dGF0aW9uJTIwbmFtZSUzRCUyMmNyZWF0ZVNjaGVkdWxlJTIyJTNFJTNDYXJnJTIwbmFtZSUzRCUyMmNyb25Db25kaXRpb25zJTIyJTNFJTNDJTJGYXJnJTNFJTNDJTJGbXV0YXRpb24lM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJBUkcwJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydmFyaWFibGVzX2dldCUyMiUyMGlkJTNEJTIyOSElMjMlMjMlM0I1JTdCJTNCNDUzJTJGVXglM0FCN2hMWiUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlZBUiUyMiUyMGlkJTNEJTIyLmg2WFclMjVxX1lDJTNEaDJhXy14TDlTJTIyJTNFdmFyX0Nyb25Db25kaXRpb25zJTNDJTJGZmllbGQlM0UlM0MlMkZibG9jayUzRSUzQyUyRnZhbHVlJTNFJTNDbmV4dCUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnByb2NlZHVyZXNfY2FsbGN1c3RvbW5vcmV0dXJuJTIyJTIwaWQlM0QlMjJyJTIzSG1iVW4uTUt3aEk4flZpNl9CJTIyJTNFJTNDbXV0YXRpb24lMjBuYW1lJTNEJTIyZ2V0U2NoZWR1bGUlMjIlM0UlM0MlMkZtdXRhdGlvbiUzRSUzQ25leHQlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJvbl9leHQlMjIlMjBpZCUzRCUyMmZ0UG9VZ0hNdG8lM0ElNUV6cDElN0JzWlktJTIyJTNFJTNDbXV0YXRpb24lMjB4bWxucyUzRCUyMmh0dHAlM0ElMkYlMkZ3d3cudzMub3JnJTJGMTk5OSUyRnhodG1sJTIyJTIwaXRlbXMlM0QlMjIxJTIyJTNFJTNDJTJGbXV0YXRpb24lM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJDT05ESVRJT04lMjIlM0VhbnklM0MlMkZmaWVsZCUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMkFDS19DT05ESVRJT04lMjIlM0UlM0MlMkZmaWVsZCUzRSUzQ3ZhbHVlJTIwbmFtZSUzRCUyMk9JRDAlMjIlM0UlM0NzaGFkb3clMjB0eXBlJTNEJTIyZmllbGRfb2lkJTIyJTIwaWQlM0QlMjJTdTdCel9wJTdCMjMuU00lM0R0Rn5+dWYlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJvaWQlMjIlM0VJRCUyMGF1c3clQzMlQTRobGVuJTNDJTJGZmllbGQlM0UlM0MlMkZzaGFkb3clM0UlM0NibG9jayUyMHR5cGUlM0QlMjJzZWxlY3RvciUyMiUyMGlkJTNEJTIyWS5kanRib0x2KkxTTVEqdSUyNTclMkNkJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVEVYVCUyMiUzRXN0YXRlJTVCc3RhdGUuaWQlM0QwX3VzZXJkYXRhLjAuUm9sbGFkZW4uQWxsZ2VtZWluLlNjaGF0dGVuLmNyb25Db25kaXRpb25zLiolNUQlM0MlMkZmaWVsZCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGdmFsdWUlM0UlM0NzdGF0ZW1lbnQlMjBuYW1lJTNEJTIyU1RBVEVNRU5UJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydmFyaWFibGVzX3NldCUyMiUyMGlkJTNEJTIyR1UwViUzRFBUSHdPby41MXVkKHVPSSUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlZBUiUyMiUyMGlkJTNEJTIyLmg2WFclMjVxX1lDJTNEaDJhXy14TDlTJTIyJTNFdmFyX0Nyb25Db25kaXRpb25zJTNDJTJGZmllbGQlM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJWQUxVRSUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnByb2NlZHVyZXNfY2FsbGN1c3RvbXJldHVybiUyMiUyMGlkJTNEJTIyLUhJJTVEKFZSaCloJTYwKCUzQmhiWkwxQ1YlMjIlMjBpbmxpbmUlM0QlMjJ0cnVlJTIyJTNFJTNDbXV0YXRpb24lMjBuYW1lJTNEJTIyZ2V0Q3JvbkNvbmRpdGlvbnMlMjIlM0UlM0NhcmclMjBuYW1lJTNEJTIycm9vdGRwJTIyJTNFJTNDJTJGYXJnJTNFJTNDJTJGbXV0YXRpb24lM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJBUkcwJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydGV4dCUyMiUyMGlkJTNEJTIyd0hCa1QlMkJWcSUyM045UzchdWtMZWw2JTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVEVYVCUyMiUzRTBfdXNlcmRhdGEuMC5Sb2xsYWRlbi5BbGxnZW1laW4uU2NoYXR0ZW4uY3JvbkNvbmRpdGlvbnMuKiUzQyUyRmZpZWxkJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZ2YWx1ZSUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGdmFsdWUlM0UlM0NuZXh0JTNFJTNDYmxvY2slMjB0eXBlJTNEJTIycHJvY2VkdXJlc19jYWxsbm9yZXR1cm4lMjIlMjBpZCUzRCUyMiU0MCgyZnlXIVRoYWpON19OWml6RmYlMjIlM0UlM0NtdXRhdGlvbiUyMG5hbWUlM0QlMjJydW5UZXN0JTIyJTNFJTNDYXJnJTIwbmFtZSUzRCUyMmRwJTIyJTNFJTNDJTJGYXJnJTNFJTNDJTJGbXV0YXRpb24lM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJBUkcwJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydmFyaWFibGVzX2dldCUyMiUyMGlkJTNEJTIyYTg2S04uJTdCc3IlMjN2JTNBJTQwZiUzQXUlN0J+Qk0lMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJWQVIlMjIlMjBpZCUzRCUyMi5oNlhXJTI1cV9ZQyUzRGgyYV8teEw5UyUyMiUzRXZhcl9Dcm9uQ29uZGl0aW9ucyUzQyUyRmZpZWxkJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZ2YWx1ZSUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGbmV4dCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGc3RhdGVtZW50JTNFJTNDJTJGYmxvY2slM0UlM0MlMkZuZXh0JTNFJTNDJTJGYmxvY2slM0UlM0MlMkZuZXh0JTNFJTNDJTJGYmxvY2slM0UlM0MlMkZuZXh0JTNFJTNDJTJGYmxvY2slM0UlM0MlMkZuZXh0JTNFJTNDJTJGYmxvY2slM0UlM0MlMkZuZXh0JTNFJTNDJTJGYmxvY2slM0UlM0NibG9jayUyMHR5cGUlM0QlMjJwcm9jZWR1cmVzX2RlZm5vcmV0dXJuJTIyJTIwaWQlM0QlMjJseS0lN0RZRSUyM1pxJTJCUW8lNURtfiUyRllRblElMjIlMjB4JTNEJTIyOTg4JTIyJTIweSUzRCUyMjMxMyUyMiUzRSUzQ211dGF0aW9uJTNFJTNDYXJnJTIwbmFtZSUzRCUyMmRwJTIyJTIwdmFyaWQlM0QlMjI1USUyQ1dCRiU1Qm0lMjMlMkZIJTJDa08heCU3Qzg0JTVEJTIyJTNFJTNDJTJGYXJnJTNFJTNDJTJGbXV0YXRpb24lM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJOQU1FJTIyJTNFcnVuVGVzdCUzQyUyRmZpZWxkJTNFJTNDY29tbWVudCUyMHBpbm5lZCUzRCUyMmZhbHNlJTIyJTIwaCUzRCUyMjgwJTIyJTIwdyUzRCUyMjE2MCUyMiUzRUJlc2NocmVpYmUlMjBkaWVzZSUyMEZ1bmt0aW9uJTIwJUUyJTgwJUE2JTNDJTJGY29tbWVudCUzRSUzQ3N0YXRlbWVudCUyMG5hbWUlM0QlMjJTVEFDSyUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmRlYnVnJTIyJTIwaWQlM0QlMjJXJTNBViUzRlNLKElqM1hPJTQwTnNGKSUyM3AtJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyU2V2ZXJpdHklMjIlM0VpbmZvJTNDJTJGZmllbGQlM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJURVhUJTIyJTNFJTNDc2hhZG93JTIwdHlwZSUzRCUyMnRleHQlMjIlMjBpZCUzRCUyMjdieiU1RU9JJTI1MUhIZ0gwYS1zeiUyQiU1REQlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJURVhUJTIyJTNFSGllciUyMHdpcmQlMjBkZXIlMjBTY2hlZHVsZXIlMjBnZXNldHp0JTNDJTJGZmllbGQlM0UlM0MlMkZzaGFkb3clM0UlM0MlMkZ2YWx1ZSUzRSUzQ25leHQlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJ2YXJpYWJsZXNfc2V0JTIyJTIwaWQlM0QlMjJ6bSFITVA3X1pOViUyMyUyRikpQndNcVglMjIlMjBkaXNhYmxlZCUzRCUyMnRydWUlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJWQVIlMjIlMjBpZCUzRCUyMkElMjR6SiUzRC5vYS5LJTdDJTJDODAlM0RXJTI0UyU0MEclMjIlM0V2YXJfUmF1bSUzQyUyRmZpZWxkJTNFJTNDdmFsdWUlMjBuYW1lJTNEJTIyVkFMVUUlMjIlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJwcm9jZWR1cmVzX2NhbGxjdXN0b21yZXR1cm4lMjIlMjBpZCUzRCUyMkJWJTQwTDJaNCUzQjFVSCUzRiU1RCU1QmFXRDQ0eiUyMiUzRSUzQ211dGF0aW9uJTIwbmFtZSUzRCUyMmdsX2xlc2VSYXVtJTIyJTNFJTNDYXJnJTIwbmFtZSUzRCUyMk9iamVjdElEJTIyJTNFJTNDJTJGYXJnJTNFJTNDJTJGbXV0YXRpb24lM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJBUkcwJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydmFyaWFibGVzX2dldCUyMiUyMGlkJTNEJTIyNnRXQWJFNlpEMmElN0JHTkEtQ3UlMjM0JTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVkFSJTIyJTIwaWQlM0QlMjI1USUyQ1dCRiU1Qm0lMjMlMkZIJTJDa08heCU3Qzg0JTVEJTIyJTNFZHAlM0MlMkZmaWVsZCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGdmFsdWUlM0UlM0MlMkZibG9jayUzRSUzQyUyRnZhbHVlJTNFJTNDbmV4dCUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnNjaGVkdWxlX2NsZWFyJTIyJTIwaWQlM0QlMjIpYzElMjMlM0JCTkNNaWoyJTNEJTJCJTJDTWklMjRfcyUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMk5BTUUlMjIlM0VzY2hlZHVsZTElM0MlMkZmaWVsZCUzRSUzQ25leHQlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJzY2hlZHVsZV9jcmVhdGUlMjIlMjBpZCUzRCUyMiUyNCglMjQlNUJ0ZDVscjhKJTNCZiUzQjlFejhUJTdDJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyTkFNRSUyMiUzRXNjaGVkdWxlMSUzQyUyRmZpZWxkJTNFJTNDdmFsdWUlMjBuYW1lJTNEJTIyU0NIRURVTEUlMjIlM0UlM0NzaGFkb3clMjB0eXBlJTNEJTIyZmllbGRfY3JvbiUyMiUyMGlkJTNEJTIydSElMkIlNUIhJTIzby0lNUV5YSU3RHlSQXF+VC5FJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyQ1JPTiUyMiUzRSolMjAqJTIwKiUyMColMjAqJTNDJTJGZmllbGQlM0UlM0MlMkZzaGFkb3clM0UlM0NibG9jayUyMHR5cGUlM0QlMjJwcm9jZWR1cmVzX2NhbGxjdXN0b21yZXR1cm4lMjIlMjBpZCUzRCUyMnd3JTNGWFMqfl9UTHh0ZUY5S09aenglMjIlMjBpbmxpbmUlM0QlMjJ0cnVlJTIyJTNFJTNDbXV0YXRpb24lMjBuYW1lJTNEJTIyYnVpbGRDcm9uUnVsZSUyMiUzRSUzQ2FyZyUyMG5hbWUlM0QlMjJtb2R1cyUyMiUzRSUzQyUyRmFyZyUzRSUzQ2FyZyUyMG5hbWUlM0QlMjJjb25kaXRpb25zJTIyJTNFJTNDJTJGYXJnJTNFJTNDJTJGbXV0YXRpb24lM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJBUkcwJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydGV4dCUyMiUyMGlkJTNEJTIyMyg1YTBNLWMlNDAxVWwoRERVUlQlMkM2JTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVEVYVCUyMiUzRXRpbWUlM0MlMkZmaWVsZCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGdmFsdWUlM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJBUkcxJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydmFyaWFibGVzX2dldCUyMiUyMGlkJTNEJTIySzlBVU1oJTQwMFZyJTNBLThtVTN+JTdCcmElMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJWQVIlMjIlMjBpZCUzRCUyMi5oNlhXJTI1cV9ZQyUzRGgyYV8teEw5UyUyMiUzRXZhcl9Dcm9uQ29uZGl0aW9ucyUzQyUyRmZpZWxkJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZ2YWx1ZSUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGdmFsdWUlM0UlM0NzdGF0ZW1lbnQlMjBuYW1lJTNEJTIyU1RBVEVNRU5UJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIyZGVidWclMjIlMjBpZCUzRCUyMk0lMkY4RipPeGQqTVc0NSU3RCUyNWgpWDQlN0IlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJTZXZlcml0eSUyMiUzRWluZm8lM0MlMkZmaWVsZCUzRSUzQ3ZhbHVlJTIwbmFtZSUzRCUyMlRFWFQlMjIlM0UlM0NzaGFkb3clMjB0eXBlJTNEJTIydGV4dCUyMiUyMGlkJTNEJTIyRyUzRCU1RFAyZ3pMJTVCbUUlM0ZlMC1xLS5DLiUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlRFWFQlMjIlM0VIaWVyJTIwbCVDMyVBNHVmdCUyMGRlciUyMFRyaWdnZXIlM0MlMkZmaWVsZCUzRSUzQyUyRnNoYWRvdyUzRSUzQyUyRnZhbHVlJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZzdGF0ZW1lbnQlM0UlM0NuZXh0JTNFJTNDYmxvY2slMjB0eXBlJTNEJTIycHJvY2VkdXJlc19jYWxsY3VzdG9tbm9yZXR1cm4lMjIlMjBpZCUzRCUyMmJOJTdCcC0lN0JJYnAhJTdEJTJCRktnSWRBaF8lMjIlM0UlM0NtdXRhdGlvbiUyMG5hbWUlM0QlMjJnZXRTY2hlZHVsZSUyMiUzRSUzQyUyRm11dGF0aW9uJTNFJTNDbmV4dCUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmNvbnRyb2xzX2lmJTIyJTIwaWQlM0QlMjJYcmclMjQyTlMlNUVnQ04qJTNGT3BVc0cwUSUyMiUyMGRpc2FibGVkJTNEJTIydHJ1ZSUyMiUzRSUzQ211dGF0aW9uJTIwZWxzZSUzRCUyMjElMjIlM0UlM0MlMkZtdXRhdGlvbiUzRSUzQ3ZhbHVlJTIwbmFtZSUzRCUyMklGMCUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmxvZ2ljX2NvbXBhcmUlMjIlMjBpZCUzRCUyMld4LiU3QkolNUVhX3olMkJKJTI1SUlkJTQwJTVCJTdCU0clMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJPUCUyMiUzRUVRJTNDJTJGZmllbGQlM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJBJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydGV4dCUyMiUyMGlkJTNEJTIyVyUzRCUyNUF5JTYwLkRpMCUyNHFlcSU3Q24lMkIlMjUlM0J1JTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVEVYVCUyMiUzRXVuZGVmaW5lZCUzQyUyRmZpZWxkJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZ2YWx1ZSUzRSUzQ3ZhbHVlJTIwbmFtZSUzRCUyMkIlMjIlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJjb252ZXJ0X3R5cGUlMjIlMjBpZCUzRCUyMjBTOSU1Qjl4SClsRU0teF9Edk5YVjQlMjIlM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJJVEVNJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydmFyaWFibGVzX2dldCUyMiUyMGlkJTNEJTIyMjU5SkglMkIoN1ZYdEd4cTlhJTJGTyglN0QlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJWQVIlMjIlMjBpZCUzRCUyMkElMjR6SiUzRC5vYS5LJTdDJTJDODAlM0RXJTI0UyU0MEclMjIlM0V2YXJfUmF1bSUzQyUyRmZpZWxkJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZ2YWx1ZSUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGdmFsdWUlM0UlM0MlMkZibG9jayUzRSUzQyUyRnZhbHVlJTNFJTNDc3RhdGVtZW50JTIwbmFtZSUzRCUyMkRPMCUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmRlYnVnJTIyJTIwaWQlM0QlMjIhLSU3Q1RZSlZjQ35XMyU3QnhYan5oS1glMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJTZXZlcml0eSUyMiUzRWluZm8lM0MlMkZmaWVsZCUzRSUzQ3ZhbHVlJTIwbmFtZSUzRCUyMlRFWFQlMjIlM0UlM0NzaGFkb3clMjB0eXBlJTNEJTIydGV4dCUyMiUyMGlkJTNEJTIyISU3QiUzQiUyQ3BnNiU2MC4yRyU3QyU1QkxuJTJCbjFoJTYwJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVEVYVCUyMiUzRWtlaW4lMjBSYXVtJTNDJTJGZmllbGQlM0UlM0MlMkZzaGFkb3clM0UlM0MlMkZ2YWx1ZSUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGc3RhdGVtZW50JTNFJTNDc3RhdGVtZW50JTIwbmFtZSUzRCUyMkVMU0UlMjIlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJkZWJ1ZyUyMiUyMGlkJTNEJTIyNjclNUJzUnBMJTJCblEwNUFnJTQwMSlHNHYlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJTZXZlcml0eSUyMiUzRWluZm8lM0MlMkZmaWVsZCUzRSUzQ3ZhbHVlJTIwbmFtZSUzRCUyMlRFWFQlMjIlM0UlM0NzaGFkb3clMjB0eXBlJTNEJTIydGV4dCUyMiUyMGlkJTNEJTIydWMyJTJDOHQ4Qk5IdnYlMjV6JTJCSCUzQSUyMy5iJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVEVYVCUyMiUzRXRlc3QlM0MlMkZmaWVsZCUzRSUzQyUyRnNoYWRvdyUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnZhcmlhYmxlc19nZXQlMjIlMjBpZCUzRCUyMnMlMkYlMjVGJTNGKkUpZmNPSWMlMjRteGlGJTVEdyUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlZBUiUyMiUyMGlkJTNEJTIyQSUyNHpKJTNELm9hLkslN0MlMkM4MCUzRFclMjRTJTQwRyUyMiUzRXZhcl9SYXVtJTNDJTJGZmllbGQlM0UlM0MlMkZibG9jayUzRSUzQyUyRnZhbHVlJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZzdGF0ZW1lbnQlM0UlM0MlMkZibG9jayUzRSUzQyUyRm5leHQlM0UlM0MlMkZibG9jayUzRSUzQyUyRm5leHQlM0UlM0MlMkZibG9jayUzRSUzQyUyRm5leHQlM0UlM0MlMkZibG9jayUzRSUzQyUyRm5leHQlM0UlM0MlMkZibG9jayUzRSUzQyUyRm5leHQlM0UlM0MlMkZibG9jayUzRSUzQyUyRnN0YXRlbWVudCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGeG1sJTNF
                
                T Offline
                T Offline
                trojanhector
                schrieb am zuletzt editiert von
                #9

                @trojanhector
                Das hier ist noch eine hilfsfunction, die bei mir im globalen Javascript Modul läuft.

                function stringQuote({strVariable='',strQuote = '"',boolReverse = false, boolSplitQuote = false}){
                    let result = "";
                    let strRQuote = "";
                    if(boolReverse){
                        strRQuote = boolReverse ? strQuote.split('').reverse().join(""): strQuote ;        
                    }
                    else if(boolSplitQuote){
                        strRQuote = strQuote.substring(1,2);
                        strQuote = strQuote.substring(0,1);        
                    } else {
                        strRQuote = strQuote;
                    }
                    result = result.concat(strQuote,strVariable,strRQuote);
                
                    return result;
                }
                
                1 Antwort Letzte Antwort
                0
                • T trojanhector

                  @homoran
                  Hier ist soweit mein Code, angelehnt an das Beispiel aus dem Netz.

                  const schedule = require('node-schedule');
                  const EventEmitter = require('events');
                  class Ee extends EventEmitter {}
                  
                  const jobStatus = new Ee();
                  
                  jobStatus.on('finished', () => {
                      console.log('JOB FINISHED');
                      job.cancel();
                  
                      // Preform your DB Operations here (in your case: delete job from database)
                  
                  });
                  
                  function calcSecondsFromTime(time){
                      //console.log("Time: " + time);
                      var array = time.split(":");
                      var seconds = 0; 
                      if(typeof(array[2] = "undefined")){
                          seconds = (parseInt(array[0], 10) * 60 * 60) + (parseInt(array[1], 10) * 60);        
                      } else {
                          seconds = (parseInt(array[0], 10) * 60 * 60) + (parseInt(array[1], 10) * 60) + parseInt(array[2], 10); 
                      }
                      //console.log("Array: "+ array.length +" Seconds: " + seconds);
                      //console.log(array[0] +" -- " + array[1] +" -- " + array[2] +" -- " );
                      return seconds;
                  } 
                  
                  //So funktioniert das nicht.
                  const strStart = "20:10"
                  const strEnd = "21:15"
                  const startTime = calcSecondsFromTime(strStart);
                  const endTime = calcSecondsFromTime(strEnd);
                  log("StartTime: " + startTime,"info");
                  log("EndTime: " + endTime, "info");
                  
                  /*
                  //So funktioniert das.
                  const startTime = new Date(Date.now() + 5000);
                  const endTime = new Date(startTime.getTime() + 5000);
                  */
                  
                  const job = schedule.scheduleJob({ start: startTime, end: endTime, rule: '*/1 * * * * *' }, function(){
                  
                      console.log('Time for tea!');
                              if (this.nextInvocation() === null) {
                            //here you can code whatever you need to do in the last invocation
                      jobStatus.emit('finished'); // Emit your job done emitter when you are done.            
                          }
                  
                  });
                  

                  Das mit dem jeweiligen Timestamp um Mitternacht setzt immer eine Bearbeitung voraus. Mein Ziel ist es aber einmal Start und Ende als hh:mm anzugeben und dann nicht mehr.

                  Wenn ich in Blockly den Wizard vom kleinen Cron Bauteil nehme, kann ich da Start und Endzeit eingeben.
                  Dann kommt als JS sowas raus:
                  '{"time":{"start":"08:00","end":"20:00","mode":"minutes","interval":2},"period":{"days":1}}'
                  Und das habe ich mit den Werten aus den Objekten nachgebaut und es funktioniert.

                  Hier ist mein Ansatz als Blockly. Den Teil mit nextInvocation ist in der function createSchedule als Block auskommentiert, da er Fehler schmeißt und den Adapter zum Neustart zwingt.

                  var cronConditions, modus, conditions, rootdp, ObjectID, var_CronConditions, dp, var_Raum, schedule1;
                  
                  // Beschreibe diese Funktion …
                  async function getSchedule() {
                      const list = getSchedules(false);
                      list.forEach(schedule => log(JSON.stringify(schedule)));
                  }
                  
                  // Beschreibe diese Funktion …
                  async function createSchedule(cronConditions) {
                      let testSched = null;
                      const EventEmitter = require('events');
                      class Ee extends EventEmitter {}
                      
                      const jobStatus = new Ee();
                      //log("cronConditions: " + cronConditions,"info");
                      
                      jobStatus.on('finished', () => {
                          console.log('JOB FINISHED');
                          job.cancel();
                           // Preform your DB Operations here (in your case: delete job from database)
                      
                      });
                         
                      (() => { if (testSched) { clearSchedule(testSched); testSched = null; }})();
                      //log("TestSchedCond: " + cronConditions,"warn");
                        console.info('Hier wird der TESTScheduler gesetzt');
                        (() => { if (testSched) { clearSchedule(testSched); testSched = null; }})();
                      
                        testSched = schedule((await buildCronRule('time', cronConditions)), function() {
                          console.info('Hier läuft der TESTTrigger');
                          /*
                          if (this.nextInvocation() === null) {
                                  //here you can code whatever you need to do in the last invocation
                              jobStatus.emit('finished'); // Emit your job done emitter when you are done.            
                                  }
                                  */
                        });
                       
                      
                  
                  }
                  
                  // Beschreibe diese Funktion …
                  async function buildCronRule(modus, conditions) {
                      let result = "";
                      let resultStart = "";
                      let ovalPeriod = "";
                      
                      conditions.forEach(function (line,index, array) {
                      
                          /*
                              '{"time":{"start":"08:00","end":"20:00","mode":"minutes","interval":2},"period":{"days":1}}'
                          */
                          let okey = Object.keys(line);
                          let oval = line[okey];
                          okey = okey.toString().replace(/\s+/g, '');
                         
                          //log(okey,"info");
                              if(okey == "period"){
                                  okey = stringQuote({strVariable: okey});
                                  //log("okey is: ","info");
                                  ovalPeriod = ovalPeriod.concat(okey,":", oval);
                              } else if(okey != "period") {
                              okey = stringQuote({strVariable: okey});    
                              if(typeof oval == "string"){
                                  oval = stringQuote({strVariable: oval});
                              }
                              //log(okey,"warn");
                              //log("Val: " + oval + " | typeof: "+ typeof oval,"info");
                              if(index === array.length -1){
                              result =result.concat(okey,":", oval); 
                              } else {
                              result =result.concat(okey,":", oval,",");        
                              }
                      
                              }
                      
                      
                      
                      });
                      
                      result = stringQuote({strVariable: result,strQuote: "{}", boolSplitQuote: true});
                      //log(ovalPeriod,"warn");
                      
                      switch(modus){
                          case "time":
                              resultStart = "time";
                      
                          default:
                              resultStart = "time";
                      }
                      resultStart = stringQuote({strVariable: resultStart});
                      resultStart = "".concat(resultStart,":") ;
                      
                      
                      result = "".concat(resultStart, result,",", ovalPeriod);
                      
                      result = stringQuote({strVariable:result,strQuote:"{}",boolSplitQuote: true }) ;
                      //log(result,"warn");
                      
                      
                      return result;
                  }
                  
                  // Beschreibe diese Funktion …
                  async function getCronConditions(rootdp) {
                      let result = [];
                      log("getCronConds","warn");
                      const dps = $(rootdp).toArray();
                      log(dps);
                      dps.forEach((id) => {
                          const dpval = getState(id).val;
                          const dp = splittVariable(id,"last",".");
                          let obj = {};
                          obj[dp] = dpval;
                          result.push(obj);
                      });
                          //log(result,"warn");
                      return result;
                  }
                  
                  // Beschreibe diese Funktion …
                  async function gl_leseRaum(ObjectID) {
                      let room = leseRaum(ObjectID);
                      return room;
                  }
                  
                  // Beschreibe diese Funktion …
                  async function runTest(dp) {
                    console.info('Hier wird der Scheduler gesetzt');
                    (() => { if (schedule1) { clearSchedule(schedule1); schedule1 = null; }})();
                    schedule1 = schedule((await buildCronRule('time', var_CronConditions)), async () => {
                      console.info('Hier läuft der Trigger');
                    });
                    await getSchedule();
                  }
                  
                  
                  var_CronConditions = await getCronConditions('0_userdata.0.Rolladen.Allgemein.Schatten.cronConditions.*');
                  console.info((await buildCronRule('time', var_CronConditions)));
                  console.info(var_CronConditions);
                  await createSchedule(var_CronConditions);
                  await getSchedule();
                  on({ id: [].concat(Array.prototype.slice.apply($('state[state.id=0_userdata.0.Rolladen.Allgemein.Schatten.cronConditions.*]'))), change: 'any' }, async (obj) => {
                    let value = obj.state.val;
                    let oldValue = obj.oldState.val;
                    var_CronConditions = await getCronConditions('0_userdata.0.Rolladen.Allgemein.Schatten.cronConditions.*');
                    await runTest(var_CronConditions);
                  });
                  
                  //JTNDeG1sJTIweG1sbnMlM0QlMjJodHRwcyUzQSUyRiUyRmRldmVsb3BlcnMuZ29vZ2xlLmNvbSUyRmJsb2NrbHklMkZ4bWwlMjIlM0UlM0N2YXJpYWJsZXMlM0UlM0N2YXJpYWJsZSUyMGlkJTNEJTIyYyU1QiUzQVd3aiU3QnNpd3JOJTJGRiU1RSglNjBoTHclMjIlM0Vjcm9uQ29uZGl0aW9ucyUzQyUyRnZhcmlhYmxlJTNFJTNDdmFyaWFibGUlMjBpZCUzRCUyMlVRaCUyNVMhJTVERyU3Qig4UUU3YW9SRkNvJTIyJTNFbW9kdXMlM0MlMkZ2YXJpYWJsZSUzRSUzQ3ZhcmlhYmxlJTIwaWQlM0QlMjJtUnhrcSklNUQxMUclMkYqVlglNDBxdkxkRCUyMiUzRWNvbmRpdGlvbnMlM0MlMkZ2YXJpYWJsZSUzRSUzQ3ZhcmlhYmxlJTIwaWQlM0QlMjJvNk51LUZjQnZEMyUyNHIlMkYlN0QuanElNjAqJTIyJTNFcm9vdGRwJTNDJTJGdmFyaWFibGUlM0UlM0N2YXJpYWJsZSUyMGlkJTNEJTIyTSU2MGZyOS1hRyUzQVMlMkNLcSh4JTVFYTkoLiUyMiUzRU9iamVjdElEJTNDJTJGdmFyaWFibGUlM0UlM0N2YXJpYWJsZSUyMGlkJTNEJTIyLmg2WFclMjVxX1lDJTNEaDJhXy14TDlTJTIyJTNFdmFyX0Nyb25Db25kaXRpb25zJTNDJTJGdmFyaWFibGUlM0UlM0N2YXJpYWJsZSUyMGlkJTNEJTIyNVElMkNXQkYlNUJtJTIzJTJGSCUyQ2tPIXglN0M4NCU1RCUyMiUzRWRwJTNDJTJGdmFyaWFibGUlM0UlM0N2YXJpYWJsZSUyMGlkJTNEJTIyQSUyNHpKJTNELm9hLkslN0MlMkM4MCUzRFclMjRTJTQwRyUyMiUzRXZhcl9SYXVtJTNDJTJGdmFyaWFibGUlM0UlM0N2YXJpYWJsZSUyMHR5cGUlM0QlMjJjcm9uJTIyJTIwaWQlM0QlMjJzY2hlZHVsZTElMjIlM0VzY2hlZHVsZTElM0MlMkZ2YXJpYWJsZSUzRSUzQyUyRnZhcmlhYmxlcyUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnByb2NlZHVyZXNfZGVmY3VzdG9tbm9yZXR1cm4lMjIlMjBpZCUzRCUyMkZiKE9oV3BGJTdEbmMlM0ZHZDB0ODIlMjQpJTIyJTIweCUzRCUyMjYzJTIyJTIweSUzRCUyMjM4JTIyJTNFJTNDbXV0YXRpb24lMjBzdGF0ZW1lbnRzJTNEJTIyZmFsc2UlMjIlM0UlM0MlMkZtdXRhdGlvbiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMk5BTUUlMjIlM0VnZXRTY2hlZHVsZSUzQyUyRmZpZWxkJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyU0NSSVBUJTIyJTNFWTI5dWMzUWdiR2x6ZENBOUlHZGxkRk5qYUdWa2RXeGxjeWhtWVd4elpTazdEUXBzYVhOMExtWnZja1ZoWTJnb2MyTm9aV1IxYkdVZ1BUNGdiRzluS0VwVFQwNHVjM1J5YVc1bmFXWjVLSE5qYUdWa2RXeGxLU2twT3clM0QlM0QlM0MlMkZmaWVsZCUzRSUzQ2NvbW1lbnQlMjBwaW5uZWQlM0QlMjJmYWxzZSUyMiUyMGglM0QlMjI4MCUyMiUyMHclM0QlMjIxNjAlMjIlM0VCZXNjaHJlaWJlJTIwZGllc2UlMjBGdW5rdGlvbiUyMCVFMiU4MCVBNiUzQyUyRmNvbW1lbnQlM0UlM0MlMkZibG9jayUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnByb2NlZHVyZXNfZGVmY3VzdG9tbm9yZXR1cm4lMjIlMjBpZCUzRCUyMnIlNUV0KWQhLlQlNURtJTJCR1hoMCUyNTlYUUklMjIlMjB4JTNEJTIyNjMlMjIlMjB5JTNEJTIyNjMlMjIlM0UlM0NtdXRhdGlvbiUyMHN0YXRlbWVudHMlM0QlMjJmYWxzZSUyMiUzRSUzQ2FyZyUyMG5hbWUlM0QlMjJjcm9uQ29uZGl0aW9ucyUyMiUyMHZhcmlkJTNEJTIyYyU1QiUzQVd3aiU3QnNpd3JOJTJGRiU1RSglNjBoTHclMjIlM0UlM0MlMkZhcmclM0UlM0MlMkZtdXRhdGlvbiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMk5BTUUlMjIlM0VjcmVhdGVTY2hlZHVsZSUzQyUyRmZpZWxkJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyU0NSSVBUJTIyJTNFYkdWMElIUmxjM1JUWTJobFpDQTlJRzUxYkd3N0RRcGpiMjV6ZENCRmRtVnVkRVZ0YVhSMFpYSWdQU0J5WlhGMWFYSmxLQ2RsZG1WdWRITW5LVHNOQ21Oc1lYTnpJRVZsSUdWNGRHVnVaSE1nUlhabGJuUkZiV2wwZEdWeUlIdDlEUW9OQ21OdmJuTjBJR3B2WWxOMFlYUjFjeUE5SUc1bGR5QkZaU2dwT3cwS0x5OXNiMmNvSW1OeWIyNURiMjVrYVhScGIyNXpPaUFpSUNzZ1kzSnZia052Ym1ScGRHbHZibk1zSW1sdVptOGlLVHNOQ2cwS2FtOWlVM1JoZEhWekxtOXVLQ2RtYVc1cGMyaGxaQ2NzSUNncElEMCUyQklIc05DaUFnSUNCamIyNXpiMnhsTG14dlp5Z25TazlDSUVaSlRrbFRTRVZFSnlrN0RRb2dJQ0FnYW05aUxtTmhibU5sYkNncE93MEtJQ0FnSUNBdkx5QlFjbVZtYjNKdElIbHZkWElnUkVJZ1QzQmxjbUYwYVc5dWN5Qm9aWEpsSUNocGJpQjViM1Z5SUdOaGMyVTZJR1JsYkdWMFpTQnFiMklnWm5KdmJTQmtZWFJoWW1GelpTa05DZzBLZlNrN0RRb2dJQ0FOQ2lnb0tTQTlQaUI3SUdsbUlDaDBaWE4wVTJOb1pXUXBJSHNnWTJ4bFlYSlRZMmhsWkhWc1pTaDBaWE4wVTJOb1pXUXBPeUIwWlhOMFUyTm9aV1FnUFNCdWRXeHNPeUI5ZlNrb0tUc05DaTh2Ykc5bktDSlVaWE4wVTJOb1pXUkRiMjVrT2lBaUlDc2dZM0p2YmtOdmJtUnBkR2x2Ym5Nc0luZGhjbTRpS1RzTkNpQWdZMjl1YzI5c1pTNXBibVp2S0NkSWFXVnlJSGRwY21RZ1pHVnlJRlJGVTFSVFkyaGxaSFZzWlhJZ1oyVnpaWFI2ZENjcE93MEtJQ0FvS0NrZ1BUNGdleUJwWmlBb2RHVnpkRk5qYUdWa0tTQjdJR05zWldGeVUyTm9aV1IxYkdVb2RHVnpkRk5qYUdWa0tUc2dkR1Z6ZEZOamFHVmtJRDBnYm5Wc2JEc2dmWDBwS0NrN0RRb05DaUFnZEdWemRGTmphR1ZrSUQwZ2MyTm9aV1IxYkdVb0tHRjNZV2wwSUdKMWFXeGtRM0p2YmxKMWJHVW9KM1JwYldVbkxDQmpjbTl1UTI5dVpHbDBhVzl1Y3lrcExDQm1kVzVqZEdsdmJpZ3BJSHNOQ2lBZ0lDQmpiMjV6YjJ4bExtbHVabThvSjBocFpYSWdiTU9rZFdaMElHUmxjaUJVUlZOVVZISnBaMmRsY2ljcE93MEtJQ0FnSUM4cURRb2dJQ0FnYVdZZ0tIUm9hWE11Ym1WNGRFbHVkbTlqWVhScGIyNG9LU0E5UFQwZ2JuVnNiQ2tnZXcwS0lDQWdJQ0FnSUNBZ0lDQWdMeTlvWlhKbElIbHZkU0JqWVc0Z1kyOWtaU0IzYUdGMFpYWmxjaUI1YjNVZ2JtVmxaQ0IwYnlCa2J5QnBiaUIwYUdVZ2JHRnpkQ0JwYm5adlkyRjBhVzl1RFFvZ0lDQWdJQ0FnSUdwdllsTjBZWFIxY3k1bGJXbDBLQ2RtYVc1cGMyaGxaQ2NwT3lBdkx5QkZiV2wwSUhsdmRYSWdhbTlpSUdSdmJtVWdaVzFwZEhSbGNpQjNhR1Z1SUhsdmRTQmhjbVVnWkc5dVpTNGdJQ0FnSUNBZ0lDQWdJQ0FOQ2lBZ0lDQWdJQ0FnSUNBZ0lIME5DaUFnSUNBZ0lDQWdJQ0FnSUNvdkRRb2dJSDBwT3cwS0lBMEtEUW8lM0QlM0MlMkZmaWVsZCUzRSUzQ2NvbW1lbnQlMjBwaW5uZWQlM0QlMjJmYWxzZSUyMiUyMGglM0QlMjI4MCUyMiUyMHclM0QlMjIxNjAlMjIlM0VCZXNjaHJlaWJlJTIwZGllc2UlMjBGdW5rdGlvbiUyMCVFMiU4MCVBNiUzQyUyRmNvbW1lbnQlM0UlM0MlMkZibG9jayUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnByb2NlZHVyZXNfZGVmY3VzdG9tcmV0dXJuJTIyJTIwaWQlM0QlMjJzJTVFJTJDZkhEJTNBZEMlMjRkb2VoJTQwRSUyRjNhMSUyMiUyMHglM0QlMjI2MyUyMiUyMHklM0QlMjI4OCUyMiUzRSUzQ211dGF0aW9uJTIwc3RhdGVtZW50cyUzRCUyMmZhbHNlJTIyJTNFJTNDYXJnJTIwbmFtZSUzRCUyMm1vZHVzJTIyJTIwdmFyaWQlM0QlMjJVUWglMjVTISU1REclN0IoOFFFN2FvUkZDbyUyMiUzRSUzQyUyRmFyZyUzRSUzQ2FyZyUyMG5hbWUlM0QlMjJjb25kaXRpb25zJTIyJTIwdmFyaWQlM0QlMjJtUnhrcSklNUQxMUclMkYqVlglNDBxdkxkRCUyMiUzRSUzQyUyRmFyZyUzRSUzQyUyRm11dGF0aW9uJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyTkFNRSUyMiUzRWJ1aWxkQ3JvblJ1bGUlM0MlMkZmaWVsZCUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlNDUklQVCUyMiUzRWJHVjBJSEpsYzNWc2RDQTlJQ0lpT3cwS2JHVjBJSEpsYzNWc2RGTjBZWEowSUQwZ0lpSTdEUXBzWlhRZ2IzWmhiRkJsY21sdlpDQTlJQ0lpT3cwS0RRcGpiMjVrYVhScGIyNXpMbVp2Y2tWaFkyZ29ablZ1WTNScGIyNGdLR3hwYm1Vc2FXNWtaWGdzSUdGeWNtRjVLU0I3RFFvTkNpQWdJQ0F2S2cwS0lDQWdJQ0FnSUNBbmV5SjBhVzFsSWpwN0luTjBZWEowSWpvaU1EZzZNREFpTENKbGJtUWlPaUl5TURvd01DSXNJbTF2WkdVaU9pSnRhVzUxZEdWeklpd2lhVzUwWlhKMllXd2lPako5TENKd1pYSnBiMlFpT25zaVpHRjVjeUk2TVgxOUp3MEtJQ0FnSUNvdkRRb2dJQ0FnYkdWMElHOXJaWGtnUFNCUFltcGxZM1F1YTJWNWN5aHNhVzVsS1RzTkNpQWdJQ0JzWlhRZ2IzWmhiQ0E5SUd4cGJtVmJiMnRsZVYwN0RRb2dJQ0FnYjJ0bGVTQTlJRzlyWlhrdWRHOVRkSEpwYm1jb0tTNXlaWEJzWVdObEtDOWNjeXN2Wnl3Z0p5Y3BPdzBLSUNBZ0RRb2dJQ0FnTHk5c2IyY29iMnRsZVN3aWFXNW1ieUlwT3cwS0lDQWdJQ0FnSUNCcFppaHZhMlY1SUQwOUlDSndaWEpwYjJRaUtYc05DaUFnSUNBZ0lDQWdJQ0FnSUc5clpYa2dQU0J6ZEhKcGJtZFJkVzkwWlNoN2MzUnlWbUZ5YVdGaWJHVTZJRzlyWlhsOUtUc05DaUFnSUNBZ0lDQWdJQ0FnSUM4dmJHOW5LQ0p2YTJWNUlHbHpPaUFpTENKcGJtWnZJaWs3RFFvZ0lDQWdJQ0FnSUNBZ0lDQnZkbUZzVUdWeWFXOWtJRDBnYjNaaGJGQmxjbWx2WkM1amIyNWpZWFFvYjJ0bGVTd2lPaUlzSUc5MllXd3BPdzBLSUNBZ0lDQWdJQ0I5SUdWc2MyVWdhV1lvYjJ0bGVTQWhQU0FpY0dWeWFXOWtJaWtnZXcwS0lDQWdJQ0FnSUNCdmEyVjVJRDBnYzNSeWFXNW5VWFZ2ZEdVb2UzTjBjbFpoY21saFlteGxPaUJ2YTJWNWZTazdJQ0FnSUEwS0lDQWdJQ0FnSUNCcFppaDBlWEJsYjJZZ2IzWmhiQ0E5UFNBaWMzUnlhVzVuSWlsN0RRb2dJQ0FnSUNBZ0lDQWdJQ0J2ZG1Gc0lEMGdjM1J5YVc1blVYVnZkR1VvZTNOMGNsWmhjbWxoWW14bE9pQnZkbUZzZlNrN0RRb2dJQ0FnSUNBZ0lIME5DaUFnSUNBZ0lDQWdMeTlzYjJjb2IydGxlU3dpZDJGeWJpSXBPdzBLSUNBZ0lDQWdJQ0F2TDJ4dlp5Z2lWbUZzT2lBaUlDc2diM1poYkNBcklDSWdmQ0IwZVhCbGIyWTZJQ0lySUhSNWNHVnZaaUJ2ZG1Gc0xDSnBibVp2SWlrN0RRb2dJQ0FnSUNBZ0lHbG1LR2x1WkdWNElEMDlQU0JoY25KaGVTNXNaVzVuZEdnZ0xURXBldzBLSUNBZ0lDQWdJQ0J5WlhOMWJIUWdQWEpsYzNWc2RDNWpiMjVqWVhRb2IydGxlU3dpT2lJc0lHOTJZV3dwT3lBTkNpQWdJQ0FnSUNBZ2ZTQmxiSE5sSUhzTkNpQWdJQ0FnSUNBZ2NtVnpkV3gwSUQxeVpYTjFiSFF1WTI5dVkyRjBLRzlyWlhrc0lqb2lMQ0J2ZG1Gc0xDSXNJaWs3SUNBZ0lDQWdJQ0FOQ2lBZ0lDQWdJQ0FnZlEwS0RRb2dJQ0FnSUNBZ0lIME5DZzBLRFFvTkNuMHBPdzBLRFFweVpYTjFiSFFnUFNCemRISnBibWRSZFc5MFpTaDdjM1J5Vm1GeWFXRmliR1U2SUhKbGMzVnNkQ3h6ZEhKUmRXOTBaVG9nSW50OUlpd2dZbTl2YkZOd2JHbDBVWFZ2ZEdVNklIUnlkV1Y5S1RzTkNpOHZiRzluS0c5MllXeFFaWEpwYjJRc0luZGhjbTRpS1RzTkNnMEtjM2RwZEdOb0tHMXZaSFZ6S1hzTkNpQWdJQ0JqWVhObElDSjBhVzFsSWpvTkNpQWdJQ0FnSUNBZ2NtVnpkV3gwVTNSaGNuUWdQU0FpZEdsdFpTSTdEUW9OQ2lBZ0lDQmtaV1poZFd4ME9nMEtJQ0FnSUNBZ0lDQnlaWE4xYkhSVGRHRnlkQ0E5SUNKMGFXMWxJanNOQ24wTkNuSmxjM1ZzZEZOMFlYSjBJRDBnYzNSeWFXNW5VWFZ2ZEdVb2UzTjBjbFpoY21saFlteGxPaUJ5WlhOMWJIUlRkR0Z5ZEgwcE93MEtjbVZ6ZFd4MFUzUmhjblFnUFNBaUlpNWpiMjVqWVhRb2NtVnpkV3gwVTNSaGNuUXNJam9pS1NBN0RRb05DZzBLY21WemRXeDBJRDBnSWlJdVkyOXVZMkYwS0hKbGMzVnNkRk4wWVhKMExDQnlaWE4xYkhRc0lpd2lMQ0J2ZG1Gc1VHVnlhVzlrS1RzTkNnMEtjbVZ6ZFd4MElEMGdjM1J5YVc1blVYVnZkR1VvZTNOMGNsWmhjbWxoWW14bE9uSmxjM1ZzZEN4emRISlJkVzkwWlRvaWUzMGlMR0p2YjJ4VGNHeHBkRkYxYjNSbE9pQjBjblZsSUgwcElEc05DaTh2Ykc5bktISmxjM1ZzZEN3aWQyRnliaUlwT3cwS0RRb05DbkpsZEhWeWJpQnlaWE4xYkhRNyUzQyUyRmZpZWxkJTNFJTNDY29tbWVudCUyMHBpbm5lZCUzRCUyMmZhbHNlJTIyJTIwaCUzRCUyMjgwJTIyJTIwdyUzRCUyMjE2MCUyMiUzRUJlc2NocmVpYmUlMjBkaWVzZSUyMEZ1bmt0aW9uJTIwJUUyJTgwJUE2JTNDJTJGY29tbWVudCUzRSUzQyUyRmJsb2NrJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIycHJvY2VkdXJlc19kZWZjdXN0b21yZXR1cm4lMjIlMjBpZCUzRCUyMiU3QjBjVyUzRjBWJTdCJTIzb05+fipzMzAwMkklMjIlMjB4JTNEJTIyNjMlMjIlMjB5JTNEJTIyMTEzJTIyJTNFJTNDbXV0YXRpb24lMjBzdGF0ZW1lbnRzJTNEJTIyZmFsc2UlMjIlM0UlM0NhcmclMjBuYW1lJTNEJTIycm9vdGRwJTIyJTIwdmFyaWQlM0QlMjJvNk51LUZjQnZEMyUyNHIlMkYlN0QuanElNjAqJTIyJTNFJTNDJTJGYXJnJTNFJTNDJTJGbXV0YXRpb24lM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJOQU1FJTIyJTNFZ2V0Q3JvbkNvbmRpdGlvbnMlM0MlMkZmaWVsZCUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlNDUklQVCUyMiUzRWJHVjBJSEpsYzNWc2RDQTlJRnRkT3cwS2JHOW5LQ0puWlhSRGNtOXVRMjl1WkhNaUxDSjNZWEp1SWlrN0RRcGpiMjV6ZENCa2NITWdQU0FrS0hKdmIzUmtjQ2t1ZEc5QmNuSmhlU2dwT3cwS2JHOW5LR1J3Y3lrN0RRcGtjSE11Wm05eVJXRmphQ2dvYVdRcElEMCUyQklIc05DaUFnSUNCamIyNXpkQ0JrY0haaGJDQTlJR2RsZEZOMFlYUmxLR2xrS1M1MllXdzdEUW9nSUNBZ1kyOXVjM1FnWkhBZ1BTQnpjR3hwZEhSV1lYSnBZV0pzWlNocFpDd2liR0Z6ZENJc0lpNGlLVHNOQ2lBZ0lDQnNaWFFnYjJKcUlEMGdlMzA3RFFvZ0lDQWdiMkpxVzJSd1hTQTlJR1J3ZG1Gc093MEtJQ0FnSUhKbGMzVnNkQzV3ZFhOb0tHOWlhaWs3RFFwOUtUc05DaUFnSUNBdkwyeHZaeWh5WlhOMWJIUXNJbmRoY200aUtUc05DbkpsZEhWeWJpQnlaWE4xYkhRNyUzQyUyRmZpZWxkJTNFJTNDY29tbWVudCUyMHBpbm5lZCUzRCUyMmZhbHNlJTIyJTIwaCUzRCUyMjgwJTIyJTIwdyUzRCUyMjE2MCUyMiUzRUJlc2NocmVpYmUlMjBkaWVzZSUyMEZ1bmt0aW9uJTIwJUUyJTgwJUE2JTNDJTJGY29tbWVudCUzRSUzQyUyRmJsb2NrJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIycHJvY2VkdXJlc19kZWZjdXN0b21yZXR1cm4lMjIlMjBpZCUzRCUyMlhZU185WiUzQmZOJTNENi5XKjdCMDEzYiUyMiUyMHglM0QlMjI2MyUyMiUyMHklM0QlMjIxMzglMjIlM0UlM0NtdXRhdGlvbiUyMHN0YXRlbWVudHMlM0QlMjJmYWxzZSUyMiUzRSUzQ2FyZyUyMG5hbWUlM0QlMjJPYmplY3RJRCUyMiUyMHZhcmlkJTNEJTIyTSU2MGZyOS1hRyUzQVMlMkNLcSh4JTVFYTkoLiUyMiUzRSUzQyUyRmFyZyUzRSUzQyUyRm11dGF0aW9uJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyTkFNRSUyMiUzRWdsX2xlc2VSYXVtJTNDJTJGZmllbGQlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJTQ1JJUFQlMjIlM0ViR1YwSUhKdmIyMGdQU0JzWlhObFVtRjFiU2hQWW1wbFkzUkpSQ2s3RFFweVpYUjFjbTRnY205dmJUcyUzRCUzQyUyRmZpZWxkJTNFJTNDY29tbWVudCUyMHBpbm5lZCUzRCUyMmZhbHNlJTIyJTIwaCUzRCUyMjgwJTIyJTIwdyUzRCUyMjE2MCUyMiUzRUJlc2NocmVpYmUlMjBkaWVzZSUyMEZ1bmt0aW9uJTIwJUUyJTgwJUE2JTNDJTJGY29tbWVudCUzRSUzQyUyRmJsb2NrJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydGV4dCUyMiUyMGlkJTNEJTIyNHUlNDB0Tl9tZCklM0ElNUQlNDBLJTQwMG9yQyU1RHclMjIlMjBkaXNhYmxlZCUzRCUyMnRydWUlMjIlMjB4JTNEJTIyMTA2MyUyMiUyMHklM0QlMjIxODglMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJURVhUJTIyJTNFJTdCJTIydGltZSUyMiUzQSU3QiUyMmVuZCUyMiUzQSUyMjIwJTNBMDAlMjIlMkMlMjJpbnRlcnZhbCUyMiUzQTIlMkMlMjJtb2RlJTIyJTNBJTIybWludXRlcyUyMiUyQyUyMnN0YXJ0JTIyJTNBJTIyMDglM0EwMCUyMiU3RCUyQyUyMnBlcmlvZCUyMiUzQSU3QiUyMmRheXMlMjIlM0ExJTdEJTdEJTNDJTJGZmllbGQlM0UlM0MlMkZibG9jayUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnZhcmlhYmxlc19zZXQlMjIlMjBpZCUzRCUyMkwlNUJxNkQlNURtREJvV1klNURLTCUzQWNoJTI1ZCUyMiUyMHglM0QlMjIxMiUyMiUyMHklM0QlMjIyNjklMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJWQVIlMjIlMjBpZCUzRCUyMi5oNlhXJTI1cV9ZQyUzRGgyYV8teEw5UyUyMiUzRXZhcl9Dcm9uQ29uZGl0aW9ucyUzQyUyRmZpZWxkJTNFJTNDdmFsdWUlMjBuYW1lJTNEJTIyVkFMVUUlMjIlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJwcm9jZWR1cmVzX2NhbGxjdXN0b21yZXR1cm4lMjIlMjBpZCUzRCUyMjllcGslMkNDbyUyQzZlRVFUMDRhXyU0ME1xJTIyJTIwaW5saW5lJTNEJTIydHJ1ZSUyMiUzRSUzQ211dGF0aW9uJTIwbmFtZSUzRCUyMmdldENyb25Db25kaXRpb25zJTIyJTNFJTNDYXJnJTIwbmFtZSUzRCUyMnJvb3RkcCUyMiUzRSUzQyUyRmFyZyUzRSUzQyUyRm11dGF0aW9uJTNFJTNDdmFsdWUlMjBuYW1lJTNEJTIyQVJHMCUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnRleHQlMjIlMjBpZCUzRCUyMjJ4V3AyTn5VJTdDVmguTkJwVzQlNURwVCUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlRFWFQlMjIlM0UwX3VzZXJkYXRhLjAuUm9sbGFkZW4uQWxsZ2VtZWluLlNjaGF0dGVuLmNyb25Db25kaXRpb25zLiolM0MlMkZmaWVsZCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGdmFsdWUlM0UlM0MlMkZibG9jayUzRSUzQyUyRnZhbHVlJTNFJTNDbmV4dCUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmRlYnVnJTIyJTIwaWQlM0QlMjJuJTNCVCUzRDhqT1J+JTNGTjBWOHYuQUVvSyUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlNldmVyaXR5JTIyJTNFaW5mbyUzQyUyRmZpZWxkJTNFJTNDdmFsdWUlMjBuYW1lJTNEJTIyVEVYVCUyMiUzRSUzQ3NoYWRvdyUyMHR5cGUlM0QlMjJ0ZXh0JTIyJTIwaWQlM0QlMjJEU1NtcWElN0MxbV9EcCUzRCF6UVE0dVMlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJURVhUJTIyJTNFdGVzdCUzQyUyRmZpZWxkJTNFJTNDJTJGc2hhZG93JTNFJTNDYmxvY2slMjB0eXBlJTNEJTIycHJvY2VkdXJlc19jYWxsY3VzdG9tcmV0dXJuJTIyJTIwaWQlM0QlMjIuOVlnRi1GTTlFVkh6RXY0JTIzZzElMkYlMjIlMjBpbmxpbmUlM0QlMjJ0cnVlJTIyJTNFJTNDbXV0YXRpb24lMjBuYW1lJTNEJTIyYnVpbGRDcm9uUnVsZSUyMiUzRSUzQ2FyZyUyMG5hbWUlM0QlMjJtb2R1cyUyMiUzRSUzQyUyRmFyZyUzRSUzQ2FyZyUyMG5hbWUlM0QlMjJjb25kaXRpb25zJTIyJTNFJTNDJTJGYXJnJTNFJTNDJTJGbXV0YXRpb24lM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJBUkcwJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydGV4dCUyMiUyMGlkJTNEJTIySG1HOCUzQkolMkJaWCUzRnlwJTdEJTI0cyUyNWxZRyU3RCUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlRFWFQlMjIlM0V0aW1lJTNDJTJGZmllbGQlM0UlM0MlMkZibG9jayUzRSUzQyUyRnZhbHVlJTNFJTNDdmFsdWUlMjBuYW1lJTNEJTIyQVJHMSUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnZhcmlhYmxlc19nZXQlMjIlMjBpZCUzRCUyMnE2RjZsJTdCVUpYJTNGM1Y5dHUlNDAhamxlJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVkFSJTIyJTIwaWQlM0QlMjIuaDZYVyUyNXFfWUMlM0RoMmFfLXhMOVMlMjIlM0V2YXJfQ3JvbkNvbmRpdGlvbnMlM0MlMkZmaWVsZCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGdmFsdWUlM0UlM0MlMkZibG9jayUzRSUzQyUyRnZhbHVlJTNFJTNDbmV4dCUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmRlYnVnJTIyJTIwaWQlM0QlMjIlMkJKfmklNDBLMEZhJTdCeTBkKiUzQkFXbjglN0IlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJTZXZlcml0eSUyMiUzRWluZm8lM0MlMkZmaWVsZCUzRSUzQ3ZhbHVlJTIwbmFtZSUzRCUyMlRFWFQlMjIlM0UlM0NzaGFkb3clMjB0eXBlJTNEJTIydGV4dCUyMiUyMGlkJTNEJTIyRFNTbXFhJTdDMW1fRHAlM0QhelFRNHVTJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVEVYVCUyMiUzRXRlc3QlM0MlMkZmaWVsZCUzRSUzQyUyRnNoYWRvdyUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnZhcmlhYmxlc19nZXQlMjIlMjBpZCUzRCUyMkIzViFiSkclMkNOcUJ0Y0lfc1RRdW0lMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJWQVIlMjIlMjBpZCUzRCUyMi5oNlhXJTI1cV9ZQyUzRGgyYV8teEw5UyUyMiUzRXZhcl9Dcm9uQ29uZGl0aW9ucyUzQyUyRmZpZWxkJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZ2YWx1ZSUzRSUzQ25leHQlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJwcm9jZWR1cmVzX2NhbGxjdXN0b21ub3JldHVybiUyMiUyMGlkJTNEJTIyc2RVaWN0fiU0MFglN0JDKVhKS34lMkMoJTNESCUyMiUzRSUzQ211dGF0aW9uJTIwbmFtZSUzRCUyMmNyZWF0ZVNjaGVkdWxlJTIyJTNFJTNDYXJnJTIwbmFtZSUzRCUyMmNyb25Db25kaXRpb25zJTIyJTNFJTNDJTJGYXJnJTNFJTNDJTJGbXV0YXRpb24lM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJBUkcwJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydmFyaWFibGVzX2dldCUyMiUyMGlkJTNEJTIyOSElMjMlMjMlM0I1JTdCJTNCNDUzJTJGVXglM0FCN2hMWiUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlZBUiUyMiUyMGlkJTNEJTIyLmg2WFclMjVxX1lDJTNEaDJhXy14TDlTJTIyJTNFdmFyX0Nyb25Db25kaXRpb25zJTNDJTJGZmllbGQlM0UlM0MlMkZibG9jayUzRSUzQyUyRnZhbHVlJTNFJTNDbmV4dCUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnByb2NlZHVyZXNfY2FsbGN1c3RvbW5vcmV0dXJuJTIyJTIwaWQlM0QlMjJyJTIzSG1iVW4uTUt3aEk4flZpNl9CJTIyJTNFJTNDbXV0YXRpb24lMjBuYW1lJTNEJTIyZ2V0U2NoZWR1bGUlMjIlM0UlM0MlMkZtdXRhdGlvbiUzRSUzQ25leHQlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJvbl9leHQlMjIlMjBpZCUzRCUyMmZ0UG9VZ0hNdG8lM0ElNUV6cDElN0JzWlktJTIyJTNFJTNDbXV0YXRpb24lMjB4bWxucyUzRCUyMmh0dHAlM0ElMkYlMkZ3d3cudzMub3JnJTJGMTk5OSUyRnhodG1sJTIyJTIwaXRlbXMlM0QlMjIxJTIyJTNFJTNDJTJGbXV0YXRpb24lM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJDT05ESVRJT04lMjIlM0VhbnklM0MlMkZmaWVsZCUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMkFDS19DT05ESVRJT04lMjIlM0UlM0MlMkZmaWVsZCUzRSUzQ3ZhbHVlJTIwbmFtZSUzRCUyMk9JRDAlMjIlM0UlM0NzaGFkb3clMjB0eXBlJTNEJTIyZmllbGRfb2lkJTIyJTIwaWQlM0QlMjJTdTdCel9wJTdCMjMuU00lM0R0Rn5+dWYlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJvaWQlMjIlM0VJRCUyMGF1c3clQzMlQTRobGVuJTNDJTJGZmllbGQlM0UlM0MlMkZzaGFkb3clM0UlM0NibG9jayUyMHR5cGUlM0QlMjJzZWxlY3RvciUyMiUyMGlkJTNEJTIyWS5kanRib0x2KkxTTVEqdSUyNTclMkNkJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVEVYVCUyMiUzRXN0YXRlJTVCc3RhdGUuaWQlM0QwX3VzZXJkYXRhLjAuUm9sbGFkZW4uQWxsZ2VtZWluLlNjaGF0dGVuLmNyb25Db25kaXRpb25zLiolNUQlM0MlMkZmaWVsZCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGdmFsdWUlM0UlM0NzdGF0ZW1lbnQlMjBuYW1lJTNEJTIyU1RBVEVNRU5UJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydmFyaWFibGVzX3NldCUyMiUyMGlkJTNEJTIyR1UwViUzRFBUSHdPby41MXVkKHVPSSUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlZBUiUyMiUyMGlkJTNEJTIyLmg2WFclMjVxX1lDJTNEaDJhXy14TDlTJTIyJTNFdmFyX0Nyb25Db25kaXRpb25zJTNDJTJGZmllbGQlM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJWQUxVRSUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnByb2NlZHVyZXNfY2FsbGN1c3RvbXJldHVybiUyMiUyMGlkJTNEJTIyLUhJJTVEKFZSaCloJTYwKCUzQmhiWkwxQ1YlMjIlMjBpbmxpbmUlM0QlMjJ0cnVlJTIyJTNFJTNDbXV0YXRpb24lMjBuYW1lJTNEJTIyZ2V0Q3JvbkNvbmRpdGlvbnMlMjIlM0UlM0NhcmclMjBuYW1lJTNEJTIycm9vdGRwJTIyJTNFJTNDJTJGYXJnJTNFJTNDJTJGbXV0YXRpb24lM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJBUkcwJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydGV4dCUyMiUyMGlkJTNEJTIyd0hCa1QlMkJWcSUyM045UzchdWtMZWw2JTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVEVYVCUyMiUzRTBfdXNlcmRhdGEuMC5Sb2xsYWRlbi5BbGxnZW1laW4uU2NoYXR0ZW4uY3JvbkNvbmRpdGlvbnMuKiUzQyUyRmZpZWxkJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZ2YWx1ZSUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGdmFsdWUlM0UlM0NuZXh0JTNFJTNDYmxvY2slMjB0eXBlJTNEJTIycHJvY2VkdXJlc19jYWxsbm9yZXR1cm4lMjIlMjBpZCUzRCUyMiU0MCgyZnlXIVRoYWpON19OWml6RmYlMjIlM0UlM0NtdXRhdGlvbiUyMG5hbWUlM0QlMjJydW5UZXN0JTIyJTNFJTNDYXJnJTIwbmFtZSUzRCUyMmRwJTIyJTNFJTNDJTJGYXJnJTNFJTNDJTJGbXV0YXRpb24lM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJBUkcwJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydmFyaWFibGVzX2dldCUyMiUyMGlkJTNEJTIyYTg2S04uJTdCc3IlMjN2JTNBJTQwZiUzQXUlN0J+Qk0lMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJWQVIlMjIlMjBpZCUzRCUyMi5oNlhXJTI1cV9ZQyUzRGgyYV8teEw5UyUyMiUzRXZhcl9Dcm9uQ29uZGl0aW9ucyUzQyUyRmZpZWxkJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZ2YWx1ZSUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGbmV4dCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGc3RhdGVtZW50JTNFJTNDJTJGYmxvY2slM0UlM0MlMkZuZXh0JTNFJTNDJTJGYmxvY2slM0UlM0MlMkZuZXh0JTNFJTNDJTJGYmxvY2slM0UlM0MlMkZuZXh0JTNFJTNDJTJGYmxvY2slM0UlM0MlMkZuZXh0JTNFJTNDJTJGYmxvY2slM0UlM0MlMkZuZXh0JTNFJTNDJTJGYmxvY2slM0UlM0NibG9jayUyMHR5cGUlM0QlMjJwcm9jZWR1cmVzX2RlZm5vcmV0dXJuJTIyJTIwaWQlM0QlMjJseS0lN0RZRSUyM1pxJTJCUW8lNURtfiUyRllRblElMjIlMjB4JTNEJTIyOTg4JTIyJTIweSUzRCUyMjMxMyUyMiUzRSUzQ211dGF0aW9uJTNFJTNDYXJnJTIwbmFtZSUzRCUyMmRwJTIyJTIwdmFyaWQlM0QlMjI1USUyQ1dCRiU1Qm0lMjMlMkZIJTJDa08heCU3Qzg0JTVEJTIyJTNFJTNDJTJGYXJnJTNFJTNDJTJGbXV0YXRpb24lM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJOQU1FJTIyJTNFcnVuVGVzdCUzQyUyRmZpZWxkJTNFJTNDY29tbWVudCUyMHBpbm5lZCUzRCUyMmZhbHNlJTIyJTIwaCUzRCUyMjgwJTIyJTIwdyUzRCUyMjE2MCUyMiUzRUJlc2NocmVpYmUlMjBkaWVzZSUyMEZ1bmt0aW9uJTIwJUUyJTgwJUE2JTNDJTJGY29tbWVudCUzRSUzQ3N0YXRlbWVudCUyMG5hbWUlM0QlMjJTVEFDSyUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmRlYnVnJTIyJTIwaWQlM0QlMjJXJTNBViUzRlNLKElqM1hPJTQwTnNGKSUyM3AtJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyU2V2ZXJpdHklMjIlM0VpbmZvJTNDJTJGZmllbGQlM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJURVhUJTIyJTNFJTNDc2hhZG93JTIwdHlwZSUzRCUyMnRleHQlMjIlMjBpZCUzRCUyMjdieiU1RU9JJTI1MUhIZ0gwYS1zeiUyQiU1REQlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJURVhUJTIyJTNFSGllciUyMHdpcmQlMjBkZXIlMjBTY2hlZHVsZXIlMjBnZXNldHp0JTNDJTJGZmllbGQlM0UlM0MlMkZzaGFkb3clM0UlM0MlMkZ2YWx1ZSUzRSUzQ25leHQlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJ2YXJpYWJsZXNfc2V0JTIyJTIwaWQlM0QlMjJ6bSFITVA3X1pOViUyMyUyRikpQndNcVglMjIlMjBkaXNhYmxlZCUzRCUyMnRydWUlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJWQVIlMjIlMjBpZCUzRCUyMkElMjR6SiUzRC5vYS5LJTdDJTJDODAlM0RXJTI0UyU0MEclMjIlM0V2YXJfUmF1bSUzQyUyRmZpZWxkJTNFJTNDdmFsdWUlMjBuYW1lJTNEJTIyVkFMVUUlMjIlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJwcm9jZWR1cmVzX2NhbGxjdXN0b21yZXR1cm4lMjIlMjBpZCUzRCUyMkJWJTQwTDJaNCUzQjFVSCUzRiU1RCU1QmFXRDQ0eiUyMiUzRSUzQ211dGF0aW9uJTIwbmFtZSUzRCUyMmdsX2xlc2VSYXVtJTIyJTNFJTNDYXJnJTIwbmFtZSUzRCUyMk9iamVjdElEJTIyJTNFJTNDJTJGYXJnJTNFJTNDJTJGbXV0YXRpb24lM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJBUkcwJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydmFyaWFibGVzX2dldCUyMiUyMGlkJTNEJTIyNnRXQWJFNlpEMmElN0JHTkEtQ3UlMjM0JTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVkFSJTIyJTIwaWQlM0QlMjI1USUyQ1dCRiU1Qm0lMjMlMkZIJTJDa08heCU3Qzg0JTVEJTIyJTNFZHAlM0MlMkZmaWVsZCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGdmFsdWUlM0UlM0MlMkZibG9jayUzRSUzQyUyRnZhbHVlJTNFJTNDbmV4dCUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnNjaGVkdWxlX2NsZWFyJTIyJTIwaWQlM0QlMjIpYzElMjMlM0JCTkNNaWoyJTNEJTJCJTJDTWklMjRfcyUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMk5BTUUlMjIlM0VzY2hlZHVsZTElM0MlMkZmaWVsZCUzRSUzQ25leHQlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJzY2hlZHVsZV9jcmVhdGUlMjIlMjBpZCUzRCUyMiUyNCglMjQlNUJ0ZDVscjhKJTNCZiUzQjlFejhUJTdDJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyTkFNRSUyMiUzRXNjaGVkdWxlMSUzQyUyRmZpZWxkJTNFJTNDdmFsdWUlMjBuYW1lJTNEJTIyU0NIRURVTEUlMjIlM0UlM0NzaGFkb3clMjB0eXBlJTNEJTIyZmllbGRfY3JvbiUyMiUyMGlkJTNEJTIydSElMkIlNUIhJTIzby0lNUV5YSU3RHlSQXF+VC5FJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyQ1JPTiUyMiUzRSolMjAqJTIwKiUyMColMjAqJTNDJTJGZmllbGQlM0UlM0MlMkZzaGFkb3clM0UlM0NibG9jayUyMHR5cGUlM0QlMjJwcm9jZWR1cmVzX2NhbGxjdXN0b21yZXR1cm4lMjIlMjBpZCUzRCUyMnd3JTNGWFMqfl9UTHh0ZUY5S09aenglMjIlMjBpbmxpbmUlM0QlMjJ0cnVlJTIyJTNFJTNDbXV0YXRpb24lMjBuYW1lJTNEJTIyYnVpbGRDcm9uUnVsZSUyMiUzRSUzQ2FyZyUyMG5hbWUlM0QlMjJtb2R1cyUyMiUzRSUzQyUyRmFyZyUzRSUzQ2FyZyUyMG5hbWUlM0QlMjJjb25kaXRpb25zJTIyJTNFJTNDJTJGYXJnJTNFJTNDJTJGbXV0YXRpb24lM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJBUkcwJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydGV4dCUyMiUyMGlkJTNEJTIyMyg1YTBNLWMlNDAxVWwoRERVUlQlMkM2JTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVEVYVCUyMiUzRXRpbWUlM0MlMkZmaWVsZCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGdmFsdWUlM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJBUkcxJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydmFyaWFibGVzX2dldCUyMiUyMGlkJTNEJTIySzlBVU1oJTQwMFZyJTNBLThtVTN+JTdCcmElMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJWQVIlMjIlMjBpZCUzRCUyMi5oNlhXJTI1cV9ZQyUzRGgyYV8teEw5UyUyMiUzRXZhcl9Dcm9uQ29uZGl0aW9ucyUzQyUyRmZpZWxkJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZ2YWx1ZSUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGdmFsdWUlM0UlM0NzdGF0ZW1lbnQlMjBuYW1lJTNEJTIyU1RBVEVNRU5UJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIyZGVidWclMjIlMjBpZCUzRCUyMk0lMkY4RipPeGQqTVc0NSU3RCUyNWgpWDQlN0IlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJTZXZlcml0eSUyMiUzRWluZm8lM0MlMkZmaWVsZCUzRSUzQ3ZhbHVlJTIwbmFtZSUzRCUyMlRFWFQlMjIlM0UlM0NzaGFkb3clMjB0eXBlJTNEJTIydGV4dCUyMiUyMGlkJTNEJTIyRyUzRCU1RFAyZ3pMJTVCbUUlM0ZlMC1xLS5DLiUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlRFWFQlMjIlM0VIaWVyJTIwbCVDMyVBNHVmdCUyMGRlciUyMFRyaWdnZXIlM0MlMkZmaWVsZCUzRSUzQyUyRnNoYWRvdyUzRSUzQyUyRnZhbHVlJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZzdGF0ZW1lbnQlM0UlM0NuZXh0JTNFJTNDYmxvY2slMjB0eXBlJTNEJTIycHJvY2VkdXJlc19jYWxsY3VzdG9tbm9yZXR1cm4lMjIlMjBpZCUzRCUyMmJOJTdCcC0lN0JJYnAhJTdEJTJCRktnSWRBaF8lMjIlM0UlM0NtdXRhdGlvbiUyMG5hbWUlM0QlMjJnZXRTY2hlZHVsZSUyMiUzRSUzQyUyRm11dGF0aW9uJTNFJTNDbmV4dCUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmNvbnRyb2xzX2lmJTIyJTIwaWQlM0QlMjJYcmclMjQyTlMlNUVnQ04qJTNGT3BVc0cwUSUyMiUyMGRpc2FibGVkJTNEJTIydHJ1ZSUyMiUzRSUzQ211dGF0aW9uJTIwZWxzZSUzRCUyMjElMjIlM0UlM0MlMkZtdXRhdGlvbiUzRSUzQ3ZhbHVlJTIwbmFtZSUzRCUyMklGMCUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmxvZ2ljX2NvbXBhcmUlMjIlMjBpZCUzRCUyMld4LiU3QkolNUVhX3olMkJKJTI1SUlkJTQwJTVCJTdCU0clMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJPUCUyMiUzRUVRJTNDJTJGZmllbGQlM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJBJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydGV4dCUyMiUyMGlkJTNEJTIyVyUzRCUyNUF5JTYwLkRpMCUyNHFlcSU3Q24lMkIlMjUlM0J1JTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVEVYVCUyMiUzRXVuZGVmaW5lZCUzQyUyRmZpZWxkJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZ2YWx1ZSUzRSUzQ3ZhbHVlJTIwbmFtZSUzRCUyMkIlMjIlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJjb252ZXJ0X3R5cGUlMjIlMjBpZCUzRCUyMjBTOSU1Qjl4SClsRU0teF9Edk5YVjQlMjIlM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJJVEVNJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydmFyaWFibGVzX2dldCUyMiUyMGlkJTNEJTIyMjU5SkglMkIoN1ZYdEd4cTlhJTJGTyglN0QlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJWQVIlMjIlMjBpZCUzRCUyMkElMjR6SiUzRC5vYS5LJTdDJTJDODAlM0RXJTI0UyU0MEclMjIlM0V2YXJfUmF1bSUzQyUyRmZpZWxkJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZ2YWx1ZSUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGdmFsdWUlM0UlM0MlMkZibG9jayUzRSUzQyUyRnZhbHVlJTNFJTNDc3RhdGVtZW50JTIwbmFtZSUzRCUyMkRPMCUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmRlYnVnJTIyJTIwaWQlM0QlMjIhLSU3Q1RZSlZjQ35XMyU3QnhYan5oS1glMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJTZXZlcml0eSUyMiUzRWluZm8lM0MlMkZmaWVsZCUzRSUzQ3ZhbHVlJTIwbmFtZSUzRCUyMlRFWFQlMjIlM0UlM0NzaGFkb3clMjB0eXBlJTNEJTIydGV4dCUyMiUyMGlkJTNEJTIyISU3QiUzQiUyQ3BnNiU2MC4yRyU3QyU1QkxuJTJCbjFoJTYwJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVEVYVCUyMiUzRWtlaW4lMjBSYXVtJTNDJTJGZmllbGQlM0UlM0MlMkZzaGFkb3clM0UlM0MlMkZ2YWx1ZSUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGc3RhdGVtZW50JTNFJTNDc3RhdGVtZW50JTIwbmFtZSUzRCUyMkVMU0UlMjIlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJkZWJ1ZyUyMiUyMGlkJTNEJTIyNjclNUJzUnBMJTJCblEwNUFnJTQwMSlHNHYlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJTZXZlcml0eSUyMiUzRWluZm8lM0MlMkZmaWVsZCUzRSUzQ3ZhbHVlJTIwbmFtZSUzRCUyMlRFWFQlMjIlM0UlM0NzaGFkb3clMjB0eXBlJTNEJTIydGV4dCUyMiUyMGlkJTNEJTIydWMyJTJDOHQ4Qk5IdnYlMjV6JTJCSCUzQSUyMy5iJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVEVYVCUyMiUzRXRlc3QlM0MlMkZmaWVsZCUzRSUzQyUyRnNoYWRvdyUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnZhcmlhYmxlc19nZXQlMjIlMjBpZCUzRCUyMnMlMkYlMjVGJTNGKkUpZmNPSWMlMjRteGlGJTVEdyUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlZBUiUyMiUyMGlkJTNEJTIyQSUyNHpKJTNELm9hLkslN0MlMkM4MCUzRFclMjRTJTQwRyUyMiUzRXZhcl9SYXVtJTNDJTJGZmllbGQlM0UlM0MlMkZibG9jayUzRSUzQyUyRnZhbHVlJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZzdGF0ZW1lbnQlM0UlM0MlMkZibG9jayUzRSUzQyUyRm5leHQlM0UlM0MlMkZibG9jayUzRSUzQyUyRm5leHQlM0UlM0MlMkZibG9jayUzRSUzQyUyRm5leHQlM0UlM0MlMkZibG9jayUzRSUzQyUyRm5leHQlM0UlM0MlMkZibG9jayUzRSUzQyUyRm5leHQlM0UlM0MlMkZibG9jayUzRSUzQyUyRnN0YXRlbWVudCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGeG1sJTNF
                  
                  OliverIOO Offline
                  OliverIOO Offline
                  OliverIO
                  schrieb am zuletzt editiert von OliverIO
                  #10

                  @trojanhector

                  Soweit ich das grob überblicke, liegt das Problem in deiner Funktion calcSecondsFromTime
                  Das berechnet sozusagen die Anzahl der Sekunden seit Mitternacht
                  Node-schedule möchte aber ein Jahr was Skript Datum Objekt, was die Anzahl an Millisekunden seit dem 1.1.1970 beinhaltet. Das musst du noch berücksichtigen.
                  Aus diesem Grund funktioniert auch das Beispiel, welches du aus der Dokumentation kopiert hast.
                  Dort wird das Date Objekt verwendet, welches du nicht verwändest

                  So wie du es jetzt verwändest, wird der Job auch nur einmalig gestartet.
                  Wenn du es wiederholt gestartet haben möchtest, musst du unter Recurring schauen

                  Wenn du es noch einfacher machen möchtest, schaue meinen Adapter
                  Mytime an.
                  Dort kannst du beliebige Zeitreihen definieren, zu denen dann ein Datenpunkt für eine definierbar a Zeit lang getriggert wird. Auf diesen Daten. Kannst du dann reagieren und beliebige Aktionen ausführen.

                  Meine Adapter und Widgets
                  TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
                  Links im Profil

                  T 1 Antwort Letzte Antwort
                  0
                  • OliverIOO OliverIO

                    @trojanhector

                    Soweit ich das grob überblicke, liegt das Problem in deiner Funktion calcSecondsFromTime
                    Das berechnet sozusagen die Anzahl der Sekunden seit Mitternacht
                    Node-schedule möchte aber ein Jahr was Skript Datum Objekt, was die Anzahl an Millisekunden seit dem 1.1.1970 beinhaltet. Das musst du noch berücksichtigen.
                    Aus diesem Grund funktioniert auch das Beispiel, welches du aus der Dokumentation kopiert hast.
                    Dort wird das Date Objekt verwendet, welches du nicht verwändest

                    So wie du es jetzt verwändest, wird der Job auch nur einmalig gestartet.
                    Wenn du es wiederholt gestartet haben möchtest, musst du unter Recurring schauen

                    Wenn du es noch einfacher machen möchtest, schaue meinen Adapter
                    Mytime an.
                    Dort kannst du beliebige Zeitreihen definieren, zu denen dann ein Datenpunkt für eine definierbar a Zeit lang getriggert wird. Auf diesen Daten. Kannst du dann reagieren und beliebige Aktionen ausführen.

                    T Offline
                    T Offline
                    trojanhector
                    schrieb am zuletzt editiert von
                    #11

                    @oliverio
                    Aber wie funktionert das denn in Blockly mit dem kleinen Cron Bauteil aus den Triggern? Wenn Du da was mit dem Wizard baust, hast in JS auch nur die Uhrzeiten.

                    OliverIOO 2 Antworten Letzte Antwort
                    0
                    • T trojanhector

                      @oliverio
                      Aber wie funktionert das denn in Blockly mit dem kleinen Cron Bauteil aus den Triggern? Wenn Du da was mit dem Wizard baust, hast in JS auch nur die Uhrzeiten.

                      OliverIOO Offline
                      OliverIOO Offline
                      OliverIO
                      schrieb am zuletzt editiert von
                      #12

                      @trojanhector

                      Für recurring musst du andere Eigenschaften verwenden. Nicht Start und end, sondern

                      RecurrenceRule properties
                      second (0-59)
                      minute (0-59)
                      hour (0-23)
                      date (1-31)
                      month (0-11)
                      year
                      dayOfWeek (0-6) Starting with Sunday
                      tz

                      Meine Adapter und Widgets
                      TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
                      Links im Profil

                      1 Antwort Letzte Antwort
                      0
                      • T trojanhector

                        @oliverio
                        Aber wie funktionert das denn in Blockly mit dem kleinen Cron Bauteil aus den Triggern? Wenn Du da was mit dem Wizard baust, hast in JS auch nur die Uhrzeiten.

                        OliverIOO Offline
                        OliverIOO Offline
                        OliverIO
                        schrieb am zuletzt editiert von OliverIO
                        #13

                        @trojanhector

                        Du könntest natürlich, so wie du es machst, immer den nächsten Start berechnen und wenn der Zeitpunkt erreicht ist, wiederum den darauf folgenden Start neu berechnen.
                        Ich habe auch noch nicht ganz verstanden, was du überhaupt erreichen möchtest:

                        Du möchtest innerhalb einer Zeitspanne, dann immer wieder was erneut ausführen?
                        Also ein schedule in einem schedule?

                        Meine Adapter und Widgets
                        TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
                        Links im Profil

                        T 1 Antwort Letzte Antwort
                        1
                        • OliverIOO OliverIO

                          @trojanhector

                          Du könntest natürlich, so wie du es machst, immer den nächsten Start berechnen und wenn der Zeitpunkt erreicht ist, wiederum den darauf folgenden Start neu berechnen.
                          Ich habe auch noch nicht ganz verstanden, was du überhaupt erreichen möchtest:

                          Du möchtest innerhalb einer Zeitspanne, dann immer wieder was erneut ausführen?
                          Also ein schedule in einem schedule?

                          T Offline
                          T Offline
                          trojanhector
                          schrieb am zuletzt editiert von
                          #14

                          @oliverio
                          Mein Usecase sind meine Rolladen. Ich habe eine Schattenfunction, die alle 2 Minuten überprüft, ob die Sonne scheint.
                          Wenn ja: Rolladen runter, wenn nein: Rolladen hoch. (Anmerkung: Meine Rolladen bleiben mind. 5 Minuten auf ihrer letzten Position)
                          Diese Funktion soll zwischen 08:00 und 20:00 Uhr laufen. Wenn jetzt das letzte Intervall gelaufen ist, sollen die Rolladen, unabhängig vom Sonnenschein wieder hochfahren. Früher habe ich das mit dem Zeitenvergleich zwischen Zielzeit und Executiontime gemacht. Das wollte ich jetzt umstellen auf Eventsteuerung.

                          HomoranH 1 Antwort Letzte Antwort
                          0
                          • T trojanhector

                            @oliverio
                            Mein Usecase sind meine Rolladen. Ich habe eine Schattenfunction, die alle 2 Minuten überprüft, ob die Sonne scheint.
                            Wenn ja: Rolladen runter, wenn nein: Rolladen hoch. (Anmerkung: Meine Rolladen bleiben mind. 5 Minuten auf ihrer letzten Position)
                            Diese Funktion soll zwischen 08:00 und 20:00 Uhr laufen. Wenn jetzt das letzte Intervall gelaufen ist, sollen die Rolladen, unabhängig vom Sonnenschein wieder hochfahren. Früher habe ich das mit dem Zeitenvergleich zwischen Zielzeit und Executiontime gemacht. Das wollte ich jetzt umstellen auf Eventsteuerung.

                            HomoranH Nicht stören
                            HomoranH Nicht stören
                            Homoran
                            Global Moderator Administrators
                            schrieb am zuletzt editiert von Homoran
                            #15

                            @trojanhector sagte in Javascript Schedule Start-End wann ist der letzte Lauf:

                            Das wollte ich jetzt umstellen auf Eventsteuerung.

                            dann mach das doch!

                            @trojanhector sagte in Javascript Schedule Start-End wann ist der letzte Lauf:

                            ob die Sonne scheint.

                            dann Trigger auf den Sonnensensor bei Änderung.

                            Anschließend
                            FALLS Wert>xy UND aktuelle Zeit ist zwischen 08:00 und 20:00
                            MACHE Rolladen auf Beschattung
                            SONST FALLS Wert <(xy-Hysterese)
                            MACHE Rollladen hoch

                            im sonst falls ggf noch eine Zeitabfrage damit der Rollladen nachts nicht hochfährt

                            edit:
                            Screenshot_20250720-220532_Firefox.jpg

                            kein Support per PN! - Fragen im Forum stellen - es gibt fast nichts, was nicht auch für andere interessant ist.

                            Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

                            der Installationsfixer: curl -fsL https://iobroker.net/fix.sh | bash -

                            1 Antwort Letzte Antwort
                            0
                            Antworten
                            • In einem neuen Thema antworten
                            Anmelden zum Antworten
                            • Älteste zuerst
                            • Neuste zuerst
                            • Meiste Stimmen


                            Support us

                            ioBroker
                            Community Adapters
                            Donate
                            FAQ Cloud / IOT
                            HowTo: Node.js-Update
                            HowTo: Backup/Restore
                            Downloads
                            BLOG

                            402

                            Online

                            32.7k

                            Benutzer

                            82.4k

                            Themen

                            1.3m

                            Beiträge
                            Community
                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                            ioBroker Community 2014-2025
                            logo
                            • Anmelden

                            • Du hast noch kein Konto? Registrieren

                            • Anmelden oder registrieren, um zu suchen
                            • Erster Beitrag
                              Letzter Beitrag
                            0
                            • Home
                            • Aktuell
                            • Tags
                            • Ungelesen 0
                            • Kategorien
                            • Unreplied
                            • Beliebt
                            • GitHub
                            • Docu
                            • Hilfe